diff --git a/wp/wp-content/plugins/gravityformshubspot/change_log.txt b/wp/wp-content/plugins/gravityformshubspot/change_log.txt deleted file mode 100644 index a707f169..00000000 --- a/wp/wp-content/plugins/gravityformshubspot/change_log.txt +++ /dev/null @@ -1,72 +0,0 @@ -### 2.1.0 | 2024-03-14 -- Updated the additional contact field settings to use the generic field map instead of the deprecated dynamic field map field type. -- Updated to use the v3 Owners API before v2 is sunset in August 2024. -- Updated the minimum Gravity Forms version to 2.7.1. -- Fixed a JavaScript error on the feed configuration page with Gravity Forms 2.8+. - -### 2.0.0 | 2023-11-01 -- Fixed a bug where feeds can't be created or edited due to an invalid_lifecycle_stage error. - - -### 1.9 | 2023-04-06 -- Added support for async (background) feed processing to improve form submission performance. -- Fixed an issue where auth token refresh requests continue to occur after the app is uninstalled from within the connected HubSpot account. -- Fixed an issue where unnecessary auth token refresh requests can occur during feed processing. -- Fixed an issue where the connect button is displayed on the settings page when API requests are being rate limited. -- Fixed an issue that causes the API to initialize on all front-end pages containing forms and all admin pages. -- Fixed an issue where multiple auth token refresh requests can occur around the same time. -- Fixed an issue where HubSpot forms are recreated when reconnecting to the same HubSpot account. -- Fixed a fatal error that can occur when attempting to reconnect the add-on during an API outage. - - -### 1.8 | 2022-11-3 -- Fixed an issue with lifecycle stages which causes feeds to error when being saved or updated. -- Fixed a typo in the "clear cache" setting description. - - -### 1.7 | 2021-11-10 -- Updated the styling for the disconnect alert messaging. -- Fixed an issue where the disconnect from HubSpot button doesn't show when used with Gravity Forms 2.4. -- Fixed an issue where the lead status and lifecycle stage fields are missing from the feed configuration page. -- Fixed an issue where the add-on is disconnected after HubSpot reduced auth token lifespan from 6 hours to 30 minutes. - - -### 1.6 | 2021-10-12 -- Added a button in the add-on settings page to manually clear the contact custom properties cache. -- Added support for mapping single checkbox, multiple checkboxes, dropdown select, and radio select type HubSpot properties. -- Added security enhancements. -- Fixed an issue where a notice appears on the feed settings edit page. -- Fixed fatal errors that can occur when the Hubspot API returns an error while updating feed settings. -- Fixed an issue where authentication may not complete after attempting a connection with HubSpot. -- Fixed issue where conditional Contact Owner feed settings are not getting saved. - - -### 1.5 | 2020-09-23 -- Added support for Gravity Forms 2.5. -- Fixed PHP warnings and notices which occur when the request to the HubSpot API to get the contact properties fails. - - -### 1.4 | 2020-07-14 -- Added security enhancements. - - -### 1.3 | 2020-05-18 -- Added translations for Hebrew, Hindi, Japanese, and Turkish. -- Added support for feed duplication. -- Fixed a PHP 7.4 notice which can occur when generating the HubSpot form for a feed outside the Form Settings area. -- Fixed an issue with the position in the Form Settings menu when multiple add-ons are installed. - - -### 1.2 | 2019-10-23 -- Updated the text in the add-on settings. -- Updated the submission process to always send the IP address to Hubspot unless saving of the submitter IP is disabled in a form's personal data settings. -- Fixed an issue where references to the add-on would appear as "Gravity Forms HubSpot Add-On Add-On." -- Fixed an issue where HubSpot users without names display as empty labels when assigning contact owner(s) for a feed. - - -### 1.1 | 2019-08-07 -- Added security enhancements. - - -### 1.0 | 2019-07-18 -- All new! diff --git a/wp/wp-content/plugins/gravityformshubspot/class-gf-hubspot.php b/wp/wp-content/plugins/gravityformshubspot/class-gf-hubspot.php deleted file mode 100644 index ec1b4a72..00000000 --- a/wp/wp-content/plugins/gravityformshubspot/class-gf-hubspot.php +++ /dev/null @@ -1,2424 +0,0 @@ -test_api_connection(); - - } - - /** - * Displays an appropriate message when feeds can't be configured. - * - * @since 1.9 - * - * @return string - */ - public function configure_addon_message() { - if ( is_null( $this->initialize_api() ) ) { - return parent::configure_addon_message(); - } - - return $this->comms_error_message(); - } - - /** - * Indicates if the feed can be duplicated. - * - * @since 1.0 - * @since 1.3 Enabled feed duplication. - * - * @param int $id Feed ID requesting duplication. - * - * @return bool - */ - public function can_duplicate_feed( $id ) { - - return true; - } - - /** - * Duplicates the feed and triggers creation of a corresponding form in HubSpot. - * - * @since 1.3 - * - * @param array|int $id The ID of the feed to be duplicated or the feed object when duplicating a form. - * @param bool|int $new_form_id False when using feed actions or the ID of the new form when duplicating a form. - * - * @return int - */ - public function duplicate_feed( $id, $new_form_id = false ) { - $new_feed_id = parent::duplicate_feed( $id, $new_form_id ); - - if ( $new_feed_id && $feed = $this->get_feed( $new_feed_id ) ) { - $delimiter = '. FID: '; - $items = explode( $delimiter, $feed['meta']['_hs_form'] ); - $feed['meta']['_hs_form'] = $items[0] . $delimiter . $feed['id']; - $this->recreate_hubspot_form( $feed, false ); - } - - return $new_feed_id; - } - - /** - * Setup columns for feed list table. - * - * @since 1.0 - * - * @return array - */ - public function feed_list_columns() { - - return array( - 'feed_name' => esc_html__( 'Name', 'gravityformshubspot' ), - ); - - } - - /** - * Performs any early initialization tasks. - * - * @since 1.9 - */ - public function pre_init() { - parent::pre_init(); - - if ( $this->is_gravityforms_supported( '2.7.0.2' ) ) { - // Only enabling for GF versions that call `delay_feed()` when adding the feed to the queue. - $this->_async_feed_processing = true; - } - } - - /** - * Plugin starting point. Adds PayPal delayed payment support. - * - * @since 1.0 - */ - public function init() { - - parent::init(); - - $this->add_delayed_payment_support( - array( - 'option_label' => esc_html__( 'Create record in HubSpot only when payment is received.', 'gravityformshubspot' ), - ) - ); - - add_filter( 'gform_settings_header_buttons', array( $this, 'filter_gform_settings_header_buttons' ), 99 ); - - add_action( 'wp_footer', array( $this, 'action_wp_footer' ) ); - - } - - /** - * Add AJAX callbacks. - * - * @since 1.0 - */ - public function init_ajax() { - parent::init_ajax(); - - // Add AJAX callback for de-authorizing with HubSpot. - add_action( 'wp_ajax_gfhubspot_deauthorize', array( $this, 'ajax_deauthorize' ) ); - add_action( 'wp_ajax_gf_hubspot_clear_cache', array( $this, 'clear_custom_contact_properties_cache' ) ); - } - - /** - * Enqueue admin scripts. - * - * @since 1.0 - * - * @return array - */ - public function scripts() { - - $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG || isset( $_GET['gform_debug'] ) ? '' : '.min'; - $form_id = absint( rgget( 'id' ) ); - $form = GFAPI::get_form( $form_id ); - - $routing_fields = ! empty( $form ) ? GFCommon::get_field_filter_settings( $form ) : array(); - $hubspot_owners = $this->get_hubspot_owners(); - - $scripts = array( - array( - 'handle' => 'gform_hubspot_pluginsettings', - 'deps' => array( 'jquery' ), - 'src' => $this->get_base_url() . "/js/plugin_settings{$min}.js", - 'version' => $this->_version, - 'enqueue' => array( - array( - 'admin_page' => array( 'plugin_settings' ), - 'tab' => $this->_slug, - ), - ), - 'strings' => array( - 'disconnect' => array( - 'site' => wp_strip_all_tags( __( 'Are you sure you want to disconnect from HubSpot for this website?', 'gravityformshubspot' ) ), - 'account' => wp_strip_all_tags( __( 'Are you sure you want to disconnect all Gravity Forms sites connected to this HubSpot account?', 'gravityformshubspot' ) ), - ), - 'settings_url' => admin_url( 'admin.php?page=gf_settings&subview=' . $this->get_slug() ), - 'deauth_nonce' => wp_create_nonce( 'gf_hubspot_deauth' ), - 'clear_cache_nonce' => wp_create_nonce( 'gf_hubspot_clear_cache' ), - ), - ), - array( - 'handle' => 'gform_hubspot_owner_settings', - 'deps' => array( 'jquery' ), - 'src' => $this->get_base_url() . "/js/contact_owner_setting{$min}.js", - 'version' => $this->_version, - 'enqueue' => array( - array( 'query' => "page=gf_edit_forms&view=settings&subview={$this->_slug}&fid=_notempty_" ), - array( 'query' => "page=gf_edit_forms&view=settings&subview={$this->_slug}&fid=0" ), - ), - 'strings' => array( - 'legacy_ui' => version_compare( GFForms::$version, '2.5-dev-1', '<' ) ? true : false, - 'fields' => $routing_fields, - 'owners' => $hubspot_owners, - 'assign_to' => wp_strip_all_tags( __( 'Assign To', 'gravityfromshubspot' ) ), - 'condition' => wp_strip_all_tags( __( 'Condition', 'gravityfromshubspot' ) ), - ), - ), - ); - - return array_merge( parent::scripts(), $scripts ); - - } - - /** - * Register needed styles. - * - * @since 1.0 - * - * @return array $styles - */ - public function styles() { - - $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG || isset( $_GET['gform_debug'] ) ? '' : '.min'; - - $styles = array( - array( - 'handle' => 'gform_hubspot_pluginsettings', - 'src' => $this->get_base_url() . "/css/plugin_settings{$min}.css", - 'version' => $this->_version, - 'enqueue' => array( - array( - 'admin_page' => array( 'plugin_settings' ), - 'tab' => $this->_slug, - ), - ), - ), - array( - 'handle' => 'gform_hubspot_formsettings', - 'src' => $this->get_base_url() . "/css/form_settings{$min}.css", - 'version' => $this->_version, - 'enqueue' => array( - array( - 'admin_page' => array( 'form_settings' ), - 'tab' => $this->_slug, - ), - ), - ), - ); - - return array_merge( parent::styles(), $styles ); - - } - - /** - * Return the plugin's icon for the plugin/form settings menu. - * - * @since 1.3 - * - * @return string - */ - public function get_menu_icon() { - - return file_get_contents( $this->get_base_path() . '/images/menu-icon.svg' ); - - } - - /** - * Updates the auth token before initializing the settings. - * - * @since 1.9 - */ - public function plugin_settings_init() { - - $this->maybe_update_auth_tokens(); - - parent::plugin_settings_init(); - - } - - /** - * Get the authorization payload data. - * - * Returns the auth POST request if it's present, otherwise attempts to return a recent transient cache. - * - * @since 1.6 - * - * @return array - */ - private function get_oauth_payload() { - $payload = array_filter( - array( - 'auth_payload' => rgpost( 'auth_payload' ), - 'auth_error' => rgpost( 'auth_error' ), - 'state' => rgpost( 'state' ), - ) - ); - - if ( count( $payload ) === 2 || isset( $payload['auth_error'] ) ) { - return $payload; - } - - $payload = get_transient( "gravityapi_response_{$this->_slug}" ); - - if ( rgar( $payload, 'state' ) !== get_transient( "gravityapi_request_{$this->_slug}" ) ) { - return array(); - } - - delete_transient( "gravityapi_response_{$this->_slug}" ); - - return is_array( $payload ) ? $payload : array(); - } - - /** - * Store auth tokens when we get auth payload from HubSpot. - * - * @since 1.0 - */ - public function maybe_update_auth_tokens() { - $payload = $this->get_oauth_payload(); - - if ( ! $payload ) { - return; - } - - $auth_payload = json_decode( base64_decode( rgar( $payload, 'auth_payload' ) ), true ); - - // Verify state. - if ( rgpost( 'state' ) && ! wp_verify_nonce( rgar( $payload, 'state' ), $this->get_authentication_state_action() ) ) { - GFCommon::add_error_message( esc_html__( 'Unable to connect your HubSpot account due to mismatched state.', 'gravityformshubspot' ) ); - return; - } - - // Get the authentication token. - $auth_token = $this->get_plugin_setting( 'auth_token' ); - $settings = array(); - - if ( empty( $auth_token ) || $auth_token['access_token'] !== $auth_payload['access_token'] ) { - // Add token info to plugin settings. - $settings['auth_token'] = array( - 'access_token' => $auth_payload['access_token'], - 'refresh_token' => $auth_payload['refresh_token'], - 'date_created' => time(), - 'expires_in' => $auth_payload['expires_in'], - ); - - // Save plugin settings. - $this->update_plugin_settings( $settings ); - - GFCommon::add_message( esc_html__( 'HubSpot settings have been updated.', 'gravityformshubspot' ) ); - - // Force the API to re-init using the new token. - $this->api = null; - - // Maybe recreate HubSpot Forms after having updated auth token. - $this->maybe_recreate_hubspot_forms(); - } - - // If error is provided, display message. - if ( rgpost( 'auth_error' ) || isset( $payload['auth_error'] ) ) { - // Add error message. - GFCommon::add_error_message( esc_html__( 'Unable to connect your HubSpot account.', 'gravityformshubspot' ) ); - } - } - - /** - * Recreate HubSpot forms for any existing HubSpot feed. It will go through all the feeds and - * recreates the associated HubSpot Form for each. - * - * @since 1.0 - * @since 1.3 Updated to use recreate_hubspot_form(). - */ - public function maybe_recreate_hubspot_forms() { - $feeds = $this->get_feeds_by_slug( $this->_slug ); - if ( empty( $feeds ) || ! $this->initialize_api() ) { - return; - } - - $this->log_debug( __METHOD__ . '(): Starting.' ); - - foreach ( $feeds as $feed ) { - if ( $this->hubspot_form_exists( rgars( $feed, 'meta/_hs_form_guid' ) ) ) { - $this->log_debug( __METHOD__ . sprintf( '(): Skipping feed (#%d); HubSpot form still exists. Name: %s; GUID: %s.', $feed['id'], $feed['meta']['_hs_form'], $feed['meta']['_hs_form_guid'] ) ); - - continue; - } - - $this->recreate_hubspot_form( $feed ); - } - - $this->log_debug( __METHOD__ . '(): Completed.' ); - } - - /** - * Determines if a form exists in the connected HubSpot account with the given GUID. - * - * @since 1.9 - * - * @param string $guid The HubSpot form GUID. - * - * @return bool - */ - public function hubspot_form_exists( $guid ) { - if ( empty( $guid ) ) { - return false; - } - - static $guids; - - if ( ! is_array( $guids ) ) { - $forms = $this->api->get_forms(); - $guids = is_wp_error( $forms ) || empty( $forms ) ? array() : wp_list_pluck( $forms, 'guid' ); - } - - if ( empty( $guids ) ) { - return false; - } - - return in_array( $guid, $guids ); - } - - /** - * Recreates the HubSpot form for the given feed. - * - * @since 1.3 - * - * @param array $feed The feed the HubSpot form is to be created for. - * @param bool $reset_owner Indicates if the contact owner should be set to none. - */ - public function recreate_hubspot_form( $feed, $reset_owner = true ) { - $result = $this->create_hubspot_form( $feed['meta'], $feed['form_id'] ); - if ( ! $result ) { - // If form could not be created, try again with a unique name. - $feed['meta']['_hs_form'] .= '.' . uniqid(); - - $result = $this->create_hubspot_form( $feed['meta'], $feed['form_id'] ); - } - - if ( $result ) { - $feed['meta']['_hs_form'] = $this->get_hubspot_formname_without_warning( $result['name'] ); - $feed['meta']['_hs_form_guid'] = $result['guid']; - $feed['meta']['_hs_portal_id'] = $result['portal_id']; - $this->log_debug( __METHOD__ . sprintf( '(): HubSpot form created for feed (#%d). Name: %s; GUID: %s.', $feed['id'], $feed['meta']['_hs_form'], $feed['meta']['_hs_form_guid'] ) ); - - if ( $reset_owner ) { - $feed['meta']['contact_owner'] = 'none'; - } - - $this->update_feed_meta( $feed['id'], $feed['meta'] ); - } - } - - /** - * Setup plugin settings fields. - * - * @since 1.0 - * - * @return array - */ - public function plugin_settings_fields() { - // Prepare plugin description. - $description = '

'; - $description .= esc_html__( 'HubSpot is an all-in-one CRM, Sales, Marketing, and Customer Service platform.', 'gravityformshubspot' ); - $description .= '

'; - $description .= '

'; - $description .= esc_html__( 'The Gravity Forms HubSpot Add-On connects the power of the world’s leading growth platform - HubSpot - with Gravity Forms so your business can grow better.', 'gravityformshubspot' ); - $description .= '

'; - $description .= '

'; - $description .= sprintf( - /* translators: 1: Open link tag 2: Close link tag */ - esc_html__( 'If you don\'t have a HubSpot account, you can %1$ssign up for your free HubSpot account here%2$s.', 'gravityformshubspot' ), - '', '' - ); - $description .= '

'; - - $settings = array( - array( - 'title' => '', - 'description' => $description, - 'fields' => array( - array( - 'name' => 'auth_token', - 'type' => 'auth_token_button', - 'feedback_callback' => array( $this, 'initialize_api' ), - ), - ), - ), - ); - - if ( $this->initialize_api() ) { - $settings[] = array( - 'title' => esc_html__( 'Clear Custom Contact Properties Cache', 'gravityformshubspot' ), - 'fields' => array( - array( - 'name' => 'clear_cache', - 'label' => '', - 'type' => 'clear_cache', - ), - ), - ); - } - - return $settings; - - } - - /** - * Hide submit button on plugin settings page. - * - * @since 1.3 - * - * @param string $html - * - * @return string - */ - public function filter_gform_settings_header_buttons( $html = '' ) { - - // If this is not the plugin settings page, return. - if ( ! $this->is_plugin_settings( $this->get_slug() ) ) { - return $html; - } - - // Hide button. - $html = str_replace( 'initialize_api() ) { - return false; - } - - $this->log_debug( __METHOD__ . '(): Validating API credentials.' ); - $contacts = $this->api->get_contacts(); - - if ( is_wp_error( $contacts ) ) { - // Display the connect button for an auth error or the comms message for rate limit & timeout errors. - $this->api = rgar( $contacts->get_error_data(), 'status' ) === 401 ? null : false; - } - - return (bool) $this->api; - } - - /** - * Returns the message to display when API requests are being rate limited or timing out. - * - * @since 1.9 - * - * @return string - */ - public function comms_error_message() { - if ( method_exists( 'GFCommon', 'get_support_url' ) ) { - $support_url = GFCommon::get_support_url(); - } else { - $support_url = 'https://www.gravityforms.com/open-support-ticket/'; - } - - /* translators: 1: Open link tag 2: Close link tag */ - return sprintf( esc_html__( 'There is a problem communicating with HubSpot right now, please check back later. If this issue persists for more than a day, please %1$sopen a support ticket%2$s.', 'gravityformshubspot' ), "", '' ); - } - - /** - * Create Generate Auth Token settings field. - * - * @since 1.0 - * - * @param array $field Field properties. - * @param bool $echo Display field contents. Defaults to true. - * - * @return string - */ - public function settings_auth_token_button( $field, $echo = true ) { - $html = ''; - - $this->test_api_connection(); - - if ( $this->api === null || rgget( 'gf_display_connect_button' ) ) { - // If SSL is available, display custom app settings. - if ( is_ssl() ) { - $license_key = GFCommon::get_key(); - $settings_url = urlencode( admin_url( 'admin.php?page=gf_settings&subview=' . $this->_slug ) ); - $nonce = wp_create_nonce( $this->get_authentication_state_action() ); - $auth_url = add_query_arg( - array( - 'redirect_to' => $settings_url, - 'license' => $license_key, - 'state' => $nonce, - ), - $this->get_gravity_api_url( '/auth/hubspot' ) - ); - - if ( get_transient( "gravityapi_request_{$this->_slug}" ) ) { - delete_transient( "gravityapi_request_{$this->_slug}" ); - } - - set_transient( "gravityapi_request_{$this->_slug}", $nonce, 10 * MINUTE_IN_SECONDS ); - - $html = sprintf( - '%s', - esc_html__( 'Click here to connect your HubSpot account', 'gravityformshubspot' ), - $auth_url - ); - } else { - $html = '
'; - $html .= '

' . esc_html__( 'SSL Certificate Required', 'gravityformshubspot' ) . '

'; - /* translators: 1: Open link tag 2: Close link tag */ - $html .= sprintf( esc_html__( 'Make sure you have an SSL certificate installed and enabled, then %1$sclick here to continue%2$s.', 'gravityformshubspot' ), '', '' ); - $html .= '
'; - } - } elseif ( $this->api === false ) { - $html = '
-
- -
-

' . $this->comms_error_message() . '

-
-
-
'; - } else { - $html = '

' . esc_html__( 'Signed into HubSpot.', 'gravityformshubspot' ); - $html .= '

'; - $html .= sprintf( - ' %1$s', - esc_html__( 'Disconnect your HubSpot account', 'gravityformshubspot' ) - ); - - $html .= '
'; - $html .= '

'; - $html .= '

'; - $html .= '

' . sprintf( ' %1$s', esc_html__( 'Disconnect your HubSpot account', 'gravityformshubspot' ) ) . '

'; - $html .= '
'; - } - - if ( $echo ) { - echo $html; - } - - return $html; - - } - - /** - * Generates clear custom fields cache button field markup. - * - * @param array $field Field properties. - * @param bool $echo Display field contents. Defaults to true. - * - * @since 1.6 - * - * @return string - */ - public function settings_clear_cache( $field, $echo = true ) { - - $html =' - - '; - - $html .= '

' . esc_html__( 'Due to HubSpot\'s daily API usage limits, Gravity Forms stores HubSpot custom contact properties data for one hour. If you added new custom properties or made a change to them, you might not see it reflected immediately due to this data caching. To manually clear the custom contact properties cache, click the button below.', 'gravityformshubspot' ) . '

'; - - $html .= '

' . esc_html__( 'Clear Custom Fields Cache', 'gravityformshubspot' ) . '

'; - - $settings = $this->get_plugin_settings(); - $last_cache_clearance = rgar( $settings, 'last_cache_clearance' ); - - $readable_time = $last_cache_clearance ? date( "Y-m-d H:i:s", $last_cache_clearance ) : esc_html__( 'never cleared manually before', 'gravityformshubspot' ); - $html .= '

' . esc_html__( 'Last time the cache was cleared manually: ', 'gravityformshubspot' ) . '' . $readable_time . '

'; - - if ( $echo ) { - echo html_entity_decode( $html ); - } - - return $html; - } - - /** - * Handles the ajax request to clear the custom properties cache. - * - * @since 1.6 - */ - public function clear_custom_contact_properties_cache() { - - if ( ! check_ajax_referer( 'gf_hubspot_clear_cache', 'nonce' ) ) { - wp_send_json_error(); - } - - if ( ! GFCache::delete( self::CUSTOM_PROPERTIES_CACHE_KEY ) ) { - $this->log_debug( __METHOD__ . '() : failed to clear cache' ); - } - - $this->log_debug( __METHOD__ . '() : cache cleared successfully' ); - - $settings = $this->get_plugin_settings(); - $settings['last_cache_clearance'] = time(); - - $this->update_plugin_settings( $settings ); - - wp_send_json_success( - array( - 'last_clearance' => date( 'Y-m-d H:i:s', $settings['last_cache_clearance'] ), - ) - ); - } - - /** - * Get Gravity API URL. - * - * @since 1.0 - * - * @param string $path Path. - * - * @return string - */ - public function get_gravity_api_url( $path = '' ) { - return ( defined( 'GRAVITY_API_URL' ) ? GRAVITY_API_URL : 'https://gravityapi.com/wp-json/gravityapi/v1' ) . $path; - } - - /** - * Initializes the HubSpot API if credentials are valid. - * - * @since 1.0 - * @since 1.9 Added the optional $refresh_token param. - * - * @param bool $refresh_token Indicates if the auth token should be refreshed. - * - * @return bool|null API initialization state. Returns null if no authentication token is provided. - */ - public function initialize_api( $refresh_token = true ) { - - // If API initialization has already been attempted return result. - if ( ! is_null( $this->api ) ) { - return is_object( $this->api ); - } - - // Initialize HubSpot API library. - if ( ! class_exists( 'GF_HubSpot_API' ) ) { - require_once 'includes/class-gf-hubspot-api.php'; - } - - // Get the authentication token. - $auth_token = $this->get_plugin_setting( 'auth_token' ); - - // If the authentication token is not set, return null. - if ( rgblank( $auth_token ) ) { - return null; - } - - // Initialize a new HubSpot API instance. - $this->api = new GF_HubSpot_API( $auth_token ); - - if ( ! $refresh_token ) { - return true; - } - - // From 2021-11-08 HubSpot reduced the token lifespan from 6 hours to 30 minutes. - if ( time() > ( $auth_token['date_created'] + rgar( $auth_token, 'expires_in', 1800 ) ) ) { - // Log that authentication test failed. - $this->log_debug( __METHOD__ . '(): API tokens expired, start refreshing.' ); - - $lock_cache_key = $this->get_slug() . '_refresh_lock'; - - $locked = GFCache::get( $lock_cache_key, $found ); - if ( $found && $locked ) { - $this->api = false; - $this->log_debug( __METHOD__ . '(): Aborting; refresh already in progress.' ); - - return false; - } - - GFCache::set( $lock_cache_key, true, true, MINUTE_IN_SECONDS ); - - // refresh token. - $auth_token = $this->api->refresh_token(); - if ( ! is_wp_error( $auth_token ) ) { - $settings['auth_token'] = array( - 'access_token' => $auth_token['access_token'], - 'refresh_token' => $auth_token['refresh_token'], - 'date_created' => time(), - 'expires_in' => $auth_token['expires_in'], - ); - - // Save plugin settings. - $this->update_plugin_settings( $settings ); - $this->log_debug( __METHOD__ . '(): API access token has been refreshed.' ); - GFCache::delete( $lock_cache_key ); - - } else { - $message = $auth_token->get_error_message(); - $this->api = false; - $this->log_debug( __METHOD__ . '(): API access token failed to be refreshed; ' . $message ); - GFCache::delete( $lock_cache_key ); - - if ( $message === 'BAD_REFRESH_TOKEN' ) { - delete_option( 'gravityformsaddon_' . $this->_slug . '_settings' ); - $this->log_debug( __METHOD__ . '(): This website has been disconnected from HubSpot.' ); - $this->api = null; - } - - return $this->api; - } - } - - return true; - - } - - /** - * Revoke token and remove them from Settings. - * - * Note we cannot revoke refresh token ($this->api->revoke_token()) because the refresh token is shared across - * all sites authenticated under the same accounts. - * - * @since 1.0 - */ - public function ajax_deauthorize() { - check_ajax_referer( 'gf_hubspot_deauth', 'nonce' ); - $scope = sanitize_text_field( $_POST['scope'] ); - - // If user is not authorized, exit. - if ( ! GFCommon::current_user_can_any( $this->_capabilities_settings_page ) ) { - wp_send_json_error( array( 'message' => esc_html__( 'Access denied.', 'gravityformshubspot' ) ) ); - } - - // If API instance is not initialized, return error. - if ( ! $this->initialize_api() ) { - $this->log_error( __METHOD__ . '(): Unable to de-authorize because API is not initialized.' ); - - wp_send_json_error(); - } - - // Delete all HubSpot forms associated with existing HubSpot feeds. - $this->delete_hubspot_forms(); - - if ( $scope === 'account' ) { - $result = $this->api->revoke_token(); - - if ( is_wp_error( $result ) ) { - $this->log_error( __METHOD__ . '(): Unable to revoke token; ' . $result->get_error_message() ); - - wp_send_json_error( array( 'message' => $result->get_error_message() ) ); - } - - $this->log_error( __METHOD__ . '(): All Gravity Forms sites connected to this HubSpot account have been disconnected.' ); - } - - // Remove access token from settings. - delete_option( 'gravityformsaddon_' . $this->_slug . '_settings' ); - - // Log that we revoked the access token. - $this->log_debug( __METHOD__ . '(): This website has been disconnected from HubSpot.' ); - - // Return success response. - wp_send_json_success(); - } - - /** - * Deletes all HubSpot forms associated with feeds. This function is called during the process of de-authorizing a HubSpot account - * and serves as a clean up routine so that Gravity Forms created forms aren't lingering around on a disconnected HubSpot account. - * - * @since 1.0 - */ - public function delete_hubspot_forms() { - - //Getting all HubSpot feeds across all forms - $feeds = $this->get_feeds_by_slug( $this->_slug ); - - //Deleting all associated HubSpot forms - foreach ( $feeds as $feed ) { - $this->delete_hubspot_form( $feed ); - } - } - - - /** - * Deletes the HubSpot form associated with the specified feed - * @since 1.0 - * - * @param array $feed Feed object that is associated with HubSpot Form - */ - public function delete_hubspot_form( $feed ) { - - if ( $this->initialize_api() ) { - - $guid = $feed['meta']['_hs_form_guid']; - $this->api->delete_form( $guid ); - } - } - - /** - * Setup fields for feed settings. - * - * @since 1.0 - * - * @return array - */ - public function feed_settings_fields() { - - if ( ! $this->initialize_api() ) { - return array(); - } - - $form = $this->get_current_form(); - - // Prepare base feed settings section. - $basic_section = array( - 'title' => '', - 'fields' => array( - array( - 'name' => 'feed_name', - 'label' => esc_html__( 'Name', 'gravityformshubspot' ), - 'type' => 'text', - 'class' => 'medium', - 'required' => true, - 'default_value' => $this->get_default_feed_name(), - 'tooltip' => '
' . esc_html__( 'Name', 'gravityformshubspot' ) . '
' . esc_html__( 'Enter a feed name to uniquely identify this feed.', 'gravityformshubspot' ), - ), - array( - 'name' => 'feed_type', - 'label' => esc_html__( 'Feed Type', 'gravityformshubspot' ), - 'type' => 'select', - 'choices' => array( - array( - 'label' => __( 'Create Contact', 'gravityformshubspot' ), - 'value' => 'create_contact', - ), - ), - 'default_value' => 'create_contact', - 'hidden' => true, - ), - array( - 'name' => '_hs_form', - 'label' => esc_html__( 'HubSpot Form Name', 'gravityformshubspot' ), - 'type' => 'hubspotform', - 'class' => 'medium', - 'required' => true, - 'tooltip' => sprintf( - '
%s
%s', - esc_html__( 'HubSpot Form Name', 'gravityformshubspot' ), - esc_html__( 'Enter the name for the form that will be automatically created in your HubSpot account to work in conjunction with this feed. This HubSpot form will be configured to match your mapped fields below and is required. Once created, please don\'t remove or edit it.', 'gravityformshubspot' ) - ), - 'default_value' => 'Gravity Forms - ' . $form['title'], - 'validation_callback' => array( $this, 'validate_hubspot_form' ), - ), - ), - ); - - $contact_properties = $this->get_hubspot_contact_properties(); - - if ( ! empty( $contact_properties['selection'] ) ) { - foreach ( $contact_properties['selection'] as $property ) { - $basic_section['fields'][] = array( - 'name' => $property['name'], - 'label' => $property['label'], - 'type' => 'select', - 'default_value' => rgar( $property, 'default_value' ), - 'tooltip' => rgar( $property, 'tooltip' ), - 'choices' => $property['choices'], - ); - } - } - - $basic_section['fields'][] = array( - 'name' => 'contact_owner', - 'label' => esc_html__( 'Contact Owner', 'gravityformshubspot' ), - 'type' => 'radio', - 'horizontal' => true, - 'default_value' => 'none', - 'choices' => array( - array( - 'label' => __( 'None  ', 'gravityformshubspot' ), - 'value' => 'none', - ), - array( - 'label' => __( 'Select Owner  ', 'gravityformshubspot' ), - 'value' => 'select', - ), - array( - 'label' => __( 'Assign Conditionally', 'gravityformshubspot' ), - 'value' => 'conditional', - ), - ), - 'tooltip' => '
' . esc_html__( 'Contact Owner', 'gravityforms' ) . '
' . esc_html__( 'Select a HubSpot user that will be assigned as the owner of the newly created Contact.', 'gravityformshubspot' ), - ); - - $contact_owner_section = array( - 'id' => 'contact_owner_section', - 'title' => esc_html__( 'Contact Owner', 'gravityformshubspot' ), - 'class' => 'contact_owner_section', - 'dependency' => version_compare( GFForms::$version, '2.5-dev-1', '<' ) ? null : array( - 'live' => true, - 'fields' => array( - array( - 'field' => 'contact_owner', - 'values' => array( 'select', 'conditional' ), - ), - ), - ), - 'fields' => array( - array( - 'name' => 'contact_owner_select', - 'label' => esc_html__( 'Select Owner', 'gravityformshubspot' ), - 'type' => 'select', - 'choices' => $this->get_hubspot_owners(), - 'dependency' => version_compare( GFForms::$version, '2.5-dev-1', '<' ) ? null : array( - 'live' => true, - 'fields' => array( - array( - 'field' => 'contact_owner', - 'values' => array( 'select' ), - ), - ), - ), - ), - array( - 'name' => 'contact_owner_conditional', - 'label' => '', - 'class' => 'large', - 'type' => 'conditions', - 'dependency' => version_compare( GFForms::$version, '2.5-dev-1', '<' ) ? null : array( - 'live' => true, - 'fields' => array( - array( - 'field' => 'contact_owner', - 'values' => array( 'conditional' ), - ), - ), - ), - ), - ), - ); - - $field_map_section = array( - 'title' => 'Map Contact Fields', - 'fields' => rgar( $contact_properties, 'basic', array() ), - ); - - $additional_fields_section = array( - 'title' => esc_html__( 'Add Additional Contact Fields', 'gravityformshubspot' ), - 'fields' => array( - array( - 'name' => 'additional_fields', - 'label' => '', - 'type' => 'generic_map', - 'key_field' => array( - 'title' => 'HubSpot', - 'allow_custom' => false, - 'choices' => rgar( $contact_properties, 'grouped', array() ), - ), - 'value_field' => array( - 'title' => 'Gravity Forms', - 'allow_custom' => false, - ), - ), - ), - ); - - $other_fields_section = array( - 'title' => esc_html__( 'Additional Options', 'gravityformshubspot' ), - 'fields' => array( - array( - 'name' => 'conditionalLogic', - 'label' => esc_html__( 'Conditional Logic', 'gravityforms' ), - 'type' => 'feed_condition', - 'tooltip' => '
' . esc_html__( 'Conditional Logic', 'gravityforms' ) . '
' . esc_html__( 'When conditions are enabled, HubSpot contacts will only be created when the conditions are met. When disabled, a HubSpot contact will be created for every form submission.', 'gravityforms' ), - ), - ), - ); - - $settings_fields = array( $basic_section, $contact_owner_section, $field_map_section, $additional_fields_section, $other_fields_section ); - - return $settings_fields; - } - - /*** - * Overrides the parent field to remove the Street Address (Line 2) field from the field map options - * - * @since 1.0 - * - * @param int $form_id Current Form Id - * @param array|string|null $field_type Current field type - * @param array|string|null $exclude_field_types Field types to be excluded from drop down - * - * @return array - */ - public static function get_field_map_choices( $form_id, $field_type = null, $exclude_field_types = null ) { - - $choices = parent::get_field_map_choices( $form_id, $field_type, $exclude_field_types ); - $form = GFAPI::get_form( $form_id ); - $address_fields = GFAPI::get_fields_by_type( $form, array( 'address' ) ); - if ( ! is_array( $address_fields ) ) { - return $choices; - } - - $address_line2_ids = array(); - foreach ( $address_fields as $address_field ) { - $address_line2_ids[] = $address_field->id . '.2'; - } - - $new_choices = array(); - foreach ( $choices as $choice ) { - if ( ! in_array( $choice['value'], $address_line2_ids ) ) { - $new_choices[] = $choice; - } - } - - return $new_choices; - } - - /** - * Displays the currently configured HubSpot Form. - * - * @since 1.0 - * - * @param array $field Field object. - * @param bool $echo True if HTML should be printed on screen. - * - * @return string - */ - public function settings_hubspotform( $field, $echo = true ) { - - $field['type'] = 'text'; - $html = $this->settings_text( $field, false ); - - $guid = $this->get_setting( $field['name'] . '_guid' ); - $html .= ''; - - if ( $echo ) { - echo $html; - } - - return $html; - } - - /** - * Validates that the HubSpot form name is unique and the form can be created or edited. - * - * @since unknown - * @since 1.6 Moved the HubSpot form update/creation to the validate callback. - * - * @param array $field Field array containing the configuration options of this field. - * @param string $field_value Submitted value. - */ - public function validate_hubspot_form( $field, $field_value = '' ) { - - global $_gaddon_posted_settings; - - // Get settings. - $settings = $this->get_current_settings(); - - if ( ! $this->initialize_api() ) { - $this->set_field_error( $field, esc_html__( 'There was an error connecting to Hubspot.', 'gravityformshubspot' ) ); - return; - } - - $forms = $this->api->get_forms(); - - if ( is_wp_error( $forms ) ) { - $this->set_field_error( $field, esc_html__( 'There was an error validating the form name. Please try saving again', 'gravityformshubspot' ) ); - } - - // Validate the form name is unique. - if ( ! $this->is_form_name_unique( $field_value, $forms, $settings ) ) { - $this->set_field_error( $field, esc_html__( 'This form name is already in use in HubSpot. Please enter a unique form name.', 'gravityformshubspot' ) ); - return; - } - - // Validate if the form can be updated or created on HubSpot. - $feed_id = $this->get_current_feed_id(); - $result = $this->is_form_editable( $settings, $feed_id ); - - if ( ! $result ) { - $action = $feed_id ? esc_html__( 'edit', 'gravityformshubspot' ) : esc_html__( 'add', 'gravityformshubspot' ); - /* translators: Action to perform on the form. */ - $this->set_field_error( $field, sprintf( esc_html__( 'Could not %s HubSpot form. Please try again later.', 'gravityformshubspot' ), $action ) ); - - return; - } - - // Update the HubSpot form data. - $_gaddon_posted_settings['_hs_form_guid'] = $result['guid']; - $_gaddon_posted_settings['_hs_portal_id'] = $result['portal_id']; - - } - - /** - * Validates that the HubSpot form name is unique. - * - * @since 1.6 - * - * @param string $field_value Submitted value. - * @param array $forms The array of forms retrieved from Hubspot. - * @param array $settings The array of plugin settings. - * - * @return bool Whether or not the form name is unique. - */ - private function is_form_name_unique( $field_value, $forms, $settings ) { - $form_name = $field_value . $this->get_hubspot_formname_warning(); - $unique = true; - foreach ( $forms as $form ) { - if ( $form['name'] === $form_name && $settings['_hs_form_guid'] !== $form['guid'] ) { - $unique = false; - } - } - return $unique; - } - - /** - * Validates that the HubSpot form is able to be created. - * - * @since 1.6 - * - * @param array $settings The plugin settings. - * @param string $feed_id The feed id. - * - * @return array|bool Returns an array with the newly updated form name and form GUID if updated successfully. Otherwise return false. - */ - private function is_form_editable( $settings, $feed_id ) { - $form_id = rgget( 'id' ); - if ( $feed_id ) { - return $this->update_hubspot_form( rgar( $settings, '_hs_form_guid' ), $settings, $form_id ); - } - - return $this->create_hubspot_form( $settings, $form_id ); - } - - /*** - * Renders the HTML for the Contact Owner conditions setting. - * - * @since 1.0 - * - * @param array|\Rocketgenius\Gravity_Forms\Settings\Fields\Base $field Field object. - * @param bool $echo True if HTML should be printed on screen. - * - * @return string - */ - public function settings_conditions( $field, $echo = true ) { - $html = '
'; - - // Setup hidden field. - $hidden_field = is_object( $field ) ? clone $field : $field; - $hidden_field['name'] = 'conditions'; - $hidden_field['type'] = 'hidden'; - unset( $hidden_field['callback'] ); - - $html .= $this->settings_hidden( $hidden_field, false ); - - if ( $echo ) { - echo $html; - } - - return $html; - } - - /** - * Overrides parent class to create/update HubSpot form when feed is saved. - * - * @since 1.0 - * @since 1.6 Updated to get HubSpot form data from $_gaddon_posted_settings. - * - * @param int $feed_id Feed ID. - * @param int $form_id Form ID. - * @param array $settings Feed settings. - * - * @return array|bool - */ - public function save_feed_settings( $feed_id, $form_id, $settings ) { - global $_gaddon_posted_settings; - - $settings['_hs_form_guid'] = $_gaddon_posted_settings['_hs_form_guid']; - $settings['_hs_portal_id'] = $_gaddon_posted_settings['_hs_portal_id']; - - // Saving feed. - return parent::save_feed_settings( $feed_id, $form_id, $settings ); - } - - /** - * Delete associated HubSpot form and then deletes feed. - * - * @since 1.0 - * - * @param int $id Id of feed to be deleted. - */ - public function delete_feed( $id ) { - - $feed = $this->get_feed( $id ); - $this->delete_hubspot_form( $feed ); - - parent::delete_feed( $id ); - } - - - /** - * Creates a HubSpot form based on the provided feed settings - * - * @since 1.0 - * - * @param array $feed_meta Current feed meta. - * @param int $form_id The ID of the form the feed belongs to. - * - * @return array|bool Returns the auto-generated form data from HubSpot if successful. Otherwise returns false. - */ - public function create_hubspot_form( $feed_meta, $form_id ) { - - $this->initialize_api(); - - $hs_form = $this->generate_hubspot_form_object( $feed_meta, $form_id ); - - $api_result = $this->api->create_form( $hs_form ); - - if ( is_wp_error( $api_result ) ) { - return false; - } - - return array( - 'name' => $api_result['name'], - 'guid' => $api_result['guid'], - 'portal_id' => $api_result['portalId'], - ); - } - - /** - * Updates an existing HubSpot form to match the provided feed $settings, or creates a new one if GUID doesn't match any form in HubSpot. - * - * @since 1.0 - * - * @param string $guid GUID of HubSpot form to be updated. - * @param array $settings Current feed settings. - * @param int $form_id The ID of the form the feed belongs to. - * - * @return array|bool Returns an array with the newly updated form name and form GUID if updated successfully. Otherwise return false. - */ - public function update_hubspot_form( $guid, $settings, $form_id ) { - - // 1- Get HubSpot form. - $existing_form = $this->api->get_form( $guid ); - if ( is_wp_error( $existing_form ) ) { - - $error_data = $existing_form->get_error_data(); - if ( $error_data['status'] == 404 ) { - - // Form doesn't exist. Create a new one. - return $this->create_hubspot_form( $settings, $form_id ); - } else { - // Error when getting existing form. Abort to throw validation error. - return false; - } - } else { - - // Form exists. Update it. - $form = $this->generate_hubspot_form_object( $settings, $form_id ); - $api_result = $this->api->update_form( $guid, $form ); - - if ( is_wp_error( $api_result ) ) { - return false; - } - - return array( - 'name' => $api_result['name'], - 'guid' => $api_result['guid'], - 'portal_id' => $api_result['portalId'], - ); - } - } - - /** - * Based on the fields mapped in the feed settings ( i.e. $settings variable ), creates a HubSpot form object to create or update a HubSpot form. - * - * @since 1.0 - * - * @param array $feed_meta Current feed settings. - * @param int $form_id The ID of the form the feed belongs to. - * - * @return array Returns a HubSpot form object based on specified settings. - */ - public function generate_hubspot_form_object( $feed_meta, $form_id ) { - - $fields = array(); - $properties = $this->get_hubspot_contact_properties(); - $settings_fields = array_merge( - rgar( $properties, 'basic', array() ), - rgar( $properties, 'additional', array() ), - rgar( $properties, 'selection', array() ) - ); - $external_options = array(); - - // Build basic fields. - foreach ( $feed_meta as $setting_name => $setting_value ) { - - $field_name = $this->get_hubspot_contact_property_name( $setting_name ); - if ( empty( $setting_value ) || ! $field_name ) { - continue; - } - - $setting_field = $this->find_setting_field( $setting_name, $settings_fields ); - if ( ! $setting_field ) { - continue; - } - - // Lifecycle stages don't work as fields; add them as external_options instead. - // Lifecycle stage has to be set for both contacts and companies. - if ( $field_name === 'lifecyclestage' ) { - // Set the lifescycle state for contact. - $opt = array( - 'referenceType' => 'PIPELINE_STAGE', - 'objectTypeId' => '0-1', - 'propertyName' => 'lifecyclestage', - 'id' => $setting_value, - ); - - $external_options[] = $opt; - - // Set the lifescycle state for company. - $opt['objectTypeId'] = '0-2'; - $external_options[] = $opt; - continue; - } - - $field_arr = array( - 'name' => $field_name, - 'label' => $setting_field['label'], - 'type' => $setting_field['_hs_type'], - 'fieldType' => $setting_field['_hs_field_type'], - ); - - // Choice-based fields should use the options available in Hubspot - if ( ! empty( $setting_field['choices'] ) ) { - $field_arr['options'] = $setting_field['choices']; - $field_arr['selectedOptions'] = array( $setting_value ); - } - - $fields[] = $field_arr; - } - - - // Adding Contact Owner field. - $fields[] = array( - 'name' => 'hubspot_owner_id', - 'label' => 'Contact Owner', - 'type' => 'enumeration', - 'fieldType' => 'hidden', - ); - - // Build additional fields. - if ( is_array( $feed_meta['additional_fields'] ) ) { - foreach ( $feed_meta['additional_fields'] as $setting ) { - if ( rgar( $setting, 'custom_key' ) !== '' ) { - $setting['key'] = $setting['custom_key']; - } - - $setting_field = $this->find_setting_field( $setting['key'], $settings_fields ); - if ( ! $setting_field ) { - continue; - } - - $field_name = $this->get_hubspot_contact_property_name( $setting_field['name'] ); - if ( ! $field_name ) { - continue; - } - - // Ensures File upload fields aren't named the same as the contact property. - // Gets around strange HubSpot behavior that causes file URL to be wiped out when form field and contact property have the same label. - $field_label = $setting_field['_hs_field_type'] == 'file' ? $setting_field['label'] . ' - ' . uniqid() : $setting_field['label']; - - $fields[] = array( - 'name' => $field_name, - 'label' => $field_label, - 'type' => $setting_field['_hs_type'], - 'fieldType' => $setting_field['_hs_field_type'], - ); - } - } - - $form_name = $feed_meta['_hs_form'] . $this->get_hubspot_formname_warning(); - $hs_form = array( - 'name' => $form_name, - 'formFieldGroups' => array( - array( - 'fields' => $fields, - ), - ), - ); - - // Field has externalOptions (lifecyclestage, probably). Add to form. - if ( ! empty( $external_options ) ) { - $hs_form['selectedExternalOptions'] = $external_options; - } - - // Only available when run from the form settings area. - $form = $this->get_current_form(); - - if ( empty( $form ) ) { - $form = GFAPI::get_form( $form_id ); - } - - /** - * Allows the HubSpot form object to be filtered before saving the feed. - * - * @since 1.0 - * - * @param array $hs_form The HubSpot form object to be filtered. - * @param array $feed_meta The current feed settings object. - * @param array $form The current Gravity Form Object. - */ - return gf_apply_filters( array( 'gform_hubspot_form_object_pre_save_feed', $form_id ), $hs_form, $feed_meta, $form ); - - } - - /** - * Generates the form submission object to be sent to HubSpot when the form is submitted. - * - * @since 1.0 - * - * @param array $feed Current Feed Object. - * @param array $entry Current Entry Object. - * @param array $form Current Form Object. - * - * @return array Returns a submission object in the format accepted by HubSpot's Submit Form endpoint. - */ - public function generate_form_submission_object( $feed, $entry, $form ) { - - $fields = array(); - $properties = $this->get_hubspot_contact_properties(); - - if ( empty( $properties ) ) { - $this->log_debug( __METHOD__ . '(): Aborting; no contact properties.' ); - - return array(); - } - - $settings_fields = array_merge( - rgar( $properties, 'basic', array() ), - rgar( $properties, 'additional', array() ) - ); - - $enum_properties = $this->get_enumeration_properties( $form ); - - // Build basic fields. - foreach ( $feed['meta'] as $key => $field_id ) { - - $property_name = $this->get_hubspot_contact_property_name( $key ); - $is_field_mapped = ! empty( $field_id ) && $property_name; - - if ( ! $is_field_mapped ) { - continue; - } - - $fields[] = array( - 'name' => $property_name, - 'value' => isset( $enum_properties[ $property_name ] ) ? trim( $field_id ) : $this->get_field_value( $form, $entry, $field_id ), - ); - } - - $owner_id = $this->get_contact_owner( $feed, $entry, $form ); - if ( $owner_id ) { - $fields[] = array( - 'name' => 'hubspot_owner_id', - 'value' => $owner_id, - ); - } - - // Build additional fields. - if ( is_array( $feed['meta']['additional_fields'] ) ) { - foreach ( $feed['meta']['additional_fields'] as $setting ) { - if ( rgar( $setting, 'custom_key' ) !== '' ) { - $setting['key'] = $setting['custom_key']; - } - - $setting_field = $this->find_setting_field( $setting['key'], $settings_fields ); - if ( ! $setting_field ) { - continue; - } - - $property_name = $this->get_hubspot_contact_property_name( $setting_field['name'] ); - $field_id = $setting['value']; - $is_field_mapped = ! empty( $field_id ) && $property_name; - if ( ! $is_field_mapped ) { - continue; - } - - $fields[] = array( - 'name' => $property_name, - 'value' => $this->get_prepared_field_value( $field_id, rgar( $setting_field, '_hs_field_type' ), $form, $entry ), - ); - } - } - - $context = array( - 'pageUri' => $this->get_page_uri( rgar( $entry, 'source_url' ) ), - 'pageName' => $form['title'], - ); - - $hutk = $this->get_hutk_cookie_value( rgar( $entry, 'id' ) ); - if ( ! empty( $hutk ) ) { - $context['hutk'] = $hutk; - } - - // Pass entry IP to HubSpot unless personal data settings for a form are set to not save the submitter's IP address. - if ( rgars( $form, 'personalData/preventIP' ) !== true ) { - $context['ipAddress'] = $entry['ip']; - } - - $submission_data = array( - 'fields' => $fields, - 'context' => $context, - ); - - /** - * Allows the HubSpot submission data to be filtered before being sent to HubSpot - * - * @since 1.0 - * - * @param array $submission_data The HubSpot submission data to be filtered. - * @param array $feed The current feed settings object. - * @param array $entry The current Entry Object. - * @param array $form The current Form Object. - */ - return gf_apply_filters( array( 'gform_hubspot_submission_data', $form['id'] ), $submission_data, $feed, $entry, $form ); - - } - - /** - * Returns the value to be used for the pageUri context property. - * - * @since 1.9 - * - * @param string $entry_source_url The value of the entry source_url property. - * - * @return string - */ - public function get_page_uri( $entry_source_url ) { - if ( - ! empty( $entry_source_url ) && ( - ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || - ( defined( 'DOING_CRON' ) && DOING_CRON ) || - ( defined( 'REST_REQUEST' ) && REST_REQUEST ) - ) - ) { - // Using the entry value instead of the Ajax/cron/REST request endpoint. - - return $entry_source_url; - } - - return GFFormsModel::get_current_page_url(); - } - - /** - * Gets the mapped field value in the format required for the specified HubSpot field type. - * - * @since 1.6 - * - * @param string $field_id The ID of the mapped form/entry field. - * @param string $hs_field_type The HubSpot field type. - * @param array $form The form currently being processed. - * @param array $entry The entry currently being processed. - * - * @return mixed - */ - public function get_prepared_field_value( $field_id, $hs_field_type, $form, $entry ) { - switch ( $hs_field_type ) { - case 'booleancheckbox': - return $this->prepare_boolean_field_value( $form, $entry, $field_id ); - - case 'checkbox': - return $this->prepare_checkbox_field_value( $form, $entry, $field_id ); - - case 'radio': - case 'select': - return $this->prepare_radio_select_field_value( $form, $entry, $field_id ); - } - - return $this->get_field_value( $form, $entry, $field_id ); - } - - /** - * Returns the value for a booleancheckbox HubSpot field. - * - * @since 1.6 - * - * @param array $form The form currently being processed. - * @param array $entry The entry currently being processed. - * @param string $field_id The ID of the mapped form/entry field. - * - * @return bool - */ - public function prepare_boolean_field_value( $form, $entry, $field_id ) { - $value = $this->get_field_value( $form, $entry, $field_id ); - $field = GFAPI::get_field( $form, $field_id ); - - if ( $field instanceof GF_Field_Consent && esc_html__( 'Not Checked', 'gravityforms' ) === $value ) { - return false; - } - - return ! ( empty( $value ) || ( is_string( $value ) && strtolower( $value ) === 'false' ) ); - } - - /** - * Returns the value for a checkbox HubSpot field. - * - * @since 1.6 - * - * @param array $form The form currently being processed. - * @param array $entry The entry currently being processed. - * @param string $field_id The ID of the mapped form/entry field. - * - * @return string - */ - public function prepare_checkbox_field_value( $form, $entry, $field_id ) { - $field = GFAPI::get_field( $form, $field_id ); - - if ( $field instanceof GF_Field_Checkbox ) { - $values = array(); - foreach ( $field->inputs as $input ) { - $value = rgar( $entry, (string) $input['id'] ); - if ( ! rgblank( $value ) ) { - if ( $field->enablePrice ) { - $items = explode( '|', $value ); - $value = $items[0]; - } - $values[] = $value; - } - } - - return $this->maybe_override_field_value( implode( ';', $values ), $form, $entry, $field_id ); - } elseif ( $field instanceof GF_Field_MultiSelect ) { - return $this->maybe_override_field_value( implode( ';', $field->to_array( rgar( $entry, $field_id ) ) ), $form, $entry, $field_id ); - } - - return $this->get_field_value( $form, $entry, $field_id ); - } - - /** - * Returns the value for radio and select HubSpot fields. - * - * @since 1.6 - * - * @param array $form The form currently being processed. - * @param array $entry The entry currently being processed. - * @param string $field_id The ID of the mapped form/entry field. - * - * @return string - */ - public function prepare_radio_select_field_value( $form, $entry, $field_id ) { - $field = GFAPI::get_field( $form, $field_id ); - - if ( $field instanceof GF_Field_Radio || $field instanceof GF_Field_Select ) { - $value = rgar( $entry, $field_id ); - if ( ! rgblank( $value ) && $field->enablePrice ) { - $items = explode( '|', $value ); - $value = $items[0]; - } - - return $this->maybe_override_field_value( $value, $form, $entry, $field_id ); - } - - return $this->get_field_value( $form, $entry, $field_id ); - } - - /** - * Returns the value of the selected field. Overrides the parent function to include Address Line 2 with Street Address - * - * @param array $form Current Form Object - * @param array $entry Current Entry Object - * @param string $field_id Current Field ID - * - * @return string The value of the current field specified in $field_id - */ - public function get_field_value( $form, $entry, $field_id ) { - - $field_value = parent::get_field_value( $form, $entry, $field_id ); - $field = GFFormsModel::get_field( $form, $field_id ); - - //Appending Line 2 to Street Address - if ( rgobj( $field, 'type' ) == 'address' && (string) $field_id == (string) $field->id . '.1' ) { - $field_value .= ' ' . parent::get_field_value( $form, $entry, $field['id'] . '.2' ); - } - return $field_value; - } - - /*** - * Searches for a field named or labeled $name in the list of settings fields specified by the $settings_fields array. Returns the field if it finds it, or false if not. - * - * @since 1.0 - * - * @param string $name Name of the field to look for. - * @param array $settings_fields Array of all settings fields. - * - * @return array|bool Returns the field whose name matches the specified $name variable - */ - public function find_setting_field( $name, $settings_fields ) { - - foreach ( $settings_fields as $field ) { - if ( $field['name'] === $name || $field['label'] === $name ) { - return $field; - } - } - return false; - } - - /** - * Gets a list of HubSpot owners - * - * @since 1.0 - * - * @return array|null Return a list of available Contact Owners configured in HubSpot - */ - public function get_hubspot_owners() { - if ( rgget( 'subview' ) !== $this->_slug || rgget( 'fid' ) === '' || ! $this->initialize_api() ) { - return null; - } - - global $_owner_choices; - - if ( ! $_owner_choices ) { - - $owners = $this->api->get_owners(); - - if ( is_wp_error( $owners ) ) { - return array( - array( - 'label' => esc_html__( 'Error retrieving HubSpot owners', 'gravityformshubspot' ), - 'value' => '', - ), - ); - } - - $_owner_choices = array(); - foreach ( $owners as $owner ) { - - if ( empty( $owner['id'] ) ) { - continue; - } - - if ( ! empty( $owner['firstName'] ) && ! empty( $owner['lastName'] ) ) { - $owner_label = "{$owner['firstName']} {$owner['lastName']}"; - } else { - $owner_label = rgar( $owner, 'email', esc_html__( 'No Name', 'gravityformshubspot' ) ); - } - - $_owner_choices[] = array( - 'label' => $owner_label, - 'value' => $owner['id'], - ); - } - - $_owner_choices = wp_list_sort( $_owner_choices, 'label' ); - } - - return $_owner_choices; - } - - /** - * Gets a list of contact properties, split into two arrays. "basic" contains basic contact properties and "additional" contains all others. - * - * @since 1.0 - * - * @return array Returns an associative array with two keys. The "basic" key contains an array with basic contact properties. The "additional" key contains an array with all other contact properties. - */ - public function get_hubspot_contact_properties() { - - $contact_properties = GFCache::get( self::CUSTOM_PROPERTIES_CACHE_KEY ); - - if ( ! empty( $contact_properties ) ) { - return $contact_properties; - } - - if ( ! $this->initialize_api() ) { - $this->log_debug( __METHOD__ . '(): Aborting; API not initialized.' ); - - return array(); - } - - $basic_field_names = array( 'firstname', 'lastname', 'email' ); - - // Only the following supported property types will be supported for mapping. - $supported_property_types = array( 'string', 'number', 'date', 'enumeration' ); - - $enum_properties = $this->get_enumeration_properties(); - - // Property names that are not supported for mapping to be ignored. - $ignore_property_names = array( 'hubspot_owner_id' ); - - $basic_fields = array(); - $additional_fields = array(); - $selection_fields = array(); - - $empty_choice = array( - 'label' => esc_html__( 'Select a Contact Property', 'gravityformshubspot' ), - 'value' => '', - ); - $groups = array( $empty_choice ); - - $labels = array(); - - $property_groups = $this->api->get_contact_properties(); - $is_props_wp_error = is_wp_error( $property_groups ); - - if ( $is_props_wp_error ) { - $this->log_debug( __METHOD__ . '(): Unable to get contact properties; ' . $property_groups->get_error_message() ); - } else { - foreach ( $property_groups as $property_group ) { - $group = array( 'label' => $property_group['displayName'], 'choices' => array() ); - - foreach ( $property_group['properties'] as $property ) { - - $field = array( - 'type' => 'field_select', - 'class' => 'medium', - 'label' => $property['label'], - 'name' => '_hs_customer_' . $property['name'], - 'value' => '_hs_customer_' . $property['name'], - '_hs_type' => $property['type'], - '_hs_field_type' => $property['fieldType'], - 'required' => $property['name'] == 'email', - ); - - $labels[ $property['label'] ][] = $property; - - $supported_in_additional_fields = ! in_array( $property['name'], $ignore_property_names ) && in_array( $property['type'], $supported_property_types ); - - if ( in_array( $property['name'], $basic_field_names, true ) ) { - - $basic_fields[] = $field; - - } elseif ( isset( $enum_properties[ $property['name'] ] ) ) { - $prop = $enum_properties[ $property['name'] ]; - $field['default_value'] = rgar( $prop, 'default_value' ); - $field['tooltip'] = rgar( $prop, 'tooltip' ); - $field['choices'] = $prop['allows_blank'] ? array( - array( - 'value' => '', - 'label' => esc_html__( 'Select an Option', 'gravityformshubspot' ), - ), - array( 'value' => ' ', 'label' => '' ), - ) : array(); - $field['choices'] = array_merge( $field['choices'], $property['options'] ); - - $selection_fields[] = $field; - } elseif ( $supported_in_additional_fields && $property['readOnlyValue'] === false ) { - - $additional_fields[] = $field; - $group['choices'][] = $field; - - } - } - - if ( ! empty( $group['choices'] ) ) { - usort( $group['choices'], array( $this, 'sort_properties' ) ); - $groups[] = $group; - } - } - - ksort( $labels ); - usort( $basic_fields, array( $this, 'sort_properties' ) ); - usort( $additional_fields, array( $this, 'sort_properties' ) ); - } - - $contact_properties = array( - 'basic' => $basic_fields, - 'additional' => $additional_fields, - 'selection' => $selection_fields, - 'grouped' => $groups - ); - - if ( ! $is_props_wp_error ) { - GFCache::set( self::CUSTOM_PROPERTIES_CACHE_KEY , $contact_properties, true, HOUR_IN_SECONDS ); - } - - return $contact_properties; - } - - /** - * Returns an array of enumeration field names to be displayed for mapping - * - * @since 1.0 - * - * @param array $form The current Form Object - * - * @return array Returns an array of enumeration fields to be mapped - */ - public function get_enumeration_properties( $form = null ) { - - if ( ! $form ) { - $form = $this->get_current_form(); - } - - /** - * Allows the list of selection properties settings to be changed dynamically. Useful when drop down or radio button custom fields are added in HubSpot and there is a need specify one - * of the options when creating the contact - */ - return apply_filters( 'gform_hubspot_custom_settings', - array( - 'hs_lead_status' => array( 'allows_blank' => true, 'tooltip' => esc_html__( '
Lead Status
Select the lead status value the newly added contact should be set to.', 'gravityformshubspot' ) ), - 'lifecyclestage' => array( 'allows_blank' => false, 'default_value' => 'lead', 'tooltip' => esc_html__( '
Lifecycle Stage
Select the lifecycle stage value the newly added contact should be set to.', 'gravityformshubspot' ) ), - ), - $form - ); - } - - /** - * Saves the hubspotutk cookie to the entry meta so it is available when the feed is processed in another request. - * - * @since 1.9 - * - * @param array $feed The feed being delayed. - * @param array $entry The entry currently being processed. - * @param array $form The form currently being processed. - */ - public function delay_feed( $feed, $entry, $form ) { - $value = $this->get_hutk_cookie_value(); - if ( empty( $value ) ) { - return; - } - - $entry_id = absint( rgar( $entry, 'id' ) ); - $form_id = absint( rgar( $form, 'id' ) ); - if ( empty( $entry_id ) || empty( $form_id ) ) { - return; - } - - gform_update_meta( $entry_id, self::HUTK_COOKIE_META_KEY, $value, $form_id ); - } - - /** - * Returns the hubspotutk value from $_COOKIE or the entry meta. - * - * @since 1.9 - * - * @param null|int $entry_id Null or the ID of the entry currently being processed. - * - * @return string|false - */ - public function get_hutk_cookie_value( $entry_id = null ) { - $value = rgar( $_COOKIE, 'hubspotutk', false ); - - if ( ! empty( $value ) ) { - return $value; - } - - $entry_id = absint( $entry_id ); - if ( empty( $entry_id ) ) { - return $value; - } - - return gform_get_meta( $entry_id, self::HUTK_COOKIE_META_KEY ); - } - - /** - * Process the HubSpot feed. - * - * @since 1.0 - * - * @param array $feed Feed object. - * @param array $entry Entry object. - * @param array $form Form object. - */ - public function process_feed( $feed, $entry, $form ) { - - // Create HubSpot submission object. - $submission_data = $this->generate_form_submission_object( $feed, $entry, $form ); - if ( empty( $submission_data ) ) { - $this->add_feed_error( esc_html__( 'Feed was not processed because the submission object was empty.', 'gravityformshubspot' ), $feed, $entry, $form ); - - return new WP_Error( 'empty_submission_object', 'The submission object was empty.' ); - } - - // If API instance is not initialized, exit. - if ( ! $this->initialize_api( false ) ) { - - // Log that we cannot process the feed. - $this->add_feed_error( esc_html__( 'Feed was not processed because API was not initialized.', 'gravityformshubspot' ), $feed, $entry, $form ); - - return new WP_Error( 'api_not_initialized', 'API not initialized.' ); - } - - $response = $this->api->submit_form( $feed['meta']['_hs_portal_id'], $feed['meta']['_hs_form_guid'], $submission_data ); - - if ( is_wp_error( $response ) ) { - $this->add_feed_error( sprintf( esc_html__( 'There was an error when creating the contact in HubSpot. %s', 'gravityformshubspot' ), $response->get_error_message() ), $feed, $entry, $form ); - $this->log_error( __METHOD__ . '(): Unable to create the contact; error data: ' . print_r( $response->get_error_data(), true ) ); - } - } - - /** - * Given a settings key, converts it into a Contact Property Name (if applicable). If specified settings key is not a Contact Property, returns false - * - * @since 1.0 - * - * @param string $settings_key Settings key to be transformed into a Contact Property Name. - * - * @return bool|mixed Returns the proper HubSpot Contact Property name based on the specified settings key. If the specified settings key is not a Contact Property, return false. - */ - public function get_hubspot_contact_property_name( $settings_key ) { - if ( strpos( $settings_key, '_hs_customer_' ) === 0 ) { - return str_replace( '_hs_customer_', '', $settings_key ); - } - return false; - } - - /** - * Used for usort() function to sort customer properties. - * - * @since 1.0 - * - * @param array $a Array. - * @param array $b Array. - * - * @return int - */ - public function sort_properties( $a, $b ) { - return strcmp( $a['label'], $b['label'] ); - } - - /** - * Evaluates who the Contact Owner is supposed to be (based on feed settings), and return the owner id. - * - * @since 1.0 - * - * @param array $feed Current Feed Object - * @param array $entry Current Entry Object - * @param array $form Current Form Object - * - * @return false|int Returns the Contact Owner's ID if one is supposed to be assigned to the contact. Otherwise returns false. - */ - public function get_contact_owner( $feed, $entry, $form ) { - - $owner_id = false; - - // Set contact owner. - if ( rgar( $feed['meta'], 'contact_owner' ) === 'select' && rgar( $feed['meta'], 'contact_owner_select' ) !== '' ) { - - $owner_id = rgar( $feed['meta'], 'contact_owner_select' ); - - } elseif ( rgar( $feed['meta'], 'contact_owner' ) === 'conditional' && ! rgar( $feed['meta'], 'conditions' ) !== '' ) { - - $conditions = rgar( $feed['meta'], 'conditions' ); - $entry_meta_keys = array_keys( GFFormsModel::get_entry_meta( $form['id'] ) ); - foreach ( $conditions as $rule ) { - if ( in_array( $rule['fieldId'], $entry_meta_keys ) ) { - - $is_value_match = GFFormsModel::is_value_match( rgar( $entry, $rule['fieldId'] ), $rule['value'], $rule['operator'], null, $rule, $form ); - - } else { - - $source_field = GFFormsModel::get_field( $form, $rule['fieldId'] ); - $field_value = empty( $entry ) ? GFFormsModel::get_field_value( $source_field, array() ) : GFFormsModel::get_lead_field_value( $entry, $source_field ); - $is_value_match = GFFormsModel::is_value_match( $field_value, $rule['value'], $rule['operator'], $source_field, $rule, $form ); - } - - if ( isset( $is_value_match ) && $is_value_match ) { - $owner_id = rgar( $rule, 'owner' ); - - break; - } - } - } - return $owner_id; - } - - /** - * Returns the warning string to be added to the HubSpot form names. - * - * @since 1.0 - * - * @return string - */ - public function get_hubspot_formname_warning() { - return ' ( ' . esc_html__( 'Do not delete or edit', 'gravityformshubspot' ) . ' )'; - } - - /** - * Returns the HubSpot Form name without the warning appended to it. - * - * @since 1.0 - * - * @param string $form_name The form name to be cleaned - * - * @return string - */ - public function get_hubspot_formname_without_warning( $form_name ) { - - return str_replace( $this->get_hubspot_formname_warning(), '', $form_name ); - - } - - /** - * Get action name for authentication state. - * - * @since 1.4 - * - * @return string - */ - public function get_authentication_state_action() { - - return 'gform_hubspot_authentication_state'; - - } - - /** - * Add tracking JS snippet to footer if there are any Hubspot feeds. - * - * @since 1.0 - */ - public function action_wp_footer() { - - $add_tracking = true; - - /** - * Allows the tracking script to be removed. - * - * @since 1.0 - * - * @param true $add_tracking Whether to output the tracking script. - */ - $add_tracking = apply_filters( 'gform_hubspot_output_tracking_script', $add_tracking ); - - if ( ! $add_tracking ) { - return; - } - - $feeds = $this->get_feeds(); - if ( empty( $feeds ) ) { - return; - } - - $portal_id = rgars( $feeds, '0/meta/_hs_portal_id' ); - - if ( $portal_id && strlen( $portal_id ) > 0 ) { - if ( ! is_admin() ) { - ?> - - - - th, #gaddon-setting-row-contact_owner_conditional > th { - display:none !important; -} - -.contact_owner_section { - display:none; -} - -.add-item { - margin-left: 6px; -} -.add-item, .remove-item { - position: relative; - color: #444; - top: 3px; -} - -#feed_condition_conditional_logic_container { - margin-top:10px; -} - -.gform-routings-field__buttons { - position: relative; - vertical-align: middle; - width: 40px; -} - -.gform-routings-field__buttons .repeater-buttons { - align-items: center; - display: flex; - flex: 1 0; - position: absolute; - top: 0; - bottom: 0; - height: 100%; - width: 100%; -} diff --git a/wp/wp-content/plugins/gravityformshubspot/css/form_settings.min.css b/wp/wp-content/plugins/gravityformshubspot/css/form_settings.min.css deleted file mode 100644 index 9535339d..00000000 --- a/wp/wp-content/plugins/gravityformshubspot/css/form_settings.min.css +++ /dev/null @@ -1 +0,0 @@ -.gform-routing-row{vertical-align:top}#assignees,#editable_fields{left:-9999px;position:absolute}.rtl #assignees,.rtl #editable_fields{left:auto;right:-9999px}table.gforms_form_settings th{border-left:0;padding-left:0!important}table.gform-routings thead th{padding:0}table.gform-routings tr.gform-routing-row td{vertical-align:top}table.gform-routings tr.gform-routing-row td .repeater-buttons{white-space:nowrap}.repeater-buttons{display:inline-block}.gform-routing-field,.gform-routing-owners{min-width:150px;width:100%}.gform-routing-operator{width:120px}.gform-routing-value{width:190px}html:not([dir=rtl]) .gform-routings__heading{text-align:left}html[dir=rtl] .gform-routings__heading{text-align:right}#gaddon-setting-row-additional_fields>th,#gaddon-setting-row-contact_owner_conditional>th{display:none!important}.contact_owner_section{display:none}.add-item{margin-left:6px}.add-item,.remove-item{color:#444;position:relative;top:3px}#feed_condition_conditional_logic_container{margin-top:10px}.gform-routings-field__buttons{position:relative;vertical-align:middle;width:40px}.gform-routings-field__buttons .repeater-buttons{align-items:center;bottom:0;display:flex;flex:1 0;height:100%;position:absolute;top:0;width:100%} \ No newline at end of file diff --git a/wp/wp-content/plugins/gravityformshubspot/css/plugin_settings.css b/wp/wp-content/plugins/gravityformshubspot/css/plugin_settings.css deleted file mode 100644 index 76cf874f..00000000 --- a/wp/wp-content/plugins/gravityformshubspot/css/plugin_settings.css +++ /dev/null @@ -1,31 +0,0 @@ -#deauth_scope { - display: none; - margin-top: 18px; -} - -.deauth_button { - margin-top: 0.5em !important; -} - -#gform_hubspot_deauth_button { - border: 1px solid #9E0B0F; - background: #9E0B0F; - color: #FFF; - -webkit-box-shadow: inset 0 2px 5px -3px rgba( 173, 12, 17, 0.5 ); - box-shadow: inset 0 2px 5px -3px rgba( 173, 12, 17, 0.5 ); - text-shadow: none; -} - -#tab_gravityformshubspot table.gforms_form_settings > tbody > tr > th { - padding: 0; - width: 0; -} - -#tab_gravityformshubspot table.gforms_form_settings #gform-settings-save, -#tab_gravityformshubspot .gform-settings-save-container { - display: none; -} - -#last_cache_clearance { - font-size: 0.75rem; -} diff --git a/wp/wp-content/plugins/gravityformshubspot/css/plugin_settings.min.css b/wp/wp-content/plugins/gravityformshubspot/css/plugin_settings.min.css deleted file mode 100644 index d0f24999..00000000 --- a/wp/wp-content/plugins/gravityformshubspot/css/plugin_settings.min.css +++ /dev/null @@ -1 +0,0 @@ -#deauth_scope{display:none;margin-top:18px}.deauth_button{margin-top:.5em!important}#gform_hubspot_deauth_button{background:#9e0b0f;border:1px solid #9e0b0f;box-shadow:inset 0 2px 5px -3px rgba(173,12,17,.5);color:#fff;text-shadow:none}#tab_gravityformshubspot table.gforms_form_settings>tbody>tr>th{padding:0;width:0}#tab_gravityformshubspot .gform-settings-save-container,#tab_gravityformshubspot table.gforms_form_settings #gform-settings-save{display:none}#last_cache_clearance{font-size:.75rem} \ No newline at end of file diff --git a/wp/wp-content/plugins/gravityformshubspot/hubspot.php b/wp/wp-content/plugins/gravityformshubspot/hubspot.php deleted file mode 100644 index 545f5744..00000000 --- a/wp/wp-content/plugins/gravityformshubspot/hubspot.php +++ /dev/null @@ -1,75 +0,0 @@ - - - diff --git a/wp/wp-content/plugins/gravityformshubspot/includes/class-gf-hubspot-api.php b/wp/wp-content/plugins/gravityformshubspot/includes/class-gf-hubspot-api.php deleted file mode 100644 index bd7cd82d..00000000 --- a/wp/wp-content/plugins/gravityformshubspot/includes/class-gf-hubspot-api.php +++ /dev/null @@ -1,362 +0,0 @@ -auth_data = $auth_data; - } - - /** - * Make API request. - * - * @since 1.0 - * - * @param string $path Request path. - * @param array $options Request options. - * @param string $method Request method. Defaults to GET. - * @param string $return_key Array key from response to return. Defaults to null (return full response). - * @param int|array $response_code Expected HTTP response code. - * - * @return array|WP_Error - */ - public function make_request( $path = '', $options = array(), $method = 'GET', $return_key = null, $response_code = 200 ) { - - // Log API call succeed. - gf_hspot()->log_debug( __METHOD__ . '(): Making request to: ' . $path ); - - // Get authentication data. - $auth_data = $this->auth_data; - - // Build request URL. - if ( $path === 'token/revoke' ) { - $request_url = 'https://api.hubapi.com/oauth/v1/refresh-tokens/' . $options['token']; - - // Execute request. - $response = wp_remote_request( $request_url, array( 'method' => $method ) ); - } else { - $request_url = strpos( $path, 'https://' ) === 0 ? $path : $this->api_url . $path; - - // Add options if this is a GET request. - if ( 'GET' === $method ) { - $request_url = add_query_arg( $options, $request_url ); - } - - // Prepare request arguments. - $args = array( - 'method' => $method, - 'headers' => array( - 'Accept' => 'application/json', - 'Authorization' => 'Bearer ' . $auth_data['access_token'], - 'Content-Type' => 'application/json', - ), - ); - - // Add request arguments to body. - if ( in_array( $method, array( 'POST', 'PUT' ) ) ) { - $args['body'] = json_encode( $options ); - } - - // Execute API request. - $response = wp_remote_request( $request_url, $args ); - } - - if ( is_wp_error( $response ) ) { - gf_hspot()->log_error( __METHOD__ . '(): HTTP request failed; ' . $response->get_error_message() ); - - return $response; - } - - // If an incorrect response code was returned, return WP_Error. - $retrieved_response_code = wp_remote_retrieve_response_code( $response ); - if ( is_int( $response_code ) ) { - $response_code = array( $response_code ); - } - if ( ! in_array( $retrieved_response_code, $response_code, true ) ) { - $response_code = implode( ', ', $response_code ); - $error_message = "Expected response code: {$response_code}. Returned response code: {$retrieved_response_code}."; - $json_body = gf_hspot()->maybe_decode_json( $response['body'] ); - - $error_data = array( 'status' => $retrieved_response_code ); - if ( ! rgempty( 'message', $json_body ) ) { - $error_message = $json_body['message']; - } - if ( ! rgempty( rgars( $json_body, 'errors' ) ) ) { - $error_data['data'] = rgars( $json_body, 'errors' ); - } - - // 401 Unauthorized - Returned when the authentication provided is invalid. - if ( $retrieved_response_code === 401 ) { - $log = 'API credentials are invalid;'; - } else { - $log = 'API errors returned;'; - } - - gf_hspot()->log_error( __METHOD__ . "(): $log " . $error_message . '; error data: ' . print_r( $error_data, true ) ); - - return new WP_Error( 'hubspot_api_error', $error_message, $error_data ); - } - - // Convert JSON response to array. - $response = gf_hspot()->maybe_decode_json( $response['body'] ); - - // If a return key is defined and array item exists, return it. - if ( ! empty( $return_key ) && rgar( $response, $return_key ) ) { - return rgar( $response, $return_key ); - } - - return $response; - - } - - /** - * Refresh access tokens. - * - * @since 1.0 - * - * @return array|WP_Error - */ - public function refresh_token() { - // Get authentication data. - $auth_data = $this->auth_data; - - // If refresh token is not provided, throw exception. - if ( ! rgar( $auth_data, 'refresh_token' ) ) { - return new WP_Error( 'hubspot_refresh_token_error', esc_html__( 'Refresh token must be provided.', 'gravityformshubspot' ) ); - } - - $args = array( - 'body' => array( - 'refresh_token' => $auth_data['refresh_token'], - 'state' => wp_create_nonce( gf_hspot()->get_authentication_state_action() ), - ), - ); - - $response = wp_remote_post( gf_hspot()->get_gravity_api_url( '/auth/hubspot/refresh' ), $args ); - $response_code = wp_remote_retrieve_response_code( $response ); - $message = wp_remote_retrieve_response_message( $response ); - - if ( $response_code === 200 ) { - $auth_payload = json_decode( wp_remote_retrieve_body( $response ), true ); - $auth_payload = json_decode( $auth_payload['auth_payload'], true ); - - if ( isset( $auth_payload['access_token'] ) && wp_verify_nonce( $auth_payload['state'], gf_hspot()->get_authentication_state_action() ) ) { - $auth_data['access_token'] = $auth_payload['access_token']; - $auth_data['refresh_token'] = $auth_payload['refresh_token']; - $auth_data['expires_in'] = $auth_payload['expires_in']; - - $this->auth_data = $auth_data; - - return $auth_data; - } - - if ( isset( $auth_payload['error'] ) ) { - $message = $auth_payload['error']; - } elseif ( isset( $auth_payload['status'] ) ) { - $message = $auth_payload['status']; - } - - } - - return new WP_Error( 'hubspot_refresh_token_error', $message, array( 'status' => $response_code ) ); - } - - /** - * Revoke authentication token. - * - * @since 1.0 - * - * @return array|WP_Error - */ - public function revoke_token() { - - // Get authentication data. - $auth_data = $this->auth_data; - - // If refresh token is not provided, throw exception. - if ( ! rgar( $auth_data, 'refresh_token' ) ) { - return new WP_Error( 'hubspot_revoke_token_error', esc_html__( 'Refresh token must be provided.', 'gravityformshubspot' ) ); - } - - return $this->make_request( 'token/revoke', array( 'token' => $auth_data['refresh_token'] ), 'DELETE', null, 204 ); - - } - - /** - * Get available users. - * - * @since 1.0 - * - * @return array|WP_Error - */ - public function get_contacts() { - static $contacts; - - if ( ! isset( $contacts ) ) { - $contacts = $this->make_request( 'contacts/v1/lists/all/contacts/all', array(), 'GET', 'users' ); - } - - return $contacts; - } - - /** - * Get contact properties. - * - * @since 1.0 - * - * @return array|WP_Error - */ - public function get_contact_properties() { - - $properties = $this->make_request( 'properties/v1/contacts/groups/?includeProperties=true', array(), 'GET' ); - - return $properties; - } - - /** - * Update contact properties by email. - * - * @since 1.0 - * - * @param string $email Email. - * @param array $data Contact data. - * - * @return array|WP_Error - */ - public function update_contact_by_email( $email, $data ) { - return $this->make_request( "contacts/v1/contact/createOrUpdate/email/{$email}/", $data, 'POST' ); - } - - /** - * Create a new form. - * - * @since 1.0 - * - * @param array $form The form options array. - * - * @return array|WP_Error - */ - public function create_form( $form ) { - return $this->make_request( 'forms/v2/forms', $form, 'POST' ); - } - - /** - * Get form by guid. - * - * @since 1.0 - * - * @param string $guid GUID of the form. - * - * @return array|WP_Error - */ - public function get_form( $guid ) { - return $this->make_request( "forms/v2/forms/{$guid}" ); - } - - /** - * Get all forms. - * - * @since 1.0 - * - * @return array|WP_Error Returns an array of forms - */ - public function get_forms() { - return $this->make_request( 'forms/v2/forms' ); - } - - /** - * Update the form. - * - * @since 1.0 - * - * @param string $guid GUID of the form. - * @param array $form The form options array. - * - * @return array|WP_Error - */ - public function update_form( $guid, $form ) { - - gf_hspot()->log_debug( 'Updating Form. GUID: ' . $guid ); - gf_hspot()->log_debug( 'Payload: ' . print_r( $form, true ) ); - - return $this->make_request( "forms/v2/forms/{$guid}", $form, 'POST' ); - } - - /** - * Delete form. - * - * @since 1.0 - * - * @param string $guid GUID of the form. - * - * @return array|WP_Error - */ - public function delete_form( $guid ) { - return $this->make_request( "forms/v2/forms/{$guid}", array(), 'DELETE', null, 204 ); - } - - /** - * Get contact owners from HubSpot. - * - * @since 1.0 - * @since 2.1 Updated to use the v3 endpoint. - * - * @return array|WP_Error - */ - public function get_owners() { - return $this->make_request( 'crm/v3/owners', array( 'limit' => 500 ), 'GET', 'results' ); - } - - /** - * Submit form data to HubSpot. - * - * @since 1.0 - * - * @param string $portal_id HubSpot portal ID. - * @param string $form_guid HubSpot form GUID. - * @param array $submission Form submission data. - * - * @return array|WP_Error - */ - public function submit_form( $portal_id, $form_guid, $submission ) { - - // Submit HubSpot form. - $url = "https://api.hsforms.com/submissions/v3/integration/submit/{$portal_id}/{$form_guid}"; - - gf_hspot()->log_debug( 'Submitting Form. URL:' . $url ); - gf_hspot()->log_debug( 'Payload: ' . print_r( $submission, true ) ); - - return $this->make_request( $url, $submission, 'POST' ); - } - -} diff --git a/wp/wp-content/plugins/gravityformshubspot/js/contact_owner_setting.js b/wp/wp-content/plugins/gravityformshubspot/js/contact_owner_setting.js deleted file mode 100644 index 71769cda..00000000 --- a/wp/wp-content/plugins/gravityformshubspot/js/contact_owner_setting.js +++ /dev/null @@ -1,310 +0,0 @@ -/* global jQuery, gform_hubspot_owner_settings_strings, gf_vars */ -/* eslint-disable no-var */ - -jQuery(document).ready( function() { - - new GFOwnerSetting(); - -} ); - -var legacyUI = gform_hubspot_owner_settings_strings.legacy_ui; -var prefix = { - input: legacyUI ? '_gaddon_setting_' : '_gform_setting_', - field: legacyUI ? 'gaddon-setting-row-' : 'gform_setting_', -}; - -function GFOwnerSetting() { - var $ = jQuery; - - /** - * Initializes the Contact Owner module in the HubSpot feed settings. - */ - this.init = function() { - this.initOwner(); - new GFConditionsSetting(); - }; - - /** - * Binds event listeners to the contact owner inputs and initializes the state. - */ - this.initOwner = function() { - var t = this; - - $( '#contact_owner0, #contact_owner1, #contact_owner2' ).on( 'change', function() { - t.toggleOwner( true ); - } ); - - this.toggleOwner( false ); - }; - - /** - * Toggles the active owner inputs. - * - * @param {boolean} doSlide - */ - this.toggleOwner = function( doSlide ) { - var ownerRadioIds = [ - '#' + prefix.field + 'contact_owner_select', - '#' + prefix.field + 'contact_owner_conditional', - ]; - var $section = $( '.contact_owner_section' ); - var $selectedOption = $( 'input[name="' + prefix.input + 'contact_owner"]:checked' ); - var selection = $selectedOption.val(); - - $( ownerRadioIds.join( ', ' ) ).hide(); - - // No contact owner selected. Hide and exit. - if ( selection === 'none' ) { - if ( doSlide && legacyUI ) { - $section.slideUp(); - } else { - $section.hide(); - } - return; - } - - // Show the contact owner section and the selected option. - if ( $section.is( ':hidden' ) ) { - if ( doSlide && legacyUI ) { - $section.slideDown(); - } else { - $section.show(); - } - } - - $( '#' + prefix.field + 'contact_owner_' + selection ).show(); - }; - - //Initializes this class - this.init(); -} - -function GFConditionsSetting() { - var $ = jQuery; - - //Instantiating conditions repeater - this.$element = jQuery('#gform_conditions_setting'); - this.fieldId = 'conditions'; - this.fieldName = prefix.input + 'conditions'; - this.options = null; - - this.init = function() { - - var t = this; - - this.options = { - fieldName: this.fieldName, - fieldId: this.fieldId, - fields: gform_hubspot_owner_settings_strings['fields'],// [{'id': '1', 'label':'Name'}, {'id':'2', 'label': 'Email'} ],// gf_routing_setting_strings['fields'], - owners: gform_hubspot_owner_settings_strings['owners'], - imagesURL: gf_vars.baseUrl + "/images", - items: this.getItems(), - operatorStrings: {"is":"is","isnot":"isNot", ">":"greaterThan", "<":"lessThan", "contains":"contains", "starts_with":"startsWith", "ends_with":"endsWith"}, - }; - - var routingsMarkup, headerMarkup; - headerMarkup = '{0}'; - headerMarkup += '{1}'; - headerMarkup += ''; - - headerMarkup = headerMarkup.gformFormat( gform_hubspot_owner_settings_strings.assign_to, gform_hubspot_owner_settings_strings.condition ); - routingsMarkup = '{0}{1}
'.gformFormat(headerMarkup, this.getNewRow()); - - var $routings = $(routingsMarkup); - - $routings.find('.repeater').repeater({ - - limit : 0, - items : this.options.items, - addButtonMarkup : '', - removeButtonMarkup: '', - callbacks : { - save : function (obj, data) { - $('#' + t.options.fieldId).val($.toJSON(data)); - }, - beforeAdd: function (obj, $elem, item) { - if ( item.owner ) { - $elem.find('.gform-routing-owners').val(item.owner); - } - - var $field = $elem.find('.gform-routing-field').first(); - $field.value = item.fieldId; - t.changeField($field); - - var $operator = $elem.find('.gform-routing-operator').first(); - $operator.value = item.operator; - - t.changeOperator($operator); - - var $value = $elem.find('.gform-routing-value'); - $value.val(item.value); - - }, - } - }) - .on('change', '.gform-routing-field', function (e) { - t.changeField(this); - }) - .on('change', '.gform-routing-operator', function () { - t.changeOperator(this); - }) - - this.$element.append($routings); - } - - this.getNewRow = function () { - var r = []; - - r.push( '{0}'.gformFormat( this.getOwners() ) ); - r.push( '{0}'.gformFormat( this.getFields() ) ); - r.push( '{0}'.gformFormat( this.getOperators( this.options.fields[0] ) ) ); - r.push( '{0}'.gformFormat( this.getValues() ) ); - r.push( '{buttons}' ); - - return '{0}'.gformFormat( r.join('') ); - }, - - this.getOwners = function () { - - var i, n, account, - owners = this.options.owners, - str = '"; - return str; - }, - - this.getFields = function () { - var i, j, key, val, label, groupLabel, options, numRows, - select = [], - settings = this.options.fields; - select.push('"); - return select.join(''); - }, - - this.changeOperator = function (operatorSelect) { - var $select = $(operatorSelect), - $buttons = $select.closest('tr').find('.repeater-buttons'); - var index = $buttons.find('.add-item ').data('index'); - var $fieldSelect = $select.closest('tr').find('.gform-routing-field'); - var filter = this.getFilter($fieldSelect.value); - if (filter) { - $select.closest('tr').find(".gform-routing-value").replaceWith(this.getValues(filter, operatorSelect.value, index)); - } - }, - - this.changeField = function (fieldSelect) { - var filter = this.getFilter(fieldSelect.value); - if (filter) { - var $select = $(fieldSelect), - $buttons = $select.closest('tr').find('.repeater-buttons'); - var index = $buttons.find('.add-item ').data('index'); - $select.closest('tr').find(".gform-routing-value").replaceWith(this.getValues(filter, null, index)); - $select.closest('tr').find(".gform-filter-type").val(filter.type).change(); - var $newOperators = $(this.getOperators(filter, index)); - $select.closest('tr').find(".gform-routing-operator").replaceWith($newOperators); - $select.closest('tr').find(".gform-routing-operator").change(); - } - }, - - this.getOperators = function (filter, index) { - if ( typeof index == 'undefined' || index === null ){ - index = '{i}'; - } - var i, operator, - operatorStrings = this.options.operatorStrings, - str = '"; - return str; - }, - - this.getValues = function (filter, selectedOperator, index) { - var i, val, text, str, options = ""; - - if ( typeof index == 'undefined' || index === null ){ - index = '{i}'; - } - - if ( filter && filter.values && selectedOperator != 'contains' ) { - for (i = 0; i < filter.values.length; i++) { - val = filter.values[i].value; - text = filter.values[i].text; - options += ''.gformFormat(val, text); - } - str = ''.gformFormat(index, options); - } else { - str = ''.gformFormat(index); - } - - return str; - }, - - this.getFilter = function (key) { - var fields = this.options.fields; - if (!key) - return; - for (var i = 0; i < fields.length; i++) { - if (key == fields[i].key) - return fields[i]; - if (fields[i].group) { - for (var j = 0; j < fields[i].filters.length; j++) { - if (key == fields[i].filters[j].key) - return fields[i].filters[j]; - } - } - - } - }, - - this.selected = function (selected, current){ - return selected == current ? 'selected="selected"' : ""; - } - - this.getItems = function () { - var json = $('#' + this.fieldId ).val(); - var default_items = [ {owner: '', fieldId: '0', operator: 'is', value: ''} ]; - var items = json ? $.parseJSON(json) : default_items; - return items; - } - - this.init(); - - String.prototype.format = function () { - var args = arguments; - return this.replace(/{(\d+)}/g, function (match, number) { - return typeof args[number] != 'undefined' ? args[number] : match; - }); - }; - -} - diff --git a/wp/wp-content/plugins/gravityformshubspot/js/contact_owner_setting.min.js b/wp/wp-content/plugins/gravityformshubspot/js/contact_owner_setting.min.js deleted file mode 100644 index bdd56622..00000000 --- a/wp/wp-content/plugins/gravityformshubspot/js/contact_owner_setting.min.js +++ /dev/null @@ -1 +0,0 @@ -jQuery(document).ready(function(){new GFOwnerSetting});var legacyUI=gform_hubspot_owner_settings_strings.legacy_ui,prefix={input:legacyUI?"_gaddon_setting_":"_gform_setting_",field:legacyUI?"gaddon-setting-row-":"gform_setting_"};function GFOwnerSetting(){var r=jQuery;this.init=function(){this.initOwner(),new GFConditionsSetting},this.initOwner=function(){var t=this;r("#contact_owner0, #contact_owner1, #contact_owner2").on("change",function(){t.toggleOwner(!0)}),this.toggleOwner(!1)},this.toggleOwner=function(t){var e=["#"+prefix.field+"contact_owner_select","#"+prefix.field+"contact_owner_conditional"],o=r(".contact_owner_section"),i=r('input[name="'+prefix.input+'contact_owner"]:checked').val();r(e.join(", ")).hide(),"none"===i?t&&legacyUI?o.slideUp():o.hide():(o.is(":hidden")&&(t&&legacyUI?o.slideDown():o.show()),r("#"+prefix.field+"contact_owner_"+i).show())},this.init()}function GFConditionsSetting(){var n=jQuery;this.$element=jQuery("#gform_conditions_setting"),this.fieldId="conditions",this.fieldName=prefix.input+"conditions",this.options=null,this.init=function(){var r=this,t=(this.options={fieldName:this.fieldName,fieldId:this.fieldId,fields:gform_hubspot_owner_settings_strings.fields,owners:gform_hubspot_owner_settings_strings.owners,imagesURL:gf_vars.baseUrl+"/images",items:this.getItems(),operatorStrings:{is:"is",isnot:"isNot",">":"greaterThan","<":"lessThan",contains:"contains",starts_with:"startsWith",ends_with:"endsWith"}},t=(t=(t='{0}')+'{1}'+"").gformFormat(gform_hubspot_owner_settings_strings.assign_to,gform_hubspot_owner_settings_strings.condition),t='{0}{1}
'.gformFormat(t,this.getNewRow()),n(t));t.find(".repeater").repeater({limit:0,items:this.options.items,addButtonMarkup:'',removeButtonMarkup:'',callbacks:{save:function(t,e){n("#"+r.options.fieldId).val(n.toJSON(e))},beforeAdd:function(t,e,o){o.owner&&e.find(".gform-routing-owners").val(o.owner);var i=e.find(".gform-routing-field").first(),i=(i.value=o.fieldId,r.changeField(i),e.find(".gform-routing-operator").first());i.value=o.operator,r.changeOperator(i),e.find(".gform-routing-value").val(o.value)}}}).on("change",".gform-routing-field",function(t){r.changeField(this)}).on("change",".gform-routing-operator",function(){r.changeOperator(this)}),this.$element.append(t)},this.getNewRow=function(){var t=[];return t.push("{0}".gformFormat(this.getOwners())),t.push("{0}".gformFormat(this.getFields())),t.push("{0}".gformFormat(this.getOperators(this.options.fields[0]))),t.push("{0}".gformFormat(this.getValues())),t.push('{buttons}'),'{0}'.gformFormat(t.join(""))},this.getOwners=function(){for(var t=this.options.owners,e='"},this.getFields=function(){var t,e,o,i,r,n,s,a,g=[],l=this.options.fields;for(g.push('"),g.join("")},this.changeOperator=function(t){var e=n(t),o=e.closest("tr").find(".repeater-buttons").find(".add-item ").data("index"),i=e.closest("tr").find(".gform-routing-field"),i=this.getFilter(i.value);i&&e.closest("tr").find(".gform-routing-value").replaceWith(this.getValues(i,t.value,o))},this.changeField=function(t){var e,o=this.getFilter(t.value);o&&(e=(t=n(t)).closest("tr").find(".repeater-buttons").find(".add-item ").data("index"),t.closest("tr").find(".gform-routing-value").replaceWith(this.getValues(o,null,e)),t.closest("tr").find(".gform-filter-type").val(o.type).change(),o=n(this.getOperators(o,e)),t.closest("tr").find(".gform-routing-operator").replaceWith(o),t.closest("tr").find(".gform-routing-operator").change())},this.getOperators=function(t,e){var o,i,r=this.options.operatorStrings,n='"},this.getValues=function(t,e,o){var i,r,n,s,a="";if(null==o&&(o="{i}"),t&&t.values&&"contains"!=e){for(i=0;i{1}'.gformFormat(r,n);s=''.gformFormat(o,a)}else s=''.gformFormat(o);return s},this.getFilter=function(t){var e=this.options.fields;if(t)for(var o=0;o\n" -"Language-Team: Gravity Forms \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-03-14T17:07:42+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"X-Generator: WP-CLI 2.8.1\n" -"X-Domain: gravityformshubspot\n" - -#. Plugin Name of the plugin -msgid "Gravity Forms HubSpot Add-On" -msgstr "" - -#. Plugin URI of the plugin -#. Author URI of the plugin -msgid "https://gravityforms.com" -msgstr "" - -#. Description of the plugin -msgid "Integrates Gravity Forms with HubSpot, allowing form submissions to be automatically sent to your HubSpot account." -msgstr "" - -#. Author of the plugin -msgid "Gravity Forms" -msgstr "" - -#: class-gf-hubspot.php:255 -#: class-gf-hubspot.php:1086 -#: class-gf-hubspot.php:1091 -msgid "Name" -msgstr "" - -#: class-gf-hubspot.php:285 -msgid "Create record in HubSpot only when payment is received." -msgstr "" - -#: class-gf-hubspot.php:338 -msgid "Are you sure you want to disconnect from HubSpot for this website?" -msgstr "" - -#: class-gf-hubspot.php:339 -msgid "Are you sure you want to disconnect all Gravity Forms sites connected to this HubSpot account?" -msgstr "" - -#: class-gf-hubspot.php:484 -msgid "Unable to connect your HubSpot account due to mismatched state." -msgstr "" - -#: class-gf-hubspot.php:504 -msgid "HubSpot settings have been updated." -msgstr "" - -#: class-gf-hubspot.php:516 -msgid "Unable to connect your HubSpot account." -msgstr "" - -#: class-gf-hubspot.php:617 -msgid "HubSpot is an all-in-one CRM, Sales, Marketing, and Customer Service platform." -msgstr "" - -#: class-gf-hubspot.php:620 -msgid "The Gravity Forms HubSpot Add-On connects the power of the world’s leading growth platform - HubSpot - with Gravity Forms so your business can grow better." -msgstr "" - -#. translators: 1: Open link tag 2: Close link tag -#: class-gf-hubspot.php:625 -msgid "If you don't have a HubSpot account, you can %1$ssign up for your free HubSpot account here%2$s." -msgstr "" - -#: class-gf-hubspot.php:646 -msgid "Clear Custom Contact Properties Cache" -msgstr "" - -#. translators: 1: Open link tag 2: Close link tag -#: class-gf-hubspot.php:722 -msgid "There is a problem communicating with HubSpot right now, please check back later. If this issue persists for more than a day, please %1$sopen a support ticket%2$s." -msgstr "" - -#: class-gf-hubspot.php:763 -msgid "Click here to connect your HubSpot account" -msgstr "" - -#: class-gf-hubspot.php:768 -msgid "SSL Certificate Required" -msgstr "" - -#. translators: 1: Open link tag 2: Close link tag -#: class-gf-hubspot.php:770 -msgid "Make sure you have an SSL certificate installed and enabled, then %1$sclick here to continue%2$s." -msgstr "" - -#: class-gf-hubspot.php:783 -msgid "Signed into HubSpot." -msgstr "" - -#: class-gf-hubspot.php:787 -#: class-gf-hubspot.php:793 -msgid "Disconnect your HubSpot account" -msgstr "" - -#: class-gf-hubspot.php:791 -msgid "De-authorize this site only" -msgstr "" - -#: class-gf-hubspot.php:792 -msgid "Disconnect all Gravity Forms sites connected to this HubSpot account" -msgstr "" - -#: class-gf-hubspot.php:822 -msgid "Cache was cleared successfully." -msgstr "" - -#: class-gf-hubspot.php:830 -msgid "The cache could not be cleared at the moment." -msgstr "" - -#: class-gf-hubspot.php:835 -msgid "Due to HubSpot's daily API usage limits, Gravity Forms stores HubSpot custom contact properties data for one hour. If you added new custom properties or made a change to them, you might not see it reflected immediately due to this data caching. To manually clear the custom contact properties cache, click the button below." -msgstr "" - -#: class-gf-hubspot.php:837 -msgid "Clear Custom Fields Cache" -msgstr "" - -#: class-gf-hubspot.php:842 -msgid "never cleared manually before" -msgstr "" - -#: class-gf-hubspot.php:843 -msgid "Last time the cache was cleared manually: " -msgstr "" - -#: class-gf-hubspot.php:997 -msgid "Access denied." -msgstr "" - -#: class-gf-hubspot.php:1091 -msgid "Enter a feed name to uniquely identify this feed." -msgstr "" - -#: class-gf-hubspot.php:1095 -msgid "Feed Type" -msgstr "" - -#: class-gf-hubspot.php:1099 -msgid "Create Contact" -msgstr "" - -#: class-gf-hubspot.php:1108 -#: class-gf-hubspot.php:1114 -msgid "HubSpot Form Name" -msgstr "" - -#: class-gf-hubspot.php:1115 -msgid "Enter the name for the form that will be automatically created in your HubSpot account to work in conjunction with this feed. This HubSpot form will be configured to match your mapped fields below and is required. Once created, please don't remove or edit it." -msgstr "" - -#: class-gf-hubspot.php:1140 -#: class-gf-hubspot.php:1163 -msgid "Contact Owner" -msgstr "" - -#: class-gf-hubspot.php:1146 -msgid "None  " -msgstr "" - -#: class-gf-hubspot.php:1150 -msgid "Select Owner  " -msgstr "" - -#: class-gf-hubspot.php:1154 -msgid "Assign Conditionally" -msgstr "" - -#: class-gf-hubspot.php:1158 -msgid "Select a HubSpot user that will be assigned as the owner of the newly created Contact." -msgstr "" - -#: class-gf-hubspot.php:1177 -msgid "Select Owner" -msgstr "" - -#: class-gf-hubspot.php:1214 -msgid "Add Additional Contact Fields" -msgstr "" - -#: class-gf-hubspot.php:1234 -msgid "Additional Options" -msgstr "" - -#: class-gf-hubspot.php:1331 -msgid "There was an error connecting to Hubspot." -msgstr "" - -#: class-gf-hubspot.php:1338 -msgid "There was an error validating the form name. Please try saving again" -msgstr "" - -#: class-gf-hubspot.php:1343 -msgid "This form name is already in use in HubSpot. Please enter a unique form name." -msgstr "" - -#: class-gf-hubspot.php:1352 -msgid "edit" -msgstr "" - -#: class-gf-hubspot.php:1352 -msgid "add" -msgstr "" - -#. translators: Action to perform on the form. -#: class-gf-hubspot.php:1354 -msgid "Could not %s HubSpot form. Please try again later." -msgstr "" - -#: class-gf-hubspot.php:2000 -msgid "Error retrieving HubSpot owners" -msgstr "" - -#: class-gf-hubspot.php:2016 -msgid "No Name" -msgstr "" - -#: class-gf-hubspot.php:2067 -msgid "Select a Contact Property" -msgstr "" - -#: class-gf-hubspot.php:2111 -msgid "Select an Option" -msgstr "" - -#: class-gf-hubspot.php:2172 -msgid "
Lead Status
Select the lead status value the newly added contact should be set to." -msgstr "" - -#: class-gf-hubspot.php:2173 -msgid "
Lifecycle Stage
Select the lifecycle stage value the newly added contact should be set to." -msgstr "" - -#: class-gf-hubspot.php:2241 -msgid "Feed was not processed because the submission object was empty." -msgstr "" - -#: class-gf-hubspot.php:2250 -msgid "Feed was not processed because API was not initialized." -msgstr "" - -#: class-gf-hubspot.php:2258 -msgid "There was an error when creating the contact in HubSpot. %s" -msgstr "" - -#: class-gf-hubspot.php:2347 -msgid "Do not delete or edit" -msgstr "" - -#: includes/class-gf-hubspot-api.php:155 -#: includes/class-gf-hubspot-api.php:208 -msgid "Refresh token must be provided." -msgstr "" diff --git a/wp/wp-content/plugins/leadin/build/elementor.asset.php b/wp/wp-content/plugins/leadin/build/elementor.asset.php deleted file mode 100644 index 90543e6d..00000000 --- a/wp/wp-content/plugins/leadin/build/elementor.asset.php +++ /dev/null @@ -1 +0,0 @@ - array('jquery', 'react', 'react-dom', 'wp-i18n'), 'version' => '8ac93e198a0f22d86cb7'); diff --git a/wp/wp-content/plugins/leadin/build/elementor.css b/wp/wp-content/plugins/leadin/build/elementor.css deleted file mode 100644 index aaf2028e..00000000 --- a/wp/wp-content/plugins/leadin/build/elementor.css +++ /dev/null @@ -1,72 +0,0 @@ -/*!***************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpinner.tsx ***! - \***************************************************************************************************************************************************************************/ -.sxa9zrc{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#00a4bd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;margin:'2px';} -.s14430wa{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;} -.ct87ghk{fill:none;stroke:var(--ct87ghk-0);stroke-width:5;stroke-linecap:round;-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;} -.avili0h{fill:none;stroke:var(--avili0h-0);stroke-width:5;stroke-linecap:round;-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-animation:dashAnimation-avili0h 2s ease-in-out infinite,spinAnimation-avili0h 2s linear infinite;animation:dashAnimation-avili0h 2s ease-in-out infinite,spinAnimation-avili0h 2s linear infinite;}@-webkit-keyframes dashAnimation-avili0h{0%{stroke-dasharray:1,150;stroke-dashoffset:0;}50%{stroke-dasharray:90,150;stroke-dashoffset:-50;}100%{stroke-dasharray:90,150;stroke-dashoffset:-140;}}@keyframes dashAnimation-avili0h{0%{stroke-dasharray:1,150;stroke-dashoffset:0;}50%{stroke-dasharray:90,150;stroke-dashoffset:-50;}100%{stroke-dasharray:90,150;stroke-dashoffset:-140;}}@-webkit-keyframes spinAnimation-avili0h{{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes spinAnimation-avili0h{{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlTcGlubmVyLnRzeCJdLCJuYW1lcyI6WyIuc3hhOXpyYyIsIi5zMTQ0MzB3YSIsIi5jdDg3Z2hrIiwiLmF2aWxpMGgiXSwibWFwcGluZ3MiOiJBQUdxQkE7QUFVQUM7QUFPTkM7QUFPUUMiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvc2hhcmVkL1VJQ29tcG9uZW50cy9VSVNwaW5uZXIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BsaW5hcmlhL3JlYWN0JztcbmltcG9ydCB7IENBTFlQU09fTUVESVVNLCBDQUxZUFNPIH0gZnJvbSAnLi9jb2xvcnMnO1xuY29uc3QgU3Bpbm5lck91dGVyID0gc3R5bGVkLmRpdiBgXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGNvbG9yOiAjMDBhNGJkO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luOiAnMnB4JztcbmA7XG5jb25zdCBTcGlubmVySW5uZXIgPSBzdHlsZWQuZGl2IGBcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG5gO1xuY29uc3QgQ2lyY2xlID0gc3R5bGVkLmNpcmNsZSBgXG4gIGZpbGw6IG5vbmU7XG4gIHN0cm9rZTogJHtwcm9wcyA9PiBwcm9wcy5jb2xvcn07XG4gIHN0cm9rZS13aWR0aDogNTtcbiAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG5gO1xuY29uc3QgQW5pbWF0ZWRDaXJjbGUgPSBzdHlsZWQuY2lyY2xlIGBcbiAgZmlsbDogbm9uZTtcbiAgc3Ryb2tlOiAke3Byb3BzID0+IHByb3BzLmNvbG9yfTtcbiAgc3Ryb2tlLXdpZHRoOiA1O1xuICBzdHJva2UtbGluZWNhcDogcm91bmQ7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjtcbiAgYW5pbWF0aW9uOiBkYXNoQW5pbWF0aW9uIDJzIGVhc2UtaW4tb3V0IGluZmluaXRlLFxuICAgIHNwaW5BbmltYXRpb24gMnMgbGluZWFyIGluZmluaXRlO1xuXG4gIEBrZXlmcmFtZXMgZGFzaEFuaW1hdGlvbiB7XG4gICAgMCUge1xuICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSwgMTUwO1xuICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IDA7XG4gICAgfVxuXG4gICAgNTAlIHtcbiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDkwLCAxNTA7XG4gICAgICBzdHJva2UtZGFzaG9mZnNldDogLTUwO1xuICAgIH1cblxuICAgIDEwMCUge1xuICAgICAgc3Ryb2tlLWRhc2hhcnJheTogOTAsIDE1MDtcbiAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAtMTQwO1xuICAgIH1cbiAgfVxuXG4gIEBrZXlmcmFtZXMgc3BpbkFuaW1hdGlvbiB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgfVxuYDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFVJU3Bpbm5lcih7IHNpemUgPSAyMCB9KSB7XG4gICAgcmV0dXJuIChfanN4KFNwaW5uZXJPdXRlciwgeyBjaGlsZHJlbjogX2pzeChTcGlubmVySW5uZXIsIHsgY2hpbGRyZW46IF9qc3hzKFwic3ZnXCIsIHsgaGVpZ2h0OiBzaXplLCB3aWR0aDogc2l6ZSwgdmlld0JveDogXCIwIDAgNTAgNTBcIiwgY2hpbGRyZW46IFtfanN4KENpcmNsZSwgeyBjb2xvcjogQ0FMWVBTT19NRURJVU0sIGN4OiBcIjI1XCIsIGN5OiBcIjI1XCIsIHI6IFwiMjIuNVwiIH0pLCBfanN4KEFuaW1hdGVkQ2lyY2xlLCB7IGNvbG9yOiBDQUxZUFNPLCBjeDogXCIyNVwiLCBjeTogXCIyNVwiLCByOiBcIjIyLjVcIiB9KV0gfSkgfSkgfSkpO1xufVxuIl19*/ -/*!*************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIButton.ts ***! - \*************************************************************************************************************************************************************************/ -.ug152ch{background-color:var(--ug152ch-0);border:3px solid var(--ug152ch-0);color:#ffffff;border-radius:3px;font-size:14px;line-height:14px;padding:12px 24px;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-weight:500;white-space:nowrap;} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlCdXR0b24udHMiXSwibmFtZXMiOlsiLnVnMTUyY2giXSwibWFwcGluZ3MiOiJBQUVlQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvVUlDb21wb25lbnRzL1VJQnV0dG9uLnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuaW1wb3J0IHsgSEVGRkFMVU1QLCBMT1JBWCwgT0xBRiB9IGZyb20gJy4vY29sb3JzJztcbmV4cG9ydCBkZWZhdWx0IHN0eWxlZC5idXR0b24gYFxuICBiYWNrZ3JvdW5kLWNvbG9yOiR7cHJvcHMgPT4gKHByb3BzLnVzZSA9PT0gJ3RlcnRpYXJ5JyA/IEhFRkZBTFVNUCA6IExPUkFYKX07XG4gIGJvcmRlcjogM3B4IHNvbGlkICR7cHJvcHMgPT4gKHByb3BzLnVzZSA9PT0gJ3RlcnRpYXJ5JyA/IEhFRkZBTFVNUCA6IExPUkFYKX07XG4gIGNvbG9yOiAke09MQUZ9XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTRweDtcbiAgcGFkZGluZzogMTJweCAyNHB4O1xuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbmA7XG4iXX0=*/ -/*!****************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIContainer.ts ***! - \****************************************************************************************************************************************************************************/ -.ua13n1c{text-align:var(--ua13n1c-0);} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlDb250YWluZXIudHMiXSwibmFtZXMiOlsiLnVhMTNuMWMiXSwibWFwcGluZ3MiOiJBQUNlQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvVUlDb21wb25lbnRzL1VJQ29udGFpbmVyLnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgc3R5bGVkLmRpdiBgXG4gIHRleHQtYWxpZ246ICR7cHJvcHMgPT4gKHByb3BzLnRleHRBbGlnbiA/IHByb3BzLnRleHRBbGlnbiA6ICdpbmhlcml0Jyl9O1xuYDtcbiJdfQ==*/ -/*!*************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/HubspotWrapper.ts ***! - \*************************************************************************************************************************************************************************/ -.h1q5v5ee{background-image:var(--h1q5v5ee-0);background-color:#f5f8fa;background-repeat:no-repeat;background-position:center 25px;background-size:120px;color:#33475b;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-size:14px;padding:var(--h1q5v5ee-1);}.h1q5v5ee p{font-size:inherit !important;line-height:24px;margin:4px 0;} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9Db21tb24vSHVic3BvdFdyYXBwZXIudHMiXSwibmFtZXMiOlsiLmgxcTV2NWVlIl0sIm1hcHBpbmdzIjoiQUFDZUEiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvc2hhcmVkL0NvbW1vbi9IdWJzcG90V3JhcHBlci50cyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BsaW5hcmlhL3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IHN0eWxlZC5kaXYgYFxuICBiYWNrZ3JvdW5kLWltYWdlOiAke3Byb3BzID0+IGB1cmwoJHtwcm9wcy5wbHVnaW5QYXRofS9wdWJsaWMvYXNzZXRzL2ltYWdlcy9odWJzcG90LnN2ZylgfTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjhmYTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIDI1cHg7XG4gIGJhY2tncm91bmQtc2l6ZTogMTIwcHg7XG4gIGNvbG9yOiAjMzM0NzViO1xuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxNHB4O1xuXG4gIHBhZGRpbmc6ICR7KHByb3BzKSA9PiBwcm9wcy5wYWRkaW5nIHx8ICc5MHB4IDIwJSAyNXB4J307XG5cbiAgcCB7XG4gICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgbGluZS1oZWlnaHQ6IDI0cHg7XG4gICAgbWFyZ2luOiA0cHggMDtcbiAgfVxuYDtcbiJdfQ==*/ -/*!*************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpacer.ts ***! - \*************************************************************************************************************************************************************************/ -.u3qxofx{height:30px;} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlTcGFjZXIudHMiXSwibmFtZXMiOlsiLnUzcXhvZngiXSwibWFwcGluZ3MiOiJBQUNlQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvVUlDb21wb25lbnRzL1VJU3BhY2VyLnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgc3R5bGVkLmRpdiBgXG4gIGhlaWdodDogMzBweDtcbmA7XG4iXX0=*/ -/*!**************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIOverlay.ts ***! - \**************************************************************************************************************************************************************************/ -.u1q7a48k{position:relative;}.u1q7a48k:after{content:'';position:absolute;top:0;bottom:0;right:0;left:0;} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlPdmVybGF5LnRzIl0sIm5hbWVzIjpbIi51MXE3YTQ4ayJdLCJtYXBwaW5ncyI6IkFBQ2VBIiwiZmlsZSI6Ii91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlPdmVybGF5LnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgc3R5bGVkLmRpdiBgXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAmOmFmdGVyIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcbiAgICBsZWZ0OiAwO1xuICB9XG5gO1xuIl19*/ -/*!***********************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/AsyncSelect.tsx ***! - \***********************************************************************************************************************************************************************/ -.c1wxx7eu{color:#33475b;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-size:14px;position:relative;} -.c1rgwbep{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:hsl(0,0%,100%);border-color:hsl(0,0%,80%);border-radius:4px;border-style:solid;border-width:var(--c1rgwbep-0);cursor:default;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:38px;outline:0 !important;position:relative;-webkit-transition:all 100ms;transition:all 100ms;box-sizing:border-box;box-shadow:var(--c1rgwbep-1);}.c1rgwbep:hover{border-color:hsl(0,0%,70%);} -.v1mdmbaj{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:2px 8px;position:relative;overflow:hidden;box-sizing:border-box;} -.p1gwkvxy{color:hsl(0,0%,50%);margin-left:2px;margin-right:2px;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);box-sizing:border-box;font-size:16px;} -.s1bwlafs{color:hsl(0,0%,20%);margin-left:2px;margin-right:2px;max-width:calc(100% - 8px);overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);box-sizing:border-box;} -.i196z9y5{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;box-sizing:border-box;} -.d1dfo5ow{border-top:8px solid #00a4bd;border-left:6px solid transparent;border-right:6px solid transparent;width:0px;height:0px;margin:10px;} -.if3lze{margin:2px;padding-bottom:2px;padding-top:2px;visibility:visible;color:hsl(0,0%,20%);box-sizing:border-box;} -.i9kxf50{box-sizing:content-box;background:rgba(0,0,0,0) none repeat scroll 0px center;border:0px none;font-size:inherit;opacity:1;outline:currentcolor none 0px;padding:0px;color:inherit;font-family:inherit;} -.igjr3uc{position:absolute;opacity:0;font-size:inherit;} -.mhb9if7{position:absolute;top:100%;background-color:#fff;border-radius:4px;margin-bottom:8px;margin-top:8px;z-index:9999;box-shadow:0 0 0 1px hsla(0,0%,0%,0.1),0 4px 11px hsla(0,0%,0%,0.1);width:100%;} -.mxaof7s{max-height:300px;overflow-y:auto;padding-bottom:4px;padding-top:4px;position:relative;} -.mw50s5v{padding-bottom:8px;padding-top:8px;} -.m11rzvjw{color:#999;cursor:default;font-size:75%;font-weight:500;margin-bottom:0.25em;text-transform:uppercase;padding-left:12px;padding-left:12px;} -.m1jcdsjv{display:block;background-color:var(--m1jcdsjv-0);color:var(--m1jcdsjv-1);cursor:default;font-size:inherit;width:100%;padding:8px 12px;}.m1jcdsjv:hover{background-color:var(--m1jcdsjv-2);} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9Db21tb24vQXN5bmNTZWxlY3QudHN4Il0sIm5hbWVzIjpbIi5jMXd4eDdldSIsIi5jMXJnd2JlcCIsIi52MW1kbWJhaiIsIi5wMWd3a3Z4eSIsIi5zMWJ3bGFmcyIsIi5pMTk2ejl5NSIsIi5kMWRmbzVvdyIsIi5pZjNsemUiLCIuaTlreGY1MCIsIi5pZ2pyM3VjIiwiLm1oYjlpZjciLCIubXhhb2Y3cyIsIi5tdzUwczV2IiwiLm0xMXJ6dmp3IiwiLm0xamNkc2p2Il0sIm1hcHBpbmdzIjoiQUFNa0JBO0FBTU9DO0FBcUJGQztBQVVIQztBQVVBQztBQWFPQztBQU9EQztBQVFIQztBQVFUQztBQVdNQztBQUtFQztBQVdMQztBQU9DQztBQUlNQztBQVVQQyIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvQ29tbW9uL0FzeW5jU2VsZWN0LnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbGluYXJpYS9yZWFjdCc7XG5pbXBvcnQgeyBDQUxZUFNPLCBDQUxZUFNPX0xJR0hULCBDQUxZUFNPX01FRElVTSwgT0JTSURJQU4sIH0gZnJvbSAnLi4vVUlDb21wb25lbnRzL2NvbG9ycyc7XG5pbXBvcnQgVUlTcGlubmVyIGZyb20gJy4uL1VJQ29tcG9uZW50cy9VSVNwaW5uZXInO1xuaW1wb3J0IExvYWRTdGF0ZSBmcm9tICcuLi9lbnVtcy9sb2FkU3RhdGUnO1xuY29uc3QgQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGNvbG9yOiAke09CU0lESUFOfTtcbiAgZm9udC1mYW1pbHk6ICdMZXhlbmQgRGVjYScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuYDtcbmNvbnN0IENvbnRyb2xDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDAsIDAlLCAxMDAlKTtcbiAgYm9yZGVyLWNvbG9yOiBoc2woMCwgMCUsIDgwJSk7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLXdpZHRoOiAke3Byb3BzID0+IChwcm9wcy5mb2N1c2VkID8gJzAnIDogJzFweCcpfTtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgbWluLWhlaWdodDogMzhweDtcbiAgb3V0bGluZTogMCAhaW1wb3J0YW50O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRyYW5zaXRpb246IGFsbCAxMDBtcztcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy5mb2N1c2VkID8gYDAgMCAwIDJweCAke0NBTFlQU09fTUVESVVNfWAgOiAnbm9uZSd9O1xuICAmOmhvdmVyIHtcbiAgICBib3JkZXItY29sb3I6IGhzbCgwLCAwJSwgNzAlKTtcbiAgfVxuYDtcbmNvbnN0IFZhbHVlQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXg6IDE7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgcGFkZGluZzogMnB4IDhweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuYDtcbmNvbnN0IFBsYWNlaG9sZGVyID0gc3R5bGVkLmRpdiBgXG4gIGNvbG9yOiBoc2woMCwgMCUsIDUwJSk7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG4gIG1hcmdpbi1yaWdodDogMnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGZvbnQtc2l6ZTogMTZweDtcbmA7XG5jb25zdCBTaW5nbGVWYWx1ZSA9IHN0eWxlZC5kaXYgYFxuICBjb2xvcjogaHNsKDAsIDAlLCAyMCUpO1xuICBtYXJnaW4tbGVmdDogMnB4O1xuICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA4cHgpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuYDtcbmNvbnN0IEluZGljYXRvckNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXNocmluazogMDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbmA7XG5jb25zdCBEcm9wZG93bkluZGljYXRvciA9IHN0eWxlZC5kaXYgYFxuICBib3JkZXItdG9wOiA4cHggc29saWQgJHtDQUxZUFNPfTtcbiAgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJpZ2h0OiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIHdpZHRoOiAwcHg7XG4gIGhlaWdodDogMHB4O1xuICBtYXJnaW46IDEwcHg7XG5gO1xuY29uc3QgSW5wdXRDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgbWFyZ2luOiAycHg7XG4gIHBhZGRpbmctYm90dG9tOiAycHg7XG4gIHBhZGRpbmctdG9wOiAycHg7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIGNvbG9yOiBoc2woMCwgMCUsIDIwJSk7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5gO1xuY29uc3QgSW5wdXQgPSBzdHlsZWQuaW5wdXQgYFxuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwKSBub25lIHJlcGVhdCBzY3JvbGwgMHB4IGNlbnRlcjtcbiAgYm9yZGVyOiAwcHggbm9uZTtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICBvcGFjaXR5OiAxO1xuICBvdXRsaW5lOiBjdXJyZW50Y29sb3Igbm9uZSAwcHg7XG4gIHBhZGRpbmc6IDBweDtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuYDtcbmNvbnN0IElucHV0U2hhZG93ID0gc3R5bGVkLmRpdiBgXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgb3BhY2l0eTogMDtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuYDtcbmNvbnN0IE1lbnVDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBtYXJnaW4tdG9wOiA4cHg7XG4gIHotaW5kZXg6IDk5OTk7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDFweCBoc2xhKDAsIDAlLCAwJSwgMC4xKSwgMCA0cHggMTFweCBoc2xhKDAsIDAlLCAwJSwgMC4xKTtcbiAgd2lkdGg6IDEwMCU7XG5gO1xuY29uc3QgTWVudUxpc3QgPSBzdHlsZWQuZGl2IGBcbiAgbWF4LWhlaWdodDogMzAwcHg7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIHBhZGRpbmctYm90dG9tOiA0cHg7XG4gIHBhZGRpbmctdG9wOiA0cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XG5jb25zdCBNZW51R3JvdXAgPSBzdHlsZWQuZGl2IGBcbiAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgcGFkZGluZy10b3A6IDhweDtcbmA7XG5jb25zdCBNZW51R3JvdXBIZWFkZXIgPSBzdHlsZWQuZGl2IGBcbiAgY29sb3I6ICM5OTk7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgZm9udC1zaXplOiA3NSU7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIG1hcmdpbi1ib3R0b206IDAuMjVlbTtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgcGFkZGluZy1sZWZ0OiAxMnB4O1xuICBwYWRkaW5nLWxlZnQ6IDEycHg7XG5gO1xuY29uc3QgTWVudUl0ZW0gPSBzdHlsZWQuZGl2IGBcbiAgZGlzcGxheTogYmxvY2s7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMuc2VsZWN0ZWQgPyBDQUxZUFNPX01FRElVTSA6ICd0cmFuc3BhcmVudCd9O1xuICBjb2xvcjogJHtwcm9wcyA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnI2ZmZicgOiAnaW5oZXJpdCcpfTtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiA4cHggMTJweDtcbiAgJjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy5zZWxlY3RlZCA/IENBTFlQU09fTUVESVVNIDogQ0FMWVBTT19MSUdIVH07XG4gIH1cbmA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBc3luY1NlbGVjdCh7IHBsYWNlaG9sZGVyLCB2YWx1ZSwgbG9hZE9wdGlvbnMsIG9uQ2hhbmdlLCBkZWZhdWx0T3B0aW9ucywgfSkge1xuICAgIGNvbnN0IGlucHV0RWwgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgaW5wdXRTaGFkb3dFbCA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBbaXNGb2N1c2VkLCBzZXRGb2N1c10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW2xvYWRTdGF0ZSwgc2V0TG9hZFN0YXRlXSA9IHVzZVN0YXRlKExvYWRTdGF0ZS5Ob3RMb2FkZWQpO1xuICAgIGNvbnN0IFtsb2NhbFZhbHVlLCBzZXRMb2NhbFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZShkZWZhdWx0T3B0aW9ucyk7XG4gICAgY29uc3QgaW5wdXRTaXplID0gYCR7aW5wdXRTaGFkb3dFbC5jdXJyZW50ID8gaW5wdXRTaGFkb3dFbC5jdXJyZW50LmNsaWVudFdpZHRoICsgMTAgOiAyfXB4YDtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAobG9hZE9wdGlvbnMgJiYgbG9hZFN0YXRlID09PSBMb2FkU3RhdGUuTm90TG9hZGVkKSB7XG4gICAgICAgICAgICBsb2FkT3B0aW9ucygnJywgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldE9wdGlvbnMocmVzdWx0KTtcbiAgICAgICAgICAgICAgICBzZXRMb2FkU3RhdGUoTG9hZFN0YXRlLklkbGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCBbbG9hZE9wdGlvbnMsIGxvYWRTdGF0ZV0pO1xuICAgIGNvbnN0IHJlbmRlckl0ZW1zID0gKGl0ZW1zID0gW10sIHBhcmVudEtleSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ub3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoX2pzeHMoTWVudUdyb3VwLCB7IGNoaWxkcmVuOiBbX2pzeChNZW51R3JvdXBIZWFkZXIsIHsgaWQ6IGAke2luZGV4fS1oZWFkaW5nYCwgY2hpbGRyZW46IGl0ZW0ubGFiZWwgfSksIF9qc3goXCJkaXZcIiwgeyBjaGlsZHJlbjogcmVuZGVySXRlbXMoaXRlbS5vcHRpb25zLCBpbmRleCkgfSldIH0sIGBhc3luYy1zZWxlY3QtaXRlbS0ke2luZGV4fWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGBhc3luYy1zZWxlY3QtaXRlbS0ke3BhcmVudEtleSAhPT0gdW5kZWZpbmVkID8gYCR7cGFyZW50S2V5fS0ke2luZGV4fWAgOiBpbmRleH1gO1xuICAgICAgICAgICAgICAgIHJldHVybiAoX2pzeChNZW51SXRlbSwgeyBpZDoga2V5LCBzZWxlY3RlZDogdmFsdWUgJiYgaXRlbS52YWx1ZSA9PT0gdmFsdWUudmFsdWUsIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9jdXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9LCBjaGlsZHJlbjogaXRlbS5sYWJlbCB9LCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gKF9qc3hzKENvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKENvbnRyb2xDb250YWluZXIsIHsgaWQ6IFwibGVhZGluLWFzeW5jLXNlbGVjdG9yXCIsIGZvY3VzZWQ6IGlzRm9jdXNlZCwgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRFbC5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbC5jdXJyZW50LmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvY3VzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldExvY2FsVmFsdWUoJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RWwuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RWwuY3VycmVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9jdXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBjaGlsZHJlbjogW19qc3hzKFZhbHVlQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbbG9jYWxWYWx1ZSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCF2YWx1ZSA/IChfanN4KFBsYWNlaG9sZGVyLCB7IGNoaWxkcmVuOiBwbGFjZWhvbGRlciB9KSkgOiAoX2pzeChTaW5nbGVWYWx1ZSwgeyBjaGlsZHJlbjogdmFsdWUubGFiZWwgfSkpKSwgX2pzeHMoSW5wdXRDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KElucHV0LCB7IHJlZjogaW5wdXRFbCwgb25Gb2N1czogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb2N1cyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkNoYW5nZTogZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldExvY2FsVmFsdWUoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRMb2FkU3RhdGUoTG9hZFN0YXRlLkxvYWRpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkT3B0aW9ucyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE9wdGlvbnMoZS50YXJnZXQudmFsdWUsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRPcHRpb25zKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TG9hZFN0YXRlKExvYWRTdGF0ZS5JZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHZhbHVlOiBsb2NhbFZhbHVlLCB3aWR0aDogaW5wdXRTaXplLCBpZDogXCJhc3ljbi1zZWxlY3QtaW5wdXRcIiB9KSwgX2pzeChJbnB1dFNoYWRvdywgeyByZWY6IGlucHV0U2hhZG93RWwsIGNoaWxkcmVuOiBsb2NhbFZhbHVlIH0pXSB9KV0gfSksIF9qc3hzKEluZGljYXRvckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW2xvYWRTdGF0ZSA9PT0gTG9hZFN0YXRlLkxvYWRpbmcgJiYgX2pzeChVSVNwaW5uZXIsIHt9KSwgX2pzeChEcm9wZG93bkluZGljYXRvciwge30pXSB9KV0gfSksIGlzRm9jdXNlZCAmJiAoX2pzeChNZW51Q29udGFpbmVyLCB7IGNoaWxkcmVuOiBfanN4KE1lbnVMaXN0LCB7IGNoaWxkcmVuOiByZW5kZXJJdGVtcyhvcHRpb25zKSB9KSB9KSldIH0pKTtcbn1cbiJdfQ==*/ -/*!******************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/elementor/Common/ElementorButton.tsx ***! - \******************************************************************************************************************************************************************************/ -.czoccom{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:8px;} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL2VsZW1lbnRvci9Db21tb24vRWxlbWVudG9yQnV0dG9uLnRzeCJdLCJuYW1lcyI6WyIuY3pvY2NvbSJdLCJtYXBwaW5ncyI6IkFBRWtCQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9lbGVtZW50b3IvQ29tbW9uL0VsZW1lbnRvckJ1dHRvbi50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuY29uc3QgQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBwYWRkaW5nLWJvdHRvbTogOHB4O1xuYDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEVsZW1lbnRvckJ1dHRvbih7IGNoaWxkcmVuLCAuLi5wYXJhbXMgfSkge1xuICAgIHJldHVybiAoX2pzeChDb250YWluZXIsIHsgY2xhc3NOYW1lOiBcImVsZW1lbnRvci1idXR0b24td3JhcHBlclwiLCBjaGlsZHJlbjogX2pzeChcImJ1dHRvblwiLCB7IGNsYXNzTmFtZTogXCJlbGVtZW50b3ItYnV0dG9uIGVsZW1lbnRvci1idXR0b24tZGVmYXVsdFwiLCB0eXBlOiBcImJ1dHRvblwiLCAuLi5wYXJhbXMsIGNoaWxkcmVuOiBjaGlsZHJlbiB9KSB9KSk7XG59XG4iXX0=*/ -/*!*********************************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx ***! - \*********************************************************************************************************************************************************************************************/ -.c1p032ba{padding-bottom:8px;} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL2VsZW1lbnRvci9NZWV0aW5nV2lkZ2V0L0VsZW1lbnRvck1lZXRpbmdXYXJuaW5nLnRzeCJdLCJuYW1lcyI6WyIuYzFwMDMyYmEiXSwibWFwcGluZ3MiOiJBQU9rQkEiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvZWxlbWVudG9yL01lZXRpbmdXaWRnZXQvRWxlbWVudG9yTWVldGluZ1dhcm5pbmcudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IEZyYWdtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ1VSUkVOVF9VU0VSX0NBTEVOREFSX01JU1NJTkcgfSBmcm9tICcuLi8uLi9zaGFyZWQvTWVldGluZy9jb25zdGFudHMnO1xuaW1wb3J0IEVsZW1lbnRvckJ1dHRvbiBmcm9tICcuLi9Db21tb24vRWxlbWVudG9yQnV0dG9uJztcbmltcG9ydCBFbGVtZW50b3JCYW5uZXIgZnJvbSAnLi4vQ29tbW9uL0VsZW1lbnRvckJhbm5lcic7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbGluYXJpYS9yZWFjdCc7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ0B3b3JkcHJlc3MvaTE4bic7XG5jb25zdCBDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgcGFkZGluZy1ib3R0b206IDhweDtcbmA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNZWV0aW5nV2FybmluZyh7IG9uQ29ubmVjdENhbGVuZGFyLCBzdGF0dXMsIH0pIHtcbiAgICBjb25zdCBpc01lZXRpbmdPd25lciA9IHN0YXR1cyA9PT0gQ1VSUkVOVF9VU0VSX0NBTEVOREFSX01JU1NJTkc7XG4gICAgY29uc3QgdGl0bGVUZXh0ID0gaXNNZWV0aW5nT3duZXJcbiAgICAgICAgPyBfXygnWW91ciBjYWxlbmRhciBpcyBub3QgY29ubmVjdGVkJywgJ2xlYWRpbicpXG4gICAgICAgIDogX18oJ0NhbGVuZGFyIGlzIG5vdCBjb25uZWN0ZWQnLCAnbGVhZGluJyk7XG4gICAgY29uc3QgdGl0bGVNZXNzYWdlID0gaXNNZWV0aW5nT3duZXJcbiAgICAgICAgPyBfXygnUGxlYXNlIGNvbm5lY3QgeW91ciBjYWxlbmRhciB0byBhY3RpdmF0ZSB5b3VyIHNjaGVkdWxpbmcgcGFnZXMnLCAnbGVhZGluJylcbiAgICAgICAgOiBfXygnTWFrZSBzdXJlIHRoYXQgZXZlcnlib2R5IGluIHRoaXMgbWVldGluZyBoYXMgY29ubmVjdGVkIHRoZWlyIGNhbGVuZGFyIGZyb20gdGhlIE1lZXRpbmdzIHBhZ2UgaW4gSHViU3BvdCcsICdsZWFkaW4nKTtcbiAgICByZXR1cm4gKF9qc3hzKEZyYWdtZW50LCB7IGNoaWxkcmVuOiBbX2pzeChDb250YWluZXIsIHsgY2hpbGRyZW46IF9qc3hzKEVsZW1lbnRvckJhbm5lciwgeyB0eXBlOiBcIndhcm5pbmdcIiwgY2hpbGRyZW46IFtfanN4KFwiYlwiLCB7IGNoaWxkcmVuOiB0aXRsZVRleHQgfSksIF9qc3goXCJiclwiLCB7fSksIHRpdGxlTWVzc2FnZV0gfSkgfSksIGlzTWVldGluZ093bmVyICYmIChfanN4KEVsZW1lbnRvckJ1dHRvbiwgeyBpZDogXCJtZWV0aW5ncy1jb25uZWN0LWNhbGVuZGFyXCIsIG9uQ2xpY2s6IG9uQ29ubmVjdENhbGVuZGFyLCBjaGlsZHJlbjogX18oJ0Nvbm5lY3QgY2FsZW5kYXInLCAnbGVhZGluJykgfSkpXSB9KSk7XG59XG4iXX0=*/ -/*!*************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIAlert.tsx ***! - \*************************************************************************************************************************************************************************/ -.a1h8m4fo{background-color:#fef8f0;border-color:#fae0b5;color:#33475b;font-size:14px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-style:solid;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-width:1px;min-height:60px;padding:8px 20px;position:relative;text-align:left;} -.tyndzxk{font-family:'Lexend Deca';font-style:normal;font-weight:700;font-size:16px;line-height:19px;color:#33475b;margin:0;padding:0;} -.m1m9sbk4{font-family:'Lexend Deca';font-style:normal;font-weight:400;font-size:14px;margin:0;padding:0;} -.mg5o421{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlBbGVydC50c3giXSwibmFtZXMiOlsiLmExaDhtNGZvIiwiLnR5bmR6eGsiLCIubTFtOXNiazQiLCIubWc1bzQyMSJdLCJtYXBwaW5ncyI6IkFBR3VCQTtBQW1CVEM7QUFVRUM7QUFRU0MiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvc2hhcmVkL1VJQ29tcG9uZW50cy9VSUFsZXJ0LnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbGluYXJpYS9yZWFjdCc7XG5pbXBvcnQgeyBNQVJJR09MRF9MSUdIVCwgTUFSSUdPTERfTUVESVVNLCBPQlNJRElBTiB9IGZyb20gJy4vY29sb3JzJztcbmNvbnN0IEFsZXJ0Q29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGJhY2tncm91bmQtY29sb3I6ICR7TUFSSUdPTERfTElHSFR9O1xuICBib3JkZXItY29sb3I6ICR7TUFSSUdPTERfTUVESVVNfTtcbiAgY29sb3I6ICR7T0JTSURJQU59O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgZGlzcGxheTogZmxleDtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1yaWdodC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkO1xuICBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBtaW4taGVpZ2h0OiA2MHB4O1xuICBwYWRkaW5nOiA4cHggMjBweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuYDtcbmNvbnN0IFRpdGxlID0gc3R5bGVkLnAgYFxuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJztcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogNzAwO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxOXB4O1xuICBjb2xvcjogJHtPQlNJRElBTn07XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbmA7XG5jb25zdCBNZXNzYWdlID0gc3R5bGVkLnAgYFxuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJztcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogNDAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbmA7XG5jb25zdCBNZXNzYWdlQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5gO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVUlBbGVydCh7IHRpdGxlVGV4dCwgdGl0bGVNZXNzYWdlLCBjaGlsZHJlbiwgfSkge1xuICAgIHJldHVybiAoX2pzeHMoQWxlcnRDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhNZXNzYWdlQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeChUaXRsZSwgeyBjaGlsZHJlbjogdGl0bGVUZXh0IH0pLCBfanN4KE1lc3NhZ2UsIHsgY2hpbGRyZW46IHRpdGxlTWVzc2FnZSB9KV0gfSksIGNoaWxkcmVuXSB9KSk7XG59XG4iXX0=*/ - -/*# sourceMappingURL=elementor.css.map*/ \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/elementor.css.map b/wp/wp-content/plugins/leadin/build/elementor.css.map deleted file mode 100644 index 43be833e..00000000 --- a/wp/wp-content/plugins/leadin/build/elementor.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"elementor.css","mappings":";;;AAGqBA,SAAAA,0BAAAA,CAAAA,wBAAAA,CAAAA,qBAAAA,CAAAA,kBAAAA,CAAAA,aAAAA,CAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,6BAAAA,CAAAA,yBAAAA,CAAAA,qBAAAA,CAAAA,uBAAAA,CAAAA,8BAAAA,CAAAA,oBAAAA,CAAAA,sBAAAA,CAAAA,UAAAA,CAAAA,WAAAA,CAAAA,YAAAA,CAAAA;AAUAC,UAAAA,0BAAAA,CAAAA,wBAAAA,CAAAA,qBAAAA,CAAAA,kBAAAA,CAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,uBAAAA,CAAAA,8BAAAA,CAAAA,oBAAAA,CAAAA,sBAAAA,CAAAA,UAAAA,CAAAA,WAAAA,CAAAA;AAONC,SAAAA,SAAAA,CAAAA,uBAAAA,CAAAA,cAAAA,CAAAA,oBAAAA,CAAAA,+BAAAA,CAAAA,2BAAAA,CAAAA,uBAAAA,CAAAA;AAOQC,SAAAA,SAAAA,CAAAA,uBAAAA,CAAAA,cAAAA,CAAAA,oBAAAA,CAAAA,+BAAAA,CAAAA,2BAAAA,CAAAA,uBAAAA,CAAAA,wGAAAA,CAAAA,gGAAAA,CAAAA,CAAAA,yCAAAA,GAAAA,sBAAAA,CAAAA,mBAAAA,CAAAA,CAAAA,IAAAA,uBAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,KAAAA,uBAAAA,CAAAA,sBAAAA,CAAAA,CAAAA,CAAAA,iCAAAA,GAAAA,sBAAAA,CAAAA,mBAAAA,CAAAA,CAAAA,IAAAA,uBAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,KAAAA,uBAAAA,CAAAA,sBAAAA,CAAAA,CAAAA,CAAAA,yCAAAA,CAAAA,gCAAAA,CAAAA,4BAAAA,CAAAA,wBAAAA,CAAAA,CAAAA,CAAAA,iCAAAA,CAAAA,gCAAAA,CAAAA,4BAAAA,CAAAA,wBAAAA,CAAAA,CAAAA;ACvBvB,usFAAusF,C;;;;ACFxrFC,SAAAA,iCAAAA,CAAAA,iCAAAA,CAAAA,aAAAA,CAAAA,iBAAAA,CAAAA,cAAAA,CAAAA,gBAAAA,CAAAA,iBAAAA,CAAAA,oDAAAA,CAAAA,eAAAA,CAAAA,kBAAAA,CAAAA;ACDf,2mCAA2mC,C;;;;ACA5lCC,SAAAA,2BAAAA,CAAAA;ACAf,+pBAA+pB,C;;;;ACAhpBC,UAAAA,kCAAAA,CAAAA,wBAAAA,CAAAA,2BAAAA,CAAAA,+BAAAA,CAAAA,qBAAAA,CAAAA,aAAAA,CAAAA,oDAAAA,CAAAA,cAAAA,CAAAA,yBAAAA,CAAAA,CAAAA,YAAAA,4BAAAA,CAAAA,gBAAAA,CAAAA,YAAAA,CAAAA;ACAf,+qCAA+qC,C;;;;ACAhqCC,SAAAA,WAAAA,CAAAA;ACAf,ukBAAukB,C;;;;ACAxjBC,UAAAA,iBAAAA,CAAAA,CAAAA,gBAAAA,UAAAA,CAAAA,iBAAAA,CAAAA,KAAAA,CAAAA,QAAAA,CAAAA,OAAAA,CAAAA,MAAAA,CAAAA;ACAf,mvBAAmvB,C;;;;ACKjuBC,UAAAA,aAAAA,CAAAA,oDAAAA,CAAAA,cAAAA,CAAAA,iBAAAA,CAAAA;AAMOC,UAAAA,0BAAAA,CAAAA,wBAAAA,CAAAA,qBAAAA,CAAAA,kBAAAA,CAAAA,+BAAAA,CAAAA,0BAAAA,CAAAA,iBAAAA,CAAAA,kBAAAA,CAAAA,8BAAAA,CAAAA,cAAAA,CAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,sBAAAA,CAAAA,kBAAAA,CAAAA,cAAAA,CAAAA,wBAAAA,CAAAA,qCAAAA,CAAAA,qBAAAA,CAAAA,6BAAAA,CAAAA,eAAAA,CAAAA,oBAAAA,CAAAA,iBAAAA,CAAAA,4BAAAA,CAAAA,oBAAAA,CAAAA,qBAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,gBAAAA,0BAAAA,CAAAA;AAqBFC,UAAAA,0BAAAA,CAAAA,wBAAAA,CAAAA,qBAAAA,CAAAA,kBAAAA,CAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,cAAAA,CAAAA,UAAAA,CAAAA,MAAAA,CAAAA,sBAAAA,CAAAA,kBAAAA,CAAAA,cAAAA,CAAAA,eAAAA,CAAAA,iBAAAA,CAAAA,eAAAA,CAAAA,qBAAAA,CAAAA;AAUHC,UAAAA,mBAAAA,CAAAA,eAAAA,CAAAA,gBAAAA,CAAAA,iBAAAA,CAAAA,OAAAA,CAAAA,kCAAAA,CAAAA,8BAAAA,CAAAA,0BAAAA,CAAAA,qBAAAA,CAAAA,cAAAA,CAAAA;AAUAC,UAAAA,mBAAAA,CAAAA,eAAAA,CAAAA,gBAAAA,CAAAA,0BAAAA,CAAAA,eAAAA,CAAAA,iBAAAA,CAAAA,sBAAAA,CAAAA,kBAAAA,CAAAA,OAAAA,CAAAA,kCAAAA,CAAAA,8BAAAA,CAAAA,0BAAAA,CAAAA,qBAAAA,CAAAA;AAaOC,UAAAA,0BAAAA,CAAAA,wBAAAA,CAAAA,qBAAAA,CAAAA,kBAAAA,CAAAA,0BAAAA,CAAAA,2BAAAA,CAAAA,kBAAAA,CAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,qBAAAA,CAAAA,mBAAAA,CAAAA,aAAAA,CAAAA,qBAAAA,CAAAA;AAODC,UAAAA,4BAAAA,CAAAA,iCAAAA,CAAAA,kCAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,WAAAA,CAAAA;AAQHC,QAAAA,UAAAA,CAAAA,kBAAAA,CAAAA,eAAAA,CAAAA,kBAAAA,CAAAA,mBAAAA,CAAAA,qBAAAA,CAAAA;AAQTC,SAAAA,sBAAAA,CAAAA,sDAAAA,CAAAA,eAAAA,CAAAA,iBAAAA,CAAAA,SAAAA,CAAAA,6BAAAA,CAAAA,WAAAA,CAAAA,aAAAA,CAAAA,mBAAAA,CAAAA;AAWMC,SAAAA,iBAAAA,CAAAA,SAAAA,CAAAA,iBAAAA,CAAAA;AAKEC,SAAAA,iBAAAA,CAAAA,QAAAA,CAAAA,qBAAAA,CAAAA,iBAAAA,CAAAA,iBAAAA,CAAAA,cAAAA,CAAAA,YAAAA,CAAAA,mEAAAA,CAAAA,UAAAA,CAAAA;AAWLC,SAAAA,gBAAAA,CAAAA,eAAAA,CAAAA,kBAAAA,CAAAA,eAAAA,CAAAA,iBAAAA,CAAAA;AAOCC,SAAAA,kBAAAA,CAAAA,eAAAA,CAAAA;AAIMC,UAAAA,UAAAA,CAAAA,cAAAA,CAAAA,aAAAA,CAAAA,eAAAA,CAAAA,oBAAAA,CAAAA,wBAAAA,CAAAA,iBAAAA,CAAAA,iBAAAA,CAAAA;AAUPC,UAAAA,aAAAA,CAAAA,kCAAAA,CAAAA,uBAAAA,CAAAA,cAAAA,CAAAA,iBAAAA,CAAAA,UAAAA,CAAAA,gBAAAA,CAAAA,CAAAA,gBAAAA,kCAAAA,CAAAA;AC1HjB,ugVAAugV,C;;;;ACbr/UC,SAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,uBAAAA,CAAAA,8BAAAA,CAAAA,oBAAAA,CAAAA,sBAAAA,CAAAA,kBAAAA,CAAAA;ACDlB,mmCAAmmC,C;;;;ACMjlCC,UAAAA,kBAAAA,CAAAA;ACNlB,2xEAA2xE,C;;;;ACEpwEC,UAAAA,wBAAAA,CAAAA,oBAAAA,CAAAA,aAAAA,CAAAA,cAAAA,CAAAA,0BAAAA,CAAAA,wBAAAA,CAAAA,qBAAAA,CAAAA,kBAAAA,CAAAA,wBAAAA,CAAAA,qCAAAA,CAAAA,qBAAAA,CAAAA,6BAAAA,CAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,kBAAAA,CAAAA,sBAAAA,CAAAA,wBAAAA,CAAAA,yBAAAA,CAAAA,uBAAAA,CAAAA,gBAAAA,CAAAA,eAAAA,CAAAA,gBAAAA,CAAAA,iBAAAA,CAAAA,eAAAA,CAAAA;AAmBTC,SAAAA,yBAAAA,CAAAA,iBAAAA,CAAAA,eAAAA,CAAAA,cAAAA,CAAAA,gBAAAA,CAAAA,aAAAA,CAAAA,QAAAA,CAAAA,SAAAA,CAAAA;AAUEC,UAAAA,yBAAAA,CAAAA,iBAAAA,CAAAA,eAAAA,CAAAA,cAAAA,CAAAA,QAAAA,CAAAA,SAAAA,CAAAA;AAQSC,SAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,6BAAAA,CAAAA,yBAAAA,CAAAA,qBAAAA,CAAAA;ACpCzB,+zEAA+zE,C","sources":["webpack://leadin/./scripts/shared/UIComponents/UISpinner.tsx","webpack://leadin/./scripts/shared/UIComponents/UISpinner.tsx","webpack://leadin/./scripts/shared/UIComponents/UIButton.ts","webpack://leadin/./scripts/shared/UIComponents/UIButton.ts","webpack://leadin/./scripts/shared/UIComponents/UIContainer.ts","webpack://leadin/./scripts/shared/UIComponents/UIContainer.ts","webpack://leadin/./scripts/shared/Common/HubspotWrapper.ts","webpack://leadin/./scripts/shared/Common/HubspotWrapper.ts","webpack://leadin/./scripts/shared/UIComponents/UISpacer.ts","webpack://leadin/./scripts/shared/UIComponents/UISpacer.ts","webpack://leadin/./scripts/shared/UIComponents/UIOverlay.ts","webpack://leadin/./scripts/shared/UIComponents/UIOverlay.ts","webpack://leadin/./scripts/shared/Common/AsyncSelect.tsx","webpack://leadin/./scripts/shared/Common/AsyncSelect.tsx","webpack://leadin/./scripts/elementor/Common/ElementorButton.tsx","webpack://leadin/./scripts/elementor/Common/ElementorButton.tsx","webpack://leadin/./scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx","webpack://leadin/./scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx","webpack://leadin/./scripts/shared/UIComponents/UIAlert.tsx","webpack://leadin/./scripts/shared/UIComponents/UIAlert.tsx"],"sourcesContent":["import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { styled } from '@linaria/react';\nimport { CALYPSO_MEDIUM, CALYPSO } from './colors';\nconst SpinnerOuter = styled.div `\n align-items: center;\n color: #00a4bd;\n display: flex;\n flex-direction: column;\n justify-content: center;\n width: 100%;\n height: 100%;\n margin: '2px';\n`;\nconst SpinnerInner = styled.div `\n align-items: center;\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n`;\nconst Circle = styled.circle `\n fill: none;\n stroke: ${props => props.color};\n stroke-width: 5;\n stroke-linecap: round;\n transform-origin: center;\n`;\nconst AnimatedCircle = styled.circle `\n fill: none;\n stroke: ${props => props.color};\n stroke-width: 5;\n stroke-linecap: round;\n transform-origin: center;\n animation: dashAnimation 2s ease-in-out infinite,\n spinAnimation 2s linear infinite;\n\n @keyframes dashAnimation {\n 0% {\n stroke-dasharray: 1, 150;\n stroke-dashoffset: 0;\n }\n\n 50% {\n stroke-dasharray: 90, 150;\n stroke-dashoffset: -50;\n }\n\n 100% {\n stroke-dasharray: 90, 150;\n stroke-dashoffset: -140;\n }\n }\n\n @keyframes spinAnimation {\n transform: rotate(360deg);\n }\n`;\nexport default function UISpinner({ size = 20 }) {\n return (_jsx(SpinnerOuter, { children: _jsx(SpinnerInner, { children: _jsxs(\"svg\", { height: size, width: size, viewBox: \"0 0 50 50\", children: [_jsx(Circle, { color: CALYPSO_MEDIUM, cx: \"25\", cy: \"25\", r: \"22.5\" }), _jsx(AnimatedCircle, { color: CALYPSO, cx: \"25\", cy: \"25\", r: \"22.5\" })] }) }) }));\n}\n",".sxa9zrc{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#00a4bd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;margin:'2px';}\n.s14430wa{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;}\n.ct87ghk{fill:none;stroke:var(--ct87ghk-0);stroke-width:5;stroke-linecap:round;-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;}\n.avili0h{fill:none;stroke:var(--avili0h-0);stroke-width:5;stroke-linecap:round;-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-animation:dashAnimation-avili0h 2s ease-in-out infinite,spinAnimation-avili0h 2s linear infinite;animation:dashAnimation-avili0h 2s ease-in-out infinite,spinAnimation-avili0h 2s linear infinite;}@-webkit-keyframes dashAnimation-avili0h{0%{stroke-dasharray:1,150;stroke-dashoffset:0;}50%{stroke-dasharray:90,150;stroke-dashoffset:-50;}100%{stroke-dasharray:90,150;stroke-dashoffset:-140;}}@keyframes dashAnimation-avili0h{0%{stroke-dasharray:1,150;stroke-dashoffset:0;}50%{stroke-dasharray:90,150;stroke-dashoffset:-50;}100%{stroke-dasharray:90,150;stroke-dashoffset:-140;}}@-webkit-keyframes spinAnimation-avili0h{{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes spinAnimation-avili0h{{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlTcGlubmVyLnRzeCJdLCJuYW1lcyI6WyIuc3hhOXpyYyIsIi5zMTQ0MzB3YSIsIi5jdDg3Z2hrIiwiLmF2aWxpMGgiXSwibWFwcGluZ3MiOiJBQUdxQkE7QUFVQUM7QUFPTkM7QUFPUUMiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvc2hhcmVkL1VJQ29tcG9uZW50cy9VSVNwaW5uZXIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BsaW5hcmlhL3JlYWN0JztcbmltcG9ydCB7IENBTFlQU09fTUVESVVNLCBDQUxZUFNPIH0gZnJvbSAnLi9jb2xvcnMnO1xuY29uc3QgU3Bpbm5lck91dGVyID0gc3R5bGVkLmRpdiBgXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGNvbG9yOiAjMDBhNGJkO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luOiAnMnB4JztcbmA7XG5jb25zdCBTcGlubmVySW5uZXIgPSBzdHlsZWQuZGl2IGBcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG5gO1xuY29uc3QgQ2lyY2xlID0gc3R5bGVkLmNpcmNsZSBgXG4gIGZpbGw6IG5vbmU7XG4gIHN0cm9rZTogJHtwcm9wcyA9PiBwcm9wcy5jb2xvcn07XG4gIHN0cm9rZS13aWR0aDogNTtcbiAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG5gO1xuY29uc3QgQW5pbWF0ZWRDaXJjbGUgPSBzdHlsZWQuY2lyY2xlIGBcbiAgZmlsbDogbm9uZTtcbiAgc3Ryb2tlOiAke3Byb3BzID0+IHByb3BzLmNvbG9yfTtcbiAgc3Ryb2tlLXdpZHRoOiA1O1xuICBzdHJva2UtbGluZWNhcDogcm91bmQ7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjtcbiAgYW5pbWF0aW9uOiBkYXNoQW5pbWF0aW9uIDJzIGVhc2UtaW4tb3V0IGluZmluaXRlLFxuICAgIHNwaW5BbmltYXRpb24gMnMgbGluZWFyIGluZmluaXRlO1xuXG4gIEBrZXlmcmFtZXMgZGFzaEFuaW1hdGlvbiB7XG4gICAgMCUge1xuICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSwgMTUwO1xuICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IDA7XG4gICAgfVxuXG4gICAgNTAlIHtcbiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDkwLCAxNTA7XG4gICAgICBzdHJva2UtZGFzaG9mZnNldDogLTUwO1xuICAgIH1cblxuICAgIDEwMCUge1xuICAgICAgc3Ryb2tlLWRhc2hhcnJheTogOTAsIDE1MDtcbiAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAtMTQwO1xuICAgIH1cbiAgfVxuXG4gIEBrZXlmcmFtZXMgc3BpbkFuaW1hdGlvbiB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgfVxuYDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFVJU3Bpbm5lcih7IHNpemUgPSAyMCB9KSB7XG4gICAgcmV0dXJuIChfanN4KFNwaW5uZXJPdXRlciwgeyBjaGlsZHJlbjogX2pzeChTcGlubmVySW5uZXIsIHsgY2hpbGRyZW46IF9qc3hzKFwic3ZnXCIsIHsgaGVpZ2h0OiBzaXplLCB3aWR0aDogc2l6ZSwgdmlld0JveDogXCIwIDAgNTAgNTBcIiwgY2hpbGRyZW46IFtfanN4KENpcmNsZSwgeyBjb2xvcjogQ0FMWVBTT19NRURJVU0sIGN4OiBcIjI1XCIsIGN5OiBcIjI1XCIsIHI6IFwiMjIuNVwiIH0pLCBfanN4KEFuaW1hdGVkQ2lyY2xlLCB7IGNvbG9yOiBDQUxZUFNPLCBjeDogXCIyNVwiLCBjeTogXCIyNVwiLCByOiBcIjIyLjVcIiB9KV0gfSkgfSkgfSkpO1xufVxuIl19*/","import { styled } from '@linaria/react';\nimport { HEFFALUMP, LORAX, OLAF } from './colors';\nexport default styled.button `\n background-color:${props => (props.use === 'tertiary' ? HEFFALUMP : LORAX)};\n border: 3px solid ${props => (props.use === 'tertiary' ? HEFFALUMP : LORAX)};\n color: ${OLAF}\n border-radius: 3px;\n font-size: 14px;\n line-height: 14px;\n padding: 12px 24px;\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-weight: 500;\n white-space: nowrap;\n`;\n",".ug152ch{background-color:var(--ug152ch-0);border:3px solid var(--ug152ch-0);color:#ffffff;border-radius:3px;font-size:14px;line-height:14px;padding:12px 24px;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-weight:500;white-space:nowrap;}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlCdXR0b24udHMiXSwibmFtZXMiOlsiLnVnMTUyY2giXSwibWFwcGluZ3MiOiJBQUVlQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvVUlDb21wb25lbnRzL1VJQnV0dG9uLnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuaW1wb3J0IHsgSEVGRkFMVU1QLCBMT1JBWCwgT0xBRiB9IGZyb20gJy4vY29sb3JzJztcbmV4cG9ydCBkZWZhdWx0IHN0eWxlZC5idXR0b24gYFxuICBiYWNrZ3JvdW5kLWNvbG9yOiR7cHJvcHMgPT4gKHByb3BzLnVzZSA9PT0gJ3RlcnRpYXJ5JyA/IEhFRkZBTFVNUCA6IExPUkFYKX07XG4gIGJvcmRlcjogM3B4IHNvbGlkICR7cHJvcHMgPT4gKHByb3BzLnVzZSA9PT0gJ3RlcnRpYXJ5JyA/IEhFRkZBTFVNUCA6IExPUkFYKX07XG4gIGNvbG9yOiAke09MQUZ9XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTRweDtcbiAgcGFkZGluZzogMTJweCAyNHB4O1xuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbmA7XG4iXX0=*/","import { styled } from '@linaria/react';\nexport default styled.div `\n text-align: ${props => (props.textAlign ? props.textAlign : 'inherit')};\n`;\n",".ua13n1c{text-align:var(--ua13n1c-0);}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlDb250YWluZXIudHMiXSwibmFtZXMiOlsiLnVhMTNuMWMiXSwibWFwcGluZ3MiOiJBQUNlQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvVUlDb21wb25lbnRzL1VJQ29udGFpbmVyLnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgc3R5bGVkLmRpdiBgXG4gIHRleHQtYWxpZ246ICR7cHJvcHMgPT4gKHByb3BzLnRleHRBbGlnbiA/IHByb3BzLnRleHRBbGlnbiA6ICdpbmhlcml0Jyl9O1xuYDtcbiJdfQ==*/","import { styled } from '@linaria/react';\nexport default styled.div `\n background-image: ${props => `url(${props.pluginPath}/public/assets/images/hubspot.svg)`};\n background-color: #f5f8fa;\n background-repeat: no-repeat;\n background-position: center 25px;\n background-size: 120px;\n color: #33475b;\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-size: 14px;\n\n padding: ${(props) => props.padding || '90px 20% 25px'};\n\n p {\n font-size: inherit !important;\n line-height: 24px;\n margin: 4px 0;\n }\n`;\n",".h1q5v5ee{background-image:var(--h1q5v5ee-0);background-color:#f5f8fa;background-repeat:no-repeat;background-position:center 25px;background-size:120px;color:#33475b;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-size:14px;padding:var(--h1q5v5ee-1);}.h1q5v5ee p{font-size:inherit !important;line-height:24px;margin:4px 0;}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9Db21tb24vSHVic3BvdFdyYXBwZXIudHMiXSwibmFtZXMiOlsiLmgxcTV2NWVlIl0sIm1hcHBpbmdzIjoiQUFDZUEiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvc2hhcmVkL0NvbW1vbi9IdWJzcG90V3JhcHBlci50cyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BsaW5hcmlhL3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IHN0eWxlZC5kaXYgYFxuICBiYWNrZ3JvdW5kLWltYWdlOiAke3Byb3BzID0+IGB1cmwoJHtwcm9wcy5wbHVnaW5QYXRofS9wdWJsaWMvYXNzZXRzL2ltYWdlcy9odWJzcG90LnN2ZylgfTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjhmYTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIDI1cHg7XG4gIGJhY2tncm91bmQtc2l6ZTogMTIwcHg7XG4gIGNvbG9yOiAjMzM0NzViO1xuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxNHB4O1xuXG4gIHBhZGRpbmc6ICR7KHByb3BzKSA9PiBwcm9wcy5wYWRkaW5nIHx8ICc5MHB4IDIwJSAyNXB4J307XG5cbiAgcCB7XG4gICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgbGluZS1oZWlnaHQ6IDI0cHg7XG4gICAgbWFyZ2luOiA0cHggMDtcbiAgfVxuYDtcbiJdfQ==*/","import { styled } from '@linaria/react';\nexport default styled.div `\n height: 30px;\n`;\n",".u3qxofx{height:30px;}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlTcGFjZXIudHMiXSwibmFtZXMiOlsiLnUzcXhvZngiXSwibWFwcGluZ3MiOiJBQUNlQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvVUlDb21wb25lbnRzL1VJU3BhY2VyLnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgc3R5bGVkLmRpdiBgXG4gIGhlaWdodDogMzBweDtcbmA7XG4iXX0=*/","import { styled } from '@linaria/react';\nexport default styled.div `\n position: relative;\n\n &:after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n left: 0;\n }\n`;\n",".u1q7a48k{position:relative;}.u1q7a48k:after{content:'';position:absolute;top:0;bottom:0;right:0;left:0;}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlPdmVybGF5LnRzIl0sIm5hbWVzIjpbIi51MXE3YTQ4ayJdLCJtYXBwaW5ncyI6IkFBQ2VBIiwiZmlsZSI6Ii91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlPdmVybGF5LnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgc3R5bGVkLmRpdiBgXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAmOmFmdGVyIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcbiAgICBsZWZ0OiAwO1xuICB9XG5gO1xuIl19*/","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useRef, useState, useEffect } from 'react';\nimport { styled } from '@linaria/react';\nimport { CALYPSO, CALYPSO_LIGHT, CALYPSO_MEDIUM, OBSIDIAN, } from '../UIComponents/colors';\nimport UISpinner from '../UIComponents/UISpinner';\nimport LoadState from '../enums/loadState';\nconst Container = styled.div `\n color: ${OBSIDIAN};\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-size: 14px;\n position: relative;\n`;\nconst ControlContainer = styled.div `\n align-items: center;\n background-color: hsl(0, 0%, 100%);\n border-color: hsl(0, 0%, 80%);\n border-radius: 4px;\n border-style: solid;\n border-width: ${props => (props.focused ? '0' : '1px')};\n cursor: default;\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n min-height: 38px;\n outline: 0 !important;\n position: relative;\n transition: all 100ms;\n box-sizing: border-box;\n box-shadow: ${props => props.focused ? `0 0 0 2px ${CALYPSO_MEDIUM}` : 'none'};\n &:hover {\n border-color: hsl(0, 0%, 70%);\n }\n`;\nconst ValueContainer = styled.div `\n align-items: center;\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n padding: 2px 8px;\n position: relative;\n overflow: hidden;\n box-sizing: border-box;\n`;\nconst Placeholder = styled.div `\n color: hsl(0, 0%, 50%);\n margin-left: 2px;\n margin-right: 2px;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n box-sizing: border-box;\n font-size: 16px;\n`;\nconst SingleValue = styled.div `\n color: hsl(0, 0%, 20%);\n margin-left: 2px;\n margin-right: 2px;\n max-width: calc(100% - 8px);\n overflow: hidden;\n position: absolute;\n text-overflow: ellipsis;\n white-space: nowrap;\n top: 50%;\n transform: translateY(-50%);\n box-sizing: border-box;\n`;\nconst IndicatorContainer = styled.div `\n align-items: center;\n align-self: stretch;\n display: flex;\n flex-shrink: 0;\n box-sizing: border-box;\n`;\nconst DropdownIndicator = styled.div `\n border-top: 8px solid ${CALYPSO};\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n width: 0px;\n height: 0px;\n margin: 10px;\n`;\nconst InputContainer = styled.div `\n margin: 2px;\n padding-bottom: 2px;\n padding-top: 2px;\n visibility: visible;\n color: hsl(0, 0%, 20%);\n box-sizing: border-box;\n`;\nconst Input = styled.input `\n box-sizing: content-box;\n background: rgba(0, 0, 0, 0) none repeat scroll 0px center;\n border: 0px none;\n font-size: inherit;\n opacity: 1;\n outline: currentcolor none 0px;\n padding: 0px;\n color: inherit;\n font-family: inherit;\n`;\nconst InputShadow = styled.div `\n position: absolute;\n opacity: 0;\n font-size: inherit;\n`;\nconst MenuContainer = styled.div `\n position: absolute;\n top: 100%;\n background-color: #fff;\n border-radius: 4px;\n margin-bottom: 8px;\n margin-top: 8px;\n z-index: 9999;\n box-shadow: 0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1);\n width: 100%;\n`;\nconst MenuList = styled.div `\n max-height: 300px;\n overflow-y: auto;\n padding-bottom: 4px;\n padding-top: 4px;\n position: relative;\n`;\nconst MenuGroup = styled.div `\n padding-bottom: 8px;\n padding-top: 8px;\n`;\nconst MenuGroupHeader = styled.div `\n color: #999;\n cursor: default;\n font-size: 75%;\n font-weight: 500;\n margin-bottom: 0.25em;\n text-transform: uppercase;\n padding-left: 12px;\n padding-left: 12px;\n`;\nconst MenuItem = styled.div `\n display: block;\n background-color: ${props => props.selected ? CALYPSO_MEDIUM : 'transparent'};\n color: ${props => (props.selected ? '#fff' : 'inherit')};\n cursor: default;\n font-size: inherit;\n width: 100%;\n padding: 8px 12px;\n &:hover {\n background-color: ${props => props.selected ? CALYPSO_MEDIUM : CALYPSO_LIGHT};\n }\n`;\nexport default function AsyncSelect({ placeholder, value, loadOptions, onChange, defaultOptions, }) {\n const inputEl = useRef(null);\n const inputShadowEl = useRef(null);\n const [isFocused, setFocus] = useState(false);\n const [loadState, setLoadState] = useState(LoadState.NotLoaded);\n const [localValue, setLocalValue] = useState('');\n const [options, setOptions] = useState(defaultOptions);\n const inputSize = `${inputShadowEl.current ? inputShadowEl.current.clientWidth + 10 : 2}px`;\n useEffect(() => {\n if (loadOptions && loadState === LoadState.NotLoaded) {\n loadOptions('', (result) => {\n setOptions(result);\n setLoadState(LoadState.Idle);\n });\n }\n }, [loadOptions, loadState]);\n const renderItems = (items = [], parentKey) => {\n return items.map((item, index) => {\n if (item.options) {\n return (_jsxs(MenuGroup, { children: [_jsx(MenuGroupHeader, { id: `${index}-heading`, children: item.label }), _jsx(\"div\", { children: renderItems(item.options, index) })] }, `async-select-item-${index}`));\n }\n else {\n const key = `async-select-item-${parentKey !== undefined ? `${parentKey}-${index}` : index}`;\n return (_jsx(MenuItem, { id: key, selected: value && item.value === value.value, onClick: () => {\n onChange(item);\n setFocus(false);\n }, children: item.label }, key));\n }\n });\n };\n return (_jsxs(Container, { children: [_jsxs(ControlContainer, { id: \"leadin-async-selector\", focused: isFocused, onClick: () => {\n if (isFocused) {\n if (inputEl.current) {\n inputEl.current.blur();\n }\n setFocus(false);\n setLocalValue('');\n }\n else {\n if (inputEl.current) {\n inputEl.current.focus();\n }\n setFocus(true);\n }\n }, children: [_jsxs(ValueContainer, { children: [localValue === '' &&\n (!value ? (_jsx(Placeholder, { children: placeholder })) : (_jsx(SingleValue, { children: value.label }))), _jsxs(InputContainer, { children: [_jsx(Input, { ref: inputEl, onFocus: () => {\n setFocus(true);\n }, onChange: e => {\n setLocalValue(e.target.value);\n setLoadState(LoadState.Loading);\n loadOptions &&\n loadOptions(e.target.value, (result) => {\n setOptions(result);\n setLoadState(LoadState.Idle);\n });\n }, value: localValue, width: inputSize, id: \"asycn-select-input\" }), _jsx(InputShadow, { ref: inputShadowEl, children: localValue })] })] }), _jsxs(IndicatorContainer, { children: [loadState === LoadState.Loading && _jsx(UISpinner, {}), _jsx(DropdownIndicator, {})] })] }), isFocused && (_jsx(MenuContainer, { children: _jsx(MenuList, { children: renderItems(options) }) }))] }));\n}\n",".c1wxx7eu{color:#33475b;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-size:14px;position:relative;}\n.c1rgwbep{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:hsl(0,0%,100%);border-color:hsl(0,0%,80%);border-radius:4px;border-style:solid;border-width:var(--c1rgwbep-0);cursor:default;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:38px;outline:0 !important;position:relative;-webkit-transition:all 100ms;transition:all 100ms;box-sizing:border-box;box-shadow:var(--c1rgwbep-1);}.c1rgwbep:hover{border-color:hsl(0,0%,70%);}\n.v1mdmbaj{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:2px 8px;position:relative;overflow:hidden;box-sizing:border-box;}\n.p1gwkvxy{color:hsl(0,0%,50%);margin-left:2px;margin-right:2px;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);box-sizing:border-box;font-size:16px;}\n.s1bwlafs{color:hsl(0,0%,20%);margin-left:2px;margin-right:2px;max-width:calc(100% - 8px);overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);box-sizing:border-box;}\n.i196z9y5{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;box-sizing:border-box;}\n.d1dfo5ow{border-top:8px solid #00a4bd;border-left:6px solid transparent;border-right:6px solid transparent;width:0px;height:0px;margin:10px;}\n.if3lze{margin:2px;padding-bottom:2px;padding-top:2px;visibility:visible;color:hsl(0,0%,20%);box-sizing:border-box;}\n.i9kxf50{box-sizing:content-box;background:rgba(0,0,0,0) none repeat scroll 0px center;border:0px none;font-size:inherit;opacity:1;outline:currentcolor none 0px;padding:0px;color:inherit;font-family:inherit;}\n.igjr3uc{position:absolute;opacity:0;font-size:inherit;}\n.mhb9if7{position:absolute;top:100%;background-color:#fff;border-radius:4px;margin-bottom:8px;margin-top:8px;z-index:9999;box-shadow:0 0 0 1px hsla(0,0%,0%,0.1),0 4px 11px hsla(0,0%,0%,0.1);width:100%;}\n.mxaof7s{max-height:300px;overflow-y:auto;padding-bottom:4px;padding-top:4px;position:relative;}\n.mw50s5v{padding-bottom:8px;padding-top:8px;}\n.m11rzvjw{color:#999;cursor:default;font-size:75%;font-weight:500;margin-bottom:0.25em;text-transform:uppercase;padding-left:12px;padding-left:12px;}\n.m1jcdsjv{display:block;background-color:var(--m1jcdsjv-0);color:var(--m1jcdsjv-1);cursor:default;font-size:inherit;width:100%;padding:8px 12px;}.m1jcdsjv:hover{background-color:var(--m1jcdsjv-2);}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9Db21tb24vQXN5bmNTZWxlY3QudHN4Il0sIm5hbWVzIjpbIi5jMXd4eDdldSIsIi5jMXJnd2JlcCIsIi52MW1kbWJhaiIsIi5wMWd3a3Z4eSIsIi5zMWJ3bGFmcyIsIi5pMTk2ejl5NSIsIi5kMWRmbzVvdyIsIi5pZjNsemUiLCIuaTlreGY1MCIsIi5pZ2pyM3VjIiwiLm1oYjlpZjciLCIubXhhb2Y3cyIsIi5tdzUwczV2IiwiLm0xMXJ6dmp3IiwiLm0xamNkc2p2Il0sIm1hcHBpbmdzIjoiQUFNa0JBO0FBTU9DO0FBcUJGQztBQVVIQztBQVVBQztBQWFPQztBQU9EQztBQVFIQztBQVFUQztBQVdNQztBQUtFQztBQVdMQztBQU9DQztBQUlNQztBQVVQQyIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvQ29tbW9uL0FzeW5jU2VsZWN0LnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbGluYXJpYS9yZWFjdCc7XG5pbXBvcnQgeyBDQUxZUFNPLCBDQUxZUFNPX0xJR0hULCBDQUxZUFNPX01FRElVTSwgT0JTSURJQU4sIH0gZnJvbSAnLi4vVUlDb21wb25lbnRzL2NvbG9ycyc7XG5pbXBvcnQgVUlTcGlubmVyIGZyb20gJy4uL1VJQ29tcG9uZW50cy9VSVNwaW5uZXInO1xuaW1wb3J0IExvYWRTdGF0ZSBmcm9tICcuLi9lbnVtcy9sb2FkU3RhdGUnO1xuY29uc3QgQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGNvbG9yOiAke09CU0lESUFOfTtcbiAgZm9udC1mYW1pbHk6ICdMZXhlbmQgRGVjYScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuYDtcbmNvbnN0IENvbnRyb2xDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDAsIDAlLCAxMDAlKTtcbiAgYm9yZGVyLWNvbG9yOiBoc2woMCwgMCUsIDgwJSk7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLXdpZHRoOiAke3Byb3BzID0+IChwcm9wcy5mb2N1c2VkID8gJzAnIDogJzFweCcpfTtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgbWluLWhlaWdodDogMzhweDtcbiAgb3V0bGluZTogMCAhaW1wb3J0YW50O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRyYW5zaXRpb246IGFsbCAxMDBtcztcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy5mb2N1c2VkID8gYDAgMCAwIDJweCAke0NBTFlQU09fTUVESVVNfWAgOiAnbm9uZSd9O1xuICAmOmhvdmVyIHtcbiAgICBib3JkZXItY29sb3I6IGhzbCgwLCAwJSwgNzAlKTtcbiAgfVxuYDtcbmNvbnN0IFZhbHVlQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXg6IDE7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgcGFkZGluZzogMnB4IDhweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuYDtcbmNvbnN0IFBsYWNlaG9sZGVyID0gc3R5bGVkLmRpdiBgXG4gIGNvbG9yOiBoc2woMCwgMCUsIDUwJSk7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG4gIG1hcmdpbi1yaWdodDogMnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGZvbnQtc2l6ZTogMTZweDtcbmA7XG5jb25zdCBTaW5nbGVWYWx1ZSA9IHN0eWxlZC5kaXYgYFxuICBjb2xvcjogaHNsKDAsIDAlLCAyMCUpO1xuICBtYXJnaW4tbGVmdDogMnB4O1xuICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA4cHgpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuYDtcbmNvbnN0IEluZGljYXRvckNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXNocmluazogMDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbmA7XG5jb25zdCBEcm9wZG93bkluZGljYXRvciA9IHN0eWxlZC5kaXYgYFxuICBib3JkZXItdG9wOiA4cHggc29saWQgJHtDQUxZUFNPfTtcbiAgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJpZ2h0OiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIHdpZHRoOiAwcHg7XG4gIGhlaWdodDogMHB4O1xuICBtYXJnaW46IDEwcHg7XG5gO1xuY29uc3QgSW5wdXRDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgbWFyZ2luOiAycHg7XG4gIHBhZGRpbmctYm90dG9tOiAycHg7XG4gIHBhZGRpbmctdG9wOiAycHg7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIGNvbG9yOiBoc2woMCwgMCUsIDIwJSk7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5gO1xuY29uc3QgSW5wdXQgPSBzdHlsZWQuaW5wdXQgYFxuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwKSBub25lIHJlcGVhdCBzY3JvbGwgMHB4IGNlbnRlcjtcbiAgYm9yZGVyOiAwcHggbm9uZTtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICBvcGFjaXR5OiAxO1xuICBvdXRsaW5lOiBjdXJyZW50Y29sb3Igbm9uZSAwcHg7XG4gIHBhZGRpbmc6IDBweDtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuYDtcbmNvbnN0IElucHV0U2hhZG93ID0gc3R5bGVkLmRpdiBgXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgb3BhY2l0eTogMDtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuYDtcbmNvbnN0IE1lbnVDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBtYXJnaW4tdG9wOiA4cHg7XG4gIHotaW5kZXg6IDk5OTk7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDFweCBoc2xhKDAsIDAlLCAwJSwgMC4xKSwgMCA0cHggMTFweCBoc2xhKDAsIDAlLCAwJSwgMC4xKTtcbiAgd2lkdGg6IDEwMCU7XG5gO1xuY29uc3QgTWVudUxpc3QgPSBzdHlsZWQuZGl2IGBcbiAgbWF4LWhlaWdodDogMzAwcHg7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIHBhZGRpbmctYm90dG9tOiA0cHg7XG4gIHBhZGRpbmctdG9wOiA0cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XG5jb25zdCBNZW51R3JvdXAgPSBzdHlsZWQuZGl2IGBcbiAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgcGFkZGluZy10b3A6IDhweDtcbmA7XG5jb25zdCBNZW51R3JvdXBIZWFkZXIgPSBzdHlsZWQuZGl2IGBcbiAgY29sb3I6ICM5OTk7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgZm9udC1zaXplOiA3NSU7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIG1hcmdpbi1ib3R0b206IDAuMjVlbTtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgcGFkZGluZy1sZWZ0OiAxMnB4O1xuICBwYWRkaW5nLWxlZnQ6IDEycHg7XG5gO1xuY29uc3QgTWVudUl0ZW0gPSBzdHlsZWQuZGl2IGBcbiAgZGlzcGxheTogYmxvY2s7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMuc2VsZWN0ZWQgPyBDQUxZUFNPX01FRElVTSA6ICd0cmFuc3BhcmVudCd9O1xuICBjb2xvcjogJHtwcm9wcyA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnI2ZmZicgOiAnaW5oZXJpdCcpfTtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiA4cHggMTJweDtcbiAgJjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy5zZWxlY3RlZCA/IENBTFlQU09fTUVESVVNIDogQ0FMWVBTT19MSUdIVH07XG4gIH1cbmA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBc3luY1NlbGVjdCh7IHBsYWNlaG9sZGVyLCB2YWx1ZSwgbG9hZE9wdGlvbnMsIG9uQ2hhbmdlLCBkZWZhdWx0T3B0aW9ucywgfSkge1xuICAgIGNvbnN0IGlucHV0RWwgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgaW5wdXRTaGFkb3dFbCA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBbaXNGb2N1c2VkLCBzZXRGb2N1c10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW2xvYWRTdGF0ZSwgc2V0TG9hZFN0YXRlXSA9IHVzZVN0YXRlKExvYWRTdGF0ZS5Ob3RMb2FkZWQpO1xuICAgIGNvbnN0IFtsb2NhbFZhbHVlLCBzZXRMb2NhbFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZShkZWZhdWx0T3B0aW9ucyk7XG4gICAgY29uc3QgaW5wdXRTaXplID0gYCR7aW5wdXRTaGFkb3dFbC5jdXJyZW50ID8gaW5wdXRTaGFkb3dFbC5jdXJyZW50LmNsaWVudFdpZHRoICsgMTAgOiAyfXB4YDtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAobG9hZE9wdGlvbnMgJiYgbG9hZFN0YXRlID09PSBMb2FkU3RhdGUuTm90TG9hZGVkKSB7XG4gICAgICAgICAgICBsb2FkT3B0aW9ucygnJywgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldE9wdGlvbnMocmVzdWx0KTtcbiAgICAgICAgICAgICAgICBzZXRMb2FkU3RhdGUoTG9hZFN0YXRlLklkbGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCBbbG9hZE9wdGlvbnMsIGxvYWRTdGF0ZV0pO1xuICAgIGNvbnN0IHJlbmRlckl0ZW1zID0gKGl0ZW1zID0gW10sIHBhcmVudEtleSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ub3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoX2pzeHMoTWVudUdyb3VwLCB7IGNoaWxkcmVuOiBbX2pzeChNZW51R3JvdXBIZWFkZXIsIHsgaWQ6IGAke2luZGV4fS1oZWFkaW5nYCwgY2hpbGRyZW46IGl0ZW0ubGFiZWwgfSksIF9qc3goXCJkaXZcIiwgeyBjaGlsZHJlbjogcmVuZGVySXRlbXMoaXRlbS5vcHRpb25zLCBpbmRleCkgfSldIH0sIGBhc3luYy1zZWxlY3QtaXRlbS0ke2luZGV4fWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGBhc3luYy1zZWxlY3QtaXRlbS0ke3BhcmVudEtleSAhPT0gdW5kZWZpbmVkID8gYCR7cGFyZW50S2V5fS0ke2luZGV4fWAgOiBpbmRleH1gO1xuICAgICAgICAgICAgICAgIHJldHVybiAoX2pzeChNZW51SXRlbSwgeyBpZDoga2V5LCBzZWxlY3RlZDogdmFsdWUgJiYgaXRlbS52YWx1ZSA9PT0gdmFsdWUudmFsdWUsIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9jdXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9LCBjaGlsZHJlbjogaXRlbS5sYWJlbCB9LCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gKF9qc3hzKENvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKENvbnRyb2xDb250YWluZXIsIHsgaWQ6IFwibGVhZGluLWFzeW5jLXNlbGVjdG9yXCIsIGZvY3VzZWQ6IGlzRm9jdXNlZCwgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRFbC5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbC5jdXJyZW50LmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvY3VzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldExvY2FsVmFsdWUoJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RWwuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RWwuY3VycmVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9jdXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBjaGlsZHJlbjogW19qc3hzKFZhbHVlQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbbG9jYWxWYWx1ZSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCF2YWx1ZSA/IChfanN4KFBsYWNlaG9sZGVyLCB7IGNoaWxkcmVuOiBwbGFjZWhvbGRlciB9KSkgOiAoX2pzeChTaW5nbGVWYWx1ZSwgeyBjaGlsZHJlbjogdmFsdWUubGFiZWwgfSkpKSwgX2pzeHMoSW5wdXRDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KElucHV0LCB7IHJlZjogaW5wdXRFbCwgb25Gb2N1czogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb2N1cyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkNoYW5nZTogZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldExvY2FsVmFsdWUoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRMb2FkU3RhdGUoTG9hZFN0YXRlLkxvYWRpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkT3B0aW9ucyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE9wdGlvbnMoZS50YXJnZXQudmFsdWUsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRPcHRpb25zKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TG9hZFN0YXRlKExvYWRTdGF0ZS5JZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHZhbHVlOiBsb2NhbFZhbHVlLCB3aWR0aDogaW5wdXRTaXplLCBpZDogXCJhc3ljbi1zZWxlY3QtaW5wdXRcIiB9KSwgX2pzeChJbnB1dFNoYWRvdywgeyByZWY6IGlucHV0U2hhZG93RWwsIGNoaWxkcmVuOiBsb2NhbFZhbHVlIH0pXSB9KV0gfSksIF9qc3hzKEluZGljYXRvckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW2xvYWRTdGF0ZSA9PT0gTG9hZFN0YXRlLkxvYWRpbmcgJiYgX2pzeChVSVNwaW5uZXIsIHt9KSwgX2pzeChEcm9wZG93bkluZGljYXRvciwge30pXSB9KV0gfSksIGlzRm9jdXNlZCAmJiAoX2pzeChNZW51Q29udGFpbmVyLCB7IGNoaWxkcmVuOiBfanN4KE1lbnVMaXN0LCB7IGNoaWxkcmVuOiByZW5kZXJJdGVtcyhvcHRpb25zKSB9KSB9KSldIH0pKTtcbn1cbiJdfQ==*/","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { styled } from '@linaria/react';\nconst Container = styled.div `\n display: flex;\n justify-content: center;\n padding-bottom: 8px;\n`;\nexport default function ElementorButton({ children, ...params }) {\n return (_jsx(Container, { className: \"elementor-button-wrapper\", children: _jsx(\"button\", { className: \"elementor-button elementor-button-default\", type: \"button\", ...params, children: children }) }));\n}\n",".czoccom{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:8px;}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL2VsZW1lbnRvci9Db21tb24vRWxlbWVudG9yQnV0dG9uLnRzeCJdLCJuYW1lcyI6WyIuY3pvY2NvbSJdLCJtYXBwaW5ncyI6IkFBRWtCQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9lbGVtZW50b3IvQ29tbW9uL0VsZW1lbnRvckJ1dHRvbi50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuY29uc3QgQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBwYWRkaW5nLWJvdHRvbTogOHB4O1xuYDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEVsZW1lbnRvckJ1dHRvbih7IGNoaWxkcmVuLCAuLi5wYXJhbXMgfSkge1xuICAgIHJldHVybiAoX2pzeChDb250YWluZXIsIHsgY2xhc3NOYW1lOiBcImVsZW1lbnRvci1idXR0b24td3JhcHBlclwiLCBjaGlsZHJlbjogX2pzeChcImJ1dHRvblwiLCB7IGNsYXNzTmFtZTogXCJlbGVtZW50b3ItYnV0dG9uIGVsZW1lbnRvci1idXR0b24tZGVmYXVsdFwiLCB0eXBlOiBcImJ1dHRvblwiLCAuLi5wYXJhbXMsIGNoaWxkcmVuOiBjaGlsZHJlbiB9KSB9KSk7XG59XG4iXX0=*/","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Fragment } from 'react';\nimport { CURRENT_USER_CALENDAR_MISSING } from '../../shared/Meeting/constants';\nimport ElementorButton from '../Common/ElementorButton';\nimport ElementorBanner from '../Common/ElementorBanner';\nimport { styled } from '@linaria/react';\nimport { __ } from '@wordpress/i18n';\nconst Container = styled.div `\n padding-bottom: 8px;\n`;\nexport default function MeetingWarning({ onConnectCalendar, status, }) {\n const isMeetingOwner = status === CURRENT_USER_CALENDAR_MISSING;\n const titleText = isMeetingOwner\n ? __('Your calendar is not connected', 'leadin')\n : __('Calendar is not connected', 'leadin');\n const titleMessage = isMeetingOwner\n ? __('Please connect your calendar to activate your scheduling pages', 'leadin')\n : __('Make sure that everybody in this meeting has connected their calendar from the Meetings page in HubSpot', 'leadin');\n return (_jsxs(Fragment, { children: [_jsx(Container, { children: _jsxs(ElementorBanner, { type: \"warning\", children: [_jsx(\"b\", { children: titleText }), _jsx(\"br\", {}), titleMessage] }) }), isMeetingOwner && (_jsx(ElementorButton, { id: \"meetings-connect-calendar\", onClick: onConnectCalendar, children: __('Connect calendar', 'leadin') }))] }));\n}\n",".c1p032ba{padding-bottom:8px;}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL2VsZW1lbnRvci9NZWV0aW5nV2lkZ2V0L0VsZW1lbnRvck1lZXRpbmdXYXJuaW5nLnRzeCJdLCJuYW1lcyI6WyIuYzFwMDMyYmEiXSwibWFwcGluZ3MiOiJBQU9rQkEiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvZWxlbWVudG9yL01lZXRpbmdXaWRnZXQvRWxlbWVudG9yTWVldGluZ1dhcm5pbmcudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IEZyYWdtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ1VSUkVOVF9VU0VSX0NBTEVOREFSX01JU1NJTkcgfSBmcm9tICcuLi8uLi9zaGFyZWQvTWVldGluZy9jb25zdGFudHMnO1xuaW1wb3J0IEVsZW1lbnRvckJ1dHRvbiBmcm9tICcuLi9Db21tb24vRWxlbWVudG9yQnV0dG9uJztcbmltcG9ydCBFbGVtZW50b3JCYW5uZXIgZnJvbSAnLi4vQ29tbW9uL0VsZW1lbnRvckJhbm5lcic7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbGluYXJpYS9yZWFjdCc7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ0B3b3JkcHJlc3MvaTE4bic7XG5jb25zdCBDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgcGFkZGluZy1ib3R0b206IDhweDtcbmA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNZWV0aW5nV2FybmluZyh7IG9uQ29ubmVjdENhbGVuZGFyLCBzdGF0dXMsIH0pIHtcbiAgICBjb25zdCBpc01lZXRpbmdPd25lciA9IHN0YXR1cyA9PT0gQ1VSUkVOVF9VU0VSX0NBTEVOREFSX01JU1NJTkc7XG4gICAgY29uc3QgdGl0bGVUZXh0ID0gaXNNZWV0aW5nT3duZXJcbiAgICAgICAgPyBfXygnWW91ciBjYWxlbmRhciBpcyBub3QgY29ubmVjdGVkJywgJ2xlYWRpbicpXG4gICAgICAgIDogX18oJ0NhbGVuZGFyIGlzIG5vdCBjb25uZWN0ZWQnLCAnbGVhZGluJyk7XG4gICAgY29uc3QgdGl0bGVNZXNzYWdlID0gaXNNZWV0aW5nT3duZXJcbiAgICAgICAgPyBfXygnUGxlYXNlIGNvbm5lY3QgeW91ciBjYWxlbmRhciB0byBhY3RpdmF0ZSB5b3VyIHNjaGVkdWxpbmcgcGFnZXMnLCAnbGVhZGluJylcbiAgICAgICAgOiBfXygnTWFrZSBzdXJlIHRoYXQgZXZlcnlib2R5IGluIHRoaXMgbWVldGluZyBoYXMgY29ubmVjdGVkIHRoZWlyIGNhbGVuZGFyIGZyb20gdGhlIE1lZXRpbmdzIHBhZ2UgaW4gSHViU3BvdCcsICdsZWFkaW4nKTtcbiAgICByZXR1cm4gKF9qc3hzKEZyYWdtZW50LCB7IGNoaWxkcmVuOiBbX2pzeChDb250YWluZXIsIHsgY2hpbGRyZW46IF9qc3hzKEVsZW1lbnRvckJhbm5lciwgeyB0eXBlOiBcIndhcm5pbmdcIiwgY2hpbGRyZW46IFtfanN4KFwiYlwiLCB7IGNoaWxkcmVuOiB0aXRsZVRleHQgfSksIF9qc3goXCJiclwiLCB7fSksIHRpdGxlTWVzc2FnZV0gfSkgfSksIGlzTWVldGluZ093bmVyICYmIChfanN4KEVsZW1lbnRvckJ1dHRvbiwgeyBpZDogXCJtZWV0aW5ncy1jb25uZWN0LWNhbGVuZGFyXCIsIG9uQ2xpY2s6IG9uQ29ubmVjdENhbGVuZGFyLCBjaGlsZHJlbjogX18oJ0Nvbm5lY3QgY2FsZW5kYXInLCAnbGVhZGluJykgfSkpXSB9KSk7XG59XG4iXX0=*/","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { styled } from '@linaria/react';\nimport { MARIGOLD_LIGHT, MARIGOLD_MEDIUM, OBSIDIAN } from './colors';\nconst AlertContainer = styled.div `\n background-color: ${MARIGOLD_LIGHT};\n border-color: ${MARIGOLD_MEDIUM};\n color: ${OBSIDIAN};\n font-size: 14px;\n align-items: center;\n justify-content: space-between;\n display: flex;\n border-style: solid;\n border-top-style: solid;\n border-right-style: solid;\n border-bottom-style: solid;\n border-left-style: solid;\n border-width: 1px;\n min-height: 60px;\n padding: 8px 20px;\n position: relative;\n text-align: left;\n`;\nconst Title = styled.p `\n font-family: 'Lexend Deca';\n font-style: normal;\n font-weight: 700;\n font-size: 16px;\n line-height: 19px;\n color: ${OBSIDIAN};\n margin: 0;\n padding: 0;\n`;\nconst Message = styled.p `\n font-family: 'Lexend Deca';\n font-style: normal;\n font-weight: 400;\n font-size: 14px;\n margin: 0;\n padding: 0;\n`;\nconst MessageContainer = styled.div `\n display: flex;\n flex-direction: column;\n`;\nexport default function UIAlert({ titleText, titleMessage, children, }) {\n return (_jsxs(AlertContainer, { children: [_jsxs(MessageContainer, { children: [_jsx(Title, { children: titleText }), _jsx(Message, { children: titleMessage })] }), children] }));\n}\n",".a1h8m4fo{background-color:#fef8f0;border-color:#fae0b5;color:#33475b;font-size:14px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-style:solid;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-width:1px;min-height:60px;padding:8px 20px;position:relative;text-align:left;}\n.tyndzxk{font-family:'Lexend Deca';font-style:normal;font-weight:700;font-size:16px;line-height:19px;color:#33475b;margin:0;padding:0;}\n.m1m9sbk4{font-family:'Lexend Deca';font-style:normal;font-weight:400;font-size:14px;margin:0;padding:0;}\n.mg5o421{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlBbGVydC50c3giXSwibmFtZXMiOlsiLmExaDhtNGZvIiwiLnR5bmR6eGsiLCIubTFtOXNiazQiLCIubWc1bzQyMSJdLCJtYXBwaW5ncyI6IkFBR3VCQTtBQW1CVEM7QUFVRUM7QUFRU0MiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvc2hhcmVkL1VJQ29tcG9uZW50cy9VSUFsZXJ0LnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbGluYXJpYS9yZWFjdCc7XG5pbXBvcnQgeyBNQVJJR09MRF9MSUdIVCwgTUFSSUdPTERfTUVESVVNLCBPQlNJRElBTiB9IGZyb20gJy4vY29sb3JzJztcbmNvbnN0IEFsZXJ0Q29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGJhY2tncm91bmQtY29sb3I6ICR7TUFSSUdPTERfTElHSFR9O1xuICBib3JkZXItY29sb3I6ICR7TUFSSUdPTERfTUVESVVNfTtcbiAgY29sb3I6ICR7T0JTSURJQU59O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgZGlzcGxheTogZmxleDtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1yaWdodC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkO1xuICBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBtaW4taGVpZ2h0OiA2MHB4O1xuICBwYWRkaW5nOiA4cHggMjBweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuYDtcbmNvbnN0IFRpdGxlID0gc3R5bGVkLnAgYFxuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJztcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogNzAwO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxOXB4O1xuICBjb2xvcjogJHtPQlNJRElBTn07XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbmA7XG5jb25zdCBNZXNzYWdlID0gc3R5bGVkLnAgYFxuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJztcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogNDAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbmA7XG5jb25zdCBNZXNzYWdlQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5gO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVUlBbGVydCh7IHRpdGxlVGV4dCwgdGl0bGVNZXNzYWdlLCBjaGlsZHJlbiwgfSkge1xuICAgIHJldHVybiAoX2pzeHMoQWxlcnRDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhNZXNzYWdlQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeChUaXRsZSwgeyBjaGlsZHJlbjogdGl0bGVUZXh0IH0pLCBfanN4KE1lc3NhZ2UsIHsgY2hpbGRyZW46IHRpdGxlTWVzc2FnZSB9KV0gfSksIGNoaWxkcmVuXSB9KSk7XG59XG4iXX0=*/"],"names":[".sxa9zrc",".s14430wa",".ct87ghk",".avili0h",".ug152ch",".ua13n1c",".h1q5v5ee",".u3qxofx",".u1q7a48k",".c1wxx7eu",".c1rgwbep",".v1mdmbaj",".p1gwkvxy",".s1bwlafs",".i196z9y5",".d1dfo5ow",".if3lze",".i9kxf50",".igjr3uc",".mhb9if7",".mxaof7s",".mw50s5v",".m11rzvjw",".m1jcdsjv",".czoccom",".c1p032ba",".a1h8m4fo",".tyndzxk",".m1m9sbk4",".mg5o421"],"sourceRoot":""} \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/elementor.js b/wp/wp-content/plugins/leadin/build/elementor.js deleted file mode 100644 index 48c51a14..00000000 --- a/wp/wp-content/plugins/leadin/build/elementor.js +++ /dev/null @@ -1,8992 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js": -/*!*******************************************************************!*\ - !*** ./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -function memoize(fn) { - var cache = Object.create(null); - return function (arg) { - if (cache[arg] === undefined) cache[arg] = fn(arg); - return cache[arg]; - }; -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (memoize); - - -/***/ }), - -/***/ "./node_modules/@linaria/react/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js": -/*!***********************************************************************************************************!*\ - !*** ./node_modules/@linaria/react/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js ***! - \***********************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _emotion_memoize__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @emotion/memoize */ "./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js"); - - -var reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23 - -var isPropValid = /* #__PURE__ */(0,_emotion_memoize__WEBPACK_IMPORTED_MODULE_0__["default"])(function (prop) { - return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111 - /* o */ - && prop.charCodeAt(1) === 110 - /* n */ - && prop.charCodeAt(2) < 91; -} -/* Z+1 */ -); - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (isPropValid); - - -/***/ }), - -/***/ "./scripts/constants/defaultFormOptions.ts": -/*!*************************************************!*\ - !*** ./scripts/constants/defaultFormOptions.ts ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "DEFAULT_OPTIONS": () => (/* binding */ DEFAULT_OPTIONS), -/* harmony export */ "isDefaultForm": () => (/* binding */ isDefaultForm) -/* harmony export */ }); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__); - -var REGISTRATION_FORM = 'REGISTRATION_FORM'; -var CONTACT_US_FORM = 'CONTACT_US_FORM'; -var NEWSLETTER_FORM = 'NEWSLETTER_FORM'; -var SUPPORT_FORM = 'SUPPORT_FORM'; -var EVENT_FORM = 'EVENT_FORM'; -var DEFAULT_OPTIONS = { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('Templates', 'leadin'), - options: [{ - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('Registration Form', 'leadin'), - value: REGISTRATION_FORM - }, { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('Contact us Form', 'leadin'), - value: CONTACT_US_FORM - }, { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('Newsletter sign-up Form', 'leadin'), - value: NEWSLETTER_FORM - }, { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('Support Form', 'leadin'), - value: SUPPORT_FORM - }, { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('Event Registration Form', 'leadin'), - value: EVENT_FORM - }] -}; -function isDefaultForm(value) { - return value === REGISTRATION_FORM || value === CONTACT_US_FORM || value === NEWSLETTER_FORM || value === SUPPORT_FORM || value === EVENT_FORM; -} - -/***/ }), - -/***/ "./scripts/constants/leadinConfig.ts": -/*!*******************************************!*\ - !*** ./scripts/constants/leadinConfig.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "accountName": () => (/* binding */ accountName), -/* harmony export */ "activationTime": () => (/* binding */ activationTime), -/* harmony export */ "adminUrl": () => (/* binding */ adminUrl), -/* harmony export */ "connectionStatus": () => (/* binding */ connectionStatus), -/* harmony export */ "contentEmbed": () => (/* binding */ contentEmbed), -/* harmony export */ "deviceId": () => (/* binding */ deviceId), -/* harmony export */ "didDisconnect": () => (/* binding */ didDisconnect), -/* harmony export */ "env": () => (/* binding */ env), -/* harmony export */ "formsScript": () => (/* binding */ formsScript), -/* harmony export */ "formsScriptPayload": () => (/* binding */ formsScriptPayload), -/* harmony export */ "hublet": () => (/* binding */ hublet), -/* harmony export */ "hubspotBaseUrl": () => (/* binding */ hubspotBaseUrl), -/* harmony export */ "hubspotNonce": () => (/* binding */ hubspotNonce), -/* harmony export */ "iframeUrl": () => (/* binding */ iframeUrl), -/* harmony export */ "impactLink": () => (/* binding */ impactLink), -/* harmony export */ "lastAuthorizeTime": () => (/* binding */ lastAuthorizeTime), -/* harmony export */ "lastDeauthorizeTime": () => (/* binding */ lastDeauthorizeTime), -/* harmony export */ "lastDisconnectTime": () => (/* binding */ lastDisconnectTime), -/* harmony export */ "leadinPluginVersion": () => (/* binding */ leadinPluginVersion), -/* harmony export */ "leadinQueryParams": () => (/* binding */ leadinQueryParams), -/* harmony export */ "locale": () => (/* binding */ locale), -/* harmony export */ "loginUrl": () => (/* binding */ loginUrl), -/* harmony export */ "meetingsScript": () => (/* binding */ meetingsScript), -/* harmony export */ "phpVersion": () => (/* binding */ phpVersion), -/* harmony export */ "pluginPath": () => (/* binding */ pluginPath), -/* harmony export */ "plugins": () => (/* binding */ plugins), -/* harmony export */ "portalDomain": () => (/* binding */ portalDomain), -/* harmony export */ "portalEmail": () => (/* binding */ portalEmail), -/* harmony export */ "portalId": () => (/* binding */ portalId), -/* harmony export */ "redirectNonce": () => (/* binding */ redirectNonce), -/* harmony export */ "refreshToken": () => (/* binding */ refreshToken), -/* harmony export */ "refreshTokenError": () => (/* binding */ refreshTokenError), -/* harmony export */ "requiresContentEmbedScope": () => (/* binding */ requiresContentEmbedScope), -/* harmony export */ "restNonce": () => (/* binding */ restNonce), -/* harmony export */ "restUrl": () => (/* binding */ restUrl), -/* harmony export */ "reviewSkippedDate": () => (/* binding */ reviewSkippedDate), -/* harmony export */ "theme": () => (/* binding */ theme), -/* harmony export */ "trackConsent": () => (/* binding */ trackConsent), -/* harmony export */ "wpVersion": () => (/* binding */ wpVersion) -/* harmony export */ }); -var _window$leadinConfig = window.leadinConfig, - accountName = _window$leadinConfig.accountName, - adminUrl = _window$leadinConfig.adminUrl, - activationTime = _window$leadinConfig.activationTime, - connectionStatus = _window$leadinConfig.connectionStatus, - deviceId = _window$leadinConfig.deviceId, - didDisconnect = _window$leadinConfig.didDisconnect, - env = _window$leadinConfig.env, - formsScript = _window$leadinConfig.formsScript, - meetingsScript = _window$leadinConfig.meetingsScript, - formsScriptPayload = _window$leadinConfig.formsScriptPayload, - hublet = _window$leadinConfig.hublet, - hubspotBaseUrl = _window$leadinConfig.hubspotBaseUrl, - hubspotNonce = _window$leadinConfig.hubspotNonce, - iframeUrl = _window$leadinConfig.iframeUrl, - impactLink = _window$leadinConfig.impactLink, - lastAuthorizeTime = _window$leadinConfig.lastAuthorizeTime, - lastDeauthorizeTime = _window$leadinConfig.lastDeauthorizeTime, - lastDisconnectTime = _window$leadinConfig.lastDisconnectTime, - leadinPluginVersion = _window$leadinConfig.leadinPluginVersion, - leadinQueryParams = _window$leadinConfig.leadinQueryParams, - locale = _window$leadinConfig.locale, - loginUrl = _window$leadinConfig.loginUrl, - phpVersion = _window$leadinConfig.phpVersion, - pluginPath = _window$leadinConfig.pluginPath, - plugins = _window$leadinConfig.plugins, - portalDomain = _window$leadinConfig.portalDomain, - portalEmail = _window$leadinConfig.portalEmail, - portalId = _window$leadinConfig.portalId, - redirectNonce = _window$leadinConfig.redirectNonce, - restNonce = _window$leadinConfig.restNonce, - restUrl = _window$leadinConfig.restUrl, - refreshToken = _window$leadinConfig.refreshToken, - reviewSkippedDate = _window$leadinConfig.reviewSkippedDate, - theme = _window$leadinConfig.theme, - trackConsent = _window$leadinConfig.trackConsent, - wpVersion = _window$leadinConfig.wpVersion, - contentEmbed = _window$leadinConfig.contentEmbed, - requiresContentEmbedScope = _window$leadinConfig.requiresContentEmbedScope, - refreshTokenError = _window$leadinConfig.refreshTokenError; - - -/***/ }), - -/***/ "./scripts/elementor/Common/ConnectPluginBanner.tsx": -/*!**********************************************************!*\ - !*** ./scripts/elementor/Common/ConnectPluginBanner.tsx ***! - \**********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ ConnectPluginBanner) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _ElementorBanner__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ElementorBanner */ "./scripts/elementor/Common/ElementorBanner.tsx"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__); - - - -function ConnectPluginBanner() { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ElementorBanner__WEBPACK_IMPORTED_MODULE_1__["default"], { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("b", { - dangerouslySetInnerHTML: { - __html: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s').replace('%1$s', '').replace('%2$s', '') - } - }) - }); -} - -/***/ }), - -/***/ "./scripts/elementor/Common/ElementorBanner.tsx": -/*!******************************************************!*\ - !*** ./scripts/elementor/Common/ElementorBanner.tsx ***! - \******************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ ElementorBanner) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); - -function ElementorBanner(_ref) { - var _ref$type = _ref.type, - type = _ref$type === void 0 ? 'warning' : _ref$type, - children = _ref.children; - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { - className: "elementor-control-content", - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { - className: "elementor-control-raw-html elementor-panel-alert elementor-panel-alert-".concat(type), - children: children - }) - }); -} - -/***/ }), - -/***/ "./scripts/elementor/Common/ElementorButton.tsx": -/*!******************************************************!*\ - !*** ./scripts/elementor/Common/ElementorButton.tsx ***! - \******************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ ElementorButton) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); -var _excluded = ["children"]; - -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } - -function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } - - - -var Container = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_1__.styled)('div')({ - name: "Container", - "class": "czoccom", - propsAsIs: false -}); -function ElementorButton(_ref) { - var children = _ref.children, - params = _objectWithoutProperties(_ref, _excluded); - - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Container, { - className: "elementor-button-wrapper", - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("button", _objectSpread(_objectSpread({ - className: "elementor-button elementor-button-default", - type: "button" - }, params), {}, { - children: children - })) - }); -} - -__webpack_require__(/*! ./ElementorButton.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./ElementorButton.tsx */ "./scripts/elementor/Common/ElementorButton.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/elementor/Common/ElementorButton.tsx"); - -/***/ }), - -/***/ "./scripts/elementor/FormWidget/ElementorFormSelect.tsx": -/*!**************************************************************!*\ - !*** ./scripts/elementor/FormWidget/ElementorFormSelect.tsx ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ ElementorFormSelectContainer) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _Common_ElementorBanner__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Common/ElementorBanner */ "./scripts/elementor/Common/ElementorBanner.tsx"); -/* harmony import */ var _shared_UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../shared/UIComponents/UISpinner */ "./scripts/shared/UIComponents/UISpinner.tsx"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _hooks_useForms__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hooks/useForms */ "./scripts/elementor/FormWidget/hooks/useForms.ts"); -/* harmony import */ var _utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../utils/backgroundAppUtils */ "./scripts/utils/backgroundAppUtils.ts"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - - - - - - - - - - -function ElementorFormSelect(_ref) { - var formId = _ref.formId, - setAttributes = _ref.setAttributes; - - var _useForms = (0,_hooks_useForms__WEBPACK_IMPORTED_MODULE_7__["default"])(), - hasError = _useForms.hasError, - forms = _useForms.forms, - loading = _useForms.loading; - - return loading ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_shared_UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_4__["default"], {}) - }) : hasError ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_ElementorBanner__WEBPACK_IMPORTED_MODULE_3__["default"], { - type: "danger", - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('Please refresh your forms or try again in a few minutes', 'leadin') - }) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("select", { - value: formId, - onChange: function onChange(event) { - var selectedForm = forms.find(function (form) { - return form.value === event.target.value; - }); - - if (selectedForm) { - setAttributes({ - portalId: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.portalId, - formId: selectedForm.value, - formName: selectedForm.label - }); - } - }, - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option", { - value: "", - disabled: true, - selected: true, - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('Search for a form', 'leadin') - }), forms.map(function (form) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option", { - value: form.value, - children: form.label - }, form.value); - })] - }); -} - -function ElementorFormSelectWrapper(props) { - var isBackgroundAppReady = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__.useBackgroundAppContext)(); - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: !isBackgroundAppReady ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_shared_UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_4__["default"], {}) - }) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ElementorFormSelect, _objectSpread({}, props)) - }); -} - -function ElementorFormSelectContainer(props) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__.BackgroudAppContext.Provider, { - value: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.refreshToken && (0,_utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_8__.getOrCreateBackgroundApp)(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.refreshToken), - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ElementorFormSelectWrapper, _objectSpread({}, props)) - }); -} - -/***/ }), - -/***/ "./scripts/elementor/FormWidget/FormControlController.tsx": -/*!****************************************************************!*\ - !*** ./scripts/elementor/FormWidget/FormControlController.tsx ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FormControlController) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _Common_ConnectPluginBanner__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Common/ConnectPluginBanner */ "./scripts/elementor/Common/ConnectPluginBanner.tsx"); -/* harmony import */ var _ElementorFormSelect__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ElementorFormSelect */ "./scripts/elementor/FormWidget/ElementorFormSelect.tsx"); - - - - - -var ConnectionStatus = { - Connected: 'Connected', - NotConnected: 'NotConnected' -}; -function FormControlController(attributes, setValue) { - return function () { - var render = function render() { - if (_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.connectionStatus === ConnectionStatus.Connected) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ElementorFormSelect__WEBPACK_IMPORTED_MODULE_4__["default"], { - formId: attributes.formId, - setAttributes: setValue - }); - } else { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_ConnectPluginBanner__WEBPACK_IMPORTED_MODULE_3__["default"], {}); - } - }; - - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: render() - }); - }; -} - -/***/ }), - -/***/ "./scripts/elementor/FormWidget/FormWidgetController.tsx": -/*!***************************************************************!*\ - !*** ./scripts/elementor/FormWidget/FormWidgetController.tsx ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FormWidgetController) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _shared_Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../shared/Common/ErrorHandler */ "./scripts/shared/Common/ErrorHandler.tsx"); -/* harmony import */ var _shared_Form_FormEdit__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../shared/Form/FormEdit */ "./scripts/shared/Form/FormEdit.tsx"); -/* harmony import */ var _shared_enums_connectionStatus__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../shared/enums/connectionStatus */ "./scripts/shared/enums/connectionStatus.ts"); - - - - - - -function FormWidgetController(attributes, setValue) { - return function () { - var render = function render() { - if (_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.connectionStatus === _shared_enums_connectionStatus__WEBPACK_IMPORTED_MODULE_5__["default"].Connected) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_shared_Form_FormEdit__WEBPACK_IMPORTED_MODULE_4__["default"], { - attributes: attributes, - isSelected: true, - setAttributes: setValue, - preview: false, - origin: "elementor" - }); - } else { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_shared_Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_3__["default"], { - status: 401 - }); - } - }; - - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: render() - }); - }; -} - -/***/ }), - -/***/ "./scripts/elementor/FormWidget/hooks/useForms.ts": -/*!********************************************************!*\ - !*** ./scripts/elementor/FormWidget/hooks/useForms.ts ***! - \********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useForms) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _shared_enums_loadState__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../shared/enums/loadState */ "./scripts/shared/enums/loadState.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - -function useForms() { - var proxy = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_3__.usePostAsyncBackgroundMessage)(); - - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(_shared_enums_loadState__WEBPACK_IMPORTED_MODULE_1__["default"].NotLoaded), - _useState2 = _slicedToArray(_useState, 2), - loadState = _useState2[0], - setLoadState = _useState2[1]; - - var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), - _useState4 = _slicedToArray(_useState3, 2), - hasError = _useState4[0], - setError = _useState4[1]; - - var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), - _useState6 = _slicedToArray(_useState5, 2), - forms = _useState6[0], - setForms = _useState6[1]; - - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { - if (loadState === _shared_enums_loadState__WEBPACK_IMPORTED_MODULE_1__["default"].NotLoaded) { - proxy({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_2__.ProxyMessages.FetchForms, - payload: { - search: '' - } - }).then(function (data) { - setForms(data.map(function (form) { - return { - label: form.name, - value: form.guid - }; - })); - setLoadState(_shared_enums_loadState__WEBPACK_IMPORTED_MODULE_1__["default"].Loaded); - })["catch"](function (error) { - setError(error); - setLoadState(_shared_enums_loadState__WEBPACK_IMPORTED_MODULE_1__["default"].Failed); - }); - } - }, [loadState]); - return { - forms: forms, - loading: loadState === _shared_enums_loadState__WEBPACK_IMPORTED_MODULE_1__["default"].Loading, - hasError: hasError - }; -} - -/***/ }), - -/***/ "./scripts/elementor/FormWidget/registerFormWidget.ts": -/*!************************************************************!*\ - !*** ./scripts/elementor/FormWidget/registerFormWidget.ts ***! - \************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ registerFormWidget) -/* harmony export */ }); -/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-dom */ "react-dom"); -/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _FormControlController__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FormControlController */ "./scripts/elementor/FormWidget/FormControlController.tsx"); -/* harmony import */ var _FormWidgetController__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FormWidgetController */ "./scripts/elementor/FormWidget/FormWidgetController.tsx"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - - - - -var registerFormWidget = /*#__PURE__*/function () { - function registerFormWidget(controlContainer, widgetContainer, setValue) { - _classCallCheck(this, registerFormWidget); - - _defineProperty(this, "widgetContainer", void 0); - - _defineProperty(this, "attributes", void 0); - - _defineProperty(this, "controlContainer", void 0); - - _defineProperty(this, "setValue", void 0); - - var attributes = widgetContainer.dataset.attributes ? JSON.parse(widgetContainer.dataset.attributes) : {}; - this.widgetContainer = widgetContainer; - this.controlContainer = controlContainer; - this.setValue = setValue; - this.attributes = attributes; - } - - _createClass(registerFormWidget, [{ - key: "render", - value: function render() { - react_dom__WEBPACK_IMPORTED_MODULE_0___default().render((0,_FormWidgetController__WEBPACK_IMPORTED_MODULE_2__["default"])(this.attributes, this.setValue)(), this.widgetContainer); - react_dom__WEBPACK_IMPORTED_MODULE_0___default().render((0,_FormControlController__WEBPACK_IMPORTED_MODULE_1__["default"])(this.attributes, this.setValue)(), this.controlContainer); - } - }, { - key: "done", - value: function done() { - react_dom__WEBPACK_IMPORTED_MODULE_0___default().unmountComponentAtNode(this.widgetContainer); - react_dom__WEBPACK_IMPORTED_MODULE_0___default().unmountComponentAtNode(this.controlContainer); - } - }]); - - return registerFormWidget; -}(); - - - -/***/ }), - -/***/ "./scripts/elementor/MeetingWidget/ElementorMeetingSelect.tsx": -/*!********************************************************************!*\ - !*** ./scripts/elementor/MeetingWidget/ElementorMeetingSelect.tsx ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ ElementorMeetingsSelectContainer) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _Common_ElementorBanner__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Common/ElementorBanner */ "./scripts/elementor/Common/ElementorBanner.tsx"); -/* harmony import */ var _shared_UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../shared/UIComponents/UISpinner */ "./scripts/shared/UIComponents/UISpinner.tsx"); -/* harmony import */ var _ElementorMeetingWarning__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ElementorMeetingWarning */ "./scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx"); -/* harmony import */ var _shared_Meeting_hooks_useMeetings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../shared/Meeting/hooks/useMeetings */ "./scripts/shared/Meeting/hooks/useMeetings.ts"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_6__); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! raven-js */ "./node_modules/raven-js/src/singleton.js"); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(raven_js__WEBPACK_IMPORTED_MODULE_7__); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../utils/backgroundAppUtils */ "./scripts/utils/backgroundAppUtils.ts"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - - - - - - - - - -function ElementorMeetingSelect(_ref) { - var url = _ref.url, - setAttributes = _ref.setAttributes; - - var _useMeetings = (0,_shared_Meeting_hooks_useMeetings__WEBPACK_IMPORTED_MODULE_5__["default"])(), - meetings = _useMeetings.mappedMeetings, - loading = _useMeetings.loading, - error = _useMeetings.error, - reload = _useMeetings.reload, - connectCalendar = _useMeetings.connectCalendar; - - var selectedMeetingCalendar = (0,_shared_Meeting_hooks_useMeetings__WEBPACK_IMPORTED_MODULE_5__.useSelectedMeetingCalendar)(url); - - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(url), - _useState2 = _slicedToArray(_useState, 2), - localUrl = _useState2[0], - setLocalUrl = _useState2[1]; - - var handleConnectCalendar = function handleConnectCalendar() { - return connectCalendar().then(function () { - reload(); - })["catch"](function (error) { - raven_js__WEBPACK_IMPORTED_MODULE_7___default().captureMessage('Unable to connect calendar', { - extra: { - error: error - } - }); - }); - }; - - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: loading ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_shared_UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_3__["default"], {}) - }) : error ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_ElementorBanner__WEBPACK_IMPORTED_MODULE_2__["default"], { - type: "danger", - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_6__.__)('Please refresh your meetings or try again in a few minutes', 'leadin') - }) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: [selectedMeetingCalendar && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ElementorMeetingWarning__WEBPACK_IMPORTED_MODULE_4__["default"], { - status: selectedMeetingCalendar, - onConnectCalendar: connectCalendar - }), meetings.length > 1 && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("select", { - value: localUrl, - onChange: function onChange(event) { - var newUrl = event.target.value; - setLocalUrl(newUrl); - setAttributes({ - url: newUrl - }); - }, - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option", { - value: "", - disabled: true, - selected: true, - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_6__.__)('Select a meeting', 'leadin') - }), meetings.map(function (item) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option", { - value: item.value, - children: item.label - }, item.value); - })] - })] - }) - }); -} - -function ElementorMeetingSelectWrapper(props) { - var isBackgroundAppReady = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_8__.useBackgroundAppContext)(); - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: !isBackgroundAppReady ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_shared_UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_3__["default"], {}) - }) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ElementorMeetingSelect, _objectSpread({}, props)) - }); -} - -function ElementorMeetingsSelectContainer(props) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_8__.BackgroudAppContext.Provider, { - value: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_9__.refreshToken && (0,_utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_10__.getOrCreateBackgroundApp)(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_9__.refreshToken), - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ElementorMeetingSelectWrapper, _objectSpread({}, props)) - }); -} - -/***/ }), - -/***/ "./scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx": -/*!*********************************************************************!*\ - !*** ./scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ MeetingWarning) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _shared_Meeting_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../shared/Meeting/constants */ "./scripts/shared/Meeting/constants.ts"); -/* harmony import */ var _Common_ElementorButton__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Common/ElementorButton */ "./scripts/elementor/Common/ElementorButton.tsx"); -/* harmony import */ var _Common_ElementorBanner__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Common/ElementorBanner */ "./scripts/elementor/Common/ElementorBanner.tsx"); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__); - - - - - - - -var Container = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_6__.styled)('div')({ - name: "Container", - "class": "c1p032ba", - propsAsIs: false -}); -function MeetingWarning(_ref) { - var onConnectCalendar = _ref.onConnectCalendar, - status = _ref.status; - var isMeetingOwner = status === _shared_Meeting_constants__WEBPACK_IMPORTED_MODULE_2__.CURRENT_USER_CALENDAR_MISSING; - var titleText = isMeetingOwner ? (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('Your calendar is not connected', 'leadin') : (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('Calendar is not connected', 'leadin'); - var titleMessage = isMeetingOwner ? (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('Please connect your calendar to activate your scheduling pages', 'leadin') : (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('Make sure that everybody in this meeting has connected their calendar from the Meetings page in HubSpot', 'leadin'); - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Container, { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_Common_ElementorBanner__WEBPACK_IMPORTED_MODULE_4__["default"], { - type: "warning", - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("b", { - children: titleText - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("br", {}), titleMessage] - }) - }), isMeetingOwner && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_ElementorButton__WEBPACK_IMPORTED_MODULE_3__["default"], { - id: "meetings-connect-calendar", - onClick: onConnectCalendar, - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('Connect calendar', 'leadin') - })] - }); -} - -__webpack_require__(/*! ./ElementorMeetingWarning.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./ElementorMeetingWarning.tsx */ "./scripts/elementor/MeetingWidget/ElementorMeetingWarning.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx"); - -/***/ }), - -/***/ "./scripts/elementor/MeetingWidget/MeetingControlController.tsx": -/*!**********************************************************************!*\ - !*** ./scripts/elementor/MeetingWidget/MeetingControlController.tsx ***! - \**********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ MeetingControlController) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _Common_ConnectPluginBanner__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Common/ConnectPluginBanner */ "./scripts/elementor/Common/ConnectPluginBanner.tsx"); -/* harmony import */ var _ElementorMeetingSelect__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ElementorMeetingSelect */ "./scripts/elementor/MeetingWidget/ElementorMeetingSelect.tsx"); - - - - - -var ConnectionStatus = { - Connected: 'Connected', - NotConnected: 'NotConnected' -}; -function MeetingControlController(attributes, setValue) { - return function () { - var render = function render() { - if (_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.connectionStatus === ConnectionStatus.Connected) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ElementorMeetingSelect__WEBPACK_IMPORTED_MODULE_4__["default"], { - url: attributes.url, - setAttributes: setValue - }); - } else { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_ConnectPluginBanner__WEBPACK_IMPORTED_MODULE_3__["default"], {}); - } - }; - - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: render() - }); - }; -} - -/***/ }), - -/***/ "./scripts/elementor/MeetingWidget/MeetingWidgetController.tsx": -/*!*********************************************************************!*\ - !*** ./scripts/elementor/MeetingWidget/MeetingWidgetController.tsx ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ MeetingWidgetController) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _shared_Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../shared/Common/ErrorHandler */ "./scripts/shared/Common/ErrorHandler.tsx"); -/* harmony import */ var _shared_Meeting_MeetingEdit__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../shared/Meeting/MeetingEdit */ "./scripts/shared/Meeting/MeetingEdit.tsx"); - - - - - -var ConnectionStatus = { - Connected: 'Connected', - NotConnected: 'NotConnected' -}; -function MeetingWidgetController(attributes, setValue) { - return function () { - var render = function render() { - if (_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.connectionStatus === ConnectionStatus.Connected) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_shared_Meeting_MeetingEdit__WEBPACK_IMPORTED_MODULE_4__["default"], { - attributes: attributes, - isSelected: true, - setAttributes: setValue, - preview: false, - origin: "elementor" - }); - } else { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_shared_Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_3__["default"], { - status: 401 - }); - } - }; - - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: render() - }); - }; -} - -/***/ }), - -/***/ "./scripts/elementor/MeetingWidget/registerMeetingWidget.ts": -/*!******************************************************************!*\ - !*** ./scripts/elementor/MeetingWidget/registerMeetingWidget.ts ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ registerMeetingsWidget) -/* harmony export */ }); -/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-dom */ "react-dom"); -/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _MeetingControlController__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./MeetingControlController */ "./scripts/elementor/MeetingWidget/MeetingControlController.tsx"); -/* harmony import */ var _MeetingWidgetController__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MeetingWidgetController */ "./scripts/elementor/MeetingWidget/MeetingWidgetController.tsx"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - - - - -var registerMeetingsWidget = /*#__PURE__*/function () { - function registerMeetingsWidget(controlContainer, widgetContainer, setValue) { - _classCallCheck(this, registerMeetingsWidget); - - _defineProperty(this, "widgetContainer", void 0); - - _defineProperty(this, "controlContainer", void 0); - - _defineProperty(this, "setValue", void 0); - - _defineProperty(this, "attributes", void 0); - - var attributes = widgetContainer.dataset.attributes ? JSON.parse(widgetContainer.dataset.attributes) : {}; - this.widgetContainer = widgetContainer; - this.controlContainer = controlContainer; - this.setValue = setValue; - this.attributes = attributes; - } - - _createClass(registerMeetingsWidget, [{ - key: "render", - value: function render() { - react_dom__WEBPACK_IMPORTED_MODULE_0___default().render((0,_MeetingWidgetController__WEBPACK_IMPORTED_MODULE_2__["default"])(this.attributes, this.setValue)(), this.widgetContainer); - react_dom__WEBPACK_IMPORTED_MODULE_0___default().render((0,_MeetingControlController__WEBPACK_IMPORTED_MODULE_1__["default"])(this.attributes, this.setValue)(), this.controlContainer); - } - }, { - key: "done", - value: function done() { - react_dom__WEBPACK_IMPORTED_MODULE_0___default().unmountComponentAtNode(this.widgetContainer); - react_dom__WEBPACK_IMPORTED_MODULE_0___default().unmountComponentAtNode(this.controlContainer); - } - }]); - - return registerMeetingsWidget; -}(); - - - -/***/ }), - -/***/ "./scripts/elementor/elementorWidget.ts": -/*!**********************************************!*\ - !*** ./scripts/elementor/elementorWidget.ts ***! - \**********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ elementorWidget) -/* harmony export */ }); -function elementorWidget(elementor, options, callback) { - var done = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () {}; - return elementor.modules.controls.BaseData.extend({ - onReady: function onReady() { - var self = this; - var controlContainer = this.ui.contentEditable.prevObject[0].querySelector(options.controlSelector); - var widgetContainer = this.options.element.$el[0].querySelector(options.containerSelector); - - if (widgetContainer) { - callback(controlContainer, widgetContainer, function (args) { - return self.setValue(args); - }); - } else { - //@ts-expect-error global - window.elementorFrontend.hooks.addAction("frontend/element_ready/".concat(options.widgetName, ".default"), function (element) { - widgetContainer = element[0].querySelector(options.containerSelector); - callback(controlContainer, widgetContainer, function (args) { - return self.setValue(args); - }); - }); - } - }, - saveValue: function saveValue(props) { - this.setValue(props); - }, - onBeforeDestroy: function onBeforeDestroy() { - //@ts-expect-error global - window.elementorFrontend.hooks.removeAction("frontend/element_ready/".concat(options.widgetName, ".default")); - done(); - } - }); -} - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/core/CoreMessages.ts": -/*!****************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/core/CoreMessages.ts ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CoreMessages": () => (/* binding */ CoreMessages) -/* harmony export */ }); -var CoreMessages = { - HandshakeReceive: 'INTEGRATED_APP_EMBEDDER_HANDSHAKE_RECEIVED', - SendRefreshToken: 'INTEGRATED_APP_EMBEDDER_SEND_REFRESH_TOKEN', - ReloadParentFrame: 'INTEGRATED_APP_EMBEDDER_RELOAD_PARENT_FRAME', - RedirectParentFrame: 'INTEGRATED_APP_EMBEDDER_REDIRECT_PARENT_FRAME', - SendLocale: 'INTEGRATED_APP_EMBEDDER_SEND_LOCALE', - SendDeviceId: 'INTEGRATED_APP_EMBEDDER_SEND_DEVICE_ID', - SendIntegratedAppConfig: 'INTEGRATED_APP_EMBEDDER_CONFIG' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/forms/FormsMessages.ts": -/*!******************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/forms/FormsMessages.ts ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "FormMessages": () => (/* binding */ FormMessages) -/* harmony export */ }); -var FormMessages = { - CreateFormAppNavigation: 'CREATE_FORM_APP_NAVIGATION' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/index.ts": -/*!****************************************************!*\ - !*** ./scripts/iframe/integratedMessages/index.ts ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CoreMessages": () => (/* reexport safe */ _core_CoreMessages__WEBPACK_IMPORTED_MODULE_0__.CoreMessages), -/* harmony export */ "FormMessages": () => (/* reexport safe */ _forms_FormsMessages__WEBPACK_IMPORTED_MODULE_1__.FormMessages), -/* harmony export */ "LiveChatMessages": () => (/* reexport safe */ _livechat_LiveChatMessages__WEBPACK_IMPORTED_MODULE_2__.LiveChatMessages), -/* harmony export */ "PluginMessages": () => (/* reexport safe */ _plugin_PluginMessages__WEBPACK_IMPORTED_MODULE_3__.PluginMessages), -/* harmony export */ "ProxyMessages": () => (/* reexport safe */ _proxy_ProxyMessages__WEBPACK_IMPORTED_MODULE_4__.ProxyMessages) -/* harmony export */ }); -/* harmony import */ var _core_CoreMessages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/CoreMessages */ "./scripts/iframe/integratedMessages/core/CoreMessages.ts"); -/* harmony import */ var _forms_FormsMessages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./forms/FormsMessages */ "./scripts/iframe/integratedMessages/forms/FormsMessages.ts"); -/* harmony import */ var _livechat_LiveChatMessages__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./livechat/LiveChatMessages */ "./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts"); -/* harmony import */ var _plugin_PluginMessages__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./plugin/PluginMessages */ "./scripts/iframe/integratedMessages/plugin/PluginMessages.ts"); -/* harmony import */ var _proxy_ProxyMessages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./proxy/ProxyMessages */ "./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts"); - - - - - - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts": -/*!************************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "LiveChatMessages": () => (/* binding */ LiveChatMessages) -/* harmony export */ }); -var LiveChatMessages = { - CreateLiveChatAppNavigation: 'CREATE_LIVE_CHAT_APP_NAVIGATION' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/plugin/PluginMessages.ts": -/*!********************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/plugin/PluginMessages.ts ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "PluginMessages": () => (/* binding */ PluginMessages) -/* harmony export */ }); -var PluginMessages = { - PluginSettingsNavigation: 'PLUGIN_SETTINGS_NAVIGATION', - PluginLeadinConfig: 'PLUGIN_LEADIN_CONFIG', - TrackConsent: 'INTEGRATED_APP_EMBEDDER_TRACK_CONSENT', - InternalTrackingFetchRequest: 'INTEGRATED_TRACKING_FETCH_REQUEST', - InternalTrackingFetchResponse: 'INTEGRATED_TRACKING_FETCH_RESPONSE', - InternalTrackingFetchError: 'INTEGRATED_TRACKING_FETCH_ERROR', - InternalTrackingChangeRequest: 'INTEGRATED_TRACKING_CHANGE_REQUEST', - InternalTrackingChangeError: 'INTEGRATED_TRACKING_CHANGE_ERROR', - BusinessUnitFetchRequest: 'BUSINESS_UNIT_FETCH_REQUEST', - BusinessUnitFetchResponse: 'BUSINESS_UNIT_FETCH_FETCH_RESPONSE', - BusinessUnitFetchError: 'BUSINESS_UNIT_FETCH_FETCH_ERROR', - BusinessUnitChangeRequest: 'BUSINESS_UNIT_CHANGE_REQUEST', - BusinessUnitChangeError: 'BUSINESS_UNIT_CHANGE_ERROR', - SkipReviewRequest: 'SKIP_REVIEW_REQUEST', - SkipReviewResponse: 'SKIP_REVIEW_RESPONSE', - SkipReviewError: 'SKIP_REVIEW_ERROR', - RemoveParentQueryParam: 'REMOVE_PARENT_QUERY_PARAM', - ContentEmbedInstallRequest: 'CONTENT_EMBED_INSTALL_REQUEST', - ContentEmbedInstallResponse: 'CONTENT_EMBED_INSTALL_RESPONSE', - ContentEmbedInstallError: 'CONTENT_EMBED_INSTALL_ERROR', - ContentEmbedActivationRequest: 'CONTENT_EMBED_ACTIVATION_REQUEST', - ContentEmbedActivationResponse: 'CONTENT_EMBED_ACTIVATION_RESPONSE', - ContentEmbedActivationError: 'CONTENT_EMBED_ACTIVATION_ERROR' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts": -/*!******************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ProxyMessages": () => (/* binding */ ProxyMessages) -/* harmony export */ }); -var ProxyMessages = { - FetchForms: 'FETCH_FORMS', - FetchForm: 'FETCH_FORM', - CreateFormFromTemplate: 'CREATE_FORM_FROM_TEMPLATE', - FetchAuth: 'FETCH_AUTH', - FetchMeetingsAndUsers: 'FETCH_MEETINGS_AND_USERS', - FetchContactsCreateSinceActivation: 'FETCH_CONTACTS_CREATED_SINCE_ACTIVATION', - FetchOrCreateMeetingUser: 'FETCH_OR_CREATE_MEETING_USER', - ConnectMeetingsCalendar: 'CONNECT_MEETINGS_CALENDAR', - TrackFormPreviewRender: 'TRACK_FORM_PREVIEW_RENDER', - TrackFormCreatedFromTemplate: 'TRACK_FORM_CREATED_FROM_TEMPLATE', - TrackFormCreationFailed: 'TRACK_FORM_CREATION_FAILED', - TrackMeetingPreviewRender: 'TRACK_MEETING_PREVIEW_RENDER', - TrackSidebarMetaChange: 'TRACK_SIDEBAR_META_CHANGE', - TrackReviewBannerRender: 'TRACK_REVIEW_BANNER_RENDER', - TrackReviewBannerInteraction: 'TRACK_REVIEW_BANNER_INTERACTION', - TrackReviewBannerDismissed: 'TRACK_REVIEW_BANNER_DISMISSED', - TrackPluginDeactivation: 'TRACK_PLUGIN_DEACTIVATION' -}; - -/***/ }), - -/***/ "./scripts/iframe/useBackgroundApp.ts": -/*!********************************************!*\ - !*** ./scripts/iframe/useBackgroundApp.ts ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "BackgroudAppContext": () => (/* binding */ BackgroudAppContext), -/* harmony export */ "useBackgroundAppContext": () => (/* binding */ useBackgroundAppContext), -/* harmony export */ "usePostAsyncBackgroundMessage": () => (/* binding */ usePostAsyncBackgroundMessage), -/* harmony export */ "usePostBackgroundMessage": () => (/* binding */ usePostBackgroundMessage) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); - -var BackgroudAppContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(null); -function useBackgroundAppContext() { - return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(BackgroudAppContext); -} -function usePostBackgroundMessage() { - var app = useBackgroundAppContext(); - return function (message) { - app.postMessage(message); - }; -} -function usePostAsyncBackgroundMessage() { - var app = useBackgroundAppContext(); - return function (message) { - return app.postAsyncMessage(message); - }; -} - -/***/ }), - -/***/ "./scripts/lib/Raven.ts": -/*!******************************!*\ - !*** ./scripts/lib/Raven.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "configureRaven": () => (/* binding */ configureRaven), -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! raven-js */ "./node_modules/raven-js/src/singleton.js"); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(raven_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); - - -function configureRaven() { - if (_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.hubspotBaseUrl.indexOf('app.hubspot.com') === -1) { - return; - } - - raven_js__WEBPACK_IMPORTED_MODULE_0___default().config('https://e9b8f382cdd130c0d415cd977d2be56f@exceptions.hubspot.com/1', { - instrument: { - tryCatch: false - }, - release: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.leadinPluginVersion - }).install(); - raven_js__WEBPACK_IMPORTED_MODULE_0___default().setTagsContext({ - v: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.leadinPluginVersion, - php: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.phpVersion, - wordpress: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.wpVersion - }); - raven_js__WEBPACK_IMPORTED_MODULE_0___default().setExtraContext({ - hub: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.portalId, - plugins: Object.keys(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.plugins).map(function (name) { - return "".concat(name, "#").concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.plugins[name]); - }).join(',') - }); -} -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((raven_js__WEBPACK_IMPORTED_MODULE_0___default())); - -/***/ }), - -/***/ "./scripts/shared/Common/AsyncSelect.tsx": -/*!***********************************************!*\ - !*** ./scripts/shared/Common/AsyncSelect.tsx ***! - \***********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ AsyncSelect) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); -/* harmony import */ var _UIComponents_colors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../UIComponents/colors */ "./scripts/shared/UIComponents/colors.ts"); -/* harmony import */ var _UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../UIComponents/UISpinner */ "./scripts/shared/UIComponents/UISpinner.tsx"); -/* harmony import */ var _enums_loadState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../enums/loadState */ "./scripts/shared/enums/loadState.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - - - -var Container = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "Container", - "class": "c1wxx7eu", - propsAsIs: false -}); - -var _exp2 = /*#__PURE__*/function _exp2() { - return function (props) { - return props.focused ? '0' : '1px'; - }; -}; - -var _exp3 = /*#__PURE__*/function _exp3() { - return function (props) { - return props.focused ? "0 0 0 2px ".concat(_UIComponents_colors__WEBPACK_IMPORTED_MODULE_2__.CALYPSO_MEDIUM) : 'none'; - }; -}; - -var ControlContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "ControlContainer", - "class": "c1rgwbep", - propsAsIs: false, - vars: { - "c1rgwbep-0": [_exp2()], - "c1rgwbep-1": [_exp3()] - } -}); -var ValueContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "ValueContainer", - "class": "v1mdmbaj", - propsAsIs: false -}); -var Placeholder = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "Placeholder", - "class": "p1gwkvxy", - propsAsIs: false -}); -var SingleValue = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "SingleValue", - "class": "s1bwlafs", - propsAsIs: false -}); -var IndicatorContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "IndicatorContainer", - "class": "i196z9y5", - propsAsIs: false -}); -var DropdownIndicator = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "DropdownIndicator", - "class": "d1dfo5ow", - propsAsIs: false -}); -var InputContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "InputContainer", - "class": "if3lze", - propsAsIs: false -}); -var Input = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('input')({ - name: "Input", - "class": "i9kxf50", - propsAsIs: false -}); -var InputShadow = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "InputShadow", - "class": "igjr3uc", - propsAsIs: false -}); -var MenuContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "MenuContainer", - "class": "mhb9if7", - propsAsIs: false -}); -var MenuList = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "MenuList", - "class": "mxaof7s", - propsAsIs: false -}); -var MenuGroup = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "MenuGroup", - "class": "mw50s5v", - propsAsIs: false -}); -var MenuGroupHeader = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "MenuGroupHeader", - "class": "m11rzvjw", - propsAsIs: false -}); - -var _exp5 = /*#__PURE__*/function _exp5() { - return function (props) { - return props.selected ? _UIComponents_colors__WEBPACK_IMPORTED_MODULE_2__.CALYPSO_MEDIUM : 'transparent'; - }; -}; - -var _exp6 = /*#__PURE__*/function _exp6() { - return function (props) { - return props.selected ? '#fff' : 'inherit'; - }; -}; - -var _exp7 = /*#__PURE__*/function _exp7() { - return function (props) { - return props.selected ? _UIComponents_colors__WEBPACK_IMPORTED_MODULE_2__.CALYPSO_MEDIUM : _UIComponents_colors__WEBPACK_IMPORTED_MODULE_2__.CALYPSO_LIGHT; - }; -}; - -var MenuItem = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "MenuItem", - "class": "m1jcdsjv", - propsAsIs: false, - vars: { - "m1jcdsjv-0": [_exp5()], - "m1jcdsjv-1": [_exp6()], - "m1jcdsjv-2": [_exp7()] - } -}); -function AsyncSelect(_ref) { - var placeholder = _ref.placeholder, - value = _ref.value, - loadOptions = _ref.loadOptions, - onChange = _ref.onChange, - defaultOptions = _ref.defaultOptions; - var inputEl = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); - var inputShadowEl = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); - - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false), - _useState2 = _slicedToArray(_useState, 2), - isFocused = _useState2[0], - setFocus = _useState2[1]; - - var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(_enums_loadState__WEBPACK_IMPORTED_MODULE_4__["default"].NotLoaded), - _useState4 = _slicedToArray(_useState3, 2), - loadState = _useState4[0], - setLoadState = _useState4[1]; - - var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(''), - _useState6 = _slicedToArray(_useState5, 2), - localValue = _useState6[0], - setLocalValue = _useState6[1]; - - var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(defaultOptions), - _useState8 = _slicedToArray(_useState7, 2), - options = _useState8[0], - setOptions = _useState8[1]; - - var inputSize = "".concat(inputShadowEl.current ? inputShadowEl.current.clientWidth + 10 : 2, "px"); - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - if (loadOptions && loadState === _enums_loadState__WEBPACK_IMPORTED_MODULE_4__["default"].NotLoaded) { - loadOptions('', function (result) { - setOptions(result); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_4__["default"].Idle); - }); - } - }, [loadOptions, loadState]); - - var renderItems = function renderItems() { - var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - var parentKey = arguments.length > 1 ? arguments[1] : undefined; - return items.map(function (item, index) { - if (item.options) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(MenuGroup, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(MenuGroupHeader, { - id: "".concat(index, "-heading"), - children: item.label - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { - children: renderItems(item.options, index) - })] - }, "async-select-item-".concat(index)); - } else { - var key = "async-select-item-".concat(parentKey !== undefined ? "".concat(parentKey, "-").concat(index) : index); - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(MenuItem, { - id: key, - selected: value && item.value === value.value, - onClick: function onClick() { - onChange(item); - setFocus(false); - }, - children: item.label - }, key); - } - }); - }; - - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(Container, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(ControlContainer, { - id: "leadin-async-selector", - focused: isFocused, - onClick: function onClick() { - if (isFocused) { - if (inputEl.current) { - inputEl.current.blur(); - } - - setFocus(false); - setLocalValue(''); - } else { - if (inputEl.current) { - inputEl.current.focus(); - } - - setFocus(true); - } - }, - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(ValueContainer, { - children: [localValue === '' && (!value ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Placeholder, { - children: placeholder - }) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(SingleValue, { - children: value.label - })), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(InputContainer, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Input, { - ref: inputEl, - onFocus: function onFocus() { - setFocus(true); - }, - onChange: function onChange(e) { - setLocalValue(e.target.value); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_4__["default"].Loading); - loadOptions && loadOptions(e.target.value, function (result) { - setOptions(result); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_4__["default"].Idle); - }); - }, - value: localValue, - width: inputSize, - id: "asycn-select-input" - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(InputShadow, { - ref: inputShadowEl, - children: localValue - })] - })] - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(IndicatorContainer, { - children: [loadState === _enums_loadState__WEBPACK_IMPORTED_MODULE_4__["default"].Loading && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_3__["default"], {}), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(DropdownIndicator, {})] - })] - }), isFocused && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(MenuContainer, { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(MenuList, { - children: renderItems(options) - }) - })] - }); -} - -__webpack_require__(/*! ./AsyncSelect.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./AsyncSelect.tsx */ "./scripts/shared/Common/AsyncSelect.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/AsyncSelect.tsx"); - -/***/ }), - -/***/ "./scripts/shared/Common/ErrorHandler.tsx": -/*!************************************************!*\ - !*** ./scripts/shared/Common/ErrorHandler.tsx ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ ErrorHandler) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _UIComponents_UIButton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../UIComponents/UIButton */ "./scripts/shared/UIComponents/UIButton.ts"); -/* harmony import */ var _UIComponents_UIContainer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../UIComponents/UIContainer */ "./scripts/shared/UIComponents/UIContainer.ts"); -/* harmony import */ var _HubspotWrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./HubspotWrapper */ "./scripts/shared/Common/HubspotWrapper.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__); - - - - - - - - -function redirectToPlugin() { - window.location.href = "".concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_4__.adminUrl, "admin.php?page=leadin&leadin_expired=").concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_4__.redirectNonce); -} - -function ErrorHandler(_ref) { - var status = _ref.status, - resetErrorState = _ref.resetErrorState, - _ref$errorInfo = _ref.errorInfo, - errorInfo = _ref$errorInfo === void 0 ? { - header: '', - message: '', - action: '' - } : _ref$errorInfo; - var isUnauthorized = status === 401 || status === 403; - var errorHeader = isUnauthorized ? (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)("Your plugin isn't authorized", 'leadin') : errorInfo.header; - var errorMessage = isUnauthorized ? (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('Reauthorize your plugin to access your free HubSpot tools', 'leadin') : errorInfo.message; - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_HubspotWrapper__WEBPACK_IMPORTED_MODULE_3__["default"], { - pluginPath: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_4__.pluginPath, - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_UIComponents_UIContainer__WEBPACK_IMPORTED_MODULE_2__["default"], { - textAlign: "center", - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h4", { - children: errorHeader - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("b", { - children: errorMessage - }) - }), isUnauthorized ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIButton__WEBPACK_IMPORTED_MODULE_1__["default"], { - "data-test-id": "authorize-button", - onClick: redirectToPlugin, - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('Go to plugin', 'leadin') - }) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIButton__WEBPACK_IMPORTED_MODULE_1__["default"], { - "data-test-id": "retry-button", - onClick: resetErrorState, - children: errorInfo.action - })] - }) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Common/HubspotWrapper.ts": -/*!*************************************************!*\ - !*** ./scripts/shared/Common/HubspotWrapper.ts ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); - - -var _exp = /*#__PURE__*/function _exp() { - return function (props) { - return "url(".concat(props.pluginPath, "/public/assets/images/hubspot.svg)"); - }; -}; - -var _exp2 = /*#__PURE__*/function _exp2() { - return function (props) { - return props.padding || '90px 20% 25px'; - }; -}; - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_0__.styled)('div')({ - name: "HubspotWrapper0", - "class": "h1q5v5ee", - propsAsIs: false, - vars: { - "h1q5v5ee-0": [_exp()], - "h1q5v5ee-1": [_exp2()] - } -})); - -__webpack_require__(/*! ./HubspotWrapper.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./HubspotWrapper.ts */ "./scripts/shared/Common/HubspotWrapper.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/HubspotWrapper.ts"); - -/***/ }), - -/***/ "./scripts/shared/Common/LoadingBlock.tsx": -/*!************************************************!*\ - !*** ./scripts/shared/Common/LoadingBlock.tsx ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ LoadingBlock) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _HubspotWrapper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./HubspotWrapper */ "./scripts/shared/Common/HubspotWrapper.ts"); -/* harmony import */ var _UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../UIComponents/UISpinner */ "./scripts/shared/UIComponents/UISpinner.tsx"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); - - - - -function LoadingBlock() { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_HubspotWrapper__WEBPACK_IMPORTED_MODULE_1__["default"], { - pluginPath: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__.pluginPath, - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_2__["default"], { - size: 50 - }) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Form/FormEdit.tsx": -/*!******************************************!*\ - !*** ./scripts/shared/Form/FormEdit.tsx ***! - \******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FormEditContainer) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _UIComponents_UISpacer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../UIComponents/UISpacer */ "./scripts/shared/UIComponents/UISpacer.ts"); -/* harmony import */ var _PreviewForm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PreviewForm */ "./scripts/shared/Form/PreviewForm.tsx"); -/* harmony import */ var _FormSelect__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FormSelect */ "./scripts/shared/Form/FormSelect.tsx"); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -/* harmony import */ var _Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Common/LoadingBlock */ "./scripts/shared/Common/LoadingBlock.tsx"); -/* harmony import */ var _utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../utils/backgroundAppUtils */ "./scripts/utils/backgroundAppUtils.ts"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - - - - - - - - - - - -function FormEdit(_ref) { - var attributes = _ref.attributes, - isSelected = _ref.isSelected, - setAttributes = _ref.setAttributes, - _ref$preview = _ref.preview, - preview = _ref$preview === void 0 ? true : _ref$preview, - _ref$origin = _ref.origin, - origin = _ref$origin === void 0 ? 'gutenberg' : _ref$origin; - var formId = attributes.formId, - formName = attributes.formName; - var formSelected = _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.portalId && formId; - var isBackgroundAppReady = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__.useBackgroundAppContext)(); - var monitorFormPreviewRender = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__.usePostBackgroundMessage)(); - - var handleChange = function handleChange(selectedForm) { - setAttributes({ - portalId: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.portalId, - formId: selectedForm.value, - formName: selectedForm.label - }); - }; - - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - monitorFormPreviewRender({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_7__.ProxyMessages.TrackFormPreviewRender, - payload: { - origin: origin - } - }); - }, [origin]); - return !isBackgroundAppReady ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_8__["default"], {}) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: [(isSelected || !formSelected) && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_FormSelect__WEBPACK_IMPORTED_MODULE_5__["default"], { - formId: formId, - formName: formName, - handleChange: handleChange, - origin: origin - }), formSelected && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: [isSelected && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UISpacer__WEBPACK_IMPORTED_MODULE_3__["default"], {}), preview && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_PreviewForm__WEBPACK_IMPORTED_MODULE_4__["default"], { - portalId: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.portalId, - formId: formId - })] - })] - }); -} - -function FormEditContainer(props) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__.BackgroudAppContext.Provider, { - value: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.refreshToken && (0,_utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_9__.getOrCreateBackgroundApp)(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.refreshToken), - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(FormEdit, _objectSpread({}, props)) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Form/FormSelect.tsx": -/*!********************************************!*\ - !*** ./scripts/shared/Form/FormSelect.tsx ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FormSelect) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _FormSelector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FormSelector */ "./scripts/shared/Form/FormSelector.tsx"); -/* harmony import */ var _Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Common/LoadingBlock */ "./scripts/shared/Common/LoadingBlock.tsx"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _hooks_useForms__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./hooks/useForms */ "./scripts/shared/Form/hooks/useForms.ts"); -/* harmony import */ var _hooks_useCreateFormFromTemplate__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hooks/useCreateFormFromTemplate */ "./scripts/shared/Form/hooks/useCreateFormFromTemplate.ts"); -/* harmony import */ var _constants_defaultFormOptions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../constants/defaultFormOptions */ "./scripts/constants/defaultFormOptions.ts"); -/* harmony import */ var _Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Common/ErrorHandler */ "./scripts/shared/Common/ErrorHandler.tsx"); - - - - - - - - -function FormSelect(_ref) { - var formId = _ref.formId, - formName = _ref.formName, - handleChange = _ref.handleChange, - _ref$origin = _ref.origin, - origin = _ref$origin === void 0 ? 'gutenberg' : _ref$origin; - - var _useForms = (0,_hooks_useForms__WEBPACK_IMPORTED_MODULE_4__["default"])(), - search = _useForms.search, - formApiError = _useForms.formApiError, - reset = _useForms.reset; - - var _useCreateFormFromTem = (0,_hooks_useCreateFormFromTemplate__WEBPACK_IMPORTED_MODULE_5__["default"])(origin), - createFormByTemplate = _useCreateFormFromTem.createFormByTemplate, - createReset = _useCreateFormFromTem.reset, - isCreating = _useCreateFormFromTem.isCreating, - hasError = _useCreateFormFromTem.hasError, - createApiError = _useCreateFormFromTem.formApiError; - - var value = formId && formName ? { - label: formName, - value: formId - } : null; - - var handleLocalChange = function handleLocalChange(option) { - if ((0,_constants_defaultFormOptions__WEBPACK_IMPORTED_MODULE_6__.isDefaultForm)(option.value)) { - createFormByTemplate(option.value).then(function (_ref2) { - var guid = _ref2.guid, - name = _ref2.name; - handleChange({ - value: guid, - label: name - }); - }); - } else { - handleChange(option); - } - }; - - return isCreating ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_2__["default"], {}) : formApiError || createApiError ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_7__["default"], { - status: formApiError ? formApiError.status : createApiError.status, - resetErrorState: function resetErrorState() { - if (hasError) { - createReset(); - } else { - reset(); - } - }, - errorInfo: { - header: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('There was a problem retrieving your forms', 'leadin'), - message: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Please refresh your forms or try again in a few minutes', 'leadin'), - action: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Refresh forms', 'leadin') - } - }) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_FormSelector__WEBPACK_IMPORTED_MODULE_1__["default"], { - loadOptions: search, - onChange: function onChange(option) { - return handleLocalChange(option); - }, - value: value - }); -} - -/***/ }), - -/***/ "./scripts/shared/Form/FormSelector.tsx": -/*!**********************************************!*\ - !*** ./scripts/shared/Form/FormSelector.tsx ***! - \**********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FormSelector) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _Common_HubspotWrapper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Common/HubspotWrapper */ "./scripts/shared/Common/HubspotWrapper.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _Common_AsyncSelect__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Common/AsyncSelect */ "./scripts/shared/Common/AsyncSelect.tsx"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__); - - - - - -function FormSelector(_ref) { - var loadOptions = _ref.loadOptions, - onChange = _ref.onChange, - value = _ref.value; - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_Common_HubspotWrapper__WEBPACK_IMPORTED_MODULE_1__["default"], { - pluginPath: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.pluginPath, - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", { - "data-test-id": "leadin-form-select", - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("b", { - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Select an existing form or create a new one from a template', 'leadin') - }) - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_AsyncSelect__WEBPACK_IMPORTED_MODULE_3__["default"], { - placeholder: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Search for a form', 'leadin'), - value: value, - loadOptions: loadOptions, - onChange: onChange - })] - }); -} - -/***/ }), - -/***/ "./scripts/shared/Form/PreviewForm.tsx": -/*!*********************************************!*\ - !*** ./scripts/shared/Form/PreviewForm.tsx ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ PreviewForm) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _UIComponents_UIOverlay__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../UIComponents/UIOverlay */ "./scripts/shared/UIComponents/UIOverlay.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _hooks_useFormsScript__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./hooks/useFormsScript */ "./scripts/shared/Form/hooks/useFormsScript.ts"); - - - - - -function PreviewForm(_ref) { - var portalId = _ref.portalId, - formId = _ref.formId; - var inputEl = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); - var ready = (0,_hooks_useFormsScript__WEBPACK_IMPORTED_MODULE_4__["default"])(); - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - if (!ready) { - return; - } - - if (inputEl.current) { - inputEl.current.innerHTML = ''; - var embedScript = document.createElement('script'); - embedScript.innerHTML = "hbspt.forms.create({ portalId: '".concat(portalId, "', formId: '").concat(formId, "', region: '").concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__.hublet, "', ").concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__.formsScriptPayload, " });"); - inputEl.current.appendChild(embedScript); - } - }, [formId, portalId, ready, inputEl]); - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIOverlay__WEBPACK_IMPORTED_MODULE_2__["default"], { - ref: inputEl - }); -} - -/***/ }), - -/***/ "./scripts/shared/Form/hooks/useCreateFormFromTemplate.ts": -/*!****************************************************************!*\ - !*** ./scripts/shared/Form/hooks/useCreateFormFromTemplate.ts ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useCreateFormFromTemplate) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _enums_loadState__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../enums/loadState */ "./scripts/shared/enums/loadState.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - -function useCreateFormFromTemplate() { - var origin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'gutenberg'; - var proxy = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__.usePostAsyncBackgroundMessage)(); - var track = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__.usePostBackgroundMessage)(); - - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Idle), - _useState2 = _slicedToArray(_useState, 2), - loadState = _useState2[0], - setLoadState = _useState2[1]; - - var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), - _useState4 = _slicedToArray(_useState3, 2), - formApiError = _useState4[0], - setFormApiError = _useState4[1]; - - var createFormByTemplate = function createFormByTemplate(type) { - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Loading); - track({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__.ProxyMessages.TrackFormCreatedFromTemplate, - payload: { - type: type, - origin: origin - } - }); - return proxy({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__.ProxyMessages.CreateFormFromTemplate, - payload: type - }).then(function (form) { - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Idle); - return form; - })["catch"](function (err) { - setFormApiError(err); - track({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__.ProxyMessages.TrackFormCreationFailed, - payload: { - origin: origin - } - }); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Failed); - }); - }; - - return { - isCreating: loadState === _enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Loading, - hasError: loadState === _enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Failed, - formApiError: formApiError, - createFormByTemplate: createFormByTemplate, - reset: function reset() { - return setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Idle); - } - }; -} - -/***/ }), - -/***/ "./scripts/shared/Form/hooks/useForms.ts": -/*!***********************************************!*\ - !*** ./scripts/shared/Form/hooks/useForms.ts ***! - \***********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useForms) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/debounce */ "./node_modules/lodash/debounce.js"); -/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _constants_defaultFormOptions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../constants/defaultFormOptions */ "./scripts/constants/defaultFormOptions.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - - -function useForms() { - var proxy = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_2__.usePostAsyncBackgroundMessage)(); - - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), - _useState2 = _slicedToArray(_useState, 2), - formApiError = _useState2[0], - setFormApiError = _useState2[1]; - - var search = lodash_debounce__WEBPACK_IMPORTED_MODULE_1___default()(function (search, callback) { - return proxy({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_4__.ProxyMessages.FetchForms, - payload: { - search: search - } - }).then(function (forms) { - callback([].concat(_toConsumableArray(forms.map(function (form) { - return { - label: form.name, - value: form.guid - }; - })), [_constants_defaultFormOptions__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_OPTIONS])); - })["catch"](function (error) { - setFormApiError(error); - }); - }, 300, { - trailing: true - }); - return { - search: search, - formApiError: formApiError, - reset: function reset() { - return setFormApiError(null); - } - }; -} - -/***/ }), - -/***/ "./scripts/shared/Form/hooks/useFormsScript.ts": -/*!*****************************************************!*\ - !*** ./scripts/shared/Form/hooks/useFormsScript.ts ***! - \*****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useFormScript) -/* harmony export */ }); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _lib_Raven__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../lib/Raven */ "./scripts/lib/Raven.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - -var promise; - -function loadFormsScript() { - if (!promise) { - promise = new Promise(function (resolve, reject) { - return jquery__WEBPACK_IMPORTED_MODULE_0___default().getScript(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.formsScript).done(resolve).fail(reject); - }); - } - - return promise; -} - -function useFormScript() { - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false), - _useState2 = _slicedToArray(_useState, 2), - ready = _useState2[0], - setReady = _useState2[1]; - - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - loadFormsScript().then(function () { - return setReady(true); - })["catch"](function (error) { - return _lib_Raven__WEBPACK_IMPORTED_MODULE_3__["default"].captureException(error); - }); - }, []); - return ready; -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/MeetingController.tsx": -/*!******************************************************!*\ - !*** ./scripts/shared/Meeting/MeetingController.tsx ***! - \******************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ MeetingController) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Common/LoadingBlock */ "./scripts/shared/Common/LoadingBlock.tsx"); -/* harmony import */ var _MeetingSelector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./MeetingSelector */ "./scripts/shared/Meeting/MeetingSelector.tsx"); -/* harmony import */ var _MeetingWarning__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./MeetingWarning */ "./scripts/shared/Meeting/MeetingWarning.tsx"); -/* harmony import */ var _hooks_useMeetings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hooks/useMeetings */ "./scripts/shared/Meeting/hooks/useMeetings.ts"); -/* harmony import */ var _Common_HubspotWrapper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Common/HubspotWrapper */ "./scripts/shared/Common/HubspotWrapper.ts"); -/* harmony import */ var _Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Common/ErrorHandler */ "./scripts/shared/Common/ErrorHandler.tsx"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! raven-js */ "./node_modules/raven-js/src/singleton.js"); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(raven_js__WEBPACK_IMPORTED_MODULE_10__); - - - - - - - - - - - -function MeetingController(_ref) { - var handleChange = _ref.handleChange, - url = _ref.url; - - var _useMeetings = (0,_hooks_useMeetings__WEBPACK_IMPORTED_MODULE_5__["default"])(), - meetings = _useMeetings.mappedMeetings, - loading = _useMeetings.loading, - error = _useMeetings.error, - reload = _useMeetings.reload, - connectCalendar = _useMeetings.connectCalendar; - - var selectedMeetingOption = (0,_hooks_useMeetings__WEBPACK_IMPORTED_MODULE_5__.useSelectedMeeting)(url); - var selectedMeetingCalendar = (0,_hooks_useMeetings__WEBPACK_IMPORTED_MODULE_5__.useSelectedMeetingCalendar)(url); - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - if (!url && meetings.length > 0) { - handleChange(meetings[0].value); - } - }, [meetings, url, handleChange]); - - var handleLocalChange = function handleLocalChange(option) { - handleChange(option.value); - }; - - var handleConnectCalendar = function handleConnectCalendar() { - return connectCalendar().then(function () { - reload(); - })["catch"](function (error) { - raven_js__WEBPACK_IMPORTED_MODULE_10___default().captureMessage('Unable to connect calendar', { - extra: { - error: error - } - }); - }); - }; - - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: loading ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_2__["default"], {}) : error ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_7__["default"], { - status: error && error.status || error, - resetErrorState: function resetErrorState() { - return reload(); - }, - errorInfo: { - header: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__.__)('There was a problem retrieving your meetings', 'leadin'), - message: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__.__)('Please refresh your meetings or try again in a few minutes', 'leadin'), - action: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__.__)('Refresh meetings', 'leadin') - } - }) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_Common_HubspotWrapper__WEBPACK_IMPORTED_MODULE_6__["default"], { - padding: "90px 32px 24px", - pluginPath: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_8__.pluginPath, - children: [selectedMeetingCalendar && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_MeetingWarning__WEBPACK_IMPORTED_MODULE_4__["default"], { - status: selectedMeetingCalendar, - onConnectCalendar: handleConnectCalendar - }), meetings.length > 1 && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_MeetingSelector__WEBPACK_IMPORTED_MODULE_3__["default"], { - onChange: handleLocalChange, - options: meetings, - value: selectedMeetingOption - })] - }) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/MeetingEdit.tsx": -/*!************************************************!*\ - !*** ./scripts/shared/Meeting/MeetingEdit.tsx ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ MeetingsEditContainer) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _MeetingController__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MeetingController */ "./scripts/shared/Meeting/MeetingController.tsx"); -/* harmony import */ var _PreviewMeeting__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./PreviewMeeting */ "./scripts/shared/Meeting/PreviewMeeting.tsx"); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -/* harmony import */ var _Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Common/LoadingBlock */ "./scripts/shared/Common/LoadingBlock.tsx"); -/* harmony import */ var _utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../utils/backgroundAppUtils */ "./scripts/utils/backgroundAppUtils.ts"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - - - - - - - - - - -function MeetingEdit(_ref) { - var url = _ref.attributes.url, - isSelected = _ref.isSelected, - setAttributes = _ref.setAttributes, - _ref$preview = _ref.preview, - preview = _ref$preview === void 0 ? true : _ref$preview, - _ref$origin = _ref.origin, - origin = _ref$origin === void 0 ? 'gutenberg' : _ref$origin; - var isBackgroundAppReady = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_4__.useBackgroundAppContext)(); - var monitorFormPreviewRender = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_4__.usePostBackgroundMessage)(); - - var handleChange = function handleChange(newUrl) { - setAttributes({ - url: newUrl - }); - }; - - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - monitorFormPreviewRender({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_6__.ProxyMessages.TrackMeetingPreviewRender, - payload: { - origin: origin - } - }); - }, [origin]); - return !isBackgroundAppReady ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_7__["default"], {}) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: [(isSelected || !url) && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_MeetingController__WEBPACK_IMPORTED_MODULE_2__["default"], { - url: url, - handleChange: handleChange - }), preview && url && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_PreviewMeeting__WEBPACK_IMPORTED_MODULE_3__["default"], { - url: url - })] - }); -} - -function MeetingsEditContainer(props) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_4__.BackgroudAppContext.Provider, { - value: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_5__.refreshToken && (0,_utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_8__.getOrCreateBackgroundApp)(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_5__.refreshToken), - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(MeetingEdit, _objectSpread({}, props)) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/MeetingSelector.tsx": -/*!****************************************************!*\ - !*** ./scripts/shared/Meeting/MeetingSelector.tsx ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ MeetingSelector) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _Common_AsyncSelect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Common/AsyncSelect */ "./scripts/shared/Common/AsyncSelect.tsx"); -/* harmony import */ var _UIComponents_UISpacer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../UIComponents/UISpacer */ "./scripts/shared/UIComponents/UISpacer.ts"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__); - - - - - -function MeetingSelector(_ref) { - var options = _ref.options, - onChange = _ref.onChange, - value = _ref.value; - var optionsWrapper = [{ - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Meeting name', 'leadin'), - options: options - }]; - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UISpacer__WEBPACK_IMPORTED_MODULE_3__["default"], {}), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", { - "data-test-id": "leadin-meeting-select", - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("b", { - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Select a meeting scheduling page', 'leadin') - }) - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_AsyncSelect__WEBPACK_IMPORTED_MODULE_2__["default"], { - defaultOptions: optionsWrapper, - onChange: onChange, - placeholder: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Select a meeting', 'leadin'), - value: value - })] - }); -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/MeetingWarning.tsx": -/*!***************************************************!*\ - !*** ./scripts/shared/Meeting/MeetingWarning.tsx ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ MeetingWarning) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _UIComponents_UIAlert__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../UIComponents/UIAlert */ "./scripts/shared/UIComponents/UIAlert.tsx"); -/* harmony import */ var _UIComponents_UIButton__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../UIComponents/UIButton */ "./scripts/shared/UIComponents/UIButton.ts"); -/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ "./scripts/shared/Meeting/constants.ts"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__); - - - - - -function MeetingWarning(_ref) { - var status = _ref.status, - onConnectCalendar = _ref.onConnectCalendar; - var isMeetingOwner = status === _constants__WEBPACK_IMPORTED_MODULE_3__.CURRENT_USER_CALENDAR_MISSING; - var titleText = isMeetingOwner ? (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Your calendar is not connected', 'leadin') : (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Calendar is not connected', 'leadin'); - var titleMessage = isMeetingOwner ? (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Please connect your calendar to activate your scheduling pages', 'leadin') : (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Make sure that everybody in this meeting has connected their calendar from the Meetings page in HubSpot', 'leadin'); - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIAlert__WEBPACK_IMPORTED_MODULE_1__["default"], { - titleText: titleText, - titleMessage: titleMessage, - children: isMeetingOwner && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIButton__WEBPACK_IMPORTED_MODULE_2__["default"], { - use: "tertiary", - id: "meetings-connect-calendar", - onClick: onConnectCalendar, - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Connect calendar', 'leadin') - }) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/PreviewMeeting.tsx": -/*!***************************************************!*\ - !*** ./scripts/shared/Meeting/PreviewMeeting.tsx ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ PreviewForm) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _UIComponents_UIOverlay__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../UIComponents/UIOverlay */ "./scripts/shared/UIComponents/UIOverlay.ts"); -/* harmony import */ var _hooks_useMeetingsScript__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hooks/useMeetingsScript */ "./scripts/shared/Meeting/hooks/useMeetingsScript.ts"); - - - - -function PreviewForm(_ref) { - var url = _ref.url; - var ready = (0,_hooks_useMeetingsScript__WEBPACK_IMPORTED_MODULE_3__["default"])(); - var inputEl = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - if (!ready) { - return; - } - - if (inputEl.current) { - inputEl.current.innerHTML = ''; - var container = document.createElement('div'); - container.dataset.src = "".concat(url, "?embed=true"); - container.classList.add('meetings-iframe-container'); - inputEl.current.appendChild(container); - var embedScript = document.createElement('script'); - embedScript.innerHTML = 'hbspt.meetings.create(".meetings-iframe-container");'; - inputEl.current.appendChild(embedScript); - } - }, [url, ready, inputEl]); - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: url && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIOverlay__WEBPACK_IMPORTED_MODULE_2__["default"], { - ref: inputEl - }) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/constants.ts": -/*!*********************************************!*\ - !*** ./scripts/shared/Meeting/constants.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CURRENT_USER_CALENDAR_MISSING": () => (/* binding */ CURRENT_USER_CALENDAR_MISSING), -/* harmony export */ "OTHER_USER_CALENDAR_MISSING": () => (/* binding */ OTHER_USER_CALENDAR_MISSING) -/* harmony export */ }); -var OTHER_USER_CALENDAR_MISSING = 'OTHER_USER_CALENDAR_MISSING'; -var CURRENT_USER_CALENDAR_MISSING = 'CURRENT_USER_CALENDAR_MISSING'; - -/***/ }), - -/***/ "./scripts/shared/Meeting/hooks/useCurrentUserFetch.ts": -/*!*************************************************************!*\ - !*** ./scripts/shared/Meeting/hooks/useCurrentUserFetch.ts ***! - \*************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useCurrentUserFetch) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _enums_loadState__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../enums/loadState */ "./scripts/shared/enums/loadState.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - -var user = null; -function useCurrentUserFetch() { - var proxy = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__.usePostAsyncBackgroundMessage)(); - - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded), - _useState2 = _slicedToArray(_useState, 2), - loadState = _useState2[0], - setLoadState = _useState2[1]; - - var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), - _useState4 = _slicedToArray(_useState3, 2), - error = _useState4[0], - setError = _useState4[1]; - - var createUser = function createUser() { - if (!user) { - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded); - } - }; - - var reload = function reload() { - user = null; - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded); - setError(null); - }; - - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { - if (loadState === _enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded && !user) { - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Loading); - proxy({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__.ProxyMessages.FetchOrCreateMeetingUser - }).then(function (data) { - user = data; - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Idle); - })["catch"](function (err) { - setError(err); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Failed); - }); - } - }, [loadState]); - return { - user: user, - loadUserState: loadState, - error: error, - createUser: createUser, - reload: reload - }; -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/hooks/useMeetings.ts": -/*!*****************************************************!*\ - !*** ./scripts/shared/Meeting/hooks/useMeetings.ts ***! - \*****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useMeetings), -/* harmony export */ "useSelectedMeeting": () => (/* binding */ useSelectedMeeting), -/* harmony export */ "useSelectedMeetingCalendar": () => (/* binding */ useSelectedMeetingCalendar) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ "./scripts/shared/Meeting/constants.ts"); -/* harmony import */ var _useMeetingsFetch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./useMeetingsFetch */ "./scripts/shared/Meeting/hooks/useMeetingsFetch.ts"); -/* harmony import */ var _useCurrentUserFetch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./useCurrentUserFetch */ "./scripts/shared/Meeting/hooks/useCurrentUserFetch.ts"); -/* harmony import */ var _enums_loadState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../enums/loadState */ "./scripts/shared/enums/loadState.ts"); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - - - - - - -function getDefaultMeetingName(meeting, currentUser, meetingUsers) { - var _meeting$meetingsUser = _slicedToArray(meeting.meetingsUserIds, 1), - meetingOwnerId = _meeting$meetingsUser[0]; - - var result = (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__.__)('Default', 'leadin'); - - if (currentUser && meetingOwnerId !== currentUser.id && meetingUsers[meetingOwnerId]) { - var user = meetingUsers[meetingOwnerId]; - result += " (".concat(user.userProfile.fullName, ")"); - } - - return result; -} - -function hasCalendarObject(user) { - return user && user.meetingsUserBlob && user.meetingsUserBlob.calendarSettings && user.meetingsUserBlob.calendarSettings.email; -} - -function useMeetings() { - var proxy = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__.usePostAsyncBackgroundMessage)(); - - var _useMeetingsFetch = (0,_useMeetingsFetch__WEBPACK_IMPORTED_MODULE_3__["default"])(), - meetings = _useMeetingsFetch.meetings, - meetingUsers = _useMeetingsFetch.meetingUsers, - meetingsError = _useMeetingsFetch.error, - loadMeetingsState = _useMeetingsFetch.loadMeetingsState, - reloadMeetings = _useMeetingsFetch.reload; - - var _useCurrentUserFetch = (0,_useCurrentUserFetch__WEBPACK_IMPORTED_MODULE_4__["default"])(), - currentUser = _useCurrentUserFetch.user, - userError = _useCurrentUserFetch.error, - loadUserState = _useCurrentUserFetch.loadUserState, - reloadUser = _useCurrentUserFetch.reload; - - var reload = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () { - reloadUser(); - reloadMeetings(); - }, [reloadUser, reloadMeetings]); - - var connectCalendar = function connectCalendar() { - return proxy({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_7__.ProxyMessages.ConnectMeetingsCalendar - }); - }; - - return { - mappedMeetings: meetings.map(function (meet) { - return { - label: meet.name || getDefaultMeetingName(meet, currentUser, meetingUsers), - value: meet.link - }; - }), - meetings: meetings, - meetingUsers: meetingUsers, - currentUser: currentUser, - error: meetingsError || userError, - loading: loadMeetingsState == _enums_loadState__WEBPACK_IMPORTED_MODULE_5__["default"].Loading || loadUserState === _enums_loadState__WEBPACK_IMPORTED_MODULE_5__["default"].Loading, - reload: reload, - connectCalendar: connectCalendar - }; -} -function useSelectedMeeting(url) { - var _useMeetings = useMeetings(), - meetings = _useMeetings.mappedMeetings; - - var option = meetings.find(function (_ref) { - var value = _ref.value; - return value === url; - }); - return option; -} -function useSelectedMeetingCalendar(url) { - var _useMeetings2 = useMeetings(), - meetings = _useMeetings2.meetings, - meetingUsers = _useMeetings2.meetingUsers, - currentUser = _useMeetings2.currentUser; - - var meeting = meetings.find(function (meet) { - return meet.link === url; - }); - var mappedMeetingUsersId = meetingUsers.reduce(function (p, c) { - return _objectSpread(_objectSpread({}, p), {}, _defineProperty({}, c.id, c)); - }, {}); - - if (!meeting) { - return null; - } else { - var meetingsUserIds = meeting.meetingsUserIds; - - if (currentUser && meetingsUserIds.includes(currentUser.id) && !hasCalendarObject(currentUser)) { - return _constants__WEBPACK_IMPORTED_MODULE_2__.CURRENT_USER_CALENDAR_MISSING; - } else if (meetingsUserIds.map(function (id) { - return mappedMeetingUsersId[id]; - }).some(function (user) { - return !hasCalendarObject(user); - })) { - return _constants__WEBPACK_IMPORTED_MODULE_2__.OTHER_USER_CALENDAR_MISSING; - } else { - return null; - } - } -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/hooks/useMeetingsFetch.ts": -/*!**********************************************************!*\ - !*** ./scripts/shared/Meeting/hooks/useMeetingsFetch.ts ***! - \**********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useMeetingsFetch) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _enums_loadState__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../enums/loadState */ "./scripts/shared/enums/loadState.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - -var meetings = []; -var meetingUsers = []; -function useMeetingsFetch() { - var proxy = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__.usePostAsyncBackgroundMessage)(); - - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded), - _useState2 = _slicedToArray(_useState, 2), - loadState = _useState2[0], - setLoadState = _useState2[1]; - - var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), - _useState4 = _slicedToArray(_useState3, 2), - error = _useState4[0], - setError = _useState4[1]; - - var reload = function reload() { - meetings = []; - setError(null); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded); - }; - - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { - if (loadState === _enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded && meetings.length === 0) { - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Loading); - proxy({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__.ProxyMessages.FetchMeetingsAndUsers - }).then(function (data) { - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Loaded); - meetings = data && data.meetingLinks; - meetingUsers = data && data.meetingUsers; - })["catch"](function (e) { - setError(e); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Failed); - }); - } - }, [loadState]); - return { - meetings: meetings, - meetingUsers: meetingUsers, - loadMeetingsState: loadState, - error: error, - reload: reload - }; -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/hooks/useMeetingsScript.ts": -/*!***********************************************************!*\ - !*** ./scripts/shared/Meeting/hooks/useMeetingsScript.ts ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useMeetingsScript) -/* harmony export */ }); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _lib_Raven__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../lib/Raven */ "./scripts/lib/Raven.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - -var promise; - -function loadMeetingsScript() { - if (!promise) { - promise = new Promise(function (resolve, reject) { - return jquery__WEBPACK_IMPORTED_MODULE_0___default().getScript(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.meetingsScript).done(resolve).fail(reject); - }); - } - - return promise; -} - -function useMeetingsScript() { - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false), - _useState2 = _slicedToArray(_useState, 2), - ready = _useState2[0], - setReady = _useState2[1]; - - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - loadMeetingsScript().then(function () { - return setReady(true); - })["catch"](function (error) { - return _lib_Raven__WEBPACK_IMPORTED_MODULE_3__["default"].captureException(error); - }); - }, []); - return ready; -} - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIAlert.tsx": -/*!*************************************************!*\ - !*** ./scripts/shared/UIComponents/UIAlert.tsx ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ UIAlert) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); - - -var AlertContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_1__.styled)('div')({ - name: "AlertContainer", - "class": "a1h8m4fo", - propsAsIs: false -}); -var Title = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_1__.styled)('p')({ - name: "Title", - "class": "tyndzxk", - propsAsIs: false -}); -var Message = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_1__.styled)('p')({ - name: "Message", - "class": "m1m9sbk4", - propsAsIs: false -}); -var MessageContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_1__.styled)('div')({ - name: "MessageContainer", - "class": "mg5o421", - propsAsIs: false -}); -function UIAlert(_ref) { - var titleText = _ref.titleText, - titleMessage = _ref.titleMessage, - children = _ref.children; - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(AlertContainer, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(MessageContainer, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Title, { - children: titleText - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Message, { - children: titleMessage - })] - }), children] - }); -} - -__webpack_require__(/*! ./UIAlert.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./UIAlert.tsx */ "./scripts/shared/UIComponents/UIAlert.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIAlert.tsx"); - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIButton.ts": -/*!*************************************************!*\ - !*** ./scripts/shared/UIComponents/UIButton.ts ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); -/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./colors */ "./scripts/shared/UIComponents/colors.ts"); - - - -var _exp2 = /*#__PURE__*/function _exp2() { - return function (props) { - return props.use === 'tertiary' ? _colors__WEBPACK_IMPORTED_MODULE_0__.HEFFALUMP : _colors__WEBPACK_IMPORTED_MODULE_0__.LORAX; - }; -}; - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_1__.styled)('button')({ - name: "UIButton0", - "class": "ug152ch", - propsAsIs: false, - vars: { - "ug152ch-0": [_exp2()] - } -})); - -__webpack_require__(/*! ./UIButton.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./UIButton.ts */ "./scripts/shared/UIComponents/UIButton.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIButton.ts"); - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIContainer.ts": -/*!****************************************************!*\ - !*** ./scripts/shared/UIComponents/UIContainer.ts ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); - - -var _exp = /*#__PURE__*/function _exp() { - return function (props) { - return props.textAlign ? props.textAlign : 'inherit'; - }; -}; - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_0__.styled)('div')({ - name: "UIContainer0", - "class": "ua13n1c", - propsAsIs: false, - vars: { - "ua13n1c-0": [_exp()] - } -})); - -__webpack_require__(/*! ./UIContainer.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./UIContainer.ts */ "./scripts/shared/UIComponents/UIContainer.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIContainer.ts"); - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIOverlay.ts": -/*!**************************************************!*\ - !*** ./scripts/shared/UIComponents/UIOverlay.ts ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_0__.styled)('div')({ - name: "UIOverlay0", - "class": "u1q7a48k", - propsAsIs: false -})); - -__webpack_require__(/*! ./UIOverlay.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./UIOverlay.ts */ "./scripts/shared/UIComponents/UIOverlay.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIOverlay.ts"); - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UISpacer.ts": -/*!*************************************************!*\ - !*** ./scripts/shared/UIComponents/UISpacer.ts ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_0__.styled)('div')({ - name: "UISpacer0", - "class": "u3qxofx", - propsAsIs: false -})); - -__webpack_require__(/*! ./UISpacer.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./UISpacer.ts */ "./scripts/shared/UIComponents/UISpacer.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpacer.ts"); - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UISpinner.tsx": -/*!***************************************************!*\ - !*** ./scripts/shared/UIComponents/UISpinner.tsx ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ UISpinner) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); -/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ "./scripts/shared/UIComponents/colors.ts"); - - - -var SpinnerOuter = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_2__.styled)('div')({ - name: "SpinnerOuter", - "class": "sxa9zrc", - propsAsIs: false -}); -var SpinnerInner = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_2__.styled)('div')({ - name: "SpinnerInner", - "class": "s14430wa", - propsAsIs: false -}); - -var _exp = /*#__PURE__*/function _exp() { - return function (props) { - return props.color; - }; -}; - -var Circle = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_2__.styled)('circle')({ - name: "Circle", - "class": "ct87ghk", - propsAsIs: true, - vars: { - "ct87ghk-0": [_exp()] - } -}); - -var _exp2 = /*#__PURE__*/function _exp2() { - return function (props) { - return props.color; - }; -}; - -var AnimatedCircle = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_2__.styled)('circle')({ - name: "AnimatedCircle", - "class": "avili0h", - propsAsIs: true, - vars: { - "avili0h-0": [_exp2()] - } -}); -function UISpinner(_ref) { - var _ref$size = _ref.size, - size = _ref$size === void 0 ? 20 : _ref$size; - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(SpinnerOuter, { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(SpinnerInner, { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("svg", { - height: size, - width: size, - viewBox: "0 0 50 50", - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Circle, { - color: _colors__WEBPACK_IMPORTED_MODULE_1__.CALYPSO_MEDIUM, - cx: "25", - cy: "25", - r: "22.5" - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(AnimatedCircle, { - color: _colors__WEBPACK_IMPORTED_MODULE_1__.CALYPSO, - cx: "25", - cy: "25", - r: "22.5" - })] - }) - }) - }); -} - -__webpack_require__(/*! ./UISpinner.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./UISpinner.tsx */ "./scripts/shared/UIComponents/UISpinner.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpinner.tsx"); - -/***/ }), - -/***/ "./scripts/shared/UIComponents/colors.ts": -/*!***********************************************!*\ - !*** ./scripts/shared/UIComponents/colors.ts ***! - \***********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CALYPSO": () => (/* binding */ CALYPSO), -/* harmony export */ "CALYPSO_LIGHT": () => (/* binding */ CALYPSO_LIGHT), -/* harmony export */ "CALYPSO_MEDIUM": () => (/* binding */ CALYPSO_MEDIUM), -/* harmony export */ "HEFFALUMP": () => (/* binding */ HEFFALUMP), -/* harmony export */ "LORAX": () => (/* binding */ LORAX), -/* harmony export */ "MARIGOLD_LIGHT": () => (/* binding */ MARIGOLD_LIGHT), -/* harmony export */ "MARIGOLD_MEDIUM": () => (/* binding */ MARIGOLD_MEDIUM), -/* harmony export */ "OBSIDIAN": () => (/* binding */ OBSIDIAN), -/* harmony export */ "OLAF": () => (/* binding */ OLAF) -/* harmony export */ }); -var CALYPSO = '#00a4bd'; -var CALYPSO_MEDIUM = '#7fd1de'; -var CALYPSO_LIGHT = '#e5f5f8'; -var LORAX = '#ff7a59'; -var OLAF = '#ffffff'; -var HEFFALUMP = '#425b76'; -var MARIGOLD_LIGHT = '#fef8f0'; -var MARIGOLD_MEDIUM = '#fae0b5'; -var OBSIDIAN = '#33475b'; - -/***/ }), - -/***/ "./scripts/shared/enums/connectionStatus.ts": -/*!**************************************************!*\ - !*** ./scripts/shared/enums/connectionStatus.ts ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -var ConnectionStatus = { - Connected: 'Connected', - NotConnected: 'NotConnected' -}; -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConnectionStatus); - -/***/ }), - -/***/ "./scripts/shared/enums/loadState.ts": -/*!*******************************************!*\ - !*** ./scripts/shared/enums/loadState.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -var LoadState = { - NotLoaded: 'NotLoaded', - Loading: 'Loading', - Loaded: 'Loaded', - Idle: 'Idle', - Failed: 'Failed' -}; -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LoadState); - -/***/ }), - -/***/ "./scripts/utils/appUtils.ts": -/*!***********************************!*\ - !*** ./scripts/utils/appUtils.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "initApp": () => (/* binding */ initApp), -/* harmony export */ "initAppOnReady": () => (/* binding */ initAppOnReady) -/* harmony export */ }); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _lib_Raven__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/Raven */ "./scripts/lib/Raven.ts"); - - -function initApp(initFn) { - (0,_lib_Raven__WEBPACK_IMPORTED_MODULE_1__.configureRaven)(); - _lib_Raven__WEBPACK_IMPORTED_MODULE_1__["default"].context(initFn); -} -function initAppOnReady(initFn) { - function main() { - jquery__WEBPACK_IMPORTED_MODULE_0___default()(initFn); - } - - initApp(main); -} - -/***/ }), - -/***/ "./scripts/utils/backgroundAppUtils.ts": -/*!*********************************************!*\ - !*** ./scripts/utils/backgroundAppUtils.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "getOrCreateBackgroundApp": () => (/* binding */ getOrCreateBackgroundApp), -/* harmony export */ "initBackgroundApp": () => (/* binding */ initBackgroundApp) -/* harmony export */ }); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _appUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./appUtils */ "./scripts/utils/appUtils.ts"); - - -function initBackgroundApp(initFn) { - function main() { - if (Array.isArray(initFn)) { - initFn.forEach(function (callback) { - return callback(); - }); - } else { - initFn(); - } - } - - (0,_appUtils__WEBPACK_IMPORTED_MODULE_1__.initApp)(main); -} -var getOrCreateBackgroundApp = function getOrCreateBackgroundApp(refreshToken) { - if (window.LeadinBackgroundApp) { - return window.LeadinBackgroundApp; - } - - var _window = window, - IntegratedAppEmbedder = _window.IntegratedAppEmbedder, - IntegratedAppOptions = _window.IntegratedAppOptions; - var options = new IntegratedAppOptions().setLocale(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.locale).setDeviceId(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.deviceId).setRefreshToken(refreshToken); - var embedder = new IntegratedAppEmbedder('integrated-plugin-proxy', _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.portalId, _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.hubspotBaseUrl, function () {}).setOptions(options); - embedder.attachTo(document.body, false); - embedder.postStartAppMessage(); // lets the app know all all data has been passed to it - - window.LeadinBackgroundApp = embedder; - return window.LeadinBackgroundApp; -}; - -/***/ }), - -/***/ "./node_modules/lodash/_Symbol.js": -/*!****************************************!*\ - !*** ./node_modules/lodash/_Symbol.js ***! - \****************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); - -/** Built-in value references. */ -var Symbol = root.Symbol; - -module.exports = Symbol; - - -/***/ }), - -/***/ "./node_modules/lodash/_baseGetTag.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_baseGetTag.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), - getRawTag = __webpack_require__(/*! ./_getRawTag */ "./node_modules/lodash/_getRawTag.js"), - objectToString = __webpack_require__(/*! ./_objectToString */ "./node_modules/lodash/_objectToString.js"); - -/** `Object#toString` result references. */ -var nullTag = '[object Null]', - undefinedTag = '[object Undefined]'; - -/** Built-in value references. */ -var symToStringTag = Symbol ? Symbol.toStringTag : undefined; - -/** - * The base implementation of `getTag` without fallbacks for buggy environments. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. - */ -function baseGetTag(value) { - if (value == null) { - return value === undefined ? undefinedTag : nullTag; - } - return (symToStringTag && symToStringTag in Object(value)) - ? getRawTag(value) - : objectToString(value); -} - -module.exports = baseGetTag; - - -/***/ }), - -/***/ "./node_modules/lodash/_baseTrim.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_baseTrim.js ***! - \******************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var trimmedEndIndex = __webpack_require__(/*! ./_trimmedEndIndex */ "./node_modules/lodash/_trimmedEndIndex.js"); - -/** Used to match leading whitespace. */ -var reTrimStart = /^\s+/; - -/** - * The base implementation of `_.trim`. - * - * @private - * @param {string} string The string to trim. - * @returns {string} Returns the trimmed string. - */ -function baseTrim(string) { - return string - ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') - : string; -} - -module.exports = baseTrim; - - -/***/ }), - -/***/ "./node_modules/lodash/_freeGlobal.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_freeGlobal.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/** Detect free variable `global` from Node.js. */ -var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g; - -module.exports = freeGlobal; - - -/***/ }), - -/***/ "./node_modules/lodash/_getRawTag.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_getRawTag.js ***! - \*******************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"); - -/** Used for built-in method references. */ -var objectProto = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var nativeObjectToString = objectProto.toString; - -/** Built-in value references. */ -var symToStringTag = Symbol ? Symbol.toStringTag : undefined; - -/** - * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the raw `toStringTag`. - */ -function getRawTag(value) { - var isOwn = hasOwnProperty.call(value, symToStringTag), - tag = value[symToStringTag]; - - try { - value[symToStringTag] = undefined; - var unmasked = true; - } catch (e) {} - - var result = nativeObjectToString.call(value); - if (unmasked) { - if (isOwn) { - value[symToStringTag] = tag; - } else { - delete value[symToStringTag]; - } - } - return result; -} - -module.exports = getRawTag; - - -/***/ }), - -/***/ "./node_modules/lodash/_objectToString.js": -/*!************************************************!*\ - !*** ./node_modules/lodash/_objectToString.js ***! - \************************************************/ -/***/ ((module) => { - -/** Used for built-in method references. */ -var objectProto = Object.prototype; - -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var nativeObjectToString = objectProto.toString; - -/** - * Converts `value` to a string using `Object.prototype.toString`. - * - * @private - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - */ -function objectToString(value) { - return nativeObjectToString.call(value); -} - -module.exports = objectToString; - - -/***/ }), - -/***/ "./node_modules/lodash/_root.js": -/*!**************************************!*\ - !*** ./node_modules/lodash/_root.js ***! - \**************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js"); - -/** Detect free variable `self`. */ -var freeSelf = typeof self == 'object' && self && self.Object === Object && self; - -/** Used as a reference to the global object. */ -var root = freeGlobal || freeSelf || Function('return this')(); - -module.exports = root; - - -/***/ }), - -/***/ "./node_modules/lodash/_trimmedEndIndex.js": -/*!*************************************************!*\ - !*** ./node_modules/lodash/_trimmedEndIndex.js ***! - \*************************************************/ -/***/ ((module) => { - -/** Used to match a single whitespace character. */ -var reWhitespace = /\s/; - -/** - * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace - * character of `string`. - * - * @private - * @param {string} string The string to inspect. - * @returns {number} Returns the index of the last non-whitespace character. - */ -function trimmedEndIndex(string) { - var index = string.length; - - while (index-- && reWhitespace.test(string.charAt(index))) {} - return index; -} - -module.exports = trimmedEndIndex; - - -/***/ }), - -/***/ "./node_modules/lodash/debounce.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/debounce.js ***! - \*****************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), - now = __webpack_require__(/*! ./now */ "./node_modules/lodash/now.js"), - toNumber = __webpack_require__(/*! ./toNumber */ "./node_modules/lodash/toNumber.js"); - -/** Error message constants. */ -var FUNC_ERROR_TEXT = 'Expected a function'; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max, - nativeMin = Math.min; - -/** - * Creates a debounced function that delays invoking `func` until after `wait` - * milliseconds have elapsed since the last time the debounced function was - * invoked. The debounced function comes with a `cancel` method to cancel - * delayed `func` invocations and a `flush` method to immediately invoke them. - * Provide `options` to indicate whether `func` should be invoked on the - * leading and/or trailing edge of the `wait` timeout. The `func` is invoked - * with the last arguments provided to the debounced function. Subsequent - * calls to the debounced function return the result of the last `func` - * invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is - * invoked on the trailing edge of the timeout only if the debounced function - * is invoked more than once during the `wait` timeout. - * - * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred - * until to the next tick, similar to `setTimeout` with a timeout of `0`. - * - * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) - * for details over the differences between `_.debounce` and `_.throttle`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to debounce. - * @param {number} [wait=0] The number of milliseconds to delay. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.leading=false] - * Specify invoking on the leading edge of the timeout. - * @param {number} [options.maxWait] - * The maximum time `func` is allowed to be delayed before it's invoked. - * @param {boolean} [options.trailing=true] - * Specify invoking on the trailing edge of the timeout. - * @returns {Function} Returns the new debounced function. - * @example - * - * // Avoid costly calculations while the window size is in flux. - * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); - * - * // Invoke `sendMail` when clicked, debouncing subsequent calls. - * jQuery(element).on('click', _.debounce(sendMail, 300, { - * 'leading': true, - * 'trailing': false - * })); - * - * // Ensure `batchLog` is invoked once after 1 second of debounced calls. - * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); - * var source = new EventSource('/stream'); - * jQuery(source).on('message', debounced); - * - * // Cancel the trailing debounced invocation. - * jQuery(window).on('popstate', debounced.cancel); - */ -function debounce(func, wait, options) { - var lastArgs, - lastThis, - maxWait, - result, - timerId, - lastCallTime, - lastInvokeTime = 0, - leading = false, - maxing = false, - trailing = true; - - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - wait = toNumber(wait) || 0; - if (isObject(options)) { - leading = !!options.leading; - maxing = 'maxWait' in options; - maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; - trailing = 'trailing' in options ? !!options.trailing : trailing; - } - - function invokeFunc(time) { - var args = lastArgs, - thisArg = lastThis; - - lastArgs = lastThis = undefined; - lastInvokeTime = time; - result = func.apply(thisArg, args); - return result; - } - - function leadingEdge(time) { - // Reset any `maxWait` timer. - lastInvokeTime = time; - // Start the timer for the trailing edge. - timerId = setTimeout(timerExpired, wait); - // Invoke the leading edge. - return leading ? invokeFunc(time) : result; - } - - function remainingWait(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime, - timeWaiting = wait - timeSinceLastCall; - - return maxing - ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) - : timeWaiting; - } - - function shouldInvoke(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime; - - // Either this is the first call, activity has stopped and we're at the - // trailing edge, the system time has gone backwards and we're treating - // it as the trailing edge, or we've hit the `maxWait` limit. - return (lastCallTime === undefined || (timeSinceLastCall >= wait) || - (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); - } - - function timerExpired() { - var time = now(); - if (shouldInvoke(time)) { - return trailingEdge(time); - } - // Restart the timer. - timerId = setTimeout(timerExpired, remainingWait(time)); - } - - function trailingEdge(time) { - timerId = undefined; - - // Only invoke if we have `lastArgs` which means `func` has been - // debounced at least once. - if (trailing && lastArgs) { - return invokeFunc(time); - } - lastArgs = lastThis = undefined; - return result; - } - - function cancel() { - if (timerId !== undefined) { - clearTimeout(timerId); - } - lastInvokeTime = 0; - lastArgs = lastCallTime = lastThis = timerId = undefined; - } - - function flush() { - return timerId === undefined ? result : trailingEdge(now()); - } - - function debounced() { - var time = now(), - isInvoking = shouldInvoke(time); - - lastArgs = arguments; - lastThis = this; - lastCallTime = time; - - if (isInvoking) { - if (timerId === undefined) { - return leadingEdge(lastCallTime); - } - if (maxing) { - // Handle invocations in a tight loop. - clearTimeout(timerId); - timerId = setTimeout(timerExpired, wait); - return invokeFunc(lastCallTime); - } - } - if (timerId === undefined) { - timerId = setTimeout(timerExpired, wait); - } - return result; - } - debounced.cancel = cancel; - debounced.flush = flush; - return debounced; -} - -module.exports = debounce; - - -/***/ }), - -/***/ "./node_modules/lodash/isObject.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/isObject.js ***! - \*****************************************/ -/***/ ((module) => { - -/** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false - */ -function isObject(value) { - var type = typeof value; - return value != null && (type == 'object' || type == 'function'); -} - -module.exports = isObject; - - -/***/ }), - -/***/ "./node_modules/lodash/isObjectLike.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/isObjectLike.js ***! - \*********************************************/ -/***/ ((module) => { - -/** - * Checks if `value` is object-like. A value is object-like if it's not `null` - * and has a `typeof` result of "object". - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - * @example - * - * _.isObjectLike({}); - * // => true - * - * _.isObjectLike([1, 2, 3]); - * // => true - * - * _.isObjectLike(_.noop); - * // => false - * - * _.isObjectLike(null); - * // => false - */ -function isObjectLike(value) { - return value != null && typeof value == 'object'; -} - -module.exports = isObjectLike; - - -/***/ }), - -/***/ "./node_modules/lodash/isSymbol.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/isSymbol.js ***! - \*****************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), - isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); - -/** `Object#toString` result references. */ -var symbolTag = '[object Symbol]'; - -/** - * Checks if `value` is classified as a `Symbol` primitive or object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. - * @example - * - * _.isSymbol(Symbol.iterator); - * // => true - * - * _.isSymbol('abc'); - * // => false - */ -function isSymbol(value) { - return typeof value == 'symbol' || - (isObjectLike(value) && baseGetTag(value) == symbolTag); -} - -module.exports = isSymbol; - - -/***/ }), - -/***/ "./node_modules/lodash/now.js": -/*!************************************!*\ - !*** ./node_modules/lodash/now.js ***! - \************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); - -/** - * Gets the timestamp of the number of milliseconds that have elapsed since - * the Unix epoch (1 January 1970 00:00:00 UTC). - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Date - * @returns {number} Returns the timestamp. - * @example - * - * _.defer(function(stamp) { - * console.log(_.now() - stamp); - * }, _.now()); - * // => Logs the number of milliseconds it took for the deferred invocation. - */ -var now = function() { - return root.Date.now(); -}; - -module.exports = now; - - -/***/ }), - -/***/ "./node_modules/lodash/toNumber.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/toNumber.js ***! - \*****************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var baseTrim = __webpack_require__(/*! ./_baseTrim */ "./node_modules/lodash/_baseTrim.js"), - isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), - isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); - -/** Used as references for various `Number` constants. */ -var NAN = 0 / 0; - -/** Used to detect bad signed hexadecimal string values. */ -var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; - -/** Used to detect binary string values. */ -var reIsBinary = /^0b[01]+$/i; - -/** Used to detect octal string values. */ -var reIsOctal = /^0o[0-7]+$/i; - -/** Built-in method references without a dependency on `root`. */ -var freeParseInt = parseInt; - -/** - * Converts `value` to a number. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to process. - * @returns {number} Returns the number. - * @example - * - * _.toNumber(3.2); - * // => 3.2 - * - * _.toNumber(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toNumber(Infinity); - * // => Infinity - * - * _.toNumber('3.2'); - * // => 3.2 - */ -function toNumber(value) { - if (typeof value == 'number') { - return value; - } - if (isSymbol(value)) { - return NAN; - } - if (isObject(value)) { - var other = typeof value.valueOf == 'function' ? value.valueOf() : value; - value = isObject(other) ? (other + '') : other; - } - if (typeof value != 'string') { - return value === 0 ? value : +value; - } - value = baseTrim(value); - var isBinary = reIsBinary.test(value); - return (isBinary || reIsOctal.test(value)) - ? freeParseInt(value.slice(2), isBinary ? 2 : 8) - : (reIsBadHex.test(value) ? NAN : +value); -} - -module.exports = toNumber; - - -/***/ }), - -/***/ "./scripts/elementor/Common/ElementorButton.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/elementor/Common/ElementorButton.tsx": -/*!*********************************************************************************************************************************************************************************************!*\ - !*** ./scripts/elementor/Common/ElementorButton.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/elementor/Common/ElementorButton.tsx ***! - \*********************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/elementor/MeetingWidget/ElementorMeetingWarning.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx": -/*!***************************************************************************************************************************************************************************************************************************!*\ - !*** ./scripts/elementor/MeetingWidget/ElementorMeetingWarning.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx ***! - \***************************************************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/Common/AsyncSelect.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/AsyncSelect.tsx": -/*!*******************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/Common/AsyncSelect.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/AsyncSelect.tsx ***! - \*******************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/Common/HubspotWrapper.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/HubspotWrapper.ts": -/*!************************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/Common/HubspotWrapper.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/HubspotWrapper.ts ***! - \************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIAlert.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIAlert.tsx": -/*!***********************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/UIComponents/UIAlert.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIAlert.tsx ***! - \***********************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIButton.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIButton.ts": -/*!************************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/UIComponents/UIButton.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIButton.ts ***! - \************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIContainer.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIContainer.ts": -/*!******************************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/UIComponents/UIContainer.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIContainer.ts ***! - \******************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIOverlay.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIOverlay.ts": -/*!**************************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/UIComponents/UIOverlay.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIOverlay.ts ***! - \**************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UISpacer.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpacer.ts": -/*!************************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/UIComponents/UISpacer.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpacer.ts ***! - \************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UISpinner.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpinner.tsx": -/*!***************************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/UIComponents/UISpinner.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpinner.tsx ***! - \***************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./node_modules/object-assign/index.js": -/*!*********************************************!*\ - !*** ./node_modules/object-assign/index.js ***! - \*********************************************/ -/***/ ((module) => { - -"use strict"; -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - - -/* eslint-disable no-unused-vars */ -var getOwnPropertySymbols = Object.getOwnPropertySymbols; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var propIsEnumerable = Object.prototype.propertyIsEnumerable; - -function toObject(val) { - if (val === null || val === undefined) { - throw new TypeError('Object.assign cannot be called with null or undefined'); - } - - return Object(val); -} - -function shouldUseNative() { - try { - if (!Object.assign) { - return false; - } - - // Detect buggy property enumeration order in older V8 versions. - - // https://bugs.chromium.org/p/v8/issues/detail?id=4118 - var test1 = new String('abc'); // eslint-disable-line no-new-wrappers - test1[5] = 'de'; - if (Object.getOwnPropertyNames(test1)[0] === '5') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test2 = {}; - for (var i = 0; i < 10; i++) { - test2['_' + String.fromCharCode(i)] = i; - } - var order2 = Object.getOwnPropertyNames(test2).map(function (n) { - return test2[n]; - }); - if (order2.join('') !== '0123456789') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test3 = {}; - 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { - test3[letter] = letter; - }); - if (Object.keys(Object.assign({}, test3)).join('') !== - 'abcdefghijklmnopqrst') { - return false; - } - - return true; - } catch (err) { - // We don't expect any of the above to throw, but better to be safe. - return false; - } -} - -module.exports = shouldUseNative() ? Object.assign : function (target, source) { - var from; - var to = toObject(target); - var symbols; - - for (var s = 1; s < arguments.length; s++) { - from = Object(arguments[s]); - - for (var key in from) { - if (hasOwnProperty.call(from, key)) { - to[key] = from[key]; - } - } - - if (getOwnPropertySymbols) { - symbols = getOwnPropertySymbols(from); - for (var i = 0; i < symbols.length; i++) { - if (propIsEnumerable.call(from, symbols[i])) { - to[symbols[i]] = from[symbols[i]]; - } - } - } - } - - return to; -}; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/configError.js": -/*!**************************************************!*\ - !*** ./node_modules/raven-js/src/configError.js ***! - \**************************************************/ -/***/ ((module) => { - -function RavenConfigError(message) { - this.name = 'RavenConfigError'; - this.message = message; -} -RavenConfigError.prototype = new Error(); -RavenConfigError.prototype.constructor = RavenConfigError; - -module.exports = RavenConfigError; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/console.js": -/*!**********************************************!*\ - !*** ./node_modules/raven-js/src/console.js ***! - \**********************************************/ -/***/ ((module) => { - -var wrapMethod = function(console, level, callback) { - var originalConsoleLevel = console[level]; - var originalConsole = console; - - if (!(level in console)) { - return; - } - - var sentryLevel = level === 'warn' ? 'warning' : level; - - console[level] = function() { - var args = [].slice.call(arguments); - - var msg = '' + args.join(' '); - var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}}; - - if (level === 'assert') { - if (args[0] === false) { - // Default browsers message - msg = 'Assertion failed: ' + (args.slice(1).join(' ') || 'console.assert'); - data.extra.arguments = args.slice(1); - callback && callback(msg, data); - } - } else { - callback && callback(msg, data); - } - - // this fails for some browsers. :( - if (originalConsoleLevel) { - // IE9 doesn't allow calling apply on console functions directly - // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193 - Function.prototype.apply.call(originalConsoleLevel, originalConsole, args); - } - }; -}; - -module.exports = { - wrapMethod: wrapMethod -}; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/raven.js": -/*!********************************************!*\ - !*** ./node_modules/raven-js/src/raven.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/*global XDomainRequest:false */ - -var TraceKit = __webpack_require__(/*! ../vendor/TraceKit/tracekit */ "./node_modules/raven-js/vendor/TraceKit/tracekit.js"); -var stringify = __webpack_require__(/*! ../vendor/json-stringify-safe/stringify */ "./node_modules/raven-js/vendor/json-stringify-safe/stringify.js"); -var RavenConfigError = __webpack_require__(/*! ./configError */ "./node_modules/raven-js/src/configError.js"); - -var utils = __webpack_require__(/*! ./utils */ "./node_modules/raven-js/src/utils.js"); -var isError = utils.isError; -var isObject = utils.isObject; -var isObject = utils.isObject; -var isErrorEvent = utils.isErrorEvent; -var isUndefined = utils.isUndefined; -var isFunction = utils.isFunction; -var isString = utils.isString; -var isEmptyObject = utils.isEmptyObject; -var each = utils.each; -var objectMerge = utils.objectMerge; -var truncate = utils.truncate; -var objectFrozen = utils.objectFrozen; -var hasKey = utils.hasKey; -var joinRegExp = utils.joinRegExp; -var urlencode = utils.urlencode; -var uuid4 = utils.uuid4; -var htmlTreeAsString = utils.htmlTreeAsString; -var isSameException = utils.isSameException; -var isSameStacktrace = utils.isSameStacktrace; -var parseUrl = utils.parseUrl; -var fill = utils.fill; - -var wrapConsoleMethod = (__webpack_require__(/*! ./console */ "./node_modules/raven-js/src/console.js").wrapMethod); - -var dsnKeys = 'source protocol user pass host port path'.split(' '), - dsnPattern = /^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/; - -function now() { - return +new Date(); -} - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; -var _document = _window.document; -var _navigator = _window.navigator; - -function keepOriginalCallback(original, callback) { - return isFunction(callback) - ? function(data) { - return callback(data, original); - } - : callback; -} - -// First, check for JSON support -// If there is no JSON, we no-op the core features of Raven -// since JSON is required to encode the payload -function Raven() { - this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify); - // Raven can run in contexts where there's no document (react-native) - this._hasDocument = !isUndefined(_document); - this._hasNavigator = !isUndefined(_navigator); - this._lastCapturedException = null; - this._lastData = null; - this._lastEventId = null; - this._globalServer = null; - this._globalKey = null; - this._globalProject = null; - this._globalContext = {}; - this._globalOptions = { - logger: 'javascript', - ignoreErrors: [], - ignoreUrls: [], - whitelistUrls: [], - includePaths: [], - collectWindowErrors: true, - maxMessageLength: 0, - - // By default, truncates URL values to 250 chars - maxUrlLength: 250, - stackTraceLimit: 50, - autoBreadcrumbs: true, - instrument: true, - sampleRate: 1 - }; - this._ignoreOnError = 0; - this._isRavenInstalled = false; - this._originalErrorStackTraceLimit = Error.stackTraceLimit; - // capture references to window.console *and* all its methods first - // before the console plugin has a chance to monkey patch - this._originalConsole = _window.console || {}; - this._originalConsoleMethods = {}; - this._plugins = []; - this._startTime = now(); - this._wrappedBuiltIns = []; - this._breadcrumbs = []; - this._lastCapturedEvent = null; - this._keypressTimeout; - this._location = _window.location; - this._lastHref = this._location && this._location.href; - this._resetBackoff(); - - // eslint-disable-next-line guard-for-in - for (var method in this._originalConsole) { - this._originalConsoleMethods[method] = this._originalConsole[method]; - } -} - -/* - * The core Raven singleton - * - * @this {Raven} - */ - -Raven.prototype = { - // Hardcode version string so that raven source can be loaded directly via - // webpack (using a build step causes webpack #1617). Grunt verifies that - // this value matches package.json during build. - // See: https://github.com/getsentry/raven-js/issues/465 - VERSION: '3.19.1', - - debug: false, - - TraceKit: TraceKit, // alias to TraceKit - - /* - * Configure Raven with a DSN and extra options - * - * @param {string} dsn The public Sentry DSN - * @param {object} options Set of global options [optional] - * @return {Raven} - */ - config: function(dsn, options) { - var self = this; - - if (self._globalServer) { - this._logDebug('error', 'Error: Raven has already been configured'); - return self; - } - if (!dsn) return self; - - var globalOptions = self._globalOptions; - - // merge in options - if (options) { - each(options, function(key, value) { - // tags and extra are special and need to be put into context - if (key === 'tags' || key === 'extra' || key === 'user') { - self._globalContext[key] = value; - } else { - globalOptions[key] = value; - } - }); - } - - self.setDSN(dsn); - - // "Script error." is hard coded into browsers for errors that it can't read. - // this is the result of a script being pulled in from an external domain and CORS. - globalOptions.ignoreErrors.push(/^Script error\.?$/); - globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/); - - // join regexp rules into one big rule - globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors); - globalOptions.ignoreUrls = globalOptions.ignoreUrls.length - ? joinRegExp(globalOptions.ignoreUrls) - : false; - globalOptions.whitelistUrls = globalOptions.whitelistUrls.length - ? joinRegExp(globalOptions.whitelistUrls) - : false; - globalOptions.includePaths = joinRegExp(globalOptions.includePaths); - globalOptions.maxBreadcrumbs = Math.max( - 0, - Math.min(globalOptions.maxBreadcrumbs || 100, 100) - ); // default and hard limit is 100 - - var autoBreadcrumbDefaults = { - xhr: true, - console: true, - dom: true, - location: true - }; - - var autoBreadcrumbs = globalOptions.autoBreadcrumbs; - if ({}.toString.call(autoBreadcrumbs) === '[object Object]') { - autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs); - } else if (autoBreadcrumbs !== false) { - autoBreadcrumbs = autoBreadcrumbDefaults; - } - globalOptions.autoBreadcrumbs = autoBreadcrumbs; - - var instrumentDefaults = { - tryCatch: true - }; - - var instrument = globalOptions.instrument; - if ({}.toString.call(instrument) === '[object Object]') { - instrument = objectMerge(instrumentDefaults, instrument); - } else if (instrument !== false) { - instrument = instrumentDefaults; - } - globalOptions.instrument = instrument; - - TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors; - - // return for chaining - return self; - }, - - /* - * Installs a global window.onerror error handler - * to capture and report uncaught exceptions. - * At this point, install() is required to be called due - * to the way TraceKit is set up. - * - * @return {Raven} - */ - install: function() { - var self = this; - if (self.isSetup() && !self._isRavenInstalled) { - TraceKit.report.subscribe(function() { - self._handleOnErrorStackInfo.apply(self, arguments); - }); - if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) { - self._instrumentTryCatch(); - } - - if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs(); - - // Install all of the plugins - self._drainPlugins(); - - self._isRavenInstalled = true; - } - - Error.stackTraceLimit = self._globalOptions.stackTraceLimit; - return this; - }, - - /* - * Set the DSN (can be called multiple time unlike config) - * - * @param {string} dsn The public Sentry DSN - */ - setDSN: function(dsn) { - var self = this, - uri = self._parseDSN(dsn), - lastSlash = uri.path.lastIndexOf('/'), - path = uri.path.substr(1, lastSlash); - - self._dsn = dsn; - self._globalKey = uri.user; - self._globalSecret = uri.pass && uri.pass.substr(1); - self._globalProject = uri.path.substr(lastSlash + 1); - - self._globalServer = self._getGlobalServer(uri); - - self._globalEndpoint = - self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/'; - - // Reset backoff state since we may be pointing at a - // new project/server - this._resetBackoff(); - }, - - /* - * Wrap code within a context so Raven can capture errors - * reliably across domains that is executed immediately. - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The callback to be immediately executed within the context - * @param {array} args An array of arguments to be called with the callback [optional] - */ - context: function(options, func, args) { - if (isFunction(options)) { - args = func || []; - func = options; - options = undefined; - } - - return this.wrap(options, func).apply(this, args); - }, - - /* - * Wrap code within a context and returns back a new function to be executed - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The function to be wrapped in a new context - * @param {function} func A function to call before the try/catch wrapper [optional, private] - * @return {function} The newly wrapped functions with a context - */ - wrap: function(options, func, _before) { - var self = this; - // 1 argument has been passed, and it's not a function - // so just return it - if (isUndefined(func) && !isFunction(options)) { - return options; - } - - // options is optional - if (isFunction(options)) { - func = options; - options = undefined; - } - - // At this point, we've passed along 2 arguments, and the second one - // is not a function either, so we'll just return the second argument. - if (!isFunction(func)) { - return func; - } - - // We don't wanna wrap it twice! - try { - if (func.__raven__) { - return func; - } - - // If this has already been wrapped in the past, return that - if (func.__raven_wrapper__) { - return func.__raven_wrapper__; - } - } catch (e) { - // Just accessing custom props in some Selenium environments - // can cause a "Permission denied" exception (see raven-js#495). - // Bail on wrapping and return the function as-is (defers to window.onerror). - return func; - } - - function wrapped() { - var args = [], - i = arguments.length, - deep = !options || (options && options.deep !== false); - - if (_before && isFunction(_before)) { - _before.apply(this, arguments); - } - - // Recursively wrap all of a function's arguments that are - // functions themselves. - while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i]; - - try { - // Attempt to invoke user-land function - // NOTE: If you are a Sentry user, and you are seeing this stack frame, it - // means Raven caught an error invoking your application code. This is - // expected behavior and NOT indicative of a bug with Raven.js. - return func.apply(this, args); - } catch (e) { - self._ignoreNextOnError(); - self.captureException(e, options); - throw e; - } - } - - // copy over properties of the old function - for (var property in func) { - if (hasKey(func, property)) { - wrapped[property] = func[property]; - } - } - wrapped.prototype = func.prototype; - - func.__raven_wrapper__ = wrapped; - // Signal that this function has been wrapped already - // for both debugging and to prevent it to being wrapped twice - wrapped.__raven__ = true; - wrapped.__inner__ = func; - - return wrapped; - }, - - /* - * Uninstalls the global error handler. - * - * @return {Raven} - */ - uninstall: function() { - TraceKit.report.uninstall(); - - this._restoreBuiltIns(); - - Error.stackTraceLimit = this._originalErrorStackTraceLimit; - this._isRavenInstalled = false; - - return this; - }, - - /* - * Manually capture an exception and send it over to Sentry - * - * @param {error} ex An exception to be logged - * @param {object} options A specific set of options for this error [optional] - * @return {Raven} - */ - captureException: function(ex, options) { - // Cases for sending ex as a message, rather than an exception - var isNotError = !isError(ex); - var isNotErrorEvent = !isErrorEvent(ex); - var isErrorEventWithoutError = isErrorEvent(ex) && !ex.error; - - if ((isNotError && isNotErrorEvent) || isErrorEventWithoutError) { - return this.captureMessage( - ex, - objectMerge( - { - trimHeadFrames: 1, - stacktrace: true // if we fall back to captureMessage, default to attempting a new trace - }, - options - ) - ); - } - - // Get actual Error from ErrorEvent - if (isErrorEvent(ex)) ex = ex.error; - - // Store the raw exception object for potential debugging and introspection - this._lastCapturedException = ex; - - // TraceKit.report will re-raise any exception passed to it, - // which means you have to wrap it in try/catch. Instead, we - // can wrap it here and only re-raise if TraceKit.report - // raises an exception different from the one we asked to - // report on. - try { - var stack = TraceKit.computeStackTrace(ex); - this._handleStackInfo(stack, options); - } catch (ex1) { - if (ex !== ex1) { - throw ex1; - } - } - - return this; - }, - - /* - * Manually send a message to Sentry - * - * @param {string} msg A plain message to be captured in Sentry - * @param {object} options A specific set of options for this message [optional] - * @return {Raven} - */ - captureMessage: function(msg, options) { - // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an - // early call; we'll error on the side of logging anything called before configuration since it's - // probably something you should see: - if ( - !!this._globalOptions.ignoreErrors.test && - this._globalOptions.ignoreErrors.test(msg) - ) { - return; - } - - options = options || {}; - - var data = objectMerge( - { - message: msg + '' // Make sure it's actually a string - }, - options - ); - - var ex; - // Generate a "synthetic" stack trace from this point. - // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative - // of a bug with Raven.js. Sentry generates synthetic traces either by configuration, - // or if it catches a thrown object without a "stack" property. - try { - throw new Error(msg); - } catch (ex1) { - ex = ex1; - } - - // null exception name so `Error` isn't prefixed to msg - ex.name = null; - var stack = TraceKit.computeStackTrace(ex); - - // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1] - var initialCall = stack.stack[1]; - - var fileurl = (initialCall && initialCall.url) || ''; - - if ( - !!this._globalOptions.ignoreUrls.test && - this._globalOptions.ignoreUrls.test(fileurl) - ) { - return; - } - - if ( - !!this._globalOptions.whitelistUrls.test && - !this._globalOptions.whitelistUrls.test(fileurl) - ) { - return; - } - - if (this._globalOptions.stacktrace || (options && options.stacktrace)) { - options = objectMerge( - { - // fingerprint on msg, not stack trace (legacy behavior, could be - // revisited) - fingerprint: msg, - // since we know this is a synthetic trace, the top N-most frames - // MUST be from Raven.js, so mark them as in_app later by setting - // trimHeadFrames - trimHeadFrames: (options.trimHeadFrames || 0) + 1 - }, - options - ); - - var frames = this._prepareFrames(stack, options); - data.stacktrace = { - // Sentry expects frames oldest to newest - frames: frames.reverse() - }; - } - - // Fire away! - this._send(data); - - return this; - }, - - captureBreadcrumb: function(obj) { - var crumb = objectMerge( - { - timestamp: now() / 1000 - }, - obj - ); - - if (isFunction(this._globalOptions.breadcrumbCallback)) { - var result = this._globalOptions.breadcrumbCallback(crumb); - - if (isObject(result) && !isEmptyObject(result)) { - crumb = result; - } else if (result === false) { - return this; - } - } - - this._breadcrumbs.push(crumb); - if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) { - this._breadcrumbs.shift(); - } - return this; - }, - - addPlugin: function(plugin /*arg1, arg2, ... argN*/) { - var pluginArgs = [].slice.call(arguments, 1); - - this._plugins.push([plugin, pluginArgs]); - if (this._isRavenInstalled) { - this._drainPlugins(); - } - - return this; - }, - - /* - * Set/clear a user to be sent along with the payload. - * - * @param {object} user An object representing user data [optional] - * @return {Raven} - */ - setUserContext: function(user) { - // Intentionally do not merge here since that's an unexpected behavior. - this._globalContext.user = user; - - return this; - }, - - /* - * Merge extra attributes to be sent along with the payload. - * - * @param {object} extra An object representing extra data [optional] - * @return {Raven} - */ - setExtraContext: function(extra) { - this._mergeContext('extra', extra); - - return this; - }, - - /* - * Merge tags to be sent along with the payload. - * - * @param {object} tags An object representing tags [optional] - * @return {Raven} - */ - setTagsContext: function(tags) { - this._mergeContext('tags', tags); - - return this; - }, - - /* - * Clear all of the context. - * - * @return {Raven} - */ - clearContext: function() { - this._globalContext = {}; - - return this; - }, - - /* - * Get a copy of the current context. This cannot be mutated. - * - * @return {object} copy of context - */ - getContext: function() { - // lol javascript - return JSON.parse(stringify(this._globalContext)); - }, - - /* - * Set environment of application - * - * @param {string} environment Typically something like 'production'. - * @return {Raven} - */ - setEnvironment: function(environment) { - this._globalOptions.environment = environment; - - return this; - }, - - /* - * Set release version of application - * - * @param {string} release Typically something like a git SHA to identify version - * @return {Raven} - */ - setRelease: function(release) { - this._globalOptions.release = release; - - return this; - }, - - /* - * Set the dataCallback option - * - * @param {function} callback The callback to run which allows the - * data blob to be mutated before sending - * @return {Raven} - */ - setDataCallback: function(callback) { - var original = this._globalOptions.dataCallback; - this._globalOptions.dataCallback = keepOriginalCallback(original, callback); - return this; - }, - - /* - * Set the breadcrumbCallback option - * - * @param {function} callback The callback to run which allows filtering - * or mutating breadcrumbs - * @return {Raven} - */ - setBreadcrumbCallback: function(callback) { - var original = this._globalOptions.breadcrumbCallback; - this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback); - return this; - }, - - /* - * Set the shouldSendCallback option - * - * @param {function} callback The callback to run which allows - * introspecting the blob before sending - * @return {Raven} - */ - setShouldSendCallback: function(callback) { - var original = this._globalOptions.shouldSendCallback; - this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback); - return this; - }, - - /** - * Override the default HTTP transport mechanism that transmits data - * to the Sentry server. - * - * @param {function} transport Function invoked instead of the default - * `makeRequest` handler. - * - * @return {Raven} - */ - setTransport: function(transport) { - this._globalOptions.transport = transport; - - return this; - }, - - /* - * Get the latest raw exception that was captured by Raven. - * - * @return {error} - */ - lastException: function() { - return this._lastCapturedException; - }, - - /* - * Get the last event id - * - * @return {string} - */ - lastEventId: function() { - return this._lastEventId; - }, - - /* - * Determine if Raven is setup and ready to go. - * - * @return {boolean} - */ - isSetup: function() { - if (!this._hasJSON) return false; // needs JSON support - if (!this._globalServer) { - if (!this.ravenNotConfiguredError) { - this.ravenNotConfiguredError = true; - this._logDebug('error', 'Error: Raven has not been configured.'); - } - return false; - } - return true; - }, - - afterLoad: function() { - // TODO: remove window dependence? - - // Attempt to initialize Raven on load - var RavenConfig = _window.RavenConfig; - if (RavenConfig) { - this.config(RavenConfig.dsn, RavenConfig.config).install(); - } - }, - - showReportDialog: function(options) { - if ( - !_document // doesn't work without a document (React native) - ) - return; - - options = options || {}; - - var lastEventId = options.eventId || this.lastEventId(); - if (!lastEventId) { - throw new RavenConfigError('Missing eventId'); - } - - var dsn = options.dsn || this._dsn; - if (!dsn) { - throw new RavenConfigError('Missing DSN'); - } - - var encode = encodeURIComponent; - var qs = ''; - qs += '?eventId=' + encode(lastEventId); - qs += '&dsn=' + encode(dsn); - - var user = options.user || this._globalContext.user; - if (user) { - if (user.name) qs += '&name=' + encode(user.name); - if (user.email) qs += '&email=' + encode(user.email); - } - - var globalServer = this._getGlobalServer(this._parseDSN(dsn)); - - var script = _document.createElement('script'); - script.async = true; - script.src = globalServer + '/api/embed/error-page/' + qs; - (_document.head || _document.body).appendChild(script); - }, - - /**** Private functions ****/ - _ignoreNextOnError: function() { - var self = this; - this._ignoreOnError += 1; - setTimeout(function() { - // onerror should trigger before setTimeout - self._ignoreOnError -= 1; - }); - }, - - _triggerEvent: function(eventType, options) { - // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it - var evt, key; - - if (!this._hasDocument) return; - - options = options || {}; - - eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1); - - if (_document.createEvent) { - evt = _document.createEvent('HTMLEvents'); - evt.initEvent(eventType, true, true); - } else { - evt = _document.createEventObject(); - evt.eventType = eventType; - } - - for (key in options) - if (hasKey(options, key)) { - evt[key] = options[key]; - } - - if (_document.createEvent) { - // IE9 if standards - _document.dispatchEvent(evt); - } else { - // IE8 regardless of Quirks or Standards - // IE9 if quirks - try { - _document.fireEvent('on' + evt.eventType.toLowerCase(), evt); - } catch (e) { - // Do nothing - } - } - }, - - /** - * Wraps addEventListener to capture UI breadcrumbs - * @param evtName the event name (e.g. "click") - * @returns {Function} - * @private - */ - _breadcrumbEventHandler: function(evtName) { - var self = this; - return function(evt) { - // reset keypress timeout; e.g. triggering a 'click' after - // a 'keypress' will reset the keypress debounce so that a new - // set of keypresses can be recorded - self._keypressTimeout = null; - - // It's possible this handler might trigger multiple times for the same - // event (e.g. event propagation through node ancestors). Ignore if we've - // already captured the event. - if (self._lastCapturedEvent === evt) return; - - self._lastCapturedEvent = evt; - - // try/catch both: - // - accessing evt.target (see getsentry/raven-js#838, #768) - // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly - // can throw an exception in some circumstances. - var target; - try { - target = htmlTreeAsString(evt.target); - } catch (e) { - target = ''; - } - - self.captureBreadcrumb({ - category: 'ui.' + evtName, // e.g. ui.click, ui.input - message: target - }); - }; - }, - - /** - * Wraps addEventListener to capture keypress UI events - * @returns {Function} - * @private - */ - _keypressEventHandler: function() { - var self = this, - debounceDuration = 1000; // milliseconds - - // TODO: if somehow user switches keypress target before - // debounce timeout is triggered, we will only capture - // a single breadcrumb from the FIRST target (acceptable?) - return function(evt) { - var target; - try { - target = evt.target; - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - var tagName = target && target.tagName; - - // only consider keypress events on actual input elements - // this will disregard keypresses targeting body (e.g. tabbing - // through elements, hotkeys, etc) - if ( - !tagName || - (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable) - ) - return; - - // record first keypress in a series, but ignore subsequent - // keypresses until debounce clears - var timeout = self._keypressTimeout; - if (!timeout) { - self._breadcrumbEventHandler('input')(evt); - } - clearTimeout(timeout); - self._keypressTimeout = setTimeout(function() { - self._keypressTimeout = null; - }, debounceDuration); - }; - }, - - /** - * Captures a breadcrumb of type "navigation", normalizing input URLs - * @param to the originating URL - * @param from the target URL - * @private - */ - _captureUrlChange: function(from, to) { - var parsedLoc = parseUrl(this._location.href); - var parsedTo = parseUrl(to); - var parsedFrom = parseUrl(from); - - // because onpopstate only tells you the "new" (to) value of location.href, and - // not the previous (from) value, we need to track the value of the current URL - // state ourselves - this._lastHref = to; - - // Use only the path component of the URL if the URL matches the current - // document (almost all the time when using pushState) - if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) - to = parsedTo.relative; - if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) - from = parsedFrom.relative; - - this.captureBreadcrumb({ - category: 'navigation', - data: { - to: to, - from: from - } - }); - }, - - /** - * Wrap timer functions and event targets to catch errors and provide - * better metadata. - */ - _instrumentTryCatch: function() { - var self = this; - - var wrappedBuiltIns = self._wrappedBuiltIns; - - function wrapTimeFn(orig) { - return function(fn, t) { - // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - var originalCallback = args[0]; - if (isFunction(originalCallback)) { - args[0] = self.wrap(originalCallback); - } - - // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it - // also supports only two arguments and doesn't care what this is, so we - // can just call the original function directly. - if (orig.apply) { - return orig.apply(this, args); - } else { - return orig(args[0], args[1]); - } - }; - } - - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - - function wrapEventTarget(global) { - var proto = _window[global] && _window[global].prototype; - if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) { - fill( - proto, - 'addEventListener', - function(orig) { - return function(evtName, fn, capture, secure) { - // preserve arity - try { - if (fn && fn.handleEvent) { - fn.handleEvent = self.wrap(fn.handleEvent); - } - } catch (err) { - // can sometimes get 'Permission denied to access property "handle Event' - } - - // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs` - // so that we don't have more than one wrapper function - var before, clickHandler, keypressHandler; - - if ( - autoBreadcrumbs && - autoBreadcrumbs.dom && - (global === 'EventTarget' || global === 'Node') - ) { - // NOTE: generating multiple handlers per addEventListener invocation, should - // revisit and verify we can just use one (almost certainly) - clickHandler = self._breadcrumbEventHandler('click'); - keypressHandler = self._keypressEventHandler(); - before = function(evt) { - // need to intercept every DOM event in `before` argument, in case that - // same wrapped method is re-used for different events (e.g. mousemove THEN click) - // see #724 - if (!evt) return; - - var eventType; - try { - eventType = evt.type; - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - if (eventType === 'click') return clickHandler(evt); - else if (eventType === 'keypress') return keypressHandler(evt); - }; - } - return orig.call( - this, - evtName, - self.wrap(fn, undefined, before), - capture, - secure - ); - }; - }, - wrappedBuiltIns - ); - fill( - proto, - 'removeEventListener', - function(orig) { - return function(evt, fn, capture, secure) { - try { - fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn); - } catch (e) { - // ignore, accessing __raven_wrapper__ will throw in some Selenium environments - } - return orig.call(this, evt, fn, capture, secure); - }; - }, - wrappedBuiltIns - ); - } - } - - fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns); - fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns); - if (_window.requestAnimationFrame) { - fill( - _window, - 'requestAnimationFrame', - function(orig) { - return function(cb) { - return orig(self.wrap(cb)); - }; - }, - wrappedBuiltIns - ); - } - - // event targets borrowed from bugsnag-js: - // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666 - var eventTargets = [ - 'EventTarget', - 'Window', - 'Node', - 'ApplicationCache', - 'AudioTrackList', - 'ChannelMergerNode', - 'CryptoOperation', - 'EventSource', - 'FileReader', - 'HTMLUnknownElement', - 'IDBDatabase', - 'IDBRequest', - 'IDBTransaction', - 'KeyOperation', - 'MediaController', - 'MessagePort', - 'ModalWindow', - 'Notification', - 'SVGElementInstance', - 'Screen', - 'TextTrack', - 'TextTrackCue', - 'TextTrackList', - 'WebSocket', - 'WebSocketWorker', - 'Worker', - 'XMLHttpRequest', - 'XMLHttpRequestEventTarget', - 'XMLHttpRequestUpload' - ]; - for (var i = 0; i < eventTargets.length; i++) { - wrapEventTarget(eventTargets[i]); - } - }, - - /** - * Instrument browser built-ins w/ breadcrumb capturing - * - XMLHttpRequests - * - DOM interactions (click/typing) - * - window.location changes - * - console - * - * Can be disabled or individually configured via the `autoBreadcrumbs` config option - */ - _instrumentBreadcrumbs: function() { - var self = this; - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - - var wrappedBuiltIns = self._wrappedBuiltIns; - - function wrapProp(prop, xhr) { - if (prop in xhr && isFunction(xhr[prop])) { - fill(xhr, prop, function(orig) { - return self.wrap(orig); - }); // intentionally don't track filled methods on XHR instances - } - } - - if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) { - var xhrproto = XMLHttpRequest.prototype; - fill( - xhrproto, - 'open', - function(origOpen) { - return function(method, url) { - // preserve arity - - // if Sentry key appears in URL, don't capture - if (isString(url) && url.indexOf(self._globalKey) === -1) { - this.__raven_xhr = { - method: method, - url: url, - status_code: null - }; - } - - return origOpen.apply(this, arguments); - }; - }, - wrappedBuiltIns - ); - - fill( - xhrproto, - 'send', - function(origSend) { - return function(data) { - // preserve arity - var xhr = this; - - function onreadystatechangeHandler() { - if (xhr.__raven_xhr && xhr.readyState === 4) { - try { - // touching statusCode in some platforms throws - // an exception - xhr.__raven_xhr.status_code = xhr.status; - } catch (e) { - /* do nothing */ - } - - self.captureBreadcrumb({ - type: 'http', - category: 'xhr', - data: xhr.__raven_xhr - }); - } - } - - var props = ['onload', 'onerror', 'onprogress']; - for (var j = 0; j < props.length; j++) { - wrapProp(props[j], xhr); - } - - if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) { - fill( - xhr, - 'onreadystatechange', - function(orig) { - return self.wrap(orig, undefined, onreadystatechangeHandler); - } /* intentionally don't track this instrumentation */ - ); - } else { - // if onreadystatechange wasn't actually set by the page on this xhr, we - // are free to set our own and capture the breadcrumb - xhr.onreadystatechange = onreadystatechangeHandler; - } - - return origSend.apply(this, arguments); - }; - }, - wrappedBuiltIns - ); - } - - if (autoBreadcrumbs.xhr && 'fetch' in _window) { - fill( - _window, - 'fetch', - function(origFetch) { - return function(fn, t) { - // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - - var fetchInput = args[0]; - var method = 'GET'; - var url; - - if (typeof fetchInput === 'string') { - url = fetchInput; - } else if ('Request' in _window && fetchInput instanceof _window.Request) { - url = fetchInput.url; - if (fetchInput.method) { - method = fetchInput.method; - } - } else { - url = '' + fetchInput; - } - - if (args[1] && args[1].method) { - method = args[1].method; - } - - var fetchData = { - method: method, - url: url, - status_code: null - }; - - self.captureBreadcrumb({ - type: 'http', - category: 'fetch', - data: fetchData - }); - - return origFetch.apply(this, args).then(function(response) { - fetchData.status_code = response.status; - - return response; - }); - }; - }, - wrappedBuiltIns - ); - } - - // Capture breadcrumbs from any click that is unhandled / bubbled up all the way - // to the document. Do this before we instrument addEventListener. - if (autoBreadcrumbs.dom && this._hasDocument) { - if (_document.addEventListener) { - _document.addEventListener('click', self._breadcrumbEventHandler('click'), false); - _document.addEventListener('keypress', self._keypressEventHandler(), false); - } else { - // IE8 Compatibility - _document.attachEvent('onclick', self._breadcrumbEventHandler('click')); - _document.attachEvent('onkeypress', self._keypressEventHandler()); - } - } - - // record navigation (URL) changes - // NOTE: in Chrome App environment, touching history.pushState, *even inside - // a try/catch block*, will cause Chrome to output an error to console.error - // borrowed from: https://github.com/angular/angular.js/pull/13945/files - var chrome = _window.chrome; - var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime; - var hasPushAndReplaceState = - !isChromePackagedApp && - _window.history && - history.pushState && - history.replaceState; - if (autoBreadcrumbs.location && hasPushAndReplaceState) { - // TODO: remove onpopstate handler on uninstall() - var oldOnPopState = _window.onpopstate; - _window.onpopstate = function() { - var currentHref = self._location.href; - self._captureUrlChange(self._lastHref, currentHref); - - if (oldOnPopState) { - return oldOnPopState.apply(this, arguments); - } - }; - - var historyReplacementFunction = function(origHistFunction) { - // note history.pushState.length is 0; intentionally not declaring - // params to preserve 0 arity - return function(/* state, title, url */) { - var url = arguments.length > 2 ? arguments[2] : undefined; - - // url argument is optional - if (url) { - // coerce to string (this is what pushState does) - self._captureUrlChange(self._lastHref, url + ''); - } - - return origHistFunction.apply(this, arguments); - }; - }; - - fill(history, 'pushState', historyReplacementFunction, wrappedBuiltIns); - fill(history, 'replaceState', historyReplacementFunction, wrappedBuiltIns); - } - - if (autoBreadcrumbs.console && 'console' in _window && console.log) { - // console - var consoleMethodCallback = function(msg, data) { - self.captureBreadcrumb({ - message: msg, - level: data.level, - category: 'console' - }); - }; - - each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) { - wrapConsoleMethod(console, level, consoleMethodCallback); - }); - } - }, - - _restoreBuiltIns: function() { - // restore any wrapped builtins - var builtin; - while (this._wrappedBuiltIns.length) { - builtin = this._wrappedBuiltIns.shift(); - - var obj = builtin[0], - name = builtin[1], - orig = builtin[2]; - - obj[name] = orig; - } - }, - - _drainPlugins: function() { - var self = this; - - // FIX ME TODO - each(this._plugins, function(_, plugin) { - var installer = plugin[0]; - var args = plugin[1]; - installer.apply(self, [self].concat(args)); - }); - }, - - _parseDSN: function(str) { - var m = dsnPattern.exec(str), - dsn = {}, - i = 7; - - try { - while (i--) dsn[dsnKeys[i]] = m[i] || ''; - } catch (e) { - throw new RavenConfigError('Invalid DSN: ' + str); - } - - if (dsn.pass && !this._globalOptions.allowSecretKey) { - throw new RavenConfigError( - 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key' - ); - } - - return dsn; - }, - - _getGlobalServer: function(uri) { - // assemble the endpoint from the uri pieces - var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : ''); - - if (uri.protocol) { - globalServer = uri.protocol + ':' + globalServer; - } - return globalServer; - }, - - _handleOnErrorStackInfo: function() { - // if we are intentionally ignoring errors via onerror, bail out - if (!this._ignoreOnError) { - this._handleStackInfo.apply(this, arguments); - } - }, - - _handleStackInfo: function(stackInfo, options) { - var frames = this._prepareFrames(stackInfo, options); - - this._triggerEvent('handle', { - stackInfo: stackInfo, - options: options - }); - - this._processException( - stackInfo.name, - stackInfo.message, - stackInfo.url, - stackInfo.lineno, - frames, - options - ); - }, - - _prepareFrames: function(stackInfo, options) { - var self = this; - var frames = []; - if (stackInfo.stack && stackInfo.stack.length) { - each(stackInfo.stack, function(i, stack) { - var frame = self._normalizeFrame(stack, stackInfo.url); - if (frame) { - frames.push(frame); - } - }); - - // e.g. frames captured via captureMessage throw - if (options && options.trimHeadFrames) { - for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) { - frames[j].in_app = false; - } - } - } - frames = frames.slice(0, this._globalOptions.stackTraceLimit); - return frames; - }, - - _normalizeFrame: function(frame, stackInfoUrl) { - // normalize the frames data - var normalized = { - filename: frame.url, - lineno: frame.line, - colno: frame.column, - function: frame.func || '?' - }; - - // Case when we don't have any information about the error - // E.g. throwing a string or raw object, instead of an `Error` in Firefox - // Generating synthetic error doesn't add any value here - // - // We should probably somehow let a user know that they should fix their code - if (!frame.url) { - normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler - } - - normalized.in_app = !// determine if an exception came from outside of our app - // first we check the global includePaths list. - ( - (!!this._globalOptions.includePaths.test && - !this._globalOptions.includePaths.test(normalized.filename)) || - // Now we check for fun, if the function name is Raven or TraceKit - /(Raven|TraceKit)\./.test(normalized['function']) || - // finally, we do a last ditch effort and check for raven.min.js - /raven\.(min\.)?js$/.test(normalized.filename) - ); - - return normalized; - }, - - _processException: function(type, message, fileurl, lineno, frames, options) { - var prefixedMessage = (type ? type + ': ' : '') + (message || ''); - if ( - !!this._globalOptions.ignoreErrors.test && - (this._globalOptions.ignoreErrors.test(message) || - this._globalOptions.ignoreErrors.test(prefixedMessage)) - ) { - return; - } - - var stacktrace; - - if (frames && frames.length) { - fileurl = frames[0].filename || fileurl; - // Sentry expects frames oldest to newest - // and JS sends them as newest to oldest - frames.reverse(); - stacktrace = {frames: frames}; - } else if (fileurl) { - stacktrace = { - frames: [ - { - filename: fileurl, - lineno: lineno, - in_app: true - } - ] - }; - } - - if ( - !!this._globalOptions.ignoreUrls.test && - this._globalOptions.ignoreUrls.test(fileurl) - ) { - return; - } - - if ( - !!this._globalOptions.whitelistUrls.test && - !this._globalOptions.whitelistUrls.test(fileurl) - ) { - return; - } - - var data = objectMerge( - { - // sentry.interfaces.Exception - exception: { - values: [ - { - type: type, - value: message, - stacktrace: stacktrace - } - ] - }, - culprit: fileurl - }, - options - ); - - // Fire away! - this._send(data); - }, - - _trimPacket: function(data) { - // For now, we only want to truncate the two different messages - // but this could/should be expanded to just trim everything - var max = this._globalOptions.maxMessageLength; - if (data.message) { - data.message = truncate(data.message, max); - } - if (data.exception) { - var exception = data.exception.values[0]; - exception.value = truncate(exception.value, max); - } - - var request = data.request; - if (request) { - if (request.url) { - request.url = truncate(request.url, this._globalOptions.maxUrlLength); - } - if (request.Referer) { - request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength); - } - } - - if (data.breadcrumbs && data.breadcrumbs.values) - this._trimBreadcrumbs(data.breadcrumbs); - - return data; - }, - - /** - * Truncate breadcrumb values (right now just URLs) - */ - _trimBreadcrumbs: function(breadcrumbs) { - // known breadcrumb properties with urls - // TODO: also consider arbitrary prop values that start with (https?)?:// - var urlProps = ['to', 'from', 'url'], - urlProp, - crumb, - data; - - for (var i = 0; i < breadcrumbs.values.length; ++i) { - crumb = breadcrumbs.values[i]; - if ( - !crumb.hasOwnProperty('data') || - !isObject(crumb.data) || - objectFrozen(crumb.data) - ) - continue; - - data = objectMerge({}, crumb.data); - for (var j = 0; j < urlProps.length; ++j) { - urlProp = urlProps[j]; - if (data.hasOwnProperty(urlProp) && data[urlProp]) { - data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength); - } - } - breadcrumbs.values[i].data = data; - } - }, - - _getHttpData: function() { - if (!this._hasNavigator && !this._hasDocument) return; - var httpData = {}; - - if (this._hasNavigator && _navigator.userAgent) { - httpData.headers = { - 'User-Agent': navigator.userAgent - }; - } - - if (this._hasDocument) { - if (_document.location && _document.location.href) { - httpData.url = _document.location.href; - } - if (_document.referrer) { - if (!httpData.headers) httpData.headers = {}; - httpData.headers.Referer = _document.referrer; - } - } - - return httpData; - }, - - _resetBackoff: function() { - this._backoffDuration = 0; - this._backoffStart = null; - }, - - _shouldBackoff: function() { - return this._backoffDuration && now() - this._backoffStart < this._backoffDuration; - }, - - /** - * Returns true if the in-process data payload matches the signature - * of the previously-sent data - * - * NOTE: This has to be done at this level because TraceKit can generate - * data from window.onerror WITHOUT an exception object (IE8, IE9, - * other old browsers). This can take the form of an "exception" - * data object with a single frame (derived from the onerror args). - */ - _isRepeatData: function(current) { - var last = this._lastData; - - if ( - !last || - current.message !== last.message || // defined for captureMessage - current.culprit !== last.culprit // defined for captureException/onerror - ) - return false; - - // Stacktrace interface (i.e. from captureMessage) - if (current.stacktrace || last.stacktrace) { - return isSameStacktrace(current.stacktrace, last.stacktrace); - } else if (current.exception || last.exception) { - // Exception interface (i.e. from captureException/onerror) - return isSameException(current.exception, last.exception); - } - - return true; - }, - - _setBackoffState: function(request) { - // If we are already in a backoff state, don't change anything - if (this._shouldBackoff()) { - return; - } - - var status = request.status; - - // 400 - project_id doesn't exist or some other fatal - // 401 - invalid/revoked dsn - // 429 - too many requests - if (!(status === 400 || status === 401 || status === 429)) return; - - var retry; - try { - // If Retry-After is not in Access-Control-Expose-Headers, most - // browsers will throw an exception trying to access it - retry = request.getResponseHeader('Retry-After'); - retry = parseInt(retry, 10) * 1000; // Retry-After is returned in seconds - } catch (e) { - /* eslint no-empty:0 */ - } - - this._backoffDuration = retry - ? // If Sentry server returned a Retry-After value, use it - retry - : // Otherwise, double the last backoff duration (starts at 1 sec) - this._backoffDuration * 2 || 1000; - - this._backoffStart = now(); - }, - - _send: function(data) { - var globalOptions = this._globalOptions; - - var baseData = { - project: this._globalProject, - logger: globalOptions.logger, - platform: 'javascript' - }, - httpData = this._getHttpData(); - - if (httpData) { - baseData.request = httpData; - } - - // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload - if (data.trimHeadFrames) delete data.trimHeadFrames; - - data = objectMerge(baseData, data); - - // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge - data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags); - data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra); - - // Send along our own collected metadata with extra - data.extra['session:duration'] = now() - this._startTime; - - if (this._breadcrumbs && this._breadcrumbs.length > 0) { - // intentionally make shallow copy so that additions - // to breadcrumbs aren't accidentally sent in this request - data.breadcrumbs = { - values: [].slice.call(this._breadcrumbs, 0) - }; - } - - // If there are no tags/extra, strip the key from the payload alltogther. - if (isEmptyObject(data.tags)) delete data.tags; - - if (this._globalContext.user) { - // sentry.interfaces.User - data.user = this._globalContext.user; - } - - // Include the environment if it's defined in globalOptions - if (globalOptions.environment) data.environment = globalOptions.environment; - - // Include the release if it's defined in globalOptions - if (globalOptions.release) data.release = globalOptions.release; - - // Include server_name if it's defined in globalOptions - if (globalOptions.serverName) data.server_name = globalOptions.serverName; - - if (isFunction(globalOptions.dataCallback)) { - data = globalOptions.dataCallback(data) || data; - } - - // Why?????????? - if (!data || isEmptyObject(data)) { - return; - } - - // Check if the request should be filtered or not - if ( - isFunction(globalOptions.shouldSendCallback) && - !globalOptions.shouldSendCallback(data) - ) { - return; - } - - // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests), - // so drop requests until "cool-off" period has elapsed. - if (this._shouldBackoff()) { - this._logDebug('warn', 'Raven dropped error due to backoff: ', data); - return; - } - - if (typeof globalOptions.sampleRate === 'number') { - if (Math.random() < globalOptions.sampleRate) { - this._sendProcessedPayload(data); - } - } else { - this._sendProcessedPayload(data); - } - }, - - _getUuid: function() { - return uuid4(); - }, - - _sendProcessedPayload: function(data, callback) { - var self = this; - var globalOptions = this._globalOptions; - - if (!this.isSetup()) return; - - // Try and clean up the packet before sending by truncating long values - data = this._trimPacket(data); - - // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback, - // but this would require copying an un-truncated copy of the data packet, which can be - // arbitrarily deep (extra_data) -- could be worthwhile? will revisit - if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) { - this._logDebug('warn', 'Raven dropped repeat event: ', data); - return; - } - - // Send along an event_id if not explicitly passed. - // This event_id can be used to reference the error within Sentry itself. - // Set lastEventId after we know the error should actually be sent - this._lastEventId = data.event_id || (data.event_id = this._getUuid()); - - // Store outbound payload after trim - this._lastData = data; - - this._logDebug('debug', 'Raven about to send:', data); - - var auth = { - sentry_version: '7', - sentry_client: 'raven-js/' + this.VERSION, - sentry_key: this._globalKey - }; - - if (this._globalSecret) { - auth.sentry_secret = this._globalSecret; - } - - var exception = data.exception && data.exception.values[0]; - this.captureBreadcrumb({ - category: 'sentry', - message: exception - ? (exception.type ? exception.type + ': ' : '') + exception.value - : data.message, - event_id: data.event_id, - level: data.level || 'error' // presume error unless specified - }); - - var url = this._globalEndpoint; - (globalOptions.transport || this._makeRequest).call(this, { - url: url, - auth: auth, - data: data, - options: globalOptions, - onSuccess: function success() { - self._resetBackoff(); - - self._triggerEvent('success', { - data: data, - src: url - }); - callback && callback(); - }, - onError: function failure(error) { - self._logDebug('error', 'Raven transport failed to send: ', error); - - if (error.request) { - self._setBackoffState(error.request); - } - - self._triggerEvent('failure', { - data: data, - src: url - }); - error = error || new Error('Raven send failed (no additional details provided)'); - callback && callback(error); - } - }); - }, - - _makeRequest: function(opts) { - var request = _window.XMLHttpRequest && new _window.XMLHttpRequest(); - if (!request) return; - - // if browser doesn't support CORS (e.g. IE7), we are out of luck - var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined'; - - if (!hasCORS) return; - - var url = opts.url; - - if ('withCredentials' in request) { - request.onreadystatechange = function() { - if (request.readyState !== 4) { - return; - } else if (request.status === 200) { - opts.onSuccess && opts.onSuccess(); - } else if (opts.onError) { - var err = new Error('Sentry error code: ' + request.status); - err.request = request; - opts.onError(err); - } - }; - } else { - request = new XDomainRequest(); - // xdomainrequest cannot go http -> https (or vice versa), - // so always use protocol relative - url = url.replace(/^https?:/, ''); - - // onreadystatechange not supported by XDomainRequest - if (opts.onSuccess) { - request.onload = opts.onSuccess; - } - if (opts.onError) { - request.onerror = function() { - var err = new Error('Sentry error code: XDomainRequest'); - err.request = request; - opts.onError(err); - }; - } - } - - // NOTE: auth is intentionally sent as part of query string (NOT as custom - // HTTP header) so as to avoid preflight CORS requests - request.open('POST', url + '?' + urlencode(opts.auth)); - request.send(stringify(opts.data)); - }, - - _logDebug: function(level) { - if (this._originalConsoleMethods[level] && this.debug) { - // In IE<10 console methods do not have their own 'apply' method - Function.prototype.apply.call( - this._originalConsoleMethods[level], - this._originalConsole, - [].slice.call(arguments, 1) - ); - } - }, - - _mergeContext: function(key, context) { - if (isUndefined(context)) { - delete this._globalContext[key]; - } else { - this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context); - } - } -}; - -// Deprecations -Raven.prototype.setUser = Raven.prototype.setUserContext; -Raven.prototype.setReleaseContext = Raven.prototype.setRelease; - -module.exports = Raven; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/singleton.js": -/*!************************************************!*\ - !*** ./node_modules/raven-js/src/singleton.js ***! - \************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/** - * Enforces a single instance of the Raven client, and the - * main entry point for Raven. If you are a consumer of the - * Raven library, you SHOULD load this file (vs raven.js). - **/ - -var RavenConstructor = __webpack_require__(/*! ./raven */ "./node_modules/raven-js/src/raven.js"); - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; -var _Raven = _window.Raven; - -var Raven = new RavenConstructor(); - -/* - * Allow multiple versions of Raven to be installed. - * Strip Raven from the global context and returns the instance. - * - * @return {Raven} - */ -Raven.noConflict = function() { - _window.Raven = _Raven; - return Raven; -}; - -Raven.afterLoad(); - -module.exports = Raven; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/utils.js": -/*!********************************************!*\ - !*** ./node_modules/raven-js/src/utils.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; - -function isObject(what) { - return typeof what === 'object' && what !== null; -} - -// Yanked from https://git.io/vS8DV re-used under CC0 -// with some tiny modifications -function isError(value) { - switch ({}.toString.call(value)) { - case '[object Error]': - return true; - case '[object Exception]': - return true; - case '[object DOMException]': - return true; - default: - return value instanceof Error; - } -} - -function isErrorEvent(value) { - return supportsErrorEvent() && {}.toString.call(value) === '[object ErrorEvent]'; -} - -function isUndefined(what) { - return what === void 0; -} - -function isFunction(what) { - return typeof what === 'function'; -} - -function isString(what) { - return Object.prototype.toString.call(what) === '[object String]'; -} - -function isEmptyObject(what) { - for (var _ in what) return false; // eslint-disable-line guard-for-in, no-unused-vars - return true; -} - -function supportsErrorEvent() { - try { - new ErrorEvent(''); // eslint-disable-line no-new - return true; - } catch (e) { - return false; - } -} - -function wrappedCallback(callback) { - function dataCallback(data, original) { - var normalizedData = callback(data) || data; - if (original) { - return original(normalizedData) || normalizedData; - } - return normalizedData; - } - - return dataCallback; -} - -function each(obj, callback) { - var i, j; - - if (isUndefined(obj.length)) { - for (i in obj) { - if (hasKey(obj, i)) { - callback.call(null, i, obj[i]); - } - } - } else { - j = obj.length; - if (j) { - for (i = 0; i < j; i++) { - callback.call(null, i, obj[i]); - } - } - } -} - -function objectMerge(obj1, obj2) { - if (!obj2) { - return obj1; - } - each(obj2, function(key, value) { - obj1[key] = value; - }); - return obj1; -} - -/** - * This function is only used for react-native. - * react-native freezes object that have already been sent over the - * js bridge. We need this function in order to check if the object is frozen. - * So it's ok that objectFrozen returns false if Object.isFrozen is not - * supported because it's not relevant for other "platforms". See related issue: - * https://github.com/getsentry/react-native-sentry/issues/57 - */ -function objectFrozen(obj) { - if (!Object.isFrozen) { - return false; - } - return Object.isFrozen(obj); -} - -function truncate(str, max) { - return !max || str.length <= max ? str : str.substr(0, max) + '\u2026'; -} - -/** - * hasKey, a better form of hasOwnProperty - * Example: hasKey(MainHostObject, property) === true/false - * - * @param {Object} host object to check property - * @param {string} key to check - */ -function hasKey(object, key) { - return Object.prototype.hasOwnProperty.call(object, key); -} - -function joinRegExp(patterns) { - // Combine an array of regular expressions and strings into one large regexp - // Be mad. - var sources = [], - i = 0, - len = patterns.length, - pattern; - - for (; i < len; i++) { - pattern = patterns[i]; - if (isString(pattern)) { - // If it's a string, we need to escape it - // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions - sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1')); - } else if (pattern && pattern.source) { - // If it's a regexp already, we want to extract the source - sources.push(pattern.source); - } - // Intentionally skip other cases - } - return new RegExp(sources.join('|'), 'i'); -} - -function urlencode(o) { - var pairs = []; - each(o, function(key, value) { - pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); - }); - return pairs.join('&'); -} - -// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B -// intentionally using regex and not href parsing trick because React Native and other -// environments where DOM might not be available -function parseUrl(url) { - var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); - if (!match) return {}; - - // coerce to undefined values to empty string so we don't get 'undefined' - var query = match[6] || ''; - var fragment = match[8] || ''; - return { - protocol: match[2], - host: match[4], - path: match[5], - relative: match[5] + query + fragment // everything minus origin - }; -} -function uuid4() { - var crypto = _window.crypto || _window.msCrypto; - - if (!isUndefined(crypto) && crypto.getRandomValues) { - // Use window.crypto API if available - // eslint-disable-next-line no-undef - var arr = new Uint16Array(8); - crypto.getRandomValues(arr); - - // set 4 in byte 7 - arr[3] = (arr[3] & 0xfff) | 0x4000; - // set 2 most significant bits of byte 9 to '10' - arr[4] = (arr[4] & 0x3fff) | 0x8000; - - var pad = function(num) { - var v = num.toString(16); - while (v.length < 4) { - v = '0' + v; - } - return v; - }; - - return ( - pad(arr[0]) + - pad(arr[1]) + - pad(arr[2]) + - pad(arr[3]) + - pad(arr[4]) + - pad(arr[5]) + - pad(arr[6]) + - pad(arr[7]) - ); - } else { - // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 - return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = (Math.random() * 16) | 0, - v = c === 'x' ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); - } -} - -/** - * Given a child DOM element, returns a query-selector statement describing that - * and its ancestors - * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz] - * @param elem - * @returns {string} - */ -function htmlTreeAsString(elem) { - /* eslint no-extra-parens:0*/ - var MAX_TRAVERSE_HEIGHT = 5, - MAX_OUTPUT_LEN = 80, - out = [], - height = 0, - len = 0, - separator = ' > ', - sepLength = separator.length, - nextStr; - - while (elem && height++ < MAX_TRAVERSE_HEIGHT) { - nextStr = htmlElementAsString(elem); - // bail out if - // - nextStr is the 'html' element - // - the length of the string that would be created exceeds MAX_OUTPUT_LEN - // (ignore this limit if we are on the first iteration) - if ( - nextStr === 'html' || - (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN) - ) { - break; - } - - out.push(nextStr); - - len += nextStr.length; - elem = elem.parentNode; - } - - return out.reverse().join(separator); -} - -/** - * Returns a simple, query-selector representation of a DOM element - * e.g. [HTMLElement] => input#foo.btn[name=baz] - * @param HTMLElement - * @returns {string} - */ -function htmlElementAsString(elem) { - var out = [], - className, - classes, - key, - attr, - i; - - if (!elem || !elem.tagName) { - return ''; - } - - out.push(elem.tagName.toLowerCase()); - if (elem.id) { - out.push('#' + elem.id); - } - - className = elem.className; - if (className && isString(className)) { - classes = className.split(/\s+/); - for (i = 0; i < classes.length; i++) { - out.push('.' + classes[i]); - } - } - var attrWhitelist = ['type', 'name', 'title', 'alt']; - for (i = 0; i < attrWhitelist.length; i++) { - key = attrWhitelist[i]; - attr = elem.getAttribute(key); - if (attr) { - out.push('[' + key + '="' + attr + '"]'); - } - } - return out.join(''); -} - -/** - * Returns true if either a OR b is truthy, but not both - */ -function isOnlyOneTruthy(a, b) { - return !!(!!a ^ !!b); -} - -/** - * Returns true if the two input exception interfaces have the same content - */ -function isSameException(ex1, ex2) { - if (isOnlyOneTruthy(ex1, ex2)) return false; - - ex1 = ex1.values[0]; - ex2 = ex2.values[0]; - - if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false; - - return isSameStacktrace(ex1.stacktrace, ex2.stacktrace); -} - -/** - * Returns true if the two input stack trace interfaces have the same content - */ -function isSameStacktrace(stack1, stack2) { - if (isOnlyOneTruthy(stack1, stack2)) return false; - - var frames1 = stack1.frames; - var frames2 = stack2.frames; - - // Exit early if frame count differs - if (frames1.length !== frames2.length) return false; - - // Iterate through every frame; bail out if anything differs - var a, b; - for (var i = 0; i < frames1.length; i++) { - a = frames1[i]; - b = frames2[i]; - if ( - a.filename !== b.filename || - a.lineno !== b.lineno || - a.colno !== b.colno || - a['function'] !== b['function'] - ) - return false; - } - return true; -} - -/** - * Polyfill a method - * @param obj object e.g. `document` - * @param name method name present on object e.g. `addEventListener` - * @param replacement replacement function - * @param track {optional} record instrumentation to an array - */ -function fill(obj, name, replacement, track) { - var orig = obj[name]; - obj[name] = replacement(orig); - if (track) { - track.push([obj, name, orig]); - } -} - -module.exports = { - isObject: isObject, - isError: isError, - isErrorEvent: isErrorEvent, - isUndefined: isUndefined, - isFunction: isFunction, - isString: isString, - isEmptyObject: isEmptyObject, - supportsErrorEvent: supportsErrorEvent, - wrappedCallback: wrappedCallback, - each: each, - objectMerge: objectMerge, - truncate: truncate, - objectFrozen: objectFrozen, - hasKey: hasKey, - joinRegExp: joinRegExp, - urlencode: urlencode, - uuid4: uuid4, - htmlTreeAsString: htmlTreeAsString, - htmlElementAsString: htmlElementAsString, - isSameException: isSameException, - isSameStacktrace: isSameStacktrace, - parseUrl: parseUrl, - fill: fill -}; - - -/***/ }), - -/***/ "./node_modules/raven-js/vendor/TraceKit/tracekit.js": -/*!***********************************************************!*\ - !*** ./node_modules/raven-js/vendor/TraceKit/tracekit.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var utils = __webpack_require__(/*! ../../src/utils */ "./node_modules/raven-js/src/utils.js"); - -/* - TraceKit - Cross brower stack traces - - This was originally forked from github.com/occ/TraceKit, but has since been - largely re-written and is now maintained as part of raven-js. Tests for - this are in test/vendor. - - MIT license -*/ - -var TraceKit = { - collectWindowErrors: true, - debug: false -}; - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; - -// global reference to slice -var _slice = [].slice; -var UNKNOWN_FUNCTION = '?'; - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types -var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/; - -function getLocationHref() { - if (typeof document === 'undefined' || document.location == null) return ''; - - return document.location.href; -} - -/** - * TraceKit.report: cross-browser processing of unhandled exceptions - * - * Syntax: - * TraceKit.report.subscribe(function(stackInfo) { ... }) - * TraceKit.report.unsubscribe(function(stackInfo) { ... }) - * TraceKit.report(exception) - * try { ...code... } catch(ex) { TraceKit.report(ex); } - * - * Supports: - * - Firefox: full stack trace with line numbers, plus column number - * on top frame; column number is not guaranteed - * - Opera: full stack trace with line and column numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - IE: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - * In theory, TraceKit should work on all of the following versions: - * - IE5.5+ (only 8.0 tested) - * - Firefox 0.9+ (only 3.5+ tested) - * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require - * Exceptions Have Stacktrace to be enabled in opera:config) - * - Safari 3+ (only 4+ tested) - * - Chrome 1+ (only 5+ tested) - * - Konqueror 3.5+ (untested) - * - * Requires TraceKit.computeStackTrace. - * - * Tries to catch all unhandled exceptions and report them to the - * subscribed handlers. Please note that TraceKit.report will rethrow the - * exception. This is REQUIRED in order to get a useful stack trace in IE. - * If the exception does not reach the top of the browser, you will only - * get a stack trace from the point where TraceKit.report was called. - * - * Handlers receive a stackInfo object as described in the - * TraceKit.computeStackTrace docs. - */ -TraceKit.report = (function reportModuleWrapper() { - var handlers = [], - lastArgs = null, - lastException = null, - lastExceptionStack = null; - - /** - * Add a crash handler. - * @param {Function} handler - */ - function subscribe(handler) { - installGlobalHandler(); - handlers.push(handler); - } - - /** - * Remove a crash handler. - * @param {Function} handler - */ - function unsubscribe(handler) { - for (var i = handlers.length - 1; i >= 0; --i) { - if (handlers[i] === handler) { - handlers.splice(i, 1); - } - } - } - - /** - * Remove all crash handlers. - */ - function unsubscribeAll() { - uninstallGlobalHandler(); - handlers = []; - } - - /** - * Dispatch stack information to all handlers. - * @param {Object.} stack - */ - function notifyHandlers(stack, isWindowError) { - var exception = null; - if (isWindowError && !TraceKit.collectWindowErrors) { - return; - } - for (var i in handlers) { - if (handlers.hasOwnProperty(i)) { - try { - handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); - } catch (inner) { - exception = inner; - } - } - } - - if (exception) { - throw exception; - } - } - - var _oldOnerrorHandler, _onErrorHandlerInstalled; - - /** - * Ensures all global unhandled exceptions are recorded. - * Supported by Gecko and IE. - * @param {string} message Error message. - * @param {string} url URL of script that generated the exception. - * @param {(number|string)} lineNo The line number at which the error - * occurred. - * @param {?(number|string)} colNo The column number at which the error - * occurred. - * @param {?Error} ex The actual Error object. - */ - function traceKitWindowOnError(message, url, lineNo, colNo, ex) { - var stack = null; - - if (lastExceptionStack) { - TraceKit.computeStackTrace.augmentStackTraceWithInitialElement( - lastExceptionStack, - url, - lineNo, - message - ); - processLastException(); - } else if (ex && utils.isError(ex)) { - // non-string `ex` arg; attempt to extract stack trace - - // New chrome and blink send along a real error object - // Let's just report that like a normal error. - // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror - stack = TraceKit.computeStackTrace(ex); - notifyHandlers(stack, true); - } else { - var location = { - url: url, - line: lineNo, - column: colNo - }; - - var name = undefined; - var msg = message; // must be new var or will modify original `arguments` - var groups; - if ({}.toString.call(message) === '[object String]') { - var groups = message.match(ERROR_TYPES_RE); - if (groups) { - name = groups[1]; - msg = groups[2]; - } - } - - location.func = UNKNOWN_FUNCTION; - - stack = { - name: name, - message: msg, - url: getLocationHref(), - stack: [location] - }; - notifyHandlers(stack, true); - } - - if (_oldOnerrorHandler) { - return _oldOnerrorHandler.apply(this, arguments); - } - - return false; - } - - function installGlobalHandler() { - if (_onErrorHandlerInstalled) { - return; - } - _oldOnerrorHandler = _window.onerror; - _window.onerror = traceKitWindowOnError; - _onErrorHandlerInstalled = true; - } - - function uninstallGlobalHandler() { - if (!_onErrorHandlerInstalled) { - return; - } - _window.onerror = _oldOnerrorHandler; - _onErrorHandlerInstalled = false; - _oldOnerrorHandler = undefined; - } - - function processLastException() { - var _lastExceptionStack = lastExceptionStack, - _lastArgs = lastArgs; - lastArgs = null; - lastExceptionStack = null; - lastException = null; - notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs)); - } - - /** - * Reports an unhandled Error to TraceKit. - * @param {Error} ex - * @param {?boolean} rethrow If false, do not re-throw the exception. - * Only used for window.onerror to not cause an infinite loop of - * rethrowing. - */ - function report(ex, rethrow) { - var args = _slice.call(arguments, 1); - if (lastExceptionStack) { - if (lastException === ex) { - return; // already caught by an inner catch block, ignore - } else { - processLastException(); - } - } - - var stack = TraceKit.computeStackTrace(ex); - lastExceptionStack = stack; - lastException = ex; - lastArgs = args; - - // If the stack trace is incomplete, wait for 2 seconds for - // slow slow IE to see if onerror occurs or not before reporting - // this exception; otherwise, we will end up with an incomplete - // stack trace - setTimeout(function() { - if (lastException === ex) { - processLastException(); - } - }, stack.incomplete ? 2000 : 0); - - if (rethrow !== false) { - throw ex; // re-throw to propagate to the top level (and cause window.onerror) - } - } - - report.subscribe = subscribe; - report.unsubscribe = unsubscribe; - report.uninstall = unsubscribeAll; - return report; -})(); - -/** - * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript - * - * Syntax: - * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below) - * Returns: - * s.name - exception name - * s.message - exception message - * s.stack[i].url - JavaScript or HTML file URL - * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work) - * s.stack[i].args - arguments passed to the function, if known - * s.stack[i].line - line number, if known - * s.stack[i].column - column number, if known - * - * Supports: - * - Firefox: full stack trace with line numbers and unreliable column - * number on top frame - * - Opera 10: full stack trace with line and column numbers - * - Opera 9-: full stack trace with line numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the topmost stacktrace element - * only - * - IE: no line numbers whatsoever - * - * Tries to guess names of anonymous functions by looking for assignments - * in the source code. In IE and Safari, we have to guess source file names - * by searching for function bodies inside all page scripts. This will not - * work for scripts that are loaded cross-domain. - * Here be dragons: some function names may be guessed incorrectly, and - * duplicate functions may be mismatched. - * - * TraceKit.computeStackTrace should only be used for tracing purposes. - * Logging of unhandled exceptions should be done with TraceKit.report, - * which builds on top of TraceKit.computeStackTrace and provides better - * IE support by utilizing the window.onerror event to retrieve information - * about the top of the stack. - * - * Note: In IE and Safari, no stack trace is recorded on the Error object, - * so computeStackTrace instead walks its *own* chain of callers. - * This means that: - * * in Safari, some methods may be missing from the stack trace; - * * in IE, the topmost function in the stack trace will always be the - * caller of computeStackTrace. - * - * This is okay for tracing (because you are likely to be calling - * computeStackTrace from the function you want to be the topmost element - * of the stack trace anyway), but not okay for logging unhandled - * exceptions (because your catch block will likely be far away from the - * inner function that actually caused the exception). - * - */ -TraceKit.computeStackTrace = (function computeStackTraceWrapper() { - // Contents of Exception in various browsers. - // - // SAFARI: - // ex.message = Can't find variable: qq - // ex.line = 59 - // ex.sourceId = 580238192 - // ex.sourceURL = http://... - // ex.expressionBeginOffset = 96 - // ex.expressionCaretOffset = 98 - // ex.expressionEndOffset = 98 - // ex.name = ReferenceError - // - // FIREFOX: - // ex.message = qq is not defined - // ex.fileName = http://... - // ex.lineNumber = 59 - // ex.columnNumber = 69 - // ex.stack = ...stack trace... (see the example below) - // ex.name = ReferenceError - // - // CHROME: - // ex.message = qq is not defined - // ex.name = ReferenceError - // ex.type = not_defined - // ex.arguments = ['aa'] - // ex.stack = ...stack trace... - // - // INTERNET EXPLORER: - // ex.message = ... - // ex.name = ReferenceError - // - // OPERA: - // ex.message = ...message... (see the example below) - // ex.name = ReferenceError - // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message) - // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace' - - /** - * Computes stack trace information from the stack property. - * Chrome and Gecko use this property. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceFromStackProp(ex) { - if (typeof ex.stack === 'undefined' || !ex.stack) return; - - var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i, - gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i, - winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i, - // Used to additionally parse URL/line/column from eval frames - geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i, - chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/, - lines = ex.stack.split('\n'), - stack = [], - submatch, - parts, - element, - reference = /^(.*) is undefined$/.exec(ex.message); - - for (var i = 0, j = lines.length; i < j; ++i) { - if ((parts = chrome.exec(lines[i]))) { - var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line - var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line - if (isEval && (submatch = chromeEval.exec(parts[2]))) { - // throw out eval line/column and use top-most line/column number - parts[2] = submatch[1]; // url - parts[3] = submatch[2]; // line - parts[4] = submatch[3]; // column - } - element = { - url: !isNative ? parts[2] : null, - func: parts[1] || UNKNOWN_FUNCTION, - args: isNative ? [parts[2]] : [], - line: parts[3] ? +parts[3] : null, - column: parts[4] ? +parts[4] : null - }; - } else if ((parts = winjs.exec(lines[i]))) { - element = { - url: parts[2], - func: parts[1] || UNKNOWN_FUNCTION, - args: [], - line: +parts[3], - column: parts[4] ? +parts[4] : null - }; - } else if ((parts = gecko.exec(lines[i]))) { - var isEval = parts[3] && parts[3].indexOf(' > eval') > -1; - if (isEval && (submatch = geckoEval.exec(parts[3]))) { - // throw out eval line/column and use top-most line number - parts[3] = submatch[1]; - parts[4] = submatch[2]; - parts[5] = null; // no column when eval - } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') { - // FireFox uses this awesome columnNumber property for its top frame - // Also note, Firefox's column number is 0-based and everything else expects 1-based, - // so adding 1 - // NOTE: this hack doesn't work if top-most frame is eval - stack[0].column = ex.columnNumber + 1; - } - element = { - url: parts[3], - func: parts[1] || UNKNOWN_FUNCTION, - args: parts[2] ? parts[2].split(',') : [], - line: parts[4] ? +parts[4] : null, - column: parts[5] ? +parts[5] : null - }; - } else { - continue; - } - - if (!element.func && element.line) { - element.func = UNKNOWN_FUNCTION; - } - - stack.push(element); - } - - if (!stack.length) { - return null; - } - - return { - name: ex.name, - message: ex.message, - url: getLocationHref(), - stack: stack - }; - } - - /** - * Adds information about the first frame to incomplete stack traces. - * Safari and IE require this to get complete data on the first frame. - * @param {Object.} stackInfo Stack trace information from - * one of the compute* methods. - * @param {string} url The URL of the script that caused an error. - * @param {(number|string)} lineNo The line number of the script that - * caused an error. - * @param {string=} message The error generated by the browser, which - * hopefully contains the name of the object that caused the error. - * @return {boolean} Whether or not the stack information was - * augmented. - */ - function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) { - var initial = { - url: url, - line: lineNo - }; - - if (initial.url && initial.line) { - stackInfo.incomplete = false; - - if (!initial.func) { - initial.func = UNKNOWN_FUNCTION; - } - - if (stackInfo.stack.length > 0) { - if (stackInfo.stack[0].url === initial.url) { - if (stackInfo.stack[0].line === initial.line) { - return false; // already in stack trace - } else if ( - !stackInfo.stack[0].line && - stackInfo.stack[0].func === initial.func - ) { - stackInfo.stack[0].line = initial.line; - return false; - } - } - } - - stackInfo.stack.unshift(initial); - stackInfo.partial = true; - return true; - } else { - stackInfo.incomplete = true; - } - - return false; - } - - /** - * Computes stack trace information by walking the arguments.caller - * chain at the time the exception occurred. This will cause earlier - * frames to be missed but is the only way to get any stack trace in - * Safari and IE. The top frame is restored by - * {@link augmentStackTraceWithInitialElement}. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceByWalkingCallerChain(ex, depth) { - var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i, - stack = [], - funcs = {}, - recursion = false, - parts, - item, - source; - - for ( - var curr = computeStackTraceByWalkingCallerChain.caller; - curr && !recursion; - curr = curr.caller - ) { - if (curr === computeStackTrace || curr === TraceKit.report) { - // console.log('skipping internal function'); - continue; - } - - item = { - url: null, - func: UNKNOWN_FUNCTION, - line: null, - column: null - }; - - if (curr.name) { - item.func = curr.name; - } else if ((parts = functionName.exec(curr.toString()))) { - item.func = parts[1]; - } - - if (typeof item.func === 'undefined') { - try { - item.func = parts.input.substring(0, parts.input.indexOf('{')); - } catch (e) {} - } - - if (funcs['' + curr]) { - recursion = true; - } else { - funcs['' + curr] = true; - } - - stack.push(item); - } - - if (depth) { - // console.log('depth is ' + depth); - // console.log('stack is ' + stack.length); - stack.splice(0, depth); - } - - var result = { - name: ex.name, - message: ex.message, - url: getLocationHref(), - stack: stack - }; - augmentStackTraceWithInitialElement( - result, - ex.sourceURL || ex.fileName, - ex.line || ex.lineNumber, - ex.message || ex.description - ); - return result; - } - - /** - * Computes a stack trace for an exception. - * @param {Error} ex - * @param {(string|number)=} depth - */ - function computeStackTrace(ex, depth) { - var stack = null; - depth = depth == null ? 0 : +depth; - - try { - stack = computeStackTraceFromStackProp(ex); - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - - try { - stack = computeStackTraceByWalkingCallerChain(ex, depth + 1); - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - return { - name: ex.name, - message: ex.message, - url: getLocationHref() - }; - } - - computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement; - computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp; - - return computeStackTrace; -})(); - -module.exports = TraceKit; - - -/***/ }), - -/***/ "./node_modules/raven-js/vendor/json-stringify-safe/stringify.js": -/*!***********************************************************************!*\ - !*** ./node_modules/raven-js/vendor/json-stringify-safe/stringify.js ***! - \***********************************************************************/ -/***/ ((module, exports) => { - -/* - json-stringify-safe - Like JSON.stringify, but doesn't throw on circular references. - - Originally forked from https://github.com/isaacs/json-stringify-safe - version 5.0.1 on 3/8/2017 and modified to handle Errors serialization - and IE8 compatibility. Tests for this are in test/vendor. - - ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE -*/ - -exports = module.exports = stringify; -exports.getSerialize = serializer; - -function indexOf(haystack, needle) { - for (var i = 0; i < haystack.length; ++i) { - if (haystack[i] === needle) return i; - } - return -1; -} - -function stringify(obj, replacer, spaces, cycleReplacer) { - return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces); -} - -// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106 -function stringifyError(value) { - var err = { - // These properties are implemented as magical getters and don't show up in for in - stack: value.stack, - message: value.message, - name: value.name - }; - - for (var i in value) { - if (Object.prototype.hasOwnProperty.call(value, i)) { - err[i] = value[i]; - } - } - - return err; -} - -function serializer(replacer, cycleReplacer) { - var stack = []; - var keys = []; - - if (cycleReplacer == null) { - cycleReplacer = function(key, value) { - if (stack[0] === value) { - return '[Circular ~]'; - } - return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']'; - }; - } - - return function(key, value) { - if (stack.length > 0) { - var thisPos = indexOf(stack, this); - ~thisPos ? stack.splice(thisPos + 1) : stack.push(this); - ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key); - - if (~indexOf(stack, value)) { - value = cycleReplacer.call(this, key, value); - } - } else { - stack.push(value); - } - - return replacer == null - ? value instanceof Error ? stringifyError(value) : value - : replacer.call(this, key, value); - }; -} - - -/***/ }), - -/***/ "./node_modules/react/cjs/react-jsx-runtime.development.js": -/*!*****************************************************************!*\ - !*** ./node_modules/react/cjs/react-jsx-runtime.development.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; -/** @license React v17.0.2 - * react-jsx-runtime.development.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - -if (true) { - (function() { -'use strict'; - -var React = __webpack_require__(/*! react */ "react"); -var _assign = __webpack_require__(/*! object-assign */ "./node_modules/object-assign/index.js"); - -// ATTENTION -// When adding new symbols to this file, -// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' -// The Symbol used to tag the ReactElement-like types. If there is no native Symbol -// nor polyfill, then a plain number is used for performance. -var REACT_ELEMENT_TYPE = 0xeac7; -var REACT_PORTAL_TYPE = 0xeaca; -exports.Fragment = 0xeacb; -var REACT_STRICT_MODE_TYPE = 0xeacc; -var REACT_PROFILER_TYPE = 0xead2; -var REACT_PROVIDER_TYPE = 0xeacd; -var REACT_CONTEXT_TYPE = 0xeace; -var REACT_FORWARD_REF_TYPE = 0xead0; -var REACT_SUSPENSE_TYPE = 0xead1; -var REACT_SUSPENSE_LIST_TYPE = 0xead8; -var REACT_MEMO_TYPE = 0xead3; -var REACT_LAZY_TYPE = 0xead4; -var REACT_BLOCK_TYPE = 0xead9; -var REACT_SERVER_BLOCK_TYPE = 0xeada; -var REACT_FUNDAMENTAL_TYPE = 0xead5; -var REACT_SCOPE_TYPE = 0xead7; -var REACT_OPAQUE_ID_TYPE = 0xeae0; -var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; -var REACT_OFFSCREEN_TYPE = 0xeae2; -var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; - -if (typeof Symbol === 'function' && Symbol.for) { - var symbolFor = Symbol.for; - REACT_ELEMENT_TYPE = symbolFor('react.element'); - REACT_PORTAL_TYPE = symbolFor('react.portal'); - exports.Fragment = symbolFor('react.fragment'); - REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode'); - REACT_PROFILER_TYPE = symbolFor('react.profiler'); - REACT_PROVIDER_TYPE = symbolFor('react.provider'); - REACT_CONTEXT_TYPE = symbolFor('react.context'); - REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref'); - REACT_SUSPENSE_TYPE = symbolFor('react.suspense'); - REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list'); - REACT_MEMO_TYPE = symbolFor('react.memo'); - REACT_LAZY_TYPE = symbolFor('react.lazy'); - REACT_BLOCK_TYPE = symbolFor('react.block'); - REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block'); - REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental'); - REACT_SCOPE_TYPE = symbolFor('react.scope'); - REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id'); - REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode'); - REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen'); - REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden'); -} - -var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; -var FAUX_ITERATOR_SYMBOL = '@@iterator'; -function getIteratorFn(maybeIterable) { - if (maybeIterable === null || typeof maybeIterable !== 'object') { - return null; - } - - var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; - - if (typeof maybeIterator === 'function') { - return maybeIterator; - } - - return null; -} - -var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; - -function error(format) { - { - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; - } - - printWarning('error', format, args); - } -} - -function printWarning(level, format, args) { - // When changing this logic, you might want to also - // update consoleWithStackDev.www.js as well. - { - var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - var stack = ReactDebugCurrentFrame.getStackAddendum(); - - if (stack !== '') { - format += '%s'; - args = args.concat([stack]); - } - - var argsWithFormat = args.map(function (item) { - return '' + item; - }); // Careful: RN currently depends on this prefix - - argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it - // breaks IE9: https://github.com/facebook/react/issues/13610 - // eslint-disable-next-line react-internal/no-production-logging - - Function.prototype.apply.call(console[level], console, argsWithFormat); - } -} - -// Filter certain DOM attributes (e.g. src, href) if their values are empty strings. - -var enableScopeAPI = false; // Experimental Create Event Handle API. - -function isValidElementType(type) { - if (typeof type === 'string' || typeof type === 'function') { - return true; - } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). - - - if (type === exports.Fragment || type === REACT_PROFILER_TYPE || type === REACT_DEBUG_TRACING_MODE_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) { - return true; - } - - if (typeof type === 'object' && type !== null) { - if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) { - return true; - } - } - - return false; -} - -function getWrappedName(outerType, innerType, wrapperName) { - var functionName = innerType.displayName || innerType.name || ''; - return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); -} - -function getContextName(type) { - return type.displayName || 'Context'; -} - -function getComponentName(type) { - if (type == null) { - // Host root, text node or just invalid type. - return null; - } - - { - if (typeof type.tag === 'number') { - error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); - } - } - - if (typeof type === 'function') { - return type.displayName || type.name || null; - } - - if (typeof type === 'string') { - return type; - } - - switch (type) { - case exports.Fragment: - return 'Fragment'; - - case REACT_PORTAL_TYPE: - return 'Portal'; - - case REACT_PROFILER_TYPE: - return 'Profiler'; - - case REACT_STRICT_MODE_TYPE: - return 'StrictMode'; - - case REACT_SUSPENSE_TYPE: - return 'Suspense'; - - case REACT_SUSPENSE_LIST_TYPE: - return 'SuspenseList'; - } - - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_CONTEXT_TYPE: - var context = type; - return getContextName(context) + '.Consumer'; - - case REACT_PROVIDER_TYPE: - var provider = type; - return getContextName(provider._context) + '.Provider'; - - case REACT_FORWARD_REF_TYPE: - return getWrappedName(type, type.render, 'ForwardRef'); - - case REACT_MEMO_TYPE: - return getComponentName(type.type); - - case REACT_BLOCK_TYPE: - return getComponentName(type._render); - - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - - try { - return getComponentName(init(payload)); - } catch (x) { - return null; - } - } - } - } - - return null; -} - -// Helpers to patch console.logs to avoid logging during side-effect free -// replaying on render function. This currently only patches the object -// lazily which won't cover if the log function was extracted eagerly. -// We could also eagerly patch the method. -var disabledDepth = 0; -var prevLog; -var prevInfo; -var prevWarn; -var prevError; -var prevGroup; -var prevGroupCollapsed; -var prevGroupEnd; - -function disabledLog() {} - -disabledLog.__reactDisabledLog = true; -function disableLogs() { - { - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - prevLog = console.log; - prevInfo = console.info; - prevWarn = console.warn; - prevError = console.error; - prevGroup = console.group; - prevGroupCollapsed = console.groupCollapsed; - prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 - - var props = { - configurable: true, - enumerable: true, - value: disabledLog, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. - - Object.defineProperties(console, { - info: props, - log: props, - warn: props, - error: props, - group: props, - groupCollapsed: props, - groupEnd: props - }); - /* eslint-enable react-internal/no-production-logging */ - } - - disabledDepth++; - } -} -function reenableLogs() { - { - disabledDepth--; - - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - var props = { - configurable: true, - enumerable: true, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. - - Object.defineProperties(console, { - log: _assign({}, props, { - value: prevLog - }), - info: _assign({}, props, { - value: prevInfo - }), - warn: _assign({}, props, { - value: prevWarn - }), - error: _assign({}, props, { - value: prevError - }), - group: _assign({}, props, { - value: prevGroup - }), - groupCollapsed: _assign({}, props, { - value: prevGroupCollapsed - }), - groupEnd: _assign({}, props, { - value: prevGroupEnd - }) - }); - /* eslint-enable react-internal/no-production-logging */ - } - - if (disabledDepth < 0) { - error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); - } - } -} - -var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; -var prefix; -function describeBuiltInComponentFrame(name, source, ownerFn) { - { - if (prefix === undefined) { - // Extract the VM specific prefix used by each line. - try { - throw Error(); - } catch (x) { - var match = x.stack.trim().match(/\n( *(at )?)/); - prefix = match && match[1] || ''; - } - } // We use the prefix to ensure our stacks line up with native stack frames. - - - return '\n' + prefix + name; - } -} -var reentry = false; -var componentFrameCache; - -{ - var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; - componentFrameCache = new PossiblyWeakMap(); -} - -function describeNativeComponentFrame(fn, construct) { - // If something asked for a stack inside a fake render, it should get ignored. - if (!fn || reentry) { - return ''; - } - - { - var frame = componentFrameCache.get(fn); - - if (frame !== undefined) { - return frame; - } - } - - var control; - reentry = true; - var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. - - Error.prepareStackTrace = undefined; - var previousDispatcher; - - { - previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function - // for warnings. - - ReactCurrentDispatcher.current = null; - disableLogs(); - } - - try { - // This should throw. - if (construct) { - // Something should be setting the props in the constructor. - var Fake = function () { - throw Error(); - }; // $FlowFixMe - - - Object.defineProperty(Fake.prototype, 'props', { - set: function () { - // We use a throwing setter instead of frozen or non-writable props - // because that won't throw in a non-strict mode function. - throw Error(); - } - }); - - if (typeof Reflect === 'object' && Reflect.construct) { - // We construct a different control for this case to include any extra - // frames added by the construct call. - try { - Reflect.construct(Fake, []); - } catch (x) { - control = x; - } - - Reflect.construct(fn, [], Fake); - } else { - try { - Fake.call(); - } catch (x) { - control = x; - } - - fn.call(Fake.prototype); - } - } else { - try { - throw Error(); - } catch (x) { - control = x; - } - - fn(); - } - } catch (sample) { - // This is inlined manually because closure doesn't do it for us. - if (sample && control && typeof sample.stack === 'string') { - // This extracts the first frame from the sample that isn't also in the control. - // Skipping one frame that we assume is the frame that calls the two. - var sampleLines = sample.stack.split('\n'); - var controlLines = control.stack.split('\n'); - var s = sampleLines.length - 1; - var c = controlLines.length - 1; - - while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { - // We expect at least one stack frame to be shared. - // Typically this will be the root most one. However, stack frames may be - // cut off due to maximum stack limits. In this case, one maybe cut off - // earlier than the other. We assume that the sample is longer or the same - // and there for cut off earlier. So we should find the root most frame in - // the sample somewhere in the control. - c--; - } - - for (; s >= 1 && c >= 0; s--, c--) { - // Next we find the first one that isn't the same which should be the - // frame that called our sample function and the control. - if (sampleLines[s] !== controlLines[c]) { - // In V8, the first line is describing the message but other VMs don't. - // If we're about to return the first line, and the control is also on the same - // line, that's a pretty good indicator that our sample threw at same line as - // the control. I.e. before we entered the sample frame. So we ignore this result. - // This can happen if you passed a class to function component, or non-function. - if (s !== 1 || c !== 1) { - do { - s--; - c--; // We may still have similar intermediate frames from the construct call. - // The next one that isn't the same should be our match though. - - if (c < 0 || sampleLines[s] !== controlLines[c]) { - // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. - var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); - - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, _frame); - } - } // Return the line we found. - - - return _frame; - } - } while (s >= 1 && c >= 0); - } - - break; - } - } - } - } finally { - reentry = false; - - { - ReactCurrentDispatcher.current = previousDispatcher; - reenableLogs(); - } - - Error.prepareStackTrace = previousPrepareStackTrace; - } // Fallback to just using the name if we couldn't make it throw. - - - var name = fn ? fn.displayName || fn.name : ''; - var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; - - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, syntheticFrame); - } - } - - return syntheticFrame; -} -function describeFunctionComponentFrame(fn, source, ownerFn) { - { - return describeNativeComponentFrame(fn, false); - } -} - -function shouldConstruct(Component) { - var prototype = Component.prototype; - return !!(prototype && prototype.isReactComponent); -} - -function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { - - if (type == null) { - return ''; - } - - if (typeof type === 'function') { - { - return describeNativeComponentFrame(type, shouldConstruct(type)); - } - } - - if (typeof type === 'string') { - return describeBuiltInComponentFrame(type); - } - - switch (type) { - case REACT_SUSPENSE_TYPE: - return describeBuiltInComponentFrame('Suspense'); - - case REACT_SUSPENSE_LIST_TYPE: - return describeBuiltInComponentFrame('SuspenseList'); - } - - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_FORWARD_REF_TYPE: - return describeFunctionComponentFrame(type.render); - - case REACT_MEMO_TYPE: - // Memo may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); - - case REACT_BLOCK_TYPE: - return describeFunctionComponentFrame(type._render); - - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - - try { - // Lazy may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); - } catch (x) {} - } - } - } - - return ''; -} - -var loggedTypeFailures = {}; -var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - -function setCurrentlyValidatingElement(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - ReactDebugCurrentFrame.setExtraStackFrame(stack); - } else { - ReactDebugCurrentFrame.setExtraStackFrame(null); - } - } -} - -function checkPropTypes(typeSpecs, values, location, componentName, element) { - { - // $FlowFixMe This is okay but Flow doesn't know it. - var has = Function.call.bind(Object.prototype.hasOwnProperty); - - for (var typeSpecName in typeSpecs) { - if (has(typeSpecs, typeSpecName)) { - var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. - - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - if (typeof typeSpecs[typeSpecName] !== 'function') { - var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); - err.name = 'Invariant Violation'; - throw err; - } - - error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); - } catch (ex) { - error$1 = ex; - } - - if (error$1 && !(error$1 instanceof Error)) { - setCurrentlyValidatingElement(element); - - error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); - - setCurrentlyValidatingElement(null); - } - - if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error$1.message] = true; - setCurrentlyValidatingElement(element); - - error('Failed %s type: %s', location, error$1.message); - - setCurrentlyValidatingElement(null); - } - } - } - } -} - -var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var RESERVED_PROPS = { - key: true, - ref: true, - __self: true, - __source: true -}; -var specialPropKeyWarningShown; -var specialPropRefWarningShown; -var didWarnAboutStringRefs; - -{ - didWarnAboutStringRefs = {}; -} - -function hasValidRef(config) { - { - if (hasOwnProperty.call(config, 'ref')) { - var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; - - if (getter && getter.isReactWarning) { - return false; - } - } - } - - return config.ref !== undefined; -} - -function hasValidKey(config) { - { - if (hasOwnProperty.call(config, 'key')) { - var getter = Object.getOwnPropertyDescriptor(config, 'key').get; - - if (getter && getter.isReactWarning) { - return false; - } - } - } - - return config.key !== undefined; -} - -function warnIfStringRefCannotBeAutoConverted(config, self) { - { - if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) { - var componentName = getComponentName(ReactCurrentOwner.current.type); - - if (!didWarnAboutStringRefs[componentName]) { - error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref); - - didWarnAboutStringRefs[componentName] = true; - } - } - } -} - -function defineKeyPropWarningGetter(props, displayName) { - { - var warnAboutAccessingKey = function () { - if (!specialPropKeyWarningShown) { - specialPropKeyWarningShown = true; - - error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); - } - }; - - warnAboutAccessingKey.isReactWarning = true; - Object.defineProperty(props, 'key', { - get: warnAboutAccessingKey, - configurable: true - }); - } -} - -function defineRefPropWarningGetter(props, displayName) { - { - var warnAboutAccessingRef = function () { - if (!specialPropRefWarningShown) { - specialPropRefWarningShown = true; - - error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); - } - }; - - warnAboutAccessingRef.isReactWarning = true; - Object.defineProperty(props, 'ref', { - get: warnAboutAccessingRef, - configurable: true - }); - } -} -/** - * Factory method to create a new React element. This no longer adheres to - * the class pattern, so do not use new to call it. Also, instanceof check - * will not work. Instead test $$typeof field against Symbol.for('react.element') to check - * if something is a React Element. - * - * @param {*} type - * @param {*} props - * @param {*} key - * @param {string|object} ref - * @param {*} owner - * @param {*} self A *temporary* helper to detect places where `this` is - * different from the `owner` when React.createElement is called, so that we - * can warn. We want to get rid of owner and replace string `ref`s with arrow - * functions, and as long as `this` and owner are the same, there will be no - * change in behavior. - * @param {*} source An annotation object (added by a transpiler or otherwise) - * indicating filename, line number, and/or other information. - * @internal - */ - - -var ReactElement = function (type, key, ref, self, source, owner, props) { - var element = { - // This tag allows us to uniquely identify this as a React Element - $$typeof: REACT_ELEMENT_TYPE, - // Built-in properties that belong on the element - type: type, - key: key, - ref: ref, - props: props, - // Record the component responsible for creating this element. - _owner: owner - }; - - { - // The validation flag is currently mutative. We put it on - // an external backing store so that we can freeze the whole object. - // This can be replaced with a WeakMap once they are implemented in - // commonly used development environments. - element._store = {}; // To make comparing ReactElements easier for testing purposes, we make - // the validation flag non-enumerable (where possible, which should - // include every environment we run tests in), so the test framework - // ignores it. - - Object.defineProperty(element._store, 'validated', { - configurable: false, - enumerable: false, - writable: true, - value: false - }); // self and source are DEV only properties. - - Object.defineProperty(element, '_self', { - configurable: false, - enumerable: false, - writable: false, - value: self - }); // Two elements created in two different places should be considered - // equal for testing purposes and therefore we hide it from enumeration. - - Object.defineProperty(element, '_source', { - configurable: false, - enumerable: false, - writable: false, - value: source - }); - - if (Object.freeze) { - Object.freeze(element.props); - Object.freeze(element); - } - } - - return element; -}; -/** - * https://github.com/reactjs/rfcs/pull/107 - * @param {*} type - * @param {object} props - * @param {string} key - */ - -function jsxDEV(type, config, maybeKey, source, self) { - { - var propName; // Reserved names are extracted - - var props = {}; - var key = null; - var ref = null; // Currently, key can be spread in as a prop. This causes a potential - // issue if key is also explicitly declared (ie.
- // or
). We want to deprecate key spread, - // but as an intermediary step, we will use jsxDEV for everything except - //
, because we aren't currently able to tell if - // key is explicitly declared to be undefined or not. - - if (maybeKey !== undefined) { - key = '' + maybeKey; - } - - if (hasValidKey(config)) { - key = '' + config.key; - } - - if (hasValidRef(config)) { - ref = config.ref; - warnIfStringRefCannotBeAutoConverted(config, self); - } // Remaining properties are added to a new props object - - - for (propName in config) { - if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - props[propName] = config[propName]; - } - } // Resolve default props - - - if (type && type.defaultProps) { - var defaultProps = type.defaultProps; - - for (propName in defaultProps) { - if (props[propName] === undefined) { - props[propName] = defaultProps[propName]; - } - } - } - - if (key || ref) { - var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; - - if (key) { - defineKeyPropWarningGetter(props, displayName); - } - - if (ref) { - defineRefPropWarningGetter(props, displayName); - } - } - - return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); - } -} - -var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner; -var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; - -function setCurrentlyValidatingElement$1(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - ReactDebugCurrentFrame$1.setExtraStackFrame(stack); - } else { - ReactDebugCurrentFrame$1.setExtraStackFrame(null); - } - } -} - -var propTypesMisspellWarningShown; - -{ - propTypesMisspellWarningShown = false; -} -/** - * Verifies the object is a ReactElement. - * See https://reactjs.org/docs/react-api.html#isvalidelement - * @param {?object} object - * @return {boolean} True if `object` is a ReactElement. - * @final - */ - -function isValidElement(object) { - { - return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; - } -} - -function getDeclarationErrorAddendum() { - { - if (ReactCurrentOwner$1.current) { - var name = getComponentName(ReactCurrentOwner$1.current.type); - - if (name) { - return '\n\nCheck the render method of `' + name + '`.'; - } - } - - return ''; - } -} - -function getSourceInfoErrorAddendum(source) { - { - if (source !== undefined) { - var fileName = source.fileName.replace(/^.*[\\\/]/, ''); - var lineNumber = source.lineNumber; - return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; - } - - return ''; - } -} -/** - * Warn if there's no key explicitly set on dynamic arrays of children or - * object keys are not valid. This allows us to keep track of children between - * updates. - */ - - -var ownerHasKeyUseWarning = {}; - -function getCurrentComponentErrorInfo(parentType) { - { - var info = getDeclarationErrorAddendum(); - - if (!info) { - var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; - - if (parentName) { - info = "\n\nCheck the top-level render call using <" + parentName + ">."; - } - } - - return info; - } -} -/** - * Warn if the element doesn't have an explicit key assigned to it. - * This element is in an array. The array could grow and shrink or be - * reordered. All children that haven't already been validated are required to - * have a "key" property assigned to it. Error statuses are cached so a warning - * will only be shown once. - * - * @internal - * @param {ReactElement} element Element that requires a key. - * @param {*} parentType element's parent's type. - */ - - -function validateExplicitKey(element, parentType) { - { - if (!element._store || element._store.validated || element.key != null) { - return; - } - - element._store.validated = true; - var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); - - if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { - return; - } - - ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a - // property, it may be the creator of the child that's responsible for - // assigning it a key. - - var childOwner = ''; - - if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) { - // Give the component that originally created this child. - childOwner = " It was passed a child from " + getComponentName(element._owner.type) + "."; - } - - setCurrentlyValidatingElement$1(element); - - error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); - - setCurrentlyValidatingElement$1(null); - } -} -/** - * Ensure that every element either is passed in a static location, in an - * array with an explicit keys property defined, or in an object literal - * with valid key property. - * - * @internal - * @param {ReactNode} node Statically passed child of any type. - * @param {*} parentType node's parent's type. - */ - - -function validateChildKeys(node, parentType) { - { - if (typeof node !== 'object') { - return; - } - - if (Array.isArray(node)) { - for (var i = 0; i < node.length; i++) { - var child = node[i]; - - if (isValidElement(child)) { - validateExplicitKey(child, parentType); - } - } - } else if (isValidElement(node)) { - // This element was passed in a valid location. - if (node._store) { - node._store.validated = true; - } - } else if (node) { - var iteratorFn = getIteratorFn(node); - - if (typeof iteratorFn === 'function') { - // Entry iterators used to provide implicit keys, - // but now we print a separate warning for them later. - if (iteratorFn !== node.entries) { - var iterator = iteratorFn.call(node); - var step; - - while (!(step = iterator.next()).done) { - if (isValidElement(step.value)) { - validateExplicitKey(step.value, parentType); - } - } - } - } - } - } -} -/** - * Given an element, validate that its props follow the propTypes definition, - * provided by the type. - * - * @param {ReactElement} element - */ - - -function validatePropTypes(element) { - { - var type = element.type; - - if (type === null || type === undefined || typeof type === 'string') { - return; - } - - var propTypes; - - if (typeof type === 'function') { - propTypes = type.propTypes; - } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. - // Inner props are checked in the reconciler. - type.$$typeof === REACT_MEMO_TYPE)) { - propTypes = type.propTypes; - } else { - return; - } - - if (propTypes) { - // Intentionally inside to avoid triggering lazy initializers: - var name = getComponentName(type); - checkPropTypes(propTypes, element.props, 'prop', name, element); - } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { - propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: - - var _name = getComponentName(type); - - error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); - } - - if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { - error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); - } - } -} -/** - * Given a fragment, validate that it can only be provided with fragment props - * @param {ReactElement} fragment - */ - - -function validateFragmentProps(fragment) { - { - var keys = Object.keys(fragment.props); - - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - - if (key !== 'children' && key !== 'key') { - setCurrentlyValidatingElement$1(fragment); - - error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); - - setCurrentlyValidatingElement$1(null); - break; - } - } - - if (fragment.ref !== null) { - setCurrentlyValidatingElement$1(fragment); - - error('Invalid attribute `ref` supplied to `React.Fragment`.'); - - setCurrentlyValidatingElement$1(null); - } - } -} - -function jsxWithValidation(type, props, key, isStaticChildren, source, self) { - { - var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to - // succeed and there will likely be errors in render. - - if (!validType) { - var info = ''; - - if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { - info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; - } - - var sourceInfo = getSourceInfoErrorAddendum(source); - - if (sourceInfo) { - info += sourceInfo; - } else { - info += getDeclarationErrorAddendum(); - } - - var typeString; - - if (type === null) { - typeString = 'null'; - } else if (Array.isArray(type)) { - typeString = 'array'; - } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { - typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />"; - info = ' Did you accidentally export a JSX literal instead of a component?'; - } else { - typeString = typeof type; - } - - error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); - } - - var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used. - // TODO: Drop this when these are no longer allowed as the type argument. - - if (element == null) { - return element; - } // Skip key warning if the type isn't valid since our key validation logic - // doesn't expect a non-string/function type and can throw confusing errors. - // We don't want exception behavior to differ between dev and prod. - // (Rendering will throw with a helpful message and as soon as the type is - // fixed, the key warnings will appear.) - - - if (validType) { - var children = props.children; - - if (children !== undefined) { - if (isStaticChildren) { - if (Array.isArray(children)) { - for (var i = 0; i < children.length; i++) { - validateChildKeys(children[i], type); - } - - if (Object.freeze) { - Object.freeze(children); - } - } else { - error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.'); - } - } else { - validateChildKeys(children, type); - } - } - } - - if (type === exports.Fragment) { - validateFragmentProps(element); - } else { - validatePropTypes(element); - } - - return element; - } -} // These two functions exist to still get child warnings in dev -// even with the prod transform. This means that jsxDEV is purely -// opt-in behavior for better messages but that we won't stop -// giving you warnings if you use production apis. - -function jsxWithValidationStatic(type, props, key) { - { - return jsxWithValidation(type, props, key, true); - } -} -function jsxWithValidationDynamic(type, props, key) { - { - return jsxWithValidation(type, props, key, false); - } -} - -var jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children. -// for now we can ship identical prod functions - -var jsxs = jsxWithValidationStatic ; - -exports.jsx = jsx; -exports.jsxs = jsxs; - })(); -} - - -/***/ }), - -/***/ "./node_modules/react/jsx-runtime.js": -/*!*******************************************!*\ - !*** ./node_modules/react/jsx-runtime.js ***! - \*******************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -if (false) {} else { - module.exports = __webpack_require__(/*! ./cjs/react-jsx-runtime.development.js */ "./node_modules/react/cjs/react-jsx-runtime.development.js"); -} - - -/***/ }), - -/***/ "react": -/*!************************!*\ - !*** external "React" ***! - \************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["React"]; - -/***/ }), - -/***/ "react-dom": -/*!***************************!*\ - !*** external "ReactDOM" ***! - \***************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["ReactDOM"]; - -/***/ }), - -/***/ "jquery": -/*!*************************!*\ - !*** external "jQuery" ***! - \*************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["jQuery"]; - -/***/ }), - -/***/ "@wordpress/i18n": -/*!******************************!*\ - !*** external ["wp","i18n"] ***! - \******************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["wp"]["i18n"]; - -/***/ }), - -/***/ "./node_modules/@linaria/react/dist/index.mjs": -/*!****************************************************!*\ - !*** ./node_modules/@linaria/react/dist/index.mjs ***! - \****************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "styled": () => (/* binding */ styled_default) -/* harmony export */ }); -/* harmony import */ var _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @emotion/is-prop-valid */ "./node_modules/@linaria/react/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var _linaria_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @linaria/core */ "./node_modules/@linaria/react/node_modules/@linaria/core/dist/index.mjs"); -// src/styled.ts - - - -var isCapital = (ch) => ch.toUpperCase() === ch; -var filterKey = (keys) => (key) => keys.indexOf(key) === -1; -var omit = (obj, keys) => { - const res = {}; - Object.keys(obj).filter(filterKey(keys)).forEach((key) => { - res[key] = obj[key]; - }); - return res; -}; -function filterProps(asIs, props, omitKeys) { - const filteredProps = omit(props, omitKeys); - if (!asIs) { - const interopValidAttr = typeof _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_0__["default"] === "function" ? { default: _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_0__["default"] } : _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_0__["default"]; - Object.keys(filteredProps).forEach((key) => { - if (!interopValidAttr.default(key)) { - delete filteredProps[key]; - } - }); - } - return filteredProps; -} -var warnIfInvalid = (value, componentName) => { - if (true) { - if (typeof value === "string" || typeof value === "number" && isFinite(value)) { - return; - } - const stringified = typeof value === "object" ? JSON.stringify(value) : String(value); - console.warn( - `An interpolation evaluated to '${stringified}' in the component '${componentName}', which is probably a mistake. You should explicitly cast or transform the value to a string.` - ); - } -}; -function styled(tag) { - return (options) => { - if (true) { - if (Array.isArray(options)) { - throw new Error( - 'Using the "styled" tag in runtime is not supported. Make sure you have set up the Babel plugin correctly. See https://github.com/callstack/linaria#setup' - ); - } - } - const render = (props, ref) => { - const { as: component = tag, class: className } = props; - const shouldKeepProps = options.propsAsIs === void 0 ? !(typeof component === "string" && component.indexOf("-") === -1 && !isCapital(component[0])) : options.propsAsIs; - const filteredProps = filterProps(shouldKeepProps, props, [ - "as", - "class" - ]); - filteredProps.ref = ref; - filteredProps.className = options.atomic ? (0,_linaria_core__WEBPACK_IMPORTED_MODULE_2__.cx)(options.class, filteredProps.className || className) : (0,_linaria_core__WEBPACK_IMPORTED_MODULE_2__.cx)(filteredProps.className || className, options.class); - const { vars } = options; - if (vars) { - const style = {}; - for (const name in vars) { - const variable = vars[name]; - const result = variable[0]; - const unit = variable[1] || ""; - const value = typeof result === "function" ? result(props) : result; - warnIfInvalid(value, options.name); - style[`--${name}`] = `${value}${unit}`; - } - const ownStyle = filteredProps.style || {}; - const keys = Object.keys(ownStyle); - if (keys.length > 0) { - keys.forEach((key) => { - style[key] = ownStyle[key]; - }); - } - filteredProps.style = style; - } - if (tag.__linaria && tag !== component) { - filteredProps.as = component; - return react__WEBPACK_IMPORTED_MODULE_1__.createElement(tag, filteredProps); - } - return react__WEBPACK_IMPORTED_MODULE_1__.createElement(component, filteredProps); - }; - const Result = react__WEBPACK_IMPORTED_MODULE_1__.forwardRef ? react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(render) : (props) => { - const rest = omit(props, ["innerRef"]); - return render(rest, props.innerRef); - }; - Result.displayName = options.name; - Result.__linaria = { - className: options.class, - extends: tag - }; - return Result; - }; -} -var styled_default = true ? new Proxy(styled, { - get(o, prop) { - return o(prop); - } -}) : 0; - -//# sourceMappingURL=index.mjs.map - -/***/ }), - -/***/ "./node_modules/@linaria/react/node_modules/@linaria/core/dist/index.mjs": -/*!*******************************************************************************!*\ - !*** ./node_modules/@linaria/react/node_modules/@linaria/core/dist/index.mjs ***! - \*******************************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "css": () => (/* binding */ css_default), -/* harmony export */ "cx": () => (/* binding */ cx_default) -/* harmony export */ }); -// src/css.ts -var css = () => { - throw new Error( - 'Using the "css" tag in runtime is not supported. Make sure you have set up the Babel plugin correctly.' - ); -}; -var css_default = css; - -// src/cx.ts -var cx = function cx2() { - const presentClassNames = Array.prototype.slice.call(arguments).filter(Boolean); - const atomicClasses = {}; - const nonAtomicClasses = []; - presentClassNames.forEach((arg) => { - const individualClassNames = arg ? arg.split(" ") : []; - individualClassNames.forEach((className) => { - if (className.startsWith("atm_")) { - const [, keyHash] = className.split("_"); - atomicClasses[keyHash] = className; - } else { - nonAtomicClasses.push(className); - } - }); - }); - const result = []; - for (const keyHash in atomicClasses) { - if (Object.prototype.hasOwnProperty.call(atomicClasses, keyHash)) { - result.push(atomicClasses[keyHash]); - } - } - result.push(...nonAtomicClasses); - return result.join(" "); -}; -var cx_default = cx; - -//# sourceMappingURL=index.mjs.map - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // 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/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* 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/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be in strict mode. -(() => { -"use strict"; -/*!**************************************!*\ - !*** ./scripts/entries/elementor.ts ***! - \**************************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _elementor_elementorWidget__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../elementor/elementorWidget */ "./scripts/elementor/elementorWidget.ts"); -/* harmony import */ var _elementor_FormWidget_registerFormWidget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../elementor/FormWidget/registerFormWidget */ "./scripts/elementor/FormWidget/registerFormWidget.ts"); -/* harmony import */ var _utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/backgroundAppUtils */ "./scripts/utils/backgroundAppUtils.ts"); -/* harmony import */ var _elementor_MeetingWidget_registerMeetingWidget__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../elementor/MeetingWidget/registerMeetingWidget */ "./scripts/elementor/MeetingWidget/registerMeetingWidget.ts"); - - - - -var ELEMENTOR_READY_INTERVAL = 500; -var MAX_POLL_TIMEOUT = 30000; - -var registerElementorWidgets = function registerElementorWidgets() { - (0,_utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_2__.initBackgroundApp)(function () { - var FormWidget; - var MeetingsWidget; - var leadinSelectFormItemView = (0,_elementor_elementorWidget__WEBPACK_IMPORTED_MODULE_0__["default"])( //@ts-expect-error global - window.elementor, { - widgetName: 'hubspot-form', - controlSelector: '.elementor-hbspt-form-selector', - containerSelector: '.hubspot-form-edit-mode' - }, function (controlContainer, widgetContainer, setValue) { - FormWidget = new _elementor_FormWidget_registerFormWidget__WEBPACK_IMPORTED_MODULE_1__["default"](controlContainer, widgetContainer, setValue); - FormWidget.render(); - }, function () { - FormWidget.done(); - }); - var leadinSelectMeetingItemView = (0,_elementor_elementorWidget__WEBPACK_IMPORTED_MODULE_0__["default"])( //@ts-expect-error global - window.elementor, { - widgetName: 'hubspot-meeting', - controlSelector: '.elementor-hbspt-meeting-selector', - containerSelector: '.hubspot-meeting-edit-mode' - }, function (controlContainer, widgetContainer, setValue) { - MeetingsWidget = new _elementor_MeetingWidget_registerMeetingWidget__WEBPACK_IMPORTED_MODULE_3__["default"](controlContainer, widgetContainer, setValue); - MeetingsWidget.render(); - }, function () { - MeetingsWidget.done(); - }); //@ts-expect-error global - - window.elementor.addControlView('leadinformselect', leadinSelectFormItemView); //@ts-expect-error global - - window.elementor.addControlView('leadinmeetingselect', leadinSelectMeetingItemView); - }); -}; - -var pollForElementorReady = setInterval(function () { - var elementorFrontend = window.elementorFrontend; - - if (elementorFrontend) { - registerElementorWidgets(); - clearInterval(pollForElementorReady); - } -}, ELEMENTOR_READY_INTERVAL); -setTimeout(function () { - clearInterval(pollForElementorReady); -}, MAX_POLL_TIMEOUT); -})(); - -/******/ })() -; -//# sourceMappingURL=elementor.js.map \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/elementor.js.map b/wp/wp-content/plugins/leadin/build/elementor.js.map deleted file mode 100644 index 0e5a97e7..00000000 --- a/wp/wp-content/plugins/leadin/build/elementor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"elementor.js","mappings":";;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,OAAO,EAAC;;;;;;;;;;;;;;;;;ACRgB;;AAEvC,2+HAA2+H;;AAE3+H,iCAAiC,4DAAO;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,WAAW,EAAC;;;;;;;;;;;;;;;;;;;ACd3B;AACA,IAAMC,iBAAiB,GAAG,mBAA1B;AACA,IAAMC,eAAe,GAAG,iBAAxB;AACA,IAAMC,eAAe,GAAG,iBAAxB;AACA,IAAMC,YAAY,GAAG,cAArB;AACA,IAAMC,UAAU,GAAG,YAAnB;AACO,IAAMC,eAAe,GAAG;EAC3BC,KAAK,EAAEP,mDAAE,CAAC,WAAD,EAAc,QAAd,CADkB;EAE3BQ,OAAO,EAAE,CACL;IAAED,KAAK,EAAEP,mDAAE,CAAC,mBAAD,EAAsB,QAAtB,CAAX;IAA4CS,KAAK,EAAER;EAAnD,CADK,EAEL;IAAEM,KAAK,EAAEP,mDAAE,CAAC,iBAAD,EAAoB,QAApB,CAAX;IAA0CS,KAAK,EAAEP;EAAjD,CAFK,EAGL;IAAEK,KAAK,EAAEP,mDAAE,CAAC,yBAAD,EAA4B,QAA5B,CAAX;IAAkDS,KAAK,EAAEN;EAAzD,CAHK,EAIL;IAAEI,KAAK,EAAEP,mDAAE,CAAC,cAAD,EAAiB,QAAjB,CAAX;IAAuCS,KAAK,EAAEL;EAA9C,CAJK,EAKL;IAAEG,KAAK,EAAEP,mDAAE,CAAC,yBAAD,EAA4B,QAA5B,CAAX;IAAkDS,KAAK,EAAEJ;EAAzD,CALK;AAFkB,CAAxB;AAUA,SAASK,aAAT,CAAuBD,KAAvB,EAA8B;EACjC,OAAQA,KAAK,KAAKR,iBAAV,IACJQ,KAAK,KAAKP,eADN,IAEJO,KAAK,KAAKN,eAFN,IAGJM,KAAK,KAAKL,YAHN,IAIJK,KAAK,KAAKJ,UAJd;AAKH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtBD,2BAA6iBM,MAAM,CAACC,YAApjB;AAAA,IAAQC,WAAR,wBAAQA,WAAR;AAAA,IAAqBC,QAArB,wBAAqBA,QAArB;AAAA,IAA+BC,cAA/B,wBAA+BA,cAA/B;AAAA,IAA+CC,gBAA/C,wBAA+CA,gBAA/C;AAAA,IAAiEC,QAAjE,wBAAiEA,QAAjE;AAAA,IAA2EC,aAA3E,wBAA2EA,aAA3E;AAAA,IAA0FC,GAA1F,wBAA0FA,GAA1F;AAAA,IAA+FC,WAA/F,wBAA+FA,WAA/F;AAAA,IAA4GC,cAA5G,wBAA4GA,cAA5G;AAAA,IAA4HC,kBAA5H,wBAA4HA,kBAA5H;AAAA,IAAgJC,MAAhJ,wBAAgJA,MAAhJ;AAAA,IAAwJC,cAAxJ,wBAAwJA,cAAxJ;AAAA,IAAwKC,YAAxK,wBAAwKA,YAAxK;AAAA,IAAsLC,SAAtL,wBAAsLA,SAAtL;AAAA,IAAiMC,UAAjM,wBAAiMA,UAAjM;AAAA,IAA6MC,iBAA7M,wBAA6MA,iBAA7M;AAAA,IAAgOC,mBAAhO,wBAAgOA,mBAAhO;AAAA,IAAqPC,kBAArP,wBAAqPA,kBAArP;AAAA,IAAyQC,mBAAzQ,wBAAyQA,mBAAzQ;AAAA,IAA8RC,iBAA9R,wBAA8RA,iBAA9R;AAAA,IAAiTC,MAAjT,wBAAiTA,MAAjT;AAAA,IAAyTC,QAAzT,wBAAyTA,QAAzT;AAAA,IAAmUC,UAAnU,wBAAmUA,UAAnU;AAAA,IAA+UC,UAA/U,wBAA+UA,UAA/U;AAAA,IAA2VC,OAA3V,wBAA2VA,OAA3V;AAAA,IAAoWC,YAApW,wBAAoWA,YAApW;AAAA,IAAkXC,WAAlX,wBAAkXA,WAAlX;AAAA,IAA+XC,QAA/X,wBAA+XA,QAA/X;AAAA,IAAyYC,aAAzY,wBAAyYA,aAAzY;AAAA,IAAwZC,SAAxZ,wBAAwZA,SAAxZ;AAAA,IAAmaC,OAAna,wBAAmaA,OAAna;AAAA,IAA4aC,YAA5a,wBAA4aA,YAA5a;AAAA,IAA0bC,iBAA1b,wBAA0bA,iBAA1b;AAAA,IAA6cC,KAA7c,wBAA6cA,KAA7c;AAAA,IAAodC,YAApd,wBAAodA,YAApd;AAAA,IAAkeC,SAAle,wBAAkeA,SAAle;AAAA,IAA6eC,YAA7e,wBAA6eA,YAA7e;AAAA,IAA2fC,yBAA3f,wBAA2fA,yBAA3f;AAAA,IAAshBC,iBAAthB,wBAAshBA,iBAAthB;;;;;;;;;;;;;;;;;;;;ACAA;AACA;AACA;AACe,SAASI,mBAAT,GAA+B;EAC1C,OAAQF,sDAAI,CAACC,wDAAD,EAAkB;IAAEE,QAAQ,EAAEH,sDAAI,CAAC,GAAD,EAAM;MAAEI,uBAAuB,EAAE;QACnEC,MAAM,EAAE1D,mDAAE,CAAC,2HAAD,CAAF,CACH2D,OADG,CACK,MADL,EACa,+EADb,EAEHA,OAFG,CAEK,MAFL,EAEa,MAFb;MAD2D;IAA3B,CAAN;EAAhB,CAAlB,CAAZ;AAKH;;;;;;;;;;;;;;;;ACTD;AACe,SAASL,eAAT,OAA0D;EAAA,qBAA/BM,IAA+B;EAAA,IAA/BA,IAA+B,0BAAxB,SAAwB;EAAA,IAAbJ,QAAa,QAAbA,QAAa;EACrE,OAAQH,sDAAI,CAAC,KAAD,EAAQ;IAAEQ,SAAS,EAAE,2BAAb;IAA0CL,QAAQ,EAAEH,sDAAI,CAAC,KAAD,EAAQ;MAAEQ,SAAS,mFAA4ED,IAA5E,CAAX;MAA+FJ,QAAQ,EAAEA;IAAzG,CAAR;EAAxD,CAAR,CAAZ;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACHD;AACA;AACA,IAAMO,SAAS,gBAAGD,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAlB;AAKe,SAASI,eAAT,OAAkD;EAAA,IAAvBV,QAAuB,QAAvBA,QAAuB;EAAA,IAAVW,MAAU;;EAC7D,OAAQd,sDAAI,CAACU,SAAD,EAAY;IAAEF,SAAS,EAAE,0BAAb;IAAyCL,QAAQ,EAAEH,sDAAI,CAAC,QAAD;MAAaQ,SAAS,EAAE,2CAAxB;MAAqED,IAAI,EAAE;IAA3E,GAAwFO,MAAxF;MAAgGX,QAAQ,EAAEA;IAA1G;EAAvD,CAAZ,CAAZ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASoB,mBAAT,OAAyD;EAAA,IAA1BC,MAA0B,QAA1BA,MAA0B;EAAA,IAAlBC,aAAkB,QAAlBA,aAAkB;;EACrD,gBAAqCJ,2DAAQ,EAA7C;EAAA,IAAQK,QAAR,aAAQA,QAAR;EAAA,IAAkBC,KAAlB,aAAkBA,KAAlB;EAAA,IAAyBC,OAAzB,aAAyBA,OAAzB;;EACA,OAAOA,OAAO,GAAI5B,sDAAI,CAAC,KAAD,EAAQ;IAAEG,QAAQ,EAAEH,sDAAI,CAACkB,sEAAD,EAAY,EAAZ;EAAhB,CAAR,CAAR,GAAsDQ,QAAQ,GAAI1B,sDAAI,CAACC,+DAAD,EAAkB;IAAEM,IAAI,EAAE,QAAR;IAAkBJ,QAAQ,EAAExD,mDAAE,CAAC,yDAAD,EAA4D,QAA5D;EAA9B,CAAlB,CAAR,GAAqIqE,uDAAK,CAAC,QAAD,EAAW;IAAE5D,KAAK,EAAEoE,MAAT;IAAiBK,QAAQ,EAAE,kBAAAC,KAAK,EAAI;MAC7P,IAAMC,YAAY,GAAGJ,KAAK,CAACK,IAAN,CAAW,UAAAC,IAAI;QAAA,OAAIA,IAAI,CAAC7E,KAAL,KAAe0E,KAAK,CAACI,MAAN,CAAa9E,KAAhC;MAAA,CAAf,CAArB;;MACA,IAAI2E,YAAJ,EAAkB;QACdN,aAAa,CAAC;UACVtC,QAAQ,EAARA,6DADU;UAEVqC,MAAM,EAAEO,YAAY,CAAC3E,KAFX;UAGV+E,QAAQ,EAAEJ,YAAY,CAAC7E;QAHb,CAAD,CAAb;MAKH;IACJ,CAT4N;IAS1NiD,QAAQ,EAAE,CAACH,sDAAI,CAAC,QAAD,EAAW;MAAE5C,KAAK,EAAE,EAAT;MAAagF,QAAQ,EAAE,IAAvB;MAA6BC,QAAQ,EAAE,IAAvC;MAA6ClC,QAAQ,EAAExD,mDAAE,CAAC,mBAAD,EAAsB,QAAtB;IAAzD,CAAX,CAAL,EAA6GgF,KAAK,CAACW,GAAN,CAAU,UAAAL,IAAI;MAAA,OAAKjC,sDAAI,CAAC,QAAD,EAAW;QAAE5C,KAAK,EAAE6E,IAAI,CAAC7E,KAAd;QAAqB+C,QAAQ,EAAE8B,IAAI,CAAC/E;MAApC,CAAX,EAAwD+E,IAAI,CAAC7E,KAA7D,CAAT;IAAA,CAAd,CAA7G;EATgN,CAAX,CAAtN;AAUH;;AACD,SAASmF,0BAAT,CAAoCC,KAApC,EAA2C;EACvC,IAAMC,oBAAoB,GAAGrB,iFAAuB,EAApD;EACA,OAAQpB,sDAAI,CAACiB,2CAAD,EAAW;IAAEd,QAAQ,EAAE,CAACsC,oBAAD,GAAyBzC,sDAAI,CAAC,KAAD,EAAQ;MAAEG,QAAQ,EAAEH,sDAAI,CAACkB,sEAAD,EAAY,EAAZ;IAAhB,CAAR,CAA7B,GAA4ElB,sDAAI,CAACuB,mBAAD,oBAA2BiB,KAA3B;EAA5F,CAAX,CAAZ;AACH;;AACc,SAASE,4BAAT,CAAsCF,KAAtC,EAA6C;EACxD,OAAQxC,sDAAI,CAACmB,kFAAD,EAA+B;IAAE/D,KAAK,EAAEmC,iEAAY,IAAI+B,mFAAwB,CAAC/B,iEAAD,CAAjD;IAAiEY,QAAQ,EAAEH,sDAAI,CAACuC,0BAAD,oBAAkCC,KAAlC;EAA/E,CAA/B,CAAZ;AACH;;;;;;;;;;;;;;;;;;;;;AC5BD;AACA;AACA;AACA;AACA;AACA,IAAMI,gBAAgB,GAAG;EACrBC,SAAS,EAAE,WADU;EAErBC,YAAY,EAAE;AAFO,CAAzB;AAIe,SAASC,qBAAT,CAA+BC,UAA/B,EAA2CC,QAA3C,EAAqD;EAChE,OAAO,YAAM;IACT,IAAMC,MAAM,GAAG,SAATA,MAAS,GAAM;MACjB,IAAIvF,qEAAgB,KAAKiF,gBAAgB,CAACC,SAA1C,EAAqD;QACjD,OAAQ7C,sDAAI,CAACuB,4DAAD,EAAsB;UAAEC,MAAM,EAAEwB,UAAU,CAACxB,MAArB;UAA6BC,aAAa,EAAEwB;QAA5C,CAAtB,CAAZ;MACH,CAFD,MAGK;QACD,OAAOjD,sDAAI,CAACE,mEAAD,EAAsB,EAAtB,CAAX;MACH;IACJ,CAPD;;IAQA,OAAOF,sDAAI,CAACiB,2CAAD,EAAW;MAAEd,QAAQ,EAAE+C,MAAM;IAAlB,CAAX,CAAX;EACH,CAVD;AAWH;;;;;;;;;;;;;;;;;;;;;;ACrBD;AACA;AACA;AACA;AACA;AACA;AACe,SAASG,oBAAT,CAA8BL,UAA9B,EAA0CC,QAA1C,EAAoD;EAC/D,OAAO,YAAM;IACT,IAAMC,MAAM,GAAG,SAATA,MAAS,GAAM;MACjB,IAAIvF,qEAAgB,KAAKiF,gFAAzB,EAAqD;QACjD,OAAQ5C,sDAAI,CAACoD,6DAAD,EAAW;UAAEJ,UAAU,EAAEA,UAAd;UAA0BM,UAAU,EAAE,IAAtC;UAA4C7B,aAAa,EAAEwB,QAA3D;UAAqEM,OAAO,EAAE,KAA9E;UAAqFC,MAAM,EAAE;QAA7F,CAAX,CAAZ;MACH,CAFD,MAGK;QACD,OAAOxD,sDAAI,CAACmD,mEAAD,EAAe;UAAEM,MAAM,EAAE;QAAV,CAAf,CAAX;MACH;IACJ,CAPD;;IAQA,OAAOzD,sDAAI,CAACiB,2CAAD,EAAW;MAAEd,QAAQ,EAAE+C,MAAM;IAAlB,CAAX,CAAX;EACH,CAVD;AAWH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClBD;AACA;AACA;AACA;AACe,SAAS7B,QAAT,GAAoB;EAC/B,IAAM0C,KAAK,GAAGD,uFAA6B,EAA3C;;EACA,gBAAkCJ,+CAAQ,CAACE,yEAAD,CAA1C;EAAA;EAAA,IAAOK,SAAP;EAAA,IAAkBC,YAAlB;;EACA,iBAA6BR,+CAAQ,CAAC,IAAD,CAArC;EAAA;EAAA,IAAOhC,QAAP;EAAA,IAAiByC,QAAjB;;EACA,iBAA0BT,+CAAQ,CAAC,EAAD,CAAlC;EAAA;EAAA,IAAO/B,KAAP;EAAA,IAAcyC,QAAd;;EACAT,gDAAS,CAAC,YAAM;IACZ,IAAIM,SAAS,KAAKL,yEAAlB,EAAuC;MACnCG,KAAK,CAAC;QACFM,GAAG,EAAER,gFADH;QAEFU,OAAO,EAAE;UACLC,MAAM,EAAE;QADH;MAFP,CAAD,CAAL,CAMKC,IANL,CAMU,UAAAC,IAAI,EAAI;QACdN,QAAQ,CAACM,IAAI,CAACpC,GAAL,CAAS,UAACL,IAAD;UAAA,OAAW;YACzB/E,KAAK,EAAE+E,IAAI,CAACtB,IADa;YAEzBvD,KAAK,EAAE6E,IAAI,CAAC0C;UAFa,CAAX;QAAA,CAAT,CAAD,CAAR;QAIAT,YAAY,CAACN,sEAAD,CAAZ;MACH,CAZD,WAaW,UAAAiB,KAAK,EAAI;QAChBV,QAAQ,CAACU,KAAD,CAAR;QACAX,YAAY,CAACN,sEAAD,CAAZ;MACH,CAhBD;IAiBH;EACJ,CApBQ,EAoBN,CAACK,SAAD,CApBM,CAAT;EAqBA,OAAO;IAAEtC,KAAK,EAALA,KAAF;IAASC,OAAO,EAAEqC,SAAS,KAAKL,uEAAhC;IAAmDlC,QAAQ,EAARA;EAAnD,CAAP;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/BD;AACA;AACA;;IACqBuD;EAKjB,4BAAYC,gBAAZ,EAA8BC,eAA9B,EAA+ClC,QAA/C,EAAyD;IAAA;;IAAA;;IAAA;;IAAA;;IAAA;;IACrD,IAAMD,UAAU,GAAGmC,eAAe,CAACC,OAAhB,CAAwBpC,UAAxB,GACbqC,IAAI,CAACC,KAAL,CAAWH,eAAe,CAACC,OAAhB,CAAwBpC,UAAnC,CADa,GAEb,EAFN;IAGA,KAAKmC,eAAL,GAAuBA,eAAvB;IACA,KAAKD,gBAAL,GAAwBA,gBAAxB;IACA,KAAKjC,QAAL,GAAgBA,QAAhB;IACA,KAAKD,UAAL,GAAkBA,UAAlB;EACH;;;;WACD,kBAAS;MACLgC,uDAAA,CAAgB3B,iEAAoB,CAAC,KAAKL,UAAN,EAAkB,KAAKC,QAAvB,CAApB,EAAhB,EAAwE,KAAKkC,eAA7E;MACAH,uDAAA,CAAgBjC,kEAAqB,CAAC,KAAKC,UAAN,EAAkB,KAAKC,QAAvB,CAArB,EAAhB,EAAyE,KAAKiC,gBAA9E;IACH;;;WACD,gBAAO;MACHF,uEAAA,CAAgC,KAAKG,eAArC;MACAH,uEAAA,CAAgC,KAAKE,gBAArC;IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxBL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASU,sBAAT,OAAyD;EAAA,IAAvBC,GAAuB,QAAvBA,GAAuB;EAAA,IAAlBpE,aAAkB,QAAlBA,aAAkB;;EACrD,mBAA+EgE,6EAAW,EAA1F;EAAA,IAAwBK,QAAxB,gBAAQC,cAAR;EAAA,IAAkCnE,OAAlC,gBAAkCA,OAAlC;EAAA,IAA2CiD,KAA3C,gBAA2CA,KAA3C;EAAA,IAAkDmB,MAAlD,gBAAkDA,MAAlD;EAAA,IAA0DC,eAA1D,gBAA0DA,eAA1D;;EACA,IAAMC,uBAAuB,GAAGR,6FAA0B,CAACG,GAAD,CAA1D;;EACA,gBAAgCnC,+CAAQ,CAACmC,GAAD,CAAxC;EAAA;EAAA,IAAOM,QAAP;EAAA,IAAiBC,WAAjB;;EACA,IAAMC,qBAAqB,GAAG,SAAxBA,qBAAwB,GAAM;IAChC,OAAOJ,eAAe,GACjBxB,IADE,CACG,YAAM;MACZuB,MAAM;IACT,CAHM,WAII,UAAAnB,KAAK,EAAI;MAChBc,8DAAA,CAAqB,4BAArB,EAAmD;QAC/CY,KAAK,EAAE;UAAE1B,KAAK,EAALA;QAAF;MADwC,CAAnD;IAGH,CARM,CAAP;EASH,CAVD;;EAWA,OAAQ7E,sDAAI,CAACiB,2CAAD,EAAW;IAAEd,QAAQ,EAAEyB,OAAO,GAAI5B,sDAAI,CAAC,KAAD,EAAQ;MAAEG,QAAQ,EAAEH,sDAAI,CAACkB,sEAAD,EAAY,EAAZ;IAAhB,CAAR,CAAR,GAAsD2D,KAAK,GAAI7E,sDAAI,CAACC,+DAAD,EAAkB;MAAEM,IAAI,EAAE,QAAR;MAAkBJ,QAAQ,EAAExD,mDAAE,CAAC,4DAAD,EAA+D,QAA/D;IAA9B,CAAlB,CAAR,GAAwIqE,uDAAK,CAACC,2CAAD,EAAW;MAAEd,QAAQ,EAAE,CAAC+F,uBAAuB,IAAKlG,sDAAI,CAACwF,gEAAD,EAA0B;QAAE/B,MAAM,EAAEyC,uBAAV;QAAmCM,iBAAiB,EAAEP;MAAtD,CAA1B,CAAjC,EAAsIH,QAAQ,CAACW,MAAT,GAAkB,CAAlB,IAAwBzF,uDAAK,CAAC,QAAD,EAAW;QAAE5D,KAAK,EAAE+I,QAAT;QAAmBtE,QAAQ,EAAE,kBAAAC,KAAK,EAAI;UACzc,IAAM4E,MAAM,GAAG5E,KAAK,CAACI,MAAN,CAAa9E,KAA5B;UACAgJ,WAAW,CAACM,MAAD,CAAX;UACAjF,aAAa,CAAC;YACVoE,GAAG,EAAEa;UADK,CAAD,CAAb;QAGH,CANsa;QAMpavG,QAAQ,EAAE,CAACH,sDAAI,CAAC,QAAD,EAAW;UAAE5C,KAAK,EAAE,EAAT;UAAagF,QAAQ,EAAE,IAAvB;UAA6BC,QAAQ,EAAE,IAAvC;UAA6ClC,QAAQ,EAAExD,mDAAE,CAAC,kBAAD,EAAqB,QAArB;QAAzD,CAAX,CAAL,EAA4GmJ,QAAQ,CAACxD,GAAT,CAAa,UAAAqE,IAAI;UAAA,OAAK3G,sDAAI,CAAC,QAAD,EAAW;YAAE5C,KAAK,EAAEuJ,IAAI,CAACvJ,KAAd;YAAqB+C,QAAQ,EAAEwG,IAAI,CAACzJ;UAApC,CAAX,EAAwDyJ,IAAI,CAACvJ,KAA7D,CAAT;QAAA,CAAjB,CAA5G;MAN0Z,CAAX,CAAnK;IAAZ,CAAX;EAA3N,CAAX,CAAZ;AAOH;;AACD,SAASwJ,6BAAT,CAAuCpE,KAAvC,EAA8C;EAC1C,IAAMC,oBAAoB,GAAGrB,iFAAuB,EAApD;EACA,OAAQpB,sDAAI,CAACiB,2CAAD,EAAW;IAAEd,QAAQ,EAAE,CAACsC,oBAAD,GAAyBzC,sDAAI,CAAC,KAAD,EAAQ;MAAEG,QAAQ,EAAEH,sDAAI,CAACkB,sEAAD,EAAY,EAAZ;IAAhB,CAAR,CAA7B,GAA4ElB,sDAAI,CAAC4F,sBAAD,oBAA8BpD,KAA9B;EAA5F,CAAX,CAAZ;AACH;;AACc,SAASqE,gCAAT,CAA0CrE,KAA1C,EAAiD;EAC5D,OAAQxC,sDAAI,CAACmB,kFAAD,EAA+B;IAAE/D,KAAK,EAAEmC,iEAAY,IAAI+B,oFAAwB,CAAC/B,iEAAD,CAAjD;IAAiEY,QAAQ,EAAEH,sDAAI,CAAC4G,6BAAD,oBAAqCpE,KAArC;EAA/E,CAA/B,CAAZ;AACH;;;;;;;;;;;;;;;;;;;;;;;;ACxCD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAM9B,SAAS,gBAAGD,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAlB;AAGe,SAASsG,cAAT,OAAwD;EAAA,IAA9BP,iBAA8B,QAA9BA,iBAA8B;EAAA,IAAX/C,MAAW,QAAXA,MAAW;EACnE,IAAMuD,cAAc,GAAGvD,MAAM,KAAKqD,oFAAlC;EACA,IAAMG,SAAS,GAAGD,cAAc,GAC1BrK,mDAAE,CAAC,gCAAD,EAAmC,QAAnC,CADwB,GAE1BA,mDAAE,CAAC,2BAAD,EAA8B,QAA9B,CAFR;EAGA,IAAMuK,YAAY,GAAGF,cAAc,GAC7BrK,mDAAE,CAAC,gEAAD,EAAmE,QAAnE,CAD2B,GAE7BA,mDAAE,CAAC,yGAAD,EAA4G,QAA5G,CAFR;EAGA,OAAQqE,uDAAK,CAACC,2CAAD,EAAW;IAAEd,QAAQ,EAAE,CAACH,sDAAI,CAACU,SAAD,EAAY;MAAEP,QAAQ,EAAEa,uDAAK,CAACf,+DAAD,EAAkB;QAAEM,IAAI,EAAE,SAAR;QAAmBJ,QAAQ,EAAE,CAACH,sDAAI,CAAC,GAAD,EAAM;UAAEG,QAAQ,EAAE8G;QAAZ,CAAN,CAAL,EAAqCjH,sDAAI,CAAC,IAAD,EAAO,EAAP,CAAzC,EAAqDkH,YAArD;MAA7B,CAAlB;IAAjB,CAAZ,CAAL,EAA2JF,cAAc,IAAKhH,sDAAI,CAACa,+DAAD,EAAkB;MAAEsG,EAAE,EAAE,2BAAN;MAAmCC,OAAO,EAAEZ,iBAA5C;MAA+DrG,QAAQ,EAAExD,mDAAE,CAAC,kBAAD,EAAqB,QAArB;IAA3E,CAAlB,CAAlL;EAAZ,CAAX,CAAb;AACJ;;;;;;;;;;;;;;;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA,IAAMiG,gBAAgB,GAAG;EACrBC,SAAS,EAAE,WADU;EAErBC,YAAY,EAAE;AAFO,CAAzB;AAIe,SAASuE,wBAAT,CAAkCrE,UAAlC,EAA8CC,QAA9C,EAAwD;EACnE,OAAO,YAAM;IACT,IAAMC,MAAM,GAAG,SAATA,MAAS,GAAM;MACjB,IAAIvF,qEAAgB,KAAKiF,gBAAgB,CAACC,SAA1C,EAAqD;QACjD,OAAQ7C,sDAAI,CAAC4F,+DAAD,EAAyB;UAAEC,GAAG,EAAE7C,UAAU,CAAC6C,GAAlB;UAAuBpE,aAAa,EAAEwB;QAAtC,CAAzB,CAAZ;MACH,CAFD,MAGK;QACD,OAAOjD,sDAAI,CAACE,mEAAD,EAAsB,EAAtB,CAAX;MACH;IACJ,CAPD;;IAQA,OAAOF,sDAAI,CAACiB,2CAAD,EAAW;MAAEd,QAAQ,EAAE+C,MAAM;IAAlB,CAAX,CAAX;EACH,CAVD;AAWH;;;;;;;;;;;;;;;;;;;;;ACrBD;AACA;AACA;AACA;AACA;AACA,IAAMN,gBAAgB,GAAG;EACrBC,SAAS,EAAE,WADU;EAErBC,YAAY,EAAE;AAFO,CAAzB;AAIe,SAASyE,uBAAT,CAAiCvE,UAAjC,EAA6CC,QAA7C,EAAuD;EAClE,OAAO,YAAM;IACT,IAAMC,MAAM,GAAG,SAATA,MAAS,GAAM;MACjB,IAAIvF,qEAAgB,KAAKiF,gBAAgB,CAACC,SAA1C,EAAqD;QACjD,OAAQ7C,sDAAI,CAACsH,mEAAD,EAAe;UAAEtE,UAAU,EAAEA,UAAd;UAA0BM,UAAU,EAAE,IAAtC;UAA4C7B,aAAa,EAAEwB,QAA3D;UAAqEM,OAAO,EAAE,KAA9E;UAAqFC,MAAM,EAAE;QAA7F,CAAf,CAAZ;MACH,CAFD,MAGK;QACD,OAAOxD,sDAAI,CAACmD,mEAAD,EAAe;UAAEM,MAAM,EAAE;QAAV,CAAf,CAAX;MACH;IACJ,CAPD;;IAQA,OAAOzD,sDAAI,CAACiB,2CAAD,EAAW;MAAEd,QAAQ,EAAE+C,MAAM;IAAlB,CAAX,CAAX;EACH,CAVD;AAWH;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrBD;AACA;AACA;;IACqBsE;EAKjB,gCAAYtC,gBAAZ,EAA8BC,eAA9B,EAA+ClC,QAA/C,EAAyD;IAAA;;IAAA;;IAAA;;IAAA;;IAAA;;IACrD,IAAMD,UAAU,GAAGmC,eAAe,CAACC,OAAhB,CAAwBpC,UAAxB,GACbqC,IAAI,CAACC,KAAL,CAAWH,eAAe,CAACC,OAAhB,CAAwBpC,UAAnC,CADa,GAEb,EAFN;IAGA,KAAKmC,eAAL,GAAuBA,eAAvB;IACA,KAAKD,gBAAL,GAAwBA,gBAAxB;IACA,KAAKjC,QAAL,GAAgBA,QAAhB;IACA,KAAKD,UAAL,GAAkBA,UAAlB;EACH;;;;WACD,kBAAS;MACLgC,uDAAA,CAAgBuC,oEAAuB,CAAC,KAAKvE,UAAN,EAAkB,KAAKC,QAAvB,CAAvB,EAAhB,EAA2E,KAAKkC,eAAhF;MACAH,uDAAA,CAAgBqC,qEAAwB,CAAC,KAAKrE,UAAN,EAAkB,KAAKC,QAAvB,CAAxB,EAAhB,EAA4E,KAAKiC,gBAAjF;IACH;;;WACD,gBAAO;MACHF,uEAAA,CAAgC,KAAKG,eAArC;MACAH,uEAAA,CAAgC,KAAKE,gBAArC;IACH;;;;;;;;;;;;;;;;;;;;;ACxBU,SAASuC,eAAT,CAAyBC,SAAzB,EAAoCvK,OAApC,EAA6CwK,QAA7C,EAAyE;EAAA,IAAlBC,IAAkB,uEAAX,YAAM,CAAG,CAAE;EACpF,OAAOF,SAAS,CAACG,OAAV,CAAkBC,QAAlB,CAA2BC,QAA3B,CAAoCC,MAApC,CAA2C;IAC9CC,OAD8C,qBACpC;MACN,IAAMC,IAAI,GAAG,IAAb;MACA,IAAMhD,gBAAgB,GAAG,KAAKiD,EAAL,CAAQC,eAAR,CAAwBC,UAAxB,CAAmC,CAAnC,EAAsCC,aAAtC,CAAoDnL,OAAO,CAACoL,eAA5D,CAAzB;MACA,IAAIpD,eAAe,GAAG,KAAKhI,OAAL,CAAaqL,OAAb,CAAqBC,GAArB,CAAyB,CAAzB,EAA4BH,aAA5B,CAA0CnL,OAAO,CAACuL,iBAAlD,CAAtB;;MACA,IAAIvD,eAAJ,EAAqB;QACjBwC,QAAQ,CAACzC,gBAAD,EAAmBC,eAAnB,EAAoC,UAACwD,IAAD;UAAA,OAAUT,IAAI,CAACjF,QAAL,CAAc0F,IAAd,CAAV;QAAA,CAApC,CAAR;MACH,CAFD,MAGK;QACD;QACArL,MAAM,CAACsL,iBAAP,CAAyBC,KAAzB,CAA+BC,SAA/B,kCAAmE3L,OAAO,CAAC4L,UAA3E,eAAiG,UAACP,OAAD,EAAa;UAC1GrD,eAAe,GAAGqD,OAAO,CAAC,CAAD,CAAP,CAAWF,aAAX,CAAyBnL,OAAO,CAACuL,iBAAjC,CAAlB;UACAf,QAAQ,CAACzC,gBAAD,EAAmBC,eAAnB,EAAoC,UAACwD,IAAD;YAAA,OAAUT,IAAI,CAACjF,QAAL,CAAc0F,IAAd,CAAV;UAAA,CAApC,CAAR;QACH,CAHD;MAIH;IACJ,CAf6C;IAgB9CK,SAhB8C,qBAgBpCxG,KAhBoC,EAgB7B;MACb,KAAKS,QAAL,CAAcT,KAAd;IACH,CAlB6C;IAmB9CyG,eAnB8C,6BAmB5B;MACd;MACA3L,MAAM,CAACsL,iBAAP,CAAyBC,KAAzB,CAA+BK,YAA/B,kCAAsE/L,OAAO,CAAC4L,UAA9E;MACAnB,IAAI;IACP;EAvB6C,CAA3C,CAAP;AAyBH;;;;;;;;;;;;;;;AC1BM,IAAMuB,YAAY,GAAG;EACxBC,gBAAgB,EAAE,4CADM;EAExBC,gBAAgB,EAAE,4CAFM;EAGxBC,iBAAiB,EAAE,6CAHK;EAIxBC,mBAAmB,EAAE,+CAJG;EAKxBC,UAAU,EAAE,qCALY;EAMxBC,YAAY,EAAE,wCANU;EAOxBC,uBAAuB,EAAE;AAPD,CAArB;;;;;;;;;;;;;;;ACAA,IAAMC,YAAY,GAAG;EACxBC,uBAAuB,EAAE;AADD,CAArB;;;;;;;;;;;;;;;;;;;;;;;;ACAP;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACHO,IAAMC,gBAAgB,GAAG;EAC5BC,2BAA2B,EAAE;AADD,CAAzB;;;;;;;;;;;;;;;ACAA,IAAMC,cAAc,GAAG;EAC1BC,wBAAwB,EAAE,4BADA;EAE1BC,kBAAkB,EAAE,sBAFM;EAG1BC,YAAY,EAAE,uCAHY;EAI1BC,4BAA4B,EAAE,mCAJJ;EAK1BC,6BAA6B,EAAE,oCALL;EAM1BC,0BAA0B,EAAE,iCANF;EAO1BC,6BAA6B,EAAE,oCAPL;EAQ1BC,2BAA2B,EAAE,kCARH;EAS1BC,wBAAwB,EAAE,6BATA;EAU1BC,yBAAyB,EAAE,oCAVD;EAW1BC,sBAAsB,EAAE,iCAXE;EAY1BC,yBAAyB,EAAE,8BAZD;EAa1BC,uBAAuB,EAAE,4BAbC;EAc1BC,iBAAiB,EAAE,qBAdO;EAe1BC,kBAAkB,EAAE,sBAfM;EAgB1BC,eAAe,EAAE,mBAhBS;EAiB1BC,sBAAsB,EAAE,2BAjBE;EAkB1BC,0BAA0B,EAAE,+BAlBF;EAmB1BC,2BAA2B,EAAE,gCAnBH;EAoB1BC,wBAAwB,EAAE,6BApBA;EAqB1BC,6BAA6B,EAAE,kCArBL;EAsB1BC,8BAA8B,EAAE,mCAtBN;EAuB1BC,2BAA2B,EAAE;AAvBH,CAAvB;;;;;;;;;;;;;;;ACAA,IAAMzH,aAAa,GAAG;EACzBS,UAAU,EAAE,aADa;EAEzBiH,SAAS,EAAE,YAFc;EAGzBC,sBAAsB,EAAE,2BAHC;EAIzBC,SAAS,EAAE,YAJc;EAKzBC,qBAAqB,EAAE,0BALE;EAMzBC,kCAAkC,EAAE,yCANX;EAOzBC,wBAAwB,EAAE,8BAPD;EAQzBC,uBAAuB,EAAE,2BARA;EASzBC,sBAAsB,EAAE,2BATC;EAUzBC,4BAA4B,EAAE,kCAVL;EAWzBC,uBAAuB,EAAE,4BAXA;EAYzBC,yBAAyB,EAAE,8BAZF;EAazBC,sBAAsB,EAAE,2BAbC;EAczBC,uBAAuB,EAAE,4BAdA;EAezBC,4BAA4B,EAAE,iCAfL;EAgBzBC,0BAA0B,EAAE,+BAhBH;EAiBzBC,uBAAuB,EAAE;AAjBA,CAAtB;;;;;;;;;;;;;;;;;;;;ACAP;AACO,IAAMnL,mBAAmB,gBAAGoL,oDAAa,CAAC,IAAD,CAAzC;AACA,SAASnL,uBAAT,GAAmC;EACtC,OAAOoL,iDAAU,CAACrL,mBAAD,CAAjB;AACH;AACM,SAASsL,wBAAT,GAAoC;EACvC,IAAMC,GAAG,GAAGtL,uBAAuB,EAAnC;EACA,OAAO,UAACuL,OAAD,EAAa;IAChBD,GAAG,CAACE,WAAJ,CAAgBD,OAAhB;EACH,CAFD;AAGH;AACM,SAAS7I,6BAAT,GAAyC;EAC5C,IAAM4I,GAAG,GAAGtL,uBAAuB,EAAnC;EACA,OAAO,UAACuL,OAAD;IAAA,OAAaD,GAAG,CAACG,gBAAJ,CAAqBF,OAArB,CAAb;EAAA,CAAP;AACH;;;;;;;;;;;;;;;;;;;ACdD;AACA;AACO,SAASG,cAAT,GAA0B;EAC7B,IAAI3O,2EAAA,CAAuB,iBAAvB,MAA8C,CAAC,CAAnD,EAAsD;IAClD;EACH;;EACDwH,sDAAA,CAAa,mEAAb,EAAkF;IAC9EsH,UAAU,EAAE;MACRC,QAAQ,EAAE;IADF,CADkE;IAI9EC,OAAO,EAAEzO,wEAAmBA;EAJkD,CAAlF,EAKG0O,OALH;EAMAzH,8DAAA,CAAqB;IACjB2H,CAAC,EAAE5O,wEADc;IAEjB6O,GAAG,EAAEzO,+DAFY;IAGjB0O,SAAS,EAAE7N,8DAASA;EAHH,CAArB;EAKAgG,+DAAA,CAAsB;IAClB+H,GAAG,EAAEvO,6DADa;IAElBH,OAAO,EAAE2O,MAAM,CAACC,IAAP,CAAY5O,4DAAZ,EACJsD,GADI,CACA,UAAA3B,IAAI;MAAA,iBAAOA,IAAP,cAAe3B,4DAAO,CAAC2B,IAAD,CAAtB;IAAA,CADJ,EAEJkN,IAFI,CAEC,GAFD;EAFS,CAAtB;AAMH;AACD,iEAAelI,iDAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMjF,SAAS,gBAAGD,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAlB;;AAKE,YAVgB,sBAUhBwN,KAVgB;EAAA,OAiBAzL,eAAK;IAAA,OAAKA,KAAK,CAAC0L,OAAN1L,GAAgB,GAAhBA,GAAsB,KAA3B;EAAA,CAjBL;AAAA,CAUhB;;AAOsD,YAjBtC,sBAiBsC2L,KAjBtC;EAAA,OA2BF3L,eAAK;IAAA,OAAIA,KAAK,CAAC0L,OAAN1L,uBAA6BwL,gEAA7BxL,IAAgD,MAApD;EAAA,CA3BH;AAAA,CAiBsC;;AANxD,IAAM4L,gBAAgB,gBAAG3N,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;EAAAyN;IAAA,eAMbJ,KAAsC,EANzB;IAMyB,eAUxCE,KAA+D,EAVvB;EANzB;AAAA,CAAN1N,CAAzB;AAqBA,IAAM6N,cAAc,gBAAG7N,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAvB;AAUA,IAAM8N,WAAW,gBAAG9N,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAApB;AAUA,IAAM+N,WAAW,gBAAG/N,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAApB;AAaA,IAAMgO,kBAAkB,gBAAGhO,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAA3B;AAOA,IAAMiO,iBAAiB,gBAAGjO,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAA1B;AAQA,IAAMkO,cAAc,gBAAGlO,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAvB;AAQA,IAAMmO,KAAK,gBAAGnO,sDAAM,SAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAd;AAWA,IAAMoO,WAAW,gBAAGpO,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAApB;AAKA,IAAMqO,aAAa,gBAAGrO,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAtB;AAWA,IAAMsO,QAAQ,gBAAGtO,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAjB;AAOA,IAAMuO,SAAS,gBAAGvO,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAlB;AAIA,IAAMwO,eAAe,gBAAGxO,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAxB;;AASE,YAvIgB,sBAuIhByO,KAvIgB;EAAA,OA0II1M,eAAK;IAAA,OAAIA,KAAK,CAACH,QAANG,GAAiBwL,gEAAjBxL,GAAkC,aAAtC;EAAA,CA1IT;AAAA,CAuIhB;;AAG4E,YA1I5D,sBA0I4D2M,KA1I5D;EAAA,OA2IP3M,eAAK;IAAA,OAAKA,KAAK,CAACH,QAANG,GAAiB,MAAjBA,GAA0B,SAA/B;EAAA,CA3IE;AAAA,CA0I4D;;AACrB,YA3IvC,sBA2IuC4M,KA3IvC;EAAA,OAiJM5M,eAAK;IAAA,OAAIA,KAAK,CAACH,QAANG,GAAiBwL,gEAAjBxL,GAAkCuL,+DAAtC;EAAA,CAjJX;AAAA,CA2IuC;;AAHzD,IAAMsB,QAAQ,gBAAG5O,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;EAAAyN;IAAA,eAEDa,KAAwD,EAFvD;IAEuD,eACnEC,KAA8C,EADqB,CAFvD;IAGkC,eAMjCC,KAAwD,EANvB;EAHlC;AAAA,CAAN3O,CAAjB;AAYe,SAAS6O,WAAT,OAAqF;EAAA,IAA9DC,WAA8D,QAA9DA,WAA8D;EAAA,IAAjDnS,KAAiD,QAAjDA,KAAiD;EAAA,IAA1CoS,WAA0C,QAA1CA,WAA0C;EAAA,IAA7B3N,QAA6B,QAA7BA,QAA6B;EAAA,IAAnB4N,cAAmB,QAAnBA,cAAmB;EAChG,IAAMC,OAAO,GAAG5B,6CAAM,CAAC,IAAD,CAAtB;EACA,IAAM6B,aAAa,GAAG7B,6CAAM,CAAC,IAAD,CAA5B;;EACA,gBAA8BpK,+CAAQ,CAAC,KAAD,CAAtC;EAAA;EAAA,IAAOkM,SAAP;EAAA,IAAkBC,QAAlB;;EACA,iBAAkCnM,+CAAQ,CAACE,kEAAD,CAA1C;EAAA;EAAA,IAAOK,SAAP;EAAA,IAAkBC,YAAlB;;EACA,iBAAoCR,+CAAQ,CAAC,EAAD,CAA5C;EAAA;EAAA,IAAOoM,UAAP;EAAA,IAAmBC,aAAnB;;EACA,iBAA8BrM,+CAAQ,CAAC+L,cAAD,CAAtC;EAAA;EAAA,IAAOtS,OAAP;EAAA,IAAgB6S,UAAhB;;EACA,IAAMC,SAAS,aAAMN,aAAa,CAACO,OAAdP,GAAwBA,aAAa,CAACO,OAAdP,CAAsBQ,WAAtBR,GAAoC,EAA5DA,GAAiE,CAAvE,OAAf;EACAhM,gDAAS,CAAC,YAAM;IACZ,IAAI6L,WAAW,IAAIvL,SAAS,KAAKL,kEAAjC,EAAsD;MAClD4L,WAAW,CAAC,EAAD,EAAMY,gBAAM,EAAK;QACxBJ,UAAU,CAACI,MAAD,CAAVJ;QACA9L,YAAY,CAACN,6DAAD,CAAZM;MACH,CAHU,CAAXsL;IAIJ;EACH,CAPQ,EAON,CAACA,WAAD,EAAcvL,SAAd,CAPM,CAATN;;EAQA,IAAM2M,WAAW,GAAG,SAAdA,WAAc,GAA2B;IAAA,IAA1BC,KAA0B,uEAAlB,EAAkB;IAAA,IAAdC,SAAc;IAC3C,OAAOD,KAAK,CAACjO,GAANiO,CAAU,UAAC5J,IAAD,EAAO8J,KAAP,EAAiB;MAC9B,IAAI9J,IAAI,CAACxJ,OAAT,EAAkB;QACd,OAAQ6D,uDAAK,CAACgO,SAAD,EAAY;UAAE7O,QAAQ,EAAE,CAACH,sDAAI,CAACiP,eAAD,EAAkB;YAAE9H,EAAE,YAAKsJ,KAAL,aAAJ;YAA0BtQ,QAAQ,EAAEwG,IAAI,CAACzJ;UAAzC,CAAlB,CAAL,EAA0E8C,sDAAI,CAAC,KAAD,EAAQ;YAAEG,QAAQ,EAAEmQ,WAAW,CAAC3J,IAAI,CAACxJ,OAAN,EAAesT,KAAf;UAAvB,CAAR,CAA9E;QAAZ,CAAZ,8BAAuLA,KAAvL,EAAb;MACH,CAFD,MAGK;QACD,IAAMpM,GAAG,+BAAwBmM,SAAS,KAAKE,SAAdF,aAA6BA,SAA7BA,cAA0CC,KAA1CD,IAAoDC,KAA5E,CAAT;QACA,OAAQzQ,sDAAI,CAACqP,QAAD,EAAW;UAAElI,EAAE,EAAE9C,GAAN;UAAWhC,QAAQ,EAAEjF,KAAK,IAAIuJ,IAAI,CAACvJ,KAALuJ,KAAevJ,KAAK,CAACA,KAAnD;UAA0DgK,OAAO,EAAE,mBAAM;YACxFvF,QAAQ,CAAC8E,IAAD,CAAR9E;YACAgO,QAAQ,CAAC,KAAD,CAARA;UACH,CAHkB;UAGhB1P,QAAQ,EAAEwG,IAAI,CAACzJ;QAHC,CAAX,EAGmBmH,GAHnB,CAAZ;MAIJ;IACH,CAXMkM,CAAP;EAYH,CAbD;;EAcA,OAAQvP,uDAAK,CAACN,SAAD,EAAY;IAAEP,QAAQ,EAAE,CAACa,uDAAK,CAACoN,gBAAD,EAAmB;MAAEjH,EAAE,EAAE,uBAAN;MAA+B+G,OAAO,EAAE0B,SAAxC;MAAmDxI,OAAO,EAAE,mBAAM;QAChH,IAAIwI,SAAJ,EAAe;UACX,IAAIF,OAAO,CAACQ,OAAZ,EAAqB;YACjBR,OAAO,CAACQ,OAARR,CAAgBiB,IAAhBjB;UACJ;;UACAG,QAAQ,CAAC,KAAD,CAARA;UACAE,aAAa,CAAC,EAAD,CAAbA;QACH,CAND,MAOK;UACD,IAAIL,OAAO,CAACQ,OAAZ,EAAqB;YACjBR,OAAO,CAACQ,OAARR,CAAgBkB,KAAhBlB;UACJ;;UACAG,QAAQ,CAAC,IAAD,CAARA;QACJ;MACH,CAdiD;MAc/C1P,QAAQ,EAAE,CAACa,uDAAK,CAACsN,cAAD,EAAiB;QAAEnO,QAAQ,EAAE,CAAC2P,UAAU,KAAK,EAAfA,KAChC,CAAC1S,KAAD,GAAU4C,sDAAI,CAACuO,WAAD,EAAc;UAAEpO,QAAQ,EAAEoP;QAAZ,CAAd,CAAd,GAA2DvP,sDAAI,CAACwO,WAAD,EAAc;UAAErO,QAAQ,EAAE/C,KAAK,CAACF;QAAlB,CAAd,CAD/B4S,CAAD,EAC4E9O,uDAAK,CAAC2N,cAAD,EAAiB;UAAExO,QAAQ,EAAE,CAACH,sDAAI,CAAC4O,KAAD,EAAQ;YAAEiC,GAAG,EAAEnB,OAAP;YAAgBoB,OAAO,EAAE,mBAAM;cAC9KjB,QAAQ,CAAC,IAAD,CAARA;YACH,CAFkJ;YAEhJhO,QAAQ,EAAEkP,mBAAC,EAAI;cACdhB,aAAa,CAACgB,CAAC,CAAC7O,MAAF6O,CAAS3T,KAAV,CAAb2S;cACA7L,YAAY,CAACN,gEAAD,CAAZM;cACAsL,WAAW,IACPA,WAAW,CAACuB,CAAC,CAAC7O,MAAF6O,CAAS3T,KAAV,EAAkBgT,gBAAM,EAAK;gBACpCJ,UAAU,CAACI,MAAD,CAAVJ;gBACA9L,YAAY,CAACN,6DAAD,CAAZM;cACH,CAHU,CADfsL;YAKH,CAVkJ;YAUhJpS,KAAK,EAAE0S,UAVyI;YAU7HkB,KAAK,EAAEf,SAVsH;YAU3G9I,EAAE,EAAE;UAVuG,CAAR,CAAL,EAUjEnH,sDAAI,CAAC6O,WAAD,EAAc;YAAEgC,GAAG,EAAElB,aAAP;YAAsBxP,QAAQ,EAAE2P;UAAhC,CAAd,CAV6D;QAAZ,CAAjB,CADjF;MAAZ,CAAjB,CAAN,EAWyJ9O,uDAAK,CAACyN,kBAAD,EAAqB;QAAEtO,QAAQ,EAAE,CAAC8D,SAAS,KAAKL,gEAAdK,IAAmCjE,sDAAI,CAACkB,+DAAD,EAAY,EAAZ,CAAxC,EAAyDlB,sDAAI,CAAC0O,iBAAD,EAAoB,EAApB,CAA7D;MAAZ,CAArB,CAX9J;IAdqC,CAAnB,CAAN,EAyBiRkB,SAAS,IAAK5P,sDAAI,CAAC8O,aAAD,EAAgB;MAAE3O,QAAQ,EAAEH,sDAAI,CAAC+O,QAAD,EAAW;QAAE5O,QAAQ,EAAEmQ,WAAW,CAACnT,OAAD;MAAvB,CAAX;IAAhB,CAAhB,CAzBnS;EAAZ,CAAZ,CAAb;AA0BJ;;;;;;;;;;;;;;;;;;;;;;;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASiU,gBAAT,GAA4B;EACxB9T,MAAM,CAAC+T,QAAP,CAAgBC,IAAhB,aAA0B7T,6DAA1B,kDAA0E2B,kEAA1E;AACH;;AACc,SAAS+D,YAAT,OAAyG;EAAA,IAAjFM,MAAiF,QAAjFA,MAAiF;EAAA,IAAzE8N,eAAyE,QAAzEA,eAAyE;EAAA,0BAAxDC,SAAwD;EAAA,IAAxDA,SAAwD,+BAA5C;IAAEC,MAAM,EAAE,EAAV;IAAc9E,OAAO,EAAE,EAAvB;IAA2B+E,MAAM,EAAE;EAAnC,CAA4C;EACpH,IAAMC,cAAc,GAAGlO,MAAM,KAAK,GAAX,IAAkBA,MAAM,KAAK,GAApD;EACA,IAAMmO,WAAW,GAAGD,cAAc,GAC5BhV,mDAAE,CAAC,8BAAD,EAAiC,QAAjC,CAD0B,GAE5B6U,SAAS,CAACC,MAFhB;EAGA,IAAMI,YAAY,GAAGF,cAAc,GAC7BhV,mDAAE,CAAC,2DAAD,EAA8D,QAA9D,CAD2B,GAE7B6U,SAAS,CAAC7E,OAFhB;EAGA,OAAQ3M,sDAAI,CAACmR,uDAAD,EAAiB;IAAEpS,UAAU,EAAEA,+DAAd;IAA0BoB,QAAQ,EAAEa,uDAAK,CAACkQ,iEAAD,EAAc;MAAEY,SAAS,EAAE,QAAb;MAAuB3R,QAAQ,EAAE,CAACH,sDAAI,CAAC,IAAD,EAAO;QAAEG,QAAQ,EAAEyR;MAAZ,CAAP,CAAL,EAAwC5R,sDAAI,CAAC,GAAD,EAAM;QAAEG,QAAQ,EAAEH,sDAAI,CAAC,GAAD,EAAM;UAAEG,QAAQ,EAAE0R;QAAZ,CAAN;MAAhB,CAAN,CAA5C,EAAwGF,cAAc,GAAI3R,sDAAI,CAACiR,8DAAD,EAAW;QAAE,gBAAgB,kBAAlB;QAAsC7J,OAAO,EAAEgK,gBAA/C;QAAiEjR,QAAQ,EAAExD,mDAAE,CAAC,cAAD,EAAiB,QAAjB;MAA7E,CAAX,CAAR,GAAkIqD,sDAAI,CAACiR,8DAAD,EAAW;QAAE,gBAAgB,cAAlB;QAAkC7J,OAAO,EAAEmK,eAA3C;QAA4DpR,QAAQ,EAAEqR,SAAS,CAACE;MAAhF,CAAX,CAA5P;IAAjC,CAAd;EAAzC,CAAjB,CAAZ;AACH;;;;;;;;;;;;;;;;ACnBD;;AAAwC,WACtB,sBADsBK,IACtB;EAAA,OACIvP,eAAK;IAAA,qBAAWA,KAAK,CAACzD,UAAjB;EAAA,CADT;AAAA,CADsB;;AAEkD,YADxE,sBACwEkP,KADxE;EAAA,OAUJzL,eAAK;IAAA,OAAKA,KAAK,CAACwP,OAANxP,IAAiB,eAAtB;EAAA,CAVD;AAAA,CACwE;;AAD1F,8EAAe/B,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;EAAAyN;IAAA,eACC0D,IAAoE,EADrE;IACqE,eAS7E9D,KAA2C,EATkC;EADrE;AAAA,CAANxN,CAAf;;;;;;;;;;;;;;;;;;;;;ACDA;AACA;AACA;AACA;AACe,SAASwR,YAAT,GAAwB;EACnC,OAAQjS,sDAAI,CAACmR,uDAAD,EAAiB;IAAEpS,UAAU,EAAEA,+DAAd;IAA0BoB,QAAQ,EAAEH,sDAAI,CAACkB,+DAAD,EAAY;MAAEgR,IAAI,EAAE;IAAR,CAAZ;EAAxC,CAAjB,CAAZ;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACND;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAAS9O,QAAT,OAAoG;EAAA,IAAhFJ,UAAgF,QAAhFA,UAAgF;EAAA,IAApEM,UAAoE,QAApEA,UAAoE;EAAA,IAAxD7B,aAAwD,QAAxDA,aAAwD;EAAA,wBAAzC8B,OAAyC;EAAA,IAAzCA,OAAyC,6BAA/B,IAA+B;EAAA,uBAAzBC,MAAyB;EAAA,IAAzBA,MAAyB,4BAAhB,WAAgB;EAChG,IAAQhC,MAAR,GAA6BwB,UAA7B,CAAQxB,MAAR;EAAA,IAAgBW,QAAhB,GAA6Ba,UAA7B,CAAgBb,QAAhB;EACA,IAAMmQ,YAAY,GAAGnT,6DAAQ,IAAIqC,MAAjC;EACA,IAAMiB,oBAAoB,GAAGrB,iFAAuB,EAApD;EACA,IAAMmR,wBAAwB,GAAG9F,kFAAwB,EAAzD;;EACA,IAAM+F,YAAY,GAAG,SAAfA,YAAe,CAACzQ,YAAD,EAAkB;IACnCN,aAAa,CAAC;MACVtC,QAAQ,EAARA,6DADU;MAEVqC,MAAM,EAAEO,YAAY,CAAC3E,KAFX;MAGV+E,QAAQ,EAAEJ,YAAY,CAAC7E;IAHb,CAAD,CAAb;EAKH,CAND;;EAOAyG,gDAAS,CAAC,YAAM;IACZ4O,wBAAwB,CAAC;MACrBlO,GAAG,EAAER,4FADgB;MAErBU,OAAO,EAAE;QACLf,MAAM,EAANA;MADK;IAFY,CAAD,CAAxB;EAMH,CAPQ,EAON,CAACA,MAAD,CAPM,CAAT;EAQA,OAAO,CAACf,oBAAD,GAAyBzC,sDAAI,CAACiS,4DAAD,EAAe,EAAf,CAA7B,GAAoDjR,uDAAK,CAACC,2CAAD,EAAW;IAAEd,QAAQ,EAAE,CAAC,CAACmD,UAAU,IAAI,CAACgP,YAAhB,KAAkCtS,sDAAI,CAACqS,mDAAD,EAAa;MAAE7Q,MAAM,EAAEA,MAAV;MAAkBW,QAAQ,EAAEA,QAA5B;MAAsCqQ,YAAY,EAAEA,YAApD;MAAkEhP,MAAM,EAAEA;IAA1E,CAAb,CAAvC,EAA0I8O,YAAY,IAAKtR,uDAAK,CAACC,2CAAD,EAAW;MAAEd,QAAQ,EAAE,CAACmD,UAAU,IAAItD,sDAAI,CAACmS,8DAAD,EAAW,EAAX,CAAnB,EAAmC5O,OAAO,IAAIvD,sDAAI,CAACoS,oDAAD,EAAc;QAAEjT,QAAQ,EAAEA,6DAAZ;QAAsBqC,MAAM,EAAEA;MAA9B,CAAd,CAAlD;IAAZ,CAAX,CAAhK;EAAZ,CAAX,CAAhE;AACH;;AACc,SAASiR,iBAAT,CAA2BjQ,KAA3B,EAAkC;EAC7C,OAAQxC,sDAAI,CAACmB,kFAAD,EAA+B;IAAE/D,KAAK,EAAEmC,iEAAY,IAAI+B,mFAAwB,CAAC/B,iEAAD,CAAjD;IAAiEY,QAAQ,EAAEH,sDAAI,CAACoD,QAAD,oBAAgBZ,KAAhB;EAA/E,CAA/B,CAAZ;AACH;;;;;;;;;;;;;;;;;;;;;;;;AClCD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS6P,UAAT,OAA+E;EAAA,IAAzD7Q,MAAyD,QAAzDA,MAAyD;EAAA,IAAjDW,QAAiD,QAAjDA,QAAiD;EAAA,IAAvCqQ,YAAuC,QAAvCA,YAAuC;EAAA,uBAAzBhP,MAAyB;EAAA,IAAzBA,MAAyB,4BAAhB,WAAgB;;EAC1F,gBAAwCnC,2DAAQ,EAAhD;EAAA,IAAQmD,MAAR,aAAQA,MAAR;EAAA,IAAgBoO,YAAhB,aAAgBA,YAAhB;EAAA,IAA8BC,KAA9B,aAA8BA,KAA9B;;EACA,4BAA0GF,4EAAyB,CAACnP,MAAD,CAAnI;EAAA,IAAQsP,oBAAR,yBAAQA,oBAAR;EAAA,IAAqCC,WAArC,yBAA8BF,KAA9B;EAAA,IAAkDG,UAAlD,yBAAkDA,UAAlD;EAAA,IAA8DtR,QAA9D,yBAA8DA,QAA9D;EAAA,IAAsFuR,cAAtF,yBAAwEL,YAAxE;;EACA,IAAMxV,KAAK,GAAGoE,MAAM,IAAIW,QAAV,GACR;IACEjF,KAAK,EAAEiF,QADT;IAEE/E,KAAK,EAAEoE;EAFT,CADQ,GAKR,IALN;;EAMA,IAAM0R,iBAAiB,GAAG,SAApBA,iBAAoB,CAACC,MAAD,EAAY;IAClC,IAAI9V,4EAAa,CAAC8V,MAAM,CAAC/V,KAAR,CAAjB,EAAiC;MAC7B0V,oBAAoB,CAACK,MAAM,CAAC/V,KAAR,CAApB,CAAmCqH,IAAnC,CAAwC,iBAAoB;QAAA,IAAjBE,IAAiB,SAAjBA,IAAiB;QAAA,IAAXhE,IAAW,SAAXA,IAAW;QACxD6R,YAAY,CAAC;UACTpV,KAAK,EAAEuH,IADE;UAETzH,KAAK,EAAEyD;QAFE,CAAD,CAAZ;MAIH,CALD;IAMH,CAPD,MAQK;MACD6R,YAAY,CAACW,MAAD,CAAZ;IACH;EACJ,CAZD;;EAaA,OAAOH,UAAU,GAAIhT,sDAAI,CAACiS,4DAAD,EAAe,EAAf,CAAR,GAA8BW,YAAY,IAAIK,cAAhB,GAAkCjT,sDAAI,CAACmD,4DAAD,EAAe;IAAEM,MAAM,EAAEmP,YAAY,GAAGA,YAAY,CAACnP,MAAhB,GAAyBwP,cAAc,CAACxP,MAA9D;IAAsE8N,eAAe,EAAE,2BAAM;MACzL,IAAI7P,QAAJ,EAAc;QACVqR,WAAW;MACd,CAFD,MAGK;QACDF,KAAK;MACR;IACJ,CAP+F;IAO7FrB,SAAS,EAAE;MACVC,MAAM,EAAE9U,mDAAE,CAAC,2CAAD,EAA8C,QAA9C,CADA;MAEVgQ,OAAO,EAAEhQ,mDAAE,CAAC,yDAAD,EAA4D,QAA5D,CAFD;MAGV+U,MAAM,EAAE/U,mDAAE,CAAC,eAAD,EAAkB,QAAlB;IAHA;EAPkF,CAAf,CAAtC,GAWlCqD,sDAAI,CAAC0S,qDAAD,EAAe;IAAElD,WAAW,EAAEhL,MAAf;IAAuB3C,QAAQ,EAAE,kBAACsR,MAAD;MAAA,OAAYD,iBAAiB,CAACC,MAAD,CAA7B;IAAA,CAAjC;IAAwE/V,KAAK,EAAEA;EAA/E,CAAf,CAXjB;AAYH;;;;;;;;;;;;;;;;;;;;;AC1CD;AACA;AACA;AACA;AACA;AACe,SAASsV,YAAT,OAAyD;EAAA,IAAjClD,WAAiC,QAAjCA,WAAiC;EAAA,IAApB3N,QAAoB,QAApBA,QAAoB;EAAA,IAAVzE,KAAU,QAAVA,KAAU;EACpE,OAAQ4D,uDAAK,CAACmQ,8DAAD,EAAiB;IAAEpS,UAAU,EAAEA,+DAAd;IAA0BoB,QAAQ,EAAE,CAACH,sDAAI,CAAC,GAAD,EAAM;MAAE,gBAAgB,oBAAlB;MAAwCG,QAAQ,EAAEH,sDAAI,CAAC,GAAD,EAAM;QAAEG,QAAQ,EAAExD,mDAAE,CAAC,6DAAD,EAAgE,QAAhE;MAAd,CAAN;IAAtD,CAAN,CAAL,EAAsKqD,sDAAI,CAACsP,2DAAD,EAAc;MAAEC,WAAW,EAAE5S,mDAAE,CAAC,mBAAD,EAAsB,QAAtB,CAAjB;MAAkDS,KAAK,EAAEA,KAAzD;MAAgEoS,WAAW,EAAEA,WAA7E;MAA0F3N,QAAQ,EAAEA;IAApG,CAAd,CAA1K;EAApC,CAAjB,CAAb;AACH;;;;;;;;;;;;;;;;;;;;;ACPD;AACA;AACA;AACA;AACA;AACe,SAASuQ,WAAT,OAA4C;EAAA,IAArBjT,QAAqB,QAArBA,QAAqB;EAAA,IAAXqC,MAAW,QAAXA,MAAW;EACvD,IAAMkO,OAAO,GAAG5B,6CAAM,CAAC,IAAD,CAAtB;EACA,IAAMwF,KAAK,GAAGD,iEAAa,EAA3B;EACA1P,gDAAS,CAAC,YAAM;IACZ,IAAI,CAAC2P,KAAL,EAAY;MACR;IACH;;IACD,IAAI5D,OAAO,CAACQ,OAAZ,EAAqB;MACjBR,OAAO,CAACQ,OAAR,CAAgBqD,SAAhB,GAA4B,EAA5B;MACA,IAAMC,WAAW,GAAGC,QAAQ,CAACC,aAAT,CAAuB,QAAvB,CAApB;MACAF,WAAW,CAACD,SAAZ,6CAA2DpU,QAA3D,yBAAkFqC,MAAlF,yBAAuGtD,2DAAvG,gBAAmHD,uEAAnH;MACAyR,OAAO,CAACQ,OAAR,CAAgByD,WAAhB,CAA4BH,WAA5B;IACH;EACJ,CAVQ,EAUN,CAAChS,MAAD,EAASrC,QAAT,EAAmBmU,KAAnB,EAA0B5D,OAA1B,CAVM,CAAT;EAWA,OAAO1P,sDAAI,CAACoT,+DAAD,EAAY;IAAEvC,GAAG,EAAEnB;EAAP,CAAZ,CAAX;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpBD;AACA;AACA;AACA;AACe,SAASiD,yBAAT,GAAyD;EAAA,IAAtBnP,MAAsB,uEAAb,WAAa;EACpE,IAAMO,KAAK,GAAGD,uFAA6B,EAA3C;EACA,IAAM8P,KAAK,GAAGnH,kFAAwB,EAAtC;;EACA,gBAAkC/I,+CAAQ,CAACE,6DAAD,CAA1C;EAAA;EAAA,IAAOK,SAAP;EAAA,IAAkBC,YAAlB;;EACA,iBAAwCR,+CAAQ,CAAC,IAAD,CAAhD;EAAA;EAAA,IAAOkP,YAAP;EAAA,IAAqBiB,eAArB;;EACA,IAAMf,oBAAoB,GAAG,SAAvBA,oBAAuB,CAACvS,IAAD,EAAU;IACnC2D,YAAY,CAACN,gEAAD,CAAZ;IACAgQ,KAAK,CAAC;MACFvP,GAAG,EAAER,kGADH;MAEFU,OAAO,EAAE;QACLhE,IAAI,EAAJA,IADK;QAELiD,MAAM,EAANA;MAFK;IAFP,CAAD,CAAL;IAOA,OAAOO,KAAK,CAAC;MACTM,GAAG,EAAER,4FADI;MAETU,OAAO,EAAEhE;IAFA,CAAD,CAAL,CAIFkE,IAJE,CAIG,UAAAxC,IAAI,EAAI;MACdiC,YAAY,CAACN,6DAAD,CAAZ;MACA,OAAO3B,IAAP;IACH,CAPM,WAQI,UAAA6R,GAAG,EAAI;MACdD,eAAe,CAACC,GAAD,CAAf;MACAF,KAAK,CAAC;QACFvP,GAAG,EAAER,6FADH;QAEFU,OAAO,EAAE;UACLf,MAAM,EAANA;QADK;MAFP,CAAD,CAAL;MAMAU,YAAY,CAACN,+DAAD,CAAZ;IACH,CAjBM,CAAP;EAkBH,CA3BD;;EA4BA,OAAO;IACHoP,UAAU,EAAE/O,SAAS,KAAKL,gEADvB;IAEHlC,QAAQ,EAAEuC,SAAS,KAAKL,+DAFrB;IAGHgP,YAAY,EAAZA,YAHG;IAIHE,oBAAoB,EAApBA,oBAJG;IAKHD,KAAK,EAAE;MAAA,OAAM3O,YAAY,CAACN,6DAAD,CAAlB;IAAA;EALJ,CAAP;AAOH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5CD;AACA;AACA;AACA;AACA;AACe,SAASvC,QAAT,GAAoB;EAC/B,IAAM0C,KAAK,GAAGD,uFAA6B,EAA3C;;EACA,gBAAwCJ,+CAAQ,CAAC,IAAD,CAAhD;EAAA;EAAA,IAAOkP,YAAP;EAAA,IAAqBiB,eAArB;;EACA,IAAMrP,MAAM,GAAGuP,sDAAQ,CAAC,UAACvP,MAAD,EAASmD,QAAT,EAAsB;IAC1C,OAAO5D,KAAK,CAAC;MACTM,GAAG,EAAER,gFADI;MAETU,OAAO,EAAE;QACLC,MAAM,EAANA;MADK;IAFA,CAAD,CAAL,CAMFC,IANE,CAMG,UAAA9C,KAAK,EAAI;MACfgG,QAAQ,8BACDhG,KAAK,CAACW,GAAN,CAAU,UAACL,IAAD;QAAA,OAAW;UACpB/E,KAAK,EAAE+E,IAAI,CAACtB,IADQ;UAEpBvD,KAAK,EAAE6E,IAAI,CAAC0C;QAFQ,CAAX;MAAA,CAAV,CADC,IAKJ1H,0EALI,GAAR;IAOH,CAdM,WAeI,UAAA4H,KAAK,EAAI;MAChBgP,eAAe,CAAChP,KAAD,CAAf;IACH,CAjBM,CAAP;EAkBH,CAnBsB,EAmBpB,GAnBoB,EAmBf;IAAEmP,QAAQ,EAAE;EAAZ,CAnBe,CAAvB;EAoBA,OAAO;IACHxP,MAAM,EAANA,MADG;IAEHoO,YAAY,EAAZA,YAFG;IAGHC,KAAK,EAAE;MAAA,OAAMgB,eAAe,CAAC,IAAD,CAArB;IAAA;EAHJ,CAAP;AAKH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjCD;AACA;AACA;AACA;AACA,IAAIK,OAAJ;;AACA,SAASC,eAAT,GAA2B;EACvB,IAAI,CAACD,OAAL,EAAc;IACVA,OAAO,GAAG,IAAIE,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV;MAAA,OAAqBL,uDAAA,CAAYlW,gEAAZ,EACtC6J,IADsC,CACjCyM,OADiC,EAEtCG,IAFsC,CAEjCF,MAFiC,CAArB;IAAA,CAAZ,CAAV;EAGH;;EACD,OAAOJ,OAAP;AACH;;AACc,SAASb,aAAT,GAAyB;EACpC,gBAA0B3P,+CAAQ,CAAC,KAAD,CAAlC;EAAA;EAAA,IAAO4P,KAAP;EAAA,IAAcmB,QAAd;;EACA9Q,gDAAS,CAAC,YAAM;IACZwQ,eAAe,GACV1P,IADL,CACU;MAAA,OAAMgQ,QAAQ,CAAC,IAAD,CAAd;IAAA,CADV,WAEW,UAAA5P,KAAK;MAAA,OAAIc,mEAAA,CAAuBd,KAAvB,CAAJ;IAAA,CAFhB;EAGH,CAJQ,EAIN,EAJM,CAAT;EAKA,OAAOyO,KAAP;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASuB,iBAAT,OAAmD;EAAA,IAAtBrC,YAAsB,QAAtBA,YAAsB;EAAA,IAAR3M,GAAQ,QAARA,GAAQ;;EAC9D,mBAA+EJ,8DAAW,EAA1F;EAAA,IAAwBK,QAAxB,gBAAQC,cAAR;EAAA,IAAkCnE,OAAlC,gBAAkCA,OAAlC;EAAA,IAA2CiD,KAA3C,gBAA2CA,KAA3C;EAAA,IAAkDmB,MAAlD,gBAAkDA,MAAlD;EAAA,IAA0DC,eAA1D,gBAA0DA,eAA1D;;EACA,IAAM6O,qBAAqB,GAAGF,sEAAkB,CAAC/O,GAAD,CAAhD;EACA,IAAMK,uBAAuB,GAAGR,8EAA0B,CAACG,GAAD,CAA1D;EACAlC,gDAAS,CAAC,YAAM;IACZ,IAAI,CAACkC,GAAD,IAAQC,QAAQ,CAACW,MAAT,GAAkB,CAA9B,EAAiC;MAC7B+L,YAAY,CAAC1M,QAAQ,CAAC,CAAD,CAAR,CAAY1I,KAAb,CAAZ;IACH;EACJ,CAJQ,EAIN,CAAC0I,QAAD,EAAWD,GAAX,EAAgB2M,YAAhB,CAJM,CAAT;;EAKA,IAAMU,iBAAiB,GAAG,SAApBA,iBAAoB,CAACC,MAAD,EAAY;IAClCX,YAAY,CAACW,MAAM,CAAC/V,KAAR,CAAZ;EACH,CAFD;;EAGA,IAAMiJ,qBAAqB,GAAG,SAAxBA,qBAAwB,GAAM;IAChC,OAAOJ,eAAe,GACjBxB,IADE,CACG,YAAM;MACZuB,MAAM;IACT,CAHM,WAII,UAAAnB,KAAK,EAAI;MAChBc,+DAAA,CAAqB,4BAArB,EAAmD;QAC/CY,KAAK,EAAE;UAAE1B,KAAK,EAALA;QAAF;MADwC,CAAnD;IAGH,CARM,CAAP;EASH,CAVD;;EAWA,OAAQ7E,sDAAI,CAACiB,2CAAD,EAAW;IAAEd,QAAQ,EAAEyB,OAAO,GAAI5B,sDAAI,CAACiS,4DAAD,EAAe,EAAf,CAAR,GAA8BpN,KAAK,GAAI7E,sDAAI,CAACmD,4DAAD,EAAe;MAAEM,MAAM,EAAGoB,KAAK,IAAIA,KAAK,CAACpB,MAAhB,IAA2BoB,KAArC;MAA4C0M,eAAe,EAAE;QAAA,OAAMvL,MAAM,EAAZ;MAAA,CAA7D;MAA6EwL,SAAS,EAAE;QAChLC,MAAM,EAAE9U,mDAAE,CAAC,8CAAD,EAAiD,QAAjD,CADsK;QAEhLgQ,OAAO,EAAEhQ,mDAAE,CAAC,4DAAD,EAA+D,QAA/D,CAFqK;QAGhL+U,MAAM,EAAE/U,mDAAE,CAAC,kBAAD,EAAqB,QAArB;MAHsK;IAAxF,CAAf,CAAR,GAI5DqE,uDAAK,CAACmQ,8DAAD,EAAiB;MAAEa,OAAO,EAAE,gBAAX;MAA6BjT,UAAU,EAAEA,+DAAzC;MAAqDoB,QAAQ,EAAE,CAAC+F,uBAAuB,IAAKlG,sDAAI,CAAC+G,uDAAD,EAAiB;QAAEtD,MAAM,EAAEyC,uBAAV;QAAmCM,iBAAiB,EAAEH;MAAtD,CAAjB,CAAjC,EAAmIP,QAAQ,CAACW,MAAT,GAAkB,CAAlB,IAAwBzG,sDAAI,CAAC2U,wDAAD,EAAkB;QAAE9S,QAAQ,EAAEqR,iBAAZ;QAA+B/V,OAAO,EAAE2I,QAAxC;QAAkD1I,KAAK,EAAE0X;MAAzD,CAAlB,CAA/J;IAA/D,CAAjB;EAJC,CAAX,CAAZ;AAKH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvCD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASE,WAAT,OAAgH;EAAA,IAA3EnP,GAA2E,QAAzF7C,UAAyF,CAA3E6C,GAA2E;EAAA,IAApEvC,UAAoE,QAApEA,UAAoE;EAAA,IAAxD7B,aAAwD,QAAxDA,aAAwD;EAAA,wBAAzC8B,OAAyC;EAAA,IAAzCA,OAAyC,6BAA/B,IAA+B;EAAA,uBAAzBC,MAAyB;EAAA,IAAzBA,MAAyB,4BAAhB,WAAgB;EAC5G,IAAMf,oBAAoB,GAAGrB,iFAAuB,EAApD;EACA,IAAMmR,wBAAwB,GAAG9F,kFAAwB,EAAzD;;EACA,IAAM+F,YAAY,GAAG,SAAfA,YAAe,CAAC9L,MAAD,EAAY;IAC7BjF,aAAa,CAAC;MACVoE,GAAG,EAAEa;IADK,CAAD,CAAb;EAGH,CAJD;;EAKA/C,gDAAS,CAAC,YAAM;IACZ4O,wBAAwB,CAAC;MACrBlO,GAAG,EAAER,+FADgB;MAErBU,OAAO,EAAE;QACLf,MAAM,EAANA;MADK;IAFY,CAAD,CAAxB;EAMH,CAPQ,EAON,CAACA,MAAD,CAPM,CAAT;EAQA,OAAO,CAACf,oBAAD,GAAyBzC,sDAAI,CAACiS,4DAAD,EAAe,EAAf,CAA7B,GAAoDjR,uDAAK,CAACC,2CAAD,EAAW;IAAEd,QAAQ,EAAE,CAAC,CAACmD,UAAU,IAAI,CAACuC,GAAhB,KAAyB7F,sDAAI,CAAC6U,0DAAD,EAAoB;MAAEhP,GAAG,EAAEA,GAAP;MAAY2M,YAAY,EAAEA;IAA1B,CAApB,CAA9B,EAA8FjP,OAAO,IAAIsC,GAAX,IAAkB7F,sDAAI,CAAC+U,uDAAD,EAAiB;MAAElP,GAAG,EAAEA;IAAP,CAAjB,CAApH;EAAZ,CAAX,CAAhE;AACH;;AACc,SAASoP,qBAAT,CAA+BzS,KAA/B,EAAsC;EACjD,OAAQxC,sDAAI,CAACmB,kFAAD,EAA+B;IAAE/D,KAAK,EAAEmC,iEAAY,IAAI+B,mFAAwB,CAAC/B,iEAAD,CAAjD;IAAiEY,QAAQ,EAAEH,sDAAI,CAACgV,WAAD,oBAAmBxS,KAAnB;EAA/E,CAA/B,CAAZ;AACH;;;;;;;;;;;;;;;;;;;;;;AC7BD;AACA;AACA;AACA;AACA;AACe,SAASmS,eAAT,OAAwD;EAAA,IAA7BxX,OAA6B,QAA7BA,OAA6B;EAAA,IAApB0E,QAAoB,QAApBA,QAAoB;EAAA,IAAVzE,KAAU,QAAVA,KAAU;EACnE,IAAM8X,cAAc,GAAG,CACnB;IACIhY,KAAK,EAAEP,mDAAE,CAAC,cAAD,EAAiB,QAAjB,CADb;IAEIQ,OAAO,EAAPA;EAFJ,CADmB,CAAvB;EAMA,OAAQ6D,uDAAK,CAACC,2CAAD,EAAW;IAAEd,QAAQ,EAAE,CAACH,sDAAI,CAACmS,8DAAD,EAAW,EAAX,CAAL,EAAqBnS,sDAAI,CAAC,GAAD,EAAM;MAAE,gBAAgB,uBAAlB;MAA2CG,QAAQ,EAAEH,sDAAI,CAAC,GAAD,EAAM;QAAEG,QAAQ,EAAExD,mDAAE,CAAC,kCAAD,EAAqC,QAArC;MAAd,CAAN;IAAzD,CAAN,CAAzB,EAAkKqD,sDAAI,CAACsP,2DAAD,EAAc;MAAEG,cAAc,EAAEyF,cAAlB;MAAkCrT,QAAQ,EAAEA,QAA5C;MAAsD0N,WAAW,EAAE5S,mDAAE,CAAC,kBAAD,EAAqB,QAArB,CAArE;MAAqGS,KAAK,EAAEA;IAA5G,CAAd,CAAtK;EAAZ,CAAX,CAAb;AACH;;;;;;;;;;;;;;;;;;;;;ACbD;AACA;AACA;AACA;AACA;AACe,SAAS2J,cAAT,OAAwD;EAAA,IAA9BtD,MAA8B,QAA9BA,MAA8B;EAAA,IAAtB+C,iBAAsB,QAAtBA,iBAAsB;EACnE,IAAMQ,cAAc,GAAGvD,MAAM,KAAKqD,qEAAlC;EACA,IAAMG,SAAS,GAAGD,cAAc,GAC1BrK,mDAAE,CAAC,gCAAD,EAAmC,QAAnC,CADwB,GAE1BA,mDAAE,CAAC,2BAAD,EAA8B,QAA9B,CAFR;EAGA,IAAMuK,YAAY,GAAGF,cAAc,GAC7BrK,mDAAE,CAAC,gEAAD,EAAmE,QAAnE,CAD2B,GAE7BA,mDAAE,CAAC,yGAAD,EAA4G,QAA5G,CAFR;EAGA,OAAQqD,sDAAI,CAACmV,6DAAD,EAAU;IAAElO,SAAS,EAAEA,SAAb;IAAwBC,YAAY,EAAEA,YAAtC;IAAoD/G,QAAQ,EAAE6G,cAAc,IAAKhH,sDAAI,CAACiR,8DAAD,EAAW;MAAEmE,GAAG,EAAE,UAAP;MAAmBjO,EAAE,EAAE,2BAAvB;MAAoDC,OAAO,EAAEZ,iBAA7D;MAAgFrG,QAAQ,EAAExD,mDAAE,CAAC,kBAAD,EAAqB,QAArB;IAA5F,CAAX;EAArF,CAAV,CAAZ;AACH;;;;;;;;;;;;;;;;;;;;ACdD;AACA;AACA;AACA;AACe,SAASyV,WAAT,OAA8B;EAAA,IAAPvM,GAAO,QAAPA,GAAO;EACzC,IAAMyN,KAAK,GAAG+B,oEAAiB,EAA/B;EACA,IAAM3F,OAAO,GAAG5B,6CAAM,CAAC,IAAD,CAAtB;EACAnK,gDAAS,CAAC,YAAM;IACZ,IAAI,CAAC2P,KAAL,EAAY;MACR;IACH;;IACD,IAAI5D,OAAO,CAACQ,OAAZ,EAAqB;MACjBR,OAAO,CAACQ,OAAR,CAAgBqD,SAAhB,GAA4B,EAA5B;MACA,IAAM+B,SAAS,GAAG7B,QAAQ,CAACC,aAAT,CAAuB,KAAvB,CAAlB;MACA4B,SAAS,CAAClQ,OAAV,CAAkBmQ,GAAlB,aAA2B1P,GAA3B;MACAyP,SAAS,CAACE,SAAV,CAAoBC,GAApB,CAAwB,2BAAxB;MACA/F,OAAO,CAACQ,OAAR,CAAgByD,WAAhB,CAA4B2B,SAA5B;MACA,IAAM9B,WAAW,GAAGC,QAAQ,CAACC,aAAT,CAAuB,QAAvB,CAApB;MACAF,WAAW,CAACD,SAAZ,GACI,sDADJ;MAEA7D,OAAO,CAACQ,OAAR,CAAgByD,WAAhB,CAA4BH,WAA5B;IACH;EACJ,CAfQ,EAeN,CAAC3N,GAAD,EAAMyN,KAAN,EAAa5D,OAAb,CAfM,CAAT;EAgBA,OAAO1P,sDAAI,CAACiB,2CAAD,EAAW;IAAEd,QAAQ,EAAE0F,GAAG,IAAI7F,sDAAI,CAACoT,+DAAD,EAAY;MAAEvC,GAAG,EAAEnB;IAAP,CAAZ;EAAvB,CAAX,CAAX;AACH;;;;;;;;;;;;;;;;ACxBM,IAAMgG,2BAA2B,GAAG,6BAApC;AACA,IAAM5O,6BAA6B,GAAG,+BAAtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDP;AACA;AACA;AACA;AACA,IAAI6O,IAAI,GAAG,IAAX;AACe,SAASC,mBAAT,GAA+B;EAC1C,IAAM7R,KAAK,GAAGD,uFAA6B,EAA3C;;EACA,gBAAkCJ,+CAAQ,CAACE,kEAAD,CAA1C;EAAA;EAAA,IAAOK,SAAP;EAAA,IAAkBC,YAAlB;;EACA,iBAA0BR,+CAAQ,CAAC,IAAD,CAAlC;EAAA;EAAA,IAAOmB,KAAP;EAAA,IAAcV,QAAd;;EACA,IAAM0R,UAAU,GAAG,SAAbA,UAAa,GAAM;IACrB,IAAI,CAACF,IAAL,EAAW;MACPzR,YAAY,CAACN,kEAAD,CAAZ;IACH;EACJ,CAJD;;EAKA,IAAMoC,MAAM,GAAG,SAATA,MAAS,GAAM;IACjB2P,IAAI,GAAG,IAAP;IACAzR,YAAY,CAACN,kEAAD,CAAZ;IACAO,QAAQ,CAAC,IAAD,CAAR;EACH,CAJD;;EAKAR,gDAAS,CAAC,YAAM;IACZ,IAAIM,SAAS,KAAKL,kEAAd,IAAqC,CAAC+R,IAA1C,EAAgD;MAC5CzR,YAAY,CAACN,gEAAD,CAAZ;MACAG,KAAK,CAAC;QACFM,GAAG,EAAER,8FAAsC+H;MADzC,CAAD,CAAL,CAGKnH,IAHL,CAGU,UAAAC,IAAI,EAAI;QACdiR,IAAI,GAAGjR,IAAP;QACAR,YAAY,CAACN,6DAAD,CAAZ;MACH,CAND,WAOW,UAAAkQ,GAAG,EAAI;QACd3P,QAAQ,CAAC2P,GAAD,CAAR;QACA5P,YAAY,CAACN,+DAAD,CAAZ;MACH,CAVD;IAWH;EACJ,CAfQ,EAeN,CAACK,SAAD,CAfM,CAAT;EAgBA,OAAO;IAAE0R,IAAI,EAAJA,IAAF;IAAQG,aAAa,EAAE7R,SAAvB;IAAkCY,KAAK,EAALA,KAAlC;IAAyCgR,UAAU,EAAVA,UAAzC;IAAqD7P,MAAM,EAANA;EAArD,CAAP;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpCD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASiQ,qBAAT,CAA+BC,OAA/B,EAAwCC,WAAxC,EAAqDC,YAArD,EAAmE;EAC/D,2CAAyBF,OAAO,CAACG,eAAjC;EAAA,IAAOC,cAAP;;EACA,IAAIlG,MAAM,GAAGzT,mDAAE,CAAC,SAAD,EAAY,QAAZ,CAAf;;EACA,IAAIwZ,WAAW,IACXG,cAAc,KAAKH,WAAW,CAAChP,EAD/B,IAEAiP,YAAY,CAACE,cAAD,CAFhB,EAEkC;IAC9B,IAAMX,IAAI,GAAGS,YAAY,CAACE,cAAD,CAAzB;IACAlG,MAAM,gBAASuF,IAAI,CAACY,WAAL,CAAiBC,QAA1B,MAAN;EACH;;EACD,OAAOpG,MAAP;AACH;;AACD,SAASqG,iBAAT,CAA2Bd,IAA3B,EAAiC;EAC7B,OAAQA,IAAI,IACRA,IAAI,CAACe,gBADD,IAEJf,IAAI,CAACe,gBAAL,CAAsBC,gBAFlB,IAGJhB,IAAI,CAACe,gBAAL,CAAsBC,gBAAtB,CAAuCC,KAH3C;AAIH;;AACc,SAASnR,WAAT,GAAuB;EAClC,IAAM1B,KAAK,GAAGD,uFAA6B,EAA3C;;EACA,wBAAqGkS,6DAAgB,EAArH;EAAA,IAAQlQ,QAAR,qBAAQA,QAAR;EAAA,IAAkBsQ,YAAlB,qBAAkBA,YAAlB;EAAA,IAAuCS,aAAvC,qBAAgChS,KAAhC;EAAA,IAAsDiS,iBAAtD,qBAAsDA,iBAAtD;EAAA,IAAiFC,cAAjF,qBAAyE/Q,MAAzE;;EACA,2BAAoF4P,gEAAmB,EAAvG;EAAA,IAAcO,WAAd,wBAAQR,IAAR;EAAA,IAAkCqB,SAAlC,wBAA2BnS,KAA3B;EAAA,IAA6CiR,aAA7C,wBAA6CA,aAA7C;EAAA,IAAoEmB,UAApE,wBAA4DjR,MAA5D;;EACA,IAAMA,MAAM,GAAG+P,kDAAW,CAAC,YAAM;IAC7BkB,UAAU;IACVF,cAAc;EACjB,CAHyB,EAGvB,CAACE,UAAD,EAAaF,cAAb,CAHuB,CAA1B;;EAIA,IAAM9Q,eAAe,GAAG,SAAlBA,eAAkB,GAAM;IAC1B,OAAOlC,KAAK,CAAC;MACTM,GAAG,EAAER,6FAAqCgI;IADjC,CAAD,CAAZ;EAGH,CAJD;;EAKA,OAAO;IACH9F,cAAc,EAAED,QAAQ,CAACxD,GAAT,CAAa,UAAA4U,IAAI;MAAA,OAAK;QAClCha,KAAK,EAAEga,IAAI,CAACvW,IAAL,IAAasV,qBAAqB,CAACiB,IAAD,EAAOf,WAAP,EAAoBC,YAApB,CADP;QAElChZ,KAAK,EAAE8Z,IAAI,CAACC;MAFsB,CAAL;IAAA,CAAjB,CADb;IAKHrR,QAAQ,EAARA,QALG;IAMHsQ,YAAY,EAAZA,YANG;IAOHD,WAAW,EAAXA,WAPG;IAQHtR,KAAK,EAAEgS,aAAa,IAAIG,SARrB;IASHpV,OAAO,EAAEkV,iBAAiB,IAAIlT,gEAArB,IACLkS,aAAa,KAAKlS,gEAVnB;IAWHoC,MAAM,EAANA,MAXG;IAYHC,eAAe,EAAfA;EAZG,CAAP;AAcH;AACM,SAAS2O,kBAAT,CAA4B/O,GAA5B,EAAiC;EACpC,mBAAqCJ,WAAW,EAAhD;EAAA,IAAwBK,QAAxB,gBAAQC,cAAR;;EACA,IAAMoN,MAAM,GAAGrN,QAAQ,CAAC9D,IAAT,CAAc;IAAA,IAAG5E,KAAH,QAAGA,KAAH;IAAA,OAAeA,KAAK,KAAKyI,GAAzB;EAAA,CAAd,CAAf;EACA,OAAOsN,MAAP;AACH;AACM,SAASzN,0BAAT,CAAoCG,GAApC,EAAyC;EAC5C,oBAAgDJ,WAAW,EAA3D;EAAA,IAAQK,QAAR,iBAAQA,QAAR;EAAA,IAAkBsQ,YAAlB,iBAAkBA,YAAlB;EAAA,IAAgCD,WAAhC,iBAAgCA,WAAhC;;EACA,IAAMD,OAAO,GAAGpQ,QAAQ,CAAC9D,IAAT,CAAc,UAAAkV,IAAI;IAAA,OAAIA,IAAI,CAACC,IAAL,KAActR,GAAlB;EAAA,CAAlB,CAAhB;EACA,IAAMuR,oBAAoB,GAAGhB,YAAY,CAACiB,MAAb,CAAoB,UAACC,CAAD,EAAIC,CAAJ;IAAA,uCAAgBD,CAAhB,2BAAoBC,CAAC,CAACpQ,EAAtB,EAA2BoQ,CAA3B;EAAA,CAApB,EAAqD,EAArD,CAA7B;;EACA,IAAI,CAACrB,OAAL,EAAc;IACV,OAAO,IAAP;EACH,CAFD,MAGK;IACD,IAAQG,eAAR,GAA4BH,OAA5B,CAAQG,eAAR;;IACA,IAAIF,WAAW,IACXE,eAAe,CAACmB,QAAhB,CAAyBrB,WAAW,CAAChP,EAArC,CADA,IAEA,CAACsP,iBAAiB,CAACN,WAAD,CAFtB,EAEqC;MACjC,OAAOrP,qEAAP;IACH,CAJD,MAKK,IAAIuP,eAAe,CACnB/T,GADI,CACA,UAAA6E,EAAE;MAAA,OAAIiQ,oBAAoB,CAACjQ,EAAD,CAAxB;IAAA,CADF,EAEJsQ,IAFI,CAEC,UAAC9B,IAAD;MAAA,OAAU,CAACc,iBAAiB,CAACd,IAAD,CAA5B;IAAA,CAFD,CAAJ,EAE0C;MAC3C,OAAOD,mEAAP;IACH,CAJI,MAKA;MACD,OAAO,IAAP;IACH;EACJ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjFD;AACA;AACA;AACA;AACA,IAAI5P,QAAQ,GAAG,EAAf;AACA,IAAIsQ,YAAY,GAAG,EAAnB;AACe,SAASJ,gBAAT,GAA4B;EACvC,IAAMjS,KAAK,GAAGD,uFAA6B,EAA3C;;EACA,gBAAkCJ,+CAAQ,CAACE,kEAAD,CAA1C;EAAA;EAAA,IAAOK,SAAP;EAAA,IAAkBC,YAAlB;;EACA,iBAA0BR,+CAAQ,CAAC,IAAD,CAAlC;EAAA;EAAA,IAAOmB,KAAP;EAAA,IAAcV,QAAd;;EACA,IAAM6B,MAAM,GAAG,SAATA,MAAS,GAAM;IACjBF,QAAQ,GAAG,EAAX;IACA3B,QAAQ,CAAC,IAAD,CAAR;IACAD,YAAY,CAACN,kEAAD,CAAZ;EACH,CAJD;;EAKAD,gDAAS,CAAC,YAAM;IACZ,IAAIM,SAAS,KAAKL,kEAAd,IAAqCkC,QAAQ,CAACW,MAAT,KAAoB,CAA7D,EAAgE;MAC5DvC,YAAY,CAACN,gEAAD,CAAZ;MACAG,KAAK,CAAC;QACFM,GAAG,EAAER,2FAAmC6H;MADtC,CAAD,CAAL,CAGKjH,IAHL,CAGU,UAAAC,IAAI,EAAI;QACdR,YAAY,CAACN,+DAAD,CAAZ;QACAkC,QAAQ,GAAGpB,IAAI,IAAIA,IAAI,CAACgT,YAAxB;QACAtB,YAAY,GAAG1R,IAAI,IAAIA,IAAI,CAAC0R,YAA5B;MACH,CAPD,WAQW,UAAArF,CAAC,EAAI;QACZ5M,QAAQ,CAAC4M,CAAD,CAAR;QACA7M,YAAY,CAACN,+DAAD,CAAZ;MACH,CAXD;IAYH;EACJ,CAhBQ,EAgBN,CAACK,SAAD,CAhBM,CAAT;EAiBA,OAAO;IACH6B,QAAQ,EAARA,QADG;IAEHsQ,YAAY,EAAZA,YAFG;IAGHU,iBAAiB,EAAE7S,SAHhB;IAIHY,KAAK,EAALA,KAJG;IAKHmB,MAAM,EAANA;EALG,CAAP;AAOH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvCD;AACA;AACA;AACA;AACA,IAAIkO,OAAJ;;AACA,SAASyD,kBAAT,GAA8B;EAC1B,IAAI,CAACzD,OAAL,EAAc;IACVA,OAAO,GAAG,IAAIE,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV;MAAA,OAAqBL,uDAAA,CAAYjW,mEAAZ,EACtC4J,IADsC,CACjCyM,OADiC,EAEtCG,IAFsC,CAEjCF,MAFiC,CAArB;IAAA,CAAZ,CAAV;EAGH;;EACD,OAAOJ,OAAP;AACH;;AACc,SAASmB,iBAAT,GAA6B;EACxC,gBAA0B3R,+CAAQ,CAAC,KAAD,CAAlC;EAAA;EAAA,IAAO4P,KAAP;EAAA,IAAcmB,QAAd;;EACA9Q,gDAAS,CAAC,YAAM;IACZgU,kBAAkB,GACblT,IADL,CACU;MAAA,OAAMgQ,QAAQ,CAAC,IAAD,CAAd;IAAA,CADV,WAEW,UAAA5P,KAAK;MAAA,OAAIc,mEAAA,CAAuBd,KAAvB,CAAJ;IAAA,CAFhB;EAGH,CAJQ,EAIN,EAJM,CAAT;EAKA,OAAOyO,KAAP;AACH;;;;;;;;;;;;;;;;;ACrBD;AACA;AAEA,IAAMsE,cAAc,gBAAGnX,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAvB;AAmBA,IAAMoX,KAAK,gBAAGpX,sDAAM,KAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAd;AAUA,IAAMqX,OAAO,gBAAGrX,sDAAM,KAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAhB;AAQA,IAAMsX,gBAAgB,gBAAGtX,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAzB;AAIe,SAAS0U,OAAT,OAAyD;EAAA,IAAtClO,SAAsC,QAAtCA,SAAsC;EAAA,IAA3BC,YAA2B,QAA3BA,YAA2B;EAAA,IAAb/G,QAAa,QAAbA,QAAa;EACpE,OAAQa,uDAAK,CAAC4W,cAAD,EAAiB;IAAEzX,QAAQ,EAAE,CAACa,uDAAK,CAAC+W,gBAAD,EAAmB;MAAE5X,QAAQ,EAAE,CAACH,sDAAI,CAAC6X,KAAD,EAAQ;QAAE1X,QAAQ,EAAE8G;MAAZ,CAAR,CAAL,EAAuCjH,sDAAI,CAAC8X,OAAD,EAAU;QAAE3X,QAAQ,EAAE+G;MAAZ,CAAV,CAA3C;IAAZ,CAAnB,CAAN,EAA2H/G,QAA3H;EAAZ,CAAjB,CAAb;AACJ;;;;;;;;;;;;;;;;;;;AC9CA;AACA;;AAAkD,YAAhC,sBAAgC8N,KAAhC;EAAA,OAGIzL,eAAK;IAAA,OAAKA,KAAK,CAAC4S,GAAN5S,KAAc,UAAdA,GAA2BwV,8CAA3BxV,GAAuCyV,0CAA5C;EAAA,CAHT;AAAA,CAAgC;;AAClD,8EAAexX,sDAAM,UAANA,CAAM;EAAAE;EAAA;EAAAC;EAAAyN;IAAA,cAECJ,KAAuD,EAFxD;EAAA;AAAA,CAANxN,CAAf;;;;;;;;;;;;;;;;;;ACFA;;AAAwC,WACtB,sBADsBsR,IACtB;EAAA,OACFvP,eAAK;IAAA,OAAKA,KAAK,CAACsP,SAANtP,GAAkBA,KAAK,CAACsP,SAAxBtP,GAAoC,SAAzC;EAAA,CADH;AAAA,CADsB;;AACxC,8EAAe/B,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;EAAAyN;IAAA,cACL0D,IAAwD,EADnD;EAAA;AAAA,CAANtR,CAAf;;;;;;;;;;;;;;;;;;ACDA;AACA,8EAAeA,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAf;;;;;;;;;;;;;;;;;;ACDA;AACA,8EAAeA,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAAf;;;;;;;;;;;;;;;;;;;;ACDA;AACA;AACA;AACA,IAAM0X,YAAY,gBAAG1X,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAArB;AAUA,IAAM2X,YAAY,gBAAG3X,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAArB;;AAME,WAlBgB,sBAkBhBsR,IAlBgB;EAAA,OAqBNvP,eAAK;IAAA,OAAIA,KAAK,CAAC6V,KAAV;EAAA,CArBC;AAAA,CAkBhB;;AACF,IAAMC,MAAM,gBAAG7X,sDAAM,UAANA,CAAM;EAAAE;EAAA;EAAAC;EAAAyN;IAAA,cAET0D,IAAoB,EAFX;EAAA;AAAA,CAANtR,CAAf;;AAME,YAzBgB,sBAyBhBwN,KAzBgB;EAAA,OA4BNzL,eAAK;IAAA,OAAIA,KAAK,CAAC6V,KAAV;EAAA,CA5BC;AAAA,CAyBhB;;AACF,IAAME,cAAc,gBAAG9X,sDAAM,UAANA,CAAM;EAAAE;EAAA;EAAAC;EAAAyN;IAAA,cAEjBJ,KAAoB,EAFH;EAAA;AAAA,CAANxN,CAAvB;AA8Be,SAASS,SAAT,OAAkC;EAAA,qBAAbgR,IAAa;EAAA,IAAbA,IAAa,0BAAN,EAAM;EAC7C,OAAQlS,sDAAI,CAACmY,YAAD,EAAe;IAAEhY,QAAQ,EAAEH,sDAAI,CAACoY,YAAD,EAAe;MAAEjY,QAAQ,EAAEa,uDAAK,CAAC,KAAD,EAAQ;QAAEwX,MAAM,EAAEtG,IAAV;QAAgBlB,KAAK,EAAEkB,IAAvB;QAA6BuG,OAAO,EAAE,WAAtC;QAAmDtY,QAAQ,EAAE,CAACH,sDAAI,CAACsY,MAAD,EAAS;UAAED,KAAK,EAAErK,mDAAT;UAAyB0K,EAAE,EAAE,IAA7B;UAAmCC,EAAE,EAAE,IAAvC;UAA6CC,CAAC,EAAE;QAAhD,CAAT,CAAL,EAAyE5Y,sDAAI,CAACuY,cAAD,EAAiB;UAAEF,KAAK,EAAEH,4CAAT;UAAkBQ,EAAE,EAAE,IAAtB;UAA4BC,EAAE,EAAE,IAAhC;UAAsCC,CAAC,EAAE;QAAzC,CAAjB,CAA7E;MAA7D,CAAR;IAAjB,CAAf;EAAhB,CAAf,CAAZ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;AC3DO,IAAMV,OAAO,GAAG,SAAhB;AACA,IAAMlK,cAAc,GAAG,SAAvB;AACA,IAAMD,aAAa,GAAG,SAAtB;AACA,IAAMkK,KAAK,GAAG,SAAd;AACA,IAAMY,IAAI,GAAG,SAAb;AACA,IAAMb,SAAS,GAAG,SAAlB;AACA,IAAMc,cAAc,GAAG,SAAvB;AACA,IAAMC,eAAe,GAAG,SAAxB;AACA,IAAMC,QAAQ,GAAG,SAAjB;;;;;;;;;;;;;;;ACRP,IAAMpW,gBAAgB,GAAG;EACrBC,SAAS,EAAE,WADU;EAErBC,YAAY,EAAE;AAFO,CAAzB;AAIA,iEAAeF,gBAAf;;;;;;;;;;;;;;;ACJA,IAAMgB,SAAS,GAAG;EACdI,SAAS,EAAE,WADG;EAEde,OAAO,EAAE,SAFK;EAGdH,MAAM,EAAE,QAHM;EAIdyL,IAAI,EAAE,MAJQ;EAKdvL,MAAM,EAAE;AALM,CAAlB;AAOA,iEAAelB,SAAf;;;;;;;;;;;;;;;;;;;ACPA;AACA;AACO,SAASqV,OAAT,CAAiBC,MAAjB,EAAyB;EAC5BpM,0DAAc;EACdnH,0DAAA,CAAcuT,MAAd;AACH;AACM,SAASE,cAAT,CAAwBF,MAAxB,EAAgC;EACnC,SAASG,IAAT,GAAgB;IACZpF,6CAAC,CAACiF,MAAD,CAAD;EACH;;EACDD,OAAO,CAACI,IAAD,CAAP;AACH;;;;;;;;;;;;;;;;;;ACXD;AACA;AACO,SAASC,iBAAT,CAA2BJ,MAA3B,EAAmC;EACtC,SAASG,IAAT,GAAgB;IACZ,IAAIE,KAAK,CAACC,OAAN,CAAcN,MAAd,CAAJ,EAA2B;MACvBA,MAAM,CAACO,OAAP,CAAe,UAAA9R,QAAQ;QAAA,OAAIA,QAAQ,EAAZ;MAAA,CAAvB;IACH,CAFD,MAGK;MACDuR,MAAM;IACT;EACJ;;EACDD,kDAAO,CAACI,IAAD,CAAP;AACH;AACM,IAAM/X,wBAAwB,GAAG,SAA3BA,wBAA2B,CAAC/B,YAAD,EAAkB;EACtD,IAAIjC,MAAM,CAACoc,mBAAX,EAAgC;IAC5B,OAAOpc,MAAM,CAACoc,mBAAd;EACH;;EACD,cAAwDpc,MAAxD;EAAA,IAAQqc,qBAAR,WAAQA,qBAAR;EAAA,IAA+BC,oBAA/B,WAA+BA,oBAA/B;EACA,IAAMzc,OAAO,GAAG,IAAIyc,oBAAJ,GACXC,SADW,CACDjb,2DADC,EAEXkb,WAFW,CAEClc,6DAFD,EAGXmc,eAHW,CAGKxa,YAHL,CAAhB;EAIA,IAAMya,QAAQ,GAAG,IAAIL,qBAAJ,CAA0B,yBAA1B,EAAqDxa,6DAArD,EAA+DhB,mEAA/D,EAA+E,YAAM,CAAG,CAAxF,EAA0F6R,UAA1F,CAAqG7S,OAArG,CAAjB;EACA6c,QAAQ,CAACC,QAAT,CAAkBxG,QAAQ,CAACyG,IAA3B,EAAiC,KAAjC;EACAF,QAAQ,CAACG,mBAAT,GAXsD,CAWtB;;EAChC7c,MAAM,CAACoc,mBAAP,GAA6BM,QAA7B;EACA,OAAO1c,MAAM,CAACoc,mBAAd;AACH,CAdM;;;;;;;;;;ACbP,WAAW,mBAAO,CAAC,+CAAS;;AAE5B;AACA;;AAEA;;;;;;;;;;;ACLA,aAAa,mBAAO,CAAC,mDAAW;AAChC,gBAAgB,mBAAO,CAAC,yDAAc;AACtC,qBAAqB,mBAAO,CAAC,mEAAmB;;AAEhD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC3BA,sBAAsB,mBAAO,CAAC,qEAAoB;;AAElD;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AClBA;AACA,wBAAwB,qBAAM,gBAAgB,qBAAM,IAAI,qBAAM,sBAAsB,qBAAM;;AAE1F;;;;;;;;;;;ACHA,aAAa,mBAAO,CAAC,mDAAW;;AAEhC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC7CA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,iBAAiB,mBAAO,CAAC,2DAAe;;AAExC;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;ACRA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;AClBA,eAAe,mBAAO,CAAC,qDAAY;AACnC,UAAU,mBAAO,CAAC,2CAAO;AACzB,eAAe,mBAAO,CAAC,qDAAY;;AAEnC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ,WAAW;AAC9B,WAAW,SAAS;AACpB;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,SAAS;AACpB;AACA,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,+CAA+C,iBAAiB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC5BA,iBAAiB,mBAAO,CAAC,2DAAe;AACxC,mBAAmB,mBAAO,CAAC,6DAAgB;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC5BA,WAAW,mBAAO,CAAC,+CAAS;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACtBA,eAAe,mBAAO,CAAC,uDAAa;AACpC,eAAe,mBAAO,CAAC,qDAAY;AACnC,eAAe,mBAAO,CAAC,qDAAY;;AAEnC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;AC/DA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;;AAEa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH,kCAAkC;AAClC;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iBAAiB,sBAAsB;AACvC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACPA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,gBAAgB,+CAA+C;;AAE/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACtCA;;AAEA,eAAe,mBAAO,CAAC,wFAA6B;AACpD,gBAAgB,mBAAO,CAAC,gHAAyC;AACjE,uBAAuB,mBAAO,CAAC,iEAAe;;AAE9C,YAAY,mBAAO,CAAC,qDAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,2FAA+B;;AAEvD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;AAC5C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS,GAAG;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,+CAA+C;AAC/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,wBAAwB,iDAAiD;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,+BAA+B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B;AAC3B,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,0CAA0C;AAC1C,2CAA2C;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,MAAM;AACN,2EAA2E;AAC3E;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACr4DA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,mBAAO,CAAC,qDAAS;;AAExC;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;AAC5C;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;;;;;;;;;AC9BA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;;AAE5C;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC;AACnC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oCAAoC;AACpC;AACA;;AAEA;AACA;AACA,wBAAwB;AACxB;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,SAAS;AAClB;AACA;AACA;AACA;AACA,iDAAiD;AACjD,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA,cAAc,0BAA0B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,kCAAkC;AAClC;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChYA,YAAY,mBAAO,CAAC,6DAAiB;;AAErC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;;AAE5C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,qDAAqD,KAAK;AAC1D,uDAAuD,KAAK;AAC5D;AACA,WAAW,aAAa,YAAY;AACpC;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,+DAA+D;AAC/D;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,oBAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,iBAAiB;AAChC;AACA,eAAe,kBAAkB;AACjC;AACA,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,8BAA8B;;AAE9B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;;AAE1B;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,qBAAqB;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAsC,OAAO;AAC7C;AACA,qEAAqE;AACrE,iEAAiE;AACjE;AACA;AACA,kCAAkC;AAClC,kCAAkC;AAClC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,oBAAoB;AACnC;AACA,eAAe,QAAQ;AACvB,eAAe,iBAAiB;AAChC;AACA,eAAe,SAAS;AACxB;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B;AAC1B,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ,0CAA0C;AAClD,eAAe,OAAO;AACtB,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,qEAAqE;AACrE,UAAU;AACV;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,kBAAkB;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;;;;;;;;;;;AC9mBA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB;;AAEpB;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb,IAAI,IAAqC;AACzC;AACA;;AAEA,YAAY,mBAAO,CAAC,oBAAO;AAC3B,cAAc,mBAAO,CAAC,4DAAe;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE,gBAAgB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,+FAA+F,eAAe;AAC9G;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK,GAAG;;AAER,kDAAkD;AAClD;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,4BAA4B;;AAE5B;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;;AAEvC;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,uBAAuB;AACvB;AACA,SAAS;AACT,wBAAwB;AACxB;AACA,SAAS;AACT,wBAAwB;AACxB;AACA,SAAS;AACT,yBAAyB;AACzB;AACA,SAAS;AACT,yBAAyB;AACzB;AACA,SAAS;AACT,kCAAkC;AAClC;AACA,SAAS;AACT,4BAA4B;AAC5B;AACA,SAAS;AACT,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;;;AAGN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,2DAA2D;;AAE3D;AACA;;AAEA;AACA,yDAAyD;AACzD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,kBAAkB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB;;;AAGlB;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAI;;;AAGJ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B;AAC9B;AACA;;AAEA;AACA;AACA;AACA;AACA,2HAA2H;AAC3H;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA,oEAAoE;;AAEpE;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,GAAG;AACd,WAAW,GAAG;AACd,WAAW,eAAe;AAC1B,WAAW,GAAG;AACd,WAAW,GAAG;AACd;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK,GAAG;;AAER;AACA;AACA;AACA;AACA;AACA,KAAK,GAAG;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;;AAEA;AACA;AACA,kBAAkB;;AAElB;AACA;AACA,oBAAoB;AACpB,2DAA2D,UAAU;AACrE,yBAAyB,UAAU;AACnC;AACA,aAAa,UAAU;AACvB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;;;AAGN;AACA;AACA;AACA;AACA,MAAM;;;AAGN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,YAAY,SAAS;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,GAAG;AACd;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,6DAA6D;AAC7D;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,WAAW;AACtB,WAAW,GAAG;AACd;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,iBAAiB;AACvC;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN,4CAA4C;;AAE5C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB;;;AAGA;AACA;AACA;;AAEA,oBAAoB,iBAAiB;AACrC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA,0DAA0D;AAC1D;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAsC;AACtC;;AAEA;;AAEA,WAAW;AACX,YAAY;AACZ,GAAG;AACH;;;;;;;;;;;;ACpsCa;;AAEb,IAAI,KAAqC,EAAE,EAE1C,CAAC;AACF,EAAE,+IAAkE;AACpE;;;;;;;;;;;;ACNA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;ACAA;AAC+C;AACrB;AACS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,oCAAoC,8DAAS,oBAAoB,SAAS,8DAAS,GAAG,EAAE,8DAAS;AACjG;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,MAAM,IAAqC;AAC3C;AACA;AACA;AACA;AACA;AACA,wCAAwC,YAAY,sBAAsB,cAAc;AACxF;AACA;AACA;AACA;AACA;AACA,QAAQ,IAAqC;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,wCAAwC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,iDAAE,wDAAwD,iDAAE;AAC7G,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,KAAK,QAAQ,MAAM,EAAE,KAAK;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,eAAe,gDAAmB;AAClC;AACA,aAAa,gDAAmB;AAChC;AACA,mBAAmB,6CAAgB,GAAG,6CAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,KAAqC;AAC1D;AACA;AACA;AACA,CAAC,IAAI,CAAM;AAGT;AACF;;;;;;;;;;;;;;;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIE;AACF;;;;;;UCtCA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA,IAAMU,wBAAwB,GAAG,GAAjC;AACA,IAAMC,gBAAgB,GAAG,KAAzB;;AACA,IAAMC,wBAAwB,GAAG,SAA3BA,wBAA2B,GAAM;EACnChB,4EAAiB,CAAC,YAAM;IACpB,IAAIiB,UAAJ;IACA,IAAIC,cAAJ;IACA,IAAMC,wBAAwB,GAAGhT,sEAAe,EAChD;IACAnK,MAAM,CAACoK,SAFyC,EAE9B;MACdqB,UAAU,EAAE,cADE;MAEdR,eAAe,EAAE,gCAFH;MAGdG,iBAAiB,EAAE;IAHL,CAF8B,EAM7C,UAACxD,gBAAD,EAAmBC,eAAnB,EAAoClC,QAApC,EAAiD;MAChDsX,UAAU,GAAG,IAAItV,gFAAJ,CAAuBC,gBAAvB,EAAyCC,eAAzC,EAA0DlC,QAA1D,CAAb;MACAsX,UAAU,CAACrX,MAAX;IACH,CAT+C,EAS7C,YAAM;MACLqX,UAAU,CAAC3S,IAAX;IACH,CAX+C,CAAhD;IAYA,IAAM8S,2BAA2B,GAAGjT,sEAAe,EACnD;IACAnK,MAAM,CAACoK,SAF4C,EAEjC;MACdqB,UAAU,EAAE,iBADE;MAEdR,eAAe,EAAE,mCAFH;MAGdG,iBAAiB,EAAE;IAHL,CAFiC,EAMhD,UAACxD,gBAAD,EAAmBC,eAAnB,EAAoClC,QAApC,EAAiD;MAChDuX,cAAc,GAAG,IAAIhT,sFAAJ,CAA2BtC,gBAA3B,EAA6CC,eAA7C,EAA8DlC,QAA9D,CAAjB;MACAuX,cAAc,CAACtX,MAAf;IACH,CATkD,EAShD,YAAM;MACLsX,cAAc,CAAC5S,IAAf;IACH,CAXkD,CAAnD,CAfoB,CA2BpB;;IACAtK,MAAM,CAACoK,SAAP,CAAiBiT,cAAjB,CAAgC,kBAAhC,EAAoDF,wBAApD,EA5BoB,CA6BpB;;IACAnd,MAAM,CAACoK,SAAP,CAAiBiT,cAAjB,CAAgC,qBAAhC,EAAuDD,2BAAvD;EACH,CA/BgB,CAAjB;AAgCH,CAjCD;;AAkCA,IAAME,qBAAqB,GAAGC,WAAW,CAAC,YAAM;EAC5C,IAAMjS,iBAAiB,GAAGtL,MAAM,CAACsL,iBAAjC;;EACA,IAAIA,iBAAJ,EAAuB;IACnB0R,wBAAwB;IACxBQ,aAAa,CAACF,qBAAD,CAAb;EACH;AACJ,CANwC,EAMtCR,wBANsC,CAAzC;AAOAW,UAAU,CAAC,YAAM;EACbD,aAAa,CAACF,qBAAD,CAAb;AACH,CAFS,EAEPP,gBAFO,CAAV,C","sources":["webpack://leadin/./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js","webpack://leadin/./node_modules/@linaria/react/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js","webpack://leadin/./scripts/constants/defaultFormOptions.ts","webpack://leadin/./scripts/constants/leadinConfig.ts","webpack://leadin/./scripts/elementor/Common/ConnectPluginBanner.tsx","webpack://leadin/./scripts/elementor/Common/ElementorBanner.tsx","webpack://leadin/./scripts/elementor/Common/ElementorButton.tsx","webpack://leadin/./scripts/elementor/FormWidget/ElementorFormSelect.tsx","webpack://leadin/./scripts/elementor/FormWidget/FormControlController.tsx","webpack://leadin/./scripts/elementor/FormWidget/FormWidgetController.tsx","webpack://leadin/./scripts/elementor/FormWidget/hooks/useForms.ts","webpack://leadin/./scripts/elementor/FormWidget/registerFormWidget.ts","webpack://leadin/./scripts/elementor/MeetingWidget/ElementorMeetingSelect.tsx","webpack://leadin/./scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx","webpack://leadin/./scripts/elementor/MeetingWidget/MeetingControlController.tsx","webpack://leadin/./scripts/elementor/MeetingWidget/MeetingWidgetController.tsx","webpack://leadin/./scripts/elementor/MeetingWidget/registerMeetingWidget.ts","webpack://leadin/./scripts/elementor/elementorWidget.ts","webpack://leadin/./scripts/iframe/integratedMessages/core/CoreMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/forms/FormsMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/index.ts","webpack://leadin/./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/plugin/PluginMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts","webpack://leadin/./scripts/iframe/useBackgroundApp.ts","webpack://leadin/./scripts/lib/Raven.ts","webpack://leadin/./scripts/shared/Common/AsyncSelect.tsx","webpack://leadin/./scripts/shared/Common/ErrorHandler.tsx","webpack://leadin/./scripts/shared/Common/HubspotWrapper.ts","webpack://leadin/./scripts/shared/Common/LoadingBlock.tsx","webpack://leadin/./scripts/shared/Form/FormEdit.tsx","webpack://leadin/./scripts/shared/Form/FormSelect.tsx","webpack://leadin/./scripts/shared/Form/FormSelector.tsx","webpack://leadin/./scripts/shared/Form/PreviewForm.tsx","webpack://leadin/./scripts/shared/Form/hooks/useCreateFormFromTemplate.ts","webpack://leadin/./scripts/shared/Form/hooks/useForms.ts","webpack://leadin/./scripts/shared/Form/hooks/useFormsScript.ts","webpack://leadin/./scripts/shared/Meeting/MeetingController.tsx","webpack://leadin/./scripts/shared/Meeting/MeetingEdit.tsx","webpack://leadin/./scripts/shared/Meeting/MeetingSelector.tsx","webpack://leadin/./scripts/shared/Meeting/MeetingWarning.tsx","webpack://leadin/./scripts/shared/Meeting/PreviewMeeting.tsx","webpack://leadin/./scripts/shared/Meeting/constants.ts","webpack://leadin/./scripts/shared/Meeting/hooks/useCurrentUserFetch.ts","webpack://leadin/./scripts/shared/Meeting/hooks/useMeetings.ts","webpack://leadin/./scripts/shared/Meeting/hooks/useMeetingsFetch.ts","webpack://leadin/./scripts/shared/Meeting/hooks/useMeetingsScript.ts","webpack://leadin/./scripts/shared/UIComponents/UIAlert.tsx","webpack://leadin/./scripts/shared/UIComponents/UIButton.ts","webpack://leadin/./scripts/shared/UIComponents/UIContainer.ts","webpack://leadin/./scripts/shared/UIComponents/UIOverlay.ts","webpack://leadin/./scripts/shared/UIComponents/UISpacer.ts","webpack://leadin/./scripts/shared/UIComponents/UISpinner.tsx","webpack://leadin/./scripts/shared/UIComponents/colors.ts","webpack://leadin/./scripts/shared/enums/connectionStatus.ts","webpack://leadin/./scripts/shared/enums/loadState.ts","webpack://leadin/./scripts/utils/appUtils.ts","webpack://leadin/./scripts/utils/backgroundAppUtils.ts","webpack://leadin/./node_modules/lodash/_Symbol.js","webpack://leadin/./node_modules/lodash/_baseGetTag.js","webpack://leadin/./node_modules/lodash/_baseTrim.js","webpack://leadin/./node_modules/lodash/_freeGlobal.js","webpack://leadin/./node_modules/lodash/_getRawTag.js","webpack://leadin/./node_modules/lodash/_objectToString.js","webpack://leadin/./node_modules/lodash/_root.js","webpack://leadin/./node_modules/lodash/_trimmedEndIndex.js","webpack://leadin/./node_modules/lodash/debounce.js","webpack://leadin/./node_modules/lodash/isObject.js","webpack://leadin/./node_modules/lodash/isObjectLike.js","webpack://leadin/./node_modules/lodash/isSymbol.js","webpack://leadin/./node_modules/lodash/now.js","webpack://leadin/./node_modules/lodash/toNumber.js","webpack://leadin/./scripts/elementor/Common/ElementorButton.tsx?a429","webpack://leadin/./scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx?284e","webpack://leadin/./scripts/shared/Common/AsyncSelect.tsx?df11","webpack://leadin/./scripts/shared/Common/HubspotWrapper.ts?a346","webpack://leadin/./scripts/shared/UIComponents/UIAlert.tsx?0f15","webpack://leadin/./scripts/shared/UIComponents/UIButton.ts?d089","webpack://leadin/./scripts/shared/UIComponents/UIContainer.ts?e576","webpack://leadin/./scripts/shared/UIComponents/UIOverlay.ts?c9f9","webpack://leadin/./scripts/shared/UIComponents/UISpacer.ts?8e1e","webpack://leadin/./scripts/shared/UIComponents/UISpinner.tsx?4a02","webpack://leadin/./node_modules/object-assign/index.js","webpack://leadin/./node_modules/raven-js/src/configError.js","webpack://leadin/./node_modules/raven-js/src/console.js","webpack://leadin/./node_modules/raven-js/src/raven.js","webpack://leadin/./node_modules/raven-js/src/singleton.js","webpack://leadin/./node_modules/raven-js/src/utils.js","webpack://leadin/./node_modules/raven-js/vendor/TraceKit/tracekit.js","webpack://leadin/./node_modules/raven-js/vendor/json-stringify-safe/stringify.js","webpack://leadin/./node_modules/react/cjs/react-jsx-runtime.development.js","webpack://leadin/./node_modules/react/jsx-runtime.js","webpack://leadin/external window \"React\"","webpack://leadin/external window \"ReactDOM\"","webpack://leadin/external window \"jQuery\"","webpack://leadin/external window [\"wp\",\"i18n\"]","webpack://leadin/./node_modules/@linaria/react/dist/index.mjs","webpack://leadin/./node_modules/@linaria/react/node_modules/@linaria/core/dist/index.mjs","webpack://leadin/webpack/bootstrap","webpack://leadin/webpack/runtime/compat get default export","webpack://leadin/webpack/runtime/define property getters","webpack://leadin/webpack/runtime/global","webpack://leadin/webpack/runtime/hasOwnProperty shorthand","webpack://leadin/webpack/runtime/make namespace object","webpack://leadin/./scripts/entries/elementor.ts"],"sourcesContent":["function memoize(fn) {\n var cache = Object.create(null);\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\n\nexport default memoize;\n","import memoize from '@emotion/memoize';\n\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar isPropValid = /* #__PURE__ */memoize(function (prop) {\n return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n /* o */\n && prop.charCodeAt(1) === 110\n /* n */\n && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\nexport default isPropValid;\n","import { __ } from '@wordpress/i18n';\nconst REGISTRATION_FORM = 'REGISTRATION_FORM';\nconst CONTACT_US_FORM = 'CONTACT_US_FORM';\nconst NEWSLETTER_FORM = 'NEWSLETTER_FORM';\nconst SUPPORT_FORM = 'SUPPORT_FORM';\nconst EVENT_FORM = 'EVENT_FORM';\nexport const DEFAULT_OPTIONS = {\n label: __('Templates', 'leadin'),\n options: [\n { label: __('Registration Form', 'leadin'), value: REGISTRATION_FORM },\n { label: __('Contact us Form', 'leadin'), value: CONTACT_US_FORM },\n { label: __('Newsletter sign-up Form', 'leadin'), value: NEWSLETTER_FORM },\n { label: __('Support Form', 'leadin'), value: SUPPORT_FORM },\n { label: __('Event Registration Form', 'leadin'), value: EVENT_FORM },\n ],\n};\nexport function isDefaultForm(value) {\n return (value === REGISTRATION_FORM ||\n value === CONTACT_US_FORM ||\n value === NEWSLETTER_FORM ||\n value === SUPPORT_FORM ||\n value === EVENT_FORM);\n}\n","const { accountName, adminUrl, activationTime, connectionStatus, deviceId, didDisconnect, env, formsScript, meetingsScript, formsScriptPayload, hublet, hubspotBaseUrl, hubspotNonce, iframeUrl, impactLink, lastAuthorizeTime, lastDeauthorizeTime, lastDisconnectTime, leadinPluginVersion, leadinQueryParams, locale, loginUrl, phpVersion, pluginPath, plugins, portalDomain, portalEmail, portalId, redirectNonce, restNonce, restUrl, refreshToken, reviewSkippedDate, theme, trackConsent, wpVersion, contentEmbed, requiresContentEmbedScope, refreshTokenError, } = window.leadinConfig;\nexport { accountName, adminUrl, activationTime, connectionStatus, deviceId, didDisconnect, env, formsScript, meetingsScript, formsScriptPayload, hublet, hubspotBaseUrl, hubspotNonce, iframeUrl, impactLink, lastAuthorizeTime, lastDeauthorizeTime, lastDisconnectTime, leadinPluginVersion, leadinQueryParams, loginUrl, locale, phpVersion, pluginPath, plugins, portalDomain, portalEmail, portalId, redirectNonce, restNonce, restUrl, refreshToken, reviewSkippedDate, theme, trackConsent, wpVersion, contentEmbed, requiresContentEmbedScope, refreshTokenError, };\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport ElementorBanner from './ElementorBanner';\nimport { __ } from '@wordpress/i18n';\nexport default function ConnectPluginBanner() {\n return (_jsx(ElementorBanner, { children: _jsx(\"b\", { dangerouslySetInnerHTML: {\n __html: __('The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s')\n .replace('%1$s', '')\n .replace('%2$s', ''),\n } }) }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nexport default function ElementorBanner({ type = 'warning', children, }) {\n return (_jsx(\"div\", { className: \"elementor-control-content\", children: _jsx(\"div\", { className: `elementor-control-raw-html elementor-panel-alert elementor-panel-alert-${type}`, children: children }) }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { styled } from '@linaria/react';\nconst Container = styled.div `\n display: flex;\n justify-content: center;\n padding-bottom: 8px;\n`;\nexport default function ElementorButton({ children, ...params }) {\n return (_jsx(Container, { className: \"elementor-button-wrapper\", children: _jsx(\"button\", { className: \"elementor-button elementor-button-default\", type: \"button\", ...params, children: children }) }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Fragment } from 'react';\nimport { portalId, refreshToken } from '../../constants/leadinConfig';\nimport ElementorBanner from '../Common/ElementorBanner';\nimport UISpinner from '../../shared/UIComponents/UISpinner';\nimport { __ } from '@wordpress/i18n';\nimport { BackgroudAppContext, useBackgroundAppContext, } from '../../iframe/useBackgroundApp';\nimport useForms from './hooks/useForms';\nimport { getOrCreateBackgroundApp } from '../../utils/backgroundAppUtils';\nfunction ElementorFormSelect({ formId, setAttributes, }) {\n const { hasError, forms, loading } = useForms();\n return loading ? (_jsx(\"div\", { children: _jsx(UISpinner, {}) })) : hasError ? (_jsx(ElementorBanner, { type: \"danger\", children: __('Please refresh your forms or try again in a few minutes', 'leadin') })) : (_jsxs(\"select\", { value: formId, onChange: event => {\n const selectedForm = forms.find(form => form.value === event.target.value);\n if (selectedForm) {\n setAttributes({\n portalId,\n formId: selectedForm.value,\n formName: selectedForm.label,\n });\n }\n }, children: [_jsx(\"option\", { value: \"\", disabled: true, selected: true, children: __('Search for a form', 'leadin') }), forms.map(form => (_jsx(\"option\", { value: form.value, children: form.label }, form.value)))] }));\n}\nfunction ElementorFormSelectWrapper(props) {\n const isBackgroundAppReady = useBackgroundAppContext();\n return (_jsx(Fragment, { children: !isBackgroundAppReady ? (_jsx(\"div\", { children: _jsx(UISpinner, {}) })) : (_jsx(ElementorFormSelect, { ...props })) }));\n}\nexport default function ElementorFormSelectContainer(props) {\n return (_jsx(BackgroudAppContext.Provider, { value: refreshToken && getOrCreateBackgroundApp(refreshToken), children: _jsx(ElementorFormSelectWrapper, { ...props }) }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Fragment } from 'react';\nimport { connectionStatus } from '../../constants/leadinConfig';\nimport ConnectPluginBanner from '../Common/ConnectPluginBanner';\nimport ElementorFormSelect from './ElementorFormSelect';\nconst ConnectionStatus = {\n Connected: 'Connected',\n NotConnected: 'NotConnected',\n};\nexport default function FormControlController(attributes, setValue) {\n return () => {\n const render = () => {\n if (connectionStatus === ConnectionStatus.Connected) {\n return (_jsx(ElementorFormSelect, { formId: attributes.formId, setAttributes: setValue }));\n }\n else {\n return _jsx(ConnectPluginBanner, {});\n }\n };\n return _jsx(Fragment, { children: render() });\n };\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Fragment } from 'react';\nimport { connectionStatus } from '../../constants/leadinConfig';\nimport ErrorHandler from '../../shared/Common/ErrorHandler';\nimport FormEdit from '../../shared/Form/FormEdit';\nimport ConnectionStatus from '../../shared/enums/connectionStatus';\nexport default function FormWidgetController(attributes, setValue) {\n return () => {\n const render = () => {\n if (connectionStatus === ConnectionStatus.Connected) {\n return (_jsx(FormEdit, { attributes: attributes, isSelected: true, setAttributes: setValue, preview: false, origin: \"elementor\" }));\n }\n else {\n return _jsx(ErrorHandler, { status: 401 });\n }\n };\n return _jsx(Fragment, { children: render() });\n };\n}\n","import { useState, useEffect } from 'react';\nimport LoadState from '../../../shared/enums/loadState';\nimport { ProxyMessages } from '../../../iframe/integratedMessages';\nimport { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp';\nexport default function useForms() {\n const proxy = usePostAsyncBackgroundMessage();\n const [loadState, setLoadState] = useState(LoadState.NotLoaded);\n const [hasError, setError] = useState(null);\n const [forms, setForms] = useState([]);\n useEffect(() => {\n if (loadState === LoadState.NotLoaded) {\n proxy({\n key: ProxyMessages.FetchForms,\n payload: {\n search: '',\n },\n })\n .then(data => {\n setForms(data.map((form) => ({\n label: form.name,\n value: form.guid,\n })));\n setLoadState(LoadState.Loaded);\n })\n .catch(error => {\n setError(error);\n setLoadState(LoadState.Failed);\n });\n }\n }, [loadState]);\n return { forms, loading: loadState === LoadState.Loading, hasError };\n}\n","import ReactDOM from 'react-dom';\nimport FormControlController from './FormControlController';\nimport FormWidgetController from './FormWidgetController';\nexport default class registerFormWidget {\n widgetContainer;\n attributes;\n controlContainer;\n setValue;\n constructor(controlContainer, widgetContainer, setValue) {\n const attributes = widgetContainer.dataset.attributes\n ? JSON.parse(widgetContainer.dataset.attributes)\n : {};\n this.widgetContainer = widgetContainer;\n this.controlContainer = controlContainer;\n this.setValue = setValue;\n this.attributes = attributes;\n }\n render() {\n ReactDOM.render(FormWidgetController(this.attributes, this.setValue)(), this.widgetContainer);\n ReactDOM.render(FormControlController(this.attributes, this.setValue)(), this.controlContainer);\n }\n done() {\n ReactDOM.unmountComponentAtNode(this.widgetContainer);\n ReactDOM.unmountComponentAtNode(this.controlContainer);\n }\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Fragment, useState } from 'react';\nimport ElementorBanner from '../Common/ElementorBanner';\nimport UISpinner from '../../shared/UIComponents/UISpinner';\nimport ElementorMeetingWarning from './ElementorMeetingWarning';\nimport useMeetings, { useSelectedMeetingCalendar, } from '../../shared/Meeting/hooks/useMeetings';\nimport { __ } from '@wordpress/i18n';\nimport Raven from 'raven-js';\nimport { BackgroudAppContext, useBackgroundAppContext, } from '../../iframe/useBackgroundApp';\nimport { refreshToken } from '../../constants/leadinConfig';\nimport { getOrCreateBackgroundApp } from '../../utils/backgroundAppUtils';\nfunction ElementorMeetingSelect({ url, setAttributes, }) {\n const { mappedMeetings: meetings, loading, error, reload, connectCalendar, } = useMeetings();\n const selectedMeetingCalendar = useSelectedMeetingCalendar(url);\n const [localUrl, setLocalUrl] = useState(url);\n const handleConnectCalendar = () => {\n return connectCalendar()\n .then(() => {\n reload();\n })\n .catch(error => {\n Raven.captureMessage('Unable to connect calendar', {\n extra: { error },\n });\n });\n };\n return (_jsx(Fragment, { children: loading ? (_jsx(\"div\", { children: _jsx(UISpinner, {}) })) : error ? (_jsx(ElementorBanner, { type: \"danger\", children: __('Please refresh your meetings or try again in a few minutes', 'leadin') })) : (_jsxs(Fragment, { children: [selectedMeetingCalendar && (_jsx(ElementorMeetingWarning, { status: selectedMeetingCalendar, onConnectCalendar: connectCalendar })), meetings.length > 1 && (_jsxs(\"select\", { value: localUrl, onChange: event => {\n const newUrl = event.target.value;\n setLocalUrl(newUrl);\n setAttributes({\n url: newUrl,\n });\n }, children: [_jsx(\"option\", { value: \"\", disabled: true, selected: true, children: __('Select a meeting', 'leadin') }), meetings.map(item => (_jsx(\"option\", { value: item.value, children: item.label }, item.value)))] }))] })) }));\n}\nfunction ElementorMeetingSelectWrapper(props) {\n const isBackgroundAppReady = useBackgroundAppContext();\n return (_jsx(Fragment, { children: !isBackgroundAppReady ? (_jsx(\"div\", { children: _jsx(UISpinner, {}) })) : (_jsx(ElementorMeetingSelect, { ...props })) }));\n}\nexport default function ElementorMeetingsSelectContainer(props) {\n return (_jsx(BackgroudAppContext.Provider, { value: refreshToken && getOrCreateBackgroundApp(refreshToken), children: _jsx(ElementorMeetingSelectWrapper, { ...props }) }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Fragment } from 'react';\nimport { CURRENT_USER_CALENDAR_MISSING } from '../../shared/Meeting/constants';\nimport ElementorButton from '../Common/ElementorButton';\nimport ElementorBanner from '../Common/ElementorBanner';\nimport { styled } from '@linaria/react';\nimport { __ } from '@wordpress/i18n';\nconst Container = styled.div `\n padding-bottom: 8px;\n`;\nexport default function MeetingWarning({ onConnectCalendar, status, }) {\n const isMeetingOwner = status === CURRENT_USER_CALENDAR_MISSING;\n const titleText = isMeetingOwner\n ? __('Your calendar is not connected', 'leadin')\n : __('Calendar is not connected', 'leadin');\n const titleMessage = isMeetingOwner\n ? __('Please connect your calendar to activate your scheduling pages', 'leadin')\n : __('Make sure that everybody in this meeting has connected their calendar from the Meetings page in HubSpot', 'leadin');\n return (_jsxs(Fragment, { children: [_jsx(Container, { children: _jsxs(ElementorBanner, { type: \"warning\", children: [_jsx(\"b\", { children: titleText }), _jsx(\"br\", {}), titleMessage] }) }), isMeetingOwner && (_jsx(ElementorButton, { id: \"meetings-connect-calendar\", onClick: onConnectCalendar, children: __('Connect calendar', 'leadin') }))] }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Fragment } from 'react';\nimport { connectionStatus } from '../../constants/leadinConfig';\nimport ConnectPluginBanner from '../Common/ConnectPluginBanner';\nimport ElementorMeetingSelect from './ElementorMeetingSelect';\nconst ConnectionStatus = {\n Connected: 'Connected',\n NotConnected: 'NotConnected',\n};\nexport default function MeetingControlController(attributes, setValue) {\n return () => {\n const render = () => {\n if (connectionStatus === ConnectionStatus.Connected) {\n return (_jsx(ElementorMeetingSelect, { url: attributes.url, setAttributes: setValue }));\n }\n else {\n return _jsx(ConnectPluginBanner, {});\n }\n };\n return _jsx(Fragment, { children: render() });\n };\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Fragment } from 'react';\nimport { connectionStatus } from '../../constants/leadinConfig';\nimport ErrorHandler from '../../shared/Common/ErrorHandler';\nimport MeetingsEdit from '../../shared/Meeting/MeetingEdit';\nconst ConnectionStatus = {\n Connected: 'Connected',\n NotConnected: 'NotConnected',\n};\nexport default function MeetingWidgetController(attributes, setValue) {\n return () => {\n const render = () => {\n if (connectionStatus === ConnectionStatus.Connected) {\n return (_jsx(MeetingsEdit, { attributes: attributes, isSelected: true, setAttributes: setValue, preview: false, origin: \"elementor\" }));\n }\n else {\n return _jsx(ErrorHandler, { status: 401 });\n }\n };\n return _jsx(Fragment, { children: render() });\n };\n}\n","import ReactDOM from 'react-dom';\nimport MeetingControlController from './MeetingControlController';\nimport MeetingWidgetController from './MeetingWidgetController';\nexport default class registerMeetingsWidget {\n widgetContainer;\n controlContainer;\n setValue;\n attributes;\n constructor(controlContainer, widgetContainer, setValue) {\n const attributes = widgetContainer.dataset.attributes\n ? JSON.parse(widgetContainer.dataset.attributes)\n : {};\n this.widgetContainer = widgetContainer;\n this.controlContainer = controlContainer;\n this.setValue = setValue;\n this.attributes = attributes;\n }\n render() {\n ReactDOM.render(MeetingWidgetController(this.attributes, this.setValue)(), this.widgetContainer);\n ReactDOM.render(MeetingControlController(this.attributes, this.setValue)(), this.controlContainer);\n }\n done() {\n ReactDOM.unmountComponentAtNode(this.widgetContainer);\n ReactDOM.unmountComponentAtNode(this.controlContainer);\n }\n}\n","export default function elementorWidget(elementor, options, callback, done = () => { }) {\n return elementor.modules.controls.BaseData.extend({\n onReady() {\n const self = this;\n const controlContainer = this.ui.contentEditable.prevObject[0].querySelector(options.controlSelector);\n let widgetContainer = this.options.element.$el[0].querySelector(options.containerSelector);\n if (widgetContainer) {\n callback(controlContainer, widgetContainer, (args) => self.setValue(args));\n }\n else {\n //@ts-expect-error global\n window.elementorFrontend.hooks.addAction(`frontend/element_ready/${options.widgetName}.default`, (element) => {\n widgetContainer = element[0].querySelector(options.containerSelector);\n callback(controlContainer, widgetContainer, (args) => self.setValue(args));\n });\n }\n },\n saveValue(props) {\n this.setValue(props);\n },\n onBeforeDestroy() {\n //@ts-expect-error global\n window.elementorFrontend.hooks.removeAction(`frontend/element_ready/${options.widgetName}.default`);\n done();\n },\n });\n}\n","export const CoreMessages = {\n HandshakeReceive: 'INTEGRATED_APP_EMBEDDER_HANDSHAKE_RECEIVED',\n SendRefreshToken: 'INTEGRATED_APP_EMBEDDER_SEND_REFRESH_TOKEN',\n ReloadParentFrame: 'INTEGRATED_APP_EMBEDDER_RELOAD_PARENT_FRAME',\n RedirectParentFrame: 'INTEGRATED_APP_EMBEDDER_REDIRECT_PARENT_FRAME',\n SendLocale: 'INTEGRATED_APP_EMBEDDER_SEND_LOCALE',\n SendDeviceId: 'INTEGRATED_APP_EMBEDDER_SEND_DEVICE_ID',\n SendIntegratedAppConfig: 'INTEGRATED_APP_EMBEDDER_CONFIG',\n};\n","export const FormMessages = {\n CreateFormAppNavigation: 'CREATE_FORM_APP_NAVIGATION',\n};\n","export * from './core/CoreMessages';\nexport * from './forms/FormsMessages';\nexport * from './livechat/LiveChatMessages';\nexport * from './plugin/PluginMessages';\nexport * from './proxy/ProxyMessages';\n","export const LiveChatMessages = {\n CreateLiveChatAppNavigation: 'CREATE_LIVE_CHAT_APP_NAVIGATION',\n};\n","export const PluginMessages = {\n PluginSettingsNavigation: 'PLUGIN_SETTINGS_NAVIGATION',\n PluginLeadinConfig: 'PLUGIN_LEADIN_CONFIG',\n TrackConsent: 'INTEGRATED_APP_EMBEDDER_TRACK_CONSENT',\n InternalTrackingFetchRequest: 'INTEGRATED_TRACKING_FETCH_REQUEST',\n InternalTrackingFetchResponse: 'INTEGRATED_TRACKING_FETCH_RESPONSE',\n InternalTrackingFetchError: 'INTEGRATED_TRACKING_FETCH_ERROR',\n InternalTrackingChangeRequest: 'INTEGRATED_TRACKING_CHANGE_REQUEST',\n InternalTrackingChangeError: 'INTEGRATED_TRACKING_CHANGE_ERROR',\n BusinessUnitFetchRequest: 'BUSINESS_UNIT_FETCH_REQUEST',\n BusinessUnitFetchResponse: 'BUSINESS_UNIT_FETCH_FETCH_RESPONSE',\n BusinessUnitFetchError: 'BUSINESS_UNIT_FETCH_FETCH_ERROR',\n BusinessUnitChangeRequest: 'BUSINESS_UNIT_CHANGE_REQUEST',\n BusinessUnitChangeError: 'BUSINESS_UNIT_CHANGE_ERROR',\n SkipReviewRequest: 'SKIP_REVIEW_REQUEST',\n SkipReviewResponse: 'SKIP_REVIEW_RESPONSE',\n SkipReviewError: 'SKIP_REVIEW_ERROR',\n RemoveParentQueryParam: 'REMOVE_PARENT_QUERY_PARAM',\n ContentEmbedInstallRequest: 'CONTENT_EMBED_INSTALL_REQUEST',\n ContentEmbedInstallResponse: 'CONTENT_EMBED_INSTALL_RESPONSE',\n ContentEmbedInstallError: 'CONTENT_EMBED_INSTALL_ERROR',\n ContentEmbedActivationRequest: 'CONTENT_EMBED_ACTIVATION_REQUEST',\n ContentEmbedActivationResponse: 'CONTENT_EMBED_ACTIVATION_RESPONSE',\n ContentEmbedActivationError: 'CONTENT_EMBED_ACTIVATION_ERROR',\n};\n","export const ProxyMessages = {\n FetchForms: 'FETCH_FORMS',\n FetchForm: 'FETCH_FORM',\n CreateFormFromTemplate: 'CREATE_FORM_FROM_TEMPLATE',\n FetchAuth: 'FETCH_AUTH',\n FetchMeetingsAndUsers: 'FETCH_MEETINGS_AND_USERS',\n FetchContactsCreateSinceActivation: 'FETCH_CONTACTS_CREATED_SINCE_ACTIVATION',\n FetchOrCreateMeetingUser: 'FETCH_OR_CREATE_MEETING_USER',\n ConnectMeetingsCalendar: 'CONNECT_MEETINGS_CALENDAR',\n TrackFormPreviewRender: 'TRACK_FORM_PREVIEW_RENDER',\n TrackFormCreatedFromTemplate: 'TRACK_FORM_CREATED_FROM_TEMPLATE',\n TrackFormCreationFailed: 'TRACK_FORM_CREATION_FAILED',\n TrackMeetingPreviewRender: 'TRACK_MEETING_PREVIEW_RENDER',\n TrackSidebarMetaChange: 'TRACK_SIDEBAR_META_CHANGE',\n TrackReviewBannerRender: 'TRACK_REVIEW_BANNER_RENDER',\n TrackReviewBannerInteraction: 'TRACK_REVIEW_BANNER_INTERACTION',\n TrackReviewBannerDismissed: 'TRACK_REVIEW_BANNER_DISMISSED',\n TrackPluginDeactivation: 'TRACK_PLUGIN_DEACTIVATION',\n};\n","import { createContext, useContext } from 'react';\nexport const BackgroudAppContext = createContext(null);\nexport function useBackgroundAppContext() {\n return useContext(BackgroudAppContext);\n}\nexport function usePostBackgroundMessage() {\n const app = useBackgroundAppContext();\n return (message) => {\n app.postMessage(message);\n };\n}\nexport function usePostAsyncBackgroundMessage() {\n const app = useBackgroundAppContext();\n return (message) => app.postAsyncMessage(message);\n}\n","import Raven from 'raven-js';\nimport { hubspotBaseUrl, phpVersion, wpVersion, leadinPluginVersion, portalId, plugins, } from '../constants/leadinConfig';\nexport function configureRaven() {\n if (hubspotBaseUrl.indexOf('app.hubspot.com') === -1) {\n return;\n }\n Raven.config('https://e9b8f382cdd130c0d415cd977d2be56f@exceptions.hubspot.com/1', {\n instrument: {\n tryCatch: false,\n },\n release: leadinPluginVersion,\n }).install();\n Raven.setTagsContext({\n v: leadinPluginVersion,\n php: phpVersion,\n wordpress: wpVersion,\n });\n Raven.setExtraContext({\n hub: portalId,\n plugins: Object.keys(plugins)\n .map(name => `${name}#${plugins[name]}`)\n .join(','),\n });\n}\nexport default Raven;\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useRef, useState, useEffect } from 'react';\nimport { styled } from '@linaria/react';\nimport { CALYPSO, CALYPSO_LIGHT, CALYPSO_MEDIUM, OBSIDIAN, } from '../UIComponents/colors';\nimport UISpinner from '../UIComponents/UISpinner';\nimport LoadState from '../enums/loadState';\nconst Container = styled.div `\n color: ${OBSIDIAN};\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-size: 14px;\n position: relative;\n`;\nconst ControlContainer = styled.div `\n align-items: center;\n background-color: hsl(0, 0%, 100%);\n border-color: hsl(0, 0%, 80%);\n border-radius: 4px;\n border-style: solid;\n border-width: ${props => (props.focused ? '0' : '1px')};\n cursor: default;\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n min-height: 38px;\n outline: 0 !important;\n position: relative;\n transition: all 100ms;\n box-sizing: border-box;\n box-shadow: ${props => props.focused ? `0 0 0 2px ${CALYPSO_MEDIUM}` : 'none'};\n &:hover {\n border-color: hsl(0, 0%, 70%);\n }\n`;\nconst ValueContainer = styled.div `\n align-items: center;\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n padding: 2px 8px;\n position: relative;\n overflow: hidden;\n box-sizing: border-box;\n`;\nconst Placeholder = styled.div `\n color: hsl(0, 0%, 50%);\n margin-left: 2px;\n margin-right: 2px;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n box-sizing: border-box;\n font-size: 16px;\n`;\nconst SingleValue = styled.div `\n color: hsl(0, 0%, 20%);\n margin-left: 2px;\n margin-right: 2px;\n max-width: calc(100% - 8px);\n overflow: hidden;\n position: absolute;\n text-overflow: ellipsis;\n white-space: nowrap;\n top: 50%;\n transform: translateY(-50%);\n box-sizing: border-box;\n`;\nconst IndicatorContainer = styled.div `\n align-items: center;\n align-self: stretch;\n display: flex;\n flex-shrink: 0;\n box-sizing: border-box;\n`;\nconst DropdownIndicator = styled.div `\n border-top: 8px solid ${CALYPSO};\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n width: 0px;\n height: 0px;\n margin: 10px;\n`;\nconst InputContainer = styled.div `\n margin: 2px;\n padding-bottom: 2px;\n padding-top: 2px;\n visibility: visible;\n color: hsl(0, 0%, 20%);\n box-sizing: border-box;\n`;\nconst Input = styled.input `\n box-sizing: content-box;\n background: rgba(0, 0, 0, 0) none repeat scroll 0px center;\n border: 0px none;\n font-size: inherit;\n opacity: 1;\n outline: currentcolor none 0px;\n padding: 0px;\n color: inherit;\n font-family: inherit;\n`;\nconst InputShadow = styled.div `\n position: absolute;\n opacity: 0;\n font-size: inherit;\n`;\nconst MenuContainer = styled.div `\n position: absolute;\n top: 100%;\n background-color: #fff;\n border-radius: 4px;\n margin-bottom: 8px;\n margin-top: 8px;\n z-index: 9999;\n box-shadow: 0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1);\n width: 100%;\n`;\nconst MenuList = styled.div `\n max-height: 300px;\n overflow-y: auto;\n padding-bottom: 4px;\n padding-top: 4px;\n position: relative;\n`;\nconst MenuGroup = styled.div `\n padding-bottom: 8px;\n padding-top: 8px;\n`;\nconst MenuGroupHeader = styled.div `\n color: #999;\n cursor: default;\n font-size: 75%;\n font-weight: 500;\n margin-bottom: 0.25em;\n text-transform: uppercase;\n padding-left: 12px;\n padding-left: 12px;\n`;\nconst MenuItem = styled.div `\n display: block;\n background-color: ${props => props.selected ? CALYPSO_MEDIUM : 'transparent'};\n color: ${props => (props.selected ? '#fff' : 'inherit')};\n cursor: default;\n font-size: inherit;\n width: 100%;\n padding: 8px 12px;\n &:hover {\n background-color: ${props => props.selected ? CALYPSO_MEDIUM : CALYPSO_LIGHT};\n }\n`;\nexport default function AsyncSelect({ placeholder, value, loadOptions, onChange, defaultOptions, }) {\n const inputEl = useRef(null);\n const inputShadowEl = useRef(null);\n const [isFocused, setFocus] = useState(false);\n const [loadState, setLoadState] = useState(LoadState.NotLoaded);\n const [localValue, setLocalValue] = useState('');\n const [options, setOptions] = useState(defaultOptions);\n const inputSize = `${inputShadowEl.current ? inputShadowEl.current.clientWidth + 10 : 2}px`;\n useEffect(() => {\n if (loadOptions && loadState === LoadState.NotLoaded) {\n loadOptions('', (result) => {\n setOptions(result);\n setLoadState(LoadState.Idle);\n });\n }\n }, [loadOptions, loadState]);\n const renderItems = (items = [], parentKey) => {\n return items.map((item, index) => {\n if (item.options) {\n return (_jsxs(MenuGroup, { children: [_jsx(MenuGroupHeader, { id: `${index}-heading`, children: item.label }), _jsx(\"div\", { children: renderItems(item.options, index) })] }, `async-select-item-${index}`));\n }\n else {\n const key = `async-select-item-${parentKey !== undefined ? `${parentKey}-${index}` : index}`;\n return (_jsx(MenuItem, { id: key, selected: value && item.value === value.value, onClick: () => {\n onChange(item);\n setFocus(false);\n }, children: item.label }, key));\n }\n });\n };\n return (_jsxs(Container, { children: [_jsxs(ControlContainer, { id: \"leadin-async-selector\", focused: isFocused, onClick: () => {\n if (isFocused) {\n if (inputEl.current) {\n inputEl.current.blur();\n }\n setFocus(false);\n setLocalValue('');\n }\n else {\n if (inputEl.current) {\n inputEl.current.focus();\n }\n setFocus(true);\n }\n }, children: [_jsxs(ValueContainer, { children: [localValue === '' &&\n (!value ? (_jsx(Placeholder, { children: placeholder })) : (_jsx(SingleValue, { children: value.label }))), _jsxs(InputContainer, { children: [_jsx(Input, { ref: inputEl, onFocus: () => {\n setFocus(true);\n }, onChange: e => {\n setLocalValue(e.target.value);\n setLoadState(LoadState.Loading);\n loadOptions &&\n loadOptions(e.target.value, (result) => {\n setOptions(result);\n setLoadState(LoadState.Idle);\n });\n }, value: localValue, width: inputSize, id: \"asycn-select-input\" }), _jsx(InputShadow, { ref: inputShadowEl, children: localValue })] })] }), _jsxs(IndicatorContainer, { children: [loadState === LoadState.Loading && _jsx(UISpinner, {}), _jsx(DropdownIndicator, {})] })] }), isFocused && (_jsx(MenuContainer, { children: _jsx(MenuList, { children: renderItems(options) }) }))] }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport UIButton from '../UIComponents/UIButton';\nimport UIContainer from '../UIComponents/UIContainer';\nimport HubspotWrapper from './HubspotWrapper';\nimport { adminUrl, redirectNonce } from '../../constants/leadinConfig';\nimport { pluginPath } from '../../constants/leadinConfig';\nimport { __ } from '@wordpress/i18n';\nfunction redirectToPlugin() {\n window.location.href = `${adminUrl}admin.php?page=leadin&leadin_expired=${redirectNonce}`;\n}\nexport default function ErrorHandler({ status, resetErrorState, errorInfo = { header: '', message: '', action: '' }, }) {\n const isUnauthorized = status === 401 || status === 403;\n const errorHeader = isUnauthorized\n ? __(\"Your plugin isn't authorized\", 'leadin')\n : errorInfo.header;\n const errorMessage = isUnauthorized\n ? __('Reauthorize your plugin to access your free HubSpot tools', 'leadin')\n : errorInfo.message;\n return (_jsx(HubspotWrapper, { pluginPath: pluginPath, children: _jsxs(UIContainer, { textAlign: \"center\", children: [_jsx(\"h4\", { children: errorHeader }), _jsx(\"p\", { children: _jsx(\"b\", { children: errorMessage }) }), isUnauthorized ? (_jsx(UIButton, { \"data-test-id\": \"authorize-button\", onClick: redirectToPlugin, children: __('Go to plugin', 'leadin') })) : (_jsx(UIButton, { \"data-test-id\": \"retry-button\", onClick: resetErrorState, children: errorInfo.action }))] }) }));\n}\n","import { styled } from '@linaria/react';\nexport default styled.div `\n background-image: ${props => `url(${props.pluginPath}/public/assets/images/hubspot.svg)`};\n background-color: #f5f8fa;\n background-repeat: no-repeat;\n background-position: center 25px;\n background-size: 120px;\n color: #33475b;\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-size: 14px;\n\n padding: ${(props) => props.padding || '90px 20% 25px'};\n\n p {\n font-size: inherit !important;\n line-height: 24px;\n margin: 4px 0;\n }\n`;\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport HubspotWrapper from './HubspotWrapper';\nimport UISpinner from '../UIComponents/UISpinner';\nimport { pluginPath } from '../../constants/leadinConfig';\nexport default function LoadingBlock() {\n return (_jsx(HubspotWrapper, { pluginPath: pluginPath, children: _jsx(UISpinner, { size: 50 }) }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Fragment, useEffect } from 'react';\nimport { portalId, refreshToken } from '../../constants/leadinConfig';\nimport UISpacer from '../UIComponents/UISpacer';\nimport PreviewForm from './PreviewForm';\nimport FormSelect from './FormSelect';\nimport { usePostBackgroundMessage, BackgroudAppContext, useBackgroundAppContext, } from '../../iframe/useBackgroundApp';\nimport { ProxyMessages } from '../../iframe/integratedMessages';\nimport LoadingBlock from '../Common/LoadingBlock';\nimport { getOrCreateBackgroundApp } from '../../utils/backgroundAppUtils';\nfunction FormEdit({ attributes, isSelected, setAttributes, preview = true, origin = 'gutenberg', }) {\n const { formId, formName } = attributes;\n const formSelected = portalId && formId;\n const isBackgroundAppReady = useBackgroundAppContext();\n const monitorFormPreviewRender = usePostBackgroundMessage();\n const handleChange = (selectedForm) => {\n setAttributes({\n portalId,\n formId: selectedForm.value,\n formName: selectedForm.label,\n });\n };\n useEffect(() => {\n monitorFormPreviewRender({\n key: ProxyMessages.TrackFormPreviewRender,\n payload: {\n origin,\n },\n });\n }, [origin]);\n return !isBackgroundAppReady ? (_jsx(LoadingBlock, {})) : (_jsxs(Fragment, { children: [(isSelected || !formSelected) && (_jsx(FormSelect, { formId: formId, formName: formName, handleChange: handleChange, origin: origin })), formSelected && (_jsxs(Fragment, { children: [isSelected && _jsx(UISpacer, {}), preview && _jsx(PreviewForm, { portalId: portalId, formId: formId })] }))] }));\n}\nexport default function FormEditContainer(props) {\n return (_jsx(BackgroudAppContext.Provider, { value: refreshToken && getOrCreateBackgroundApp(refreshToken), children: _jsx(FormEdit, { ...props }) }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport FormSelector from './FormSelector';\nimport LoadingBlock from '../Common/LoadingBlock';\nimport { __ } from '@wordpress/i18n';\nimport useForms from './hooks/useForms';\nimport useCreateFormFromTemplate from './hooks/useCreateFormFromTemplate';\nimport { isDefaultForm } from '../../constants/defaultFormOptions';\nimport ErrorHandler from '../Common/ErrorHandler';\nexport default function FormSelect({ formId, formName, handleChange, origin = 'gutenberg', }) {\n const { search, formApiError, reset } = useForms();\n const { createFormByTemplate, reset: createReset, isCreating, hasError, formApiError: createApiError, } = useCreateFormFromTemplate(origin);\n const value = formId && formName\n ? {\n label: formName,\n value: formId,\n }\n : null;\n const handleLocalChange = (option) => {\n if (isDefaultForm(option.value)) {\n createFormByTemplate(option.value).then(({ guid, name }) => {\n handleChange({\n value: guid,\n label: name,\n });\n });\n }\n else {\n handleChange(option);\n }\n };\n return isCreating ? (_jsx(LoadingBlock, {})) : formApiError || createApiError ? (_jsx(ErrorHandler, { status: formApiError ? formApiError.status : createApiError.status, resetErrorState: () => {\n if (hasError) {\n createReset();\n }\n else {\n reset();\n }\n }, errorInfo: {\n header: __('There was a problem retrieving your forms', 'leadin'),\n message: __('Please refresh your forms or try again in a few minutes', 'leadin'),\n action: __('Refresh forms', 'leadin'),\n } })) : (_jsx(FormSelector, { loadOptions: search, onChange: (option) => handleLocalChange(option), value: value }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport HubspotWrapper from '../Common/HubspotWrapper';\nimport { pluginPath } from '../../constants/leadinConfig';\nimport AsyncSelect from '../Common/AsyncSelect';\nimport { __ } from '@wordpress/i18n';\nexport default function FormSelector({ loadOptions, onChange, value, }) {\n return (_jsxs(HubspotWrapper, { pluginPath: pluginPath, children: [_jsx(\"p\", { \"data-test-id\": \"leadin-form-select\", children: _jsx(\"b\", { children: __('Select an existing form or create a new one from a template', 'leadin') }) }), _jsx(AsyncSelect, { placeholder: __('Search for a form', 'leadin'), value: value, loadOptions: loadOptions, onChange: onChange })] }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useEffect, useRef } from 'react';\nimport UIOverlay from '../UIComponents/UIOverlay';\nimport { formsScriptPayload, hublet } from '../../constants/leadinConfig';\nimport useFormScript from './hooks/useFormsScript';\nexport default function PreviewForm({ portalId, formId, }) {\n const inputEl = useRef(null);\n const ready = useFormScript();\n useEffect(() => {\n if (!ready) {\n return;\n }\n if (inputEl.current) {\n inputEl.current.innerHTML = '';\n const embedScript = document.createElement('script');\n embedScript.innerHTML = `hbspt.forms.create({ portalId: '${portalId}', formId: '${formId}', region: '${hublet}', ${formsScriptPayload} });`;\n inputEl.current.appendChild(embedScript);\n }\n }, [formId, portalId, ready, inputEl]);\n return _jsx(UIOverlay, { ref: inputEl });\n}\n","import { useState } from 'react';\nimport { usePostAsyncBackgroundMessage, usePostBackgroundMessage, } from '../../../iframe/useBackgroundApp';\nimport LoadState from '../../enums/loadState';\nimport { ProxyMessages } from '../../../iframe/integratedMessages';\nexport default function useCreateFormFromTemplate(origin = 'gutenberg') {\n const proxy = usePostAsyncBackgroundMessage();\n const track = usePostBackgroundMessage();\n const [loadState, setLoadState] = useState(LoadState.Idle);\n const [formApiError, setFormApiError] = useState(null);\n const createFormByTemplate = (type) => {\n setLoadState(LoadState.Loading);\n track({\n key: ProxyMessages.TrackFormCreatedFromTemplate,\n payload: {\n type,\n origin,\n },\n });\n return proxy({\n key: ProxyMessages.CreateFormFromTemplate,\n payload: type,\n })\n .then(form => {\n setLoadState(LoadState.Idle);\n return form;\n })\n .catch(err => {\n setFormApiError(err);\n track({\n key: ProxyMessages.TrackFormCreationFailed,\n payload: {\n origin,\n },\n });\n setLoadState(LoadState.Failed);\n });\n };\n return {\n isCreating: loadState === LoadState.Loading,\n hasError: loadState === LoadState.Failed,\n formApiError,\n createFormByTemplate,\n reset: () => setLoadState(LoadState.Idle),\n };\n}\n","import { useState } from 'react';\nimport debounce from 'lodash/debounce';\nimport { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp';\nimport { DEFAULT_OPTIONS } from '../../../constants/defaultFormOptions';\nimport { ProxyMessages } from '../../../iframe/integratedMessages';\nexport default function useForms() {\n const proxy = usePostAsyncBackgroundMessage();\n const [formApiError, setFormApiError] = useState(null);\n const search = debounce((search, callback) => {\n return proxy({\n key: ProxyMessages.FetchForms,\n payload: {\n search,\n },\n })\n .then(forms => {\n callback([\n ...forms.map((form) => ({\n label: form.name,\n value: form.guid,\n })),\n DEFAULT_OPTIONS,\n ]);\n })\n .catch(error => {\n setFormApiError(error);\n });\n }, 300, { trailing: true });\n return {\n search,\n formApiError,\n reset: () => setFormApiError(null),\n };\n}\n","import $ from 'jquery';\nimport { useEffect, useState } from 'react';\nimport { formsScript } from '../../../constants/leadinConfig';\nimport Raven from '../../../lib/Raven';\nlet promise;\nfunction loadFormsScript() {\n if (!promise) {\n promise = new Promise((resolve, reject) => $.getScript(formsScript)\n .done(resolve)\n .fail(reject));\n }\n return promise;\n}\nexport default function useFormScript() {\n const [ready, setReady] = useState(false);\n useEffect(() => {\n loadFormsScript()\n .then(() => setReady(true))\n .catch(error => Raven.captureException(error));\n }, []);\n return ready;\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Fragment, useEffect } from 'react';\nimport LoadingBlock from '../Common/LoadingBlock';\nimport MeetingSelector from './MeetingSelector';\nimport MeetingWarning from './MeetingWarning';\nimport useMeetings, { useSelectedMeeting, useSelectedMeetingCalendar, } from './hooks/useMeetings';\nimport HubspotWrapper from '../Common/HubspotWrapper';\nimport ErrorHandler from '../Common/ErrorHandler';\nimport { pluginPath } from '../../constants/leadinConfig';\nimport { __ } from '@wordpress/i18n';\nimport Raven from 'raven-js';\nexport default function MeetingController({ handleChange, url, }) {\n const { mappedMeetings: meetings, loading, error, reload, connectCalendar, } = useMeetings();\n const selectedMeetingOption = useSelectedMeeting(url);\n const selectedMeetingCalendar = useSelectedMeetingCalendar(url);\n useEffect(() => {\n if (!url && meetings.length > 0) {\n handleChange(meetings[0].value);\n }\n }, [meetings, url, handleChange]);\n const handleLocalChange = (option) => {\n handleChange(option.value);\n };\n const handleConnectCalendar = () => {\n return connectCalendar()\n .then(() => {\n reload();\n })\n .catch(error => {\n Raven.captureMessage('Unable to connect calendar', {\n extra: { error },\n });\n });\n };\n return (_jsx(Fragment, { children: loading ? (_jsx(LoadingBlock, {})) : error ? (_jsx(ErrorHandler, { status: (error && error.status) || error, resetErrorState: () => reload(), errorInfo: {\n header: __('There was a problem retrieving your meetings', 'leadin'),\n message: __('Please refresh your meetings or try again in a few minutes', 'leadin'),\n action: __('Refresh meetings', 'leadin'),\n } })) : (_jsxs(HubspotWrapper, { padding: \"90px 32px 24px\", pluginPath: pluginPath, children: [selectedMeetingCalendar && (_jsx(MeetingWarning, { status: selectedMeetingCalendar, onConnectCalendar: handleConnectCalendar })), meetings.length > 1 && (_jsx(MeetingSelector, { onChange: handleLocalChange, options: meetings, value: selectedMeetingOption }))] })) }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Fragment, useEffect } from 'react';\nimport MeetingController from './MeetingController';\nimport PreviewMeeting from './PreviewMeeting';\nimport { BackgroudAppContext, useBackgroundAppContext, usePostBackgroundMessage, } from '../../iframe/useBackgroundApp';\nimport { refreshToken } from '../../constants/leadinConfig';\nimport { ProxyMessages } from '../../iframe/integratedMessages';\nimport LoadingBlock from '../Common/LoadingBlock';\nimport { getOrCreateBackgroundApp } from '../../utils/backgroundAppUtils';\nfunction MeetingEdit({ attributes: { url }, isSelected, setAttributes, preview = true, origin = 'gutenberg', }) {\n const isBackgroundAppReady = useBackgroundAppContext();\n const monitorFormPreviewRender = usePostBackgroundMessage();\n const handleChange = (newUrl) => {\n setAttributes({\n url: newUrl,\n });\n };\n useEffect(() => {\n monitorFormPreviewRender({\n key: ProxyMessages.TrackMeetingPreviewRender,\n payload: {\n origin,\n },\n });\n }, [origin]);\n return !isBackgroundAppReady ? (_jsx(LoadingBlock, {})) : (_jsxs(Fragment, { children: [(isSelected || !url) && (_jsx(MeetingController, { url: url, handleChange: handleChange })), preview && url && _jsx(PreviewMeeting, { url: url })] }));\n}\nexport default function MeetingsEditContainer(props) {\n return (_jsx(BackgroudAppContext.Provider, { value: refreshToken && getOrCreateBackgroundApp(refreshToken), children: _jsx(MeetingEdit, { ...props }) }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Fragment } from 'react';\nimport AsyncSelect from '../Common/AsyncSelect';\nimport UISpacer from '../UIComponents/UISpacer';\nimport { __ } from '@wordpress/i18n';\nexport default function MeetingSelector({ options, onChange, value, }) {\n const optionsWrapper = [\n {\n label: __('Meeting name', 'leadin'),\n options,\n },\n ];\n return (_jsxs(Fragment, { children: [_jsx(UISpacer, {}), _jsx(\"p\", { \"data-test-id\": \"leadin-meeting-select\", children: _jsx(\"b\", { children: __('Select a meeting scheduling page', 'leadin') }) }), _jsx(AsyncSelect, { defaultOptions: optionsWrapper, onChange: onChange, placeholder: __('Select a meeting', 'leadin'), value: value })] }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport UIAlert from '../UIComponents/UIAlert';\nimport UIButton from '../UIComponents/UIButton';\nimport { CURRENT_USER_CALENDAR_MISSING } from './constants';\nimport { __ } from '@wordpress/i18n';\nexport default function MeetingWarning({ status, onConnectCalendar, }) {\n const isMeetingOwner = status === CURRENT_USER_CALENDAR_MISSING;\n const titleText = isMeetingOwner\n ? __('Your calendar is not connected', 'leadin')\n : __('Calendar is not connected', 'leadin');\n const titleMessage = isMeetingOwner\n ? __('Please connect your calendar to activate your scheduling pages', 'leadin')\n : __('Make sure that everybody in this meeting has connected their calendar from the Meetings page in HubSpot', 'leadin');\n return (_jsx(UIAlert, { titleText: titleText, titleMessage: titleMessage, children: isMeetingOwner && (_jsx(UIButton, { use: \"tertiary\", id: \"meetings-connect-calendar\", onClick: onConnectCalendar, children: __('Connect calendar', 'leadin') })) }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Fragment, useEffect, useRef } from 'react';\nimport UIOverlay from '../UIComponents/UIOverlay';\nimport useMeetingsScript from './hooks/useMeetingsScript';\nexport default function PreviewForm({ url }) {\n const ready = useMeetingsScript();\n const inputEl = useRef(null);\n useEffect(() => {\n if (!ready) {\n return;\n }\n if (inputEl.current) {\n inputEl.current.innerHTML = '';\n const container = document.createElement('div');\n container.dataset.src = `${url}?embed=true`;\n container.classList.add('meetings-iframe-container');\n inputEl.current.appendChild(container);\n const embedScript = document.createElement('script');\n embedScript.innerHTML =\n 'hbspt.meetings.create(\".meetings-iframe-container\");';\n inputEl.current.appendChild(embedScript);\n }\n }, [url, ready, inputEl]);\n return _jsx(Fragment, { children: url && _jsx(UIOverlay, { ref: inputEl }) });\n}\n","export const OTHER_USER_CALENDAR_MISSING = 'OTHER_USER_CALENDAR_MISSING';\nexport const CURRENT_USER_CALENDAR_MISSING = 'CURRENT_USER_CALENDAR_MISSING';\n","import { useEffect, useState } from 'react';\nimport { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp';\nimport LoadState from '../../enums/loadState';\nimport { ProxyMessages } from '../../../iframe/integratedMessages';\nlet user = null;\nexport default function useCurrentUserFetch() {\n const proxy = usePostAsyncBackgroundMessage();\n const [loadState, setLoadState] = useState(LoadState.NotLoaded);\n const [error, setError] = useState(null);\n const createUser = () => {\n if (!user) {\n setLoadState(LoadState.NotLoaded);\n }\n };\n const reload = () => {\n user = null;\n setLoadState(LoadState.NotLoaded);\n setError(null);\n };\n useEffect(() => {\n if (loadState === LoadState.NotLoaded && !user) {\n setLoadState(LoadState.Loading);\n proxy({\n key: ProxyMessages.FetchOrCreateMeetingUser,\n })\n .then(data => {\n user = data;\n setLoadState(LoadState.Idle);\n })\n .catch(err => {\n setError(err);\n setLoadState(LoadState.Failed);\n });\n }\n }, [loadState]);\n return { user, loadUserState: loadState, error, createUser, reload };\n}\n","import { useCallback } from 'react';\nimport { __ } from '@wordpress/i18n';\nimport { CURRENT_USER_CALENDAR_MISSING, OTHER_USER_CALENDAR_MISSING, } from '../constants';\nimport useMeetingsFetch from './useMeetingsFetch';\nimport useCurrentUserFetch from './useCurrentUserFetch';\nimport LoadState from '../../enums/loadState';\nimport { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp';\nimport { ProxyMessages } from '../../../iframe/integratedMessages';\nfunction getDefaultMeetingName(meeting, currentUser, meetingUsers) {\n const [meetingOwnerId] = meeting.meetingsUserIds;\n let result = __('Default', 'leadin');\n if (currentUser &&\n meetingOwnerId !== currentUser.id &&\n meetingUsers[meetingOwnerId]) {\n const user = meetingUsers[meetingOwnerId];\n result += ` (${user.userProfile.fullName})`;\n }\n return result;\n}\nfunction hasCalendarObject(user) {\n return (user &&\n user.meetingsUserBlob &&\n user.meetingsUserBlob.calendarSettings &&\n user.meetingsUserBlob.calendarSettings.email);\n}\nexport default function useMeetings() {\n const proxy = usePostAsyncBackgroundMessage();\n const { meetings, meetingUsers, error: meetingsError, loadMeetingsState, reload: reloadMeetings, } = useMeetingsFetch();\n const { user: currentUser, error: userError, loadUserState, reload: reloadUser, } = useCurrentUserFetch();\n const reload = useCallback(() => {\n reloadUser();\n reloadMeetings();\n }, [reloadUser, reloadMeetings]);\n const connectCalendar = () => {\n return proxy({\n key: ProxyMessages.ConnectMeetingsCalendar,\n });\n };\n return {\n mappedMeetings: meetings.map(meet => ({\n label: meet.name || getDefaultMeetingName(meet, currentUser, meetingUsers),\n value: meet.link,\n })),\n meetings,\n meetingUsers,\n currentUser,\n error: meetingsError || userError,\n loading: loadMeetingsState == LoadState.Loading ||\n loadUserState === LoadState.Loading,\n reload,\n connectCalendar,\n };\n}\nexport function useSelectedMeeting(url) {\n const { mappedMeetings: meetings } = useMeetings();\n const option = meetings.find(({ value }) => value === url);\n return option;\n}\nexport function useSelectedMeetingCalendar(url) {\n const { meetings, meetingUsers, currentUser } = useMeetings();\n const meeting = meetings.find(meet => meet.link === url);\n const mappedMeetingUsersId = meetingUsers.reduce((p, c) => ({ ...p, [c.id]: c }), {});\n if (!meeting) {\n return null;\n }\n else {\n const { meetingsUserIds } = meeting;\n if (currentUser &&\n meetingsUserIds.includes(currentUser.id) &&\n !hasCalendarObject(currentUser)) {\n return CURRENT_USER_CALENDAR_MISSING;\n }\n else if (meetingsUserIds\n .map(id => mappedMeetingUsersId[id])\n .some((user) => !hasCalendarObject(user))) {\n return OTHER_USER_CALENDAR_MISSING;\n }\n else {\n return null;\n }\n }\n}\n","import { useEffect, useState } from 'react';\nimport { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp';\nimport LoadState from '../../enums/loadState';\nimport { ProxyMessages } from '../../../iframe/integratedMessages';\nlet meetings = [];\nlet meetingUsers = [];\nexport default function useMeetingsFetch() {\n const proxy = usePostAsyncBackgroundMessage();\n const [loadState, setLoadState] = useState(LoadState.NotLoaded);\n const [error, setError] = useState(null);\n const reload = () => {\n meetings = [];\n setError(null);\n setLoadState(LoadState.NotLoaded);\n };\n useEffect(() => {\n if (loadState === LoadState.NotLoaded && meetings.length === 0) {\n setLoadState(LoadState.Loading);\n proxy({\n key: ProxyMessages.FetchMeetingsAndUsers,\n })\n .then(data => {\n setLoadState(LoadState.Loaded);\n meetings = data && data.meetingLinks;\n meetingUsers = data && data.meetingUsers;\n })\n .catch(e => {\n setError(e);\n setLoadState(LoadState.Failed);\n });\n }\n }, [loadState]);\n return {\n meetings,\n meetingUsers,\n loadMeetingsState: loadState,\n error,\n reload,\n };\n}\n","import $ from 'jquery';\nimport { useState, useEffect } from 'react';\nimport { meetingsScript } from '../../../constants/leadinConfig';\nimport Raven from '../../../lib/Raven';\nlet promise;\nfunction loadMeetingsScript() {\n if (!promise) {\n promise = new Promise((resolve, reject) => $.getScript(meetingsScript)\n .done(resolve)\n .fail(reject));\n }\n return promise;\n}\nexport default function useMeetingsScript() {\n const [ready, setReady] = useState(false);\n useEffect(() => {\n loadMeetingsScript()\n .then(() => setReady(true))\n .catch(error => Raven.captureException(error));\n }, []);\n return ready;\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { styled } from '@linaria/react';\nimport { MARIGOLD_LIGHT, MARIGOLD_MEDIUM, OBSIDIAN } from './colors';\nconst AlertContainer = styled.div `\n background-color: ${MARIGOLD_LIGHT};\n border-color: ${MARIGOLD_MEDIUM};\n color: ${OBSIDIAN};\n font-size: 14px;\n align-items: center;\n justify-content: space-between;\n display: flex;\n border-style: solid;\n border-top-style: solid;\n border-right-style: solid;\n border-bottom-style: solid;\n border-left-style: solid;\n border-width: 1px;\n min-height: 60px;\n padding: 8px 20px;\n position: relative;\n text-align: left;\n`;\nconst Title = styled.p `\n font-family: 'Lexend Deca';\n font-style: normal;\n font-weight: 700;\n font-size: 16px;\n line-height: 19px;\n color: ${OBSIDIAN};\n margin: 0;\n padding: 0;\n`;\nconst Message = styled.p `\n font-family: 'Lexend Deca';\n font-style: normal;\n font-weight: 400;\n font-size: 14px;\n margin: 0;\n padding: 0;\n`;\nconst MessageContainer = styled.div `\n display: flex;\n flex-direction: column;\n`;\nexport default function UIAlert({ titleText, titleMessage, children, }) {\n return (_jsxs(AlertContainer, { children: [_jsxs(MessageContainer, { children: [_jsx(Title, { children: titleText }), _jsx(Message, { children: titleMessage })] }), children] }));\n}\n","import { styled } from '@linaria/react';\nimport { HEFFALUMP, LORAX, OLAF } from './colors';\nexport default styled.button `\n background-color:${props => (props.use === 'tertiary' ? HEFFALUMP : LORAX)};\n border: 3px solid ${props => (props.use === 'tertiary' ? HEFFALUMP : LORAX)};\n color: ${OLAF}\n border-radius: 3px;\n font-size: 14px;\n line-height: 14px;\n padding: 12px 24px;\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-weight: 500;\n white-space: nowrap;\n`;\n","import { styled } from '@linaria/react';\nexport default styled.div `\n text-align: ${props => (props.textAlign ? props.textAlign : 'inherit')};\n`;\n","import { styled } from '@linaria/react';\nexport default styled.div `\n position: relative;\n\n &:after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n left: 0;\n }\n`;\n","import { styled } from '@linaria/react';\nexport default styled.div `\n height: 30px;\n`;\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { styled } from '@linaria/react';\nimport { CALYPSO_MEDIUM, CALYPSO } from './colors';\nconst SpinnerOuter = styled.div `\n align-items: center;\n color: #00a4bd;\n display: flex;\n flex-direction: column;\n justify-content: center;\n width: 100%;\n height: 100%;\n margin: '2px';\n`;\nconst SpinnerInner = styled.div `\n align-items: center;\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n`;\nconst Circle = styled.circle `\n fill: none;\n stroke: ${props => props.color};\n stroke-width: 5;\n stroke-linecap: round;\n transform-origin: center;\n`;\nconst AnimatedCircle = styled.circle `\n fill: none;\n stroke: ${props => props.color};\n stroke-width: 5;\n stroke-linecap: round;\n transform-origin: center;\n animation: dashAnimation 2s ease-in-out infinite,\n spinAnimation 2s linear infinite;\n\n @keyframes dashAnimation {\n 0% {\n stroke-dasharray: 1, 150;\n stroke-dashoffset: 0;\n }\n\n 50% {\n stroke-dasharray: 90, 150;\n stroke-dashoffset: -50;\n }\n\n 100% {\n stroke-dasharray: 90, 150;\n stroke-dashoffset: -140;\n }\n }\n\n @keyframes spinAnimation {\n transform: rotate(360deg);\n }\n`;\nexport default function UISpinner({ size = 20 }) {\n return (_jsx(SpinnerOuter, { children: _jsx(SpinnerInner, { children: _jsxs(\"svg\", { height: size, width: size, viewBox: \"0 0 50 50\", children: [_jsx(Circle, { color: CALYPSO_MEDIUM, cx: \"25\", cy: \"25\", r: \"22.5\" }), _jsx(AnimatedCircle, { color: CALYPSO, cx: \"25\", cy: \"25\", r: \"22.5\" })] }) }) }));\n}\n","export const CALYPSO = '#00a4bd';\nexport const CALYPSO_MEDIUM = '#7fd1de';\nexport const CALYPSO_LIGHT = '#e5f5f8';\nexport const LORAX = '#ff7a59';\nexport const OLAF = '#ffffff';\nexport const HEFFALUMP = '#425b76';\nexport const MARIGOLD_LIGHT = '#fef8f0';\nexport const MARIGOLD_MEDIUM = '#fae0b5';\nexport const OBSIDIAN = '#33475b';\n","const ConnectionStatus = {\n Connected: 'Connected',\n NotConnected: 'NotConnected',\n};\nexport default ConnectionStatus;\n","const LoadState = {\n NotLoaded: 'NotLoaded',\n Loading: 'Loading',\n Loaded: 'Loaded',\n Idle: 'Idle',\n Failed: 'Failed',\n};\nexport default LoadState;\n","import $ from 'jquery';\nimport Raven, { configureRaven } from '../lib/Raven';\nexport function initApp(initFn) {\n configureRaven();\n Raven.context(initFn);\n}\nexport function initAppOnReady(initFn) {\n function main() {\n $(initFn);\n }\n initApp(main);\n}\n","import { deviceId, hubspotBaseUrl, locale, portalId, } from '../constants/leadinConfig';\nimport { initApp } from './appUtils';\nexport function initBackgroundApp(initFn) {\n function main() {\n if (Array.isArray(initFn)) {\n initFn.forEach(callback => callback());\n }\n else {\n initFn();\n }\n }\n initApp(main);\n}\nexport const getOrCreateBackgroundApp = (refreshToken) => {\n if (window.LeadinBackgroundApp) {\n return window.LeadinBackgroundApp;\n }\n const { IntegratedAppEmbedder, IntegratedAppOptions } = window;\n const options = new IntegratedAppOptions()\n .setLocale(locale)\n .setDeviceId(deviceId)\n .setRefreshToken(refreshToken);\n const embedder = new IntegratedAppEmbedder('integrated-plugin-proxy', portalId, hubspotBaseUrl, () => { }).setOptions(options);\n embedder.attachTo(document.body, false);\n embedder.postStartAppMessage(); // lets the app know all all data has been passed to it\n window.LeadinBackgroundApp = embedder;\n return window.LeadinBackgroundApp;\n};\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = '' + args.join(' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg = 'Assertion failed: ' + (args.slice(1).join(' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isObject = utils.isObject;\nvar isErrorEvent = utils.isErrorEvent;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n collectWindowErrors: true,\n maxMessageLength: 0,\n\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.19.1',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = undefined;\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} func A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped already\n // for both debugging and to prevent it to being wrapped twice\n wrapped.__raven__ = true;\n wrapped.__inner__ = func;\n\n return wrapped;\n },\n\n /*\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._restoreBuiltIns();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /*\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n // Cases for sending ex as a message, rather than an exception\n var isNotError = !isError(ex);\n var isNotErrorEvent = !isErrorEvent(ex);\n var isErrorEventWithoutError = isErrorEvent(ex) && !ex.error;\n\n if ((isNotError && isNotErrorEvent) || isErrorEventWithoutError) {\n return this.captureMessage(\n ex,\n objectMerge(\n {\n trimHeadFrames: 1,\n stacktrace: true // if we fall back to captureMessage, default to attempting a new trace\n },\n options\n )\n );\n }\n\n // Get actual Error from ErrorEvent\n if (isErrorEvent(ex)) ex = ex.error;\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n\n var data = objectMerge(\n {\n message: msg + '' // Make sure it's actually a string\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = stack.stack[1];\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n if (this._globalOptions.stacktrace || (options && options.stacktrace)) {\n options = objectMerge(\n {\n // fingerprint on msg, not stack trace (legacy behavior, could be\n // revisited)\n fingerprint: msg,\n // since we know this is a synthetic trace, the top N-most frames\n // MUST be from Raven.js, so mark them as in_app later by setting\n // trimHeadFrames\n trimHeadFrames: (options.trimHeadFrames || 0) + 1\n },\n options\n );\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = options || {};\n\n var lastEventId = options.eventId || this.lastEventId();\n if (!lastEventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n var dsn = options.dsn || this._dsn;\n if (!dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var qs = '';\n qs += '?eventId=' + encode(lastEventId);\n qs += '&dsn=' + encode(dsn);\n\n var user = options.user || this._globalContext.user;\n if (user) {\n if (user.name) qs += '&name=' + encode(user.name);\n if (user.email) qs += '&email=' + encode(user.email);\n }\n\n var globalServer = this._getGlobalServer(this._parseDSN(dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/' + qs;\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(originalCallback);\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(fn.handleEvent);\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(fn, undefined, before),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(self.wrap(cb));\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(orig);\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function(data) {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(orig, undefined, onreadystatechangeHandler);\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && 'fetch' in _window) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return origFetch.apply(this, args).then(function(response) {\n fetchData.status_code = response.status;\n\n return response;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n history.pushState &&\n history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function() {\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo.apply(this, arguments);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n culprit: fileurl\n },\n options\n );\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': navigator.userAgent\n };\n }\n\n if (this._hasDocument) {\n if (_document.location && _document.location.href) {\n httpData.url = _document.location.href;\n }\n if (_document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.culprit !== last.culprit // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n retry = request.getResponseHeader('Retry-After');\n retry = parseInt(retry, 10) * 1000; // Retry-After is returned in seconds\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n // If there are no tags/extra, strip the key from the payload alltogther.\n if (isEmptyObject(data.tags)) delete data.tags;\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n var url = opts.url;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n // NOTE: auth is intentionally sent as part of query string (NOT as custom\n // HTTP header) so as to avoid preflight CORS requests\n request.open('POST', url + '?' + urlencode(opts.auth));\n request.send(stringify(opts.data));\n },\n\n _logDebug: function(level) {\n if (this._originalConsoleMethods[level] && this.debug) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n","var _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch ({}.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return supportsErrorEvent() && {}.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isEmptyObject(what) {\n for (var _ in what) return false; // eslint-disable-line guard-for-in, no-unused-vars\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n return !max || str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n if (!match) return {};\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n var orig = obj[name];\n obj[name] = replacement(orig);\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isString: isString,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n return document.location.href;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} message Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(message, url, lineNo, colNo, ex) {\n var stack = null;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (ex && utils.isError(ex)) {\n // non-string `ex` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(ex);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var msg = message; // must be new var or will modify original `arguments`\n var groups;\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n msg = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: msg,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,\n gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\\[native).*?|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i,\n winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n // Used to additionally parse URL/line/column from eval frames\n geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i,\n chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/,\n lines = ex.stack.split('\\n'),\n stack = [],\n submatch,\n parts,\n element,\n reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","/** @license React v17.0.2\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\nvar _assign = require('object-assign');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar REACT_ELEMENT_TYPE = 0xeac7;\nvar REACT_PORTAL_TYPE = 0xeaca;\nexports.Fragment = 0xeacb;\nvar REACT_STRICT_MODE_TYPE = 0xeacc;\nvar REACT_PROFILER_TYPE = 0xead2;\nvar REACT_PROVIDER_TYPE = 0xeacd;\nvar REACT_CONTEXT_TYPE = 0xeace;\nvar REACT_FORWARD_REF_TYPE = 0xead0;\nvar REACT_SUSPENSE_TYPE = 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = 0xead8;\nvar REACT_MEMO_TYPE = 0xead3;\nvar REACT_LAZY_TYPE = 0xead4;\nvar REACT_BLOCK_TYPE = 0xead9;\nvar REACT_SERVER_BLOCK_TYPE = 0xeada;\nvar REACT_FUNDAMENTAL_TYPE = 0xead5;\nvar REACT_SCOPE_TYPE = 0xead7;\nvar REACT_OPAQUE_ID_TYPE = 0xeae0;\nvar REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1;\nvar REACT_OFFSCREEN_TYPE = 0xeae2;\nvar REACT_LEGACY_HIDDEN_TYPE = 0xeae3;\n\nif (typeof Symbol === 'function' && Symbol.for) {\n var symbolFor = Symbol.for;\n REACT_ELEMENT_TYPE = symbolFor('react.element');\n REACT_PORTAL_TYPE = symbolFor('react.portal');\n exports.Fragment = symbolFor('react.fragment');\n REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode');\n REACT_PROFILER_TYPE = symbolFor('react.profiler');\n REACT_PROVIDER_TYPE = symbolFor('react.provider');\n REACT_CONTEXT_TYPE = symbolFor('react.context');\n REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref');\n REACT_SUSPENSE_TYPE = symbolFor('react.suspense');\n REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list');\n REACT_MEMO_TYPE = symbolFor('react.memo');\n REACT_LAZY_TYPE = symbolFor('react.lazy');\n REACT_BLOCK_TYPE = symbolFor('react.block');\n REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block');\n REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental');\n REACT_SCOPE_TYPE = symbolFor('react.scope');\n REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id');\n REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode');\n REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen');\n REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden');\n}\n\nvar MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n }\n\n var argsWithFormat = args.map(function (item) {\n return '' + item;\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// Filter certain DOM attributes (e.g. src, href) if their values are empty strings.\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === exports.Fragment || type === REACT_PROFILER_TYPE || type === REACT_DEBUG_TRACING_MODE_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var functionName = innerType.displayName || innerType.name || '';\n return outerType.displayName || (functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName);\n}\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n}\n\nfunction getComponentName(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case exports.Fragment:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n return getComponentName(type.type);\n\n case REACT_BLOCK_TYPE:\n return getComponentName(type._render);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentName(init(payload));\n } catch (x) {\n return null;\n }\n }\n }\n }\n\n return null;\n}\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: _assign({}, props, {\n value: prevLog\n }),\n info: _assign({}, props, {\n value: prevInfo\n }),\n warn: _assign({}, props, {\n value: prevWarn\n }),\n error: _assign({}, props, {\n value: prevError\n }),\n group: _assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: _assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: _assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if (!fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at ');\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_BLOCK_TYPE:\n return describeFunctionComponentFrame(type._render);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(Object.prototype.hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentName(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie.
\n // or
). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n //
, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentName(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentName(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (Array.isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentName(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentName(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (Array.isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentName(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (Array.isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n if (type === exports.Fragment) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, true);\n }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, false);\n }\n}\n\nvar jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs = jsxWithValidationStatic ;\n\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","module.exports = window[\"React\"];","module.exports = window[\"ReactDOM\"];","module.exports = window[\"jQuery\"];","module.exports = window[\"wp\"][\"i18n\"];","// src/styled.ts\nimport validAttr from \"@emotion/is-prop-valid\";\nimport React from \"react\";\nimport { cx } from \"@linaria/core\";\nvar isCapital = (ch) => ch.toUpperCase() === ch;\nvar filterKey = (keys) => (key) => keys.indexOf(key) === -1;\nvar omit = (obj, keys) => {\n const res = {};\n Object.keys(obj).filter(filterKey(keys)).forEach((key) => {\n res[key] = obj[key];\n });\n return res;\n};\nfunction filterProps(asIs, props, omitKeys) {\n const filteredProps = omit(props, omitKeys);\n if (!asIs) {\n const interopValidAttr = typeof validAttr === \"function\" ? { default: validAttr } : validAttr;\n Object.keys(filteredProps).forEach((key) => {\n if (!interopValidAttr.default(key)) {\n delete filteredProps[key];\n }\n });\n }\n return filteredProps;\n}\nvar warnIfInvalid = (value, componentName) => {\n if (process.env.NODE_ENV !== \"production\") {\n if (typeof value === \"string\" || typeof value === \"number\" && isFinite(value)) {\n return;\n }\n const stringified = typeof value === \"object\" ? JSON.stringify(value) : String(value);\n console.warn(\n `An interpolation evaluated to '${stringified}' in the component '${componentName}', which is probably a mistake. You should explicitly cast or transform the value to a string.`\n );\n }\n};\nfunction styled(tag) {\n return (options) => {\n if (process.env.NODE_ENV !== \"production\") {\n if (Array.isArray(options)) {\n throw new Error(\n 'Using the \"styled\" tag in runtime is not supported. Make sure you have set up the Babel plugin correctly. See https://github.com/callstack/linaria#setup'\n );\n }\n }\n const render = (props, ref) => {\n const { as: component = tag, class: className } = props;\n const shouldKeepProps = options.propsAsIs === void 0 ? !(typeof component === \"string\" && component.indexOf(\"-\") === -1 && !isCapital(component[0])) : options.propsAsIs;\n const filteredProps = filterProps(shouldKeepProps, props, [\n \"as\",\n \"class\"\n ]);\n filteredProps.ref = ref;\n filteredProps.className = options.atomic ? cx(options.class, filteredProps.className || className) : cx(filteredProps.className || className, options.class);\n const { vars } = options;\n if (vars) {\n const style = {};\n for (const name in vars) {\n const variable = vars[name];\n const result = variable[0];\n const unit = variable[1] || \"\";\n const value = typeof result === \"function\" ? result(props) : result;\n warnIfInvalid(value, options.name);\n style[`--${name}`] = `${value}${unit}`;\n }\n const ownStyle = filteredProps.style || {};\n const keys = Object.keys(ownStyle);\n if (keys.length > 0) {\n keys.forEach((key) => {\n style[key] = ownStyle[key];\n });\n }\n filteredProps.style = style;\n }\n if (tag.__linaria && tag !== component) {\n filteredProps.as = component;\n return React.createElement(tag, filteredProps);\n }\n return React.createElement(component, filteredProps);\n };\n const Result = React.forwardRef ? React.forwardRef(render) : (props) => {\n const rest = omit(props, [\"innerRef\"]);\n return render(rest, props.innerRef);\n };\n Result.displayName = options.name;\n Result.__linaria = {\n className: options.class,\n extends: tag\n };\n return Result;\n };\n}\nvar styled_default = process.env.NODE_ENV !== \"production\" ? new Proxy(styled, {\n get(o, prop) {\n return o(prop);\n }\n}) : styled;\nexport {\n styled_default as styled\n};\n//# sourceMappingURL=index.mjs.map","// src/css.ts\nvar css = () => {\n throw new Error(\n 'Using the \"css\" tag in runtime is not supported. Make sure you have set up the Babel plugin correctly.'\n );\n};\nvar css_default = css;\n\n// src/cx.ts\nvar cx = function cx2() {\n const presentClassNames = Array.prototype.slice.call(arguments).filter(Boolean);\n const atomicClasses = {};\n const nonAtomicClasses = [];\n presentClassNames.forEach((arg) => {\n const individualClassNames = arg ? arg.split(\" \") : [];\n individualClassNames.forEach((className) => {\n if (className.startsWith(\"atm_\")) {\n const [, keyHash] = className.split(\"_\");\n atomicClasses[keyHash] = className;\n } else {\n nonAtomicClasses.push(className);\n }\n });\n });\n const result = [];\n for (const keyHash in atomicClasses) {\n if (Object.prototype.hasOwnProperty.call(atomicClasses, keyHash)) {\n result.push(atomicClasses[keyHash]);\n }\n }\n result.push(...nonAtomicClasses);\n return result.join(\" \");\n};\nvar cx_default = cx;\nexport {\n css_default as css,\n cx_default as cx\n};\n//# sourceMappingURL=index.mjs.map","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import elementorWidget from '../elementor/elementorWidget';\nimport registerFormWidget from '../elementor/FormWidget/registerFormWidget';\nimport { initBackgroundApp } from '../utils/backgroundAppUtils';\nimport registerMeetingsWidget from '../elementor/MeetingWidget/registerMeetingWidget';\nconst ELEMENTOR_READY_INTERVAL = 500;\nconst MAX_POLL_TIMEOUT = 30000;\nconst registerElementorWidgets = () => {\n initBackgroundApp(() => {\n let FormWidget;\n let MeetingsWidget;\n const leadinSelectFormItemView = elementorWidget(\n //@ts-expect-error global\n window.elementor, {\n widgetName: 'hubspot-form',\n controlSelector: '.elementor-hbspt-form-selector',\n containerSelector: '.hubspot-form-edit-mode',\n }, (controlContainer, widgetContainer, setValue) => {\n FormWidget = new registerFormWidget(controlContainer, widgetContainer, setValue);\n FormWidget.render();\n }, () => {\n FormWidget.done();\n });\n const leadinSelectMeetingItemView = elementorWidget(\n //@ts-expect-error global\n window.elementor, {\n widgetName: 'hubspot-meeting',\n controlSelector: '.elementor-hbspt-meeting-selector',\n containerSelector: '.hubspot-meeting-edit-mode',\n }, (controlContainer, widgetContainer, setValue) => {\n MeetingsWidget = new registerMeetingsWidget(controlContainer, widgetContainer, setValue);\n MeetingsWidget.render();\n }, () => {\n MeetingsWidget.done();\n });\n //@ts-expect-error global\n window.elementor.addControlView('leadinformselect', leadinSelectFormItemView);\n //@ts-expect-error global\n window.elementor.addControlView('leadinmeetingselect', leadinSelectMeetingItemView);\n });\n};\nconst pollForElementorReady = setInterval(() => {\n const elementorFrontend = window.elementorFrontend;\n if (elementorFrontend) {\n registerElementorWidgets();\n clearInterval(pollForElementorReady);\n }\n}, ELEMENTOR_READY_INTERVAL);\nsetTimeout(() => {\n clearInterval(pollForElementorReady);\n}, MAX_POLL_TIMEOUT);\n"],"names":["__","REGISTRATION_FORM","CONTACT_US_FORM","NEWSLETTER_FORM","SUPPORT_FORM","EVENT_FORM","DEFAULT_OPTIONS","label","options","value","isDefaultForm","window","leadinConfig","accountName","adminUrl","activationTime","connectionStatus","deviceId","didDisconnect","env","formsScript","meetingsScript","formsScriptPayload","hublet","hubspotBaseUrl","hubspotNonce","iframeUrl","impactLink","lastAuthorizeTime","lastDeauthorizeTime","lastDisconnectTime","leadinPluginVersion","leadinQueryParams","locale","loginUrl","phpVersion","pluginPath","plugins","portalDomain","portalEmail","portalId","redirectNonce","restNonce","restUrl","refreshToken","reviewSkippedDate","theme","trackConsent","wpVersion","contentEmbed","requiresContentEmbedScope","refreshTokenError","jsx","_jsx","ElementorBanner","ConnectPluginBanner","children","dangerouslySetInnerHTML","__html","replace","type","className","styled","Container","name","propsAsIs","ElementorButton","params","jsxs","_jsxs","Fragment","UISpinner","BackgroudAppContext","useBackgroundAppContext","useForms","getOrCreateBackgroundApp","ElementorFormSelect","formId","setAttributes","hasError","forms","loading","onChange","event","selectedForm","find","form","target","formName","disabled","selected","map","ElementorFormSelectWrapper","props","isBackgroundAppReady","ElementorFormSelectContainer","Provider","ConnectionStatus","Connected","NotConnected","FormControlController","attributes","setValue","render","ErrorHandler","FormEdit","FormWidgetController","isSelected","preview","origin","status","useState","useEffect","LoadState","ProxyMessages","usePostAsyncBackgroundMessage","proxy","NotLoaded","loadState","setLoadState","setError","setForms","key","FetchForms","payload","search","then","data","guid","Loaded","error","Failed","Loading","ReactDOM","registerFormWidget","controlContainer","widgetContainer","dataset","JSON","parse","unmountComponentAtNode","ElementorMeetingWarning","useMeetings","useSelectedMeetingCalendar","Raven","ElementorMeetingSelect","url","meetings","mappedMeetings","reload","connectCalendar","selectedMeetingCalendar","localUrl","setLocalUrl","handleConnectCalendar","captureMessage","extra","onConnectCalendar","length","newUrl","item","ElementorMeetingSelectWrapper","ElementorMeetingsSelectContainer","CURRENT_USER_CALENDAR_MISSING","MeetingWarning","isMeetingOwner","titleText","titleMessage","id","onClick","MeetingControlController","MeetingsEdit","MeetingWidgetController","registerMeetingsWidget","elementorWidget","elementor","callback","done","modules","controls","BaseData","extend","onReady","self","ui","contentEditable","prevObject","querySelector","controlSelector","element","$el","containerSelector","args","elementorFrontend","hooks","addAction","widgetName","saveValue","onBeforeDestroy","removeAction","CoreMessages","HandshakeReceive","SendRefreshToken","ReloadParentFrame","RedirectParentFrame","SendLocale","SendDeviceId","SendIntegratedAppConfig","FormMessages","CreateFormAppNavigation","LiveChatMessages","CreateLiveChatAppNavigation","PluginMessages","PluginSettingsNavigation","PluginLeadinConfig","TrackConsent","InternalTrackingFetchRequest","InternalTrackingFetchResponse","InternalTrackingFetchError","InternalTrackingChangeRequest","InternalTrackingChangeError","BusinessUnitFetchRequest","BusinessUnitFetchResponse","BusinessUnitFetchError","BusinessUnitChangeRequest","BusinessUnitChangeError","SkipReviewRequest","SkipReviewResponse","SkipReviewError","RemoveParentQueryParam","ContentEmbedInstallRequest","ContentEmbedInstallResponse","ContentEmbedInstallError","ContentEmbedActivationRequest","ContentEmbedActivationResponse","ContentEmbedActivationError","FetchForm","CreateFormFromTemplate","FetchAuth","FetchMeetingsAndUsers","FetchContactsCreateSinceActivation","FetchOrCreateMeetingUser","ConnectMeetingsCalendar","TrackFormPreviewRender","TrackFormCreatedFromTemplate","TrackFormCreationFailed","TrackMeetingPreviewRender","TrackSidebarMetaChange","TrackReviewBannerRender","TrackReviewBannerInteraction","TrackReviewBannerDismissed","TrackPluginDeactivation","createContext","useContext","usePostBackgroundMessage","app","message","postMessage","postAsyncMessage","configureRaven","indexOf","config","instrument","tryCatch","release","install","setTagsContext","v","php","wordpress","setExtraContext","hub","Object","keys","join","useRef","CALYPSO_LIGHT","CALYPSO_MEDIUM","_exp2","focused","_exp3","ControlContainer","vars","ValueContainer","Placeholder","SingleValue","IndicatorContainer","DropdownIndicator","InputContainer","Input","InputShadow","MenuContainer","MenuList","MenuGroup","MenuGroupHeader","_exp5","_exp6","_exp7","MenuItem","AsyncSelect","placeholder","loadOptions","defaultOptions","inputEl","inputShadowEl","isFocused","setFocus","localValue","setLocalValue","setOptions","inputSize","current","clientWidth","result","Idle","renderItems","items","parentKey","index","undefined","blur","focus","ref","onFocus","e","width","UIButton","UIContainer","HubspotWrapper","redirectToPlugin","location","href","resetErrorState","errorInfo","header","action","isUnauthorized","errorHeader","errorMessage","textAlign","_exp","padding","LoadingBlock","size","UISpacer","PreviewForm","FormSelect","formSelected","monitorFormPreviewRender","handleChange","FormEditContainer","FormSelector","useCreateFormFromTemplate","formApiError","reset","createFormByTemplate","createReset","isCreating","createApiError","handleLocalChange","option","UIOverlay","useFormScript","ready","innerHTML","embedScript","document","createElement","appendChild","track","setFormApiError","err","debounce","trailing","$","promise","loadFormsScript","Promise","resolve","reject","getScript","fail","setReady","captureException","MeetingSelector","useSelectedMeeting","MeetingController","selectedMeetingOption","PreviewMeeting","MeetingEdit","MeetingsEditContainer","optionsWrapper","UIAlert","use","useMeetingsScript","container","src","classList","add","OTHER_USER_CALENDAR_MISSING","user","useCurrentUserFetch","createUser","loadUserState","useCallback","useMeetingsFetch","getDefaultMeetingName","meeting","currentUser","meetingUsers","meetingsUserIds","meetingOwnerId","userProfile","fullName","hasCalendarObject","meetingsUserBlob","calendarSettings","email","meetingsError","loadMeetingsState","reloadMeetings","userError","reloadUser","meet","link","mappedMeetingUsersId","reduce","p","c","includes","some","meetingLinks","loadMeetingsScript","AlertContainer","Title","Message","MessageContainer","HEFFALUMP","LORAX","CALYPSO","SpinnerOuter","SpinnerInner","color","Circle","AnimatedCircle","height","viewBox","cx","cy","r","OLAF","MARIGOLD_LIGHT","MARIGOLD_MEDIUM","OBSIDIAN","initApp","initFn","context","initAppOnReady","main","initBackgroundApp","Array","isArray","forEach","LeadinBackgroundApp","IntegratedAppEmbedder","IntegratedAppOptions","setLocale","setDeviceId","setRefreshToken","embedder","attachTo","body","postStartAppMessage","ELEMENTOR_READY_INTERVAL","MAX_POLL_TIMEOUT","registerElementorWidgets","FormWidget","MeetingsWidget","leadinSelectFormItemView","leadinSelectMeetingItemView","addControlView","pollForElementorReady","setInterval","clearInterval","setTimeout"],"sourceRoot":""} \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/feedback.asset.php b/wp/wp-content/plugins/leadin/build/feedback.asset.php deleted file mode 100644 index da996289..00000000 --- a/wp/wp-content/plugins/leadin/build/feedback.asset.php +++ /dev/null @@ -1 +0,0 @@ - array('jquery'), 'version' => 'ca3b833db9b6700d47fa'); diff --git a/wp/wp-content/plugins/leadin/build/feedback.js b/wp/wp-content/plugins/leadin/build/feedback.js deleted file mode 100644 index 1ad4a84c..00000000 --- a/wp/wp-content/plugins/leadin/build/feedback.js +++ /dev/null @@ -1,3840 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./scripts/constants/leadinConfig.ts": -/*!*******************************************!*\ - !*** ./scripts/constants/leadinConfig.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "accountName": () => (/* binding */ accountName), -/* harmony export */ "activationTime": () => (/* binding */ activationTime), -/* harmony export */ "adminUrl": () => (/* binding */ adminUrl), -/* harmony export */ "connectionStatus": () => (/* binding */ connectionStatus), -/* harmony export */ "contentEmbed": () => (/* binding */ contentEmbed), -/* harmony export */ "deviceId": () => (/* binding */ deviceId), -/* harmony export */ "didDisconnect": () => (/* binding */ didDisconnect), -/* harmony export */ "env": () => (/* binding */ env), -/* harmony export */ "formsScript": () => (/* binding */ formsScript), -/* harmony export */ "formsScriptPayload": () => (/* binding */ formsScriptPayload), -/* harmony export */ "hublet": () => (/* binding */ hublet), -/* harmony export */ "hubspotBaseUrl": () => (/* binding */ hubspotBaseUrl), -/* harmony export */ "hubspotNonce": () => (/* binding */ hubspotNonce), -/* harmony export */ "iframeUrl": () => (/* binding */ iframeUrl), -/* harmony export */ "impactLink": () => (/* binding */ impactLink), -/* harmony export */ "lastAuthorizeTime": () => (/* binding */ lastAuthorizeTime), -/* harmony export */ "lastDeauthorizeTime": () => (/* binding */ lastDeauthorizeTime), -/* harmony export */ "lastDisconnectTime": () => (/* binding */ lastDisconnectTime), -/* harmony export */ "leadinPluginVersion": () => (/* binding */ leadinPluginVersion), -/* harmony export */ "leadinQueryParams": () => (/* binding */ leadinQueryParams), -/* harmony export */ "locale": () => (/* binding */ locale), -/* harmony export */ "loginUrl": () => (/* binding */ loginUrl), -/* harmony export */ "meetingsScript": () => (/* binding */ meetingsScript), -/* harmony export */ "phpVersion": () => (/* binding */ phpVersion), -/* harmony export */ "pluginPath": () => (/* binding */ pluginPath), -/* harmony export */ "plugins": () => (/* binding */ plugins), -/* harmony export */ "portalDomain": () => (/* binding */ portalDomain), -/* harmony export */ "portalEmail": () => (/* binding */ portalEmail), -/* harmony export */ "portalId": () => (/* binding */ portalId), -/* harmony export */ "redirectNonce": () => (/* binding */ redirectNonce), -/* harmony export */ "refreshToken": () => (/* binding */ refreshToken), -/* harmony export */ "refreshTokenError": () => (/* binding */ refreshTokenError), -/* harmony export */ "requiresContentEmbedScope": () => (/* binding */ requiresContentEmbedScope), -/* harmony export */ "restNonce": () => (/* binding */ restNonce), -/* harmony export */ "restUrl": () => (/* binding */ restUrl), -/* harmony export */ "reviewSkippedDate": () => (/* binding */ reviewSkippedDate), -/* harmony export */ "theme": () => (/* binding */ theme), -/* harmony export */ "trackConsent": () => (/* binding */ trackConsent), -/* harmony export */ "wpVersion": () => (/* binding */ wpVersion) -/* harmony export */ }); -var _window$leadinConfig = window.leadinConfig, - accountName = _window$leadinConfig.accountName, - adminUrl = _window$leadinConfig.adminUrl, - activationTime = _window$leadinConfig.activationTime, - connectionStatus = _window$leadinConfig.connectionStatus, - deviceId = _window$leadinConfig.deviceId, - didDisconnect = _window$leadinConfig.didDisconnect, - env = _window$leadinConfig.env, - formsScript = _window$leadinConfig.formsScript, - meetingsScript = _window$leadinConfig.meetingsScript, - formsScriptPayload = _window$leadinConfig.formsScriptPayload, - hublet = _window$leadinConfig.hublet, - hubspotBaseUrl = _window$leadinConfig.hubspotBaseUrl, - hubspotNonce = _window$leadinConfig.hubspotNonce, - iframeUrl = _window$leadinConfig.iframeUrl, - impactLink = _window$leadinConfig.impactLink, - lastAuthorizeTime = _window$leadinConfig.lastAuthorizeTime, - lastDeauthorizeTime = _window$leadinConfig.lastDeauthorizeTime, - lastDisconnectTime = _window$leadinConfig.lastDisconnectTime, - leadinPluginVersion = _window$leadinConfig.leadinPluginVersion, - leadinQueryParams = _window$leadinConfig.leadinQueryParams, - locale = _window$leadinConfig.locale, - loginUrl = _window$leadinConfig.loginUrl, - phpVersion = _window$leadinConfig.phpVersion, - pluginPath = _window$leadinConfig.pluginPath, - plugins = _window$leadinConfig.plugins, - portalDomain = _window$leadinConfig.portalDomain, - portalEmail = _window$leadinConfig.portalEmail, - portalId = _window$leadinConfig.portalId, - redirectNonce = _window$leadinConfig.redirectNonce, - restNonce = _window$leadinConfig.restNonce, - restUrl = _window$leadinConfig.restUrl, - refreshToken = _window$leadinConfig.refreshToken, - reviewSkippedDate = _window$leadinConfig.reviewSkippedDate, - theme = _window$leadinConfig.theme, - trackConsent = _window$leadinConfig.trackConsent, - wpVersion = _window$leadinConfig.wpVersion, - contentEmbed = _window$leadinConfig.contentEmbed, - requiresContentEmbedScope = _window$leadinConfig.requiresContentEmbedScope, - refreshTokenError = _window$leadinConfig.refreshTokenError; - - -/***/ }), - -/***/ "./scripts/constants/selectors.ts": -/*!****************************************!*\ - !*** ./scripts/constants/selectors.ts ***! - \****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "domElements": () => (/* binding */ domElements) -/* harmony export */ }); -var domElements = { - iframe: '#leadin-iframe', - subMenu: '.toplevel_page_leadin > ul', - subMenuLinks: '.toplevel_page_leadin > ul a', - subMenuButtons: '.toplevel_page_leadin > ul > li', - deactivatePluginButton: '[data-slug="leadin"] .deactivate a', - deactivateFeedbackForm: 'form.leadin-deactivate-form', - deactivateFeedbackSubmit: 'button#leadin-feedback-submit', - deactivateFeedbackSkip: 'button#leadin-feedback-skip', - thickboxModalClose: '.leadin-modal-close', - thickboxModalWindow: 'div#TB_window.thickbox-loading', - thickboxModalContent: 'div#TB_ajaxContent.TB_modal', - reviewBannerContainer: '#leadin-review-banner', - reviewBannerLeaveReviewLink: 'a#leave-review-button', - reviewBannerDismissButton: 'a#dismiss-review-banner-button', - leadinIframeContainer: 'leadin-iframe-container', - leadinIframe: 'leadin-iframe', - leadinIframeFallbackContainer: 'leadin-iframe-fallback-container' -}; - -/***/ }), - -/***/ "./scripts/feedback/ThickBoxModal.ts": -/*!*******************************************!*\ - !*** ./scripts/feedback/ThickBoxModal.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ ThickBoxModal) -/* harmony export */ }); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _constants_selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/selectors */ "./scripts/constants/selectors.ts"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - - - -var ThickBoxModal = /*#__PURE__*/function () { - function ThickBoxModal(openTriggerSelector, inlineContentId, windowCssClass, contentCssClass) { - _classCallCheck(this, ThickBoxModal); - - _defineProperty(this, "openTriggerSelector", void 0); - - _defineProperty(this, "inlineContentId", void 0); - - _defineProperty(this, "windowCssClass", void 0); - - _defineProperty(this, "contentCssClass", void 0); - - this.openTriggerSelector = openTriggerSelector; - this.inlineContentId = inlineContentId; - this.windowCssClass = windowCssClass; - this.contentCssClass = contentCssClass; - jquery__WEBPACK_IMPORTED_MODULE_0___default()(openTriggerSelector).on('click', this.init.bind(this)); - } - - _createClass(ThickBoxModal, [{ - key: "close", - value: function close() { - //@ts-expect-error global - window.tb_remove(); - } - }, { - key: "init", - value: function init(e) { - //@ts-expect-error global - window.tb_show('', "#TB_inline?inlineId=".concat(this.inlineContentId, "&modal=true")); // thickbox doesn't respect the width and height url parameters https://core.trac.wordpress.org/ticket/17249 - // We override thickboxes css with !important in the css - - jquery__WEBPACK_IMPORTED_MODULE_0___default()(_constants_selectors__WEBPACK_IMPORTED_MODULE_1__.domElements.thickboxModalWindow).addClass(this.windowCssClass); // have to modify the css of the thickbox content container as well - - jquery__WEBPACK_IMPORTED_MODULE_0___default()(_constants_selectors__WEBPACK_IMPORTED_MODULE_1__.domElements.thickboxModalContent).addClass(this.contentCssClass); // we unbind previous handlers because a thickbox modal is a single global object. - // Everytime it is re-opened, it still has old handlers bound - - jquery__WEBPACK_IMPORTED_MODULE_0___default()(_constants_selectors__WEBPACK_IMPORTED_MODULE_1__.domElements.thickboxModalClose).off('click').on('click', this.close); - e.preventDefault(); - } - }]); - - return ThickBoxModal; -}(); - - - -/***/ }), - -/***/ "./scripts/feedback/feedbackFormApi.ts": -/*!*********************************************!*\ - !*** ./scripts/feedback/feedbackFormApi.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "submitFeedbackForm": () => (/* binding */ submitFeedbackForm) -/* harmony export */ }); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); - -var portalId = '6275621'; -var formId = '0e8807f8-2ac3-4664-b742-44552bfa09e2'; -var formSubmissionUrl = "https://api.hsforms.com/submissions/v3/integration/submit/".concat(portalId, "/").concat(formId); -function submitFeedbackForm(formSelector) { - var formSubmissionPayload = { - fields: jquery__WEBPACK_IMPORTED_MODULE_0___default()(formSelector).serializeArray(), - skipValidation: true - }; - return new Promise(function (resolve, reject) { - jquery__WEBPACK_IMPORTED_MODULE_0___default().ajax({ - type: 'POST', - url: formSubmissionUrl, - contentType: 'application/json', - data: JSON.stringify(formSubmissionPayload), - success: resolve, - error: reject - }); - }); -} - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/core/CoreMessages.ts": -/*!****************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/core/CoreMessages.ts ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CoreMessages": () => (/* binding */ CoreMessages) -/* harmony export */ }); -var CoreMessages = { - HandshakeReceive: 'INTEGRATED_APP_EMBEDDER_HANDSHAKE_RECEIVED', - SendRefreshToken: 'INTEGRATED_APP_EMBEDDER_SEND_REFRESH_TOKEN', - ReloadParentFrame: 'INTEGRATED_APP_EMBEDDER_RELOAD_PARENT_FRAME', - RedirectParentFrame: 'INTEGRATED_APP_EMBEDDER_REDIRECT_PARENT_FRAME', - SendLocale: 'INTEGRATED_APP_EMBEDDER_SEND_LOCALE', - SendDeviceId: 'INTEGRATED_APP_EMBEDDER_SEND_DEVICE_ID', - SendIntegratedAppConfig: 'INTEGRATED_APP_EMBEDDER_CONFIG' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/forms/FormsMessages.ts": -/*!******************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/forms/FormsMessages.ts ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "FormMessages": () => (/* binding */ FormMessages) -/* harmony export */ }); -var FormMessages = { - CreateFormAppNavigation: 'CREATE_FORM_APP_NAVIGATION' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/index.ts": -/*!****************************************************!*\ - !*** ./scripts/iframe/integratedMessages/index.ts ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CoreMessages": () => (/* reexport safe */ _core_CoreMessages__WEBPACK_IMPORTED_MODULE_0__.CoreMessages), -/* harmony export */ "FormMessages": () => (/* reexport safe */ _forms_FormsMessages__WEBPACK_IMPORTED_MODULE_1__.FormMessages), -/* harmony export */ "LiveChatMessages": () => (/* reexport safe */ _livechat_LiveChatMessages__WEBPACK_IMPORTED_MODULE_2__.LiveChatMessages), -/* harmony export */ "PluginMessages": () => (/* reexport safe */ _plugin_PluginMessages__WEBPACK_IMPORTED_MODULE_3__.PluginMessages), -/* harmony export */ "ProxyMessages": () => (/* reexport safe */ _proxy_ProxyMessages__WEBPACK_IMPORTED_MODULE_4__.ProxyMessages) -/* harmony export */ }); -/* harmony import */ var _core_CoreMessages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/CoreMessages */ "./scripts/iframe/integratedMessages/core/CoreMessages.ts"); -/* harmony import */ var _forms_FormsMessages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./forms/FormsMessages */ "./scripts/iframe/integratedMessages/forms/FormsMessages.ts"); -/* harmony import */ var _livechat_LiveChatMessages__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./livechat/LiveChatMessages */ "./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts"); -/* harmony import */ var _plugin_PluginMessages__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./plugin/PluginMessages */ "./scripts/iframe/integratedMessages/plugin/PluginMessages.ts"); -/* harmony import */ var _proxy_ProxyMessages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./proxy/ProxyMessages */ "./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts"); - - - - - - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts": -/*!************************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "LiveChatMessages": () => (/* binding */ LiveChatMessages) -/* harmony export */ }); -var LiveChatMessages = { - CreateLiveChatAppNavigation: 'CREATE_LIVE_CHAT_APP_NAVIGATION' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/plugin/PluginMessages.ts": -/*!********************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/plugin/PluginMessages.ts ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "PluginMessages": () => (/* binding */ PluginMessages) -/* harmony export */ }); -var PluginMessages = { - PluginSettingsNavigation: 'PLUGIN_SETTINGS_NAVIGATION', - PluginLeadinConfig: 'PLUGIN_LEADIN_CONFIG', - TrackConsent: 'INTEGRATED_APP_EMBEDDER_TRACK_CONSENT', - InternalTrackingFetchRequest: 'INTEGRATED_TRACKING_FETCH_REQUEST', - InternalTrackingFetchResponse: 'INTEGRATED_TRACKING_FETCH_RESPONSE', - InternalTrackingFetchError: 'INTEGRATED_TRACKING_FETCH_ERROR', - InternalTrackingChangeRequest: 'INTEGRATED_TRACKING_CHANGE_REQUEST', - InternalTrackingChangeError: 'INTEGRATED_TRACKING_CHANGE_ERROR', - BusinessUnitFetchRequest: 'BUSINESS_UNIT_FETCH_REQUEST', - BusinessUnitFetchResponse: 'BUSINESS_UNIT_FETCH_FETCH_RESPONSE', - BusinessUnitFetchError: 'BUSINESS_UNIT_FETCH_FETCH_ERROR', - BusinessUnitChangeRequest: 'BUSINESS_UNIT_CHANGE_REQUEST', - BusinessUnitChangeError: 'BUSINESS_UNIT_CHANGE_ERROR', - SkipReviewRequest: 'SKIP_REVIEW_REQUEST', - SkipReviewResponse: 'SKIP_REVIEW_RESPONSE', - SkipReviewError: 'SKIP_REVIEW_ERROR', - RemoveParentQueryParam: 'REMOVE_PARENT_QUERY_PARAM', - ContentEmbedInstallRequest: 'CONTENT_EMBED_INSTALL_REQUEST', - ContentEmbedInstallResponse: 'CONTENT_EMBED_INSTALL_RESPONSE', - ContentEmbedInstallError: 'CONTENT_EMBED_INSTALL_ERROR', - ContentEmbedActivationRequest: 'CONTENT_EMBED_ACTIVATION_REQUEST', - ContentEmbedActivationResponse: 'CONTENT_EMBED_ACTIVATION_RESPONSE', - ContentEmbedActivationError: 'CONTENT_EMBED_ACTIVATION_ERROR' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts": -/*!******************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ProxyMessages": () => (/* binding */ ProxyMessages) -/* harmony export */ }); -var ProxyMessages = { - FetchForms: 'FETCH_FORMS', - FetchForm: 'FETCH_FORM', - CreateFormFromTemplate: 'CREATE_FORM_FROM_TEMPLATE', - FetchAuth: 'FETCH_AUTH', - FetchMeetingsAndUsers: 'FETCH_MEETINGS_AND_USERS', - FetchContactsCreateSinceActivation: 'FETCH_CONTACTS_CREATED_SINCE_ACTIVATION', - FetchOrCreateMeetingUser: 'FETCH_OR_CREATE_MEETING_USER', - ConnectMeetingsCalendar: 'CONNECT_MEETINGS_CALENDAR', - TrackFormPreviewRender: 'TRACK_FORM_PREVIEW_RENDER', - TrackFormCreatedFromTemplate: 'TRACK_FORM_CREATED_FROM_TEMPLATE', - TrackFormCreationFailed: 'TRACK_FORM_CREATION_FAILED', - TrackMeetingPreviewRender: 'TRACK_MEETING_PREVIEW_RENDER', - TrackSidebarMetaChange: 'TRACK_SIDEBAR_META_CHANGE', - TrackReviewBannerRender: 'TRACK_REVIEW_BANNER_RENDER', - TrackReviewBannerInteraction: 'TRACK_REVIEW_BANNER_INTERACTION', - TrackReviewBannerDismissed: 'TRACK_REVIEW_BANNER_DISMISSED', - TrackPluginDeactivation: 'TRACK_PLUGIN_DEACTIVATION' -}; - -/***/ }), - -/***/ "./scripts/lib/Raven.ts": -/*!******************************!*\ - !*** ./scripts/lib/Raven.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "configureRaven": () => (/* binding */ configureRaven), -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! raven-js */ "./node_modules/raven-js/src/singleton.js"); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(raven_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); - - -function configureRaven() { - if (_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.hubspotBaseUrl.indexOf('app.hubspot.com') === -1) { - return; - } - - raven_js__WEBPACK_IMPORTED_MODULE_0___default().config('https://e9b8f382cdd130c0d415cd977d2be56f@exceptions.hubspot.com/1', { - instrument: { - tryCatch: false - }, - release: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.leadinPluginVersion - }).install(); - raven_js__WEBPACK_IMPORTED_MODULE_0___default().setTagsContext({ - v: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.leadinPluginVersion, - php: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.phpVersion, - wordpress: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.wpVersion - }); - raven_js__WEBPACK_IMPORTED_MODULE_0___default().setExtraContext({ - hub: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.portalId, - plugins: Object.keys(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.plugins).map(function (name) { - return "".concat(name, "#").concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.plugins[name]); - }).join(',') - }); -} -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((raven_js__WEBPACK_IMPORTED_MODULE_0___default())); - -/***/ }), - -/***/ "./scripts/utils/appUtils.ts": -/*!***********************************!*\ - !*** ./scripts/utils/appUtils.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "initApp": () => (/* binding */ initApp), -/* harmony export */ "initAppOnReady": () => (/* binding */ initAppOnReady) -/* harmony export */ }); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _lib_Raven__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/Raven */ "./scripts/lib/Raven.ts"); - - -function initApp(initFn) { - (0,_lib_Raven__WEBPACK_IMPORTED_MODULE_1__.configureRaven)(); - _lib_Raven__WEBPACK_IMPORTED_MODULE_1__["default"].context(initFn); -} -function initAppOnReady(initFn) { - function main() { - jquery__WEBPACK_IMPORTED_MODULE_0___default()(initFn); - } - - initApp(main); -} - -/***/ }), - -/***/ "./scripts/utils/backgroundAppUtils.ts": -/*!*********************************************!*\ - !*** ./scripts/utils/backgroundAppUtils.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "getOrCreateBackgroundApp": () => (/* binding */ getOrCreateBackgroundApp), -/* harmony export */ "initBackgroundApp": () => (/* binding */ initBackgroundApp) -/* harmony export */ }); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _appUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./appUtils */ "./scripts/utils/appUtils.ts"); - - -function initBackgroundApp(initFn) { - function main() { - if (Array.isArray(initFn)) { - initFn.forEach(function (callback) { - return callback(); - }); - } else { - initFn(); - } - } - - (0,_appUtils__WEBPACK_IMPORTED_MODULE_1__.initApp)(main); -} -var getOrCreateBackgroundApp = function getOrCreateBackgroundApp(refreshToken) { - if (window.LeadinBackgroundApp) { - return window.LeadinBackgroundApp; - } - - var _window = window, - IntegratedAppEmbedder = _window.IntegratedAppEmbedder, - IntegratedAppOptions = _window.IntegratedAppOptions; - var options = new IntegratedAppOptions().setLocale(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.locale).setDeviceId(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.deviceId).setRefreshToken(refreshToken); - var embedder = new IntegratedAppEmbedder('integrated-plugin-proxy', _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.portalId, _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.hubspotBaseUrl, function () {}).setOptions(options); - embedder.attachTo(document.body, false); - embedder.postStartAppMessage(); // lets the app know all all data has been passed to it - - window.LeadinBackgroundApp = embedder; - return window.LeadinBackgroundApp; -}; - -/***/ }), - -/***/ "./node_modules/raven-js/src/configError.js": -/*!**************************************************!*\ - !*** ./node_modules/raven-js/src/configError.js ***! - \**************************************************/ -/***/ ((module) => { - -function RavenConfigError(message) { - this.name = 'RavenConfigError'; - this.message = message; -} -RavenConfigError.prototype = new Error(); -RavenConfigError.prototype.constructor = RavenConfigError; - -module.exports = RavenConfigError; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/console.js": -/*!**********************************************!*\ - !*** ./node_modules/raven-js/src/console.js ***! - \**********************************************/ -/***/ ((module) => { - -var wrapMethod = function(console, level, callback) { - var originalConsoleLevel = console[level]; - var originalConsole = console; - - if (!(level in console)) { - return; - } - - var sentryLevel = level === 'warn' ? 'warning' : level; - - console[level] = function() { - var args = [].slice.call(arguments); - - var msg = '' + args.join(' '); - var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}}; - - if (level === 'assert') { - if (args[0] === false) { - // Default browsers message - msg = 'Assertion failed: ' + (args.slice(1).join(' ') || 'console.assert'); - data.extra.arguments = args.slice(1); - callback && callback(msg, data); - } - } else { - callback && callback(msg, data); - } - - // this fails for some browsers. :( - if (originalConsoleLevel) { - // IE9 doesn't allow calling apply on console functions directly - // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193 - Function.prototype.apply.call(originalConsoleLevel, originalConsole, args); - } - }; -}; - -module.exports = { - wrapMethod: wrapMethod -}; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/raven.js": -/*!********************************************!*\ - !*** ./node_modules/raven-js/src/raven.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/*global XDomainRequest:false */ - -var TraceKit = __webpack_require__(/*! ../vendor/TraceKit/tracekit */ "./node_modules/raven-js/vendor/TraceKit/tracekit.js"); -var stringify = __webpack_require__(/*! ../vendor/json-stringify-safe/stringify */ "./node_modules/raven-js/vendor/json-stringify-safe/stringify.js"); -var RavenConfigError = __webpack_require__(/*! ./configError */ "./node_modules/raven-js/src/configError.js"); - -var utils = __webpack_require__(/*! ./utils */ "./node_modules/raven-js/src/utils.js"); -var isError = utils.isError; -var isObject = utils.isObject; -var isObject = utils.isObject; -var isErrorEvent = utils.isErrorEvent; -var isUndefined = utils.isUndefined; -var isFunction = utils.isFunction; -var isString = utils.isString; -var isEmptyObject = utils.isEmptyObject; -var each = utils.each; -var objectMerge = utils.objectMerge; -var truncate = utils.truncate; -var objectFrozen = utils.objectFrozen; -var hasKey = utils.hasKey; -var joinRegExp = utils.joinRegExp; -var urlencode = utils.urlencode; -var uuid4 = utils.uuid4; -var htmlTreeAsString = utils.htmlTreeAsString; -var isSameException = utils.isSameException; -var isSameStacktrace = utils.isSameStacktrace; -var parseUrl = utils.parseUrl; -var fill = utils.fill; - -var wrapConsoleMethod = (__webpack_require__(/*! ./console */ "./node_modules/raven-js/src/console.js").wrapMethod); - -var dsnKeys = 'source protocol user pass host port path'.split(' '), - dsnPattern = /^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/; - -function now() { - return +new Date(); -} - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; -var _document = _window.document; -var _navigator = _window.navigator; - -function keepOriginalCallback(original, callback) { - return isFunction(callback) - ? function(data) { - return callback(data, original); - } - : callback; -} - -// First, check for JSON support -// If there is no JSON, we no-op the core features of Raven -// since JSON is required to encode the payload -function Raven() { - this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify); - // Raven can run in contexts where there's no document (react-native) - this._hasDocument = !isUndefined(_document); - this._hasNavigator = !isUndefined(_navigator); - this._lastCapturedException = null; - this._lastData = null; - this._lastEventId = null; - this._globalServer = null; - this._globalKey = null; - this._globalProject = null; - this._globalContext = {}; - this._globalOptions = { - logger: 'javascript', - ignoreErrors: [], - ignoreUrls: [], - whitelistUrls: [], - includePaths: [], - collectWindowErrors: true, - maxMessageLength: 0, - - // By default, truncates URL values to 250 chars - maxUrlLength: 250, - stackTraceLimit: 50, - autoBreadcrumbs: true, - instrument: true, - sampleRate: 1 - }; - this._ignoreOnError = 0; - this._isRavenInstalled = false; - this._originalErrorStackTraceLimit = Error.stackTraceLimit; - // capture references to window.console *and* all its methods first - // before the console plugin has a chance to monkey patch - this._originalConsole = _window.console || {}; - this._originalConsoleMethods = {}; - this._plugins = []; - this._startTime = now(); - this._wrappedBuiltIns = []; - this._breadcrumbs = []; - this._lastCapturedEvent = null; - this._keypressTimeout; - this._location = _window.location; - this._lastHref = this._location && this._location.href; - this._resetBackoff(); - - // eslint-disable-next-line guard-for-in - for (var method in this._originalConsole) { - this._originalConsoleMethods[method] = this._originalConsole[method]; - } -} - -/* - * The core Raven singleton - * - * @this {Raven} - */ - -Raven.prototype = { - // Hardcode version string so that raven source can be loaded directly via - // webpack (using a build step causes webpack #1617). Grunt verifies that - // this value matches package.json during build. - // See: https://github.com/getsentry/raven-js/issues/465 - VERSION: '3.19.1', - - debug: false, - - TraceKit: TraceKit, // alias to TraceKit - - /* - * Configure Raven with a DSN and extra options - * - * @param {string} dsn The public Sentry DSN - * @param {object} options Set of global options [optional] - * @return {Raven} - */ - config: function(dsn, options) { - var self = this; - - if (self._globalServer) { - this._logDebug('error', 'Error: Raven has already been configured'); - return self; - } - if (!dsn) return self; - - var globalOptions = self._globalOptions; - - // merge in options - if (options) { - each(options, function(key, value) { - // tags and extra are special and need to be put into context - if (key === 'tags' || key === 'extra' || key === 'user') { - self._globalContext[key] = value; - } else { - globalOptions[key] = value; - } - }); - } - - self.setDSN(dsn); - - // "Script error." is hard coded into browsers for errors that it can't read. - // this is the result of a script being pulled in from an external domain and CORS. - globalOptions.ignoreErrors.push(/^Script error\.?$/); - globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/); - - // join regexp rules into one big rule - globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors); - globalOptions.ignoreUrls = globalOptions.ignoreUrls.length - ? joinRegExp(globalOptions.ignoreUrls) - : false; - globalOptions.whitelistUrls = globalOptions.whitelistUrls.length - ? joinRegExp(globalOptions.whitelistUrls) - : false; - globalOptions.includePaths = joinRegExp(globalOptions.includePaths); - globalOptions.maxBreadcrumbs = Math.max( - 0, - Math.min(globalOptions.maxBreadcrumbs || 100, 100) - ); // default and hard limit is 100 - - var autoBreadcrumbDefaults = { - xhr: true, - console: true, - dom: true, - location: true - }; - - var autoBreadcrumbs = globalOptions.autoBreadcrumbs; - if ({}.toString.call(autoBreadcrumbs) === '[object Object]') { - autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs); - } else if (autoBreadcrumbs !== false) { - autoBreadcrumbs = autoBreadcrumbDefaults; - } - globalOptions.autoBreadcrumbs = autoBreadcrumbs; - - var instrumentDefaults = { - tryCatch: true - }; - - var instrument = globalOptions.instrument; - if ({}.toString.call(instrument) === '[object Object]') { - instrument = objectMerge(instrumentDefaults, instrument); - } else if (instrument !== false) { - instrument = instrumentDefaults; - } - globalOptions.instrument = instrument; - - TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors; - - // return for chaining - return self; - }, - - /* - * Installs a global window.onerror error handler - * to capture and report uncaught exceptions. - * At this point, install() is required to be called due - * to the way TraceKit is set up. - * - * @return {Raven} - */ - install: function() { - var self = this; - if (self.isSetup() && !self._isRavenInstalled) { - TraceKit.report.subscribe(function() { - self._handleOnErrorStackInfo.apply(self, arguments); - }); - if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) { - self._instrumentTryCatch(); - } - - if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs(); - - // Install all of the plugins - self._drainPlugins(); - - self._isRavenInstalled = true; - } - - Error.stackTraceLimit = self._globalOptions.stackTraceLimit; - return this; - }, - - /* - * Set the DSN (can be called multiple time unlike config) - * - * @param {string} dsn The public Sentry DSN - */ - setDSN: function(dsn) { - var self = this, - uri = self._parseDSN(dsn), - lastSlash = uri.path.lastIndexOf('/'), - path = uri.path.substr(1, lastSlash); - - self._dsn = dsn; - self._globalKey = uri.user; - self._globalSecret = uri.pass && uri.pass.substr(1); - self._globalProject = uri.path.substr(lastSlash + 1); - - self._globalServer = self._getGlobalServer(uri); - - self._globalEndpoint = - self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/'; - - // Reset backoff state since we may be pointing at a - // new project/server - this._resetBackoff(); - }, - - /* - * Wrap code within a context so Raven can capture errors - * reliably across domains that is executed immediately. - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The callback to be immediately executed within the context - * @param {array} args An array of arguments to be called with the callback [optional] - */ - context: function(options, func, args) { - if (isFunction(options)) { - args = func || []; - func = options; - options = undefined; - } - - return this.wrap(options, func).apply(this, args); - }, - - /* - * Wrap code within a context and returns back a new function to be executed - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The function to be wrapped in a new context - * @param {function} func A function to call before the try/catch wrapper [optional, private] - * @return {function} The newly wrapped functions with a context - */ - wrap: function(options, func, _before) { - var self = this; - // 1 argument has been passed, and it's not a function - // so just return it - if (isUndefined(func) && !isFunction(options)) { - return options; - } - - // options is optional - if (isFunction(options)) { - func = options; - options = undefined; - } - - // At this point, we've passed along 2 arguments, and the second one - // is not a function either, so we'll just return the second argument. - if (!isFunction(func)) { - return func; - } - - // We don't wanna wrap it twice! - try { - if (func.__raven__) { - return func; - } - - // If this has already been wrapped in the past, return that - if (func.__raven_wrapper__) { - return func.__raven_wrapper__; - } - } catch (e) { - // Just accessing custom props in some Selenium environments - // can cause a "Permission denied" exception (see raven-js#495). - // Bail on wrapping and return the function as-is (defers to window.onerror). - return func; - } - - function wrapped() { - var args = [], - i = arguments.length, - deep = !options || (options && options.deep !== false); - - if (_before && isFunction(_before)) { - _before.apply(this, arguments); - } - - // Recursively wrap all of a function's arguments that are - // functions themselves. - while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i]; - - try { - // Attempt to invoke user-land function - // NOTE: If you are a Sentry user, and you are seeing this stack frame, it - // means Raven caught an error invoking your application code. This is - // expected behavior and NOT indicative of a bug with Raven.js. - return func.apply(this, args); - } catch (e) { - self._ignoreNextOnError(); - self.captureException(e, options); - throw e; - } - } - - // copy over properties of the old function - for (var property in func) { - if (hasKey(func, property)) { - wrapped[property] = func[property]; - } - } - wrapped.prototype = func.prototype; - - func.__raven_wrapper__ = wrapped; - // Signal that this function has been wrapped already - // for both debugging and to prevent it to being wrapped twice - wrapped.__raven__ = true; - wrapped.__inner__ = func; - - return wrapped; - }, - - /* - * Uninstalls the global error handler. - * - * @return {Raven} - */ - uninstall: function() { - TraceKit.report.uninstall(); - - this._restoreBuiltIns(); - - Error.stackTraceLimit = this._originalErrorStackTraceLimit; - this._isRavenInstalled = false; - - return this; - }, - - /* - * Manually capture an exception and send it over to Sentry - * - * @param {error} ex An exception to be logged - * @param {object} options A specific set of options for this error [optional] - * @return {Raven} - */ - captureException: function(ex, options) { - // Cases for sending ex as a message, rather than an exception - var isNotError = !isError(ex); - var isNotErrorEvent = !isErrorEvent(ex); - var isErrorEventWithoutError = isErrorEvent(ex) && !ex.error; - - if ((isNotError && isNotErrorEvent) || isErrorEventWithoutError) { - return this.captureMessage( - ex, - objectMerge( - { - trimHeadFrames: 1, - stacktrace: true // if we fall back to captureMessage, default to attempting a new trace - }, - options - ) - ); - } - - // Get actual Error from ErrorEvent - if (isErrorEvent(ex)) ex = ex.error; - - // Store the raw exception object for potential debugging and introspection - this._lastCapturedException = ex; - - // TraceKit.report will re-raise any exception passed to it, - // which means you have to wrap it in try/catch. Instead, we - // can wrap it here and only re-raise if TraceKit.report - // raises an exception different from the one we asked to - // report on. - try { - var stack = TraceKit.computeStackTrace(ex); - this._handleStackInfo(stack, options); - } catch (ex1) { - if (ex !== ex1) { - throw ex1; - } - } - - return this; - }, - - /* - * Manually send a message to Sentry - * - * @param {string} msg A plain message to be captured in Sentry - * @param {object} options A specific set of options for this message [optional] - * @return {Raven} - */ - captureMessage: function(msg, options) { - // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an - // early call; we'll error on the side of logging anything called before configuration since it's - // probably something you should see: - if ( - !!this._globalOptions.ignoreErrors.test && - this._globalOptions.ignoreErrors.test(msg) - ) { - return; - } - - options = options || {}; - - var data = objectMerge( - { - message: msg + '' // Make sure it's actually a string - }, - options - ); - - var ex; - // Generate a "synthetic" stack trace from this point. - // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative - // of a bug with Raven.js. Sentry generates synthetic traces either by configuration, - // or if it catches a thrown object without a "stack" property. - try { - throw new Error(msg); - } catch (ex1) { - ex = ex1; - } - - // null exception name so `Error` isn't prefixed to msg - ex.name = null; - var stack = TraceKit.computeStackTrace(ex); - - // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1] - var initialCall = stack.stack[1]; - - var fileurl = (initialCall && initialCall.url) || ''; - - if ( - !!this._globalOptions.ignoreUrls.test && - this._globalOptions.ignoreUrls.test(fileurl) - ) { - return; - } - - if ( - !!this._globalOptions.whitelistUrls.test && - !this._globalOptions.whitelistUrls.test(fileurl) - ) { - return; - } - - if (this._globalOptions.stacktrace || (options && options.stacktrace)) { - options = objectMerge( - { - // fingerprint on msg, not stack trace (legacy behavior, could be - // revisited) - fingerprint: msg, - // since we know this is a synthetic trace, the top N-most frames - // MUST be from Raven.js, so mark them as in_app later by setting - // trimHeadFrames - trimHeadFrames: (options.trimHeadFrames || 0) + 1 - }, - options - ); - - var frames = this._prepareFrames(stack, options); - data.stacktrace = { - // Sentry expects frames oldest to newest - frames: frames.reverse() - }; - } - - // Fire away! - this._send(data); - - return this; - }, - - captureBreadcrumb: function(obj) { - var crumb = objectMerge( - { - timestamp: now() / 1000 - }, - obj - ); - - if (isFunction(this._globalOptions.breadcrumbCallback)) { - var result = this._globalOptions.breadcrumbCallback(crumb); - - if (isObject(result) && !isEmptyObject(result)) { - crumb = result; - } else if (result === false) { - return this; - } - } - - this._breadcrumbs.push(crumb); - if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) { - this._breadcrumbs.shift(); - } - return this; - }, - - addPlugin: function(plugin /*arg1, arg2, ... argN*/) { - var pluginArgs = [].slice.call(arguments, 1); - - this._plugins.push([plugin, pluginArgs]); - if (this._isRavenInstalled) { - this._drainPlugins(); - } - - return this; - }, - - /* - * Set/clear a user to be sent along with the payload. - * - * @param {object} user An object representing user data [optional] - * @return {Raven} - */ - setUserContext: function(user) { - // Intentionally do not merge here since that's an unexpected behavior. - this._globalContext.user = user; - - return this; - }, - - /* - * Merge extra attributes to be sent along with the payload. - * - * @param {object} extra An object representing extra data [optional] - * @return {Raven} - */ - setExtraContext: function(extra) { - this._mergeContext('extra', extra); - - return this; - }, - - /* - * Merge tags to be sent along with the payload. - * - * @param {object} tags An object representing tags [optional] - * @return {Raven} - */ - setTagsContext: function(tags) { - this._mergeContext('tags', tags); - - return this; - }, - - /* - * Clear all of the context. - * - * @return {Raven} - */ - clearContext: function() { - this._globalContext = {}; - - return this; - }, - - /* - * Get a copy of the current context. This cannot be mutated. - * - * @return {object} copy of context - */ - getContext: function() { - // lol javascript - return JSON.parse(stringify(this._globalContext)); - }, - - /* - * Set environment of application - * - * @param {string} environment Typically something like 'production'. - * @return {Raven} - */ - setEnvironment: function(environment) { - this._globalOptions.environment = environment; - - return this; - }, - - /* - * Set release version of application - * - * @param {string} release Typically something like a git SHA to identify version - * @return {Raven} - */ - setRelease: function(release) { - this._globalOptions.release = release; - - return this; - }, - - /* - * Set the dataCallback option - * - * @param {function} callback The callback to run which allows the - * data blob to be mutated before sending - * @return {Raven} - */ - setDataCallback: function(callback) { - var original = this._globalOptions.dataCallback; - this._globalOptions.dataCallback = keepOriginalCallback(original, callback); - return this; - }, - - /* - * Set the breadcrumbCallback option - * - * @param {function} callback The callback to run which allows filtering - * or mutating breadcrumbs - * @return {Raven} - */ - setBreadcrumbCallback: function(callback) { - var original = this._globalOptions.breadcrumbCallback; - this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback); - return this; - }, - - /* - * Set the shouldSendCallback option - * - * @param {function} callback The callback to run which allows - * introspecting the blob before sending - * @return {Raven} - */ - setShouldSendCallback: function(callback) { - var original = this._globalOptions.shouldSendCallback; - this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback); - return this; - }, - - /** - * Override the default HTTP transport mechanism that transmits data - * to the Sentry server. - * - * @param {function} transport Function invoked instead of the default - * `makeRequest` handler. - * - * @return {Raven} - */ - setTransport: function(transport) { - this._globalOptions.transport = transport; - - return this; - }, - - /* - * Get the latest raw exception that was captured by Raven. - * - * @return {error} - */ - lastException: function() { - return this._lastCapturedException; - }, - - /* - * Get the last event id - * - * @return {string} - */ - lastEventId: function() { - return this._lastEventId; - }, - - /* - * Determine if Raven is setup and ready to go. - * - * @return {boolean} - */ - isSetup: function() { - if (!this._hasJSON) return false; // needs JSON support - if (!this._globalServer) { - if (!this.ravenNotConfiguredError) { - this.ravenNotConfiguredError = true; - this._logDebug('error', 'Error: Raven has not been configured.'); - } - return false; - } - return true; - }, - - afterLoad: function() { - // TODO: remove window dependence? - - // Attempt to initialize Raven on load - var RavenConfig = _window.RavenConfig; - if (RavenConfig) { - this.config(RavenConfig.dsn, RavenConfig.config).install(); - } - }, - - showReportDialog: function(options) { - if ( - !_document // doesn't work without a document (React native) - ) - return; - - options = options || {}; - - var lastEventId = options.eventId || this.lastEventId(); - if (!lastEventId) { - throw new RavenConfigError('Missing eventId'); - } - - var dsn = options.dsn || this._dsn; - if (!dsn) { - throw new RavenConfigError('Missing DSN'); - } - - var encode = encodeURIComponent; - var qs = ''; - qs += '?eventId=' + encode(lastEventId); - qs += '&dsn=' + encode(dsn); - - var user = options.user || this._globalContext.user; - if (user) { - if (user.name) qs += '&name=' + encode(user.name); - if (user.email) qs += '&email=' + encode(user.email); - } - - var globalServer = this._getGlobalServer(this._parseDSN(dsn)); - - var script = _document.createElement('script'); - script.async = true; - script.src = globalServer + '/api/embed/error-page/' + qs; - (_document.head || _document.body).appendChild(script); - }, - - /**** Private functions ****/ - _ignoreNextOnError: function() { - var self = this; - this._ignoreOnError += 1; - setTimeout(function() { - // onerror should trigger before setTimeout - self._ignoreOnError -= 1; - }); - }, - - _triggerEvent: function(eventType, options) { - // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it - var evt, key; - - if (!this._hasDocument) return; - - options = options || {}; - - eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1); - - if (_document.createEvent) { - evt = _document.createEvent('HTMLEvents'); - evt.initEvent(eventType, true, true); - } else { - evt = _document.createEventObject(); - evt.eventType = eventType; - } - - for (key in options) - if (hasKey(options, key)) { - evt[key] = options[key]; - } - - if (_document.createEvent) { - // IE9 if standards - _document.dispatchEvent(evt); - } else { - // IE8 regardless of Quirks or Standards - // IE9 if quirks - try { - _document.fireEvent('on' + evt.eventType.toLowerCase(), evt); - } catch (e) { - // Do nothing - } - } - }, - - /** - * Wraps addEventListener to capture UI breadcrumbs - * @param evtName the event name (e.g. "click") - * @returns {Function} - * @private - */ - _breadcrumbEventHandler: function(evtName) { - var self = this; - return function(evt) { - // reset keypress timeout; e.g. triggering a 'click' after - // a 'keypress' will reset the keypress debounce so that a new - // set of keypresses can be recorded - self._keypressTimeout = null; - - // It's possible this handler might trigger multiple times for the same - // event (e.g. event propagation through node ancestors). Ignore if we've - // already captured the event. - if (self._lastCapturedEvent === evt) return; - - self._lastCapturedEvent = evt; - - // try/catch both: - // - accessing evt.target (see getsentry/raven-js#838, #768) - // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly - // can throw an exception in some circumstances. - var target; - try { - target = htmlTreeAsString(evt.target); - } catch (e) { - target = ''; - } - - self.captureBreadcrumb({ - category: 'ui.' + evtName, // e.g. ui.click, ui.input - message: target - }); - }; - }, - - /** - * Wraps addEventListener to capture keypress UI events - * @returns {Function} - * @private - */ - _keypressEventHandler: function() { - var self = this, - debounceDuration = 1000; // milliseconds - - // TODO: if somehow user switches keypress target before - // debounce timeout is triggered, we will only capture - // a single breadcrumb from the FIRST target (acceptable?) - return function(evt) { - var target; - try { - target = evt.target; - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - var tagName = target && target.tagName; - - // only consider keypress events on actual input elements - // this will disregard keypresses targeting body (e.g. tabbing - // through elements, hotkeys, etc) - if ( - !tagName || - (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable) - ) - return; - - // record first keypress in a series, but ignore subsequent - // keypresses until debounce clears - var timeout = self._keypressTimeout; - if (!timeout) { - self._breadcrumbEventHandler('input')(evt); - } - clearTimeout(timeout); - self._keypressTimeout = setTimeout(function() { - self._keypressTimeout = null; - }, debounceDuration); - }; - }, - - /** - * Captures a breadcrumb of type "navigation", normalizing input URLs - * @param to the originating URL - * @param from the target URL - * @private - */ - _captureUrlChange: function(from, to) { - var parsedLoc = parseUrl(this._location.href); - var parsedTo = parseUrl(to); - var parsedFrom = parseUrl(from); - - // because onpopstate only tells you the "new" (to) value of location.href, and - // not the previous (from) value, we need to track the value of the current URL - // state ourselves - this._lastHref = to; - - // Use only the path component of the URL if the URL matches the current - // document (almost all the time when using pushState) - if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) - to = parsedTo.relative; - if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) - from = parsedFrom.relative; - - this.captureBreadcrumb({ - category: 'navigation', - data: { - to: to, - from: from - } - }); - }, - - /** - * Wrap timer functions and event targets to catch errors and provide - * better metadata. - */ - _instrumentTryCatch: function() { - var self = this; - - var wrappedBuiltIns = self._wrappedBuiltIns; - - function wrapTimeFn(orig) { - return function(fn, t) { - // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - var originalCallback = args[0]; - if (isFunction(originalCallback)) { - args[0] = self.wrap(originalCallback); - } - - // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it - // also supports only two arguments and doesn't care what this is, so we - // can just call the original function directly. - if (orig.apply) { - return orig.apply(this, args); - } else { - return orig(args[0], args[1]); - } - }; - } - - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - - function wrapEventTarget(global) { - var proto = _window[global] && _window[global].prototype; - if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) { - fill( - proto, - 'addEventListener', - function(orig) { - return function(evtName, fn, capture, secure) { - // preserve arity - try { - if (fn && fn.handleEvent) { - fn.handleEvent = self.wrap(fn.handleEvent); - } - } catch (err) { - // can sometimes get 'Permission denied to access property "handle Event' - } - - // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs` - // so that we don't have more than one wrapper function - var before, clickHandler, keypressHandler; - - if ( - autoBreadcrumbs && - autoBreadcrumbs.dom && - (global === 'EventTarget' || global === 'Node') - ) { - // NOTE: generating multiple handlers per addEventListener invocation, should - // revisit and verify we can just use one (almost certainly) - clickHandler = self._breadcrumbEventHandler('click'); - keypressHandler = self._keypressEventHandler(); - before = function(evt) { - // need to intercept every DOM event in `before` argument, in case that - // same wrapped method is re-used for different events (e.g. mousemove THEN click) - // see #724 - if (!evt) return; - - var eventType; - try { - eventType = evt.type; - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - if (eventType === 'click') return clickHandler(evt); - else if (eventType === 'keypress') return keypressHandler(evt); - }; - } - return orig.call( - this, - evtName, - self.wrap(fn, undefined, before), - capture, - secure - ); - }; - }, - wrappedBuiltIns - ); - fill( - proto, - 'removeEventListener', - function(orig) { - return function(evt, fn, capture, secure) { - try { - fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn); - } catch (e) { - // ignore, accessing __raven_wrapper__ will throw in some Selenium environments - } - return orig.call(this, evt, fn, capture, secure); - }; - }, - wrappedBuiltIns - ); - } - } - - fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns); - fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns); - if (_window.requestAnimationFrame) { - fill( - _window, - 'requestAnimationFrame', - function(orig) { - return function(cb) { - return orig(self.wrap(cb)); - }; - }, - wrappedBuiltIns - ); - } - - // event targets borrowed from bugsnag-js: - // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666 - var eventTargets = [ - 'EventTarget', - 'Window', - 'Node', - 'ApplicationCache', - 'AudioTrackList', - 'ChannelMergerNode', - 'CryptoOperation', - 'EventSource', - 'FileReader', - 'HTMLUnknownElement', - 'IDBDatabase', - 'IDBRequest', - 'IDBTransaction', - 'KeyOperation', - 'MediaController', - 'MessagePort', - 'ModalWindow', - 'Notification', - 'SVGElementInstance', - 'Screen', - 'TextTrack', - 'TextTrackCue', - 'TextTrackList', - 'WebSocket', - 'WebSocketWorker', - 'Worker', - 'XMLHttpRequest', - 'XMLHttpRequestEventTarget', - 'XMLHttpRequestUpload' - ]; - for (var i = 0; i < eventTargets.length; i++) { - wrapEventTarget(eventTargets[i]); - } - }, - - /** - * Instrument browser built-ins w/ breadcrumb capturing - * - XMLHttpRequests - * - DOM interactions (click/typing) - * - window.location changes - * - console - * - * Can be disabled or individually configured via the `autoBreadcrumbs` config option - */ - _instrumentBreadcrumbs: function() { - var self = this; - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - - var wrappedBuiltIns = self._wrappedBuiltIns; - - function wrapProp(prop, xhr) { - if (prop in xhr && isFunction(xhr[prop])) { - fill(xhr, prop, function(orig) { - return self.wrap(orig); - }); // intentionally don't track filled methods on XHR instances - } - } - - if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) { - var xhrproto = XMLHttpRequest.prototype; - fill( - xhrproto, - 'open', - function(origOpen) { - return function(method, url) { - // preserve arity - - // if Sentry key appears in URL, don't capture - if (isString(url) && url.indexOf(self._globalKey) === -1) { - this.__raven_xhr = { - method: method, - url: url, - status_code: null - }; - } - - return origOpen.apply(this, arguments); - }; - }, - wrappedBuiltIns - ); - - fill( - xhrproto, - 'send', - function(origSend) { - return function(data) { - // preserve arity - var xhr = this; - - function onreadystatechangeHandler() { - if (xhr.__raven_xhr && xhr.readyState === 4) { - try { - // touching statusCode in some platforms throws - // an exception - xhr.__raven_xhr.status_code = xhr.status; - } catch (e) { - /* do nothing */ - } - - self.captureBreadcrumb({ - type: 'http', - category: 'xhr', - data: xhr.__raven_xhr - }); - } - } - - var props = ['onload', 'onerror', 'onprogress']; - for (var j = 0; j < props.length; j++) { - wrapProp(props[j], xhr); - } - - if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) { - fill( - xhr, - 'onreadystatechange', - function(orig) { - return self.wrap(orig, undefined, onreadystatechangeHandler); - } /* intentionally don't track this instrumentation */ - ); - } else { - // if onreadystatechange wasn't actually set by the page on this xhr, we - // are free to set our own and capture the breadcrumb - xhr.onreadystatechange = onreadystatechangeHandler; - } - - return origSend.apply(this, arguments); - }; - }, - wrappedBuiltIns - ); - } - - if (autoBreadcrumbs.xhr && 'fetch' in _window) { - fill( - _window, - 'fetch', - function(origFetch) { - return function(fn, t) { - // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - - var fetchInput = args[0]; - var method = 'GET'; - var url; - - if (typeof fetchInput === 'string') { - url = fetchInput; - } else if ('Request' in _window && fetchInput instanceof _window.Request) { - url = fetchInput.url; - if (fetchInput.method) { - method = fetchInput.method; - } - } else { - url = '' + fetchInput; - } - - if (args[1] && args[1].method) { - method = args[1].method; - } - - var fetchData = { - method: method, - url: url, - status_code: null - }; - - self.captureBreadcrumb({ - type: 'http', - category: 'fetch', - data: fetchData - }); - - return origFetch.apply(this, args).then(function(response) { - fetchData.status_code = response.status; - - return response; - }); - }; - }, - wrappedBuiltIns - ); - } - - // Capture breadcrumbs from any click that is unhandled / bubbled up all the way - // to the document. Do this before we instrument addEventListener. - if (autoBreadcrumbs.dom && this._hasDocument) { - if (_document.addEventListener) { - _document.addEventListener('click', self._breadcrumbEventHandler('click'), false); - _document.addEventListener('keypress', self._keypressEventHandler(), false); - } else { - // IE8 Compatibility - _document.attachEvent('onclick', self._breadcrumbEventHandler('click')); - _document.attachEvent('onkeypress', self._keypressEventHandler()); - } - } - - // record navigation (URL) changes - // NOTE: in Chrome App environment, touching history.pushState, *even inside - // a try/catch block*, will cause Chrome to output an error to console.error - // borrowed from: https://github.com/angular/angular.js/pull/13945/files - var chrome = _window.chrome; - var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime; - var hasPushAndReplaceState = - !isChromePackagedApp && - _window.history && - history.pushState && - history.replaceState; - if (autoBreadcrumbs.location && hasPushAndReplaceState) { - // TODO: remove onpopstate handler on uninstall() - var oldOnPopState = _window.onpopstate; - _window.onpopstate = function() { - var currentHref = self._location.href; - self._captureUrlChange(self._lastHref, currentHref); - - if (oldOnPopState) { - return oldOnPopState.apply(this, arguments); - } - }; - - var historyReplacementFunction = function(origHistFunction) { - // note history.pushState.length is 0; intentionally not declaring - // params to preserve 0 arity - return function(/* state, title, url */) { - var url = arguments.length > 2 ? arguments[2] : undefined; - - // url argument is optional - if (url) { - // coerce to string (this is what pushState does) - self._captureUrlChange(self._lastHref, url + ''); - } - - return origHistFunction.apply(this, arguments); - }; - }; - - fill(history, 'pushState', historyReplacementFunction, wrappedBuiltIns); - fill(history, 'replaceState', historyReplacementFunction, wrappedBuiltIns); - } - - if (autoBreadcrumbs.console && 'console' in _window && console.log) { - // console - var consoleMethodCallback = function(msg, data) { - self.captureBreadcrumb({ - message: msg, - level: data.level, - category: 'console' - }); - }; - - each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) { - wrapConsoleMethod(console, level, consoleMethodCallback); - }); - } - }, - - _restoreBuiltIns: function() { - // restore any wrapped builtins - var builtin; - while (this._wrappedBuiltIns.length) { - builtin = this._wrappedBuiltIns.shift(); - - var obj = builtin[0], - name = builtin[1], - orig = builtin[2]; - - obj[name] = orig; - } - }, - - _drainPlugins: function() { - var self = this; - - // FIX ME TODO - each(this._plugins, function(_, plugin) { - var installer = plugin[0]; - var args = plugin[1]; - installer.apply(self, [self].concat(args)); - }); - }, - - _parseDSN: function(str) { - var m = dsnPattern.exec(str), - dsn = {}, - i = 7; - - try { - while (i--) dsn[dsnKeys[i]] = m[i] || ''; - } catch (e) { - throw new RavenConfigError('Invalid DSN: ' + str); - } - - if (dsn.pass && !this._globalOptions.allowSecretKey) { - throw new RavenConfigError( - 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key' - ); - } - - return dsn; - }, - - _getGlobalServer: function(uri) { - // assemble the endpoint from the uri pieces - var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : ''); - - if (uri.protocol) { - globalServer = uri.protocol + ':' + globalServer; - } - return globalServer; - }, - - _handleOnErrorStackInfo: function() { - // if we are intentionally ignoring errors via onerror, bail out - if (!this._ignoreOnError) { - this._handleStackInfo.apply(this, arguments); - } - }, - - _handleStackInfo: function(stackInfo, options) { - var frames = this._prepareFrames(stackInfo, options); - - this._triggerEvent('handle', { - stackInfo: stackInfo, - options: options - }); - - this._processException( - stackInfo.name, - stackInfo.message, - stackInfo.url, - stackInfo.lineno, - frames, - options - ); - }, - - _prepareFrames: function(stackInfo, options) { - var self = this; - var frames = []; - if (stackInfo.stack && stackInfo.stack.length) { - each(stackInfo.stack, function(i, stack) { - var frame = self._normalizeFrame(stack, stackInfo.url); - if (frame) { - frames.push(frame); - } - }); - - // e.g. frames captured via captureMessage throw - if (options && options.trimHeadFrames) { - for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) { - frames[j].in_app = false; - } - } - } - frames = frames.slice(0, this._globalOptions.stackTraceLimit); - return frames; - }, - - _normalizeFrame: function(frame, stackInfoUrl) { - // normalize the frames data - var normalized = { - filename: frame.url, - lineno: frame.line, - colno: frame.column, - function: frame.func || '?' - }; - - // Case when we don't have any information about the error - // E.g. throwing a string or raw object, instead of an `Error` in Firefox - // Generating synthetic error doesn't add any value here - // - // We should probably somehow let a user know that they should fix their code - if (!frame.url) { - normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler - } - - normalized.in_app = !// determine if an exception came from outside of our app - // first we check the global includePaths list. - ( - (!!this._globalOptions.includePaths.test && - !this._globalOptions.includePaths.test(normalized.filename)) || - // Now we check for fun, if the function name is Raven or TraceKit - /(Raven|TraceKit)\./.test(normalized['function']) || - // finally, we do a last ditch effort and check for raven.min.js - /raven\.(min\.)?js$/.test(normalized.filename) - ); - - return normalized; - }, - - _processException: function(type, message, fileurl, lineno, frames, options) { - var prefixedMessage = (type ? type + ': ' : '') + (message || ''); - if ( - !!this._globalOptions.ignoreErrors.test && - (this._globalOptions.ignoreErrors.test(message) || - this._globalOptions.ignoreErrors.test(prefixedMessage)) - ) { - return; - } - - var stacktrace; - - if (frames && frames.length) { - fileurl = frames[0].filename || fileurl; - // Sentry expects frames oldest to newest - // and JS sends them as newest to oldest - frames.reverse(); - stacktrace = {frames: frames}; - } else if (fileurl) { - stacktrace = { - frames: [ - { - filename: fileurl, - lineno: lineno, - in_app: true - } - ] - }; - } - - if ( - !!this._globalOptions.ignoreUrls.test && - this._globalOptions.ignoreUrls.test(fileurl) - ) { - return; - } - - if ( - !!this._globalOptions.whitelistUrls.test && - !this._globalOptions.whitelistUrls.test(fileurl) - ) { - return; - } - - var data = objectMerge( - { - // sentry.interfaces.Exception - exception: { - values: [ - { - type: type, - value: message, - stacktrace: stacktrace - } - ] - }, - culprit: fileurl - }, - options - ); - - // Fire away! - this._send(data); - }, - - _trimPacket: function(data) { - // For now, we only want to truncate the two different messages - // but this could/should be expanded to just trim everything - var max = this._globalOptions.maxMessageLength; - if (data.message) { - data.message = truncate(data.message, max); - } - if (data.exception) { - var exception = data.exception.values[0]; - exception.value = truncate(exception.value, max); - } - - var request = data.request; - if (request) { - if (request.url) { - request.url = truncate(request.url, this._globalOptions.maxUrlLength); - } - if (request.Referer) { - request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength); - } - } - - if (data.breadcrumbs && data.breadcrumbs.values) - this._trimBreadcrumbs(data.breadcrumbs); - - return data; - }, - - /** - * Truncate breadcrumb values (right now just URLs) - */ - _trimBreadcrumbs: function(breadcrumbs) { - // known breadcrumb properties with urls - // TODO: also consider arbitrary prop values that start with (https?)?:// - var urlProps = ['to', 'from', 'url'], - urlProp, - crumb, - data; - - for (var i = 0; i < breadcrumbs.values.length; ++i) { - crumb = breadcrumbs.values[i]; - if ( - !crumb.hasOwnProperty('data') || - !isObject(crumb.data) || - objectFrozen(crumb.data) - ) - continue; - - data = objectMerge({}, crumb.data); - for (var j = 0; j < urlProps.length; ++j) { - urlProp = urlProps[j]; - if (data.hasOwnProperty(urlProp) && data[urlProp]) { - data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength); - } - } - breadcrumbs.values[i].data = data; - } - }, - - _getHttpData: function() { - if (!this._hasNavigator && !this._hasDocument) return; - var httpData = {}; - - if (this._hasNavigator && _navigator.userAgent) { - httpData.headers = { - 'User-Agent': navigator.userAgent - }; - } - - if (this._hasDocument) { - if (_document.location && _document.location.href) { - httpData.url = _document.location.href; - } - if (_document.referrer) { - if (!httpData.headers) httpData.headers = {}; - httpData.headers.Referer = _document.referrer; - } - } - - return httpData; - }, - - _resetBackoff: function() { - this._backoffDuration = 0; - this._backoffStart = null; - }, - - _shouldBackoff: function() { - return this._backoffDuration && now() - this._backoffStart < this._backoffDuration; - }, - - /** - * Returns true if the in-process data payload matches the signature - * of the previously-sent data - * - * NOTE: This has to be done at this level because TraceKit can generate - * data from window.onerror WITHOUT an exception object (IE8, IE9, - * other old browsers). This can take the form of an "exception" - * data object with a single frame (derived from the onerror args). - */ - _isRepeatData: function(current) { - var last = this._lastData; - - if ( - !last || - current.message !== last.message || // defined for captureMessage - current.culprit !== last.culprit // defined for captureException/onerror - ) - return false; - - // Stacktrace interface (i.e. from captureMessage) - if (current.stacktrace || last.stacktrace) { - return isSameStacktrace(current.stacktrace, last.stacktrace); - } else if (current.exception || last.exception) { - // Exception interface (i.e. from captureException/onerror) - return isSameException(current.exception, last.exception); - } - - return true; - }, - - _setBackoffState: function(request) { - // If we are already in a backoff state, don't change anything - if (this._shouldBackoff()) { - return; - } - - var status = request.status; - - // 400 - project_id doesn't exist or some other fatal - // 401 - invalid/revoked dsn - // 429 - too many requests - if (!(status === 400 || status === 401 || status === 429)) return; - - var retry; - try { - // If Retry-After is not in Access-Control-Expose-Headers, most - // browsers will throw an exception trying to access it - retry = request.getResponseHeader('Retry-After'); - retry = parseInt(retry, 10) * 1000; // Retry-After is returned in seconds - } catch (e) { - /* eslint no-empty:0 */ - } - - this._backoffDuration = retry - ? // If Sentry server returned a Retry-After value, use it - retry - : // Otherwise, double the last backoff duration (starts at 1 sec) - this._backoffDuration * 2 || 1000; - - this._backoffStart = now(); - }, - - _send: function(data) { - var globalOptions = this._globalOptions; - - var baseData = { - project: this._globalProject, - logger: globalOptions.logger, - platform: 'javascript' - }, - httpData = this._getHttpData(); - - if (httpData) { - baseData.request = httpData; - } - - // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload - if (data.trimHeadFrames) delete data.trimHeadFrames; - - data = objectMerge(baseData, data); - - // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge - data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags); - data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra); - - // Send along our own collected metadata with extra - data.extra['session:duration'] = now() - this._startTime; - - if (this._breadcrumbs && this._breadcrumbs.length > 0) { - // intentionally make shallow copy so that additions - // to breadcrumbs aren't accidentally sent in this request - data.breadcrumbs = { - values: [].slice.call(this._breadcrumbs, 0) - }; - } - - // If there are no tags/extra, strip the key from the payload alltogther. - if (isEmptyObject(data.tags)) delete data.tags; - - if (this._globalContext.user) { - // sentry.interfaces.User - data.user = this._globalContext.user; - } - - // Include the environment if it's defined in globalOptions - if (globalOptions.environment) data.environment = globalOptions.environment; - - // Include the release if it's defined in globalOptions - if (globalOptions.release) data.release = globalOptions.release; - - // Include server_name if it's defined in globalOptions - if (globalOptions.serverName) data.server_name = globalOptions.serverName; - - if (isFunction(globalOptions.dataCallback)) { - data = globalOptions.dataCallback(data) || data; - } - - // Why?????????? - if (!data || isEmptyObject(data)) { - return; - } - - // Check if the request should be filtered or not - if ( - isFunction(globalOptions.shouldSendCallback) && - !globalOptions.shouldSendCallback(data) - ) { - return; - } - - // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests), - // so drop requests until "cool-off" period has elapsed. - if (this._shouldBackoff()) { - this._logDebug('warn', 'Raven dropped error due to backoff: ', data); - return; - } - - if (typeof globalOptions.sampleRate === 'number') { - if (Math.random() < globalOptions.sampleRate) { - this._sendProcessedPayload(data); - } - } else { - this._sendProcessedPayload(data); - } - }, - - _getUuid: function() { - return uuid4(); - }, - - _sendProcessedPayload: function(data, callback) { - var self = this; - var globalOptions = this._globalOptions; - - if (!this.isSetup()) return; - - // Try and clean up the packet before sending by truncating long values - data = this._trimPacket(data); - - // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback, - // but this would require copying an un-truncated copy of the data packet, which can be - // arbitrarily deep (extra_data) -- could be worthwhile? will revisit - if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) { - this._logDebug('warn', 'Raven dropped repeat event: ', data); - return; - } - - // Send along an event_id if not explicitly passed. - // This event_id can be used to reference the error within Sentry itself. - // Set lastEventId after we know the error should actually be sent - this._lastEventId = data.event_id || (data.event_id = this._getUuid()); - - // Store outbound payload after trim - this._lastData = data; - - this._logDebug('debug', 'Raven about to send:', data); - - var auth = { - sentry_version: '7', - sentry_client: 'raven-js/' + this.VERSION, - sentry_key: this._globalKey - }; - - if (this._globalSecret) { - auth.sentry_secret = this._globalSecret; - } - - var exception = data.exception && data.exception.values[0]; - this.captureBreadcrumb({ - category: 'sentry', - message: exception - ? (exception.type ? exception.type + ': ' : '') + exception.value - : data.message, - event_id: data.event_id, - level: data.level || 'error' // presume error unless specified - }); - - var url = this._globalEndpoint; - (globalOptions.transport || this._makeRequest).call(this, { - url: url, - auth: auth, - data: data, - options: globalOptions, - onSuccess: function success() { - self._resetBackoff(); - - self._triggerEvent('success', { - data: data, - src: url - }); - callback && callback(); - }, - onError: function failure(error) { - self._logDebug('error', 'Raven transport failed to send: ', error); - - if (error.request) { - self._setBackoffState(error.request); - } - - self._triggerEvent('failure', { - data: data, - src: url - }); - error = error || new Error('Raven send failed (no additional details provided)'); - callback && callback(error); - } - }); - }, - - _makeRequest: function(opts) { - var request = _window.XMLHttpRequest && new _window.XMLHttpRequest(); - if (!request) return; - - // if browser doesn't support CORS (e.g. IE7), we are out of luck - var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined'; - - if (!hasCORS) return; - - var url = opts.url; - - if ('withCredentials' in request) { - request.onreadystatechange = function() { - if (request.readyState !== 4) { - return; - } else if (request.status === 200) { - opts.onSuccess && opts.onSuccess(); - } else if (opts.onError) { - var err = new Error('Sentry error code: ' + request.status); - err.request = request; - opts.onError(err); - } - }; - } else { - request = new XDomainRequest(); - // xdomainrequest cannot go http -> https (or vice versa), - // so always use protocol relative - url = url.replace(/^https?:/, ''); - - // onreadystatechange not supported by XDomainRequest - if (opts.onSuccess) { - request.onload = opts.onSuccess; - } - if (opts.onError) { - request.onerror = function() { - var err = new Error('Sentry error code: XDomainRequest'); - err.request = request; - opts.onError(err); - }; - } - } - - // NOTE: auth is intentionally sent as part of query string (NOT as custom - // HTTP header) so as to avoid preflight CORS requests - request.open('POST', url + '?' + urlencode(opts.auth)); - request.send(stringify(opts.data)); - }, - - _logDebug: function(level) { - if (this._originalConsoleMethods[level] && this.debug) { - // In IE<10 console methods do not have their own 'apply' method - Function.prototype.apply.call( - this._originalConsoleMethods[level], - this._originalConsole, - [].slice.call(arguments, 1) - ); - } - }, - - _mergeContext: function(key, context) { - if (isUndefined(context)) { - delete this._globalContext[key]; - } else { - this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context); - } - } -}; - -// Deprecations -Raven.prototype.setUser = Raven.prototype.setUserContext; -Raven.prototype.setReleaseContext = Raven.prototype.setRelease; - -module.exports = Raven; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/singleton.js": -/*!************************************************!*\ - !*** ./node_modules/raven-js/src/singleton.js ***! - \************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/** - * Enforces a single instance of the Raven client, and the - * main entry point for Raven. If you are a consumer of the - * Raven library, you SHOULD load this file (vs raven.js). - **/ - -var RavenConstructor = __webpack_require__(/*! ./raven */ "./node_modules/raven-js/src/raven.js"); - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; -var _Raven = _window.Raven; - -var Raven = new RavenConstructor(); - -/* - * Allow multiple versions of Raven to be installed. - * Strip Raven from the global context and returns the instance. - * - * @return {Raven} - */ -Raven.noConflict = function() { - _window.Raven = _Raven; - return Raven; -}; - -Raven.afterLoad(); - -module.exports = Raven; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/utils.js": -/*!********************************************!*\ - !*** ./node_modules/raven-js/src/utils.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; - -function isObject(what) { - return typeof what === 'object' && what !== null; -} - -// Yanked from https://git.io/vS8DV re-used under CC0 -// with some tiny modifications -function isError(value) { - switch ({}.toString.call(value)) { - case '[object Error]': - return true; - case '[object Exception]': - return true; - case '[object DOMException]': - return true; - default: - return value instanceof Error; - } -} - -function isErrorEvent(value) { - return supportsErrorEvent() && {}.toString.call(value) === '[object ErrorEvent]'; -} - -function isUndefined(what) { - return what === void 0; -} - -function isFunction(what) { - return typeof what === 'function'; -} - -function isString(what) { - return Object.prototype.toString.call(what) === '[object String]'; -} - -function isEmptyObject(what) { - for (var _ in what) return false; // eslint-disable-line guard-for-in, no-unused-vars - return true; -} - -function supportsErrorEvent() { - try { - new ErrorEvent(''); // eslint-disable-line no-new - return true; - } catch (e) { - return false; - } -} - -function wrappedCallback(callback) { - function dataCallback(data, original) { - var normalizedData = callback(data) || data; - if (original) { - return original(normalizedData) || normalizedData; - } - return normalizedData; - } - - return dataCallback; -} - -function each(obj, callback) { - var i, j; - - if (isUndefined(obj.length)) { - for (i in obj) { - if (hasKey(obj, i)) { - callback.call(null, i, obj[i]); - } - } - } else { - j = obj.length; - if (j) { - for (i = 0; i < j; i++) { - callback.call(null, i, obj[i]); - } - } - } -} - -function objectMerge(obj1, obj2) { - if (!obj2) { - return obj1; - } - each(obj2, function(key, value) { - obj1[key] = value; - }); - return obj1; -} - -/** - * This function is only used for react-native. - * react-native freezes object that have already been sent over the - * js bridge. We need this function in order to check if the object is frozen. - * So it's ok that objectFrozen returns false if Object.isFrozen is not - * supported because it's not relevant for other "platforms". See related issue: - * https://github.com/getsentry/react-native-sentry/issues/57 - */ -function objectFrozen(obj) { - if (!Object.isFrozen) { - return false; - } - return Object.isFrozen(obj); -} - -function truncate(str, max) { - return !max || str.length <= max ? str : str.substr(0, max) + '\u2026'; -} - -/** - * hasKey, a better form of hasOwnProperty - * Example: hasKey(MainHostObject, property) === true/false - * - * @param {Object} host object to check property - * @param {string} key to check - */ -function hasKey(object, key) { - return Object.prototype.hasOwnProperty.call(object, key); -} - -function joinRegExp(patterns) { - // Combine an array of regular expressions and strings into one large regexp - // Be mad. - var sources = [], - i = 0, - len = patterns.length, - pattern; - - for (; i < len; i++) { - pattern = patterns[i]; - if (isString(pattern)) { - // If it's a string, we need to escape it - // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions - sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1')); - } else if (pattern && pattern.source) { - // If it's a regexp already, we want to extract the source - sources.push(pattern.source); - } - // Intentionally skip other cases - } - return new RegExp(sources.join('|'), 'i'); -} - -function urlencode(o) { - var pairs = []; - each(o, function(key, value) { - pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); - }); - return pairs.join('&'); -} - -// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B -// intentionally using regex and not href parsing trick because React Native and other -// environments where DOM might not be available -function parseUrl(url) { - var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); - if (!match) return {}; - - // coerce to undefined values to empty string so we don't get 'undefined' - var query = match[6] || ''; - var fragment = match[8] || ''; - return { - protocol: match[2], - host: match[4], - path: match[5], - relative: match[5] + query + fragment // everything minus origin - }; -} -function uuid4() { - var crypto = _window.crypto || _window.msCrypto; - - if (!isUndefined(crypto) && crypto.getRandomValues) { - // Use window.crypto API if available - // eslint-disable-next-line no-undef - var arr = new Uint16Array(8); - crypto.getRandomValues(arr); - - // set 4 in byte 7 - arr[3] = (arr[3] & 0xfff) | 0x4000; - // set 2 most significant bits of byte 9 to '10' - arr[4] = (arr[4] & 0x3fff) | 0x8000; - - var pad = function(num) { - var v = num.toString(16); - while (v.length < 4) { - v = '0' + v; - } - return v; - }; - - return ( - pad(arr[0]) + - pad(arr[1]) + - pad(arr[2]) + - pad(arr[3]) + - pad(arr[4]) + - pad(arr[5]) + - pad(arr[6]) + - pad(arr[7]) - ); - } else { - // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 - return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = (Math.random() * 16) | 0, - v = c === 'x' ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); - } -} - -/** - * Given a child DOM element, returns a query-selector statement describing that - * and its ancestors - * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz] - * @param elem - * @returns {string} - */ -function htmlTreeAsString(elem) { - /* eslint no-extra-parens:0*/ - var MAX_TRAVERSE_HEIGHT = 5, - MAX_OUTPUT_LEN = 80, - out = [], - height = 0, - len = 0, - separator = ' > ', - sepLength = separator.length, - nextStr; - - while (elem && height++ < MAX_TRAVERSE_HEIGHT) { - nextStr = htmlElementAsString(elem); - // bail out if - // - nextStr is the 'html' element - // - the length of the string that would be created exceeds MAX_OUTPUT_LEN - // (ignore this limit if we are on the first iteration) - if ( - nextStr === 'html' || - (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN) - ) { - break; - } - - out.push(nextStr); - - len += nextStr.length; - elem = elem.parentNode; - } - - return out.reverse().join(separator); -} - -/** - * Returns a simple, query-selector representation of a DOM element - * e.g. [HTMLElement] => input#foo.btn[name=baz] - * @param HTMLElement - * @returns {string} - */ -function htmlElementAsString(elem) { - var out = [], - className, - classes, - key, - attr, - i; - - if (!elem || !elem.tagName) { - return ''; - } - - out.push(elem.tagName.toLowerCase()); - if (elem.id) { - out.push('#' + elem.id); - } - - className = elem.className; - if (className && isString(className)) { - classes = className.split(/\s+/); - for (i = 0; i < classes.length; i++) { - out.push('.' + classes[i]); - } - } - var attrWhitelist = ['type', 'name', 'title', 'alt']; - for (i = 0; i < attrWhitelist.length; i++) { - key = attrWhitelist[i]; - attr = elem.getAttribute(key); - if (attr) { - out.push('[' + key + '="' + attr + '"]'); - } - } - return out.join(''); -} - -/** - * Returns true if either a OR b is truthy, but not both - */ -function isOnlyOneTruthy(a, b) { - return !!(!!a ^ !!b); -} - -/** - * Returns true if the two input exception interfaces have the same content - */ -function isSameException(ex1, ex2) { - if (isOnlyOneTruthy(ex1, ex2)) return false; - - ex1 = ex1.values[0]; - ex2 = ex2.values[0]; - - if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false; - - return isSameStacktrace(ex1.stacktrace, ex2.stacktrace); -} - -/** - * Returns true if the two input stack trace interfaces have the same content - */ -function isSameStacktrace(stack1, stack2) { - if (isOnlyOneTruthy(stack1, stack2)) return false; - - var frames1 = stack1.frames; - var frames2 = stack2.frames; - - // Exit early if frame count differs - if (frames1.length !== frames2.length) return false; - - // Iterate through every frame; bail out if anything differs - var a, b; - for (var i = 0; i < frames1.length; i++) { - a = frames1[i]; - b = frames2[i]; - if ( - a.filename !== b.filename || - a.lineno !== b.lineno || - a.colno !== b.colno || - a['function'] !== b['function'] - ) - return false; - } - return true; -} - -/** - * Polyfill a method - * @param obj object e.g. `document` - * @param name method name present on object e.g. `addEventListener` - * @param replacement replacement function - * @param track {optional} record instrumentation to an array - */ -function fill(obj, name, replacement, track) { - var orig = obj[name]; - obj[name] = replacement(orig); - if (track) { - track.push([obj, name, orig]); - } -} - -module.exports = { - isObject: isObject, - isError: isError, - isErrorEvent: isErrorEvent, - isUndefined: isUndefined, - isFunction: isFunction, - isString: isString, - isEmptyObject: isEmptyObject, - supportsErrorEvent: supportsErrorEvent, - wrappedCallback: wrappedCallback, - each: each, - objectMerge: objectMerge, - truncate: truncate, - objectFrozen: objectFrozen, - hasKey: hasKey, - joinRegExp: joinRegExp, - urlencode: urlencode, - uuid4: uuid4, - htmlTreeAsString: htmlTreeAsString, - htmlElementAsString: htmlElementAsString, - isSameException: isSameException, - isSameStacktrace: isSameStacktrace, - parseUrl: parseUrl, - fill: fill -}; - - -/***/ }), - -/***/ "./node_modules/raven-js/vendor/TraceKit/tracekit.js": -/*!***********************************************************!*\ - !*** ./node_modules/raven-js/vendor/TraceKit/tracekit.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var utils = __webpack_require__(/*! ../../src/utils */ "./node_modules/raven-js/src/utils.js"); - -/* - TraceKit - Cross brower stack traces - - This was originally forked from github.com/occ/TraceKit, but has since been - largely re-written and is now maintained as part of raven-js. Tests for - this are in test/vendor. - - MIT license -*/ - -var TraceKit = { - collectWindowErrors: true, - debug: false -}; - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; - -// global reference to slice -var _slice = [].slice; -var UNKNOWN_FUNCTION = '?'; - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types -var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/; - -function getLocationHref() { - if (typeof document === 'undefined' || document.location == null) return ''; - - return document.location.href; -} - -/** - * TraceKit.report: cross-browser processing of unhandled exceptions - * - * Syntax: - * TraceKit.report.subscribe(function(stackInfo) { ... }) - * TraceKit.report.unsubscribe(function(stackInfo) { ... }) - * TraceKit.report(exception) - * try { ...code... } catch(ex) { TraceKit.report(ex); } - * - * Supports: - * - Firefox: full stack trace with line numbers, plus column number - * on top frame; column number is not guaranteed - * - Opera: full stack trace with line and column numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - IE: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - * In theory, TraceKit should work on all of the following versions: - * - IE5.5+ (only 8.0 tested) - * - Firefox 0.9+ (only 3.5+ tested) - * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require - * Exceptions Have Stacktrace to be enabled in opera:config) - * - Safari 3+ (only 4+ tested) - * - Chrome 1+ (only 5+ tested) - * - Konqueror 3.5+ (untested) - * - * Requires TraceKit.computeStackTrace. - * - * Tries to catch all unhandled exceptions and report them to the - * subscribed handlers. Please note that TraceKit.report will rethrow the - * exception. This is REQUIRED in order to get a useful stack trace in IE. - * If the exception does not reach the top of the browser, you will only - * get a stack trace from the point where TraceKit.report was called. - * - * Handlers receive a stackInfo object as described in the - * TraceKit.computeStackTrace docs. - */ -TraceKit.report = (function reportModuleWrapper() { - var handlers = [], - lastArgs = null, - lastException = null, - lastExceptionStack = null; - - /** - * Add a crash handler. - * @param {Function} handler - */ - function subscribe(handler) { - installGlobalHandler(); - handlers.push(handler); - } - - /** - * Remove a crash handler. - * @param {Function} handler - */ - function unsubscribe(handler) { - for (var i = handlers.length - 1; i >= 0; --i) { - if (handlers[i] === handler) { - handlers.splice(i, 1); - } - } - } - - /** - * Remove all crash handlers. - */ - function unsubscribeAll() { - uninstallGlobalHandler(); - handlers = []; - } - - /** - * Dispatch stack information to all handlers. - * @param {Object.} stack - */ - function notifyHandlers(stack, isWindowError) { - var exception = null; - if (isWindowError && !TraceKit.collectWindowErrors) { - return; - } - for (var i in handlers) { - if (handlers.hasOwnProperty(i)) { - try { - handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); - } catch (inner) { - exception = inner; - } - } - } - - if (exception) { - throw exception; - } - } - - var _oldOnerrorHandler, _onErrorHandlerInstalled; - - /** - * Ensures all global unhandled exceptions are recorded. - * Supported by Gecko and IE. - * @param {string} message Error message. - * @param {string} url URL of script that generated the exception. - * @param {(number|string)} lineNo The line number at which the error - * occurred. - * @param {?(number|string)} colNo The column number at which the error - * occurred. - * @param {?Error} ex The actual Error object. - */ - function traceKitWindowOnError(message, url, lineNo, colNo, ex) { - var stack = null; - - if (lastExceptionStack) { - TraceKit.computeStackTrace.augmentStackTraceWithInitialElement( - lastExceptionStack, - url, - lineNo, - message - ); - processLastException(); - } else if (ex && utils.isError(ex)) { - // non-string `ex` arg; attempt to extract stack trace - - // New chrome and blink send along a real error object - // Let's just report that like a normal error. - // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror - stack = TraceKit.computeStackTrace(ex); - notifyHandlers(stack, true); - } else { - var location = { - url: url, - line: lineNo, - column: colNo - }; - - var name = undefined; - var msg = message; // must be new var or will modify original `arguments` - var groups; - if ({}.toString.call(message) === '[object String]') { - var groups = message.match(ERROR_TYPES_RE); - if (groups) { - name = groups[1]; - msg = groups[2]; - } - } - - location.func = UNKNOWN_FUNCTION; - - stack = { - name: name, - message: msg, - url: getLocationHref(), - stack: [location] - }; - notifyHandlers(stack, true); - } - - if (_oldOnerrorHandler) { - return _oldOnerrorHandler.apply(this, arguments); - } - - return false; - } - - function installGlobalHandler() { - if (_onErrorHandlerInstalled) { - return; - } - _oldOnerrorHandler = _window.onerror; - _window.onerror = traceKitWindowOnError; - _onErrorHandlerInstalled = true; - } - - function uninstallGlobalHandler() { - if (!_onErrorHandlerInstalled) { - return; - } - _window.onerror = _oldOnerrorHandler; - _onErrorHandlerInstalled = false; - _oldOnerrorHandler = undefined; - } - - function processLastException() { - var _lastExceptionStack = lastExceptionStack, - _lastArgs = lastArgs; - lastArgs = null; - lastExceptionStack = null; - lastException = null; - notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs)); - } - - /** - * Reports an unhandled Error to TraceKit. - * @param {Error} ex - * @param {?boolean} rethrow If false, do not re-throw the exception. - * Only used for window.onerror to not cause an infinite loop of - * rethrowing. - */ - function report(ex, rethrow) { - var args = _slice.call(arguments, 1); - if (lastExceptionStack) { - if (lastException === ex) { - return; // already caught by an inner catch block, ignore - } else { - processLastException(); - } - } - - var stack = TraceKit.computeStackTrace(ex); - lastExceptionStack = stack; - lastException = ex; - lastArgs = args; - - // If the stack trace is incomplete, wait for 2 seconds for - // slow slow IE to see if onerror occurs or not before reporting - // this exception; otherwise, we will end up with an incomplete - // stack trace - setTimeout(function() { - if (lastException === ex) { - processLastException(); - } - }, stack.incomplete ? 2000 : 0); - - if (rethrow !== false) { - throw ex; // re-throw to propagate to the top level (and cause window.onerror) - } - } - - report.subscribe = subscribe; - report.unsubscribe = unsubscribe; - report.uninstall = unsubscribeAll; - return report; -})(); - -/** - * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript - * - * Syntax: - * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below) - * Returns: - * s.name - exception name - * s.message - exception message - * s.stack[i].url - JavaScript or HTML file URL - * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work) - * s.stack[i].args - arguments passed to the function, if known - * s.stack[i].line - line number, if known - * s.stack[i].column - column number, if known - * - * Supports: - * - Firefox: full stack trace with line numbers and unreliable column - * number on top frame - * - Opera 10: full stack trace with line and column numbers - * - Opera 9-: full stack trace with line numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the topmost stacktrace element - * only - * - IE: no line numbers whatsoever - * - * Tries to guess names of anonymous functions by looking for assignments - * in the source code. In IE and Safari, we have to guess source file names - * by searching for function bodies inside all page scripts. This will not - * work for scripts that are loaded cross-domain. - * Here be dragons: some function names may be guessed incorrectly, and - * duplicate functions may be mismatched. - * - * TraceKit.computeStackTrace should only be used for tracing purposes. - * Logging of unhandled exceptions should be done with TraceKit.report, - * which builds on top of TraceKit.computeStackTrace and provides better - * IE support by utilizing the window.onerror event to retrieve information - * about the top of the stack. - * - * Note: In IE and Safari, no stack trace is recorded on the Error object, - * so computeStackTrace instead walks its *own* chain of callers. - * This means that: - * * in Safari, some methods may be missing from the stack trace; - * * in IE, the topmost function in the stack trace will always be the - * caller of computeStackTrace. - * - * This is okay for tracing (because you are likely to be calling - * computeStackTrace from the function you want to be the topmost element - * of the stack trace anyway), but not okay for logging unhandled - * exceptions (because your catch block will likely be far away from the - * inner function that actually caused the exception). - * - */ -TraceKit.computeStackTrace = (function computeStackTraceWrapper() { - // Contents of Exception in various browsers. - // - // SAFARI: - // ex.message = Can't find variable: qq - // ex.line = 59 - // ex.sourceId = 580238192 - // ex.sourceURL = http://... - // ex.expressionBeginOffset = 96 - // ex.expressionCaretOffset = 98 - // ex.expressionEndOffset = 98 - // ex.name = ReferenceError - // - // FIREFOX: - // ex.message = qq is not defined - // ex.fileName = http://... - // ex.lineNumber = 59 - // ex.columnNumber = 69 - // ex.stack = ...stack trace... (see the example below) - // ex.name = ReferenceError - // - // CHROME: - // ex.message = qq is not defined - // ex.name = ReferenceError - // ex.type = not_defined - // ex.arguments = ['aa'] - // ex.stack = ...stack trace... - // - // INTERNET EXPLORER: - // ex.message = ... - // ex.name = ReferenceError - // - // OPERA: - // ex.message = ...message... (see the example below) - // ex.name = ReferenceError - // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message) - // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace' - - /** - * Computes stack trace information from the stack property. - * Chrome and Gecko use this property. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceFromStackProp(ex) { - if (typeof ex.stack === 'undefined' || !ex.stack) return; - - var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i, - gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i, - winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i, - // Used to additionally parse URL/line/column from eval frames - geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i, - chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/, - lines = ex.stack.split('\n'), - stack = [], - submatch, - parts, - element, - reference = /^(.*) is undefined$/.exec(ex.message); - - for (var i = 0, j = lines.length; i < j; ++i) { - if ((parts = chrome.exec(lines[i]))) { - var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line - var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line - if (isEval && (submatch = chromeEval.exec(parts[2]))) { - // throw out eval line/column and use top-most line/column number - parts[2] = submatch[1]; // url - parts[3] = submatch[2]; // line - parts[4] = submatch[3]; // column - } - element = { - url: !isNative ? parts[2] : null, - func: parts[1] || UNKNOWN_FUNCTION, - args: isNative ? [parts[2]] : [], - line: parts[3] ? +parts[3] : null, - column: parts[4] ? +parts[4] : null - }; - } else if ((parts = winjs.exec(lines[i]))) { - element = { - url: parts[2], - func: parts[1] || UNKNOWN_FUNCTION, - args: [], - line: +parts[3], - column: parts[4] ? +parts[4] : null - }; - } else if ((parts = gecko.exec(lines[i]))) { - var isEval = parts[3] && parts[3].indexOf(' > eval') > -1; - if (isEval && (submatch = geckoEval.exec(parts[3]))) { - // throw out eval line/column and use top-most line number - parts[3] = submatch[1]; - parts[4] = submatch[2]; - parts[5] = null; // no column when eval - } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') { - // FireFox uses this awesome columnNumber property for its top frame - // Also note, Firefox's column number is 0-based and everything else expects 1-based, - // so adding 1 - // NOTE: this hack doesn't work if top-most frame is eval - stack[0].column = ex.columnNumber + 1; - } - element = { - url: parts[3], - func: parts[1] || UNKNOWN_FUNCTION, - args: parts[2] ? parts[2].split(',') : [], - line: parts[4] ? +parts[4] : null, - column: parts[5] ? +parts[5] : null - }; - } else { - continue; - } - - if (!element.func && element.line) { - element.func = UNKNOWN_FUNCTION; - } - - stack.push(element); - } - - if (!stack.length) { - return null; - } - - return { - name: ex.name, - message: ex.message, - url: getLocationHref(), - stack: stack - }; - } - - /** - * Adds information about the first frame to incomplete stack traces. - * Safari and IE require this to get complete data on the first frame. - * @param {Object.} stackInfo Stack trace information from - * one of the compute* methods. - * @param {string} url The URL of the script that caused an error. - * @param {(number|string)} lineNo The line number of the script that - * caused an error. - * @param {string=} message The error generated by the browser, which - * hopefully contains the name of the object that caused the error. - * @return {boolean} Whether or not the stack information was - * augmented. - */ - function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) { - var initial = { - url: url, - line: lineNo - }; - - if (initial.url && initial.line) { - stackInfo.incomplete = false; - - if (!initial.func) { - initial.func = UNKNOWN_FUNCTION; - } - - if (stackInfo.stack.length > 0) { - if (stackInfo.stack[0].url === initial.url) { - if (stackInfo.stack[0].line === initial.line) { - return false; // already in stack trace - } else if ( - !stackInfo.stack[0].line && - stackInfo.stack[0].func === initial.func - ) { - stackInfo.stack[0].line = initial.line; - return false; - } - } - } - - stackInfo.stack.unshift(initial); - stackInfo.partial = true; - return true; - } else { - stackInfo.incomplete = true; - } - - return false; - } - - /** - * Computes stack trace information by walking the arguments.caller - * chain at the time the exception occurred. This will cause earlier - * frames to be missed but is the only way to get any stack trace in - * Safari and IE. The top frame is restored by - * {@link augmentStackTraceWithInitialElement}. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceByWalkingCallerChain(ex, depth) { - var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i, - stack = [], - funcs = {}, - recursion = false, - parts, - item, - source; - - for ( - var curr = computeStackTraceByWalkingCallerChain.caller; - curr && !recursion; - curr = curr.caller - ) { - if (curr === computeStackTrace || curr === TraceKit.report) { - // console.log('skipping internal function'); - continue; - } - - item = { - url: null, - func: UNKNOWN_FUNCTION, - line: null, - column: null - }; - - if (curr.name) { - item.func = curr.name; - } else if ((parts = functionName.exec(curr.toString()))) { - item.func = parts[1]; - } - - if (typeof item.func === 'undefined') { - try { - item.func = parts.input.substring(0, parts.input.indexOf('{')); - } catch (e) {} - } - - if (funcs['' + curr]) { - recursion = true; - } else { - funcs['' + curr] = true; - } - - stack.push(item); - } - - if (depth) { - // console.log('depth is ' + depth); - // console.log('stack is ' + stack.length); - stack.splice(0, depth); - } - - var result = { - name: ex.name, - message: ex.message, - url: getLocationHref(), - stack: stack - }; - augmentStackTraceWithInitialElement( - result, - ex.sourceURL || ex.fileName, - ex.line || ex.lineNumber, - ex.message || ex.description - ); - return result; - } - - /** - * Computes a stack trace for an exception. - * @param {Error} ex - * @param {(string|number)=} depth - */ - function computeStackTrace(ex, depth) { - var stack = null; - depth = depth == null ? 0 : +depth; - - try { - stack = computeStackTraceFromStackProp(ex); - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - - try { - stack = computeStackTraceByWalkingCallerChain(ex, depth + 1); - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - return { - name: ex.name, - message: ex.message, - url: getLocationHref() - }; - } - - computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement; - computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp; - - return computeStackTrace; -})(); - -module.exports = TraceKit; - - -/***/ }), - -/***/ "./node_modules/raven-js/vendor/json-stringify-safe/stringify.js": -/*!***********************************************************************!*\ - !*** ./node_modules/raven-js/vendor/json-stringify-safe/stringify.js ***! - \***********************************************************************/ -/***/ ((module, exports) => { - -/* - json-stringify-safe - Like JSON.stringify, but doesn't throw on circular references. - - Originally forked from https://github.com/isaacs/json-stringify-safe - version 5.0.1 on 3/8/2017 and modified to handle Errors serialization - and IE8 compatibility. Tests for this are in test/vendor. - - ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE -*/ - -exports = module.exports = stringify; -exports.getSerialize = serializer; - -function indexOf(haystack, needle) { - for (var i = 0; i < haystack.length; ++i) { - if (haystack[i] === needle) return i; - } - return -1; -} - -function stringify(obj, replacer, spaces, cycleReplacer) { - return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces); -} - -// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106 -function stringifyError(value) { - var err = { - // These properties are implemented as magical getters and don't show up in for in - stack: value.stack, - message: value.message, - name: value.name - }; - - for (var i in value) { - if (Object.prototype.hasOwnProperty.call(value, i)) { - err[i] = value[i]; - } - } - - return err; -} - -function serializer(replacer, cycleReplacer) { - var stack = []; - var keys = []; - - if (cycleReplacer == null) { - cycleReplacer = function(key, value) { - if (stack[0] === value) { - return '[Circular ~]'; - } - return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']'; - }; - } - - return function(key, value) { - if (stack.length > 0) { - var thisPos = indexOf(stack, this); - ~thisPos ? stack.splice(thisPos + 1) : stack.push(this); - ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key); - - if (~indexOf(stack, value)) { - value = cycleReplacer.call(this, key, value); - } - } else { - stack.push(value); - } - - return replacer == null - ? value instanceof Error ? stringifyError(value) : value - : replacer.call(this, key, value); - }; -} - - -/***/ }), - -/***/ "jquery": -/*!*************************!*\ - !*** external "jQuery" ***! - \*************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["jQuery"]; - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // 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/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* 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/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be in strict mode. -(() => { -"use strict"; -/*!*************************************!*\ - !*** ./scripts/entries/feedback.ts ***! - \*************************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _lib_Raven__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/Raven */ "./scripts/lib/Raven.ts"); -/* harmony import */ var _constants_selectors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/selectors */ "./scripts/constants/selectors.ts"); -/* harmony import */ var _feedback_ThickBoxModal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../feedback/ThickBoxModal */ "./scripts/feedback/ThickBoxModal.ts"); -/* harmony import */ var _feedback_feedbackFormApi__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../feedback/feedbackFormApi */ "./scripts/feedback/feedbackFormApi.ts"); -/* harmony import */ var _utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/backgroundAppUtils */ "./scripts/utils/backgroundAppUtils.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); - - - - - - - - - -function deactivatePlugin() { - var href = jquery__WEBPACK_IMPORTED_MODULE_0___default()(_constants_selectors__WEBPACK_IMPORTED_MODULE_2__.domElements.deactivatePluginButton).attr('href'); - - if (href) { - window.location.href = href; - } -} - -function setLoadingState() { - jquery__WEBPACK_IMPORTED_MODULE_0___default()(_constants_selectors__WEBPACK_IMPORTED_MODULE_2__.domElements.deactivateFeedbackSubmit).addClass('loading'); -} - -function submitAndDeactivate(e) { - e.preventDefault(); - setLoadingState(); - var feedback = jquery__WEBPACK_IMPORTED_MODULE_0___default()(_constants_selectors__WEBPACK_IMPORTED_MODULE_2__.domElements.deactivateFeedbackForm).serializeArray().find(function (field) { - return field.name === 'feedback'; - }); - (0,_feedback_feedbackFormApi__WEBPACK_IMPORTED_MODULE_4__.submitFeedbackForm)(_constants_selectors__WEBPACK_IMPORTED_MODULE_2__.domElements.deactivateFeedbackForm).then(function () { - if (feedback && _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_6__.refreshToken) { - var embedder = (0,_utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_5__.getOrCreateBackgroundApp)(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_6__.refreshToken); - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_7__.ProxyMessages.TrackPluginDeactivation, - payload: { - type: feedback.value.trim().replace(/[\s']+/g, '_') - } - }); - } - })["catch"](function (err) { - _lib_Raven__WEBPACK_IMPORTED_MODULE_1__["default"].captureException(err); - })["finally"](function () { - deactivatePlugin(); - }); -} - -function init() { - // eslint-disable-next-line no-new - new _feedback_ThickBoxModal__WEBPACK_IMPORTED_MODULE_3__["default"](_constants_selectors__WEBPACK_IMPORTED_MODULE_2__.domElements.deactivatePluginButton, 'leadin-feedback-container', 'leadin-feedback-window', 'leadin-feedback-content'); - jquery__WEBPACK_IMPORTED_MODULE_0___default()(_constants_selectors__WEBPACK_IMPORTED_MODULE_2__.domElements.deactivateFeedbackForm).off('submit').on('submit', submitAndDeactivate); - jquery__WEBPACK_IMPORTED_MODULE_0___default()(_constants_selectors__WEBPACK_IMPORTED_MODULE_2__.domElements.deactivateFeedbackSkip).off('click').on('click', deactivatePlugin); -} - -(0,_utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_5__.initBackgroundApp)(init); -})(); - -/******/ })() -; -//# sourceMappingURL=feedback.js.map \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/feedback.js.map b/wp/wp-content/plugins/leadin/build/feedback.js.map deleted file mode 100644 index e04cf49e..00000000 --- a/wp/wp-content/plugins/leadin/build/feedback.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"feedback.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2BAA6iBA,MAAM,CAACC,YAApjB;AAAA,IAAQC,WAAR,wBAAQA,WAAR;AAAA,IAAqBC,QAArB,wBAAqBA,QAArB;AAAA,IAA+BC,cAA/B,wBAA+BA,cAA/B;AAAA,IAA+CC,gBAA/C,wBAA+CA,gBAA/C;AAAA,IAAiEC,QAAjE,wBAAiEA,QAAjE;AAAA,IAA2EC,aAA3E,wBAA2EA,aAA3E;AAAA,IAA0FC,GAA1F,wBAA0FA,GAA1F;AAAA,IAA+FC,WAA/F,wBAA+FA,WAA/F;AAAA,IAA4GC,cAA5G,wBAA4GA,cAA5G;AAAA,IAA4HC,kBAA5H,wBAA4HA,kBAA5H;AAAA,IAAgJC,MAAhJ,wBAAgJA,MAAhJ;AAAA,IAAwJC,cAAxJ,wBAAwJA,cAAxJ;AAAA,IAAwKC,YAAxK,wBAAwKA,YAAxK;AAAA,IAAsLC,SAAtL,wBAAsLA,SAAtL;AAAA,IAAiMC,UAAjM,wBAAiMA,UAAjM;AAAA,IAA6MC,iBAA7M,wBAA6MA,iBAA7M;AAAA,IAAgOC,mBAAhO,wBAAgOA,mBAAhO;AAAA,IAAqPC,kBAArP,wBAAqPA,kBAArP;AAAA,IAAyQC,mBAAzQ,wBAAyQA,mBAAzQ;AAAA,IAA8RC,iBAA9R,wBAA8RA,iBAA9R;AAAA,IAAiTC,MAAjT,wBAAiTA,MAAjT;AAAA,IAAyTC,QAAzT,wBAAyTA,QAAzT;AAAA,IAAmUC,UAAnU,wBAAmUA,UAAnU;AAAA,IAA+UC,UAA/U,wBAA+UA,UAA/U;AAAA,IAA2VC,OAA3V,wBAA2VA,OAA3V;AAAA,IAAoWC,YAApW,wBAAoWA,YAApW;AAAA,IAAkXC,WAAlX,wBAAkXA,WAAlX;AAAA,IAA+XC,QAA/X,wBAA+XA,QAA/X;AAAA,IAAyYC,aAAzY,wBAAyYA,aAAzY;AAAA,IAAwZC,SAAxZ,wBAAwZA,SAAxZ;AAAA,IAAmaC,OAAna,wBAAmaA,OAAna;AAAA,IAA4aC,YAA5a,wBAA4aA,YAA5a;AAAA,IAA0bC,iBAA1b,wBAA0bA,iBAA1b;AAAA,IAA6cC,KAA7c,wBAA6cA,KAA7c;AAAA,IAAodC,YAApd,wBAAodA,YAApd;AAAA,IAAkeC,SAAle,wBAAkeA,SAAle;AAAA,IAA6eC,YAA7e,wBAA6eA,YAA7e;AAAA,IAA2fC,yBAA3f,wBAA2fA,yBAA3f;AAAA,IAAshBC,iBAAthB,wBAAshBA,iBAAthB;;;;;;;;;;;;;;;;ACAO,IAAMC,WAAW,GAAG;EACvBC,MAAM,EAAE,gBADe;EAEvBC,OAAO,EAAE,4BAFc;EAGvBC,YAAY,EAAE,8BAHS;EAIvBC,cAAc,EAAE,iCAJO;EAKvBC,sBAAsB,EAAE,oCALD;EAMvBC,sBAAsB,EAAE,6BAND;EAOvBC,wBAAwB,EAAE,+BAPH;EAQvBC,sBAAsB,EAAE,6BARD;EASvBC,kBAAkB,EAAE,qBATG;EAUvBC,mBAAmB,EAAE,gCAVE;EAWvBC,oBAAoB,EAAE,6BAXC;EAYvBC,qBAAqB,EAAE,uBAZA;EAavBC,2BAA2B,EAAE,uBAbN;EAcvBC,yBAAyB,EAAE,gCAdJ;EAevBC,qBAAqB,EAAE,yBAfA;EAgBvBC,YAAY,EAAE,eAhBS;EAiBvBC,6BAA6B,EAAE;AAjBR,CAApB;;;;;;;;;;;;;;;;;;;;;;;;;;ACAP;AACA;;IACqBE;EAKjB,uBAAYC,mBAAZ,EAAiCC,eAAjC,EAAkDC,cAAlD,EAAkEC,eAAlE,EAAmF;IAAA;;IAAA;;IAAA;;IAAA;;IAAA;;IAC/E,KAAKH,mBAAL,GAA2BA,mBAA3B;IACA,KAAKC,eAAL,GAAuBA,eAAvB;IACA,KAAKC,cAAL,GAAsBA,cAAtB;IACA,KAAKC,eAAL,GAAuBA,eAAvB;IACAL,6CAAC,CAACE,mBAAD,CAAD,CAAuBI,EAAvB,CAA0B,OAA1B,EAAmC,KAAKC,IAAL,CAAUC,IAAV,CAAe,IAAf,CAAnC;EACH;;;;WACD,iBAAQ;MACJ;MACAnE,MAAM,CAACoE,SAAP;IACH;;;WACD,cAAKC,CAAL,EAAQ;MACJ;MACArE,MAAM,CAACsE,OAAP,CAAe,EAAf,gCAA0C,KAAKR,eAA/C,kBAFI,CAGJ;MACA;;MACAH,6CAAC,CAAClB,iFAAD,CAAD,CAAmC8B,QAAnC,CAA4C,KAAKR,cAAjD,EALI,CAMJ;;MACAJ,6CAAC,CAAClB,kFAAD,CAAD,CAAoC8B,QAApC,CAA6C,KAAKP,eAAlD,EAPI,CAQJ;MACA;;MACAL,6CAAC,CAAClB,gFAAD,CAAD,CACK+B,GADL,CACS,OADT,EAEKP,EAFL,CAEQ,OAFR,EAEiB,KAAKQ,KAFtB;MAGAJ,CAAC,CAACK,cAAF;IACH;;;;;;;;;;;;;;;;;;;;;;;AChCL;AACA,IAAM7C,QAAQ,GAAG,SAAjB;AACA,IAAM8C,MAAM,GAAG,sCAAf;AACA,IAAMC,iBAAiB,uEAAgE/C,QAAhE,cAA4E8C,MAA5E,CAAvB;AACO,SAASE,kBAAT,CAA4BC,YAA5B,EAA0C;EAC7C,IAAMC,qBAAqB,GAAG;IAC1BC,MAAM,EAAErB,6CAAC,CAACmB,YAAD,CAAD,CAAgBG,cAAhB,EADkB;IAE1BC,cAAc,EAAE;EAFU,CAA9B;EAIA,OAAO,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;IACpC1B,kDAAA,CAAO;MACH4B,IAAI,EAAE,MADH;MAEHC,GAAG,EAAEZ,iBAFF;MAGHa,WAAW,EAAE,kBAHV;MAIHC,IAAI,EAAEC,IAAI,CAACC,SAAL,CAAeb,qBAAf,CAJH;MAKHc,OAAO,EAAET,OALN;MAMHU,KAAK,EAAET;IANJ,CAAP;EAQH,CATM,CAAP;AAUH;;;;;;;;;;;;;;;ACnBM,IAAMU,YAAY,GAAG;EACxBC,gBAAgB,EAAE,4CADM;EAExBC,gBAAgB,EAAE,4CAFM;EAGxBC,iBAAiB,EAAE,6CAHK;EAIxBC,mBAAmB,EAAE,+CAJG;EAKxBC,UAAU,EAAE,qCALY;EAMxBC,YAAY,EAAE,wCANU;EAOxBC,uBAAuB,EAAE;AAPD,CAArB;;;;;;;;;;;;;;;ACAA,IAAMC,YAAY,GAAG;EACxBC,uBAAuB,EAAE;AADD,CAArB;;;;;;;;;;;;;;;;;;;;;;;;ACAP;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACHO,IAAMC,gBAAgB,GAAG;EAC5BC,2BAA2B,EAAE;AADD,CAAzB;;;;;;;;;;;;;;;ACAA,IAAMC,cAAc,GAAG;EAC1BC,wBAAwB,EAAE,4BADA;EAE1BC,kBAAkB,EAAE,sBAFM;EAG1BC,YAAY,EAAE,uCAHY;EAI1BC,4BAA4B,EAAE,mCAJJ;EAK1BC,6BAA6B,EAAE,oCALL;EAM1BC,0BAA0B,EAAE,iCANF;EAO1BC,6BAA6B,EAAE,oCAPL;EAQ1BC,2BAA2B,EAAE,kCARH;EAS1BC,wBAAwB,EAAE,6BATA;EAU1BC,yBAAyB,EAAE,oCAVD;EAW1BC,sBAAsB,EAAE,iCAXE;EAY1BC,yBAAyB,EAAE,8BAZD;EAa1BC,uBAAuB,EAAE,4BAbC;EAc1BC,iBAAiB,EAAE,qBAdO;EAe1BC,kBAAkB,EAAE,sBAfM;EAgB1BC,eAAe,EAAE,mBAhBS;EAiB1BC,sBAAsB,EAAE,2BAjBE;EAkB1BC,0BAA0B,EAAE,+BAlBF;EAmB1BC,2BAA2B,EAAE,gCAnBH;EAoB1BC,wBAAwB,EAAE,6BApBA;EAqB1BC,6BAA6B,EAAE,kCArBL;EAsB1BC,8BAA8B,EAAE,mCAtBN;EAuB1BC,2BAA2B,EAAE;AAvBH,CAAvB;;;;;;;;;;;;;;;ACAA,IAAMC,aAAa,GAAG;EACzBC,UAAU,EAAE,aADa;EAEzBC,SAAS,EAAE,YAFc;EAGzBC,sBAAsB,EAAE,2BAHC;EAIzBC,SAAS,EAAE,YAJc;EAKzBC,qBAAqB,EAAE,0BALE;EAMzBC,kCAAkC,EAAE,yCANX;EAOzBC,wBAAwB,EAAE,8BAPD;EAQzBC,uBAAuB,EAAE,2BARA;EASzBC,sBAAsB,EAAE,2BATC;EAUzBC,4BAA4B,EAAE,kCAVL;EAWzBC,uBAAuB,EAAE,4BAXA;EAYzBC,yBAAyB,EAAE,8BAZF;EAazBC,sBAAsB,EAAE,2BAbC;EAczBC,uBAAuB,EAAE,4BAdA;EAezBC,4BAA4B,EAAE,iCAfL;EAgBzBC,0BAA0B,EAAE,+BAhBH;EAiBzBC,uBAAuB,EAAE;AAjBA,CAAtB;;;;;;;;;;;;;;;;;;;ACAP;AACA;AACO,SAASE,cAAT,GAA0B;EAC7B,IAAIzI,2EAAA,CAAuB,iBAAvB,MAA8C,CAAC,CAAnD,EAAsD;IAClD;EACH;;EACDwI,sDAAA,CAAa,mEAAb,EAAkF;IAC9EI,UAAU,EAAE;MACRC,QAAQ,EAAE;IADF,CADkE;IAI9EC,OAAO,EAAEvI,wEAAmBA;EAJkD,CAAlF,EAKGwI,OALH;EAMAP,8DAAA,CAAqB;IACjBS,CAAC,EAAE1I,wEADc;IAEjB2I,GAAG,EAAEvI,+DAFY;IAGjBwI,SAAS,EAAE3H,8DAASA;EAHH,CAArB;EAKAgH,+DAAA,CAAsB;IAClBa,GAAG,EAAErI,6DADa;IAElBH,OAAO,EAAEyI,MAAM,CAACC,IAAP,CAAY1I,4DAAZ,EACJ2I,GADI,CACA,UAAAC,IAAI;MAAA,iBAAOA,IAAP,cAAe5I,4DAAO,CAAC4I,IAAD,CAAtB;IAAA,CADJ,EAEJC,IAFI,CAEC,GAFD;EAFS,CAAtB;AAMH;AACD,iEAAelB,iDAAf;;;;;;;;;;;;;;;;;;;ACxBA;AACA;AACO,SAASmB,OAAT,CAAiBC,MAAjB,EAAyB;EAC5BnB,0DAAc;EACdD,0DAAA,CAAcoB,MAAd;AACH;AACM,SAASE,cAAT,CAAwBF,MAAxB,EAAgC;EACnC,SAASG,IAAT,GAAgB;IACZjH,6CAAC,CAAC8G,MAAD,CAAD;EACH;;EACDD,OAAO,CAACI,IAAD,CAAP;AACH;;;;;;;;;;;;;;;;;;ACXD;AACA;AACO,SAASC,iBAAT,CAA2BJ,MAA3B,EAAmC;EACtC,SAASG,IAAT,GAAgB;IACZ,IAAIE,KAAK,CAACC,OAAN,CAAcN,MAAd,CAAJ,EAA2B;MACvBA,MAAM,CAACO,OAAP,CAAe,UAAAC,QAAQ;QAAA,OAAIA,QAAQ,EAAZ;MAAA,CAAvB;IACH,CAFD,MAGK;MACDR,MAAM;IACT;EACJ;;EACDD,kDAAO,CAACI,IAAD,CAAP;AACH;AACM,IAAMM,wBAAwB,GAAG,SAA3BA,wBAA2B,CAACjJ,YAAD,EAAkB;EACtD,IAAIjC,MAAM,CAACmL,mBAAX,EAAgC;IAC5B,OAAOnL,MAAM,CAACmL,mBAAd;EACH;;EACD,cAAwDnL,MAAxD;EAAA,IAAQoL,qBAAR,WAAQA,qBAAR;EAAA,IAA+BC,oBAA/B,WAA+BA,oBAA/B;EACA,IAAMC,OAAO,GAAG,IAAID,oBAAJ,GACXE,SADW,CACDjK,2DADC,EAEXkK,WAFW,CAEClL,6DAFD,EAGXmL,eAHW,CAGKxJ,YAHL,CAAhB;EAIA,IAAMyJ,QAAQ,GAAG,IAAIN,qBAAJ,CAA0B,yBAA1B,EAAqDvJ,6DAArD,EAA+DhB,mEAA/D,EAA+E,YAAM,CAAG,CAAxF,EAA0F8K,UAA1F,CAAqGL,OAArG,CAAjB;EACAI,QAAQ,CAACE,QAAT,CAAkBC,QAAQ,CAACC,IAA3B,EAAiC,KAAjC;EACAJ,QAAQ,CAACK,mBAAT,GAXsD,CAWtB;;EAChC/L,MAAM,CAACmL,mBAAP,GAA6BO,QAA7B;EACA,OAAO1L,MAAM,CAACmL,mBAAd;AACH,CAdM;;;;;;;;;;ACbP;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACPA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,gBAAgB,+CAA+C;;AAE/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACtCA;;AAEA,eAAe,mBAAO,CAAC,wFAA6B;AACpD,gBAAgB,mBAAO,CAAC,gHAAyC;AACjE,uBAAuB,mBAAO,CAAC,iEAAe;;AAE9C,YAAY,mBAAO,CAAC,qDAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,2FAA+B;;AAEvD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;AAC5C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS,GAAG;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,+CAA+C;AAC/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,wBAAwB,iDAAiD;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,+BAA+B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B;AAC3B,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,0CAA0C;AAC1C,2CAA2C;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,MAAM;AACN,2EAA2E;AAC3E;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACr4DA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,mBAAO,CAAC,qDAAS;;AAExC;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;AAC5C;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;;;;;;;;;AC9BA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;;AAE5C;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC;AACnC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oCAAoC;AACpC;AACA;;AAEA;AACA;AACA,wBAAwB;AACxB;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,SAAS;AAClB;AACA;AACA;AACA;AACA,iDAAiD;AACjD,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA,cAAc,0BAA0B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,kCAAkC;AAClC;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChYA,YAAY,mBAAO,CAAC,6DAAiB;;AAErC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;;AAE5C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,qDAAqD,KAAK;AAC1D,uDAAuD,KAAK;AAC5D;AACA,WAAW,aAAa,YAAY;AACpC;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,+DAA+D;AAC/D;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,oBAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,iBAAiB;AAChC;AACA,eAAe,kBAAkB;AACjC;AACA,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,8BAA8B;;AAE9B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;;AAE1B;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,qBAAqB;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAsC,OAAO;AAC7C;AACA,qEAAqE;AACrE,iEAAiE;AACjE;AACA;AACA,kCAAkC;AAClC,kCAAkC;AAClC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,oBAAoB;AACnC;AACA,eAAe,QAAQ;AACvB,eAAe,iBAAiB;AAChC;AACA,eAAe,SAAS;AACxB;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B;AAC1B,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ,0CAA0C;AAClD,eAAe,OAAO;AACtB,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,qEAAqE;AACrE,UAAU;AACV;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,kBAAkB;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;;;;;;;;;;;AC9mBA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB;;AAEpB;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACzEA;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASa,gBAAT,GAA4B;EACxB,IAAMC,IAAI,GAAGtI,6CAAC,CAAClB,oFAAD,CAAD,CAAsCyJ,IAAtC,CAA2C,MAA3C,CAAb;;EACA,IAAID,IAAJ,EAAU;IACNjM,MAAM,CAACmM,QAAP,CAAgBF,IAAhB,GAAuBA,IAAvB;EACH;AACJ;;AACD,SAASG,eAAT,GAA2B;EACvBzI,6CAAC,CAAClB,sFAAD,CAAD,CAAwC8B,QAAxC,CAAiD,SAAjD;AACH;;AACD,SAAS8H,mBAAT,CAA6BhI,CAA7B,EAAgC;EAC5BA,CAAC,CAACK,cAAF;EACA0H,eAAe;EACf,IAAME,QAAQ,GAAG3I,6CAAC,CAAClB,oFAAD,CAAD,CACZwC,cADY,GAEZsH,IAFY,CAEP,UAAAC,KAAK;IAAA,OAAIA,KAAK,CAAClC,IAAN,KAAe,UAAnB;EAAA,CAFE,CAAjB;EAGAzF,6EAAkB,CAACpC,oFAAD,CAAlB,CACKgK,IADL,CACU,YAAM;IACZ,IAAIH,QAAQ,IAAIrK,iEAAhB,EAA8B;MAC1B,IAAMyJ,QAAQ,GAAGR,mFAAwB,CAACjJ,iEAAD,CAAzC;MACAyJ,QAAQ,CAACgB,WAAT,CAAqB;QACjBC,GAAG,EAAExE,6FADY;QAEjByE,OAAO,EAAE;UACLrH,IAAI,EAAE+G,QAAQ,CAACO,KAAT,CAAeC,IAAf,GAAsBC,OAAtB,CAA8B,SAA9B,EAAyC,GAAzC;QADD;MAFQ,CAArB;IAMH;EACJ,CAXD,WAYW,UAACC,GAAD,EAAS;IAChB3D,mEAAA,CAAuB2D,GAAvB;EACH,CAdD,aAea,YAAM;IACfhB,gBAAgB;EACnB,CAjBD;AAkBH;;AACD,SAAS9H,IAAT,GAAgB;EACZ;EACA,IAAIN,+DAAJ,CAAkBnB,oFAAlB,EAAsD,2BAAtD,EAAmF,wBAAnF,EAA6G,yBAA7G;EACAkB,6CAAC,CAAClB,oFAAD,CAAD,CACK+B,GADL,CACS,QADT,EAEKP,EAFL,CAEQ,QAFR,EAEkBoI,mBAFlB;EAGA1I,6CAAC,CAAClB,oFAAD,CAAD,CACK+B,GADL,CACS,OADT,EAEKP,EAFL,CAEQ,OAFR,EAEiB+H,gBAFjB;AAGH;;AACDnB,4EAAiB,CAAC3G,IAAD,CAAjB,C","sources":["webpack://leadin/./scripts/constants/leadinConfig.ts","webpack://leadin/./scripts/constants/selectors.ts","webpack://leadin/./scripts/feedback/ThickBoxModal.ts","webpack://leadin/./scripts/feedback/feedbackFormApi.ts","webpack://leadin/./scripts/iframe/integratedMessages/core/CoreMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/forms/FormsMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/index.ts","webpack://leadin/./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/plugin/PluginMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts","webpack://leadin/./scripts/lib/Raven.ts","webpack://leadin/./scripts/utils/appUtils.ts","webpack://leadin/./scripts/utils/backgroundAppUtils.ts","webpack://leadin/./node_modules/raven-js/src/configError.js","webpack://leadin/./node_modules/raven-js/src/console.js","webpack://leadin/./node_modules/raven-js/src/raven.js","webpack://leadin/./node_modules/raven-js/src/singleton.js","webpack://leadin/./node_modules/raven-js/src/utils.js","webpack://leadin/./node_modules/raven-js/vendor/TraceKit/tracekit.js","webpack://leadin/./node_modules/raven-js/vendor/json-stringify-safe/stringify.js","webpack://leadin/external window \"jQuery\"","webpack://leadin/webpack/bootstrap","webpack://leadin/webpack/runtime/compat get default export","webpack://leadin/webpack/runtime/define property getters","webpack://leadin/webpack/runtime/global","webpack://leadin/webpack/runtime/hasOwnProperty shorthand","webpack://leadin/webpack/runtime/make namespace object","webpack://leadin/./scripts/entries/feedback.ts"],"sourcesContent":["const { accountName, adminUrl, activationTime, connectionStatus, deviceId, didDisconnect, env, formsScript, meetingsScript, formsScriptPayload, hublet, hubspotBaseUrl, hubspotNonce, iframeUrl, impactLink, lastAuthorizeTime, lastDeauthorizeTime, lastDisconnectTime, leadinPluginVersion, leadinQueryParams, locale, loginUrl, phpVersion, pluginPath, plugins, portalDomain, portalEmail, portalId, redirectNonce, restNonce, restUrl, refreshToken, reviewSkippedDate, theme, trackConsent, wpVersion, contentEmbed, requiresContentEmbedScope, refreshTokenError, } = window.leadinConfig;\nexport { accountName, adminUrl, activationTime, connectionStatus, deviceId, didDisconnect, env, formsScript, meetingsScript, formsScriptPayload, hublet, hubspotBaseUrl, hubspotNonce, iframeUrl, impactLink, lastAuthorizeTime, lastDeauthorizeTime, lastDisconnectTime, leadinPluginVersion, leadinQueryParams, loginUrl, locale, phpVersion, pluginPath, plugins, portalDomain, portalEmail, portalId, redirectNonce, restNonce, restUrl, refreshToken, reviewSkippedDate, theme, trackConsent, wpVersion, contentEmbed, requiresContentEmbedScope, refreshTokenError, };\n","export const domElements = {\n iframe: '#leadin-iframe',\n subMenu: '.toplevel_page_leadin > ul',\n subMenuLinks: '.toplevel_page_leadin > ul a',\n subMenuButtons: '.toplevel_page_leadin > ul > li',\n deactivatePluginButton: '[data-slug=\"leadin\"] .deactivate a',\n deactivateFeedbackForm: 'form.leadin-deactivate-form',\n deactivateFeedbackSubmit: 'button#leadin-feedback-submit',\n deactivateFeedbackSkip: 'button#leadin-feedback-skip',\n thickboxModalClose: '.leadin-modal-close',\n thickboxModalWindow: 'div#TB_window.thickbox-loading',\n thickboxModalContent: 'div#TB_ajaxContent.TB_modal',\n reviewBannerContainer: '#leadin-review-banner',\n reviewBannerLeaveReviewLink: 'a#leave-review-button',\n reviewBannerDismissButton: 'a#dismiss-review-banner-button',\n leadinIframeContainer: 'leadin-iframe-container',\n leadinIframe: 'leadin-iframe',\n leadinIframeFallbackContainer: 'leadin-iframe-fallback-container',\n};\n","import $ from 'jquery';\nimport { domElements } from '../constants/selectors';\nexport default class ThickBoxModal {\n openTriggerSelector;\n inlineContentId;\n windowCssClass;\n contentCssClass;\n constructor(openTriggerSelector, inlineContentId, windowCssClass, contentCssClass) {\n this.openTriggerSelector = openTriggerSelector;\n this.inlineContentId = inlineContentId;\n this.windowCssClass = windowCssClass;\n this.contentCssClass = contentCssClass;\n $(openTriggerSelector).on('click', this.init.bind(this));\n }\n close() {\n //@ts-expect-error global\n window.tb_remove();\n }\n init(e) {\n //@ts-expect-error global\n window.tb_show('', `#TB_inline?inlineId=${this.inlineContentId}&modal=true`);\n // thickbox doesn't respect the width and height url parameters https://core.trac.wordpress.org/ticket/17249\n // We override thickboxes css with !important in the css\n $(domElements.thickboxModalWindow).addClass(this.windowCssClass);\n // have to modify the css of the thickbox content container as well\n $(domElements.thickboxModalContent).addClass(this.contentCssClass);\n // we unbind previous handlers because a thickbox modal is a single global object.\n // Everytime it is re-opened, it still has old handlers bound\n $(domElements.thickboxModalClose)\n .off('click')\n .on('click', this.close);\n e.preventDefault();\n }\n}\n","import $ from 'jquery';\nconst portalId = '6275621';\nconst formId = '0e8807f8-2ac3-4664-b742-44552bfa09e2';\nconst formSubmissionUrl = `https://api.hsforms.com/submissions/v3/integration/submit/${portalId}/${formId}`;\nexport function submitFeedbackForm(formSelector) {\n const formSubmissionPayload = {\n fields: $(formSelector).serializeArray(),\n skipValidation: true,\n };\n return new Promise((resolve, reject) => {\n $.ajax({\n type: 'POST',\n url: formSubmissionUrl,\n contentType: 'application/json',\n data: JSON.stringify(formSubmissionPayload),\n success: resolve,\n error: reject,\n });\n });\n}\n","export const CoreMessages = {\n HandshakeReceive: 'INTEGRATED_APP_EMBEDDER_HANDSHAKE_RECEIVED',\n SendRefreshToken: 'INTEGRATED_APP_EMBEDDER_SEND_REFRESH_TOKEN',\n ReloadParentFrame: 'INTEGRATED_APP_EMBEDDER_RELOAD_PARENT_FRAME',\n RedirectParentFrame: 'INTEGRATED_APP_EMBEDDER_REDIRECT_PARENT_FRAME',\n SendLocale: 'INTEGRATED_APP_EMBEDDER_SEND_LOCALE',\n SendDeviceId: 'INTEGRATED_APP_EMBEDDER_SEND_DEVICE_ID',\n SendIntegratedAppConfig: 'INTEGRATED_APP_EMBEDDER_CONFIG',\n};\n","export const FormMessages = {\n CreateFormAppNavigation: 'CREATE_FORM_APP_NAVIGATION',\n};\n","export * from './core/CoreMessages';\nexport * from './forms/FormsMessages';\nexport * from './livechat/LiveChatMessages';\nexport * from './plugin/PluginMessages';\nexport * from './proxy/ProxyMessages';\n","export const LiveChatMessages = {\n CreateLiveChatAppNavigation: 'CREATE_LIVE_CHAT_APP_NAVIGATION',\n};\n","export const PluginMessages = {\n PluginSettingsNavigation: 'PLUGIN_SETTINGS_NAVIGATION',\n PluginLeadinConfig: 'PLUGIN_LEADIN_CONFIG',\n TrackConsent: 'INTEGRATED_APP_EMBEDDER_TRACK_CONSENT',\n InternalTrackingFetchRequest: 'INTEGRATED_TRACKING_FETCH_REQUEST',\n InternalTrackingFetchResponse: 'INTEGRATED_TRACKING_FETCH_RESPONSE',\n InternalTrackingFetchError: 'INTEGRATED_TRACKING_FETCH_ERROR',\n InternalTrackingChangeRequest: 'INTEGRATED_TRACKING_CHANGE_REQUEST',\n InternalTrackingChangeError: 'INTEGRATED_TRACKING_CHANGE_ERROR',\n BusinessUnitFetchRequest: 'BUSINESS_UNIT_FETCH_REQUEST',\n BusinessUnitFetchResponse: 'BUSINESS_UNIT_FETCH_FETCH_RESPONSE',\n BusinessUnitFetchError: 'BUSINESS_UNIT_FETCH_FETCH_ERROR',\n BusinessUnitChangeRequest: 'BUSINESS_UNIT_CHANGE_REQUEST',\n BusinessUnitChangeError: 'BUSINESS_UNIT_CHANGE_ERROR',\n SkipReviewRequest: 'SKIP_REVIEW_REQUEST',\n SkipReviewResponse: 'SKIP_REVIEW_RESPONSE',\n SkipReviewError: 'SKIP_REVIEW_ERROR',\n RemoveParentQueryParam: 'REMOVE_PARENT_QUERY_PARAM',\n ContentEmbedInstallRequest: 'CONTENT_EMBED_INSTALL_REQUEST',\n ContentEmbedInstallResponse: 'CONTENT_EMBED_INSTALL_RESPONSE',\n ContentEmbedInstallError: 'CONTENT_EMBED_INSTALL_ERROR',\n ContentEmbedActivationRequest: 'CONTENT_EMBED_ACTIVATION_REQUEST',\n ContentEmbedActivationResponse: 'CONTENT_EMBED_ACTIVATION_RESPONSE',\n ContentEmbedActivationError: 'CONTENT_EMBED_ACTIVATION_ERROR',\n};\n","export const ProxyMessages = {\n FetchForms: 'FETCH_FORMS',\n FetchForm: 'FETCH_FORM',\n CreateFormFromTemplate: 'CREATE_FORM_FROM_TEMPLATE',\n FetchAuth: 'FETCH_AUTH',\n FetchMeetingsAndUsers: 'FETCH_MEETINGS_AND_USERS',\n FetchContactsCreateSinceActivation: 'FETCH_CONTACTS_CREATED_SINCE_ACTIVATION',\n FetchOrCreateMeetingUser: 'FETCH_OR_CREATE_MEETING_USER',\n ConnectMeetingsCalendar: 'CONNECT_MEETINGS_CALENDAR',\n TrackFormPreviewRender: 'TRACK_FORM_PREVIEW_RENDER',\n TrackFormCreatedFromTemplate: 'TRACK_FORM_CREATED_FROM_TEMPLATE',\n TrackFormCreationFailed: 'TRACK_FORM_CREATION_FAILED',\n TrackMeetingPreviewRender: 'TRACK_MEETING_PREVIEW_RENDER',\n TrackSidebarMetaChange: 'TRACK_SIDEBAR_META_CHANGE',\n TrackReviewBannerRender: 'TRACK_REVIEW_BANNER_RENDER',\n TrackReviewBannerInteraction: 'TRACK_REVIEW_BANNER_INTERACTION',\n TrackReviewBannerDismissed: 'TRACK_REVIEW_BANNER_DISMISSED',\n TrackPluginDeactivation: 'TRACK_PLUGIN_DEACTIVATION',\n};\n","import Raven from 'raven-js';\nimport { hubspotBaseUrl, phpVersion, wpVersion, leadinPluginVersion, portalId, plugins, } from '../constants/leadinConfig';\nexport function configureRaven() {\n if (hubspotBaseUrl.indexOf('app.hubspot.com') === -1) {\n return;\n }\n Raven.config('https://e9b8f382cdd130c0d415cd977d2be56f@exceptions.hubspot.com/1', {\n instrument: {\n tryCatch: false,\n },\n release: leadinPluginVersion,\n }).install();\n Raven.setTagsContext({\n v: leadinPluginVersion,\n php: phpVersion,\n wordpress: wpVersion,\n });\n Raven.setExtraContext({\n hub: portalId,\n plugins: Object.keys(plugins)\n .map(name => `${name}#${plugins[name]}`)\n .join(','),\n });\n}\nexport default Raven;\n","import $ from 'jquery';\nimport Raven, { configureRaven } from '../lib/Raven';\nexport function initApp(initFn) {\n configureRaven();\n Raven.context(initFn);\n}\nexport function initAppOnReady(initFn) {\n function main() {\n $(initFn);\n }\n initApp(main);\n}\n","import { deviceId, hubspotBaseUrl, locale, portalId, } from '../constants/leadinConfig';\nimport { initApp } from './appUtils';\nexport function initBackgroundApp(initFn) {\n function main() {\n if (Array.isArray(initFn)) {\n initFn.forEach(callback => callback());\n }\n else {\n initFn();\n }\n }\n initApp(main);\n}\nexport const getOrCreateBackgroundApp = (refreshToken) => {\n if (window.LeadinBackgroundApp) {\n return window.LeadinBackgroundApp;\n }\n const { IntegratedAppEmbedder, IntegratedAppOptions } = window;\n const options = new IntegratedAppOptions()\n .setLocale(locale)\n .setDeviceId(deviceId)\n .setRefreshToken(refreshToken);\n const embedder = new IntegratedAppEmbedder('integrated-plugin-proxy', portalId, hubspotBaseUrl, () => { }).setOptions(options);\n embedder.attachTo(document.body, false);\n embedder.postStartAppMessage(); // lets the app know all all data has been passed to it\n window.LeadinBackgroundApp = embedder;\n return window.LeadinBackgroundApp;\n};\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = '' + args.join(' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg = 'Assertion failed: ' + (args.slice(1).join(' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isObject = utils.isObject;\nvar isErrorEvent = utils.isErrorEvent;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n collectWindowErrors: true,\n maxMessageLength: 0,\n\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.19.1',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = undefined;\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} func A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped already\n // for both debugging and to prevent it to being wrapped twice\n wrapped.__raven__ = true;\n wrapped.__inner__ = func;\n\n return wrapped;\n },\n\n /*\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._restoreBuiltIns();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /*\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n // Cases for sending ex as a message, rather than an exception\n var isNotError = !isError(ex);\n var isNotErrorEvent = !isErrorEvent(ex);\n var isErrorEventWithoutError = isErrorEvent(ex) && !ex.error;\n\n if ((isNotError && isNotErrorEvent) || isErrorEventWithoutError) {\n return this.captureMessage(\n ex,\n objectMerge(\n {\n trimHeadFrames: 1,\n stacktrace: true // if we fall back to captureMessage, default to attempting a new trace\n },\n options\n )\n );\n }\n\n // Get actual Error from ErrorEvent\n if (isErrorEvent(ex)) ex = ex.error;\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n\n var data = objectMerge(\n {\n message: msg + '' // Make sure it's actually a string\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = stack.stack[1];\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n if (this._globalOptions.stacktrace || (options && options.stacktrace)) {\n options = objectMerge(\n {\n // fingerprint on msg, not stack trace (legacy behavior, could be\n // revisited)\n fingerprint: msg,\n // since we know this is a synthetic trace, the top N-most frames\n // MUST be from Raven.js, so mark them as in_app later by setting\n // trimHeadFrames\n trimHeadFrames: (options.trimHeadFrames || 0) + 1\n },\n options\n );\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = options || {};\n\n var lastEventId = options.eventId || this.lastEventId();\n if (!lastEventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n var dsn = options.dsn || this._dsn;\n if (!dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var qs = '';\n qs += '?eventId=' + encode(lastEventId);\n qs += '&dsn=' + encode(dsn);\n\n var user = options.user || this._globalContext.user;\n if (user) {\n if (user.name) qs += '&name=' + encode(user.name);\n if (user.email) qs += '&email=' + encode(user.email);\n }\n\n var globalServer = this._getGlobalServer(this._parseDSN(dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/' + qs;\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(originalCallback);\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(fn.handleEvent);\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(fn, undefined, before),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(self.wrap(cb));\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(orig);\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function(data) {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(orig, undefined, onreadystatechangeHandler);\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && 'fetch' in _window) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return origFetch.apply(this, args).then(function(response) {\n fetchData.status_code = response.status;\n\n return response;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n history.pushState &&\n history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function() {\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo.apply(this, arguments);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n culprit: fileurl\n },\n options\n );\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': navigator.userAgent\n };\n }\n\n if (this._hasDocument) {\n if (_document.location && _document.location.href) {\n httpData.url = _document.location.href;\n }\n if (_document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.culprit !== last.culprit // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n retry = request.getResponseHeader('Retry-After');\n retry = parseInt(retry, 10) * 1000; // Retry-After is returned in seconds\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n // If there are no tags/extra, strip the key from the payload alltogther.\n if (isEmptyObject(data.tags)) delete data.tags;\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n var url = opts.url;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n // NOTE: auth is intentionally sent as part of query string (NOT as custom\n // HTTP header) so as to avoid preflight CORS requests\n request.open('POST', url + '?' + urlencode(opts.auth));\n request.send(stringify(opts.data));\n },\n\n _logDebug: function(level) {\n if (this._originalConsoleMethods[level] && this.debug) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n","var _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch ({}.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return supportsErrorEvent() && {}.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isEmptyObject(what) {\n for (var _ in what) return false; // eslint-disable-line guard-for-in, no-unused-vars\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n return !max || str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n if (!match) return {};\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n var orig = obj[name];\n obj[name] = replacement(orig);\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isString: isString,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n return document.location.href;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} message Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(message, url, lineNo, colNo, ex) {\n var stack = null;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (ex && utils.isError(ex)) {\n // non-string `ex` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(ex);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var msg = message; // must be new var or will modify original `arguments`\n var groups;\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n msg = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: msg,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,\n gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\\[native).*?|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i,\n winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n // Used to additionally parse URL/line/column from eval frames\n geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i,\n chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/,\n lines = ex.stack.split('\\n'),\n stack = [],\n submatch,\n parts,\n element,\n reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","module.exports = window[\"jQuery\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import $ from 'jquery';\nimport Raven from '../lib/Raven';\nimport { domElements } from '../constants/selectors';\nimport ThickBoxModal from '../feedback/ThickBoxModal';\nimport { submitFeedbackForm } from '../feedback/feedbackFormApi';\nimport { getOrCreateBackgroundApp, initBackgroundApp, } from '../utils/backgroundAppUtils';\nimport { refreshToken } from '../constants/leadinConfig';\nimport { ProxyMessages } from '../iframe/integratedMessages';\nfunction deactivatePlugin() {\n const href = $(domElements.deactivatePluginButton).attr('href');\n if (href) {\n window.location.href = href;\n }\n}\nfunction setLoadingState() {\n $(domElements.deactivateFeedbackSubmit).addClass('loading');\n}\nfunction submitAndDeactivate(e) {\n e.preventDefault();\n setLoadingState();\n const feedback = $(domElements.deactivateFeedbackForm)\n .serializeArray()\n .find(field => field.name === 'feedback');\n submitFeedbackForm(domElements.deactivateFeedbackForm)\n .then(() => {\n if (feedback && refreshToken) {\n const embedder = getOrCreateBackgroundApp(refreshToken);\n embedder.postMessage({\n key: ProxyMessages.TrackPluginDeactivation,\n payload: {\n type: feedback.value.trim().replace(/[\\s']+/g, '_'),\n },\n });\n }\n })\n .catch((err) => {\n Raven.captureException(err);\n })\n .finally(() => {\n deactivatePlugin();\n });\n}\nfunction init() {\n // eslint-disable-next-line no-new\n new ThickBoxModal(domElements.deactivatePluginButton, 'leadin-feedback-container', 'leadin-feedback-window', 'leadin-feedback-content');\n $(domElements.deactivateFeedbackForm)\n .off('submit')\n .on('submit', submitAndDeactivate);\n $(domElements.deactivateFeedbackSkip)\n .off('click')\n .on('click', deactivatePlugin);\n}\ninitBackgroundApp(init);\n"],"names":["window","leadinConfig","accountName","adminUrl","activationTime","connectionStatus","deviceId","didDisconnect","env","formsScript","meetingsScript","formsScriptPayload","hublet","hubspotBaseUrl","hubspotNonce","iframeUrl","impactLink","lastAuthorizeTime","lastDeauthorizeTime","lastDisconnectTime","leadinPluginVersion","leadinQueryParams","locale","loginUrl","phpVersion","pluginPath","plugins","portalDomain","portalEmail","portalId","redirectNonce","restNonce","restUrl","refreshToken","reviewSkippedDate","theme","trackConsent","wpVersion","contentEmbed","requiresContentEmbedScope","refreshTokenError","domElements","iframe","subMenu","subMenuLinks","subMenuButtons","deactivatePluginButton","deactivateFeedbackForm","deactivateFeedbackSubmit","deactivateFeedbackSkip","thickboxModalClose","thickboxModalWindow","thickboxModalContent","reviewBannerContainer","reviewBannerLeaveReviewLink","reviewBannerDismissButton","leadinIframeContainer","leadinIframe","leadinIframeFallbackContainer","$","ThickBoxModal","openTriggerSelector","inlineContentId","windowCssClass","contentCssClass","on","init","bind","tb_remove","e","tb_show","addClass","off","close","preventDefault","formId","formSubmissionUrl","submitFeedbackForm","formSelector","formSubmissionPayload","fields","serializeArray","skipValidation","Promise","resolve","reject","ajax","type","url","contentType","data","JSON","stringify","success","error","CoreMessages","HandshakeReceive","SendRefreshToken","ReloadParentFrame","RedirectParentFrame","SendLocale","SendDeviceId","SendIntegratedAppConfig","FormMessages","CreateFormAppNavigation","LiveChatMessages","CreateLiveChatAppNavigation","PluginMessages","PluginSettingsNavigation","PluginLeadinConfig","TrackConsent","InternalTrackingFetchRequest","InternalTrackingFetchResponse","InternalTrackingFetchError","InternalTrackingChangeRequest","InternalTrackingChangeError","BusinessUnitFetchRequest","BusinessUnitFetchResponse","BusinessUnitFetchError","BusinessUnitChangeRequest","BusinessUnitChangeError","SkipReviewRequest","SkipReviewResponse","SkipReviewError","RemoveParentQueryParam","ContentEmbedInstallRequest","ContentEmbedInstallResponse","ContentEmbedInstallError","ContentEmbedActivationRequest","ContentEmbedActivationResponse","ContentEmbedActivationError","ProxyMessages","FetchForms","FetchForm","CreateFormFromTemplate","FetchAuth","FetchMeetingsAndUsers","FetchContactsCreateSinceActivation","FetchOrCreateMeetingUser","ConnectMeetingsCalendar","TrackFormPreviewRender","TrackFormCreatedFromTemplate","TrackFormCreationFailed","TrackMeetingPreviewRender","TrackSidebarMetaChange","TrackReviewBannerRender","TrackReviewBannerInteraction","TrackReviewBannerDismissed","TrackPluginDeactivation","Raven","configureRaven","indexOf","config","instrument","tryCatch","release","install","setTagsContext","v","php","wordpress","setExtraContext","hub","Object","keys","map","name","join","initApp","initFn","context","initAppOnReady","main","initBackgroundApp","Array","isArray","forEach","callback","getOrCreateBackgroundApp","LeadinBackgroundApp","IntegratedAppEmbedder","IntegratedAppOptions","options","setLocale","setDeviceId","setRefreshToken","embedder","setOptions","attachTo","document","body","postStartAppMessage","deactivatePlugin","href","attr","location","setLoadingState","submitAndDeactivate","feedback","find","field","then","postMessage","key","payload","value","trim","replace","err","captureException"],"sourceRoot":""} \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/gutenberg.asset.php b/wp/wp-content/plugins/leadin/build/gutenberg.asset.php deleted file mode 100644 index 978812f7..00000000 --- a/wp/wp-content/plugins/leadin/build/gutenberg.asset.php +++ /dev/null @@ -1 +0,0 @@ - array('jquery', 'react', 'wp-blocks', 'wp-components', 'wp-data', 'wp-edit-post', 'wp-element', 'wp-i18n', 'wp-plugins'), 'version' => '35981db121a1ec4bcc7f'); diff --git a/wp/wp-content/plugins/leadin/build/gutenberg.css b/wp/wp-content/plugins/leadin/build/gutenberg.css deleted file mode 100644 index e796fb33..00000000 --- a/wp/wp-content/plugins/leadin/build/gutenberg.css +++ /dev/null @@ -1,67 +0,0 @@ -/*!***************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/gutenberg/UIComponents/UIImage.ts ***! - \***************************************************************************************************************************************************************************/ -.ump7xqy{height:var(--ump7xqy-0);width:var(--ump7xqy-1);} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL2d1dGVuYmVyZy9VSUNvbXBvbmVudHMvVUlJbWFnZS50cyJdLCJuYW1lcyI6WyIudW1wN3hxeSJdLCJtYXBwaW5ncyI6IkFBQ2VBIiwiZmlsZSI6Ii91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL2d1dGVuYmVyZy9VSUNvbXBvbmVudHMvVUlJbWFnZS50cyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BsaW5hcmlhL3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IHN0eWxlZC5pbWcgYFxuICBoZWlnaHQ6ICR7cHJvcHMgPT4gKHByb3BzLmhlaWdodCA/IHByb3BzLmhlaWdodCA6ICdhdXRvJyl9O1xuICB3aWR0aDogJHtwcm9wcyA9PiAocHJvcHMud2lkdGggPyBwcm9wcy53aWR0aCA6ICdhdXRvJyl9O1xuYDtcbiJdfQ==*/ -/*!*************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIButton.ts ***! - \*************************************************************************************************************************************************************************/ -.ug152ch{background-color:var(--ug152ch-0);border:3px solid var(--ug152ch-0);color:#ffffff;border-radius:3px;font-size:14px;line-height:14px;padding:12px 24px;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-weight:500;white-space:nowrap;} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlCdXR0b24udHMiXSwibmFtZXMiOlsiLnVnMTUyY2giXSwibWFwcGluZ3MiOiJBQUVlQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvVUlDb21wb25lbnRzL1VJQnV0dG9uLnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuaW1wb3J0IHsgSEVGRkFMVU1QLCBMT1JBWCwgT0xBRiB9IGZyb20gJy4vY29sb3JzJztcbmV4cG9ydCBkZWZhdWx0IHN0eWxlZC5idXR0b24gYFxuICBiYWNrZ3JvdW5kLWNvbG9yOiR7cHJvcHMgPT4gKHByb3BzLnVzZSA9PT0gJ3RlcnRpYXJ5JyA/IEhFRkZBTFVNUCA6IExPUkFYKX07XG4gIGJvcmRlcjogM3B4IHNvbGlkICR7cHJvcHMgPT4gKHByb3BzLnVzZSA9PT0gJ3RlcnRpYXJ5JyA/IEhFRkZBTFVNUCA6IExPUkFYKX07XG4gIGNvbG9yOiAke09MQUZ9XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTRweDtcbiAgcGFkZGluZzogMTJweCAyNHB4O1xuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbmA7XG4iXX0=*/ -/*!****************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIContainer.ts ***! - \****************************************************************************************************************************************************************************/ -.ua13n1c{text-align:var(--ua13n1c-0);} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlDb250YWluZXIudHMiXSwibmFtZXMiOlsiLnVhMTNuMWMiXSwibWFwcGluZ3MiOiJBQUNlQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvVUlDb21wb25lbnRzL1VJQ29udGFpbmVyLnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgc3R5bGVkLmRpdiBgXG4gIHRleHQtYWxpZ246ICR7cHJvcHMgPT4gKHByb3BzLnRleHRBbGlnbiA/IHByb3BzLnRleHRBbGlnbiA6ICdpbmhlcml0Jyl9O1xuYDtcbiJdfQ==*/ -/*!*************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/HubspotWrapper.ts ***! - \*************************************************************************************************************************************************************************/ -.h1q5v5ee{background-image:var(--h1q5v5ee-0);background-color:#f5f8fa;background-repeat:no-repeat;background-position:center 25px;background-size:120px;color:#33475b;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-size:14px;padding:var(--h1q5v5ee-1);}.h1q5v5ee p{font-size:inherit !important;line-height:24px;margin:4px 0;} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9Db21tb24vSHVic3BvdFdyYXBwZXIudHMiXSwibmFtZXMiOlsiLmgxcTV2NWVlIl0sIm1hcHBpbmdzIjoiQUFDZUEiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvc2hhcmVkL0NvbW1vbi9IdWJzcG90V3JhcHBlci50cyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BsaW5hcmlhL3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IHN0eWxlZC5kaXYgYFxuICBiYWNrZ3JvdW5kLWltYWdlOiAke3Byb3BzID0+IGB1cmwoJHtwcm9wcy5wbHVnaW5QYXRofS9wdWJsaWMvYXNzZXRzL2ltYWdlcy9odWJzcG90LnN2ZylgfTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjhmYTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIDI1cHg7XG4gIGJhY2tncm91bmQtc2l6ZTogMTIwcHg7XG4gIGNvbG9yOiAjMzM0NzViO1xuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxNHB4O1xuXG4gIHBhZGRpbmc6ICR7KHByb3BzKSA9PiBwcm9wcy5wYWRkaW5nIHx8ICc5MHB4IDIwJSAyNXB4J307XG5cbiAgcCB7XG4gICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgbGluZS1oZWlnaHQ6IDI0cHg7XG4gICAgbWFyZ2luOiA0cHggMDtcbiAgfVxuYDtcbiJdfQ==*/ -/*!*************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpacer.ts ***! - \*************************************************************************************************************************************************************************/ -.u3qxofx{height:30px;} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlTcGFjZXIudHMiXSwibmFtZXMiOlsiLnUzcXhvZngiXSwibWFwcGluZ3MiOiJBQUNlQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvVUlDb21wb25lbnRzL1VJU3BhY2VyLnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgc3R5bGVkLmRpdiBgXG4gIGhlaWdodDogMzBweDtcbmA7XG4iXX0=*/ -/*!**************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIOverlay.ts ***! - \**************************************************************************************************************************************************************************/ -.u1q7a48k{position:relative;}.u1q7a48k:after{content:'';position:absolute;top:0;bottom:0;right:0;left:0;} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlPdmVybGF5LnRzIl0sIm5hbWVzIjpbIi51MXE3YTQ4ayJdLCJtYXBwaW5ncyI6IkFBQ2VBIiwiZmlsZSI6Ii91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlPdmVybGF5LnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgc3R5bGVkLmRpdiBgXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAmOmFmdGVyIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcbiAgICBsZWZ0OiAwO1xuICB9XG5gO1xuIl19*/ -/*!***************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpinner.tsx ***! - \***************************************************************************************************************************************************************************/ -.sxa9zrc{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#00a4bd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;margin:'2px';} -.s14430wa{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;} -.ct87ghk{fill:none;stroke:var(--ct87ghk-0);stroke-width:5;stroke-linecap:round;-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;} -.avili0h{fill:none;stroke:var(--avili0h-0);stroke-width:5;stroke-linecap:round;-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-animation:dashAnimation-avili0h 2s ease-in-out infinite,spinAnimation-avili0h 2s linear infinite;animation:dashAnimation-avili0h 2s ease-in-out infinite,spinAnimation-avili0h 2s linear infinite;}@-webkit-keyframes dashAnimation-avili0h{0%{stroke-dasharray:1,150;stroke-dashoffset:0;}50%{stroke-dasharray:90,150;stroke-dashoffset:-50;}100%{stroke-dasharray:90,150;stroke-dashoffset:-140;}}@keyframes dashAnimation-avili0h{0%{stroke-dasharray:1,150;stroke-dashoffset:0;}50%{stroke-dasharray:90,150;stroke-dashoffset:-50;}100%{stroke-dasharray:90,150;stroke-dashoffset:-140;}}@-webkit-keyframes spinAnimation-avili0h{{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes spinAnimation-avili0h{{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlTcGlubmVyLnRzeCJdLCJuYW1lcyI6WyIuc3hhOXpyYyIsIi5zMTQ0MzB3YSIsIi5jdDg3Z2hrIiwiLmF2aWxpMGgiXSwibWFwcGluZ3MiOiJBQUdxQkE7QUFVQUM7QUFPTkM7QUFPUUMiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvc2hhcmVkL1VJQ29tcG9uZW50cy9VSVNwaW5uZXIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BsaW5hcmlhL3JlYWN0JztcbmltcG9ydCB7IENBTFlQU09fTUVESVVNLCBDQUxZUFNPIH0gZnJvbSAnLi9jb2xvcnMnO1xuY29uc3QgU3Bpbm5lck91dGVyID0gc3R5bGVkLmRpdiBgXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGNvbG9yOiAjMDBhNGJkO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luOiAnMnB4JztcbmA7XG5jb25zdCBTcGlubmVySW5uZXIgPSBzdHlsZWQuZGl2IGBcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG5gO1xuY29uc3QgQ2lyY2xlID0gc3R5bGVkLmNpcmNsZSBgXG4gIGZpbGw6IG5vbmU7XG4gIHN0cm9rZTogJHtwcm9wcyA9PiBwcm9wcy5jb2xvcn07XG4gIHN0cm9rZS13aWR0aDogNTtcbiAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG5gO1xuY29uc3QgQW5pbWF0ZWRDaXJjbGUgPSBzdHlsZWQuY2lyY2xlIGBcbiAgZmlsbDogbm9uZTtcbiAgc3Ryb2tlOiAke3Byb3BzID0+IHByb3BzLmNvbG9yfTtcbiAgc3Ryb2tlLXdpZHRoOiA1O1xuICBzdHJva2UtbGluZWNhcDogcm91bmQ7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjtcbiAgYW5pbWF0aW9uOiBkYXNoQW5pbWF0aW9uIDJzIGVhc2UtaW4tb3V0IGluZmluaXRlLFxuICAgIHNwaW5BbmltYXRpb24gMnMgbGluZWFyIGluZmluaXRlO1xuXG4gIEBrZXlmcmFtZXMgZGFzaEFuaW1hdGlvbiB7XG4gICAgMCUge1xuICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSwgMTUwO1xuICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IDA7XG4gICAgfVxuXG4gICAgNTAlIHtcbiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDkwLCAxNTA7XG4gICAgICBzdHJva2UtZGFzaG9mZnNldDogLTUwO1xuICAgIH1cblxuICAgIDEwMCUge1xuICAgICAgc3Ryb2tlLWRhc2hhcnJheTogOTAsIDE1MDtcbiAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAtMTQwO1xuICAgIH1cbiAgfVxuXG4gIEBrZXlmcmFtZXMgc3BpbkFuaW1hdGlvbiB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgfVxuYDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFVJU3Bpbm5lcih7IHNpemUgPSAyMCB9KSB7XG4gICAgcmV0dXJuIChfanN4KFNwaW5uZXJPdXRlciwgeyBjaGlsZHJlbjogX2pzeChTcGlubmVySW5uZXIsIHsgY2hpbGRyZW46IF9qc3hzKFwic3ZnXCIsIHsgaGVpZ2h0OiBzaXplLCB3aWR0aDogc2l6ZSwgdmlld0JveDogXCIwIDAgNTAgNTBcIiwgY2hpbGRyZW46IFtfanN4KENpcmNsZSwgeyBjb2xvcjogQ0FMWVBTT19NRURJVU0sIGN4OiBcIjI1XCIsIGN5OiBcIjI1XCIsIHI6IFwiMjIuNVwiIH0pLCBfanN4KEFuaW1hdGVkQ2lyY2xlLCB7IGNvbG9yOiBDQUxZUFNPLCBjeDogXCIyNVwiLCBjeTogXCIyNVwiLCByOiBcIjIyLjVcIiB9KV0gfSkgfSkgfSkpO1xufVxuIl19*/ -/*!***********************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/AsyncSelect.tsx ***! - \***********************************************************************************************************************************************************************/ -.c1wxx7eu{color:#33475b;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-size:14px;position:relative;} -.c1rgwbep{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:hsl(0,0%,100%);border-color:hsl(0,0%,80%);border-radius:4px;border-style:solid;border-width:var(--c1rgwbep-0);cursor:default;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:38px;outline:0 !important;position:relative;-webkit-transition:all 100ms;transition:all 100ms;box-sizing:border-box;box-shadow:var(--c1rgwbep-1);}.c1rgwbep:hover{border-color:hsl(0,0%,70%);} -.v1mdmbaj{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:2px 8px;position:relative;overflow:hidden;box-sizing:border-box;} -.p1gwkvxy{color:hsl(0,0%,50%);margin-left:2px;margin-right:2px;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);box-sizing:border-box;font-size:16px;} -.s1bwlafs{color:hsl(0,0%,20%);margin-left:2px;margin-right:2px;max-width:calc(100% - 8px);overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);box-sizing:border-box;} -.i196z9y5{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;box-sizing:border-box;} -.d1dfo5ow{border-top:8px solid #00a4bd;border-left:6px solid transparent;border-right:6px solid transparent;width:0px;height:0px;margin:10px;} -.if3lze{margin:2px;padding-bottom:2px;padding-top:2px;visibility:visible;color:hsl(0,0%,20%);box-sizing:border-box;} -.i9kxf50{box-sizing:content-box;background:rgba(0,0,0,0) none repeat scroll 0px center;border:0px none;font-size:inherit;opacity:1;outline:currentcolor none 0px;padding:0px;color:inherit;font-family:inherit;} -.igjr3uc{position:absolute;opacity:0;font-size:inherit;} -.mhb9if7{position:absolute;top:100%;background-color:#fff;border-radius:4px;margin-bottom:8px;margin-top:8px;z-index:9999;box-shadow:0 0 0 1px hsla(0,0%,0%,0.1),0 4px 11px hsla(0,0%,0%,0.1);width:100%;} -.mxaof7s{max-height:300px;overflow-y:auto;padding-bottom:4px;padding-top:4px;position:relative;} -.mw50s5v{padding-bottom:8px;padding-top:8px;} -.m11rzvjw{color:#999;cursor:default;font-size:75%;font-weight:500;margin-bottom:0.25em;text-transform:uppercase;padding-left:12px;padding-left:12px;} -.m1jcdsjv{display:block;background-color:var(--m1jcdsjv-0);color:var(--m1jcdsjv-1);cursor:default;font-size:inherit;width:100%;padding:8px 12px;}.m1jcdsjv:hover{background-color:var(--m1jcdsjv-2);} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9Db21tb24vQXN5bmNTZWxlY3QudHN4Il0sIm5hbWVzIjpbIi5jMXd4eDdldSIsIi5jMXJnd2JlcCIsIi52MW1kbWJhaiIsIi5wMWd3a3Z4eSIsIi5zMWJ3bGFmcyIsIi5pMTk2ejl5NSIsIi5kMWRmbzVvdyIsIi5pZjNsemUiLCIuaTlreGY1MCIsIi5pZ2pyM3VjIiwiLm1oYjlpZjciLCIubXhhb2Y3cyIsIi5tdzUwczV2IiwiLm0xMXJ6dmp3IiwiLm0xamNkc2p2Il0sIm1hcHBpbmdzIjoiQUFNa0JBO0FBTU9DO0FBcUJGQztBQVVIQztBQVVBQztBQWFPQztBQU9EQztBQVFIQztBQVFUQztBQVdNQztBQUtFQztBQVdMQztBQU9DQztBQUlNQztBQVVQQyIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvQ29tbW9uL0FzeW5jU2VsZWN0LnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbGluYXJpYS9yZWFjdCc7XG5pbXBvcnQgeyBDQUxZUFNPLCBDQUxZUFNPX0xJR0hULCBDQUxZUFNPX01FRElVTSwgT0JTSURJQU4sIH0gZnJvbSAnLi4vVUlDb21wb25lbnRzL2NvbG9ycyc7XG5pbXBvcnQgVUlTcGlubmVyIGZyb20gJy4uL1VJQ29tcG9uZW50cy9VSVNwaW5uZXInO1xuaW1wb3J0IExvYWRTdGF0ZSBmcm9tICcuLi9lbnVtcy9sb2FkU3RhdGUnO1xuY29uc3QgQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGNvbG9yOiAke09CU0lESUFOfTtcbiAgZm9udC1mYW1pbHk6ICdMZXhlbmQgRGVjYScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuYDtcbmNvbnN0IENvbnRyb2xDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDAsIDAlLCAxMDAlKTtcbiAgYm9yZGVyLWNvbG9yOiBoc2woMCwgMCUsIDgwJSk7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLXdpZHRoOiAke3Byb3BzID0+IChwcm9wcy5mb2N1c2VkID8gJzAnIDogJzFweCcpfTtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgbWluLWhlaWdodDogMzhweDtcbiAgb3V0bGluZTogMCAhaW1wb3J0YW50O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRyYW5zaXRpb246IGFsbCAxMDBtcztcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy5mb2N1c2VkID8gYDAgMCAwIDJweCAke0NBTFlQU09fTUVESVVNfWAgOiAnbm9uZSd9O1xuICAmOmhvdmVyIHtcbiAgICBib3JkZXItY29sb3I6IGhzbCgwLCAwJSwgNzAlKTtcbiAgfVxuYDtcbmNvbnN0IFZhbHVlQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXg6IDE7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgcGFkZGluZzogMnB4IDhweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuYDtcbmNvbnN0IFBsYWNlaG9sZGVyID0gc3R5bGVkLmRpdiBgXG4gIGNvbG9yOiBoc2woMCwgMCUsIDUwJSk7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG4gIG1hcmdpbi1yaWdodDogMnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGZvbnQtc2l6ZTogMTZweDtcbmA7XG5jb25zdCBTaW5nbGVWYWx1ZSA9IHN0eWxlZC5kaXYgYFxuICBjb2xvcjogaHNsKDAsIDAlLCAyMCUpO1xuICBtYXJnaW4tbGVmdDogMnB4O1xuICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA4cHgpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuYDtcbmNvbnN0IEluZGljYXRvckNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXNocmluazogMDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbmA7XG5jb25zdCBEcm9wZG93bkluZGljYXRvciA9IHN0eWxlZC5kaXYgYFxuICBib3JkZXItdG9wOiA4cHggc29saWQgJHtDQUxZUFNPfTtcbiAgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJpZ2h0OiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIHdpZHRoOiAwcHg7XG4gIGhlaWdodDogMHB4O1xuICBtYXJnaW46IDEwcHg7XG5gO1xuY29uc3QgSW5wdXRDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgbWFyZ2luOiAycHg7XG4gIHBhZGRpbmctYm90dG9tOiAycHg7XG4gIHBhZGRpbmctdG9wOiAycHg7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIGNvbG9yOiBoc2woMCwgMCUsIDIwJSk7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5gO1xuY29uc3QgSW5wdXQgPSBzdHlsZWQuaW5wdXQgYFxuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwKSBub25lIHJlcGVhdCBzY3JvbGwgMHB4IGNlbnRlcjtcbiAgYm9yZGVyOiAwcHggbm9uZTtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICBvcGFjaXR5OiAxO1xuICBvdXRsaW5lOiBjdXJyZW50Y29sb3Igbm9uZSAwcHg7XG4gIHBhZGRpbmc6IDBweDtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuYDtcbmNvbnN0IElucHV0U2hhZG93ID0gc3R5bGVkLmRpdiBgXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgb3BhY2l0eTogMDtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuYDtcbmNvbnN0IE1lbnVDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBtYXJnaW4tdG9wOiA4cHg7XG4gIHotaW5kZXg6IDk5OTk7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDFweCBoc2xhKDAsIDAlLCAwJSwgMC4xKSwgMCA0cHggMTFweCBoc2xhKDAsIDAlLCAwJSwgMC4xKTtcbiAgd2lkdGg6IDEwMCU7XG5gO1xuY29uc3QgTWVudUxpc3QgPSBzdHlsZWQuZGl2IGBcbiAgbWF4LWhlaWdodDogMzAwcHg7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIHBhZGRpbmctYm90dG9tOiA0cHg7XG4gIHBhZGRpbmctdG9wOiA0cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XG5jb25zdCBNZW51R3JvdXAgPSBzdHlsZWQuZGl2IGBcbiAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgcGFkZGluZy10b3A6IDhweDtcbmA7XG5jb25zdCBNZW51R3JvdXBIZWFkZXIgPSBzdHlsZWQuZGl2IGBcbiAgY29sb3I6ICM5OTk7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgZm9udC1zaXplOiA3NSU7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIG1hcmdpbi1ib3R0b206IDAuMjVlbTtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgcGFkZGluZy1sZWZ0OiAxMnB4O1xuICBwYWRkaW5nLWxlZnQ6IDEycHg7XG5gO1xuY29uc3QgTWVudUl0ZW0gPSBzdHlsZWQuZGl2IGBcbiAgZGlzcGxheTogYmxvY2s7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMuc2VsZWN0ZWQgPyBDQUxZUFNPX01FRElVTSA6ICd0cmFuc3BhcmVudCd9O1xuICBjb2xvcjogJHtwcm9wcyA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnI2ZmZicgOiAnaW5oZXJpdCcpfTtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiA4cHggMTJweDtcbiAgJjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy5zZWxlY3RlZCA/IENBTFlQU09fTUVESVVNIDogQ0FMWVBTT19MSUdIVH07XG4gIH1cbmA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBc3luY1NlbGVjdCh7IHBsYWNlaG9sZGVyLCB2YWx1ZSwgbG9hZE9wdGlvbnMsIG9uQ2hhbmdlLCBkZWZhdWx0T3B0aW9ucywgfSkge1xuICAgIGNvbnN0IGlucHV0RWwgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgaW5wdXRTaGFkb3dFbCA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBbaXNGb2N1c2VkLCBzZXRGb2N1c10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW2xvYWRTdGF0ZSwgc2V0TG9hZFN0YXRlXSA9IHVzZVN0YXRlKExvYWRTdGF0ZS5Ob3RMb2FkZWQpO1xuICAgIGNvbnN0IFtsb2NhbFZhbHVlLCBzZXRMb2NhbFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZShkZWZhdWx0T3B0aW9ucyk7XG4gICAgY29uc3QgaW5wdXRTaXplID0gYCR7aW5wdXRTaGFkb3dFbC5jdXJyZW50ID8gaW5wdXRTaGFkb3dFbC5jdXJyZW50LmNsaWVudFdpZHRoICsgMTAgOiAyfXB4YDtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAobG9hZE9wdGlvbnMgJiYgbG9hZFN0YXRlID09PSBMb2FkU3RhdGUuTm90TG9hZGVkKSB7XG4gICAgICAgICAgICBsb2FkT3B0aW9ucygnJywgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldE9wdGlvbnMocmVzdWx0KTtcbiAgICAgICAgICAgICAgICBzZXRMb2FkU3RhdGUoTG9hZFN0YXRlLklkbGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCBbbG9hZE9wdGlvbnMsIGxvYWRTdGF0ZV0pO1xuICAgIGNvbnN0IHJlbmRlckl0ZW1zID0gKGl0ZW1zID0gW10sIHBhcmVudEtleSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ub3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoX2pzeHMoTWVudUdyb3VwLCB7IGNoaWxkcmVuOiBbX2pzeChNZW51R3JvdXBIZWFkZXIsIHsgaWQ6IGAke2luZGV4fS1oZWFkaW5nYCwgY2hpbGRyZW46IGl0ZW0ubGFiZWwgfSksIF9qc3goXCJkaXZcIiwgeyBjaGlsZHJlbjogcmVuZGVySXRlbXMoaXRlbS5vcHRpb25zLCBpbmRleCkgfSldIH0sIGBhc3luYy1zZWxlY3QtaXRlbS0ke2luZGV4fWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGBhc3luYy1zZWxlY3QtaXRlbS0ke3BhcmVudEtleSAhPT0gdW5kZWZpbmVkID8gYCR7cGFyZW50S2V5fS0ke2luZGV4fWAgOiBpbmRleH1gO1xuICAgICAgICAgICAgICAgIHJldHVybiAoX2pzeChNZW51SXRlbSwgeyBpZDoga2V5LCBzZWxlY3RlZDogdmFsdWUgJiYgaXRlbS52YWx1ZSA9PT0gdmFsdWUudmFsdWUsIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9jdXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9LCBjaGlsZHJlbjogaXRlbS5sYWJlbCB9LCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gKF9qc3hzKENvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKENvbnRyb2xDb250YWluZXIsIHsgaWQ6IFwibGVhZGluLWFzeW5jLXNlbGVjdG9yXCIsIGZvY3VzZWQ6IGlzRm9jdXNlZCwgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRFbC5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbC5jdXJyZW50LmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvY3VzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldExvY2FsVmFsdWUoJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RWwuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RWwuY3VycmVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9jdXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBjaGlsZHJlbjogW19qc3hzKFZhbHVlQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbbG9jYWxWYWx1ZSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCF2YWx1ZSA/IChfanN4KFBsYWNlaG9sZGVyLCB7IGNoaWxkcmVuOiBwbGFjZWhvbGRlciB9KSkgOiAoX2pzeChTaW5nbGVWYWx1ZSwgeyBjaGlsZHJlbjogdmFsdWUubGFiZWwgfSkpKSwgX2pzeHMoSW5wdXRDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KElucHV0LCB7IHJlZjogaW5wdXRFbCwgb25Gb2N1czogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb2N1cyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkNoYW5nZTogZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldExvY2FsVmFsdWUoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRMb2FkU3RhdGUoTG9hZFN0YXRlLkxvYWRpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkT3B0aW9ucyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE9wdGlvbnMoZS50YXJnZXQudmFsdWUsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRPcHRpb25zKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TG9hZFN0YXRlKExvYWRTdGF0ZS5JZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHZhbHVlOiBsb2NhbFZhbHVlLCB3aWR0aDogaW5wdXRTaXplLCBpZDogXCJhc3ljbi1zZWxlY3QtaW5wdXRcIiB9KSwgX2pzeChJbnB1dFNoYWRvdywgeyByZWY6IGlucHV0U2hhZG93RWwsIGNoaWxkcmVuOiBsb2NhbFZhbHVlIH0pXSB9KV0gfSksIF9qc3hzKEluZGljYXRvckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW2xvYWRTdGF0ZSA9PT0gTG9hZFN0YXRlLkxvYWRpbmcgJiYgX2pzeChVSVNwaW5uZXIsIHt9KSwgX2pzeChEcm9wZG93bkluZGljYXRvciwge30pXSB9KV0gfSksIGlzRm9jdXNlZCAmJiAoX2pzeChNZW51Q29udGFpbmVyLCB7IGNoaWxkcmVuOiBfanN4KE1lbnVMaXN0LCB7IGNoaWxkcmVuOiByZW5kZXJJdGVtcyhvcHRpb25zKSB9KSB9KSldIH0pKTtcbn1cbiJdfQ==*/ -/*!*************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIAlert.tsx ***! - \*************************************************************************************************************************************************************************/ -.a1h8m4fo{background-color:#fef8f0;border-color:#fae0b5;color:#33475b;font-size:14px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-style:solid;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-width:1px;min-height:60px;padding:8px 20px;position:relative;text-align:left;} -.tyndzxk{font-family:'Lexend Deca';font-style:normal;font-weight:700;font-size:16px;line-height:19px;color:#33475b;margin:0;padding:0;} -.m1m9sbk4{font-family:'Lexend Deca';font-style:normal;font-weight:400;font-size:14px;margin:0;padding:0;} -.mg5o421{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlBbGVydC50c3giXSwibmFtZXMiOlsiLmExaDhtNGZvIiwiLnR5bmR6eGsiLCIubTFtOXNiazQiLCIubWc1bzQyMSJdLCJtYXBwaW5ncyI6IkFBR3VCQTtBQW1CVEM7QUFVRUM7QUFRU0MiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvc2hhcmVkL1VJQ29tcG9uZW50cy9VSUFsZXJ0LnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbGluYXJpYS9yZWFjdCc7XG5pbXBvcnQgeyBNQVJJR09MRF9MSUdIVCwgTUFSSUdPTERfTUVESVVNLCBPQlNJRElBTiB9IGZyb20gJy4vY29sb3JzJztcbmNvbnN0IEFsZXJ0Q29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGJhY2tncm91bmQtY29sb3I6ICR7TUFSSUdPTERfTElHSFR9O1xuICBib3JkZXItY29sb3I6ICR7TUFSSUdPTERfTUVESVVNfTtcbiAgY29sb3I6ICR7T0JTSURJQU59O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgZGlzcGxheTogZmxleDtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1yaWdodC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkO1xuICBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBtaW4taGVpZ2h0OiA2MHB4O1xuICBwYWRkaW5nOiA4cHggMjBweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuYDtcbmNvbnN0IFRpdGxlID0gc3R5bGVkLnAgYFxuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJztcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogNzAwO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxOXB4O1xuICBjb2xvcjogJHtPQlNJRElBTn07XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbmA7XG5jb25zdCBNZXNzYWdlID0gc3R5bGVkLnAgYFxuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJztcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogNDAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbmA7XG5jb25zdCBNZXNzYWdlQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5gO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVUlBbGVydCh7IHRpdGxlVGV4dCwgdGl0bGVNZXNzYWdlLCBjaGlsZHJlbiwgfSkge1xuICAgIHJldHVybiAoX2pzeHMoQWxlcnRDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhNZXNzYWdlQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeChUaXRsZSwgeyBjaGlsZHJlbjogdGl0bGVUZXh0IH0pLCBfanN4KE1lc3NhZ2UsIHsgY2hpbGRyZW46IHRpdGxlTWVzc2FnZSB9KV0gfSksIGNoaWxkcmVuXSB9KSk7XG59XG4iXX0=*/ - -/*# sourceMappingURL=gutenberg.css.map*/ \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/gutenberg.css.map b/wp/wp-content/plugins/leadin/build/gutenberg.css.map deleted file mode 100644 index 3d4d7b5b..00000000 --- a/wp/wp-content/plugins/leadin/build/gutenberg.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gutenberg.css","mappings":";;;AACeA,SAAAA,uBAAAA,CAAAA,sBAAAA,CAAAA;ACAf,2tBAA2tB,C;;;;ACC5sBC,SAAAA,iCAAAA,CAAAA,iCAAAA,CAAAA,aAAAA,CAAAA,iBAAAA,CAAAA,cAAAA,CAAAA,gBAAAA,CAAAA,iBAAAA,CAAAA,oDAAAA,CAAAA,eAAAA,CAAAA,kBAAAA,CAAAA;ACDf,2mCAA2mC,C;;;;ACA5lCC,SAAAA,2BAAAA,CAAAA;ACAf,+pBAA+pB,C;;;;ACAhpBC,UAAAA,kCAAAA,CAAAA,wBAAAA,CAAAA,2BAAAA,CAAAA,+BAAAA,CAAAA,qBAAAA,CAAAA,aAAAA,CAAAA,oDAAAA,CAAAA,cAAAA,CAAAA,yBAAAA,CAAAA,CAAAA,YAAAA,4BAAAA,CAAAA,gBAAAA,CAAAA,YAAAA,CAAAA;ACAf,+qCAA+qC,C;;;;ACAhqCC,SAAAA,WAAAA,CAAAA;ACAf,ukBAAukB,C;;;;ACAxjBC,UAAAA,iBAAAA,CAAAA,CAAAA,gBAAAA,UAAAA,CAAAA,iBAAAA,CAAAA,KAAAA,CAAAA,QAAAA,CAAAA,OAAAA,CAAAA,MAAAA,CAAAA;ACAf,mvBAAmvB,C;;;;ACE9tBC,SAAAA,0BAAAA,CAAAA,wBAAAA,CAAAA,qBAAAA,CAAAA,kBAAAA,CAAAA,aAAAA,CAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,6BAAAA,CAAAA,yBAAAA,CAAAA,qBAAAA,CAAAA,uBAAAA,CAAAA,8BAAAA,CAAAA,oBAAAA,CAAAA,sBAAAA,CAAAA,UAAAA,CAAAA,WAAAA,CAAAA,YAAAA,CAAAA;AAUAC,UAAAA,0BAAAA,CAAAA,wBAAAA,CAAAA,qBAAAA,CAAAA,kBAAAA,CAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,uBAAAA,CAAAA,8BAAAA,CAAAA,oBAAAA,CAAAA,sBAAAA,CAAAA,UAAAA,CAAAA,WAAAA,CAAAA;AAONC,SAAAA,SAAAA,CAAAA,uBAAAA,CAAAA,cAAAA,CAAAA,oBAAAA,CAAAA,+BAAAA,CAAAA,2BAAAA,CAAAA,uBAAAA,CAAAA;AAOQC,SAAAA,SAAAA,CAAAA,uBAAAA,CAAAA,cAAAA,CAAAA,oBAAAA,CAAAA,+BAAAA,CAAAA,2BAAAA,CAAAA,uBAAAA,CAAAA,wGAAAA,CAAAA,gGAAAA,CAAAA,CAAAA,yCAAAA,GAAAA,sBAAAA,CAAAA,mBAAAA,CAAAA,CAAAA,IAAAA,uBAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,KAAAA,uBAAAA,CAAAA,sBAAAA,CAAAA,CAAAA,CAAAA,iCAAAA,GAAAA,sBAAAA,CAAAA,mBAAAA,CAAAA,CAAAA,IAAAA,uBAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,KAAAA,uBAAAA,CAAAA,sBAAAA,CAAAA,CAAAA,CAAAA,yCAAAA,CAAAA,gCAAAA,CAAAA,4BAAAA,CAAAA,wBAAAA,CAAAA,CAAAA,CAAAA,iCAAAA,CAAAA,gCAAAA,CAAAA,4BAAAA,CAAAA,wBAAAA,CAAAA,CAAAA;ACvBvB,usFAAusF,C;;;;ACErrFC,UAAAA,aAAAA,CAAAA,oDAAAA,CAAAA,cAAAA,CAAAA,iBAAAA,CAAAA;AAMOC,UAAAA,0BAAAA,CAAAA,wBAAAA,CAAAA,qBAAAA,CAAAA,kBAAAA,CAAAA,+BAAAA,CAAAA,0BAAAA,CAAAA,iBAAAA,CAAAA,kBAAAA,CAAAA,8BAAAA,CAAAA,cAAAA,CAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,sBAAAA,CAAAA,kBAAAA,CAAAA,cAAAA,CAAAA,wBAAAA,CAAAA,qCAAAA,CAAAA,qBAAAA,CAAAA,6BAAAA,CAAAA,eAAAA,CAAAA,oBAAAA,CAAAA,iBAAAA,CAAAA,4BAAAA,CAAAA,oBAAAA,CAAAA,qBAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,gBAAAA,0BAAAA,CAAAA;AAqBFC,UAAAA,0BAAAA,CAAAA,wBAAAA,CAAAA,qBAAAA,CAAAA,kBAAAA,CAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,cAAAA,CAAAA,UAAAA,CAAAA,MAAAA,CAAAA,sBAAAA,CAAAA,kBAAAA,CAAAA,cAAAA,CAAAA,eAAAA,CAAAA,iBAAAA,CAAAA,eAAAA,CAAAA,qBAAAA,CAAAA;AAUHC,UAAAA,mBAAAA,CAAAA,eAAAA,CAAAA,gBAAAA,CAAAA,iBAAAA,CAAAA,OAAAA,CAAAA,kCAAAA,CAAAA,8BAAAA,CAAAA,0BAAAA,CAAAA,qBAAAA,CAAAA,cAAAA,CAAAA;AAUAC,UAAAA,mBAAAA,CAAAA,eAAAA,CAAAA,gBAAAA,CAAAA,0BAAAA,CAAAA,eAAAA,CAAAA,iBAAAA,CAAAA,sBAAAA,CAAAA,kBAAAA,CAAAA,OAAAA,CAAAA,kCAAAA,CAAAA,8BAAAA,CAAAA,0BAAAA,CAAAA,qBAAAA,CAAAA;AAaOC,UAAAA,0BAAAA,CAAAA,wBAAAA,CAAAA,qBAAAA,CAAAA,kBAAAA,CAAAA,0BAAAA,CAAAA,2BAAAA,CAAAA,kBAAAA,CAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,qBAAAA,CAAAA,mBAAAA,CAAAA,aAAAA,CAAAA,qBAAAA,CAAAA;AAODC,UAAAA,4BAAAA,CAAAA,iCAAAA,CAAAA,kCAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,WAAAA,CAAAA;AAQHC,QAAAA,UAAAA,CAAAA,kBAAAA,CAAAA,eAAAA,CAAAA,kBAAAA,CAAAA,mBAAAA,CAAAA,qBAAAA,CAAAA;AAQTC,SAAAA,sBAAAA,CAAAA,sDAAAA,CAAAA,eAAAA,CAAAA,iBAAAA,CAAAA,SAAAA,CAAAA,6BAAAA,CAAAA,WAAAA,CAAAA,aAAAA,CAAAA,mBAAAA,CAAAA;AAWMC,SAAAA,iBAAAA,CAAAA,SAAAA,CAAAA,iBAAAA,CAAAA;AAKEC,SAAAA,iBAAAA,CAAAA,QAAAA,CAAAA,qBAAAA,CAAAA,iBAAAA,CAAAA,iBAAAA,CAAAA,cAAAA,CAAAA,YAAAA,CAAAA,mEAAAA,CAAAA,UAAAA,CAAAA;AAWLC,SAAAA,gBAAAA,CAAAA,eAAAA,CAAAA,kBAAAA,CAAAA,eAAAA,CAAAA,iBAAAA,CAAAA;AAOCC,SAAAA,kBAAAA,CAAAA,eAAAA,CAAAA;AAIMC,UAAAA,UAAAA,CAAAA,cAAAA,CAAAA,aAAAA,CAAAA,eAAAA,CAAAA,oBAAAA,CAAAA,wBAAAA,CAAAA,iBAAAA,CAAAA,iBAAAA,CAAAA;AAUPC,UAAAA,aAAAA,CAAAA,kCAAAA,CAAAA,uBAAAA,CAAAA,cAAAA,CAAAA,iBAAAA,CAAAA,UAAAA,CAAAA,gBAAAA,CAAAA,CAAAA,gBAAAA,kCAAAA,CAAAA;AC1HjB,ugVAAugV,C;;;;ACZh/UC,UAAAA,wBAAAA,CAAAA,oBAAAA,CAAAA,aAAAA,CAAAA,cAAAA,CAAAA,0BAAAA,CAAAA,wBAAAA,CAAAA,qBAAAA,CAAAA,kBAAAA,CAAAA,wBAAAA,CAAAA,qCAAAA,CAAAA,qBAAAA,CAAAA,6BAAAA,CAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,kBAAAA,CAAAA,sBAAAA,CAAAA,wBAAAA,CAAAA,yBAAAA,CAAAA,uBAAAA,CAAAA,gBAAAA,CAAAA,eAAAA,CAAAA,gBAAAA,CAAAA,iBAAAA,CAAAA,eAAAA,CAAAA;AAmBTC,SAAAA,yBAAAA,CAAAA,iBAAAA,CAAAA,eAAAA,CAAAA,cAAAA,CAAAA,gBAAAA,CAAAA,aAAAA,CAAAA,QAAAA,CAAAA,SAAAA,CAAAA;AAUEC,UAAAA,yBAAAA,CAAAA,iBAAAA,CAAAA,eAAAA,CAAAA,cAAAA,CAAAA,QAAAA,CAAAA,SAAAA,CAAAA;AAQSC,SAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,6BAAAA,CAAAA,yBAAAA,CAAAA,qBAAAA,CAAAA;ACpCzB,+zEAA+zE,C","sources":["webpack://leadin/./scripts/gutenberg/UIComponents/UIImage.ts","webpack://leadin/./scripts/gutenberg/UIComponents/UIImage.ts","webpack://leadin/./scripts/shared/UIComponents/UIButton.ts","webpack://leadin/./scripts/shared/UIComponents/UIButton.ts","webpack://leadin/./scripts/shared/UIComponents/UIContainer.ts","webpack://leadin/./scripts/shared/UIComponents/UIContainer.ts","webpack://leadin/./scripts/shared/Common/HubspotWrapper.ts","webpack://leadin/./scripts/shared/Common/HubspotWrapper.ts","webpack://leadin/./scripts/shared/UIComponents/UISpacer.ts","webpack://leadin/./scripts/shared/UIComponents/UISpacer.ts","webpack://leadin/./scripts/shared/UIComponents/UIOverlay.ts","webpack://leadin/./scripts/shared/UIComponents/UIOverlay.ts","webpack://leadin/./scripts/shared/UIComponents/UISpinner.tsx","webpack://leadin/./scripts/shared/UIComponents/UISpinner.tsx","webpack://leadin/./scripts/shared/Common/AsyncSelect.tsx","webpack://leadin/./scripts/shared/Common/AsyncSelect.tsx","webpack://leadin/./scripts/shared/UIComponents/UIAlert.tsx","webpack://leadin/./scripts/shared/UIComponents/UIAlert.tsx"],"sourcesContent":["import { styled } from '@linaria/react';\nexport default styled.img `\n height: ${props => (props.height ? props.height : 'auto')};\n width: ${props => (props.width ? props.width : 'auto')};\n`;\n",".ump7xqy{height:var(--ump7xqy-0);width:var(--ump7xqy-1);}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL2d1dGVuYmVyZy9VSUNvbXBvbmVudHMvVUlJbWFnZS50cyJdLCJuYW1lcyI6WyIudW1wN3hxeSJdLCJtYXBwaW5ncyI6IkFBQ2VBIiwiZmlsZSI6Ii91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL2d1dGVuYmVyZy9VSUNvbXBvbmVudHMvVUlJbWFnZS50cyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BsaW5hcmlhL3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IHN0eWxlZC5pbWcgYFxuICBoZWlnaHQ6ICR7cHJvcHMgPT4gKHByb3BzLmhlaWdodCA/IHByb3BzLmhlaWdodCA6ICdhdXRvJyl9O1xuICB3aWR0aDogJHtwcm9wcyA9PiAocHJvcHMud2lkdGggPyBwcm9wcy53aWR0aCA6ICdhdXRvJyl9O1xuYDtcbiJdfQ==*/","import { styled } from '@linaria/react';\nimport { HEFFALUMP, LORAX, OLAF } from './colors';\nexport default styled.button `\n background-color:${props => (props.use === 'tertiary' ? HEFFALUMP : LORAX)};\n border: 3px solid ${props => (props.use === 'tertiary' ? HEFFALUMP : LORAX)};\n color: ${OLAF}\n border-radius: 3px;\n font-size: 14px;\n line-height: 14px;\n padding: 12px 24px;\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-weight: 500;\n white-space: nowrap;\n`;\n",".ug152ch{background-color:var(--ug152ch-0);border:3px solid var(--ug152ch-0);color:#ffffff;border-radius:3px;font-size:14px;line-height:14px;padding:12px 24px;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-weight:500;white-space:nowrap;}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlCdXR0b24udHMiXSwibmFtZXMiOlsiLnVnMTUyY2giXSwibWFwcGluZ3MiOiJBQUVlQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvVUlDb21wb25lbnRzL1VJQnV0dG9uLnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuaW1wb3J0IHsgSEVGRkFMVU1QLCBMT1JBWCwgT0xBRiB9IGZyb20gJy4vY29sb3JzJztcbmV4cG9ydCBkZWZhdWx0IHN0eWxlZC5idXR0b24gYFxuICBiYWNrZ3JvdW5kLWNvbG9yOiR7cHJvcHMgPT4gKHByb3BzLnVzZSA9PT0gJ3RlcnRpYXJ5JyA/IEhFRkZBTFVNUCA6IExPUkFYKX07XG4gIGJvcmRlcjogM3B4IHNvbGlkICR7cHJvcHMgPT4gKHByb3BzLnVzZSA9PT0gJ3RlcnRpYXJ5JyA/IEhFRkZBTFVNUCA6IExPUkFYKX07XG4gIGNvbG9yOiAke09MQUZ9XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTRweDtcbiAgcGFkZGluZzogMTJweCAyNHB4O1xuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbmA7XG4iXX0=*/","import { styled } from '@linaria/react';\nexport default styled.div `\n text-align: ${props => (props.textAlign ? props.textAlign : 'inherit')};\n`;\n",".ua13n1c{text-align:var(--ua13n1c-0);}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlDb250YWluZXIudHMiXSwibmFtZXMiOlsiLnVhMTNuMWMiXSwibWFwcGluZ3MiOiJBQUNlQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvVUlDb21wb25lbnRzL1VJQ29udGFpbmVyLnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgc3R5bGVkLmRpdiBgXG4gIHRleHQtYWxpZ246ICR7cHJvcHMgPT4gKHByb3BzLnRleHRBbGlnbiA/IHByb3BzLnRleHRBbGlnbiA6ICdpbmhlcml0Jyl9O1xuYDtcbiJdfQ==*/","import { styled } from '@linaria/react';\nexport default styled.div `\n background-image: ${props => `url(${props.pluginPath}/public/assets/images/hubspot.svg)`};\n background-color: #f5f8fa;\n background-repeat: no-repeat;\n background-position: center 25px;\n background-size: 120px;\n color: #33475b;\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-size: 14px;\n\n padding: ${(props) => props.padding || '90px 20% 25px'};\n\n p {\n font-size: inherit !important;\n line-height: 24px;\n margin: 4px 0;\n }\n`;\n",".h1q5v5ee{background-image:var(--h1q5v5ee-0);background-color:#f5f8fa;background-repeat:no-repeat;background-position:center 25px;background-size:120px;color:#33475b;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-size:14px;padding:var(--h1q5v5ee-1);}.h1q5v5ee p{font-size:inherit !important;line-height:24px;margin:4px 0;}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9Db21tb24vSHVic3BvdFdyYXBwZXIudHMiXSwibmFtZXMiOlsiLmgxcTV2NWVlIl0sIm1hcHBpbmdzIjoiQUFDZUEiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvc2hhcmVkL0NvbW1vbi9IdWJzcG90V3JhcHBlci50cyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BsaW5hcmlhL3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IHN0eWxlZC5kaXYgYFxuICBiYWNrZ3JvdW5kLWltYWdlOiAke3Byb3BzID0+IGB1cmwoJHtwcm9wcy5wbHVnaW5QYXRofS9wdWJsaWMvYXNzZXRzL2ltYWdlcy9odWJzcG90LnN2ZylgfTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjhmYTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIDI1cHg7XG4gIGJhY2tncm91bmQtc2l6ZTogMTIwcHg7XG4gIGNvbG9yOiAjMzM0NzViO1xuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxNHB4O1xuXG4gIHBhZGRpbmc6ICR7KHByb3BzKSA9PiBwcm9wcy5wYWRkaW5nIHx8ICc5MHB4IDIwJSAyNXB4J307XG5cbiAgcCB7XG4gICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgbGluZS1oZWlnaHQ6IDI0cHg7XG4gICAgbWFyZ2luOiA0cHggMDtcbiAgfVxuYDtcbiJdfQ==*/","import { styled } from '@linaria/react';\nexport default styled.div `\n height: 30px;\n`;\n",".u3qxofx{height:30px;}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlTcGFjZXIudHMiXSwibmFtZXMiOlsiLnUzcXhvZngiXSwibWFwcGluZ3MiOiJBQUNlQSIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvVUlDb21wb25lbnRzL1VJU3BhY2VyLnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgc3R5bGVkLmRpdiBgXG4gIGhlaWdodDogMzBweDtcbmA7XG4iXX0=*/","import { styled } from '@linaria/react';\nexport default styled.div `\n position: relative;\n\n &:after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n left: 0;\n }\n`;\n",".u1q7a48k{position:relative;}.u1q7a48k:after{content:'';position:absolute;top:0;bottom:0;right:0;left:0;}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlPdmVybGF5LnRzIl0sIm5hbWVzIjpbIi51MXE3YTQ4ayJdLCJtYXBwaW5ncyI6IkFBQ2VBIiwiZmlsZSI6Ii91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlPdmVybGF5LnRzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQGxpbmFyaWEvcmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgc3R5bGVkLmRpdiBgXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAmOmFmdGVyIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcbiAgICBsZWZ0OiAwO1xuICB9XG5gO1xuIl19*/","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { styled } from '@linaria/react';\nimport { CALYPSO_MEDIUM, CALYPSO } from './colors';\nconst SpinnerOuter = styled.div `\n align-items: center;\n color: #00a4bd;\n display: flex;\n flex-direction: column;\n justify-content: center;\n width: 100%;\n height: 100%;\n margin: '2px';\n`;\nconst SpinnerInner = styled.div `\n align-items: center;\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n`;\nconst Circle = styled.circle `\n fill: none;\n stroke: ${props => props.color};\n stroke-width: 5;\n stroke-linecap: round;\n transform-origin: center;\n`;\nconst AnimatedCircle = styled.circle `\n fill: none;\n stroke: ${props => props.color};\n stroke-width: 5;\n stroke-linecap: round;\n transform-origin: center;\n animation: dashAnimation 2s ease-in-out infinite,\n spinAnimation 2s linear infinite;\n\n @keyframes dashAnimation {\n 0% {\n stroke-dasharray: 1, 150;\n stroke-dashoffset: 0;\n }\n\n 50% {\n stroke-dasharray: 90, 150;\n stroke-dashoffset: -50;\n }\n\n 100% {\n stroke-dasharray: 90, 150;\n stroke-dashoffset: -140;\n }\n }\n\n @keyframes spinAnimation {\n transform: rotate(360deg);\n }\n`;\nexport default function UISpinner({ size = 20 }) {\n return (_jsx(SpinnerOuter, { children: _jsx(SpinnerInner, { children: _jsxs(\"svg\", { height: size, width: size, viewBox: \"0 0 50 50\", children: [_jsx(Circle, { color: CALYPSO_MEDIUM, cx: \"25\", cy: \"25\", r: \"22.5\" }), _jsx(AnimatedCircle, { color: CALYPSO, cx: \"25\", cy: \"25\", r: \"22.5\" })] }) }) }));\n}\n",".sxa9zrc{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#00a4bd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;margin:'2px';}\n.s14430wa{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;}\n.ct87ghk{fill:none;stroke:var(--ct87ghk-0);stroke-width:5;stroke-linecap:round;-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;}\n.avili0h{fill:none;stroke:var(--avili0h-0);stroke-width:5;stroke-linecap:round;-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-animation:dashAnimation-avili0h 2s ease-in-out infinite,spinAnimation-avili0h 2s linear infinite;animation:dashAnimation-avili0h 2s ease-in-out infinite,spinAnimation-avili0h 2s linear infinite;}@-webkit-keyframes dashAnimation-avili0h{0%{stroke-dasharray:1,150;stroke-dashoffset:0;}50%{stroke-dasharray:90,150;stroke-dashoffset:-50;}100%{stroke-dasharray:90,150;stroke-dashoffset:-140;}}@keyframes dashAnimation-avili0h{0%{stroke-dasharray:1,150;stroke-dashoffset:0;}50%{stroke-dasharray:90,150;stroke-dashoffset:-50;}100%{stroke-dasharray:90,150;stroke-dashoffset:-140;}}@-webkit-keyframes spinAnimation-avili0h{{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes spinAnimation-avili0h{{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlTcGlubmVyLnRzeCJdLCJuYW1lcyI6WyIuc3hhOXpyYyIsIi5zMTQ0MzB3YSIsIi5jdDg3Z2hrIiwiLmF2aWxpMGgiXSwibWFwcGluZ3MiOiJBQUdxQkE7QUFVQUM7QUFPTkM7QUFPUUMiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvc2hhcmVkL1VJQ29tcG9uZW50cy9VSVNwaW5uZXIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BsaW5hcmlhL3JlYWN0JztcbmltcG9ydCB7IENBTFlQU09fTUVESVVNLCBDQUxZUFNPIH0gZnJvbSAnLi9jb2xvcnMnO1xuY29uc3QgU3Bpbm5lck91dGVyID0gc3R5bGVkLmRpdiBgXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGNvbG9yOiAjMDBhNGJkO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luOiAnMnB4JztcbmA7XG5jb25zdCBTcGlubmVySW5uZXIgPSBzdHlsZWQuZGl2IGBcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG5gO1xuY29uc3QgQ2lyY2xlID0gc3R5bGVkLmNpcmNsZSBgXG4gIGZpbGw6IG5vbmU7XG4gIHN0cm9rZTogJHtwcm9wcyA9PiBwcm9wcy5jb2xvcn07XG4gIHN0cm9rZS13aWR0aDogNTtcbiAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG5gO1xuY29uc3QgQW5pbWF0ZWRDaXJjbGUgPSBzdHlsZWQuY2lyY2xlIGBcbiAgZmlsbDogbm9uZTtcbiAgc3Ryb2tlOiAke3Byb3BzID0+IHByb3BzLmNvbG9yfTtcbiAgc3Ryb2tlLXdpZHRoOiA1O1xuICBzdHJva2UtbGluZWNhcDogcm91bmQ7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjtcbiAgYW5pbWF0aW9uOiBkYXNoQW5pbWF0aW9uIDJzIGVhc2UtaW4tb3V0IGluZmluaXRlLFxuICAgIHNwaW5BbmltYXRpb24gMnMgbGluZWFyIGluZmluaXRlO1xuXG4gIEBrZXlmcmFtZXMgZGFzaEFuaW1hdGlvbiB7XG4gICAgMCUge1xuICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSwgMTUwO1xuICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IDA7XG4gICAgfVxuXG4gICAgNTAlIHtcbiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDkwLCAxNTA7XG4gICAgICBzdHJva2UtZGFzaG9mZnNldDogLTUwO1xuICAgIH1cblxuICAgIDEwMCUge1xuICAgICAgc3Ryb2tlLWRhc2hhcnJheTogOTAsIDE1MDtcbiAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAtMTQwO1xuICAgIH1cbiAgfVxuXG4gIEBrZXlmcmFtZXMgc3BpbkFuaW1hdGlvbiB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgfVxuYDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFVJU3Bpbm5lcih7IHNpemUgPSAyMCB9KSB7XG4gICAgcmV0dXJuIChfanN4KFNwaW5uZXJPdXRlciwgeyBjaGlsZHJlbjogX2pzeChTcGlubmVySW5uZXIsIHsgY2hpbGRyZW46IF9qc3hzKFwic3ZnXCIsIHsgaGVpZ2h0OiBzaXplLCB3aWR0aDogc2l6ZSwgdmlld0JveDogXCIwIDAgNTAgNTBcIiwgY2hpbGRyZW46IFtfanN4KENpcmNsZSwgeyBjb2xvcjogQ0FMWVBTT19NRURJVU0sIGN4OiBcIjI1XCIsIGN5OiBcIjI1XCIsIHI6IFwiMjIuNVwiIH0pLCBfanN4KEFuaW1hdGVkQ2lyY2xlLCB7IGNvbG9yOiBDQUxZUFNPLCBjeDogXCIyNVwiLCBjeTogXCIyNVwiLCByOiBcIjIyLjVcIiB9KV0gfSkgfSkgfSkpO1xufVxuIl19*/","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useRef, useState, useEffect } from 'react';\nimport { styled } from '@linaria/react';\nimport { CALYPSO, CALYPSO_LIGHT, CALYPSO_MEDIUM, OBSIDIAN, } from '../UIComponents/colors';\nimport UISpinner from '../UIComponents/UISpinner';\nimport LoadState from '../enums/loadState';\nconst Container = styled.div `\n color: ${OBSIDIAN};\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-size: 14px;\n position: relative;\n`;\nconst ControlContainer = styled.div `\n align-items: center;\n background-color: hsl(0, 0%, 100%);\n border-color: hsl(0, 0%, 80%);\n border-radius: 4px;\n border-style: solid;\n border-width: ${props => (props.focused ? '0' : '1px')};\n cursor: default;\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n min-height: 38px;\n outline: 0 !important;\n position: relative;\n transition: all 100ms;\n box-sizing: border-box;\n box-shadow: ${props => props.focused ? `0 0 0 2px ${CALYPSO_MEDIUM}` : 'none'};\n &:hover {\n border-color: hsl(0, 0%, 70%);\n }\n`;\nconst ValueContainer = styled.div `\n align-items: center;\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n padding: 2px 8px;\n position: relative;\n overflow: hidden;\n box-sizing: border-box;\n`;\nconst Placeholder = styled.div `\n color: hsl(0, 0%, 50%);\n margin-left: 2px;\n margin-right: 2px;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n box-sizing: border-box;\n font-size: 16px;\n`;\nconst SingleValue = styled.div `\n color: hsl(0, 0%, 20%);\n margin-left: 2px;\n margin-right: 2px;\n max-width: calc(100% - 8px);\n overflow: hidden;\n position: absolute;\n text-overflow: ellipsis;\n white-space: nowrap;\n top: 50%;\n transform: translateY(-50%);\n box-sizing: border-box;\n`;\nconst IndicatorContainer = styled.div `\n align-items: center;\n align-self: stretch;\n display: flex;\n flex-shrink: 0;\n box-sizing: border-box;\n`;\nconst DropdownIndicator = styled.div `\n border-top: 8px solid ${CALYPSO};\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n width: 0px;\n height: 0px;\n margin: 10px;\n`;\nconst InputContainer = styled.div `\n margin: 2px;\n padding-bottom: 2px;\n padding-top: 2px;\n visibility: visible;\n color: hsl(0, 0%, 20%);\n box-sizing: border-box;\n`;\nconst Input = styled.input `\n box-sizing: content-box;\n background: rgba(0, 0, 0, 0) none repeat scroll 0px center;\n border: 0px none;\n font-size: inherit;\n opacity: 1;\n outline: currentcolor none 0px;\n padding: 0px;\n color: inherit;\n font-family: inherit;\n`;\nconst InputShadow = styled.div `\n position: absolute;\n opacity: 0;\n font-size: inherit;\n`;\nconst MenuContainer = styled.div `\n position: absolute;\n top: 100%;\n background-color: #fff;\n border-radius: 4px;\n margin-bottom: 8px;\n margin-top: 8px;\n z-index: 9999;\n box-shadow: 0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1);\n width: 100%;\n`;\nconst MenuList = styled.div `\n max-height: 300px;\n overflow-y: auto;\n padding-bottom: 4px;\n padding-top: 4px;\n position: relative;\n`;\nconst MenuGroup = styled.div `\n padding-bottom: 8px;\n padding-top: 8px;\n`;\nconst MenuGroupHeader = styled.div `\n color: #999;\n cursor: default;\n font-size: 75%;\n font-weight: 500;\n margin-bottom: 0.25em;\n text-transform: uppercase;\n padding-left: 12px;\n padding-left: 12px;\n`;\nconst MenuItem = styled.div `\n display: block;\n background-color: ${props => props.selected ? CALYPSO_MEDIUM : 'transparent'};\n color: ${props => (props.selected ? '#fff' : 'inherit')};\n cursor: default;\n font-size: inherit;\n width: 100%;\n padding: 8px 12px;\n &:hover {\n background-color: ${props => props.selected ? CALYPSO_MEDIUM : CALYPSO_LIGHT};\n }\n`;\nexport default function AsyncSelect({ placeholder, value, loadOptions, onChange, defaultOptions, }) {\n const inputEl = useRef(null);\n const inputShadowEl = useRef(null);\n const [isFocused, setFocus] = useState(false);\n const [loadState, setLoadState] = useState(LoadState.NotLoaded);\n const [localValue, setLocalValue] = useState('');\n const [options, setOptions] = useState(defaultOptions);\n const inputSize = `${inputShadowEl.current ? inputShadowEl.current.clientWidth + 10 : 2}px`;\n useEffect(() => {\n if (loadOptions && loadState === LoadState.NotLoaded) {\n loadOptions('', (result) => {\n setOptions(result);\n setLoadState(LoadState.Idle);\n });\n }\n }, [loadOptions, loadState]);\n const renderItems = (items = [], parentKey) => {\n return items.map((item, index) => {\n if (item.options) {\n return (_jsxs(MenuGroup, { children: [_jsx(MenuGroupHeader, { id: `${index}-heading`, children: item.label }), _jsx(\"div\", { children: renderItems(item.options, index) })] }, `async-select-item-${index}`));\n }\n else {\n const key = `async-select-item-${parentKey !== undefined ? `${parentKey}-${index}` : index}`;\n return (_jsx(MenuItem, { id: key, selected: value && item.value === value.value, onClick: () => {\n onChange(item);\n setFocus(false);\n }, children: item.label }, key));\n }\n });\n };\n return (_jsxs(Container, { children: [_jsxs(ControlContainer, { id: \"leadin-async-selector\", focused: isFocused, onClick: () => {\n if (isFocused) {\n if (inputEl.current) {\n inputEl.current.blur();\n }\n setFocus(false);\n setLocalValue('');\n }\n else {\n if (inputEl.current) {\n inputEl.current.focus();\n }\n setFocus(true);\n }\n }, children: [_jsxs(ValueContainer, { children: [localValue === '' &&\n (!value ? (_jsx(Placeholder, { children: placeholder })) : (_jsx(SingleValue, { children: value.label }))), _jsxs(InputContainer, { children: [_jsx(Input, { ref: inputEl, onFocus: () => {\n setFocus(true);\n }, onChange: e => {\n setLocalValue(e.target.value);\n setLoadState(LoadState.Loading);\n loadOptions &&\n loadOptions(e.target.value, (result) => {\n setOptions(result);\n setLoadState(LoadState.Idle);\n });\n }, value: localValue, width: inputSize, id: \"asycn-select-input\" }), _jsx(InputShadow, { ref: inputShadowEl, children: localValue })] })] }), _jsxs(IndicatorContainer, { children: [loadState === LoadState.Loading && _jsx(UISpinner, {}), _jsx(DropdownIndicator, {})] })] }), isFocused && (_jsx(MenuContainer, { children: _jsx(MenuList, { children: renderItems(options) }) }))] }));\n}\n",".c1wxx7eu{color:#33475b;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-size:14px;position:relative;}\n.c1rgwbep{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:hsl(0,0%,100%);border-color:hsl(0,0%,80%);border-radius:4px;border-style:solid;border-width:var(--c1rgwbep-0);cursor:default;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:38px;outline:0 !important;position:relative;-webkit-transition:all 100ms;transition:all 100ms;box-sizing:border-box;box-shadow:var(--c1rgwbep-1);}.c1rgwbep:hover{border-color:hsl(0,0%,70%);}\n.v1mdmbaj{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:2px 8px;position:relative;overflow:hidden;box-sizing:border-box;}\n.p1gwkvxy{color:hsl(0,0%,50%);margin-left:2px;margin-right:2px;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);box-sizing:border-box;font-size:16px;}\n.s1bwlafs{color:hsl(0,0%,20%);margin-left:2px;margin-right:2px;max-width:calc(100% - 8px);overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);box-sizing:border-box;}\n.i196z9y5{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;box-sizing:border-box;}\n.d1dfo5ow{border-top:8px solid #00a4bd;border-left:6px solid transparent;border-right:6px solid transparent;width:0px;height:0px;margin:10px;}\n.if3lze{margin:2px;padding-bottom:2px;padding-top:2px;visibility:visible;color:hsl(0,0%,20%);box-sizing:border-box;}\n.i9kxf50{box-sizing:content-box;background:rgba(0,0,0,0) none repeat scroll 0px center;border:0px none;font-size:inherit;opacity:1;outline:currentcolor none 0px;padding:0px;color:inherit;font-family:inherit;}\n.igjr3uc{position:absolute;opacity:0;font-size:inherit;}\n.mhb9if7{position:absolute;top:100%;background-color:#fff;border-radius:4px;margin-bottom:8px;margin-top:8px;z-index:9999;box-shadow:0 0 0 1px hsla(0,0%,0%,0.1),0 4px 11px hsla(0,0%,0%,0.1);width:100%;}\n.mxaof7s{max-height:300px;overflow-y:auto;padding-bottom:4px;padding-top:4px;position:relative;}\n.mw50s5v{padding-bottom:8px;padding-top:8px;}\n.m11rzvjw{color:#999;cursor:default;font-size:75%;font-weight:500;margin-bottom:0.25em;text-transform:uppercase;padding-left:12px;padding-left:12px;}\n.m1jcdsjv{display:block;background-color:var(--m1jcdsjv-0);color:var(--m1jcdsjv-1);cursor:default;font-size:inherit;width:100%;padding:8px 12px;}.m1jcdsjv:hover{background-color:var(--m1jcdsjv-2);}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9Db21tb24vQXN5bmNTZWxlY3QudHN4Il0sIm5hbWVzIjpbIi5jMXd4eDdldSIsIi5jMXJnd2JlcCIsIi52MW1kbWJhaiIsIi5wMWd3a3Z4eSIsIi5zMWJ3bGFmcyIsIi5pMTk2ejl5NSIsIi5kMWRmbzVvdyIsIi5pZjNsemUiLCIuaTlreGY1MCIsIi5pZ2pyM3VjIiwiLm1oYjlpZjciLCIubXhhb2Y3cyIsIi5tdzUwczV2IiwiLm0xMXJ6dmp3IiwiLm0xamNkc2p2Il0sIm1hcHBpbmdzIjoiQUFNa0JBO0FBTU9DO0FBcUJGQztBQVVIQztBQVVBQztBQWFPQztBQU9EQztBQVFIQztBQVFUQztBQVdNQztBQUtFQztBQVdMQztBQU9DQztBQUlNQztBQVVQQyIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9zaGFyZWQvQ29tbW9uL0FzeW5jU2VsZWN0LnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbGluYXJpYS9yZWFjdCc7XG5pbXBvcnQgeyBDQUxZUFNPLCBDQUxZUFNPX0xJR0hULCBDQUxZUFNPX01FRElVTSwgT0JTSURJQU4sIH0gZnJvbSAnLi4vVUlDb21wb25lbnRzL2NvbG9ycyc7XG5pbXBvcnQgVUlTcGlubmVyIGZyb20gJy4uL1VJQ29tcG9uZW50cy9VSVNwaW5uZXInO1xuaW1wb3J0IExvYWRTdGF0ZSBmcm9tICcuLi9lbnVtcy9sb2FkU3RhdGUnO1xuY29uc3QgQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGNvbG9yOiAke09CU0lESUFOfTtcbiAgZm9udC1mYW1pbHk6ICdMZXhlbmQgRGVjYScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuYDtcbmNvbnN0IENvbnRyb2xDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDAsIDAlLCAxMDAlKTtcbiAgYm9yZGVyLWNvbG9yOiBoc2woMCwgMCUsIDgwJSk7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLXdpZHRoOiAke3Byb3BzID0+IChwcm9wcy5mb2N1c2VkID8gJzAnIDogJzFweCcpfTtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgbWluLWhlaWdodDogMzhweDtcbiAgb3V0bGluZTogMCAhaW1wb3J0YW50O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRyYW5zaXRpb246IGFsbCAxMDBtcztcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy5mb2N1c2VkID8gYDAgMCAwIDJweCAke0NBTFlQU09fTUVESVVNfWAgOiAnbm9uZSd9O1xuICAmOmhvdmVyIHtcbiAgICBib3JkZXItY29sb3I6IGhzbCgwLCAwJSwgNzAlKTtcbiAgfVxuYDtcbmNvbnN0IFZhbHVlQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXg6IDE7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgcGFkZGluZzogMnB4IDhweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuYDtcbmNvbnN0IFBsYWNlaG9sZGVyID0gc3R5bGVkLmRpdiBgXG4gIGNvbG9yOiBoc2woMCwgMCUsIDUwJSk7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG4gIG1hcmdpbi1yaWdodDogMnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGZvbnQtc2l6ZTogMTZweDtcbmA7XG5jb25zdCBTaW5nbGVWYWx1ZSA9IHN0eWxlZC5kaXYgYFxuICBjb2xvcjogaHNsKDAsIDAlLCAyMCUpO1xuICBtYXJnaW4tbGVmdDogMnB4O1xuICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA4cHgpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuYDtcbmNvbnN0IEluZGljYXRvckNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXNocmluazogMDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbmA7XG5jb25zdCBEcm9wZG93bkluZGljYXRvciA9IHN0eWxlZC5kaXYgYFxuICBib3JkZXItdG9wOiA4cHggc29saWQgJHtDQUxZUFNPfTtcbiAgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJpZ2h0OiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIHdpZHRoOiAwcHg7XG4gIGhlaWdodDogMHB4O1xuICBtYXJnaW46IDEwcHg7XG5gO1xuY29uc3QgSW5wdXRDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgbWFyZ2luOiAycHg7XG4gIHBhZGRpbmctYm90dG9tOiAycHg7XG4gIHBhZGRpbmctdG9wOiAycHg7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIGNvbG9yOiBoc2woMCwgMCUsIDIwJSk7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5gO1xuY29uc3QgSW5wdXQgPSBzdHlsZWQuaW5wdXQgYFxuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwKSBub25lIHJlcGVhdCBzY3JvbGwgMHB4IGNlbnRlcjtcbiAgYm9yZGVyOiAwcHggbm9uZTtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICBvcGFjaXR5OiAxO1xuICBvdXRsaW5lOiBjdXJyZW50Y29sb3Igbm9uZSAwcHg7XG4gIHBhZGRpbmc6IDBweDtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuYDtcbmNvbnN0IElucHV0U2hhZG93ID0gc3R5bGVkLmRpdiBgXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgb3BhY2l0eTogMDtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuYDtcbmNvbnN0IE1lbnVDb250YWluZXIgPSBzdHlsZWQuZGl2IGBcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBtYXJnaW4tdG9wOiA4cHg7XG4gIHotaW5kZXg6IDk5OTk7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDFweCBoc2xhKDAsIDAlLCAwJSwgMC4xKSwgMCA0cHggMTFweCBoc2xhKDAsIDAlLCAwJSwgMC4xKTtcbiAgd2lkdGg6IDEwMCU7XG5gO1xuY29uc3QgTWVudUxpc3QgPSBzdHlsZWQuZGl2IGBcbiAgbWF4LWhlaWdodDogMzAwcHg7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIHBhZGRpbmctYm90dG9tOiA0cHg7XG4gIHBhZGRpbmctdG9wOiA0cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XG5jb25zdCBNZW51R3JvdXAgPSBzdHlsZWQuZGl2IGBcbiAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgcGFkZGluZy10b3A6IDhweDtcbmA7XG5jb25zdCBNZW51R3JvdXBIZWFkZXIgPSBzdHlsZWQuZGl2IGBcbiAgY29sb3I6ICM5OTk7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgZm9udC1zaXplOiA3NSU7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIG1hcmdpbi1ib3R0b206IDAuMjVlbTtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgcGFkZGluZy1sZWZ0OiAxMnB4O1xuICBwYWRkaW5nLWxlZnQ6IDEycHg7XG5gO1xuY29uc3QgTWVudUl0ZW0gPSBzdHlsZWQuZGl2IGBcbiAgZGlzcGxheTogYmxvY2s7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMuc2VsZWN0ZWQgPyBDQUxZUFNPX01FRElVTSA6ICd0cmFuc3BhcmVudCd9O1xuICBjb2xvcjogJHtwcm9wcyA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnI2ZmZicgOiAnaW5oZXJpdCcpfTtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiA4cHggMTJweDtcbiAgJjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy5zZWxlY3RlZCA/IENBTFlQU09fTUVESVVNIDogQ0FMWVBTT19MSUdIVH07XG4gIH1cbmA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBc3luY1NlbGVjdCh7IHBsYWNlaG9sZGVyLCB2YWx1ZSwgbG9hZE9wdGlvbnMsIG9uQ2hhbmdlLCBkZWZhdWx0T3B0aW9ucywgfSkge1xuICAgIGNvbnN0IGlucHV0RWwgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgaW5wdXRTaGFkb3dFbCA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBbaXNGb2N1c2VkLCBzZXRGb2N1c10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW2xvYWRTdGF0ZSwgc2V0TG9hZFN0YXRlXSA9IHVzZVN0YXRlKExvYWRTdGF0ZS5Ob3RMb2FkZWQpO1xuICAgIGNvbnN0IFtsb2NhbFZhbHVlLCBzZXRMb2NhbFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZShkZWZhdWx0T3B0aW9ucyk7XG4gICAgY29uc3QgaW5wdXRTaXplID0gYCR7aW5wdXRTaGFkb3dFbC5jdXJyZW50ID8gaW5wdXRTaGFkb3dFbC5jdXJyZW50LmNsaWVudFdpZHRoICsgMTAgOiAyfXB4YDtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAobG9hZE9wdGlvbnMgJiYgbG9hZFN0YXRlID09PSBMb2FkU3RhdGUuTm90TG9hZGVkKSB7XG4gICAgICAgICAgICBsb2FkT3B0aW9ucygnJywgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldE9wdGlvbnMocmVzdWx0KTtcbiAgICAgICAgICAgICAgICBzZXRMb2FkU3RhdGUoTG9hZFN0YXRlLklkbGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCBbbG9hZE9wdGlvbnMsIGxvYWRTdGF0ZV0pO1xuICAgIGNvbnN0IHJlbmRlckl0ZW1zID0gKGl0ZW1zID0gW10sIHBhcmVudEtleSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ub3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoX2pzeHMoTWVudUdyb3VwLCB7IGNoaWxkcmVuOiBbX2pzeChNZW51R3JvdXBIZWFkZXIsIHsgaWQ6IGAke2luZGV4fS1oZWFkaW5nYCwgY2hpbGRyZW46IGl0ZW0ubGFiZWwgfSksIF9qc3goXCJkaXZcIiwgeyBjaGlsZHJlbjogcmVuZGVySXRlbXMoaXRlbS5vcHRpb25zLCBpbmRleCkgfSldIH0sIGBhc3luYy1zZWxlY3QtaXRlbS0ke2luZGV4fWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGBhc3luYy1zZWxlY3QtaXRlbS0ke3BhcmVudEtleSAhPT0gdW5kZWZpbmVkID8gYCR7cGFyZW50S2V5fS0ke2luZGV4fWAgOiBpbmRleH1gO1xuICAgICAgICAgICAgICAgIHJldHVybiAoX2pzeChNZW51SXRlbSwgeyBpZDoga2V5LCBzZWxlY3RlZDogdmFsdWUgJiYgaXRlbS52YWx1ZSA9PT0gdmFsdWUudmFsdWUsIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9jdXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9LCBjaGlsZHJlbjogaXRlbS5sYWJlbCB9LCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gKF9qc3hzKENvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKENvbnRyb2xDb250YWluZXIsIHsgaWQ6IFwibGVhZGluLWFzeW5jLXNlbGVjdG9yXCIsIGZvY3VzZWQ6IGlzRm9jdXNlZCwgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRFbC5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbC5jdXJyZW50LmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvY3VzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldExvY2FsVmFsdWUoJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RWwuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RWwuY3VycmVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9jdXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBjaGlsZHJlbjogW19qc3hzKFZhbHVlQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbbG9jYWxWYWx1ZSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCF2YWx1ZSA/IChfanN4KFBsYWNlaG9sZGVyLCB7IGNoaWxkcmVuOiBwbGFjZWhvbGRlciB9KSkgOiAoX2pzeChTaW5nbGVWYWx1ZSwgeyBjaGlsZHJlbjogdmFsdWUubGFiZWwgfSkpKSwgX2pzeHMoSW5wdXRDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KElucHV0LCB7IHJlZjogaW5wdXRFbCwgb25Gb2N1czogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb2N1cyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkNoYW5nZTogZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldExvY2FsVmFsdWUoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRMb2FkU3RhdGUoTG9hZFN0YXRlLkxvYWRpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkT3B0aW9ucyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE9wdGlvbnMoZS50YXJnZXQudmFsdWUsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRPcHRpb25zKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TG9hZFN0YXRlKExvYWRTdGF0ZS5JZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHZhbHVlOiBsb2NhbFZhbHVlLCB3aWR0aDogaW5wdXRTaXplLCBpZDogXCJhc3ljbi1zZWxlY3QtaW5wdXRcIiB9KSwgX2pzeChJbnB1dFNoYWRvdywgeyByZWY6IGlucHV0U2hhZG93RWwsIGNoaWxkcmVuOiBsb2NhbFZhbHVlIH0pXSB9KV0gfSksIF9qc3hzKEluZGljYXRvckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW2xvYWRTdGF0ZSA9PT0gTG9hZFN0YXRlLkxvYWRpbmcgJiYgX2pzeChVSVNwaW5uZXIsIHt9KSwgX2pzeChEcm9wZG93bkluZGljYXRvciwge30pXSB9KV0gfSksIGlzRm9jdXNlZCAmJiAoX2pzeChNZW51Q29udGFpbmVyLCB7IGNoaWxkcmVuOiBfanN4KE1lbnVMaXN0LCB7IGNoaWxkcmVuOiByZW5kZXJJdGVtcyhvcHRpb25zKSB9KSB9KSldIH0pKTtcbn1cbiJdfQ==*/","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { styled } from '@linaria/react';\nimport { MARIGOLD_LIGHT, MARIGOLD_MEDIUM, OBSIDIAN } from './colors';\nconst AlertContainer = styled.div `\n background-color: ${MARIGOLD_LIGHT};\n border-color: ${MARIGOLD_MEDIUM};\n color: ${OBSIDIAN};\n font-size: 14px;\n align-items: center;\n justify-content: space-between;\n display: flex;\n border-style: solid;\n border-top-style: solid;\n border-right-style: solid;\n border-bottom-style: solid;\n border-left-style: solid;\n border-width: 1px;\n min-height: 60px;\n padding: 8px 20px;\n position: relative;\n text-align: left;\n`;\nconst Title = styled.p `\n font-family: 'Lexend Deca';\n font-style: normal;\n font-weight: 700;\n font-size: 16px;\n line-height: 19px;\n color: ${OBSIDIAN};\n margin: 0;\n padding: 0;\n`;\nconst Message = styled.p `\n font-family: 'Lexend Deca';\n font-style: normal;\n font-weight: 400;\n font-size: 14px;\n margin: 0;\n padding: 0;\n`;\nconst MessageContainer = styled.div `\n display: flex;\n flex-direction: column;\n`;\nexport default function UIAlert({ titleText, titleMessage, children, }) {\n return (_jsxs(AlertContainer, { children: [_jsxs(MessageContainer, { children: [_jsx(Title, { children: titleText }), _jsx(Message, { children: titleMessage })] }), children] }));\n}\n",".a1h8m4fo{background-color:#fef8f0;border-color:#fae0b5;color:#33475b;font-size:14px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-style:solid;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-width:1px;min-height:60px;padding:8px 20px;position:relative;text-align:left;}\n.tyndzxk{font-family:'Lexend Deca';font-style:normal;font-weight:700;font-size:16px;line-height:19px;color:#33475b;margin:0;padding:0;}\n.m1m9sbk4{font-family:'Lexend Deca';font-style:normal;font-weight:400;font-size:14px;margin:0;padding:0;}\n.mg5o421{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL3NoYXJlZC9VSUNvbXBvbmVudHMvVUlBbGVydC50c3giXSwibmFtZXMiOlsiLmExaDhtNGZvIiwiLnR5bmR6eGsiLCIubTFtOXNiazQiLCIubWc1bzQyMSJdLCJtYXBwaW5ncyI6IkFBR3VCQTtBQW1CVEM7QUFVRUM7QUFRU0MiLCJmaWxlIjoiL3Vzci9zaGFyZS9odWJzcG90L2J1aWxkL3dvcmtzcGFjZS9MZWFkaW5Xb3JkUHJlc3NQbHVnaW4vbGVhZGluL3NjcmlwdHMvc2hhcmVkL1VJQ29tcG9uZW50cy9VSUFsZXJ0LnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbGluYXJpYS9yZWFjdCc7XG5pbXBvcnQgeyBNQVJJR09MRF9MSUdIVCwgTUFSSUdPTERfTUVESVVNLCBPQlNJRElBTiB9IGZyb20gJy4vY29sb3JzJztcbmNvbnN0IEFsZXJ0Q29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGJhY2tncm91bmQtY29sb3I6ICR7TUFSSUdPTERfTElHSFR9O1xuICBib3JkZXItY29sb3I6ICR7TUFSSUdPTERfTUVESVVNfTtcbiAgY29sb3I6ICR7T0JTSURJQU59O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgZGlzcGxheTogZmxleDtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1yaWdodC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkO1xuICBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBtaW4taGVpZ2h0OiA2MHB4O1xuICBwYWRkaW5nOiA4cHggMjBweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuYDtcbmNvbnN0IFRpdGxlID0gc3R5bGVkLnAgYFxuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJztcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogNzAwO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxOXB4O1xuICBjb2xvcjogJHtPQlNJRElBTn07XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbmA7XG5jb25zdCBNZXNzYWdlID0gc3R5bGVkLnAgYFxuICBmb250LWZhbWlseTogJ0xleGVuZCBEZWNhJztcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogNDAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbmA7XG5jb25zdCBNZXNzYWdlQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5gO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVUlBbGVydCh7IHRpdGxlVGV4dCwgdGl0bGVNZXNzYWdlLCBjaGlsZHJlbiwgfSkge1xuICAgIHJldHVybiAoX2pzeHMoQWxlcnRDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhNZXNzYWdlQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeChUaXRsZSwgeyBjaGlsZHJlbjogdGl0bGVUZXh0IH0pLCBfanN4KE1lc3NhZ2UsIHsgY2hpbGRyZW46IHRpdGxlTWVzc2FnZSB9KV0gfSksIGNoaWxkcmVuXSB9KSk7XG59XG4iXX0=*/"],"names":[".ump7xqy",".ug152ch",".ua13n1c",".h1q5v5ee",".u3qxofx",".u1q7a48k",".sxa9zrc",".s14430wa",".ct87ghk",".avili0h",".c1wxx7eu",".c1rgwbep",".v1mdmbaj",".p1gwkvxy",".s1bwlafs",".i196z9y5",".d1dfo5ow",".if3lze",".i9kxf50",".igjr3uc",".mhb9if7",".mxaof7s",".mw50s5v",".m11rzvjw",".m1jcdsjv",".a1h8m4fo",".tyndzxk",".m1m9sbk4",".mg5o421"],"sourceRoot":""} \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/gutenberg.js b/wp/wp-content/plugins/leadin/build/gutenberg.js deleted file mode 100644 index 8d690cac..00000000 --- a/wp/wp-content/plugins/leadin/build/gutenberg.js +++ /dev/null @@ -1,13125 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/@emotion/is-prop-valid/dist/is-prop-valid.browser.esm.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/@emotion/is-prop-valid/dist/is-prop-valid.browser.esm.js ***! - \*******************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _emotion_memoize__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @emotion/memoize */ "./node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize/dist/memoize.browser.esm.js"); - - -var reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|inert|itemProp|itemScope|itemType|itemID|itemRef|on|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23 - -var index = (0,_emotion_memoize__WEBPACK_IMPORTED_MODULE_0__["default"])(function (prop) { - return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111 - /* o */ - && prop.charCodeAt(1) === 110 - /* n */ - && prop.charCodeAt(2) < 91; -} -/* Z+1 */ -); - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (index); - - -/***/ }), - -/***/ "./node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize/dist/memoize.browser.esm.js": -/*!*******************************************************************************************************!*\ - !*** ./node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize/dist/memoize.browser.esm.js ***! - \*******************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -function memoize(fn) { - var cache = {}; - return function (arg) { - if (cache[arg] === undefined) cache[arg] = fn(arg); - return cache[arg]; - }; -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (memoize); - - -/***/ }), - -/***/ "./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js": -/*!*******************************************************************!*\ - !*** ./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -function memoize(fn) { - var cache = Object.create(null); - return function (arg) { - if (cache[arg] === undefined) cache[arg] = fn(arg); - return cache[arg]; - }; -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (memoize); - - -/***/ }), - -/***/ "./node_modules/@emotion/unitless/dist/unitless.browser.esm.js": -/*!*********************************************************************!*\ - !*** ./node_modules/@emotion/unitless/dist/unitless.browser.esm.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -var unitlessKeys = { - animationIterationCount: 1, - borderImageOutset: 1, - borderImageSlice: 1, - borderImageWidth: 1, - boxFlex: 1, - boxFlexGroup: 1, - boxOrdinalGroup: 1, - columnCount: 1, - columns: 1, - flex: 1, - flexGrow: 1, - flexPositive: 1, - flexShrink: 1, - flexNegative: 1, - flexOrder: 1, - gridRow: 1, - gridRowEnd: 1, - gridRowSpan: 1, - gridRowStart: 1, - gridColumn: 1, - gridColumnEnd: 1, - gridColumnSpan: 1, - gridColumnStart: 1, - msGridRow: 1, - msGridRowSpan: 1, - msGridColumn: 1, - msGridColumnSpan: 1, - fontWeight: 1, - lineHeight: 1, - opacity: 1, - order: 1, - orphans: 1, - tabSize: 1, - widows: 1, - zIndex: 1, - zoom: 1, - WebkitLineClamp: 1, - // SVG-related properties - fillOpacity: 1, - floodOpacity: 1, - stopOpacity: 1, - strokeDasharray: 1, - strokeDashoffset: 1, - strokeMiterlimit: 1, - strokeOpacity: 1, - strokeWidth: 1 -}; - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (unitlessKeys); - - -/***/ }), - -/***/ "./node_modules/@linaria/react/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js": -/*!***********************************************************************************************************!*\ - !*** ./node_modules/@linaria/react/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js ***! - \***********************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _emotion_memoize__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @emotion/memoize */ "./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js"); - - -var reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23 - -var isPropValid = /* #__PURE__ */(0,_emotion_memoize__WEBPACK_IMPORTED_MODULE_0__["default"])(function (prop) { - return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111 - /* o */ - && prop.charCodeAt(1) === 110 - /* n */ - && prop.charCodeAt(2) < 91; -} -/* Z+1 */ -); - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (isPropValid); - - -/***/ }), - -/***/ "./scripts/constants/defaultFormOptions.ts": -/*!*************************************************!*\ - !*** ./scripts/constants/defaultFormOptions.ts ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "DEFAULT_OPTIONS": () => (/* binding */ DEFAULT_OPTIONS), -/* harmony export */ "isDefaultForm": () => (/* binding */ isDefaultForm) -/* harmony export */ }); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__); - -var REGISTRATION_FORM = 'REGISTRATION_FORM'; -var CONTACT_US_FORM = 'CONTACT_US_FORM'; -var NEWSLETTER_FORM = 'NEWSLETTER_FORM'; -var SUPPORT_FORM = 'SUPPORT_FORM'; -var EVENT_FORM = 'EVENT_FORM'; -var DEFAULT_OPTIONS = { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('Templates', 'leadin'), - options: [{ - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('Registration Form', 'leadin'), - value: REGISTRATION_FORM - }, { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('Contact us Form', 'leadin'), - value: CONTACT_US_FORM - }, { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('Newsletter sign-up Form', 'leadin'), - value: NEWSLETTER_FORM - }, { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('Support Form', 'leadin'), - value: SUPPORT_FORM - }, { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('Event Registration Form', 'leadin'), - value: EVENT_FORM - }] -}; -function isDefaultForm(value) { - return value === REGISTRATION_FORM || value === CONTACT_US_FORM || value === NEWSLETTER_FORM || value === SUPPORT_FORM || value === EVENT_FORM; -} - -/***/ }), - -/***/ "./scripts/constants/leadinConfig.ts": -/*!*******************************************!*\ - !*** ./scripts/constants/leadinConfig.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "accountName": () => (/* binding */ accountName), -/* harmony export */ "activationTime": () => (/* binding */ activationTime), -/* harmony export */ "adminUrl": () => (/* binding */ adminUrl), -/* harmony export */ "connectionStatus": () => (/* binding */ connectionStatus), -/* harmony export */ "contentEmbed": () => (/* binding */ contentEmbed), -/* harmony export */ "deviceId": () => (/* binding */ deviceId), -/* harmony export */ "didDisconnect": () => (/* binding */ didDisconnect), -/* harmony export */ "env": () => (/* binding */ env), -/* harmony export */ "formsScript": () => (/* binding */ formsScript), -/* harmony export */ "formsScriptPayload": () => (/* binding */ formsScriptPayload), -/* harmony export */ "hublet": () => (/* binding */ hublet), -/* harmony export */ "hubspotBaseUrl": () => (/* binding */ hubspotBaseUrl), -/* harmony export */ "hubspotNonce": () => (/* binding */ hubspotNonce), -/* harmony export */ "iframeUrl": () => (/* binding */ iframeUrl), -/* harmony export */ "impactLink": () => (/* binding */ impactLink), -/* harmony export */ "lastAuthorizeTime": () => (/* binding */ lastAuthorizeTime), -/* harmony export */ "lastDeauthorizeTime": () => (/* binding */ lastDeauthorizeTime), -/* harmony export */ "lastDisconnectTime": () => (/* binding */ lastDisconnectTime), -/* harmony export */ "leadinPluginVersion": () => (/* binding */ leadinPluginVersion), -/* harmony export */ "leadinQueryParams": () => (/* binding */ leadinQueryParams), -/* harmony export */ "locale": () => (/* binding */ locale), -/* harmony export */ "loginUrl": () => (/* binding */ loginUrl), -/* harmony export */ "meetingsScript": () => (/* binding */ meetingsScript), -/* harmony export */ "phpVersion": () => (/* binding */ phpVersion), -/* harmony export */ "pluginPath": () => (/* binding */ pluginPath), -/* harmony export */ "plugins": () => (/* binding */ plugins), -/* harmony export */ "portalDomain": () => (/* binding */ portalDomain), -/* harmony export */ "portalEmail": () => (/* binding */ portalEmail), -/* harmony export */ "portalId": () => (/* binding */ portalId), -/* harmony export */ "redirectNonce": () => (/* binding */ redirectNonce), -/* harmony export */ "refreshToken": () => (/* binding */ refreshToken), -/* harmony export */ "refreshTokenError": () => (/* binding */ refreshTokenError), -/* harmony export */ "requiresContentEmbedScope": () => (/* binding */ requiresContentEmbedScope), -/* harmony export */ "restNonce": () => (/* binding */ restNonce), -/* harmony export */ "restUrl": () => (/* binding */ restUrl), -/* harmony export */ "reviewSkippedDate": () => (/* binding */ reviewSkippedDate), -/* harmony export */ "theme": () => (/* binding */ theme), -/* harmony export */ "trackConsent": () => (/* binding */ trackConsent), -/* harmony export */ "wpVersion": () => (/* binding */ wpVersion) -/* harmony export */ }); -var _window$leadinConfig = window.leadinConfig, - accountName = _window$leadinConfig.accountName, - adminUrl = _window$leadinConfig.adminUrl, - activationTime = _window$leadinConfig.activationTime, - connectionStatus = _window$leadinConfig.connectionStatus, - deviceId = _window$leadinConfig.deviceId, - didDisconnect = _window$leadinConfig.didDisconnect, - env = _window$leadinConfig.env, - formsScript = _window$leadinConfig.formsScript, - meetingsScript = _window$leadinConfig.meetingsScript, - formsScriptPayload = _window$leadinConfig.formsScriptPayload, - hublet = _window$leadinConfig.hublet, - hubspotBaseUrl = _window$leadinConfig.hubspotBaseUrl, - hubspotNonce = _window$leadinConfig.hubspotNonce, - iframeUrl = _window$leadinConfig.iframeUrl, - impactLink = _window$leadinConfig.impactLink, - lastAuthorizeTime = _window$leadinConfig.lastAuthorizeTime, - lastDeauthorizeTime = _window$leadinConfig.lastDeauthorizeTime, - lastDisconnectTime = _window$leadinConfig.lastDisconnectTime, - leadinPluginVersion = _window$leadinConfig.leadinPluginVersion, - leadinQueryParams = _window$leadinConfig.leadinQueryParams, - locale = _window$leadinConfig.locale, - loginUrl = _window$leadinConfig.loginUrl, - phpVersion = _window$leadinConfig.phpVersion, - pluginPath = _window$leadinConfig.pluginPath, - plugins = _window$leadinConfig.plugins, - portalDomain = _window$leadinConfig.portalDomain, - portalEmail = _window$leadinConfig.portalEmail, - portalId = _window$leadinConfig.portalId, - redirectNonce = _window$leadinConfig.redirectNonce, - restNonce = _window$leadinConfig.restNonce, - restUrl = _window$leadinConfig.restUrl, - refreshToken = _window$leadinConfig.refreshToken, - reviewSkippedDate = _window$leadinConfig.reviewSkippedDate, - theme = _window$leadinConfig.theme, - trackConsent = _window$leadinConfig.trackConsent, - wpVersion = _window$leadinConfig.wpVersion, - contentEmbed = _window$leadinConfig.contentEmbed, - requiresContentEmbedScope = _window$leadinConfig.requiresContentEmbedScope, - refreshTokenError = _window$leadinConfig.refreshTokenError; - - -/***/ }), - -/***/ "./scripts/gutenberg/Common/CalendarIcon.tsx": -/*!***************************************************!*\ - !*** ./scripts/gutenberg/Common/CalendarIcon.tsx ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ CalendarIcon) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); - -function CalendarIcon() { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("svg", { - width: "18", - height: "18", - viewBox: "0 0 18 18", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("g", { - clipPath: "url(#clip0_903_1965)", - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path", { - fillRule: "evenodd", - clipRule: "evenodd", - d: "M13.519 2.48009H15.069H15.0697C16.2619 2.48719 17.2262 3.45597 17.2262 4.65016V12.7434C17.223 12.9953 17.1203 13.2226 16.9549 13.3886L12.6148 17.7287C12.4488 17.8941 12.2214 17.9968 11.9689 18H3.29508C2.09637 18 1.125 17.0286 1.125 15.8299V4.65016C1.125 3.45404 2.09314 2.48396 3.28862 2.48009H4.83867V0.930032C4.83867 0.416577 5.25525 0 5.7687 0C6.28216 0 6.69874 0.416577 6.69874 0.930032V2.48009H11.6589V0.930032C11.6589 0.416577 12.0755 0 12.5889 0C13.1024 0 13.519 0.416577 13.519 0.930032V2.48009ZM2.98506 15.8312C2.99863 15.9882 3.12909 16.1115 3.28862 16.1141H11.5814L11.6589 16.0366V13.634C11.6589 12.9494 12.2143 12.394 12.899 12.394H15.2951L15.3726 12.3165V7.4338H2.98506V15.8312ZM4.83868 8.68029H6.07873H6.07937C6.42684 8.68029 6.71037 8.95478 6.72458 9.30032V14.2863C6.72458 14.6428 6.43524 14.9322 6.07873 14.9322H4.83868C4.48217 14.9322 4.19283 14.6428 4.19283 14.2863V9.32615C4.19283 8.96964 4.48217 8.68029 4.83868 8.68029ZM8.53298 8.68029H9.82469H9.82534C10.1728 8.68029 10.4563 8.95478 10.4705 9.30032V14.2863C10.4705 14.6428 10.1812 14.9322 9.82469 14.9322H8.53298C8.17647 14.9322 7.88712 14.6428 7.88712 14.2863V9.32615C7.88712 8.96964 8.17647 8.68029 8.53298 8.68029ZM13.519 8.68029H12.2789C11.9366 8.68029 11.6589 8.95801 11.6589 9.30032V10.5404C11.6589 10.8827 11.9366 11.1604 12.2789 11.1604H13.519C13.8613 11.1604 14.139 10.8827 14.139 10.5404V9.30032C14.139 8.95801 13.8613 8.68029 13.519 8.68029Z", - fill: "#FF7A59" - }) - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("defs", { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("clipPath", { - id: "clip0_903_1965", - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("rect", { - width: "18", - height: "18", - fill: "white" - }) - }) - })] - }); -} - -/***/ }), - -/***/ "./scripts/gutenberg/Common/SidebarSprocketIcon.tsx": -/*!**********************************************************!*\ - !*** ./scripts/gutenberg/Common/SidebarSprocketIcon.tsx ***! - \**********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ SidebarSprocketIcon) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); - -function SidebarSprocketIcon() { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("svg", { - width: "20px", - height: "20px", - version: "1.1", - viewBox: "0 0 40 42", - xmlns: "http://www.w3.org/2000/svg", - xmlnsXlink: "http://www.w3.org/1999/xlink", - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path", { - d: "M28.8989809,30.0402293 C25.817707,30.0402293 23.319363,27.5423949 23.319363,24.461121 C23.319363,21.3798471 25.817707,18.881758 28.8989809,18.881758 C31.98,18.881758 34.4780892,21.3798471 34.4780892,24.461121 C34.4780892,27.5423949 31.98,30.0402293 28.8989809,30.0402293 M30.5692994,13.7199745 L30.5692994,8.75717196 C31.864586,8.14519744 32.7723567,6.8346242 32.7723567,5.31360508 L32.7723567,5.1989554 C32.7723567,3.10010191 31.0546497,1.38264968 28.956051,1.38264968 L28.8414013,1.38264968 C26.7425478,1.38264968 25.0248408,3.10010191 25.0248408,5.1989554 L25.0248408,5.31360508 C25.0248408,6.8346242 25.9328662,8.14519744 27.2281529,8.75717196 L27.2281529,13.7202293 C25.2994904,14.0180637 23.5371974,14.8137325 22.0829299,15.9844331 L8.45643312,5.38417836 C8.54611464,5.0392102 8.6090446,4.6835414 8.60955416,4.310293 C8.61261148,1.93271338 6.68777072,0.00303184713 4.31019108,-2.5477707e-05 C1.93286624,-0.00308280255 0.0029299363,1.92175796 0.000127388535,4.29933756 C-0.0029299363,6.67666244 1.92191083,8.60634396 4.29949044,8.60940128 C5.07426752,8.6104204 5.7912102,8.390293 6.42,8.03284076 L19.8243312,18.4603567 C18.6842038,20.181121 18.0166879,22.2422675 18.0166879,24.461121 C18.0166879,26.7841784 18.7504458,28.9327134 19.9907006,30.7001019 L15.9142675,34.776535 C15.5919745,34.6799745 15.2574522,34.6122038 14.9033121,34.6122038 C12.9499363,34.6122038 11.3659873,36.1961529 11.3659873,38.1497834 C11.3659873,40.103414 12.9499363,41.6871084 14.9033121,41.6871084 C16.8571974,41.6871084 18.4408917,40.103414 18.4408917,38.1497834 C18.4408917,37.7958981 18.3733758,37.461121 18.2765605,37.1390828 L22.3089172,33.1067261 C24.1392357,34.5041784 26.4184713,35.3431592 28.8989809,35.3431592 C34.9089172,35.3431592 39.7810191,30.4710573 39.7810191,24.461121 C39.7810191,19.0203567 35.7840764,14.5255796 30.5692994,13.7199745", - id: "Fill-1", - fillRule: "evenodd" - }) - }); -} - -/***/ }), - -/***/ "./scripts/gutenberg/Common/SprocketIcon.tsx": -/*!***************************************************!*\ - !*** ./scripts/gutenberg/Common/SprocketIcon.tsx ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ SprocketIcon) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); - -function SprocketIcon() { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("svg", { - width: "40px", - height: "42px", - viewBox: "0 0 40 42", - version: "1.1", - xmlns: "http://www.w3.org/2000/svg", - xmlnsXlink: "http://www.w3.org/1999/xlink", - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("defs", { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("polygon", { - id: "path-1", - points: "0.000123751494 0 39.7808917 0 39.7808917 41.6871084 0.000123751494 41.6871084" - }) - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("g", { - id: "Page-1", - stroke: "none", - strokeWidth: "1", - fill: "none", - fillRule: "evenodd", - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("g", { - id: "HubSpot-Sprocket---Full-Color", - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("mask", { - id: "mask-2", - fill: "white", - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("use", { - xlinkHref: "#path-1" - }) - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("g", { - id: "path-1" - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path", { - d: "M28.8989809,30.0402293 C25.817707,30.0402293 23.319363,27.5423949 23.319363,24.461121 C23.319363,21.3798471 25.817707,18.881758 28.8989809,18.881758 C31.98,18.881758 34.4780892,21.3798471 34.4780892,24.461121 C34.4780892,27.5423949 31.98,30.0402293 28.8989809,30.0402293 M30.5692994,13.7199745 L30.5692994,8.75717196 C31.864586,8.14519744 32.7723567,6.8346242 32.7723567,5.31360508 L32.7723567,5.1989554 C32.7723567,3.10010191 31.0546497,1.38264968 28.956051,1.38264968 L28.8414013,1.38264968 C26.7425478,1.38264968 25.0248408,3.10010191 25.0248408,5.1989554 L25.0248408,5.31360508 C25.0248408,6.8346242 25.9328662,8.14519744 27.2281529,8.75717196 L27.2281529,13.7202293 C25.2994904,14.0180637 23.5371974,14.8137325 22.0829299,15.9844331 L8.45643312,5.38417836 C8.54611464,5.0392102 8.6090446,4.6835414 8.60955416,4.310293 C8.61261148,1.93271338 6.68777072,0.00303184713 4.31019108,-2.5477707e-05 C1.93286624,-0.00308280255 0.0029299363,1.92175796 0.000127388535,4.29933756 C-0.0029299363,6.67666244 1.92191083,8.60634396 4.29949044,8.60940128 C5.07426752,8.6104204 5.7912102,8.390293 6.42,8.03284076 L19.8243312,18.4603567 C18.6842038,20.181121 18.0166879,22.2422675 18.0166879,24.461121 C18.0166879,26.7841784 18.7504458,28.9327134 19.9907006,30.7001019 L15.9142675,34.776535 C15.5919745,34.6799745 15.2574522,34.6122038 14.9033121,34.6122038 C12.9499363,34.6122038 11.3659873,36.1961529 11.3659873,38.1497834 C11.3659873,40.103414 12.9499363,41.6871084 14.9033121,41.6871084 C16.8571974,41.6871084 18.4408917,40.103414 18.4408917,38.1497834 C18.4408917,37.7958981 18.3733758,37.461121 18.2765605,37.1390828 L22.3089172,33.1067261 C24.1392357,34.5041784 26.4184713,35.3431592 28.8989809,35.3431592 C34.9089172,35.3431592 39.7810191,30.4710573 39.7810191,24.461121 C39.7810191,19.0203567 35.7840764,14.5255796 30.5692994,13.7199745", - id: "Fill-1", - fill: "#F3785B", - fillRule: "nonzero", - mask: "url(#mask-2)" - })] - }) - })] - }); -} - -/***/ }), - -/***/ "./scripts/gutenberg/FormBlock/FormBlockSave.tsx": -/*!*******************************************************!*\ - !*** ./scripts/gutenberg/FormBlock/FormBlockSave.tsx ***! - \*******************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FormSaveBlock) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__); - - -function FormSaveBlock(_ref) { - var attributes = _ref.attributes; - var portalId = attributes.portalId, - formId = attributes.formId; - - if (portalId && formId) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.RawHTML, { - className: "wp-block-leadin-hubspot-form-block", - children: "[hubspot portal=\"".concat(portalId, "\" id=\"").concat(formId, "\" type=\"form\"]") - }); - } - - return null; -} - -/***/ }), - -/***/ "./scripts/gutenberg/FormBlock/FormGutenbergPreview.tsx": -/*!**************************************************************!*\ - !*** ./scripts/gutenberg/FormBlock/FormGutenbergPreview.tsx ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FormGutenbergPreview) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _UIComponents_UIImage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../UIComponents/UIImage */ "./scripts/gutenberg/UIComponents/UIImage.ts"); - - - - -function FormGutenbergPreview() { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIImage__WEBPACK_IMPORTED_MODULE_3__["default"], { - alt: "Create a new Hubspot Form", - src: "".concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.pluginPath, "/public/assets/images/hubspot-form.png") - }) - }); -} - -/***/ }), - -/***/ "./scripts/gutenberg/FormBlock/registerFormBlock.tsx": -/*!***********************************************************!*\ - !*** ./scripts/gutenberg/FormBlock/registerFormBlock.tsx ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ registerFormBlock) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _wordpress_blocks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/blocks */ "@wordpress/blocks"); -/* harmony import */ var _wordpress_blocks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_blocks__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _Common_SprocketIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Common/SprocketIcon */ "./scripts/gutenberg/Common/SprocketIcon.tsx"); -/* harmony import */ var _FormBlockSave__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FormBlockSave */ "./scripts/gutenberg/FormBlock/FormBlockSave.tsx"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _FormGutenbergPreview__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FormGutenbergPreview */ "./scripts/gutenberg/FormBlock/FormGutenbergPreview.tsx"); -/* harmony import */ var _shared_Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../shared/Common/ErrorHandler */ "./scripts/shared/Common/ErrorHandler.tsx"); -/* harmony import */ var _shared_Form_FormEdit__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../shared/Form/FormEdit */ "./scripts/shared/Form/FormEdit.tsx"); -/* harmony import */ var _shared_enums_connectionStatus__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../shared/enums/connectionStatus */ "./scripts/shared/enums/connectionStatus.ts"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__); -/* harmony import */ var _utils_withMetaData__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../utils/withMetaData */ "./scripts/utils/withMetaData.ts"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - - - - - - - - - - - -function registerFormBlock() { - var editComponent = function editComponent(props) { - if (props.attributes.preview) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_FormGutenbergPreview__WEBPACK_IMPORTED_MODULE_5__["default"], {}); - } else if (_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_4__.connectionStatus === _shared_enums_connectionStatus__WEBPACK_IMPORTED_MODULE_8__["default"].Connected) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_shared_Form_FormEdit__WEBPACK_IMPORTED_MODULE_7__["default"], _objectSpread(_objectSpread({}, props), {}, { - origin: "gutenberg", - preview: true - })); - } else { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_shared_Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_6__["default"], { - status: 401 - }); - } - }; // We do not support the full site editor: https://issues.hubspotcentral.com/browse/WP-1033 - - - if (!_wordpress_blocks__WEBPACK_IMPORTED_MODULE_1__ || (0,_utils_withMetaData__WEBPACK_IMPORTED_MODULE_10__.isFullSiteEditor)()) { - return null; - } - - _wordpress_blocks__WEBPACK_IMPORTED_MODULE_1__.registerBlockType('leadin/hubspot-form-block', { - title: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__.__)('HubSpot Form', 'leadin'), - description: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__.__)('Select and embed a HubSpot form', 'leadin'), - icon: _Common_SprocketIcon__WEBPACK_IMPORTED_MODULE_2__["default"], - category: 'leadin-blocks', - attributes: { - portalId: { - type: 'string', - "default": '' - }, - formId: { - type: 'string' - }, - formName: { - type: 'string' - }, - preview: { - type: 'boolean', - "default": false - } - }, - example: { - attributes: { - preview: true - } - }, - edit: editComponent, - save: function save(props) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_FormBlockSave__WEBPACK_IMPORTED_MODULE_3__["default"], _objectSpread({}, props)); - } - }); -} - -/***/ }), - -/***/ "./scripts/gutenberg/MeetingsBlock/MeetingGutenbergPreview.tsx": -/*!*********************************************************************!*\ - !*** ./scripts/gutenberg/MeetingsBlock/MeetingGutenbergPreview.tsx ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ MeetingGutenbergPreview) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _UIComponents_UIImage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../UIComponents/UIImage */ "./scripts/gutenberg/UIComponents/UIImage.ts"); - - - - -function MeetingGutenbergPreview() { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIImage__WEBPACK_IMPORTED_MODULE_3__["default"], { - alt: "Create a new Hubspot Meeting", - width: "100%", - src: "".concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.pluginPath, "/public/assets/images/hubspot-meetings.png") - }) - }); -} - -/***/ }), - -/***/ "./scripts/gutenberg/MeetingsBlock/MeetingSaveBlock.tsx": -/*!**************************************************************!*\ - !*** ./scripts/gutenberg/MeetingsBlock/MeetingSaveBlock.tsx ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ MeetingSaveBlock) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__); - - -function MeetingSaveBlock(_ref) { - var attributes = _ref.attributes; - var url = attributes.url; - - if (url) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.RawHTML, { - className: "wp-block-leadin-hubspot-meeting-block", - children: "[hubspot url=\"".concat(url, "\" type=\"meeting\"]") - }); - } - - return null; -} - -/***/ }), - -/***/ "./scripts/gutenberg/MeetingsBlock/registerMeetingBlock.tsx": -/*!******************************************************************!*\ - !*** ./scripts/gutenberg/MeetingsBlock/registerMeetingBlock.tsx ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ registerMeetingBlock) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _wordpress_blocks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/blocks */ "@wordpress/blocks"); -/* harmony import */ var _wordpress_blocks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_blocks__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _Common_CalendarIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Common/CalendarIcon */ "./scripts/gutenberg/Common/CalendarIcon.tsx"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _MeetingGutenbergPreview__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./MeetingGutenbergPreview */ "./scripts/gutenberg/MeetingsBlock/MeetingGutenbergPreview.tsx"); -/* harmony import */ var _MeetingSaveBlock__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./MeetingSaveBlock */ "./scripts/gutenberg/MeetingsBlock/MeetingSaveBlock.tsx"); -/* harmony import */ var _shared_Meeting_MeetingEdit__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../shared/Meeting/MeetingEdit */ "./scripts/shared/Meeting/MeetingEdit.tsx"); -/* harmony import */ var _shared_Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../shared/Common/ErrorHandler */ "./scripts/shared/Common/ErrorHandler.tsx"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__); -/* harmony import */ var _utils_withMetaData__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../utils/withMetaData */ "./scripts/utils/withMetaData.ts"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - - - - - - - - - - -var ConnectionStatus = { - Connected: 'Connected', - NotConnected: 'NotConnected' -}; -function registerMeetingBlock() { - var editComponent = function editComponent(props) { - if (props.attributes.preview) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_MeetingGutenbergPreview__WEBPACK_IMPORTED_MODULE_4__["default"], {}); - } else if (_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__.connectionStatus === ConnectionStatus.Connected) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_shared_Meeting_MeetingEdit__WEBPACK_IMPORTED_MODULE_6__["default"], _objectSpread(_objectSpread({}, props), {}, { - preview: true, - origin: "gutenberg" - })); - } else { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_shared_Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_7__["default"], { - status: 401 - }); - } - }; // We do not support the full site editor: https://issues.hubspotcentral.com/browse/WP-1033 - - - if (!_wordpress_blocks__WEBPACK_IMPORTED_MODULE_1__ || (0,_utils_withMetaData__WEBPACK_IMPORTED_MODULE_9__.isFullSiteEditor)()) { - return null; - } - - _wordpress_blocks__WEBPACK_IMPORTED_MODULE_1__.registerBlockType('leadin/hubspot-meeting-block', { - title: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Hubspot Meetings Scheduler', 'leadin'), - description: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Schedule meetings faster and forget the back-and-forth emails Your calendar stays full, and you stay productive', 'leadin'), - icon: _Common_CalendarIcon__WEBPACK_IMPORTED_MODULE_2__["default"], - category: 'leadin-blocks', - attributes: { - url: { - type: 'string', - "default": '' - }, - preview: { - type: 'boolean', - "default": false - } - }, - example: { - attributes: { - preview: true - } - }, - edit: editComponent, - save: function save(props) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_MeetingSaveBlock__WEBPACK_IMPORTED_MODULE_5__["default"], _objectSpread({}, props)); - } - }); -} - -/***/ }), - -/***/ "./scripts/gutenberg/Sidebar/contentType.tsx": -/*!***************************************************!*\ - !*** ./scripts/gutenberg/Sidebar/contentType.tsx ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "registerHubspotSidebar": () => (/* binding */ registerHubspotSidebar) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _wordpress_plugins__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/plugins */ "@wordpress/plugins"); -/* harmony import */ var _wordpress_plugins__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_plugins__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _wordpress_edit_post__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/edit-post */ "@wordpress/edit-post"); -/* harmony import */ var _wordpress_edit_post__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_edit_post__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @wordpress/components */ "@wordpress/components"); -/* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_wordpress_components__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data"); -/* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _UIComponents_UISidebarSelectControl__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../UIComponents/UISidebarSelectControl */ "./scripts/gutenberg/UIComponents/UISidebarSelectControl.tsx"); -/* harmony import */ var _Common_SidebarSprocketIcon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Common/SidebarSprocketIcon */ "./scripts/gutenberg/Common/SidebarSprocketIcon.tsx"); -/* harmony import */ var styled_components__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! styled-components */ "./node_modules/styled-components/dist/styled-components.browser.esm.js"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_7__); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../utils/backgroundAppUtils */ "./scripts/utils/backgroundAppUtils.ts"); -var _templateObject; - -function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } - - - - - - - - - - - - - -function registerHubspotSidebar() { - var ContentTypeLabelStyle = styled_components__WEBPACK_IMPORTED_MODULE_11__["default"].div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n white-space: normal;\n text-transform: none;\n "]))); - - var ContentTypeLabel = (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ContentTypeLabelStyle, { - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_7__.__)('Select the content type HubSpot Analytics uses to track this page', 'leadin') - }); - - var LeadinPluginSidebar = function LeadinPluginSidebar(_ref) { - var postType = _ref.postType; - return postType ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_wordpress_edit_post__WEBPACK_IMPORTED_MODULE_2__.PluginSidebar, { - name: "leadin", - title: "HubSpot", - icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_wordpress_components__WEBPACK_IMPORTED_MODULE_3__.Icon, { - className: "hs-plugin-sidebar-sprocket", - icon: (0,_Common_SidebarSprocketIcon__WEBPACK_IMPORTED_MODULE_6__["default"])() - }), - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_wordpress_components__WEBPACK_IMPORTED_MODULE_3__.PanelBody, { - title: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_7__.__)('HubSpot Analytics', 'leadin'), - initialOpen: true, - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_8__.BackgroudAppContext.Provider, { - value: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_9__.refreshToken && (0,_utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_10__.getOrCreateBackgroundApp)(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_9__.refreshToken), - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UISidebarSelectControl__WEBPACK_IMPORTED_MODULE_5__["default"], { - metaKey: "content-type", - className: "select-content-type", - label: ContentTypeLabel, - options: [{ - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_7__.__)('Detect Automatically', 'leadin'), - value: '' - }, { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_7__.__)('Blog Post', 'leadin'), - value: 'blog-post' - }, { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_7__.__)('Knowledge Article', 'leadin'), - value: 'knowledge-article' - }, { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_7__.__)('Landing Page', 'leadin'), - value: 'landing-page' - }, { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_7__.__)('Listing Page', 'leadin'), - value: 'listing-page' - }, { - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_7__.__)('Standard Page', 'leadin'), - value: 'standard-page' - }] - }) - }) - }) - }) : null; - }; - - var LeadinPluginSidebarWrapper = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_4__.withSelect)(function (select) { - var data = select('core/editor'); - return { - postType: data && data.getCurrentPostType() && data.getEditedPostAttribute('meta') - }; - })(LeadinPluginSidebar); - - if (_wordpress_plugins__WEBPACK_IMPORTED_MODULE_1__) { - _wordpress_plugins__WEBPACK_IMPORTED_MODULE_1__.registerPlugin('leadin', { - render: LeadinPluginSidebarWrapper, - icon: _Common_SidebarSprocketIcon__WEBPACK_IMPORTED_MODULE_6__["default"] - }); - } -} - -/***/ }), - -/***/ "./scripts/gutenberg/UIComponents/UIImage.ts": -/*!***************************************************!*\ - !*** ./scripts/gutenberg/UIComponents/UIImage.ts ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); - - -var _exp = /*#__PURE__*/function _exp() { - return function (props) { - return props.height ? props.height : 'auto'; - }; -}; - -var _exp2 = /*#__PURE__*/function _exp2() { - return function (props) { - return props.width ? props.width : 'auto'; - }; -}; - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_0__.styled)('img')({ - name: "UIImage0", - "class": "ump7xqy", - propsAsIs: false, - vars: { - "ump7xqy-0": [_exp()], - "ump7xqy-1": [_exp2()] - } -})); - -__webpack_require__(/*! ./UIImage.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./UIImage.ts */ "./scripts/gutenberg/UIComponents/UIImage.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/gutenberg/UIComponents/UIImage.ts"); - -/***/ }), - -/***/ "./scripts/gutenberg/UIComponents/UISidebarSelectControl.tsx": -/*!*******************************************************************!*\ - !*** ./scripts/gutenberg/UIComponents/UISidebarSelectControl.tsx ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/components */ "@wordpress/components"); -/* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_components__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _utils_withMetaData__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/withMetaData */ "./scripts/utils/withMetaData.ts"); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - - - - - - -var UISidebarSelectControl = function UISidebarSelectControl(props) { - var isBackgroundAppReady = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_3__.useBackgroundAppContext)(); - var monitorSidebarMetaChange = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_3__.usePostBackgroundMessage)(); - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_wordpress_components__WEBPACK_IMPORTED_MODULE_1__.SelectControl, _objectSpread({ - value: props.metaValue, - onChange: function onChange(content) { - if (props.setMetaValue) { - props.setMetaValue(content); - } - - isBackgroundAppReady && monitorSidebarMetaChange({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_4__.ProxyMessages.TrackSidebarMetaChange, - payload: { - metaKey: props.metaKey - } - }); - } - }, props)); -}; - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils_withMetaData__WEBPACK_IMPORTED_MODULE_2__["default"])(UISidebarSelectControl)); - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/core/CoreMessages.ts": -/*!****************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/core/CoreMessages.ts ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CoreMessages": () => (/* binding */ CoreMessages) -/* harmony export */ }); -var CoreMessages = { - HandshakeReceive: 'INTEGRATED_APP_EMBEDDER_HANDSHAKE_RECEIVED', - SendRefreshToken: 'INTEGRATED_APP_EMBEDDER_SEND_REFRESH_TOKEN', - ReloadParentFrame: 'INTEGRATED_APP_EMBEDDER_RELOAD_PARENT_FRAME', - RedirectParentFrame: 'INTEGRATED_APP_EMBEDDER_REDIRECT_PARENT_FRAME', - SendLocale: 'INTEGRATED_APP_EMBEDDER_SEND_LOCALE', - SendDeviceId: 'INTEGRATED_APP_EMBEDDER_SEND_DEVICE_ID', - SendIntegratedAppConfig: 'INTEGRATED_APP_EMBEDDER_CONFIG' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/forms/FormsMessages.ts": -/*!******************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/forms/FormsMessages.ts ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "FormMessages": () => (/* binding */ FormMessages) -/* harmony export */ }); -var FormMessages = { - CreateFormAppNavigation: 'CREATE_FORM_APP_NAVIGATION' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/index.ts": -/*!****************************************************!*\ - !*** ./scripts/iframe/integratedMessages/index.ts ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CoreMessages": () => (/* reexport safe */ _core_CoreMessages__WEBPACK_IMPORTED_MODULE_0__.CoreMessages), -/* harmony export */ "FormMessages": () => (/* reexport safe */ _forms_FormsMessages__WEBPACK_IMPORTED_MODULE_1__.FormMessages), -/* harmony export */ "LiveChatMessages": () => (/* reexport safe */ _livechat_LiveChatMessages__WEBPACK_IMPORTED_MODULE_2__.LiveChatMessages), -/* harmony export */ "PluginMessages": () => (/* reexport safe */ _plugin_PluginMessages__WEBPACK_IMPORTED_MODULE_3__.PluginMessages), -/* harmony export */ "ProxyMessages": () => (/* reexport safe */ _proxy_ProxyMessages__WEBPACK_IMPORTED_MODULE_4__.ProxyMessages) -/* harmony export */ }); -/* harmony import */ var _core_CoreMessages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/CoreMessages */ "./scripts/iframe/integratedMessages/core/CoreMessages.ts"); -/* harmony import */ var _forms_FormsMessages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./forms/FormsMessages */ "./scripts/iframe/integratedMessages/forms/FormsMessages.ts"); -/* harmony import */ var _livechat_LiveChatMessages__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./livechat/LiveChatMessages */ "./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts"); -/* harmony import */ var _plugin_PluginMessages__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./plugin/PluginMessages */ "./scripts/iframe/integratedMessages/plugin/PluginMessages.ts"); -/* harmony import */ var _proxy_ProxyMessages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./proxy/ProxyMessages */ "./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts"); - - - - - - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts": -/*!************************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "LiveChatMessages": () => (/* binding */ LiveChatMessages) -/* harmony export */ }); -var LiveChatMessages = { - CreateLiveChatAppNavigation: 'CREATE_LIVE_CHAT_APP_NAVIGATION' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/plugin/PluginMessages.ts": -/*!********************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/plugin/PluginMessages.ts ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "PluginMessages": () => (/* binding */ PluginMessages) -/* harmony export */ }); -var PluginMessages = { - PluginSettingsNavigation: 'PLUGIN_SETTINGS_NAVIGATION', - PluginLeadinConfig: 'PLUGIN_LEADIN_CONFIG', - TrackConsent: 'INTEGRATED_APP_EMBEDDER_TRACK_CONSENT', - InternalTrackingFetchRequest: 'INTEGRATED_TRACKING_FETCH_REQUEST', - InternalTrackingFetchResponse: 'INTEGRATED_TRACKING_FETCH_RESPONSE', - InternalTrackingFetchError: 'INTEGRATED_TRACKING_FETCH_ERROR', - InternalTrackingChangeRequest: 'INTEGRATED_TRACKING_CHANGE_REQUEST', - InternalTrackingChangeError: 'INTEGRATED_TRACKING_CHANGE_ERROR', - BusinessUnitFetchRequest: 'BUSINESS_UNIT_FETCH_REQUEST', - BusinessUnitFetchResponse: 'BUSINESS_UNIT_FETCH_FETCH_RESPONSE', - BusinessUnitFetchError: 'BUSINESS_UNIT_FETCH_FETCH_ERROR', - BusinessUnitChangeRequest: 'BUSINESS_UNIT_CHANGE_REQUEST', - BusinessUnitChangeError: 'BUSINESS_UNIT_CHANGE_ERROR', - SkipReviewRequest: 'SKIP_REVIEW_REQUEST', - SkipReviewResponse: 'SKIP_REVIEW_RESPONSE', - SkipReviewError: 'SKIP_REVIEW_ERROR', - RemoveParentQueryParam: 'REMOVE_PARENT_QUERY_PARAM', - ContentEmbedInstallRequest: 'CONTENT_EMBED_INSTALL_REQUEST', - ContentEmbedInstallResponse: 'CONTENT_EMBED_INSTALL_RESPONSE', - ContentEmbedInstallError: 'CONTENT_EMBED_INSTALL_ERROR', - ContentEmbedActivationRequest: 'CONTENT_EMBED_ACTIVATION_REQUEST', - ContentEmbedActivationResponse: 'CONTENT_EMBED_ACTIVATION_RESPONSE', - ContentEmbedActivationError: 'CONTENT_EMBED_ACTIVATION_ERROR' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts": -/*!******************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ProxyMessages": () => (/* binding */ ProxyMessages) -/* harmony export */ }); -var ProxyMessages = { - FetchForms: 'FETCH_FORMS', - FetchForm: 'FETCH_FORM', - CreateFormFromTemplate: 'CREATE_FORM_FROM_TEMPLATE', - FetchAuth: 'FETCH_AUTH', - FetchMeetingsAndUsers: 'FETCH_MEETINGS_AND_USERS', - FetchContactsCreateSinceActivation: 'FETCH_CONTACTS_CREATED_SINCE_ACTIVATION', - FetchOrCreateMeetingUser: 'FETCH_OR_CREATE_MEETING_USER', - ConnectMeetingsCalendar: 'CONNECT_MEETINGS_CALENDAR', - TrackFormPreviewRender: 'TRACK_FORM_PREVIEW_RENDER', - TrackFormCreatedFromTemplate: 'TRACK_FORM_CREATED_FROM_TEMPLATE', - TrackFormCreationFailed: 'TRACK_FORM_CREATION_FAILED', - TrackMeetingPreviewRender: 'TRACK_MEETING_PREVIEW_RENDER', - TrackSidebarMetaChange: 'TRACK_SIDEBAR_META_CHANGE', - TrackReviewBannerRender: 'TRACK_REVIEW_BANNER_RENDER', - TrackReviewBannerInteraction: 'TRACK_REVIEW_BANNER_INTERACTION', - TrackReviewBannerDismissed: 'TRACK_REVIEW_BANNER_DISMISSED', - TrackPluginDeactivation: 'TRACK_PLUGIN_DEACTIVATION' -}; - -/***/ }), - -/***/ "./scripts/iframe/useBackgroundApp.ts": -/*!********************************************!*\ - !*** ./scripts/iframe/useBackgroundApp.ts ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "BackgroudAppContext": () => (/* binding */ BackgroudAppContext), -/* harmony export */ "useBackgroundAppContext": () => (/* binding */ useBackgroundAppContext), -/* harmony export */ "usePostAsyncBackgroundMessage": () => (/* binding */ usePostAsyncBackgroundMessage), -/* harmony export */ "usePostBackgroundMessage": () => (/* binding */ usePostBackgroundMessage) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); - -var BackgroudAppContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(null); -function useBackgroundAppContext() { - return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(BackgroudAppContext); -} -function usePostBackgroundMessage() { - var app = useBackgroundAppContext(); - return function (message) { - app.postMessage(message); - }; -} -function usePostAsyncBackgroundMessage() { - var app = useBackgroundAppContext(); - return function (message) { - return app.postAsyncMessage(message); - }; -} - -/***/ }), - -/***/ "./scripts/lib/Raven.ts": -/*!******************************!*\ - !*** ./scripts/lib/Raven.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "configureRaven": () => (/* binding */ configureRaven), -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! raven-js */ "./node_modules/raven-js/src/singleton.js"); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(raven_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); - - -function configureRaven() { - if (_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.hubspotBaseUrl.indexOf('app.hubspot.com') === -1) { - return; - } - - raven_js__WEBPACK_IMPORTED_MODULE_0___default().config('https://e9b8f382cdd130c0d415cd977d2be56f@exceptions.hubspot.com/1', { - instrument: { - tryCatch: false - }, - release: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.leadinPluginVersion - }).install(); - raven_js__WEBPACK_IMPORTED_MODULE_0___default().setTagsContext({ - v: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.leadinPluginVersion, - php: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.phpVersion, - wordpress: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.wpVersion - }); - raven_js__WEBPACK_IMPORTED_MODULE_0___default().setExtraContext({ - hub: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.portalId, - plugins: Object.keys(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.plugins).map(function (name) { - return "".concat(name, "#").concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.plugins[name]); - }).join(',') - }); -} -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((raven_js__WEBPACK_IMPORTED_MODULE_0___default())); - -/***/ }), - -/***/ "./scripts/shared/Common/AsyncSelect.tsx": -/*!***********************************************!*\ - !*** ./scripts/shared/Common/AsyncSelect.tsx ***! - \***********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ AsyncSelect) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); -/* harmony import */ var _UIComponents_colors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../UIComponents/colors */ "./scripts/shared/UIComponents/colors.ts"); -/* harmony import */ var _UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../UIComponents/UISpinner */ "./scripts/shared/UIComponents/UISpinner.tsx"); -/* harmony import */ var _enums_loadState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../enums/loadState */ "./scripts/shared/enums/loadState.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - - - -var Container = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "Container", - "class": "c1wxx7eu", - propsAsIs: false -}); - -var _exp2 = /*#__PURE__*/function _exp2() { - return function (props) { - return props.focused ? '0' : '1px'; - }; -}; - -var _exp3 = /*#__PURE__*/function _exp3() { - return function (props) { - return props.focused ? "0 0 0 2px ".concat(_UIComponents_colors__WEBPACK_IMPORTED_MODULE_2__.CALYPSO_MEDIUM) : 'none'; - }; -}; - -var ControlContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "ControlContainer", - "class": "c1rgwbep", - propsAsIs: false, - vars: { - "c1rgwbep-0": [_exp2()], - "c1rgwbep-1": [_exp3()] - } -}); -var ValueContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "ValueContainer", - "class": "v1mdmbaj", - propsAsIs: false -}); -var Placeholder = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "Placeholder", - "class": "p1gwkvxy", - propsAsIs: false -}); -var SingleValue = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "SingleValue", - "class": "s1bwlafs", - propsAsIs: false -}); -var IndicatorContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "IndicatorContainer", - "class": "i196z9y5", - propsAsIs: false -}); -var DropdownIndicator = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "DropdownIndicator", - "class": "d1dfo5ow", - propsAsIs: false -}); -var InputContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "InputContainer", - "class": "if3lze", - propsAsIs: false -}); -var Input = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('input')({ - name: "Input", - "class": "i9kxf50", - propsAsIs: false -}); -var InputShadow = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "InputShadow", - "class": "igjr3uc", - propsAsIs: false -}); -var MenuContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "MenuContainer", - "class": "mhb9if7", - propsAsIs: false -}); -var MenuList = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "MenuList", - "class": "mxaof7s", - propsAsIs: false -}); -var MenuGroup = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "MenuGroup", - "class": "mw50s5v", - propsAsIs: false -}); -var MenuGroupHeader = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "MenuGroupHeader", - "class": "m11rzvjw", - propsAsIs: false -}); - -var _exp5 = /*#__PURE__*/function _exp5() { - return function (props) { - return props.selected ? _UIComponents_colors__WEBPACK_IMPORTED_MODULE_2__.CALYPSO_MEDIUM : 'transparent'; - }; -}; - -var _exp6 = /*#__PURE__*/function _exp6() { - return function (props) { - return props.selected ? '#fff' : 'inherit'; - }; -}; - -var _exp7 = /*#__PURE__*/function _exp7() { - return function (props) { - return props.selected ? _UIComponents_colors__WEBPACK_IMPORTED_MODULE_2__.CALYPSO_MEDIUM : _UIComponents_colors__WEBPACK_IMPORTED_MODULE_2__.CALYPSO_LIGHT; - }; -}; - -var MenuItem = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_5__.styled)('div')({ - name: "MenuItem", - "class": "m1jcdsjv", - propsAsIs: false, - vars: { - "m1jcdsjv-0": [_exp5()], - "m1jcdsjv-1": [_exp6()], - "m1jcdsjv-2": [_exp7()] - } -}); -function AsyncSelect(_ref) { - var placeholder = _ref.placeholder, - value = _ref.value, - loadOptions = _ref.loadOptions, - onChange = _ref.onChange, - defaultOptions = _ref.defaultOptions; - var inputEl = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); - var inputShadowEl = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); - - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false), - _useState2 = _slicedToArray(_useState, 2), - isFocused = _useState2[0], - setFocus = _useState2[1]; - - var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(_enums_loadState__WEBPACK_IMPORTED_MODULE_4__["default"].NotLoaded), - _useState4 = _slicedToArray(_useState3, 2), - loadState = _useState4[0], - setLoadState = _useState4[1]; - - var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(''), - _useState6 = _slicedToArray(_useState5, 2), - localValue = _useState6[0], - setLocalValue = _useState6[1]; - - var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(defaultOptions), - _useState8 = _slicedToArray(_useState7, 2), - options = _useState8[0], - setOptions = _useState8[1]; - - var inputSize = "".concat(inputShadowEl.current ? inputShadowEl.current.clientWidth + 10 : 2, "px"); - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - if (loadOptions && loadState === _enums_loadState__WEBPACK_IMPORTED_MODULE_4__["default"].NotLoaded) { - loadOptions('', function (result) { - setOptions(result); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_4__["default"].Idle); - }); - } - }, [loadOptions, loadState]); - - var renderItems = function renderItems() { - var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - var parentKey = arguments.length > 1 ? arguments[1] : undefined; - return items.map(function (item, index) { - if (item.options) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(MenuGroup, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(MenuGroupHeader, { - id: "".concat(index, "-heading"), - children: item.label - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { - children: renderItems(item.options, index) - })] - }, "async-select-item-".concat(index)); - } else { - var key = "async-select-item-".concat(parentKey !== undefined ? "".concat(parentKey, "-").concat(index) : index); - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(MenuItem, { - id: key, - selected: value && item.value === value.value, - onClick: function onClick() { - onChange(item); - setFocus(false); - }, - children: item.label - }, key); - } - }); - }; - - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(Container, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(ControlContainer, { - id: "leadin-async-selector", - focused: isFocused, - onClick: function onClick() { - if (isFocused) { - if (inputEl.current) { - inputEl.current.blur(); - } - - setFocus(false); - setLocalValue(''); - } else { - if (inputEl.current) { - inputEl.current.focus(); - } - - setFocus(true); - } - }, - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(ValueContainer, { - children: [localValue === '' && (!value ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Placeholder, { - children: placeholder - }) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(SingleValue, { - children: value.label - })), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(InputContainer, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Input, { - ref: inputEl, - onFocus: function onFocus() { - setFocus(true); - }, - onChange: function onChange(e) { - setLocalValue(e.target.value); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_4__["default"].Loading); - loadOptions && loadOptions(e.target.value, function (result) { - setOptions(result); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_4__["default"].Idle); - }); - }, - value: localValue, - width: inputSize, - id: "asycn-select-input" - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(InputShadow, { - ref: inputShadowEl, - children: localValue - })] - })] - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(IndicatorContainer, { - children: [loadState === _enums_loadState__WEBPACK_IMPORTED_MODULE_4__["default"].Loading && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_3__["default"], {}), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(DropdownIndicator, {})] - })] - }), isFocused && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(MenuContainer, { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(MenuList, { - children: renderItems(options) - }) - })] - }); -} - -__webpack_require__(/*! ./AsyncSelect.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./AsyncSelect.tsx */ "./scripts/shared/Common/AsyncSelect.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/AsyncSelect.tsx"); - -/***/ }), - -/***/ "./scripts/shared/Common/ErrorHandler.tsx": -/*!************************************************!*\ - !*** ./scripts/shared/Common/ErrorHandler.tsx ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ ErrorHandler) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _UIComponents_UIButton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../UIComponents/UIButton */ "./scripts/shared/UIComponents/UIButton.ts"); -/* harmony import */ var _UIComponents_UIContainer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../UIComponents/UIContainer */ "./scripts/shared/UIComponents/UIContainer.ts"); -/* harmony import */ var _HubspotWrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./HubspotWrapper */ "./scripts/shared/Common/HubspotWrapper.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__); - - - - - - - - -function redirectToPlugin() { - window.location.href = "".concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_4__.adminUrl, "admin.php?page=leadin&leadin_expired=").concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_4__.redirectNonce); -} - -function ErrorHandler(_ref) { - var status = _ref.status, - resetErrorState = _ref.resetErrorState, - _ref$errorInfo = _ref.errorInfo, - errorInfo = _ref$errorInfo === void 0 ? { - header: '', - message: '', - action: '' - } : _ref$errorInfo; - var isUnauthorized = status === 401 || status === 403; - var errorHeader = isUnauthorized ? (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)("Your plugin isn't authorized", 'leadin') : errorInfo.header; - var errorMessage = isUnauthorized ? (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('Reauthorize your plugin to access your free HubSpot tools', 'leadin') : errorInfo.message; - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_HubspotWrapper__WEBPACK_IMPORTED_MODULE_3__["default"], { - pluginPath: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_4__.pluginPath, - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_UIComponents_UIContainer__WEBPACK_IMPORTED_MODULE_2__["default"], { - textAlign: "center", - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h4", { - children: errorHeader - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("b", { - children: errorMessage - }) - }), isUnauthorized ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIButton__WEBPACK_IMPORTED_MODULE_1__["default"], { - "data-test-id": "authorize-button", - onClick: redirectToPlugin, - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('Go to plugin', 'leadin') - }) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIButton__WEBPACK_IMPORTED_MODULE_1__["default"], { - "data-test-id": "retry-button", - onClick: resetErrorState, - children: errorInfo.action - })] - }) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Common/HubspotWrapper.ts": -/*!*************************************************!*\ - !*** ./scripts/shared/Common/HubspotWrapper.ts ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); - - -var _exp = /*#__PURE__*/function _exp() { - return function (props) { - return "url(".concat(props.pluginPath, "/public/assets/images/hubspot.svg)"); - }; -}; - -var _exp2 = /*#__PURE__*/function _exp2() { - return function (props) { - return props.padding || '90px 20% 25px'; - }; -}; - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_0__.styled)('div')({ - name: "HubspotWrapper0", - "class": "h1q5v5ee", - propsAsIs: false, - vars: { - "h1q5v5ee-0": [_exp()], - "h1q5v5ee-1": [_exp2()] - } -})); - -__webpack_require__(/*! ./HubspotWrapper.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./HubspotWrapper.ts */ "./scripts/shared/Common/HubspotWrapper.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/HubspotWrapper.ts"); - -/***/ }), - -/***/ "./scripts/shared/Common/LoadingBlock.tsx": -/*!************************************************!*\ - !*** ./scripts/shared/Common/LoadingBlock.tsx ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ LoadingBlock) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _HubspotWrapper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./HubspotWrapper */ "./scripts/shared/Common/HubspotWrapper.ts"); -/* harmony import */ var _UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../UIComponents/UISpinner */ "./scripts/shared/UIComponents/UISpinner.tsx"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); - - - - -function LoadingBlock() { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_HubspotWrapper__WEBPACK_IMPORTED_MODULE_1__["default"], { - pluginPath: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__.pluginPath, - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UISpinner__WEBPACK_IMPORTED_MODULE_2__["default"], { - size: 50 - }) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Form/FormEdit.tsx": -/*!******************************************!*\ - !*** ./scripts/shared/Form/FormEdit.tsx ***! - \******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FormEditContainer) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _UIComponents_UISpacer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../UIComponents/UISpacer */ "./scripts/shared/UIComponents/UISpacer.ts"); -/* harmony import */ var _PreviewForm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PreviewForm */ "./scripts/shared/Form/PreviewForm.tsx"); -/* harmony import */ var _FormSelect__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FormSelect */ "./scripts/shared/Form/FormSelect.tsx"); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -/* harmony import */ var _Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Common/LoadingBlock */ "./scripts/shared/Common/LoadingBlock.tsx"); -/* harmony import */ var _utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../utils/backgroundAppUtils */ "./scripts/utils/backgroundAppUtils.ts"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - - - - - - - - - - - -function FormEdit(_ref) { - var attributes = _ref.attributes, - isSelected = _ref.isSelected, - setAttributes = _ref.setAttributes, - _ref$preview = _ref.preview, - preview = _ref$preview === void 0 ? true : _ref$preview, - _ref$origin = _ref.origin, - origin = _ref$origin === void 0 ? 'gutenberg' : _ref$origin; - var formId = attributes.formId, - formName = attributes.formName; - var formSelected = _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.portalId && formId; - var isBackgroundAppReady = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__.useBackgroundAppContext)(); - var monitorFormPreviewRender = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__.usePostBackgroundMessage)(); - - var handleChange = function handleChange(selectedForm) { - setAttributes({ - portalId: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.portalId, - formId: selectedForm.value, - formName: selectedForm.label - }); - }; - - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - monitorFormPreviewRender({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_7__.ProxyMessages.TrackFormPreviewRender, - payload: { - origin: origin - } - }); - }, [origin]); - return !isBackgroundAppReady ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_8__["default"], {}) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: [(isSelected || !formSelected) && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_FormSelect__WEBPACK_IMPORTED_MODULE_5__["default"], { - formId: formId, - formName: formName, - handleChange: handleChange, - origin: origin - }), formSelected && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: [isSelected && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UISpacer__WEBPACK_IMPORTED_MODULE_3__["default"], {}), preview && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_PreviewForm__WEBPACK_IMPORTED_MODULE_4__["default"], { - portalId: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.portalId, - formId: formId - })] - })] - }); -} - -function FormEditContainer(props) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__.BackgroudAppContext.Provider, { - value: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.refreshToken && (0,_utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_9__.getOrCreateBackgroundApp)(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.refreshToken), - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(FormEdit, _objectSpread({}, props)) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Form/FormSelect.tsx": -/*!********************************************!*\ - !*** ./scripts/shared/Form/FormSelect.tsx ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FormSelect) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _FormSelector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FormSelector */ "./scripts/shared/Form/FormSelector.tsx"); -/* harmony import */ var _Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Common/LoadingBlock */ "./scripts/shared/Common/LoadingBlock.tsx"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _hooks_useForms__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./hooks/useForms */ "./scripts/shared/Form/hooks/useForms.ts"); -/* harmony import */ var _hooks_useCreateFormFromTemplate__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hooks/useCreateFormFromTemplate */ "./scripts/shared/Form/hooks/useCreateFormFromTemplate.ts"); -/* harmony import */ var _constants_defaultFormOptions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../constants/defaultFormOptions */ "./scripts/constants/defaultFormOptions.ts"); -/* harmony import */ var _Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Common/ErrorHandler */ "./scripts/shared/Common/ErrorHandler.tsx"); - - - - - - - - -function FormSelect(_ref) { - var formId = _ref.formId, - formName = _ref.formName, - handleChange = _ref.handleChange, - _ref$origin = _ref.origin, - origin = _ref$origin === void 0 ? 'gutenberg' : _ref$origin; - - var _useForms = (0,_hooks_useForms__WEBPACK_IMPORTED_MODULE_4__["default"])(), - search = _useForms.search, - formApiError = _useForms.formApiError, - reset = _useForms.reset; - - var _useCreateFormFromTem = (0,_hooks_useCreateFormFromTemplate__WEBPACK_IMPORTED_MODULE_5__["default"])(origin), - createFormByTemplate = _useCreateFormFromTem.createFormByTemplate, - createReset = _useCreateFormFromTem.reset, - isCreating = _useCreateFormFromTem.isCreating, - hasError = _useCreateFormFromTem.hasError, - createApiError = _useCreateFormFromTem.formApiError; - - var value = formId && formName ? { - label: formName, - value: formId - } : null; - - var handleLocalChange = function handleLocalChange(option) { - if ((0,_constants_defaultFormOptions__WEBPACK_IMPORTED_MODULE_6__.isDefaultForm)(option.value)) { - createFormByTemplate(option.value).then(function (_ref2) { - var guid = _ref2.guid, - name = _ref2.name; - handleChange({ - value: guid, - label: name - }); - }); - } else { - handleChange(option); - } - }; - - return isCreating ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_2__["default"], {}) : formApiError || createApiError ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_7__["default"], { - status: formApiError ? formApiError.status : createApiError.status, - resetErrorState: function resetErrorState() { - if (hasError) { - createReset(); - } else { - reset(); - } - }, - errorInfo: { - header: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('There was a problem retrieving your forms', 'leadin'), - message: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Please refresh your forms or try again in a few minutes', 'leadin'), - action: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Refresh forms', 'leadin') - } - }) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_FormSelector__WEBPACK_IMPORTED_MODULE_1__["default"], { - loadOptions: search, - onChange: function onChange(option) { - return handleLocalChange(option); - }, - value: value - }); -} - -/***/ }), - -/***/ "./scripts/shared/Form/FormSelector.tsx": -/*!**********************************************!*\ - !*** ./scripts/shared/Form/FormSelector.tsx ***! - \**********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FormSelector) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _Common_HubspotWrapper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Common/HubspotWrapper */ "./scripts/shared/Common/HubspotWrapper.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _Common_AsyncSelect__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Common/AsyncSelect */ "./scripts/shared/Common/AsyncSelect.tsx"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__); - - - - - -function FormSelector(_ref) { - var loadOptions = _ref.loadOptions, - onChange = _ref.onChange, - value = _ref.value; - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_Common_HubspotWrapper__WEBPACK_IMPORTED_MODULE_1__["default"], { - pluginPath: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.pluginPath, - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", { - "data-test-id": "leadin-form-select", - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("b", { - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Select an existing form or create a new one from a template', 'leadin') - }) - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_AsyncSelect__WEBPACK_IMPORTED_MODULE_3__["default"], { - placeholder: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Search for a form', 'leadin'), - value: value, - loadOptions: loadOptions, - onChange: onChange - })] - }); -} - -/***/ }), - -/***/ "./scripts/shared/Form/PreviewForm.tsx": -/*!*********************************************!*\ - !*** ./scripts/shared/Form/PreviewForm.tsx ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ PreviewForm) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _UIComponents_UIOverlay__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../UIComponents/UIOverlay */ "./scripts/shared/UIComponents/UIOverlay.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _hooks_useFormsScript__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./hooks/useFormsScript */ "./scripts/shared/Form/hooks/useFormsScript.ts"); - - - - - -function PreviewForm(_ref) { - var portalId = _ref.portalId, - formId = _ref.formId; - var inputEl = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); - var ready = (0,_hooks_useFormsScript__WEBPACK_IMPORTED_MODULE_4__["default"])(); - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - if (!ready) { - return; - } - - if (inputEl.current) { - inputEl.current.innerHTML = ''; - var embedScript = document.createElement('script'); - embedScript.innerHTML = "hbspt.forms.create({ portalId: '".concat(portalId, "', formId: '").concat(formId, "', region: '").concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__.hublet, "', ").concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__.formsScriptPayload, " });"); - inputEl.current.appendChild(embedScript); - } - }, [formId, portalId, ready, inputEl]); - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIOverlay__WEBPACK_IMPORTED_MODULE_2__["default"], { - ref: inputEl - }); -} - -/***/ }), - -/***/ "./scripts/shared/Form/hooks/useCreateFormFromTemplate.ts": -/*!****************************************************************!*\ - !*** ./scripts/shared/Form/hooks/useCreateFormFromTemplate.ts ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useCreateFormFromTemplate) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _enums_loadState__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../enums/loadState */ "./scripts/shared/enums/loadState.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - -function useCreateFormFromTemplate() { - var origin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'gutenberg'; - var proxy = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__.usePostAsyncBackgroundMessage)(); - var track = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__.usePostBackgroundMessage)(); - - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Idle), - _useState2 = _slicedToArray(_useState, 2), - loadState = _useState2[0], - setLoadState = _useState2[1]; - - var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), - _useState4 = _slicedToArray(_useState3, 2), - formApiError = _useState4[0], - setFormApiError = _useState4[1]; - - var createFormByTemplate = function createFormByTemplate(type) { - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Loading); - track({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__.ProxyMessages.TrackFormCreatedFromTemplate, - payload: { - type: type, - origin: origin - } - }); - return proxy({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__.ProxyMessages.CreateFormFromTemplate, - payload: type - }).then(function (form) { - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Idle); - return form; - })["catch"](function (err) { - setFormApiError(err); - track({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__.ProxyMessages.TrackFormCreationFailed, - payload: { - origin: origin - } - }); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Failed); - }); - }; - - return { - isCreating: loadState === _enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Loading, - hasError: loadState === _enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Failed, - formApiError: formApiError, - createFormByTemplate: createFormByTemplate, - reset: function reset() { - return setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Idle); - } - }; -} - -/***/ }), - -/***/ "./scripts/shared/Form/hooks/useForms.ts": -/*!***********************************************!*\ - !*** ./scripts/shared/Form/hooks/useForms.ts ***! - \***********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useForms) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/debounce */ "./node_modules/lodash/debounce.js"); -/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _constants_defaultFormOptions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../constants/defaultFormOptions */ "./scripts/constants/defaultFormOptions.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - - -function useForms() { - var proxy = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_2__.usePostAsyncBackgroundMessage)(); - - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), - _useState2 = _slicedToArray(_useState, 2), - formApiError = _useState2[0], - setFormApiError = _useState2[1]; - - var search = lodash_debounce__WEBPACK_IMPORTED_MODULE_1___default()(function (search, callback) { - return proxy({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_4__.ProxyMessages.FetchForms, - payload: { - search: search - } - }).then(function (forms) { - callback([].concat(_toConsumableArray(forms.map(function (form) { - return { - label: form.name, - value: form.guid - }; - })), [_constants_defaultFormOptions__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_OPTIONS])); - })["catch"](function (error) { - setFormApiError(error); - }); - }, 300, { - trailing: true - }); - return { - search: search, - formApiError: formApiError, - reset: function reset() { - return setFormApiError(null); - } - }; -} - -/***/ }), - -/***/ "./scripts/shared/Form/hooks/useFormsScript.ts": -/*!*****************************************************!*\ - !*** ./scripts/shared/Form/hooks/useFormsScript.ts ***! - \*****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useFormScript) -/* harmony export */ }); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _lib_Raven__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../lib/Raven */ "./scripts/lib/Raven.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - -var promise; - -function loadFormsScript() { - if (!promise) { - promise = new Promise(function (resolve, reject) { - return jquery__WEBPACK_IMPORTED_MODULE_0___default().getScript(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.formsScript).done(resolve).fail(reject); - }); - } - - return promise; -} - -function useFormScript() { - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false), - _useState2 = _slicedToArray(_useState, 2), - ready = _useState2[0], - setReady = _useState2[1]; - - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - loadFormsScript().then(function () { - return setReady(true); - })["catch"](function (error) { - return _lib_Raven__WEBPACK_IMPORTED_MODULE_3__["default"].captureException(error); - }); - }, []); - return ready; -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/MeetingController.tsx": -/*!******************************************************!*\ - !*** ./scripts/shared/Meeting/MeetingController.tsx ***! - \******************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ MeetingController) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Common/LoadingBlock */ "./scripts/shared/Common/LoadingBlock.tsx"); -/* harmony import */ var _MeetingSelector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./MeetingSelector */ "./scripts/shared/Meeting/MeetingSelector.tsx"); -/* harmony import */ var _MeetingWarning__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./MeetingWarning */ "./scripts/shared/Meeting/MeetingWarning.tsx"); -/* harmony import */ var _hooks_useMeetings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hooks/useMeetings */ "./scripts/shared/Meeting/hooks/useMeetings.ts"); -/* harmony import */ var _Common_HubspotWrapper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Common/HubspotWrapper */ "./scripts/shared/Common/HubspotWrapper.ts"); -/* harmony import */ var _Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Common/ErrorHandler */ "./scripts/shared/Common/ErrorHandler.tsx"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! raven-js */ "./node_modules/raven-js/src/singleton.js"); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(raven_js__WEBPACK_IMPORTED_MODULE_10__); - - - - - - - - - - - -function MeetingController(_ref) { - var handleChange = _ref.handleChange, - url = _ref.url; - - var _useMeetings = (0,_hooks_useMeetings__WEBPACK_IMPORTED_MODULE_5__["default"])(), - meetings = _useMeetings.mappedMeetings, - loading = _useMeetings.loading, - error = _useMeetings.error, - reload = _useMeetings.reload, - connectCalendar = _useMeetings.connectCalendar; - - var selectedMeetingOption = (0,_hooks_useMeetings__WEBPACK_IMPORTED_MODULE_5__.useSelectedMeeting)(url); - var selectedMeetingCalendar = (0,_hooks_useMeetings__WEBPACK_IMPORTED_MODULE_5__.useSelectedMeetingCalendar)(url); - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - if (!url && meetings.length > 0) { - handleChange(meetings[0].value); - } - }, [meetings, url, handleChange]); - - var handleLocalChange = function handleLocalChange(option) { - handleChange(option.value); - }; - - var handleConnectCalendar = function handleConnectCalendar() { - return connectCalendar().then(function () { - reload(); - })["catch"](function (error) { - raven_js__WEBPACK_IMPORTED_MODULE_10___default().captureMessage('Unable to connect calendar', { - extra: { - error: error - } - }); - }); - }; - - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: loading ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_2__["default"], {}) : error ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_ErrorHandler__WEBPACK_IMPORTED_MODULE_7__["default"], { - status: error && error.status || error, - resetErrorState: function resetErrorState() { - return reload(); - }, - errorInfo: { - header: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__.__)('There was a problem retrieving your meetings', 'leadin'), - message: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__.__)('Please refresh your meetings or try again in a few minutes', 'leadin'), - action: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_9__.__)('Refresh meetings', 'leadin') - } - }) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_Common_HubspotWrapper__WEBPACK_IMPORTED_MODULE_6__["default"], { - padding: "90px 32px 24px", - pluginPath: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_8__.pluginPath, - children: [selectedMeetingCalendar && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_MeetingWarning__WEBPACK_IMPORTED_MODULE_4__["default"], { - status: selectedMeetingCalendar, - onConnectCalendar: handleConnectCalendar - }), meetings.length > 1 && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_MeetingSelector__WEBPACK_IMPORTED_MODULE_3__["default"], { - onChange: handleLocalChange, - options: meetings, - value: selectedMeetingOption - })] - }) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/MeetingEdit.tsx": -/*!************************************************!*\ - !*** ./scripts/shared/Meeting/MeetingEdit.tsx ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ MeetingsEditContainer) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _MeetingController__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MeetingController */ "./scripts/shared/Meeting/MeetingController.tsx"); -/* harmony import */ var _PreviewMeeting__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./PreviewMeeting */ "./scripts/shared/Meeting/PreviewMeeting.tsx"); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -/* harmony import */ var _Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Common/LoadingBlock */ "./scripts/shared/Common/LoadingBlock.tsx"); -/* harmony import */ var _utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../utils/backgroundAppUtils */ "./scripts/utils/backgroundAppUtils.ts"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - - - - - - - - - - -function MeetingEdit(_ref) { - var url = _ref.attributes.url, - isSelected = _ref.isSelected, - setAttributes = _ref.setAttributes, - _ref$preview = _ref.preview, - preview = _ref$preview === void 0 ? true : _ref$preview, - _ref$origin = _ref.origin, - origin = _ref$origin === void 0 ? 'gutenberg' : _ref$origin; - var isBackgroundAppReady = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_4__.useBackgroundAppContext)(); - var monitorFormPreviewRender = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_4__.usePostBackgroundMessage)(); - - var handleChange = function handleChange(newUrl) { - setAttributes({ - url: newUrl - }); - }; - - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - monitorFormPreviewRender({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_6__.ProxyMessages.TrackMeetingPreviewRender, - payload: { - origin: origin - } - }); - }, [origin]); - return !isBackgroundAppReady ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_LoadingBlock__WEBPACK_IMPORTED_MODULE_7__["default"], {}) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: [(isSelected || !url) && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_MeetingController__WEBPACK_IMPORTED_MODULE_2__["default"], { - url: url, - handleChange: handleChange - }), preview && url && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_PreviewMeeting__WEBPACK_IMPORTED_MODULE_3__["default"], { - url: url - })] - }); -} - -function MeetingsEditContainer(props) { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_4__.BackgroudAppContext.Provider, { - value: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_5__.refreshToken && (0,_utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_8__.getOrCreateBackgroundApp)(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_5__.refreshToken), - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(MeetingEdit, _objectSpread({}, props)) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/MeetingSelector.tsx": -/*!****************************************************!*\ - !*** ./scripts/shared/Meeting/MeetingSelector.tsx ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ MeetingSelector) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _Common_AsyncSelect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Common/AsyncSelect */ "./scripts/shared/Common/AsyncSelect.tsx"); -/* harmony import */ var _UIComponents_UISpacer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../UIComponents/UISpacer */ "./scripts/shared/UIComponents/UISpacer.ts"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__); - - - - - -function MeetingSelector(_ref) { - var options = _ref.options, - onChange = _ref.onChange, - value = _ref.value; - var optionsWrapper = [{ - label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Meeting name', 'leadin'), - options: options - }]; - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UISpacer__WEBPACK_IMPORTED_MODULE_3__["default"], {}), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", { - "data-test-id": "leadin-meeting-select", - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("b", { - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Select a meeting scheduling page', 'leadin') - }) - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Common_AsyncSelect__WEBPACK_IMPORTED_MODULE_2__["default"], { - defaultOptions: optionsWrapper, - onChange: onChange, - placeholder: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Select a meeting', 'leadin'), - value: value - })] - }); -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/MeetingWarning.tsx": -/*!***************************************************!*\ - !*** ./scripts/shared/Meeting/MeetingWarning.tsx ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ MeetingWarning) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _UIComponents_UIAlert__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../UIComponents/UIAlert */ "./scripts/shared/UIComponents/UIAlert.tsx"); -/* harmony import */ var _UIComponents_UIButton__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../UIComponents/UIButton */ "./scripts/shared/UIComponents/UIButton.ts"); -/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ "./scripts/shared/Meeting/constants.ts"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__); - - - - - -function MeetingWarning(_ref) { - var status = _ref.status, - onConnectCalendar = _ref.onConnectCalendar; - var isMeetingOwner = status === _constants__WEBPACK_IMPORTED_MODULE_3__.CURRENT_USER_CALENDAR_MISSING; - var titleText = isMeetingOwner ? (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Your calendar is not connected', 'leadin') : (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Calendar is not connected', 'leadin'); - var titleMessage = isMeetingOwner ? (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Please connect your calendar to activate your scheduling pages', 'leadin') : (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Make sure that everybody in this meeting has connected their calendar from the Meetings page in HubSpot', 'leadin'); - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIAlert__WEBPACK_IMPORTED_MODULE_1__["default"], { - titleText: titleText, - titleMessage: titleMessage, - children: isMeetingOwner && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIButton__WEBPACK_IMPORTED_MODULE_2__["default"], { - use: "tertiary", - id: "meetings-connect-calendar", - onClick: onConnectCalendar, - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Connect calendar', 'leadin') - }) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/PreviewMeeting.tsx": -/*!***************************************************!*\ - !*** ./scripts/shared/Meeting/PreviewMeeting.tsx ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ PreviewForm) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _UIComponents_UIOverlay__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../UIComponents/UIOverlay */ "./scripts/shared/UIComponents/UIOverlay.ts"); -/* harmony import */ var _hooks_useMeetingsScript__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hooks/useMeetingsScript */ "./scripts/shared/Meeting/hooks/useMeetingsScript.ts"); - - - - -function PreviewForm(_ref) { - var url = _ref.url; - var ready = (0,_hooks_useMeetingsScript__WEBPACK_IMPORTED_MODULE_3__["default"])(); - var inputEl = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - if (!ready) { - return; - } - - if (inputEl.current) { - inputEl.current.innerHTML = ''; - var container = document.createElement('div'); - container.dataset.src = "".concat(url, "?embed=true"); - container.classList.add('meetings-iframe-container'); - inputEl.current.appendChild(container); - var embedScript = document.createElement('script'); - embedScript.innerHTML = 'hbspt.meetings.create(".meetings-iframe-container");'; - inputEl.current.appendChild(embedScript); - } - }, [url, ready, inputEl]); - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: url && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_UIComponents_UIOverlay__WEBPACK_IMPORTED_MODULE_2__["default"], { - ref: inputEl - }) - }); -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/constants.ts": -/*!*********************************************!*\ - !*** ./scripts/shared/Meeting/constants.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CURRENT_USER_CALENDAR_MISSING": () => (/* binding */ CURRENT_USER_CALENDAR_MISSING), -/* harmony export */ "OTHER_USER_CALENDAR_MISSING": () => (/* binding */ OTHER_USER_CALENDAR_MISSING) -/* harmony export */ }); -var OTHER_USER_CALENDAR_MISSING = 'OTHER_USER_CALENDAR_MISSING'; -var CURRENT_USER_CALENDAR_MISSING = 'CURRENT_USER_CALENDAR_MISSING'; - -/***/ }), - -/***/ "./scripts/shared/Meeting/hooks/useCurrentUserFetch.ts": -/*!*************************************************************!*\ - !*** ./scripts/shared/Meeting/hooks/useCurrentUserFetch.ts ***! - \*************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useCurrentUserFetch) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _enums_loadState__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../enums/loadState */ "./scripts/shared/enums/loadState.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - -var user = null; -function useCurrentUserFetch() { - var proxy = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__.usePostAsyncBackgroundMessage)(); - - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded), - _useState2 = _slicedToArray(_useState, 2), - loadState = _useState2[0], - setLoadState = _useState2[1]; - - var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), - _useState4 = _slicedToArray(_useState3, 2), - error = _useState4[0], - setError = _useState4[1]; - - var createUser = function createUser() { - if (!user) { - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded); - } - }; - - var reload = function reload() { - user = null; - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded); - setError(null); - }; - - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { - if (loadState === _enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded && !user) { - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Loading); - proxy({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__.ProxyMessages.FetchOrCreateMeetingUser - }).then(function (data) { - user = data; - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Idle); - })["catch"](function (err) { - setError(err); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Failed); - }); - } - }, [loadState]); - return { - user: user, - loadUserState: loadState, - error: error, - createUser: createUser, - reload: reload - }; -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/hooks/useMeetings.ts": -/*!*****************************************************!*\ - !*** ./scripts/shared/Meeting/hooks/useMeetings.ts ***! - \*****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useMeetings), -/* harmony export */ "useSelectedMeeting": () => (/* binding */ useSelectedMeeting), -/* harmony export */ "useSelectedMeetingCalendar": () => (/* binding */ useSelectedMeetingCalendar) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ "./scripts/shared/Meeting/constants.ts"); -/* harmony import */ var _useMeetingsFetch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./useMeetingsFetch */ "./scripts/shared/Meeting/hooks/useMeetingsFetch.ts"); -/* harmony import */ var _useCurrentUserFetch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./useCurrentUserFetch */ "./scripts/shared/Meeting/hooks/useCurrentUserFetch.ts"); -/* harmony import */ var _enums_loadState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../enums/loadState */ "./scripts/shared/enums/loadState.ts"); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - - - - - - -function getDefaultMeetingName(meeting, currentUser, meetingUsers) { - var _meeting$meetingsUser = _slicedToArray(meeting.meetingsUserIds, 1), - meetingOwnerId = _meeting$meetingsUser[0]; - - var result = (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__.__)('Default', 'leadin'); - - if (currentUser && meetingOwnerId !== currentUser.id && meetingUsers[meetingOwnerId]) { - var user = meetingUsers[meetingOwnerId]; - result += " (".concat(user.userProfile.fullName, ")"); - } - - return result; -} - -function hasCalendarObject(user) { - return user && user.meetingsUserBlob && user.meetingsUserBlob.calendarSettings && user.meetingsUserBlob.calendarSettings.email; -} - -function useMeetings() { - var proxy = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_6__.usePostAsyncBackgroundMessage)(); - - var _useMeetingsFetch = (0,_useMeetingsFetch__WEBPACK_IMPORTED_MODULE_3__["default"])(), - meetings = _useMeetingsFetch.meetings, - meetingUsers = _useMeetingsFetch.meetingUsers, - meetingsError = _useMeetingsFetch.error, - loadMeetingsState = _useMeetingsFetch.loadMeetingsState, - reloadMeetings = _useMeetingsFetch.reload; - - var _useCurrentUserFetch = (0,_useCurrentUserFetch__WEBPACK_IMPORTED_MODULE_4__["default"])(), - currentUser = _useCurrentUserFetch.user, - userError = _useCurrentUserFetch.error, - loadUserState = _useCurrentUserFetch.loadUserState, - reloadUser = _useCurrentUserFetch.reload; - - var reload = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () { - reloadUser(); - reloadMeetings(); - }, [reloadUser, reloadMeetings]); - - var connectCalendar = function connectCalendar() { - return proxy({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_7__.ProxyMessages.ConnectMeetingsCalendar - }); - }; - - return { - mappedMeetings: meetings.map(function (meet) { - return { - label: meet.name || getDefaultMeetingName(meet, currentUser, meetingUsers), - value: meet.link - }; - }), - meetings: meetings, - meetingUsers: meetingUsers, - currentUser: currentUser, - error: meetingsError || userError, - loading: loadMeetingsState == _enums_loadState__WEBPACK_IMPORTED_MODULE_5__["default"].Loading || loadUserState === _enums_loadState__WEBPACK_IMPORTED_MODULE_5__["default"].Loading, - reload: reload, - connectCalendar: connectCalendar - }; -} -function useSelectedMeeting(url) { - var _useMeetings = useMeetings(), - meetings = _useMeetings.mappedMeetings; - - var option = meetings.find(function (_ref) { - var value = _ref.value; - return value === url; - }); - return option; -} -function useSelectedMeetingCalendar(url) { - var _useMeetings2 = useMeetings(), - meetings = _useMeetings2.meetings, - meetingUsers = _useMeetings2.meetingUsers, - currentUser = _useMeetings2.currentUser; - - var meeting = meetings.find(function (meet) { - return meet.link === url; - }); - var mappedMeetingUsersId = meetingUsers.reduce(function (p, c) { - return _objectSpread(_objectSpread({}, p), {}, _defineProperty({}, c.id, c)); - }, {}); - - if (!meeting) { - return null; - } else { - var meetingsUserIds = meeting.meetingsUserIds; - - if (currentUser && meetingsUserIds.includes(currentUser.id) && !hasCalendarObject(currentUser)) { - return _constants__WEBPACK_IMPORTED_MODULE_2__.CURRENT_USER_CALENDAR_MISSING; - } else if (meetingsUserIds.map(function (id) { - return mappedMeetingUsersId[id]; - }).some(function (user) { - return !hasCalendarObject(user); - })) { - return _constants__WEBPACK_IMPORTED_MODULE_2__.OTHER_USER_CALENDAR_MISSING; - } else { - return null; - } - } -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/hooks/useMeetingsFetch.ts": -/*!**********************************************************!*\ - !*** ./scripts/shared/Meeting/hooks/useMeetingsFetch.ts ***! - \**********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useMeetingsFetch) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../iframe/useBackgroundApp */ "./scripts/iframe/useBackgroundApp.ts"); -/* harmony import */ var _enums_loadState__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../enums/loadState */ "./scripts/shared/enums/loadState.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - -var meetings = []; -var meetingUsers = []; -function useMeetingsFetch() { - var proxy = (0,_iframe_useBackgroundApp__WEBPACK_IMPORTED_MODULE_1__.usePostAsyncBackgroundMessage)(); - - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded), - _useState2 = _slicedToArray(_useState, 2), - loadState = _useState2[0], - setLoadState = _useState2[1]; - - var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), - _useState4 = _slicedToArray(_useState3, 2), - error = _useState4[0], - setError = _useState4[1]; - - var reload = function reload() { - meetings = []; - setError(null); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded); - }; - - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { - if (loadState === _enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].NotLoaded && meetings.length === 0) { - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Loading); - proxy({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_3__.ProxyMessages.FetchMeetingsAndUsers - }).then(function (data) { - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Loaded); - meetings = data && data.meetingLinks; - meetingUsers = data && data.meetingUsers; - })["catch"](function (e) { - setError(e); - setLoadState(_enums_loadState__WEBPACK_IMPORTED_MODULE_2__["default"].Failed); - }); - } - }, [loadState]); - return { - meetings: meetings, - meetingUsers: meetingUsers, - loadMeetingsState: loadState, - error: error, - reload: reload - }; -} - -/***/ }), - -/***/ "./scripts/shared/Meeting/hooks/useMeetingsScript.ts": -/*!***********************************************************!*\ - !*** ./scripts/shared/Meeting/hooks/useMeetingsScript.ts ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useMeetingsScript) -/* harmony export */ }); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _lib_Raven__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../lib/Raven */ "./scripts/lib/Raven.ts"); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - - - - -var promise; - -function loadMeetingsScript() { - if (!promise) { - promise = new Promise(function (resolve, reject) { - return jquery__WEBPACK_IMPORTED_MODULE_0___default().getScript(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.meetingsScript).done(resolve).fail(reject); - }); - } - - return promise; -} - -function useMeetingsScript() { - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false), - _useState2 = _slicedToArray(_useState, 2), - ready = _useState2[0], - setReady = _useState2[1]; - - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { - loadMeetingsScript().then(function () { - return setReady(true); - })["catch"](function (error) { - return _lib_Raven__WEBPACK_IMPORTED_MODULE_3__["default"].captureException(error); - }); - }, []); - return ready; -} - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIAlert.tsx": -/*!*************************************************!*\ - !*** ./scripts/shared/UIComponents/UIAlert.tsx ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ UIAlert) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); - - -var AlertContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_1__.styled)('div')({ - name: "AlertContainer", - "class": "a1h8m4fo", - propsAsIs: false -}); -var Title = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_1__.styled)('p')({ - name: "Title", - "class": "tyndzxk", - propsAsIs: false -}); -var Message = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_1__.styled)('p')({ - name: "Message", - "class": "m1m9sbk4", - propsAsIs: false -}); -var MessageContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_1__.styled)('div')({ - name: "MessageContainer", - "class": "mg5o421", - propsAsIs: false -}); -function UIAlert(_ref) { - var titleText = _ref.titleText, - titleMessage = _ref.titleMessage, - children = _ref.children; - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(AlertContainer, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(MessageContainer, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Title, { - children: titleText - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Message, { - children: titleMessage - })] - }), children] - }); -} - -__webpack_require__(/*! ./UIAlert.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./UIAlert.tsx */ "./scripts/shared/UIComponents/UIAlert.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIAlert.tsx"); - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIButton.ts": -/*!*************************************************!*\ - !*** ./scripts/shared/UIComponents/UIButton.ts ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); -/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./colors */ "./scripts/shared/UIComponents/colors.ts"); - - - -var _exp2 = /*#__PURE__*/function _exp2() { - return function (props) { - return props.use === 'tertiary' ? _colors__WEBPACK_IMPORTED_MODULE_0__.HEFFALUMP : _colors__WEBPACK_IMPORTED_MODULE_0__.LORAX; - }; -}; - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_1__.styled)('button')({ - name: "UIButton0", - "class": "ug152ch", - propsAsIs: false, - vars: { - "ug152ch-0": [_exp2()] - } -})); - -__webpack_require__(/*! ./UIButton.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./UIButton.ts */ "./scripts/shared/UIComponents/UIButton.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIButton.ts"); - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIContainer.ts": -/*!****************************************************!*\ - !*** ./scripts/shared/UIComponents/UIContainer.ts ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); - - -var _exp = /*#__PURE__*/function _exp() { - return function (props) { - return props.textAlign ? props.textAlign : 'inherit'; - }; -}; - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_0__.styled)('div')({ - name: "UIContainer0", - "class": "ua13n1c", - propsAsIs: false, - vars: { - "ua13n1c-0": [_exp()] - } -})); - -__webpack_require__(/*! ./UIContainer.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./UIContainer.ts */ "./scripts/shared/UIComponents/UIContainer.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIContainer.ts"); - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIOverlay.ts": -/*!**************************************************!*\ - !*** ./scripts/shared/UIComponents/UIOverlay.ts ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_0__.styled)('div')({ - name: "UIOverlay0", - "class": "u1q7a48k", - propsAsIs: false -})); - -__webpack_require__(/*! ./UIOverlay.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./UIOverlay.ts */ "./scripts/shared/UIComponents/UIOverlay.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIOverlay.ts"); - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UISpacer.ts": -/*!*************************************************!*\ - !*** ./scripts/shared/UIComponents/UISpacer.ts ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_0__.styled)('div')({ - name: "UISpacer0", - "class": "u3qxofx", - propsAsIs: false -})); - -__webpack_require__(/*! ./UISpacer.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./UISpacer.ts */ "./scripts/shared/UIComponents/UISpacer.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpacer.ts"); - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UISpinner.tsx": -/*!***************************************************!*\ - !*** ./scripts/shared/UIComponents/UISpinner.tsx ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ UISpinner) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); -/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ "./scripts/shared/UIComponents/colors.ts"); - - - -var SpinnerOuter = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_2__.styled)('div')({ - name: "SpinnerOuter", - "class": "sxa9zrc", - propsAsIs: false -}); -var SpinnerInner = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_2__.styled)('div')({ - name: "SpinnerInner", - "class": "s14430wa", - propsAsIs: false -}); - -var _exp = /*#__PURE__*/function _exp() { - return function (props) { - return props.color; - }; -}; - -var Circle = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_2__.styled)('circle')({ - name: "Circle", - "class": "ct87ghk", - propsAsIs: true, - vars: { - "ct87ghk-0": [_exp()] - } -}); - -var _exp2 = /*#__PURE__*/function _exp2() { - return function (props) { - return props.color; - }; -}; - -var AnimatedCircle = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_2__.styled)('circle')({ - name: "AnimatedCircle", - "class": "avili0h", - propsAsIs: true, - vars: { - "avili0h-0": [_exp2()] - } -}); -function UISpinner(_ref) { - var _ref$size = _ref.size, - size = _ref$size === void 0 ? 20 : _ref$size; - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(SpinnerOuter, { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(SpinnerInner, { - children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("svg", { - height: size, - width: size, - viewBox: "0 0 50 50", - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Circle, { - color: _colors__WEBPACK_IMPORTED_MODULE_1__.CALYPSO_MEDIUM, - cx: "25", - cy: "25", - r: "22.5" - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(AnimatedCircle, { - color: _colors__WEBPACK_IMPORTED_MODULE_1__.CALYPSO, - cx: "25", - cy: "25", - r: "22.5" - })] - }) - }) - }); -} - -__webpack_require__(/*! ./UISpinner.linaria.css!=!../../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./UISpinner.tsx */ "./scripts/shared/UIComponents/UISpinner.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpinner.tsx"); - -/***/ }), - -/***/ "./scripts/shared/UIComponents/colors.ts": -/*!***********************************************!*\ - !*** ./scripts/shared/UIComponents/colors.ts ***! - \***********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CALYPSO": () => (/* binding */ CALYPSO), -/* harmony export */ "CALYPSO_LIGHT": () => (/* binding */ CALYPSO_LIGHT), -/* harmony export */ "CALYPSO_MEDIUM": () => (/* binding */ CALYPSO_MEDIUM), -/* harmony export */ "HEFFALUMP": () => (/* binding */ HEFFALUMP), -/* harmony export */ "LORAX": () => (/* binding */ LORAX), -/* harmony export */ "MARIGOLD_LIGHT": () => (/* binding */ MARIGOLD_LIGHT), -/* harmony export */ "MARIGOLD_MEDIUM": () => (/* binding */ MARIGOLD_MEDIUM), -/* harmony export */ "OBSIDIAN": () => (/* binding */ OBSIDIAN), -/* harmony export */ "OLAF": () => (/* binding */ OLAF) -/* harmony export */ }); -var CALYPSO = '#00a4bd'; -var CALYPSO_MEDIUM = '#7fd1de'; -var CALYPSO_LIGHT = '#e5f5f8'; -var LORAX = '#ff7a59'; -var OLAF = '#ffffff'; -var HEFFALUMP = '#425b76'; -var MARIGOLD_LIGHT = '#fef8f0'; -var MARIGOLD_MEDIUM = '#fae0b5'; -var OBSIDIAN = '#33475b'; - -/***/ }), - -/***/ "./scripts/shared/enums/connectionStatus.ts": -/*!**************************************************!*\ - !*** ./scripts/shared/enums/connectionStatus.ts ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -var ConnectionStatus = { - Connected: 'Connected', - NotConnected: 'NotConnected' -}; -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConnectionStatus); - -/***/ }), - -/***/ "./scripts/shared/enums/loadState.ts": -/*!*******************************************!*\ - !*** ./scripts/shared/enums/loadState.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -var LoadState = { - NotLoaded: 'NotLoaded', - Loading: 'Loading', - Loaded: 'Loaded', - Idle: 'Idle', - Failed: 'Failed' -}; -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LoadState); - -/***/ }), - -/***/ "./scripts/utils/appUtils.ts": -/*!***********************************!*\ - !*** ./scripts/utils/appUtils.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "initApp": () => (/* binding */ initApp), -/* harmony export */ "initAppOnReady": () => (/* binding */ initAppOnReady) -/* harmony export */ }); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _lib_Raven__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/Raven */ "./scripts/lib/Raven.ts"); - - -function initApp(initFn) { - (0,_lib_Raven__WEBPACK_IMPORTED_MODULE_1__.configureRaven)(); - _lib_Raven__WEBPACK_IMPORTED_MODULE_1__["default"].context(initFn); -} -function initAppOnReady(initFn) { - function main() { - jquery__WEBPACK_IMPORTED_MODULE_0___default()(initFn); - } - - initApp(main); -} - -/***/ }), - -/***/ "./scripts/utils/backgroundAppUtils.ts": -/*!*********************************************!*\ - !*** ./scripts/utils/backgroundAppUtils.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "getOrCreateBackgroundApp": () => (/* binding */ getOrCreateBackgroundApp), -/* harmony export */ "initBackgroundApp": () => (/* binding */ initBackgroundApp) -/* harmony export */ }); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _appUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./appUtils */ "./scripts/utils/appUtils.ts"); - - -function initBackgroundApp(initFn) { - function main() { - if (Array.isArray(initFn)) { - initFn.forEach(function (callback) { - return callback(); - }); - } else { - initFn(); - } - } - - (0,_appUtils__WEBPACK_IMPORTED_MODULE_1__.initApp)(main); -} -var getOrCreateBackgroundApp = function getOrCreateBackgroundApp(refreshToken) { - if (window.LeadinBackgroundApp) { - return window.LeadinBackgroundApp; - } - - var _window = window, - IntegratedAppEmbedder = _window.IntegratedAppEmbedder, - IntegratedAppOptions = _window.IntegratedAppOptions; - var options = new IntegratedAppOptions().setLocale(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.locale).setDeviceId(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.deviceId).setRefreshToken(refreshToken); - var embedder = new IntegratedAppEmbedder('integrated-plugin-proxy', _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.portalId, _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.hubspotBaseUrl, function () {}).setOptions(options); - embedder.attachTo(document.body, false); - embedder.postStartAppMessage(); // lets the app know all all data has been passed to it - - window.LeadinBackgroundApp = embedder; - return window.LeadinBackgroundApp; -}; - -/***/ }), - -/***/ "./scripts/utils/withMetaData.ts": -/*!***************************************!*\ - !*** ./scripts/utils/withMetaData.ts ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), -/* harmony export */ "isFullSiteEditor": () => (/* binding */ isFullSiteEditor) -/* harmony export */ }); -/* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data"); -/* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_0__); -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - // from answer here: https://github.com/WordPress/gutenberg/issues/44477#issuecomment-1263026599 - -var isFullSiteEditor = function isFullSiteEditor() { - return _wordpress_data__WEBPACK_IMPORTED_MODULE_0__.select && !!(0,_wordpress_data__WEBPACK_IMPORTED_MODULE_0__.select)('core/edit-site'); -}; -var applyWithSelect = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_0__.withSelect)(function (select, props) { - return { - metaValue: select('core/editor').getEditedPostAttribute('meta')[props.metaKey] - }; -}); -var applyWithDispatch = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_0__.withDispatch)(function (dispatch, props) { - return { - setMetaValue: function setMetaValue(value) { - dispatch('core/editor').editPost({ - meta: _defineProperty({}, props.metaKey, value) - }); - } - }; -}); - -function apply(el) { - return applyWithSelect(applyWithDispatch(el)); -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (apply); - -/***/ }), - -/***/ "./node_modules/is-what/dist/index.esm.js": -/*!************************************************!*\ - !*** ./node_modules/is-what/dist/index.esm.js ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "getType": () => (/* binding */ getType), -/* harmony export */ "isAnyObject": () => (/* binding */ isAnyObject), -/* harmony export */ "isArray": () => (/* binding */ isArray), -/* harmony export */ "isBlob": () => (/* binding */ isBlob), -/* harmony export */ "isBoolean": () => (/* binding */ isBoolean), -/* harmony export */ "isDate": () => (/* binding */ isDate), -/* harmony export */ "isEmptyArray": () => (/* binding */ isEmptyArray), -/* harmony export */ "isEmptyObject": () => (/* binding */ isEmptyObject), -/* harmony export */ "isEmptyString": () => (/* binding */ isEmptyString), -/* harmony export */ "isError": () => (/* binding */ isError), -/* harmony export */ "isFile": () => (/* binding */ isFile), -/* harmony export */ "isFullArray": () => (/* binding */ isFullArray), -/* harmony export */ "isFullObject": () => (/* binding */ isFullObject), -/* harmony export */ "isFullString": () => (/* binding */ isFullString), -/* harmony export */ "isFunction": () => (/* binding */ isFunction), -/* harmony export */ "isMap": () => (/* binding */ isMap), -/* harmony export */ "isNaNValue": () => (/* binding */ isNaNValue), -/* harmony export */ "isNull": () => (/* binding */ isNull), -/* harmony export */ "isNullOrUndefined": () => (/* binding */ isNullOrUndefined), -/* harmony export */ "isNumber": () => (/* binding */ isNumber), -/* harmony export */ "isObject": () => (/* binding */ isObject), -/* harmony export */ "isObjectLike": () => (/* binding */ isObjectLike), -/* harmony export */ "isOneOf": () => (/* binding */ isOneOf), -/* harmony export */ "isPlainObject": () => (/* binding */ isPlainObject), -/* harmony export */ "isPrimitive": () => (/* binding */ isPrimitive), -/* harmony export */ "isPromise": () => (/* binding */ isPromise), -/* harmony export */ "isRegExp": () => (/* binding */ isRegExp), -/* harmony export */ "isSet": () => (/* binding */ isSet), -/* harmony export */ "isString": () => (/* binding */ isString), -/* harmony export */ "isSymbol": () => (/* binding */ isSymbol), -/* harmony export */ "isType": () => (/* binding */ isType), -/* harmony export */ "isUndefined": () => (/* binding */ isUndefined), -/* harmony export */ "isWeakMap": () => (/* binding */ isWeakMap), -/* harmony export */ "isWeakSet": () => (/* binding */ isWeakSet) -/* harmony export */ }); -/** - * Returns the object type of the given payload - * - * @param {*} payload - * @returns {string} - */ -function getType(payload) { - return Object.prototype.toString.call(payload).slice(8, -1); -} -/** - * Returns whether the payload is undefined - * - * @param {*} payload - * @returns {payload is undefined} - */ -function isUndefined(payload) { - return getType(payload) === 'Undefined'; -} -/** - * Returns whether the payload is null - * - * @param {*} payload - * @returns {payload is null} - */ -function isNull(payload) { - return getType(payload) === 'Null'; -} -/** - * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes) - * - * @param {*} payload - * @returns {payload is PlainObject} - */ -function isPlainObject(payload) { - if (getType(payload) !== 'Object') - return false; - return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype; -} -/** - * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes) - * - * @param {*} payload - * @returns {payload is PlainObject} - */ -function isObject(payload) { - return isPlainObject(payload); -} -/** - * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes) - * - * @param {*} payload - * @returns {payload is { [K in any]: never }} - */ -function isEmptyObject(payload) { - return isPlainObject(payload) && Object.keys(payload).length === 0; -} -/** - * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes) - * - * @param {*} payload - * @returns {payload is PlainObject} - */ -function isFullObject(payload) { - return isPlainObject(payload) && Object.keys(payload).length > 0; -} -/** - * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes) - * - * @param {*} payload - * @returns {payload is PlainObject} - */ -function isAnyObject(payload) { - return getType(payload) === 'Object'; -} -/** - * Returns whether the payload is an object like a type passed in < > - * - * Usage: isObjectLike<{id: any}>(payload) // will make sure it's an object and has an `id` prop. - * - * @template T this must be passed in < > - * @param {*} payload - * @returns {payload is T} - */ -function isObjectLike(payload) { - return isAnyObject(payload); -} -/** - * Returns whether the payload is a function (regular or async) - * - * @param {*} payload - * @returns {payload is AnyFunction} - */ -function isFunction(payload) { - return typeof payload === 'function'; -} -/** - * Returns whether the payload is an array - * - * @param {any} payload - * @returns {payload is any[]} - */ -function isArray(payload) { - return getType(payload) === 'Array'; -} -/** - * Returns whether the payload is a an array with at least 1 item - * - * @param {*} payload - * @returns {payload is any[]} - */ -function isFullArray(payload) { - return isArray(payload) && payload.length > 0; -} -/** - * Returns whether the payload is a an empty array - * - * @param {*} payload - * @returns {payload is []} - */ -function isEmptyArray(payload) { - return isArray(payload) && payload.length === 0; -} -/** - * Returns whether the payload is a string - * - * @param {*} payload - * @returns {payload is string} - */ -function isString(payload) { - return getType(payload) === 'String'; -} -/** - * Returns whether the payload is a string, BUT returns false for '' - * - * @param {*} payload - * @returns {payload is string} - */ -function isFullString(payload) { - return isString(payload) && payload !== ''; -} -/** - * Returns whether the payload is '' - * - * @param {*} payload - * @returns {payload is string} - */ -function isEmptyString(payload) { - return payload === ''; -} -/** - * Returns whether the payload is a number (but not NaN) - * - * This will return `false` for `NaN`!! - * - * @param {*} payload - * @returns {payload is number} - */ -function isNumber(payload) { - return getType(payload) === 'Number' && !isNaN(payload); -} -/** - * Returns whether the payload is a boolean - * - * @param {*} payload - * @returns {payload is boolean} - */ -function isBoolean(payload) { - return getType(payload) === 'Boolean'; -} -/** - * Returns whether the payload is a regular expression (RegExp) - * - * @param {*} payload - * @returns {payload is RegExp} - */ -function isRegExp(payload) { - return getType(payload) === 'RegExp'; -} -/** - * Returns whether the payload is a Map - * - * @param {*} payload - * @returns {payload is Map} - */ -function isMap(payload) { - return getType(payload) === 'Map'; -} -/** - * Returns whether the payload is a WeakMap - * - * @param {*} payload - * @returns {payload is WeakMap} - */ -function isWeakMap(payload) { - return getType(payload) === 'WeakMap'; -} -/** - * Returns whether the payload is a Set - * - * @param {*} payload - * @returns {payload is Set} - */ -function isSet(payload) { - return getType(payload) === 'Set'; -} -/** - * Returns whether the payload is a WeakSet - * - * @param {*} payload - * @returns {payload is WeakSet} - */ -function isWeakSet(payload) { - return getType(payload) === 'WeakSet'; -} -/** - * Returns whether the payload is a Symbol - * - * @param {*} payload - * @returns {payload is symbol} - */ -function isSymbol(payload) { - return getType(payload) === 'Symbol'; -} -/** - * Returns whether the payload is a Date, and that the date is valid - * - * @param {*} payload - * @returns {payload is Date} - */ -function isDate(payload) { - return getType(payload) === 'Date' && !isNaN(payload); -} -/** - * Returns whether the payload is a Blob - * - * @param {*} payload - * @returns {payload is Blob} - */ -function isBlob(payload) { - return getType(payload) === 'Blob'; -} -/** - * Returns whether the payload is a File - * - * @param {*} payload - * @returns {payload is File} - */ -function isFile(payload) { - return getType(payload) === 'File'; -} -/** - * Returns whether the payload is a Promise - * - * @param {*} payload - * @returns {payload is Promise} - */ -function isPromise(payload) { - return getType(payload) === 'Promise'; -} -/** - * Returns whether the payload is an Error - * - * @param {*} payload - * @returns {payload is Error} - */ -function isError(payload) { - return getType(payload) === 'Error'; -} -/** - * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`) - * - * @param {*} payload - * @returns {payload is typeof NaN} - */ -function isNaNValue(payload) { - return getType(payload) === 'Number' && isNaN(payload); -} -/** - * Returns whether the payload is a primitive type (eg. Boolean | Null | Undefined | Number | String | Symbol) - * - * @param {*} payload - * @returns {(payload is boolean | null | undefined | number | string | symbol)} - */ -function isPrimitive(payload) { - return (isBoolean(payload) || - isNull(payload) || - isUndefined(payload) || - isNumber(payload) || - isString(payload) || - isSymbol(payload)); -} -/** - * Returns true whether the payload is null or undefined - * - * @param {*} payload - * @returns {(payload is null | undefined)} - */ -var isNullOrUndefined = isOneOf(isNull, isUndefined); -function isOneOf(a, b, c, d, e) { - return function (value) { - return a(value) || b(value) || (!!c && c(value)) || (!!d && d(value)) || (!!e && e(value)); - }; -} -/** - * Does a generic check to check that the given payload is of a given type. - * In cases like Number, it will return true for NaN as NaN is a Number (thanks javascript!); - * It will, however, differentiate between object and null - * - * @template T - * @param {*} payload - * @param {T} type - * @throws {TypeError} Will throw type error if type is an invalid type - * @returns {payload is T} - */ -function isType(payload, type) { - if (!(type instanceof Function)) { - throw new TypeError('Type must be a function'); - } - if (!Object.prototype.hasOwnProperty.call(type, 'prototype')) { - throw new TypeError('Type is not a class'); - } - // Classes usually have names (as functions usually have names) - var name = type.name; - return getType(payload) === name || Boolean(payload && payload.constructor === type); -} - - - - -/***/ }), - -/***/ "./node_modules/lodash/_Symbol.js": -/*!****************************************!*\ - !*** ./node_modules/lodash/_Symbol.js ***! - \****************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); - -/** Built-in value references. */ -var Symbol = root.Symbol; - -module.exports = Symbol; - - -/***/ }), - -/***/ "./node_modules/lodash/_baseGetTag.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_baseGetTag.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), - getRawTag = __webpack_require__(/*! ./_getRawTag */ "./node_modules/lodash/_getRawTag.js"), - objectToString = __webpack_require__(/*! ./_objectToString */ "./node_modules/lodash/_objectToString.js"); - -/** `Object#toString` result references. */ -var nullTag = '[object Null]', - undefinedTag = '[object Undefined]'; - -/** Built-in value references. */ -var symToStringTag = Symbol ? Symbol.toStringTag : undefined; - -/** - * The base implementation of `getTag` without fallbacks for buggy environments. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. - */ -function baseGetTag(value) { - if (value == null) { - return value === undefined ? undefinedTag : nullTag; - } - return (symToStringTag && symToStringTag in Object(value)) - ? getRawTag(value) - : objectToString(value); -} - -module.exports = baseGetTag; - - -/***/ }), - -/***/ "./node_modules/lodash/_baseTrim.js": -/*!******************************************!*\ - !*** ./node_modules/lodash/_baseTrim.js ***! - \******************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var trimmedEndIndex = __webpack_require__(/*! ./_trimmedEndIndex */ "./node_modules/lodash/_trimmedEndIndex.js"); - -/** Used to match leading whitespace. */ -var reTrimStart = /^\s+/; - -/** - * The base implementation of `_.trim`. - * - * @private - * @param {string} string The string to trim. - * @returns {string} Returns the trimmed string. - */ -function baseTrim(string) { - return string - ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') - : string; -} - -module.exports = baseTrim; - - -/***/ }), - -/***/ "./node_modules/lodash/_freeGlobal.js": -/*!********************************************!*\ - !*** ./node_modules/lodash/_freeGlobal.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/** Detect free variable `global` from Node.js. */ -var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g; - -module.exports = freeGlobal; - - -/***/ }), - -/***/ "./node_modules/lodash/_getRawTag.js": -/*!*******************************************!*\ - !*** ./node_modules/lodash/_getRawTag.js ***! - \*******************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"); - -/** Used for built-in method references. */ -var objectProto = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var nativeObjectToString = objectProto.toString; - -/** Built-in value references. */ -var symToStringTag = Symbol ? Symbol.toStringTag : undefined; - -/** - * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the raw `toStringTag`. - */ -function getRawTag(value) { - var isOwn = hasOwnProperty.call(value, symToStringTag), - tag = value[symToStringTag]; - - try { - value[symToStringTag] = undefined; - var unmasked = true; - } catch (e) {} - - var result = nativeObjectToString.call(value); - if (unmasked) { - if (isOwn) { - value[symToStringTag] = tag; - } else { - delete value[symToStringTag]; - } - } - return result; -} - -module.exports = getRawTag; - - -/***/ }), - -/***/ "./node_modules/lodash/_objectToString.js": -/*!************************************************!*\ - !*** ./node_modules/lodash/_objectToString.js ***! - \************************************************/ -/***/ ((module) => { - -/** Used for built-in method references. */ -var objectProto = Object.prototype; - -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var nativeObjectToString = objectProto.toString; - -/** - * Converts `value` to a string using `Object.prototype.toString`. - * - * @private - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - */ -function objectToString(value) { - return nativeObjectToString.call(value); -} - -module.exports = objectToString; - - -/***/ }), - -/***/ "./node_modules/lodash/_root.js": -/*!**************************************!*\ - !*** ./node_modules/lodash/_root.js ***! - \**************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js"); - -/** Detect free variable `self`. */ -var freeSelf = typeof self == 'object' && self && self.Object === Object && self; - -/** Used as a reference to the global object. */ -var root = freeGlobal || freeSelf || Function('return this')(); - -module.exports = root; - - -/***/ }), - -/***/ "./node_modules/lodash/_trimmedEndIndex.js": -/*!*************************************************!*\ - !*** ./node_modules/lodash/_trimmedEndIndex.js ***! - \*************************************************/ -/***/ ((module) => { - -/** Used to match a single whitespace character. */ -var reWhitespace = /\s/; - -/** - * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace - * character of `string`. - * - * @private - * @param {string} string The string to inspect. - * @returns {number} Returns the index of the last non-whitespace character. - */ -function trimmedEndIndex(string) { - var index = string.length; - - while (index-- && reWhitespace.test(string.charAt(index))) {} - return index; -} - -module.exports = trimmedEndIndex; - - -/***/ }), - -/***/ "./node_modules/lodash/debounce.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/debounce.js ***! - \*****************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), - now = __webpack_require__(/*! ./now */ "./node_modules/lodash/now.js"), - toNumber = __webpack_require__(/*! ./toNumber */ "./node_modules/lodash/toNumber.js"); - -/** Error message constants. */ -var FUNC_ERROR_TEXT = 'Expected a function'; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max, - nativeMin = Math.min; - -/** - * Creates a debounced function that delays invoking `func` until after `wait` - * milliseconds have elapsed since the last time the debounced function was - * invoked. The debounced function comes with a `cancel` method to cancel - * delayed `func` invocations and a `flush` method to immediately invoke them. - * Provide `options` to indicate whether `func` should be invoked on the - * leading and/or trailing edge of the `wait` timeout. The `func` is invoked - * with the last arguments provided to the debounced function. Subsequent - * calls to the debounced function return the result of the last `func` - * invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is - * invoked on the trailing edge of the timeout only if the debounced function - * is invoked more than once during the `wait` timeout. - * - * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred - * until to the next tick, similar to `setTimeout` with a timeout of `0`. - * - * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) - * for details over the differences between `_.debounce` and `_.throttle`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to debounce. - * @param {number} [wait=0] The number of milliseconds to delay. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.leading=false] - * Specify invoking on the leading edge of the timeout. - * @param {number} [options.maxWait] - * The maximum time `func` is allowed to be delayed before it's invoked. - * @param {boolean} [options.trailing=true] - * Specify invoking on the trailing edge of the timeout. - * @returns {Function} Returns the new debounced function. - * @example - * - * // Avoid costly calculations while the window size is in flux. - * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); - * - * // Invoke `sendMail` when clicked, debouncing subsequent calls. - * jQuery(element).on('click', _.debounce(sendMail, 300, { - * 'leading': true, - * 'trailing': false - * })); - * - * // Ensure `batchLog` is invoked once after 1 second of debounced calls. - * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); - * var source = new EventSource('/stream'); - * jQuery(source).on('message', debounced); - * - * // Cancel the trailing debounced invocation. - * jQuery(window).on('popstate', debounced.cancel); - */ -function debounce(func, wait, options) { - var lastArgs, - lastThis, - maxWait, - result, - timerId, - lastCallTime, - lastInvokeTime = 0, - leading = false, - maxing = false, - trailing = true; - - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - wait = toNumber(wait) || 0; - if (isObject(options)) { - leading = !!options.leading; - maxing = 'maxWait' in options; - maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; - trailing = 'trailing' in options ? !!options.trailing : trailing; - } - - function invokeFunc(time) { - var args = lastArgs, - thisArg = lastThis; - - lastArgs = lastThis = undefined; - lastInvokeTime = time; - result = func.apply(thisArg, args); - return result; - } - - function leadingEdge(time) { - // Reset any `maxWait` timer. - lastInvokeTime = time; - // Start the timer for the trailing edge. - timerId = setTimeout(timerExpired, wait); - // Invoke the leading edge. - return leading ? invokeFunc(time) : result; - } - - function remainingWait(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime, - timeWaiting = wait - timeSinceLastCall; - - return maxing - ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) - : timeWaiting; - } - - function shouldInvoke(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime; - - // Either this is the first call, activity has stopped and we're at the - // trailing edge, the system time has gone backwards and we're treating - // it as the trailing edge, or we've hit the `maxWait` limit. - return (lastCallTime === undefined || (timeSinceLastCall >= wait) || - (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); - } - - function timerExpired() { - var time = now(); - if (shouldInvoke(time)) { - return trailingEdge(time); - } - // Restart the timer. - timerId = setTimeout(timerExpired, remainingWait(time)); - } - - function trailingEdge(time) { - timerId = undefined; - - // Only invoke if we have `lastArgs` which means `func` has been - // debounced at least once. - if (trailing && lastArgs) { - return invokeFunc(time); - } - lastArgs = lastThis = undefined; - return result; - } - - function cancel() { - if (timerId !== undefined) { - clearTimeout(timerId); - } - lastInvokeTime = 0; - lastArgs = lastCallTime = lastThis = timerId = undefined; - } - - function flush() { - return timerId === undefined ? result : trailingEdge(now()); - } - - function debounced() { - var time = now(), - isInvoking = shouldInvoke(time); - - lastArgs = arguments; - lastThis = this; - lastCallTime = time; - - if (isInvoking) { - if (timerId === undefined) { - return leadingEdge(lastCallTime); - } - if (maxing) { - // Handle invocations in a tight loop. - clearTimeout(timerId); - timerId = setTimeout(timerExpired, wait); - return invokeFunc(lastCallTime); - } - } - if (timerId === undefined) { - timerId = setTimeout(timerExpired, wait); - } - return result; - } - debounced.cancel = cancel; - debounced.flush = flush; - return debounced; -} - -module.exports = debounce; - - -/***/ }), - -/***/ "./node_modules/lodash/isObject.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/isObject.js ***! - \*****************************************/ -/***/ ((module) => { - -/** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false - */ -function isObject(value) { - var type = typeof value; - return value != null && (type == 'object' || type == 'function'); -} - -module.exports = isObject; - - -/***/ }), - -/***/ "./node_modules/lodash/isObjectLike.js": -/*!*********************************************!*\ - !*** ./node_modules/lodash/isObjectLike.js ***! - \*********************************************/ -/***/ ((module) => { - -/** - * Checks if `value` is object-like. A value is object-like if it's not `null` - * and has a `typeof` result of "object". - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - * @example - * - * _.isObjectLike({}); - * // => true - * - * _.isObjectLike([1, 2, 3]); - * // => true - * - * _.isObjectLike(_.noop); - * // => false - * - * _.isObjectLike(null); - * // => false - */ -function isObjectLike(value) { - return value != null && typeof value == 'object'; -} - -module.exports = isObjectLike; - - -/***/ }), - -/***/ "./node_modules/lodash/isSymbol.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/isSymbol.js ***! - \*****************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), - isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); - -/** `Object#toString` result references. */ -var symbolTag = '[object Symbol]'; - -/** - * Checks if `value` is classified as a `Symbol` primitive or object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. - * @example - * - * _.isSymbol(Symbol.iterator); - * // => true - * - * _.isSymbol('abc'); - * // => false - */ -function isSymbol(value) { - return typeof value == 'symbol' || - (isObjectLike(value) && baseGetTag(value) == symbolTag); -} - -module.exports = isSymbol; - - -/***/ }), - -/***/ "./node_modules/lodash/now.js": -/*!************************************!*\ - !*** ./node_modules/lodash/now.js ***! - \************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); - -/** - * Gets the timestamp of the number of milliseconds that have elapsed since - * the Unix epoch (1 January 1970 00:00:00 UTC). - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Date - * @returns {number} Returns the timestamp. - * @example - * - * _.defer(function(stamp) { - * console.log(_.now() - stamp); - * }, _.now()); - * // => Logs the number of milliseconds it took for the deferred invocation. - */ -var now = function() { - return root.Date.now(); -}; - -module.exports = now; - - -/***/ }), - -/***/ "./node_modules/lodash/toNumber.js": -/*!*****************************************!*\ - !*** ./node_modules/lodash/toNumber.js ***! - \*****************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var baseTrim = __webpack_require__(/*! ./_baseTrim */ "./node_modules/lodash/_baseTrim.js"), - isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), - isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); - -/** Used as references for various `Number` constants. */ -var NAN = 0 / 0; - -/** Used to detect bad signed hexadecimal string values. */ -var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; - -/** Used to detect binary string values. */ -var reIsBinary = /^0b[01]+$/i; - -/** Used to detect octal string values. */ -var reIsOctal = /^0o[0-7]+$/i; - -/** Built-in method references without a dependency on `root`. */ -var freeParseInt = parseInt; - -/** - * Converts `value` to a number. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to process. - * @returns {number} Returns the number. - * @example - * - * _.toNumber(3.2); - * // => 3.2 - * - * _.toNumber(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toNumber(Infinity); - * // => Infinity - * - * _.toNumber('3.2'); - * // => 3.2 - */ -function toNumber(value) { - if (typeof value == 'number') { - return value; - } - if (isSymbol(value)) { - return NAN; - } - if (isObject(value)) { - var other = typeof value.valueOf == 'function' ? value.valueOf() : value; - value = isObject(other) ? (other + '') : other; - } - if (typeof value != 'string') { - return value === 0 ? value : +value; - } - value = baseTrim(value); - var isBinary = reIsBinary.test(value); - return (isBinary || reIsOctal.test(value)) - ? freeParseInt(value.slice(2), isBinary ? 2 : 8) - : (reIsBadHex.test(value) ? NAN : +value); -} - -module.exports = toNumber; - - -/***/ }), - -/***/ "./node_modules/memoize-one/dist/memoize-one.esm.js": -/*!**********************************************************!*\ - !*** ./node_modules/memoize-one/dist/memoize-one.esm.js ***! - \**********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -var safeIsNaN = Number.isNaN || - function ponyfill(value) { - return typeof value === 'number' && value !== value; - }; -function isEqual(first, second) { - if (first === second) { - return true; - } - if (safeIsNaN(first) && safeIsNaN(second)) { - return true; - } - return false; -} -function areInputsEqual(newInputs, lastInputs) { - if (newInputs.length !== lastInputs.length) { - return false; - } - for (var i = 0; i < newInputs.length; i++) { - if (!isEqual(newInputs[i], lastInputs[i])) { - return false; - } - } - return true; -} - -function memoizeOne(resultFn, isEqual) { - if (isEqual === void 0) { isEqual = areInputsEqual; } - var lastThis; - var lastArgs = []; - var lastResult; - var calledOnce = false; - function memoized() { - var newArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - newArgs[_i] = arguments[_i]; - } - if (calledOnce && lastThis === this && isEqual(newArgs, lastArgs)) { - return lastResult; - } - lastResult = resultFn.apply(this, newArgs); - calledOnce = true; - lastThis = this; - lastArgs = newArgs; - return lastResult; - } - return memoized; -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (memoizeOne); - - -/***/ }), - -/***/ "./node_modules/merge-anything/dist/index.esm.js": -/*!*******************************************************!*\ - !*** ./node_modules/merge-anything/dist/index.esm.js ***! - \*******************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "concatArrays": () => (/* binding */ concatArrays), -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), -/* harmony export */ "merge": () => (/* binding */ merge) -/* harmony export */ }); -/* harmony import */ var is_what__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! is-what */ "./node_modules/is-what/dist/index.esm.js"); - - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at http://www.apache.org/licenses/LICENSE-2.0 - -THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED -WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -MERCHANTABLITY OR NON-INFRINGEMENT. - -See the Apache Version 2.0 License for specific language governing permissions -and limitations under the License. -***************************************************************************** */ - -function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; -} - -function assignProp(carry, key, newVal, originalObject) { - var propType = originalObject.propertyIsEnumerable(key) - ? 'enumerable' - : 'nonenumerable'; - if (propType === 'enumerable') - carry[key] = newVal; - if (propType === 'nonenumerable') { - Object.defineProperty(carry, key, { - value: newVal, - enumerable: false, - writable: true, - configurable: true - }); - } -} -function mergeRecursively(origin, newComer, extensions) { - // work directly on newComer if its not an object - if (!(0,is_what__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(newComer)) { - // extend merge rules - if (extensions && (0,is_what__WEBPACK_IMPORTED_MODULE_0__.isArray)(extensions)) { - extensions.forEach(function (extend) { - newComer = extend(origin, newComer); - }); - } - return newComer; - } - // define newObject to merge all values upon - var newObject = {}; - if ((0,is_what__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(origin)) { - var props_1 = Object.getOwnPropertyNames(origin); - var symbols_1 = Object.getOwnPropertySymbols(origin); - newObject = __spreadArrays(props_1, symbols_1).reduce(function (carry, key) { - // @ts-ignore - var targetVal = origin[key]; - if ((!(0,is_what__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key) && !Object.getOwnPropertyNames(newComer).includes(key)) || - ((0,is_what__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key) && !Object.getOwnPropertySymbols(newComer).includes(key))) { - assignProp(carry, key, targetVal, origin); - } - return carry; - }, {}); - } - var props = Object.getOwnPropertyNames(newComer); - var symbols = Object.getOwnPropertySymbols(newComer); - var result = __spreadArrays(props, symbols).reduce(function (carry, key) { - // re-define the origin and newComer as targetVal and newVal - var newVal = newComer[key]; - var targetVal = ((0,is_what__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(origin)) - // @ts-ignore - ? origin[key] - : undefined; - // extend merge rules - if (extensions && (0,is_what__WEBPACK_IMPORTED_MODULE_0__.isArray)(extensions)) { - extensions.forEach(function (extend) { - newVal = extend(targetVal, newVal); - }); - } - // When newVal is an object do the merge recursively - if (targetVal !== undefined && (0,is_what__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(newVal)) { - newVal = mergeRecursively(targetVal, newVal, extensions); - } - assignProp(carry, key, newVal, newComer); - return carry; - }, newObject); - return result; -} -/** - * Merge anything recursively. - * Objects get merged, special objects (classes etc.) are re-assigned "as is". - * Basic types overwrite objects or other basic types. - * - * @param {(IConfig | any)} origin - * @param {...any[]} newComers - * @returns the result - */ -function merge(origin) { - var newComers = []; - for (var _i = 1; _i < arguments.length; _i++) { - newComers[_i - 1] = arguments[_i]; - } - var extensions = null; - var base = origin; - if ((0,is_what__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(origin) && origin.extensions && Object.keys(origin).length === 1) { - base = {}; - extensions = origin.extensions; - } - return newComers.reduce(function (result, newComer) { - return mergeRecursively(result, newComer, extensions); - }, base); -} - -function concatArrays(originVal, newVal) { - if ((0,is_what__WEBPACK_IMPORTED_MODULE_0__.isArray)(originVal) && (0,is_what__WEBPACK_IMPORTED_MODULE_0__.isArray)(newVal)) { - // concat logic - return originVal.concat(newVal); - } - return newVal; // always return newVal as fallback!! -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (merge); - - - -/***/ }), - -/***/ "./scripts/gutenberg/UIComponents/UIImage.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/gutenberg/UIComponents/UIImage.ts": -/*!****************************************************************************************************************************************************************************************!*\ - !*** ./scripts/gutenberg/UIComponents/UIImage.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/gutenberg/UIComponents/UIImage.ts ***! - \****************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/Common/AsyncSelect.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/AsyncSelect.tsx": -/*!*******************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/Common/AsyncSelect.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/AsyncSelect.tsx ***! - \*******************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/Common/HubspotWrapper.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/HubspotWrapper.ts": -/*!************************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/Common/HubspotWrapper.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/Common/HubspotWrapper.ts ***! - \************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIAlert.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIAlert.tsx": -/*!***********************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/UIComponents/UIAlert.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIAlert.tsx ***! - \***********************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIButton.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIButton.ts": -/*!************************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/UIComponents/UIButton.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIButton.ts ***! - \************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIContainer.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIContainer.ts": -/*!******************************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/UIComponents/UIContainer.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIContainer.ts ***! - \******************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UIOverlay.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIOverlay.ts": -/*!**************************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/UIComponents/UIOverlay.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UIOverlay.ts ***! - \**************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UISpacer.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpacer.ts": -/*!************************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/UIComponents/UISpacer.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpacer.ts ***! - \************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./scripts/shared/UIComponents/UISpinner.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpinner.tsx": -/*!***************************************************************************************************************************************************************************************!*\ - !*** ./scripts/shared/UIComponents/UISpinner.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/shared/UIComponents/UISpinner.tsx ***! - \***************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./node_modules/object-assign/index.js": -/*!*********************************************!*\ - !*** ./node_modules/object-assign/index.js ***! - \*********************************************/ -/***/ ((module) => { - -"use strict"; -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - - -/* eslint-disable no-unused-vars */ -var getOwnPropertySymbols = Object.getOwnPropertySymbols; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var propIsEnumerable = Object.prototype.propertyIsEnumerable; - -function toObject(val) { - if (val === null || val === undefined) { - throw new TypeError('Object.assign cannot be called with null or undefined'); - } - - return Object(val); -} - -function shouldUseNative() { - try { - if (!Object.assign) { - return false; - } - - // Detect buggy property enumeration order in older V8 versions. - - // https://bugs.chromium.org/p/v8/issues/detail?id=4118 - var test1 = new String('abc'); // eslint-disable-line no-new-wrappers - test1[5] = 'de'; - if (Object.getOwnPropertyNames(test1)[0] === '5') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test2 = {}; - for (var i = 0; i < 10; i++) { - test2['_' + String.fromCharCode(i)] = i; - } - var order2 = Object.getOwnPropertyNames(test2).map(function (n) { - return test2[n]; - }); - if (order2.join('') !== '0123456789') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test3 = {}; - 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { - test3[letter] = letter; - }); - if (Object.keys(Object.assign({}, test3)).join('') !== - 'abcdefghijklmnopqrst') { - return false; - } - - return true; - } catch (err) { - // We don't expect any of the above to throw, but better to be safe. - return false; - } -} - -module.exports = shouldUseNative() ? Object.assign : function (target, source) { - var from; - var to = toObject(target); - var symbols; - - for (var s = 1; s < arguments.length; s++) { - from = Object(arguments[s]); - - for (var key in from) { - if (hasOwnProperty.call(from, key)) { - to[key] = from[key]; - } - } - - if (getOwnPropertySymbols) { - symbols = getOwnPropertySymbols(from); - for (var i = 0; i < symbols.length; i++) { - if (propIsEnumerable.call(from, symbols[i])) { - to[symbols[i]] = from[symbols[i]]; - } - } - } - } - - return to; -}; - - -/***/ }), - -/***/ "./node_modules/prop-types/checkPropTypes.js": -/*!***************************************************!*\ - !*** ./node_modules/prop-types/checkPropTypes.js ***! - \***************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - -var printWarning = function() {}; - -if (true) { - var ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ "./node_modules/prop-types/lib/ReactPropTypesSecret.js"); - var loggedTypeFailures = {}; - var has = __webpack_require__(/*! ./lib/has */ "./node_modules/prop-types/lib/has.js"); - - printWarning = function(text) { - var message = 'Warning: ' + text; - if (typeof console !== 'undefined') { - console.error(message); - } - try { - // --- Welcome to debugging React --- - // This error was thrown as a convenience so that you can use this stack - // to find the callsite that caused this warning to fire. - throw new Error(message); - } catch (x) { /**/ } - }; -} - -/** - * Assert that the values match with the type specs. - * Error messages are memorized and will only be shown once. - * - * @param {object} typeSpecs Map of name to a ReactPropType - * @param {object} values Runtime values that need to be type-checked - * @param {string} location e.g. "prop", "context", "child context" - * @param {string} componentName Name of the component for error messages. - * @param {?Function} getStack Returns the component stack. - * @private - */ -function checkPropTypes(typeSpecs, values, location, componentName, getStack) { - if (true) { - for (var typeSpecName in typeSpecs) { - if (has(typeSpecs, typeSpecName)) { - var error; - // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - if (typeof typeSpecs[typeSpecName] !== 'function') { - var err = Error( - (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + - 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + - 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.' - ); - err.name = 'Invariant Violation'; - throw err; - } - error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret); - } catch (ex) { - error = ex; - } - if (error && !(error instanceof Error)) { - printWarning( - (componentName || 'React class') + ': type specification of ' + - location + ' `' + typeSpecName + '` is invalid; the type checker ' + - 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + - 'You may have forgotten to pass an argument to the type checker ' + - 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + - 'shape all require an argument).' - ); - } - if (error instanceof Error && !(error.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error.message] = true; - - var stack = getStack ? getStack() : ''; - - printWarning( - 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '') - ); - } - } - } - } -} - -/** - * Resets warning cache when testing. - * - * @private - */ -checkPropTypes.resetWarningCache = function() { - if (true) { - loggedTypeFailures = {}; - } -} - -module.exports = checkPropTypes; - - -/***/ }), - -/***/ "./node_modules/prop-types/factoryWithTypeCheckers.js": -/*!************************************************************!*\ - !*** ./node_modules/prop-types/factoryWithTypeCheckers.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - -var ReactIs = __webpack_require__(/*! react-is */ "./node_modules/react-is/index.js"); -var assign = __webpack_require__(/*! object-assign */ "./node_modules/object-assign/index.js"); - -var ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ "./node_modules/prop-types/lib/ReactPropTypesSecret.js"); -var has = __webpack_require__(/*! ./lib/has */ "./node_modules/prop-types/lib/has.js"); -var checkPropTypes = __webpack_require__(/*! ./checkPropTypes */ "./node_modules/prop-types/checkPropTypes.js"); - -var printWarning = function() {}; - -if (true) { - printWarning = function(text) { - var message = 'Warning: ' + text; - if (typeof console !== 'undefined') { - console.error(message); - } - try { - // --- Welcome to debugging React --- - // This error was thrown as a convenience so that you can use this stack - // to find the callsite that caused this warning to fire. - throw new Error(message); - } catch (x) {} - }; -} - -function emptyFunctionThatReturnsNull() { - return null; -} - -module.exports = function(isValidElement, throwOnDirectAccess) { - /* global Symbol */ - var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; - var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. - - /** - * Returns the iterator method function contained on the iterable object. - * - * Be sure to invoke the function with the iterable as context: - * - * var iteratorFn = getIteratorFn(myIterable); - * if (iteratorFn) { - * var iterator = iteratorFn.call(myIterable); - * ... - * } - * - * @param {?object} maybeIterable - * @return {?function} - */ - function getIteratorFn(maybeIterable) { - var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); - if (typeof iteratorFn === 'function') { - return iteratorFn; - } - } - - /** - * Collection of methods that allow declaration and validation of props that are - * supplied to React components. Example usage: - * - * var Props = require('ReactPropTypes'); - * var MyArticle = React.createClass({ - * propTypes: { - * // An optional string prop named "description". - * description: Props.string, - * - * // A required enum prop named "category". - * category: Props.oneOf(['News','Photos']).isRequired, - * - * // A prop named "dialog" that requires an instance of Dialog. - * dialog: Props.instanceOf(Dialog).isRequired - * }, - * render: function() { ... } - * }); - * - * A more formal specification of how these methods are used: - * - * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...) - * decl := ReactPropTypes.{type}(.isRequired)? - * - * Each and every declaration produces a function with the same signature. This - * allows the creation of custom validation functions. For example: - * - * var MyLink = React.createClass({ - * propTypes: { - * // An optional string or URI prop named "href". - * href: function(props, propName, componentName) { - * var propValue = props[propName]; - * if (propValue != null && typeof propValue !== 'string' && - * !(propValue instanceof URI)) { - * return new Error( - * 'Expected a string or an URI for ' + propName + ' in ' + - * componentName - * ); - * } - * } - * }, - * render: function() {...} - * }); - * - * @internal - */ - - var ANONYMOUS = '<>'; - - // Important! - // Keep this list in sync with production version in `./factoryWithThrowingShims.js`. - var ReactPropTypes = { - array: createPrimitiveTypeChecker('array'), - bigint: createPrimitiveTypeChecker('bigint'), - bool: createPrimitiveTypeChecker('boolean'), - func: createPrimitiveTypeChecker('function'), - number: createPrimitiveTypeChecker('number'), - object: createPrimitiveTypeChecker('object'), - string: createPrimitiveTypeChecker('string'), - symbol: createPrimitiveTypeChecker('symbol'), - - any: createAnyTypeChecker(), - arrayOf: createArrayOfTypeChecker, - element: createElementTypeChecker(), - elementType: createElementTypeTypeChecker(), - instanceOf: createInstanceTypeChecker, - node: createNodeChecker(), - objectOf: createObjectOfTypeChecker, - oneOf: createEnumTypeChecker, - oneOfType: createUnionTypeChecker, - shape: createShapeTypeChecker, - exact: createStrictShapeTypeChecker, - }; - - /** - * inlined Object.is polyfill to avoid requiring consumers ship their own - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is - */ - /*eslint-disable no-self-compare*/ - function is(x, y) { - // SameValue algorithm - if (x === y) { - // Steps 1-5, 7-10 - // Steps 6.b-6.e: +0 != -0 - return x !== 0 || 1 / x === 1 / y; - } else { - // Step 6.a: NaN == NaN - return x !== x && y !== y; - } - } - /*eslint-enable no-self-compare*/ - - /** - * We use an Error-like object for backward compatibility as people may call - * PropTypes directly and inspect their output. However, we don't use real - * Errors anymore. We don't inspect their stack anyway, and creating them - * is prohibitively expensive if they are created too often, such as what - * happens in oneOfType() for any type before the one that matched. - */ - function PropTypeError(message, data) { - this.message = message; - this.data = data && typeof data === 'object' ? data: {}; - this.stack = ''; - } - // Make `instanceof Error` still work for returned errors. - PropTypeError.prototype = Error.prototype; - - function createChainableTypeChecker(validate) { - if (true) { - var manualPropTypeCallCache = {}; - var manualPropTypeWarningCount = 0; - } - function checkType(isRequired, props, propName, componentName, location, propFullName, secret) { - componentName = componentName || ANONYMOUS; - propFullName = propFullName || propName; - - if (secret !== ReactPropTypesSecret) { - if (throwOnDirectAccess) { - // New behavior only for users of `prop-types` package - var err = new Error( - 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + - 'Use `PropTypes.checkPropTypes()` to call them. ' + - 'Read more at http://fb.me/use-check-prop-types' - ); - err.name = 'Invariant Violation'; - throw err; - } else if ( true && typeof console !== 'undefined') { - // Old behavior for people using React.PropTypes - var cacheKey = componentName + ':' + propName; - if ( - !manualPropTypeCallCache[cacheKey] && - // Avoid spamming the console because they are often not actionable except for lib authors - manualPropTypeWarningCount < 3 - ) { - printWarning( - 'You are manually calling a React.PropTypes validation ' + - 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' + - 'and will throw in the standalone `prop-types` package. ' + - 'You may be seeing this warning due to a third-party PropTypes ' + - 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.' - ); - manualPropTypeCallCache[cacheKey] = true; - manualPropTypeWarningCount++; - } - } - } - if (props[propName] == null) { - if (isRequired) { - if (props[propName] === null) { - return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.')); - } - return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.')); - } - return null; - } else { - return validate(props, propName, componentName, location, propFullName); - } - } - - var chainedCheckType = checkType.bind(null, false); - chainedCheckType.isRequired = checkType.bind(null, true); - - return chainedCheckType; - } - - function createPrimitiveTypeChecker(expectedType) { - function validate(props, propName, componentName, location, propFullName, secret) { - var propValue = props[propName]; - var propType = getPropType(propValue); - if (propType !== expectedType) { - // `propValue` being instance of, say, date/regexp, pass the 'object' - // check, but we can offer a more precise error message here rather than - // 'of type `object`'. - var preciseType = getPreciseType(propValue); - - return new PropTypeError( - 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'), - {expectedType: expectedType} - ); - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createAnyTypeChecker() { - return createChainableTypeChecker(emptyFunctionThatReturnsNull); - } - - function createArrayOfTypeChecker(typeChecker) { - function validate(props, propName, componentName, location, propFullName) { - if (typeof typeChecker !== 'function') { - return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.'); - } - var propValue = props[propName]; - if (!Array.isArray(propValue)) { - var propType = getPropType(propValue); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.')); - } - for (var i = 0; i < propValue.length; i++) { - var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret); - if (error instanceof Error) { - return error; - } - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createElementTypeChecker() { - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - if (!isValidElement(propValue)) { - var propType = getPropType(propValue); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.')); - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createElementTypeTypeChecker() { - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - if (!ReactIs.isValidElementType(propValue)) { - var propType = getPropType(propValue); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.')); - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createInstanceTypeChecker(expectedClass) { - function validate(props, propName, componentName, location, propFullName) { - if (!(props[propName] instanceof expectedClass)) { - var expectedClassName = expectedClass.name || ANONYMOUS; - var actualClassName = getClassName(props[propName]); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.')); - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createEnumTypeChecker(expectedValues) { - if (!Array.isArray(expectedValues)) { - if (true) { - if (arguments.length > 1) { - printWarning( - 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' + - 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).' - ); - } else { - printWarning('Invalid argument supplied to oneOf, expected an array.'); - } - } - return emptyFunctionThatReturnsNull; - } - - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - for (var i = 0; i < expectedValues.length; i++) { - if (is(propValue, expectedValues[i])) { - return null; - } - } - - var valuesString = JSON.stringify(expectedValues, function replacer(key, value) { - var type = getPreciseType(value); - if (type === 'symbol') { - return String(value); - } - return value; - }); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); - } - return createChainableTypeChecker(validate); - } - - function createObjectOfTypeChecker(typeChecker) { - function validate(props, propName, componentName, location, propFullName) { - if (typeof typeChecker !== 'function') { - return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.'); - } - var propValue = props[propName]; - var propType = getPropType(propValue); - if (propType !== 'object') { - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.')); - } - for (var key in propValue) { - if (has(propValue, key)) { - var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); - if (error instanceof Error) { - return error; - } - } - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createUnionTypeChecker(arrayOfTypeCheckers) { - if (!Array.isArray(arrayOfTypeCheckers)) { - true ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : 0; - return emptyFunctionThatReturnsNull; - } - - for (var i = 0; i < arrayOfTypeCheckers.length; i++) { - var checker = arrayOfTypeCheckers[i]; - if (typeof checker !== 'function') { - printWarning( - 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' + - 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.' - ); - return emptyFunctionThatReturnsNull; - } - } - - function validate(props, propName, componentName, location, propFullName) { - var expectedTypes = []; - for (var i = 0; i < arrayOfTypeCheckers.length; i++) { - var checker = arrayOfTypeCheckers[i]; - var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret); - if (checkerResult == null) { - return null; - } - if (checkerResult.data && has(checkerResult.data, 'expectedType')) { - expectedTypes.push(checkerResult.data.expectedType); - } - } - var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': ''; - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.')); - } - return createChainableTypeChecker(validate); - } - - function createNodeChecker() { - function validate(props, propName, componentName, location, propFullName) { - if (!isNode(props[propName])) { - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.')); - } - return null; - } - return createChainableTypeChecker(validate); - } - - function invalidValidatorError(componentName, location, propFullName, key, type) { - return new PropTypeError( - (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' + - 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.' - ); - } - - function createShapeTypeChecker(shapeTypes) { - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - var propType = getPropType(propValue); - if (propType !== 'object') { - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); - } - for (var key in shapeTypes) { - var checker = shapeTypes[key]; - if (typeof checker !== 'function') { - return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker)); - } - var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); - if (error) { - return error; - } - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createStrictShapeTypeChecker(shapeTypes) { - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - var propType = getPropType(propValue); - if (propType !== 'object') { - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); - } - // We need to check all keys in case some are required but missing from props. - var allKeys = assign({}, props[propName], shapeTypes); - for (var key in allKeys) { - var checker = shapeTypes[key]; - if (has(shapeTypes, key) && typeof checker !== 'function') { - return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker)); - } - if (!checker) { - return new PropTypeError( - 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' + - '\nBad object: ' + JSON.stringify(props[propName], null, ' ') + - '\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ') - ); - } - var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); - if (error) { - return error; - } - } - return null; - } - - return createChainableTypeChecker(validate); - } - - function isNode(propValue) { - switch (typeof propValue) { - case 'number': - case 'string': - case 'undefined': - return true; - case 'boolean': - return !propValue; - case 'object': - if (Array.isArray(propValue)) { - return propValue.every(isNode); - } - if (propValue === null || isValidElement(propValue)) { - return true; - } - - var iteratorFn = getIteratorFn(propValue); - if (iteratorFn) { - var iterator = iteratorFn.call(propValue); - var step; - if (iteratorFn !== propValue.entries) { - while (!(step = iterator.next()).done) { - if (!isNode(step.value)) { - return false; - } - } - } else { - // Iterator will provide entry [k,v] tuples rather than values. - while (!(step = iterator.next()).done) { - var entry = step.value; - if (entry) { - if (!isNode(entry[1])) { - return false; - } - } - } - } - } else { - return false; - } - - return true; - default: - return false; - } - } - - function isSymbol(propType, propValue) { - // Native Symbol. - if (propType === 'symbol') { - return true; - } - - // falsy value can't be a Symbol - if (!propValue) { - return false; - } - - // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol' - if (propValue['@@toStringTag'] === 'Symbol') { - return true; - } - - // Fallback for non-spec compliant Symbols which are polyfilled. - if (typeof Symbol === 'function' && propValue instanceof Symbol) { - return true; - } - - return false; - } - - // Equivalent of `typeof` but with special handling for array and regexp. - function getPropType(propValue) { - var propType = typeof propValue; - if (Array.isArray(propValue)) { - return 'array'; - } - if (propValue instanceof RegExp) { - // Old webkits (at least until Android 4.0) return 'function' rather than - // 'object' for typeof a RegExp. We'll normalize this here so that /bla/ - // passes PropTypes.object. - return 'object'; - } - if (isSymbol(propType, propValue)) { - return 'symbol'; - } - return propType; - } - - // This handles more types than `getPropType`. Only used for error messages. - // See `createPrimitiveTypeChecker`. - function getPreciseType(propValue) { - if (typeof propValue === 'undefined' || propValue === null) { - return '' + propValue; - } - var propType = getPropType(propValue); - if (propType === 'object') { - if (propValue instanceof Date) { - return 'date'; - } else if (propValue instanceof RegExp) { - return 'regexp'; - } - } - return propType; - } - - // Returns a string that is postfixed to a warning about an invalid type. - // For example, "undefined" or "of type array" - function getPostfixForTypeWarning(value) { - var type = getPreciseType(value); - switch (type) { - case 'array': - case 'object': - return 'an ' + type; - case 'boolean': - case 'date': - case 'regexp': - return 'a ' + type; - default: - return type; - } - } - - // Returns class name of the object, if any. - function getClassName(propValue) { - if (!propValue.constructor || !propValue.constructor.name) { - return ANONYMOUS; - } - return propValue.constructor.name; - } - - ReactPropTypes.checkPropTypes = checkPropTypes; - ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache; - ReactPropTypes.PropTypes = ReactPropTypes; - - return ReactPropTypes; -}; - - -/***/ }), - -/***/ "./node_modules/prop-types/index.js": -/*!******************************************!*\ - !*** ./node_modules/prop-types/index.js ***! - \******************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -if (true) { - var ReactIs = __webpack_require__(/*! react-is */ "./node_modules/react-is/index.js"); - - // By explicitly using `prop-types` you are opting into new development behavior. - // http://fb.me/prop-types-in-prod - var throwOnDirectAccess = true; - module.exports = __webpack_require__(/*! ./factoryWithTypeCheckers */ "./node_modules/prop-types/factoryWithTypeCheckers.js")(ReactIs.isElement, throwOnDirectAccess); -} else {} - - -/***/ }), - -/***/ "./node_modules/prop-types/lib/ReactPropTypesSecret.js": -/*!*************************************************************!*\ - !*** ./node_modules/prop-types/lib/ReactPropTypesSecret.js ***! - \*************************************************************/ -/***/ ((module) => { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - -var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; - -module.exports = ReactPropTypesSecret; - - -/***/ }), - -/***/ "./node_modules/prop-types/lib/has.js": -/*!********************************************!*\ - !*** ./node_modules/prop-types/lib/has.js ***! - \********************************************/ -/***/ ((module) => { - -module.exports = Function.call.bind(Object.prototype.hasOwnProperty); - - -/***/ }), - -/***/ "./node_modules/raven-js/src/configError.js": -/*!**************************************************!*\ - !*** ./node_modules/raven-js/src/configError.js ***! - \**************************************************/ -/***/ ((module) => { - -function RavenConfigError(message) { - this.name = 'RavenConfigError'; - this.message = message; -} -RavenConfigError.prototype = new Error(); -RavenConfigError.prototype.constructor = RavenConfigError; - -module.exports = RavenConfigError; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/console.js": -/*!**********************************************!*\ - !*** ./node_modules/raven-js/src/console.js ***! - \**********************************************/ -/***/ ((module) => { - -var wrapMethod = function(console, level, callback) { - var originalConsoleLevel = console[level]; - var originalConsole = console; - - if (!(level in console)) { - return; - } - - var sentryLevel = level === 'warn' ? 'warning' : level; - - console[level] = function() { - var args = [].slice.call(arguments); - - var msg = '' + args.join(' '); - var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}}; - - if (level === 'assert') { - if (args[0] === false) { - // Default browsers message - msg = 'Assertion failed: ' + (args.slice(1).join(' ') || 'console.assert'); - data.extra.arguments = args.slice(1); - callback && callback(msg, data); - } - } else { - callback && callback(msg, data); - } - - // this fails for some browsers. :( - if (originalConsoleLevel) { - // IE9 doesn't allow calling apply on console functions directly - // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193 - Function.prototype.apply.call(originalConsoleLevel, originalConsole, args); - } - }; -}; - -module.exports = { - wrapMethod: wrapMethod -}; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/raven.js": -/*!********************************************!*\ - !*** ./node_modules/raven-js/src/raven.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/*global XDomainRequest:false */ - -var TraceKit = __webpack_require__(/*! ../vendor/TraceKit/tracekit */ "./node_modules/raven-js/vendor/TraceKit/tracekit.js"); -var stringify = __webpack_require__(/*! ../vendor/json-stringify-safe/stringify */ "./node_modules/raven-js/vendor/json-stringify-safe/stringify.js"); -var RavenConfigError = __webpack_require__(/*! ./configError */ "./node_modules/raven-js/src/configError.js"); - -var utils = __webpack_require__(/*! ./utils */ "./node_modules/raven-js/src/utils.js"); -var isError = utils.isError; -var isObject = utils.isObject; -var isObject = utils.isObject; -var isErrorEvent = utils.isErrorEvent; -var isUndefined = utils.isUndefined; -var isFunction = utils.isFunction; -var isString = utils.isString; -var isEmptyObject = utils.isEmptyObject; -var each = utils.each; -var objectMerge = utils.objectMerge; -var truncate = utils.truncate; -var objectFrozen = utils.objectFrozen; -var hasKey = utils.hasKey; -var joinRegExp = utils.joinRegExp; -var urlencode = utils.urlencode; -var uuid4 = utils.uuid4; -var htmlTreeAsString = utils.htmlTreeAsString; -var isSameException = utils.isSameException; -var isSameStacktrace = utils.isSameStacktrace; -var parseUrl = utils.parseUrl; -var fill = utils.fill; - -var wrapConsoleMethod = (__webpack_require__(/*! ./console */ "./node_modules/raven-js/src/console.js").wrapMethod); - -var dsnKeys = 'source protocol user pass host port path'.split(' '), - dsnPattern = /^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/; - -function now() { - return +new Date(); -} - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; -var _document = _window.document; -var _navigator = _window.navigator; - -function keepOriginalCallback(original, callback) { - return isFunction(callback) - ? function(data) { - return callback(data, original); - } - : callback; -} - -// First, check for JSON support -// If there is no JSON, we no-op the core features of Raven -// since JSON is required to encode the payload -function Raven() { - this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify); - // Raven can run in contexts where there's no document (react-native) - this._hasDocument = !isUndefined(_document); - this._hasNavigator = !isUndefined(_navigator); - this._lastCapturedException = null; - this._lastData = null; - this._lastEventId = null; - this._globalServer = null; - this._globalKey = null; - this._globalProject = null; - this._globalContext = {}; - this._globalOptions = { - logger: 'javascript', - ignoreErrors: [], - ignoreUrls: [], - whitelistUrls: [], - includePaths: [], - collectWindowErrors: true, - maxMessageLength: 0, - - // By default, truncates URL values to 250 chars - maxUrlLength: 250, - stackTraceLimit: 50, - autoBreadcrumbs: true, - instrument: true, - sampleRate: 1 - }; - this._ignoreOnError = 0; - this._isRavenInstalled = false; - this._originalErrorStackTraceLimit = Error.stackTraceLimit; - // capture references to window.console *and* all its methods first - // before the console plugin has a chance to monkey patch - this._originalConsole = _window.console || {}; - this._originalConsoleMethods = {}; - this._plugins = []; - this._startTime = now(); - this._wrappedBuiltIns = []; - this._breadcrumbs = []; - this._lastCapturedEvent = null; - this._keypressTimeout; - this._location = _window.location; - this._lastHref = this._location && this._location.href; - this._resetBackoff(); - - // eslint-disable-next-line guard-for-in - for (var method in this._originalConsole) { - this._originalConsoleMethods[method] = this._originalConsole[method]; - } -} - -/* - * The core Raven singleton - * - * @this {Raven} - */ - -Raven.prototype = { - // Hardcode version string so that raven source can be loaded directly via - // webpack (using a build step causes webpack #1617). Grunt verifies that - // this value matches package.json during build. - // See: https://github.com/getsentry/raven-js/issues/465 - VERSION: '3.19.1', - - debug: false, - - TraceKit: TraceKit, // alias to TraceKit - - /* - * Configure Raven with a DSN and extra options - * - * @param {string} dsn The public Sentry DSN - * @param {object} options Set of global options [optional] - * @return {Raven} - */ - config: function(dsn, options) { - var self = this; - - if (self._globalServer) { - this._logDebug('error', 'Error: Raven has already been configured'); - return self; - } - if (!dsn) return self; - - var globalOptions = self._globalOptions; - - // merge in options - if (options) { - each(options, function(key, value) { - // tags and extra are special and need to be put into context - if (key === 'tags' || key === 'extra' || key === 'user') { - self._globalContext[key] = value; - } else { - globalOptions[key] = value; - } - }); - } - - self.setDSN(dsn); - - // "Script error." is hard coded into browsers for errors that it can't read. - // this is the result of a script being pulled in from an external domain and CORS. - globalOptions.ignoreErrors.push(/^Script error\.?$/); - globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/); - - // join regexp rules into one big rule - globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors); - globalOptions.ignoreUrls = globalOptions.ignoreUrls.length - ? joinRegExp(globalOptions.ignoreUrls) - : false; - globalOptions.whitelistUrls = globalOptions.whitelistUrls.length - ? joinRegExp(globalOptions.whitelistUrls) - : false; - globalOptions.includePaths = joinRegExp(globalOptions.includePaths); - globalOptions.maxBreadcrumbs = Math.max( - 0, - Math.min(globalOptions.maxBreadcrumbs || 100, 100) - ); // default and hard limit is 100 - - var autoBreadcrumbDefaults = { - xhr: true, - console: true, - dom: true, - location: true - }; - - var autoBreadcrumbs = globalOptions.autoBreadcrumbs; - if ({}.toString.call(autoBreadcrumbs) === '[object Object]') { - autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs); - } else if (autoBreadcrumbs !== false) { - autoBreadcrumbs = autoBreadcrumbDefaults; - } - globalOptions.autoBreadcrumbs = autoBreadcrumbs; - - var instrumentDefaults = { - tryCatch: true - }; - - var instrument = globalOptions.instrument; - if ({}.toString.call(instrument) === '[object Object]') { - instrument = objectMerge(instrumentDefaults, instrument); - } else if (instrument !== false) { - instrument = instrumentDefaults; - } - globalOptions.instrument = instrument; - - TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors; - - // return for chaining - return self; - }, - - /* - * Installs a global window.onerror error handler - * to capture and report uncaught exceptions. - * At this point, install() is required to be called due - * to the way TraceKit is set up. - * - * @return {Raven} - */ - install: function() { - var self = this; - if (self.isSetup() && !self._isRavenInstalled) { - TraceKit.report.subscribe(function() { - self._handleOnErrorStackInfo.apply(self, arguments); - }); - if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) { - self._instrumentTryCatch(); - } - - if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs(); - - // Install all of the plugins - self._drainPlugins(); - - self._isRavenInstalled = true; - } - - Error.stackTraceLimit = self._globalOptions.stackTraceLimit; - return this; - }, - - /* - * Set the DSN (can be called multiple time unlike config) - * - * @param {string} dsn The public Sentry DSN - */ - setDSN: function(dsn) { - var self = this, - uri = self._parseDSN(dsn), - lastSlash = uri.path.lastIndexOf('/'), - path = uri.path.substr(1, lastSlash); - - self._dsn = dsn; - self._globalKey = uri.user; - self._globalSecret = uri.pass && uri.pass.substr(1); - self._globalProject = uri.path.substr(lastSlash + 1); - - self._globalServer = self._getGlobalServer(uri); - - self._globalEndpoint = - self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/'; - - // Reset backoff state since we may be pointing at a - // new project/server - this._resetBackoff(); - }, - - /* - * Wrap code within a context so Raven can capture errors - * reliably across domains that is executed immediately. - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The callback to be immediately executed within the context - * @param {array} args An array of arguments to be called with the callback [optional] - */ - context: function(options, func, args) { - if (isFunction(options)) { - args = func || []; - func = options; - options = undefined; - } - - return this.wrap(options, func).apply(this, args); - }, - - /* - * Wrap code within a context and returns back a new function to be executed - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The function to be wrapped in a new context - * @param {function} func A function to call before the try/catch wrapper [optional, private] - * @return {function} The newly wrapped functions with a context - */ - wrap: function(options, func, _before) { - var self = this; - // 1 argument has been passed, and it's not a function - // so just return it - if (isUndefined(func) && !isFunction(options)) { - return options; - } - - // options is optional - if (isFunction(options)) { - func = options; - options = undefined; - } - - // At this point, we've passed along 2 arguments, and the second one - // is not a function either, so we'll just return the second argument. - if (!isFunction(func)) { - return func; - } - - // We don't wanna wrap it twice! - try { - if (func.__raven__) { - return func; - } - - // If this has already been wrapped in the past, return that - if (func.__raven_wrapper__) { - return func.__raven_wrapper__; - } - } catch (e) { - // Just accessing custom props in some Selenium environments - // can cause a "Permission denied" exception (see raven-js#495). - // Bail on wrapping and return the function as-is (defers to window.onerror). - return func; - } - - function wrapped() { - var args = [], - i = arguments.length, - deep = !options || (options && options.deep !== false); - - if (_before && isFunction(_before)) { - _before.apply(this, arguments); - } - - // Recursively wrap all of a function's arguments that are - // functions themselves. - while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i]; - - try { - // Attempt to invoke user-land function - // NOTE: If you are a Sentry user, and you are seeing this stack frame, it - // means Raven caught an error invoking your application code. This is - // expected behavior and NOT indicative of a bug with Raven.js. - return func.apply(this, args); - } catch (e) { - self._ignoreNextOnError(); - self.captureException(e, options); - throw e; - } - } - - // copy over properties of the old function - for (var property in func) { - if (hasKey(func, property)) { - wrapped[property] = func[property]; - } - } - wrapped.prototype = func.prototype; - - func.__raven_wrapper__ = wrapped; - // Signal that this function has been wrapped already - // for both debugging and to prevent it to being wrapped twice - wrapped.__raven__ = true; - wrapped.__inner__ = func; - - return wrapped; - }, - - /* - * Uninstalls the global error handler. - * - * @return {Raven} - */ - uninstall: function() { - TraceKit.report.uninstall(); - - this._restoreBuiltIns(); - - Error.stackTraceLimit = this._originalErrorStackTraceLimit; - this._isRavenInstalled = false; - - return this; - }, - - /* - * Manually capture an exception and send it over to Sentry - * - * @param {error} ex An exception to be logged - * @param {object} options A specific set of options for this error [optional] - * @return {Raven} - */ - captureException: function(ex, options) { - // Cases for sending ex as a message, rather than an exception - var isNotError = !isError(ex); - var isNotErrorEvent = !isErrorEvent(ex); - var isErrorEventWithoutError = isErrorEvent(ex) && !ex.error; - - if ((isNotError && isNotErrorEvent) || isErrorEventWithoutError) { - return this.captureMessage( - ex, - objectMerge( - { - trimHeadFrames: 1, - stacktrace: true // if we fall back to captureMessage, default to attempting a new trace - }, - options - ) - ); - } - - // Get actual Error from ErrorEvent - if (isErrorEvent(ex)) ex = ex.error; - - // Store the raw exception object for potential debugging and introspection - this._lastCapturedException = ex; - - // TraceKit.report will re-raise any exception passed to it, - // which means you have to wrap it in try/catch. Instead, we - // can wrap it here and only re-raise if TraceKit.report - // raises an exception different from the one we asked to - // report on. - try { - var stack = TraceKit.computeStackTrace(ex); - this._handleStackInfo(stack, options); - } catch (ex1) { - if (ex !== ex1) { - throw ex1; - } - } - - return this; - }, - - /* - * Manually send a message to Sentry - * - * @param {string} msg A plain message to be captured in Sentry - * @param {object} options A specific set of options for this message [optional] - * @return {Raven} - */ - captureMessage: function(msg, options) { - // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an - // early call; we'll error on the side of logging anything called before configuration since it's - // probably something you should see: - if ( - !!this._globalOptions.ignoreErrors.test && - this._globalOptions.ignoreErrors.test(msg) - ) { - return; - } - - options = options || {}; - - var data = objectMerge( - { - message: msg + '' // Make sure it's actually a string - }, - options - ); - - var ex; - // Generate a "synthetic" stack trace from this point. - // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative - // of a bug with Raven.js. Sentry generates synthetic traces either by configuration, - // or if it catches a thrown object without a "stack" property. - try { - throw new Error(msg); - } catch (ex1) { - ex = ex1; - } - - // null exception name so `Error` isn't prefixed to msg - ex.name = null; - var stack = TraceKit.computeStackTrace(ex); - - // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1] - var initialCall = stack.stack[1]; - - var fileurl = (initialCall && initialCall.url) || ''; - - if ( - !!this._globalOptions.ignoreUrls.test && - this._globalOptions.ignoreUrls.test(fileurl) - ) { - return; - } - - if ( - !!this._globalOptions.whitelistUrls.test && - !this._globalOptions.whitelistUrls.test(fileurl) - ) { - return; - } - - if (this._globalOptions.stacktrace || (options && options.stacktrace)) { - options = objectMerge( - { - // fingerprint on msg, not stack trace (legacy behavior, could be - // revisited) - fingerprint: msg, - // since we know this is a synthetic trace, the top N-most frames - // MUST be from Raven.js, so mark them as in_app later by setting - // trimHeadFrames - trimHeadFrames: (options.trimHeadFrames || 0) + 1 - }, - options - ); - - var frames = this._prepareFrames(stack, options); - data.stacktrace = { - // Sentry expects frames oldest to newest - frames: frames.reverse() - }; - } - - // Fire away! - this._send(data); - - return this; - }, - - captureBreadcrumb: function(obj) { - var crumb = objectMerge( - { - timestamp: now() / 1000 - }, - obj - ); - - if (isFunction(this._globalOptions.breadcrumbCallback)) { - var result = this._globalOptions.breadcrumbCallback(crumb); - - if (isObject(result) && !isEmptyObject(result)) { - crumb = result; - } else if (result === false) { - return this; - } - } - - this._breadcrumbs.push(crumb); - if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) { - this._breadcrumbs.shift(); - } - return this; - }, - - addPlugin: function(plugin /*arg1, arg2, ... argN*/) { - var pluginArgs = [].slice.call(arguments, 1); - - this._plugins.push([plugin, pluginArgs]); - if (this._isRavenInstalled) { - this._drainPlugins(); - } - - return this; - }, - - /* - * Set/clear a user to be sent along with the payload. - * - * @param {object} user An object representing user data [optional] - * @return {Raven} - */ - setUserContext: function(user) { - // Intentionally do not merge here since that's an unexpected behavior. - this._globalContext.user = user; - - return this; - }, - - /* - * Merge extra attributes to be sent along with the payload. - * - * @param {object} extra An object representing extra data [optional] - * @return {Raven} - */ - setExtraContext: function(extra) { - this._mergeContext('extra', extra); - - return this; - }, - - /* - * Merge tags to be sent along with the payload. - * - * @param {object} tags An object representing tags [optional] - * @return {Raven} - */ - setTagsContext: function(tags) { - this._mergeContext('tags', tags); - - return this; - }, - - /* - * Clear all of the context. - * - * @return {Raven} - */ - clearContext: function() { - this._globalContext = {}; - - return this; - }, - - /* - * Get a copy of the current context. This cannot be mutated. - * - * @return {object} copy of context - */ - getContext: function() { - // lol javascript - return JSON.parse(stringify(this._globalContext)); - }, - - /* - * Set environment of application - * - * @param {string} environment Typically something like 'production'. - * @return {Raven} - */ - setEnvironment: function(environment) { - this._globalOptions.environment = environment; - - return this; - }, - - /* - * Set release version of application - * - * @param {string} release Typically something like a git SHA to identify version - * @return {Raven} - */ - setRelease: function(release) { - this._globalOptions.release = release; - - return this; - }, - - /* - * Set the dataCallback option - * - * @param {function} callback The callback to run which allows the - * data blob to be mutated before sending - * @return {Raven} - */ - setDataCallback: function(callback) { - var original = this._globalOptions.dataCallback; - this._globalOptions.dataCallback = keepOriginalCallback(original, callback); - return this; - }, - - /* - * Set the breadcrumbCallback option - * - * @param {function} callback The callback to run which allows filtering - * or mutating breadcrumbs - * @return {Raven} - */ - setBreadcrumbCallback: function(callback) { - var original = this._globalOptions.breadcrumbCallback; - this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback); - return this; - }, - - /* - * Set the shouldSendCallback option - * - * @param {function} callback The callback to run which allows - * introspecting the blob before sending - * @return {Raven} - */ - setShouldSendCallback: function(callback) { - var original = this._globalOptions.shouldSendCallback; - this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback); - return this; - }, - - /** - * Override the default HTTP transport mechanism that transmits data - * to the Sentry server. - * - * @param {function} transport Function invoked instead of the default - * `makeRequest` handler. - * - * @return {Raven} - */ - setTransport: function(transport) { - this._globalOptions.transport = transport; - - return this; - }, - - /* - * Get the latest raw exception that was captured by Raven. - * - * @return {error} - */ - lastException: function() { - return this._lastCapturedException; - }, - - /* - * Get the last event id - * - * @return {string} - */ - lastEventId: function() { - return this._lastEventId; - }, - - /* - * Determine if Raven is setup and ready to go. - * - * @return {boolean} - */ - isSetup: function() { - if (!this._hasJSON) return false; // needs JSON support - if (!this._globalServer) { - if (!this.ravenNotConfiguredError) { - this.ravenNotConfiguredError = true; - this._logDebug('error', 'Error: Raven has not been configured.'); - } - return false; - } - return true; - }, - - afterLoad: function() { - // TODO: remove window dependence? - - // Attempt to initialize Raven on load - var RavenConfig = _window.RavenConfig; - if (RavenConfig) { - this.config(RavenConfig.dsn, RavenConfig.config).install(); - } - }, - - showReportDialog: function(options) { - if ( - !_document // doesn't work without a document (React native) - ) - return; - - options = options || {}; - - var lastEventId = options.eventId || this.lastEventId(); - if (!lastEventId) { - throw new RavenConfigError('Missing eventId'); - } - - var dsn = options.dsn || this._dsn; - if (!dsn) { - throw new RavenConfigError('Missing DSN'); - } - - var encode = encodeURIComponent; - var qs = ''; - qs += '?eventId=' + encode(lastEventId); - qs += '&dsn=' + encode(dsn); - - var user = options.user || this._globalContext.user; - if (user) { - if (user.name) qs += '&name=' + encode(user.name); - if (user.email) qs += '&email=' + encode(user.email); - } - - var globalServer = this._getGlobalServer(this._parseDSN(dsn)); - - var script = _document.createElement('script'); - script.async = true; - script.src = globalServer + '/api/embed/error-page/' + qs; - (_document.head || _document.body).appendChild(script); - }, - - /**** Private functions ****/ - _ignoreNextOnError: function() { - var self = this; - this._ignoreOnError += 1; - setTimeout(function() { - // onerror should trigger before setTimeout - self._ignoreOnError -= 1; - }); - }, - - _triggerEvent: function(eventType, options) { - // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it - var evt, key; - - if (!this._hasDocument) return; - - options = options || {}; - - eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1); - - if (_document.createEvent) { - evt = _document.createEvent('HTMLEvents'); - evt.initEvent(eventType, true, true); - } else { - evt = _document.createEventObject(); - evt.eventType = eventType; - } - - for (key in options) - if (hasKey(options, key)) { - evt[key] = options[key]; - } - - if (_document.createEvent) { - // IE9 if standards - _document.dispatchEvent(evt); - } else { - // IE8 regardless of Quirks or Standards - // IE9 if quirks - try { - _document.fireEvent('on' + evt.eventType.toLowerCase(), evt); - } catch (e) { - // Do nothing - } - } - }, - - /** - * Wraps addEventListener to capture UI breadcrumbs - * @param evtName the event name (e.g. "click") - * @returns {Function} - * @private - */ - _breadcrumbEventHandler: function(evtName) { - var self = this; - return function(evt) { - // reset keypress timeout; e.g. triggering a 'click' after - // a 'keypress' will reset the keypress debounce so that a new - // set of keypresses can be recorded - self._keypressTimeout = null; - - // It's possible this handler might trigger multiple times for the same - // event (e.g. event propagation through node ancestors). Ignore if we've - // already captured the event. - if (self._lastCapturedEvent === evt) return; - - self._lastCapturedEvent = evt; - - // try/catch both: - // - accessing evt.target (see getsentry/raven-js#838, #768) - // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly - // can throw an exception in some circumstances. - var target; - try { - target = htmlTreeAsString(evt.target); - } catch (e) { - target = ''; - } - - self.captureBreadcrumb({ - category: 'ui.' + evtName, // e.g. ui.click, ui.input - message: target - }); - }; - }, - - /** - * Wraps addEventListener to capture keypress UI events - * @returns {Function} - * @private - */ - _keypressEventHandler: function() { - var self = this, - debounceDuration = 1000; // milliseconds - - // TODO: if somehow user switches keypress target before - // debounce timeout is triggered, we will only capture - // a single breadcrumb from the FIRST target (acceptable?) - return function(evt) { - var target; - try { - target = evt.target; - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - var tagName = target && target.tagName; - - // only consider keypress events on actual input elements - // this will disregard keypresses targeting body (e.g. tabbing - // through elements, hotkeys, etc) - if ( - !tagName || - (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable) - ) - return; - - // record first keypress in a series, but ignore subsequent - // keypresses until debounce clears - var timeout = self._keypressTimeout; - if (!timeout) { - self._breadcrumbEventHandler('input')(evt); - } - clearTimeout(timeout); - self._keypressTimeout = setTimeout(function() { - self._keypressTimeout = null; - }, debounceDuration); - }; - }, - - /** - * Captures a breadcrumb of type "navigation", normalizing input URLs - * @param to the originating URL - * @param from the target URL - * @private - */ - _captureUrlChange: function(from, to) { - var parsedLoc = parseUrl(this._location.href); - var parsedTo = parseUrl(to); - var parsedFrom = parseUrl(from); - - // because onpopstate only tells you the "new" (to) value of location.href, and - // not the previous (from) value, we need to track the value of the current URL - // state ourselves - this._lastHref = to; - - // Use only the path component of the URL if the URL matches the current - // document (almost all the time when using pushState) - if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) - to = parsedTo.relative; - if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) - from = parsedFrom.relative; - - this.captureBreadcrumb({ - category: 'navigation', - data: { - to: to, - from: from - } - }); - }, - - /** - * Wrap timer functions and event targets to catch errors and provide - * better metadata. - */ - _instrumentTryCatch: function() { - var self = this; - - var wrappedBuiltIns = self._wrappedBuiltIns; - - function wrapTimeFn(orig) { - return function(fn, t) { - // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - var originalCallback = args[0]; - if (isFunction(originalCallback)) { - args[0] = self.wrap(originalCallback); - } - - // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it - // also supports only two arguments and doesn't care what this is, so we - // can just call the original function directly. - if (orig.apply) { - return orig.apply(this, args); - } else { - return orig(args[0], args[1]); - } - }; - } - - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - - function wrapEventTarget(global) { - var proto = _window[global] && _window[global].prototype; - if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) { - fill( - proto, - 'addEventListener', - function(orig) { - return function(evtName, fn, capture, secure) { - // preserve arity - try { - if (fn && fn.handleEvent) { - fn.handleEvent = self.wrap(fn.handleEvent); - } - } catch (err) { - // can sometimes get 'Permission denied to access property "handle Event' - } - - // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs` - // so that we don't have more than one wrapper function - var before, clickHandler, keypressHandler; - - if ( - autoBreadcrumbs && - autoBreadcrumbs.dom && - (global === 'EventTarget' || global === 'Node') - ) { - // NOTE: generating multiple handlers per addEventListener invocation, should - // revisit and verify we can just use one (almost certainly) - clickHandler = self._breadcrumbEventHandler('click'); - keypressHandler = self._keypressEventHandler(); - before = function(evt) { - // need to intercept every DOM event in `before` argument, in case that - // same wrapped method is re-used for different events (e.g. mousemove THEN click) - // see #724 - if (!evt) return; - - var eventType; - try { - eventType = evt.type; - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - if (eventType === 'click') return clickHandler(evt); - else if (eventType === 'keypress') return keypressHandler(evt); - }; - } - return orig.call( - this, - evtName, - self.wrap(fn, undefined, before), - capture, - secure - ); - }; - }, - wrappedBuiltIns - ); - fill( - proto, - 'removeEventListener', - function(orig) { - return function(evt, fn, capture, secure) { - try { - fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn); - } catch (e) { - // ignore, accessing __raven_wrapper__ will throw in some Selenium environments - } - return orig.call(this, evt, fn, capture, secure); - }; - }, - wrappedBuiltIns - ); - } - } - - fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns); - fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns); - if (_window.requestAnimationFrame) { - fill( - _window, - 'requestAnimationFrame', - function(orig) { - return function(cb) { - return orig(self.wrap(cb)); - }; - }, - wrappedBuiltIns - ); - } - - // event targets borrowed from bugsnag-js: - // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666 - var eventTargets = [ - 'EventTarget', - 'Window', - 'Node', - 'ApplicationCache', - 'AudioTrackList', - 'ChannelMergerNode', - 'CryptoOperation', - 'EventSource', - 'FileReader', - 'HTMLUnknownElement', - 'IDBDatabase', - 'IDBRequest', - 'IDBTransaction', - 'KeyOperation', - 'MediaController', - 'MessagePort', - 'ModalWindow', - 'Notification', - 'SVGElementInstance', - 'Screen', - 'TextTrack', - 'TextTrackCue', - 'TextTrackList', - 'WebSocket', - 'WebSocketWorker', - 'Worker', - 'XMLHttpRequest', - 'XMLHttpRequestEventTarget', - 'XMLHttpRequestUpload' - ]; - for (var i = 0; i < eventTargets.length; i++) { - wrapEventTarget(eventTargets[i]); - } - }, - - /** - * Instrument browser built-ins w/ breadcrumb capturing - * - XMLHttpRequests - * - DOM interactions (click/typing) - * - window.location changes - * - console - * - * Can be disabled or individually configured via the `autoBreadcrumbs` config option - */ - _instrumentBreadcrumbs: function() { - var self = this; - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - - var wrappedBuiltIns = self._wrappedBuiltIns; - - function wrapProp(prop, xhr) { - if (prop in xhr && isFunction(xhr[prop])) { - fill(xhr, prop, function(orig) { - return self.wrap(orig); - }); // intentionally don't track filled methods on XHR instances - } - } - - if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) { - var xhrproto = XMLHttpRequest.prototype; - fill( - xhrproto, - 'open', - function(origOpen) { - return function(method, url) { - // preserve arity - - // if Sentry key appears in URL, don't capture - if (isString(url) && url.indexOf(self._globalKey) === -1) { - this.__raven_xhr = { - method: method, - url: url, - status_code: null - }; - } - - return origOpen.apply(this, arguments); - }; - }, - wrappedBuiltIns - ); - - fill( - xhrproto, - 'send', - function(origSend) { - return function(data) { - // preserve arity - var xhr = this; - - function onreadystatechangeHandler() { - if (xhr.__raven_xhr && xhr.readyState === 4) { - try { - // touching statusCode in some platforms throws - // an exception - xhr.__raven_xhr.status_code = xhr.status; - } catch (e) { - /* do nothing */ - } - - self.captureBreadcrumb({ - type: 'http', - category: 'xhr', - data: xhr.__raven_xhr - }); - } - } - - var props = ['onload', 'onerror', 'onprogress']; - for (var j = 0; j < props.length; j++) { - wrapProp(props[j], xhr); - } - - if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) { - fill( - xhr, - 'onreadystatechange', - function(orig) { - return self.wrap(orig, undefined, onreadystatechangeHandler); - } /* intentionally don't track this instrumentation */ - ); - } else { - // if onreadystatechange wasn't actually set by the page on this xhr, we - // are free to set our own and capture the breadcrumb - xhr.onreadystatechange = onreadystatechangeHandler; - } - - return origSend.apply(this, arguments); - }; - }, - wrappedBuiltIns - ); - } - - if (autoBreadcrumbs.xhr && 'fetch' in _window) { - fill( - _window, - 'fetch', - function(origFetch) { - return function(fn, t) { - // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - - var fetchInput = args[0]; - var method = 'GET'; - var url; - - if (typeof fetchInput === 'string') { - url = fetchInput; - } else if ('Request' in _window && fetchInput instanceof _window.Request) { - url = fetchInput.url; - if (fetchInput.method) { - method = fetchInput.method; - } - } else { - url = '' + fetchInput; - } - - if (args[1] && args[1].method) { - method = args[1].method; - } - - var fetchData = { - method: method, - url: url, - status_code: null - }; - - self.captureBreadcrumb({ - type: 'http', - category: 'fetch', - data: fetchData - }); - - return origFetch.apply(this, args).then(function(response) { - fetchData.status_code = response.status; - - return response; - }); - }; - }, - wrappedBuiltIns - ); - } - - // Capture breadcrumbs from any click that is unhandled / bubbled up all the way - // to the document. Do this before we instrument addEventListener. - if (autoBreadcrumbs.dom && this._hasDocument) { - if (_document.addEventListener) { - _document.addEventListener('click', self._breadcrumbEventHandler('click'), false); - _document.addEventListener('keypress', self._keypressEventHandler(), false); - } else { - // IE8 Compatibility - _document.attachEvent('onclick', self._breadcrumbEventHandler('click')); - _document.attachEvent('onkeypress', self._keypressEventHandler()); - } - } - - // record navigation (URL) changes - // NOTE: in Chrome App environment, touching history.pushState, *even inside - // a try/catch block*, will cause Chrome to output an error to console.error - // borrowed from: https://github.com/angular/angular.js/pull/13945/files - var chrome = _window.chrome; - var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime; - var hasPushAndReplaceState = - !isChromePackagedApp && - _window.history && - history.pushState && - history.replaceState; - if (autoBreadcrumbs.location && hasPushAndReplaceState) { - // TODO: remove onpopstate handler on uninstall() - var oldOnPopState = _window.onpopstate; - _window.onpopstate = function() { - var currentHref = self._location.href; - self._captureUrlChange(self._lastHref, currentHref); - - if (oldOnPopState) { - return oldOnPopState.apply(this, arguments); - } - }; - - var historyReplacementFunction = function(origHistFunction) { - // note history.pushState.length is 0; intentionally not declaring - // params to preserve 0 arity - return function(/* state, title, url */) { - var url = arguments.length > 2 ? arguments[2] : undefined; - - // url argument is optional - if (url) { - // coerce to string (this is what pushState does) - self._captureUrlChange(self._lastHref, url + ''); - } - - return origHistFunction.apply(this, arguments); - }; - }; - - fill(history, 'pushState', historyReplacementFunction, wrappedBuiltIns); - fill(history, 'replaceState', historyReplacementFunction, wrappedBuiltIns); - } - - if (autoBreadcrumbs.console && 'console' in _window && console.log) { - // console - var consoleMethodCallback = function(msg, data) { - self.captureBreadcrumb({ - message: msg, - level: data.level, - category: 'console' - }); - }; - - each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) { - wrapConsoleMethod(console, level, consoleMethodCallback); - }); - } - }, - - _restoreBuiltIns: function() { - // restore any wrapped builtins - var builtin; - while (this._wrappedBuiltIns.length) { - builtin = this._wrappedBuiltIns.shift(); - - var obj = builtin[0], - name = builtin[1], - orig = builtin[2]; - - obj[name] = orig; - } - }, - - _drainPlugins: function() { - var self = this; - - // FIX ME TODO - each(this._plugins, function(_, plugin) { - var installer = plugin[0]; - var args = plugin[1]; - installer.apply(self, [self].concat(args)); - }); - }, - - _parseDSN: function(str) { - var m = dsnPattern.exec(str), - dsn = {}, - i = 7; - - try { - while (i--) dsn[dsnKeys[i]] = m[i] || ''; - } catch (e) { - throw new RavenConfigError('Invalid DSN: ' + str); - } - - if (dsn.pass && !this._globalOptions.allowSecretKey) { - throw new RavenConfigError( - 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key' - ); - } - - return dsn; - }, - - _getGlobalServer: function(uri) { - // assemble the endpoint from the uri pieces - var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : ''); - - if (uri.protocol) { - globalServer = uri.protocol + ':' + globalServer; - } - return globalServer; - }, - - _handleOnErrorStackInfo: function() { - // if we are intentionally ignoring errors via onerror, bail out - if (!this._ignoreOnError) { - this._handleStackInfo.apply(this, arguments); - } - }, - - _handleStackInfo: function(stackInfo, options) { - var frames = this._prepareFrames(stackInfo, options); - - this._triggerEvent('handle', { - stackInfo: stackInfo, - options: options - }); - - this._processException( - stackInfo.name, - stackInfo.message, - stackInfo.url, - stackInfo.lineno, - frames, - options - ); - }, - - _prepareFrames: function(stackInfo, options) { - var self = this; - var frames = []; - if (stackInfo.stack && stackInfo.stack.length) { - each(stackInfo.stack, function(i, stack) { - var frame = self._normalizeFrame(stack, stackInfo.url); - if (frame) { - frames.push(frame); - } - }); - - // e.g. frames captured via captureMessage throw - if (options && options.trimHeadFrames) { - for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) { - frames[j].in_app = false; - } - } - } - frames = frames.slice(0, this._globalOptions.stackTraceLimit); - return frames; - }, - - _normalizeFrame: function(frame, stackInfoUrl) { - // normalize the frames data - var normalized = { - filename: frame.url, - lineno: frame.line, - colno: frame.column, - function: frame.func || '?' - }; - - // Case when we don't have any information about the error - // E.g. throwing a string or raw object, instead of an `Error` in Firefox - // Generating synthetic error doesn't add any value here - // - // We should probably somehow let a user know that they should fix their code - if (!frame.url) { - normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler - } - - normalized.in_app = !// determine if an exception came from outside of our app - // first we check the global includePaths list. - ( - (!!this._globalOptions.includePaths.test && - !this._globalOptions.includePaths.test(normalized.filename)) || - // Now we check for fun, if the function name is Raven or TraceKit - /(Raven|TraceKit)\./.test(normalized['function']) || - // finally, we do a last ditch effort and check for raven.min.js - /raven\.(min\.)?js$/.test(normalized.filename) - ); - - return normalized; - }, - - _processException: function(type, message, fileurl, lineno, frames, options) { - var prefixedMessage = (type ? type + ': ' : '') + (message || ''); - if ( - !!this._globalOptions.ignoreErrors.test && - (this._globalOptions.ignoreErrors.test(message) || - this._globalOptions.ignoreErrors.test(prefixedMessage)) - ) { - return; - } - - var stacktrace; - - if (frames && frames.length) { - fileurl = frames[0].filename || fileurl; - // Sentry expects frames oldest to newest - // and JS sends them as newest to oldest - frames.reverse(); - stacktrace = {frames: frames}; - } else if (fileurl) { - stacktrace = { - frames: [ - { - filename: fileurl, - lineno: lineno, - in_app: true - } - ] - }; - } - - if ( - !!this._globalOptions.ignoreUrls.test && - this._globalOptions.ignoreUrls.test(fileurl) - ) { - return; - } - - if ( - !!this._globalOptions.whitelistUrls.test && - !this._globalOptions.whitelistUrls.test(fileurl) - ) { - return; - } - - var data = objectMerge( - { - // sentry.interfaces.Exception - exception: { - values: [ - { - type: type, - value: message, - stacktrace: stacktrace - } - ] - }, - culprit: fileurl - }, - options - ); - - // Fire away! - this._send(data); - }, - - _trimPacket: function(data) { - // For now, we only want to truncate the two different messages - // but this could/should be expanded to just trim everything - var max = this._globalOptions.maxMessageLength; - if (data.message) { - data.message = truncate(data.message, max); - } - if (data.exception) { - var exception = data.exception.values[0]; - exception.value = truncate(exception.value, max); - } - - var request = data.request; - if (request) { - if (request.url) { - request.url = truncate(request.url, this._globalOptions.maxUrlLength); - } - if (request.Referer) { - request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength); - } - } - - if (data.breadcrumbs && data.breadcrumbs.values) - this._trimBreadcrumbs(data.breadcrumbs); - - return data; - }, - - /** - * Truncate breadcrumb values (right now just URLs) - */ - _trimBreadcrumbs: function(breadcrumbs) { - // known breadcrumb properties with urls - // TODO: also consider arbitrary prop values that start with (https?)?:// - var urlProps = ['to', 'from', 'url'], - urlProp, - crumb, - data; - - for (var i = 0; i < breadcrumbs.values.length; ++i) { - crumb = breadcrumbs.values[i]; - if ( - !crumb.hasOwnProperty('data') || - !isObject(crumb.data) || - objectFrozen(crumb.data) - ) - continue; - - data = objectMerge({}, crumb.data); - for (var j = 0; j < urlProps.length; ++j) { - urlProp = urlProps[j]; - if (data.hasOwnProperty(urlProp) && data[urlProp]) { - data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength); - } - } - breadcrumbs.values[i].data = data; - } - }, - - _getHttpData: function() { - if (!this._hasNavigator && !this._hasDocument) return; - var httpData = {}; - - if (this._hasNavigator && _navigator.userAgent) { - httpData.headers = { - 'User-Agent': navigator.userAgent - }; - } - - if (this._hasDocument) { - if (_document.location && _document.location.href) { - httpData.url = _document.location.href; - } - if (_document.referrer) { - if (!httpData.headers) httpData.headers = {}; - httpData.headers.Referer = _document.referrer; - } - } - - return httpData; - }, - - _resetBackoff: function() { - this._backoffDuration = 0; - this._backoffStart = null; - }, - - _shouldBackoff: function() { - return this._backoffDuration && now() - this._backoffStart < this._backoffDuration; - }, - - /** - * Returns true if the in-process data payload matches the signature - * of the previously-sent data - * - * NOTE: This has to be done at this level because TraceKit can generate - * data from window.onerror WITHOUT an exception object (IE8, IE9, - * other old browsers). This can take the form of an "exception" - * data object with a single frame (derived from the onerror args). - */ - _isRepeatData: function(current) { - var last = this._lastData; - - if ( - !last || - current.message !== last.message || // defined for captureMessage - current.culprit !== last.culprit // defined for captureException/onerror - ) - return false; - - // Stacktrace interface (i.e. from captureMessage) - if (current.stacktrace || last.stacktrace) { - return isSameStacktrace(current.stacktrace, last.stacktrace); - } else if (current.exception || last.exception) { - // Exception interface (i.e. from captureException/onerror) - return isSameException(current.exception, last.exception); - } - - return true; - }, - - _setBackoffState: function(request) { - // If we are already in a backoff state, don't change anything - if (this._shouldBackoff()) { - return; - } - - var status = request.status; - - // 400 - project_id doesn't exist or some other fatal - // 401 - invalid/revoked dsn - // 429 - too many requests - if (!(status === 400 || status === 401 || status === 429)) return; - - var retry; - try { - // If Retry-After is not in Access-Control-Expose-Headers, most - // browsers will throw an exception trying to access it - retry = request.getResponseHeader('Retry-After'); - retry = parseInt(retry, 10) * 1000; // Retry-After is returned in seconds - } catch (e) { - /* eslint no-empty:0 */ - } - - this._backoffDuration = retry - ? // If Sentry server returned a Retry-After value, use it - retry - : // Otherwise, double the last backoff duration (starts at 1 sec) - this._backoffDuration * 2 || 1000; - - this._backoffStart = now(); - }, - - _send: function(data) { - var globalOptions = this._globalOptions; - - var baseData = { - project: this._globalProject, - logger: globalOptions.logger, - platform: 'javascript' - }, - httpData = this._getHttpData(); - - if (httpData) { - baseData.request = httpData; - } - - // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload - if (data.trimHeadFrames) delete data.trimHeadFrames; - - data = objectMerge(baseData, data); - - // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge - data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags); - data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra); - - // Send along our own collected metadata with extra - data.extra['session:duration'] = now() - this._startTime; - - if (this._breadcrumbs && this._breadcrumbs.length > 0) { - // intentionally make shallow copy so that additions - // to breadcrumbs aren't accidentally sent in this request - data.breadcrumbs = { - values: [].slice.call(this._breadcrumbs, 0) - }; - } - - // If there are no tags/extra, strip the key from the payload alltogther. - if (isEmptyObject(data.tags)) delete data.tags; - - if (this._globalContext.user) { - // sentry.interfaces.User - data.user = this._globalContext.user; - } - - // Include the environment if it's defined in globalOptions - if (globalOptions.environment) data.environment = globalOptions.environment; - - // Include the release if it's defined in globalOptions - if (globalOptions.release) data.release = globalOptions.release; - - // Include server_name if it's defined in globalOptions - if (globalOptions.serverName) data.server_name = globalOptions.serverName; - - if (isFunction(globalOptions.dataCallback)) { - data = globalOptions.dataCallback(data) || data; - } - - // Why?????????? - if (!data || isEmptyObject(data)) { - return; - } - - // Check if the request should be filtered or not - if ( - isFunction(globalOptions.shouldSendCallback) && - !globalOptions.shouldSendCallback(data) - ) { - return; - } - - // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests), - // so drop requests until "cool-off" period has elapsed. - if (this._shouldBackoff()) { - this._logDebug('warn', 'Raven dropped error due to backoff: ', data); - return; - } - - if (typeof globalOptions.sampleRate === 'number') { - if (Math.random() < globalOptions.sampleRate) { - this._sendProcessedPayload(data); - } - } else { - this._sendProcessedPayload(data); - } - }, - - _getUuid: function() { - return uuid4(); - }, - - _sendProcessedPayload: function(data, callback) { - var self = this; - var globalOptions = this._globalOptions; - - if (!this.isSetup()) return; - - // Try and clean up the packet before sending by truncating long values - data = this._trimPacket(data); - - // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback, - // but this would require copying an un-truncated copy of the data packet, which can be - // arbitrarily deep (extra_data) -- could be worthwhile? will revisit - if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) { - this._logDebug('warn', 'Raven dropped repeat event: ', data); - return; - } - - // Send along an event_id if not explicitly passed. - // This event_id can be used to reference the error within Sentry itself. - // Set lastEventId after we know the error should actually be sent - this._lastEventId = data.event_id || (data.event_id = this._getUuid()); - - // Store outbound payload after trim - this._lastData = data; - - this._logDebug('debug', 'Raven about to send:', data); - - var auth = { - sentry_version: '7', - sentry_client: 'raven-js/' + this.VERSION, - sentry_key: this._globalKey - }; - - if (this._globalSecret) { - auth.sentry_secret = this._globalSecret; - } - - var exception = data.exception && data.exception.values[0]; - this.captureBreadcrumb({ - category: 'sentry', - message: exception - ? (exception.type ? exception.type + ': ' : '') + exception.value - : data.message, - event_id: data.event_id, - level: data.level || 'error' // presume error unless specified - }); - - var url = this._globalEndpoint; - (globalOptions.transport || this._makeRequest).call(this, { - url: url, - auth: auth, - data: data, - options: globalOptions, - onSuccess: function success() { - self._resetBackoff(); - - self._triggerEvent('success', { - data: data, - src: url - }); - callback && callback(); - }, - onError: function failure(error) { - self._logDebug('error', 'Raven transport failed to send: ', error); - - if (error.request) { - self._setBackoffState(error.request); - } - - self._triggerEvent('failure', { - data: data, - src: url - }); - error = error || new Error('Raven send failed (no additional details provided)'); - callback && callback(error); - } - }); - }, - - _makeRequest: function(opts) { - var request = _window.XMLHttpRequest && new _window.XMLHttpRequest(); - if (!request) return; - - // if browser doesn't support CORS (e.g. IE7), we are out of luck - var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined'; - - if (!hasCORS) return; - - var url = opts.url; - - if ('withCredentials' in request) { - request.onreadystatechange = function() { - if (request.readyState !== 4) { - return; - } else if (request.status === 200) { - opts.onSuccess && opts.onSuccess(); - } else if (opts.onError) { - var err = new Error('Sentry error code: ' + request.status); - err.request = request; - opts.onError(err); - } - }; - } else { - request = new XDomainRequest(); - // xdomainrequest cannot go http -> https (or vice versa), - // so always use protocol relative - url = url.replace(/^https?:/, ''); - - // onreadystatechange not supported by XDomainRequest - if (opts.onSuccess) { - request.onload = opts.onSuccess; - } - if (opts.onError) { - request.onerror = function() { - var err = new Error('Sentry error code: XDomainRequest'); - err.request = request; - opts.onError(err); - }; - } - } - - // NOTE: auth is intentionally sent as part of query string (NOT as custom - // HTTP header) so as to avoid preflight CORS requests - request.open('POST', url + '?' + urlencode(opts.auth)); - request.send(stringify(opts.data)); - }, - - _logDebug: function(level) { - if (this._originalConsoleMethods[level] && this.debug) { - // In IE<10 console methods do not have their own 'apply' method - Function.prototype.apply.call( - this._originalConsoleMethods[level], - this._originalConsole, - [].slice.call(arguments, 1) - ); - } - }, - - _mergeContext: function(key, context) { - if (isUndefined(context)) { - delete this._globalContext[key]; - } else { - this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context); - } - } -}; - -// Deprecations -Raven.prototype.setUser = Raven.prototype.setUserContext; -Raven.prototype.setReleaseContext = Raven.prototype.setRelease; - -module.exports = Raven; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/singleton.js": -/*!************************************************!*\ - !*** ./node_modules/raven-js/src/singleton.js ***! - \************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/** - * Enforces a single instance of the Raven client, and the - * main entry point for Raven. If you are a consumer of the - * Raven library, you SHOULD load this file (vs raven.js). - **/ - -var RavenConstructor = __webpack_require__(/*! ./raven */ "./node_modules/raven-js/src/raven.js"); - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; -var _Raven = _window.Raven; - -var Raven = new RavenConstructor(); - -/* - * Allow multiple versions of Raven to be installed. - * Strip Raven from the global context and returns the instance. - * - * @return {Raven} - */ -Raven.noConflict = function() { - _window.Raven = _Raven; - return Raven; -}; - -Raven.afterLoad(); - -module.exports = Raven; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/utils.js": -/*!********************************************!*\ - !*** ./node_modules/raven-js/src/utils.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; - -function isObject(what) { - return typeof what === 'object' && what !== null; -} - -// Yanked from https://git.io/vS8DV re-used under CC0 -// with some tiny modifications -function isError(value) { - switch ({}.toString.call(value)) { - case '[object Error]': - return true; - case '[object Exception]': - return true; - case '[object DOMException]': - return true; - default: - return value instanceof Error; - } -} - -function isErrorEvent(value) { - return supportsErrorEvent() && {}.toString.call(value) === '[object ErrorEvent]'; -} - -function isUndefined(what) { - return what === void 0; -} - -function isFunction(what) { - return typeof what === 'function'; -} - -function isString(what) { - return Object.prototype.toString.call(what) === '[object String]'; -} - -function isEmptyObject(what) { - for (var _ in what) return false; // eslint-disable-line guard-for-in, no-unused-vars - return true; -} - -function supportsErrorEvent() { - try { - new ErrorEvent(''); // eslint-disable-line no-new - return true; - } catch (e) { - return false; - } -} - -function wrappedCallback(callback) { - function dataCallback(data, original) { - var normalizedData = callback(data) || data; - if (original) { - return original(normalizedData) || normalizedData; - } - return normalizedData; - } - - return dataCallback; -} - -function each(obj, callback) { - var i, j; - - if (isUndefined(obj.length)) { - for (i in obj) { - if (hasKey(obj, i)) { - callback.call(null, i, obj[i]); - } - } - } else { - j = obj.length; - if (j) { - for (i = 0; i < j; i++) { - callback.call(null, i, obj[i]); - } - } - } -} - -function objectMerge(obj1, obj2) { - if (!obj2) { - return obj1; - } - each(obj2, function(key, value) { - obj1[key] = value; - }); - return obj1; -} - -/** - * This function is only used for react-native. - * react-native freezes object that have already been sent over the - * js bridge. We need this function in order to check if the object is frozen. - * So it's ok that objectFrozen returns false if Object.isFrozen is not - * supported because it's not relevant for other "platforms". See related issue: - * https://github.com/getsentry/react-native-sentry/issues/57 - */ -function objectFrozen(obj) { - if (!Object.isFrozen) { - return false; - } - return Object.isFrozen(obj); -} - -function truncate(str, max) { - return !max || str.length <= max ? str : str.substr(0, max) + '\u2026'; -} - -/** - * hasKey, a better form of hasOwnProperty - * Example: hasKey(MainHostObject, property) === true/false - * - * @param {Object} host object to check property - * @param {string} key to check - */ -function hasKey(object, key) { - return Object.prototype.hasOwnProperty.call(object, key); -} - -function joinRegExp(patterns) { - // Combine an array of regular expressions and strings into one large regexp - // Be mad. - var sources = [], - i = 0, - len = patterns.length, - pattern; - - for (; i < len; i++) { - pattern = patterns[i]; - if (isString(pattern)) { - // If it's a string, we need to escape it - // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions - sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1')); - } else if (pattern && pattern.source) { - // If it's a regexp already, we want to extract the source - sources.push(pattern.source); - } - // Intentionally skip other cases - } - return new RegExp(sources.join('|'), 'i'); -} - -function urlencode(o) { - var pairs = []; - each(o, function(key, value) { - pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); - }); - return pairs.join('&'); -} - -// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B -// intentionally using regex and not href parsing trick because React Native and other -// environments where DOM might not be available -function parseUrl(url) { - var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); - if (!match) return {}; - - // coerce to undefined values to empty string so we don't get 'undefined' - var query = match[6] || ''; - var fragment = match[8] || ''; - return { - protocol: match[2], - host: match[4], - path: match[5], - relative: match[5] + query + fragment // everything minus origin - }; -} -function uuid4() { - var crypto = _window.crypto || _window.msCrypto; - - if (!isUndefined(crypto) && crypto.getRandomValues) { - // Use window.crypto API if available - // eslint-disable-next-line no-undef - var arr = new Uint16Array(8); - crypto.getRandomValues(arr); - - // set 4 in byte 7 - arr[3] = (arr[3] & 0xfff) | 0x4000; - // set 2 most significant bits of byte 9 to '10' - arr[4] = (arr[4] & 0x3fff) | 0x8000; - - var pad = function(num) { - var v = num.toString(16); - while (v.length < 4) { - v = '0' + v; - } - return v; - }; - - return ( - pad(arr[0]) + - pad(arr[1]) + - pad(arr[2]) + - pad(arr[3]) + - pad(arr[4]) + - pad(arr[5]) + - pad(arr[6]) + - pad(arr[7]) - ); - } else { - // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 - return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = (Math.random() * 16) | 0, - v = c === 'x' ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); - } -} - -/** - * Given a child DOM element, returns a query-selector statement describing that - * and its ancestors - * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz] - * @param elem - * @returns {string} - */ -function htmlTreeAsString(elem) { - /* eslint no-extra-parens:0*/ - var MAX_TRAVERSE_HEIGHT = 5, - MAX_OUTPUT_LEN = 80, - out = [], - height = 0, - len = 0, - separator = ' > ', - sepLength = separator.length, - nextStr; - - while (elem && height++ < MAX_TRAVERSE_HEIGHT) { - nextStr = htmlElementAsString(elem); - // bail out if - // - nextStr is the 'html' element - // - the length of the string that would be created exceeds MAX_OUTPUT_LEN - // (ignore this limit if we are on the first iteration) - if ( - nextStr === 'html' || - (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN) - ) { - break; - } - - out.push(nextStr); - - len += nextStr.length; - elem = elem.parentNode; - } - - return out.reverse().join(separator); -} - -/** - * Returns a simple, query-selector representation of a DOM element - * e.g. [HTMLElement] => input#foo.btn[name=baz] - * @param HTMLElement - * @returns {string} - */ -function htmlElementAsString(elem) { - var out = [], - className, - classes, - key, - attr, - i; - - if (!elem || !elem.tagName) { - return ''; - } - - out.push(elem.tagName.toLowerCase()); - if (elem.id) { - out.push('#' + elem.id); - } - - className = elem.className; - if (className && isString(className)) { - classes = className.split(/\s+/); - for (i = 0; i < classes.length; i++) { - out.push('.' + classes[i]); - } - } - var attrWhitelist = ['type', 'name', 'title', 'alt']; - for (i = 0; i < attrWhitelist.length; i++) { - key = attrWhitelist[i]; - attr = elem.getAttribute(key); - if (attr) { - out.push('[' + key + '="' + attr + '"]'); - } - } - return out.join(''); -} - -/** - * Returns true if either a OR b is truthy, but not both - */ -function isOnlyOneTruthy(a, b) { - return !!(!!a ^ !!b); -} - -/** - * Returns true if the two input exception interfaces have the same content - */ -function isSameException(ex1, ex2) { - if (isOnlyOneTruthy(ex1, ex2)) return false; - - ex1 = ex1.values[0]; - ex2 = ex2.values[0]; - - if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false; - - return isSameStacktrace(ex1.stacktrace, ex2.stacktrace); -} - -/** - * Returns true if the two input stack trace interfaces have the same content - */ -function isSameStacktrace(stack1, stack2) { - if (isOnlyOneTruthy(stack1, stack2)) return false; - - var frames1 = stack1.frames; - var frames2 = stack2.frames; - - // Exit early if frame count differs - if (frames1.length !== frames2.length) return false; - - // Iterate through every frame; bail out if anything differs - var a, b; - for (var i = 0; i < frames1.length; i++) { - a = frames1[i]; - b = frames2[i]; - if ( - a.filename !== b.filename || - a.lineno !== b.lineno || - a.colno !== b.colno || - a['function'] !== b['function'] - ) - return false; - } - return true; -} - -/** - * Polyfill a method - * @param obj object e.g. `document` - * @param name method name present on object e.g. `addEventListener` - * @param replacement replacement function - * @param track {optional} record instrumentation to an array - */ -function fill(obj, name, replacement, track) { - var orig = obj[name]; - obj[name] = replacement(orig); - if (track) { - track.push([obj, name, orig]); - } -} - -module.exports = { - isObject: isObject, - isError: isError, - isErrorEvent: isErrorEvent, - isUndefined: isUndefined, - isFunction: isFunction, - isString: isString, - isEmptyObject: isEmptyObject, - supportsErrorEvent: supportsErrorEvent, - wrappedCallback: wrappedCallback, - each: each, - objectMerge: objectMerge, - truncate: truncate, - objectFrozen: objectFrozen, - hasKey: hasKey, - joinRegExp: joinRegExp, - urlencode: urlencode, - uuid4: uuid4, - htmlTreeAsString: htmlTreeAsString, - htmlElementAsString: htmlElementAsString, - isSameException: isSameException, - isSameStacktrace: isSameStacktrace, - parseUrl: parseUrl, - fill: fill -}; - - -/***/ }), - -/***/ "./node_modules/raven-js/vendor/TraceKit/tracekit.js": -/*!***********************************************************!*\ - !*** ./node_modules/raven-js/vendor/TraceKit/tracekit.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var utils = __webpack_require__(/*! ../../src/utils */ "./node_modules/raven-js/src/utils.js"); - -/* - TraceKit - Cross brower stack traces - - This was originally forked from github.com/occ/TraceKit, but has since been - largely re-written and is now maintained as part of raven-js. Tests for - this are in test/vendor. - - MIT license -*/ - -var TraceKit = { - collectWindowErrors: true, - debug: false -}; - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; - -// global reference to slice -var _slice = [].slice; -var UNKNOWN_FUNCTION = '?'; - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types -var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/; - -function getLocationHref() { - if (typeof document === 'undefined' || document.location == null) return ''; - - return document.location.href; -} - -/** - * TraceKit.report: cross-browser processing of unhandled exceptions - * - * Syntax: - * TraceKit.report.subscribe(function(stackInfo) { ... }) - * TraceKit.report.unsubscribe(function(stackInfo) { ... }) - * TraceKit.report(exception) - * try { ...code... } catch(ex) { TraceKit.report(ex); } - * - * Supports: - * - Firefox: full stack trace with line numbers, plus column number - * on top frame; column number is not guaranteed - * - Opera: full stack trace with line and column numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - IE: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - * In theory, TraceKit should work on all of the following versions: - * - IE5.5+ (only 8.0 tested) - * - Firefox 0.9+ (only 3.5+ tested) - * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require - * Exceptions Have Stacktrace to be enabled in opera:config) - * - Safari 3+ (only 4+ tested) - * - Chrome 1+ (only 5+ tested) - * - Konqueror 3.5+ (untested) - * - * Requires TraceKit.computeStackTrace. - * - * Tries to catch all unhandled exceptions and report them to the - * subscribed handlers. Please note that TraceKit.report will rethrow the - * exception. This is REQUIRED in order to get a useful stack trace in IE. - * If the exception does not reach the top of the browser, you will only - * get a stack trace from the point where TraceKit.report was called. - * - * Handlers receive a stackInfo object as described in the - * TraceKit.computeStackTrace docs. - */ -TraceKit.report = (function reportModuleWrapper() { - var handlers = [], - lastArgs = null, - lastException = null, - lastExceptionStack = null; - - /** - * Add a crash handler. - * @param {Function} handler - */ - function subscribe(handler) { - installGlobalHandler(); - handlers.push(handler); - } - - /** - * Remove a crash handler. - * @param {Function} handler - */ - function unsubscribe(handler) { - for (var i = handlers.length - 1; i >= 0; --i) { - if (handlers[i] === handler) { - handlers.splice(i, 1); - } - } - } - - /** - * Remove all crash handlers. - */ - function unsubscribeAll() { - uninstallGlobalHandler(); - handlers = []; - } - - /** - * Dispatch stack information to all handlers. - * @param {Object.} stack - */ - function notifyHandlers(stack, isWindowError) { - var exception = null; - if (isWindowError && !TraceKit.collectWindowErrors) { - return; - } - for (var i in handlers) { - if (handlers.hasOwnProperty(i)) { - try { - handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); - } catch (inner) { - exception = inner; - } - } - } - - if (exception) { - throw exception; - } - } - - var _oldOnerrorHandler, _onErrorHandlerInstalled; - - /** - * Ensures all global unhandled exceptions are recorded. - * Supported by Gecko and IE. - * @param {string} message Error message. - * @param {string} url URL of script that generated the exception. - * @param {(number|string)} lineNo The line number at which the error - * occurred. - * @param {?(number|string)} colNo The column number at which the error - * occurred. - * @param {?Error} ex The actual Error object. - */ - function traceKitWindowOnError(message, url, lineNo, colNo, ex) { - var stack = null; - - if (lastExceptionStack) { - TraceKit.computeStackTrace.augmentStackTraceWithInitialElement( - lastExceptionStack, - url, - lineNo, - message - ); - processLastException(); - } else if (ex && utils.isError(ex)) { - // non-string `ex` arg; attempt to extract stack trace - - // New chrome and blink send along a real error object - // Let's just report that like a normal error. - // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror - stack = TraceKit.computeStackTrace(ex); - notifyHandlers(stack, true); - } else { - var location = { - url: url, - line: lineNo, - column: colNo - }; - - var name = undefined; - var msg = message; // must be new var or will modify original `arguments` - var groups; - if ({}.toString.call(message) === '[object String]') { - var groups = message.match(ERROR_TYPES_RE); - if (groups) { - name = groups[1]; - msg = groups[2]; - } - } - - location.func = UNKNOWN_FUNCTION; - - stack = { - name: name, - message: msg, - url: getLocationHref(), - stack: [location] - }; - notifyHandlers(stack, true); - } - - if (_oldOnerrorHandler) { - return _oldOnerrorHandler.apply(this, arguments); - } - - return false; - } - - function installGlobalHandler() { - if (_onErrorHandlerInstalled) { - return; - } - _oldOnerrorHandler = _window.onerror; - _window.onerror = traceKitWindowOnError; - _onErrorHandlerInstalled = true; - } - - function uninstallGlobalHandler() { - if (!_onErrorHandlerInstalled) { - return; - } - _window.onerror = _oldOnerrorHandler; - _onErrorHandlerInstalled = false; - _oldOnerrorHandler = undefined; - } - - function processLastException() { - var _lastExceptionStack = lastExceptionStack, - _lastArgs = lastArgs; - lastArgs = null; - lastExceptionStack = null; - lastException = null; - notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs)); - } - - /** - * Reports an unhandled Error to TraceKit. - * @param {Error} ex - * @param {?boolean} rethrow If false, do not re-throw the exception. - * Only used for window.onerror to not cause an infinite loop of - * rethrowing. - */ - function report(ex, rethrow) { - var args = _slice.call(arguments, 1); - if (lastExceptionStack) { - if (lastException === ex) { - return; // already caught by an inner catch block, ignore - } else { - processLastException(); - } - } - - var stack = TraceKit.computeStackTrace(ex); - lastExceptionStack = stack; - lastException = ex; - lastArgs = args; - - // If the stack trace is incomplete, wait for 2 seconds for - // slow slow IE to see if onerror occurs or not before reporting - // this exception; otherwise, we will end up with an incomplete - // stack trace - setTimeout(function() { - if (lastException === ex) { - processLastException(); - } - }, stack.incomplete ? 2000 : 0); - - if (rethrow !== false) { - throw ex; // re-throw to propagate to the top level (and cause window.onerror) - } - } - - report.subscribe = subscribe; - report.unsubscribe = unsubscribe; - report.uninstall = unsubscribeAll; - return report; -})(); - -/** - * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript - * - * Syntax: - * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below) - * Returns: - * s.name - exception name - * s.message - exception message - * s.stack[i].url - JavaScript or HTML file URL - * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work) - * s.stack[i].args - arguments passed to the function, if known - * s.stack[i].line - line number, if known - * s.stack[i].column - column number, if known - * - * Supports: - * - Firefox: full stack trace with line numbers and unreliable column - * number on top frame - * - Opera 10: full stack trace with line and column numbers - * - Opera 9-: full stack trace with line numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the topmost stacktrace element - * only - * - IE: no line numbers whatsoever - * - * Tries to guess names of anonymous functions by looking for assignments - * in the source code. In IE and Safari, we have to guess source file names - * by searching for function bodies inside all page scripts. This will not - * work for scripts that are loaded cross-domain. - * Here be dragons: some function names may be guessed incorrectly, and - * duplicate functions may be mismatched. - * - * TraceKit.computeStackTrace should only be used for tracing purposes. - * Logging of unhandled exceptions should be done with TraceKit.report, - * which builds on top of TraceKit.computeStackTrace and provides better - * IE support by utilizing the window.onerror event to retrieve information - * about the top of the stack. - * - * Note: In IE and Safari, no stack trace is recorded on the Error object, - * so computeStackTrace instead walks its *own* chain of callers. - * This means that: - * * in Safari, some methods may be missing from the stack trace; - * * in IE, the topmost function in the stack trace will always be the - * caller of computeStackTrace. - * - * This is okay for tracing (because you are likely to be calling - * computeStackTrace from the function you want to be the topmost element - * of the stack trace anyway), but not okay for logging unhandled - * exceptions (because your catch block will likely be far away from the - * inner function that actually caused the exception). - * - */ -TraceKit.computeStackTrace = (function computeStackTraceWrapper() { - // Contents of Exception in various browsers. - // - // SAFARI: - // ex.message = Can't find variable: qq - // ex.line = 59 - // ex.sourceId = 580238192 - // ex.sourceURL = http://... - // ex.expressionBeginOffset = 96 - // ex.expressionCaretOffset = 98 - // ex.expressionEndOffset = 98 - // ex.name = ReferenceError - // - // FIREFOX: - // ex.message = qq is not defined - // ex.fileName = http://... - // ex.lineNumber = 59 - // ex.columnNumber = 69 - // ex.stack = ...stack trace... (see the example below) - // ex.name = ReferenceError - // - // CHROME: - // ex.message = qq is not defined - // ex.name = ReferenceError - // ex.type = not_defined - // ex.arguments = ['aa'] - // ex.stack = ...stack trace... - // - // INTERNET EXPLORER: - // ex.message = ... - // ex.name = ReferenceError - // - // OPERA: - // ex.message = ...message... (see the example below) - // ex.name = ReferenceError - // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message) - // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace' - - /** - * Computes stack trace information from the stack property. - * Chrome and Gecko use this property. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceFromStackProp(ex) { - if (typeof ex.stack === 'undefined' || !ex.stack) return; - - var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i, - gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i, - winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i, - // Used to additionally parse URL/line/column from eval frames - geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i, - chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/, - lines = ex.stack.split('\n'), - stack = [], - submatch, - parts, - element, - reference = /^(.*) is undefined$/.exec(ex.message); - - for (var i = 0, j = lines.length; i < j; ++i) { - if ((parts = chrome.exec(lines[i]))) { - var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line - var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line - if (isEval && (submatch = chromeEval.exec(parts[2]))) { - // throw out eval line/column and use top-most line/column number - parts[2] = submatch[1]; // url - parts[3] = submatch[2]; // line - parts[4] = submatch[3]; // column - } - element = { - url: !isNative ? parts[2] : null, - func: parts[1] || UNKNOWN_FUNCTION, - args: isNative ? [parts[2]] : [], - line: parts[3] ? +parts[3] : null, - column: parts[4] ? +parts[4] : null - }; - } else if ((parts = winjs.exec(lines[i]))) { - element = { - url: parts[2], - func: parts[1] || UNKNOWN_FUNCTION, - args: [], - line: +parts[3], - column: parts[4] ? +parts[4] : null - }; - } else if ((parts = gecko.exec(lines[i]))) { - var isEval = parts[3] && parts[3].indexOf(' > eval') > -1; - if (isEval && (submatch = geckoEval.exec(parts[3]))) { - // throw out eval line/column and use top-most line number - parts[3] = submatch[1]; - parts[4] = submatch[2]; - parts[5] = null; // no column when eval - } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') { - // FireFox uses this awesome columnNumber property for its top frame - // Also note, Firefox's column number is 0-based and everything else expects 1-based, - // so adding 1 - // NOTE: this hack doesn't work if top-most frame is eval - stack[0].column = ex.columnNumber + 1; - } - element = { - url: parts[3], - func: parts[1] || UNKNOWN_FUNCTION, - args: parts[2] ? parts[2].split(',') : [], - line: parts[4] ? +parts[4] : null, - column: parts[5] ? +parts[5] : null - }; - } else { - continue; - } - - if (!element.func && element.line) { - element.func = UNKNOWN_FUNCTION; - } - - stack.push(element); - } - - if (!stack.length) { - return null; - } - - return { - name: ex.name, - message: ex.message, - url: getLocationHref(), - stack: stack - }; - } - - /** - * Adds information about the first frame to incomplete stack traces. - * Safari and IE require this to get complete data on the first frame. - * @param {Object.} stackInfo Stack trace information from - * one of the compute* methods. - * @param {string} url The URL of the script that caused an error. - * @param {(number|string)} lineNo The line number of the script that - * caused an error. - * @param {string=} message The error generated by the browser, which - * hopefully contains the name of the object that caused the error. - * @return {boolean} Whether or not the stack information was - * augmented. - */ - function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) { - var initial = { - url: url, - line: lineNo - }; - - if (initial.url && initial.line) { - stackInfo.incomplete = false; - - if (!initial.func) { - initial.func = UNKNOWN_FUNCTION; - } - - if (stackInfo.stack.length > 0) { - if (stackInfo.stack[0].url === initial.url) { - if (stackInfo.stack[0].line === initial.line) { - return false; // already in stack trace - } else if ( - !stackInfo.stack[0].line && - stackInfo.stack[0].func === initial.func - ) { - stackInfo.stack[0].line = initial.line; - return false; - } - } - } - - stackInfo.stack.unshift(initial); - stackInfo.partial = true; - return true; - } else { - stackInfo.incomplete = true; - } - - return false; - } - - /** - * Computes stack trace information by walking the arguments.caller - * chain at the time the exception occurred. This will cause earlier - * frames to be missed but is the only way to get any stack trace in - * Safari and IE. The top frame is restored by - * {@link augmentStackTraceWithInitialElement}. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceByWalkingCallerChain(ex, depth) { - var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i, - stack = [], - funcs = {}, - recursion = false, - parts, - item, - source; - - for ( - var curr = computeStackTraceByWalkingCallerChain.caller; - curr && !recursion; - curr = curr.caller - ) { - if (curr === computeStackTrace || curr === TraceKit.report) { - // console.log('skipping internal function'); - continue; - } - - item = { - url: null, - func: UNKNOWN_FUNCTION, - line: null, - column: null - }; - - if (curr.name) { - item.func = curr.name; - } else if ((parts = functionName.exec(curr.toString()))) { - item.func = parts[1]; - } - - if (typeof item.func === 'undefined') { - try { - item.func = parts.input.substring(0, parts.input.indexOf('{')); - } catch (e) {} - } - - if (funcs['' + curr]) { - recursion = true; - } else { - funcs['' + curr] = true; - } - - stack.push(item); - } - - if (depth) { - // console.log('depth is ' + depth); - // console.log('stack is ' + stack.length); - stack.splice(0, depth); - } - - var result = { - name: ex.name, - message: ex.message, - url: getLocationHref(), - stack: stack - }; - augmentStackTraceWithInitialElement( - result, - ex.sourceURL || ex.fileName, - ex.line || ex.lineNumber, - ex.message || ex.description - ); - return result; - } - - /** - * Computes a stack trace for an exception. - * @param {Error} ex - * @param {(string|number)=} depth - */ - function computeStackTrace(ex, depth) { - var stack = null; - depth = depth == null ? 0 : +depth; - - try { - stack = computeStackTraceFromStackProp(ex); - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - - try { - stack = computeStackTraceByWalkingCallerChain(ex, depth + 1); - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - return { - name: ex.name, - message: ex.message, - url: getLocationHref() - }; - } - - computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement; - computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp; - - return computeStackTrace; -})(); - -module.exports = TraceKit; - - -/***/ }), - -/***/ "./node_modules/raven-js/vendor/json-stringify-safe/stringify.js": -/*!***********************************************************************!*\ - !*** ./node_modules/raven-js/vendor/json-stringify-safe/stringify.js ***! - \***********************************************************************/ -/***/ ((module, exports) => { - -/* - json-stringify-safe - Like JSON.stringify, but doesn't throw on circular references. - - Originally forked from https://github.com/isaacs/json-stringify-safe - version 5.0.1 on 3/8/2017 and modified to handle Errors serialization - and IE8 compatibility. Tests for this are in test/vendor. - - ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE -*/ - -exports = module.exports = stringify; -exports.getSerialize = serializer; - -function indexOf(haystack, needle) { - for (var i = 0; i < haystack.length; ++i) { - if (haystack[i] === needle) return i; - } - return -1; -} - -function stringify(obj, replacer, spaces, cycleReplacer) { - return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces); -} - -// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106 -function stringifyError(value) { - var err = { - // These properties are implemented as magical getters and don't show up in for in - stack: value.stack, - message: value.message, - name: value.name - }; - - for (var i in value) { - if (Object.prototype.hasOwnProperty.call(value, i)) { - err[i] = value[i]; - } - } - - return err; -} - -function serializer(replacer, cycleReplacer) { - var stack = []; - var keys = []; - - if (cycleReplacer == null) { - cycleReplacer = function(key, value) { - if (stack[0] === value) { - return '[Circular ~]'; - } - return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']'; - }; - } - - return function(key, value) { - if (stack.length > 0) { - var thisPos = indexOf(stack, this); - ~thisPos ? stack.splice(thisPos + 1) : stack.push(this); - ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key); - - if (~indexOf(stack, value)) { - value = cycleReplacer.call(this, key, value); - } - } else { - stack.push(value); - } - - return replacer == null - ? value instanceof Error ? stringifyError(value) : value - : replacer.call(this, key, value); - }; -} - - -/***/ }), - -/***/ "./node_modules/react-is/cjs/react-is.development.js": -/*!***********************************************************!*\ - !*** ./node_modules/react-is/cjs/react-is.development.js ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; -/** @license React v16.13.1 - * react-is.development.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - - - -if (true) { - (function() { -'use strict'; - -// The Symbol used to tag the ReactElement-like types. If there is no native Symbol -// nor polyfill, then a plain number is used for performance. -var hasSymbol = typeof Symbol === 'function' && Symbol.for; -var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; -var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; -var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; -var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; -var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; -var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; -var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary -// (unstable) APIs that have been removed. Can we remove the symbols? - -var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; -var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; -var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; -var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; -var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; -var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; -var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; -var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9; -var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; -var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; -var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; - -function isValidElementType(type) { - return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. - type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE); -} - -function typeOf(object) { - if (typeof object === 'object' && object !== null) { - var $$typeof = object.$$typeof; - - switch ($$typeof) { - case REACT_ELEMENT_TYPE: - var type = object.type; - - switch (type) { - case REACT_ASYNC_MODE_TYPE: - case REACT_CONCURRENT_MODE_TYPE: - case REACT_FRAGMENT_TYPE: - case REACT_PROFILER_TYPE: - case REACT_STRICT_MODE_TYPE: - case REACT_SUSPENSE_TYPE: - return type; - - default: - var $$typeofType = type && type.$$typeof; - - switch ($$typeofType) { - case REACT_CONTEXT_TYPE: - case REACT_FORWARD_REF_TYPE: - case REACT_LAZY_TYPE: - case REACT_MEMO_TYPE: - case REACT_PROVIDER_TYPE: - return $$typeofType; - - default: - return $$typeof; - } - - } - - case REACT_PORTAL_TYPE: - return $$typeof; - } - } - - return undefined; -} // AsyncMode is deprecated along with isAsyncMode - -var AsyncMode = REACT_ASYNC_MODE_TYPE; -var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; -var ContextConsumer = REACT_CONTEXT_TYPE; -var ContextProvider = REACT_PROVIDER_TYPE; -var Element = REACT_ELEMENT_TYPE; -var ForwardRef = REACT_FORWARD_REF_TYPE; -var Fragment = REACT_FRAGMENT_TYPE; -var Lazy = REACT_LAZY_TYPE; -var Memo = REACT_MEMO_TYPE; -var Portal = REACT_PORTAL_TYPE; -var Profiler = REACT_PROFILER_TYPE; -var StrictMode = REACT_STRICT_MODE_TYPE; -var Suspense = REACT_SUSPENSE_TYPE; -var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated - -function isAsyncMode(object) { - { - if (!hasWarnedAboutDeprecatedIsAsyncMode) { - hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint - - console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.'); - } - } - - return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE; -} -function isConcurrentMode(object) { - return typeOf(object) === REACT_CONCURRENT_MODE_TYPE; -} -function isContextConsumer(object) { - return typeOf(object) === REACT_CONTEXT_TYPE; -} -function isContextProvider(object) { - return typeOf(object) === REACT_PROVIDER_TYPE; -} -function isElement(object) { - return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; -} -function isForwardRef(object) { - return typeOf(object) === REACT_FORWARD_REF_TYPE; -} -function isFragment(object) { - return typeOf(object) === REACT_FRAGMENT_TYPE; -} -function isLazy(object) { - return typeOf(object) === REACT_LAZY_TYPE; -} -function isMemo(object) { - return typeOf(object) === REACT_MEMO_TYPE; -} -function isPortal(object) { - return typeOf(object) === REACT_PORTAL_TYPE; -} -function isProfiler(object) { - return typeOf(object) === REACT_PROFILER_TYPE; -} -function isStrictMode(object) { - return typeOf(object) === REACT_STRICT_MODE_TYPE; -} -function isSuspense(object) { - return typeOf(object) === REACT_SUSPENSE_TYPE; -} - -exports.AsyncMode = AsyncMode; -exports.ConcurrentMode = ConcurrentMode; -exports.ContextConsumer = ContextConsumer; -exports.ContextProvider = ContextProvider; -exports.Element = Element; -exports.ForwardRef = ForwardRef; -exports.Fragment = Fragment; -exports.Lazy = Lazy; -exports.Memo = Memo; -exports.Portal = Portal; -exports.Profiler = Profiler; -exports.StrictMode = StrictMode; -exports.Suspense = Suspense; -exports.isAsyncMode = isAsyncMode; -exports.isConcurrentMode = isConcurrentMode; -exports.isContextConsumer = isContextConsumer; -exports.isContextProvider = isContextProvider; -exports.isElement = isElement; -exports.isForwardRef = isForwardRef; -exports.isFragment = isFragment; -exports.isLazy = isLazy; -exports.isMemo = isMemo; -exports.isPortal = isPortal; -exports.isProfiler = isProfiler; -exports.isStrictMode = isStrictMode; -exports.isSuspense = isSuspense; -exports.isValidElementType = isValidElementType; -exports.typeOf = typeOf; - })(); -} - - -/***/ }), - -/***/ "./node_modules/react-is/index.js": -/*!****************************************!*\ - !*** ./node_modules/react-is/index.js ***! - \****************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -if (false) {} else { - module.exports = __webpack_require__(/*! ./cjs/react-is.development.js */ "./node_modules/react-is/cjs/react-is.development.js"); -} - - -/***/ }), - -/***/ "./node_modules/react/cjs/react-jsx-runtime.development.js": -/*!*****************************************************************!*\ - !*** ./node_modules/react/cjs/react-jsx-runtime.development.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; -/** @license React v17.0.2 - * react-jsx-runtime.development.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - -if (true) { - (function() { -'use strict'; - -var React = __webpack_require__(/*! react */ "react"); -var _assign = __webpack_require__(/*! object-assign */ "./node_modules/object-assign/index.js"); - -// ATTENTION -// When adding new symbols to this file, -// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' -// The Symbol used to tag the ReactElement-like types. If there is no native Symbol -// nor polyfill, then a plain number is used for performance. -var REACT_ELEMENT_TYPE = 0xeac7; -var REACT_PORTAL_TYPE = 0xeaca; -exports.Fragment = 0xeacb; -var REACT_STRICT_MODE_TYPE = 0xeacc; -var REACT_PROFILER_TYPE = 0xead2; -var REACT_PROVIDER_TYPE = 0xeacd; -var REACT_CONTEXT_TYPE = 0xeace; -var REACT_FORWARD_REF_TYPE = 0xead0; -var REACT_SUSPENSE_TYPE = 0xead1; -var REACT_SUSPENSE_LIST_TYPE = 0xead8; -var REACT_MEMO_TYPE = 0xead3; -var REACT_LAZY_TYPE = 0xead4; -var REACT_BLOCK_TYPE = 0xead9; -var REACT_SERVER_BLOCK_TYPE = 0xeada; -var REACT_FUNDAMENTAL_TYPE = 0xead5; -var REACT_SCOPE_TYPE = 0xead7; -var REACT_OPAQUE_ID_TYPE = 0xeae0; -var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; -var REACT_OFFSCREEN_TYPE = 0xeae2; -var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; - -if (typeof Symbol === 'function' && Symbol.for) { - var symbolFor = Symbol.for; - REACT_ELEMENT_TYPE = symbolFor('react.element'); - REACT_PORTAL_TYPE = symbolFor('react.portal'); - exports.Fragment = symbolFor('react.fragment'); - REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode'); - REACT_PROFILER_TYPE = symbolFor('react.profiler'); - REACT_PROVIDER_TYPE = symbolFor('react.provider'); - REACT_CONTEXT_TYPE = symbolFor('react.context'); - REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref'); - REACT_SUSPENSE_TYPE = symbolFor('react.suspense'); - REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list'); - REACT_MEMO_TYPE = symbolFor('react.memo'); - REACT_LAZY_TYPE = symbolFor('react.lazy'); - REACT_BLOCK_TYPE = symbolFor('react.block'); - REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block'); - REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental'); - REACT_SCOPE_TYPE = symbolFor('react.scope'); - REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id'); - REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode'); - REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen'); - REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden'); -} - -var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; -var FAUX_ITERATOR_SYMBOL = '@@iterator'; -function getIteratorFn(maybeIterable) { - if (maybeIterable === null || typeof maybeIterable !== 'object') { - return null; - } - - var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; - - if (typeof maybeIterator === 'function') { - return maybeIterator; - } - - return null; -} - -var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; - -function error(format) { - { - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; - } - - printWarning('error', format, args); - } -} - -function printWarning(level, format, args) { - // When changing this logic, you might want to also - // update consoleWithStackDev.www.js as well. - { - var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - var stack = ReactDebugCurrentFrame.getStackAddendum(); - - if (stack !== '') { - format += '%s'; - args = args.concat([stack]); - } - - var argsWithFormat = args.map(function (item) { - return '' + item; - }); // Careful: RN currently depends on this prefix - - argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it - // breaks IE9: https://github.com/facebook/react/issues/13610 - // eslint-disable-next-line react-internal/no-production-logging - - Function.prototype.apply.call(console[level], console, argsWithFormat); - } -} - -// Filter certain DOM attributes (e.g. src, href) if their values are empty strings. - -var enableScopeAPI = false; // Experimental Create Event Handle API. - -function isValidElementType(type) { - if (typeof type === 'string' || typeof type === 'function') { - return true; - } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). - - - if (type === exports.Fragment || type === REACT_PROFILER_TYPE || type === REACT_DEBUG_TRACING_MODE_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) { - return true; - } - - if (typeof type === 'object' && type !== null) { - if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) { - return true; - } - } - - return false; -} - -function getWrappedName(outerType, innerType, wrapperName) { - var functionName = innerType.displayName || innerType.name || ''; - return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); -} - -function getContextName(type) { - return type.displayName || 'Context'; -} - -function getComponentName(type) { - if (type == null) { - // Host root, text node or just invalid type. - return null; - } - - { - if (typeof type.tag === 'number') { - error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); - } - } - - if (typeof type === 'function') { - return type.displayName || type.name || null; - } - - if (typeof type === 'string') { - return type; - } - - switch (type) { - case exports.Fragment: - return 'Fragment'; - - case REACT_PORTAL_TYPE: - return 'Portal'; - - case REACT_PROFILER_TYPE: - return 'Profiler'; - - case REACT_STRICT_MODE_TYPE: - return 'StrictMode'; - - case REACT_SUSPENSE_TYPE: - return 'Suspense'; - - case REACT_SUSPENSE_LIST_TYPE: - return 'SuspenseList'; - } - - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_CONTEXT_TYPE: - var context = type; - return getContextName(context) + '.Consumer'; - - case REACT_PROVIDER_TYPE: - var provider = type; - return getContextName(provider._context) + '.Provider'; - - case REACT_FORWARD_REF_TYPE: - return getWrappedName(type, type.render, 'ForwardRef'); - - case REACT_MEMO_TYPE: - return getComponentName(type.type); - - case REACT_BLOCK_TYPE: - return getComponentName(type._render); - - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - - try { - return getComponentName(init(payload)); - } catch (x) { - return null; - } - } - } - } - - return null; -} - -// Helpers to patch console.logs to avoid logging during side-effect free -// replaying on render function. This currently only patches the object -// lazily which won't cover if the log function was extracted eagerly. -// We could also eagerly patch the method. -var disabledDepth = 0; -var prevLog; -var prevInfo; -var prevWarn; -var prevError; -var prevGroup; -var prevGroupCollapsed; -var prevGroupEnd; - -function disabledLog() {} - -disabledLog.__reactDisabledLog = true; -function disableLogs() { - { - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - prevLog = console.log; - prevInfo = console.info; - prevWarn = console.warn; - prevError = console.error; - prevGroup = console.group; - prevGroupCollapsed = console.groupCollapsed; - prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 - - var props = { - configurable: true, - enumerable: true, - value: disabledLog, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. - - Object.defineProperties(console, { - info: props, - log: props, - warn: props, - error: props, - group: props, - groupCollapsed: props, - groupEnd: props - }); - /* eslint-enable react-internal/no-production-logging */ - } - - disabledDepth++; - } -} -function reenableLogs() { - { - disabledDepth--; - - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - var props = { - configurable: true, - enumerable: true, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. - - Object.defineProperties(console, { - log: _assign({}, props, { - value: prevLog - }), - info: _assign({}, props, { - value: prevInfo - }), - warn: _assign({}, props, { - value: prevWarn - }), - error: _assign({}, props, { - value: prevError - }), - group: _assign({}, props, { - value: prevGroup - }), - groupCollapsed: _assign({}, props, { - value: prevGroupCollapsed - }), - groupEnd: _assign({}, props, { - value: prevGroupEnd - }) - }); - /* eslint-enable react-internal/no-production-logging */ - } - - if (disabledDepth < 0) { - error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); - } - } -} - -var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; -var prefix; -function describeBuiltInComponentFrame(name, source, ownerFn) { - { - if (prefix === undefined) { - // Extract the VM specific prefix used by each line. - try { - throw Error(); - } catch (x) { - var match = x.stack.trim().match(/\n( *(at )?)/); - prefix = match && match[1] || ''; - } - } // We use the prefix to ensure our stacks line up with native stack frames. - - - return '\n' + prefix + name; - } -} -var reentry = false; -var componentFrameCache; - -{ - var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; - componentFrameCache = new PossiblyWeakMap(); -} - -function describeNativeComponentFrame(fn, construct) { - // If something asked for a stack inside a fake render, it should get ignored. - if (!fn || reentry) { - return ''; - } - - { - var frame = componentFrameCache.get(fn); - - if (frame !== undefined) { - return frame; - } - } - - var control; - reentry = true; - var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. - - Error.prepareStackTrace = undefined; - var previousDispatcher; - - { - previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function - // for warnings. - - ReactCurrentDispatcher.current = null; - disableLogs(); - } - - try { - // This should throw. - if (construct) { - // Something should be setting the props in the constructor. - var Fake = function () { - throw Error(); - }; // $FlowFixMe - - - Object.defineProperty(Fake.prototype, 'props', { - set: function () { - // We use a throwing setter instead of frozen or non-writable props - // because that won't throw in a non-strict mode function. - throw Error(); - } - }); - - if (typeof Reflect === 'object' && Reflect.construct) { - // We construct a different control for this case to include any extra - // frames added by the construct call. - try { - Reflect.construct(Fake, []); - } catch (x) { - control = x; - } - - Reflect.construct(fn, [], Fake); - } else { - try { - Fake.call(); - } catch (x) { - control = x; - } - - fn.call(Fake.prototype); - } - } else { - try { - throw Error(); - } catch (x) { - control = x; - } - - fn(); - } - } catch (sample) { - // This is inlined manually because closure doesn't do it for us. - if (sample && control && typeof sample.stack === 'string') { - // This extracts the first frame from the sample that isn't also in the control. - // Skipping one frame that we assume is the frame that calls the two. - var sampleLines = sample.stack.split('\n'); - var controlLines = control.stack.split('\n'); - var s = sampleLines.length - 1; - var c = controlLines.length - 1; - - while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { - // We expect at least one stack frame to be shared. - // Typically this will be the root most one. However, stack frames may be - // cut off due to maximum stack limits. In this case, one maybe cut off - // earlier than the other. We assume that the sample is longer or the same - // and there for cut off earlier. So we should find the root most frame in - // the sample somewhere in the control. - c--; - } - - for (; s >= 1 && c >= 0; s--, c--) { - // Next we find the first one that isn't the same which should be the - // frame that called our sample function and the control. - if (sampleLines[s] !== controlLines[c]) { - // In V8, the first line is describing the message but other VMs don't. - // If we're about to return the first line, and the control is also on the same - // line, that's a pretty good indicator that our sample threw at same line as - // the control. I.e. before we entered the sample frame. So we ignore this result. - // This can happen if you passed a class to function component, or non-function. - if (s !== 1 || c !== 1) { - do { - s--; - c--; // We may still have similar intermediate frames from the construct call. - // The next one that isn't the same should be our match though. - - if (c < 0 || sampleLines[s] !== controlLines[c]) { - // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. - var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); - - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, _frame); - } - } // Return the line we found. - - - return _frame; - } - } while (s >= 1 && c >= 0); - } - - break; - } - } - } - } finally { - reentry = false; - - { - ReactCurrentDispatcher.current = previousDispatcher; - reenableLogs(); - } - - Error.prepareStackTrace = previousPrepareStackTrace; - } // Fallback to just using the name if we couldn't make it throw. - - - var name = fn ? fn.displayName || fn.name : ''; - var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; - - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, syntheticFrame); - } - } - - return syntheticFrame; -} -function describeFunctionComponentFrame(fn, source, ownerFn) { - { - return describeNativeComponentFrame(fn, false); - } -} - -function shouldConstruct(Component) { - var prototype = Component.prototype; - return !!(prototype && prototype.isReactComponent); -} - -function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { - - if (type == null) { - return ''; - } - - if (typeof type === 'function') { - { - return describeNativeComponentFrame(type, shouldConstruct(type)); - } - } - - if (typeof type === 'string') { - return describeBuiltInComponentFrame(type); - } - - switch (type) { - case REACT_SUSPENSE_TYPE: - return describeBuiltInComponentFrame('Suspense'); - - case REACT_SUSPENSE_LIST_TYPE: - return describeBuiltInComponentFrame('SuspenseList'); - } - - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_FORWARD_REF_TYPE: - return describeFunctionComponentFrame(type.render); - - case REACT_MEMO_TYPE: - // Memo may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); - - case REACT_BLOCK_TYPE: - return describeFunctionComponentFrame(type._render); - - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - - try { - // Lazy may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); - } catch (x) {} - } - } - } - - return ''; -} - -var loggedTypeFailures = {}; -var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - -function setCurrentlyValidatingElement(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - ReactDebugCurrentFrame.setExtraStackFrame(stack); - } else { - ReactDebugCurrentFrame.setExtraStackFrame(null); - } - } -} - -function checkPropTypes(typeSpecs, values, location, componentName, element) { - { - // $FlowFixMe This is okay but Flow doesn't know it. - var has = Function.call.bind(Object.prototype.hasOwnProperty); - - for (var typeSpecName in typeSpecs) { - if (has(typeSpecs, typeSpecName)) { - var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. - - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - if (typeof typeSpecs[typeSpecName] !== 'function') { - var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); - err.name = 'Invariant Violation'; - throw err; - } - - error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); - } catch (ex) { - error$1 = ex; - } - - if (error$1 && !(error$1 instanceof Error)) { - setCurrentlyValidatingElement(element); - - error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); - - setCurrentlyValidatingElement(null); - } - - if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error$1.message] = true; - setCurrentlyValidatingElement(element); - - error('Failed %s type: %s', location, error$1.message); - - setCurrentlyValidatingElement(null); - } - } - } - } -} - -var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var RESERVED_PROPS = { - key: true, - ref: true, - __self: true, - __source: true -}; -var specialPropKeyWarningShown; -var specialPropRefWarningShown; -var didWarnAboutStringRefs; - -{ - didWarnAboutStringRefs = {}; -} - -function hasValidRef(config) { - { - if (hasOwnProperty.call(config, 'ref')) { - var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; - - if (getter && getter.isReactWarning) { - return false; - } - } - } - - return config.ref !== undefined; -} - -function hasValidKey(config) { - { - if (hasOwnProperty.call(config, 'key')) { - var getter = Object.getOwnPropertyDescriptor(config, 'key').get; - - if (getter && getter.isReactWarning) { - return false; - } - } - } - - return config.key !== undefined; -} - -function warnIfStringRefCannotBeAutoConverted(config, self) { - { - if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) { - var componentName = getComponentName(ReactCurrentOwner.current.type); - - if (!didWarnAboutStringRefs[componentName]) { - error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref); - - didWarnAboutStringRefs[componentName] = true; - } - } - } -} - -function defineKeyPropWarningGetter(props, displayName) { - { - var warnAboutAccessingKey = function () { - if (!specialPropKeyWarningShown) { - specialPropKeyWarningShown = true; - - error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); - } - }; - - warnAboutAccessingKey.isReactWarning = true; - Object.defineProperty(props, 'key', { - get: warnAboutAccessingKey, - configurable: true - }); - } -} - -function defineRefPropWarningGetter(props, displayName) { - { - var warnAboutAccessingRef = function () { - if (!specialPropRefWarningShown) { - specialPropRefWarningShown = true; - - error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); - } - }; - - warnAboutAccessingRef.isReactWarning = true; - Object.defineProperty(props, 'ref', { - get: warnAboutAccessingRef, - configurable: true - }); - } -} -/** - * Factory method to create a new React element. This no longer adheres to - * the class pattern, so do not use new to call it. Also, instanceof check - * will not work. Instead test $$typeof field against Symbol.for('react.element') to check - * if something is a React Element. - * - * @param {*} type - * @param {*} props - * @param {*} key - * @param {string|object} ref - * @param {*} owner - * @param {*} self A *temporary* helper to detect places where `this` is - * different from the `owner` when React.createElement is called, so that we - * can warn. We want to get rid of owner and replace string `ref`s with arrow - * functions, and as long as `this` and owner are the same, there will be no - * change in behavior. - * @param {*} source An annotation object (added by a transpiler or otherwise) - * indicating filename, line number, and/or other information. - * @internal - */ - - -var ReactElement = function (type, key, ref, self, source, owner, props) { - var element = { - // This tag allows us to uniquely identify this as a React Element - $$typeof: REACT_ELEMENT_TYPE, - // Built-in properties that belong on the element - type: type, - key: key, - ref: ref, - props: props, - // Record the component responsible for creating this element. - _owner: owner - }; - - { - // The validation flag is currently mutative. We put it on - // an external backing store so that we can freeze the whole object. - // This can be replaced with a WeakMap once they are implemented in - // commonly used development environments. - element._store = {}; // To make comparing ReactElements easier for testing purposes, we make - // the validation flag non-enumerable (where possible, which should - // include every environment we run tests in), so the test framework - // ignores it. - - Object.defineProperty(element._store, 'validated', { - configurable: false, - enumerable: false, - writable: true, - value: false - }); // self and source are DEV only properties. - - Object.defineProperty(element, '_self', { - configurable: false, - enumerable: false, - writable: false, - value: self - }); // Two elements created in two different places should be considered - // equal for testing purposes and therefore we hide it from enumeration. - - Object.defineProperty(element, '_source', { - configurable: false, - enumerable: false, - writable: false, - value: source - }); - - if (Object.freeze) { - Object.freeze(element.props); - Object.freeze(element); - } - } - - return element; -}; -/** - * https://github.com/reactjs/rfcs/pull/107 - * @param {*} type - * @param {object} props - * @param {string} key - */ - -function jsxDEV(type, config, maybeKey, source, self) { - { - var propName; // Reserved names are extracted - - var props = {}; - var key = null; - var ref = null; // Currently, key can be spread in as a prop. This causes a potential - // issue if key is also explicitly declared (ie.
- // or
). We want to deprecate key spread, - // but as an intermediary step, we will use jsxDEV for everything except - //
, because we aren't currently able to tell if - // key is explicitly declared to be undefined or not. - - if (maybeKey !== undefined) { - key = '' + maybeKey; - } - - if (hasValidKey(config)) { - key = '' + config.key; - } - - if (hasValidRef(config)) { - ref = config.ref; - warnIfStringRefCannotBeAutoConverted(config, self); - } // Remaining properties are added to a new props object - - - for (propName in config) { - if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - props[propName] = config[propName]; - } - } // Resolve default props - - - if (type && type.defaultProps) { - var defaultProps = type.defaultProps; - - for (propName in defaultProps) { - if (props[propName] === undefined) { - props[propName] = defaultProps[propName]; - } - } - } - - if (key || ref) { - var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; - - if (key) { - defineKeyPropWarningGetter(props, displayName); - } - - if (ref) { - defineRefPropWarningGetter(props, displayName); - } - } - - return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); - } -} - -var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner; -var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; - -function setCurrentlyValidatingElement$1(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - ReactDebugCurrentFrame$1.setExtraStackFrame(stack); - } else { - ReactDebugCurrentFrame$1.setExtraStackFrame(null); - } - } -} - -var propTypesMisspellWarningShown; - -{ - propTypesMisspellWarningShown = false; -} -/** - * Verifies the object is a ReactElement. - * See https://reactjs.org/docs/react-api.html#isvalidelement - * @param {?object} object - * @return {boolean} True if `object` is a ReactElement. - * @final - */ - -function isValidElement(object) { - { - return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; - } -} - -function getDeclarationErrorAddendum() { - { - if (ReactCurrentOwner$1.current) { - var name = getComponentName(ReactCurrentOwner$1.current.type); - - if (name) { - return '\n\nCheck the render method of `' + name + '`.'; - } - } - - return ''; - } -} - -function getSourceInfoErrorAddendum(source) { - { - if (source !== undefined) { - var fileName = source.fileName.replace(/^.*[\\\/]/, ''); - var lineNumber = source.lineNumber; - return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; - } - - return ''; - } -} -/** - * Warn if there's no key explicitly set on dynamic arrays of children or - * object keys are not valid. This allows us to keep track of children between - * updates. - */ - - -var ownerHasKeyUseWarning = {}; - -function getCurrentComponentErrorInfo(parentType) { - { - var info = getDeclarationErrorAddendum(); - - if (!info) { - var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; - - if (parentName) { - info = "\n\nCheck the top-level render call using <" + parentName + ">."; - } - } - - return info; - } -} -/** - * Warn if the element doesn't have an explicit key assigned to it. - * This element is in an array. The array could grow and shrink or be - * reordered. All children that haven't already been validated are required to - * have a "key" property assigned to it. Error statuses are cached so a warning - * will only be shown once. - * - * @internal - * @param {ReactElement} element Element that requires a key. - * @param {*} parentType element's parent's type. - */ - - -function validateExplicitKey(element, parentType) { - { - if (!element._store || element._store.validated || element.key != null) { - return; - } - - element._store.validated = true; - var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); - - if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { - return; - } - - ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a - // property, it may be the creator of the child that's responsible for - // assigning it a key. - - var childOwner = ''; - - if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) { - // Give the component that originally created this child. - childOwner = " It was passed a child from " + getComponentName(element._owner.type) + "."; - } - - setCurrentlyValidatingElement$1(element); - - error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); - - setCurrentlyValidatingElement$1(null); - } -} -/** - * Ensure that every element either is passed in a static location, in an - * array with an explicit keys property defined, or in an object literal - * with valid key property. - * - * @internal - * @param {ReactNode} node Statically passed child of any type. - * @param {*} parentType node's parent's type. - */ - - -function validateChildKeys(node, parentType) { - { - if (typeof node !== 'object') { - return; - } - - if (Array.isArray(node)) { - for (var i = 0; i < node.length; i++) { - var child = node[i]; - - if (isValidElement(child)) { - validateExplicitKey(child, parentType); - } - } - } else if (isValidElement(node)) { - // This element was passed in a valid location. - if (node._store) { - node._store.validated = true; - } - } else if (node) { - var iteratorFn = getIteratorFn(node); - - if (typeof iteratorFn === 'function') { - // Entry iterators used to provide implicit keys, - // but now we print a separate warning for them later. - if (iteratorFn !== node.entries) { - var iterator = iteratorFn.call(node); - var step; - - while (!(step = iterator.next()).done) { - if (isValidElement(step.value)) { - validateExplicitKey(step.value, parentType); - } - } - } - } - } - } -} -/** - * Given an element, validate that its props follow the propTypes definition, - * provided by the type. - * - * @param {ReactElement} element - */ - - -function validatePropTypes(element) { - { - var type = element.type; - - if (type === null || type === undefined || typeof type === 'string') { - return; - } - - var propTypes; - - if (typeof type === 'function') { - propTypes = type.propTypes; - } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. - // Inner props are checked in the reconciler. - type.$$typeof === REACT_MEMO_TYPE)) { - propTypes = type.propTypes; - } else { - return; - } - - if (propTypes) { - // Intentionally inside to avoid triggering lazy initializers: - var name = getComponentName(type); - checkPropTypes(propTypes, element.props, 'prop', name, element); - } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { - propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: - - var _name = getComponentName(type); - - error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); - } - - if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { - error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); - } - } -} -/** - * Given a fragment, validate that it can only be provided with fragment props - * @param {ReactElement} fragment - */ - - -function validateFragmentProps(fragment) { - { - var keys = Object.keys(fragment.props); - - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - - if (key !== 'children' && key !== 'key') { - setCurrentlyValidatingElement$1(fragment); - - error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); - - setCurrentlyValidatingElement$1(null); - break; - } - } - - if (fragment.ref !== null) { - setCurrentlyValidatingElement$1(fragment); - - error('Invalid attribute `ref` supplied to `React.Fragment`.'); - - setCurrentlyValidatingElement$1(null); - } - } -} - -function jsxWithValidation(type, props, key, isStaticChildren, source, self) { - { - var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to - // succeed and there will likely be errors in render. - - if (!validType) { - var info = ''; - - if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { - info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; - } - - var sourceInfo = getSourceInfoErrorAddendum(source); - - if (sourceInfo) { - info += sourceInfo; - } else { - info += getDeclarationErrorAddendum(); - } - - var typeString; - - if (type === null) { - typeString = 'null'; - } else if (Array.isArray(type)) { - typeString = 'array'; - } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { - typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />"; - info = ' Did you accidentally export a JSX literal instead of a component?'; - } else { - typeString = typeof type; - } - - error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); - } - - var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used. - // TODO: Drop this when these are no longer allowed as the type argument. - - if (element == null) { - return element; - } // Skip key warning if the type isn't valid since our key validation logic - // doesn't expect a non-string/function type and can throw confusing errors. - // We don't want exception behavior to differ between dev and prod. - // (Rendering will throw with a helpful message and as soon as the type is - // fixed, the key warnings will appear.) - - - if (validType) { - var children = props.children; - - if (children !== undefined) { - if (isStaticChildren) { - if (Array.isArray(children)) { - for (var i = 0; i < children.length; i++) { - validateChildKeys(children[i], type); - } - - if (Object.freeze) { - Object.freeze(children); - } - } else { - error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.'); - } - } else { - validateChildKeys(children, type); - } - } - } - - if (type === exports.Fragment) { - validateFragmentProps(element); - } else { - validatePropTypes(element); - } - - return element; - } -} // These two functions exist to still get child warnings in dev -// even with the prod transform. This means that jsxDEV is purely -// opt-in behavior for better messages but that we won't stop -// giving you warnings if you use production apis. - -function jsxWithValidationStatic(type, props, key) { - { - return jsxWithValidation(type, props, key, true); - } -} -function jsxWithValidationDynamic(type, props, key) { - { - return jsxWithValidation(type, props, key, false); - } -} - -var jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children. -// for now we can ship identical prod functions - -var jsxs = jsxWithValidationStatic ; - -exports.jsx = jsx; -exports.jsxs = jsxs; - })(); -} - - -/***/ }), - -/***/ "./node_modules/react/jsx-runtime.js": -/*!*******************************************!*\ - !*** ./node_modules/react/jsx-runtime.js ***! - \*******************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -if (false) {} else { - module.exports = __webpack_require__(/*! ./cjs/react-jsx-runtime.development.js */ "./node_modules/react/cjs/react-jsx-runtime.development.js"); -} - - -/***/ }), - -/***/ "./node_modules/styled-components/dist/styled-components.browser.esm.js": -/*!******************************************************************************!*\ - !*** ./node_modules/styled-components/dist/styled-components.browser.esm.js ***! - \******************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ServerStyleSheet": () => (/* binding */ ServerStyleSheet), -/* harmony export */ "StyleSheetConsumer": () => (/* binding */ StyleSheetConsumer), -/* harmony export */ "StyleSheetContext": () => (/* binding */ StyleSheetContext), -/* harmony export */ "StyleSheetManager": () => (/* binding */ StyleSheetManager), -/* harmony export */ "ThemeConsumer": () => (/* binding */ ThemeConsumer), -/* harmony export */ "ThemeContext": () => (/* binding */ ThemeContext), -/* harmony export */ "ThemeProvider": () => (/* binding */ ThemeProvider), -/* harmony export */ "__DO_NOT_USE_OR_YOU_WILL_BE_HAUNTED_BY_SPOOKY_GHOSTS": () => (/* binding */ __DO_NOT_USE_OR_YOU_WILL_BE_HAUNTED_BY_SPOOKY_GHOSTS), -/* harmony export */ "createGlobalStyle": () => (/* binding */ createGlobalStyle), -/* harmony export */ "css": () => (/* binding */ css), -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), -/* harmony export */ "isStyledComponent": () => (/* binding */ isStyledComponent), -/* harmony export */ "keyframes": () => (/* binding */ keyframes), -/* harmony export */ "withTheme": () => (/* binding */ withTheme) -/* harmony export */ }); -/* harmony import */ var stylis_stylis_min__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! stylis/stylis.min */ "./node_modules/stylis/stylis.min.js"); -/* harmony import */ var stylis_stylis_min__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stylis_stylis_min__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var stylis_rule_sheet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! stylis-rule-sheet */ "./node_modules/stylis-rule-sheet/index.js"); -/* harmony import */ var stylis_rule_sheet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(stylis_rule_sheet__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _emotion_unitless__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @emotion/unitless */ "./node_modules/@emotion/unitless/dist/unitless.browser.esm.js"); -/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-is */ "./node_modules/react-is/index.js"); -/* harmony import */ var memoize_one__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! memoize-one */ "./node_modules/memoize-one/dist/memoize-one.esm.js"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_8__); -/* harmony import */ var _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @emotion/is-prop-valid */ "./node_modules/@emotion/is-prop-valid/dist/is-prop-valid.browser.esm.js"); -/* harmony import */ var merge_anything__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! merge-anything */ "./node_modules/merge-anything/dist/index.esm.js"); - - - - - - - - - - -// - -var interleave = (function (strings, interpolations) { - var result = [strings[0]]; - - for (var i = 0, len = interpolations.length; i < len; i += 1) { - result.push(interpolations[i], strings[i + 1]); - } - - return result; -}); - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; -} : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; -}; - -var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -var createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - -var _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; -}; - -var inherits = function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -}; - -var objectWithoutProperties = function (obj, keys) { - var target = {}; - - for (var i in obj) { - if (keys.indexOf(i) >= 0) continue; - if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; - target[i] = obj[i]; - } - - return target; -}; - -var possibleConstructorReturn = function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && (typeof call === "object" || typeof call === "function") ? call : self; -}; - -// -var isPlainObject = (function (x) { - return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x.constructor === Object; -}); - -// -var EMPTY_ARRAY = Object.freeze([]); -var EMPTY_OBJECT = Object.freeze({}); - -// -function isFunction(test) { - return typeof test === 'function'; -} - -// - -function getComponentName(target) { - return ( true ? typeof target === 'string' && target : 0) || target.displayName || target.name || 'Component'; -} - -// -function isStatelessFunction(test) { - return typeof test === 'function' && !(test.prototype && test.prototype.isReactComponent); -} - -// -function isStyledComponent(target) { - return target && typeof target.styledComponentId === 'string'; -} - -// - -var SC_ATTR = typeof process !== 'undefined' && (process.env.REACT_APP_SC_ATTR || process.env.SC_ATTR) || 'data-styled'; - -var SC_VERSION_ATTR = 'data-styled-version'; - -var SC_STREAM_ATTR = 'data-styled-streamed'; - -var IS_BROWSER = typeof window !== 'undefined' && 'HTMLElement' in window; - -var DISABLE_SPEEDY = typeof SC_DISABLE_SPEEDY === 'boolean' && SC_DISABLE_SPEEDY || typeof process !== 'undefined' && (process.env.REACT_APP_SC_DISABLE_SPEEDY || process.env.SC_DISABLE_SPEEDY) || "development" !== 'production'; - -// Shared empty execution context when generating static styles -var STATIC_EXECUTION_CONTEXT = {}; - -// - - -/** - * Parse errors.md and turn it into a simple hash of code: message - */ -var ERRORS = true ? { - "1": "Cannot create styled-component for component: %s.\n\n", - "2": "Can't collect styles once you've consumed a `ServerStyleSheet`'s styles! `ServerStyleSheet` is a one off instance for each server-side render cycle.\n\n- Are you trying to reuse it across renders?\n- Are you accidentally calling collectStyles twice?\n\n", - "3": "Streaming SSR is only supported in a Node.js environment; Please do not try to call this method in the browser.\n\n", - "4": "The `StyleSheetManager` expects a valid target or sheet prop!\n\n- Does this error occur on the client and is your target falsy?\n- Does this error occur on the server and is the sheet falsy?\n\n", - "5": "The clone method cannot be used on the client!\n\n- Are you running in a client-like environment on the server?\n- Are you trying to run SSR on the client?\n\n", - "6": "Trying to insert a new style tag, but the given Node is unmounted!\n\n- Are you using a custom target that isn't mounted?\n- Does your document not have a valid head element?\n- Have you accidentally removed a style tag manually?\n\n", - "7": "ThemeProvider: Please return an object from your \"theme\" prop function, e.g.\n\n```js\ntheme={() => ({})}\n```\n\n", - "8": "ThemeProvider: Please make your \"theme\" prop an object.\n\n", - "9": "Missing document ``\n\n", - "10": "Cannot find a StyleSheet instance. Usually this happens if there are multiple copies of styled-components loaded at once. Check out this issue for how to troubleshoot and fix the common cases where this situation can happen: https://github.com/styled-components/styled-components/issues/1941#issuecomment-417862021\n\n", - "11": "_This error was replaced with a dev-time warning, it will be deleted for v4 final._ [createGlobalStyle] received children which will not be rendered. Please use the component without passing children elements.\n\n", - "12": "It seems you are interpolating a keyframe declaration (%s) into an untagged string. This was supported in styled-components v3, but is not longer supported in v4 as keyframes are now injected on-demand. Please wrap your string in the css\\`\\` helper which ensures the styles are injected correctly. See https://www.styled-components.com/docs/api#css\n\n", - "13": "%s is not a styled component and cannot be referred to via component selector. See https://www.styled-components.com/docs/advanced#referring-to-other-components for more details.\n" -} : 0; - -/** - * super basic version of sprintf - */ -function format() { - var a = arguments.length <= 0 ? undefined : arguments[0]; - var b = []; - - for (var c = 1, len = arguments.length; c < len; c += 1) { - b.push(arguments.length <= c ? undefined : arguments[c]); - } - - b.forEach(function (d) { - a = a.replace(/%[a-z]/, d); - }); - - return a; -} - -/** - * Create an error file out of errors.md for development and a simple web link to the full errors - * in production mode. - */ - -var StyledComponentsError = function (_Error) { - inherits(StyledComponentsError, _Error); - - function StyledComponentsError(code) { - classCallCheck(this, StyledComponentsError); - - for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - interpolations[_key - 1] = arguments[_key]; - } - - if (false) { var _this; } else { - var _this = possibleConstructorReturn(this, _Error.call(this, format.apply(undefined, [ERRORS[code]].concat(interpolations)).trim())); - } - return possibleConstructorReturn(_this); - } - - return StyledComponentsError; -}(Error); - -// -var SC_COMPONENT_ID = /^[^\S\n]*?\/\* sc-component-id:\s*(\S+)\s+\*\//gm; - -var extractComps = (function (maybeCSS) { - var css = '' + (maybeCSS || ''); // Definitely a string, and a clone - var existingComponents = []; - css.replace(SC_COMPONENT_ID, function (match, componentId, matchIndex) { - existingComponents.push({ componentId: componentId, matchIndex: matchIndex }); - return match; - }); - return existingComponents.map(function (_ref, i) { - var componentId = _ref.componentId, - matchIndex = _ref.matchIndex; - - var nextComp = existingComponents[i + 1]; - var cssFromDOM = nextComp ? css.slice(matchIndex, nextComp.matchIndex) : css.slice(matchIndex); - return { componentId: componentId, cssFromDOM: cssFromDOM }; - }); -}); - -// - -var COMMENT_REGEX = /^\s*\/\/.*$/gm; - -// NOTE: This stylis instance is only used to split rules from SSR'd style tags -var stylisSplitter = new (stylis_stylis_min__WEBPACK_IMPORTED_MODULE_0___default())({ - global: false, - cascade: true, - keyframe: false, - prefix: false, - compress: false, - semicolon: true -}); - -var stylis = new (stylis_stylis_min__WEBPACK_IMPORTED_MODULE_0___default())({ - global: false, - cascade: true, - keyframe: false, - prefix: true, - compress: false, - semicolon: false // NOTE: This means "autocomplete missing semicolons" -}); - -// Wrap `insertRulePlugin to build a list of rules, -// and then make our own plugin to return the rules. This -// makes it easier to hook into the existing SSR architecture - -var parsingRules = []; - -// eslint-disable-next-line consistent-return -var returnRulesPlugin = function returnRulesPlugin(context) { - if (context === -2) { - var parsedRules = parsingRules; - parsingRules = []; - return parsedRules; - } -}; - -var parseRulesPlugin = stylis_rule_sheet__WEBPACK_IMPORTED_MODULE_1___default()(function (rule) { - parsingRules.push(rule); -}); - -var _componentId = void 0; -var _selector = void 0; -var _selectorRegexp = void 0; - -var selfReferenceReplacer = function selfReferenceReplacer(match, offset, string) { - if ( - // the first self-ref is always untouched - offset > 0 && - // there should be at least two self-refs to do a replacement (.b > .b) - string.slice(0, offset).indexOf(_selector) !== -1 && - // no consecutive self refs (.b.b); that is a precedence boost and treated differently - string.slice(offset - _selector.length, offset) !== _selector) { - return '.' + _componentId; - } - - return match; -}; - -/** - * When writing a style like - * - * & + & { - * color: red; - * } - * - * The second ampersand should be a reference to the static component class. stylis - * has no knowledge of static class so we have to intelligently replace the base selector. - */ -var selfReferenceReplacementPlugin = function selfReferenceReplacementPlugin(context, _, selectors) { - if (context === 2 && selectors.length && selectors[0].lastIndexOf(_selector) > 0) { - // eslint-disable-next-line no-param-reassign - selectors[0] = selectors[0].replace(_selectorRegexp, selfReferenceReplacer); - } -}; - -stylis.use([selfReferenceReplacementPlugin, parseRulesPlugin, returnRulesPlugin]); -stylisSplitter.use([parseRulesPlugin, returnRulesPlugin]); - -var splitByRules = function splitByRules(css) { - return stylisSplitter('', css); -}; - -function stringifyRules(rules, selector, prefix) { - var componentId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '&'; - - var flatCSS = rules.join('').replace(COMMENT_REGEX, ''); // replace JS comments - - var cssStr = selector && prefix ? prefix + ' ' + selector + ' { ' + flatCSS + ' }' : flatCSS; - - // stylis has no concept of state to be passed to plugins - // but since JS is single=threaded, we can rely on that to ensure - // these properties stay in sync with the current stylis run - _componentId = componentId; - _selector = selector; - _selectorRegexp = new RegExp('\\' + _selector + '\\b', 'g'); - - return stylis(prefix || !selector ? '' : selector, cssStr); -} - -// -/* eslint-disable camelcase, no-undef */ - -var getNonce = (function () { - return true ? __webpack_require__.nc : 0; -}); - -// -/* These are helpers for the StyleTags to keep track of the injected - * rule names for each (component) ID that they're keeping track of. - * They're crucial for detecting whether a name has already been - * injected. - * (This excludes rehydrated names) */ - -/* adds a new ID:name pairing to a names dictionary */ -var addNameForId = function addNameForId(names, id, name) { - if (name) { - // eslint-disable-next-line no-param-reassign - var namesForId = names[id] || (names[id] = Object.create(null)); - namesForId[name] = true; - } -}; - -/* resets an ID entirely by overwriting it in the dictionary */ -var resetIdNames = function resetIdNames(names, id) { - // eslint-disable-next-line no-param-reassign - names[id] = Object.create(null); -}; - -/* factory for a names dictionary checking the existance of an ID:name pairing */ -var hasNameForId = function hasNameForId(names) { - return function (id, name) { - return names[id] !== undefined && names[id][name]; - }; -}; - -/* stringifies names for the html/element output */ -var stringifyNames = function stringifyNames(names) { - var str = ''; - // eslint-disable-next-line guard-for-in - for (var id in names) { - str += Object.keys(names[id]).join(' ') + ' '; - } - return str.trim(); -}; - -/* clones the nested names dictionary */ -var cloneNames = function cloneNames(names) { - var clone = Object.create(null); - // eslint-disable-next-line guard-for-in - for (var id in names) { - clone[id] = _extends({}, names[id]); - } - return clone; -}; - -// - -/* These are helpers that deal with the insertRule (aka speedy) API - * They are used in the StyleTags and specifically the speedy tag - */ - -/* retrieve a sheet for a given style tag */ -var sheetForTag = function sheetForTag(tag) { - // $FlowFixMe - if (tag.sheet) return tag.sheet; - - /* Firefox quirk requires us to step through all stylesheets to find one owned by the given tag */ - var size = tag.ownerDocument.styleSheets.length; - for (var i = 0; i < size; i += 1) { - var sheet = tag.ownerDocument.styleSheets[i]; - // $FlowFixMe - if (sheet.ownerNode === tag) return sheet; - } - - /* we should always be able to find a tag */ - throw new StyledComponentsError(10); -}; - -/* insert a rule safely and return whether it was actually injected */ -var safeInsertRule = function safeInsertRule(sheet, cssRule, index) { - /* abort early if cssRule string is falsy */ - if (!cssRule) return false; - - var maxIndex = sheet.cssRules.length; - - try { - /* use insertRule and cap passed index with maxIndex (no of cssRules) */ - sheet.insertRule(cssRule, index <= maxIndex ? index : maxIndex); - } catch (err) { - /* any error indicates an invalid rule */ - return false; - } - - return true; -}; - -/* deletes `size` rules starting from `removalIndex` */ -var deleteRules = function deleteRules(sheet, removalIndex, size) { - var lowerBound = removalIndex - size; - for (var i = removalIndex; i > lowerBound; i -= 1) { - sheet.deleteRule(i); - } -}; - -// - -/* this marker separates component styles and is important for rehydration */ -var makeTextMarker = function makeTextMarker(id) { - return '\n/* sc-component-id: ' + id + ' */\n'; -}; - -/* add up all numbers in array up until and including the index */ -var addUpUntilIndex = function addUpUntilIndex(sizes, index) { - var totalUpToIndex = 0; - for (var i = 0; i <= index; i += 1) { - totalUpToIndex += sizes[i]; - } - - return totalUpToIndex; -}; - -/* create a new style tag after lastEl */ -var makeStyleTag = function makeStyleTag(target, tagEl, insertBefore) { - var targetDocument = document; - if (target) targetDocument = target.ownerDocument;else if (tagEl) targetDocument = tagEl.ownerDocument; - - var el = targetDocument.createElement('style'); - el.setAttribute(SC_ATTR, ''); - el.setAttribute(SC_VERSION_ATTR, "4.4.1"); - - var nonce = getNonce(); - if (nonce) { - el.setAttribute('nonce', nonce); - } - - /* Work around insertRule quirk in EdgeHTML */ - el.appendChild(targetDocument.createTextNode('')); - - if (target && !tagEl) { - /* Append to target when no previous element was passed */ - target.appendChild(el); - } else { - if (!tagEl || !target || !tagEl.parentNode) { - throw new StyledComponentsError(6); - } - - /* Insert new style tag after the previous one */ - tagEl.parentNode.insertBefore(el, insertBefore ? tagEl : tagEl.nextSibling); - } - - return el; -}; - -/* takes a css factory function and outputs an html styled tag factory */ -var wrapAsHtmlTag = function wrapAsHtmlTag(css, names) { - return function (additionalAttrs) { - var nonce = getNonce(); - var attrs = [nonce && 'nonce="' + nonce + '"', SC_ATTR + '="' + stringifyNames(names) + '"', SC_VERSION_ATTR + '="' + "4.4.1" + '"', additionalAttrs]; - - var htmlAttr = attrs.filter(Boolean).join(' '); - return ''; - }; -}; - -/* takes a css factory function and outputs an element factory */ -var wrapAsElement = function wrapAsElement(css, names) { - return function () { - var _props; - - var props = (_props = {}, _props[SC_ATTR] = stringifyNames(names), _props[SC_VERSION_ATTR] = "4.4.1", _props); - - var nonce = getNonce(); - if (nonce) { - // $FlowFixMe - props.nonce = nonce; - } - - // eslint-disable-next-line react/no-danger - return react__WEBPACK_IMPORTED_MODULE_2___default().createElement('style', _extends({}, props, { dangerouslySetInnerHTML: { __html: css() } })); - }; -}; - -var getIdsFromMarkersFactory = function getIdsFromMarkersFactory(markers) { - return function () { - return Object.keys(markers); - }; -}; - -/* speedy tags utilise insertRule */ -var makeSpeedyTag = function makeSpeedyTag(el, getImportRuleTag) { - var names = Object.create(null); - var markers = Object.create(null); - var sizes = []; - - var extractImport = getImportRuleTag !== undefined; - /* indicates whether getImportRuleTag was called */ - var usedImportRuleTag = false; - - var insertMarker = function insertMarker(id) { - var prev = markers[id]; - if (prev !== undefined) { - return prev; - } - - markers[id] = sizes.length; - sizes.push(0); - resetIdNames(names, id); - - return markers[id]; - }; - - var insertRules = function insertRules(id, cssRules, name) { - var marker = insertMarker(id); - var sheet = sheetForTag(el); - var insertIndex = addUpUntilIndex(sizes, marker); - - var injectedRules = 0; - var importRules = []; - var cssRulesSize = cssRules.length; - - for (var i = 0; i < cssRulesSize; i += 1) { - var cssRule = cssRules[i]; - var mayHaveImport = extractImport; /* @import rules are reordered to appear first */ - if (mayHaveImport && cssRule.indexOf('@import') !== -1) { - importRules.push(cssRule); - } else if (safeInsertRule(sheet, cssRule, insertIndex + injectedRules)) { - mayHaveImport = false; - injectedRules += 1; - } - } - - if (extractImport && importRules.length > 0) { - usedImportRuleTag = true; - // $FlowFixMe - getImportRuleTag().insertRules(id + '-import', importRules); - } - - sizes[marker] += injectedRules; /* add up no of injected rules */ - addNameForId(names, id, name); - }; - - var removeRules = function removeRules(id) { - var marker = markers[id]; - if (marker === undefined) return; - // $FlowFixMe - if (el.isConnected === false) return; - - var size = sizes[marker]; - var sheet = sheetForTag(el); - var removalIndex = addUpUntilIndex(sizes, marker) - 1; - deleteRules(sheet, removalIndex, size); - sizes[marker] = 0; - resetIdNames(names, id); - - if (extractImport && usedImportRuleTag) { - // $FlowFixMe - getImportRuleTag().removeRules(id + '-import'); - } - }; - - var css = function css() { - var _sheetForTag = sheetForTag(el), - cssRules = _sheetForTag.cssRules; - - var str = ''; - - // eslint-disable-next-line guard-for-in - for (var id in markers) { - str += makeTextMarker(id); - var marker = markers[id]; - var end = addUpUntilIndex(sizes, marker); - var size = sizes[marker]; - for (var i = end - size; i < end; i += 1) { - var rule = cssRules[i]; - if (rule !== undefined) { - str += rule.cssText; - } - } - } - - return str; - }; - - return { - clone: function clone() { - throw new StyledComponentsError(5); - }, - - css: css, - getIds: getIdsFromMarkersFactory(markers), - hasNameForId: hasNameForId(names), - insertMarker: insertMarker, - insertRules: insertRules, - removeRules: removeRules, - sealed: false, - styleTag: el, - toElement: wrapAsElement(css, names), - toHTML: wrapAsHtmlTag(css, names) - }; -}; - -var makeTextNode = function makeTextNode(targetDocument, id) { - return targetDocument.createTextNode(makeTextMarker(id)); -}; - -var makeBrowserTag = function makeBrowserTag(el, getImportRuleTag) { - var names = Object.create(null); - var markers = Object.create(null); - - var extractImport = getImportRuleTag !== undefined; - - /* indicates whether getImportRuleTag was called */ - var usedImportRuleTag = false; - - var insertMarker = function insertMarker(id) { - var prev = markers[id]; - if (prev !== undefined) { - return prev; - } - - markers[id] = makeTextNode(el.ownerDocument, id); - el.appendChild(markers[id]); - names[id] = Object.create(null); - - return markers[id]; - }; - - var insertRules = function insertRules(id, cssRules, name) { - var marker = insertMarker(id); - var importRules = []; - var cssRulesSize = cssRules.length; - - for (var i = 0; i < cssRulesSize; i += 1) { - var rule = cssRules[i]; - var mayHaveImport = extractImport; - if (mayHaveImport && rule.indexOf('@import') !== -1) { - importRules.push(rule); - } else { - mayHaveImport = false; - var separator = i === cssRulesSize - 1 ? '' : ' '; - marker.appendData('' + rule + separator); - } - } - - addNameForId(names, id, name); - - if (extractImport && importRules.length > 0) { - usedImportRuleTag = true; - // $FlowFixMe - getImportRuleTag().insertRules(id + '-import', importRules); - } - }; - - var removeRules = function removeRules(id) { - var marker = markers[id]; - if (marker === undefined) return; - - /* create new empty text node and replace the current one */ - var newMarker = makeTextNode(el.ownerDocument, id); - el.replaceChild(newMarker, marker); - markers[id] = newMarker; - resetIdNames(names, id); - - if (extractImport && usedImportRuleTag) { - // $FlowFixMe - getImportRuleTag().removeRules(id + '-import'); - } - }; - - var css = function css() { - var str = ''; - - // eslint-disable-next-line guard-for-in - for (var id in markers) { - str += markers[id].data; - } - - return str; - }; - - return { - clone: function clone() { - throw new StyledComponentsError(5); - }, - - css: css, - getIds: getIdsFromMarkersFactory(markers), - hasNameForId: hasNameForId(names), - insertMarker: insertMarker, - insertRules: insertRules, - removeRules: removeRules, - sealed: false, - styleTag: el, - toElement: wrapAsElement(css, names), - toHTML: wrapAsHtmlTag(css, names) - }; -}; - -var makeServerTag = function makeServerTag(namesArg, markersArg) { - var names = namesArg === undefined ? Object.create(null) : namesArg; - var markers = markersArg === undefined ? Object.create(null) : markersArg; - - var insertMarker = function insertMarker(id) { - var prev = markers[id]; - if (prev !== undefined) { - return prev; - } - - return markers[id] = ['']; - }; - - var insertRules = function insertRules(id, cssRules, name) { - var marker = insertMarker(id); - marker[0] += cssRules.join(' '); - addNameForId(names, id, name); - }; - - var removeRules = function removeRules(id) { - var marker = markers[id]; - if (marker === undefined) return; - marker[0] = ''; - resetIdNames(names, id); - }; - - var css = function css() { - var str = ''; - // eslint-disable-next-line guard-for-in - for (var id in markers) { - var cssForId = markers[id][0]; - if (cssForId) { - str += makeTextMarker(id) + cssForId; - } - } - return str; - }; - - var clone = function clone() { - var namesClone = cloneNames(names); - var markersClone = Object.create(null); - - // eslint-disable-next-line guard-for-in - for (var id in markers) { - markersClone[id] = [markers[id][0]]; - } - - return makeServerTag(namesClone, markersClone); - }; - - var tag = { - clone: clone, - css: css, - getIds: getIdsFromMarkersFactory(markers), - hasNameForId: hasNameForId(names), - insertMarker: insertMarker, - insertRules: insertRules, - removeRules: removeRules, - sealed: false, - styleTag: null, - toElement: wrapAsElement(css, names), - toHTML: wrapAsHtmlTag(css, names) - }; - - return tag; -}; - -var makeTag = function makeTag(target, tagEl, forceServer, insertBefore, getImportRuleTag) { - if (IS_BROWSER && !forceServer) { - var el = makeStyleTag(target, tagEl, insertBefore); - - if (DISABLE_SPEEDY) { - return makeBrowserTag(el, getImportRuleTag); - } else { - return makeSpeedyTag(el, getImportRuleTag); - } - } - - return makeServerTag(); -}; - -var rehydrate = function rehydrate(tag, els, extracted) { - /* add all extracted components to the new tag */ - for (var i = 0, len = extracted.length; i < len; i += 1) { - var _extracted$i = extracted[i], - componentId = _extracted$i.componentId, - cssFromDOM = _extracted$i.cssFromDOM; - - var cssRules = splitByRules(cssFromDOM); - tag.insertRules(componentId, cssRules); - } - - /* remove old HTMLStyleElements, since they have been rehydrated */ - for (var _i = 0, _len = els.length; _i < _len; _i += 1) { - var el = els[_i]; - if (el.parentNode) { - el.parentNode.removeChild(el); - } - } -}; - -// - -var SPLIT_REGEX = /\s+/; - -/* determine the maximum number of components before tags are sharded */ -var MAX_SIZE = void 0; -if (IS_BROWSER) { - /* in speedy mode we can keep a lot more rules in a sheet before a slowdown can be expected */ - MAX_SIZE = DISABLE_SPEEDY ? 40 : 1000; -} else { - /* for servers we do not need to shard at all */ - MAX_SIZE = -1; -} - -var sheetRunningId = 0; -var master = void 0; - -var StyleSheet = function () { - - /* a map from ids to tags */ - - /* deferred rules for a given id */ - - /* this is used for not reinjecting rules via hasNameForId() */ - - /* when rules for an id are removed using remove() we have to ignore rehydratedNames for it */ - - /* a list of tags belonging to this StyleSheet */ - - /* a tag for import rules */ - - /* current capacity until a new tag must be created */ - - /* children (aka clones) of this StyleSheet inheriting all and future injections */ - - function StyleSheet() { - var _this = this; - - var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : IS_BROWSER ? document.head : null; - var forceServer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - classCallCheck(this, StyleSheet); - - this.getImportRuleTag = function () { - var importRuleTag = _this.importRuleTag; - - if (importRuleTag !== undefined) { - return importRuleTag; - } - - var firstTag = _this.tags[0]; - var insertBefore = true; - - return _this.importRuleTag = makeTag(_this.target, firstTag ? firstTag.styleTag : null, _this.forceServer, insertBefore); - }; - - sheetRunningId += 1; - this.id = sheetRunningId; - this.forceServer = forceServer; - this.target = forceServer ? null : target; - this.tagMap = {}; - this.deferred = {}; - this.rehydratedNames = {}; - this.ignoreRehydratedNames = {}; - this.tags = []; - this.capacity = 1; - this.clones = []; - } - - /* rehydrate all SSR'd style tags */ - - - StyleSheet.prototype.rehydrate = function rehydrate$$1() { - if (!IS_BROWSER || this.forceServer) return this; - - var els = []; - var extracted = []; - var isStreamed = false; - - /* retrieve all of our SSR style elements from the DOM */ - var nodes = document.querySelectorAll('style[' + SC_ATTR + '][' + SC_VERSION_ATTR + '="' + "4.4.1" + '"]'); - - var nodesSize = nodes.length; - - /* abort rehydration if no previous style tags were found */ - if (!nodesSize) return this; - - for (var i = 0; i < nodesSize; i += 1) { - var el = nodes[i]; - - /* check if style tag is a streamed tag */ - if (!isStreamed) isStreamed = !!el.getAttribute(SC_STREAM_ATTR); - - /* retrieve all component names */ - var elNames = (el.getAttribute(SC_ATTR) || '').trim().split(SPLIT_REGEX); - var elNamesSize = elNames.length; - for (var j = 0, name; j < elNamesSize; j += 1) { - name = elNames[j]; - /* add rehydrated name to sheet to avoid re-adding styles */ - this.rehydratedNames[name] = true; - } - - /* extract all components and their CSS */ - extracted.push.apply(extracted, extractComps(el.textContent)); - - /* store original HTMLStyleElement */ - els.push(el); - } - - /* abort rehydration if nothing was extracted */ - var extractedSize = extracted.length; - if (!extractedSize) return this; - - /* create a tag to be used for rehydration */ - var tag = this.makeTag(null); - - rehydrate(tag, els, extracted); - - /* reset capacity and adjust MAX_SIZE by the initial size of the rehydration */ - this.capacity = Math.max(1, MAX_SIZE - extractedSize); - this.tags.push(tag); - - /* retrieve all component ids */ - for (var _j = 0; _j < extractedSize; _j += 1) { - this.tagMap[extracted[_j].componentId] = tag; - } - - return this; - }; - - /* retrieve a "master" instance of StyleSheet which is typically used when no other is available - * The master StyleSheet is targeted by createGlobalStyle, keyframes, and components outside of any - * StyleSheetManager's context */ - - - /* reset the internal "master" instance */ - StyleSheet.reset = function reset() { - var forceServer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - master = new StyleSheet(undefined, forceServer).rehydrate(); - }; - - /* adds "children" to the StyleSheet that inherit all of the parents' rules - * while their own rules do not affect the parent */ - - - StyleSheet.prototype.clone = function clone() { - var sheet = new StyleSheet(this.target, this.forceServer); - - /* add to clone array */ - this.clones.push(sheet); - - /* clone all tags */ - sheet.tags = this.tags.map(function (tag) { - var ids = tag.getIds(); - var newTag = tag.clone(); - - /* reconstruct tagMap */ - for (var i = 0; i < ids.length; i += 1) { - sheet.tagMap[ids[i]] = newTag; - } - - return newTag; - }); - - /* clone other maps */ - sheet.rehydratedNames = _extends({}, this.rehydratedNames); - sheet.deferred = _extends({}, this.deferred); - - return sheet; - }; - - /* force StyleSheet to create a new tag on the next injection */ - - - StyleSheet.prototype.sealAllTags = function sealAllTags() { - this.capacity = 1; - - this.tags.forEach(function (tag) { - // eslint-disable-next-line no-param-reassign - tag.sealed = true; - }); - }; - - StyleSheet.prototype.makeTag = function makeTag$$1(tag) { - var lastEl = tag ? tag.styleTag : null; - var insertBefore = false; - - return makeTag(this.target, lastEl, this.forceServer, insertBefore, this.getImportRuleTag); - }; - - /* get a tag for a given componentId, assign the componentId to one, or shard */ - StyleSheet.prototype.getTagForId = function getTagForId(id) { - /* simply return a tag, when the componentId was already assigned one */ - var prev = this.tagMap[id]; - if (prev !== undefined && !prev.sealed) { - return prev; - } - - var tag = this.tags[this.tags.length - 1]; - - /* shard (create a new tag) if the tag is exhausted (See MAX_SIZE) */ - this.capacity -= 1; - - if (this.capacity === 0) { - this.capacity = MAX_SIZE; - tag = this.makeTag(tag); - this.tags.push(tag); - } - - return this.tagMap[id] = tag; - }; - - /* mainly for createGlobalStyle to check for its id */ - - - StyleSheet.prototype.hasId = function hasId(id) { - return this.tagMap[id] !== undefined; - }; - - /* caching layer checking id+name to already have a corresponding tag and injected rules */ - - - StyleSheet.prototype.hasNameForId = function hasNameForId(id, name) { - /* exception for rehydrated names which are checked separately */ - if (this.ignoreRehydratedNames[id] === undefined && this.rehydratedNames[name]) { - return true; - } - - var tag = this.tagMap[id]; - return tag !== undefined && tag.hasNameForId(id, name); - }; - - /* registers a componentId and registers it on its tag */ - - - StyleSheet.prototype.deferredInject = function deferredInject(id, cssRules) { - /* don't inject when the id is already registered */ - if (this.tagMap[id] !== undefined) return; - - var clones = this.clones; - - for (var i = 0; i < clones.length; i += 1) { - clones[i].deferredInject(id, cssRules); - } - - this.getTagForId(id).insertMarker(id); - this.deferred[id] = cssRules; - }; - - /* injects rules for a given id with a name that will need to be cached */ - - - StyleSheet.prototype.inject = function inject(id, cssRules, name) { - var clones = this.clones; - - - for (var i = 0; i < clones.length; i += 1) { - clones[i].inject(id, cssRules, name); - } - - var tag = this.getTagForId(id); - - /* add deferred rules for component */ - if (this.deferred[id] !== undefined) { - // Combine passed cssRules with previously deferred CSS rules - // NOTE: We cannot mutate the deferred array itself as all clones - // do the same (see clones[i].inject) - var rules = this.deferred[id].concat(cssRules); - tag.insertRules(id, rules, name); - - this.deferred[id] = undefined; - } else { - tag.insertRules(id, cssRules, name); - } - }; - - /* removes all rules for a given id, which doesn't remove its marker but resets it */ - - - StyleSheet.prototype.remove = function remove(id) { - var tag = this.tagMap[id]; - if (tag === undefined) return; - - var clones = this.clones; - - for (var i = 0; i < clones.length; i += 1) { - clones[i].remove(id); - } - - /* remove all rules from the tag */ - tag.removeRules(id); - - /* ignore possible rehydrated names */ - this.ignoreRehydratedNames[id] = true; - - /* delete possible deferred rules */ - this.deferred[id] = undefined; - }; - - StyleSheet.prototype.toHTML = function toHTML() { - return this.tags.map(function (tag) { - return tag.toHTML(); - }).join(''); - }; - - StyleSheet.prototype.toReactElements = function toReactElements() { - var id = this.id; - - - return this.tags.map(function (tag, i) { - var key = 'sc-' + id + '-' + i; - return (0,react__WEBPACK_IMPORTED_MODULE_2__.cloneElement)(tag.toElement(), { key: key }); - }); - }; - - createClass(StyleSheet, null, [{ - key: 'master', - get: function get$$1() { - return master || (master = new StyleSheet().rehydrate()); - } - - /* NOTE: This is just for backwards-compatibility with jest-styled-components */ - - }, { - key: 'instance', - get: function get$$1() { - return StyleSheet.master; - } - }]); - return StyleSheet; -}(); - -// - -var Keyframes = function () { - function Keyframes(name, rules) { - var _this = this; - - classCallCheck(this, Keyframes); - - this.inject = function (styleSheet) { - if (!styleSheet.hasNameForId(_this.id, _this.name)) { - styleSheet.inject(_this.id, _this.rules, _this.name); - } - }; - - this.toString = function () { - throw new StyledComponentsError(12, String(_this.name)); - }; - - this.name = name; - this.rules = rules; - - this.id = 'sc-keyframes-' + name; - } - - Keyframes.prototype.getName = function getName() { - return this.name; - }; - - return Keyframes; -}(); - -// - -/** - * inlined version of - * https://github.com/facebook/fbjs/blob/master/packages/fbjs/src/core/hyphenateStyleName.js - */ - -var uppercasePattern = /([A-Z])/g; -var msPattern = /^ms-/; - -/** - * Hyphenates a camelcased CSS property name, for example: - * - * > hyphenateStyleName('backgroundColor') - * < "background-color" - * > hyphenateStyleName('MozTransition') - * < "-moz-transition" - * > hyphenateStyleName('msTransition') - * < "-ms-transition" - * - * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix - * is converted to `-ms-`. - * - * @param {string} string - * @return {string} - */ -function hyphenateStyleName(string) { - return string.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-'); -} - -// - -// Taken from https://github.com/facebook/react/blob/b87aabdfe1b7461e7331abb3601d9e6bb27544bc/packages/react-dom/src/shared/dangerousStyleValue.js -function addUnitIfNeeded(name, value) { - // https://github.com/amilajack/eslint-plugin-flowtype-errors/issues/133 - // $FlowFixMe - if (value == null || typeof value === 'boolean' || value === '') { - return ''; - } - - if (typeof value === 'number' && value !== 0 && !(name in _emotion_unitless__WEBPACK_IMPORTED_MODULE_3__["default"])) { - return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers - } - - return String(value).trim(); -} - -// - -/** - * It's falsish not falsy because 0 is allowed. - */ -var isFalsish = function isFalsish(chunk) { - return chunk === undefined || chunk === null || chunk === false || chunk === ''; -}; - -var objToCssArray = function objToCssArray(obj, prevKey) { - var rules = []; - var keys = Object.keys(obj); - - keys.forEach(function (key) { - if (!isFalsish(obj[key])) { - if (isPlainObject(obj[key])) { - rules.push.apply(rules, objToCssArray(obj[key], key)); - - return rules; - } else if (isFunction(obj[key])) { - rules.push(hyphenateStyleName(key) + ':', obj[key], ';'); - - return rules; - } - rules.push(hyphenateStyleName(key) + ': ' + addUnitIfNeeded(key, obj[key]) + ';'); - } - return rules; - }); - - return prevKey ? [prevKey + ' {'].concat(rules, ['}']) : rules; -}; - -function flatten(chunk, executionContext, styleSheet) { - if (Array.isArray(chunk)) { - var ruleSet = []; - - for (var i = 0, len = chunk.length, result; i < len; i += 1) { - result = flatten(chunk[i], executionContext, styleSheet); - - if (result === null) continue;else if (Array.isArray(result)) ruleSet.push.apply(ruleSet, result);else ruleSet.push(result); - } - - return ruleSet; - } - - if (isFalsish(chunk)) { - return null; - } - - /* Handle other components */ - if (isStyledComponent(chunk)) { - return '.' + chunk.styledComponentId; - } - - /* Either execute or defer the function */ - if (isFunction(chunk)) { - if (isStatelessFunction(chunk) && executionContext) { - var _result = chunk(executionContext); - - if ( true && (0,react_is__WEBPACK_IMPORTED_MODULE_4__.isElement)(_result)) { - // eslint-disable-next-line no-console - console.warn(getComponentName(chunk) + ' is not a styled component and cannot be referred to via component selector. See https://www.styled-components.com/docs/advanced#referring-to-other-components for more details.'); - } - - return flatten(_result, executionContext, styleSheet); - } else return chunk; - } - - if (chunk instanceof Keyframes) { - if (styleSheet) { - chunk.inject(styleSheet); - return chunk.getName(); - } else return chunk; - } - - /* Handle objects */ - return isPlainObject(chunk) ? objToCssArray(chunk) : chunk.toString(); -} - -// - -function css(styles) { - for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - interpolations[_key - 1] = arguments[_key]; - } - - if (isFunction(styles) || isPlainObject(styles)) { - // $FlowFixMe - return flatten(interleave(EMPTY_ARRAY, [styles].concat(interpolations))); - } - - // $FlowFixMe - return flatten(interleave(styles, interpolations)); -} - -// - -function constructWithOptions(componentConstructor, tag) { - var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EMPTY_OBJECT; - - if (!(0,react_is__WEBPACK_IMPORTED_MODULE_4__.isValidElementType)(tag)) { - throw new StyledComponentsError(1, String(tag)); - } - - /* This is callable directly as a template function */ - // $FlowFixMe: Not typed to avoid destructuring arguments - var templateFunction = function templateFunction() { - return componentConstructor(tag, options, css.apply(undefined, arguments)); - }; - - /* If config methods are called, wrap up a new template function and merge options */ - templateFunction.withConfig = function (config) { - return constructWithOptions(componentConstructor, tag, _extends({}, options, config)); - }; - - /* Modify/inject new props at runtime */ - templateFunction.attrs = function (attrs) { - return constructWithOptions(componentConstructor, tag, _extends({}, options, { - attrs: Array.prototype.concat(options.attrs, attrs).filter(Boolean) - })); - }; - - return templateFunction; -} - -// -// Source: https://github.com/garycourt/murmurhash-js/blob/master/murmurhash2_gc.js -function murmurhash(c) { - for (var e = c.length | 0, a = e | 0, d = 0, b; e >= 4;) { - b = c.charCodeAt(d) & 255 | (c.charCodeAt(++d) & 255) << 8 | (c.charCodeAt(++d) & 255) << 16 | (c.charCodeAt(++d) & 255) << 24, b = 1540483477 * (b & 65535) + ((1540483477 * (b >>> 16) & 65535) << 16), b ^= b >>> 24, b = 1540483477 * (b & 65535) + ((1540483477 * (b >>> 16) & 65535) << 16), a = 1540483477 * (a & 65535) + ((1540483477 * (a >>> 16) & 65535) << 16) ^ b, e -= 4, ++d; - } - switch (e) { - case 3: - a ^= (c.charCodeAt(d + 2) & 255) << 16; - case 2: - a ^= (c.charCodeAt(d + 1) & 255) << 8; - case 1: - a ^= c.charCodeAt(d) & 255, a = 1540483477 * (a & 65535) + ((1540483477 * (a >>> 16) & 65535) << 16); - } - a ^= a >>> 13; - a = 1540483477 * (a & 65535) + ((1540483477 * (a >>> 16) & 65535) << 16); - return (a ^ a >>> 15) >>> 0; -} - -// -/* eslint-disable no-bitwise */ - -/* This is the "capacity" of our alphabet i.e. 2x26 for all letters plus their capitalised - * counterparts */ -var charsLength = 52; - -/* start at 75 for 'a' until 'z' (25) and then start at 65 for capitalised letters */ -var getAlphabeticChar = function getAlphabeticChar(code) { - return String.fromCharCode(code + (code > 25 ? 39 : 97)); -}; - -/* input a number, usually a hash and convert it to base-52 */ -function generateAlphabeticName(code) { - var name = ''; - var x = void 0; - - /* get a char and divide by alphabet-length */ - for (x = code; x > charsLength; x = Math.floor(x / charsLength)) { - name = getAlphabeticChar(x % charsLength) + name; - } - - return getAlphabeticChar(x % charsLength) + name; -} - -// - -function hasFunctionObjectKey(obj) { - // eslint-disable-next-line guard-for-in, no-restricted-syntax - for (var key in obj) { - if (isFunction(obj[key])) { - return true; - } - } - - return false; -} - -function isStaticRules(rules, attrs) { - for (var i = 0; i < rules.length; i += 1) { - var rule = rules[i]; - - // recursive case - if (Array.isArray(rule) && !isStaticRules(rule, attrs)) { - return false; - } else if (isFunction(rule) && !isStyledComponent(rule)) { - // functions are allowed to be static if they're just being - // used to get the classname of a nested styled component - return false; - } - } - - if (attrs.some(function (x) { - return isFunction(x) || hasFunctionObjectKey(x); - })) return false; - - return true; -} - -// - -/* combines hashStr (murmurhash) and nameGenerator for convenience */ -var hasher = function hasher(str) { - return generateAlphabeticName(murmurhash(str)); -}; - -/* - ComponentStyle is all the CSS-specific stuff, not - the React-specific stuff. - */ - -var ComponentStyle = function () { - function ComponentStyle(rules, attrs, componentId) { - classCallCheck(this, ComponentStyle); - - this.rules = rules; - this.isStatic = false && 0; - this.componentId = componentId; - - if (!StyleSheet.master.hasId(componentId)) { - StyleSheet.master.deferredInject(componentId, []); - } - } - - /* - * Flattens a rule set into valid CSS - * Hashes it, wraps the whole chunk in a .hash1234 {} - * Returns the hash to be injected on render() - * */ - - - ComponentStyle.prototype.generateAndInjectStyles = function generateAndInjectStyles(executionContext, styleSheet) { - var isStatic = this.isStatic, - componentId = this.componentId, - lastClassName = this.lastClassName; - - if (IS_BROWSER && isStatic && typeof lastClassName === 'string' && styleSheet.hasNameForId(componentId, lastClassName)) { - return lastClassName; - } - - var flatCSS = flatten(this.rules, executionContext, styleSheet); - var name = hasher(this.componentId + flatCSS.join('')); - if (!styleSheet.hasNameForId(componentId, name)) { - styleSheet.inject(this.componentId, stringifyRules(flatCSS, '.' + name, undefined, componentId), name); - } - - this.lastClassName = name; - return name; - }; - - ComponentStyle.generateName = function generateName(str) { - return hasher(str); - }; - - return ComponentStyle; -}(); - -// - -var LIMIT = 200; - -var createWarnTooManyClasses = (function (displayName) { - var generatedClasses = {}; - var warningSeen = false; - - return function (className) { - if (!warningSeen) { - generatedClasses[className] = true; - if (Object.keys(generatedClasses).length >= LIMIT) { - // Unable to find latestRule in test environment. - /* eslint-disable no-console, prefer-template */ - console.warn('Over ' + LIMIT + ' classes were generated for component ' + displayName + '. \n' + 'Consider using the attrs method, together with a style object for frequently changed styles.\n' + 'Example:\n' + ' const Component = styled.div.attrs(props => ({\n' + ' style: {\n' + ' background: props.background,\n' + ' },\n' + ' }))`width: 100%;`\n\n' + ' '); - warningSeen = true; - generatedClasses = {}; - } - } - }; -}); - -// - -var determineTheme = (function (props, fallbackTheme) { - var defaultProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EMPTY_OBJECT; - - // Props should take precedence over ThemeProvider, which should take precedence over - // defaultProps, but React automatically puts defaultProps on props. - - /* eslint-disable react/prop-types, flowtype-errors/show-errors */ - var isDefaultTheme = defaultProps ? props.theme === defaultProps.theme : false; - var theme = props.theme && !isDefaultTheme ? props.theme : fallbackTheme || defaultProps.theme; - /* eslint-enable */ - - return theme; -}); - -// -var escapeRegex = /[[\].#*$><+~=|^:(),"'`-]+/g; -var dashesAtEnds = /(^-|-$)/g; - -/** - * TODO: Explore using CSS.escape when it becomes more available - * in evergreen browsers. - */ -function escape(str) { - return str - // Replace all possible CSS selectors - .replace(escapeRegex, '-') - - // Remove extraneous hyphens at the start and end - .replace(dashesAtEnds, ''); -} - -// - -function isTag(target) { - return typeof target === 'string' && ( true ? target.charAt(0) === target.charAt(0).toLowerCase() : 0); -} - -// - -function generateDisplayName(target) { - // $FlowFixMe - return isTag(target) ? 'styled.' + target : 'Styled(' + getComponentName(target) + ')'; -} - -var _TYPE_STATICS; - -var REACT_STATICS = { - childContextTypes: true, - contextTypes: true, - defaultProps: true, - displayName: true, - getDerivedStateFromProps: true, - propTypes: true, - type: true -}; - -var KNOWN_STATICS = { - name: true, - length: true, - prototype: true, - caller: true, - callee: true, - arguments: true, - arity: true -}; - -var TYPE_STATICS = (_TYPE_STATICS = {}, _TYPE_STATICS[react_is__WEBPACK_IMPORTED_MODULE_4__.ForwardRef] = { - $$typeof: true, - render: true -}, _TYPE_STATICS); - -var defineProperty$1 = Object.defineProperty, - getOwnPropertyNames = Object.getOwnPropertyNames, - _Object$getOwnPropert = Object.getOwnPropertySymbols, - getOwnPropertySymbols = _Object$getOwnPropert === undefined ? function () { - return []; -} : _Object$getOwnPropert, - getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor, - getPrototypeOf = Object.getPrototypeOf, - objectPrototype = Object.prototype; -var arrayPrototype = Array.prototype; - - -function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) { - if (typeof sourceComponent !== 'string') { - // don't hoist over string (html) components - - var inheritedComponent = getPrototypeOf(sourceComponent); - - if (inheritedComponent && inheritedComponent !== objectPrototype) { - hoistNonReactStatics(targetComponent, inheritedComponent, blacklist); - } - - var keys = arrayPrototype.concat(getOwnPropertyNames(sourceComponent), - // $FlowFixMe - getOwnPropertySymbols(sourceComponent)); - - var targetStatics = TYPE_STATICS[targetComponent.$$typeof] || REACT_STATICS; - - var sourceStatics = TYPE_STATICS[sourceComponent.$$typeof] || REACT_STATICS; - - var i = keys.length; - var descriptor = void 0; - var key = void 0; - - // eslint-disable-next-line no-plusplus - while (i--) { - key = keys[i]; - - if ( - // $FlowFixMe - !KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && - // $FlowFixMe - !(targetStatics && targetStatics[key])) { - descriptor = getOwnPropertyDescriptor(sourceComponent, key); - - if (descriptor) { - try { - // Avoid failures from read-only properties - defineProperty$1(targetComponent, key, descriptor); - } catch (e) { - /* fail silently */ - } - } - } - } - - return targetComponent; - } - - return targetComponent; -} - -// -function isDerivedReactComponent(fn) { - return !!(fn && fn.prototype && fn.prototype.isReactComponent); -} - -// -// Helper to call a given function, only once -var once = (function (cb) { - var called = false; - - return function () { - if (!called) { - called = true; - cb.apply(undefined, arguments); - } - }; -}); - -// - -var ThemeContext = (0,react__WEBPACK_IMPORTED_MODULE_2__.createContext)(); - -var ThemeConsumer = ThemeContext.Consumer; - -/** - * Provide a theme to an entire react component tree via context - */ - -var ThemeProvider = function (_Component) { - inherits(ThemeProvider, _Component); - - function ThemeProvider(props) { - classCallCheck(this, ThemeProvider); - - var _this = possibleConstructorReturn(this, _Component.call(this, props)); - - _this.getContext = (0,memoize_one__WEBPACK_IMPORTED_MODULE_7__["default"])(_this.getContext.bind(_this)); - _this.renderInner = _this.renderInner.bind(_this); - return _this; - } - - ThemeProvider.prototype.render = function render() { - if (!this.props.children) return null; - - return react__WEBPACK_IMPORTED_MODULE_2___default().createElement( - ThemeContext.Consumer, - null, - this.renderInner - ); - }; - - ThemeProvider.prototype.renderInner = function renderInner(outerTheme) { - var context = this.getContext(this.props.theme, outerTheme); - - return react__WEBPACK_IMPORTED_MODULE_2___default().createElement( - ThemeContext.Provider, - { value: context }, - this.props.children - ); - }; - - /** - * Get the theme from the props, supporting both (outerTheme) => {} - * as well as object notation - */ - - - ThemeProvider.prototype.getTheme = function getTheme(theme, outerTheme) { - if (isFunction(theme)) { - var mergedTheme = theme(outerTheme); - - if ( true && (mergedTheme === null || Array.isArray(mergedTheme) || (typeof mergedTheme === 'undefined' ? 'undefined' : _typeof(mergedTheme)) !== 'object')) { - throw new StyledComponentsError(7); - } - - return mergedTheme; - } - - if (theme === null || Array.isArray(theme) || (typeof theme === 'undefined' ? 'undefined' : _typeof(theme)) !== 'object') { - throw new StyledComponentsError(8); - } - - return _extends({}, outerTheme, theme); - }; - - ThemeProvider.prototype.getContext = function getContext(theme, outerTheme) { - return this.getTheme(theme, outerTheme); - }; - - return ThemeProvider; -}(react__WEBPACK_IMPORTED_MODULE_2__.Component); - -// - -var CLOSING_TAG_R = /^\s*<\/[a-z]/i; - -var ServerStyleSheet = function () { - function ServerStyleSheet() { - classCallCheck(this, ServerStyleSheet); - - /* The master sheet might be reset, so keep a reference here */ - this.masterSheet = StyleSheet.master; - this.instance = this.masterSheet.clone(); - this.sealed = false; - } - - /** - * Mark the ServerStyleSheet as being fully emitted and manually GC it from the - * StyleSheet singleton. - */ - - - ServerStyleSheet.prototype.seal = function seal() { - if (!this.sealed) { - /* Remove sealed StyleSheets from the master sheet */ - var index = this.masterSheet.clones.indexOf(this.instance); - this.masterSheet.clones.splice(index, 1); - this.sealed = true; - } - }; - - ServerStyleSheet.prototype.collectStyles = function collectStyles(children) { - if (this.sealed) { - throw new StyledComponentsError(2); - } - - return react__WEBPACK_IMPORTED_MODULE_2___default().createElement( - StyleSheetManager, - { sheet: this.instance }, - children - ); - }; - - ServerStyleSheet.prototype.getStyleTags = function getStyleTags() { - this.seal(); - return this.instance.toHTML(); - }; - - ServerStyleSheet.prototype.getStyleElement = function getStyleElement() { - this.seal(); - return this.instance.toReactElements(); - }; - - ServerStyleSheet.prototype.interleaveWithNodeStream = function interleaveWithNodeStream(readableStream) { - var _this = this; - - { - throw new StyledComponentsError(3); - } - - /* the tag index keeps track of which tags have already been emitted */ - var instance = this.instance; - - var instanceTagIndex = 0; - - var streamAttr = SC_STREAM_ATTR + '="true"'; - - var transformer = new stream.Transform({ - transform: function appendStyleChunks(chunk, /* encoding */_, callback) { - var tags = instance.tags; - - var html = ''; - - /* retrieve html for each new style tag */ - for (; instanceTagIndex < tags.length; instanceTagIndex += 1) { - var tag = tags[instanceTagIndex]; - html += tag.toHTML(streamAttr); - } - - /* force our StyleSheets to emit entirely new tags */ - instance.sealAllTags(); - - var renderedHtml = chunk.toString(); - - /* prepend style html to chunk, unless the start of the chunk is a closing tag in which case append right after that */ - if (CLOSING_TAG_R.test(renderedHtml)) { - var endOfClosingTag = renderedHtml.indexOf('>'); - - this.push(renderedHtml.slice(0, endOfClosingTag + 1) + html + renderedHtml.slice(endOfClosingTag + 1)); - } else this.push(html + renderedHtml); - - callback(); - } - }); - - readableStream.on('end', function () { - return _this.seal(); - }); - - readableStream.on('error', function (err) { - _this.seal(); - - // forward the error to the transform stream - transformer.emit('error', err); - }); - - return readableStream.pipe(transformer); - }; - - return ServerStyleSheet; -}(); - -// - -var StyleSheetContext = (0,react__WEBPACK_IMPORTED_MODULE_2__.createContext)(); -var StyleSheetConsumer = StyleSheetContext.Consumer; - -var StyleSheetManager = function (_Component) { - inherits(StyleSheetManager, _Component); - - function StyleSheetManager(props) { - classCallCheck(this, StyleSheetManager); - - var _this = possibleConstructorReturn(this, _Component.call(this, props)); - - _this.getContext = (0,memoize_one__WEBPACK_IMPORTED_MODULE_7__["default"])(_this.getContext); - return _this; - } - - StyleSheetManager.prototype.getContext = function getContext(sheet, target) { - if (sheet) { - return sheet; - } else if (target) { - return new StyleSheet(target); - } else { - throw new StyledComponentsError(4); - } - }; - - StyleSheetManager.prototype.render = function render() { - var _props = this.props, - children = _props.children, - sheet = _props.sheet, - target = _props.target; - - - return react__WEBPACK_IMPORTED_MODULE_2___default().createElement( - StyleSheetContext.Provider, - { value: this.getContext(sheet, target) }, - true ? react__WEBPACK_IMPORTED_MODULE_2___default().Children.only(children) : 0 - ); - }; - - return StyleSheetManager; -}(react__WEBPACK_IMPORTED_MODULE_2__.Component); - true ? StyleSheetManager.propTypes = { - sheet: prop_types__WEBPACK_IMPORTED_MODULE_8___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_8___default().instanceOf(StyleSheet), prop_types__WEBPACK_IMPORTED_MODULE_8___default().instanceOf(ServerStyleSheet)]), - - target: prop_types__WEBPACK_IMPORTED_MODULE_8___default().shape({ - appendChild: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().func.isRequired) - }) -} : 0; - -// - -var identifiers = {}; - -/* We depend on components having unique IDs */ -function generateId(_ComponentStyle, _displayName, parentComponentId) { - var displayName = typeof _displayName !== 'string' ? 'sc' : escape(_displayName); - - /** - * This ensures uniqueness if two components happen to share - * the same displayName. - */ - var nr = (identifiers[displayName] || 0) + 1; - identifiers[displayName] = nr; - - var componentId = displayName + '-' + _ComponentStyle.generateName(displayName + nr); - - return parentComponentId ? parentComponentId + '-' + componentId : componentId; -} - -// $FlowFixMe - -var StyledComponent = function (_Component) { - inherits(StyledComponent, _Component); - - function StyledComponent() { - classCallCheck(this, StyledComponent); - - var _this = possibleConstructorReturn(this, _Component.call(this)); - - _this.attrs = {}; - - _this.renderOuter = _this.renderOuter.bind(_this); - _this.renderInner = _this.renderInner.bind(_this); - - if (true) { - _this.warnInnerRef = once(function (displayName) { - return ( - // eslint-disable-next-line no-console - console.warn('The "innerRef" API has been removed in styled-components v4 in favor of React 16 ref forwarding, use "ref" instead like a typical component. "innerRef" was detected on component "' + displayName + '".') - ); - }); - - _this.warnAttrsFnObjectKeyDeprecated = once(function (key, displayName) { - return ( - // eslint-disable-next-line no-console - console.warn('Functions as object-form attrs({}) keys are now deprecated and will be removed in a future version of styled-components. Switch to the new attrs(props => ({})) syntax instead for easier and more powerful composition. The attrs key in question is "' + key + '" on component "' + displayName + '".', '\n ' + new Error().stack) - ); - }); - - _this.warnNonStyledComponentAttrsObjectKey = once(function (key, displayName) { - return ( - // eslint-disable-next-line no-console - console.warn('It looks like you\'ve used a non styled-component as the value for the "' + key + '" prop in an object-form attrs constructor of "' + displayName + '".\n' + 'You should use the new function-form attrs constructor which avoids this issue: attrs(props => ({ yourStuff }))\n' + "To continue using the deprecated object syntax, you'll need to wrap your component prop in a function to make it available inside the styled component (you'll still get the deprecation warning though.)\n" + ('For example, { ' + key + ': () => InnerComponent } instead of { ' + key + ': InnerComponent }')) - ); - }); - } - return _this; - } - - StyledComponent.prototype.render = function render() { - return react__WEBPACK_IMPORTED_MODULE_2___default().createElement( - StyleSheetConsumer, - null, - this.renderOuter - ); - }; - - StyledComponent.prototype.renderOuter = function renderOuter() { - var styleSheet = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : StyleSheet.master; - - this.styleSheet = styleSheet; - - // No need to subscribe a static component to theme changes, it won't change anything - if (this.props.forwardedComponent.componentStyle.isStatic) return this.renderInner(); - - return react__WEBPACK_IMPORTED_MODULE_2___default().createElement( - ThemeConsumer, - null, - this.renderInner - ); - }; - - StyledComponent.prototype.renderInner = function renderInner(theme) { - var _props$forwardedCompo = this.props.forwardedComponent, - componentStyle = _props$forwardedCompo.componentStyle, - defaultProps = _props$forwardedCompo.defaultProps, - displayName = _props$forwardedCompo.displayName, - foldedComponentIds = _props$forwardedCompo.foldedComponentIds, - styledComponentId = _props$forwardedCompo.styledComponentId, - target = _props$forwardedCompo.target; - - - var generatedClassName = void 0; - if (componentStyle.isStatic) { - generatedClassName = this.generateAndInjectStyles(EMPTY_OBJECT, this.props); - } else { - generatedClassName = this.generateAndInjectStyles(determineTheme(this.props, theme, defaultProps) || EMPTY_OBJECT, this.props); - } - - var elementToBeCreated = this.props.as || this.attrs.as || target; - var isTargetTag = isTag(elementToBeCreated); - - var propsForElement = {}; - var computedProps = _extends({}, this.props, this.attrs); - - var key = void 0; - // eslint-disable-next-line guard-for-in - for (key in computedProps) { - if ( true && key === 'innerRef' && isTargetTag) { - this.warnInnerRef(displayName); - } - - if (key === 'forwardedComponent' || key === 'as') { - continue; - } else if (key === 'forwardedRef') propsForElement.ref = computedProps[key];else if (key === 'forwardedAs') propsForElement.as = computedProps[key];else if (!isTargetTag || (0,_emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_5__["default"])(key)) { - // Don't pass through non HTML tags through to HTML elements - propsForElement[key] = computedProps[key]; - } - } - - if (this.props.style && this.attrs.style) { - propsForElement.style = _extends({}, this.attrs.style, this.props.style); - } - - propsForElement.className = Array.prototype.concat(foldedComponentIds, styledComponentId, generatedClassName !== styledComponentId ? generatedClassName : null, this.props.className, this.attrs.className).filter(Boolean).join(' '); - - return (0,react__WEBPACK_IMPORTED_MODULE_2__.createElement)(elementToBeCreated, propsForElement); - }; - - StyledComponent.prototype.buildExecutionContext = function buildExecutionContext(theme, props, attrs) { - var _this2 = this; - - var context = _extends({}, props, { theme: theme }); - - if (!attrs.length) return context; - - this.attrs = {}; - - attrs.forEach(function (attrDef) { - var resolvedAttrDef = attrDef; - var attrDefWasFn = false; - var attr = void 0; - var key = void 0; - - if (isFunction(resolvedAttrDef)) { - // $FlowFixMe - resolvedAttrDef = resolvedAttrDef(context); - attrDefWasFn = true; - } - - /* eslint-disable guard-for-in */ - // $FlowFixMe - for (key in resolvedAttrDef) { - attr = resolvedAttrDef[key]; - - if (!attrDefWasFn) { - if (isFunction(attr) && !isDerivedReactComponent(attr) && !isStyledComponent(attr)) { - if (true) { - _this2.warnAttrsFnObjectKeyDeprecated(key, props.forwardedComponent.displayName); - } - - attr = attr(context); - - if ( true && react__WEBPACK_IMPORTED_MODULE_2___default().isValidElement(attr)) { - _this2.warnNonStyledComponentAttrsObjectKey(key, props.forwardedComponent.displayName); - } - } - } - - _this2.attrs[key] = attr; - context[key] = attr; - } - /* eslint-enable */ - }); - - return context; - }; - - StyledComponent.prototype.generateAndInjectStyles = function generateAndInjectStyles(theme, props) { - var _props$forwardedCompo2 = props.forwardedComponent, - attrs = _props$forwardedCompo2.attrs, - componentStyle = _props$forwardedCompo2.componentStyle, - warnTooManyClasses = _props$forwardedCompo2.warnTooManyClasses; - - // statically styled-components don't need to build an execution context object, - // and shouldn't be increasing the number of class names - - if (componentStyle.isStatic && !attrs.length) { - return componentStyle.generateAndInjectStyles(EMPTY_OBJECT, this.styleSheet); - } - - var className = componentStyle.generateAndInjectStyles(this.buildExecutionContext(theme, props, attrs), this.styleSheet); - - if ( true && warnTooManyClasses) warnTooManyClasses(className); - - return className; - }; - - return StyledComponent; -}(react__WEBPACK_IMPORTED_MODULE_2__.Component); - -function createStyledComponent(target, options, rules) { - var isTargetStyledComp = isStyledComponent(target); - var isClass = !isTag(target); - - var _options$displayName = options.displayName, - displayName = _options$displayName === undefined ? generateDisplayName(target) : _options$displayName, - _options$componentId = options.componentId, - componentId = _options$componentId === undefined ? generateId(ComponentStyle, options.displayName, options.parentComponentId) : _options$componentId, - _options$ParentCompon = options.ParentComponent, - ParentComponent = _options$ParentCompon === undefined ? StyledComponent : _options$ParentCompon, - _options$attrs = options.attrs, - attrs = _options$attrs === undefined ? EMPTY_ARRAY : _options$attrs; - - - var styledComponentId = options.displayName && options.componentId ? escape(options.displayName) + '-' + options.componentId : options.componentId || componentId; - - // fold the underlying StyledComponent attrs up (implicit extend) - var finalAttrs = - // $FlowFixMe - isTargetStyledComp && target.attrs ? Array.prototype.concat(target.attrs, attrs).filter(Boolean) : attrs; - - var componentStyle = new ComponentStyle(isTargetStyledComp ? // fold the underlying StyledComponent rules up (implicit extend) - // $FlowFixMe - target.componentStyle.rules.concat(rules) : rules, finalAttrs, styledComponentId); - - /** - * forwardRef creates a new interim component, which we'll take advantage of - * instead of extending ParentComponent to create _another_ interim class - */ - var WrappedStyledComponent = void 0; - var forwardRef = function forwardRef(props, ref) { - return react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ParentComponent, _extends({}, props, { forwardedComponent: WrappedStyledComponent, forwardedRef: ref })); - }; - forwardRef.displayName = displayName; - WrappedStyledComponent = react__WEBPACK_IMPORTED_MODULE_2___default().forwardRef(forwardRef); - WrappedStyledComponent.displayName = displayName; - - // $FlowFixMe - WrappedStyledComponent.attrs = finalAttrs; - // $FlowFixMe - WrappedStyledComponent.componentStyle = componentStyle; - - // $FlowFixMe - WrappedStyledComponent.foldedComponentIds = isTargetStyledComp ? // $FlowFixMe - Array.prototype.concat(target.foldedComponentIds, target.styledComponentId) : EMPTY_ARRAY; - - // $FlowFixMe - WrappedStyledComponent.styledComponentId = styledComponentId; - - // fold the underlying StyledComponent target up since we folded the styles - // $FlowFixMe - WrappedStyledComponent.target = isTargetStyledComp ? target.target : target; - - // $FlowFixMe - WrappedStyledComponent.withComponent = function withComponent(tag) { - var previousComponentId = options.componentId, - optionsToCopy = objectWithoutProperties(options, ['componentId']); - - - var newComponentId = previousComponentId && previousComponentId + '-' + (isTag(tag) ? tag : escape(getComponentName(tag))); - - var newOptions = _extends({}, optionsToCopy, { - attrs: finalAttrs, - componentId: newComponentId, - ParentComponent: ParentComponent - }); - - return createStyledComponent(tag, newOptions, rules); - }; - - // $FlowFixMe - Object.defineProperty(WrappedStyledComponent, 'defaultProps', { - get: function get$$1() { - return this._foldedDefaultProps; - }, - set: function set$$1(obj) { - // $FlowFixMe - this._foldedDefaultProps = isTargetStyledComp ? (0,merge_anything__WEBPACK_IMPORTED_MODULE_6__["default"])(target.defaultProps, obj) : obj; - } - }); - - if (true) { - // $FlowFixMe - WrappedStyledComponent.warnTooManyClasses = createWarnTooManyClasses(displayName); - } - - // $FlowFixMe - WrappedStyledComponent.toString = function () { - return '.' + WrappedStyledComponent.styledComponentId; - }; - - if (isClass) { - hoistNonReactStatics(WrappedStyledComponent, target, { - // all SC-specific things should not be hoisted - attrs: true, - componentStyle: true, - displayName: true, - foldedComponentIds: true, - styledComponentId: true, - target: true, - withComponent: true - }); - } - - return WrappedStyledComponent; -} - -// -// Thanks to ReactDOMFactories for this handy list! - -var domElements = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr', - -// SVG -'circle', 'clipPath', 'defs', 'ellipse', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'marker', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'svg', 'text', 'tspan']; - -// - -var styled = function styled(tag) { - return constructWithOptions(createStyledComponent, tag); -}; - -// Shorthands for all valid HTML Elements -domElements.forEach(function (domElement) { - styled[domElement] = styled(domElement); -}); - -// - -var GlobalStyle = function () { - function GlobalStyle(rules, componentId) { - classCallCheck(this, GlobalStyle); - - this.rules = rules; - this.componentId = componentId; - this.isStatic = isStaticRules(rules, EMPTY_ARRAY); - - if (!StyleSheet.master.hasId(componentId)) { - StyleSheet.master.deferredInject(componentId, []); - } - } - - GlobalStyle.prototype.createStyles = function createStyles(executionContext, styleSheet) { - var flatCSS = flatten(this.rules, executionContext, styleSheet); - var css = stringifyRules(flatCSS, ''); - - styleSheet.inject(this.componentId, css); - }; - - GlobalStyle.prototype.removeStyles = function removeStyles(styleSheet) { - var componentId = this.componentId; - - if (styleSheet.hasId(componentId)) { - styleSheet.remove(componentId); - } - }; - - // TODO: overwrite in-place instead of remove+create? - - - GlobalStyle.prototype.renderStyles = function renderStyles(executionContext, styleSheet) { - this.removeStyles(styleSheet); - this.createStyles(executionContext, styleSheet); - }; - - return GlobalStyle; -}(); - -// - -// place our cache into shared context so it'll persist between HMRs -if (IS_BROWSER) { - window.scCGSHMRCache = {}; -} - -function createGlobalStyle(strings) { - for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - interpolations[_key - 1] = arguments[_key]; - } - - var rules = css.apply(undefined, [strings].concat(interpolations)); - var id = 'sc-global-' + murmurhash(JSON.stringify(rules)); - var style = new GlobalStyle(rules, id); - - var GlobalStyleComponent = function (_React$Component) { - inherits(GlobalStyleComponent, _React$Component); - - function GlobalStyleComponent(props) { - classCallCheck(this, GlobalStyleComponent); - - var _this = possibleConstructorReturn(this, _React$Component.call(this, props)); - - var _this$constructor = _this.constructor, - globalStyle = _this$constructor.globalStyle, - styledComponentId = _this$constructor.styledComponentId; - - - if (IS_BROWSER) { - window.scCGSHMRCache[styledComponentId] = (window.scCGSHMRCache[styledComponentId] || 0) + 1; - } - - /** - * This fixes HMR compatibility. Don't ask me why, but this combination of - * caching the closure variables via statics and then persisting the statics in - * state works across HMR where no other combination did. ÂŻ\_(ă„)_/ÂŻ - */ - _this.state = { - globalStyle: globalStyle, - styledComponentId: styledComponentId - }; - return _this; - } - - GlobalStyleComponent.prototype.componentWillUnmount = function componentWillUnmount() { - if (window.scCGSHMRCache[this.state.styledComponentId]) { - window.scCGSHMRCache[this.state.styledComponentId] -= 1; - } - /** - * Depending on the order "render" is called this can cause the styles to be lost - * until the next render pass of the remaining instance, which may - * not be immediate. - */ - if (window.scCGSHMRCache[this.state.styledComponentId] === 0) { - this.state.globalStyle.removeStyles(this.styleSheet); - } - }; - - GlobalStyleComponent.prototype.render = function render() { - var _this2 = this; - - if ( true && react__WEBPACK_IMPORTED_MODULE_2___default().Children.count(this.props.children)) { - // eslint-disable-next-line no-console - console.warn('The global style component ' + this.state.styledComponentId + ' was given child JSX. createGlobalStyle does not render children.'); - } - - return react__WEBPACK_IMPORTED_MODULE_2___default().createElement( - StyleSheetConsumer, - null, - function (styleSheet) { - _this2.styleSheet = styleSheet || StyleSheet.master; - - var globalStyle = _this2.state.globalStyle; - - - if (globalStyle.isStatic) { - globalStyle.renderStyles(STATIC_EXECUTION_CONTEXT, _this2.styleSheet); - - return null; - } else { - return react__WEBPACK_IMPORTED_MODULE_2___default().createElement( - ThemeConsumer, - null, - function (theme) { - // $FlowFixMe - var defaultProps = _this2.constructor.defaultProps; - - - var context = _extends({}, _this2.props); - - if (typeof theme !== 'undefined') { - context.theme = determineTheme(_this2.props, theme, defaultProps); - } - - globalStyle.renderStyles(context, _this2.styleSheet); - - return null; - } - ); - } - } - ); - }; - - return GlobalStyleComponent; - }((react__WEBPACK_IMPORTED_MODULE_2___default().Component)); - - GlobalStyleComponent.globalStyle = style; - GlobalStyleComponent.styledComponentId = id; - - - return GlobalStyleComponent; -} - -// - -var replaceWhitespace = function replaceWhitespace(str) { - return str.replace(/\s|\\n/g, ''); -}; - -function keyframes(strings) { - /* Warning if you've used keyframes on React Native */ - if ( true && typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { - // eslint-disable-next-line no-console - console.warn('`keyframes` cannot be used on ReactNative, only on the web. To do animation in ReactNative please use Animated.'); - } - - for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - interpolations[_key - 1] = arguments[_key]; - } - - var rules = css.apply(undefined, [strings].concat(interpolations)); - - var name = generateAlphabeticName(murmurhash(replaceWhitespace(JSON.stringify(rules)))); - - return new Keyframes(name, stringifyRules(rules, name, '@keyframes')); -} - -// - -var withTheme = (function (Component$$1) { - var WithTheme = react__WEBPACK_IMPORTED_MODULE_2___default().forwardRef(function (props, ref) { - return react__WEBPACK_IMPORTED_MODULE_2___default().createElement( - ThemeConsumer, - null, - function (theme) { - // $FlowFixMe - var defaultProps = Component$$1.defaultProps; - - var themeProp = determineTheme(props, theme, defaultProps); - - if ( true && themeProp === undefined) { - // eslint-disable-next-line no-console - console.warn('[withTheme] You are not using a ThemeProvider nor passing a theme prop or a theme in defaultProps in component class "' + getComponentName(Component$$1) + '"'); - } - - return react__WEBPACK_IMPORTED_MODULE_2___default().createElement(Component$$1, _extends({}, props, { theme: themeProp, ref: ref })); - } - ); - }); - - hoistNonReactStatics(WithTheme, Component$$1); - - WithTheme.displayName = 'WithTheme(' + getComponentName(Component$$1) + ')'; - - return WithTheme; -}); - -// - -/* eslint-disable */ -var __DO_NOT_USE_OR_YOU_WILL_BE_HAUNTED_BY_SPOOKY_GHOSTS = { - StyleSheet: StyleSheet -}; - -// - -/* Warning if you've imported this file on React Native */ -if ( true && typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { - // eslint-disable-next-line no-console - console.warn("It looks like you've imported 'styled-components' on React Native.\n" + "Perhaps you're looking to import 'styled-components/native'?\n" + 'Read more about this at https://www.styled-components.com/docs/basics#react-native'); -} - -/* Warning if there are several instances of styled-components */ -if ( true && typeof window !== 'undefined' && typeof navigator !== 'undefined' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Node.js') === -1 && navigator.userAgent.indexOf('jsdom') === -1) { - window['__styled-components-init__'] = window['__styled-components-init__'] || 0; - - if (window['__styled-components-init__'] === 1) { - // eslint-disable-next-line no-console - console.warn("It looks like there are several instances of 'styled-components' initialized in this application. " + 'This may cause dynamic styles not rendering properly, errors happening during rehydration process ' + 'and makes your application bigger without a good reason.\n\n' + 'See https://s-c.sh/2BAXzed for more info.'); - } - - window['__styled-components-init__'] += 1; -} - -// - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (styled); - -//# sourceMappingURL=styled-components.browser.esm.js.map - - -/***/ }), - -/***/ "./node_modules/stylis-rule-sheet/index.js": -/*!*************************************************!*\ - !*** ./node_modules/stylis-rule-sheet/index.js ***! - \*************************************************/ -/***/ ((module) => { - -(function (factory) { - true ? (module['exports'] = factory()) : - 0 -}(function () { - - 'use strict' - - return function (insertRule) { - var delimiter = '/*|*/' - var needle = delimiter+'}' - - function toSheet (block) { - if (block) - try { - insertRule(block + '}') - } catch (e) {} - } - - return function ruleSheet (context, content, selectors, parents, line, column, length, ns, depth, at) { - switch (context) { - // property - case 1: - // @import - if (depth === 0 && content.charCodeAt(0) === 64) - return insertRule(content+';'), '' - break - // selector - case 2: - if (ns === 0) - return content + delimiter - break - // at-rule - case 3: - switch (ns) { - // @font-face, @page - case 102: - case 112: - return insertRule(selectors[0]+content), '' - default: - return content + (at === 0 ? delimiter : '') - } - case -2: - content.split(needle).forEach(toSheet) - } - } - } -})) - - -/***/ }), - -/***/ "./node_modules/stylis/stylis.min.js": -/*!*******************************************!*\ - !*** ./node_modules/stylis/stylis.min.js ***! - \*******************************************/ -/***/ ((module) => { - -!function(e){ true?module.exports=e(null):0}(function e(a){"use strict";var r=/^\0+/g,c=/[\0\r\f]/g,s=/: */g,t=/zoo|gra/,i=/([,: ])(transform)/g,f=/,+\s*(?![^(]*[)])/g,n=/ +\s*(?![^(]*[)])/g,l=/ *[\0] */g,o=/,\r+?/g,h=/([\t\r\n ])*\f?&/g,u=/:global\(((?:[^\(\)\[\]]*|\[.*\]|\([^\(\)]*\))*)\)/g,d=/\W+/g,b=/@(k\w+)\s*(\S*)\s*/,p=/::(place)/g,k=/:(read-only)/g,g=/\s+(?=[{\];=:>])/g,A=/([[}=:>])\s+/g,C=/(\{[^{]+?);(?=\})/g,w=/\s{2,}/g,v=/([^\(])(:+) */g,m=/[svh]\w+-[tblr]{2}/,x=/\(\s*(.*)\s*\)/g,$=/([\s\S]*?);/g,y=/-self|flex-/g,O=/[^]*?(:[rp][el]a[\w-]+)[^]*/,j=/stretch|:\s*\w+\-(?:conte|avail)/,z=/([^-])(image-set\()/,N="-webkit-",S="-moz-",F="-ms-",W=59,q=125,B=123,D=40,E=41,G=91,H=93,I=10,J=13,K=9,L=64,M=32,P=38,Q=45,R=95,T=42,U=44,V=58,X=39,Y=34,Z=47,_=62,ee=43,ae=126,re=0,ce=12,se=11,te=107,ie=109,fe=115,ne=112,le=111,oe=105,he=99,ue=100,de=112,be=1,pe=1,ke=0,ge=1,Ae=1,Ce=1,we=0,ve=0,me=0,xe=[],$e=[],ye=0,Oe=null,je=-2,ze=-1,Ne=0,Se=1,Fe=2,We=3,qe=0,Be=1,De="",Ee="",Ge="";function He(e,a,s,t,i){for(var f,n,o=0,h=0,u=0,d=0,g=0,A=0,C=0,w=0,m=0,$=0,y=0,O=0,j=0,z=0,R=0,we=0,$e=0,Oe=0,je=0,ze=s.length,Je=ze-1,Re="",Te="",Ue="",Ve="",Xe="",Ye="";R0)Te=Te.replace(c,"");if(Te.trim().length>0){switch(C){case M:case K:case W:case J:case I:break;default:Te+=s.charAt(R)}C=W}}if(1===$e)switch(C){case B:case q:case W:case Y:case X:case D:case E:case U:$e=0;case K:case J:case I:case M:break;default:for($e=0,je=R,g=C,R--,C=W;je0)++R,C=g;case B:je=ze}}switch(C){case B:for(g=(Te=Te.trim()).charCodeAt(0),y=1,je=++R;R0)Te=Te.replace(c,"");switch(A=Te.charCodeAt(1)){case ue:case ie:case fe:case Q:f=a;break;default:f=xe}if(je=(Ue=He(a,f,Ue,A,i+1)).length,me>0&&0===je)je=Te.length;if(ye>0)if(f=Ie(xe,Te,Oe),n=Pe(We,Ue,f,a,pe,be,je,A,i,t),Te=f.join(""),void 0!==n)if(0===(je=(Ue=n.trim()).length))A=0,Ue="";if(je>0)switch(A){case fe:Te=Te.replace(x,Me);case ue:case ie:case Q:Ue=Te+"{"+Ue+"}";break;case te:if(Ue=(Te=Te.replace(b,"$1 $2"+(Be>0?De:"")))+"{"+Ue+"}",1===Ae||2===Ae&&Le("@"+Ue,3))Ue="@"+N+Ue+"@"+Ue;else Ue="@"+Ue;break;default:if(Ue=Te+Ue,t===de)Ve+=Ue,Ue=""}else Ue="";break;default:Ue=He(a,Ie(a,Te,Oe),Ue,t,i+1)}Xe+=Ue,O=0,$e=0,z=0,we=0,Oe=0,j=0,Te="",Ue="",C=s.charCodeAt(++R);break;case q:case W:if((je=(Te=(we>0?Te.replace(c,""):Te).trim()).length)>1){if(0===z)if((g=Te.charCodeAt(0))===Q||g>96&&g<123)je=(Te=Te.replace(" ",":")).length;if(ye>0)if(void 0!==(n=Pe(Se,Te,a,e,pe,be,Ve.length,t,i,t)))if(0===(je=(Te=n.trim()).length))Te="\0\0";switch(g=Te.charCodeAt(0),A=Te.charCodeAt(1),g){case re:break;case L:if(A===oe||A===he){Ye+=Te+s.charAt(R);break}default:if(Te.charCodeAt(je-1)===V)break;Ve+=Ke(Te,g,A,Te.charCodeAt(2))}}O=0,$e=0,z=0,we=0,Oe=0,Te="",C=s.charCodeAt(++R)}}switch(C){case J:case I:if(h+d+u+o+ve===0)switch($){case E:case X:case Y:case L:case ae:case _:case T:case ee:case Z:case Q:case V:case U:case W:case B:case q:break;default:if(z>0)$e=1}if(h===Z)h=0;else if(ge+O===0&&t!==te&&Te.length>0)we=1,Te+="\0";if(ye*qe>0)Pe(Ne,Te,a,e,pe,be,Ve.length,t,i,t);be=1,pe++;break;case W:case q:if(h+d+u+o===0){be++;break}default:switch(be++,Re=s.charAt(R),C){case K:case M:if(d+o+h===0)switch(w){case U:case V:case K:case M:Re="";break;default:if(C!==M)Re=" "}break;case re:Re="\\0";break;case ce:Re="\\f";break;case se:Re="\\v";break;case P:if(d+h+o===0&&ge>0)Oe=1,we=1,Re="\f"+Re;break;case 108:if(d+h+o+ke===0&&z>0)switch(R-z){case 2:if(w===ne&&s.charCodeAt(R-3)===V)ke=w;case 8:if(m===le)ke=m}break;case V:if(d+h+o===0)z=R;break;case U:if(h+u+d+o===0)we=1,Re+="\r";break;case Y:case X:if(0===h)d=d===C?0:0===d?C:d;break;case G:if(d+h+u===0)o++;break;case H:if(d+h+u===0)o--;break;case E:if(d+h+o===0)u--;break;case D:if(d+h+o===0){if(0===O)switch(2*w+3*m){case 533:break;default:y=0,O=1}u++}break;case L:if(h+u+d+o+z+j===0)j=1;break;case T:case Z:if(d+o+u>0)break;switch(h){case 0:switch(2*C+3*s.charCodeAt(R+1)){case 235:h=Z;break;case 220:je=R,h=T}break;case T:if(C===Z&&w===T&&je+2!==R){if(33===s.charCodeAt(je+2))Ve+=s.substring(je,R+1);Re="",h=0}}}if(0===h){if(ge+d+o+j===0&&t!==te&&C!==W)switch(C){case U:case ae:case _:case ee:case E:case D:if(0===O){switch(w){case K:case M:case I:case J:Re+="\0";break;default:Re="\0"+Re+(C===U?"":"\0")}we=1}else switch(C){case D:if(z+7===R&&108===w)z=0;O=++y;break;case E:if(0==(O=--y))we=1,Re+="\0"}break;case K:case M:switch(w){case re:case B:case q:case W:case U:case ce:case K:case M:case I:case J:break;default:if(0===O)we=1,Re+="\0"}}if(Te+=Re,C!==M&&C!==K)$=C}}m=w,w=C,R++}if(je=Ve.length,me>0)if(0===je&&0===Xe.length&&0===a[0].length==false)if(t!==ie||1===a.length&&(ge>0?Ee:Ge)===a[0])je=a.join(",").length+2;if(je>0){if(f=0===ge&&t!==te?function(e){for(var a,r,s=0,t=e.length,i=Array(t);s1)continue;if(u=n.charCodeAt(n.length-1),d=r.charCodeAt(0),a="",0!==o)switch(u){case T:case ae:case _:case ee:case M:case D:break;default:a=" "}switch(d){case P:r=a+Ee;case ae:case _:case ee:case M:case E:case D:break;case G:r=a+r+Ee;break;case V:switch(2*r.charCodeAt(1)+3*r.charCodeAt(2)){case 530:if(Ce>0){r=a+r.substring(8,h-1);break}default:if(o<1||f[o-1].length<1)r=a+Ee+r}break;case U:a="";default:if(h>1&&r.indexOf(":")>0)r=a+r.replace(v,"$1"+Ee+"$2");else r=a+r+Ee}n+=r}i[s]=n.replace(c,"").trim()}return i}(a):a,ye>0)if(void 0!==(n=Pe(Fe,Ve,f,e,pe,be,je,t,i,t))&&0===(Ve=n).length)return Ye+Ve+Xe;if(Ve=f.join(",")+"{"+Ve+"}",Ae*ke!=0){if(2===Ae&&!Le(Ve,2))ke=0;switch(ke){case le:Ve=Ve.replace(k,":"+S+"$1")+Ve;break;case ne:Ve=Ve.replace(p,"::"+N+"input-$1")+Ve.replace(p,"::"+S+"$1")+Ve.replace(p,":"+F+"input-$1")+Ve}ke=0}}return Ye+Ve+Xe}function Ie(e,a,r){var c=a.trim().split(o),s=c,t=c.length,i=e.length;switch(i){case 0:case 1:for(var f=0,n=0===i?"":e[0]+" ";f0&&ge>0)return s.replace(u,"$1").replace(h,"$1"+Ge);break;default:return e.trim()+s.replace(h,"$1"+e.trim())}default:if(r*ge>0&&s.indexOf("\f")>0)return s.replace(h,(e.charCodeAt(0)===V?"":"$1")+e.trim())}return e+s}function Ke(e,a,r,c){var l,o=0,h=e+";",u=2*a+3*r+4*c;if(944===u)return function(e){var a=e.length,r=e.indexOf(":",9)+1,c=e.substring(0,r).trim(),s=e.substring(r,a-1).trim();switch(e.charCodeAt(9)*Be){case 0:break;case Q:if(110!==e.charCodeAt(10))break;default:for(var t=s.split((s="",f)),i=0,r=0,a=t.length;iL&&h<90||h>96&&h<123||h===R||h===Q&&l.charCodeAt(1)!==Q))switch(isNaN(parseFloat(l))+(-1!==l.indexOf("("))){case 1:switch(l){case"infinite":case"alternate":case"backwards":case"running":case"normal":case"forwards":case"both":case"none":case"linear":case"ease":case"ease-in":case"ease-out":case"ease-in-out":case"paused":case"reverse":case"alternate-reverse":case"inherit":case"initial":case"unset":case"step-start":case"step-end":break;default:l+=De}}o[r++]=l}s+=(0===i?"":",")+o.join(" ")}}if(s=c+s+";",1===Ae||2===Ae&&Le(s,1))return N+s+s;return s}(h);else if(0===Ae||2===Ae&&!Le(h,1))return h;switch(u){case 1015:return 97===h.charCodeAt(10)?N+h+h:h;case 951:return 116===h.charCodeAt(3)?N+h+h:h;case 963:return 110===h.charCodeAt(5)?N+h+h:h;case 1009:if(100!==h.charCodeAt(4))break;case 969:case 942:return N+h+h;case 978:return N+h+S+h+h;case 1019:case 983:return N+h+S+h+F+h+h;case 883:if(h.charCodeAt(8)===Q)return N+h+h;if(h.indexOf("image-set(",11)>0)return h.replace(z,"$1"+N+"$2")+h;return h;case 932:if(h.charCodeAt(4)===Q)switch(h.charCodeAt(5)){case 103:return N+"box-"+h.replace("-grow","")+N+h+F+h.replace("grow","positive")+h;case 115:return N+h+F+h.replace("shrink","negative")+h;case 98:return N+h+F+h.replace("basis","preferred-size")+h}return N+h+F+h+h;case 964:return N+h+F+"flex-"+h+h;case 1023:if(99!==h.charCodeAt(8))break;return l=h.substring(h.indexOf(":",15)).replace("flex-","").replace("space-between","justify"),N+"box-pack"+l+N+h+F+"flex-pack"+l+h;case 1005:return t.test(h)?h.replace(s,":"+N)+h.replace(s,":"+S)+h:h;case 1e3:switch(o=(l=h.substring(13).trim()).indexOf("-")+1,l.charCodeAt(0)+l.charCodeAt(o)){case 226:l=h.replace(m,"tb");break;case 232:l=h.replace(m,"tb-rl");break;case 220:l=h.replace(m,"lr");break;default:return h}return N+h+F+l+h;case 1017:if(-1===h.indexOf("sticky",9))return h;case 975:switch(o=(h=e).length-10,u=(l=(33===h.charCodeAt(o)?h.substring(0,o):h).substring(e.indexOf(":",7)+1).trim()).charCodeAt(0)+(0|l.charCodeAt(7))){case 203:if(l.charCodeAt(8)<111)break;case 115:h=h.replace(l,N+l)+";"+h;break;case 207:case 102:h=h.replace(l,N+(u>102?"inline-":"")+"box")+";"+h.replace(l,N+l)+";"+h.replace(l,F+l+"box")+";"+h}return h+";";case 938:if(h.charCodeAt(5)===Q)switch(h.charCodeAt(6)){case 105:return l=h.replace("-items",""),N+h+N+"box-"+l+F+"flex-"+l+h;case 115:return N+h+F+"flex-item-"+h.replace(y,"")+h;default:return N+h+F+"flex-line-pack"+h.replace("align-content","").replace(y,"")+h}break;case 973:case 989:if(h.charCodeAt(3)!==Q||122===h.charCodeAt(4))break;case 931:case 953:if(true===j.test(e))if(115===(l=e.substring(e.indexOf(":")+1)).charCodeAt(0))return Ke(e.replace("stretch","fill-available"),a,r,c).replace(":fill-available",":stretch");else return h.replace(l,N+l)+h.replace(l,S+l.replace("fill-",""))+h;break;case 962:if(h=N+h+(102===h.charCodeAt(5)?F+h:"")+h,r+c===211&&105===h.charCodeAt(13)&&h.indexOf("transform",10)>0)return h.substring(0,h.indexOf(";",27)+1).replace(i,"$1"+N+"$2")+h}return h}function Le(e,a){var r=e.indexOf(1===a?":":"{"),c=e.substring(0,3!==a?r:10),s=e.substring(r+1,e.length-1);return Oe(2!==a?c:c.replace(O,"$1"),s,a)}function Me(e,a){var r=Ke(a,a.charCodeAt(0),a.charCodeAt(1),a.charCodeAt(2));return r!==a+";"?r.replace($," or ($1)").substring(4):"("+a+")"}function Pe(e,a,r,c,s,t,i,f,n,l){for(var o,h=0,u=a;h0)De=s.replace(d,t===G?"":"-");if(t=1,1===ge)Ge=s;else Ee=s;var i,f=[Ge];if(ye>0)if(void 0!==(i=Pe(ze,r,f,f,pe,be,0,0,0,0))&&"string"==typeof i)r=i;var n=He(xe,f,r,0,0);if(ye>0)if(void 0!==(i=Pe(je,n,f,f,pe,be,n.length,0,0,0))&&"string"!=typeof(n=i))t=0;return De="",Ge="",Ee="",ke=0,pe=1,be=1,we*t==0?n:n.replace(c,"").replace(g,"").replace(A,"$1").replace(C,"$1").replace(w," ")}if(Te.use=function e(a){switch(a){case void 0:case null:ye=$e.length=0;break;default:if("function"==typeof a)$e[ye++]=a;else if("object"==typeof a)for(var r=0,c=a.length;r { - -"use strict"; -module.exports = window["React"]; - -/***/ }), - -/***/ "jquery": -/*!*************************!*\ - !*** external "jQuery" ***! - \*************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["jQuery"]; - -/***/ }), - -/***/ "@wordpress/blocks": -/*!********************************!*\ - !*** external ["wp","blocks"] ***! - \********************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["wp"]["blocks"]; - -/***/ }), - -/***/ "@wordpress/components": -/*!************************************!*\ - !*** external ["wp","components"] ***! - \************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["wp"]["components"]; - -/***/ }), - -/***/ "@wordpress/data": -/*!******************************!*\ - !*** external ["wp","data"] ***! - \******************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["wp"]["data"]; - -/***/ }), - -/***/ "@wordpress/edit-post": -/*!**********************************!*\ - !*** external ["wp","editPost"] ***! - \**********************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["wp"]["editPost"]; - -/***/ }), - -/***/ "@wordpress/element": -/*!*********************************!*\ - !*** external ["wp","element"] ***! - \*********************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["wp"]["element"]; - -/***/ }), - -/***/ "@wordpress/i18n": -/*!******************************!*\ - !*** external ["wp","i18n"] ***! - \******************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["wp"]["i18n"]; - -/***/ }), - -/***/ "@wordpress/plugins": -/*!*********************************!*\ - !*** external ["wp","plugins"] ***! - \*********************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["wp"]["plugins"]; - -/***/ }), - -/***/ "./node_modules/@linaria/react/dist/index.mjs": -/*!****************************************************!*\ - !*** ./node_modules/@linaria/react/dist/index.mjs ***! - \****************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "styled": () => (/* binding */ styled_default) -/* harmony export */ }); -/* harmony import */ var _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @emotion/is-prop-valid */ "./node_modules/@linaria/react/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var _linaria_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @linaria/core */ "./node_modules/@linaria/react/node_modules/@linaria/core/dist/index.mjs"); -// src/styled.ts - - - -var isCapital = (ch) => ch.toUpperCase() === ch; -var filterKey = (keys) => (key) => keys.indexOf(key) === -1; -var omit = (obj, keys) => { - const res = {}; - Object.keys(obj).filter(filterKey(keys)).forEach((key) => { - res[key] = obj[key]; - }); - return res; -}; -function filterProps(asIs, props, omitKeys) { - const filteredProps = omit(props, omitKeys); - if (!asIs) { - const interopValidAttr = typeof _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_0__["default"] === "function" ? { default: _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_0__["default"] } : _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_0__["default"]; - Object.keys(filteredProps).forEach((key) => { - if (!interopValidAttr.default(key)) { - delete filteredProps[key]; - } - }); - } - return filteredProps; -} -var warnIfInvalid = (value, componentName) => { - if (true) { - if (typeof value === "string" || typeof value === "number" && isFinite(value)) { - return; - } - const stringified = typeof value === "object" ? JSON.stringify(value) : String(value); - console.warn( - `An interpolation evaluated to '${stringified}' in the component '${componentName}', which is probably a mistake. You should explicitly cast or transform the value to a string.` - ); - } -}; -function styled(tag) { - return (options) => { - if (true) { - if (Array.isArray(options)) { - throw new Error( - 'Using the "styled" tag in runtime is not supported. Make sure you have set up the Babel plugin correctly. See https://github.com/callstack/linaria#setup' - ); - } - } - const render = (props, ref) => { - const { as: component = tag, class: className } = props; - const shouldKeepProps = options.propsAsIs === void 0 ? !(typeof component === "string" && component.indexOf("-") === -1 && !isCapital(component[0])) : options.propsAsIs; - const filteredProps = filterProps(shouldKeepProps, props, [ - "as", - "class" - ]); - filteredProps.ref = ref; - filteredProps.className = options.atomic ? (0,_linaria_core__WEBPACK_IMPORTED_MODULE_2__.cx)(options.class, filteredProps.className || className) : (0,_linaria_core__WEBPACK_IMPORTED_MODULE_2__.cx)(filteredProps.className || className, options.class); - const { vars } = options; - if (vars) { - const style = {}; - for (const name in vars) { - const variable = vars[name]; - const result = variable[0]; - const unit = variable[1] || ""; - const value = typeof result === "function" ? result(props) : result; - warnIfInvalid(value, options.name); - style[`--${name}`] = `${value}${unit}`; - } - const ownStyle = filteredProps.style || {}; - const keys = Object.keys(ownStyle); - if (keys.length > 0) { - keys.forEach((key) => { - style[key] = ownStyle[key]; - }); - } - filteredProps.style = style; - } - if (tag.__linaria && tag !== component) { - filteredProps.as = component; - return react__WEBPACK_IMPORTED_MODULE_1__.createElement(tag, filteredProps); - } - return react__WEBPACK_IMPORTED_MODULE_1__.createElement(component, filteredProps); - }; - const Result = react__WEBPACK_IMPORTED_MODULE_1__.forwardRef ? react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(render) : (props) => { - const rest = omit(props, ["innerRef"]); - return render(rest, props.innerRef); - }; - Result.displayName = options.name; - Result.__linaria = { - className: options.class, - extends: tag - }; - return Result; - }; -} -var styled_default = true ? new Proxy(styled, { - get(o, prop) { - return o(prop); - } -}) : 0; - -//# sourceMappingURL=index.mjs.map - -/***/ }), - -/***/ "./node_modules/@linaria/react/node_modules/@linaria/core/dist/index.mjs": -/*!*******************************************************************************!*\ - !*** ./node_modules/@linaria/react/node_modules/@linaria/core/dist/index.mjs ***! - \*******************************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "css": () => (/* binding */ css_default), -/* harmony export */ "cx": () => (/* binding */ cx_default) -/* harmony export */ }); -// src/css.ts -var css = () => { - throw new Error( - 'Using the "css" tag in runtime is not supported. Make sure you have set up the Babel plugin correctly.' - ); -}; -var css_default = css; - -// src/cx.ts -var cx = function cx2() { - const presentClassNames = Array.prototype.slice.call(arguments).filter(Boolean); - const atomicClasses = {}; - const nonAtomicClasses = []; - presentClassNames.forEach((arg) => { - const individualClassNames = arg ? arg.split(" ") : []; - individualClassNames.forEach((className) => { - if (className.startsWith("atm_")) { - const [, keyHash] = className.split("_"); - atomicClasses[keyHash] = className; - } else { - nonAtomicClasses.push(className); - } - }); - }); - const result = []; - for (const keyHash in atomicClasses) { - if (Object.prototype.hasOwnProperty.call(atomicClasses, keyHash)) { - result.push(atomicClasses[keyHash]); - } - } - result.push(...nonAtomicClasses); - return result.join(" "); -}; -var cx_default = cx; - -//# sourceMappingURL=index.mjs.map - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // 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/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* 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/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/nonce */ -/******/ (() => { -/******/ __webpack_require__.nc = undefined; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be in strict mode. -(() => { -"use strict"; -/*!**************************************!*\ - !*** ./scripts/entries/gutenberg.ts ***! - \**************************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _gutenberg_FormBlock_registerFormBlock__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../gutenberg/FormBlock/registerFormBlock */ "./scripts/gutenberg/FormBlock/registerFormBlock.tsx"); -/* harmony import */ var _gutenberg_Sidebar_contentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../gutenberg/Sidebar/contentType */ "./scripts/gutenberg/Sidebar/contentType.tsx"); -/* harmony import */ var _gutenberg_MeetingsBlock_registerMeetingBlock__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../gutenberg/MeetingsBlock/registerMeetingBlock */ "./scripts/gutenberg/MeetingsBlock/registerMeetingBlock.tsx"); -/* harmony import */ var _utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/backgroundAppUtils */ "./scripts/utils/backgroundAppUtils.ts"); - - - - -(0,_utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_3__.initBackgroundApp)([_gutenberg_FormBlock_registerFormBlock__WEBPACK_IMPORTED_MODULE_0__["default"], _gutenberg_MeetingsBlock_registerMeetingBlock__WEBPACK_IMPORTED_MODULE_2__["default"], _gutenberg_Sidebar_contentType__WEBPACK_IMPORTED_MODULE_1__.registerHubspotSidebar]); -})(); - -/******/ })() -; -//# sourceMappingURL=gutenberg.js.map \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/gutenberg.js.map b/wp/wp-content/plugins/leadin/build/gutenberg.js.map deleted file mode 100644 index f79511c7..00000000 --- a/wp/wp-content/plugins/leadin/build/gutenberg.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gutenberg.js","mappings":";;;;;;;;;;;;;;;AAAuC;;AAEvC,m7HAAm7H;;AAEn7H,YAAY,4DAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,KAAK,EAAC;;;;;;;;;;;;;;;;ACdrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,OAAO,EAAC;;;;;;;;;;;;;;;;ACRvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,OAAO,EAAC;;;;;;;;;;;;;;;;ACRvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,YAAY,EAAC;;;;;;;;;;;;;;;;;ACjDW;;AAEvC,2+HAA2+H;;AAE3+H,iCAAiC,4DAAO;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,WAAW,EAAC;;;;;;;;;;;;;;;;;;;ACd3B;AACA,IAAMC,iBAAiB,GAAG,mBAA1B;AACA,IAAMC,eAAe,GAAG,iBAAxB;AACA,IAAMC,eAAe,GAAG,iBAAxB;AACA,IAAMC,YAAY,GAAG,cAArB;AACA,IAAMC,UAAU,GAAG,YAAnB;AACO,IAAMC,eAAe,GAAG;EAC3BC,KAAK,EAAEP,mDAAE,CAAC,WAAD,EAAc,QAAd,CADkB;EAE3BQ,OAAO,EAAE,CACL;IAAED,KAAK,EAAEP,mDAAE,CAAC,mBAAD,EAAsB,QAAtB,CAAX;IAA4CS,KAAK,EAAER;EAAnD,CADK,EAEL;IAAEM,KAAK,EAAEP,mDAAE,CAAC,iBAAD,EAAoB,QAApB,CAAX;IAA0CS,KAAK,EAAEP;EAAjD,CAFK,EAGL;IAAEK,KAAK,EAAEP,mDAAE,CAAC,yBAAD,EAA4B,QAA5B,CAAX;IAAkDS,KAAK,EAAEN;EAAzD,CAHK,EAIL;IAAEI,KAAK,EAAEP,mDAAE,CAAC,cAAD,EAAiB,QAAjB,CAAX;IAAuCS,KAAK,EAAEL;EAA9C,CAJK,EAKL;IAAEG,KAAK,EAAEP,mDAAE,CAAC,yBAAD,EAA4B,QAA5B,CAAX;IAAkDS,KAAK,EAAEJ;EAAzD,CALK;AAFkB,CAAxB;AAUA,SAASK,aAAT,CAAuBD,KAAvB,EAA8B;EACjC,OAAQA,KAAK,KAAKR,iBAAV,IACJQ,KAAK,KAAKP,eADN,IAEJO,KAAK,KAAKN,eAFN,IAGJM,KAAK,KAAKL,YAHN,IAIJK,KAAK,KAAKJ,UAJd;AAKH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtBD,2BAA6iBM,MAAM,CAACC,YAApjB;AAAA,IAAQC,WAAR,wBAAQA,WAAR;AAAA,IAAqBC,QAArB,wBAAqBA,QAArB;AAAA,IAA+BC,cAA/B,wBAA+BA,cAA/B;AAAA,IAA+CC,gBAA/C,wBAA+CA,gBAA/C;AAAA,IAAiEC,QAAjE,wBAAiEA,QAAjE;AAAA,IAA2EC,aAA3E,wBAA2EA,aAA3E;AAAA,IAA0FC,GAA1F,wBAA0FA,GAA1F;AAAA,IAA+FC,WAA/F,wBAA+FA,WAA/F;AAAA,IAA4GC,cAA5G,wBAA4GA,cAA5G;AAAA,IAA4HC,kBAA5H,wBAA4HA,kBAA5H;AAAA,IAAgJC,MAAhJ,wBAAgJA,MAAhJ;AAAA,IAAwJC,cAAxJ,wBAAwJA,cAAxJ;AAAA,IAAwKC,YAAxK,wBAAwKA,YAAxK;AAAA,IAAsLC,SAAtL,wBAAsLA,SAAtL;AAAA,IAAiMC,UAAjM,wBAAiMA,UAAjM;AAAA,IAA6MC,iBAA7M,wBAA6MA,iBAA7M;AAAA,IAAgOC,mBAAhO,wBAAgOA,mBAAhO;AAAA,IAAqPC,kBAArP,wBAAqPA,kBAArP;AAAA,IAAyQC,mBAAzQ,wBAAyQA,mBAAzQ;AAAA,IAA8RC,iBAA9R,wBAA8RA,iBAA9R;AAAA,IAAiTC,MAAjT,wBAAiTA,MAAjT;AAAA,IAAyTC,QAAzT,wBAAyTA,QAAzT;AAAA,IAAmUC,UAAnU,wBAAmUA,UAAnU;AAAA,IAA+UC,UAA/U,wBAA+UA,UAA/U;AAAA,IAA2VC,OAA3V,wBAA2VA,OAA3V;AAAA,IAAoWC,YAApW,wBAAoWA,YAApW;AAAA,IAAkXC,WAAlX,wBAAkXA,WAAlX;AAAA,IAA+XC,QAA/X,wBAA+XA,QAA/X;AAAA,IAAyYC,aAAzY,wBAAyYA,aAAzY;AAAA,IAAwZC,SAAxZ,wBAAwZA,SAAxZ;AAAA,IAAmaC,OAAna,wBAAmaA,OAAna;AAAA,IAA4aC,YAA5a,wBAA4aA,YAA5a;AAAA,IAA0bC,iBAA1b,wBAA0bA,iBAA1b;AAAA,IAA6cC,KAA7c,wBAA6cA,KAA7c;AAAA,IAAodC,YAApd,wBAAodA,YAApd;AAAA,IAAkeC,SAAle,wBAAkeA,SAAle;AAAA,IAA6eC,YAA7e,wBAA6eA,YAA7e;AAAA,IAA2fC,yBAA3f,wBAA2fA,yBAA3f;AAAA,IAAshBC,iBAAthB,wBAAshBA,iBAAthB;;;;;;;;;;;;;;;;;ACAA;AACe,SAASK,YAAT,GAAwB;EACnC,OAAQD,uDAAK,CAAC,KAAD,EAAQ;IAAEE,KAAK,EAAE,IAAT;IAAeC,MAAM,EAAE,IAAvB;IAA6BC,OAAO,EAAE,WAAtC;IAAmDC,IAAI,EAAE,MAAzD;IAAiEC,KAAK,EAAE,4BAAxE;IAAsGC,QAAQ,EAAE,CAACT,sDAAI,CAAC,GAAD,EAAM;MAAEU,QAAQ,EAAE,sBAAZ;MAAoCD,QAAQ,EAAET,sDAAI,CAAC,MAAD,EAAS;QAAEW,QAAQ,EAAE,SAAZ;QAAuBC,QAAQ,EAAE,SAAjC;QAA4CC,CAAC,EAAE,k5CAA/C;QAAm8CN,IAAI,EAAE;MAAz8C,CAAT;IAAlD,CAAN,CAAL,EAAgiDP,sDAAI,CAAC,MAAD,EAAS;MAAES,QAAQ,EAAET,sDAAI,CAAC,UAAD,EAAa;QAAEc,EAAE,EAAE,gBAAN;QAAwBL,QAAQ,EAAET,sDAAI,CAAC,MAAD,EAAS;UAAEI,KAAK,EAAE,IAAT;UAAeC,MAAM,EAAE,IAAvB;UAA6BE,IAAI,EAAE;QAAnC,CAAT;MAAtC,CAAb;IAAhB,CAAT,CAApiD;EAAhH,CAAR,CAAb;AACH;;;;;;;;;;;;;;;;ACHD;AACe,SAASQ,mBAAT,GAA+B;EAC1C,OAAQf,sDAAI,CAAC,KAAD,EAAQ;IAAEI,KAAK,EAAE,MAAT;IAAiBC,MAAM,EAAE,MAAzB;IAAiCW,OAAO,EAAE,KAA1C;IAAiDV,OAAO,EAAE,WAA1D;IAAuEE,KAAK,EAAE,4BAA9E;IAA4GS,UAAU,EAAE,8BAAxH;IAAwJR,QAAQ,EAAET,sDAAI,CAAC,MAAD,EAAS;MAAEa,CAAC,EAAE,0yDAAL;MAAizDC,EAAE,EAAE,QAArzD;MAA+zDH,QAAQ,EAAE;IAAz0D,CAAT;EAAtK,CAAR,CAAZ;AACH;;;;;;;;;;;;;;;;ACHD;AACe,SAASO,YAAT,GAAwB;EACnC,OAAQhB,uDAAK,CAAC,KAAD,EAAQ;IAAEE,KAAK,EAAE,MAAT;IAAiBC,MAAM,EAAE,MAAzB;IAAiCC,OAAO,EAAE,WAA1C;IAAuDU,OAAO,EAAE,KAAhE;IAAuER,KAAK,EAAE,4BAA9E;IAA4GS,UAAU,EAAE,8BAAxH;IAAwJR,QAAQ,EAAE,CAACT,sDAAI,CAAC,MAAD,EAAS;MAAES,QAAQ,EAAET,sDAAI,CAAC,SAAD,EAAY;QAAEc,EAAE,EAAE,QAAN;QAAgBK,MAAM,EAAE;MAAxB,CAAZ;IAAhB,CAAT,CAAL,EAAyJnB,sDAAI,CAAC,GAAD,EAAM;MAAEc,EAAE,EAAE,QAAN;MAAgBM,MAAM,EAAE,MAAxB;MAAgCC,WAAW,EAAE,GAA7C;MAAkDd,IAAI,EAAE,MAAxD;MAAgEI,QAAQ,EAAE,SAA1E;MAAqFF,QAAQ,EAAEP,uDAAK,CAAC,GAAD,EAAM;QAAEY,EAAE,EAAE,+BAAN;QAAuCL,QAAQ,EAAE,CAACT,sDAAI,CAAC,MAAD,EAAS;UAAEc,EAAE,EAAE,QAAN;UAAgBP,IAAI,EAAE,OAAtB;UAA+BE,QAAQ,EAAET,sDAAI,CAAC,KAAD,EAAQ;YAAEsB,SAAS,EAAE;UAAb,CAAR;QAA7C,CAAT,CAAL,EAAiGtB,sDAAI,CAAC,GAAD,EAAM;UAAEc,EAAE,EAAE;QAAN,CAAN,CAArG,EAA8Hd,sDAAI,CAAC,MAAD,EAAS;UAAEa,CAAC,EAAE,0yDAAL;UAAizDC,EAAE,EAAE,QAArzD;UAA+zDP,IAAI,EAAE,SAAr0D;UAAg1DI,QAAQ,EAAE,SAA11D;UAAq2DY,IAAI,EAAE;QAA32D,CAAT,CAAlI;MAAjD,CAAN;IAApG,CAAN,CAA7J;EAAlK,CAAR,CAAb;AACH;;;;;;;;;;;;;;;;;;ACHD;AACA;AACe,SAASE,aAAT,OAAuC;EAAA,IAAdC,UAAc,QAAdA,UAAc;EAClD,IAAQvC,QAAR,GAA6BuC,UAA7B,CAAQvC,QAAR;EAAA,IAAkBwC,MAAlB,GAA6BD,UAA7B,CAAkBC,MAAlB;;EACA,IAAIxC,QAAQ,IAAIwC,MAAhB,EAAwB;IACpB,OAAQ3B,sDAAI,CAACwB,uDAAD,EAAU;MAAEI,SAAS,EAAE,oCAAb;MAAmDnB,QAAQ,8BAAsBtB,QAAtB,qBAAuCwC,MAAvC;IAA3D,CAAV,CAAZ;EACH;;EACD,OAAO,IAAP;AACH;;;;;;;;;;;;;;;;;;;;ACRD;AACA;AACA;AACA;AACe,SAASI,oBAAT,GAAgC;EAC3C,OAAQ/B,sDAAI,CAAC6B,2CAAD,EAAW;IAAEpB,QAAQ,EAAET,sDAAI,CAAC8B,6DAAD,EAAU;MAAEE,GAAG,EAAE,2BAAP;MAAoCC,GAAG,YAAKlD,+DAAL;IAAvC,CAAV;EAAhB,CAAX,CAAZ;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACND;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASyD,iBAAT,GAA6B;EACxC,IAAMC,aAAa,GAAG,SAAhBA,aAAgB,CAACC,KAAD,EAAW;IAC7B,IAAIA,KAAK,CAAChB,UAAN,CAAiBiB,OAArB,EAA8B;MAC1B,OAAO3C,sDAAI,CAAC+B,6DAAD,EAAuB,EAAvB,CAAX;IACH,CAFD,MAGK,IAAIpE,qEAAgB,KAAK2E,gFAAzB,EAAqD;MACtD,OAAOtC,sDAAI,CAACqC,6DAAD,kCAAgBK,KAAhB;QAAuBG,MAAM,EAAE,WAA/B;QAA4CF,OAAO,EAAE;MAArD,GAAX;IACH,CAFI,MAGA;MACD,OAAO3C,sDAAI,CAACoC,mEAAD,EAAe;QAAEU,MAAM,EAAE;MAAV,CAAf,CAAX;IACH;EACJ,CAVD,CADwC,CAYxC;;;EACA,IAAI,CAACZ,8CAAD,IAAgBK,sEAAgB,EAApC,EAAwC;IACpC,OAAO,IAAP;EACH;;EACDL,gEAAA,CAA8B,2BAA9B,EAA2D;IACvDc,KAAK,EAAErG,mDAAE,CAAC,cAAD,EAAiB,QAAjB,CAD8C;IAEvDsG,WAAW,EAAEtG,mDAAE,CAAC,iCAAD,EAAoC,QAApC,CAFwC;IAGvDuG,IAAI,EAAEhC,4DAHiD;IAIvDiC,QAAQ,EAAE,eAJ6C;IAKvDzB,UAAU,EAAE;MACRvC,QAAQ,EAAE;QACNiE,IAAI,EAAE,QADA;QAEN,WAAS;MAFH,CADF;MAKRzB,MAAM,EAAE;QACJyB,IAAI,EAAE;MADF,CALA;MAQRC,QAAQ,EAAE;QACND,IAAI,EAAE;MADA,CARF;MAWRT,OAAO,EAAE;QACLS,IAAI,EAAE,SADD;QAEL,WAAS;MAFJ;IAXD,CAL2C;IAqBvDE,OAAO,EAAE;MACL5B,UAAU,EAAE;QACRiB,OAAO,EAAE;MADD;IADP,CArB8C;IA0BvDY,IAAI,EAAEd,aA1BiD;IA2BvDe,IAAI,EAAE,cAAAd,KAAK;MAAA,OAAI1C,sDAAI,CAACmC,sDAAD,oBAAqBO,KAArB,EAAR;IAAA;EA3B4C,CAA3D;AA6BH;;;;;;;;;;;;;;;;;;;;ACxDD;AACA;AACA;AACA;AACe,SAASe,uBAAT,GAAmC;EAC9C,OAAQzD,sDAAI,CAAC6B,2CAAD,EAAW;IAAEpB,QAAQ,EAAET,sDAAI,CAAC8B,6DAAD,EAAU;MAAEE,GAAG,EAAE,8BAAP;MAAuC5B,KAAK,EAAE,MAA9C;MAAsD6B,GAAG,YAAKlD,+DAAL;IAAzD,CAAV;EAAhB,CAAX,CAAZ;AACH;;;;;;;;;;;;;;;;;;ACND;AACA;AACe,SAAS2E,gBAAT,OAA2C;EAAA,IAAfhC,UAAe,QAAfA,UAAe;EACtD,IAAQiC,GAAR,GAAgBjC,UAAhB,CAAQiC,GAAR;;EACA,IAAIA,GAAJ,EAAS;IACL,OAAQ3D,sDAAI,CAACwB,uDAAD,EAAU;MAAEI,SAAS,EAAE,uCAAb;MAAsDnB,QAAQ,2BAAmBkD,GAAnB;IAA9D,CAAV,CAAZ;EACH;;EACD,OAAO,IAAP;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACRD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMrB,gBAAgB,GAAG;EACrBM,SAAS,EAAE,WADU;EAErBiB,YAAY,EAAE;AAFO,CAAzB;AAIe,SAASC,oBAAT,GAAgC;EAC3C,IAAMrB,aAAa,GAAG,SAAhBA,aAAgB,CAACC,KAAD,EAAW;IAC7B,IAAIA,KAAK,CAAChB,UAAN,CAAiBiB,OAArB,EAA8B;MAC1B,OAAO3C,sDAAI,CAACyD,gEAAD,EAA0B,EAA1B,CAAX;IACH,CAFD,MAGK,IAAI9F,qEAAgB,KAAK2E,gBAAgB,CAACM,SAA1C,EAAqD;MACtD,OAAO5C,sDAAI,CAAC4D,mEAAD,kCAAmBlB,KAAnB;QAA0BC,OAAO,EAAE,IAAnC;QAAyCE,MAAM,EAAE;MAAjD,GAAX;IACH,CAFI,MAGA;MACD,OAAO7C,sDAAI,CAACoC,mEAAD,EAAe;QAAEU,MAAM,EAAE;MAAV,CAAf,CAAX;IACH;EACJ,CAVD,CAD2C,CAY3C;;;EACA,IAAI,CAACZ,8CAAD,IAAgBK,qEAAgB,EAApC,EAAwC;IACpC,OAAO,IAAP;EACH;;EACDL,gEAAA,CAA8B,8BAA9B,EAA8D;IAC1Dc,KAAK,EAAErG,mDAAE,CAAC,4BAAD,EAA+B,QAA/B,CADiD;IAE1DsG,WAAW,EAAEtG,mDAAE,CAAC,iHAAD,EAAoH,QAApH,CAF2C;IAG1DuG,IAAI,EAAE/C,4DAHoD;IAI1DgD,QAAQ,EAAE,eAJgD;IAK1DzB,UAAU,EAAE;MACRiC,GAAG,EAAE;QACDP,IAAI,EAAE,QADL;QAED,WAAS;MAFR,CADG;MAKRT,OAAO,EAAE;QACLS,IAAI,EAAE,SADD;QAEL,WAAS;MAFJ;IALD,CAL8C;IAe1DE,OAAO,EAAE;MACL5B,UAAU,EAAE;QACRiB,OAAO,EAAE;MADD;IADP,CAfiD;IAoB1DY,IAAI,EAAEd,aApBoD;IAqB1De,IAAI,EAAE,cAAAd,KAAK;MAAA,OAAI1C,sDAAI,CAAC0D,yDAAD,oBAAwBhB,KAAxB,EAAR;IAAA;EArB+C,CAA9D;AAuBH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrDD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS8B,sBAAT,GAAkC;EACrC,IAAMC,qBAAqB,GAAGJ,8DAAH,8HAA3B;;EAIA,IAAMM,gBAAgB,GAAI3E,sDAAI,CAACyE,qBAAD,EAAwB;IAAEhE,QAAQ,EAAE9D,mDAAE,CAAC,mEAAD,EAAsE,QAAtE;EAAd,CAAxB,CAA9B;;EACA,IAAMiI,mBAAmB,GAAG,SAAtBA,mBAAsB;IAAA,IAAGC,QAAH,QAAGA,QAAH;IAAA,OAAkBA,QAAQ,GAAI7E,sDAAI,CAACgE,+DAAD,EAAgB;MAAEc,IAAI,EAAE,QAAR;MAAkB9B,KAAK,EAAE,SAAzB;MAAoCE,IAAI,EAAElD,sDAAI,CAACkE,uDAAD,EAAO;QAAEtC,SAAS,EAAE,4BAAb;QAA2CsB,IAAI,EAAEnC,uEAAmB;MAApE,CAAP,CAA9C;MAAgIN,QAAQ,EAAET,sDAAI,CAACiE,4DAAD,EAAY;QAAEjB,KAAK,EAAErG,mDAAE,CAAC,mBAAD,EAAsB,QAAtB,CAAX;QAA4CoI,WAAW,EAAE,IAAzD;QAA+DtE,QAAQ,EAAET,sDAAI,CAACsE,kFAAD,EAA+B;UAAElH,KAAK,EAAEmC,iEAAY,IAAIgF,oFAAwB,CAAChF,iEAAD,CAAjD;UAAiEkB,QAAQ,EAAET,sDAAI,CAACoE,4EAAD,EAAyB;YAAEa,OAAO,EAAE,cAAX;YAA2BrD,SAAS,EAAE,qBAAtC;YAA6D1E,KAAK,EAAEyH,gBAApE;YAAsFxH,OAAO,EAAE,CACvgB;cAAED,KAAK,EAAEP,mDAAE,CAAC,sBAAD,EAAyB,QAAzB,CAAX;cAA+CS,KAAK,EAAE;YAAtD,CADugB,EAEvgB;cAAEF,KAAK,EAAEP,mDAAE,CAAC,WAAD,EAAc,QAAd,CAAX;cAAoCS,KAAK,EAAE;YAA3C,CAFugB,EAGvgB;cACIF,KAAK,EAAEP,mDAAE,CAAC,mBAAD,EAAsB,QAAtB,CADb;cAEIS,KAAK,EAAE;YAFX,CAHugB,EAOvgB;cAAEF,KAAK,EAAEP,mDAAE,CAAC,cAAD,EAAiB,QAAjB,CAAX;cAAuCS,KAAK,EAAE;YAA9C,CAPugB,EAQvgB;cAAEF,KAAK,EAAEP,mDAAE,CAAC,cAAD,EAAiB,QAAjB,CAAX;cAAuCS,KAAK,EAAE;YAA9C,CARugB,EASvgB;cACIF,KAAK,EAAEP,mDAAE,CAAC,eAAD,EAAkB,QAAlB,CADb;cAEIS,KAAK,EAAE;YAFX,CATugB;UAA/F,CAAzB;QAA/E,CAA/B;MAA7E,CAAZ;IAA9I,CAAhB,CAAR,GAarB,IAbL;EAAA,CAA5B;;EAcA,IAAM8H,0BAA0B,GAAGf,2DAAU,CAAC,UAACgB,MAAD,EAAY;IACtD,IAAMC,IAAI,GAAGD,MAAM,CAAC,aAAD,CAAnB;IACA,OAAO;MACHN,QAAQ,EAAEO,IAAI,IACVA,IAAI,CAACC,kBAAL,EADM,IAEND,IAAI,CAACE,sBAAL,CAA4B,MAA5B;IAHD,CAAP;EAKH,CAP4C,CAAV,CAOhCV,mBAPgC,CAAnC;;EAQA,IAAIb,+CAAJ,EAAkB;IACdA,8DAAA,CAA4B,QAA5B,EAAsC;MAClCyB,MAAM,EAAEN,0BAD0B;MAElChC,IAAI,EAAEnC,mEAAmBA;IAFS,CAAtC;EAIH;AACJ;;;;;;;;;;;;;;;;AC9CD;;AAAwC,WACtB,sBADsB0E,IACtB;EAAA,OACN/C,eAAK;IAAA,OAAKA,KAAK,CAACrC,MAANqC,GAAeA,KAAK,CAACrC,MAArBqC,GAA8B,MAAnC;EAAA,CADC;AAAA,CADsB;;AAEmB,YADzC,sBACyCgD,KADzC;EAAA,OAEPhD,eAAK;IAAA,OAAKA,KAAK,CAACtC,KAANsC,GAAcA,KAAK,CAACtC,KAApBsC,GAA4B,MAAjC;EAAA,CAFE;AAAA,CACyC;;AAD3D,8EAAe2B,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;EAAAC;IAAA,cACTH,IAA+C,EADtC;IACsC,cAChDC,KAA6C,EADG;EADtC;AAAA,CAANrB,CAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;;AACA,IAAMD,sBAAsB,GAAG,SAAzBA,sBAAyB,CAAC1B,KAAD,EAAW;EACtC,IAAMwD,oBAAoB,GAAGH,iFAAuB,EAApD;EACA,IAAMI,wBAAwB,GAAGH,kFAAwB,EAAzD;EACA,OAAQhG,sDAAI,CAAC6F,gEAAD;IAAkBzI,KAAK,EAAEsF,KAAK,CAAC0D,SAA/B;IAA0CC,QAAQ,EAAE,kBAAAC,OAAO,EAAI;MACnE,IAAI5D,KAAK,CAAC6D,YAAV,EAAwB;QACpB7D,KAAK,CAAC6D,YAAN,CAAmBD,OAAnB;MACH;;MACDJ,oBAAoB,IAChBC,wBAAwB,CAAC;QACrBK,GAAG,EAAEP,4FADgB;QAErBS,OAAO,EAAE;UACLzB,OAAO,EAAEvC,KAAK,CAACuC;QADV;MAFY,CAAD,CAD5B;IAOH;EAXO,GAWFvC,KAXE,EAAZ;AAYH,CAfD;;AAgBA,iEAAeoD,+DAAY,CAAC1B,sBAAD,CAA3B;;;;;;;;;;;;;;;ACrBO,IAAMuC,YAAY,GAAG;EACxBC,gBAAgB,EAAE,4CADM;EAExBC,gBAAgB,EAAE,4CAFM;EAGxBC,iBAAiB,EAAE,6CAHK;EAIxBC,mBAAmB,EAAE,+CAJG;EAKxBC,UAAU,EAAE,qCALY;EAMxBC,YAAY,EAAE,wCANU;EAOxBC,uBAAuB,EAAE;AAPD,CAArB;;;;;;;;;;;;;;;ACAA,IAAMC,YAAY,GAAG;EACxBC,uBAAuB,EAAE;AADD,CAArB;;;;;;;;;;;;;;;;;;;;;;;;ACAP;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACHO,IAAMC,gBAAgB,GAAG;EAC5BC,2BAA2B,EAAE;AADD,CAAzB;;;;;;;;;;;;;;;ACAA,IAAMC,cAAc,GAAG;EAC1BC,wBAAwB,EAAE,4BADA;EAE1BC,kBAAkB,EAAE,sBAFM;EAG1BC,YAAY,EAAE,uCAHY;EAI1BC,4BAA4B,EAAE,mCAJJ;EAK1BC,6BAA6B,EAAE,oCALL;EAM1BC,0BAA0B,EAAE,iCANF;EAO1BC,6BAA6B,EAAE,oCAPL;EAQ1BC,2BAA2B,EAAE,kCARH;EAS1BC,wBAAwB,EAAE,6BATA;EAU1BC,yBAAyB,EAAE,oCAVD;EAW1BC,sBAAsB,EAAE,iCAXE;EAY1BC,yBAAyB,EAAE,8BAZD;EAa1BC,uBAAuB,EAAE,4BAbC;EAc1BC,iBAAiB,EAAE,qBAdO;EAe1BC,kBAAkB,EAAE,sBAfM;EAgB1BC,eAAe,EAAE,mBAhBS;EAiB1BC,sBAAsB,EAAE,2BAjBE;EAkB1BC,0BAA0B,EAAE,+BAlBF;EAmB1BC,2BAA2B,EAAE,gCAnBH;EAoB1BC,wBAAwB,EAAE,6BApBA;EAqB1BC,6BAA6B,EAAE,kCArBL;EAsB1BC,8BAA8B,EAAE,mCAtBN;EAuB1BC,2BAA2B,EAAE;AAvBH,CAAvB;;;;;;;;;;;;;;;ACAA,IAAM7C,aAAa,GAAG;EACzB8C,UAAU,EAAE,aADa;EAEzBC,SAAS,EAAE,YAFc;EAGzBC,sBAAsB,EAAE,2BAHC;EAIzBC,SAAS,EAAE,YAJc;EAKzBC,qBAAqB,EAAE,0BALE;EAMzBC,kCAAkC,EAAE,yCANX;EAOzBC,wBAAwB,EAAE,8BAPD;EAQzBC,uBAAuB,EAAE,2BARA;EASzBC,sBAAsB,EAAE,2BATC;EAUzBC,4BAA4B,EAAE,kCAVL;EAWzBC,uBAAuB,EAAE,4BAXA;EAYzBC,yBAAyB,EAAE,8BAZF;EAazBjD,sBAAsB,EAAE,2BAbC;EAczBkD,uBAAuB,EAAE,4BAdA;EAezBC,4BAA4B,EAAE,iCAfL;EAgBzBC,0BAA0B,EAAE,+BAhBH;EAiBzBC,uBAAuB,EAAE;AAjBA,CAAtB;;;;;;;;;;;;;;;;;;;;ACAP;AACO,IAAMxF,mBAAmB,gBAAGyF,oDAAa,CAAC,IAAD,CAAzC;AACA,SAAShE,uBAAT,GAAmC;EACtC,OAAOiE,iDAAU,CAAC1F,mBAAD,CAAjB;AACH;AACM,SAAS0B,wBAAT,GAAoC;EACvC,IAAMiE,GAAG,GAAGlE,uBAAuB,EAAnC;EACA,OAAO,UAACmE,OAAD,EAAa;IAChBD,GAAG,CAACE,WAAJ,CAAgBD,OAAhB;EACH,CAFD;AAGH;AACM,SAASE,6BAAT,GAAyC;EAC5C,IAAMH,GAAG,GAAGlE,uBAAuB,EAAnC;EACA,OAAO,UAACmE,OAAD;IAAA,OAAaD,GAAG,CAACI,gBAAJ,CAAqBH,OAArB,CAAb;EAAA,CAAP;AACH;;;;;;;;;;;;;;;;;;;ACdD;AACA;AACO,SAASK,cAAT,GAA0B;EAC7B,IAAIpM,2EAAA,CAAuB,iBAAvB,MAA8C,CAAC,CAAnD,EAAsD;IAClD;EACH;;EACDmM,sDAAA,CAAa,mEAAb,EAAkF;IAC9EI,UAAU,EAAE;MACRC,QAAQ,EAAE;IADF,CADkE;IAI9EC,OAAO,EAAElM,wEAAmBA;EAJkD,CAAlF,EAKGmM,OALH;EAMAP,8DAAA,CAAqB;IACjBS,CAAC,EAAErM,wEADc;IAEjBsM,GAAG,EAAElM,+DAFY;IAGjBmM,SAAS,EAAEtL,8DAASA;EAHH,CAArB;EAKA2K,+DAAA,CAAsB;IAClBa,GAAG,EAAEhM,6DADa;IAElBH,OAAO,EAAEoM,MAAM,CAACC,IAAP,CAAYrM,4DAAZ,EACJsM,GADI,CACA,UAAAxG,IAAI;MAAA,iBAAOA,IAAP,cAAe9F,4DAAO,CAAC8F,IAAD,CAAtB;IAAA,CADJ,EAEJyG,IAFI,CAEC,GAFD;EAFS,CAAtB;AAMH;AACD,iEAAejB,iDAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMyB,SAAS,gBAAG1H,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAlB;;AAKE,YAVgB,sBAUhBqB,KAVgB;EAAA,OAiBAhD,eAAK;IAAA,OAAKA,KAAK,CAACsJ,OAANtJ,GAAgB,GAAhBA,GAAsB,KAA3B;EAAA,CAjBL;AAAA,CAUhB;;AAOsD,YAjBtC,sBAiBsCuJ,KAjBtC;EAAA,OA2BFvJ,eAAK;IAAA,OAAIA,KAAK,CAACsJ,OAANtJ,uBAA6BkJ,gEAA7BlJ,IAAgD,MAApD;EAAA,CA3BH;AAAA,CAiBsC;;AANxD,IAAMwJ,gBAAgB,gBAAG7H,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;EAAAC;IAAA,eAMbF,KAAsC,EANzB;IAMyB,eAUxCuG,KAA+D,EAVvB;EANzB;AAAA,CAAN5H,CAAzB;AAqBA,IAAM8H,cAAc,gBAAG9H,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAvB;AAUA,IAAM+H,WAAW,gBAAG/H,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAApB;AAUA,IAAMgI,WAAW,gBAAGhI,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAApB;AAaA,IAAMiI,kBAAkB,gBAAGjI,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAA3B;AAOA,IAAMkI,iBAAiB,gBAAGlI,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAA1B;AAQA,IAAMmI,cAAc,gBAAGnI,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAvB;AAQA,IAAMoI,KAAK,gBAAGpI,sDAAM,SAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAd;AAWA,IAAMqI,WAAW,gBAAGrI,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAApB;AAKA,IAAMsI,aAAa,gBAAGtI,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAtB;AAWA,IAAMuI,QAAQ,gBAAGvI,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAjB;AAOA,IAAMwI,SAAS,gBAAGxI,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAlB;AAIA,IAAMyI,eAAe,gBAAGzI,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAxB;;AASE,YAvIgB,sBAuIhB0I,KAvIgB;EAAA,OA0IIrK,eAAK;IAAA,OAAIA,KAAK,CAACsK,QAANtK,GAAiBkJ,gEAAjBlJ,GAAkC,aAAtC;EAAA,CA1IT;AAAA,CAuIhB;;AAG4E,YA1I5D,sBA0I4DuK,KA1I5D;EAAA,OA2IPvK,eAAK;IAAA,OAAKA,KAAK,CAACsK,QAANtK,GAAiB,MAAjBA,GAA0B,SAA/B;EAAA,CA3IE;AAAA,CA0I4D;;AACrB,YA3IvC,sBA2IuCwK,KA3IvC;EAAA,OAiJMxK,eAAK;IAAA,OAAIA,KAAK,CAACsK,QAANtK,GAAiBkJ,gEAAjBlJ,GAAkCiJ,+DAAtC;EAAA,CAjJX;AAAA,CA2IuC;;AAHzD,IAAMwB,QAAQ,gBAAG9I,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;EAAAC;IAAA,eAEDmH,KAAwD,EAFvD;IAEuD,eACnEE,KAA8C,EADqB,CAFvD;IAGkC,eAMjCC,KAAwD,EANvB;EAHlC;AAAA,CAAN7I,CAAjB;AAYe,SAAS+I,WAAT,OAAqF;EAAA,IAA9DC,WAA8D,QAA9DA,WAA8D;EAAA,IAAjDjQ,KAAiD,QAAjDA,KAAiD;EAAA,IAA1CkQ,WAA0C,QAA1CA,WAA0C;EAAA,IAA7BjH,QAA6B,QAA7BA,QAA6B;EAAA,IAAnBkH,cAAmB,QAAnBA,cAAmB;EAChG,IAAMC,OAAO,GAAGhC,6CAAM,CAAC,IAAD,CAAtB;EACA,IAAMiC,aAAa,GAAGjC,6CAAM,CAAC,IAAD,CAA5B;;EACA,gBAA8BC,+CAAQ,CAAC,KAAD,CAAtC;EAAA;EAAA,IAAOiC,SAAP;EAAA,IAAkBC,QAAlB;;EACA,iBAAkClC,+CAAQ,CAACK,kEAAD,CAA1C;EAAA;EAAA,IAAO+B,SAAP;EAAA,IAAkBC,YAAlB;;EACA,iBAAoCrC,+CAAQ,CAAC,EAAD,CAA5C;EAAA;EAAA,IAAOsC,UAAP;EAAA,IAAmBC,aAAnB;;EACA,iBAA8BvC,+CAAQ,CAAC8B,cAAD,CAAtC;EAAA;EAAA,IAAOpQ,OAAP;EAAA,IAAgB8Q,UAAhB;;EACA,IAAMC,SAAS,aAAMT,aAAa,CAACU,OAAdV,GAAwBA,aAAa,CAACU,OAAdV,CAAsBW,WAAtBX,GAAoC,EAA5DA,GAAiE,CAAvE,OAAf;EACA/B,gDAAS,CAAC,YAAM;IACZ,IAAI4B,WAAW,IAAIO,SAAS,KAAK/B,kEAAjC,EAAsD;MAClDwB,WAAW,CAAC,EAAD,EAAMe,gBAAM,EAAK;QACxBJ,UAAU,CAACI,MAAD,CAAVJ;QACAH,YAAY,CAAChC,6DAAD,CAAZgC;MACH,CAHU,CAAXR;IAIJ;EACH,CAPQ,EAON,CAACA,WAAD,EAAcO,SAAd,CAPM,CAATnC;;EAQA,IAAM6C,WAAW,GAAG,SAAdA,WAAc,GAA2B;IAAA,IAA1BC,KAA0B,uEAAlB,EAAkB;IAAA,IAAdC,SAAc;IAC3C,OAAOD,KAAK,CAAClD,GAANkD,CAAU,UAACE,IAAD,EAAOC,KAAP,EAAiB;MAC9B,IAAID,IAAI,CAACvR,OAAT,EAAkB;QACd,OAAQ+C,uDAAK,CAAC2M,SAAD,EAAY;UAAEpM,QAAQ,EAAE,CAACT,sDAAI,CAAC8M,eAAD,EAAkB;YAAEhM,EAAE,YAAK6N,KAAL,aAAJ;YAA0BlO,QAAQ,EAAEiO,IAAI,CAACxR;UAAzC,CAAlB,CAAL,EAA0E8C,sDAAI,CAAC,KAAD,EAAQ;YAAES,QAAQ,EAAE8N,WAAW,CAACG,IAAI,CAACvR,OAAN,EAAewR,KAAf;UAAvB,CAAR,CAA9E;QAAZ,CAAZ,8BAAuLA,KAAvL,EAAb;MACH,CAFD,MAGK;QACD,IAAMnI,GAAG,+BAAwBiI,SAAS,KAAKG,SAAdH,aAA6BA,SAA7BA,cAA0CE,KAA1CF,IAAoDE,KAA5E,CAAT;QACA,OAAQ3O,sDAAI,CAACmN,QAAD,EAAW;UAAErM,EAAE,EAAE0F,GAAN;UAAWwG,QAAQ,EAAE5P,KAAK,IAAIsR,IAAI,CAACtR,KAALsR,KAAetR,KAAK,CAACA,KAAnD;UAA0DyR,OAAO,EAAE,mBAAM;YACxFxI,QAAQ,CAACqI,IAAD,CAARrI;YACAsH,QAAQ,CAAC,KAAD,CAARA;UACH,CAHkB;UAGhBlN,QAAQ,EAAEiO,IAAI,CAACxR;QAHC,CAAX,EAGmBsJ,GAHnB,CAAZ;MAIJ;IACH,CAXMgI,CAAP;EAYH,CAbD;;EAcA,OAAQtO,uDAAK,CAAC6L,SAAD,EAAY;IAAEtL,QAAQ,EAAE,CAACP,uDAAK,CAACgM,gBAAD,EAAmB;MAAEpL,EAAE,EAAE,uBAAN;MAA+BkL,OAAO,EAAE0B,SAAxC;MAAmDmB,OAAO,EAAE,mBAAM;QAChH,IAAInB,SAAJ,EAAe;UACX,IAAIF,OAAO,CAACW,OAAZ,EAAqB;YACjBX,OAAO,CAACW,OAARX,CAAgBsB,IAAhBtB;UACJ;;UACAG,QAAQ,CAAC,KAAD,CAARA;UACAK,aAAa,CAAC,EAAD,CAAbA;QACH,CAND,MAOK;UACD,IAAIR,OAAO,CAACW,OAAZ,EAAqB;YACjBX,OAAO,CAACW,OAARX,CAAgBuB,KAAhBvB;UACJ;;UACAG,QAAQ,CAAC,IAAD,CAARA;QACJ;MACH,CAdiD;MAc/ClN,QAAQ,EAAE,CAACP,uDAAK,CAACiM,cAAD,EAAiB;QAAE1L,QAAQ,EAAE,CAACsN,UAAU,KAAK,EAAfA,KAChC,CAAC3Q,KAAD,GAAU4C,sDAAI,CAACoM,WAAD,EAAc;UAAE3L,QAAQ,EAAE4M;QAAZ,CAAd,CAAd,GAA2DrN,sDAAI,CAACqM,WAAD,EAAc;UAAE5L,QAAQ,EAAErD,KAAK,CAACF;QAAlB,CAAd,CAD/B6Q,CAAD,EAC4E7N,uDAAK,CAACsM,cAAD,EAAiB;UAAE/L,QAAQ,EAAE,CAACT,sDAAI,CAACyM,KAAD,EAAQ;YAAEuC,GAAG,EAAExB,OAAP;YAAgByB,OAAO,EAAE,mBAAM;cAC9KtB,QAAQ,CAAC,IAAD,CAARA;YACH,CAFkJ;YAEhJtH,QAAQ,EAAE6I,mBAAC,EAAI;cACdlB,aAAa,CAACkB,CAAC,CAACC,MAAFD,CAAS9R,KAAV,CAAb4Q;cACAF,YAAY,CAAChC,gEAAD,CAAZgC;cACAR,WAAW,IACPA,WAAW,CAAC4B,CAAC,CAACC,MAAFD,CAAS9R,KAAV,EAAkBiR,gBAAM,EAAK;gBACpCJ,UAAU,CAACI,MAAD,CAAVJ;gBACAH,YAAY,CAAChC,6DAAD,CAAZgC;cACH,CAHU,CADfR;YAKH,CAVkJ;YAUhJlQ,KAAK,EAAE2Q,UAVyI;YAU7H3N,KAAK,EAAE8N,SAVsH;YAU3GpN,EAAE,EAAE;UAVuG,CAAR,CAAL,EAUjEd,sDAAI,CAAC0M,WAAD,EAAc;YAAEsC,GAAG,EAAEvB,aAAP;YAAsBhN,QAAQ,EAAEsN;UAAhC,CAAd,CAV6D;QAAZ,CAAjB,CADjF;MAAZ,CAAjB,CAAN,EAWyJ7N,uDAAK,CAACoM,kBAAD,EAAqB;QAAE7L,QAAQ,EAAE,CAACoN,SAAS,KAAK/B,gEAAd+B,IAAmC7N,sDAAI,CAAC6L,+DAAD,EAAY,EAAZ,CAAxC,EAAyD7L,sDAAI,CAACuM,iBAAD,EAAoB,EAApB,CAA7D;MAAZ,CAArB,CAX9J;IAdqC,CAAnB,CAAN,EAyBiRmB,SAAS,IAAK1N,sDAAI,CAAC2M,aAAD,EAAgB;MAAElM,QAAQ,EAAET,sDAAI,CAAC4M,QAAD,EAAW;QAAEnM,QAAQ,EAAE8N,WAAW,CAACpR,OAAD;MAAvB,CAAX;IAAhB,CAAhB,CAzBnS;EAAZ,CAAZ,CAAb;AA0BJ;;;;;;;;;;;;;;;;;;;;;;;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASqS,gBAAT,GAA4B;EACxBlS,MAAM,CAACmS,QAAP,CAAgBC,IAAhB,aAA0BjS,6DAA1B,kDAA0E2B,kEAA1E;AACH;;AACc,SAASgD,YAAT,OAAyG;EAAA,IAAjFU,MAAiF,QAAjFA,MAAiF;EAAA,IAAzE6M,eAAyE,QAAzEA,eAAyE;EAAA,0BAAxDC,SAAwD;EAAA,IAAxDA,SAAwD,+BAA5C;IAAEC,MAAM,EAAE,EAAV;IAAc3F,OAAO,EAAE,EAAvB;IAA2B4F,MAAM,EAAE;EAAnC,CAA4C;EACpH,IAAMC,cAAc,GAAGjN,MAAM,KAAK,GAAX,IAAkBA,MAAM,KAAK,GAApD;EACA,IAAMkN,WAAW,GAAGD,cAAc,GAC5BpT,mDAAE,CAAC,8BAAD,EAAiC,QAAjC,CAD0B,GAE5BiT,SAAS,CAACC,MAFhB;EAGA,IAAMI,YAAY,GAAGF,cAAc,GAC7BpT,mDAAE,CAAC,2DAAD,EAA8D,QAA9D,CAD2B,GAE7BiT,SAAS,CAAC1F,OAFhB;EAGA,OAAQlK,sDAAI,CAACuP,uDAAD,EAAiB;IAAExQ,UAAU,EAAEA,+DAAd;IAA0B0B,QAAQ,EAAEP,uDAAK,CAACoP,iEAAD,EAAc;MAAEY,SAAS,EAAE,QAAb;MAAuBzP,QAAQ,EAAE,CAACT,sDAAI,CAAC,IAAD,EAAO;QAAES,QAAQ,EAAEuP;MAAZ,CAAP,CAAL,EAAwChQ,sDAAI,CAAC,GAAD,EAAM;QAAES,QAAQ,EAAET,sDAAI,CAAC,GAAD,EAAM;UAAES,QAAQ,EAAEwP;QAAZ,CAAN;MAAhB,CAAN,CAA5C,EAAwGF,cAAc,GAAI/P,sDAAI,CAACqP,8DAAD,EAAW;QAAE,gBAAgB,kBAAlB;QAAsCR,OAAO,EAAEW,gBAA/C;QAAiE/O,QAAQ,EAAE9D,mDAAE,CAAC,cAAD,EAAiB,QAAjB;MAA7E,CAAX,CAAR,GAAkIqD,sDAAI,CAACqP,8DAAD,EAAW;QAAE,gBAAgB,cAAlB;QAAkCR,OAAO,EAAEc,eAA3C;QAA4DlP,QAAQ,EAAEmP,SAAS,CAACE;MAAhF,CAAX,CAA5P;IAAjC,CAAd;EAAzC,CAAjB,CAAZ;AACH;;;;;;;;;;;;;;;;ACnBD;;AAAwC,WACtB,sBADsBrK,IACtB;EAAA,OACI/C,eAAK;IAAA,qBAAWA,KAAK,CAAC3D,UAAjB;EAAA,CADT;AAAA,CADsB;;AAEkD,YADxE,sBACwE2G,KADxE;EAAA,OAUJhD,eAAK;IAAA,OAAKA,KAAK,CAACyN,OAANzN,IAAiB,eAAtB;EAAA,CAVD;AAAA,CACwE;;AAD1F,8EAAe2B,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;EAAAC;IAAA,eACCH,IAAoE,EADrE;IACqE,eAS7EC,KAA2C,EATkC;EADrE;AAAA,CAANrB,CAAf;;;;;;;;;;;;;;;;;;;;;ACDA;AACA;AACA;AACA;AACe,SAAS+L,YAAT,GAAwB;EACnC,OAAQpQ,sDAAI,CAACuP,uDAAD,EAAiB;IAAExQ,UAAU,EAAEA,+DAAd;IAA0B0B,QAAQ,EAAET,sDAAI,CAAC6L,+DAAD,EAAY;MAAEwE,IAAI,EAAE;IAAR,CAAZ;EAAxC,CAAjB,CAAZ;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACND;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAAShO,QAAT,OAAoG;EAAA,IAAhFX,UAAgF,QAAhFA,UAAgF;EAAA,IAApE+O,UAAoE,QAApEA,UAAoE;EAAA,IAAxDC,aAAwD,QAAxDA,aAAwD;EAAA,wBAAzC/N,OAAyC;EAAA,IAAzCA,OAAyC,6BAA/B,IAA+B;EAAA,uBAAzBE,MAAyB;EAAA,IAAzBA,MAAyB,4BAAhB,WAAgB;EAChG,IAAQlB,MAAR,GAA6BD,UAA7B,CAAQC,MAAR;EAAA,IAAgB0B,QAAhB,GAA6B3B,UAA7B,CAAgB2B,QAAhB;EACA,IAAMsN,YAAY,GAAGxR,6DAAQ,IAAIwC,MAAjC;EACA,IAAMuE,oBAAoB,GAAGH,iFAAuB,EAApD;EACA,IAAM6K,wBAAwB,GAAG5K,kFAAwB,EAAzD;;EACA,IAAM6K,YAAY,GAAG,SAAfA,YAAe,CAACC,YAAD,EAAkB;IACnCJ,aAAa,CAAC;MACVvR,QAAQ,EAARA,6DADU;MAEVwC,MAAM,EAAEmP,YAAY,CAAC1T,KAFX;MAGViG,QAAQ,EAAEyN,YAAY,CAAC5T;IAHb,CAAD,CAAb;EAKH,CAND;;EAOAwO,gDAAS,CAAC,YAAM;IACZkF,wBAAwB,CAAC;MACrBpK,GAAG,EAAEP,4FADgB;MAErBS,OAAO,EAAE;QACL7D,MAAM,EAANA;MADK;IAFY,CAAD,CAAxB;EAMH,CAPQ,EAON,CAACA,MAAD,CAPM,CAAT;EAQA,OAAO,CAACqD,oBAAD,GAAyBlG,sDAAI,CAACoQ,4DAAD,EAAe,EAAf,CAA7B,GAAoDlQ,uDAAK,CAAC2B,2CAAD,EAAW;IAAEpB,QAAQ,EAAE,CAAC,CAACgQ,UAAU,IAAI,CAACE,YAAhB,KAAkC3Q,sDAAI,CAACwQ,mDAAD,EAAa;MAAE7O,MAAM,EAAEA,MAAV;MAAkB0B,QAAQ,EAAEA,QAA5B;MAAsCwN,YAAY,EAAEA,YAApD;MAAkEhO,MAAM,EAAEA;IAA1E,CAAb,CAAvC,EAA0I8N,YAAY,IAAKzQ,uDAAK,CAAC2B,2CAAD,EAAW;MAAEpB,QAAQ,EAAE,CAACgQ,UAAU,IAAIzQ,sDAAI,CAACsQ,8DAAD,EAAW,EAAX,CAAnB,EAAmC3N,OAAO,IAAI3C,sDAAI,CAACuQ,oDAAD,EAAc;QAAEpR,QAAQ,EAAEA,6DAAZ;QAAsBwC,MAAM,EAAEA;MAA9B,CAAd,CAAlD;IAAZ,CAAX,CAAhK;EAAZ,CAAX,CAAhE;AACH;;AACc,SAASoP,iBAAT,CAA2BrO,KAA3B,EAAkC;EAC7C,OAAQ1C,sDAAI,CAACsE,kFAAD,EAA+B;IAAElH,KAAK,EAAEmC,iEAAY,IAAIgF,mFAAwB,CAAChF,iEAAD,CAAjD;IAAiEkB,QAAQ,EAAET,sDAAI,CAACqC,QAAD,oBAAgBK,KAAhB;EAA/E,CAA/B,CAAZ;AACH;;;;;;;;;;;;;;;;;;;;;;;;AClCD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS8N,UAAT,OAA+E;EAAA,IAAzD7O,MAAyD,QAAzDA,MAAyD;EAAA,IAAjD0B,QAAiD,QAAjDA,QAAiD;EAAA,IAAvCwN,YAAuC,QAAvCA,YAAuC;EAAA,uBAAzBhO,MAAyB;EAAA,IAAzBA,MAAyB,4BAAhB,WAAgB;;EAC1F,gBAAwCoO,2DAAQ,EAAhD;EAAA,IAAQE,MAAR,aAAQA,MAAR;EAAA,IAAgBC,YAAhB,aAAgBA,YAAhB;EAAA,IAA8BC,KAA9B,aAA8BA,KAA9B;;EACA,4BAA0GH,4EAAyB,CAACrO,MAAD,CAAnI;EAAA,IAAQyO,oBAAR,yBAAQA,oBAAR;EAAA,IAAqCC,WAArC,yBAA8BF,KAA9B;EAAA,IAAkDG,UAAlD,yBAAkDA,UAAlD;EAAA,IAA8DC,QAA9D,yBAA8DA,QAA9D;EAAA,IAAsFC,cAAtF,yBAAwEN,YAAxE;;EACA,IAAMhU,KAAK,GAAGuE,MAAM,IAAI0B,QAAV,GACR;IACEnG,KAAK,EAAEmG,QADT;IAEEjG,KAAK,EAAEuE;EAFT,CADQ,GAKR,IALN;;EAMA,IAAMgQ,iBAAiB,GAAG,SAApBA,iBAAoB,CAACC,MAAD,EAAY;IAClC,IAAIvU,4EAAa,CAACuU,MAAM,CAACxU,KAAR,CAAjB,EAAiC;MAC7BkU,oBAAoB,CAACM,MAAM,CAACxU,KAAR,CAApB,CAAmCyU,IAAnC,CAAwC,iBAAoB;QAAA,IAAjBC,IAAiB,SAAjBA,IAAiB;QAAA,IAAXhN,IAAW,SAAXA,IAAW;QACxD+L,YAAY,CAAC;UACTzT,KAAK,EAAE0U,IADE;UAET5U,KAAK,EAAE4H;QAFE,CAAD,CAAZ;MAIH,CALD;IAMH,CAPD,MAQK;MACD+L,YAAY,CAACe,MAAD,CAAZ;IACH;EACJ,CAZD;;EAaA,OAAOJ,UAAU,GAAIxR,sDAAI,CAACoQ,4DAAD,EAAe,EAAf,CAAR,GAA8BgB,YAAY,IAAIM,cAAhB,GAAkC1R,sDAAI,CAACoC,4DAAD,EAAe;IAAEU,MAAM,EAAEsO,YAAY,GAAGA,YAAY,CAACtO,MAAhB,GAAyB4O,cAAc,CAAC5O,MAA9D;IAAsE6M,eAAe,EAAE,2BAAM;MACzL,IAAI8B,QAAJ,EAAc;QACVF,WAAW;MACd,CAFD,MAGK;QACDF,KAAK;MACR;IACJ,CAP+F;IAO7FzB,SAAS,EAAE;MACVC,MAAM,EAAElT,mDAAE,CAAC,2CAAD,EAA8C,QAA9C,CADA;MAEVuN,OAAO,EAAEvN,mDAAE,CAAC,yDAAD,EAA4D,QAA5D,CAFD;MAGVmT,MAAM,EAAEnT,mDAAE,CAAC,eAAD,EAAkB,QAAlB;IAHA;EAPkF,CAAf,CAAtC,GAWlCqD,sDAAI,CAACgR,qDAAD,EAAe;IAAE1D,WAAW,EAAE6D,MAAf;IAAuB9K,QAAQ,EAAE,kBAACuL,MAAD;MAAA,OAAYD,iBAAiB,CAACC,MAAD,CAA7B;IAAA,CAAjC;IAAwExU,KAAK,EAAEA;EAA/E,CAAf,CAXjB;AAYH;;;;;;;;;;;;;;;;;;;;;AC1CD;AACA;AACA;AACA;AACA;AACe,SAAS4T,YAAT,OAAyD;EAAA,IAAjC1D,WAAiC,QAAjCA,WAAiC;EAAA,IAApBjH,QAAoB,QAApBA,QAAoB;EAAA,IAAVjJ,KAAU,QAAVA,KAAU;EACpE,OAAQ8C,uDAAK,CAACqP,8DAAD,EAAiB;IAAExQ,UAAU,EAAEA,+DAAd;IAA0B0B,QAAQ,EAAE,CAACT,sDAAI,CAAC,GAAD,EAAM;MAAE,gBAAgB,oBAAlB;MAAwCS,QAAQ,EAAET,sDAAI,CAAC,GAAD,EAAM;QAAES,QAAQ,EAAE9D,mDAAE,CAAC,6DAAD,EAAgE,QAAhE;MAAd,CAAN;IAAtD,CAAN,CAAL,EAAsKqD,sDAAI,CAACoN,2DAAD,EAAc;MAAEC,WAAW,EAAE1Q,mDAAE,CAAC,mBAAD,EAAsB,QAAtB,CAAjB;MAAkDS,KAAK,EAAEA,KAAzD;MAAgEkQ,WAAW,EAAEA,WAA7E;MAA0FjH,QAAQ,EAAEA;IAApG,CAAd,CAA1K;EAApC,CAAjB,CAAb;AACH;;;;;;;;;;;;;;;;;;;;;ACPD;AACA;AACA;AACA;AACA;AACe,SAASkK,WAAT,OAA4C;EAAA,IAArBpR,QAAqB,QAArBA,QAAqB;EAAA,IAAXwC,MAAW,QAAXA,MAAW;EACvD,IAAM6L,OAAO,GAAGhC,6CAAM,CAAC,IAAD,CAAtB;EACA,IAAMyG,KAAK,GAAGD,iEAAa,EAA3B;EACAtG,gDAAS,CAAC,YAAM;IACZ,IAAI,CAACuG,KAAL,EAAY;MACR;IACH;;IACD,IAAIzE,OAAO,CAACW,OAAZ,EAAqB;MACjBX,OAAO,CAACW,OAAR,CAAgB+D,SAAhB,GAA4B,EAA5B;MACA,IAAMC,WAAW,GAAGC,QAAQ,CAACC,aAAT,CAAuB,QAAvB,CAApB;MACAF,WAAW,CAACD,SAAZ,6CAA2D/S,QAA3D,yBAAkFwC,MAAlF,yBAAuGzD,2DAAvG,gBAAmHD,uEAAnH;MACAuP,OAAO,CAACW,OAAR,CAAgBmE,WAAhB,CAA4BH,WAA5B;IACH;EACJ,CAVQ,EAUN,CAACxQ,MAAD,EAASxC,QAAT,EAAmB8S,KAAnB,EAA0BzE,OAA1B,CAVM,CAAT;EAWA,OAAOxN,sDAAI,CAAC+R,+DAAD,EAAY;IAAE/C,GAAG,EAAExB;EAAP,CAAZ,CAAX;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpBD;AACA;AACA;AACA;AACe,SAAS0D,yBAAT,GAAyD;EAAA,IAAtBrO,MAAsB,uEAAb,WAAa;EACpE,IAAM0P,KAAK,GAAGnI,uFAA6B,EAA3C;EACA,IAAMoI,KAAK,GAAGxM,kFAAwB,EAAtC;;EACA,gBAAkCyF,+CAAQ,CAACK,6DAAD,CAA1C;EAAA;EAAA,IAAO+B,SAAP;EAAA,IAAkBC,YAAlB;;EACA,iBAAwCrC,+CAAQ,CAAC,IAAD,CAAhD;EAAA;EAAA,IAAO2F,YAAP;EAAA,IAAqBqB,eAArB;;EACA,IAAMnB,oBAAoB,GAAG,SAAvBA,oBAAuB,CAAClO,IAAD,EAAU;IACnC0K,YAAY,CAAChC,gEAAD,CAAZ;IACA0G,KAAK,CAAC;MACFhM,GAAG,EAAEP,kGADH;MAEFS,OAAO,EAAE;QACLtD,IAAI,EAAJA,IADK;QAELP,MAAM,EAANA;MAFK;IAFP,CAAD,CAAL;IAOA,OAAO0P,KAAK,CAAC;MACT/L,GAAG,EAAEP,4FADI;MAETS,OAAO,EAAEtD;IAFA,CAAD,CAAL,CAIFyO,IAJE,CAIG,UAAAa,IAAI,EAAI;MACd5E,YAAY,CAAChC,6DAAD,CAAZ;MACA,OAAO4G,IAAP;IACH,CAPM,WAQI,UAAAC,GAAG,EAAI;MACdF,eAAe,CAACE,GAAD,CAAf;MACAH,KAAK,CAAC;QACFhM,GAAG,EAAEP,6FADH;QAEFS,OAAO,EAAE;UACL7D,MAAM,EAANA;QADK;MAFP,CAAD,CAAL;MAMAiL,YAAY,CAAChC,+DAAD,CAAZ;IACH,CAjBM,CAAP;EAkBH,CA3BD;;EA4BA,OAAO;IACH0F,UAAU,EAAE3D,SAAS,KAAK/B,gEADvB;IAEH2F,QAAQ,EAAE5D,SAAS,KAAK/B,+DAFrB;IAGHsF,YAAY,EAAZA,YAHG;IAIHE,oBAAoB,EAApBA,oBAJG;IAKHD,KAAK,EAAE;MAAA,OAAMvD,YAAY,CAAChC,6DAAD,CAAlB;IAAA;EALJ,CAAP;AAOH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5CD;AACA;AACA;AACA;AACA;AACe,SAASmF,QAAT,GAAoB;EAC/B,IAAMsB,KAAK,GAAGnI,uFAA6B,EAA3C;;EACA,gBAAwCqB,+CAAQ,CAAC,IAAD,CAAhD;EAAA;EAAA,IAAO2F,YAAP;EAAA,IAAqBqB,eAArB;;EACA,IAAMtB,MAAM,GAAG0B,sDAAQ,CAAC,UAAC1B,MAAD,EAAS2B,QAAT,EAAsB;IAC1C,OAAOP,KAAK,CAAC;MACT/L,GAAG,EAAEP,gFADI;MAETS,OAAO,EAAE;QACLyK,MAAM,EAANA;MADK;IAFA,CAAD,CAAL,CAMFU,IANE,CAMG,UAAAkB,KAAK,EAAI;MACfD,QAAQ,8BACDC,KAAK,CAACzH,GAAN,CAAU,UAACoH,IAAD;QAAA,OAAW;UACpBxV,KAAK,EAAEwV,IAAI,CAAC5N,IADQ;UAEpB1H,KAAK,EAAEsV,IAAI,CAACZ;QAFQ,CAAX;MAAA,CAAV,CADC,IAKJ7U,0EALI,GAAR;IAOH,CAdM,WAeI,UAAA+V,KAAK,EAAI;MAChBP,eAAe,CAACO,KAAD,CAAf;IACH,CAjBM,CAAP;EAkBH,CAnBsB,EAmBpB,GAnBoB,EAmBf;IAAEC,QAAQ,EAAE;EAAZ,CAnBe,CAAvB;EAoBA,OAAO;IACH9B,MAAM,EAANA,MADG;IAEHC,YAAY,EAAZA,YAFG;IAGHC,KAAK,EAAE;MAAA,OAAMoB,eAAe,CAAC,IAAD,CAArB;IAAA;EAHJ,CAAP;AAKH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjCD;AACA;AACA;AACA;AACA,IAAIU,OAAJ;;AACA,SAASC,eAAT,GAA2B;EACvB,IAAI,CAACD,OAAL,EAAc;IACVA,OAAO,GAAG,IAAIE,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV;MAAA,OAAqBL,uDAAA,CAAYnV,gEAAZ,EACtC0V,IADsC,CACjCH,OADiC,EAEtCI,IAFsC,CAEjCH,MAFiC,CAArB;IAAA,CAAZ,CAAV;EAGH;;EACD,OAAOJ,OAAP;AACH;;AACc,SAASnB,aAAT,GAAyB;EACpC,gBAA0BvG,+CAAQ,CAAC,KAAD,CAAlC;EAAA;EAAA,IAAOwG,KAAP;EAAA,IAAc0B,QAAd;;EACAjI,gDAAS,CAAC,YAAM;IACZ0H,eAAe,GACVvB,IADL,CACU;MAAA,OAAM8B,QAAQ,CAAC,IAAD,CAAd;IAAA,CADV,WAEW,UAAAX,KAAK;MAAA,OAAI1I,mEAAA,CAAuB0I,KAAvB,CAAJ;IAAA,CAFhB;EAGH,CAJQ,EAIN,EAJM,CAAT;EAKA,OAAOf,KAAP;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASiC,iBAAT,OAAmD;EAAA,IAAtBrD,YAAsB,QAAtBA,YAAsB;EAAA,IAARlN,GAAQ,QAARA,GAAQ;;EAC9D,mBAA+EoQ,8DAAW,EAA1F;EAAA,IAAwBI,QAAxB,gBAAQC,cAAR;EAAA,IAAkCC,OAAlC,gBAAkCA,OAAlC;EAAA,IAA2CrB,KAA3C,gBAA2CA,KAA3C;EAAA,IAAkDsB,MAAlD,gBAAkDA,MAAlD;EAAA,IAA0DC,eAA1D,gBAA0DA,eAA1D;;EACA,IAAMC,qBAAqB,GAAGR,sEAAkB,CAACrQ,GAAD,CAAhD;EACA,IAAM8Q,uBAAuB,GAAGR,8EAA0B,CAACtQ,GAAD,CAA1D;EACA+H,gDAAS,CAAC,YAAM;IACZ,IAAI,CAAC/H,GAAD,IAAQwQ,QAAQ,CAACO,MAAT,GAAkB,CAA9B,EAAiC;MAC7B7D,YAAY,CAACsD,QAAQ,CAAC,CAAD,CAAR,CAAY/W,KAAb,CAAZ;IACH;EACJ,CAJQ,EAIN,CAAC+W,QAAD,EAAWxQ,GAAX,EAAgBkN,YAAhB,CAJM,CAAT;;EAKA,IAAMc,iBAAiB,GAAG,SAApBA,iBAAoB,CAACC,MAAD,EAAY;IAClCf,YAAY,CAACe,MAAM,CAACxU,KAAR,CAAZ;EACH,CAFD;;EAGA,IAAMuX,qBAAqB,GAAG,SAAxBA,qBAAwB,GAAM;IAChC,OAAOJ,eAAe,GACjB1C,IADE,CACG,YAAM;MACZyC,MAAM;IACT,CAHM,WAII,UAAAtB,KAAK,EAAI;MAChB1I,+DAAA,CAAqB,4BAArB,EAAmD;QAC/CuK,KAAK,EAAE;UAAE7B,KAAK,EAALA;QAAF;MADwC,CAAnD;IAGH,CARM,CAAP;EASH,CAVD;;EAWA,OAAQhT,sDAAI,CAAC6B,2CAAD,EAAW;IAAEpB,QAAQ,EAAE4T,OAAO,GAAIrU,sDAAI,CAACoQ,4DAAD,EAAe,EAAf,CAAR,GAA8B4C,KAAK,GAAIhT,sDAAI,CAACoC,4DAAD,EAAe;MAAEU,MAAM,EAAGkQ,KAAK,IAAIA,KAAK,CAAClQ,MAAhB,IAA2BkQ,KAArC;MAA4CrD,eAAe,EAAE;QAAA,OAAM2E,MAAM,EAAZ;MAAA,CAA7D;MAA6E1E,SAAS,EAAE;QAChLC,MAAM,EAAElT,mDAAE,CAAC,8CAAD,EAAiD,QAAjD,CADsK;QAEhLuN,OAAO,EAAEvN,mDAAE,CAAC,4DAAD,EAA+D,QAA/D,CAFqK;QAGhLmT,MAAM,EAAEnT,mDAAE,CAAC,kBAAD,EAAqB,QAArB;MAHsK;IAAxF,CAAf,CAAR,GAI5DuD,uDAAK,CAACqP,8DAAD,EAAiB;MAAEY,OAAO,EAAE,gBAAX;MAA6BpR,UAAU,EAAEA,+DAAzC;MAAqD0B,QAAQ,EAAE,CAACgU,uBAAuB,IAAKzU,sDAAI,CAAC8T,uDAAD,EAAiB;QAAEhR,MAAM,EAAE2R,uBAAV;QAAmCK,iBAAiB,EAAEH;MAAtD,CAAjB,CAAjC,EAAmIR,QAAQ,CAACO,MAAT,GAAkB,CAAlB,IAAwB1U,sDAAI,CAAC6T,wDAAD,EAAkB;QAAExN,QAAQ,EAAEsL,iBAAZ;QAA+BxU,OAAO,EAAEgX,QAAxC;QAAkD/W,KAAK,EAAEoX;MAAzD,CAAlB,CAA/J;IAA/D,CAAjB;EAJC,CAAX,CAAZ;AAKH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvCD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAAS5Q,WAAT,OAAgH;EAAA,IAA3ED,GAA2E,QAAzFjC,UAAyF,CAA3EiC,GAA2E;EAAA,IAApE8M,UAAoE,QAApEA,UAAoE;EAAA,IAAxDC,aAAwD,QAAxDA,aAAwD;EAAA,wBAAzC/N,OAAyC;EAAA,IAAzCA,OAAyC,6BAA/B,IAA+B;EAAA,uBAAzBE,MAAyB;EAAA,IAAzBA,MAAyB,4BAAhB,WAAgB;EAC5G,IAAMqD,oBAAoB,GAAGH,iFAAuB,EAApD;EACA,IAAM6K,wBAAwB,GAAG5K,kFAAwB,EAAzD;;EACA,IAAM6K,YAAY,GAAG,SAAfA,YAAe,CAACmE,MAAD,EAAY;IAC7BtE,aAAa,CAAC;MACV/M,GAAG,EAAEqR;IADK,CAAD,CAAb;EAGH,CAJD;;EAKAtJ,gDAAS,CAAC,YAAM;IACZkF,wBAAwB,CAAC;MACrBpK,GAAG,EAAEP,+FADgB;MAErBS,OAAO,EAAE;QACL7D,MAAM,EAANA;MADK;IAFY,CAAD,CAAxB;EAMH,CAPQ,EAON,CAACA,MAAD,CAPM,CAAT;EAQA,OAAO,CAACqD,oBAAD,GAAyBlG,sDAAI,CAACoQ,4DAAD,EAAe,EAAf,CAA7B,GAAoDlQ,uDAAK,CAAC2B,2CAAD,EAAW;IAAEpB,QAAQ,EAAE,CAAC,CAACgQ,UAAU,IAAI,CAAC9M,GAAhB,KAAyB3D,sDAAI,CAACkU,0DAAD,EAAoB;MAAEvQ,GAAG,EAAEA,GAAP;MAAYkN,YAAY,EAAEA;IAA1B,CAApB,CAA9B,EAA8FlO,OAAO,IAAIgB,GAAX,IAAkB3D,sDAAI,CAAC+U,uDAAD,EAAiB;MAAEpR,GAAG,EAAEA;IAAP,CAAjB,CAApH;EAAZ,CAAX,CAAhE;AACH;;AACc,SAASsR,qBAAT,CAA+BvS,KAA/B,EAAsC;EACjD,OAAQ1C,sDAAI,CAACsE,kFAAD,EAA+B;IAAElH,KAAK,EAAEmC,iEAAY,IAAIgF,mFAAwB,CAAChF,iEAAD,CAAjD;IAAiEkB,QAAQ,EAAET,sDAAI,CAAC4D,WAAD,oBAAmBlB,KAAnB;EAA/E,CAA/B,CAAZ;AACH;;;;;;;;;;;;;;;;;;;;;;AC7BD;AACA;AACA;AACA;AACA;AACe,SAASmR,eAAT,OAAwD;EAAA,IAA7B1W,OAA6B,QAA7BA,OAA6B;EAAA,IAApBkJ,QAAoB,QAApBA,QAAoB;EAAA,IAAVjJ,KAAU,QAAVA,KAAU;EACnE,IAAM8X,cAAc,GAAG,CACnB;IACIhY,KAAK,EAAEP,mDAAE,CAAC,cAAD,EAAiB,QAAjB,CADb;IAEIQ,OAAO,EAAPA;EAFJ,CADmB,CAAvB;EAMA,OAAQ+C,uDAAK,CAAC2B,2CAAD,EAAW;IAAEpB,QAAQ,EAAE,CAACT,sDAAI,CAACsQ,8DAAD,EAAW,EAAX,CAAL,EAAqBtQ,sDAAI,CAAC,GAAD,EAAM;MAAE,gBAAgB,uBAAlB;MAA2CS,QAAQ,EAAET,sDAAI,CAAC,GAAD,EAAM;QAAES,QAAQ,EAAE9D,mDAAE,CAAC,kCAAD,EAAqC,QAArC;MAAd,CAAN;IAAzD,CAAN,CAAzB,EAAkKqD,sDAAI,CAACoN,2DAAD,EAAc;MAAEG,cAAc,EAAE2H,cAAlB;MAAkC7O,QAAQ,EAAEA,QAA5C;MAAsDgH,WAAW,EAAE1Q,mDAAE,CAAC,kBAAD,EAAqB,QAArB,CAArE;MAAqGS,KAAK,EAAEA;IAA5G,CAAd,CAAtK;EAAZ,CAAX,CAAb;AACH;;;;;;;;;;;;;;;;;;;;;ACbD;AACA;AACA;AACA;AACA;AACe,SAAS0W,cAAT,OAAwD;EAAA,IAA9BhR,MAA8B,QAA9BA,MAA8B;EAAA,IAAtBgS,iBAAsB,QAAtBA,iBAAsB;EACnE,IAAMO,cAAc,GAAGvS,MAAM,KAAKsS,qEAAlC;EACA,IAAME,SAAS,GAAGD,cAAc,GAC1B1Y,mDAAE,CAAC,gCAAD,EAAmC,QAAnC,CADwB,GAE1BA,mDAAE,CAAC,2BAAD,EAA8B,QAA9B,CAFR;EAGA,IAAM4Y,YAAY,GAAGF,cAAc,GAC7B1Y,mDAAE,CAAC,gEAAD,EAAmE,QAAnE,CAD2B,GAE7BA,mDAAE,CAAC,yGAAD,EAA4G,QAA5G,CAFR;EAGA,OAAQqD,sDAAI,CAACmV,6DAAD,EAAU;IAAEG,SAAS,EAAEA,SAAb;IAAwBC,YAAY,EAAEA,YAAtC;IAAoD9U,QAAQ,EAAE4U,cAAc,IAAKrV,sDAAI,CAACqP,8DAAD,EAAW;MAAEmG,GAAG,EAAE,UAAP;MAAmB1U,EAAE,EAAE,2BAAvB;MAAoD+N,OAAO,EAAEiG,iBAA7D;MAAgFrU,QAAQ,EAAE9D,mDAAE,CAAC,kBAAD,EAAqB,QAArB;IAA5F,CAAX;EAArF,CAAV,CAAZ;AACH;;;;;;;;;;;;;;;;;;;;ACdD;AACA;AACA;AACA;AACe,SAAS4T,WAAT,OAA8B;EAAA,IAAP5M,GAAO,QAAPA,GAAO;EACzC,IAAMsO,KAAK,GAAGwD,oEAAiB,EAA/B;EACA,IAAMjI,OAAO,GAAGhC,6CAAM,CAAC,IAAD,CAAtB;EACAE,gDAAS,CAAC,YAAM;IACZ,IAAI,CAACuG,KAAL,EAAY;MACR;IACH;;IACD,IAAIzE,OAAO,CAACW,OAAZ,EAAqB;MACjBX,OAAO,CAACW,OAAR,CAAgB+D,SAAhB,GAA4B,EAA5B;MACA,IAAMwD,SAAS,GAAGtD,QAAQ,CAACC,aAAT,CAAuB,KAAvB,CAAlB;MACAqD,SAAS,CAACC,OAAV,CAAkB1T,GAAlB,aAA2B0B,GAA3B;MACA+R,SAAS,CAACE,SAAV,CAAoBC,GAApB,CAAwB,2BAAxB;MACArI,OAAO,CAACW,OAAR,CAAgBmE,WAAhB,CAA4BoD,SAA5B;MACA,IAAMvD,WAAW,GAAGC,QAAQ,CAACC,aAAT,CAAuB,QAAvB,CAApB;MACAF,WAAW,CAACD,SAAZ,GACI,sDADJ;MAEA1E,OAAO,CAACW,OAAR,CAAgBmE,WAAhB,CAA4BH,WAA5B;IACH;EACJ,CAfQ,EAeN,CAACxO,GAAD,EAAMsO,KAAN,EAAazE,OAAb,CAfM,CAAT;EAgBA,OAAOxN,sDAAI,CAAC6B,2CAAD,EAAW;IAAEpB,QAAQ,EAAEkD,GAAG,IAAI3D,sDAAI,CAAC+R,+DAAD,EAAY;MAAE/C,GAAG,EAAExB;IAAP,CAAZ;EAAvB,CAAX,CAAX;AACH;;;;;;;;;;;;;;;;ACxBM,IAAMsI,2BAA2B,GAAG,6BAApC;AACA,IAAMV,6BAA6B,GAAG,+BAAtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDP;AACA;AACA;AACA;AACA,IAAIW,IAAI,GAAG,IAAX;AACe,SAASC,mBAAT,GAA+B;EAC1C,IAAMzD,KAAK,GAAGnI,uFAA6B,EAA3C;;EACA,gBAAkCqB,+CAAQ,CAACK,kEAAD,CAA1C;EAAA;EAAA,IAAO+B,SAAP;EAAA,IAAkBC,YAAlB;;EACA,iBAA0BrC,+CAAQ,CAAC,IAAD,CAAlC;EAAA;EAAA,IAAOuH,KAAP;EAAA,IAAciD,QAAd;;EACA,IAAMC,UAAU,GAAG,SAAbA,UAAa,GAAM;IACrB,IAAI,CAACH,IAAL,EAAW;MACPjI,YAAY,CAAChC,kEAAD,CAAZ;IACH;EACJ,CAJD;;EAKA,IAAMwI,MAAM,GAAG,SAATA,MAAS,GAAM;IACjByB,IAAI,GAAG,IAAP;IACAjI,YAAY,CAAChC,kEAAD,CAAZ;IACAmK,QAAQ,CAAC,IAAD,CAAR;EACH,CAJD;;EAKAvK,gDAAS,CAAC,YAAM;IACZ,IAAImC,SAAS,KAAK/B,kEAAd,IAAqC,CAACiK,IAA1C,EAAgD;MAC5CjI,YAAY,CAAChC,gEAAD,CAAZ;MACAyG,KAAK,CAAC;QACF/L,GAAG,EAAEP,8FAAsCoD;MADzC,CAAD,CAAL,CAGKwI,IAHL,CAGU,UAAAzM,IAAI,EAAI;QACd2Q,IAAI,GAAG3Q,IAAP;QACA0I,YAAY,CAAChC,6DAAD,CAAZ;MACH,CAND,WAOW,UAAA6G,GAAG,EAAI;QACdsD,QAAQ,CAACtD,GAAD,CAAR;QACA7E,YAAY,CAAChC,+DAAD,CAAZ;MACH,CAVD;IAWH;EACJ,CAfQ,EAeN,CAAC+B,SAAD,CAfM,CAAT;EAgBA,OAAO;IAAEkI,IAAI,EAAJA,IAAF;IAAQI,aAAa,EAAEtI,SAAvB;IAAkCmF,KAAK,EAALA,KAAlC;IAAyCkD,UAAU,EAAVA,UAAzC;IAAqD5B,MAAM,EAANA;EAArD,CAAP;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpCD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASgC,qBAAT,CAA+BC,OAA/B,EAAwCC,WAAxC,EAAqDC,YAArD,EAAmE;EAC/D,2CAAyBF,OAAO,CAACG,eAAjC;EAAA,IAAOC,cAAP;;EACA,IAAItI,MAAM,GAAG1R,mDAAE,CAAC,SAAD,EAAY,QAAZ,CAAf;;EACA,IAAI6Z,WAAW,IACXG,cAAc,KAAKH,WAAW,CAAC1V,EAD/B,IAEA2V,YAAY,CAACE,cAAD,CAFhB,EAEkC;IAC9B,IAAMZ,IAAI,GAAGU,YAAY,CAACE,cAAD,CAAzB;IACAtI,MAAM,gBAAS0H,IAAI,CAACa,WAAL,CAAiBC,QAA1B,MAAN;EACH;;EACD,OAAOxI,MAAP;AACH;;AACD,SAASyI,iBAAT,CAA2Bf,IAA3B,EAAiC;EAC7B,OAAQA,IAAI,IACRA,IAAI,CAACgB,gBADD,IAEJhB,IAAI,CAACgB,gBAAL,CAAsBC,gBAFlB,IAGJjB,IAAI,CAACgB,gBAAL,CAAsBC,gBAAtB,CAAuCC,KAH3C;AAIH;;AACc,SAASlD,WAAT,GAAuB;EAClC,IAAMxB,KAAK,GAAGnI,uFAA6B,EAA3C;;EACA,wBAAqGiM,6DAAgB,EAArH;EAAA,IAAQlC,QAAR,qBAAQA,QAAR;EAAA,IAAkBsC,YAAlB,qBAAkBA,YAAlB;EAAA,IAAuCS,aAAvC,qBAAgClE,KAAhC;EAAA,IAAsDmE,iBAAtD,qBAAsDA,iBAAtD;EAAA,IAAiFC,cAAjF,qBAAyE9C,MAAzE;;EACA,2BAAoF0B,gEAAmB,EAAvG;EAAA,IAAcQ,WAAd,wBAAQT,IAAR;EAAA,IAAkCsB,SAAlC,wBAA2BrE,KAA3B;EAAA,IAA6CmD,aAA7C,wBAA6CA,aAA7C;EAAA,IAAoEmB,UAApE,wBAA4DhD,MAA5D;;EACA,IAAMA,MAAM,GAAG8B,kDAAW,CAAC,YAAM;IAC7BkB,UAAU;IACVF,cAAc;EACjB,CAHyB,EAGvB,CAACE,UAAD,EAAaF,cAAb,CAHuB,CAA1B;;EAIA,IAAM7C,eAAe,GAAG,SAAlBA,eAAkB,GAAM;IAC1B,OAAOhC,KAAK,CAAC;MACT/L,GAAG,EAAEP,6FAAqCqD;IADjC,CAAD,CAAZ;EAGH,CAJD;;EAKA,OAAO;IACH8K,cAAc,EAAED,QAAQ,CAAC7I,GAAT,CAAa,UAAAiM,IAAI;MAAA,OAAK;QAClCra,KAAK,EAAEqa,IAAI,CAACzS,IAAL,IAAawR,qBAAqB,CAACiB,IAAD,EAAOf,WAAP,EAAoBC,YAApB,CADP;QAElCrZ,KAAK,EAAEma,IAAI,CAACC;MAFsB,CAAL;IAAA,CAAjB,CADb;IAKHrD,QAAQ,EAARA,QALG;IAMHsC,YAAY,EAAZA,YANG;IAOHD,WAAW,EAAXA,WAPG;IAQHxD,KAAK,EAAEkE,aAAa,IAAIG,SARrB;IASHhD,OAAO,EAAE8C,iBAAiB,IAAIrL,gEAArB,IACLqK,aAAa,KAAKrK,gEAVnB;IAWHwI,MAAM,EAANA,MAXG;IAYHC,eAAe,EAAfA;EAZG,CAAP;AAcH;AACM,SAASP,kBAAT,CAA4BrQ,GAA5B,EAAiC;EACpC,mBAAqCoQ,WAAW,EAAhD;EAAA,IAAwBI,QAAxB,gBAAQC,cAAR;;EACA,IAAMxC,MAAM,GAAGuC,QAAQ,CAACsD,IAAT,CAAc;IAAA,IAAGra,KAAH,QAAGA,KAAH;IAAA,OAAeA,KAAK,KAAKuG,GAAzB;EAAA,CAAd,CAAf;EACA,OAAOiO,MAAP;AACH;AACM,SAASqC,0BAAT,CAAoCtQ,GAApC,EAAyC;EAC5C,oBAAgDoQ,WAAW,EAA3D;EAAA,IAAQI,QAAR,iBAAQA,QAAR;EAAA,IAAkBsC,YAAlB,iBAAkBA,YAAlB;EAAA,IAAgCD,WAAhC,iBAAgCA,WAAhC;;EACA,IAAMD,OAAO,GAAGpC,QAAQ,CAACsD,IAAT,CAAc,UAAAF,IAAI;IAAA,OAAIA,IAAI,CAACC,IAAL,KAAc7T,GAAlB;EAAA,CAAlB,CAAhB;EACA,IAAM+T,oBAAoB,GAAGjB,YAAY,CAACkB,MAAb,CAAoB,UAACC,CAAD,EAAIC,CAAJ;IAAA,uCAAgBD,CAAhB,2BAAoBC,CAAC,CAAC/W,EAAtB,EAA2B+W,CAA3B;EAAA,CAApB,EAAqD,EAArD,CAA7B;;EACA,IAAI,CAACtB,OAAL,EAAc;IACV,OAAO,IAAP;EACH,CAFD,MAGK;IACD,IAAQG,eAAR,GAA4BH,OAA5B,CAAQG,eAAR;;IACA,IAAIF,WAAW,IACXE,eAAe,CAACoB,QAAhB,CAAyBtB,WAAW,CAAC1V,EAArC,CADA,IAEA,CAACgW,iBAAiB,CAACN,WAAD,CAFtB,EAEqC;MACjC,OAAOpB,qEAAP;IACH,CAJD,MAKK,IAAIsB,eAAe,CACnBpL,GADI,CACA,UAAAxK,EAAE;MAAA,OAAI4W,oBAAoB,CAAC5W,EAAD,CAAxB;IAAA,CADF,EAEJiX,IAFI,CAEC,UAAChC,IAAD;MAAA,OAAU,CAACe,iBAAiB,CAACf,IAAD,CAA5B;IAAA,CAFD,CAAJ,EAE0C;MAC3C,OAAOD,mEAAP;IACH,CAJI,MAKA;MACD,OAAO,IAAP;IACH;EACJ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjFD;AACA;AACA;AACA;AACA,IAAI3B,QAAQ,GAAG,EAAf;AACA,IAAIsC,YAAY,GAAG,EAAnB;AACe,SAASJ,gBAAT,GAA4B;EACvC,IAAM9D,KAAK,GAAGnI,uFAA6B,EAA3C;;EACA,gBAAkCqB,+CAAQ,CAACK,kEAAD,CAA1C;EAAA;EAAA,IAAO+B,SAAP;EAAA,IAAkBC,YAAlB;;EACA,iBAA0BrC,+CAAQ,CAAC,IAAD,CAAlC;EAAA;EAAA,IAAOuH,KAAP;EAAA,IAAciD,QAAd;;EACA,IAAM3B,MAAM,GAAG,SAATA,MAAS,GAAM;IACjBH,QAAQ,GAAG,EAAX;IACA8B,QAAQ,CAAC,IAAD,CAAR;IACAnI,YAAY,CAAChC,kEAAD,CAAZ;EACH,CAJD;;EAKAJ,gDAAS,CAAC,YAAM;IACZ,IAAImC,SAAS,KAAK/B,kEAAd,IAAqCqI,QAAQ,CAACO,MAAT,KAAoB,CAA7D,EAAgE;MAC5D5G,YAAY,CAAChC,gEAAD,CAAZ;MACAyG,KAAK,CAAC;QACF/L,GAAG,EAAEP,2FAAmCkD;MADtC,CAAD,CAAL,CAGK0I,IAHL,CAGU,UAAAzM,IAAI,EAAI;QACd0I,YAAY,CAAChC,+DAAD,CAAZ;QACAqI,QAAQ,GAAG/O,IAAI,IAAIA,IAAI,CAAC6S,YAAxB;QACAxB,YAAY,GAAGrR,IAAI,IAAIA,IAAI,CAACqR,YAA5B;MACH,CAPD,WAQW,UAAAvH,CAAC,EAAI;QACZ+G,QAAQ,CAAC/G,CAAD,CAAR;QACApB,YAAY,CAAChC,+DAAD,CAAZ;MACH,CAXD;IAYH;EACJ,CAhBQ,EAgBN,CAAC+B,SAAD,CAhBM,CAAT;EAiBA,OAAO;IACHsG,QAAQ,EAARA,QADG;IAEHsC,YAAY,EAAZA,YAFG;IAGHU,iBAAiB,EAAEtJ,SAHhB;IAIHmF,KAAK,EAALA,KAJG;IAKHsB,MAAM,EAANA;EALG,CAAP;AAOH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvCD;AACA;AACA;AACA;AACA,IAAInB,OAAJ;;AACA,SAAS+E,kBAAT,GAA8B;EAC1B,IAAI,CAAC/E,OAAL,EAAc;IACVA,OAAO,GAAG,IAAIE,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV;MAAA,OAAqBL,uDAAA,CAAYlV,mEAAZ,EACtCyV,IADsC,CACjCH,OADiC,EAEtCI,IAFsC,CAEjCH,MAFiC,CAArB;IAAA,CAAZ,CAAV;EAGH;;EACD,OAAOJ,OAAP;AACH;;AACc,SAASsC,iBAAT,GAA6B;EACxC,gBAA0BhK,+CAAQ,CAAC,KAAD,CAAlC;EAAA;EAAA,IAAOwG,KAAP;EAAA,IAAc0B,QAAd;;EACAjI,gDAAS,CAAC,YAAM;IACZwM,kBAAkB,GACbrG,IADL,CACU;MAAA,OAAM8B,QAAQ,CAAC,IAAD,CAAd;IAAA,CADV,WAEW,UAAAX,KAAK;MAAA,OAAI1I,mEAAA,CAAuB0I,KAAvB,CAAJ;IAAA,CAFhB;EAGH,CAJQ,EAIN,EAJM,CAAT;EAKA,OAAOf,KAAP;AACH;;;;;;;;;;;;;;;;;ACrBD;AACA;AAEA,IAAMkG,cAAc,gBAAG9T,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAvB;AAmBA,IAAM+T,KAAK,gBAAG/T,sDAAM,KAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAd;AAUA,IAAMgU,OAAO,gBAAGhU,sDAAM,KAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAhB;AAQA,IAAMiU,gBAAgB,gBAAGjU,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAzB;AAIe,SAAS8Q,OAAT,OAAyD;EAAA,IAAtCG,SAAsC,QAAtCA,SAAsC;EAAA,IAA3BC,YAA2B,QAA3BA,YAA2B;EAAA,IAAb9U,QAAa,QAAbA,QAAa;EACpE,OAAQP,uDAAK,CAACiY,cAAD,EAAiB;IAAE1X,QAAQ,EAAE,CAACP,uDAAK,CAACoY,gBAAD,EAAmB;MAAE7X,QAAQ,EAAE,CAACT,sDAAI,CAACoY,KAAD,EAAQ;QAAE3X,QAAQ,EAAE6U;MAAZ,CAAR,CAAL,EAAuCtV,sDAAI,CAACqY,OAAD,EAAU;QAAE5X,QAAQ,EAAE8U;MAAZ,CAAV,CAA3C;IAAZ,CAAnB,CAAN,EAA2H9U,QAA3H;EAAZ,CAAjB,CAAb;AACJ;;;;;;;;;;;;;;;;;;;AC9CA;AACA;;AAAkD,YAAhC,sBAAgCiF,KAAhC;EAAA,OAGIhD,eAAK;IAAA,OAAKA,KAAK,CAAC8S,GAAN9S,KAAc,UAAdA,GAA2B6V,8CAA3B7V,GAAuC8V,0CAA5C;EAAA,CAHT;AAAA,CAAgC;;AAClD,8EAAenU,sDAAM,UAANA,CAAM;EAAAS;EAAA;EAAAa;EAAAC;IAAA,cAECF,KAAuD,EAFxD;EAAA;AAAA,CAANrB,CAAf;;;;;;;;;;;;;;;;;;ACFA;;AAAwC,WACtB,sBADsBoB,IACtB;EAAA,OACF/C,eAAK;IAAA,OAAKA,KAAK,CAACwN,SAANxN,GAAkBA,KAAK,CAACwN,SAAxBxN,GAAoC,SAAzC;EAAA,CADH;AAAA,CADsB;;AACxC,8EAAe2B,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;EAAAC;IAAA,cACLH,IAAwD,EADnD;EAAA;AAAA,CAANpB,CAAf;;;;;;;;;;;;;;;;;;ACDA;AACA,8EAAeA,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAf;;;;;;;;;;;;;;;;;;ACDA;AACA,8EAAeA,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAAf;;;;;;;;;;;;;;;;;;;;ACDA;AACA;AACA;AACA,IAAMqU,YAAY,gBAAGrU,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAArB;AAUA,IAAMsU,YAAY,gBAAGtU,sDAAM,OAANA,CAAM;EAAAS;EAAA;EAAAa;AAAA,CAANtB,CAArB;;AAME,WAlBgB,sBAkBhBoB,IAlBgB;EAAA,OAqBN/C,eAAK;IAAA,OAAIA,KAAK,CAACkW,KAAV;EAAA,CArBC;AAAA,CAkBhB;;AACF,IAAMC,MAAM,gBAAGxU,sDAAM,UAANA,CAAM;EAAAS;EAAA;EAAAa;EAAAC;IAAA,cAETH,IAAoB,EAFX;EAAA;AAAA,CAANpB,CAAf;;AAME,YAzBgB,sBAyBhBqB,KAzBgB;EAAA,OA4BNhD,eAAK;IAAA,OAAIA,KAAK,CAACkW,KAAV;EAAA,CA5BC;AAAA,CAyBhB;;AACF,IAAME,cAAc,gBAAGzU,sDAAM,UAANA,CAAM;EAAAS;EAAA;EAAAa;EAAAC;IAAA,cAEjBF,KAAoB,EAFH;EAAA;AAAA,CAANrB,CAAvB;AA8Be,SAASwH,SAAT,OAAkC;EAAA,qBAAbwE,IAAa;EAAA,IAAbA,IAAa,0BAAN,EAAM;EAC7C,OAAQrQ,sDAAI,CAAC0Y,YAAD,EAAe;IAAEjY,QAAQ,EAAET,sDAAI,CAAC2Y,YAAD,EAAe;MAAElY,QAAQ,EAAEP,uDAAK,CAAC,KAAD,EAAQ;QAAEG,MAAM,EAAEgQ,IAAV;QAAgBjQ,KAAK,EAAEiQ,IAAvB;QAA6B/P,OAAO,EAAE,WAAtC;QAAmDG,QAAQ,EAAE,CAACT,sDAAI,CAAC6Y,MAAD,EAAS;UAAED,KAAK,EAAEhN,mDAAT;UAAyBmN,EAAE,EAAE,IAA7B;UAAmCC,EAAE,EAAE,IAAvC;UAA6CC,CAAC,EAAE;QAAhD,CAAT,CAAL,EAAyEjZ,sDAAI,CAAC8Y,cAAD,EAAiB;UAAEF,KAAK,EAAEH,4CAAT;UAAkBM,EAAE,EAAE,IAAtB;UAA4BC,EAAE,EAAE,IAAhC;UAAsCC,CAAC,EAAE;QAAzC,CAAjB,CAA7E;MAA7D,CAAR;IAAjB,CAAf;EAAhB,CAAf,CAAZ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;AC3DO,IAAMR,OAAO,GAAG,SAAhB;AACA,IAAM7M,cAAc,GAAG,SAAvB;AACA,IAAMD,aAAa,GAAG,SAAtB;AACA,IAAM6M,KAAK,GAAG,SAAd;AACA,IAAMU,IAAI,GAAG,SAAb;AACA,IAAMX,SAAS,GAAG,SAAlB;AACA,IAAMY,cAAc,GAAG,SAAvB;AACA,IAAMC,eAAe,GAAG,SAAxB;AACA,IAAMC,QAAQ,GAAG,SAAjB;;;;;;;;;;;;;;;ACRP,IAAM/W,gBAAgB,GAAG;EACrBM,SAAS,EAAE,WADU;EAErBiB,YAAY,EAAE;AAFO,CAAzB;AAIA,iEAAevB,gBAAf;;;;;;;;;;;;;;;ACJA,IAAMwJ,SAAS,GAAG;EACd8B,SAAS,EAAE,WADG;EAEdwB,OAAO,EAAE,SAFK;EAGd4I,MAAM,EAAE,QAHM;EAId1J,IAAI,EAAE,MAJQ;EAKdsE,MAAM,EAAE;AALM,CAAlB;AAOA,iEAAe9G,SAAf;;;;;;;;;;;;;;;;;;;ACPA;AACA;AACO,SAASwN,OAAT,CAAiBC,MAAjB,EAAyB;EAC5BhP,0DAAc;EACdD,0DAAA,CAAciP,MAAd;AACH;AACM,SAASE,cAAT,CAAwBF,MAAxB,EAAgC;EACnC,SAASG,IAAT,GAAgB;IACZxG,6CAAC,CAACqG,MAAD,CAAD;EACH;;EACDD,OAAO,CAACI,IAAD,CAAP;AACH;;;;;;;;;;;;;;;;;;ACXD;AACA;AACO,SAASC,iBAAT,CAA2BJ,MAA3B,EAAmC;EACtC,SAASG,IAAT,GAAgB;IACZ,IAAIE,KAAK,CAACC,OAAN,CAAcN,MAAd,CAAJ,EAA2B;MACvBA,MAAM,CAACO,OAAP,CAAe,UAAAhH,QAAQ;QAAA,OAAIA,QAAQ,EAAZ;MAAA,CAAvB;IACH,CAFD,MAGK;MACDyG,MAAM;IACT;EACJ;;EACDD,kDAAO,CAACI,IAAD,CAAP;AACH;AACM,IAAMnV,wBAAwB,GAAG,SAA3BA,wBAA2B,CAAChF,YAAD,EAAkB;EACtD,IAAIjC,MAAM,CAACyc,mBAAX,EAAgC;IAC5B,OAAOzc,MAAM,CAACyc,mBAAd;EACH;;EACD,cAAwDzc,MAAxD;EAAA,IAAQ0c,qBAAR,WAAQA,qBAAR;EAAA,IAA+BC,oBAA/B,WAA+BA,oBAA/B;EACA,IAAM9c,OAAO,GAAG,IAAI8c,oBAAJ,GACXC,SADW,CACDtb,2DADC,EAEXub,WAFW,CAECvc,6DAFD,EAGXwc,eAHW,CAGK7a,YAHL,CAAhB;EAIA,IAAM8a,QAAQ,GAAG,IAAIL,qBAAJ,CAA0B,yBAA1B,EAAqD7a,6DAArD,EAA+DhB,mEAA/D,EAA+E,YAAM,CAAG,CAAxF,EAA0F8P,UAA1F,CAAqG9Q,OAArG,CAAjB;EACAkd,QAAQ,CAACC,QAAT,CAAkBlI,QAAQ,CAACmI,IAA3B,EAAiC,KAAjC;EACAF,QAAQ,CAACG,mBAAT,GAXsD,CAWtB;;EAChCld,MAAM,CAACyc,mBAAP,GAA6BM,QAA7B;EACA,OAAO/c,MAAM,CAACyc,mBAAd;AACH,CAdM;;;;;;;;;;;;;;;;;;;;CCZP;;AACO,IAAMxX,gBAAgB,GAAG,SAAnBA,gBAAmB,GAAM;EAClC,OAAO4C,mDAAM,IAAI,CAAC,CAACA,uDAAM,CAAC,gBAAD,CAAzB;AACH,CAFM;AAGP,IAAMuV,eAAe,GAAGvW,2DAAU,CAAC,UAACgB,MAAD,EAASzC,KAAT,EAAmB;EAClD,OAAO;IACH0D,SAAS,EAAEjB,MAAM,CAAC,aAAD,CAAN,CAAsBG,sBAAtB,CAA6C,MAA7C,EAAqD5C,KAAK,CAACuC,OAA3D;EADR,CAAP;AAGH,CAJiC,CAAlC;AAKA,IAAM0V,iBAAiB,GAAGF,6DAAY,CAAC,UAACG,QAAD,EAAWlY,KAAX,EAAqB;EACxD,OAAO;IACH6D,YADG,wBACUnJ,KADV,EACiB;MAChBwd,QAAQ,CAAC,aAAD,CAAR,CAAwBC,QAAxB,CAAiC;QAAEC,IAAI,sBAAKpY,KAAK,CAACuC,OAAX,EAAqB7H,KAArB;MAAN,CAAjC;IACH;EAHE,CAAP;AAKH,CANqC,CAAtC;;AAOA,SAAS2d,KAAT,CAAeC,EAAf,EAAmB;EACf,OAAON,eAAe,CAACC,iBAAiB,CAACK,EAAD,CAAlB,CAAtB;AACH;;AACD,iEAAeD,KAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpBA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,KAAK;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,GAAG;AACd,YAAY,WAAW;AACvB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEsY;;;;;;;;;;;ACtUtY,WAAW,mBAAO,CAAC,+CAAS;;AAE5B;AACA;;AAEA;;;;;;;;;;;ACLA,aAAa,mBAAO,CAAC,mDAAW;AAChC,gBAAgB,mBAAO,CAAC,yDAAc;AACtC,qBAAqB,mBAAO,CAAC,mEAAmB;;AAEhD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC3BA,sBAAsB,mBAAO,CAAC,qEAAoB;;AAElD;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AClBA;AACA,wBAAwB,qBAAM,gBAAgB,qBAAM,IAAI,qBAAM,sBAAsB,qBAAM;;AAE1F;;;;;;;;;;;ACHA,aAAa,mBAAO,CAAC,mDAAW;;AAEhC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC7CA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,iBAAiB,mBAAO,CAAC,2DAAe;;AAExC;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;ACRA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;AClBA,eAAe,mBAAO,CAAC,qDAAY;AACnC,UAAU,mBAAO,CAAC,2CAAO;AACzB,eAAe,mBAAO,CAAC,qDAAY;;AAEnC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ,WAAW;AAC9B,WAAW,SAAS;AACpB;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,SAAS;AACpB;AACA,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,+CAA+C,iBAAiB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC5BA,iBAAiB,mBAAO,CAAC,2DAAe;AACxC,mBAAmB,mBAAO,CAAC,6DAAgB;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC5BA,WAAW,mBAAO,CAAC,+CAAS;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACtBA,eAAe,mBAAO,CAAC,uDAAa;AACpC,eAAe,mBAAO,CAAC,qDAAY;AACnC,eAAe,mBAAO,CAAC,qDAAY;;AAEnC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;;;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,UAAU,EAAC;;;;;;;;;;;;;;;;;;;AChDiC;;AAE3D;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,QAAQ;AAC1D,yCAAyC,QAAQ;AACjD,yDAAyD,QAAQ;AACjE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS,sDAAa;AACtB;AACA,0BAA0B,gDAAO;AACjC;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,QAAQ,sDAAa;AACrB;AACA;AACA;AACA;AACA;AACA,kBAAkB,iDAAQ;AAC1B,iBAAiB,iDAAQ;AACzB;AACA;AACA;AACA,SAAS,IAAI;AACb;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,sDAAa;AACtC;AACA;AACA;AACA;AACA,0BAA0B,gDAAO;AACjC;AACA;AACA,aAAa;AACb;AACA;AACA,uCAAuC,sDAAa;AACpD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA;AACA;AACA,QAAQ,sDAAa;AACrB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA,QAAQ,gDAAO,eAAe,gDAAO;AACrC;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA,iEAAe,KAAK,EAAC;AACU;;;;;;;;;;;;;AC5H/B;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;ACAA;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;;AAEa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH,kCAAkC;AAClC;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iBAAiB,sBAAsB;AACvC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb;;AAEA,IAAI,IAAqC;AACzC,6BAA6B,mBAAO,CAAC,yFAA4B;AACjE;AACA,YAAY,mBAAO,CAAC,uDAAW;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,YAAY;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,WAAW;AACtB;AACA;AACA;AACA,MAAM,IAAqC;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6GAA6G;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,IAAqC;AAC3C;AACA;AACA;;AAEA;;;;;;;;;;;;ACtGA;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb,cAAc,mBAAO,CAAC,kDAAU;AAChC,aAAa,mBAAO,CAAC,4DAAe;;AAEpC,2BAA2B,mBAAO,CAAC,yFAA4B;AAC/D,UAAU,mBAAO,CAAC,uDAAW;AAC7B,qBAAqB,mBAAO,CAAC,qEAAkB;;AAE/C;;AAEA,IAAI,IAAqC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,2CAA2C;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,8BAA8B;AAC9B,QAAQ;AACR;AACA;AACA;AACA;AACA,+BAA+B,KAAK;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,4BAA4B;AAC5B,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,IAAqC;AAC7C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,SAAS,KAAqC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,sBAAsB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU,IAAqC;AAC/C;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,2BAA2B;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM,KAAqC,4FAA4F,CAAM;AAC7I;AACA;;AAEA,oBAAoB,gCAAgC;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,gCAAgC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iHAAiH;AACjH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;ACjmBA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI,IAAqC;AACzC,gBAAgB,mBAAO,CAAC,kDAAU;;AAElC;AACA;AACA;AACA,mBAAmB,mBAAO,CAAC,uFAA2B;AACtD,EAAE,KAAK,EAIN;;;;;;;;;;;;AClBD;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb;;AAEA;;;;;;;;;;;ACXA;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACPA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,gBAAgB,+CAA+C;;AAE/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACtCA;;AAEA,eAAe,mBAAO,CAAC,wFAA6B;AACpD,gBAAgB,mBAAO,CAAC,gHAAyC;AACjE,uBAAuB,mBAAO,CAAC,iEAAe;;AAE9C,YAAY,mBAAO,CAAC,qDAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,2FAA+B;;AAEvD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;AAC5C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS,GAAG;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,+CAA+C;AAC/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,wBAAwB,iDAAiD;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,+BAA+B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B;AAC3B,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,0CAA0C;AAC1C,2CAA2C;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,MAAM;AACN,2EAA2E;AAC3E;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACr4DA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,mBAAO,CAAC,qDAAS;;AAExC;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;AAC5C;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;;;;;;;;;AC9BA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;;AAE5C;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC;AACnC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oCAAoC;AACpC;AACA;;AAEA;AACA;AACA,wBAAwB;AACxB;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,SAAS;AAClB;AACA;AACA;AACA;AACA,iDAAiD;AACjD,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA,cAAc,0BAA0B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,kCAAkC;AAClC;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChYA,YAAY,mBAAO,CAAC,6DAAiB;;AAErC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;;AAE5C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,qDAAqD,KAAK;AAC1D,uDAAuD,KAAK;AAC5D;AACA,WAAW,aAAa,YAAY;AACpC;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,+DAA+D;AAC/D;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,oBAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,iBAAiB;AAChC;AACA,eAAe,kBAAkB;AACjC;AACA,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,8BAA8B;;AAE9B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;;AAE1B;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,qBAAqB;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAsC,OAAO;AAC7C;AACA,qEAAqE;AACrE,iEAAiE;AACjE;AACA;AACA,kCAAkC;AAClC,kCAAkC;AAClC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,oBAAoB;AACnC;AACA,eAAe,QAAQ;AACvB,eAAe,iBAAiB;AAChC;AACA,eAAe,SAAS;AACxB;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B;AAC1B,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ,0CAA0C;AAClD,eAAe,OAAO;AACtB,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,qEAAqE;AACrE,UAAU;AACV;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,kBAAkB;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;;;;;;;;;;;AC9mBA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB;;AAEpB;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa;;;;AAIb,IAAI,IAAqC;AACzC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;;AAEjD;AACA;AACA;AACA,kDAAkD;;AAElD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB;AACjB,sBAAsB;AACtB,uBAAuB;AACvB,uBAAuB;AACvB,eAAe;AACf,kBAAkB;AAClB,gBAAgB;AAChB,YAAY;AACZ,YAAY;AACZ,cAAc;AACd,gBAAgB;AAChB,kBAAkB;AAClB,gBAAgB;AAChB,mBAAmB;AACnB,wBAAwB;AACxB,yBAAyB;AACzB,yBAAyB;AACzB,iBAAiB;AACjB,oBAAoB;AACpB,kBAAkB;AAClB,cAAc;AACd,cAAc;AACd,gBAAgB;AAChB,kBAAkB;AAClB,oBAAoB;AACpB,kBAAkB;AAClB,0BAA0B;AAC1B,cAAc;AACd,GAAG;AACH;;;;;;;;;;;;ACpLa;;AAEb,IAAI,KAAqC,EAAE,EAE1C,CAAC;AACF,EAAE,gIAAyD;AAC3D;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb,IAAI,IAAqC;AACzC;AACA;;AAEA,YAAY,mBAAO,CAAC,oBAAO;AAC3B,cAAc,mBAAO,CAAC,4DAAe;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE,gBAAgB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,+FAA+F,eAAe;AAC9G;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK,GAAG;;AAER,kDAAkD;AAClD;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,4BAA4B;;AAE5B;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;;AAEvC;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,uBAAuB;AACvB;AACA,SAAS;AACT,wBAAwB;AACxB;AACA,SAAS;AACT,wBAAwB;AACxB;AACA,SAAS;AACT,yBAAyB;AACzB;AACA,SAAS;AACT,yBAAyB;AACzB;AACA,SAAS;AACT,kCAAkC;AAClC;AACA,SAAS;AACT,4BAA4B;AAC5B;AACA,SAAS;AACT,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;;;AAGN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,2DAA2D;;AAE3D;AACA;;AAEA;AACA,yDAAyD;AACzD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,kBAAkB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB;;;AAGlB;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAI;;;AAGJ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B;AAC9B;AACA;;AAEA;AACA;AACA;AACA;AACA,2HAA2H;AAC3H;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA,oEAAoE;;AAEpE;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,GAAG;AACd,WAAW,GAAG;AACd,WAAW,eAAe;AAC1B,WAAW,GAAG;AACd,WAAW,GAAG;AACd;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK,GAAG;;AAER;AACA;AACA;AACA;AACA;AACA,KAAK,GAAG;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;;AAEA;AACA;AACA,kBAAkB;;AAElB;AACA;AACA,oBAAoB;AACpB,2DAA2D,UAAU;AACrE,yBAAyB,UAAU;AACnC;AACA,aAAa,UAAU;AACvB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;;;AAGN;AACA;AACA;AACA;AACA,MAAM;;;AAGN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,YAAY,SAAS;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,GAAG;AACd;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,6DAA6D;AAC7D;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,WAAW;AACtB,WAAW,GAAG;AACd;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,iBAAiB;AACvC;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN,4CAA4C;;AAE5C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB;;;AAGA;AACA;AACA;;AAEA,oBAAoB,iBAAiB;AACrC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA,0DAA0D;AAC1D;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAsC;AACtC;;AAEA;;AAEA,WAAW;AACX,YAAY;AACZ,GAAG;AACH;;;;;;;;;;;;ACpsCa;;AAEb,IAAI,KAAqC,EAAE,EAE1C,CAAC;AACF,EAAE,+IAAkE;AACpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNuC;AACW;AACmC;AAC5C;AAC4B;AACnC;AACC;AACY;AACZ;;AAEnC;;AAEA;AACA;;AAEA,+CAA+C,SAAS;AACxD;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA,EAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA,kBAAkB,sBAAsB;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,mCAAmC;;AAEnC;AACA;AACA;AACA;;AAEA;;AAEA;AACA,UAAU,KAAqC,0CAA0C,CAAK;AAC9F;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oMAAoM,aAAoB;;AAExN;AACA;;AAEA;;;AAGA;AACA;AACA;AACA,aAAa,KAAqC;AAClD;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA,wGAAwG,SAAS,EAAE;AACnH;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,EAAE,CAAE;;AAEN;AACA;AACA;AACA;AACA;AACA;;AAEA,0CAA0C,SAAS;AACnD;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,iGAAiG,aAAa;AAC9G;AACA;;AAEA,QAAQ,KAAqC,EAAE,cAE1C,CAAC;AACN;AACA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;;AAEA;AACA,mCAAmC;AACnC;AACA;AACA,8BAA8B,kDAAkD;AAChF;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,GAAG;AACH,CAAC;;AAED;;AAEA;;AAEA;AACA,yBAAyB,0DAAM;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED,iBAAiB,0DAAM;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,wDAAiB;AACxC;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,2DAA2D;;AAE3D,kEAAkE,iBAAiB;;AAEnF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,SAAS,KAAwC,GAAG,sBAAiB,GAAG,CAAI;AAC5E,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,UAAU;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B,gBAAgB;AAC7C;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oDAAoD;;AAEpD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,4BAA4B;;AAE5B;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,0DAAmB,qBAAqB,WAAW,2BAA2B,iBAAiB;AAC1G;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,kBAAkB;AACtC;AACA,yCAAyC;AACzC;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,oCAAoC;AACpC;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,SAAS;AACxC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,0CAA0C,SAAS;AACnD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,sCAAsC,WAAW;AACjD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,oBAAoB,eAAe;AACnC;;AAEA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,qBAAqB,oBAAoB;AACzC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,gBAAgB;AACtC;AACA;;AAEA;AACA,KAAK;;AAEL;AACA,uCAAuC;AACvC,gCAAgC;;AAEhC;AACA;;AAEA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;;AAEA;;AAEA,oBAAoB,mBAAmB;AACvC;AACA;;AAEA;AACA;AACA;;AAEA;;;AAGA;AACA;;;AAGA,oBAAoB,mBAAmB;AACvC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;;AAEA;;AAEA,oBAAoB,mBAAmB;AACvC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;;AAGA;AACA;AACA,aAAa,mDAAY,oBAAoB,UAAU;AACvD,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,4DAA4D,yDAAQ;AACpE,yBAAyB;AACzB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR,8DAA8D;;AAE9D;AACA;AACA,qFAAqF;AACrF;AACA;AACA,GAAG;;AAEH,iCAAiC,oBAAoB;AACrD;;AAEA;AACA;AACA;;AAEA,gDAAgD,SAAS;AACzD;;AAEA,oCAAoC,oEAAoE;AACxG;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,UAAU,KAAqC,IAAI,mDAAS;AAC5D;AACA;AACA;;AAEA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,+FAA+F,aAAa;AAC5G;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,OAAO,4DAAkB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sEAAsE;AACtE;;AAEA;AACA;AACA,sEAAsE;AACtE;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAAkD,OAAO;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,iBAAiB;AAClC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kBAAkB,kBAAkB;AACpC;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oBAAoB,MAAqC,IAAI,CAA2B;AACxF;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4QAA4Q,mBAAmB,sDAAsD,WAAW,eAAe;AAC/W;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,wCAAwC,KAAqC,yDAAyD,CAAI;AAC1I;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAsC,gBAAgB,gDAAU;AAChE;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA,mBAAmB,oDAAa;;AAEhC;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,uBAAuB,uDAAO;AAC9B;AACA;AACA;;AAEA;AACA;;AAEA,WAAW,0DAAmB;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,WAAW,0DAAmB;AAC9B;AACA,QAAQ,gBAAgB;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA,UAAU,KAAqC;AAC/C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;;AAEA;AACA,CAAC,CAAC,4CAAS;;AAEX;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,WAAW,0DAAmB;AAC9B;AACA,QAAQ,sBAAsB;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,eAAe,gCAAgC;AAC/C;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA,CAAC;;AAED;;AAEA,wBAAwB,oDAAa;AACrC;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,uBAAuB,uDAAO;AAC9B;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA,WAAW,0DAAmB;AAC9B;AACA,QAAQ,uCAAuC;AAC/C,MAAM,KAAqC,GAAG,0DAAmB,aAAa,CAAQ;AACtF;AACA;;AAEA;AACA,CAAC,CAAC,4CAAS;AACX,KAAqC;AACrC,SAAS,2DAAmB,EAAE,4DAAoB,cAAc,4DAAoB;;AAEpF,UAAU,uDAAe;AACzB,iBAAiB,mEAAyB;AAC1C,GAAG;AACH,EAAE,EAAE,CAAM;;AAEV;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,QAAQ,IAAqC;AAC7C;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,yDAAyD,4HAA4H;AACrL;AACA,OAAO;;AAEP;AACA;AACA;AACA,wRAAwR,WAAW,yOAAyO,oCAAoC,aAAa,6BAA6B;AAC1lB;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA,WAAW,0DAAmB;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,WAAW,0DAAmB;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA,mCAAmC;;AAEnC;AACA;AACA;AACA,UAAU,KAAqC;AAC/C;AACA;;AAEA;AACA;AACA,QAAQ,0EAA0E,wEAAwE,yBAAyB,kEAAS;AAC5L;AACA;AACA;AACA;;AAEA;AACA,yCAAyC;AACzC;;AAEA;;AAEA,WAAW,oDAAa;AACxB;;AAEA;AACA;;AAEA,6BAA6B,WAAW,cAAc;;AAEtD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,IAAqC;AACrD;AACA;;AAEA;;AAEA,gBAAgB,KAAqC,IAAI,2DAAoB;AAC7E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,QAAQ,KAAqC;;AAE7C;AACA;;AAEA;AACA,CAAC,CAAC,4CAAS;;AAEX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,0DAAmB,6BAA6B,WAAW,+DAA+D;AACrI;AACA;AACA,2BAA2B,uDAAgB;AAC3C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;;AAEA,gCAAgC;AAChC;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,sDAAsD,0DAAK;AAC3D;AACA,GAAG;;AAEH,MAAM,IAAqC;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;;AAEA;AACA,+FAA+F,aAAa;AAC5G;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,UAAU,KAAqC,IAAI,2DAAoB;AACvE;AACA;AACA;;AAEA,aAAa,0DAAmB;AAChC;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;;AAEA;AACA,YAAY;AACZ,mBAAmB,0DAAmB;AACtC;AACA;AACA;AACA;AACA;;;AAGA,yCAAyC;;AAEzC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG,CAAC,wDAAe;;AAEnB;AACA;;;AAGA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM,KAAqC;AAC3C;AACA;AACA;;AAEA,+FAA+F,aAAa;AAC5G;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,kBAAkB,uDAAgB;AAClC,WAAW,0DAAmB;AAC9B;AACA;AACA;AACA;AACA;;AAEA;;AAEA,YAAY,KAAqC;AACjD;AACA;AACA;;AAEA,eAAe,0DAAmB,0BAA0B,WAAW,4BAA4B;AACnG;AACA;AACA,GAAG;;AAEH;;AAEA;;AAEA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,IAAI,KAAqC;AACzC;AACA;AACA;;AAEA;AACA,IAAI,KAAwE;AAC5E;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,iEAAe,MAAM,EAAC;AACmO;AACzP;;;;;;;;;;;ACp7EA;AACA,CAAC,KAA4D;AAC7D,EAAE,CACwC;AAC1C,CAAC;;AAED;;AAEA;AACA;AACA,2BAA2B;;AAE3B;AACA;AACA;AACA,0BAA0B;AAC1B,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;AC/CD,aAAa,KAAoD,wBAAwB,CAA2E,CAAC,eAAe,aAAa,0SAA0S,GAAG,eAAe,iBAAiB,GAAG,KAAK,KAAK,UAAU,GAAG,yCAAyC,EAAE,oCAAoC,8dAA8d,uBAAuB,oJAAoJ,KAAK,EAAE,4CAA4C,qBAAqB,kBAAkB,gBAAgB,WAAW,4BAA4B,uBAAuB,UAAU,yCAAyC,wBAAwB,KAAK,oBAAoB,6DAA6D,kCAAkC,kCAAkC,MAAM,4BAA4B,mCAAmC,MAAM,uBAAuB,cAAc,UAAU,qDAAqD,KAAK,EAAE,0BAA0B,WAAW,MAAM,WAAW,MAAM,mCAAmC,6BAA6B,MAAM,WAAW,WAAW,mBAAmB,4BAA4B,GAAG,eAAe,IAAI,4EAA4E,UAAU,mCAAmC,2BAA2B,mCAAmC,MAAM,aAAa,6DAA6D,6HAA6H,kBAAkB,4BAA4B,+BAA+B,OAAO,EAAE,MAAM,wDAAwD,OAAO,kDAAkD,eAAe,MAAM,wCAAwC,WAAW,MAAM,sCAAsC,kEAAkE,MAAM,uEAAuE,qFAAqF,uGAAuG,gDAAgD,cAAc,0BAA0B,mBAAmB,MAAM,yCAAyC,iCAAiC,kDAAkD,UAAU,0CAA0C,iHAAiH,oBAAoB,aAAa,oDAAoD,+CAA+C,UAAU,MAAM,8BAA8B,KAAK,MAAM,sCAAsC,qCAAqC,kCAAkC,MAAM,wBAAwB,MAAM,iBAAiB,MAAM,iBAAiB,MAAM,iBAAiB,MAAM,+CAA+C,MAAM,0CAA0C,6CAA6C,sBAAsB,MAAM,wBAAwB,MAAM,oCAAoC,MAAM,2CAA2C,MAAM,wBAAwB,MAAM,wBAAwB,MAAM,wBAAwB,MAAM,qBAAqB,yBAAyB,eAAe,gBAAgB,IAAI,MAAM,8BAA8B,MAAM,+BAA+B,UAAU,uCAAuC,aAAa,MAAM,kBAAkB,MAAM,kCAAkC,mDAAmD,YAAY,UAAU,yCAAyC,sDAAsD,UAAU,qCAAqC,MAAM,mCAAmC,KAAK,eAAe,+BAA+B,MAAM,MAAM,mCAAmC,MAAM,wBAAwB,8EAA8E,gCAAgC,4BAA4B,YAAY,2IAA2I,SAAS,gCAAgC,sCAAsC,IAAI,KAAK,wDAAwD,IAAI,KAAK,yCAAyC,qEAAqE,kDAAkD,cAAc,UAAU,cAAc,kDAAkD,gBAAgB,MAAM,mDAAmD,kBAAkB,uBAAuB,MAAM,yCAAyC,MAAM,YAAY,+DAA+D,cAAc,KAAK,4BAA4B,SAAS,2FAA2F,oBAAoB,OAAO,YAAY,0BAA0B,WAAW,uCAAuC,MAAM,uGAAuG,MAAM,gBAAgB,mBAAmB,kDAAkD,UAAU,8CAA8C,IAAI,+BAA+B,MAAM,YAAY,QAAQ,SAAS,IAAI,gBAAgB,IAAI,wCAAwC,SAAS,qBAAqB,0BAA0B,qCAAqC,UAAU,oBAAoB,2CAA2C,0CAA0C,MAAM,+BAA+B,mEAAmE,MAAM,mDAAmD,gGAAgG,WAAW,qBAAqB,gBAAgB,gBAAgB,8BAA8B,0FAA0F,2BAA2B,aAAa,uCAAuC,uDAAuD,IAAI,SAAS,4BAA4B,OAAO,EAAE,sBAAsB,0HAA0H,iBAAiB,uTAAuT,eAAe,SAAS,+BAA+B,WAAW,uCAAuC,SAAS,IAAI,0CAA0C,UAAU,+CAA+C,8CAA8C,8CAA8C,yCAAyC,+BAA+B,0BAA0B,wCAAwC,6CAA6C,kEAAkE,SAAS,wDAAwD,oFAAoF,uDAAuD,2DAA2D,iBAAiB,kCAAkC,wCAAwC,oIAAoI,qEAAqE,6FAA6F,6BAA6B,MAAM,gCAAgC,MAAM,6BAA6B,MAAM,iBAAiB,iBAAiB,iDAAiD,0JAA0J,sCAAsC,8BAA8B,IAAI,MAAM,gEAAgE,qBAAqB,2BAA2B,IAAI,WAAW,EAAE,wDAAwD,sEAAsE,qDAAqD,oFAAoF,MAAM,sEAAsE,4LAA4L,oEAAoE,MAAM,mJAAmJ,kCAAkC,SAAS,iBAAiB,4BAA4B,6DAA6D,yCAAyC,iBAAiB,4DAA4D,eAAe,iDAAiD,iCAAiC,kBAAkB,KAAK,iDAAiD,iDAAiD,YAAY,kBAAkB,qBAAqB,cAAc,IAAI,4BAA4B,6DAA6D,MAAM,2BAA2B,SAAS,eAAe,gBAAgB,WAAW,UAAU,sBAAsB,MAAM,oBAAoB,MAAM,qBAAqB,MAAM,sBAAsB,MAAM,uBAAuB,MAAM,sBAAsB,MAAM,gCAAgC,kCAAkC,gBAAgB,UAAU,iBAAiB,oDAAoD,0BAA0B,qCAAqC,qCAAqC,mBAAmB,UAAU,aAAa,2EAA2E,qBAAqB,qFAAqF,+HAA+H,wBAAwB,UAAU,qCAAqC,MAAM,2CAA2C,kDAAkD,IAAI,YAAY,cAAc,SAAS,4BAA4B,UAAU;AAC51X;;;;;;;;;;;ACDA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;ACAA;AAC+C;AACrB;AACS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,oCAAoC,8DAAS,oBAAoB,SAAS,8DAAS,GAAG,EAAE,8DAAS;AACjG;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,MAAM,IAAqC;AAC3C;AACA;AACA;AACA;AACA;AACA,wCAAwC,YAAY,sBAAsB,cAAc;AACxF;AACA;AACA;AACA;AACA;AACA,QAAQ,IAAqC;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,wCAAwC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,iDAAE,wDAAwD,iDAAE;AAC7G,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,KAAK,QAAQ,MAAM,EAAE,KAAK;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,eAAe,gDAAmB;AAClC;AACA,aAAa,gDAAmB;AAChC;AACA,mBAAmB,6CAAgB,GAAG,6CAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,KAAqC;AAC1D;AACA;AACA;AACA,CAAC,IAAI,CAAM;AAGT;AACF;;;;;;;;;;;;;;;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIE;AACF;;;;;;UCtCA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;;;;;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACApB,4EAAiB,CAAC,CACdnX,8EADc,EAEdsB,qFAFc,EAGdU,kFAHc,CAAD,CAAjB,C","sources":["webpack://leadin/./node_modules/@emotion/is-prop-valid/dist/is-prop-valid.browser.esm.js","webpack://leadin/./node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize/dist/memoize.browser.esm.js","webpack://leadin/./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js","webpack://leadin/./node_modules/@emotion/unitless/dist/unitless.browser.esm.js","webpack://leadin/./node_modules/@linaria/react/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js","webpack://leadin/./scripts/constants/defaultFormOptions.ts","webpack://leadin/./scripts/constants/leadinConfig.ts","webpack://leadin/./scripts/gutenberg/Common/CalendarIcon.tsx","webpack://leadin/./scripts/gutenberg/Common/SidebarSprocketIcon.tsx","webpack://leadin/./scripts/gutenberg/Common/SprocketIcon.tsx","webpack://leadin/./scripts/gutenberg/FormBlock/FormBlockSave.tsx","webpack://leadin/./scripts/gutenberg/FormBlock/FormGutenbergPreview.tsx","webpack://leadin/./scripts/gutenberg/FormBlock/registerFormBlock.tsx","webpack://leadin/./scripts/gutenberg/MeetingsBlock/MeetingGutenbergPreview.tsx","webpack://leadin/./scripts/gutenberg/MeetingsBlock/MeetingSaveBlock.tsx","webpack://leadin/./scripts/gutenberg/MeetingsBlock/registerMeetingBlock.tsx","webpack://leadin/./scripts/gutenberg/Sidebar/contentType.tsx","webpack://leadin/./scripts/gutenberg/UIComponents/UIImage.ts","webpack://leadin/./scripts/gutenberg/UIComponents/UISidebarSelectControl.tsx","webpack://leadin/./scripts/iframe/integratedMessages/core/CoreMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/forms/FormsMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/index.ts","webpack://leadin/./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/plugin/PluginMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts","webpack://leadin/./scripts/iframe/useBackgroundApp.ts","webpack://leadin/./scripts/lib/Raven.ts","webpack://leadin/./scripts/shared/Common/AsyncSelect.tsx","webpack://leadin/./scripts/shared/Common/ErrorHandler.tsx","webpack://leadin/./scripts/shared/Common/HubspotWrapper.ts","webpack://leadin/./scripts/shared/Common/LoadingBlock.tsx","webpack://leadin/./scripts/shared/Form/FormEdit.tsx","webpack://leadin/./scripts/shared/Form/FormSelect.tsx","webpack://leadin/./scripts/shared/Form/FormSelector.tsx","webpack://leadin/./scripts/shared/Form/PreviewForm.tsx","webpack://leadin/./scripts/shared/Form/hooks/useCreateFormFromTemplate.ts","webpack://leadin/./scripts/shared/Form/hooks/useForms.ts","webpack://leadin/./scripts/shared/Form/hooks/useFormsScript.ts","webpack://leadin/./scripts/shared/Meeting/MeetingController.tsx","webpack://leadin/./scripts/shared/Meeting/MeetingEdit.tsx","webpack://leadin/./scripts/shared/Meeting/MeetingSelector.tsx","webpack://leadin/./scripts/shared/Meeting/MeetingWarning.tsx","webpack://leadin/./scripts/shared/Meeting/PreviewMeeting.tsx","webpack://leadin/./scripts/shared/Meeting/constants.ts","webpack://leadin/./scripts/shared/Meeting/hooks/useCurrentUserFetch.ts","webpack://leadin/./scripts/shared/Meeting/hooks/useMeetings.ts","webpack://leadin/./scripts/shared/Meeting/hooks/useMeetingsFetch.ts","webpack://leadin/./scripts/shared/Meeting/hooks/useMeetingsScript.ts","webpack://leadin/./scripts/shared/UIComponents/UIAlert.tsx","webpack://leadin/./scripts/shared/UIComponents/UIButton.ts","webpack://leadin/./scripts/shared/UIComponents/UIContainer.ts","webpack://leadin/./scripts/shared/UIComponents/UIOverlay.ts","webpack://leadin/./scripts/shared/UIComponents/UISpacer.ts","webpack://leadin/./scripts/shared/UIComponents/UISpinner.tsx","webpack://leadin/./scripts/shared/UIComponents/colors.ts","webpack://leadin/./scripts/shared/enums/connectionStatus.ts","webpack://leadin/./scripts/shared/enums/loadState.ts","webpack://leadin/./scripts/utils/appUtils.ts","webpack://leadin/./scripts/utils/backgroundAppUtils.ts","webpack://leadin/./scripts/utils/withMetaData.ts","webpack://leadin/./node_modules/is-what/dist/index.esm.js","webpack://leadin/./node_modules/lodash/_Symbol.js","webpack://leadin/./node_modules/lodash/_baseGetTag.js","webpack://leadin/./node_modules/lodash/_baseTrim.js","webpack://leadin/./node_modules/lodash/_freeGlobal.js","webpack://leadin/./node_modules/lodash/_getRawTag.js","webpack://leadin/./node_modules/lodash/_objectToString.js","webpack://leadin/./node_modules/lodash/_root.js","webpack://leadin/./node_modules/lodash/_trimmedEndIndex.js","webpack://leadin/./node_modules/lodash/debounce.js","webpack://leadin/./node_modules/lodash/isObject.js","webpack://leadin/./node_modules/lodash/isObjectLike.js","webpack://leadin/./node_modules/lodash/isSymbol.js","webpack://leadin/./node_modules/lodash/now.js","webpack://leadin/./node_modules/lodash/toNumber.js","webpack://leadin/./node_modules/memoize-one/dist/memoize-one.esm.js","webpack://leadin/./node_modules/merge-anything/dist/index.esm.js","webpack://leadin/./scripts/gutenberg/UIComponents/UIImage.ts?e01f","webpack://leadin/./scripts/shared/Common/AsyncSelect.tsx?df11","webpack://leadin/./scripts/shared/Common/HubspotWrapper.ts?a346","webpack://leadin/./scripts/shared/UIComponents/UIAlert.tsx?0f15","webpack://leadin/./scripts/shared/UIComponents/UIButton.ts?d089","webpack://leadin/./scripts/shared/UIComponents/UIContainer.ts?e576","webpack://leadin/./scripts/shared/UIComponents/UIOverlay.ts?c9f9","webpack://leadin/./scripts/shared/UIComponents/UISpacer.ts?8e1e","webpack://leadin/./scripts/shared/UIComponents/UISpinner.tsx?4a02","webpack://leadin/./node_modules/object-assign/index.js","webpack://leadin/./node_modules/prop-types/checkPropTypes.js","webpack://leadin/./node_modules/prop-types/factoryWithTypeCheckers.js","webpack://leadin/./node_modules/prop-types/index.js","webpack://leadin/./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://leadin/./node_modules/prop-types/lib/has.js","webpack://leadin/./node_modules/raven-js/src/configError.js","webpack://leadin/./node_modules/raven-js/src/console.js","webpack://leadin/./node_modules/raven-js/src/raven.js","webpack://leadin/./node_modules/raven-js/src/singleton.js","webpack://leadin/./node_modules/raven-js/src/utils.js","webpack://leadin/./node_modules/raven-js/vendor/TraceKit/tracekit.js","webpack://leadin/./node_modules/raven-js/vendor/json-stringify-safe/stringify.js","webpack://leadin/./node_modules/react-is/cjs/react-is.development.js","webpack://leadin/./node_modules/react-is/index.js","webpack://leadin/./node_modules/react/cjs/react-jsx-runtime.development.js","webpack://leadin/./node_modules/react/jsx-runtime.js","webpack://leadin/./node_modules/styled-components/dist/styled-components.browser.esm.js","webpack://leadin/./node_modules/stylis-rule-sheet/index.js","webpack://leadin/./node_modules/stylis/stylis.min.js","webpack://leadin/external window \"React\"","webpack://leadin/external window \"jQuery\"","webpack://leadin/external window [\"wp\",\"blocks\"]","webpack://leadin/external window [\"wp\",\"components\"]","webpack://leadin/external window [\"wp\",\"data\"]","webpack://leadin/external window [\"wp\",\"editPost\"]","webpack://leadin/external window [\"wp\",\"element\"]","webpack://leadin/external window [\"wp\",\"i18n\"]","webpack://leadin/external window [\"wp\",\"plugins\"]","webpack://leadin/./node_modules/@linaria/react/dist/index.mjs","webpack://leadin/./node_modules/@linaria/react/node_modules/@linaria/core/dist/index.mjs","webpack://leadin/webpack/bootstrap","webpack://leadin/webpack/runtime/compat get default export","webpack://leadin/webpack/runtime/define property getters","webpack://leadin/webpack/runtime/global","webpack://leadin/webpack/runtime/hasOwnProperty shorthand","webpack://leadin/webpack/runtime/make namespace object","webpack://leadin/webpack/runtime/nonce","webpack://leadin/./scripts/entries/gutenberg.ts"],"sourcesContent":["import memoize from '@emotion/memoize';\n\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|inert|itemProp|itemScope|itemType|itemID|itemRef|on|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar index = memoize(function (prop) {\n return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n /* o */\n && prop.charCodeAt(1) === 110\n /* n */\n && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\nexport default index;\n","function memoize(fn) {\n var cache = {};\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\n\nexport default memoize;\n","function memoize(fn) {\n var cache = Object.create(null);\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\n\nexport default memoize;\n","var unitlessKeys = {\n animationIterationCount: 1,\n borderImageOutset: 1,\n borderImageSlice: 1,\n borderImageWidth: 1,\n boxFlex: 1,\n boxFlexGroup: 1,\n boxOrdinalGroup: 1,\n columnCount: 1,\n columns: 1,\n flex: 1,\n flexGrow: 1,\n flexPositive: 1,\n flexShrink: 1,\n flexNegative: 1,\n flexOrder: 1,\n gridRow: 1,\n gridRowEnd: 1,\n gridRowSpan: 1,\n gridRowStart: 1,\n gridColumn: 1,\n gridColumnEnd: 1,\n gridColumnSpan: 1,\n gridColumnStart: 1,\n msGridRow: 1,\n msGridRowSpan: 1,\n msGridColumn: 1,\n msGridColumnSpan: 1,\n fontWeight: 1,\n lineHeight: 1,\n opacity: 1,\n order: 1,\n orphans: 1,\n tabSize: 1,\n widows: 1,\n zIndex: 1,\n zoom: 1,\n WebkitLineClamp: 1,\n // SVG-related properties\n fillOpacity: 1,\n floodOpacity: 1,\n stopOpacity: 1,\n strokeDasharray: 1,\n strokeDashoffset: 1,\n strokeMiterlimit: 1,\n strokeOpacity: 1,\n strokeWidth: 1\n};\n\nexport default unitlessKeys;\n","import memoize from '@emotion/memoize';\n\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar isPropValid = /* #__PURE__ */memoize(function (prop) {\n return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n /* o */\n && prop.charCodeAt(1) === 110\n /* n */\n && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\nexport default isPropValid;\n","import { __ } from '@wordpress/i18n';\nconst REGISTRATION_FORM = 'REGISTRATION_FORM';\nconst CONTACT_US_FORM = 'CONTACT_US_FORM';\nconst NEWSLETTER_FORM = 'NEWSLETTER_FORM';\nconst SUPPORT_FORM = 'SUPPORT_FORM';\nconst EVENT_FORM = 'EVENT_FORM';\nexport const DEFAULT_OPTIONS = {\n label: __('Templates', 'leadin'),\n options: [\n { label: __('Registration Form', 'leadin'), value: REGISTRATION_FORM },\n { label: __('Contact us Form', 'leadin'), value: CONTACT_US_FORM },\n { label: __('Newsletter sign-up Form', 'leadin'), value: NEWSLETTER_FORM },\n { label: __('Support Form', 'leadin'), value: SUPPORT_FORM },\n { label: __('Event Registration Form', 'leadin'), value: EVENT_FORM },\n ],\n};\nexport function isDefaultForm(value) {\n return (value === REGISTRATION_FORM ||\n value === CONTACT_US_FORM ||\n value === NEWSLETTER_FORM ||\n value === SUPPORT_FORM ||\n value === EVENT_FORM);\n}\n","const { accountName, adminUrl, activationTime, connectionStatus, deviceId, didDisconnect, env, formsScript, meetingsScript, formsScriptPayload, hublet, hubspotBaseUrl, hubspotNonce, iframeUrl, impactLink, lastAuthorizeTime, lastDeauthorizeTime, lastDisconnectTime, leadinPluginVersion, leadinQueryParams, locale, loginUrl, phpVersion, pluginPath, plugins, portalDomain, portalEmail, portalId, redirectNonce, restNonce, restUrl, refreshToken, reviewSkippedDate, theme, trackConsent, wpVersion, contentEmbed, requiresContentEmbedScope, refreshTokenError, } = window.leadinConfig;\nexport { accountName, adminUrl, activationTime, connectionStatus, deviceId, didDisconnect, env, formsScript, meetingsScript, formsScriptPayload, hublet, hubspotBaseUrl, hubspotNonce, iframeUrl, impactLink, lastAuthorizeTime, lastDeauthorizeTime, lastDisconnectTime, leadinPluginVersion, leadinQueryParams, loginUrl, locale, phpVersion, pluginPath, plugins, portalDomain, portalEmail, portalId, redirectNonce, restNonce, restUrl, refreshToken, reviewSkippedDate, theme, trackConsent, wpVersion, contentEmbed, requiresContentEmbedScope, refreshTokenError, };\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport default function CalendarIcon() {\n return (_jsxs(\"svg\", { width: \"18\", height: \"18\", viewBox: \"0 0 18 18\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", children: [_jsx(\"g\", { clipPath: \"url(#clip0_903_1965)\", children: _jsx(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M13.519 2.48009H15.069H15.0697C16.2619 2.48719 17.2262 3.45597 17.2262 4.65016V12.7434C17.223 12.9953 17.1203 13.2226 16.9549 13.3886L12.6148 17.7287C12.4488 17.8941 12.2214 17.9968 11.9689 18H3.29508C2.09637 18 1.125 17.0286 1.125 15.8299V4.65016C1.125 3.45404 2.09314 2.48396 3.28862 2.48009H4.83867V0.930032C4.83867 0.416577 5.25525 0 5.7687 0C6.28216 0 6.69874 0.416577 6.69874 0.930032V2.48009H11.6589V0.930032C11.6589 0.416577 12.0755 0 12.5889 0C13.1024 0 13.519 0.416577 13.519 0.930032V2.48009ZM2.98506 15.8312C2.99863 15.9882 3.12909 16.1115 3.28862 16.1141H11.5814L11.6589 16.0366V13.634C11.6589 12.9494 12.2143 12.394 12.899 12.394H15.2951L15.3726 12.3165V7.4338H2.98506V15.8312ZM4.83868 8.68029H6.07873H6.07937C6.42684 8.68029 6.71037 8.95478 6.72458 9.30032V14.2863C6.72458 14.6428 6.43524 14.9322 6.07873 14.9322H4.83868C4.48217 14.9322 4.19283 14.6428 4.19283 14.2863V9.32615C4.19283 8.96964 4.48217 8.68029 4.83868 8.68029ZM8.53298 8.68029H9.82469H9.82534C10.1728 8.68029 10.4563 8.95478 10.4705 9.30032V14.2863C10.4705 14.6428 10.1812 14.9322 9.82469 14.9322H8.53298C8.17647 14.9322 7.88712 14.6428 7.88712 14.2863V9.32615C7.88712 8.96964 8.17647 8.68029 8.53298 8.68029ZM13.519 8.68029H12.2789C11.9366 8.68029 11.6589 8.95801 11.6589 9.30032V10.5404C11.6589 10.8827 11.9366 11.1604 12.2789 11.1604H13.519C13.8613 11.1604 14.139 10.8827 14.139 10.5404V9.30032C14.139 8.95801 13.8613 8.68029 13.519 8.68029Z\", fill: \"#FF7A59\" }) }), _jsx(\"defs\", { children: _jsx(\"clipPath\", { id: \"clip0_903_1965\", children: _jsx(\"rect\", { width: \"18\", height: \"18\", fill: \"white\" }) }) })] }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nexport default function SidebarSprocketIcon() {\n return (_jsx(\"svg\", { width: \"20px\", height: \"20px\", version: \"1.1\", viewBox: \"0 0 40 42\", xmlns: \"http://www.w3.org/2000/svg\", xmlnsXlink: \"http://www.w3.org/1999/xlink\", children: _jsx(\"path\", { d: \"M28.8989809,30.0402293 C25.817707,30.0402293 23.319363,27.5423949 23.319363,24.461121 C23.319363,21.3798471 25.817707,18.881758 28.8989809,18.881758 C31.98,18.881758 34.4780892,21.3798471 34.4780892,24.461121 C34.4780892,27.5423949 31.98,30.0402293 28.8989809,30.0402293 M30.5692994,13.7199745 L30.5692994,8.75717196 C31.864586,8.14519744 32.7723567,6.8346242 32.7723567,5.31360508 L32.7723567,5.1989554 C32.7723567,3.10010191 31.0546497,1.38264968 28.956051,1.38264968 L28.8414013,1.38264968 C26.7425478,1.38264968 25.0248408,3.10010191 25.0248408,5.1989554 L25.0248408,5.31360508 C25.0248408,6.8346242 25.9328662,8.14519744 27.2281529,8.75717196 L27.2281529,13.7202293 C25.2994904,14.0180637 23.5371974,14.8137325 22.0829299,15.9844331 L8.45643312,5.38417836 C8.54611464,5.0392102 8.6090446,4.6835414 8.60955416,4.310293 C8.61261148,1.93271338 6.68777072,0.00303184713 4.31019108,-2.5477707e-05 C1.93286624,-0.00308280255 0.0029299363,1.92175796 0.000127388535,4.29933756 C-0.0029299363,6.67666244 1.92191083,8.60634396 4.29949044,8.60940128 C5.07426752,8.6104204 5.7912102,8.390293 6.42,8.03284076 L19.8243312,18.4603567 C18.6842038,20.181121 18.0166879,22.2422675 18.0166879,24.461121 C18.0166879,26.7841784 18.7504458,28.9327134 19.9907006,30.7001019 L15.9142675,34.776535 C15.5919745,34.6799745 15.2574522,34.6122038 14.9033121,34.6122038 C12.9499363,34.6122038 11.3659873,36.1961529 11.3659873,38.1497834 C11.3659873,40.103414 12.9499363,41.6871084 14.9033121,41.6871084 C16.8571974,41.6871084 18.4408917,40.103414 18.4408917,38.1497834 C18.4408917,37.7958981 18.3733758,37.461121 18.2765605,37.1390828 L22.3089172,33.1067261 C24.1392357,34.5041784 26.4184713,35.3431592 28.8989809,35.3431592 C34.9089172,35.3431592 39.7810191,30.4710573 39.7810191,24.461121 C39.7810191,19.0203567 35.7840764,14.5255796 30.5692994,13.7199745\", id: \"Fill-1\", fillRule: \"evenodd\" }) }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport default function SprocketIcon() {\n return (_jsxs(\"svg\", { width: \"40px\", height: \"42px\", viewBox: \"0 0 40 42\", version: \"1.1\", xmlns: \"http://www.w3.org/2000/svg\", xmlnsXlink: \"http://www.w3.org/1999/xlink\", children: [_jsx(\"defs\", { children: _jsx(\"polygon\", { id: \"path-1\", points: \"0.000123751494 0 39.7808917 0 39.7808917 41.6871084 0.000123751494 41.6871084\" }) }), _jsx(\"g\", { id: \"Page-1\", stroke: \"none\", strokeWidth: \"1\", fill: \"none\", fillRule: \"evenodd\", children: _jsxs(\"g\", { id: \"HubSpot-Sprocket---Full-Color\", children: [_jsx(\"mask\", { id: \"mask-2\", fill: \"white\", children: _jsx(\"use\", { xlinkHref: \"#path-1\" }) }), _jsx(\"g\", { id: \"path-1\" }), _jsx(\"path\", { d: \"M28.8989809,30.0402293 C25.817707,30.0402293 23.319363,27.5423949 23.319363,24.461121 C23.319363,21.3798471 25.817707,18.881758 28.8989809,18.881758 C31.98,18.881758 34.4780892,21.3798471 34.4780892,24.461121 C34.4780892,27.5423949 31.98,30.0402293 28.8989809,30.0402293 M30.5692994,13.7199745 L30.5692994,8.75717196 C31.864586,8.14519744 32.7723567,6.8346242 32.7723567,5.31360508 L32.7723567,5.1989554 C32.7723567,3.10010191 31.0546497,1.38264968 28.956051,1.38264968 L28.8414013,1.38264968 C26.7425478,1.38264968 25.0248408,3.10010191 25.0248408,5.1989554 L25.0248408,5.31360508 C25.0248408,6.8346242 25.9328662,8.14519744 27.2281529,8.75717196 L27.2281529,13.7202293 C25.2994904,14.0180637 23.5371974,14.8137325 22.0829299,15.9844331 L8.45643312,5.38417836 C8.54611464,5.0392102 8.6090446,4.6835414 8.60955416,4.310293 C8.61261148,1.93271338 6.68777072,0.00303184713 4.31019108,-2.5477707e-05 C1.93286624,-0.00308280255 0.0029299363,1.92175796 0.000127388535,4.29933756 C-0.0029299363,6.67666244 1.92191083,8.60634396 4.29949044,8.60940128 C5.07426752,8.6104204 5.7912102,8.390293 6.42,8.03284076 L19.8243312,18.4603567 C18.6842038,20.181121 18.0166879,22.2422675 18.0166879,24.461121 C18.0166879,26.7841784 18.7504458,28.9327134 19.9907006,30.7001019 L15.9142675,34.776535 C15.5919745,34.6799745 15.2574522,34.6122038 14.9033121,34.6122038 C12.9499363,34.6122038 11.3659873,36.1961529 11.3659873,38.1497834 C11.3659873,40.103414 12.9499363,41.6871084 14.9033121,41.6871084 C16.8571974,41.6871084 18.4408917,40.103414 18.4408917,38.1497834 C18.4408917,37.7958981 18.3733758,37.461121 18.2765605,37.1390828 L22.3089172,33.1067261 C24.1392357,34.5041784 26.4184713,35.3431592 28.8989809,35.3431592 C34.9089172,35.3431592 39.7810191,30.4710573 39.7810191,24.461121 C39.7810191,19.0203567 35.7840764,14.5255796 30.5692994,13.7199745\", id: \"Fill-1\", fill: \"#F3785B\", fillRule: \"nonzero\", mask: \"url(#mask-2)\" })] }) })] }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { RawHTML } from '@wordpress/element';\nexport default function FormSaveBlock({ attributes }) {\n const { portalId, formId } = attributes;\n if (portalId && formId) {\n return (_jsx(RawHTML, { className: \"wp-block-leadin-hubspot-form-block\", children: `[hubspot portal=\"${portalId}\" id=\"${formId}\" type=\"form\"]` }));\n }\n return null;\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Fragment } from 'react';\nimport { pluginPath } from '../../constants/leadinConfig';\nimport UIImage from '../UIComponents/UIImage';\nexport default function FormGutenbergPreview() {\n return (_jsx(Fragment, { children: _jsx(UIImage, { alt: \"Create a new Hubspot Form\", src: `${pluginPath}/public/assets/images/hubspot-form.png` }) }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport * as WpBlocksApi from '@wordpress/blocks';\nimport SprocketIcon from '../Common/SprocketIcon';\nimport FormBlockSave from './FormBlockSave';\nimport { connectionStatus } from '../../constants/leadinConfig';\nimport FormGutenbergPreview from './FormGutenbergPreview';\nimport ErrorHandler from '../../shared/Common/ErrorHandler';\nimport FormEdit from '../../shared/Form/FormEdit';\nimport ConnectionStatus from '../../shared/enums/connectionStatus';\nimport { __ } from '@wordpress/i18n';\nimport { isFullSiteEditor } from '../../utils/withMetaData';\nexport default function registerFormBlock() {\n const editComponent = (props) => {\n if (props.attributes.preview) {\n return _jsx(FormGutenbergPreview, {});\n }\n else if (connectionStatus === ConnectionStatus.Connected) {\n return _jsx(FormEdit, { ...props, origin: \"gutenberg\", preview: true });\n }\n else {\n return _jsx(ErrorHandler, { status: 401 });\n }\n };\n // We do not support the full site editor: https://issues.hubspotcentral.com/browse/WP-1033\n if (!WpBlocksApi || isFullSiteEditor()) {\n return null;\n }\n WpBlocksApi.registerBlockType('leadin/hubspot-form-block', {\n title: __('HubSpot Form', 'leadin'),\n description: __('Select and embed a HubSpot form', 'leadin'),\n icon: SprocketIcon,\n category: 'leadin-blocks',\n attributes: {\n portalId: {\n type: 'string',\n default: '',\n },\n formId: {\n type: 'string',\n },\n formName: {\n type: 'string',\n },\n preview: {\n type: 'boolean',\n default: false,\n },\n },\n example: {\n attributes: {\n preview: true,\n },\n },\n edit: editComponent,\n save: props => _jsx(FormBlockSave, { ...props }),\n });\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Fragment } from 'react';\nimport { pluginPath } from '../../constants/leadinConfig';\nimport UIImage from '../UIComponents/UIImage';\nexport default function MeetingGutenbergPreview() {\n return (_jsx(Fragment, { children: _jsx(UIImage, { alt: \"Create a new Hubspot Meeting\", width: \"100%\", src: `${pluginPath}/public/assets/images/hubspot-meetings.png` }) }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { RawHTML } from '@wordpress/element';\nexport default function MeetingSaveBlock({ attributes, }) {\n const { url } = attributes;\n if (url) {\n return (_jsx(RawHTML, { className: \"wp-block-leadin-hubspot-meeting-block\", children: `[hubspot url=\"${url}\" type=\"meeting\"]` }));\n }\n return null;\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport * as WpBlocksApi from '@wordpress/blocks';\nimport CalendarIcon from '../Common/CalendarIcon';\nimport { connectionStatus } from '../../constants/leadinConfig';\nimport MeetingGutenbergPreview from './MeetingGutenbergPreview';\nimport MeetingSaveBlock from './MeetingSaveBlock';\nimport MeetingEdit from '../../shared/Meeting/MeetingEdit';\nimport ErrorHandler from '../../shared/Common/ErrorHandler';\nimport { __ } from '@wordpress/i18n';\nimport { isFullSiteEditor } from '../../utils/withMetaData';\nconst ConnectionStatus = {\n Connected: 'Connected',\n NotConnected: 'NotConnected',\n};\nexport default function registerMeetingBlock() {\n const editComponent = (props) => {\n if (props.attributes.preview) {\n return _jsx(MeetingGutenbergPreview, {});\n }\n else if (connectionStatus === ConnectionStatus.Connected) {\n return _jsx(MeetingEdit, { ...props, preview: true, origin: \"gutenberg\" });\n }\n else {\n return _jsx(ErrorHandler, { status: 401 });\n }\n };\n // We do not support the full site editor: https://issues.hubspotcentral.com/browse/WP-1033\n if (!WpBlocksApi || isFullSiteEditor()) {\n return null;\n }\n WpBlocksApi.registerBlockType('leadin/hubspot-meeting-block', {\n title: __('Hubspot Meetings Scheduler', 'leadin'),\n description: __('Schedule meetings faster and forget the back-and-forth emails Your calendar stays full, and you stay productive', 'leadin'),\n icon: CalendarIcon,\n category: 'leadin-blocks',\n attributes: {\n url: {\n type: 'string',\n default: '',\n },\n preview: {\n type: 'boolean',\n default: false,\n },\n },\n example: {\n attributes: {\n preview: true,\n },\n },\n edit: editComponent,\n save: props => _jsx(MeetingSaveBlock, { ...props }),\n });\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport * as WpPluginsLib from '@wordpress/plugins';\nimport { PluginSidebar } from '@wordpress/edit-post';\nimport { PanelBody, Icon } from '@wordpress/components';\nimport { withSelect } from '@wordpress/data';\nimport UISidebarSelectControl from '../UIComponents/UISidebarSelectControl';\nimport SidebarSprocketIcon from '../Common/SidebarSprocketIcon';\nimport styled from 'styled-components';\nimport { __ } from '@wordpress/i18n';\nimport { BackgroudAppContext } from '../../iframe/useBackgroundApp';\nimport { refreshToken } from '../../constants/leadinConfig';\nimport { getOrCreateBackgroundApp } from '../../utils/backgroundAppUtils';\nexport function registerHubspotSidebar() {\n const ContentTypeLabelStyle = styled.div `\n white-space: normal;\n text-transform: none;\n `;\n const ContentTypeLabel = (_jsx(ContentTypeLabelStyle, { children: __('Select the content type HubSpot Analytics uses to track this page', 'leadin') }));\n const LeadinPluginSidebar = ({ postType }) => postType ? (_jsx(PluginSidebar, { name: \"leadin\", title: \"HubSpot\", icon: _jsx(Icon, { className: \"hs-plugin-sidebar-sprocket\", icon: SidebarSprocketIcon() }), children: _jsx(PanelBody, { title: __('HubSpot Analytics', 'leadin'), initialOpen: true, children: _jsx(BackgroudAppContext.Provider, { value: refreshToken && getOrCreateBackgroundApp(refreshToken), children: _jsx(UISidebarSelectControl, { metaKey: \"content-type\", className: \"select-content-type\", label: ContentTypeLabel, options: [\n { label: __('Detect Automatically', 'leadin'), value: '' },\n { label: __('Blog Post', 'leadin'), value: 'blog-post' },\n {\n label: __('Knowledge Article', 'leadin'),\n value: 'knowledge-article',\n },\n { label: __('Landing Page', 'leadin'), value: 'landing-page' },\n { label: __('Listing Page', 'leadin'), value: 'listing-page' },\n {\n label: __('Standard Page', 'leadin'),\n value: 'standard-page',\n },\n ] }) }) }) })) : null;\n const LeadinPluginSidebarWrapper = withSelect((select) => {\n const data = select('core/editor');\n return {\n postType: data &&\n data.getCurrentPostType() &&\n data.getEditedPostAttribute('meta'),\n };\n })(LeadinPluginSidebar);\n if (WpPluginsLib) {\n WpPluginsLib.registerPlugin('leadin', {\n render: LeadinPluginSidebarWrapper,\n icon: SidebarSprocketIcon,\n });\n }\n}\n","import { styled } from '@linaria/react';\nexport default styled.img `\n height: ${props => (props.height ? props.height : 'auto')};\n width: ${props => (props.width ? props.width : 'auto')};\n`;\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { SelectControl } from '@wordpress/components';\nimport withMetaData from '../../utils/withMetaData';\nimport { useBackgroundAppContext, usePostBackgroundMessage, } from '../../iframe/useBackgroundApp';\nimport { ProxyMessages } from '../../iframe/integratedMessages';\nconst UISidebarSelectControl = (props) => {\n const isBackgroundAppReady = useBackgroundAppContext();\n const monitorSidebarMetaChange = usePostBackgroundMessage();\n return (_jsx(SelectControl, { value: props.metaValue, onChange: content => {\n if (props.setMetaValue) {\n props.setMetaValue(content);\n }\n isBackgroundAppReady &&\n monitorSidebarMetaChange({\n key: ProxyMessages.TrackSidebarMetaChange,\n payload: {\n metaKey: props.metaKey,\n },\n });\n }, ...props }));\n};\nexport default withMetaData(UISidebarSelectControl);\n","export const CoreMessages = {\n HandshakeReceive: 'INTEGRATED_APP_EMBEDDER_HANDSHAKE_RECEIVED',\n SendRefreshToken: 'INTEGRATED_APP_EMBEDDER_SEND_REFRESH_TOKEN',\n ReloadParentFrame: 'INTEGRATED_APP_EMBEDDER_RELOAD_PARENT_FRAME',\n RedirectParentFrame: 'INTEGRATED_APP_EMBEDDER_REDIRECT_PARENT_FRAME',\n SendLocale: 'INTEGRATED_APP_EMBEDDER_SEND_LOCALE',\n SendDeviceId: 'INTEGRATED_APP_EMBEDDER_SEND_DEVICE_ID',\n SendIntegratedAppConfig: 'INTEGRATED_APP_EMBEDDER_CONFIG',\n};\n","export const FormMessages = {\n CreateFormAppNavigation: 'CREATE_FORM_APP_NAVIGATION',\n};\n","export * from './core/CoreMessages';\nexport * from './forms/FormsMessages';\nexport * from './livechat/LiveChatMessages';\nexport * from './plugin/PluginMessages';\nexport * from './proxy/ProxyMessages';\n","export const LiveChatMessages = {\n CreateLiveChatAppNavigation: 'CREATE_LIVE_CHAT_APP_NAVIGATION',\n};\n","export const PluginMessages = {\n PluginSettingsNavigation: 'PLUGIN_SETTINGS_NAVIGATION',\n PluginLeadinConfig: 'PLUGIN_LEADIN_CONFIG',\n TrackConsent: 'INTEGRATED_APP_EMBEDDER_TRACK_CONSENT',\n InternalTrackingFetchRequest: 'INTEGRATED_TRACKING_FETCH_REQUEST',\n InternalTrackingFetchResponse: 'INTEGRATED_TRACKING_FETCH_RESPONSE',\n InternalTrackingFetchError: 'INTEGRATED_TRACKING_FETCH_ERROR',\n InternalTrackingChangeRequest: 'INTEGRATED_TRACKING_CHANGE_REQUEST',\n InternalTrackingChangeError: 'INTEGRATED_TRACKING_CHANGE_ERROR',\n BusinessUnitFetchRequest: 'BUSINESS_UNIT_FETCH_REQUEST',\n BusinessUnitFetchResponse: 'BUSINESS_UNIT_FETCH_FETCH_RESPONSE',\n BusinessUnitFetchError: 'BUSINESS_UNIT_FETCH_FETCH_ERROR',\n BusinessUnitChangeRequest: 'BUSINESS_UNIT_CHANGE_REQUEST',\n BusinessUnitChangeError: 'BUSINESS_UNIT_CHANGE_ERROR',\n SkipReviewRequest: 'SKIP_REVIEW_REQUEST',\n SkipReviewResponse: 'SKIP_REVIEW_RESPONSE',\n SkipReviewError: 'SKIP_REVIEW_ERROR',\n RemoveParentQueryParam: 'REMOVE_PARENT_QUERY_PARAM',\n ContentEmbedInstallRequest: 'CONTENT_EMBED_INSTALL_REQUEST',\n ContentEmbedInstallResponse: 'CONTENT_EMBED_INSTALL_RESPONSE',\n ContentEmbedInstallError: 'CONTENT_EMBED_INSTALL_ERROR',\n ContentEmbedActivationRequest: 'CONTENT_EMBED_ACTIVATION_REQUEST',\n ContentEmbedActivationResponse: 'CONTENT_EMBED_ACTIVATION_RESPONSE',\n ContentEmbedActivationError: 'CONTENT_EMBED_ACTIVATION_ERROR',\n};\n","export const ProxyMessages = {\n FetchForms: 'FETCH_FORMS',\n FetchForm: 'FETCH_FORM',\n CreateFormFromTemplate: 'CREATE_FORM_FROM_TEMPLATE',\n FetchAuth: 'FETCH_AUTH',\n FetchMeetingsAndUsers: 'FETCH_MEETINGS_AND_USERS',\n FetchContactsCreateSinceActivation: 'FETCH_CONTACTS_CREATED_SINCE_ACTIVATION',\n FetchOrCreateMeetingUser: 'FETCH_OR_CREATE_MEETING_USER',\n ConnectMeetingsCalendar: 'CONNECT_MEETINGS_CALENDAR',\n TrackFormPreviewRender: 'TRACK_FORM_PREVIEW_RENDER',\n TrackFormCreatedFromTemplate: 'TRACK_FORM_CREATED_FROM_TEMPLATE',\n TrackFormCreationFailed: 'TRACK_FORM_CREATION_FAILED',\n TrackMeetingPreviewRender: 'TRACK_MEETING_PREVIEW_RENDER',\n TrackSidebarMetaChange: 'TRACK_SIDEBAR_META_CHANGE',\n TrackReviewBannerRender: 'TRACK_REVIEW_BANNER_RENDER',\n TrackReviewBannerInteraction: 'TRACK_REVIEW_BANNER_INTERACTION',\n TrackReviewBannerDismissed: 'TRACK_REVIEW_BANNER_DISMISSED',\n TrackPluginDeactivation: 'TRACK_PLUGIN_DEACTIVATION',\n};\n","import { createContext, useContext } from 'react';\nexport const BackgroudAppContext = createContext(null);\nexport function useBackgroundAppContext() {\n return useContext(BackgroudAppContext);\n}\nexport function usePostBackgroundMessage() {\n const app = useBackgroundAppContext();\n return (message) => {\n app.postMessage(message);\n };\n}\nexport function usePostAsyncBackgroundMessage() {\n const app = useBackgroundAppContext();\n return (message) => app.postAsyncMessage(message);\n}\n","import Raven from 'raven-js';\nimport { hubspotBaseUrl, phpVersion, wpVersion, leadinPluginVersion, portalId, plugins, } from '../constants/leadinConfig';\nexport function configureRaven() {\n if (hubspotBaseUrl.indexOf('app.hubspot.com') === -1) {\n return;\n }\n Raven.config('https://e9b8f382cdd130c0d415cd977d2be56f@exceptions.hubspot.com/1', {\n instrument: {\n tryCatch: false,\n },\n release: leadinPluginVersion,\n }).install();\n Raven.setTagsContext({\n v: leadinPluginVersion,\n php: phpVersion,\n wordpress: wpVersion,\n });\n Raven.setExtraContext({\n hub: portalId,\n plugins: Object.keys(plugins)\n .map(name => `${name}#${plugins[name]}`)\n .join(','),\n });\n}\nexport default Raven;\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useRef, useState, useEffect } from 'react';\nimport { styled } from '@linaria/react';\nimport { CALYPSO, CALYPSO_LIGHT, CALYPSO_MEDIUM, OBSIDIAN, } from '../UIComponents/colors';\nimport UISpinner from '../UIComponents/UISpinner';\nimport LoadState from '../enums/loadState';\nconst Container = styled.div `\n color: ${OBSIDIAN};\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-size: 14px;\n position: relative;\n`;\nconst ControlContainer = styled.div `\n align-items: center;\n background-color: hsl(0, 0%, 100%);\n border-color: hsl(0, 0%, 80%);\n border-radius: 4px;\n border-style: solid;\n border-width: ${props => (props.focused ? '0' : '1px')};\n cursor: default;\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n min-height: 38px;\n outline: 0 !important;\n position: relative;\n transition: all 100ms;\n box-sizing: border-box;\n box-shadow: ${props => props.focused ? `0 0 0 2px ${CALYPSO_MEDIUM}` : 'none'};\n &:hover {\n border-color: hsl(0, 0%, 70%);\n }\n`;\nconst ValueContainer = styled.div `\n align-items: center;\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n padding: 2px 8px;\n position: relative;\n overflow: hidden;\n box-sizing: border-box;\n`;\nconst Placeholder = styled.div `\n color: hsl(0, 0%, 50%);\n margin-left: 2px;\n margin-right: 2px;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n box-sizing: border-box;\n font-size: 16px;\n`;\nconst SingleValue = styled.div `\n color: hsl(0, 0%, 20%);\n margin-left: 2px;\n margin-right: 2px;\n max-width: calc(100% - 8px);\n overflow: hidden;\n position: absolute;\n text-overflow: ellipsis;\n white-space: nowrap;\n top: 50%;\n transform: translateY(-50%);\n box-sizing: border-box;\n`;\nconst IndicatorContainer = styled.div `\n align-items: center;\n align-self: stretch;\n display: flex;\n flex-shrink: 0;\n box-sizing: border-box;\n`;\nconst DropdownIndicator = styled.div `\n border-top: 8px solid ${CALYPSO};\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n width: 0px;\n height: 0px;\n margin: 10px;\n`;\nconst InputContainer = styled.div `\n margin: 2px;\n padding-bottom: 2px;\n padding-top: 2px;\n visibility: visible;\n color: hsl(0, 0%, 20%);\n box-sizing: border-box;\n`;\nconst Input = styled.input `\n box-sizing: content-box;\n background: rgba(0, 0, 0, 0) none repeat scroll 0px center;\n border: 0px none;\n font-size: inherit;\n opacity: 1;\n outline: currentcolor none 0px;\n padding: 0px;\n color: inherit;\n font-family: inherit;\n`;\nconst InputShadow = styled.div `\n position: absolute;\n opacity: 0;\n font-size: inherit;\n`;\nconst MenuContainer = styled.div `\n position: absolute;\n top: 100%;\n background-color: #fff;\n border-radius: 4px;\n margin-bottom: 8px;\n margin-top: 8px;\n z-index: 9999;\n box-shadow: 0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1);\n width: 100%;\n`;\nconst MenuList = styled.div `\n max-height: 300px;\n overflow-y: auto;\n padding-bottom: 4px;\n padding-top: 4px;\n position: relative;\n`;\nconst MenuGroup = styled.div `\n padding-bottom: 8px;\n padding-top: 8px;\n`;\nconst MenuGroupHeader = styled.div `\n color: #999;\n cursor: default;\n font-size: 75%;\n font-weight: 500;\n margin-bottom: 0.25em;\n text-transform: uppercase;\n padding-left: 12px;\n padding-left: 12px;\n`;\nconst MenuItem = styled.div `\n display: block;\n background-color: ${props => props.selected ? CALYPSO_MEDIUM : 'transparent'};\n color: ${props => (props.selected ? '#fff' : 'inherit')};\n cursor: default;\n font-size: inherit;\n width: 100%;\n padding: 8px 12px;\n &:hover {\n background-color: ${props => props.selected ? CALYPSO_MEDIUM : CALYPSO_LIGHT};\n }\n`;\nexport default function AsyncSelect({ placeholder, value, loadOptions, onChange, defaultOptions, }) {\n const inputEl = useRef(null);\n const inputShadowEl = useRef(null);\n const [isFocused, setFocus] = useState(false);\n const [loadState, setLoadState] = useState(LoadState.NotLoaded);\n const [localValue, setLocalValue] = useState('');\n const [options, setOptions] = useState(defaultOptions);\n const inputSize = `${inputShadowEl.current ? inputShadowEl.current.clientWidth + 10 : 2}px`;\n useEffect(() => {\n if (loadOptions && loadState === LoadState.NotLoaded) {\n loadOptions('', (result) => {\n setOptions(result);\n setLoadState(LoadState.Idle);\n });\n }\n }, [loadOptions, loadState]);\n const renderItems = (items = [], parentKey) => {\n return items.map((item, index) => {\n if (item.options) {\n return (_jsxs(MenuGroup, { children: [_jsx(MenuGroupHeader, { id: `${index}-heading`, children: item.label }), _jsx(\"div\", { children: renderItems(item.options, index) })] }, `async-select-item-${index}`));\n }\n else {\n const key = `async-select-item-${parentKey !== undefined ? `${parentKey}-${index}` : index}`;\n return (_jsx(MenuItem, { id: key, selected: value && item.value === value.value, onClick: () => {\n onChange(item);\n setFocus(false);\n }, children: item.label }, key));\n }\n });\n };\n return (_jsxs(Container, { children: [_jsxs(ControlContainer, { id: \"leadin-async-selector\", focused: isFocused, onClick: () => {\n if (isFocused) {\n if (inputEl.current) {\n inputEl.current.blur();\n }\n setFocus(false);\n setLocalValue('');\n }\n else {\n if (inputEl.current) {\n inputEl.current.focus();\n }\n setFocus(true);\n }\n }, children: [_jsxs(ValueContainer, { children: [localValue === '' &&\n (!value ? (_jsx(Placeholder, { children: placeholder })) : (_jsx(SingleValue, { children: value.label }))), _jsxs(InputContainer, { children: [_jsx(Input, { ref: inputEl, onFocus: () => {\n setFocus(true);\n }, onChange: e => {\n setLocalValue(e.target.value);\n setLoadState(LoadState.Loading);\n loadOptions &&\n loadOptions(e.target.value, (result) => {\n setOptions(result);\n setLoadState(LoadState.Idle);\n });\n }, value: localValue, width: inputSize, id: \"asycn-select-input\" }), _jsx(InputShadow, { ref: inputShadowEl, children: localValue })] })] }), _jsxs(IndicatorContainer, { children: [loadState === LoadState.Loading && _jsx(UISpinner, {}), _jsx(DropdownIndicator, {})] })] }), isFocused && (_jsx(MenuContainer, { children: _jsx(MenuList, { children: renderItems(options) }) }))] }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport UIButton from '../UIComponents/UIButton';\nimport UIContainer from '../UIComponents/UIContainer';\nimport HubspotWrapper from './HubspotWrapper';\nimport { adminUrl, redirectNonce } from '../../constants/leadinConfig';\nimport { pluginPath } from '../../constants/leadinConfig';\nimport { __ } from '@wordpress/i18n';\nfunction redirectToPlugin() {\n window.location.href = `${adminUrl}admin.php?page=leadin&leadin_expired=${redirectNonce}`;\n}\nexport default function ErrorHandler({ status, resetErrorState, errorInfo = { header: '', message: '', action: '' }, }) {\n const isUnauthorized = status === 401 || status === 403;\n const errorHeader = isUnauthorized\n ? __(\"Your plugin isn't authorized\", 'leadin')\n : errorInfo.header;\n const errorMessage = isUnauthorized\n ? __('Reauthorize your plugin to access your free HubSpot tools', 'leadin')\n : errorInfo.message;\n return (_jsx(HubspotWrapper, { pluginPath: pluginPath, children: _jsxs(UIContainer, { textAlign: \"center\", children: [_jsx(\"h4\", { children: errorHeader }), _jsx(\"p\", { children: _jsx(\"b\", { children: errorMessage }) }), isUnauthorized ? (_jsx(UIButton, { \"data-test-id\": \"authorize-button\", onClick: redirectToPlugin, children: __('Go to plugin', 'leadin') })) : (_jsx(UIButton, { \"data-test-id\": \"retry-button\", onClick: resetErrorState, children: errorInfo.action }))] }) }));\n}\n","import { styled } from '@linaria/react';\nexport default styled.div `\n background-image: ${props => `url(${props.pluginPath}/public/assets/images/hubspot.svg)`};\n background-color: #f5f8fa;\n background-repeat: no-repeat;\n background-position: center 25px;\n background-size: 120px;\n color: #33475b;\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-size: 14px;\n\n padding: ${(props) => props.padding || '90px 20% 25px'};\n\n p {\n font-size: inherit !important;\n line-height: 24px;\n margin: 4px 0;\n }\n`;\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport HubspotWrapper from './HubspotWrapper';\nimport UISpinner from '../UIComponents/UISpinner';\nimport { pluginPath } from '../../constants/leadinConfig';\nexport default function LoadingBlock() {\n return (_jsx(HubspotWrapper, { pluginPath: pluginPath, children: _jsx(UISpinner, { size: 50 }) }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Fragment, useEffect } from 'react';\nimport { portalId, refreshToken } from '../../constants/leadinConfig';\nimport UISpacer from '../UIComponents/UISpacer';\nimport PreviewForm from './PreviewForm';\nimport FormSelect from './FormSelect';\nimport { usePostBackgroundMessage, BackgroudAppContext, useBackgroundAppContext, } from '../../iframe/useBackgroundApp';\nimport { ProxyMessages } from '../../iframe/integratedMessages';\nimport LoadingBlock from '../Common/LoadingBlock';\nimport { getOrCreateBackgroundApp } from '../../utils/backgroundAppUtils';\nfunction FormEdit({ attributes, isSelected, setAttributes, preview = true, origin = 'gutenberg', }) {\n const { formId, formName } = attributes;\n const formSelected = portalId && formId;\n const isBackgroundAppReady = useBackgroundAppContext();\n const monitorFormPreviewRender = usePostBackgroundMessage();\n const handleChange = (selectedForm) => {\n setAttributes({\n portalId,\n formId: selectedForm.value,\n formName: selectedForm.label,\n });\n };\n useEffect(() => {\n monitorFormPreviewRender({\n key: ProxyMessages.TrackFormPreviewRender,\n payload: {\n origin,\n },\n });\n }, [origin]);\n return !isBackgroundAppReady ? (_jsx(LoadingBlock, {})) : (_jsxs(Fragment, { children: [(isSelected || !formSelected) && (_jsx(FormSelect, { formId: formId, formName: formName, handleChange: handleChange, origin: origin })), formSelected && (_jsxs(Fragment, { children: [isSelected && _jsx(UISpacer, {}), preview && _jsx(PreviewForm, { portalId: portalId, formId: formId })] }))] }));\n}\nexport default function FormEditContainer(props) {\n return (_jsx(BackgroudAppContext.Provider, { value: refreshToken && getOrCreateBackgroundApp(refreshToken), children: _jsx(FormEdit, { ...props }) }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport FormSelector from './FormSelector';\nimport LoadingBlock from '../Common/LoadingBlock';\nimport { __ } from '@wordpress/i18n';\nimport useForms from './hooks/useForms';\nimport useCreateFormFromTemplate from './hooks/useCreateFormFromTemplate';\nimport { isDefaultForm } from '../../constants/defaultFormOptions';\nimport ErrorHandler from '../Common/ErrorHandler';\nexport default function FormSelect({ formId, formName, handleChange, origin = 'gutenberg', }) {\n const { search, formApiError, reset } = useForms();\n const { createFormByTemplate, reset: createReset, isCreating, hasError, formApiError: createApiError, } = useCreateFormFromTemplate(origin);\n const value = formId && formName\n ? {\n label: formName,\n value: formId,\n }\n : null;\n const handleLocalChange = (option) => {\n if (isDefaultForm(option.value)) {\n createFormByTemplate(option.value).then(({ guid, name }) => {\n handleChange({\n value: guid,\n label: name,\n });\n });\n }\n else {\n handleChange(option);\n }\n };\n return isCreating ? (_jsx(LoadingBlock, {})) : formApiError || createApiError ? (_jsx(ErrorHandler, { status: formApiError ? formApiError.status : createApiError.status, resetErrorState: () => {\n if (hasError) {\n createReset();\n }\n else {\n reset();\n }\n }, errorInfo: {\n header: __('There was a problem retrieving your forms', 'leadin'),\n message: __('Please refresh your forms or try again in a few minutes', 'leadin'),\n action: __('Refresh forms', 'leadin'),\n } })) : (_jsx(FormSelector, { loadOptions: search, onChange: (option) => handleLocalChange(option), value: value }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport HubspotWrapper from '../Common/HubspotWrapper';\nimport { pluginPath } from '../../constants/leadinConfig';\nimport AsyncSelect from '../Common/AsyncSelect';\nimport { __ } from '@wordpress/i18n';\nexport default function FormSelector({ loadOptions, onChange, value, }) {\n return (_jsxs(HubspotWrapper, { pluginPath: pluginPath, children: [_jsx(\"p\", { \"data-test-id\": \"leadin-form-select\", children: _jsx(\"b\", { children: __('Select an existing form or create a new one from a template', 'leadin') }) }), _jsx(AsyncSelect, { placeholder: __('Search for a form', 'leadin'), value: value, loadOptions: loadOptions, onChange: onChange })] }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useEffect, useRef } from 'react';\nimport UIOverlay from '../UIComponents/UIOverlay';\nimport { formsScriptPayload, hublet } from '../../constants/leadinConfig';\nimport useFormScript from './hooks/useFormsScript';\nexport default function PreviewForm({ portalId, formId, }) {\n const inputEl = useRef(null);\n const ready = useFormScript();\n useEffect(() => {\n if (!ready) {\n return;\n }\n if (inputEl.current) {\n inputEl.current.innerHTML = '';\n const embedScript = document.createElement('script');\n embedScript.innerHTML = `hbspt.forms.create({ portalId: '${portalId}', formId: '${formId}', region: '${hublet}', ${formsScriptPayload} });`;\n inputEl.current.appendChild(embedScript);\n }\n }, [formId, portalId, ready, inputEl]);\n return _jsx(UIOverlay, { ref: inputEl });\n}\n","import { useState } from 'react';\nimport { usePostAsyncBackgroundMessage, usePostBackgroundMessage, } from '../../../iframe/useBackgroundApp';\nimport LoadState from '../../enums/loadState';\nimport { ProxyMessages } from '../../../iframe/integratedMessages';\nexport default function useCreateFormFromTemplate(origin = 'gutenberg') {\n const proxy = usePostAsyncBackgroundMessage();\n const track = usePostBackgroundMessage();\n const [loadState, setLoadState] = useState(LoadState.Idle);\n const [formApiError, setFormApiError] = useState(null);\n const createFormByTemplate = (type) => {\n setLoadState(LoadState.Loading);\n track({\n key: ProxyMessages.TrackFormCreatedFromTemplate,\n payload: {\n type,\n origin,\n },\n });\n return proxy({\n key: ProxyMessages.CreateFormFromTemplate,\n payload: type,\n })\n .then(form => {\n setLoadState(LoadState.Idle);\n return form;\n })\n .catch(err => {\n setFormApiError(err);\n track({\n key: ProxyMessages.TrackFormCreationFailed,\n payload: {\n origin,\n },\n });\n setLoadState(LoadState.Failed);\n });\n };\n return {\n isCreating: loadState === LoadState.Loading,\n hasError: loadState === LoadState.Failed,\n formApiError,\n createFormByTemplate,\n reset: () => setLoadState(LoadState.Idle),\n };\n}\n","import { useState } from 'react';\nimport debounce from 'lodash/debounce';\nimport { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp';\nimport { DEFAULT_OPTIONS } from '../../../constants/defaultFormOptions';\nimport { ProxyMessages } from '../../../iframe/integratedMessages';\nexport default function useForms() {\n const proxy = usePostAsyncBackgroundMessage();\n const [formApiError, setFormApiError] = useState(null);\n const search = debounce((search, callback) => {\n return proxy({\n key: ProxyMessages.FetchForms,\n payload: {\n search,\n },\n })\n .then(forms => {\n callback([\n ...forms.map((form) => ({\n label: form.name,\n value: form.guid,\n })),\n DEFAULT_OPTIONS,\n ]);\n })\n .catch(error => {\n setFormApiError(error);\n });\n }, 300, { trailing: true });\n return {\n search,\n formApiError,\n reset: () => setFormApiError(null),\n };\n}\n","import $ from 'jquery';\nimport { useEffect, useState } from 'react';\nimport { formsScript } from '../../../constants/leadinConfig';\nimport Raven from '../../../lib/Raven';\nlet promise;\nfunction loadFormsScript() {\n if (!promise) {\n promise = new Promise((resolve, reject) => $.getScript(formsScript)\n .done(resolve)\n .fail(reject));\n }\n return promise;\n}\nexport default function useFormScript() {\n const [ready, setReady] = useState(false);\n useEffect(() => {\n loadFormsScript()\n .then(() => setReady(true))\n .catch(error => Raven.captureException(error));\n }, []);\n return ready;\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Fragment, useEffect } from 'react';\nimport LoadingBlock from '../Common/LoadingBlock';\nimport MeetingSelector from './MeetingSelector';\nimport MeetingWarning from './MeetingWarning';\nimport useMeetings, { useSelectedMeeting, useSelectedMeetingCalendar, } from './hooks/useMeetings';\nimport HubspotWrapper from '../Common/HubspotWrapper';\nimport ErrorHandler from '../Common/ErrorHandler';\nimport { pluginPath } from '../../constants/leadinConfig';\nimport { __ } from '@wordpress/i18n';\nimport Raven from 'raven-js';\nexport default function MeetingController({ handleChange, url, }) {\n const { mappedMeetings: meetings, loading, error, reload, connectCalendar, } = useMeetings();\n const selectedMeetingOption = useSelectedMeeting(url);\n const selectedMeetingCalendar = useSelectedMeetingCalendar(url);\n useEffect(() => {\n if (!url && meetings.length > 0) {\n handleChange(meetings[0].value);\n }\n }, [meetings, url, handleChange]);\n const handleLocalChange = (option) => {\n handleChange(option.value);\n };\n const handleConnectCalendar = () => {\n return connectCalendar()\n .then(() => {\n reload();\n })\n .catch(error => {\n Raven.captureMessage('Unable to connect calendar', {\n extra: { error },\n });\n });\n };\n return (_jsx(Fragment, { children: loading ? (_jsx(LoadingBlock, {})) : error ? (_jsx(ErrorHandler, { status: (error && error.status) || error, resetErrorState: () => reload(), errorInfo: {\n header: __('There was a problem retrieving your meetings', 'leadin'),\n message: __('Please refresh your meetings or try again in a few minutes', 'leadin'),\n action: __('Refresh meetings', 'leadin'),\n } })) : (_jsxs(HubspotWrapper, { padding: \"90px 32px 24px\", pluginPath: pluginPath, children: [selectedMeetingCalendar && (_jsx(MeetingWarning, { status: selectedMeetingCalendar, onConnectCalendar: handleConnectCalendar })), meetings.length > 1 && (_jsx(MeetingSelector, { onChange: handleLocalChange, options: meetings, value: selectedMeetingOption }))] })) }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Fragment, useEffect } from 'react';\nimport MeetingController from './MeetingController';\nimport PreviewMeeting from './PreviewMeeting';\nimport { BackgroudAppContext, useBackgroundAppContext, usePostBackgroundMessage, } from '../../iframe/useBackgroundApp';\nimport { refreshToken } from '../../constants/leadinConfig';\nimport { ProxyMessages } from '../../iframe/integratedMessages';\nimport LoadingBlock from '../Common/LoadingBlock';\nimport { getOrCreateBackgroundApp } from '../../utils/backgroundAppUtils';\nfunction MeetingEdit({ attributes: { url }, isSelected, setAttributes, preview = true, origin = 'gutenberg', }) {\n const isBackgroundAppReady = useBackgroundAppContext();\n const monitorFormPreviewRender = usePostBackgroundMessage();\n const handleChange = (newUrl) => {\n setAttributes({\n url: newUrl,\n });\n };\n useEffect(() => {\n monitorFormPreviewRender({\n key: ProxyMessages.TrackMeetingPreviewRender,\n payload: {\n origin,\n },\n });\n }, [origin]);\n return !isBackgroundAppReady ? (_jsx(LoadingBlock, {})) : (_jsxs(Fragment, { children: [(isSelected || !url) && (_jsx(MeetingController, { url: url, handleChange: handleChange })), preview && url && _jsx(PreviewMeeting, { url: url })] }));\n}\nexport default function MeetingsEditContainer(props) {\n return (_jsx(BackgroudAppContext.Provider, { value: refreshToken && getOrCreateBackgroundApp(refreshToken), children: _jsx(MeetingEdit, { ...props }) }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Fragment } from 'react';\nimport AsyncSelect from '../Common/AsyncSelect';\nimport UISpacer from '../UIComponents/UISpacer';\nimport { __ } from '@wordpress/i18n';\nexport default function MeetingSelector({ options, onChange, value, }) {\n const optionsWrapper = [\n {\n label: __('Meeting name', 'leadin'),\n options,\n },\n ];\n return (_jsxs(Fragment, { children: [_jsx(UISpacer, {}), _jsx(\"p\", { \"data-test-id\": \"leadin-meeting-select\", children: _jsx(\"b\", { children: __('Select a meeting scheduling page', 'leadin') }) }), _jsx(AsyncSelect, { defaultOptions: optionsWrapper, onChange: onChange, placeholder: __('Select a meeting', 'leadin'), value: value })] }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport UIAlert from '../UIComponents/UIAlert';\nimport UIButton from '../UIComponents/UIButton';\nimport { CURRENT_USER_CALENDAR_MISSING } from './constants';\nimport { __ } from '@wordpress/i18n';\nexport default function MeetingWarning({ status, onConnectCalendar, }) {\n const isMeetingOwner = status === CURRENT_USER_CALENDAR_MISSING;\n const titleText = isMeetingOwner\n ? __('Your calendar is not connected', 'leadin')\n : __('Calendar is not connected', 'leadin');\n const titleMessage = isMeetingOwner\n ? __('Please connect your calendar to activate your scheduling pages', 'leadin')\n : __('Make sure that everybody in this meeting has connected their calendar from the Meetings page in HubSpot', 'leadin');\n return (_jsx(UIAlert, { titleText: titleText, titleMessage: titleMessage, children: isMeetingOwner && (_jsx(UIButton, { use: \"tertiary\", id: \"meetings-connect-calendar\", onClick: onConnectCalendar, children: __('Connect calendar', 'leadin') })) }));\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Fragment, useEffect, useRef } from 'react';\nimport UIOverlay from '../UIComponents/UIOverlay';\nimport useMeetingsScript from './hooks/useMeetingsScript';\nexport default function PreviewForm({ url }) {\n const ready = useMeetingsScript();\n const inputEl = useRef(null);\n useEffect(() => {\n if (!ready) {\n return;\n }\n if (inputEl.current) {\n inputEl.current.innerHTML = '';\n const container = document.createElement('div');\n container.dataset.src = `${url}?embed=true`;\n container.classList.add('meetings-iframe-container');\n inputEl.current.appendChild(container);\n const embedScript = document.createElement('script');\n embedScript.innerHTML =\n 'hbspt.meetings.create(\".meetings-iframe-container\");';\n inputEl.current.appendChild(embedScript);\n }\n }, [url, ready, inputEl]);\n return _jsx(Fragment, { children: url && _jsx(UIOverlay, { ref: inputEl }) });\n}\n","export const OTHER_USER_CALENDAR_MISSING = 'OTHER_USER_CALENDAR_MISSING';\nexport const CURRENT_USER_CALENDAR_MISSING = 'CURRENT_USER_CALENDAR_MISSING';\n","import { useEffect, useState } from 'react';\nimport { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp';\nimport LoadState from '../../enums/loadState';\nimport { ProxyMessages } from '../../../iframe/integratedMessages';\nlet user = null;\nexport default function useCurrentUserFetch() {\n const proxy = usePostAsyncBackgroundMessage();\n const [loadState, setLoadState] = useState(LoadState.NotLoaded);\n const [error, setError] = useState(null);\n const createUser = () => {\n if (!user) {\n setLoadState(LoadState.NotLoaded);\n }\n };\n const reload = () => {\n user = null;\n setLoadState(LoadState.NotLoaded);\n setError(null);\n };\n useEffect(() => {\n if (loadState === LoadState.NotLoaded && !user) {\n setLoadState(LoadState.Loading);\n proxy({\n key: ProxyMessages.FetchOrCreateMeetingUser,\n })\n .then(data => {\n user = data;\n setLoadState(LoadState.Idle);\n })\n .catch(err => {\n setError(err);\n setLoadState(LoadState.Failed);\n });\n }\n }, [loadState]);\n return { user, loadUserState: loadState, error, createUser, reload };\n}\n","import { useCallback } from 'react';\nimport { __ } from '@wordpress/i18n';\nimport { CURRENT_USER_CALENDAR_MISSING, OTHER_USER_CALENDAR_MISSING, } from '../constants';\nimport useMeetingsFetch from './useMeetingsFetch';\nimport useCurrentUserFetch from './useCurrentUserFetch';\nimport LoadState from '../../enums/loadState';\nimport { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp';\nimport { ProxyMessages } from '../../../iframe/integratedMessages';\nfunction getDefaultMeetingName(meeting, currentUser, meetingUsers) {\n const [meetingOwnerId] = meeting.meetingsUserIds;\n let result = __('Default', 'leadin');\n if (currentUser &&\n meetingOwnerId !== currentUser.id &&\n meetingUsers[meetingOwnerId]) {\n const user = meetingUsers[meetingOwnerId];\n result += ` (${user.userProfile.fullName})`;\n }\n return result;\n}\nfunction hasCalendarObject(user) {\n return (user &&\n user.meetingsUserBlob &&\n user.meetingsUserBlob.calendarSettings &&\n user.meetingsUserBlob.calendarSettings.email);\n}\nexport default function useMeetings() {\n const proxy = usePostAsyncBackgroundMessage();\n const { meetings, meetingUsers, error: meetingsError, loadMeetingsState, reload: reloadMeetings, } = useMeetingsFetch();\n const { user: currentUser, error: userError, loadUserState, reload: reloadUser, } = useCurrentUserFetch();\n const reload = useCallback(() => {\n reloadUser();\n reloadMeetings();\n }, [reloadUser, reloadMeetings]);\n const connectCalendar = () => {\n return proxy({\n key: ProxyMessages.ConnectMeetingsCalendar,\n });\n };\n return {\n mappedMeetings: meetings.map(meet => ({\n label: meet.name || getDefaultMeetingName(meet, currentUser, meetingUsers),\n value: meet.link,\n })),\n meetings,\n meetingUsers,\n currentUser,\n error: meetingsError || userError,\n loading: loadMeetingsState == LoadState.Loading ||\n loadUserState === LoadState.Loading,\n reload,\n connectCalendar,\n };\n}\nexport function useSelectedMeeting(url) {\n const { mappedMeetings: meetings } = useMeetings();\n const option = meetings.find(({ value }) => value === url);\n return option;\n}\nexport function useSelectedMeetingCalendar(url) {\n const { meetings, meetingUsers, currentUser } = useMeetings();\n const meeting = meetings.find(meet => meet.link === url);\n const mappedMeetingUsersId = meetingUsers.reduce((p, c) => ({ ...p, [c.id]: c }), {});\n if (!meeting) {\n return null;\n }\n else {\n const { meetingsUserIds } = meeting;\n if (currentUser &&\n meetingsUserIds.includes(currentUser.id) &&\n !hasCalendarObject(currentUser)) {\n return CURRENT_USER_CALENDAR_MISSING;\n }\n else if (meetingsUserIds\n .map(id => mappedMeetingUsersId[id])\n .some((user) => !hasCalendarObject(user))) {\n return OTHER_USER_CALENDAR_MISSING;\n }\n else {\n return null;\n }\n }\n}\n","import { useEffect, useState } from 'react';\nimport { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp';\nimport LoadState from '../../enums/loadState';\nimport { ProxyMessages } from '../../../iframe/integratedMessages';\nlet meetings = [];\nlet meetingUsers = [];\nexport default function useMeetingsFetch() {\n const proxy = usePostAsyncBackgroundMessage();\n const [loadState, setLoadState] = useState(LoadState.NotLoaded);\n const [error, setError] = useState(null);\n const reload = () => {\n meetings = [];\n setError(null);\n setLoadState(LoadState.NotLoaded);\n };\n useEffect(() => {\n if (loadState === LoadState.NotLoaded && meetings.length === 0) {\n setLoadState(LoadState.Loading);\n proxy({\n key: ProxyMessages.FetchMeetingsAndUsers,\n })\n .then(data => {\n setLoadState(LoadState.Loaded);\n meetings = data && data.meetingLinks;\n meetingUsers = data && data.meetingUsers;\n })\n .catch(e => {\n setError(e);\n setLoadState(LoadState.Failed);\n });\n }\n }, [loadState]);\n return {\n meetings,\n meetingUsers,\n loadMeetingsState: loadState,\n error,\n reload,\n };\n}\n","import $ from 'jquery';\nimport { useState, useEffect } from 'react';\nimport { meetingsScript } from '../../../constants/leadinConfig';\nimport Raven from '../../../lib/Raven';\nlet promise;\nfunction loadMeetingsScript() {\n if (!promise) {\n promise = new Promise((resolve, reject) => $.getScript(meetingsScript)\n .done(resolve)\n .fail(reject));\n }\n return promise;\n}\nexport default function useMeetingsScript() {\n const [ready, setReady] = useState(false);\n useEffect(() => {\n loadMeetingsScript()\n .then(() => setReady(true))\n .catch(error => Raven.captureException(error));\n }, []);\n return ready;\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { styled } from '@linaria/react';\nimport { MARIGOLD_LIGHT, MARIGOLD_MEDIUM, OBSIDIAN } from './colors';\nconst AlertContainer = styled.div `\n background-color: ${MARIGOLD_LIGHT};\n border-color: ${MARIGOLD_MEDIUM};\n color: ${OBSIDIAN};\n font-size: 14px;\n align-items: center;\n justify-content: space-between;\n display: flex;\n border-style: solid;\n border-top-style: solid;\n border-right-style: solid;\n border-bottom-style: solid;\n border-left-style: solid;\n border-width: 1px;\n min-height: 60px;\n padding: 8px 20px;\n position: relative;\n text-align: left;\n`;\nconst Title = styled.p `\n font-family: 'Lexend Deca';\n font-style: normal;\n font-weight: 700;\n font-size: 16px;\n line-height: 19px;\n color: ${OBSIDIAN};\n margin: 0;\n padding: 0;\n`;\nconst Message = styled.p `\n font-family: 'Lexend Deca';\n font-style: normal;\n font-weight: 400;\n font-size: 14px;\n margin: 0;\n padding: 0;\n`;\nconst MessageContainer = styled.div `\n display: flex;\n flex-direction: column;\n`;\nexport default function UIAlert({ titleText, titleMessage, children, }) {\n return (_jsxs(AlertContainer, { children: [_jsxs(MessageContainer, { children: [_jsx(Title, { children: titleText }), _jsx(Message, { children: titleMessage })] }), children] }));\n}\n","import { styled } from '@linaria/react';\nimport { HEFFALUMP, LORAX, OLAF } from './colors';\nexport default styled.button `\n background-color:${props => (props.use === 'tertiary' ? HEFFALUMP : LORAX)};\n border: 3px solid ${props => (props.use === 'tertiary' ? HEFFALUMP : LORAX)};\n color: ${OLAF}\n border-radius: 3px;\n font-size: 14px;\n line-height: 14px;\n padding: 12px 24px;\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-weight: 500;\n white-space: nowrap;\n`;\n","import { styled } from '@linaria/react';\nexport default styled.div `\n text-align: ${props => (props.textAlign ? props.textAlign : 'inherit')};\n`;\n","import { styled } from '@linaria/react';\nexport default styled.div `\n position: relative;\n\n &:after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n left: 0;\n }\n`;\n","import { styled } from '@linaria/react';\nexport default styled.div `\n height: 30px;\n`;\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { styled } from '@linaria/react';\nimport { CALYPSO_MEDIUM, CALYPSO } from './colors';\nconst SpinnerOuter = styled.div `\n align-items: center;\n color: #00a4bd;\n display: flex;\n flex-direction: column;\n justify-content: center;\n width: 100%;\n height: 100%;\n margin: '2px';\n`;\nconst SpinnerInner = styled.div `\n align-items: center;\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n`;\nconst Circle = styled.circle `\n fill: none;\n stroke: ${props => props.color};\n stroke-width: 5;\n stroke-linecap: round;\n transform-origin: center;\n`;\nconst AnimatedCircle = styled.circle `\n fill: none;\n stroke: ${props => props.color};\n stroke-width: 5;\n stroke-linecap: round;\n transform-origin: center;\n animation: dashAnimation 2s ease-in-out infinite,\n spinAnimation 2s linear infinite;\n\n @keyframes dashAnimation {\n 0% {\n stroke-dasharray: 1, 150;\n stroke-dashoffset: 0;\n }\n\n 50% {\n stroke-dasharray: 90, 150;\n stroke-dashoffset: -50;\n }\n\n 100% {\n stroke-dasharray: 90, 150;\n stroke-dashoffset: -140;\n }\n }\n\n @keyframes spinAnimation {\n transform: rotate(360deg);\n }\n`;\nexport default function UISpinner({ size = 20 }) {\n return (_jsx(SpinnerOuter, { children: _jsx(SpinnerInner, { children: _jsxs(\"svg\", { height: size, width: size, viewBox: \"0 0 50 50\", children: [_jsx(Circle, { color: CALYPSO_MEDIUM, cx: \"25\", cy: \"25\", r: \"22.5\" }), _jsx(AnimatedCircle, { color: CALYPSO, cx: \"25\", cy: \"25\", r: \"22.5\" })] }) }) }));\n}\n","export const CALYPSO = '#00a4bd';\nexport const CALYPSO_MEDIUM = '#7fd1de';\nexport const CALYPSO_LIGHT = '#e5f5f8';\nexport const LORAX = '#ff7a59';\nexport const OLAF = '#ffffff';\nexport const HEFFALUMP = '#425b76';\nexport const MARIGOLD_LIGHT = '#fef8f0';\nexport const MARIGOLD_MEDIUM = '#fae0b5';\nexport const OBSIDIAN = '#33475b';\n","const ConnectionStatus = {\n Connected: 'Connected',\n NotConnected: 'NotConnected',\n};\nexport default ConnectionStatus;\n","const LoadState = {\n NotLoaded: 'NotLoaded',\n Loading: 'Loading',\n Loaded: 'Loaded',\n Idle: 'Idle',\n Failed: 'Failed',\n};\nexport default LoadState;\n","import $ from 'jquery';\nimport Raven, { configureRaven } from '../lib/Raven';\nexport function initApp(initFn) {\n configureRaven();\n Raven.context(initFn);\n}\nexport function initAppOnReady(initFn) {\n function main() {\n $(initFn);\n }\n initApp(main);\n}\n","import { deviceId, hubspotBaseUrl, locale, portalId, } from '../constants/leadinConfig';\nimport { initApp } from './appUtils';\nexport function initBackgroundApp(initFn) {\n function main() {\n if (Array.isArray(initFn)) {\n initFn.forEach(callback => callback());\n }\n else {\n initFn();\n }\n }\n initApp(main);\n}\nexport const getOrCreateBackgroundApp = (refreshToken) => {\n if (window.LeadinBackgroundApp) {\n return window.LeadinBackgroundApp;\n }\n const { IntegratedAppEmbedder, IntegratedAppOptions } = window;\n const options = new IntegratedAppOptions()\n .setLocale(locale)\n .setDeviceId(deviceId)\n .setRefreshToken(refreshToken);\n const embedder = new IntegratedAppEmbedder('integrated-plugin-proxy', portalId, hubspotBaseUrl, () => { }).setOptions(options);\n embedder.attachTo(document.body, false);\n embedder.postStartAppMessage(); // lets the app know all all data has been passed to it\n window.LeadinBackgroundApp = embedder;\n return window.LeadinBackgroundApp;\n};\n","import { withSelect, withDispatch, select } from '@wordpress/data';\n// from answer here: https://github.com/WordPress/gutenberg/issues/44477#issuecomment-1263026599\nexport const isFullSiteEditor = () => {\n return select && !!select('core/edit-site');\n};\nconst applyWithSelect = withSelect((select, props) => {\n return {\n metaValue: select('core/editor').getEditedPostAttribute('meta')[props.metaKey],\n };\n});\nconst applyWithDispatch = withDispatch((dispatch, props) => {\n return {\n setMetaValue(value) {\n dispatch('core/editor').editPost({ meta: { [props.metaKey]: value } });\n },\n };\n});\nfunction apply(el) {\n return applyWithSelect(applyWithDispatch(el));\n}\nexport default apply;\n","/**\r\n * Returns the object type of the given payload\r\n *\r\n * @param {*} payload\r\n * @returns {string}\r\n */\r\nfunction getType(payload) {\r\n return Object.prototype.toString.call(payload).slice(8, -1);\r\n}\r\n/**\r\n * Returns whether the payload is undefined\r\n *\r\n * @param {*} payload\r\n * @returns {payload is undefined}\r\n */\r\nfunction isUndefined(payload) {\r\n return getType(payload) === 'Undefined';\r\n}\r\n/**\r\n * Returns whether the payload is null\r\n *\r\n * @param {*} payload\r\n * @returns {payload is null}\r\n */\r\nfunction isNull(payload) {\r\n return getType(payload) === 'Null';\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isPlainObject(payload) {\r\n if (getType(payload) !== 'Object')\r\n return false;\r\n return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype;\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isObject(payload) {\r\n return isPlainObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is { [K in any]: never }}\r\n */\r\nfunction isEmptyObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isFullObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is PlainObject}\r\n */\r\nfunction isAnyObject(payload) {\r\n return getType(payload) === 'Object';\r\n}\r\n/**\r\n * Returns whether the payload is an object like a type passed in < >\r\n *\r\n * Usage: isObjectLike<{id: any}>(payload) // will make sure it's an object and has an `id` prop.\r\n *\r\n * @template T this must be passed in < >\r\n * @param {*} payload\r\n * @returns {payload is T}\r\n */\r\nfunction isObjectLike(payload) {\r\n return isAnyObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a function (regular or async)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is AnyFunction}\r\n */\r\nfunction isFunction(payload) {\r\n return typeof payload === 'function';\r\n}\r\n/**\r\n * Returns whether the payload is an array\r\n *\r\n * @param {any} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isArray(payload) {\r\n return getType(payload) === 'Array';\r\n}\r\n/**\r\n * Returns whether the payload is a an array with at least 1 item\r\n *\r\n * @param {*} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isFullArray(payload) {\r\n return isArray(payload) && payload.length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty array\r\n *\r\n * @param {*} payload\r\n * @returns {payload is []}\r\n */\r\nfunction isEmptyArray(payload) {\r\n return isArray(payload) && payload.length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a string\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isString(payload) {\r\n return getType(payload) === 'String';\r\n}\r\n/**\r\n * Returns whether the payload is a string, BUT returns false for ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isFullString(payload) {\r\n return isString(payload) && payload !== '';\r\n}\r\n/**\r\n * Returns whether the payload is ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isEmptyString(payload) {\r\n return payload === '';\r\n}\r\n/**\r\n * Returns whether the payload is a number (but not NaN)\r\n *\r\n * This will return `false` for `NaN`!!\r\n *\r\n * @param {*} payload\r\n * @returns {payload is number}\r\n */\r\nfunction isNumber(payload) {\r\n return getType(payload) === 'Number' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a boolean\r\n *\r\n * @param {*} payload\r\n * @returns {payload is boolean}\r\n */\r\nfunction isBoolean(payload) {\r\n return getType(payload) === 'Boolean';\r\n}\r\n/**\r\n * Returns whether the payload is a regular expression (RegExp)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is RegExp}\r\n */\r\nfunction isRegExp(payload) {\r\n return getType(payload) === 'RegExp';\r\n}\r\n/**\r\n * Returns whether the payload is a Map\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Map}\r\n */\r\nfunction isMap(payload) {\r\n return getType(payload) === 'Map';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakMap\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakMap}\r\n */\r\nfunction isWeakMap(payload) {\r\n return getType(payload) === 'WeakMap';\r\n}\r\n/**\r\n * Returns whether the payload is a Set\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Set}\r\n */\r\nfunction isSet(payload) {\r\n return getType(payload) === 'Set';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakSet\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakSet}\r\n */\r\nfunction isWeakSet(payload) {\r\n return getType(payload) === 'WeakSet';\r\n}\r\n/**\r\n * Returns whether the payload is a Symbol\r\n *\r\n * @param {*} payload\r\n * @returns {payload is symbol}\r\n */\r\nfunction isSymbol(payload) {\r\n return getType(payload) === 'Symbol';\r\n}\r\n/**\r\n * Returns whether the payload is a Date, and that the date is valid\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Date}\r\n */\r\nfunction isDate(payload) {\r\n return getType(payload) === 'Date' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a Blob\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Blob}\r\n */\r\nfunction isBlob(payload) {\r\n return getType(payload) === 'Blob';\r\n}\r\n/**\r\n * Returns whether the payload is a File\r\n *\r\n * @param {*} payload\r\n * @returns {payload is File}\r\n */\r\nfunction isFile(payload) {\r\n return getType(payload) === 'File';\r\n}\r\n/**\r\n * Returns whether the payload is a Promise\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Promise}\r\n */\r\nfunction isPromise(payload) {\r\n return getType(payload) === 'Promise';\r\n}\r\n/**\r\n * Returns whether the payload is an Error\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Error}\r\n */\r\nfunction isError(payload) {\r\n return getType(payload) === 'Error';\r\n}\r\n/**\r\n * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is typeof NaN}\r\n */\r\nfunction isNaNValue(payload) {\r\n return getType(payload) === 'Number' && isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a primitive type (eg. Boolean | Null | Undefined | Number | String | Symbol)\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is boolean | null | undefined | number | string | symbol)}\r\n */\r\nfunction isPrimitive(payload) {\r\n return (isBoolean(payload) ||\r\n isNull(payload) ||\r\n isUndefined(payload) ||\r\n isNumber(payload) ||\r\n isString(payload) ||\r\n isSymbol(payload));\r\n}\r\n/**\r\n * Returns true whether the payload is null or undefined\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is null | undefined)}\r\n */\r\nvar isNullOrUndefined = isOneOf(isNull, isUndefined);\r\nfunction isOneOf(a, b, c, d, e) {\r\n return function (value) {\r\n return a(value) || b(value) || (!!c && c(value)) || (!!d && d(value)) || (!!e && e(value));\r\n };\r\n}\r\n/**\r\n * Does a generic check to check that the given payload is of a given type.\r\n * In cases like Number, it will return true for NaN as NaN is a Number (thanks javascript!);\r\n * It will, however, differentiate between object and null\r\n *\r\n * @template T\r\n * @param {*} payload\r\n * @param {T} type\r\n * @throws {TypeError} Will throw type error if type is an invalid type\r\n * @returns {payload is T}\r\n */\r\nfunction isType(payload, type) {\r\n if (!(type instanceof Function)) {\r\n throw new TypeError('Type must be a function');\r\n }\r\n if (!Object.prototype.hasOwnProperty.call(type, 'prototype')) {\r\n throw new TypeError('Type is not a class');\r\n }\r\n // Classes usually have names (as functions usually have names)\r\n var name = type.name;\r\n return getType(payload) === name || Boolean(payload && payload.constructor === type);\r\n}\n\nexport { getType, isAnyObject, isArray, isBlob, isBoolean, isDate, isEmptyArray, isEmptyObject, isEmptyString, isError, isFile, isFullArray, isFullObject, isFullString, isFunction, isMap, isNaNValue, isNull, isNullOrUndefined, isNumber, isObject, isObjectLike, isOneOf, isPlainObject, isPrimitive, isPromise, isRegExp, isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isWeakSet };\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var safeIsNaN = Number.isNaN ||\n function ponyfill(value) {\n return typeof value === 'number' && value !== value;\n };\nfunction isEqual(first, second) {\n if (first === second) {\n return true;\n }\n if (safeIsNaN(first) && safeIsNaN(second)) {\n return true;\n }\n return false;\n}\nfunction areInputsEqual(newInputs, lastInputs) {\n if (newInputs.length !== lastInputs.length) {\n return false;\n }\n for (var i = 0; i < newInputs.length; i++) {\n if (!isEqual(newInputs[i], lastInputs[i])) {\n return false;\n }\n }\n return true;\n}\n\nfunction memoizeOne(resultFn, isEqual) {\n if (isEqual === void 0) { isEqual = areInputsEqual; }\n var lastThis;\n var lastArgs = [];\n var lastResult;\n var calledOnce = false;\n function memoized() {\n var newArgs = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n newArgs[_i] = arguments[_i];\n }\n if (calledOnce && lastThis === this && isEqual(newArgs, lastArgs)) {\n return lastResult;\n }\n lastResult = resultFn.apply(this, newArgs);\n calledOnce = true;\n lastThis = this;\n lastArgs = newArgs;\n return lastResult;\n }\n return memoized;\n}\n\nexport default memoizeOne;\n","import { isPlainObject, isArray, isSymbol } from 'is-what';\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n\r\nfunction __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\n\nfunction assignProp(carry, key, newVal, originalObject) {\r\n var propType = originalObject.propertyIsEnumerable(key)\r\n ? 'enumerable'\r\n : 'nonenumerable';\r\n if (propType === 'enumerable')\r\n carry[key] = newVal;\r\n if (propType === 'nonenumerable') {\r\n Object.defineProperty(carry, key, {\r\n value: newVal,\r\n enumerable: false,\r\n writable: true,\r\n configurable: true\r\n });\r\n }\r\n}\r\nfunction mergeRecursively(origin, newComer, extensions) {\r\n // work directly on newComer if its not an object\r\n if (!isPlainObject(newComer)) {\r\n // extend merge rules\r\n if (extensions && isArray(extensions)) {\r\n extensions.forEach(function (extend) {\r\n newComer = extend(origin, newComer);\r\n });\r\n }\r\n return newComer;\r\n }\r\n // define newObject to merge all values upon\r\n var newObject = {};\r\n if (isPlainObject(origin)) {\r\n var props_1 = Object.getOwnPropertyNames(origin);\r\n var symbols_1 = Object.getOwnPropertySymbols(origin);\r\n newObject = __spreadArrays(props_1, symbols_1).reduce(function (carry, key) {\r\n // @ts-ignore\r\n var targetVal = origin[key];\r\n if ((!isSymbol(key) && !Object.getOwnPropertyNames(newComer).includes(key)) ||\r\n (isSymbol(key) && !Object.getOwnPropertySymbols(newComer).includes(key))) {\r\n assignProp(carry, key, targetVal, origin);\r\n }\r\n return carry;\r\n }, {});\r\n }\r\n var props = Object.getOwnPropertyNames(newComer);\r\n var symbols = Object.getOwnPropertySymbols(newComer);\r\n var result = __spreadArrays(props, symbols).reduce(function (carry, key) {\r\n // re-define the origin and newComer as targetVal and newVal\r\n var newVal = newComer[key];\r\n var targetVal = (isPlainObject(origin))\r\n // @ts-ignore\r\n ? origin[key]\r\n : undefined;\r\n // extend merge rules\r\n if (extensions && isArray(extensions)) {\r\n extensions.forEach(function (extend) {\r\n newVal = extend(targetVal, newVal);\r\n });\r\n }\r\n // When newVal is an object do the merge recursively\r\n if (targetVal !== undefined && isPlainObject(newVal)) {\r\n newVal = mergeRecursively(targetVal, newVal, extensions);\r\n }\r\n assignProp(carry, key, newVal, newComer);\r\n return carry;\r\n }, newObject);\r\n return result;\r\n}\r\n/**\r\n * Merge anything recursively.\r\n * Objects get merged, special objects (classes etc.) are re-assigned \"as is\".\r\n * Basic types overwrite objects or other basic types.\r\n *\r\n * @param {(IConfig | any)} origin\r\n * @param {...any[]} newComers\r\n * @returns the result\r\n */\r\nfunction merge(origin) {\r\n var newComers = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n newComers[_i - 1] = arguments[_i];\r\n }\r\n var extensions = null;\r\n var base = origin;\r\n if (isPlainObject(origin) && origin.extensions && Object.keys(origin).length === 1) {\r\n base = {};\r\n extensions = origin.extensions;\r\n }\r\n return newComers.reduce(function (result, newComer) {\r\n return mergeRecursively(result, newComer, extensions);\r\n }, base);\r\n}\n\nfunction concatArrays(originVal, newVal) {\r\n if (isArray(originVal) && isArray(newVal)) {\r\n // concat logic\r\n return originVal.concat(newVal);\r\n }\r\n return newVal; // always return newVal as fallback!!\r\n}\n\nexport default merge;\nexport { concatArrays, merge };\n","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n var loggedTypeFailures = {};\n var has = require('./lib/has');\n\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) { /**/ }\n };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n if (process.env.NODE_ENV !== 'production') {\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error(\n (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' +\n 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'\n );\n err.name = 'Invariant Violation';\n throw err;\n }\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n } catch (ex) {\n error = ex;\n }\n if (error && !(error instanceof Error)) {\n printWarning(\n (componentName || 'React class') + ': type specification of ' +\n location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n 'You may have forgotten to pass an argument to the type checker ' +\n 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n 'shape all require an argument).'\n );\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n printWarning(\n 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n );\n }\n }\n }\n }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n if (process.env.NODE_ENV !== 'production') {\n loggedTypeFailures = {};\n }\n}\n\nmodule.exports = checkPropTypes;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactIs = require('react-is');\nvar assign = require('object-assign');\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\nvar has = require('./lib/has');\nvar checkPropTypes = require('./checkPropTypes');\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n return null;\n}\n\nmodule.exports = function(isValidElement, throwOnDirectAccess) {\n /* global Symbol */\n var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n /**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\n function getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n }\n\n /**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\n var ANONYMOUS = '<>';\n\n // Important!\n // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n var ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bigint: createPrimitiveTypeChecker('bigint'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n symbol: createPrimitiveTypeChecker('symbol'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n elementType: createElementTypeTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker,\n exact: createStrictShapeTypeChecker,\n };\n\n /**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n /*eslint-disable no-self-compare*/\n function is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n }\n /*eslint-enable no-self-compare*/\n\n /**\n * We use an Error-like object for backward compatibility as people may call\n * PropTypes directly and inspect their output. However, we don't use real\n * Errors anymore. We don't inspect their stack anyway, and creating them\n * is prohibitively expensive if they are created too often, such as what\n * happens in oneOfType() for any type before the one that matched.\n */\n function PropTypeError(message, data) {\n this.message = message;\n this.data = data && typeof data === 'object' ? data: {};\n this.stack = '';\n }\n // Make `instanceof Error` still work for returned errors.\n PropTypeError.prototype = Error.prototype;\n\n function createChainableTypeChecker(validate) {\n if (process.env.NODE_ENV !== 'production') {\n var manualPropTypeCallCache = {};\n var manualPropTypeWarningCount = 0;\n }\n function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n\n if (secret !== ReactPropTypesSecret) {\n if (throwOnDirectAccess) {\n // New behavior only for users of `prop-types` package\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use `PropTypes.checkPropTypes()` to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {\n // Old behavior for people using React.PropTypes\n var cacheKey = componentName + ':' + propName;\n if (\n !manualPropTypeCallCache[cacheKey] &&\n // Avoid spamming the console because they are often not actionable except for lib authors\n manualPropTypeWarningCount < 3\n ) {\n printWarning(\n 'You are manually calling a React.PropTypes validation ' +\n 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +\n 'and will throw in the standalone `prop-types` package. ' +\n 'You may be seeing this warning due to a third-party PropTypes ' +\n 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n );\n manualPropTypeCallCache[cacheKey] = true;\n manualPropTypeWarningCount++;\n }\n }\n }\n if (props[propName] == null) {\n if (isRequired) {\n if (props[propName] === null) {\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n }\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n }\n\n function createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName, secret) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'),\n {expectedType: expectedType}\n );\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n }\n\n function createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n }\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!isValidElement(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!ReactIs.isValidElementType(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n printWarning(\n 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n );\n } else {\n printWarning('Invalid argument supplied to oneOf, expected an array.');\n }\n }\n return emptyFunctionThatReturnsNull;\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (is(propValue, expectedValues[i])) {\n return null;\n }\n }\n\n var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n var type = getPreciseType(value);\n if (type === 'symbol') {\n return String(value);\n }\n return value;\n });\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n }\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (has(propValue, key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;\n return emptyFunctionThatReturnsNull;\n }\n\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (typeof checker !== 'function') {\n printWarning(\n 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n );\n return emptyFunctionThatReturnsNull;\n }\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var expectedTypes = [];\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret);\n if (checkerResult == null) {\n return null;\n }\n if (checkerResult.data && has(checkerResult.data, 'expectedType')) {\n expectedTypes.push(checkerResult.data.expectedType);\n }\n }\n var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': '';\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function invalidValidatorError(componentName, location, propFullName, key, type) {\n return new PropTypeError(\n (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'\n );\n }\n\n function createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createStrictShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n // We need to check all keys in case some are required but missing from props.\n var allKeys = assign({}, props[propName], shapeTypes);\n for (var key in allKeys) {\n var checker = shapeTypes[key];\n if (has(shapeTypes, key) && typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n if (!checker) {\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n '\\nBad object: ' + JSON.stringify(props[propName], null, ' ') +\n '\\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')\n );\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n\n return createChainableTypeChecker(validate);\n }\n\n function isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n }\n\n function isSymbol(propType, propValue) {\n // Native Symbol.\n if (propType === 'symbol') {\n return true;\n }\n\n // falsy value can't be a Symbol\n if (!propValue) {\n return false;\n }\n\n // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n if (propValue['@@toStringTag'] === 'Symbol') {\n return true;\n }\n\n // Fallback for non-spec compliant Symbols which are polyfilled.\n if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n return true;\n }\n\n return false;\n }\n\n // Equivalent of `typeof` but with special handling for array and regexp.\n function getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n if (isSymbol(propType, propValue)) {\n return 'symbol';\n }\n return propType;\n }\n\n // This handles more types than `getPropType`. Only used for error messages.\n // See `createPrimitiveTypeChecker`.\n function getPreciseType(propValue) {\n if (typeof propValue === 'undefined' || propValue === null) {\n return '' + propValue;\n }\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n }\n\n // Returns a string that is postfixed to a warning about an invalid type.\n // For example, \"undefined\" or \"of type array\"\n function getPostfixForTypeWarning(value) {\n var type = getPreciseType(value);\n switch (type) {\n case 'array':\n case 'object':\n return 'an ' + type;\n case 'boolean':\n case 'date':\n case 'regexp':\n return 'a ' + type;\n default:\n return type;\n }\n }\n\n // Returns class name of the object, if any.\n function getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return ANONYMOUS;\n }\n return propValue.constructor.name;\n }\n\n ReactPropTypes.checkPropTypes = checkPropTypes;\n ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","module.exports = Function.call.bind(Object.prototype.hasOwnProperty);\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = '' + args.join(' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg = 'Assertion failed: ' + (args.slice(1).join(' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isObject = utils.isObject;\nvar isErrorEvent = utils.isErrorEvent;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n collectWindowErrors: true,\n maxMessageLength: 0,\n\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.19.1',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = undefined;\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} func A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped already\n // for both debugging and to prevent it to being wrapped twice\n wrapped.__raven__ = true;\n wrapped.__inner__ = func;\n\n return wrapped;\n },\n\n /*\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._restoreBuiltIns();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /*\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n // Cases for sending ex as a message, rather than an exception\n var isNotError = !isError(ex);\n var isNotErrorEvent = !isErrorEvent(ex);\n var isErrorEventWithoutError = isErrorEvent(ex) && !ex.error;\n\n if ((isNotError && isNotErrorEvent) || isErrorEventWithoutError) {\n return this.captureMessage(\n ex,\n objectMerge(\n {\n trimHeadFrames: 1,\n stacktrace: true // if we fall back to captureMessage, default to attempting a new trace\n },\n options\n )\n );\n }\n\n // Get actual Error from ErrorEvent\n if (isErrorEvent(ex)) ex = ex.error;\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n\n var data = objectMerge(\n {\n message: msg + '' // Make sure it's actually a string\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = stack.stack[1];\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n if (this._globalOptions.stacktrace || (options && options.stacktrace)) {\n options = objectMerge(\n {\n // fingerprint on msg, not stack trace (legacy behavior, could be\n // revisited)\n fingerprint: msg,\n // since we know this is a synthetic trace, the top N-most frames\n // MUST be from Raven.js, so mark them as in_app later by setting\n // trimHeadFrames\n trimHeadFrames: (options.trimHeadFrames || 0) + 1\n },\n options\n );\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = options || {};\n\n var lastEventId = options.eventId || this.lastEventId();\n if (!lastEventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n var dsn = options.dsn || this._dsn;\n if (!dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var qs = '';\n qs += '?eventId=' + encode(lastEventId);\n qs += '&dsn=' + encode(dsn);\n\n var user = options.user || this._globalContext.user;\n if (user) {\n if (user.name) qs += '&name=' + encode(user.name);\n if (user.email) qs += '&email=' + encode(user.email);\n }\n\n var globalServer = this._getGlobalServer(this._parseDSN(dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/' + qs;\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(originalCallback);\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(fn.handleEvent);\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(fn, undefined, before),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(self.wrap(cb));\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(orig);\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function(data) {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(orig, undefined, onreadystatechangeHandler);\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && 'fetch' in _window) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return origFetch.apply(this, args).then(function(response) {\n fetchData.status_code = response.status;\n\n return response;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n history.pushState &&\n history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function() {\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo.apply(this, arguments);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n culprit: fileurl\n },\n options\n );\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': navigator.userAgent\n };\n }\n\n if (this._hasDocument) {\n if (_document.location && _document.location.href) {\n httpData.url = _document.location.href;\n }\n if (_document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.culprit !== last.culprit // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n retry = request.getResponseHeader('Retry-After');\n retry = parseInt(retry, 10) * 1000; // Retry-After is returned in seconds\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n // If there are no tags/extra, strip the key from the payload alltogther.\n if (isEmptyObject(data.tags)) delete data.tags;\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n var url = opts.url;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n // NOTE: auth is intentionally sent as part of query string (NOT as custom\n // HTTP header) so as to avoid preflight CORS requests\n request.open('POST', url + '?' + urlencode(opts.auth));\n request.send(stringify(opts.data));\n },\n\n _logDebug: function(level) {\n if (this._originalConsoleMethods[level] && this.debug) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n","var _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch ({}.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return supportsErrorEvent() && {}.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isEmptyObject(what) {\n for (var _ in what) return false; // eslint-disable-line guard-for-in, no-unused-vars\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n return !max || str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n if (!match) return {};\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n var orig = obj[name];\n obj[name] = replacement(orig);\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isString: isString,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n return document.location.href;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} message Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(message, url, lineNo, colNo, ex) {\n var stack = null;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (ex && utils.isError(ex)) {\n // non-string `ex` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(ex);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var msg = message; // must be new var or will modify original `arguments`\n var groups;\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n msg = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: msg,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,\n gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\\[native).*?|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i,\n winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n // Used to additionally parse URL/line/column from eval frames\n geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i,\n chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/,\n lines = ex.stack.split('\\n'),\n stack = [],\n submatch,\n parts,\n element,\n reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n// (unstable) APIs that have been removed. Can we remove the symbols?\n\nvar REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n\nfunction isValidElementType(type) {\n return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_ASYNC_MODE_TYPE:\n case REACT_CONCURRENT_MODE_TYPE:\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n return type;\n\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n\n default:\n return $$typeof;\n }\n\n }\n\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n} // AsyncMode is deprecated along with isAsyncMode\n\nvar AsyncMode = REACT_ASYNC_MODE_TYPE;\nvar ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n }\n }\n\n return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n}\nfunction isConcurrentMode(object) {\n return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n}\nfunction isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\n\nexports.AsyncMode = AsyncMode;\nexports.ConcurrentMode = ConcurrentMode;\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","/** @license React v17.0.2\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\nvar _assign = require('object-assign');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar REACT_ELEMENT_TYPE = 0xeac7;\nvar REACT_PORTAL_TYPE = 0xeaca;\nexports.Fragment = 0xeacb;\nvar REACT_STRICT_MODE_TYPE = 0xeacc;\nvar REACT_PROFILER_TYPE = 0xead2;\nvar REACT_PROVIDER_TYPE = 0xeacd;\nvar REACT_CONTEXT_TYPE = 0xeace;\nvar REACT_FORWARD_REF_TYPE = 0xead0;\nvar REACT_SUSPENSE_TYPE = 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = 0xead8;\nvar REACT_MEMO_TYPE = 0xead3;\nvar REACT_LAZY_TYPE = 0xead4;\nvar REACT_BLOCK_TYPE = 0xead9;\nvar REACT_SERVER_BLOCK_TYPE = 0xeada;\nvar REACT_FUNDAMENTAL_TYPE = 0xead5;\nvar REACT_SCOPE_TYPE = 0xead7;\nvar REACT_OPAQUE_ID_TYPE = 0xeae0;\nvar REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1;\nvar REACT_OFFSCREEN_TYPE = 0xeae2;\nvar REACT_LEGACY_HIDDEN_TYPE = 0xeae3;\n\nif (typeof Symbol === 'function' && Symbol.for) {\n var symbolFor = Symbol.for;\n REACT_ELEMENT_TYPE = symbolFor('react.element');\n REACT_PORTAL_TYPE = symbolFor('react.portal');\n exports.Fragment = symbolFor('react.fragment');\n REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode');\n REACT_PROFILER_TYPE = symbolFor('react.profiler');\n REACT_PROVIDER_TYPE = symbolFor('react.provider');\n REACT_CONTEXT_TYPE = symbolFor('react.context');\n REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref');\n REACT_SUSPENSE_TYPE = symbolFor('react.suspense');\n REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list');\n REACT_MEMO_TYPE = symbolFor('react.memo');\n REACT_LAZY_TYPE = symbolFor('react.lazy');\n REACT_BLOCK_TYPE = symbolFor('react.block');\n REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block');\n REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental');\n REACT_SCOPE_TYPE = symbolFor('react.scope');\n REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id');\n REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode');\n REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen');\n REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden');\n}\n\nvar MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n }\n\n var argsWithFormat = args.map(function (item) {\n return '' + item;\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// Filter certain DOM attributes (e.g. src, href) if their values are empty strings.\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === exports.Fragment || type === REACT_PROFILER_TYPE || type === REACT_DEBUG_TRACING_MODE_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var functionName = innerType.displayName || innerType.name || '';\n return outerType.displayName || (functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName);\n}\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n}\n\nfunction getComponentName(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case exports.Fragment:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n return getComponentName(type.type);\n\n case REACT_BLOCK_TYPE:\n return getComponentName(type._render);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentName(init(payload));\n } catch (x) {\n return null;\n }\n }\n }\n }\n\n return null;\n}\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: _assign({}, props, {\n value: prevLog\n }),\n info: _assign({}, props, {\n value: prevInfo\n }),\n warn: _assign({}, props, {\n value: prevWarn\n }),\n error: _assign({}, props, {\n value: prevError\n }),\n group: _assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: _assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: _assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if (!fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at ');\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_BLOCK_TYPE:\n return describeFunctionComponentFrame(type._render);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(Object.prototype.hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentName(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie.
\n // or
). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n //
, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentName(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentName(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (Array.isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentName(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentName(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (Array.isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentName(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (Array.isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n if (type === exports.Fragment) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, true);\n }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, false);\n }\n}\n\nvar jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs = jsxWithValidationStatic ;\n\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import Stylis from 'stylis/stylis.min';\nimport _insertRulePlugin from 'stylis-rule-sheet';\nimport React, { cloneElement, createContext, Component, createElement } from 'react';\nimport unitless from '@emotion/unitless';\nimport { isElement, isValidElementType, ForwardRef } from 'react-is';\nimport memoize from 'memoize-one';\nimport PropTypes from 'prop-types';\nimport validAttr from '@emotion/is-prop-valid';\nimport merge from 'merge-anything';\n\n// \n\nvar interleave = (function (strings, interpolations) {\n var result = [strings[0]];\n\n for (var i = 0, len = interpolations.length; i < len; i += 1) {\n result.push(interpolations[i], strings[i + 1]);\n }\n\n return result;\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar objectWithoutProperties = function (obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n};\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\n// \nvar isPlainObject = (function (x) {\n return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x.constructor === Object;\n});\n\n// \nvar EMPTY_ARRAY = Object.freeze([]);\nvar EMPTY_OBJECT = Object.freeze({});\n\n// \nfunction isFunction(test) {\n return typeof test === 'function';\n}\n\n// \n\nfunction getComponentName(target) {\n return (process.env.NODE_ENV !== 'production' ? typeof target === 'string' && target : false) || target.displayName || target.name || 'Component';\n}\n\n// \nfunction isStatelessFunction(test) {\n return typeof test === 'function' && !(test.prototype && test.prototype.isReactComponent);\n}\n\n// \nfunction isStyledComponent(target) {\n return target && typeof target.styledComponentId === 'string';\n}\n\n// \n\nvar SC_ATTR = typeof process !== 'undefined' && (process.env.REACT_APP_SC_ATTR || process.env.SC_ATTR) || 'data-styled';\n\nvar SC_VERSION_ATTR = 'data-styled-version';\n\nvar SC_STREAM_ATTR = 'data-styled-streamed';\n\nvar IS_BROWSER = typeof window !== 'undefined' && 'HTMLElement' in window;\n\nvar DISABLE_SPEEDY = typeof SC_DISABLE_SPEEDY === 'boolean' && SC_DISABLE_SPEEDY || typeof process !== 'undefined' && (process.env.REACT_APP_SC_DISABLE_SPEEDY || process.env.SC_DISABLE_SPEEDY) || process.env.NODE_ENV !== 'production';\n\n// Shared empty execution context when generating static styles\nvar STATIC_EXECUTION_CONTEXT = {};\n\n// \n\n\n/**\n * Parse errors.md and turn it into a simple hash of code: message\n */\nvar ERRORS = process.env.NODE_ENV !== 'production' ? {\n \"1\": \"Cannot create styled-component for component: %s.\\n\\n\",\n \"2\": \"Can't collect styles once you've consumed a `ServerStyleSheet`'s styles! `ServerStyleSheet` is a one off instance for each server-side render cycle.\\n\\n- Are you trying to reuse it across renders?\\n- Are you accidentally calling collectStyles twice?\\n\\n\",\n \"3\": \"Streaming SSR is only supported in a Node.js environment; Please do not try to call this method in the browser.\\n\\n\",\n \"4\": \"The `StyleSheetManager` expects a valid target or sheet prop!\\n\\n- Does this error occur on the client and is your target falsy?\\n- Does this error occur on the server and is the sheet falsy?\\n\\n\",\n \"5\": \"The clone method cannot be used on the client!\\n\\n- Are you running in a client-like environment on the server?\\n- Are you trying to run SSR on the client?\\n\\n\",\n \"6\": \"Trying to insert a new style tag, but the given Node is unmounted!\\n\\n- Are you using a custom target that isn't mounted?\\n- Does your document not have a valid head element?\\n- Have you accidentally removed a style tag manually?\\n\\n\",\n \"7\": \"ThemeProvider: Please return an object from your \\\"theme\\\" prop function, e.g.\\n\\n```js\\ntheme={() => ({})}\\n```\\n\\n\",\n \"8\": \"ThemeProvider: Please make your \\\"theme\\\" prop an object.\\n\\n\",\n \"9\": \"Missing document ``\\n\\n\",\n \"10\": \"Cannot find a StyleSheet instance. Usually this happens if there are multiple copies of styled-components loaded at once. Check out this issue for how to troubleshoot and fix the common cases where this situation can happen: https://github.com/styled-components/styled-components/issues/1941#issuecomment-417862021\\n\\n\",\n \"11\": \"_This error was replaced with a dev-time warning, it will be deleted for v4 final._ [createGlobalStyle] received children which will not be rendered. Please use the component without passing children elements.\\n\\n\",\n \"12\": \"It seems you are interpolating a keyframe declaration (%s) into an untagged string. This was supported in styled-components v3, but is not longer supported in v4 as keyframes are now injected on-demand. Please wrap your string in the css\\\\`\\\\` helper which ensures the styles are injected correctly. See https://www.styled-components.com/docs/api#css\\n\\n\",\n \"13\": \"%s is not a styled component and cannot be referred to via component selector. See https://www.styled-components.com/docs/advanced#referring-to-other-components for more details.\\n\"\n} : {};\n\n/**\n * super basic version of sprintf\n */\nfunction format() {\n var a = arguments.length <= 0 ? undefined : arguments[0];\n var b = [];\n\n for (var c = 1, len = arguments.length; c < len; c += 1) {\n b.push(arguments.length <= c ? undefined : arguments[c]);\n }\n\n b.forEach(function (d) {\n a = a.replace(/%[a-z]/, d);\n });\n\n return a;\n}\n\n/**\n * Create an error file out of errors.md for development and a simple web link to the full errors\n * in production mode.\n */\n\nvar StyledComponentsError = function (_Error) {\n inherits(StyledComponentsError, _Error);\n\n function StyledComponentsError(code) {\n classCallCheck(this, StyledComponentsError);\n\n for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n interpolations[_key - 1] = arguments[_key];\n }\n\n if (process.env.NODE_ENV === 'production') {\n var _this = possibleConstructorReturn(this, _Error.call(this, 'An error occurred. See https://github.com/styled-components/styled-components/blob/master/packages/styled-components/src/utils/errors.md#' + code + ' for more information.' + (interpolations.length > 0 ? ' Additional arguments: ' + interpolations.join(', ') : '')));\n } else {\n var _this = possibleConstructorReturn(this, _Error.call(this, format.apply(undefined, [ERRORS[code]].concat(interpolations)).trim()));\n }\n return possibleConstructorReturn(_this);\n }\n\n return StyledComponentsError;\n}(Error);\n\n// \nvar SC_COMPONENT_ID = /^[^\\S\\n]*?\\/\\* sc-component-id:\\s*(\\S+)\\s+\\*\\//gm;\n\nvar extractComps = (function (maybeCSS) {\n var css = '' + (maybeCSS || ''); // Definitely a string, and a clone\n var existingComponents = [];\n css.replace(SC_COMPONENT_ID, function (match, componentId, matchIndex) {\n existingComponents.push({ componentId: componentId, matchIndex: matchIndex });\n return match;\n });\n return existingComponents.map(function (_ref, i) {\n var componentId = _ref.componentId,\n matchIndex = _ref.matchIndex;\n\n var nextComp = existingComponents[i + 1];\n var cssFromDOM = nextComp ? css.slice(matchIndex, nextComp.matchIndex) : css.slice(matchIndex);\n return { componentId: componentId, cssFromDOM: cssFromDOM };\n });\n});\n\n// \n\nvar COMMENT_REGEX = /^\\s*\\/\\/.*$/gm;\n\n// NOTE: This stylis instance is only used to split rules from SSR'd style tags\nvar stylisSplitter = new Stylis({\n global: false,\n cascade: true,\n keyframe: false,\n prefix: false,\n compress: false,\n semicolon: true\n});\n\nvar stylis = new Stylis({\n global: false,\n cascade: true,\n keyframe: false,\n prefix: true,\n compress: false,\n semicolon: false // NOTE: This means \"autocomplete missing semicolons\"\n});\n\n// Wrap `insertRulePlugin to build a list of rules,\n// and then make our own plugin to return the rules. This\n// makes it easier to hook into the existing SSR architecture\n\nvar parsingRules = [];\n\n// eslint-disable-next-line consistent-return\nvar returnRulesPlugin = function returnRulesPlugin(context) {\n if (context === -2) {\n var parsedRules = parsingRules;\n parsingRules = [];\n return parsedRules;\n }\n};\n\nvar parseRulesPlugin = _insertRulePlugin(function (rule) {\n parsingRules.push(rule);\n});\n\nvar _componentId = void 0;\nvar _selector = void 0;\nvar _selectorRegexp = void 0;\n\nvar selfReferenceReplacer = function selfReferenceReplacer(match, offset, string) {\n if (\n // the first self-ref is always untouched\n offset > 0 &&\n // there should be at least two self-refs to do a replacement (.b > .b)\n string.slice(0, offset).indexOf(_selector) !== -1 &&\n // no consecutive self refs (.b.b); that is a precedence boost and treated differently\n string.slice(offset - _selector.length, offset) !== _selector) {\n return '.' + _componentId;\n }\n\n return match;\n};\n\n/**\n * When writing a style like\n *\n * & + & {\n * color: red;\n * }\n *\n * The second ampersand should be a reference to the static component class. stylis\n * has no knowledge of static class so we have to intelligently replace the base selector.\n */\nvar selfReferenceReplacementPlugin = function selfReferenceReplacementPlugin(context, _, selectors) {\n if (context === 2 && selectors.length && selectors[0].lastIndexOf(_selector) > 0) {\n // eslint-disable-next-line no-param-reassign\n selectors[0] = selectors[0].replace(_selectorRegexp, selfReferenceReplacer);\n }\n};\n\nstylis.use([selfReferenceReplacementPlugin, parseRulesPlugin, returnRulesPlugin]);\nstylisSplitter.use([parseRulesPlugin, returnRulesPlugin]);\n\nvar splitByRules = function splitByRules(css) {\n return stylisSplitter('', css);\n};\n\nfunction stringifyRules(rules, selector, prefix) {\n var componentId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '&';\n\n var flatCSS = rules.join('').replace(COMMENT_REGEX, ''); // replace JS comments\n\n var cssStr = selector && prefix ? prefix + ' ' + selector + ' { ' + flatCSS + ' }' : flatCSS;\n\n // stylis has no concept of state to be passed to plugins\n // but since JS is single=threaded, we can rely on that to ensure\n // these properties stay in sync with the current stylis run\n _componentId = componentId;\n _selector = selector;\n _selectorRegexp = new RegExp('\\\\' + _selector + '\\\\b', 'g');\n\n return stylis(prefix || !selector ? '' : selector, cssStr);\n}\n\n// \n/* eslint-disable camelcase, no-undef */\n\nvar getNonce = (function () {\n return typeof __webpack_nonce__ !== 'undefined' ? __webpack_nonce__ : null;\n});\n\n// \n/* These are helpers for the StyleTags to keep track of the injected\n * rule names for each (component) ID that they're keeping track of.\n * They're crucial for detecting whether a name has already been\n * injected.\n * (This excludes rehydrated names) */\n\n/* adds a new ID:name pairing to a names dictionary */\nvar addNameForId = function addNameForId(names, id, name) {\n if (name) {\n // eslint-disable-next-line no-param-reassign\n var namesForId = names[id] || (names[id] = Object.create(null));\n namesForId[name] = true;\n }\n};\n\n/* resets an ID entirely by overwriting it in the dictionary */\nvar resetIdNames = function resetIdNames(names, id) {\n // eslint-disable-next-line no-param-reassign\n names[id] = Object.create(null);\n};\n\n/* factory for a names dictionary checking the existance of an ID:name pairing */\nvar hasNameForId = function hasNameForId(names) {\n return function (id, name) {\n return names[id] !== undefined && names[id][name];\n };\n};\n\n/* stringifies names for the html/element output */\nvar stringifyNames = function stringifyNames(names) {\n var str = '';\n // eslint-disable-next-line guard-for-in\n for (var id in names) {\n str += Object.keys(names[id]).join(' ') + ' ';\n }\n return str.trim();\n};\n\n/* clones the nested names dictionary */\nvar cloneNames = function cloneNames(names) {\n var clone = Object.create(null);\n // eslint-disable-next-line guard-for-in\n for (var id in names) {\n clone[id] = _extends({}, names[id]);\n }\n return clone;\n};\n\n// \n\n/* These are helpers that deal with the insertRule (aka speedy) API\n * They are used in the StyleTags and specifically the speedy tag\n */\n\n/* retrieve a sheet for a given style tag */\nvar sheetForTag = function sheetForTag(tag) {\n // $FlowFixMe\n if (tag.sheet) return tag.sheet;\n\n /* Firefox quirk requires us to step through all stylesheets to find one owned by the given tag */\n var size = tag.ownerDocument.styleSheets.length;\n for (var i = 0; i < size; i += 1) {\n var sheet = tag.ownerDocument.styleSheets[i];\n // $FlowFixMe\n if (sheet.ownerNode === tag) return sheet;\n }\n\n /* we should always be able to find a tag */\n throw new StyledComponentsError(10);\n};\n\n/* insert a rule safely and return whether it was actually injected */\nvar safeInsertRule = function safeInsertRule(sheet, cssRule, index) {\n /* abort early if cssRule string is falsy */\n if (!cssRule) return false;\n\n var maxIndex = sheet.cssRules.length;\n\n try {\n /* use insertRule and cap passed index with maxIndex (no of cssRules) */\n sheet.insertRule(cssRule, index <= maxIndex ? index : maxIndex);\n } catch (err) {\n /* any error indicates an invalid rule */\n return false;\n }\n\n return true;\n};\n\n/* deletes `size` rules starting from `removalIndex` */\nvar deleteRules = function deleteRules(sheet, removalIndex, size) {\n var lowerBound = removalIndex - size;\n for (var i = removalIndex; i > lowerBound; i -= 1) {\n sheet.deleteRule(i);\n }\n};\n\n// \n\n/* this marker separates component styles and is important for rehydration */\nvar makeTextMarker = function makeTextMarker(id) {\n return '\\n/* sc-component-id: ' + id + ' */\\n';\n};\n\n/* add up all numbers in array up until and including the index */\nvar addUpUntilIndex = function addUpUntilIndex(sizes, index) {\n var totalUpToIndex = 0;\n for (var i = 0; i <= index; i += 1) {\n totalUpToIndex += sizes[i];\n }\n\n return totalUpToIndex;\n};\n\n/* create a new style tag after lastEl */\nvar makeStyleTag = function makeStyleTag(target, tagEl, insertBefore) {\n var targetDocument = document;\n if (target) targetDocument = target.ownerDocument;else if (tagEl) targetDocument = tagEl.ownerDocument;\n\n var el = targetDocument.createElement('style');\n el.setAttribute(SC_ATTR, '');\n el.setAttribute(SC_VERSION_ATTR, \"4.4.1\");\n\n var nonce = getNonce();\n if (nonce) {\n el.setAttribute('nonce', nonce);\n }\n\n /* Work around insertRule quirk in EdgeHTML */\n el.appendChild(targetDocument.createTextNode(''));\n\n if (target && !tagEl) {\n /* Append to target when no previous element was passed */\n target.appendChild(el);\n } else {\n if (!tagEl || !target || !tagEl.parentNode) {\n throw new StyledComponentsError(6);\n }\n\n /* Insert new style tag after the previous one */\n tagEl.parentNode.insertBefore(el, insertBefore ? tagEl : tagEl.nextSibling);\n }\n\n return el;\n};\n\n/* takes a css factory function and outputs an html styled tag factory */\nvar wrapAsHtmlTag = function wrapAsHtmlTag(css, names) {\n return function (additionalAttrs) {\n var nonce = getNonce();\n var attrs = [nonce && 'nonce=\"' + nonce + '\"', SC_ATTR + '=\"' + stringifyNames(names) + '\"', SC_VERSION_ATTR + '=\"' + \"4.4.1\" + '\"', additionalAttrs];\n\n var htmlAttr = attrs.filter(Boolean).join(' ');\n return '';\n };\n};\n\n/* takes a css factory function and outputs an element factory */\nvar wrapAsElement = function wrapAsElement(css, names) {\n return function () {\n var _props;\n\n var props = (_props = {}, _props[SC_ATTR] = stringifyNames(names), _props[SC_VERSION_ATTR] = \"4.4.1\", _props);\n\n var nonce = getNonce();\n if (nonce) {\n // $FlowFixMe\n props.nonce = nonce;\n }\n\n // eslint-disable-next-line react/no-danger\n return React.createElement('style', _extends({}, props, { dangerouslySetInnerHTML: { __html: css() } }));\n };\n};\n\nvar getIdsFromMarkersFactory = function getIdsFromMarkersFactory(markers) {\n return function () {\n return Object.keys(markers);\n };\n};\n\n/* speedy tags utilise insertRule */\nvar makeSpeedyTag = function makeSpeedyTag(el, getImportRuleTag) {\n var names = Object.create(null);\n var markers = Object.create(null);\n var sizes = [];\n\n var extractImport = getImportRuleTag !== undefined;\n /* indicates whether getImportRuleTag was called */\n var usedImportRuleTag = false;\n\n var insertMarker = function insertMarker(id) {\n var prev = markers[id];\n if (prev !== undefined) {\n return prev;\n }\n\n markers[id] = sizes.length;\n sizes.push(0);\n resetIdNames(names, id);\n\n return markers[id];\n };\n\n var insertRules = function insertRules(id, cssRules, name) {\n var marker = insertMarker(id);\n var sheet = sheetForTag(el);\n var insertIndex = addUpUntilIndex(sizes, marker);\n\n var injectedRules = 0;\n var importRules = [];\n var cssRulesSize = cssRules.length;\n\n for (var i = 0; i < cssRulesSize; i += 1) {\n var cssRule = cssRules[i];\n var mayHaveImport = extractImport; /* @import rules are reordered to appear first */\n if (mayHaveImport && cssRule.indexOf('@import') !== -1) {\n importRules.push(cssRule);\n } else if (safeInsertRule(sheet, cssRule, insertIndex + injectedRules)) {\n mayHaveImport = false;\n injectedRules += 1;\n }\n }\n\n if (extractImport && importRules.length > 0) {\n usedImportRuleTag = true;\n // $FlowFixMe\n getImportRuleTag().insertRules(id + '-import', importRules);\n }\n\n sizes[marker] += injectedRules; /* add up no of injected rules */\n addNameForId(names, id, name);\n };\n\n var removeRules = function removeRules(id) {\n var marker = markers[id];\n if (marker === undefined) return;\n // $FlowFixMe\n if (el.isConnected === false) return;\n\n var size = sizes[marker];\n var sheet = sheetForTag(el);\n var removalIndex = addUpUntilIndex(sizes, marker) - 1;\n deleteRules(sheet, removalIndex, size);\n sizes[marker] = 0;\n resetIdNames(names, id);\n\n if (extractImport && usedImportRuleTag) {\n // $FlowFixMe\n getImportRuleTag().removeRules(id + '-import');\n }\n };\n\n var css = function css() {\n var _sheetForTag = sheetForTag(el),\n cssRules = _sheetForTag.cssRules;\n\n var str = '';\n\n // eslint-disable-next-line guard-for-in\n for (var id in markers) {\n str += makeTextMarker(id);\n var marker = markers[id];\n var end = addUpUntilIndex(sizes, marker);\n var size = sizes[marker];\n for (var i = end - size; i < end; i += 1) {\n var rule = cssRules[i];\n if (rule !== undefined) {\n str += rule.cssText;\n }\n }\n }\n\n return str;\n };\n\n return {\n clone: function clone() {\n throw new StyledComponentsError(5);\n },\n\n css: css,\n getIds: getIdsFromMarkersFactory(markers),\n hasNameForId: hasNameForId(names),\n insertMarker: insertMarker,\n insertRules: insertRules,\n removeRules: removeRules,\n sealed: false,\n styleTag: el,\n toElement: wrapAsElement(css, names),\n toHTML: wrapAsHtmlTag(css, names)\n };\n};\n\nvar makeTextNode = function makeTextNode(targetDocument, id) {\n return targetDocument.createTextNode(makeTextMarker(id));\n};\n\nvar makeBrowserTag = function makeBrowserTag(el, getImportRuleTag) {\n var names = Object.create(null);\n var markers = Object.create(null);\n\n var extractImport = getImportRuleTag !== undefined;\n\n /* indicates whether getImportRuleTag was called */\n var usedImportRuleTag = false;\n\n var insertMarker = function insertMarker(id) {\n var prev = markers[id];\n if (prev !== undefined) {\n return prev;\n }\n\n markers[id] = makeTextNode(el.ownerDocument, id);\n el.appendChild(markers[id]);\n names[id] = Object.create(null);\n\n return markers[id];\n };\n\n var insertRules = function insertRules(id, cssRules, name) {\n var marker = insertMarker(id);\n var importRules = [];\n var cssRulesSize = cssRules.length;\n\n for (var i = 0; i < cssRulesSize; i += 1) {\n var rule = cssRules[i];\n var mayHaveImport = extractImport;\n if (mayHaveImport && rule.indexOf('@import') !== -1) {\n importRules.push(rule);\n } else {\n mayHaveImport = false;\n var separator = i === cssRulesSize - 1 ? '' : ' ';\n marker.appendData('' + rule + separator);\n }\n }\n\n addNameForId(names, id, name);\n\n if (extractImport && importRules.length > 0) {\n usedImportRuleTag = true;\n // $FlowFixMe\n getImportRuleTag().insertRules(id + '-import', importRules);\n }\n };\n\n var removeRules = function removeRules(id) {\n var marker = markers[id];\n if (marker === undefined) return;\n\n /* create new empty text node and replace the current one */\n var newMarker = makeTextNode(el.ownerDocument, id);\n el.replaceChild(newMarker, marker);\n markers[id] = newMarker;\n resetIdNames(names, id);\n\n if (extractImport && usedImportRuleTag) {\n // $FlowFixMe\n getImportRuleTag().removeRules(id + '-import');\n }\n };\n\n var css = function css() {\n var str = '';\n\n // eslint-disable-next-line guard-for-in\n for (var id in markers) {\n str += markers[id].data;\n }\n\n return str;\n };\n\n return {\n clone: function clone() {\n throw new StyledComponentsError(5);\n },\n\n css: css,\n getIds: getIdsFromMarkersFactory(markers),\n hasNameForId: hasNameForId(names),\n insertMarker: insertMarker,\n insertRules: insertRules,\n removeRules: removeRules,\n sealed: false,\n styleTag: el,\n toElement: wrapAsElement(css, names),\n toHTML: wrapAsHtmlTag(css, names)\n };\n};\n\nvar makeServerTag = function makeServerTag(namesArg, markersArg) {\n var names = namesArg === undefined ? Object.create(null) : namesArg;\n var markers = markersArg === undefined ? Object.create(null) : markersArg;\n\n var insertMarker = function insertMarker(id) {\n var prev = markers[id];\n if (prev !== undefined) {\n return prev;\n }\n\n return markers[id] = [''];\n };\n\n var insertRules = function insertRules(id, cssRules, name) {\n var marker = insertMarker(id);\n marker[0] += cssRules.join(' ');\n addNameForId(names, id, name);\n };\n\n var removeRules = function removeRules(id) {\n var marker = markers[id];\n if (marker === undefined) return;\n marker[0] = '';\n resetIdNames(names, id);\n };\n\n var css = function css() {\n var str = '';\n // eslint-disable-next-line guard-for-in\n for (var id in markers) {\n var cssForId = markers[id][0];\n if (cssForId) {\n str += makeTextMarker(id) + cssForId;\n }\n }\n return str;\n };\n\n var clone = function clone() {\n var namesClone = cloneNames(names);\n var markersClone = Object.create(null);\n\n // eslint-disable-next-line guard-for-in\n for (var id in markers) {\n markersClone[id] = [markers[id][0]];\n }\n\n return makeServerTag(namesClone, markersClone);\n };\n\n var tag = {\n clone: clone,\n css: css,\n getIds: getIdsFromMarkersFactory(markers),\n hasNameForId: hasNameForId(names),\n insertMarker: insertMarker,\n insertRules: insertRules,\n removeRules: removeRules,\n sealed: false,\n styleTag: null,\n toElement: wrapAsElement(css, names),\n toHTML: wrapAsHtmlTag(css, names)\n };\n\n return tag;\n};\n\nvar makeTag = function makeTag(target, tagEl, forceServer, insertBefore, getImportRuleTag) {\n if (IS_BROWSER && !forceServer) {\n var el = makeStyleTag(target, tagEl, insertBefore);\n\n if (DISABLE_SPEEDY) {\n return makeBrowserTag(el, getImportRuleTag);\n } else {\n return makeSpeedyTag(el, getImportRuleTag);\n }\n }\n\n return makeServerTag();\n};\n\nvar rehydrate = function rehydrate(tag, els, extracted) {\n /* add all extracted components to the new tag */\n for (var i = 0, len = extracted.length; i < len; i += 1) {\n var _extracted$i = extracted[i],\n componentId = _extracted$i.componentId,\n cssFromDOM = _extracted$i.cssFromDOM;\n\n var cssRules = splitByRules(cssFromDOM);\n tag.insertRules(componentId, cssRules);\n }\n\n /* remove old HTMLStyleElements, since they have been rehydrated */\n for (var _i = 0, _len = els.length; _i < _len; _i += 1) {\n var el = els[_i];\n if (el.parentNode) {\n el.parentNode.removeChild(el);\n }\n }\n};\n\n// \n\nvar SPLIT_REGEX = /\\s+/;\n\n/* determine the maximum number of components before tags are sharded */\nvar MAX_SIZE = void 0;\nif (IS_BROWSER) {\n /* in speedy mode we can keep a lot more rules in a sheet before a slowdown can be expected */\n MAX_SIZE = DISABLE_SPEEDY ? 40 : 1000;\n} else {\n /* for servers we do not need to shard at all */\n MAX_SIZE = -1;\n}\n\nvar sheetRunningId = 0;\nvar master = void 0;\n\nvar StyleSheet = function () {\n\n /* a map from ids to tags */\n\n /* deferred rules for a given id */\n\n /* this is used for not reinjecting rules via hasNameForId() */\n\n /* when rules for an id are removed using remove() we have to ignore rehydratedNames for it */\n\n /* a list of tags belonging to this StyleSheet */\n\n /* a tag for import rules */\n\n /* current capacity until a new tag must be created */\n\n /* children (aka clones) of this StyleSheet inheriting all and future injections */\n\n function StyleSheet() {\n var _this = this;\n\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : IS_BROWSER ? document.head : null;\n var forceServer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n classCallCheck(this, StyleSheet);\n\n this.getImportRuleTag = function () {\n var importRuleTag = _this.importRuleTag;\n\n if (importRuleTag !== undefined) {\n return importRuleTag;\n }\n\n var firstTag = _this.tags[0];\n var insertBefore = true;\n\n return _this.importRuleTag = makeTag(_this.target, firstTag ? firstTag.styleTag : null, _this.forceServer, insertBefore);\n };\n\n sheetRunningId += 1;\n this.id = sheetRunningId;\n this.forceServer = forceServer;\n this.target = forceServer ? null : target;\n this.tagMap = {};\n this.deferred = {};\n this.rehydratedNames = {};\n this.ignoreRehydratedNames = {};\n this.tags = [];\n this.capacity = 1;\n this.clones = [];\n }\n\n /* rehydrate all SSR'd style tags */\n\n\n StyleSheet.prototype.rehydrate = function rehydrate$$1() {\n if (!IS_BROWSER || this.forceServer) return this;\n\n var els = [];\n var extracted = [];\n var isStreamed = false;\n\n /* retrieve all of our SSR style elements from the DOM */\n var nodes = document.querySelectorAll('style[' + SC_ATTR + '][' + SC_VERSION_ATTR + '=\"' + \"4.4.1\" + '\"]');\n\n var nodesSize = nodes.length;\n\n /* abort rehydration if no previous style tags were found */\n if (!nodesSize) return this;\n\n for (var i = 0; i < nodesSize; i += 1) {\n var el = nodes[i];\n\n /* check if style tag is a streamed tag */\n if (!isStreamed) isStreamed = !!el.getAttribute(SC_STREAM_ATTR);\n\n /* retrieve all component names */\n var elNames = (el.getAttribute(SC_ATTR) || '').trim().split(SPLIT_REGEX);\n var elNamesSize = elNames.length;\n for (var j = 0, name; j < elNamesSize; j += 1) {\n name = elNames[j];\n /* add rehydrated name to sheet to avoid re-adding styles */\n this.rehydratedNames[name] = true;\n }\n\n /* extract all components and their CSS */\n extracted.push.apply(extracted, extractComps(el.textContent));\n\n /* store original HTMLStyleElement */\n els.push(el);\n }\n\n /* abort rehydration if nothing was extracted */\n var extractedSize = extracted.length;\n if (!extractedSize) return this;\n\n /* create a tag to be used for rehydration */\n var tag = this.makeTag(null);\n\n rehydrate(tag, els, extracted);\n\n /* reset capacity and adjust MAX_SIZE by the initial size of the rehydration */\n this.capacity = Math.max(1, MAX_SIZE - extractedSize);\n this.tags.push(tag);\n\n /* retrieve all component ids */\n for (var _j = 0; _j < extractedSize; _j += 1) {\n this.tagMap[extracted[_j].componentId] = tag;\n }\n\n return this;\n };\n\n /* retrieve a \"master\" instance of StyleSheet which is typically used when no other is available\n * The master StyleSheet is targeted by createGlobalStyle, keyframes, and components outside of any\n * StyleSheetManager's context */\n\n\n /* reset the internal \"master\" instance */\n StyleSheet.reset = function reset() {\n var forceServer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n master = new StyleSheet(undefined, forceServer).rehydrate();\n };\n\n /* adds \"children\" to the StyleSheet that inherit all of the parents' rules\n * while their own rules do not affect the parent */\n\n\n StyleSheet.prototype.clone = function clone() {\n var sheet = new StyleSheet(this.target, this.forceServer);\n\n /* add to clone array */\n this.clones.push(sheet);\n\n /* clone all tags */\n sheet.tags = this.tags.map(function (tag) {\n var ids = tag.getIds();\n var newTag = tag.clone();\n\n /* reconstruct tagMap */\n for (var i = 0; i < ids.length; i += 1) {\n sheet.tagMap[ids[i]] = newTag;\n }\n\n return newTag;\n });\n\n /* clone other maps */\n sheet.rehydratedNames = _extends({}, this.rehydratedNames);\n sheet.deferred = _extends({}, this.deferred);\n\n return sheet;\n };\n\n /* force StyleSheet to create a new tag on the next injection */\n\n\n StyleSheet.prototype.sealAllTags = function sealAllTags() {\n this.capacity = 1;\n\n this.tags.forEach(function (tag) {\n // eslint-disable-next-line no-param-reassign\n tag.sealed = true;\n });\n };\n\n StyleSheet.prototype.makeTag = function makeTag$$1(tag) {\n var lastEl = tag ? tag.styleTag : null;\n var insertBefore = false;\n\n return makeTag(this.target, lastEl, this.forceServer, insertBefore, this.getImportRuleTag);\n };\n\n /* get a tag for a given componentId, assign the componentId to one, or shard */\n StyleSheet.prototype.getTagForId = function getTagForId(id) {\n /* simply return a tag, when the componentId was already assigned one */\n var prev = this.tagMap[id];\n if (prev !== undefined && !prev.sealed) {\n return prev;\n }\n\n var tag = this.tags[this.tags.length - 1];\n\n /* shard (create a new tag) if the tag is exhausted (See MAX_SIZE) */\n this.capacity -= 1;\n\n if (this.capacity === 0) {\n this.capacity = MAX_SIZE;\n tag = this.makeTag(tag);\n this.tags.push(tag);\n }\n\n return this.tagMap[id] = tag;\n };\n\n /* mainly for createGlobalStyle to check for its id */\n\n\n StyleSheet.prototype.hasId = function hasId(id) {\n return this.tagMap[id] !== undefined;\n };\n\n /* caching layer checking id+name to already have a corresponding tag and injected rules */\n\n\n StyleSheet.prototype.hasNameForId = function hasNameForId(id, name) {\n /* exception for rehydrated names which are checked separately */\n if (this.ignoreRehydratedNames[id] === undefined && this.rehydratedNames[name]) {\n return true;\n }\n\n var tag = this.tagMap[id];\n return tag !== undefined && tag.hasNameForId(id, name);\n };\n\n /* registers a componentId and registers it on its tag */\n\n\n StyleSheet.prototype.deferredInject = function deferredInject(id, cssRules) {\n /* don't inject when the id is already registered */\n if (this.tagMap[id] !== undefined) return;\n\n var clones = this.clones;\n\n for (var i = 0; i < clones.length; i += 1) {\n clones[i].deferredInject(id, cssRules);\n }\n\n this.getTagForId(id).insertMarker(id);\n this.deferred[id] = cssRules;\n };\n\n /* injects rules for a given id with a name that will need to be cached */\n\n\n StyleSheet.prototype.inject = function inject(id, cssRules, name) {\n var clones = this.clones;\n\n\n for (var i = 0; i < clones.length; i += 1) {\n clones[i].inject(id, cssRules, name);\n }\n\n var tag = this.getTagForId(id);\n\n /* add deferred rules for component */\n if (this.deferred[id] !== undefined) {\n // Combine passed cssRules with previously deferred CSS rules\n // NOTE: We cannot mutate the deferred array itself as all clones\n // do the same (see clones[i].inject)\n var rules = this.deferred[id].concat(cssRules);\n tag.insertRules(id, rules, name);\n\n this.deferred[id] = undefined;\n } else {\n tag.insertRules(id, cssRules, name);\n }\n };\n\n /* removes all rules for a given id, which doesn't remove its marker but resets it */\n\n\n StyleSheet.prototype.remove = function remove(id) {\n var tag = this.tagMap[id];\n if (tag === undefined) return;\n\n var clones = this.clones;\n\n for (var i = 0; i < clones.length; i += 1) {\n clones[i].remove(id);\n }\n\n /* remove all rules from the tag */\n tag.removeRules(id);\n\n /* ignore possible rehydrated names */\n this.ignoreRehydratedNames[id] = true;\n\n /* delete possible deferred rules */\n this.deferred[id] = undefined;\n };\n\n StyleSheet.prototype.toHTML = function toHTML() {\n return this.tags.map(function (tag) {\n return tag.toHTML();\n }).join('');\n };\n\n StyleSheet.prototype.toReactElements = function toReactElements() {\n var id = this.id;\n\n\n return this.tags.map(function (tag, i) {\n var key = 'sc-' + id + '-' + i;\n return cloneElement(tag.toElement(), { key: key });\n });\n };\n\n createClass(StyleSheet, null, [{\n key: 'master',\n get: function get$$1() {\n return master || (master = new StyleSheet().rehydrate());\n }\n\n /* NOTE: This is just for backwards-compatibility with jest-styled-components */\n\n }, {\n key: 'instance',\n get: function get$$1() {\n return StyleSheet.master;\n }\n }]);\n return StyleSheet;\n}();\n\n// \n\nvar Keyframes = function () {\n function Keyframes(name, rules) {\n var _this = this;\n\n classCallCheck(this, Keyframes);\n\n this.inject = function (styleSheet) {\n if (!styleSheet.hasNameForId(_this.id, _this.name)) {\n styleSheet.inject(_this.id, _this.rules, _this.name);\n }\n };\n\n this.toString = function () {\n throw new StyledComponentsError(12, String(_this.name));\n };\n\n this.name = name;\n this.rules = rules;\n\n this.id = 'sc-keyframes-' + name;\n }\n\n Keyframes.prototype.getName = function getName() {\n return this.name;\n };\n\n return Keyframes;\n}();\n\n// \n\n/**\n * inlined version of\n * https://github.com/facebook/fbjs/blob/master/packages/fbjs/src/core/hyphenateStyleName.js\n */\n\nvar uppercasePattern = /([A-Z])/g;\nvar msPattern = /^ms-/;\n\n/**\n * Hyphenates a camelcased CSS property name, for example:\n *\n * > hyphenateStyleName('backgroundColor')\n * < \"background-color\"\n * > hyphenateStyleName('MozTransition')\n * < \"-moz-transition\"\n * > hyphenateStyleName('msTransition')\n * < \"-ms-transition\"\n *\n * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix\n * is converted to `-ms-`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction hyphenateStyleName(string) {\n return string.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');\n}\n\n// \n\n// Taken from https://github.com/facebook/react/blob/b87aabdfe1b7461e7331abb3601d9e6bb27544bc/packages/react-dom/src/shared/dangerousStyleValue.js\nfunction addUnitIfNeeded(name, value) {\n // https://github.com/amilajack/eslint-plugin-flowtype-errors/issues/133\n // $FlowFixMe\n if (value == null || typeof value === 'boolean' || value === '') {\n return '';\n }\n\n if (typeof value === 'number' && value !== 0 && !(name in unitless)) {\n return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers\n }\n\n return String(value).trim();\n}\n\n// \n\n/**\n * It's falsish not falsy because 0 is allowed.\n */\nvar isFalsish = function isFalsish(chunk) {\n return chunk === undefined || chunk === null || chunk === false || chunk === '';\n};\n\nvar objToCssArray = function objToCssArray(obj, prevKey) {\n var rules = [];\n var keys = Object.keys(obj);\n\n keys.forEach(function (key) {\n if (!isFalsish(obj[key])) {\n if (isPlainObject(obj[key])) {\n rules.push.apply(rules, objToCssArray(obj[key], key));\n\n return rules;\n } else if (isFunction(obj[key])) {\n rules.push(hyphenateStyleName(key) + ':', obj[key], ';');\n\n return rules;\n }\n rules.push(hyphenateStyleName(key) + ': ' + addUnitIfNeeded(key, obj[key]) + ';');\n }\n return rules;\n });\n\n return prevKey ? [prevKey + ' {'].concat(rules, ['}']) : rules;\n};\n\nfunction flatten(chunk, executionContext, styleSheet) {\n if (Array.isArray(chunk)) {\n var ruleSet = [];\n\n for (var i = 0, len = chunk.length, result; i < len; i += 1) {\n result = flatten(chunk[i], executionContext, styleSheet);\n\n if (result === null) continue;else if (Array.isArray(result)) ruleSet.push.apply(ruleSet, result);else ruleSet.push(result);\n }\n\n return ruleSet;\n }\n\n if (isFalsish(chunk)) {\n return null;\n }\n\n /* Handle other components */\n if (isStyledComponent(chunk)) {\n return '.' + chunk.styledComponentId;\n }\n\n /* Either execute or defer the function */\n if (isFunction(chunk)) {\n if (isStatelessFunction(chunk) && executionContext) {\n var _result = chunk(executionContext);\n\n if (process.env.NODE_ENV !== 'production' && isElement(_result)) {\n // eslint-disable-next-line no-console\n console.warn(getComponentName(chunk) + ' is not a styled component and cannot be referred to via component selector. See https://www.styled-components.com/docs/advanced#referring-to-other-components for more details.');\n }\n\n return flatten(_result, executionContext, styleSheet);\n } else return chunk;\n }\n\n if (chunk instanceof Keyframes) {\n if (styleSheet) {\n chunk.inject(styleSheet);\n return chunk.getName();\n } else return chunk;\n }\n\n /* Handle objects */\n return isPlainObject(chunk) ? objToCssArray(chunk) : chunk.toString();\n}\n\n// \n\nfunction css(styles) {\n for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n interpolations[_key - 1] = arguments[_key];\n }\n\n if (isFunction(styles) || isPlainObject(styles)) {\n // $FlowFixMe\n return flatten(interleave(EMPTY_ARRAY, [styles].concat(interpolations)));\n }\n\n // $FlowFixMe\n return flatten(interleave(styles, interpolations));\n}\n\n// \n\nfunction constructWithOptions(componentConstructor, tag) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EMPTY_OBJECT;\n\n if (!isValidElementType(tag)) {\n throw new StyledComponentsError(1, String(tag));\n }\n\n /* This is callable directly as a template function */\n // $FlowFixMe: Not typed to avoid destructuring arguments\n var templateFunction = function templateFunction() {\n return componentConstructor(tag, options, css.apply(undefined, arguments));\n };\n\n /* If config methods are called, wrap up a new template function and merge options */\n templateFunction.withConfig = function (config) {\n return constructWithOptions(componentConstructor, tag, _extends({}, options, config));\n };\n\n /* Modify/inject new props at runtime */\n templateFunction.attrs = function (attrs) {\n return constructWithOptions(componentConstructor, tag, _extends({}, options, {\n attrs: Array.prototype.concat(options.attrs, attrs).filter(Boolean)\n }));\n };\n\n return templateFunction;\n}\n\n// \n// Source: https://github.com/garycourt/murmurhash-js/blob/master/murmurhash2_gc.js\nfunction murmurhash(c) {\n for (var e = c.length | 0, a = e | 0, d = 0, b; e >= 4;) {\n b = c.charCodeAt(d) & 255 | (c.charCodeAt(++d) & 255) << 8 | (c.charCodeAt(++d) & 255) << 16 | (c.charCodeAt(++d) & 255) << 24, b = 1540483477 * (b & 65535) + ((1540483477 * (b >>> 16) & 65535) << 16), b ^= b >>> 24, b = 1540483477 * (b & 65535) + ((1540483477 * (b >>> 16) & 65535) << 16), a = 1540483477 * (a & 65535) + ((1540483477 * (a >>> 16) & 65535) << 16) ^ b, e -= 4, ++d;\n }\n switch (e) {\n case 3:\n a ^= (c.charCodeAt(d + 2) & 255) << 16;\n case 2:\n a ^= (c.charCodeAt(d + 1) & 255) << 8;\n case 1:\n a ^= c.charCodeAt(d) & 255, a = 1540483477 * (a & 65535) + ((1540483477 * (a >>> 16) & 65535) << 16);\n }\n a ^= a >>> 13;\n a = 1540483477 * (a & 65535) + ((1540483477 * (a >>> 16) & 65535) << 16);\n return (a ^ a >>> 15) >>> 0;\n}\n\n// \n/* eslint-disable no-bitwise */\n\n/* This is the \"capacity\" of our alphabet i.e. 2x26 for all letters plus their capitalised\n * counterparts */\nvar charsLength = 52;\n\n/* start at 75 for 'a' until 'z' (25) and then start at 65 for capitalised letters */\nvar getAlphabeticChar = function getAlphabeticChar(code) {\n return String.fromCharCode(code + (code > 25 ? 39 : 97));\n};\n\n/* input a number, usually a hash and convert it to base-52 */\nfunction generateAlphabeticName(code) {\n var name = '';\n var x = void 0;\n\n /* get a char and divide by alphabet-length */\n for (x = code; x > charsLength; x = Math.floor(x / charsLength)) {\n name = getAlphabeticChar(x % charsLength) + name;\n }\n\n return getAlphabeticChar(x % charsLength) + name;\n}\n\n// \n\nfunction hasFunctionObjectKey(obj) {\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (var key in obj) {\n if (isFunction(obj[key])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isStaticRules(rules, attrs) {\n for (var i = 0; i < rules.length; i += 1) {\n var rule = rules[i];\n\n // recursive case\n if (Array.isArray(rule) && !isStaticRules(rule, attrs)) {\n return false;\n } else if (isFunction(rule) && !isStyledComponent(rule)) {\n // functions are allowed to be static if they're just being\n // used to get the classname of a nested styled component\n return false;\n }\n }\n\n if (attrs.some(function (x) {\n return isFunction(x) || hasFunctionObjectKey(x);\n })) return false;\n\n return true;\n}\n\n// \n\n/* combines hashStr (murmurhash) and nameGenerator for convenience */\nvar hasher = function hasher(str) {\n return generateAlphabeticName(murmurhash(str));\n};\n\n/*\n ComponentStyle is all the CSS-specific stuff, not\n the React-specific stuff.\n */\n\nvar ComponentStyle = function () {\n function ComponentStyle(rules, attrs, componentId) {\n classCallCheck(this, ComponentStyle);\n\n this.rules = rules;\n this.isStatic = process.env.NODE_ENV === 'production' && isStaticRules(rules, attrs);\n this.componentId = componentId;\n\n if (!StyleSheet.master.hasId(componentId)) {\n StyleSheet.master.deferredInject(componentId, []);\n }\n }\n\n /*\n * Flattens a rule set into valid CSS\n * Hashes it, wraps the whole chunk in a .hash1234 {}\n * Returns the hash to be injected on render()\n * */\n\n\n ComponentStyle.prototype.generateAndInjectStyles = function generateAndInjectStyles(executionContext, styleSheet) {\n var isStatic = this.isStatic,\n componentId = this.componentId,\n lastClassName = this.lastClassName;\n\n if (IS_BROWSER && isStatic && typeof lastClassName === 'string' && styleSheet.hasNameForId(componentId, lastClassName)) {\n return lastClassName;\n }\n\n var flatCSS = flatten(this.rules, executionContext, styleSheet);\n var name = hasher(this.componentId + flatCSS.join(''));\n if (!styleSheet.hasNameForId(componentId, name)) {\n styleSheet.inject(this.componentId, stringifyRules(flatCSS, '.' + name, undefined, componentId), name);\n }\n\n this.lastClassName = name;\n return name;\n };\n\n ComponentStyle.generateName = function generateName(str) {\n return hasher(str);\n };\n\n return ComponentStyle;\n}();\n\n// \n\nvar LIMIT = 200;\n\nvar createWarnTooManyClasses = (function (displayName) {\n var generatedClasses = {};\n var warningSeen = false;\n\n return function (className) {\n if (!warningSeen) {\n generatedClasses[className] = true;\n if (Object.keys(generatedClasses).length >= LIMIT) {\n // Unable to find latestRule in test environment.\n /* eslint-disable no-console, prefer-template */\n console.warn('Over ' + LIMIT + ' classes were generated for component ' + displayName + '. \\n' + 'Consider using the attrs method, together with a style object for frequently changed styles.\\n' + 'Example:\\n' + ' const Component = styled.div.attrs(props => ({\\n' + ' style: {\\n' + ' background: props.background,\\n' + ' },\\n' + ' }))`width: 100%;`\\n\\n' + ' ');\n warningSeen = true;\n generatedClasses = {};\n }\n }\n };\n});\n\n// \n\nvar determineTheme = (function (props, fallbackTheme) {\n var defaultProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EMPTY_OBJECT;\n\n // Props should take precedence over ThemeProvider, which should take precedence over\n // defaultProps, but React automatically puts defaultProps on props.\n\n /* eslint-disable react/prop-types, flowtype-errors/show-errors */\n var isDefaultTheme = defaultProps ? props.theme === defaultProps.theme : false;\n var theme = props.theme && !isDefaultTheme ? props.theme : fallbackTheme || defaultProps.theme;\n /* eslint-enable */\n\n return theme;\n});\n\n// \nvar escapeRegex = /[[\\].#*$><+~=|^:(),\"'`-]+/g;\nvar dashesAtEnds = /(^-|-$)/g;\n\n/**\n * TODO: Explore using CSS.escape when it becomes more available\n * in evergreen browsers.\n */\nfunction escape(str) {\n return str\n // Replace all possible CSS selectors\n .replace(escapeRegex, '-')\n\n // Remove extraneous hyphens at the start and end\n .replace(dashesAtEnds, '');\n}\n\n// \n\nfunction isTag(target) {\n return typeof target === 'string' && (process.env.NODE_ENV !== 'production' ? target.charAt(0) === target.charAt(0).toLowerCase() : true);\n}\n\n// \n\nfunction generateDisplayName(target) {\n // $FlowFixMe\n return isTag(target) ? 'styled.' + target : 'Styled(' + getComponentName(target) + ')';\n}\n\nvar _TYPE_STATICS;\n\nvar REACT_STATICS = {\n childContextTypes: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDerivedStateFromProps: true,\n propTypes: true,\n type: true\n};\n\nvar KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true\n};\n\nvar TYPE_STATICS = (_TYPE_STATICS = {}, _TYPE_STATICS[ForwardRef] = {\n $$typeof: true,\n render: true\n}, _TYPE_STATICS);\n\nvar defineProperty$1 = Object.defineProperty,\n getOwnPropertyNames = Object.getOwnPropertyNames,\n _Object$getOwnPropert = Object.getOwnPropertySymbols,\n getOwnPropertySymbols = _Object$getOwnPropert === undefined ? function () {\n return [];\n} : _Object$getOwnPropert,\n getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor,\n getPrototypeOf = Object.getPrototypeOf,\n objectPrototype = Object.prototype;\nvar arrayPrototype = Array.prototype;\n\n\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n if (typeof sourceComponent !== 'string') {\n // don't hoist over string (html) components\n\n var inheritedComponent = getPrototypeOf(sourceComponent);\n\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n }\n\n var keys = arrayPrototype.concat(getOwnPropertyNames(sourceComponent),\n // $FlowFixMe\n getOwnPropertySymbols(sourceComponent));\n\n var targetStatics = TYPE_STATICS[targetComponent.$$typeof] || REACT_STATICS;\n\n var sourceStatics = TYPE_STATICS[sourceComponent.$$typeof] || REACT_STATICS;\n\n var i = keys.length;\n var descriptor = void 0;\n var key = void 0;\n\n // eslint-disable-next-line no-plusplus\n while (i--) {\n key = keys[i];\n\n if (\n // $FlowFixMe\n !KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) &&\n // $FlowFixMe\n !(targetStatics && targetStatics[key])) {\n descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n if (descriptor) {\n try {\n // Avoid failures from read-only properties\n defineProperty$1(targetComponent, key, descriptor);\n } catch (e) {\n /* fail silently */\n }\n }\n }\n }\n\n return targetComponent;\n }\n\n return targetComponent;\n}\n\n// \nfunction isDerivedReactComponent(fn) {\n return !!(fn && fn.prototype && fn.prototype.isReactComponent);\n}\n\n// \n// Helper to call a given function, only once\nvar once = (function (cb) {\n var called = false;\n\n return function () {\n if (!called) {\n called = true;\n cb.apply(undefined, arguments);\n }\n };\n});\n\n// \n\nvar ThemeContext = createContext();\n\nvar ThemeConsumer = ThemeContext.Consumer;\n\n/**\n * Provide a theme to an entire react component tree via context\n */\n\nvar ThemeProvider = function (_Component) {\n inherits(ThemeProvider, _Component);\n\n function ThemeProvider(props) {\n classCallCheck(this, ThemeProvider);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, props));\n\n _this.getContext = memoize(_this.getContext.bind(_this));\n _this.renderInner = _this.renderInner.bind(_this);\n return _this;\n }\n\n ThemeProvider.prototype.render = function render() {\n if (!this.props.children) return null;\n\n return React.createElement(\n ThemeContext.Consumer,\n null,\n this.renderInner\n );\n };\n\n ThemeProvider.prototype.renderInner = function renderInner(outerTheme) {\n var context = this.getContext(this.props.theme, outerTheme);\n\n return React.createElement(\n ThemeContext.Provider,\n { value: context },\n this.props.children\n );\n };\n\n /**\n * Get the theme from the props, supporting both (outerTheme) => {}\n * as well as object notation\n */\n\n\n ThemeProvider.prototype.getTheme = function getTheme(theme, outerTheme) {\n if (isFunction(theme)) {\n var mergedTheme = theme(outerTheme);\n\n if (process.env.NODE_ENV !== 'production' && (mergedTheme === null || Array.isArray(mergedTheme) || (typeof mergedTheme === 'undefined' ? 'undefined' : _typeof(mergedTheme)) !== 'object')) {\n throw new StyledComponentsError(7);\n }\n\n return mergedTheme;\n }\n\n if (theme === null || Array.isArray(theme) || (typeof theme === 'undefined' ? 'undefined' : _typeof(theme)) !== 'object') {\n throw new StyledComponentsError(8);\n }\n\n return _extends({}, outerTheme, theme);\n };\n\n ThemeProvider.prototype.getContext = function getContext(theme, outerTheme) {\n return this.getTheme(theme, outerTheme);\n };\n\n return ThemeProvider;\n}(Component);\n\n// \n\nvar CLOSING_TAG_R = /^\\s*<\\/[a-z]/i;\n\nvar ServerStyleSheet = function () {\n function ServerStyleSheet() {\n classCallCheck(this, ServerStyleSheet);\n\n /* The master sheet might be reset, so keep a reference here */\n this.masterSheet = StyleSheet.master;\n this.instance = this.masterSheet.clone();\n this.sealed = false;\n }\n\n /**\n * Mark the ServerStyleSheet as being fully emitted and manually GC it from the\n * StyleSheet singleton.\n */\n\n\n ServerStyleSheet.prototype.seal = function seal() {\n if (!this.sealed) {\n /* Remove sealed StyleSheets from the master sheet */\n var index = this.masterSheet.clones.indexOf(this.instance);\n this.masterSheet.clones.splice(index, 1);\n this.sealed = true;\n }\n };\n\n ServerStyleSheet.prototype.collectStyles = function collectStyles(children) {\n if (this.sealed) {\n throw new StyledComponentsError(2);\n }\n\n return React.createElement(\n StyleSheetManager,\n { sheet: this.instance },\n children\n );\n };\n\n ServerStyleSheet.prototype.getStyleTags = function getStyleTags() {\n this.seal();\n return this.instance.toHTML();\n };\n\n ServerStyleSheet.prototype.getStyleElement = function getStyleElement() {\n this.seal();\n return this.instance.toReactElements();\n };\n\n ServerStyleSheet.prototype.interleaveWithNodeStream = function interleaveWithNodeStream(readableStream) {\n var _this = this;\n\n {\n throw new StyledComponentsError(3);\n }\n\n /* the tag index keeps track of which tags have already been emitted */\n var instance = this.instance;\n\n var instanceTagIndex = 0;\n\n var streamAttr = SC_STREAM_ATTR + '=\"true\"';\n\n var transformer = new stream.Transform({\n transform: function appendStyleChunks(chunk, /* encoding */_, callback) {\n var tags = instance.tags;\n\n var html = '';\n\n /* retrieve html for each new style tag */\n for (; instanceTagIndex < tags.length; instanceTagIndex += 1) {\n var tag = tags[instanceTagIndex];\n html += tag.toHTML(streamAttr);\n }\n\n /* force our StyleSheets to emit entirely new tags */\n instance.sealAllTags();\n\n var renderedHtml = chunk.toString();\n\n /* prepend style html to chunk, unless the start of the chunk is a closing tag in which case append right after that */\n if (CLOSING_TAG_R.test(renderedHtml)) {\n var endOfClosingTag = renderedHtml.indexOf('>');\n\n this.push(renderedHtml.slice(0, endOfClosingTag + 1) + html + renderedHtml.slice(endOfClosingTag + 1));\n } else this.push(html + renderedHtml);\n\n callback();\n }\n });\n\n readableStream.on('end', function () {\n return _this.seal();\n });\n\n readableStream.on('error', function (err) {\n _this.seal();\n\n // forward the error to the transform stream\n transformer.emit('error', err);\n });\n\n return readableStream.pipe(transformer);\n };\n\n return ServerStyleSheet;\n}();\n\n// \n\nvar StyleSheetContext = createContext();\nvar StyleSheetConsumer = StyleSheetContext.Consumer;\n\nvar StyleSheetManager = function (_Component) {\n inherits(StyleSheetManager, _Component);\n\n function StyleSheetManager(props) {\n classCallCheck(this, StyleSheetManager);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, props));\n\n _this.getContext = memoize(_this.getContext);\n return _this;\n }\n\n StyleSheetManager.prototype.getContext = function getContext(sheet, target) {\n if (sheet) {\n return sheet;\n } else if (target) {\n return new StyleSheet(target);\n } else {\n throw new StyledComponentsError(4);\n }\n };\n\n StyleSheetManager.prototype.render = function render() {\n var _props = this.props,\n children = _props.children,\n sheet = _props.sheet,\n target = _props.target;\n\n\n return React.createElement(\n StyleSheetContext.Provider,\n { value: this.getContext(sheet, target) },\n process.env.NODE_ENV !== 'production' ? React.Children.only(children) : children\n );\n };\n\n return StyleSheetManager;\n}(Component);\nprocess.env.NODE_ENV !== \"production\" ? StyleSheetManager.propTypes = {\n sheet: PropTypes.oneOfType([PropTypes.instanceOf(StyleSheet), PropTypes.instanceOf(ServerStyleSheet)]),\n\n target: PropTypes.shape({\n appendChild: PropTypes.func.isRequired\n })\n} : void 0;\n\n// \n\nvar identifiers = {};\n\n/* We depend on components having unique IDs */\nfunction generateId(_ComponentStyle, _displayName, parentComponentId) {\n var displayName = typeof _displayName !== 'string' ? 'sc' : escape(_displayName);\n\n /**\n * This ensures uniqueness if two components happen to share\n * the same displayName.\n */\n var nr = (identifiers[displayName] || 0) + 1;\n identifiers[displayName] = nr;\n\n var componentId = displayName + '-' + _ComponentStyle.generateName(displayName + nr);\n\n return parentComponentId ? parentComponentId + '-' + componentId : componentId;\n}\n\n// $FlowFixMe\n\nvar StyledComponent = function (_Component) {\n inherits(StyledComponent, _Component);\n\n function StyledComponent() {\n classCallCheck(this, StyledComponent);\n\n var _this = possibleConstructorReturn(this, _Component.call(this));\n\n _this.attrs = {};\n\n _this.renderOuter = _this.renderOuter.bind(_this);\n _this.renderInner = _this.renderInner.bind(_this);\n\n if (process.env.NODE_ENV !== 'production') {\n _this.warnInnerRef = once(function (displayName) {\n return (\n // eslint-disable-next-line no-console\n console.warn('The \"innerRef\" API has been removed in styled-components v4 in favor of React 16 ref forwarding, use \"ref\" instead like a typical component. \"innerRef\" was detected on component \"' + displayName + '\".')\n );\n });\n\n _this.warnAttrsFnObjectKeyDeprecated = once(function (key, displayName) {\n return (\n // eslint-disable-next-line no-console\n console.warn('Functions as object-form attrs({}) keys are now deprecated and will be removed in a future version of styled-components. Switch to the new attrs(props => ({})) syntax instead for easier and more powerful composition. The attrs key in question is \"' + key + '\" on component \"' + displayName + '\".', '\\n ' + new Error().stack)\n );\n });\n\n _this.warnNonStyledComponentAttrsObjectKey = once(function (key, displayName) {\n return (\n // eslint-disable-next-line no-console\n console.warn('It looks like you\\'ve used a non styled-component as the value for the \"' + key + '\" prop in an object-form attrs constructor of \"' + displayName + '\".\\n' + 'You should use the new function-form attrs constructor which avoids this issue: attrs(props => ({ yourStuff }))\\n' + \"To continue using the deprecated object syntax, you'll need to wrap your component prop in a function to make it available inside the styled component (you'll still get the deprecation warning though.)\\n\" + ('For example, { ' + key + ': () => InnerComponent } instead of { ' + key + ': InnerComponent }'))\n );\n });\n }\n return _this;\n }\n\n StyledComponent.prototype.render = function render() {\n return React.createElement(\n StyleSheetConsumer,\n null,\n this.renderOuter\n );\n };\n\n StyledComponent.prototype.renderOuter = function renderOuter() {\n var styleSheet = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : StyleSheet.master;\n\n this.styleSheet = styleSheet;\n\n // No need to subscribe a static component to theme changes, it won't change anything\n if (this.props.forwardedComponent.componentStyle.isStatic) return this.renderInner();\n\n return React.createElement(\n ThemeConsumer,\n null,\n this.renderInner\n );\n };\n\n StyledComponent.prototype.renderInner = function renderInner(theme) {\n var _props$forwardedCompo = this.props.forwardedComponent,\n componentStyle = _props$forwardedCompo.componentStyle,\n defaultProps = _props$forwardedCompo.defaultProps,\n displayName = _props$forwardedCompo.displayName,\n foldedComponentIds = _props$forwardedCompo.foldedComponentIds,\n styledComponentId = _props$forwardedCompo.styledComponentId,\n target = _props$forwardedCompo.target;\n\n\n var generatedClassName = void 0;\n if (componentStyle.isStatic) {\n generatedClassName = this.generateAndInjectStyles(EMPTY_OBJECT, this.props);\n } else {\n generatedClassName = this.generateAndInjectStyles(determineTheme(this.props, theme, defaultProps) || EMPTY_OBJECT, this.props);\n }\n\n var elementToBeCreated = this.props.as || this.attrs.as || target;\n var isTargetTag = isTag(elementToBeCreated);\n\n var propsForElement = {};\n var computedProps = _extends({}, this.props, this.attrs);\n\n var key = void 0;\n // eslint-disable-next-line guard-for-in\n for (key in computedProps) {\n if (process.env.NODE_ENV !== 'production' && key === 'innerRef' && isTargetTag) {\n this.warnInnerRef(displayName);\n }\n\n if (key === 'forwardedComponent' || key === 'as') {\n continue;\n } else if (key === 'forwardedRef') propsForElement.ref = computedProps[key];else if (key === 'forwardedAs') propsForElement.as = computedProps[key];else if (!isTargetTag || validAttr(key)) {\n // Don't pass through non HTML tags through to HTML elements\n propsForElement[key] = computedProps[key];\n }\n }\n\n if (this.props.style && this.attrs.style) {\n propsForElement.style = _extends({}, this.attrs.style, this.props.style);\n }\n\n propsForElement.className = Array.prototype.concat(foldedComponentIds, styledComponentId, generatedClassName !== styledComponentId ? generatedClassName : null, this.props.className, this.attrs.className).filter(Boolean).join(' ');\n\n return createElement(elementToBeCreated, propsForElement);\n };\n\n StyledComponent.prototype.buildExecutionContext = function buildExecutionContext(theme, props, attrs) {\n var _this2 = this;\n\n var context = _extends({}, props, { theme: theme });\n\n if (!attrs.length) return context;\n\n this.attrs = {};\n\n attrs.forEach(function (attrDef) {\n var resolvedAttrDef = attrDef;\n var attrDefWasFn = false;\n var attr = void 0;\n var key = void 0;\n\n if (isFunction(resolvedAttrDef)) {\n // $FlowFixMe\n resolvedAttrDef = resolvedAttrDef(context);\n attrDefWasFn = true;\n }\n\n /* eslint-disable guard-for-in */\n // $FlowFixMe\n for (key in resolvedAttrDef) {\n attr = resolvedAttrDef[key];\n\n if (!attrDefWasFn) {\n if (isFunction(attr) && !isDerivedReactComponent(attr) && !isStyledComponent(attr)) {\n if (process.env.NODE_ENV !== 'production') {\n _this2.warnAttrsFnObjectKeyDeprecated(key, props.forwardedComponent.displayName);\n }\n\n attr = attr(context);\n\n if (process.env.NODE_ENV !== 'production' && React.isValidElement(attr)) {\n _this2.warnNonStyledComponentAttrsObjectKey(key, props.forwardedComponent.displayName);\n }\n }\n }\n\n _this2.attrs[key] = attr;\n context[key] = attr;\n }\n /* eslint-enable */\n });\n\n return context;\n };\n\n StyledComponent.prototype.generateAndInjectStyles = function generateAndInjectStyles(theme, props) {\n var _props$forwardedCompo2 = props.forwardedComponent,\n attrs = _props$forwardedCompo2.attrs,\n componentStyle = _props$forwardedCompo2.componentStyle,\n warnTooManyClasses = _props$forwardedCompo2.warnTooManyClasses;\n\n // statically styled-components don't need to build an execution context object,\n // and shouldn't be increasing the number of class names\n\n if (componentStyle.isStatic && !attrs.length) {\n return componentStyle.generateAndInjectStyles(EMPTY_OBJECT, this.styleSheet);\n }\n\n var className = componentStyle.generateAndInjectStyles(this.buildExecutionContext(theme, props, attrs), this.styleSheet);\n\n if (process.env.NODE_ENV !== 'production' && warnTooManyClasses) warnTooManyClasses(className);\n\n return className;\n };\n\n return StyledComponent;\n}(Component);\n\nfunction createStyledComponent(target, options, rules) {\n var isTargetStyledComp = isStyledComponent(target);\n var isClass = !isTag(target);\n\n var _options$displayName = options.displayName,\n displayName = _options$displayName === undefined ? generateDisplayName(target) : _options$displayName,\n _options$componentId = options.componentId,\n componentId = _options$componentId === undefined ? generateId(ComponentStyle, options.displayName, options.parentComponentId) : _options$componentId,\n _options$ParentCompon = options.ParentComponent,\n ParentComponent = _options$ParentCompon === undefined ? StyledComponent : _options$ParentCompon,\n _options$attrs = options.attrs,\n attrs = _options$attrs === undefined ? EMPTY_ARRAY : _options$attrs;\n\n\n var styledComponentId = options.displayName && options.componentId ? escape(options.displayName) + '-' + options.componentId : options.componentId || componentId;\n\n // fold the underlying StyledComponent attrs up (implicit extend)\n var finalAttrs =\n // $FlowFixMe\n isTargetStyledComp && target.attrs ? Array.prototype.concat(target.attrs, attrs).filter(Boolean) : attrs;\n\n var componentStyle = new ComponentStyle(isTargetStyledComp ? // fold the underlying StyledComponent rules up (implicit extend)\n // $FlowFixMe\n target.componentStyle.rules.concat(rules) : rules, finalAttrs, styledComponentId);\n\n /**\n * forwardRef creates a new interim component, which we'll take advantage of\n * instead of extending ParentComponent to create _another_ interim class\n */\n var WrappedStyledComponent = void 0;\n var forwardRef = function forwardRef(props, ref) {\n return React.createElement(ParentComponent, _extends({}, props, { forwardedComponent: WrappedStyledComponent, forwardedRef: ref }));\n };\n forwardRef.displayName = displayName;\n WrappedStyledComponent = React.forwardRef(forwardRef);\n WrappedStyledComponent.displayName = displayName;\n\n // $FlowFixMe\n WrappedStyledComponent.attrs = finalAttrs;\n // $FlowFixMe\n WrappedStyledComponent.componentStyle = componentStyle;\n\n // $FlowFixMe\n WrappedStyledComponent.foldedComponentIds = isTargetStyledComp ? // $FlowFixMe\n Array.prototype.concat(target.foldedComponentIds, target.styledComponentId) : EMPTY_ARRAY;\n\n // $FlowFixMe\n WrappedStyledComponent.styledComponentId = styledComponentId;\n\n // fold the underlying StyledComponent target up since we folded the styles\n // $FlowFixMe\n WrappedStyledComponent.target = isTargetStyledComp ? target.target : target;\n\n // $FlowFixMe\n WrappedStyledComponent.withComponent = function withComponent(tag) {\n var previousComponentId = options.componentId,\n optionsToCopy = objectWithoutProperties(options, ['componentId']);\n\n\n var newComponentId = previousComponentId && previousComponentId + '-' + (isTag(tag) ? tag : escape(getComponentName(tag)));\n\n var newOptions = _extends({}, optionsToCopy, {\n attrs: finalAttrs,\n componentId: newComponentId,\n ParentComponent: ParentComponent\n });\n\n return createStyledComponent(tag, newOptions, rules);\n };\n\n // $FlowFixMe\n Object.defineProperty(WrappedStyledComponent, 'defaultProps', {\n get: function get$$1() {\n return this._foldedDefaultProps;\n },\n set: function set$$1(obj) {\n // $FlowFixMe\n this._foldedDefaultProps = isTargetStyledComp ? merge(target.defaultProps, obj) : obj;\n }\n });\n\n if (process.env.NODE_ENV !== 'production') {\n // $FlowFixMe\n WrappedStyledComponent.warnTooManyClasses = createWarnTooManyClasses(displayName);\n }\n\n // $FlowFixMe\n WrappedStyledComponent.toString = function () {\n return '.' + WrappedStyledComponent.styledComponentId;\n };\n\n if (isClass) {\n hoistNonReactStatics(WrappedStyledComponent, target, {\n // all SC-specific things should not be hoisted\n attrs: true,\n componentStyle: true,\n displayName: true,\n foldedComponentIds: true,\n styledComponentId: true,\n target: true,\n withComponent: true\n });\n }\n\n return WrappedStyledComponent;\n}\n\n// \n// Thanks to ReactDOMFactories for this handy list!\n\nvar domElements = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr',\n\n// SVG\n'circle', 'clipPath', 'defs', 'ellipse', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'marker', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'svg', 'text', 'tspan'];\n\n// \n\nvar styled = function styled(tag) {\n return constructWithOptions(createStyledComponent, tag);\n};\n\n// Shorthands for all valid HTML Elements\ndomElements.forEach(function (domElement) {\n styled[domElement] = styled(domElement);\n});\n\n// \n\nvar GlobalStyle = function () {\n function GlobalStyle(rules, componentId) {\n classCallCheck(this, GlobalStyle);\n\n this.rules = rules;\n this.componentId = componentId;\n this.isStatic = isStaticRules(rules, EMPTY_ARRAY);\n\n if (!StyleSheet.master.hasId(componentId)) {\n StyleSheet.master.deferredInject(componentId, []);\n }\n }\n\n GlobalStyle.prototype.createStyles = function createStyles(executionContext, styleSheet) {\n var flatCSS = flatten(this.rules, executionContext, styleSheet);\n var css = stringifyRules(flatCSS, '');\n\n styleSheet.inject(this.componentId, css);\n };\n\n GlobalStyle.prototype.removeStyles = function removeStyles(styleSheet) {\n var componentId = this.componentId;\n\n if (styleSheet.hasId(componentId)) {\n styleSheet.remove(componentId);\n }\n };\n\n // TODO: overwrite in-place instead of remove+create?\n\n\n GlobalStyle.prototype.renderStyles = function renderStyles(executionContext, styleSheet) {\n this.removeStyles(styleSheet);\n this.createStyles(executionContext, styleSheet);\n };\n\n return GlobalStyle;\n}();\n\n// \n\n// place our cache into shared context so it'll persist between HMRs\nif (IS_BROWSER) {\n window.scCGSHMRCache = {};\n}\n\nfunction createGlobalStyle(strings) {\n for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n interpolations[_key - 1] = arguments[_key];\n }\n\n var rules = css.apply(undefined, [strings].concat(interpolations));\n var id = 'sc-global-' + murmurhash(JSON.stringify(rules));\n var style = new GlobalStyle(rules, id);\n\n var GlobalStyleComponent = function (_React$Component) {\n inherits(GlobalStyleComponent, _React$Component);\n\n function GlobalStyleComponent(props) {\n classCallCheck(this, GlobalStyleComponent);\n\n var _this = possibleConstructorReturn(this, _React$Component.call(this, props));\n\n var _this$constructor = _this.constructor,\n globalStyle = _this$constructor.globalStyle,\n styledComponentId = _this$constructor.styledComponentId;\n\n\n if (IS_BROWSER) {\n window.scCGSHMRCache[styledComponentId] = (window.scCGSHMRCache[styledComponentId] || 0) + 1;\n }\n\n /**\n * This fixes HMR compatibility. Don't ask me why, but this combination of\n * caching the closure variables via statics and then persisting the statics in\n * state works across HMR where no other combination did. ÂŻ\\_(ă„)_/ÂŻ\n */\n _this.state = {\n globalStyle: globalStyle,\n styledComponentId: styledComponentId\n };\n return _this;\n }\n\n GlobalStyleComponent.prototype.componentWillUnmount = function componentWillUnmount() {\n if (window.scCGSHMRCache[this.state.styledComponentId]) {\n window.scCGSHMRCache[this.state.styledComponentId] -= 1;\n }\n /**\n * Depending on the order \"render\" is called this can cause the styles to be lost\n * until the next render pass of the remaining instance, which may\n * not be immediate.\n */\n if (window.scCGSHMRCache[this.state.styledComponentId] === 0) {\n this.state.globalStyle.removeStyles(this.styleSheet);\n }\n };\n\n GlobalStyleComponent.prototype.render = function render() {\n var _this2 = this;\n\n if (process.env.NODE_ENV !== 'production' && React.Children.count(this.props.children)) {\n // eslint-disable-next-line no-console\n console.warn('The global style component ' + this.state.styledComponentId + ' was given child JSX. createGlobalStyle does not render children.');\n }\n\n return React.createElement(\n StyleSheetConsumer,\n null,\n function (styleSheet) {\n _this2.styleSheet = styleSheet || StyleSheet.master;\n\n var globalStyle = _this2.state.globalStyle;\n\n\n if (globalStyle.isStatic) {\n globalStyle.renderStyles(STATIC_EXECUTION_CONTEXT, _this2.styleSheet);\n\n return null;\n } else {\n return React.createElement(\n ThemeConsumer,\n null,\n function (theme) {\n // $FlowFixMe\n var defaultProps = _this2.constructor.defaultProps;\n\n\n var context = _extends({}, _this2.props);\n\n if (typeof theme !== 'undefined') {\n context.theme = determineTheme(_this2.props, theme, defaultProps);\n }\n\n globalStyle.renderStyles(context, _this2.styleSheet);\n\n return null;\n }\n );\n }\n }\n );\n };\n\n return GlobalStyleComponent;\n }(React.Component);\n\n GlobalStyleComponent.globalStyle = style;\n GlobalStyleComponent.styledComponentId = id;\n\n\n return GlobalStyleComponent;\n}\n\n// \n\nvar replaceWhitespace = function replaceWhitespace(str) {\n return str.replace(/\\s|\\\\n/g, '');\n};\n\nfunction keyframes(strings) {\n /* Warning if you've used keyframes on React Native */\n if (process.env.NODE_ENV !== 'production' && typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n // eslint-disable-next-line no-console\n console.warn('`keyframes` cannot be used on ReactNative, only on the web. To do animation in ReactNative please use Animated.');\n }\n\n for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n interpolations[_key - 1] = arguments[_key];\n }\n\n var rules = css.apply(undefined, [strings].concat(interpolations));\n\n var name = generateAlphabeticName(murmurhash(replaceWhitespace(JSON.stringify(rules))));\n\n return new Keyframes(name, stringifyRules(rules, name, '@keyframes'));\n}\n\n// \n\nvar withTheme = (function (Component$$1) {\n var WithTheme = React.forwardRef(function (props, ref) {\n return React.createElement(\n ThemeConsumer,\n null,\n function (theme) {\n // $FlowFixMe\n var defaultProps = Component$$1.defaultProps;\n\n var themeProp = determineTheme(props, theme, defaultProps);\n\n if (process.env.NODE_ENV !== 'production' && themeProp === undefined) {\n // eslint-disable-next-line no-console\n console.warn('[withTheme] You are not using a ThemeProvider nor passing a theme prop or a theme in defaultProps in component class \"' + getComponentName(Component$$1) + '\"');\n }\n\n return React.createElement(Component$$1, _extends({}, props, { theme: themeProp, ref: ref }));\n }\n );\n });\n\n hoistNonReactStatics(WithTheme, Component$$1);\n\n WithTheme.displayName = 'WithTheme(' + getComponentName(Component$$1) + ')';\n\n return WithTheme;\n});\n\n// \n\n/* eslint-disable */\nvar __DO_NOT_USE_OR_YOU_WILL_BE_HAUNTED_BY_SPOOKY_GHOSTS = {\n StyleSheet: StyleSheet\n};\n\n// \n\n/* Warning if you've imported this file on React Native */\nif (process.env.NODE_ENV !== 'production' && typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n // eslint-disable-next-line no-console\n console.warn(\"It looks like you've imported 'styled-components' on React Native.\\n\" + \"Perhaps you're looking to import 'styled-components/native'?\\n\" + 'Read more about this at https://www.styled-components.com/docs/basics#react-native');\n}\n\n/* Warning if there are several instances of styled-components */\nif (process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test' && typeof window !== 'undefined' && typeof navigator !== 'undefined' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Node.js') === -1 && navigator.userAgent.indexOf('jsdom') === -1) {\n window['__styled-components-init__'] = window['__styled-components-init__'] || 0;\n\n if (window['__styled-components-init__'] === 1) {\n // eslint-disable-next-line no-console\n console.warn(\"It looks like there are several instances of 'styled-components' initialized in this application. \" + 'This may cause dynamic styles not rendering properly, errors happening during rehydration process ' + 'and makes your application bigger without a good reason.\\n\\n' + 'See https://s-c.sh/2BAXzed for more info.');\n }\n\n window['__styled-components-init__'] += 1;\n}\n\n//\n\nexport default styled;\nexport { createGlobalStyle, css, isStyledComponent, keyframes, ServerStyleSheet, StyleSheetConsumer, StyleSheetContext, StyleSheetManager, ThemeConsumer, ThemeContext, ThemeProvider, withTheme, __DO_NOT_USE_OR_YOU_WILL_BE_HAUNTED_BY_SPOOKY_GHOSTS };\n//# sourceMappingURL=styled-components.browser.esm.js.map\n","(function (factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? (module['exports'] = factory()) :\n\t\ttypeof define === 'function' && define['amd'] ? define(factory()) :\n\t\t\t(window['stylisRuleSheet'] = factory())\n}(function () {\n\n\t'use strict'\n\n\treturn function (insertRule) {\n\t\tvar delimiter = '/*|*/'\n\t\tvar needle = delimiter+'}'\n\n\t\tfunction toSheet (block) {\n\t\t\tif (block)\n\t\t\t\ttry {\n\t\t\t\t\tinsertRule(block + '}')\n\t\t\t\t} catch (e) {}\n\t\t}\n\n\t\treturn function ruleSheet (context, content, selectors, parents, line, column, length, ns, depth, at) {\n\t\t\tswitch (context) {\n\t\t\t\t// property\n\t\t\t\tcase 1:\n\t\t\t\t\t// @import\n\t\t\t\t\tif (depth === 0 && content.charCodeAt(0) === 64)\n\t\t\t\t\t\treturn insertRule(content+';'), ''\n\t\t\t\t\tbreak\n\t\t\t\t// selector\n\t\t\t\tcase 2:\n\t\t\t\t\tif (ns === 0)\n\t\t\t\t\t\treturn content + delimiter\n\t\t\t\t\tbreak\n\t\t\t\t// at-rule\n\t\t\t\tcase 3:\n\t\t\t\t\tswitch (ns) {\n\t\t\t\t\t\t// @font-face, @page\n\t\t\t\t\t\tcase 102:\n\t\t\t\t\t\tcase 112:\n\t\t\t\t\t\t\treturn insertRule(selectors[0]+content), ''\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn content + (at === 0 ? delimiter : '')\n\t\t\t\t\t}\n\t\t\t\tcase -2:\n\t\t\t\t\tcontent.split(needle).forEach(toSheet)\n\t\t\t}\n\t\t}\n\t}\n}))\n","!function(e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e(null):\"function\"==typeof define&&define.amd?define(e(null)):window.stylis=e(null)}(function e(a){\"use strict\";var r=/^\\0+/g,c=/[\\0\\r\\f]/g,s=/: */g,t=/zoo|gra/,i=/([,: ])(transform)/g,f=/,+\\s*(?![^(]*[)])/g,n=/ +\\s*(?![^(]*[)])/g,l=/ *[\\0] */g,o=/,\\r+?/g,h=/([\\t\\r\\n ])*\\f?&/g,u=/:global\\(((?:[^\\(\\)\\[\\]]*|\\[.*\\]|\\([^\\(\\)]*\\))*)\\)/g,d=/\\W+/g,b=/@(k\\w+)\\s*(\\S*)\\s*/,p=/::(place)/g,k=/:(read-only)/g,g=/\\s+(?=[{\\];=:>])/g,A=/([[}=:>])\\s+/g,C=/(\\{[^{]+?);(?=\\})/g,w=/\\s{2,}/g,v=/([^\\(])(:+) */g,m=/[svh]\\w+-[tblr]{2}/,x=/\\(\\s*(.*)\\s*\\)/g,$=/([\\s\\S]*?);/g,y=/-self|flex-/g,O=/[^]*?(:[rp][el]a[\\w-]+)[^]*/,j=/stretch|:\\s*\\w+\\-(?:conte|avail)/,z=/([^-])(image-set\\()/,N=\"-webkit-\",S=\"-moz-\",F=\"-ms-\",W=59,q=125,B=123,D=40,E=41,G=91,H=93,I=10,J=13,K=9,L=64,M=32,P=38,Q=45,R=95,T=42,U=44,V=58,X=39,Y=34,Z=47,_=62,ee=43,ae=126,re=0,ce=12,se=11,te=107,ie=109,fe=115,ne=112,le=111,oe=105,he=99,ue=100,de=112,be=1,pe=1,ke=0,ge=1,Ae=1,Ce=1,we=0,ve=0,me=0,xe=[],$e=[],ye=0,Oe=null,je=-2,ze=-1,Ne=0,Se=1,Fe=2,We=3,qe=0,Be=1,De=\"\",Ee=\"\",Ge=\"\";function He(e,a,s,t,i){for(var f,n,o=0,h=0,u=0,d=0,g=0,A=0,C=0,w=0,m=0,$=0,y=0,O=0,j=0,z=0,R=0,we=0,$e=0,Oe=0,je=0,ze=s.length,Je=ze-1,Re=\"\",Te=\"\",Ue=\"\",Ve=\"\",Xe=\"\",Ye=\"\";R0)Te=Te.replace(c,\"\");if(Te.trim().length>0){switch(C){case M:case K:case W:case J:case I:break;default:Te+=s.charAt(R)}C=W}}if(1===$e)switch(C){case B:case q:case W:case Y:case X:case D:case E:case U:$e=0;case K:case J:case I:case M:break;default:for($e=0,je=R,g=C,R--,C=W;je0)++R,C=g;case B:je=ze}}switch(C){case B:for(g=(Te=Te.trim()).charCodeAt(0),y=1,je=++R;R0)Te=Te.replace(c,\"\");switch(A=Te.charCodeAt(1)){case ue:case ie:case fe:case Q:f=a;break;default:f=xe}if(je=(Ue=He(a,f,Ue,A,i+1)).length,me>0&&0===je)je=Te.length;if(ye>0)if(f=Ie(xe,Te,Oe),n=Pe(We,Ue,f,a,pe,be,je,A,i,t),Te=f.join(\"\"),void 0!==n)if(0===(je=(Ue=n.trim()).length))A=0,Ue=\"\";if(je>0)switch(A){case fe:Te=Te.replace(x,Me);case ue:case ie:case Q:Ue=Te+\"{\"+Ue+\"}\";break;case te:if(Ue=(Te=Te.replace(b,\"$1 $2\"+(Be>0?De:\"\")))+\"{\"+Ue+\"}\",1===Ae||2===Ae&&Le(\"@\"+Ue,3))Ue=\"@\"+N+Ue+\"@\"+Ue;else Ue=\"@\"+Ue;break;default:if(Ue=Te+Ue,t===de)Ve+=Ue,Ue=\"\"}else Ue=\"\";break;default:Ue=He(a,Ie(a,Te,Oe),Ue,t,i+1)}Xe+=Ue,O=0,$e=0,z=0,we=0,Oe=0,j=0,Te=\"\",Ue=\"\",C=s.charCodeAt(++R);break;case q:case W:if((je=(Te=(we>0?Te.replace(c,\"\"):Te).trim()).length)>1){if(0===z)if((g=Te.charCodeAt(0))===Q||g>96&&g<123)je=(Te=Te.replace(\" \",\":\")).length;if(ye>0)if(void 0!==(n=Pe(Se,Te,a,e,pe,be,Ve.length,t,i,t)))if(0===(je=(Te=n.trim()).length))Te=\"\\0\\0\";switch(g=Te.charCodeAt(0),A=Te.charCodeAt(1),g){case re:break;case L:if(A===oe||A===he){Ye+=Te+s.charAt(R);break}default:if(Te.charCodeAt(je-1)===V)break;Ve+=Ke(Te,g,A,Te.charCodeAt(2))}}O=0,$e=0,z=0,we=0,Oe=0,Te=\"\",C=s.charCodeAt(++R)}}switch(C){case J:case I:if(h+d+u+o+ve===0)switch($){case E:case X:case Y:case L:case ae:case _:case T:case ee:case Z:case Q:case V:case U:case W:case B:case q:break;default:if(z>0)$e=1}if(h===Z)h=0;else if(ge+O===0&&t!==te&&Te.length>0)we=1,Te+=\"\\0\";if(ye*qe>0)Pe(Ne,Te,a,e,pe,be,Ve.length,t,i,t);be=1,pe++;break;case W:case q:if(h+d+u+o===0){be++;break}default:switch(be++,Re=s.charAt(R),C){case K:case M:if(d+o+h===0)switch(w){case U:case V:case K:case M:Re=\"\";break;default:if(C!==M)Re=\" \"}break;case re:Re=\"\\\\0\";break;case ce:Re=\"\\\\f\";break;case se:Re=\"\\\\v\";break;case P:if(d+h+o===0&&ge>0)Oe=1,we=1,Re=\"\\f\"+Re;break;case 108:if(d+h+o+ke===0&&z>0)switch(R-z){case 2:if(w===ne&&s.charCodeAt(R-3)===V)ke=w;case 8:if(m===le)ke=m}break;case V:if(d+h+o===0)z=R;break;case U:if(h+u+d+o===0)we=1,Re+=\"\\r\";break;case Y:case X:if(0===h)d=d===C?0:0===d?C:d;break;case G:if(d+h+u===0)o++;break;case H:if(d+h+u===0)o--;break;case E:if(d+h+o===0)u--;break;case D:if(d+h+o===0){if(0===O)switch(2*w+3*m){case 533:break;default:y=0,O=1}u++}break;case L:if(h+u+d+o+z+j===0)j=1;break;case T:case Z:if(d+o+u>0)break;switch(h){case 0:switch(2*C+3*s.charCodeAt(R+1)){case 235:h=Z;break;case 220:je=R,h=T}break;case T:if(C===Z&&w===T&&je+2!==R){if(33===s.charCodeAt(je+2))Ve+=s.substring(je,R+1);Re=\"\",h=0}}}if(0===h){if(ge+d+o+j===0&&t!==te&&C!==W)switch(C){case U:case ae:case _:case ee:case E:case D:if(0===O){switch(w){case K:case M:case I:case J:Re+=\"\\0\";break;default:Re=\"\\0\"+Re+(C===U?\"\":\"\\0\")}we=1}else switch(C){case D:if(z+7===R&&108===w)z=0;O=++y;break;case E:if(0==(O=--y))we=1,Re+=\"\\0\"}break;case K:case M:switch(w){case re:case B:case q:case W:case U:case ce:case K:case M:case I:case J:break;default:if(0===O)we=1,Re+=\"\\0\"}}if(Te+=Re,C!==M&&C!==K)$=C}}m=w,w=C,R++}if(je=Ve.length,me>0)if(0===je&&0===Xe.length&&0===a[0].length==false)if(t!==ie||1===a.length&&(ge>0?Ee:Ge)===a[0])je=a.join(\",\").length+2;if(je>0){if(f=0===ge&&t!==te?function(e){for(var a,r,s=0,t=e.length,i=Array(t);s1)continue;if(u=n.charCodeAt(n.length-1),d=r.charCodeAt(0),a=\"\",0!==o)switch(u){case T:case ae:case _:case ee:case M:case D:break;default:a=\" \"}switch(d){case P:r=a+Ee;case ae:case _:case ee:case M:case E:case D:break;case G:r=a+r+Ee;break;case V:switch(2*r.charCodeAt(1)+3*r.charCodeAt(2)){case 530:if(Ce>0){r=a+r.substring(8,h-1);break}default:if(o<1||f[o-1].length<1)r=a+Ee+r}break;case U:a=\"\";default:if(h>1&&r.indexOf(\":\")>0)r=a+r.replace(v,\"$1\"+Ee+\"$2\");else r=a+r+Ee}n+=r}i[s]=n.replace(c,\"\").trim()}return i}(a):a,ye>0)if(void 0!==(n=Pe(Fe,Ve,f,e,pe,be,je,t,i,t))&&0===(Ve=n).length)return Ye+Ve+Xe;if(Ve=f.join(\",\")+\"{\"+Ve+\"}\",Ae*ke!=0){if(2===Ae&&!Le(Ve,2))ke=0;switch(ke){case le:Ve=Ve.replace(k,\":\"+S+\"$1\")+Ve;break;case ne:Ve=Ve.replace(p,\"::\"+N+\"input-$1\")+Ve.replace(p,\"::\"+S+\"$1\")+Ve.replace(p,\":\"+F+\"input-$1\")+Ve}ke=0}}return Ye+Ve+Xe}function Ie(e,a,r){var c=a.trim().split(o),s=c,t=c.length,i=e.length;switch(i){case 0:case 1:for(var f=0,n=0===i?\"\":e[0]+\" \";f0&&ge>0)return s.replace(u,\"$1\").replace(h,\"$1\"+Ge);break;default:return e.trim()+s.replace(h,\"$1\"+e.trim())}default:if(r*ge>0&&s.indexOf(\"\\f\")>0)return s.replace(h,(e.charCodeAt(0)===V?\"\":\"$1\")+e.trim())}return e+s}function Ke(e,a,r,c){var l,o=0,h=e+\";\",u=2*a+3*r+4*c;if(944===u)return function(e){var a=e.length,r=e.indexOf(\":\",9)+1,c=e.substring(0,r).trim(),s=e.substring(r,a-1).trim();switch(e.charCodeAt(9)*Be){case 0:break;case Q:if(110!==e.charCodeAt(10))break;default:for(var t=s.split((s=\"\",f)),i=0,r=0,a=t.length;iL&&h<90||h>96&&h<123||h===R||h===Q&&l.charCodeAt(1)!==Q))switch(isNaN(parseFloat(l))+(-1!==l.indexOf(\"(\"))){case 1:switch(l){case\"infinite\":case\"alternate\":case\"backwards\":case\"running\":case\"normal\":case\"forwards\":case\"both\":case\"none\":case\"linear\":case\"ease\":case\"ease-in\":case\"ease-out\":case\"ease-in-out\":case\"paused\":case\"reverse\":case\"alternate-reverse\":case\"inherit\":case\"initial\":case\"unset\":case\"step-start\":case\"step-end\":break;default:l+=De}}o[r++]=l}s+=(0===i?\"\":\",\")+o.join(\" \")}}if(s=c+s+\";\",1===Ae||2===Ae&&Le(s,1))return N+s+s;return s}(h);else if(0===Ae||2===Ae&&!Le(h,1))return h;switch(u){case 1015:return 97===h.charCodeAt(10)?N+h+h:h;case 951:return 116===h.charCodeAt(3)?N+h+h:h;case 963:return 110===h.charCodeAt(5)?N+h+h:h;case 1009:if(100!==h.charCodeAt(4))break;case 969:case 942:return N+h+h;case 978:return N+h+S+h+h;case 1019:case 983:return N+h+S+h+F+h+h;case 883:if(h.charCodeAt(8)===Q)return N+h+h;if(h.indexOf(\"image-set(\",11)>0)return h.replace(z,\"$1\"+N+\"$2\")+h;return h;case 932:if(h.charCodeAt(4)===Q)switch(h.charCodeAt(5)){case 103:return N+\"box-\"+h.replace(\"-grow\",\"\")+N+h+F+h.replace(\"grow\",\"positive\")+h;case 115:return N+h+F+h.replace(\"shrink\",\"negative\")+h;case 98:return N+h+F+h.replace(\"basis\",\"preferred-size\")+h}return N+h+F+h+h;case 964:return N+h+F+\"flex-\"+h+h;case 1023:if(99!==h.charCodeAt(8))break;return l=h.substring(h.indexOf(\":\",15)).replace(\"flex-\",\"\").replace(\"space-between\",\"justify\"),N+\"box-pack\"+l+N+h+F+\"flex-pack\"+l+h;case 1005:return t.test(h)?h.replace(s,\":\"+N)+h.replace(s,\":\"+S)+h:h;case 1e3:switch(o=(l=h.substring(13).trim()).indexOf(\"-\")+1,l.charCodeAt(0)+l.charCodeAt(o)){case 226:l=h.replace(m,\"tb\");break;case 232:l=h.replace(m,\"tb-rl\");break;case 220:l=h.replace(m,\"lr\");break;default:return h}return N+h+F+l+h;case 1017:if(-1===h.indexOf(\"sticky\",9))return h;case 975:switch(o=(h=e).length-10,u=(l=(33===h.charCodeAt(o)?h.substring(0,o):h).substring(e.indexOf(\":\",7)+1).trim()).charCodeAt(0)+(0|l.charCodeAt(7))){case 203:if(l.charCodeAt(8)<111)break;case 115:h=h.replace(l,N+l)+\";\"+h;break;case 207:case 102:h=h.replace(l,N+(u>102?\"inline-\":\"\")+\"box\")+\";\"+h.replace(l,N+l)+\";\"+h.replace(l,F+l+\"box\")+\";\"+h}return h+\";\";case 938:if(h.charCodeAt(5)===Q)switch(h.charCodeAt(6)){case 105:return l=h.replace(\"-items\",\"\"),N+h+N+\"box-\"+l+F+\"flex-\"+l+h;case 115:return N+h+F+\"flex-item-\"+h.replace(y,\"\")+h;default:return N+h+F+\"flex-line-pack\"+h.replace(\"align-content\",\"\").replace(y,\"\")+h}break;case 973:case 989:if(h.charCodeAt(3)!==Q||122===h.charCodeAt(4))break;case 931:case 953:if(true===j.test(e))if(115===(l=e.substring(e.indexOf(\":\")+1)).charCodeAt(0))return Ke(e.replace(\"stretch\",\"fill-available\"),a,r,c).replace(\":fill-available\",\":stretch\");else return h.replace(l,N+l)+h.replace(l,S+l.replace(\"fill-\",\"\"))+h;break;case 962:if(h=N+h+(102===h.charCodeAt(5)?F+h:\"\")+h,r+c===211&&105===h.charCodeAt(13)&&h.indexOf(\"transform\",10)>0)return h.substring(0,h.indexOf(\";\",27)+1).replace(i,\"$1\"+N+\"$2\")+h}return h}function Le(e,a){var r=e.indexOf(1===a?\":\":\"{\"),c=e.substring(0,3!==a?r:10),s=e.substring(r+1,e.length-1);return Oe(2!==a?c:c.replace(O,\"$1\"),s,a)}function Me(e,a){var r=Ke(a,a.charCodeAt(0),a.charCodeAt(1),a.charCodeAt(2));return r!==a+\";\"?r.replace($,\" or ($1)\").substring(4):\"(\"+a+\")\"}function Pe(e,a,r,c,s,t,i,f,n,l){for(var o,h=0,u=a;h0)De=s.replace(d,t===G?\"\":\"-\");if(t=1,1===ge)Ge=s;else Ee=s;var i,f=[Ge];if(ye>0)if(void 0!==(i=Pe(ze,r,f,f,pe,be,0,0,0,0))&&\"string\"==typeof i)r=i;var n=He(xe,f,r,0,0);if(ye>0)if(void 0!==(i=Pe(je,n,f,f,pe,be,n.length,0,0,0))&&\"string\"!=typeof(n=i))t=0;return De=\"\",Ge=\"\",Ee=\"\",ke=0,pe=1,be=1,we*t==0?n:n.replace(c,\"\").replace(g,\"\").replace(A,\"$1\").replace(C,\"$1\").replace(w,\" \")}if(Te.use=function e(a){switch(a){case void 0:case null:ye=$e.length=0;break;default:if(\"function\"==typeof a)$e[ye++]=a;else if(\"object\"==typeof a)for(var r=0,c=a.length;r ch.toUpperCase() === ch;\nvar filterKey = (keys) => (key) => keys.indexOf(key) === -1;\nvar omit = (obj, keys) => {\n const res = {};\n Object.keys(obj).filter(filterKey(keys)).forEach((key) => {\n res[key] = obj[key];\n });\n return res;\n};\nfunction filterProps(asIs, props, omitKeys) {\n const filteredProps = omit(props, omitKeys);\n if (!asIs) {\n const interopValidAttr = typeof validAttr === \"function\" ? { default: validAttr } : validAttr;\n Object.keys(filteredProps).forEach((key) => {\n if (!interopValidAttr.default(key)) {\n delete filteredProps[key];\n }\n });\n }\n return filteredProps;\n}\nvar warnIfInvalid = (value, componentName) => {\n if (process.env.NODE_ENV !== \"production\") {\n if (typeof value === \"string\" || typeof value === \"number\" && isFinite(value)) {\n return;\n }\n const stringified = typeof value === \"object\" ? JSON.stringify(value) : String(value);\n console.warn(\n `An interpolation evaluated to '${stringified}' in the component '${componentName}', which is probably a mistake. You should explicitly cast or transform the value to a string.`\n );\n }\n};\nfunction styled(tag) {\n return (options) => {\n if (process.env.NODE_ENV !== \"production\") {\n if (Array.isArray(options)) {\n throw new Error(\n 'Using the \"styled\" tag in runtime is not supported. Make sure you have set up the Babel plugin correctly. See https://github.com/callstack/linaria#setup'\n );\n }\n }\n const render = (props, ref) => {\n const { as: component = tag, class: className } = props;\n const shouldKeepProps = options.propsAsIs === void 0 ? !(typeof component === \"string\" && component.indexOf(\"-\") === -1 && !isCapital(component[0])) : options.propsAsIs;\n const filteredProps = filterProps(shouldKeepProps, props, [\n \"as\",\n \"class\"\n ]);\n filteredProps.ref = ref;\n filteredProps.className = options.atomic ? cx(options.class, filteredProps.className || className) : cx(filteredProps.className || className, options.class);\n const { vars } = options;\n if (vars) {\n const style = {};\n for (const name in vars) {\n const variable = vars[name];\n const result = variable[0];\n const unit = variable[1] || \"\";\n const value = typeof result === \"function\" ? result(props) : result;\n warnIfInvalid(value, options.name);\n style[`--${name}`] = `${value}${unit}`;\n }\n const ownStyle = filteredProps.style || {};\n const keys = Object.keys(ownStyle);\n if (keys.length > 0) {\n keys.forEach((key) => {\n style[key] = ownStyle[key];\n });\n }\n filteredProps.style = style;\n }\n if (tag.__linaria && tag !== component) {\n filteredProps.as = component;\n return React.createElement(tag, filteredProps);\n }\n return React.createElement(component, filteredProps);\n };\n const Result = React.forwardRef ? React.forwardRef(render) : (props) => {\n const rest = omit(props, [\"innerRef\"]);\n return render(rest, props.innerRef);\n };\n Result.displayName = options.name;\n Result.__linaria = {\n className: options.class,\n extends: tag\n };\n return Result;\n };\n}\nvar styled_default = process.env.NODE_ENV !== \"production\" ? new Proxy(styled, {\n get(o, prop) {\n return o(prop);\n }\n}) : styled;\nexport {\n styled_default as styled\n};\n//# sourceMappingURL=index.mjs.map","// src/css.ts\nvar css = () => {\n throw new Error(\n 'Using the \"css\" tag in runtime is not supported. Make sure you have set up the Babel plugin correctly.'\n );\n};\nvar css_default = css;\n\n// src/cx.ts\nvar cx = function cx2() {\n const presentClassNames = Array.prototype.slice.call(arguments).filter(Boolean);\n const atomicClasses = {};\n const nonAtomicClasses = [];\n presentClassNames.forEach((arg) => {\n const individualClassNames = arg ? arg.split(\" \") : [];\n individualClassNames.forEach((className) => {\n if (className.startsWith(\"atm_\")) {\n const [, keyHash] = className.split(\"_\");\n atomicClasses[keyHash] = className;\n } else {\n nonAtomicClasses.push(className);\n }\n });\n });\n const result = [];\n for (const keyHash in atomicClasses) {\n if (Object.prototype.hasOwnProperty.call(atomicClasses, keyHash)) {\n result.push(atomicClasses[keyHash]);\n }\n }\n result.push(...nonAtomicClasses);\n return result.join(\" \");\n};\nvar cx_default = cx;\nexport {\n css_default as css,\n cx_default as cx\n};\n//# sourceMappingURL=index.mjs.map","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","import registerFormBlock from '../gutenberg/FormBlock/registerFormBlock';\nimport { registerHubspotSidebar } from '../gutenberg/Sidebar/contentType';\nimport registerMeetingBlock from '../gutenberg/MeetingsBlock/registerMeetingBlock';\nimport { initBackgroundApp } from '../utils/backgroundAppUtils';\ninitBackgroundApp([\n registerFormBlock,\n registerMeetingBlock,\n registerHubspotSidebar,\n]);\n"],"names":["__","REGISTRATION_FORM","CONTACT_US_FORM","NEWSLETTER_FORM","SUPPORT_FORM","EVENT_FORM","DEFAULT_OPTIONS","label","options","value","isDefaultForm","window","leadinConfig","accountName","adminUrl","activationTime","connectionStatus","deviceId","didDisconnect","env","formsScript","meetingsScript","formsScriptPayload","hublet","hubspotBaseUrl","hubspotNonce","iframeUrl","impactLink","lastAuthorizeTime","lastDeauthorizeTime","lastDisconnectTime","leadinPluginVersion","leadinQueryParams","locale","loginUrl","phpVersion","pluginPath","plugins","portalDomain","portalEmail","portalId","redirectNonce","restNonce","restUrl","refreshToken","reviewSkippedDate","theme","trackConsent","wpVersion","contentEmbed","requiresContentEmbedScope","refreshTokenError","jsx","_jsx","jsxs","_jsxs","CalendarIcon","width","height","viewBox","fill","xmlns","children","clipPath","fillRule","clipRule","d","id","SidebarSprocketIcon","version","xmlnsXlink","SprocketIcon","points","stroke","strokeWidth","xlinkHref","mask","RawHTML","FormSaveBlock","attributes","formId","className","Fragment","UIImage","FormGutenbergPreview","alt","src","WpBlocksApi","FormBlockSave","ErrorHandler","FormEdit","ConnectionStatus","isFullSiteEditor","registerFormBlock","editComponent","props","preview","Connected","origin","status","registerBlockType","title","description","icon","category","type","formName","example","edit","save","MeetingGutenbergPreview","MeetingSaveBlock","url","MeetingEdit","NotConnected","registerMeetingBlock","WpPluginsLib","PluginSidebar","PanelBody","Icon","withSelect","UISidebarSelectControl","styled","BackgroudAppContext","getOrCreateBackgroundApp","registerHubspotSidebar","ContentTypeLabelStyle","div","ContentTypeLabel","LeadinPluginSidebar","postType","name","initialOpen","Provider","metaKey","LeadinPluginSidebarWrapper","select","data","getCurrentPostType","getEditedPostAttribute","registerPlugin","render","_exp","_exp2","propsAsIs","vars","SelectControl","withMetaData","useBackgroundAppContext","usePostBackgroundMessage","ProxyMessages","isBackgroundAppReady","monitorSidebarMetaChange","metaValue","onChange","content","setMetaValue","key","TrackSidebarMetaChange","payload","CoreMessages","HandshakeReceive","SendRefreshToken","ReloadParentFrame","RedirectParentFrame","SendLocale","SendDeviceId","SendIntegratedAppConfig","FormMessages","CreateFormAppNavigation","LiveChatMessages","CreateLiveChatAppNavigation","PluginMessages","PluginSettingsNavigation","PluginLeadinConfig","TrackConsent","InternalTrackingFetchRequest","InternalTrackingFetchResponse","InternalTrackingFetchError","InternalTrackingChangeRequest","InternalTrackingChangeError","BusinessUnitFetchRequest","BusinessUnitFetchResponse","BusinessUnitFetchError","BusinessUnitChangeRequest","BusinessUnitChangeError","SkipReviewRequest","SkipReviewResponse","SkipReviewError","RemoveParentQueryParam","ContentEmbedInstallRequest","ContentEmbedInstallResponse","ContentEmbedInstallError","ContentEmbedActivationRequest","ContentEmbedActivationResponse","ContentEmbedActivationError","FetchForms","FetchForm","CreateFormFromTemplate","FetchAuth","FetchMeetingsAndUsers","FetchContactsCreateSinceActivation","FetchOrCreateMeetingUser","ConnectMeetingsCalendar","TrackFormPreviewRender","TrackFormCreatedFromTemplate","TrackFormCreationFailed","TrackMeetingPreviewRender","TrackReviewBannerRender","TrackReviewBannerInteraction","TrackReviewBannerDismissed","TrackPluginDeactivation","createContext","useContext","app","message","postMessage","usePostAsyncBackgroundMessage","postAsyncMessage","Raven","configureRaven","indexOf","config","instrument","tryCatch","release","install","setTagsContext","v","php","wordpress","setExtraContext","hub","Object","keys","map","join","useRef","useState","useEffect","CALYPSO_LIGHT","CALYPSO_MEDIUM","UISpinner","LoadState","Container","focused","_exp3","ControlContainer","ValueContainer","Placeholder","SingleValue","IndicatorContainer","DropdownIndicator","InputContainer","Input","InputShadow","MenuContainer","MenuList","MenuGroup","MenuGroupHeader","_exp5","selected","_exp6","_exp7","MenuItem","AsyncSelect","placeholder","loadOptions","defaultOptions","inputEl","inputShadowEl","isFocused","setFocus","NotLoaded","loadState","setLoadState","localValue","setLocalValue","setOptions","inputSize","current","clientWidth","result","Idle","renderItems","items","parentKey","item","index","undefined","onClick","blur","focus","ref","onFocus","e","target","Loading","UIButton","UIContainer","HubspotWrapper","redirectToPlugin","location","href","resetErrorState","errorInfo","header","action","isUnauthorized","errorHeader","errorMessage","textAlign","padding","LoadingBlock","size","UISpacer","PreviewForm","FormSelect","isSelected","setAttributes","formSelected","monitorFormPreviewRender","handleChange","selectedForm","FormEditContainer","FormSelector","useForms","useCreateFormFromTemplate","search","formApiError","reset","createFormByTemplate","createReset","isCreating","hasError","createApiError","handleLocalChange","option","then","guid","UIOverlay","useFormScript","ready","innerHTML","embedScript","document","createElement","appendChild","proxy","track","setFormApiError","form","err","Failed","debounce","callback","forms","error","trailing","$","promise","loadFormsScript","Promise","resolve","reject","getScript","done","fail","setReady","captureException","MeetingSelector","MeetingWarning","useMeetings","useSelectedMeeting","useSelectedMeetingCalendar","MeetingController","meetings","mappedMeetings","loading","reload","connectCalendar","selectedMeetingOption","selectedMeetingCalendar","length","handleConnectCalendar","captureMessage","extra","onConnectCalendar","PreviewMeeting","newUrl","MeetingsEditContainer","optionsWrapper","UIAlert","CURRENT_USER_CALENDAR_MISSING","isMeetingOwner","titleText","titleMessage","use","useMeetingsScript","container","dataset","classList","add","OTHER_USER_CALENDAR_MISSING","user","useCurrentUserFetch","setError","createUser","loadUserState","useCallback","useMeetingsFetch","getDefaultMeetingName","meeting","currentUser","meetingUsers","meetingsUserIds","meetingOwnerId","userProfile","fullName","hasCalendarObject","meetingsUserBlob","calendarSettings","email","meetingsError","loadMeetingsState","reloadMeetings","userError","reloadUser","meet","link","find","mappedMeetingUsersId","reduce","p","c","includes","some","Loaded","meetingLinks","loadMeetingsScript","AlertContainer","Title","Message","MessageContainer","HEFFALUMP","LORAX","CALYPSO","SpinnerOuter","SpinnerInner","color","Circle","AnimatedCircle","cx","cy","r","OLAF","MARIGOLD_LIGHT","MARIGOLD_MEDIUM","OBSIDIAN","initApp","initFn","context","initAppOnReady","main","initBackgroundApp","Array","isArray","forEach","LeadinBackgroundApp","IntegratedAppEmbedder","IntegratedAppOptions","setLocale","setDeviceId","setRefreshToken","embedder","attachTo","body","postStartAppMessage","withDispatch","applyWithSelect","applyWithDispatch","dispatch","editPost","meta","apply","el"],"sourceRoot":""} \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/leadin.asset.php b/wp/wp-content/plugins/leadin/build/leadin.asset.php deleted file mode 100644 index 1879b041..00000000 --- a/wp/wp-content/plugins/leadin/build/leadin.asset.php +++ /dev/null @@ -1 +0,0 @@ - array('jquery', 'react', 'react-dom', 'wp-i18n'), 'version' => '3066777b85dc065d6093'); diff --git a/wp/wp-content/plugins/leadin/build/leadin.css b/wp/wp-content/plugins/leadin/build/leadin.css deleted file mode 100644 index dd7babe6..00000000 --- a/wp/wp-content/plugins/leadin/build/leadin.css +++ /dev/null @@ -1,8 +0,0 @@ -/*!********************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/iframe/IframeErrorPage.tsx ***! - \********************************************************************************************************************************************************************/ -.i1jit3y0{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-top:120px;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-weight:400;font-size:14px;font-size:0.875rem;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;line-height:1.5rem;} -.e12lu7tb{text-shadow:0 0 1px transparent;margin-bottom:1.25rem;color:#33475b;font-size:1.25rem;} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL2lmcmFtZS9JZnJhbWVFcnJvclBhZ2UudHN4Il0sIm5hbWVzIjpbIi5pMWppdDN5MCIsIi5lMTJsdTd0YiJdLCJtYXBwaW5ncyI6IkFBRzZCQTtBQWVUQyIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9pZnJhbWUvSWZyYW1lRXJyb3JQYWdlLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ0B3b3JkcHJlc3MvaTE4bic7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbGluYXJpYS9yZWFjdCc7XG5jb25zdCBJZnJhbWVFcnJvckNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgbWFyZ2luLXRvcDogMTIwcHg7XG4gIGZvbnQtZmFtaWx5OiAnTGV4ZW5kIERlY2EnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXdlaWdodDogNDAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xuICBmb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG5gO1xuY29uc3QgRXJyb3JIZWFkZXIgPSBzdHlsZWQuaDEgYFxuICB0ZXh0LXNoYWRvdzogMCAwIDFweCB0cmFuc3BhcmVudDtcbiAgbWFyZ2luLWJvdHRvbTogMS4yNXJlbTtcbiAgY29sb3I6ICMzMzQ3NWI7XG4gIGZvbnQtc2l6ZTogMS4yNXJlbTtcbmA7XG5leHBvcnQgY29uc3QgSWZyYW1lRXJyb3JQYWdlID0gKCkgPT4gKF9qc3hzKElmcmFtZUVycm9yQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeChcImltZ1wiLCB7IGFsdDogXCJDYW5ub3QgZmluZCBwYWdlXCIsIHdpZHRoOiBcIjE3NVwiLCBzcmM6IFwiLy9zdGF0aWMuaHNhcHBzdGF0aWMubmV0L3VpLWltYWdlcy9zdGF0aWMtMS4xNC9vcHRpbWl6ZWQvZXJyb3JzL21hcC5zdmdcIiB9KSwgX2pzeChFcnJvckhlYWRlciwgeyBjaGlsZHJlbjogX18oJ1RoZSBIdWJTcG90IGZvciBXb3JkUHJlc3MgcGx1Z2luIGlzIG5vdCBhYmxlIHRvIGxvYWQgcGFnZXMnLCAnbGVhZGluJykgfSksIF9qc3goXCJwXCIsIHsgY2hpbGRyZW46IF9fKCdUcnkgZGlzYWJsaW5nIHlvdXIgYnJvd3NlciBleHRlbnNpb25zIGFuZCBhZCBibG9ja2VycywgdGhlbiByZWZyZXNoIHRoZSBwYWdlJywgJ2xlYWRpbicpIH0pLCBfanN4KFwicFwiLCB7IGNoaWxkcmVuOiBfXygnT3Igb3BlbiB0aGUgSHViU3BvdCBmb3IgV29yZFByZXNzIHBsdWdpbiBpbiBhIGRpZmZlcmVudCBicm93c2VyJywgJ2xlYWRpbicpIH0pXSB9KSk7XG4iXX0=*/ - -/*# sourceMappingURL=leadin.css.map*/ \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/leadin.css.map b/wp/wp-content/plugins/leadin/build/leadin.css.map deleted file mode 100644 index 9201435b..00000000 --- a/wp/wp-content/plugins/leadin/build/leadin.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"leadin.css","mappings":";;;AAG6BA,UAAAA,mBAAAA,CAAAA,oBAAAA,CAAAA,mBAAAA,CAAAA,YAAAA,CAAAA,6BAAAA,CAAAA,yBAAAA,CAAAA,qBAAAA,CAAAA,0BAAAA,CAAAA,wBAAAA,CAAAA,qBAAAA,CAAAA,kBAAAA,CAAAA,uBAAAA,CAAAA,8BAAAA,CAAAA,oBAAAA,CAAAA,sBAAAA,CAAAA,gBAAAA,CAAAA,oDAAAA,CAAAA,eAAAA,CAAAA,cAAAA,CAAAA,kBAAAA,CAAAA,kCAAAA,CAAAA,iCAAAA,CAAAA,0BAAAA,CAAAA,kBAAAA,CAAAA;AAeTC,UAAAA,+BAAAA,CAAAA,qBAAAA,CAAAA,aAAAA,CAAAA,iBAAAA,CAAAA;AChBpB,2oEAA2oE,C","sources":["webpack://leadin/./scripts/iframe/IframeErrorPage.tsx","webpack://leadin/./scripts/iframe/IframeErrorPage.tsx"],"sourcesContent":["import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { __ } from '@wordpress/i18n';\nimport { styled } from '@linaria/react';\nconst IframeErrorContainer = styled.div `\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n margin-top: 120px;\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-weight: 400;\n font-size: 14px;\n font-size: 0.875rem;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-smoothing: antialiased;\n line-height: 1.5rem;\n`;\nconst ErrorHeader = styled.h1 `\n text-shadow: 0 0 1px transparent;\n margin-bottom: 1.25rem;\n color: #33475b;\n font-size: 1.25rem;\n`;\nexport const IframeErrorPage = () => (_jsxs(IframeErrorContainer, { children: [_jsx(\"img\", { alt: \"Cannot find page\", width: \"175\", src: \"//static.hsappstatic.net/ui-images/static-1.14/optimized/errors/map.svg\" }), _jsx(ErrorHeader, { children: __('The HubSpot for WordPress plugin is not able to load pages', 'leadin') }), _jsx(\"p\", { children: __('Try disabling your browser extensions and ad blockers, then refresh the page', 'leadin') }), _jsx(\"p\", { children: __('Or open the HubSpot for WordPress plugin in a different browser', 'leadin') })] }));\n",".i1jit3y0{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-top:120px;font-family:'Lexend Deca',Helvetica,Arial,sans-serif;font-weight:400;font-size:14px;font-size:0.875rem;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;line-height:1.5rem;}\n.e12lu7tb{text-shadow:0 0 1px transparent;margin-bottom:1.25rem;color:#33475b;font-size:1.25rem;}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3Ivc2hhcmUvaHVic3BvdC9idWlsZC93b3Jrc3BhY2UvTGVhZGluV29yZFByZXNzUGx1Z2luL2xlYWRpbi9zY3JpcHRzL2lmcmFtZS9JZnJhbWVFcnJvclBhZ2UudHN4Il0sIm5hbWVzIjpbIi5pMWppdDN5MCIsIi5lMTJsdTd0YiJdLCJtYXBwaW5ncyI6IkFBRzZCQTtBQWVUQyIsImZpbGUiOiIvdXNyL3NoYXJlL2h1YnNwb3QvYnVpbGQvd29ya3NwYWNlL0xlYWRpbldvcmRQcmVzc1BsdWdpbi9sZWFkaW4vc2NyaXB0cy9pZnJhbWUvSWZyYW1lRXJyb3JQYWdlLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBfXyB9IGZyb20gJ0B3b3JkcHJlc3MvaTE4bic7XG5pbXBvcnQgeyBzdHlsZWQgfSBmcm9tICdAbGluYXJpYS9yZWFjdCc7XG5jb25zdCBJZnJhbWVFcnJvckNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgbWFyZ2luLXRvcDogMTIwcHg7XG4gIGZvbnQtZmFtaWx5OiAnTGV4ZW5kIERlY2EnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXdlaWdodDogNDAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xuICBmb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG5gO1xuY29uc3QgRXJyb3JIZWFkZXIgPSBzdHlsZWQuaDEgYFxuICB0ZXh0LXNoYWRvdzogMCAwIDFweCB0cmFuc3BhcmVudDtcbiAgbWFyZ2luLWJvdHRvbTogMS4yNXJlbTtcbiAgY29sb3I6ICMzMzQ3NWI7XG4gIGZvbnQtc2l6ZTogMS4yNXJlbTtcbmA7XG5leHBvcnQgY29uc3QgSWZyYW1lRXJyb3JQYWdlID0gKCkgPT4gKF9qc3hzKElmcmFtZUVycm9yQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeChcImltZ1wiLCB7IGFsdDogXCJDYW5ub3QgZmluZCBwYWdlXCIsIHdpZHRoOiBcIjE3NVwiLCBzcmM6IFwiLy9zdGF0aWMuaHNhcHBzdGF0aWMubmV0L3VpLWltYWdlcy9zdGF0aWMtMS4xNC9vcHRpbWl6ZWQvZXJyb3JzL21hcC5zdmdcIiB9KSwgX2pzeChFcnJvckhlYWRlciwgeyBjaGlsZHJlbjogX18oJ1RoZSBIdWJTcG90IGZvciBXb3JkUHJlc3MgcGx1Z2luIGlzIG5vdCBhYmxlIHRvIGxvYWQgcGFnZXMnLCAnbGVhZGluJykgfSksIF9qc3goXCJwXCIsIHsgY2hpbGRyZW46IF9fKCdUcnkgZGlzYWJsaW5nIHlvdXIgYnJvd3NlciBleHRlbnNpb25zIGFuZCBhZCBibG9ja2VycywgdGhlbiByZWZyZXNoIHRoZSBwYWdlJywgJ2xlYWRpbicpIH0pLCBfanN4KFwicFwiLCB7IGNoaWxkcmVuOiBfXygnT3Igb3BlbiB0aGUgSHViU3BvdCBmb3IgV29yZFByZXNzIHBsdWdpbiBpbiBhIGRpZmZlcmVudCBicm93c2VyJywgJ2xlYWRpbicpIH0pXSB9KSk7XG4iXX0=*/"],"names":[".i1jit3y0",".e12lu7tb"],"sourceRoot":""} \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/leadin.js b/wp/wp-content/plugins/leadin/build/leadin.js deleted file mode 100644 index 4b436af3..00000000 --- a/wp/wp-content/plugins/leadin/build/leadin.js +++ /dev/null @@ -1,5910 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js": -/*!*******************************************************************!*\ - !*** ./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -function memoize(fn) { - var cache = Object.create(null); - return function (arg) { - if (cache[arg] === undefined) cache[arg] = fn(arg); - return cache[arg]; - }; -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (memoize); - - -/***/ }), - -/***/ "./node_modules/@linaria/react/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js": -/*!***********************************************************************************************************!*\ - !*** ./node_modules/@linaria/react/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js ***! - \***********************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _emotion_memoize__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @emotion/memoize */ "./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js"); - - -var reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23 - -var isPropValid = /* #__PURE__ */(0,_emotion_memoize__WEBPACK_IMPORTED_MODULE_0__["default"])(function (prop) { - return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111 - /* o */ - && prop.charCodeAt(1) === 110 - /* n */ - && prop.charCodeAt(2) < 91; -} -/* Z+1 */ -); - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (isPropValid); - - -/***/ }), - -/***/ "./scripts/api/wordpressApiClient.ts": -/*!*******************************************!*\ - !*** ./scripts/api/wordpressApiClient.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "disableInternalTracking": () => (/* binding */ disableInternalTracking), -/* harmony export */ "fetchDisableInternalTracking": () => (/* binding */ fetchDisableInternalTracking), -/* harmony export */ "getBusinessUnitId": () => (/* binding */ getBusinessUnitId), -/* harmony export */ "healthcheckRestApi": () => (/* binding */ healthcheckRestApi), -/* harmony export */ "setBusinessUnitId": () => (/* binding */ setBusinessUnitId), -/* harmony export */ "skipReview": () => (/* binding */ skipReview), -/* harmony export */ "trackConsent": () => (/* binding */ trackConsent), -/* harmony export */ "updateHublet": () => (/* binding */ updateHublet) -/* harmony export */ }); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _lib_Raven__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/Raven */ "./scripts/lib/Raven.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _utils_queryParams__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/queryParams */ "./scripts/utils/queryParams.ts"); - - - - - -function makeRequest(method, path) { - var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var queryParams = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - // eslint-disable-next-line compat/compat - var restApiUrl = new URL("".concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.restUrl, "leadin/v1").concat(path)); - (0,_utils_queryParams__WEBPACK_IMPORTED_MODULE_3__.addQueryObjectToUrl)(restApiUrl, queryParams); - return new Promise(function (resolve, reject) { - var payload = { - url: restApiUrl.toString(), - method: method, - contentType: 'application/json', - beforeSend: function beforeSend(xhr) { - return xhr.setRequestHeader('X-WP-Nonce', _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.restNonce); - }, - success: resolve, - error: function error(response) { - _lib_Raven__WEBPACK_IMPORTED_MODULE_1__["default"].captureMessage("HTTP Request to ".concat(restApiUrl, " failed with error ").concat(response.status, ": ").concat(response.responseText), { - fingerprint: ['{{ default }}', path, response.status, response.responseText] - }); - reject(response); - } - }; - - if (method !== 'get') { - payload.data = JSON.stringify(data); - } - - jquery__WEBPACK_IMPORTED_MODULE_0___default().ajax(payload); - }); -} - -function healthcheckRestApi() { - return makeRequest('get', '/healthcheck'); -} -function disableInternalTracking(value) { - return makeRequest('put', '/internal-tracking', value ? '1' : '0'); -} -function fetchDisableInternalTracking() { - return makeRequest('get', '/internal-tracking').then(function (message) { - return { - message: message - }; - }); -} -function updateHublet(hublet) { - return makeRequest('put', '/hublet', { - hublet: hublet - }); -} -function skipReview() { - return makeRequest('post', '/skip-review'); -} -function trackConsent(canTrack) { - return makeRequest('post', '/track-consent', { - canTrack: canTrack - }).then(function (message) { - return { - message: message - }; - }); -} -function setBusinessUnitId(businessUnitId) { - return makeRequest('put', '/business-unit', { - businessUnitId: businessUnitId - }); -} -function getBusinessUnitId() { - return makeRequest('get', '/business-unit'); -} - -/***/ }), - -/***/ "./scripts/constants/leadinConfig.ts": -/*!*******************************************!*\ - !*** ./scripts/constants/leadinConfig.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "accountName": () => (/* binding */ accountName), -/* harmony export */ "activationTime": () => (/* binding */ activationTime), -/* harmony export */ "adminUrl": () => (/* binding */ adminUrl), -/* harmony export */ "connectionStatus": () => (/* binding */ connectionStatus), -/* harmony export */ "contentEmbed": () => (/* binding */ contentEmbed), -/* harmony export */ "deviceId": () => (/* binding */ deviceId), -/* harmony export */ "didDisconnect": () => (/* binding */ didDisconnect), -/* harmony export */ "env": () => (/* binding */ env), -/* harmony export */ "formsScript": () => (/* binding */ formsScript), -/* harmony export */ "formsScriptPayload": () => (/* binding */ formsScriptPayload), -/* harmony export */ "hublet": () => (/* binding */ hublet), -/* harmony export */ "hubspotBaseUrl": () => (/* binding */ hubspotBaseUrl), -/* harmony export */ "hubspotNonce": () => (/* binding */ hubspotNonce), -/* harmony export */ "iframeUrl": () => (/* binding */ iframeUrl), -/* harmony export */ "impactLink": () => (/* binding */ impactLink), -/* harmony export */ "lastAuthorizeTime": () => (/* binding */ lastAuthorizeTime), -/* harmony export */ "lastDeauthorizeTime": () => (/* binding */ lastDeauthorizeTime), -/* harmony export */ "lastDisconnectTime": () => (/* binding */ lastDisconnectTime), -/* harmony export */ "leadinPluginVersion": () => (/* binding */ leadinPluginVersion), -/* harmony export */ "leadinQueryParams": () => (/* binding */ leadinQueryParams), -/* harmony export */ "locale": () => (/* binding */ locale), -/* harmony export */ "loginUrl": () => (/* binding */ loginUrl), -/* harmony export */ "meetingsScript": () => (/* binding */ meetingsScript), -/* harmony export */ "phpVersion": () => (/* binding */ phpVersion), -/* harmony export */ "pluginPath": () => (/* binding */ pluginPath), -/* harmony export */ "plugins": () => (/* binding */ plugins), -/* harmony export */ "portalDomain": () => (/* binding */ portalDomain), -/* harmony export */ "portalEmail": () => (/* binding */ portalEmail), -/* harmony export */ "portalId": () => (/* binding */ portalId), -/* harmony export */ "redirectNonce": () => (/* binding */ redirectNonce), -/* harmony export */ "refreshToken": () => (/* binding */ refreshToken), -/* harmony export */ "refreshTokenError": () => (/* binding */ refreshTokenError), -/* harmony export */ "requiresContentEmbedScope": () => (/* binding */ requiresContentEmbedScope), -/* harmony export */ "restNonce": () => (/* binding */ restNonce), -/* harmony export */ "restUrl": () => (/* binding */ restUrl), -/* harmony export */ "reviewSkippedDate": () => (/* binding */ reviewSkippedDate), -/* harmony export */ "theme": () => (/* binding */ theme), -/* harmony export */ "trackConsent": () => (/* binding */ trackConsent), -/* harmony export */ "wpVersion": () => (/* binding */ wpVersion) -/* harmony export */ }); -var _window$leadinConfig = window.leadinConfig, - accountName = _window$leadinConfig.accountName, - adminUrl = _window$leadinConfig.adminUrl, - activationTime = _window$leadinConfig.activationTime, - connectionStatus = _window$leadinConfig.connectionStatus, - deviceId = _window$leadinConfig.deviceId, - didDisconnect = _window$leadinConfig.didDisconnect, - env = _window$leadinConfig.env, - formsScript = _window$leadinConfig.formsScript, - meetingsScript = _window$leadinConfig.meetingsScript, - formsScriptPayload = _window$leadinConfig.formsScriptPayload, - hublet = _window$leadinConfig.hublet, - hubspotBaseUrl = _window$leadinConfig.hubspotBaseUrl, - hubspotNonce = _window$leadinConfig.hubspotNonce, - iframeUrl = _window$leadinConfig.iframeUrl, - impactLink = _window$leadinConfig.impactLink, - lastAuthorizeTime = _window$leadinConfig.lastAuthorizeTime, - lastDeauthorizeTime = _window$leadinConfig.lastDeauthorizeTime, - lastDisconnectTime = _window$leadinConfig.lastDisconnectTime, - leadinPluginVersion = _window$leadinConfig.leadinPluginVersion, - leadinQueryParams = _window$leadinConfig.leadinQueryParams, - locale = _window$leadinConfig.locale, - loginUrl = _window$leadinConfig.loginUrl, - phpVersion = _window$leadinConfig.phpVersion, - pluginPath = _window$leadinConfig.pluginPath, - plugins = _window$leadinConfig.plugins, - portalDomain = _window$leadinConfig.portalDomain, - portalEmail = _window$leadinConfig.portalEmail, - portalId = _window$leadinConfig.portalId, - redirectNonce = _window$leadinConfig.redirectNonce, - restNonce = _window$leadinConfig.restNonce, - restUrl = _window$leadinConfig.restUrl, - refreshToken = _window$leadinConfig.refreshToken, - reviewSkippedDate = _window$leadinConfig.reviewSkippedDate, - theme = _window$leadinConfig.theme, - trackConsent = _window$leadinConfig.trackConsent, - wpVersion = _window$leadinConfig.wpVersion, - contentEmbed = _window$leadinConfig.contentEmbed, - requiresContentEmbedScope = _window$leadinConfig.requiresContentEmbedScope, - refreshTokenError = _window$leadinConfig.refreshTokenError; - - -/***/ }), - -/***/ "./scripts/constants/selectors.ts": -/*!****************************************!*\ - !*** ./scripts/constants/selectors.ts ***! - \****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "domElements": () => (/* binding */ domElements) -/* harmony export */ }); -var domElements = { - iframe: '#leadin-iframe', - subMenu: '.toplevel_page_leadin > ul', - subMenuLinks: '.toplevel_page_leadin > ul a', - subMenuButtons: '.toplevel_page_leadin > ul > li', - deactivatePluginButton: '[data-slug="leadin"] .deactivate a', - deactivateFeedbackForm: 'form.leadin-deactivate-form', - deactivateFeedbackSubmit: 'button#leadin-feedback-submit', - deactivateFeedbackSkip: 'button#leadin-feedback-skip', - thickboxModalClose: '.leadin-modal-close', - thickboxModalWindow: 'div#TB_window.thickbox-loading', - thickboxModalContent: 'div#TB_ajaxContent.TB_modal', - reviewBannerContainer: '#leadin-review-banner', - reviewBannerLeaveReviewLink: 'a#leave-review-button', - reviewBannerDismissButton: 'a#dismiss-review-banner-button', - leadinIframeContainer: 'leadin-iframe-container', - leadinIframe: 'leadin-iframe', - leadinIframeFallbackContainer: 'leadin-iframe-fallback-container' -}; - -/***/ }), - -/***/ "./scripts/iframe/IframeErrorPage.tsx": -/*!********************************************!*\ - !*** ./scripts/iframe/IframeErrorPage.tsx ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "IframeErrorPage": () => (/* binding */ IframeErrorPage) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); -/* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _linaria_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @linaria/react */ "./node_modules/@linaria/react/dist/index.mjs"); - - - -var IframeErrorContainer = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_2__.styled)('div')({ - name: "IframeErrorContainer", - "class": "i1jit3y0", - propsAsIs: false -}); -var ErrorHeader = /*#__PURE__*/(0,_linaria_react__WEBPACK_IMPORTED_MODULE_2__.styled)('h1')({ - name: "ErrorHeader", - "class": "e12lu7tb", - propsAsIs: false -}); -var IframeErrorPage = function IframeErrorPage() { - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(IframeErrorContainer, { - children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("img", { - alt: "Cannot find page", - width: "175", - src: "//static.hsappstatic.net/ui-images/static-1.14/optimized/errors/map.svg" - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ErrorHeader, { - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__.__)('The HubSpot for WordPress plugin is not able to load pages', 'leadin') - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", { - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__.__)('Try disabling your browser extensions and ad blockers, then refresh the page', 'leadin') - }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", { - children: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__.__)('Or open the HubSpot for WordPress plugin in a different browser', 'leadin') - })] - }); -}; - -__webpack_require__(/*! ./IframeErrorPage.linaria.css!=!../../node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./IframeErrorPage.tsx */ "./scripts/iframe/IframeErrorPage.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/iframe/IframeErrorPage.tsx"); - -/***/ }), - -/***/ "./scripts/iframe/constants.ts": -/*!*************************************!*\ - !*** ./scripts/iframe/constants.ts ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "App": () => (/* binding */ App), -/* harmony export */ "AppIframe": () => (/* binding */ AppIframe) -/* harmony export */ }); -var _AppIframe; - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -var App; - -(function (App) { - App[App["Forms"] = 0] = "Forms"; - App[App["LiveChat"] = 1] = "LiveChat"; - App[App["Plugin"] = 2] = "Plugin"; - App[App["PluginSettings"] = 3] = "PluginSettings"; - App[App["Background"] = 4] = "Background"; -})(App || (App = {})); - -var AppIframe = (_AppIframe = {}, _defineProperty(_AppIframe, App.Forms, 'integrated-form-app'), _defineProperty(_AppIframe, App.LiveChat, 'integrated-livechat-app'), _defineProperty(_AppIframe, App.Plugin, 'integrated-plugin-app'), _defineProperty(_AppIframe, App.PluginSettings, 'integrated-plugin-app'), _defineProperty(_AppIframe, App.Background, 'integrated-plugin-proxy'), _AppIframe); - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/core/CoreMessages.ts": -/*!****************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/core/CoreMessages.ts ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CoreMessages": () => (/* binding */ CoreMessages) -/* harmony export */ }); -var CoreMessages = { - HandshakeReceive: 'INTEGRATED_APP_EMBEDDER_HANDSHAKE_RECEIVED', - SendRefreshToken: 'INTEGRATED_APP_EMBEDDER_SEND_REFRESH_TOKEN', - ReloadParentFrame: 'INTEGRATED_APP_EMBEDDER_RELOAD_PARENT_FRAME', - RedirectParentFrame: 'INTEGRATED_APP_EMBEDDER_REDIRECT_PARENT_FRAME', - SendLocale: 'INTEGRATED_APP_EMBEDDER_SEND_LOCALE', - SendDeviceId: 'INTEGRATED_APP_EMBEDDER_SEND_DEVICE_ID', - SendIntegratedAppConfig: 'INTEGRATED_APP_EMBEDDER_CONFIG' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/forms/FormsMessages.ts": -/*!******************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/forms/FormsMessages.ts ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "FormMessages": () => (/* binding */ FormMessages) -/* harmony export */ }); -var FormMessages = { - CreateFormAppNavigation: 'CREATE_FORM_APP_NAVIGATION' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/index.ts": -/*!****************************************************!*\ - !*** ./scripts/iframe/integratedMessages/index.ts ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CoreMessages": () => (/* reexport safe */ _core_CoreMessages__WEBPACK_IMPORTED_MODULE_0__.CoreMessages), -/* harmony export */ "FormMessages": () => (/* reexport safe */ _forms_FormsMessages__WEBPACK_IMPORTED_MODULE_1__.FormMessages), -/* harmony export */ "LiveChatMessages": () => (/* reexport safe */ _livechat_LiveChatMessages__WEBPACK_IMPORTED_MODULE_2__.LiveChatMessages), -/* harmony export */ "PluginMessages": () => (/* reexport safe */ _plugin_PluginMessages__WEBPACK_IMPORTED_MODULE_3__.PluginMessages), -/* harmony export */ "ProxyMessages": () => (/* reexport safe */ _proxy_ProxyMessages__WEBPACK_IMPORTED_MODULE_4__.ProxyMessages) -/* harmony export */ }); -/* harmony import */ var _core_CoreMessages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/CoreMessages */ "./scripts/iframe/integratedMessages/core/CoreMessages.ts"); -/* harmony import */ var _forms_FormsMessages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./forms/FormsMessages */ "./scripts/iframe/integratedMessages/forms/FormsMessages.ts"); -/* harmony import */ var _livechat_LiveChatMessages__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./livechat/LiveChatMessages */ "./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts"); -/* harmony import */ var _plugin_PluginMessages__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./plugin/PluginMessages */ "./scripts/iframe/integratedMessages/plugin/PluginMessages.ts"); -/* harmony import */ var _proxy_ProxyMessages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./proxy/ProxyMessages */ "./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts"); - - - - - - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts": -/*!************************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "LiveChatMessages": () => (/* binding */ LiveChatMessages) -/* harmony export */ }); -var LiveChatMessages = { - CreateLiveChatAppNavigation: 'CREATE_LIVE_CHAT_APP_NAVIGATION' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/plugin/PluginMessages.ts": -/*!********************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/plugin/PluginMessages.ts ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "PluginMessages": () => (/* binding */ PluginMessages) -/* harmony export */ }); -var PluginMessages = { - PluginSettingsNavigation: 'PLUGIN_SETTINGS_NAVIGATION', - PluginLeadinConfig: 'PLUGIN_LEADIN_CONFIG', - TrackConsent: 'INTEGRATED_APP_EMBEDDER_TRACK_CONSENT', - InternalTrackingFetchRequest: 'INTEGRATED_TRACKING_FETCH_REQUEST', - InternalTrackingFetchResponse: 'INTEGRATED_TRACKING_FETCH_RESPONSE', - InternalTrackingFetchError: 'INTEGRATED_TRACKING_FETCH_ERROR', - InternalTrackingChangeRequest: 'INTEGRATED_TRACKING_CHANGE_REQUEST', - InternalTrackingChangeError: 'INTEGRATED_TRACKING_CHANGE_ERROR', - BusinessUnitFetchRequest: 'BUSINESS_UNIT_FETCH_REQUEST', - BusinessUnitFetchResponse: 'BUSINESS_UNIT_FETCH_FETCH_RESPONSE', - BusinessUnitFetchError: 'BUSINESS_UNIT_FETCH_FETCH_ERROR', - BusinessUnitChangeRequest: 'BUSINESS_UNIT_CHANGE_REQUEST', - BusinessUnitChangeError: 'BUSINESS_UNIT_CHANGE_ERROR', - SkipReviewRequest: 'SKIP_REVIEW_REQUEST', - SkipReviewResponse: 'SKIP_REVIEW_RESPONSE', - SkipReviewError: 'SKIP_REVIEW_ERROR', - RemoveParentQueryParam: 'REMOVE_PARENT_QUERY_PARAM', - ContentEmbedInstallRequest: 'CONTENT_EMBED_INSTALL_REQUEST', - ContentEmbedInstallResponse: 'CONTENT_EMBED_INSTALL_RESPONSE', - ContentEmbedInstallError: 'CONTENT_EMBED_INSTALL_ERROR', - ContentEmbedActivationRequest: 'CONTENT_EMBED_ACTIVATION_REQUEST', - ContentEmbedActivationResponse: 'CONTENT_EMBED_ACTIVATION_RESPONSE', - ContentEmbedActivationError: 'CONTENT_EMBED_ACTIVATION_ERROR' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts": -/*!******************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ProxyMessages": () => (/* binding */ ProxyMessages) -/* harmony export */ }); -var ProxyMessages = { - FetchForms: 'FETCH_FORMS', - FetchForm: 'FETCH_FORM', - CreateFormFromTemplate: 'CREATE_FORM_FROM_TEMPLATE', - FetchAuth: 'FETCH_AUTH', - FetchMeetingsAndUsers: 'FETCH_MEETINGS_AND_USERS', - FetchContactsCreateSinceActivation: 'FETCH_CONTACTS_CREATED_SINCE_ACTIVATION', - FetchOrCreateMeetingUser: 'FETCH_OR_CREATE_MEETING_USER', - ConnectMeetingsCalendar: 'CONNECT_MEETINGS_CALENDAR', - TrackFormPreviewRender: 'TRACK_FORM_PREVIEW_RENDER', - TrackFormCreatedFromTemplate: 'TRACK_FORM_CREATED_FROM_TEMPLATE', - TrackFormCreationFailed: 'TRACK_FORM_CREATION_FAILED', - TrackMeetingPreviewRender: 'TRACK_MEETING_PREVIEW_RENDER', - TrackSidebarMetaChange: 'TRACK_SIDEBAR_META_CHANGE', - TrackReviewBannerRender: 'TRACK_REVIEW_BANNER_RENDER', - TrackReviewBannerInteraction: 'TRACK_REVIEW_BANNER_INTERACTION', - TrackReviewBannerDismissed: 'TRACK_REVIEW_BANNER_DISMISSED', - TrackPluginDeactivation: 'TRACK_PLUGIN_DEACTIVATION' -}; - -/***/ }), - -/***/ "./scripts/iframe/messageMiddleware.ts": -/*!*********************************************!*\ - !*** ./scripts/iframe/messageMiddleware.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "messageMiddleware": () => (/* binding */ messageMiddleware) -/* harmony export */ }); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); -/* harmony import */ var _api_wordpressApiClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/wordpressApiClient */ "./scripts/api/wordpressApiClient.ts"); -/* harmony import */ var _utils_queryParams__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/queryParams */ "./scripts/utils/queryParams.ts"); -/* harmony import */ var _utils_contentEmbedInstaller__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/contentEmbedInstaller */ "./scripts/utils/contentEmbedInstaller.ts"); - - - - -var messageMapper = new Map([[_iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.TrackConsent, function (message) { - (0,_api_wordpressApiClient__WEBPACK_IMPORTED_MODULE_1__.trackConsent)(message.payload); -}], [_iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.InternalTrackingChangeRequest, function (message, embedder) { - (0,_api_wordpressApiClient__WEBPACK_IMPORTED_MODULE_1__.disableInternalTracking)(message.payload).then(function () { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.InternalTrackingFetchResponse, - payload: message.payload - }); - })["catch"](function (payload) { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.InternalTrackingChangeError, - payload: payload - }); - }); -}], [_iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.InternalTrackingFetchRequest, function (__message, embedder) { - (0,_api_wordpressApiClient__WEBPACK_IMPORTED_MODULE_1__.fetchDisableInternalTracking)().then(function (_ref) { - var payload = _ref.message; - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.InternalTrackingFetchResponse, - payload: payload - }); - })["catch"](function (payload) { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.InternalTrackingFetchError, - payload: payload - }); - }); -}], [_iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.BusinessUnitFetchRequest, function (__message, embedder) { - (0,_api_wordpressApiClient__WEBPACK_IMPORTED_MODULE_1__.getBusinessUnitId)().then(function (payload) { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.BusinessUnitFetchResponse, - payload: payload - }); - })["catch"](function (payload) { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.BusinessUnitFetchError, - payload: payload - }); - }); -}], [_iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.BusinessUnitChangeRequest, function (message, embedder) { - (0,_api_wordpressApiClient__WEBPACK_IMPORTED_MODULE_1__.setBusinessUnitId)(message.payload).then(function (payload) { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.BusinessUnitFetchResponse, - payload: payload - }); - })["catch"](function (payload) { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.BusinessUnitChangeError, - payload: payload - }); - }); -}], [_iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.SkipReviewRequest, function (__message, embedder) { - (0,_api_wordpressApiClient__WEBPACK_IMPORTED_MODULE_1__.skipReview)().then(function (payload) { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.SkipReviewResponse, - payload: payload - }); - })["catch"](function (payload) { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.SkipReviewError, - payload: payload - }); - }); -}], [_iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.RemoveParentQueryParam, function (message) { - (0,_utils_queryParams__WEBPACK_IMPORTED_MODULE_2__.removeQueryParamFromLocation)(message.payload); -}], [_iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.ContentEmbedInstallRequest, function (message, embedder) { - (0,_utils_contentEmbedInstaller__WEBPACK_IMPORTED_MODULE_3__.startInstall)(message.payload.nonce).then(function (payload) { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.ContentEmbedInstallResponse, - payload: payload - }); - })["catch"](function (payload) { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.ContentEmbedInstallError, - payload: payload - }); - }); -}], [_iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.ContentEmbedActivationRequest, function (message, embedder) { - (0,_utils_contentEmbedInstaller__WEBPACK_IMPORTED_MODULE_3__.startActivation)(message.payload.activateAjaxUrl).then(function (payload) { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.ContentEmbedActivationResponse, - payload: payload - }); - })["catch"](function (payload) { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_0__.PluginMessages.ContentEmbedActivationError, - payload: payload - }); - }); -}]]); -var messageMiddleware = function messageMiddleware(embedder) { - return function (message) { - var next = messageMapper.get(message.key); - - if (next) { - next(message, embedder); - } - }; -}; - -/***/ }), - -/***/ "./scripts/iframe/renderIframeApp.tsx": -/*!********************************************!*\ - !*** ./scripts/iframe/renderIframeApp.tsx ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-dom */ "react-dom"); -/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _constants_selectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants/selectors */ "./scripts/constants/selectors.ts"); -/* harmony import */ var _useAppEmbedder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./useAppEmbedder */ "./scripts/iframe/useAppEmbedder.ts"); -/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./constants */ "./scripts/iframe/constants.ts"); -/* harmony import */ var _IframeErrorPage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./IframeErrorPage */ "./scripts/iframe/IframeErrorPage.tsx"); - - - - - - - - -var IntegratedIframePortal = function IntegratedIframePortal(props) { - var container = document.getElementById(_constants_selectors__WEBPACK_IMPORTED_MODULE_3__.domElements.leadinIframeContainer); - var iframeNotRendered = (0,_useAppEmbedder__WEBPACK_IMPORTED_MODULE_4__["default"])(props.app, props.createRoute, container); - - if (container && !iframeNotRendered) { - return /*#__PURE__*/react_dom__WEBPACK_IMPORTED_MODULE_2___default().createPortal(props.children, container); - } - - return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, { - children: (!container || iframeNotRendered) && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_IframeErrorPage__WEBPACK_IMPORTED_MODULE_6__.IframeErrorPage, {}) - }); -}; - -var renderIframeApp = function renderIframeApp() { - var iframeFallbackContainer = document.getElementById(_constants_selectors__WEBPACK_IMPORTED_MODULE_3__.domElements.leadinIframeContainer); - var app; - var queryParams = new URLSearchParams(location.search); - var page = queryParams.get('page'); - var createRoute = queryParams.get('leadin_route[0]') === 'create'; - - switch (page) { - case 'leadin_forms': - app = _constants__WEBPACK_IMPORTED_MODULE_5__.App.Forms; - break; - - case 'leadin_chatflows': - app = _constants__WEBPACK_IMPORTED_MODULE_5__.App.LiveChat; - break; - - case 'leadin_settings': - app = _constants__WEBPACK_IMPORTED_MODULE_5__.App.PluginSettings; - break; - - case 'leadin_user_guide': - default: - app = _constants__WEBPACK_IMPORTED_MODULE_5__.App.Plugin; - break; - } - - react_dom__WEBPACK_IMPORTED_MODULE_2___default().render((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(IntegratedIframePortal, { - app: app, - createRoute: createRoute - }), iframeFallbackContainer); -}; - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (renderIframeApp); - -/***/ }), - -/***/ "./scripts/iframe/useAppEmbedder.ts": -/*!******************************************!*\ - !*** ./scripts/iframe/useAppEmbedder.ts ***! - \******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ useAppEmbedder) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _lib_Raven__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/Raven */ "./scripts/lib/Raven.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ "./scripts/iframe/constants.ts"); -/* harmony import */ var _messageMiddleware__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./messageMiddleware */ "./scripts/iframe/messageMiddleware.ts"); -/* harmony import */ var _utils_iframe__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/iframe */ "./scripts/utils/iframe.ts"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - - - - - - - -var getIntegrationConfig = function getIntegrationConfig() { - return { - adminUrl: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams.adminUrl - }; -}; - -var getLeadinConfig = function getLeadinConfig() { - var utm_query_params = Object.keys(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams).filter(function (x) { - return /^utm/.test(x); - }).reduce(function (p, c) { - return _objectSpread(_defineProperty({}, c, _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams[c]), p); - }, {}); - return _objectSpread({ - accountName: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.accountName, - admin: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams.admin, - adminUrl: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.adminUrl, - company: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams.company, - connectionStatus: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.connectionStatus, - deviceId: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.deviceId, - email: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams.email, - firstName: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams.firstName, - irclickid: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams.irclickid, - justConnected: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams.justConnected, - lastName: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams.lastName, - lastAuthorizeTime: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.lastAuthorizeTime, - lastDeauthorizeTime: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.lastDeauthorizeTime, - lastDisconnectTime: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.lastDisconnectTime, - leadinPluginVersion: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinPluginVersion, - mpid: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams.mpid, - nonce: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams.nonce, - phpVersion: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.phpVersion, - plugins: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.plugins, - portalDomain: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.portalDomain, - portalEmail: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.portalEmail, - portalId: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.portalId, - reviewSkippedDate: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.reviewSkippedDate, - theme: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.theme, - trackConsent: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams.trackConsent, - websiteName: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.leadinQueryParams.websiteName, - wpVersion: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.wpVersion, - contentEmbed: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.contentEmbed, - requiresContentEmbedScope: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.requiresContentEmbedScope, - refreshTokenError: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.refreshTokenError - }, utm_query_params); -}; - -var getAppOptions = function getAppOptions(app) { - var createRoute = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var _window = window, - IntegratedAppOptions = _window.IntegratedAppOptions, - FormsAppOptions = _window.FormsAppOptions, - LiveChatAppOptions = _window.LiveChatAppOptions, - PluginAppOptions = _window.PluginAppOptions; - var options; - - switch (app) { - case _constants__WEBPACK_IMPORTED_MODULE_3__.App.Plugin: - options = new PluginAppOptions().setLeadinConfig(getLeadinConfig()); - break; - - case _constants__WEBPACK_IMPORTED_MODULE_3__.App.PluginSettings: - options = new PluginAppOptions().setLeadinConfig(getLeadinConfig()).setPluginSettingsInit(); - break; - - case _constants__WEBPACK_IMPORTED_MODULE_3__.App.Forms: - options = new FormsAppOptions().setIntegratedAppConfig(getIntegrationConfig()); - - if (createRoute) { - options = options.setCreateFormAppInit(); - } - - break; - - case _constants__WEBPACK_IMPORTED_MODULE_3__.App.LiveChat: - options = new LiveChatAppOptions(); - - if (createRoute) { - options = options.setCreateLiveChatAppInit(); - } - - break; - - default: - options = new IntegratedAppOptions(); - } - - return options; -}; - -function useAppEmbedder(app, createRoute, container) { - console.info('HubSpot plugin - starting app embedder for:', _constants__WEBPACK_IMPORTED_MODULE_3__.AppIframe[app], container); - var iframeNotRendered = (0,_utils_iframe__WEBPACK_IMPORTED_MODULE_5__.useIframeNotRendered)(_constants__WEBPACK_IMPORTED_MODULE_3__.AppIframe[app]); - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { - var _window2 = window, - IntegratedAppEmbedder = _window2.IntegratedAppEmbedder; - - if (IntegratedAppEmbedder) { - var options = getAppOptions(app, createRoute).setLocale(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.locale).setDeviceId(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.deviceId).setRefreshToken(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.refreshToken); - var embedder = new IntegratedAppEmbedder(_constants__WEBPACK_IMPORTED_MODULE_3__.AppIframe[app], _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.portalId, _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.hubspotBaseUrl, _utils_iframe__WEBPACK_IMPORTED_MODULE_5__.resizeWindow, _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.refreshToken ? '' : _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.impactLink).setOptions(options); - embedder.subscribe((0,_messageMiddleware__WEBPACK_IMPORTED_MODULE_4__.messageMiddleware)(embedder)); - embedder.attachTo(container, true); - embedder.postStartAppMessage(); // lets the app know all all data has been passed to it - - window.embedder = embedder; - } - }, []); - - if (iframeNotRendered) { - console.error('HubSpot plugin Iframe not rendered', { - portalId: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.portalId, - container: container, - appName: _constants__WEBPACK_IMPORTED_MODULE_3__.AppIframe[app], - hasIntegratedAppEmbedder: !!window.IntegratedAppEmbedder - }); - _lib_Raven__WEBPACK_IMPORTED_MODULE_1__["default"].captureException(new Error('Leadin Iframe not rendered'), { - fingerprint: ['USE_APP_EMBEDDER', 'IFRAME_SETUP_ERROR'], - extra: { - portalId: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.portalId, - container: container, - app: app, - hubspotBaseUrl: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.hubspotBaseUrl, - impactLink: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.impactLink, - appName: _constants__WEBPACK_IMPORTED_MODULE_3__.AppIframe[app], - hasRefreshToken: !!_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_2__.refreshToken - } - }); - } - - return iframeNotRendered; -} - -/***/ }), - -/***/ "./scripts/lib/Raven.ts": -/*!******************************!*\ - !*** ./scripts/lib/Raven.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "configureRaven": () => (/* binding */ configureRaven), -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! raven-js */ "./node_modules/raven-js/src/singleton.js"); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(raven_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); - - -function configureRaven() { - if (_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.hubspotBaseUrl.indexOf('app.hubspot.com') === -1) { - return; - } - - raven_js__WEBPACK_IMPORTED_MODULE_0___default().config('https://e9b8f382cdd130c0d415cd977d2be56f@exceptions.hubspot.com/1', { - instrument: { - tryCatch: false - }, - release: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.leadinPluginVersion - }).install(); - raven_js__WEBPACK_IMPORTED_MODULE_0___default().setTagsContext({ - v: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.leadinPluginVersion, - php: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.phpVersion, - wordpress: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.wpVersion - }); - raven_js__WEBPACK_IMPORTED_MODULE_0___default().setExtraContext({ - hub: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.portalId, - plugins: Object.keys(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.plugins).map(function (name) { - return "".concat(name, "#").concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.plugins[name]); - }).join(',') - }); -} -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((raven_js__WEBPACK_IMPORTED_MODULE_0___default())); - -/***/ }), - -/***/ "./scripts/utils/appUtils.ts": -/*!***********************************!*\ - !*** ./scripts/utils/appUtils.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "initApp": () => (/* binding */ initApp), -/* harmony export */ "initAppOnReady": () => (/* binding */ initAppOnReady) -/* harmony export */ }); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _lib_Raven__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/Raven */ "./scripts/lib/Raven.ts"); - - -function initApp(initFn) { - (0,_lib_Raven__WEBPACK_IMPORTED_MODULE_1__.configureRaven)(); - _lib_Raven__WEBPACK_IMPORTED_MODULE_1__["default"].context(initFn); -} -function initAppOnReady(initFn) { - function main() { - jquery__WEBPACK_IMPORTED_MODULE_0___default()(initFn); - } - - initApp(main); -} - -/***/ }), - -/***/ "./scripts/utils/contentEmbedInstaller.ts": -/*!************************************************!*\ - !*** ./scripts/utils/contentEmbedInstaller.ts ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "startActivation": () => (/* binding */ startActivation), -/* harmony export */ "startInstall": () => (/* binding */ startInstall) -/* harmony export */ }); -function startInstall(nonce) { - var formData = new FormData(); - var ajaxUrl = window.ajaxurl; - formData.append('_wpnonce', nonce); - formData.append('action', 'content_embed_install'); - return fetch(ajaxUrl, { - method: 'POST', - body: formData, - keepalive: true - }).then(function (res) { - return res.json(); - }); -} -function startActivation(requestUrl) { - return fetch(requestUrl, { - method: 'POST', - keepalive: true - }).then(function (res) { - return res.json(); - }); -} - -/***/ }), - -/***/ "./scripts/utils/iframe.ts": -/*!*********************************!*\ - !*** ./scripts/utils/iframe.ts ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "resizeWindow": () => (/* binding */ resizeWindow), -/* harmony export */ "useIframeNotRendered": () => (/* binding */ useIframeNotRendered) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - - -var IFRAME_DISPLAY_TIMEOUT = 5000; -function useIframeNotRendered(app) { - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false), - _useState2 = _slicedToArray(_useState, 2), - iframeNotRendered = _useState2[0], - setIframeNotRendered = _useState2[1]; - - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { - var timer = setTimeout(function () { - var iframe = document.getElementById(app); - - if (!iframe) { - setIframeNotRendered(true); - } - }, IFRAME_DISPLAY_TIMEOUT); - return function () { - if (timer) { - clearTimeout(timer); - } - }; - }, []); - return iframeNotRendered; -} -var resizeWindow = function resizeWindow() { - var adminMenuWrap = document.getElementById('adminmenuwrap'); - var sideMenuHeight = adminMenuWrap ? adminMenuWrap.offsetHeight : 0; - var adminBar = document.getElementById('wpadminbar'); - var adminBarHeight = adminBar && adminBar.offsetHeight || 0; - var offset = 4; - - if (window.innerHeight < sideMenuHeight) { - return sideMenuHeight - offset; - } else { - return window.innerHeight - adminBarHeight - offset; - } -}; - -/***/ }), - -/***/ "./scripts/utils/queryParams.ts": -/*!**************************************!*\ - !*** ./scripts/utils/queryParams.ts ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "addQueryObjectToUrl": () => (/* binding */ addQueryObjectToUrl), -/* harmony export */ "removeQueryParamFromLocation": () => (/* binding */ removeQueryParamFromLocation) -/* harmony export */ }); -function addQueryObjectToUrl(urlObject, queryParams) { - Object.keys(queryParams).forEach(function (key) { - urlObject.searchParams.append(key, queryParams[key]); - }); -} -function removeQueryParamFromLocation(key) { - var location = new URL(window.location.href); - location.searchParams["delete"](key); - window.history.replaceState(null, '', location.href); -} - -/***/ }), - -/***/ "./scripts/iframe/IframeErrorPage.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/iframe/IframeErrorPage.tsx": -/*!*************************************************************************************************************************************************************************!*\ - !*** ./scripts/iframe/IframeErrorPage.linaria.css!=!./node_modules/@linaria/webpack5-loader/lib/outputCssLoader.js?cacheProvider=!./scripts/iframe/IframeErrorPage.tsx ***! - \*************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "./node_modules/object-assign/index.js": -/*!*********************************************!*\ - !*** ./node_modules/object-assign/index.js ***! - \*********************************************/ -/***/ ((module) => { - -"use strict"; -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - - -/* eslint-disable no-unused-vars */ -var getOwnPropertySymbols = Object.getOwnPropertySymbols; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var propIsEnumerable = Object.prototype.propertyIsEnumerable; - -function toObject(val) { - if (val === null || val === undefined) { - throw new TypeError('Object.assign cannot be called with null or undefined'); - } - - return Object(val); -} - -function shouldUseNative() { - try { - if (!Object.assign) { - return false; - } - - // Detect buggy property enumeration order in older V8 versions. - - // https://bugs.chromium.org/p/v8/issues/detail?id=4118 - var test1 = new String('abc'); // eslint-disable-line no-new-wrappers - test1[5] = 'de'; - if (Object.getOwnPropertyNames(test1)[0] === '5') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test2 = {}; - for (var i = 0; i < 10; i++) { - test2['_' + String.fromCharCode(i)] = i; - } - var order2 = Object.getOwnPropertyNames(test2).map(function (n) { - return test2[n]; - }); - if (order2.join('') !== '0123456789') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test3 = {}; - 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { - test3[letter] = letter; - }); - if (Object.keys(Object.assign({}, test3)).join('') !== - 'abcdefghijklmnopqrst') { - return false; - } - - return true; - } catch (err) { - // We don't expect any of the above to throw, but better to be safe. - return false; - } -} - -module.exports = shouldUseNative() ? Object.assign : function (target, source) { - var from; - var to = toObject(target); - var symbols; - - for (var s = 1; s < arguments.length; s++) { - from = Object(arguments[s]); - - for (var key in from) { - if (hasOwnProperty.call(from, key)) { - to[key] = from[key]; - } - } - - if (getOwnPropertySymbols) { - symbols = getOwnPropertySymbols(from); - for (var i = 0; i < symbols.length; i++) { - if (propIsEnumerable.call(from, symbols[i])) { - to[symbols[i]] = from[symbols[i]]; - } - } - } - } - - return to; -}; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/configError.js": -/*!**************************************************!*\ - !*** ./node_modules/raven-js/src/configError.js ***! - \**************************************************/ -/***/ ((module) => { - -function RavenConfigError(message) { - this.name = 'RavenConfigError'; - this.message = message; -} -RavenConfigError.prototype = new Error(); -RavenConfigError.prototype.constructor = RavenConfigError; - -module.exports = RavenConfigError; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/console.js": -/*!**********************************************!*\ - !*** ./node_modules/raven-js/src/console.js ***! - \**********************************************/ -/***/ ((module) => { - -var wrapMethod = function(console, level, callback) { - var originalConsoleLevel = console[level]; - var originalConsole = console; - - if (!(level in console)) { - return; - } - - var sentryLevel = level === 'warn' ? 'warning' : level; - - console[level] = function() { - var args = [].slice.call(arguments); - - var msg = '' + args.join(' '); - var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}}; - - if (level === 'assert') { - if (args[0] === false) { - // Default browsers message - msg = 'Assertion failed: ' + (args.slice(1).join(' ') || 'console.assert'); - data.extra.arguments = args.slice(1); - callback && callback(msg, data); - } - } else { - callback && callback(msg, data); - } - - // this fails for some browsers. :( - if (originalConsoleLevel) { - // IE9 doesn't allow calling apply on console functions directly - // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193 - Function.prototype.apply.call(originalConsoleLevel, originalConsole, args); - } - }; -}; - -module.exports = { - wrapMethod: wrapMethod -}; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/raven.js": -/*!********************************************!*\ - !*** ./node_modules/raven-js/src/raven.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/*global XDomainRequest:false */ - -var TraceKit = __webpack_require__(/*! ../vendor/TraceKit/tracekit */ "./node_modules/raven-js/vendor/TraceKit/tracekit.js"); -var stringify = __webpack_require__(/*! ../vendor/json-stringify-safe/stringify */ "./node_modules/raven-js/vendor/json-stringify-safe/stringify.js"); -var RavenConfigError = __webpack_require__(/*! ./configError */ "./node_modules/raven-js/src/configError.js"); - -var utils = __webpack_require__(/*! ./utils */ "./node_modules/raven-js/src/utils.js"); -var isError = utils.isError; -var isObject = utils.isObject; -var isObject = utils.isObject; -var isErrorEvent = utils.isErrorEvent; -var isUndefined = utils.isUndefined; -var isFunction = utils.isFunction; -var isString = utils.isString; -var isEmptyObject = utils.isEmptyObject; -var each = utils.each; -var objectMerge = utils.objectMerge; -var truncate = utils.truncate; -var objectFrozen = utils.objectFrozen; -var hasKey = utils.hasKey; -var joinRegExp = utils.joinRegExp; -var urlencode = utils.urlencode; -var uuid4 = utils.uuid4; -var htmlTreeAsString = utils.htmlTreeAsString; -var isSameException = utils.isSameException; -var isSameStacktrace = utils.isSameStacktrace; -var parseUrl = utils.parseUrl; -var fill = utils.fill; - -var wrapConsoleMethod = (__webpack_require__(/*! ./console */ "./node_modules/raven-js/src/console.js").wrapMethod); - -var dsnKeys = 'source protocol user pass host port path'.split(' '), - dsnPattern = /^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/; - -function now() { - return +new Date(); -} - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; -var _document = _window.document; -var _navigator = _window.navigator; - -function keepOriginalCallback(original, callback) { - return isFunction(callback) - ? function(data) { - return callback(data, original); - } - : callback; -} - -// First, check for JSON support -// If there is no JSON, we no-op the core features of Raven -// since JSON is required to encode the payload -function Raven() { - this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify); - // Raven can run in contexts where there's no document (react-native) - this._hasDocument = !isUndefined(_document); - this._hasNavigator = !isUndefined(_navigator); - this._lastCapturedException = null; - this._lastData = null; - this._lastEventId = null; - this._globalServer = null; - this._globalKey = null; - this._globalProject = null; - this._globalContext = {}; - this._globalOptions = { - logger: 'javascript', - ignoreErrors: [], - ignoreUrls: [], - whitelistUrls: [], - includePaths: [], - collectWindowErrors: true, - maxMessageLength: 0, - - // By default, truncates URL values to 250 chars - maxUrlLength: 250, - stackTraceLimit: 50, - autoBreadcrumbs: true, - instrument: true, - sampleRate: 1 - }; - this._ignoreOnError = 0; - this._isRavenInstalled = false; - this._originalErrorStackTraceLimit = Error.stackTraceLimit; - // capture references to window.console *and* all its methods first - // before the console plugin has a chance to monkey patch - this._originalConsole = _window.console || {}; - this._originalConsoleMethods = {}; - this._plugins = []; - this._startTime = now(); - this._wrappedBuiltIns = []; - this._breadcrumbs = []; - this._lastCapturedEvent = null; - this._keypressTimeout; - this._location = _window.location; - this._lastHref = this._location && this._location.href; - this._resetBackoff(); - - // eslint-disable-next-line guard-for-in - for (var method in this._originalConsole) { - this._originalConsoleMethods[method] = this._originalConsole[method]; - } -} - -/* - * The core Raven singleton - * - * @this {Raven} - */ - -Raven.prototype = { - // Hardcode version string so that raven source can be loaded directly via - // webpack (using a build step causes webpack #1617). Grunt verifies that - // this value matches package.json during build. - // See: https://github.com/getsentry/raven-js/issues/465 - VERSION: '3.19.1', - - debug: false, - - TraceKit: TraceKit, // alias to TraceKit - - /* - * Configure Raven with a DSN and extra options - * - * @param {string} dsn The public Sentry DSN - * @param {object} options Set of global options [optional] - * @return {Raven} - */ - config: function(dsn, options) { - var self = this; - - if (self._globalServer) { - this._logDebug('error', 'Error: Raven has already been configured'); - return self; - } - if (!dsn) return self; - - var globalOptions = self._globalOptions; - - // merge in options - if (options) { - each(options, function(key, value) { - // tags and extra are special and need to be put into context - if (key === 'tags' || key === 'extra' || key === 'user') { - self._globalContext[key] = value; - } else { - globalOptions[key] = value; - } - }); - } - - self.setDSN(dsn); - - // "Script error." is hard coded into browsers for errors that it can't read. - // this is the result of a script being pulled in from an external domain and CORS. - globalOptions.ignoreErrors.push(/^Script error\.?$/); - globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/); - - // join regexp rules into one big rule - globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors); - globalOptions.ignoreUrls = globalOptions.ignoreUrls.length - ? joinRegExp(globalOptions.ignoreUrls) - : false; - globalOptions.whitelistUrls = globalOptions.whitelistUrls.length - ? joinRegExp(globalOptions.whitelistUrls) - : false; - globalOptions.includePaths = joinRegExp(globalOptions.includePaths); - globalOptions.maxBreadcrumbs = Math.max( - 0, - Math.min(globalOptions.maxBreadcrumbs || 100, 100) - ); // default and hard limit is 100 - - var autoBreadcrumbDefaults = { - xhr: true, - console: true, - dom: true, - location: true - }; - - var autoBreadcrumbs = globalOptions.autoBreadcrumbs; - if ({}.toString.call(autoBreadcrumbs) === '[object Object]') { - autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs); - } else if (autoBreadcrumbs !== false) { - autoBreadcrumbs = autoBreadcrumbDefaults; - } - globalOptions.autoBreadcrumbs = autoBreadcrumbs; - - var instrumentDefaults = { - tryCatch: true - }; - - var instrument = globalOptions.instrument; - if ({}.toString.call(instrument) === '[object Object]') { - instrument = objectMerge(instrumentDefaults, instrument); - } else if (instrument !== false) { - instrument = instrumentDefaults; - } - globalOptions.instrument = instrument; - - TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors; - - // return for chaining - return self; - }, - - /* - * Installs a global window.onerror error handler - * to capture and report uncaught exceptions. - * At this point, install() is required to be called due - * to the way TraceKit is set up. - * - * @return {Raven} - */ - install: function() { - var self = this; - if (self.isSetup() && !self._isRavenInstalled) { - TraceKit.report.subscribe(function() { - self._handleOnErrorStackInfo.apply(self, arguments); - }); - if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) { - self._instrumentTryCatch(); - } - - if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs(); - - // Install all of the plugins - self._drainPlugins(); - - self._isRavenInstalled = true; - } - - Error.stackTraceLimit = self._globalOptions.stackTraceLimit; - return this; - }, - - /* - * Set the DSN (can be called multiple time unlike config) - * - * @param {string} dsn The public Sentry DSN - */ - setDSN: function(dsn) { - var self = this, - uri = self._parseDSN(dsn), - lastSlash = uri.path.lastIndexOf('/'), - path = uri.path.substr(1, lastSlash); - - self._dsn = dsn; - self._globalKey = uri.user; - self._globalSecret = uri.pass && uri.pass.substr(1); - self._globalProject = uri.path.substr(lastSlash + 1); - - self._globalServer = self._getGlobalServer(uri); - - self._globalEndpoint = - self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/'; - - // Reset backoff state since we may be pointing at a - // new project/server - this._resetBackoff(); - }, - - /* - * Wrap code within a context so Raven can capture errors - * reliably across domains that is executed immediately. - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The callback to be immediately executed within the context - * @param {array} args An array of arguments to be called with the callback [optional] - */ - context: function(options, func, args) { - if (isFunction(options)) { - args = func || []; - func = options; - options = undefined; - } - - return this.wrap(options, func).apply(this, args); - }, - - /* - * Wrap code within a context and returns back a new function to be executed - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The function to be wrapped in a new context - * @param {function} func A function to call before the try/catch wrapper [optional, private] - * @return {function} The newly wrapped functions with a context - */ - wrap: function(options, func, _before) { - var self = this; - // 1 argument has been passed, and it's not a function - // so just return it - if (isUndefined(func) && !isFunction(options)) { - return options; - } - - // options is optional - if (isFunction(options)) { - func = options; - options = undefined; - } - - // At this point, we've passed along 2 arguments, and the second one - // is not a function either, so we'll just return the second argument. - if (!isFunction(func)) { - return func; - } - - // We don't wanna wrap it twice! - try { - if (func.__raven__) { - return func; - } - - // If this has already been wrapped in the past, return that - if (func.__raven_wrapper__) { - return func.__raven_wrapper__; - } - } catch (e) { - // Just accessing custom props in some Selenium environments - // can cause a "Permission denied" exception (see raven-js#495). - // Bail on wrapping and return the function as-is (defers to window.onerror). - return func; - } - - function wrapped() { - var args = [], - i = arguments.length, - deep = !options || (options && options.deep !== false); - - if (_before && isFunction(_before)) { - _before.apply(this, arguments); - } - - // Recursively wrap all of a function's arguments that are - // functions themselves. - while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i]; - - try { - // Attempt to invoke user-land function - // NOTE: If you are a Sentry user, and you are seeing this stack frame, it - // means Raven caught an error invoking your application code. This is - // expected behavior and NOT indicative of a bug with Raven.js. - return func.apply(this, args); - } catch (e) { - self._ignoreNextOnError(); - self.captureException(e, options); - throw e; - } - } - - // copy over properties of the old function - for (var property in func) { - if (hasKey(func, property)) { - wrapped[property] = func[property]; - } - } - wrapped.prototype = func.prototype; - - func.__raven_wrapper__ = wrapped; - // Signal that this function has been wrapped already - // for both debugging and to prevent it to being wrapped twice - wrapped.__raven__ = true; - wrapped.__inner__ = func; - - return wrapped; - }, - - /* - * Uninstalls the global error handler. - * - * @return {Raven} - */ - uninstall: function() { - TraceKit.report.uninstall(); - - this._restoreBuiltIns(); - - Error.stackTraceLimit = this._originalErrorStackTraceLimit; - this._isRavenInstalled = false; - - return this; - }, - - /* - * Manually capture an exception and send it over to Sentry - * - * @param {error} ex An exception to be logged - * @param {object} options A specific set of options for this error [optional] - * @return {Raven} - */ - captureException: function(ex, options) { - // Cases for sending ex as a message, rather than an exception - var isNotError = !isError(ex); - var isNotErrorEvent = !isErrorEvent(ex); - var isErrorEventWithoutError = isErrorEvent(ex) && !ex.error; - - if ((isNotError && isNotErrorEvent) || isErrorEventWithoutError) { - return this.captureMessage( - ex, - objectMerge( - { - trimHeadFrames: 1, - stacktrace: true // if we fall back to captureMessage, default to attempting a new trace - }, - options - ) - ); - } - - // Get actual Error from ErrorEvent - if (isErrorEvent(ex)) ex = ex.error; - - // Store the raw exception object for potential debugging and introspection - this._lastCapturedException = ex; - - // TraceKit.report will re-raise any exception passed to it, - // which means you have to wrap it in try/catch. Instead, we - // can wrap it here and only re-raise if TraceKit.report - // raises an exception different from the one we asked to - // report on. - try { - var stack = TraceKit.computeStackTrace(ex); - this._handleStackInfo(stack, options); - } catch (ex1) { - if (ex !== ex1) { - throw ex1; - } - } - - return this; - }, - - /* - * Manually send a message to Sentry - * - * @param {string} msg A plain message to be captured in Sentry - * @param {object} options A specific set of options for this message [optional] - * @return {Raven} - */ - captureMessage: function(msg, options) { - // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an - // early call; we'll error on the side of logging anything called before configuration since it's - // probably something you should see: - if ( - !!this._globalOptions.ignoreErrors.test && - this._globalOptions.ignoreErrors.test(msg) - ) { - return; - } - - options = options || {}; - - var data = objectMerge( - { - message: msg + '' // Make sure it's actually a string - }, - options - ); - - var ex; - // Generate a "synthetic" stack trace from this point. - // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative - // of a bug with Raven.js. Sentry generates synthetic traces either by configuration, - // or if it catches a thrown object without a "stack" property. - try { - throw new Error(msg); - } catch (ex1) { - ex = ex1; - } - - // null exception name so `Error` isn't prefixed to msg - ex.name = null; - var stack = TraceKit.computeStackTrace(ex); - - // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1] - var initialCall = stack.stack[1]; - - var fileurl = (initialCall && initialCall.url) || ''; - - if ( - !!this._globalOptions.ignoreUrls.test && - this._globalOptions.ignoreUrls.test(fileurl) - ) { - return; - } - - if ( - !!this._globalOptions.whitelistUrls.test && - !this._globalOptions.whitelistUrls.test(fileurl) - ) { - return; - } - - if (this._globalOptions.stacktrace || (options && options.stacktrace)) { - options = objectMerge( - { - // fingerprint on msg, not stack trace (legacy behavior, could be - // revisited) - fingerprint: msg, - // since we know this is a synthetic trace, the top N-most frames - // MUST be from Raven.js, so mark them as in_app later by setting - // trimHeadFrames - trimHeadFrames: (options.trimHeadFrames || 0) + 1 - }, - options - ); - - var frames = this._prepareFrames(stack, options); - data.stacktrace = { - // Sentry expects frames oldest to newest - frames: frames.reverse() - }; - } - - // Fire away! - this._send(data); - - return this; - }, - - captureBreadcrumb: function(obj) { - var crumb = objectMerge( - { - timestamp: now() / 1000 - }, - obj - ); - - if (isFunction(this._globalOptions.breadcrumbCallback)) { - var result = this._globalOptions.breadcrumbCallback(crumb); - - if (isObject(result) && !isEmptyObject(result)) { - crumb = result; - } else if (result === false) { - return this; - } - } - - this._breadcrumbs.push(crumb); - if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) { - this._breadcrumbs.shift(); - } - return this; - }, - - addPlugin: function(plugin /*arg1, arg2, ... argN*/) { - var pluginArgs = [].slice.call(arguments, 1); - - this._plugins.push([plugin, pluginArgs]); - if (this._isRavenInstalled) { - this._drainPlugins(); - } - - return this; - }, - - /* - * Set/clear a user to be sent along with the payload. - * - * @param {object} user An object representing user data [optional] - * @return {Raven} - */ - setUserContext: function(user) { - // Intentionally do not merge here since that's an unexpected behavior. - this._globalContext.user = user; - - return this; - }, - - /* - * Merge extra attributes to be sent along with the payload. - * - * @param {object} extra An object representing extra data [optional] - * @return {Raven} - */ - setExtraContext: function(extra) { - this._mergeContext('extra', extra); - - return this; - }, - - /* - * Merge tags to be sent along with the payload. - * - * @param {object} tags An object representing tags [optional] - * @return {Raven} - */ - setTagsContext: function(tags) { - this._mergeContext('tags', tags); - - return this; - }, - - /* - * Clear all of the context. - * - * @return {Raven} - */ - clearContext: function() { - this._globalContext = {}; - - return this; - }, - - /* - * Get a copy of the current context. This cannot be mutated. - * - * @return {object} copy of context - */ - getContext: function() { - // lol javascript - return JSON.parse(stringify(this._globalContext)); - }, - - /* - * Set environment of application - * - * @param {string} environment Typically something like 'production'. - * @return {Raven} - */ - setEnvironment: function(environment) { - this._globalOptions.environment = environment; - - return this; - }, - - /* - * Set release version of application - * - * @param {string} release Typically something like a git SHA to identify version - * @return {Raven} - */ - setRelease: function(release) { - this._globalOptions.release = release; - - return this; - }, - - /* - * Set the dataCallback option - * - * @param {function} callback The callback to run which allows the - * data blob to be mutated before sending - * @return {Raven} - */ - setDataCallback: function(callback) { - var original = this._globalOptions.dataCallback; - this._globalOptions.dataCallback = keepOriginalCallback(original, callback); - return this; - }, - - /* - * Set the breadcrumbCallback option - * - * @param {function} callback The callback to run which allows filtering - * or mutating breadcrumbs - * @return {Raven} - */ - setBreadcrumbCallback: function(callback) { - var original = this._globalOptions.breadcrumbCallback; - this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback); - return this; - }, - - /* - * Set the shouldSendCallback option - * - * @param {function} callback The callback to run which allows - * introspecting the blob before sending - * @return {Raven} - */ - setShouldSendCallback: function(callback) { - var original = this._globalOptions.shouldSendCallback; - this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback); - return this; - }, - - /** - * Override the default HTTP transport mechanism that transmits data - * to the Sentry server. - * - * @param {function} transport Function invoked instead of the default - * `makeRequest` handler. - * - * @return {Raven} - */ - setTransport: function(transport) { - this._globalOptions.transport = transport; - - return this; - }, - - /* - * Get the latest raw exception that was captured by Raven. - * - * @return {error} - */ - lastException: function() { - return this._lastCapturedException; - }, - - /* - * Get the last event id - * - * @return {string} - */ - lastEventId: function() { - return this._lastEventId; - }, - - /* - * Determine if Raven is setup and ready to go. - * - * @return {boolean} - */ - isSetup: function() { - if (!this._hasJSON) return false; // needs JSON support - if (!this._globalServer) { - if (!this.ravenNotConfiguredError) { - this.ravenNotConfiguredError = true; - this._logDebug('error', 'Error: Raven has not been configured.'); - } - return false; - } - return true; - }, - - afterLoad: function() { - // TODO: remove window dependence? - - // Attempt to initialize Raven on load - var RavenConfig = _window.RavenConfig; - if (RavenConfig) { - this.config(RavenConfig.dsn, RavenConfig.config).install(); - } - }, - - showReportDialog: function(options) { - if ( - !_document // doesn't work without a document (React native) - ) - return; - - options = options || {}; - - var lastEventId = options.eventId || this.lastEventId(); - if (!lastEventId) { - throw new RavenConfigError('Missing eventId'); - } - - var dsn = options.dsn || this._dsn; - if (!dsn) { - throw new RavenConfigError('Missing DSN'); - } - - var encode = encodeURIComponent; - var qs = ''; - qs += '?eventId=' + encode(lastEventId); - qs += '&dsn=' + encode(dsn); - - var user = options.user || this._globalContext.user; - if (user) { - if (user.name) qs += '&name=' + encode(user.name); - if (user.email) qs += '&email=' + encode(user.email); - } - - var globalServer = this._getGlobalServer(this._parseDSN(dsn)); - - var script = _document.createElement('script'); - script.async = true; - script.src = globalServer + '/api/embed/error-page/' + qs; - (_document.head || _document.body).appendChild(script); - }, - - /**** Private functions ****/ - _ignoreNextOnError: function() { - var self = this; - this._ignoreOnError += 1; - setTimeout(function() { - // onerror should trigger before setTimeout - self._ignoreOnError -= 1; - }); - }, - - _triggerEvent: function(eventType, options) { - // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it - var evt, key; - - if (!this._hasDocument) return; - - options = options || {}; - - eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1); - - if (_document.createEvent) { - evt = _document.createEvent('HTMLEvents'); - evt.initEvent(eventType, true, true); - } else { - evt = _document.createEventObject(); - evt.eventType = eventType; - } - - for (key in options) - if (hasKey(options, key)) { - evt[key] = options[key]; - } - - if (_document.createEvent) { - // IE9 if standards - _document.dispatchEvent(evt); - } else { - // IE8 regardless of Quirks or Standards - // IE9 if quirks - try { - _document.fireEvent('on' + evt.eventType.toLowerCase(), evt); - } catch (e) { - // Do nothing - } - } - }, - - /** - * Wraps addEventListener to capture UI breadcrumbs - * @param evtName the event name (e.g. "click") - * @returns {Function} - * @private - */ - _breadcrumbEventHandler: function(evtName) { - var self = this; - return function(evt) { - // reset keypress timeout; e.g. triggering a 'click' after - // a 'keypress' will reset the keypress debounce so that a new - // set of keypresses can be recorded - self._keypressTimeout = null; - - // It's possible this handler might trigger multiple times for the same - // event (e.g. event propagation through node ancestors). Ignore if we've - // already captured the event. - if (self._lastCapturedEvent === evt) return; - - self._lastCapturedEvent = evt; - - // try/catch both: - // - accessing evt.target (see getsentry/raven-js#838, #768) - // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly - // can throw an exception in some circumstances. - var target; - try { - target = htmlTreeAsString(evt.target); - } catch (e) { - target = ''; - } - - self.captureBreadcrumb({ - category: 'ui.' + evtName, // e.g. ui.click, ui.input - message: target - }); - }; - }, - - /** - * Wraps addEventListener to capture keypress UI events - * @returns {Function} - * @private - */ - _keypressEventHandler: function() { - var self = this, - debounceDuration = 1000; // milliseconds - - // TODO: if somehow user switches keypress target before - // debounce timeout is triggered, we will only capture - // a single breadcrumb from the FIRST target (acceptable?) - return function(evt) { - var target; - try { - target = evt.target; - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - var tagName = target && target.tagName; - - // only consider keypress events on actual input elements - // this will disregard keypresses targeting body (e.g. tabbing - // through elements, hotkeys, etc) - if ( - !tagName || - (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable) - ) - return; - - // record first keypress in a series, but ignore subsequent - // keypresses until debounce clears - var timeout = self._keypressTimeout; - if (!timeout) { - self._breadcrumbEventHandler('input')(evt); - } - clearTimeout(timeout); - self._keypressTimeout = setTimeout(function() { - self._keypressTimeout = null; - }, debounceDuration); - }; - }, - - /** - * Captures a breadcrumb of type "navigation", normalizing input URLs - * @param to the originating URL - * @param from the target URL - * @private - */ - _captureUrlChange: function(from, to) { - var parsedLoc = parseUrl(this._location.href); - var parsedTo = parseUrl(to); - var parsedFrom = parseUrl(from); - - // because onpopstate only tells you the "new" (to) value of location.href, and - // not the previous (from) value, we need to track the value of the current URL - // state ourselves - this._lastHref = to; - - // Use only the path component of the URL if the URL matches the current - // document (almost all the time when using pushState) - if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) - to = parsedTo.relative; - if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) - from = parsedFrom.relative; - - this.captureBreadcrumb({ - category: 'navigation', - data: { - to: to, - from: from - } - }); - }, - - /** - * Wrap timer functions and event targets to catch errors and provide - * better metadata. - */ - _instrumentTryCatch: function() { - var self = this; - - var wrappedBuiltIns = self._wrappedBuiltIns; - - function wrapTimeFn(orig) { - return function(fn, t) { - // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - var originalCallback = args[0]; - if (isFunction(originalCallback)) { - args[0] = self.wrap(originalCallback); - } - - // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it - // also supports only two arguments and doesn't care what this is, so we - // can just call the original function directly. - if (orig.apply) { - return orig.apply(this, args); - } else { - return orig(args[0], args[1]); - } - }; - } - - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - - function wrapEventTarget(global) { - var proto = _window[global] && _window[global].prototype; - if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) { - fill( - proto, - 'addEventListener', - function(orig) { - return function(evtName, fn, capture, secure) { - // preserve arity - try { - if (fn && fn.handleEvent) { - fn.handleEvent = self.wrap(fn.handleEvent); - } - } catch (err) { - // can sometimes get 'Permission denied to access property "handle Event' - } - - // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs` - // so that we don't have more than one wrapper function - var before, clickHandler, keypressHandler; - - if ( - autoBreadcrumbs && - autoBreadcrumbs.dom && - (global === 'EventTarget' || global === 'Node') - ) { - // NOTE: generating multiple handlers per addEventListener invocation, should - // revisit and verify we can just use one (almost certainly) - clickHandler = self._breadcrumbEventHandler('click'); - keypressHandler = self._keypressEventHandler(); - before = function(evt) { - // need to intercept every DOM event in `before` argument, in case that - // same wrapped method is re-used for different events (e.g. mousemove THEN click) - // see #724 - if (!evt) return; - - var eventType; - try { - eventType = evt.type; - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - if (eventType === 'click') return clickHandler(evt); - else if (eventType === 'keypress') return keypressHandler(evt); - }; - } - return orig.call( - this, - evtName, - self.wrap(fn, undefined, before), - capture, - secure - ); - }; - }, - wrappedBuiltIns - ); - fill( - proto, - 'removeEventListener', - function(orig) { - return function(evt, fn, capture, secure) { - try { - fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn); - } catch (e) { - // ignore, accessing __raven_wrapper__ will throw in some Selenium environments - } - return orig.call(this, evt, fn, capture, secure); - }; - }, - wrappedBuiltIns - ); - } - } - - fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns); - fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns); - if (_window.requestAnimationFrame) { - fill( - _window, - 'requestAnimationFrame', - function(orig) { - return function(cb) { - return orig(self.wrap(cb)); - }; - }, - wrappedBuiltIns - ); - } - - // event targets borrowed from bugsnag-js: - // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666 - var eventTargets = [ - 'EventTarget', - 'Window', - 'Node', - 'ApplicationCache', - 'AudioTrackList', - 'ChannelMergerNode', - 'CryptoOperation', - 'EventSource', - 'FileReader', - 'HTMLUnknownElement', - 'IDBDatabase', - 'IDBRequest', - 'IDBTransaction', - 'KeyOperation', - 'MediaController', - 'MessagePort', - 'ModalWindow', - 'Notification', - 'SVGElementInstance', - 'Screen', - 'TextTrack', - 'TextTrackCue', - 'TextTrackList', - 'WebSocket', - 'WebSocketWorker', - 'Worker', - 'XMLHttpRequest', - 'XMLHttpRequestEventTarget', - 'XMLHttpRequestUpload' - ]; - for (var i = 0; i < eventTargets.length; i++) { - wrapEventTarget(eventTargets[i]); - } - }, - - /** - * Instrument browser built-ins w/ breadcrumb capturing - * - XMLHttpRequests - * - DOM interactions (click/typing) - * - window.location changes - * - console - * - * Can be disabled or individually configured via the `autoBreadcrumbs` config option - */ - _instrumentBreadcrumbs: function() { - var self = this; - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - - var wrappedBuiltIns = self._wrappedBuiltIns; - - function wrapProp(prop, xhr) { - if (prop in xhr && isFunction(xhr[prop])) { - fill(xhr, prop, function(orig) { - return self.wrap(orig); - }); // intentionally don't track filled methods on XHR instances - } - } - - if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) { - var xhrproto = XMLHttpRequest.prototype; - fill( - xhrproto, - 'open', - function(origOpen) { - return function(method, url) { - // preserve arity - - // if Sentry key appears in URL, don't capture - if (isString(url) && url.indexOf(self._globalKey) === -1) { - this.__raven_xhr = { - method: method, - url: url, - status_code: null - }; - } - - return origOpen.apply(this, arguments); - }; - }, - wrappedBuiltIns - ); - - fill( - xhrproto, - 'send', - function(origSend) { - return function(data) { - // preserve arity - var xhr = this; - - function onreadystatechangeHandler() { - if (xhr.__raven_xhr && xhr.readyState === 4) { - try { - // touching statusCode in some platforms throws - // an exception - xhr.__raven_xhr.status_code = xhr.status; - } catch (e) { - /* do nothing */ - } - - self.captureBreadcrumb({ - type: 'http', - category: 'xhr', - data: xhr.__raven_xhr - }); - } - } - - var props = ['onload', 'onerror', 'onprogress']; - for (var j = 0; j < props.length; j++) { - wrapProp(props[j], xhr); - } - - if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) { - fill( - xhr, - 'onreadystatechange', - function(orig) { - return self.wrap(orig, undefined, onreadystatechangeHandler); - } /* intentionally don't track this instrumentation */ - ); - } else { - // if onreadystatechange wasn't actually set by the page on this xhr, we - // are free to set our own and capture the breadcrumb - xhr.onreadystatechange = onreadystatechangeHandler; - } - - return origSend.apply(this, arguments); - }; - }, - wrappedBuiltIns - ); - } - - if (autoBreadcrumbs.xhr && 'fetch' in _window) { - fill( - _window, - 'fetch', - function(origFetch) { - return function(fn, t) { - // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - - var fetchInput = args[0]; - var method = 'GET'; - var url; - - if (typeof fetchInput === 'string') { - url = fetchInput; - } else if ('Request' in _window && fetchInput instanceof _window.Request) { - url = fetchInput.url; - if (fetchInput.method) { - method = fetchInput.method; - } - } else { - url = '' + fetchInput; - } - - if (args[1] && args[1].method) { - method = args[1].method; - } - - var fetchData = { - method: method, - url: url, - status_code: null - }; - - self.captureBreadcrumb({ - type: 'http', - category: 'fetch', - data: fetchData - }); - - return origFetch.apply(this, args).then(function(response) { - fetchData.status_code = response.status; - - return response; - }); - }; - }, - wrappedBuiltIns - ); - } - - // Capture breadcrumbs from any click that is unhandled / bubbled up all the way - // to the document. Do this before we instrument addEventListener. - if (autoBreadcrumbs.dom && this._hasDocument) { - if (_document.addEventListener) { - _document.addEventListener('click', self._breadcrumbEventHandler('click'), false); - _document.addEventListener('keypress', self._keypressEventHandler(), false); - } else { - // IE8 Compatibility - _document.attachEvent('onclick', self._breadcrumbEventHandler('click')); - _document.attachEvent('onkeypress', self._keypressEventHandler()); - } - } - - // record navigation (URL) changes - // NOTE: in Chrome App environment, touching history.pushState, *even inside - // a try/catch block*, will cause Chrome to output an error to console.error - // borrowed from: https://github.com/angular/angular.js/pull/13945/files - var chrome = _window.chrome; - var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime; - var hasPushAndReplaceState = - !isChromePackagedApp && - _window.history && - history.pushState && - history.replaceState; - if (autoBreadcrumbs.location && hasPushAndReplaceState) { - // TODO: remove onpopstate handler on uninstall() - var oldOnPopState = _window.onpopstate; - _window.onpopstate = function() { - var currentHref = self._location.href; - self._captureUrlChange(self._lastHref, currentHref); - - if (oldOnPopState) { - return oldOnPopState.apply(this, arguments); - } - }; - - var historyReplacementFunction = function(origHistFunction) { - // note history.pushState.length is 0; intentionally not declaring - // params to preserve 0 arity - return function(/* state, title, url */) { - var url = arguments.length > 2 ? arguments[2] : undefined; - - // url argument is optional - if (url) { - // coerce to string (this is what pushState does) - self._captureUrlChange(self._lastHref, url + ''); - } - - return origHistFunction.apply(this, arguments); - }; - }; - - fill(history, 'pushState', historyReplacementFunction, wrappedBuiltIns); - fill(history, 'replaceState', historyReplacementFunction, wrappedBuiltIns); - } - - if (autoBreadcrumbs.console && 'console' in _window && console.log) { - // console - var consoleMethodCallback = function(msg, data) { - self.captureBreadcrumb({ - message: msg, - level: data.level, - category: 'console' - }); - }; - - each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) { - wrapConsoleMethod(console, level, consoleMethodCallback); - }); - } - }, - - _restoreBuiltIns: function() { - // restore any wrapped builtins - var builtin; - while (this._wrappedBuiltIns.length) { - builtin = this._wrappedBuiltIns.shift(); - - var obj = builtin[0], - name = builtin[1], - orig = builtin[2]; - - obj[name] = orig; - } - }, - - _drainPlugins: function() { - var self = this; - - // FIX ME TODO - each(this._plugins, function(_, plugin) { - var installer = plugin[0]; - var args = plugin[1]; - installer.apply(self, [self].concat(args)); - }); - }, - - _parseDSN: function(str) { - var m = dsnPattern.exec(str), - dsn = {}, - i = 7; - - try { - while (i--) dsn[dsnKeys[i]] = m[i] || ''; - } catch (e) { - throw new RavenConfigError('Invalid DSN: ' + str); - } - - if (dsn.pass && !this._globalOptions.allowSecretKey) { - throw new RavenConfigError( - 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key' - ); - } - - return dsn; - }, - - _getGlobalServer: function(uri) { - // assemble the endpoint from the uri pieces - var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : ''); - - if (uri.protocol) { - globalServer = uri.protocol + ':' + globalServer; - } - return globalServer; - }, - - _handleOnErrorStackInfo: function() { - // if we are intentionally ignoring errors via onerror, bail out - if (!this._ignoreOnError) { - this._handleStackInfo.apply(this, arguments); - } - }, - - _handleStackInfo: function(stackInfo, options) { - var frames = this._prepareFrames(stackInfo, options); - - this._triggerEvent('handle', { - stackInfo: stackInfo, - options: options - }); - - this._processException( - stackInfo.name, - stackInfo.message, - stackInfo.url, - stackInfo.lineno, - frames, - options - ); - }, - - _prepareFrames: function(stackInfo, options) { - var self = this; - var frames = []; - if (stackInfo.stack && stackInfo.stack.length) { - each(stackInfo.stack, function(i, stack) { - var frame = self._normalizeFrame(stack, stackInfo.url); - if (frame) { - frames.push(frame); - } - }); - - // e.g. frames captured via captureMessage throw - if (options && options.trimHeadFrames) { - for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) { - frames[j].in_app = false; - } - } - } - frames = frames.slice(0, this._globalOptions.stackTraceLimit); - return frames; - }, - - _normalizeFrame: function(frame, stackInfoUrl) { - // normalize the frames data - var normalized = { - filename: frame.url, - lineno: frame.line, - colno: frame.column, - function: frame.func || '?' - }; - - // Case when we don't have any information about the error - // E.g. throwing a string or raw object, instead of an `Error` in Firefox - // Generating synthetic error doesn't add any value here - // - // We should probably somehow let a user know that they should fix their code - if (!frame.url) { - normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler - } - - normalized.in_app = !// determine if an exception came from outside of our app - // first we check the global includePaths list. - ( - (!!this._globalOptions.includePaths.test && - !this._globalOptions.includePaths.test(normalized.filename)) || - // Now we check for fun, if the function name is Raven or TraceKit - /(Raven|TraceKit)\./.test(normalized['function']) || - // finally, we do a last ditch effort and check for raven.min.js - /raven\.(min\.)?js$/.test(normalized.filename) - ); - - return normalized; - }, - - _processException: function(type, message, fileurl, lineno, frames, options) { - var prefixedMessage = (type ? type + ': ' : '') + (message || ''); - if ( - !!this._globalOptions.ignoreErrors.test && - (this._globalOptions.ignoreErrors.test(message) || - this._globalOptions.ignoreErrors.test(prefixedMessage)) - ) { - return; - } - - var stacktrace; - - if (frames && frames.length) { - fileurl = frames[0].filename || fileurl; - // Sentry expects frames oldest to newest - // and JS sends them as newest to oldest - frames.reverse(); - stacktrace = {frames: frames}; - } else if (fileurl) { - stacktrace = { - frames: [ - { - filename: fileurl, - lineno: lineno, - in_app: true - } - ] - }; - } - - if ( - !!this._globalOptions.ignoreUrls.test && - this._globalOptions.ignoreUrls.test(fileurl) - ) { - return; - } - - if ( - !!this._globalOptions.whitelistUrls.test && - !this._globalOptions.whitelistUrls.test(fileurl) - ) { - return; - } - - var data = objectMerge( - { - // sentry.interfaces.Exception - exception: { - values: [ - { - type: type, - value: message, - stacktrace: stacktrace - } - ] - }, - culprit: fileurl - }, - options - ); - - // Fire away! - this._send(data); - }, - - _trimPacket: function(data) { - // For now, we only want to truncate the two different messages - // but this could/should be expanded to just trim everything - var max = this._globalOptions.maxMessageLength; - if (data.message) { - data.message = truncate(data.message, max); - } - if (data.exception) { - var exception = data.exception.values[0]; - exception.value = truncate(exception.value, max); - } - - var request = data.request; - if (request) { - if (request.url) { - request.url = truncate(request.url, this._globalOptions.maxUrlLength); - } - if (request.Referer) { - request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength); - } - } - - if (data.breadcrumbs && data.breadcrumbs.values) - this._trimBreadcrumbs(data.breadcrumbs); - - return data; - }, - - /** - * Truncate breadcrumb values (right now just URLs) - */ - _trimBreadcrumbs: function(breadcrumbs) { - // known breadcrumb properties with urls - // TODO: also consider arbitrary prop values that start with (https?)?:// - var urlProps = ['to', 'from', 'url'], - urlProp, - crumb, - data; - - for (var i = 0; i < breadcrumbs.values.length; ++i) { - crumb = breadcrumbs.values[i]; - if ( - !crumb.hasOwnProperty('data') || - !isObject(crumb.data) || - objectFrozen(crumb.data) - ) - continue; - - data = objectMerge({}, crumb.data); - for (var j = 0; j < urlProps.length; ++j) { - urlProp = urlProps[j]; - if (data.hasOwnProperty(urlProp) && data[urlProp]) { - data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength); - } - } - breadcrumbs.values[i].data = data; - } - }, - - _getHttpData: function() { - if (!this._hasNavigator && !this._hasDocument) return; - var httpData = {}; - - if (this._hasNavigator && _navigator.userAgent) { - httpData.headers = { - 'User-Agent': navigator.userAgent - }; - } - - if (this._hasDocument) { - if (_document.location && _document.location.href) { - httpData.url = _document.location.href; - } - if (_document.referrer) { - if (!httpData.headers) httpData.headers = {}; - httpData.headers.Referer = _document.referrer; - } - } - - return httpData; - }, - - _resetBackoff: function() { - this._backoffDuration = 0; - this._backoffStart = null; - }, - - _shouldBackoff: function() { - return this._backoffDuration && now() - this._backoffStart < this._backoffDuration; - }, - - /** - * Returns true if the in-process data payload matches the signature - * of the previously-sent data - * - * NOTE: This has to be done at this level because TraceKit can generate - * data from window.onerror WITHOUT an exception object (IE8, IE9, - * other old browsers). This can take the form of an "exception" - * data object with a single frame (derived from the onerror args). - */ - _isRepeatData: function(current) { - var last = this._lastData; - - if ( - !last || - current.message !== last.message || // defined for captureMessage - current.culprit !== last.culprit // defined for captureException/onerror - ) - return false; - - // Stacktrace interface (i.e. from captureMessage) - if (current.stacktrace || last.stacktrace) { - return isSameStacktrace(current.stacktrace, last.stacktrace); - } else if (current.exception || last.exception) { - // Exception interface (i.e. from captureException/onerror) - return isSameException(current.exception, last.exception); - } - - return true; - }, - - _setBackoffState: function(request) { - // If we are already in a backoff state, don't change anything - if (this._shouldBackoff()) { - return; - } - - var status = request.status; - - // 400 - project_id doesn't exist or some other fatal - // 401 - invalid/revoked dsn - // 429 - too many requests - if (!(status === 400 || status === 401 || status === 429)) return; - - var retry; - try { - // If Retry-After is not in Access-Control-Expose-Headers, most - // browsers will throw an exception trying to access it - retry = request.getResponseHeader('Retry-After'); - retry = parseInt(retry, 10) * 1000; // Retry-After is returned in seconds - } catch (e) { - /* eslint no-empty:0 */ - } - - this._backoffDuration = retry - ? // If Sentry server returned a Retry-After value, use it - retry - : // Otherwise, double the last backoff duration (starts at 1 sec) - this._backoffDuration * 2 || 1000; - - this._backoffStart = now(); - }, - - _send: function(data) { - var globalOptions = this._globalOptions; - - var baseData = { - project: this._globalProject, - logger: globalOptions.logger, - platform: 'javascript' - }, - httpData = this._getHttpData(); - - if (httpData) { - baseData.request = httpData; - } - - // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload - if (data.trimHeadFrames) delete data.trimHeadFrames; - - data = objectMerge(baseData, data); - - // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge - data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags); - data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra); - - // Send along our own collected metadata with extra - data.extra['session:duration'] = now() - this._startTime; - - if (this._breadcrumbs && this._breadcrumbs.length > 0) { - // intentionally make shallow copy so that additions - // to breadcrumbs aren't accidentally sent in this request - data.breadcrumbs = { - values: [].slice.call(this._breadcrumbs, 0) - }; - } - - // If there are no tags/extra, strip the key from the payload alltogther. - if (isEmptyObject(data.tags)) delete data.tags; - - if (this._globalContext.user) { - // sentry.interfaces.User - data.user = this._globalContext.user; - } - - // Include the environment if it's defined in globalOptions - if (globalOptions.environment) data.environment = globalOptions.environment; - - // Include the release if it's defined in globalOptions - if (globalOptions.release) data.release = globalOptions.release; - - // Include server_name if it's defined in globalOptions - if (globalOptions.serverName) data.server_name = globalOptions.serverName; - - if (isFunction(globalOptions.dataCallback)) { - data = globalOptions.dataCallback(data) || data; - } - - // Why?????????? - if (!data || isEmptyObject(data)) { - return; - } - - // Check if the request should be filtered or not - if ( - isFunction(globalOptions.shouldSendCallback) && - !globalOptions.shouldSendCallback(data) - ) { - return; - } - - // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests), - // so drop requests until "cool-off" period has elapsed. - if (this._shouldBackoff()) { - this._logDebug('warn', 'Raven dropped error due to backoff: ', data); - return; - } - - if (typeof globalOptions.sampleRate === 'number') { - if (Math.random() < globalOptions.sampleRate) { - this._sendProcessedPayload(data); - } - } else { - this._sendProcessedPayload(data); - } - }, - - _getUuid: function() { - return uuid4(); - }, - - _sendProcessedPayload: function(data, callback) { - var self = this; - var globalOptions = this._globalOptions; - - if (!this.isSetup()) return; - - // Try and clean up the packet before sending by truncating long values - data = this._trimPacket(data); - - // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback, - // but this would require copying an un-truncated copy of the data packet, which can be - // arbitrarily deep (extra_data) -- could be worthwhile? will revisit - if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) { - this._logDebug('warn', 'Raven dropped repeat event: ', data); - return; - } - - // Send along an event_id if not explicitly passed. - // This event_id can be used to reference the error within Sentry itself. - // Set lastEventId after we know the error should actually be sent - this._lastEventId = data.event_id || (data.event_id = this._getUuid()); - - // Store outbound payload after trim - this._lastData = data; - - this._logDebug('debug', 'Raven about to send:', data); - - var auth = { - sentry_version: '7', - sentry_client: 'raven-js/' + this.VERSION, - sentry_key: this._globalKey - }; - - if (this._globalSecret) { - auth.sentry_secret = this._globalSecret; - } - - var exception = data.exception && data.exception.values[0]; - this.captureBreadcrumb({ - category: 'sentry', - message: exception - ? (exception.type ? exception.type + ': ' : '') + exception.value - : data.message, - event_id: data.event_id, - level: data.level || 'error' // presume error unless specified - }); - - var url = this._globalEndpoint; - (globalOptions.transport || this._makeRequest).call(this, { - url: url, - auth: auth, - data: data, - options: globalOptions, - onSuccess: function success() { - self._resetBackoff(); - - self._triggerEvent('success', { - data: data, - src: url - }); - callback && callback(); - }, - onError: function failure(error) { - self._logDebug('error', 'Raven transport failed to send: ', error); - - if (error.request) { - self._setBackoffState(error.request); - } - - self._triggerEvent('failure', { - data: data, - src: url - }); - error = error || new Error('Raven send failed (no additional details provided)'); - callback && callback(error); - } - }); - }, - - _makeRequest: function(opts) { - var request = _window.XMLHttpRequest && new _window.XMLHttpRequest(); - if (!request) return; - - // if browser doesn't support CORS (e.g. IE7), we are out of luck - var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined'; - - if (!hasCORS) return; - - var url = opts.url; - - if ('withCredentials' in request) { - request.onreadystatechange = function() { - if (request.readyState !== 4) { - return; - } else if (request.status === 200) { - opts.onSuccess && opts.onSuccess(); - } else if (opts.onError) { - var err = new Error('Sentry error code: ' + request.status); - err.request = request; - opts.onError(err); - } - }; - } else { - request = new XDomainRequest(); - // xdomainrequest cannot go http -> https (or vice versa), - // so always use protocol relative - url = url.replace(/^https?:/, ''); - - // onreadystatechange not supported by XDomainRequest - if (opts.onSuccess) { - request.onload = opts.onSuccess; - } - if (opts.onError) { - request.onerror = function() { - var err = new Error('Sentry error code: XDomainRequest'); - err.request = request; - opts.onError(err); - }; - } - } - - // NOTE: auth is intentionally sent as part of query string (NOT as custom - // HTTP header) so as to avoid preflight CORS requests - request.open('POST', url + '?' + urlencode(opts.auth)); - request.send(stringify(opts.data)); - }, - - _logDebug: function(level) { - if (this._originalConsoleMethods[level] && this.debug) { - // In IE<10 console methods do not have their own 'apply' method - Function.prototype.apply.call( - this._originalConsoleMethods[level], - this._originalConsole, - [].slice.call(arguments, 1) - ); - } - }, - - _mergeContext: function(key, context) { - if (isUndefined(context)) { - delete this._globalContext[key]; - } else { - this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context); - } - } -}; - -// Deprecations -Raven.prototype.setUser = Raven.prototype.setUserContext; -Raven.prototype.setReleaseContext = Raven.prototype.setRelease; - -module.exports = Raven; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/singleton.js": -/*!************************************************!*\ - !*** ./node_modules/raven-js/src/singleton.js ***! - \************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/** - * Enforces a single instance of the Raven client, and the - * main entry point for Raven. If you are a consumer of the - * Raven library, you SHOULD load this file (vs raven.js). - **/ - -var RavenConstructor = __webpack_require__(/*! ./raven */ "./node_modules/raven-js/src/raven.js"); - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; -var _Raven = _window.Raven; - -var Raven = new RavenConstructor(); - -/* - * Allow multiple versions of Raven to be installed. - * Strip Raven from the global context and returns the instance. - * - * @return {Raven} - */ -Raven.noConflict = function() { - _window.Raven = _Raven; - return Raven; -}; - -Raven.afterLoad(); - -module.exports = Raven; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/utils.js": -/*!********************************************!*\ - !*** ./node_modules/raven-js/src/utils.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; - -function isObject(what) { - return typeof what === 'object' && what !== null; -} - -// Yanked from https://git.io/vS8DV re-used under CC0 -// with some tiny modifications -function isError(value) { - switch ({}.toString.call(value)) { - case '[object Error]': - return true; - case '[object Exception]': - return true; - case '[object DOMException]': - return true; - default: - return value instanceof Error; - } -} - -function isErrorEvent(value) { - return supportsErrorEvent() && {}.toString.call(value) === '[object ErrorEvent]'; -} - -function isUndefined(what) { - return what === void 0; -} - -function isFunction(what) { - return typeof what === 'function'; -} - -function isString(what) { - return Object.prototype.toString.call(what) === '[object String]'; -} - -function isEmptyObject(what) { - for (var _ in what) return false; // eslint-disable-line guard-for-in, no-unused-vars - return true; -} - -function supportsErrorEvent() { - try { - new ErrorEvent(''); // eslint-disable-line no-new - return true; - } catch (e) { - return false; - } -} - -function wrappedCallback(callback) { - function dataCallback(data, original) { - var normalizedData = callback(data) || data; - if (original) { - return original(normalizedData) || normalizedData; - } - return normalizedData; - } - - return dataCallback; -} - -function each(obj, callback) { - var i, j; - - if (isUndefined(obj.length)) { - for (i in obj) { - if (hasKey(obj, i)) { - callback.call(null, i, obj[i]); - } - } - } else { - j = obj.length; - if (j) { - for (i = 0; i < j; i++) { - callback.call(null, i, obj[i]); - } - } - } -} - -function objectMerge(obj1, obj2) { - if (!obj2) { - return obj1; - } - each(obj2, function(key, value) { - obj1[key] = value; - }); - return obj1; -} - -/** - * This function is only used for react-native. - * react-native freezes object that have already been sent over the - * js bridge. We need this function in order to check if the object is frozen. - * So it's ok that objectFrozen returns false if Object.isFrozen is not - * supported because it's not relevant for other "platforms". See related issue: - * https://github.com/getsentry/react-native-sentry/issues/57 - */ -function objectFrozen(obj) { - if (!Object.isFrozen) { - return false; - } - return Object.isFrozen(obj); -} - -function truncate(str, max) { - return !max || str.length <= max ? str : str.substr(0, max) + '\u2026'; -} - -/** - * hasKey, a better form of hasOwnProperty - * Example: hasKey(MainHostObject, property) === true/false - * - * @param {Object} host object to check property - * @param {string} key to check - */ -function hasKey(object, key) { - return Object.prototype.hasOwnProperty.call(object, key); -} - -function joinRegExp(patterns) { - // Combine an array of regular expressions and strings into one large regexp - // Be mad. - var sources = [], - i = 0, - len = patterns.length, - pattern; - - for (; i < len; i++) { - pattern = patterns[i]; - if (isString(pattern)) { - // If it's a string, we need to escape it - // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions - sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1')); - } else if (pattern && pattern.source) { - // If it's a regexp already, we want to extract the source - sources.push(pattern.source); - } - // Intentionally skip other cases - } - return new RegExp(sources.join('|'), 'i'); -} - -function urlencode(o) { - var pairs = []; - each(o, function(key, value) { - pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); - }); - return pairs.join('&'); -} - -// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B -// intentionally using regex and not href parsing trick because React Native and other -// environments where DOM might not be available -function parseUrl(url) { - var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); - if (!match) return {}; - - // coerce to undefined values to empty string so we don't get 'undefined' - var query = match[6] || ''; - var fragment = match[8] || ''; - return { - protocol: match[2], - host: match[4], - path: match[5], - relative: match[5] + query + fragment // everything minus origin - }; -} -function uuid4() { - var crypto = _window.crypto || _window.msCrypto; - - if (!isUndefined(crypto) && crypto.getRandomValues) { - // Use window.crypto API if available - // eslint-disable-next-line no-undef - var arr = new Uint16Array(8); - crypto.getRandomValues(arr); - - // set 4 in byte 7 - arr[3] = (arr[3] & 0xfff) | 0x4000; - // set 2 most significant bits of byte 9 to '10' - arr[4] = (arr[4] & 0x3fff) | 0x8000; - - var pad = function(num) { - var v = num.toString(16); - while (v.length < 4) { - v = '0' + v; - } - return v; - }; - - return ( - pad(arr[0]) + - pad(arr[1]) + - pad(arr[2]) + - pad(arr[3]) + - pad(arr[4]) + - pad(arr[5]) + - pad(arr[6]) + - pad(arr[7]) - ); - } else { - // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 - return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = (Math.random() * 16) | 0, - v = c === 'x' ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); - } -} - -/** - * Given a child DOM element, returns a query-selector statement describing that - * and its ancestors - * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz] - * @param elem - * @returns {string} - */ -function htmlTreeAsString(elem) { - /* eslint no-extra-parens:0*/ - var MAX_TRAVERSE_HEIGHT = 5, - MAX_OUTPUT_LEN = 80, - out = [], - height = 0, - len = 0, - separator = ' > ', - sepLength = separator.length, - nextStr; - - while (elem && height++ < MAX_TRAVERSE_HEIGHT) { - nextStr = htmlElementAsString(elem); - // bail out if - // - nextStr is the 'html' element - // - the length of the string that would be created exceeds MAX_OUTPUT_LEN - // (ignore this limit if we are on the first iteration) - if ( - nextStr === 'html' || - (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN) - ) { - break; - } - - out.push(nextStr); - - len += nextStr.length; - elem = elem.parentNode; - } - - return out.reverse().join(separator); -} - -/** - * Returns a simple, query-selector representation of a DOM element - * e.g. [HTMLElement] => input#foo.btn[name=baz] - * @param HTMLElement - * @returns {string} - */ -function htmlElementAsString(elem) { - var out = [], - className, - classes, - key, - attr, - i; - - if (!elem || !elem.tagName) { - return ''; - } - - out.push(elem.tagName.toLowerCase()); - if (elem.id) { - out.push('#' + elem.id); - } - - className = elem.className; - if (className && isString(className)) { - classes = className.split(/\s+/); - for (i = 0; i < classes.length; i++) { - out.push('.' + classes[i]); - } - } - var attrWhitelist = ['type', 'name', 'title', 'alt']; - for (i = 0; i < attrWhitelist.length; i++) { - key = attrWhitelist[i]; - attr = elem.getAttribute(key); - if (attr) { - out.push('[' + key + '="' + attr + '"]'); - } - } - return out.join(''); -} - -/** - * Returns true if either a OR b is truthy, but not both - */ -function isOnlyOneTruthy(a, b) { - return !!(!!a ^ !!b); -} - -/** - * Returns true if the two input exception interfaces have the same content - */ -function isSameException(ex1, ex2) { - if (isOnlyOneTruthy(ex1, ex2)) return false; - - ex1 = ex1.values[0]; - ex2 = ex2.values[0]; - - if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false; - - return isSameStacktrace(ex1.stacktrace, ex2.stacktrace); -} - -/** - * Returns true if the two input stack trace interfaces have the same content - */ -function isSameStacktrace(stack1, stack2) { - if (isOnlyOneTruthy(stack1, stack2)) return false; - - var frames1 = stack1.frames; - var frames2 = stack2.frames; - - // Exit early if frame count differs - if (frames1.length !== frames2.length) return false; - - // Iterate through every frame; bail out if anything differs - var a, b; - for (var i = 0; i < frames1.length; i++) { - a = frames1[i]; - b = frames2[i]; - if ( - a.filename !== b.filename || - a.lineno !== b.lineno || - a.colno !== b.colno || - a['function'] !== b['function'] - ) - return false; - } - return true; -} - -/** - * Polyfill a method - * @param obj object e.g. `document` - * @param name method name present on object e.g. `addEventListener` - * @param replacement replacement function - * @param track {optional} record instrumentation to an array - */ -function fill(obj, name, replacement, track) { - var orig = obj[name]; - obj[name] = replacement(orig); - if (track) { - track.push([obj, name, orig]); - } -} - -module.exports = { - isObject: isObject, - isError: isError, - isErrorEvent: isErrorEvent, - isUndefined: isUndefined, - isFunction: isFunction, - isString: isString, - isEmptyObject: isEmptyObject, - supportsErrorEvent: supportsErrorEvent, - wrappedCallback: wrappedCallback, - each: each, - objectMerge: objectMerge, - truncate: truncate, - objectFrozen: objectFrozen, - hasKey: hasKey, - joinRegExp: joinRegExp, - urlencode: urlencode, - uuid4: uuid4, - htmlTreeAsString: htmlTreeAsString, - htmlElementAsString: htmlElementAsString, - isSameException: isSameException, - isSameStacktrace: isSameStacktrace, - parseUrl: parseUrl, - fill: fill -}; - - -/***/ }), - -/***/ "./node_modules/raven-js/vendor/TraceKit/tracekit.js": -/*!***********************************************************!*\ - !*** ./node_modules/raven-js/vendor/TraceKit/tracekit.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var utils = __webpack_require__(/*! ../../src/utils */ "./node_modules/raven-js/src/utils.js"); - -/* - TraceKit - Cross brower stack traces - - This was originally forked from github.com/occ/TraceKit, but has since been - largely re-written and is now maintained as part of raven-js. Tests for - this are in test/vendor. - - MIT license -*/ - -var TraceKit = { - collectWindowErrors: true, - debug: false -}; - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; - -// global reference to slice -var _slice = [].slice; -var UNKNOWN_FUNCTION = '?'; - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types -var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/; - -function getLocationHref() { - if (typeof document === 'undefined' || document.location == null) return ''; - - return document.location.href; -} - -/** - * TraceKit.report: cross-browser processing of unhandled exceptions - * - * Syntax: - * TraceKit.report.subscribe(function(stackInfo) { ... }) - * TraceKit.report.unsubscribe(function(stackInfo) { ... }) - * TraceKit.report(exception) - * try { ...code... } catch(ex) { TraceKit.report(ex); } - * - * Supports: - * - Firefox: full stack trace with line numbers, plus column number - * on top frame; column number is not guaranteed - * - Opera: full stack trace with line and column numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - IE: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - * In theory, TraceKit should work on all of the following versions: - * - IE5.5+ (only 8.0 tested) - * - Firefox 0.9+ (only 3.5+ tested) - * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require - * Exceptions Have Stacktrace to be enabled in opera:config) - * - Safari 3+ (only 4+ tested) - * - Chrome 1+ (only 5+ tested) - * - Konqueror 3.5+ (untested) - * - * Requires TraceKit.computeStackTrace. - * - * Tries to catch all unhandled exceptions and report them to the - * subscribed handlers. Please note that TraceKit.report will rethrow the - * exception. This is REQUIRED in order to get a useful stack trace in IE. - * If the exception does not reach the top of the browser, you will only - * get a stack trace from the point where TraceKit.report was called. - * - * Handlers receive a stackInfo object as described in the - * TraceKit.computeStackTrace docs. - */ -TraceKit.report = (function reportModuleWrapper() { - var handlers = [], - lastArgs = null, - lastException = null, - lastExceptionStack = null; - - /** - * Add a crash handler. - * @param {Function} handler - */ - function subscribe(handler) { - installGlobalHandler(); - handlers.push(handler); - } - - /** - * Remove a crash handler. - * @param {Function} handler - */ - function unsubscribe(handler) { - for (var i = handlers.length - 1; i >= 0; --i) { - if (handlers[i] === handler) { - handlers.splice(i, 1); - } - } - } - - /** - * Remove all crash handlers. - */ - function unsubscribeAll() { - uninstallGlobalHandler(); - handlers = []; - } - - /** - * Dispatch stack information to all handlers. - * @param {Object.} stack - */ - function notifyHandlers(stack, isWindowError) { - var exception = null; - if (isWindowError && !TraceKit.collectWindowErrors) { - return; - } - for (var i in handlers) { - if (handlers.hasOwnProperty(i)) { - try { - handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); - } catch (inner) { - exception = inner; - } - } - } - - if (exception) { - throw exception; - } - } - - var _oldOnerrorHandler, _onErrorHandlerInstalled; - - /** - * Ensures all global unhandled exceptions are recorded. - * Supported by Gecko and IE. - * @param {string} message Error message. - * @param {string} url URL of script that generated the exception. - * @param {(number|string)} lineNo The line number at which the error - * occurred. - * @param {?(number|string)} colNo The column number at which the error - * occurred. - * @param {?Error} ex The actual Error object. - */ - function traceKitWindowOnError(message, url, lineNo, colNo, ex) { - var stack = null; - - if (lastExceptionStack) { - TraceKit.computeStackTrace.augmentStackTraceWithInitialElement( - lastExceptionStack, - url, - lineNo, - message - ); - processLastException(); - } else if (ex && utils.isError(ex)) { - // non-string `ex` arg; attempt to extract stack trace - - // New chrome and blink send along a real error object - // Let's just report that like a normal error. - // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror - stack = TraceKit.computeStackTrace(ex); - notifyHandlers(stack, true); - } else { - var location = { - url: url, - line: lineNo, - column: colNo - }; - - var name = undefined; - var msg = message; // must be new var or will modify original `arguments` - var groups; - if ({}.toString.call(message) === '[object String]') { - var groups = message.match(ERROR_TYPES_RE); - if (groups) { - name = groups[1]; - msg = groups[2]; - } - } - - location.func = UNKNOWN_FUNCTION; - - stack = { - name: name, - message: msg, - url: getLocationHref(), - stack: [location] - }; - notifyHandlers(stack, true); - } - - if (_oldOnerrorHandler) { - return _oldOnerrorHandler.apply(this, arguments); - } - - return false; - } - - function installGlobalHandler() { - if (_onErrorHandlerInstalled) { - return; - } - _oldOnerrorHandler = _window.onerror; - _window.onerror = traceKitWindowOnError; - _onErrorHandlerInstalled = true; - } - - function uninstallGlobalHandler() { - if (!_onErrorHandlerInstalled) { - return; - } - _window.onerror = _oldOnerrorHandler; - _onErrorHandlerInstalled = false; - _oldOnerrorHandler = undefined; - } - - function processLastException() { - var _lastExceptionStack = lastExceptionStack, - _lastArgs = lastArgs; - lastArgs = null; - lastExceptionStack = null; - lastException = null; - notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs)); - } - - /** - * Reports an unhandled Error to TraceKit. - * @param {Error} ex - * @param {?boolean} rethrow If false, do not re-throw the exception. - * Only used for window.onerror to not cause an infinite loop of - * rethrowing. - */ - function report(ex, rethrow) { - var args = _slice.call(arguments, 1); - if (lastExceptionStack) { - if (lastException === ex) { - return; // already caught by an inner catch block, ignore - } else { - processLastException(); - } - } - - var stack = TraceKit.computeStackTrace(ex); - lastExceptionStack = stack; - lastException = ex; - lastArgs = args; - - // If the stack trace is incomplete, wait for 2 seconds for - // slow slow IE to see if onerror occurs or not before reporting - // this exception; otherwise, we will end up with an incomplete - // stack trace - setTimeout(function() { - if (lastException === ex) { - processLastException(); - } - }, stack.incomplete ? 2000 : 0); - - if (rethrow !== false) { - throw ex; // re-throw to propagate to the top level (and cause window.onerror) - } - } - - report.subscribe = subscribe; - report.unsubscribe = unsubscribe; - report.uninstall = unsubscribeAll; - return report; -})(); - -/** - * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript - * - * Syntax: - * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below) - * Returns: - * s.name - exception name - * s.message - exception message - * s.stack[i].url - JavaScript or HTML file URL - * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work) - * s.stack[i].args - arguments passed to the function, if known - * s.stack[i].line - line number, if known - * s.stack[i].column - column number, if known - * - * Supports: - * - Firefox: full stack trace with line numbers and unreliable column - * number on top frame - * - Opera 10: full stack trace with line and column numbers - * - Opera 9-: full stack trace with line numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the topmost stacktrace element - * only - * - IE: no line numbers whatsoever - * - * Tries to guess names of anonymous functions by looking for assignments - * in the source code. In IE and Safari, we have to guess source file names - * by searching for function bodies inside all page scripts. This will not - * work for scripts that are loaded cross-domain. - * Here be dragons: some function names may be guessed incorrectly, and - * duplicate functions may be mismatched. - * - * TraceKit.computeStackTrace should only be used for tracing purposes. - * Logging of unhandled exceptions should be done with TraceKit.report, - * which builds on top of TraceKit.computeStackTrace and provides better - * IE support by utilizing the window.onerror event to retrieve information - * about the top of the stack. - * - * Note: In IE and Safari, no stack trace is recorded on the Error object, - * so computeStackTrace instead walks its *own* chain of callers. - * This means that: - * * in Safari, some methods may be missing from the stack trace; - * * in IE, the topmost function in the stack trace will always be the - * caller of computeStackTrace. - * - * This is okay for tracing (because you are likely to be calling - * computeStackTrace from the function you want to be the topmost element - * of the stack trace anyway), but not okay for logging unhandled - * exceptions (because your catch block will likely be far away from the - * inner function that actually caused the exception). - * - */ -TraceKit.computeStackTrace = (function computeStackTraceWrapper() { - // Contents of Exception in various browsers. - // - // SAFARI: - // ex.message = Can't find variable: qq - // ex.line = 59 - // ex.sourceId = 580238192 - // ex.sourceURL = http://... - // ex.expressionBeginOffset = 96 - // ex.expressionCaretOffset = 98 - // ex.expressionEndOffset = 98 - // ex.name = ReferenceError - // - // FIREFOX: - // ex.message = qq is not defined - // ex.fileName = http://... - // ex.lineNumber = 59 - // ex.columnNumber = 69 - // ex.stack = ...stack trace... (see the example below) - // ex.name = ReferenceError - // - // CHROME: - // ex.message = qq is not defined - // ex.name = ReferenceError - // ex.type = not_defined - // ex.arguments = ['aa'] - // ex.stack = ...stack trace... - // - // INTERNET EXPLORER: - // ex.message = ... - // ex.name = ReferenceError - // - // OPERA: - // ex.message = ...message... (see the example below) - // ex.name = ReferenceError - // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message) - // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace' - - /** - * Computes stack trace information from the stack property. - * Chrome and Gecko use this property. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceFromStackProp(ex) { - if (typeof ex.stack === 'undefined' || !ex.stack) return; - - var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i, - gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i, - winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i, - // Used to additionally parse URL/line/column from eval frames - geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i, - chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/, - lines = ex.stack.split('\n'), - stack = [], - submatch, - parts, - element, - reference = /^(.*) is undefined$/.exec(ex.message); - - for (var i = 0, j = lines.length; i < j; ++i) { - if ((parts = chrome.exec(lines[i]))) { - var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line - var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line - if (isEval && (submatch = chromeEval.exec(parts[2]))) { - // throw out eval line/column and use top-most line/column number - parts[2] = submatch[1]; // url - parts[3] = submatch[2]; // line - parts[4] = submatch[3]; // column - } - element = { - url: !isNative ? parts[2] : null, - func: parts[1] || UNKNOWN_FUNCTION, - args: isNative ? [parts[2]] : [], - line: parts[3] ? +parts[3] : null, - column: parts[4] ? +parts[4] : null - }; - } else if ((parts = winjs.exec(lines[i]))) { - element = { - url: parts[2], - func: parts[1] || UNKNOWN_FUNCTION, - args: [], - line: +parts[3], - column: parts[4] ? +parts[4] : null - }; - } else if ((parts = gecko.exec(lines[i]))) { - var isEval = parts[3] && parts[3].indexOf(' > eval') > -1; - if (isEval && (submatch = geckoEval.exec(parts[3]))) { - // throw out eval line/column and use top-most line number - parts[3] = submatch[1]; - parts[4] = submatch[2]; - parts[5] = null; // no column when eval - } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') { - // FireFox uses this awesome columnNumber property for its top frame - // Also note, Firefox's column number is 0-based and everything else expects 1-based, - // so adding 1 - // NOTE: this hack doesn't work if top-most frame is eval - stack[0].column = ex.columnNumber + 1; - } - element = { - url: parts[3], - func: parts[1] || UNKNOWN_FUNCTION, - args: parts[2] ? parts[2].split(',') : [], - line: parts[4] ? +parts[4] : null, - column: parts[5] ? +parts[5] : null - }; - } else { - continue; - } - - if (!element.func && element.line) { - element.func = UNKNOWN_FUNCTION; - } - - stack.push(element); - } - - if (!stack.length) { - return null; - } - - return { - name: ex.name, - message: ex.message, - url: getLocationHref(), - stack: stack - }; - } - - /** - * Adds information about the first frame to incomplete stack traces. - * Safari and IE require this to get complete data on the first frame. - * @param {Object.} stackInfo Stack trace information from - * one of the compute* methods. - * @param {string} url The URL of the script that caused an error. - * @param {(number|string)} lineNo The line number of the script that - * caused an error. - * @param {string=} message The error generated by the browser, which - * hopefully contains the name of the object that caused the error. - * @return {boolean} Whether or not the stack information was - * augmented. - */ - function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) { - var initial = { - url: url, - line: lineNo - }; - - if (initial.url && initial.line) { - stackInfo.incomplete = false; - - if (!initial.func) { - initial.func = UNKNOWN_FUNCTION; - } - - if (stackInfo.stack.length > 0) { - if (stackInfo.stack[0].url === initial.url) { - if (stackInfo.stack[0].line === initial.line) { - return false; // already in stack trace - } else if ( - !stackInfo.stack[0].line && - stackInfo.stack[0].func === initial.func - ) { - stackInfo.stack[0].line = initial.line; - return false; - } - } - } - - stackInfo.stack.unshift(initial); - stackInfo.partial = true; - return true; - } else { - stackInfo.incomplete = true; - } - - return false; - } - - /** - * Computes stack trace information by walking the arguments.caller - * chain at the time the exception occurred. This will cause earlier - * frames to be missed but is the only way to get any stack trace in - * Safari and IE. The top frame is restored by - * {@link augmentStackTraceWithInitialElement}. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceByWalkingCallerChain(ex, depth) { - var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i, - stack = [], - funcs = {}, - recursion = false, - parts, - item, - source; - - for ( - var curr = computeStackTraceByWalkingCallerChain.caller; - curr && !recursion; - curr = curr.caller - ) { - if (curr === computeStackTrace || curr === TraceKit.report) { - // console.log('skipping internal function'); - continue; - } - - item = { - url: null, - func: UNKNOWN_FUNCTION, - line: null, - column: null - }; - - if (curr.name) { - item.func = curr.name; - } else if ((parts = functionName.exec(curr.toString()))) { - item.func = parts[1]; - } - - if (typeof item.func === 'undefined') { - try { - item.func = parts.input.substring(0, parts.input.indexOf('{')); - } catch (e) {} - } - - if (funcs['' + curr]) { - recursion = true; - } else { - funcs['' + curr] = true; - } - - stack.push(item); - } - - if (depth) { - // console.log('depth is ' + depth); - // console.log('stack is ' + stack.length); - stack.splice(0, depth); - } - - var result = { - name: ex.name, - message: ex.message, - url: getLocationHref(), - stack: stack - }; - augmentStackTraceWithInitialElement( - result, - ex.sourceURL || ex.fileName, - ex.line || ex.lineNumber, - ex.message || ex.description - ); - return result; - } - - /** - * Computes a stack trace for an exception. - * @param {Error} ex - * @param {(string|number)=} depth - */ - function computeStackTrace(ex, depth) { - var stack = null; - depth = depth == null ? 0 : +depth; - - try { - stack = computeStackTraceFromStackProp(ex); - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - - try { - stack = computeStackTraceByWalkingCallerChain(ex, depth + 1); - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - return { - name: ex.name, - message: ex.message, - url: getLocationHref() - }; - } - - computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement; - computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp; - - return computeStackTrace; -})(); - -module.exports = TraceKit; - - -/***/ }), - -/***/ "./node_modules/raven-js/vendor/json-stringify-safe/stringify.js": -/*!***********************************************************************!*\ - !*** ./node_modules/raven-js/vendor/json-stringify-safe/stringify.js ***! - \***********************************************************************/ -/***/ ((module, exports) => { - -/* - json-stringify-safe - Like JSON.stringify, but doesn't throw on circular references. - - Originally forked from https://github.com/isaacs/json-stringify-safe - version 5.0.1 on 3/8/2017 and modified to handle Errors serialization - and IE8 compatibility. Tests for this are in test/vendor. - - ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE -*/ - -exports = module.exports = stringify; -exports.getSerialize = serializer; - -function indexOf(haystack, needle) { - for (var i = 0; i < haystack.length; ++i) { - if (haystack[i] === needle) return i; - } - return -1; -} - -function stringify(obj, replacer, spaces, cycleReplacer) { - return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces); -} - -// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106 -function stringifyError(value) { - var err = { - // These properties are implemented as magical getters and don't show up in for in - stack: value.stack, - message: value.message, - name: value.name - }; - - for (var i in value) { - if (Object.prototype.hasOwnProperty.call(value, i)) { - err[i] = value[i]; - } - } - - return err; -} - -function serializer(replacer, cycleReplacer) { - var stack = []; - var keys = []; - - if (cycleReplacer == null) { - cycleReplacer = function(key, value) { - if (stack[0] === value) { - return '[Circular ~]'; - } - return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']'; - }; - } - - return function(key, value) { - if (stack.length > 0) { - var thisPos = indexOf(stack, this); - ~thisPos ? stack.splice(thisPos + 1) : stack.push(this); - ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key); - - if (~indexOf(stack, value)) { - value = cycleReplacer.call(this, key, value); - } - } else { - stack.push(value); - } - - return replacer == null - ? value instanceof Error ? stringifyError(value) : value - : replacer.call(this, key, value); - }; -} - - -/***/ }), - -/***/ "./node_modules/react/cjs/react-jsx-runtime.development.js": -/*!*****************************************************************!*\ - !*** ./node_modules/react/cjs/react-jsx-runtime.development.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; -/** @license React v17.0.2 - * react-jsx-runtime.development.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - -if (true) { - (function() { -'use strict'; - -var React = __webpack_require__(/*! react */ "react"); -var _assign = __webpack_require__(/*! object-assign */ "./node_modules/object-assign/index.js"); - -// ATTENTION -// When adding new symbols to this file, -// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' -// The Symbol used to tag the ReactElement-like types. If there is no native Symbol -// nor polyfill, then a plain number is used for performance. -var REACT_ELEMENT_TYPE = 0xeac7; -var REACT_PORTAL_TYPE = 0xeaca; -exports.Fragment = 0xeacb; -var REACT_STRICT_MODE_TYPE = 0xeacc; -var REACT_PROFILER_TYPE = 0xead2; -var REACT_PROVIDER_TYPE = 0xeacd; -var REACT_CONTEXT_TYPE = 0xeace; -var REACT_FORWARD_REF_TYPE = 0xead0; -var REACT_SUSPENSE_TYPE = 0xead1; -var REACT_SUSPENSE_LIST_TYPE = 0xead8; -var REACT_MEMO_TYPE = 0xead3; -var REACT_LAZY_TYPE = 0xead4; -var REACT_BLOCK_TYPE = 0xead9; -var REACT_SERVER_BLOCK_TYPE = 0xeada; -var REACT_FUNDAMENTAL_TYPE = 0xead5; -var REACT_SCOPE_TYPE = 0xead7; -var REACT_OPAQUE_ID_TYPE = 0xeae0; -var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; -var REACT_OFFSCREEN_TYPE = 0xeae2; -var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; - -if (typeof Symbol === 'function' && Symbol.for) { - var symbolFor = Symbol.for; - REACT_ELEMENT_TYPE = symbolFor('react.element'); - REACT_PORTAL_TYPE = symbolFor('react.portal'); - exports.Fragment = symbolFor('react.fragment'); - REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode'); - REACT_PROFILER_TYPE = symbolFor('react.profiler'); - REACT_PROVIDER_TYPE = symbolFor('react.provider'); - REACT_CONTEXT_TYPE = symbolFor('react.context'); - REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref'); - REACT_SUSPENSE_TYPE = symbolFor('react.suspense'); - REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list'); - REACT_MEMO_TYPE = symbolFor('react.memo'); - REACT_LAZY_TYPE = symbolFor('react.lazy'); - REACT_BLOCK_TYPE = symbolFor('react.block'); - REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block'); - REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental'); - REACT_SCOPE_TYPE = symbolFor('react.scope'); - REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id'); - REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode'); - REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen'); - REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden'); -} - -var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; -var FAUX_ITERATOR_SYMBOL = '@@iterator'; -function getIteratorFn(maybeIterable) { - if (maybeIterable === null || typeof maybeIterable !== 'object') { - return null; - } - - var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; - - if (typeof maybeIterator === 'function') { - return maybeIterator; - } - - return null; -} - -var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; - -function error(format) { - { - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; - } - - printWarning('error', format, args); - } -} - -function printWarning(level, format, args) { - // When changing this logic, you might want to also - // update consoleWithStackDev.www.js as well. - { - var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - var stack = ReactDebugCurrentFrame.getStackAddendum(); - - if (stack !== '') { - format += '%s'; - args = args.concat([stack]); - } - - var argsWithFormat = args.map(function (item) { - return '' + item; - }); // Careful: RN currently depends on this prefix - - argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it - // breaks IE9: https://github.com/facebook/react/issues/13610 - // eslint-disable-next-line react-internal/no-production-logging - - Function.prototype.apply.call(console[level], console, argsWithFormat); - } -} - -// Filter certain DOM attributes (e.g. src, href) if their values are empty strings. - -var enableScopeAPI = false; // Experimental Create Event Handle API. - -function isValidElementType(type) { - if (typeof type === 'string' || typeof type === 'function') { - return true; - } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). - - - if (type === exports.Fragment || type === REACT_PROFILER_TYPE || type === REACT_DEBUG_TRACING_MODE_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) { - return true; - } - - if (typeof type === 'object' && type !== null) { - if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) { - return true; - } - } - - return false; -} - -function getWrappedName(outerType, innerType, wrapperName) { - var functionName = innerType.displayName || innerType.name || ''; - return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); -} - -function getContextName(type) { - return type.displayName || 'Context'; -} - -function getComponentName(type) { - if (type == null) { - // Host root, text node or just invalid type. - return null; - } - - { - if (typeof type.tag === 'number') { - error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); - } - } - - if (typeof type === 'function') { - return type.displayName || type.name || null; - } - - if (typeof type === 'string') { - return type; - } - - switch (type) { - case exports.Fragment: - return 'Fragment'; - - case REACT_PORTAL_TYPE: - return 'Portal'; - - case REACT_PROFILER_TYPE: - return 'Profiler'; - - case REACT_STRICT_MODE_TYPE: - return 'StrictMode'; - - case REACT_SUSPENSE_TYPE: - return 'Suspense'; - - case REACT_SUSPENSE_LIST_TYPE: - return 'SuspenseList'; - } - - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_CONTEXT_TYPE: - var context = type; - return getContextName(context) + '.Consumer'; - - case REACT_PROVIDER_TYPE: - var provider = type; - return getContextName(provider._context) + '.Provider'; - - case REACT_FORWARD_REF_TYPE: - return getWrappedName(type, type.render, 'ForwardRef'); - - case REACT_MEMO_TYPE: - return getComponentName(type.type); - - case REACT_BLOCK_TYPE: - return getComponentName(type._render); - - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - - try { - return getComponentName(init(payload)); - } catch (x) { - return null; - } - } - } - } - - return null; -} - -// Helpers to patch console.logs to avoid logging during side-effect free -// replaying on render function. This currently only patches the object -// lazily which won't cover if the log function was extracted eagerly. -// We could also eagerly patch the method. -var disabledDepth = 0; -var prevLog; -var prevInfo; -var prevWarn; -var prevError; -var prevGroup; -var prevGroupCollapsed; -var prevGroupEnd; - -function disabledLog() {} - -disabledLog.__reactDisabledLog = true; -function disableLogs() { - { - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - prevLog = console.log; - prevInfo = console.info; - prevWarn = console.warn; - prevError = console.error; - prevGroup = console.group; - prevGroupCollapsed = console.groupCollapsed; - prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 - - var props = { - configurable: true, - enumerable: true, - value: disabledLog, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. - - Object.defineProperties(console, { - info: props, - log: props, - warn: props, - error: props, - group: props, - groupCollapsed: props, - groupEnd: props - }); - /* eslint-enable react-internal/no-production-logging */ - } - - disabledDepth++; - } -} -function reenableLogs() { - { - disabledDepth--; - - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - var props = { - configurable: true, - enumerable: true, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. - - Object.defineProperties(console, { - log: _assign({}, props, { - value: prevLog - }), - info: _assign({}, props, { - value: prevInfo - }), - warn: _assign({}, props, { - value: prevWarn - }), - error: _assign({}, props, { - value: prevError - }), - group: _assign({}, props, { - value: prevGroup - }), - groupCollapsed: _assign({}, props, { - value: prevGroupCollapsed - }), - groupEnd: _assign({}, props, { - value: prevGroupEnd - }) - }); - /* eslint-enable react-internal/no-production-logging */ - } - - if (disabledDepth < 0) { - error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); - } - } -} - -var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; -var prefix; -function describeBuiltInComponentFrame(name, source, ownerFn) { - { - if (prefix === undefined) { - // Extract the VM specific prefix used by each line. - try { - throw Error(); - } catch (x) { - var match = x.stack.trim().match(/\n( *(at )?)/); - prefix = match && match[1] || ''; - } - } // We use the prefix to ensure our stacks line up with native stack frames. - - - return '\n' + prefix + name; - } -} -var reentry = false; -var componentFrameCache; - -{ - var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; - componentFrameCache = new PossiblyWeakMap(); -} - -function describeNativeComponentFrame(fn, construct) { - // If something asked for a stack inside a fake render, it should get ignored. - if (!fn || reentry) { - return ''; - } - - { - var frame = componentFrameCache.get(fn); - - if (frame !== undefined) { - return frame; - } - } - - var control; - reentry = true; - var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. - - Error.prepareStackTrace = undefined; - var previousDispatcher; - - { - previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function - // for warnings. - - ReactCurrentDispatcher.current = null; - disableLogs(); - } - - try { - // This should throw. - if (construct) { - // Something should be setting the props in the constructor. - var Fake = function () { - throw Error(); - }; // $FlowFixMe - - - Object.defineProperty(Fake.prototype, 'props', { - set: function () { - // We use a throwing setter instead of frozen or non-writable props - // because that won't throw in a non-strict mode function. - throw Error(); - } - }); - - if (typeof Reflect === 'object' && Reflect.construct) { - // We construct a different control for this case to include any extra - // frames added by the construct call. - try { - Reflect.construct(Fake, []); - } catch (x) { - control = x; - } - - Reflect.construct(fn, [], Fake); - } else { - try { - Fake.call(); - } catch (x) { - control = x; - } - - fn.call(Fake.prototype); - } - } else { - try { - throw Error(); - } catch (x) { - control = x; - } - - fn(); - } - } catch (sample) { - // This is inlined manually because closure doesn't do it for us. - if (sample && control && typeof sample.stack === 'string') { - // This extracts the first frame from the sample that isn't also in the control. - // Skipping one frame that we assume is the frame that calls the two. - var sampleLines = sample.stack.split('\n'); - var controlLines = control.stack.split('\n'); - var s = sampleLines.length - 1; - var c = controlLines.length - 1; - - while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { - // We expect at least one stack frame to be shared. - // Typically this will be the root most one. However, stack frames may be - // cut off due to maximum stack limits. In this case, one maybe cut off - // earlier than the other. We assume that the sample is longer or the same - // and there for cut off earlier. So we should find the root most frame in - // the sample somewhere in the control. - c--; - } - - for (; s >= 1 && c >= 0; s--, c--) { - // Next we find the first one that isn't the same which should be the - // frame that called our sample function and the control. - if (sampleLines[s] !== controlLines[c]) { - // In V8, the first line is describing the message but other VMs don't. - // If we're about to return the first line, and the control is also on the same - // line, that's a pretty good indicator that our sample threw at same line as - // the control. I.e. before we entered the sample frame. So we ignore this result. - // This can happen if you passed a class to function component, or non-function. - if (s !== 1 || c !== 1) { - do { - s--; - c--; // We may still have similar intermediate frames from the construct call. - // The next one that isn't the same should be our match though. - - if (c < 0 || sampleLines[s] !== controlLines[c]) { - // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. - var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); - - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, _frame); - } - } // Return the line we found. - - - return _frame; - } - } while (s >= 1 && c >= 0); - } - - break; - } - } - } - } finally { - reentry = false; - - { - ReactCurrentDispatcher.current = previousDispatcher; - reenableLogs(); - } - - Error.prepareStackTrace = previousPrepareStackTrace; - } // Fallback to just using the name if we couldn't make it throw. - - - var name = fn ? fn.displayName || fn.name : ''; - var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; - - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, syntheticFrame); - } - } - - return syntheticFrame; -} -function describeFunctionComponentFrame(fn, source, ownerFn) { - { - return describeNativeComponentFrame(fn, false); - } -} - -function shouldConstruct(Component) { - var prototype = Component.prototype; - return !!(prototype && prototype.isReactComponent); -} - -function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { - - if (type == null) { - return ''; - } - - if (typeof type === 'function') { - { - return describeNativeComponentFrame(type, shouldConstruct(type)); - } - } - - if (typeof type === 'string') { - return describeBuiltInComponentFrame(type); - } - - switch (type) { - case REACT_SUSPENSE_TYPE: - return describeBuiltInComponentFrame('Suspense'); - - case REACT_SUSPENSE_LIST_TYPE: - return describeBuiltInComponentFrame('SuspenseList'); - } - - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_FORWARD_REF_TYPE: - return describeFunctionComponentFrame(type.render); - - case REACT_MEMO_TYPE: - // Memo may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); - - case REACT_BLOCK_TYPE: - return describeFunctionComponentFrame(type._render); - - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - - try { - // Lazy may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); - } catch (x) {} - } - } - } - - return ''; -} - -var loggedTypeFailures = {}; -var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - -function setCurrentlyValidatingElement(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - ReactDebugCurrentFrame.setExtraStackFrame(stack); - } else { - ReactDebugCurrentFrame.setExtraStackFrame(null); - } - } -} - -function checkPropTypes(typeSpecs, values, location, componentName, element) { - { - // $FlowFixMe This is okay but Flow doesn't know it. - var has = Function.call.bind(Object.prototype.hasOwnProperty); - - for (var typeSpecName in typeSpecs) { - if (has(typeSpecs, typeSpecName)) { - var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. - - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - if (typeof typeSpecs[typeSpecName] !== 'function') { - var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); - err.name = 'Invariant Violation'; - throw err; - } - - error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); - } catch (ex) { - error$1 = ex; - } - - if (error$1 && !(error$1 instanceof Error)) { - setCurrentlyValidatingElement(element); - - error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); - - setCurrentlyValidatingElement(null); - } - - if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error$1.message] = true; - setCurrentlyValidatingElement(element); - - error('Failed %s type: %s', location, error$1.message); - - setCurrentlyValidatingElement(null); - } - } - } - } -} - -var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var RESERVED_PROPS = { - key: true, - ref: true, - __self: true, - __source: true -}; -var specialPropKeyWarningShown; -var specialPropRefWarningShown; -var didWarnAboutStringRefs; - -{ - didWarnAboutStringRefs = {}; -} - -function hasValidRef(config) { - { - if (hasOwnProperty.call(config, 'ref')) { - var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; - - if (getter && getter.isReactWarning) { - return false; - } - } - } - - return config.ref !== undefined; -} - -function hasValidKey(config) { - { - if (hasOwnProperty.call(config, 'key')) { - var getter = Object.getOwnPropertyDescriptor(config, 'key').get; - - if (getter && getter.isReactWarning) { - return false; - } - } - } - - return config.key !== undefined; -} - -function warnIfStringRefCannotBeAutoConverted(config, self) { - { - if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) { - var componentName = getComponentName(ReactCurrentOwner.current.type); - - if (!didWarnAboutStringRefs[componentName]) { - error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref); - - didWarnAboutStringRefs[componentName] = true; - } - } - } -} - -function defineKeyPropWarningGetter(props, displayName) { - { - var warnAboutAccessingKey = function () { - if (!specialPropKeyWarningShown) { - specialPropKeyWarningShown = true; - - error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); - } - }; - - warnAboutAccessingKey.isReactWarning = true; - Object.defineProperty(props, 'key', { - get: warnAboutAccessingKey, - configurable: true - }); - } -} - -function defineRefPropWarningGetter(props, displayName) { - { - var warnAboutAccessingRef = function () { - if (!specialPropRefWarningShown) { - specialPropRefWarningShown = true; - - error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); - } - }; - - warnAboutAccessingRef.isReactWarning = true; - Object.defineProperty(props, 'ref', { - get: warnAboutAccessingRef, - configurable: true - }); - } -} -/** - * Factory method to create a new React element. This no longer adheres to - * the class pattern, so do not use new to call it. Also, instanceof check - * will not work. Instead test $$typeof field against Symbol.for('react.element') to check - * if something is a React Element. - * - * @param {*} type - * @param {*} props - * @param {*} key - * @param {string|object} ref - * @param {*} owner - * @param {*} self A *temporary* helper to detect places where `this` is - * different from the `owner` when React.createElement is called, so that we - * can warn. We want to get rid of owner and replace string `ref`s with arrow - * functions, and as long as `this` and owner are the same, there will be no - * change in behavior. - * @param {*} source An annotation object (added by a transpiler or otherwise) - * indicating filename, line number, and/or other information. - * @internal - */ - - -var ReactElement = function (type, key, ref, self, source, owner, props) { - var element = { - // This tag allows us to uniquely identify this as a React Element - $$typeof: REACT_ELEMENT_TYPE, - // Built-in properties that belong on the element - type: type, - key: key, - ref: ref, - props: props, - // Record the component responsible for creating this element. - _owner: owner - }; - - { - // The validation flag is currently mutative. We put it on - // an external backing store so that we can freeze the whole object. - // This can be replaced with a WeakMap once they are implemented in - // commonly used development environments. - element._store = {}; // To make comparing ReactElements easier for testing purposes, we make - // the validation flag non-enumerable (where possible, which should - // include every environment we run tests in), so the test framework - // ignores it. - - Object.defineProperty(element._store, 'validated', { - configurable: false, - enumerable: false, - writable: true, - value: false - }); // self and source are DEV only properties. - - Object.defineProperty(element, '_self', { - configurable: false, - enumerable: false, - writable: false, - value: self - }); // Two elements created in two different places should be considered - // equal for testing purposes and therefore we hide it from enumeration. - - Object.defineProperty(element, '_source', { - configurable: false, - enumerable: false, - writable: false, - value: source - }); - - if (Object.freeze) { - Object.freeze(element.props); - Object.freeze(element); - } - } - - return element; -}; -/** - * https://github.com/reactjs/rfcs/pull/107 - * @param {*} type - * @param {object} props - * @param {string} key - */ - -function jsxDEV(type, config, maybeKey, source, self) { - { - var propName; // Reserved names are extracted - - var props = {}; - var key = null; - var ref = null; // Currently, key can be spread in as a prop. This causes a potential - // issue if key is also explicitly declared (ie.
- // or
). We want to deprecate key spread, - // but as an intermediary step, we will use jsxDEV for everything except - //
, because we aren't currently able to tell if - // key is explicitly declared to be undefined or not. - - if (maybeKey !== undefined) { - key = '' + maybeKey; - } - - if (hasValidKey(config)) { - key = '' + config.key; - } - - if (hasValidRef(config)) { - ref = config.ref; - warnIfStringRefCannotBeAutoConverted(config, self); - } // Remaining properties are added to a new props object - - - for (propName in config) { - if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - props[propName] = config[propName]; - } - } // Resolve default props - - - if (type && type.defaultProps) { - var defaultProps = type.defaultProps; - - for (propName in defaultProps) { - if (props[propName] === undefined) { - props[propName] = defaultProps[propName]; - } - } - } - - if (key || ref) { - var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; - - if (key) { - defineKeyPropWarningGetter(props, displayName); - } - - if (ref) { - defineRefPropWarningGetter(props, displayName); - } - } - - return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); - } -} - -var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner; -var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; - -function setCurrentlyValidatingElement$1(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - ReactDebugCurrentFrame$1.setExtraStackFrame(stack); - } else { - ReactDebugCurrentFrame$1.setExtraStackFrame(null); - } - } -} - -var propTypesMisspellWarningShown; - -{ - propTypesMisspellWarningShown = false; -} -/** - * Verifies the object is a ReactElement. - * See https://reactjs.org/docs/react-api.html#isvalidelement - * @param {?object} object - * @return {boolean} True if `object` is a ReactElement. - * @final - */ - -function isValidElement(object) { - { - return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; - } -} - -function getDeclarationErrorAddendum() { - { - if (ReactCurrentOwner$1.current) { - var name = getComponentName(ReactCurrentOwner$1.current.type); - - if (name) { - return '\n\nCheck the render method of `' + name + '`.'; - } - } - - return ''; - } -} - -function getSourceInfoErrorAddendum(source) { - { - if (source !== undefined) { - var fileName = source.fileName.replace(/^.*[\\\/]/, ''); - var lineNumber = source.lineNumber; - return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; - } - - return ''; - } -} -/** - * Warn if there's no key explicitly set on dynamic arrays of children or - * object keys are not valid. This allows us to keep track of children between - * updates. - */ - - -var ownerHasKeyUseWarning = {}; - -function getCurrentComponentErrorInfo(parentType) { - { - var info = getDeclarationErrorAddendum(); - - if (!info) { - var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; - - if (parentName) { - info = "\n\nCheck the top-level render call using <" + parentName + ">."; - } - } - - return info; - } -} -/** - * Warn if the element doesn't have an explicit key assigned to it. - * This element is in an array. The array could grow and shrink or be - * reordered. All children that haven't already been validated are required to - * have a "key" property assigned to it. Error statuses are cached so a warning - * will only be shown once. - * - * @internal - * @param {ReactElement} element Element that requires a key. - * @param {*} parentType element's parent's type. - */ - - -function validateExplicitKey(element, parentType) { - { - if (!element._store || element._store.validated || element.key != null) { - return; - } - - element._store.validated = true; - var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); - - if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { - return; - } - - ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a - // property, it may be the creator of the child that's responsible for - // assigning it a key. - - var childOwner = ''; - - if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) { - // Give the component that originally created this child. - childOwner = " It was passed a child from " + getComponentName(element._owner.type) + "."; - } - - setCurrentlyValidatingElement$1(element); - - error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); - - setCurrentlyValidatingElement$1(null); - } -} -/** - * Ensure that every element either is passed in a static location, in an - * array with an explicit keys property defined, or in an object literal - * with valid key property. - * - * @internal - * @param {ReactNode} node Statically passed child of any type. - * @param {*} parentType node's parent's type. - */ - - -function validateChildKeys(node, parentType) { - { - if (typeof node !== 'object') { - return; - } - - if (Array.isArray(node)) { - for (var i = 0; i < node.length; i++) { - var child = node[i]; - - if (isValidElement(child)) { - validateExplicitKey(child, parentType); - } - } - } else if (isValidElement(node)) { - // This element was passed in a valid location. - if (node._store) { - node._store.validated = true; - } - } else if (node) { - var iteratorFn = getIteratorFn(node); - - if (typeof iteratorFn === 'function') { - // Entry iterators used to provide implicit keys, - // but now we print a separate warning for them later. - if (iteratorFn !== node.entries) { - var iterator = iteratorFn.call(node); - var step; - - while (!(step = iterator.next()).done) { - if (isValidElement(step.value)) { - validateExplicitKey(step.value, parentType); - } - } - } - } - } - } -} -/** - * Given an element, validate that its props follow the propTypes definition, - * provided by the type. - * - * @param {ReactElement} element - */ - - -function validatePropTypes(element) { - { - var type = element.type; - - if (type === null || type === undefined || typeof type === 'string') { - return; - } - - var propTypes; - - if (typeof type === 'function') { - propTypes = type.propTypes; - } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. - // Inner props are checked in the reconciler. - type.$$typeof === REACT_MEMO_TYPE)) { - propTypes = type.propTypes; - } else { - return; - } - - if (propTypes) { - // Intentionally inside to avoid triggering lazy initializers: - var name = getComponentName(type); - checkPropTypes(propTypes, element.props, 'prop', name, element); - } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { - propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: - - var _name = getComponentName(type); - - error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); - } - - if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { - error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); - } - } -} -/** - * Given a fragment, validate that it can only be provided with fragment props - * @param {ReactElement} fragment - */ - - -function validateFragmentProps(fragment) { - { - var keys = Object.keys(fragment.props); - - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - - if (key !== 'children' && key !== 'key') { - setCurrentlyValidatingElement$1(fragment); - - error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); - - setCurrentlyValidatingElement$1(null); - break; - } - } - - if (fragment.ref !== null) { - setCurrentlyValidatingElement$1(fragment); - - error('Invalid attribute `ref` supplied to `React.Fragment`.'); - - setCurrentlyValidatingElement$1(null); - } - } -} - -function jsxWithValidation(type, props, key, isStaticChildren, source, self) { - { - var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to - // succeed and there will likely be errors in render. - - if (!validType) { - var info = ''; - - if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { - info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; - } - - var sourceInfo = getSourceInfoErrorAddendum(source); - - if (sourceInfo) { - info += sourceInfo; - } else { - info += getDeclarationErrorAddendum(); - } - - var typeString; - - if (type === null) { - typeString = 'null'; - } else if (Array.isArray(type)) { - typeString = 'array'; - } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { - typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />"; - info = ' Did you accidentally export a JSX literal instead of a component?'; - } else { - typeString = typeof type; - } - - error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); - } - - var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used. - // TODO: Drop this when these are no longer allowed as the type argument. - - if (element == null) { - return element; - } // Skip key warning if the type isn't valid since our key validation logic - // doesn't expect a non-string/function type and can throw confusing errors. - // We don't want exception behavior to differ between dev and prod. - // (Rendering will throw with a helpful message and as soon as the type is - // fixed, the key warnings will appear.) - - - if (validType) { - var children = props.children; - - if (children !== undefined) { - if (isStaticChildren) { - if (Array.isArray(children)) { - for (var i = 0; i < children.length; i++) { - validateChildKeys(children[i], type); - } - - if (Object.freeze) { - Object.freeze(children); - } - } else { - error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.'); - } - } else { - validateChildKeys(children, type); - } - } - } - - if (type === exports.Fragment) { - validateFragmentProps(element); - } else { - validatePropTypes(element); - } - - return element; - } -} // These two functions exist to still get child warnings in dev -// even with the prod transform. This means that jsxDEV is purely -// opt-in behavior for better messages but that we won't stop -// giving you warnings if you use production apis. - -function jsxWithValidationStatic(type, props, key) { - { - return jsxWithValidation(type, props, key, true); - } -} -function jsxWithValidationDynamic(type, props, key) { - { - return jsxWithValidation(type, props, key, false); - } -} - -var jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children. -// for now we can ship identical prod functions - -var jsxs = jsxWithValidationStatic ; - -exports.jsx = jsx; -exports.jsxs = jsxs; - })(); -} - - -/***/ }), - -/***/ "./node_modules/react/jsx-runtime.js": -/*!*******************************************!*\ - !*** ./node_modules/react/jsx-runtime.js ***! - \*******************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -if (false) {} else { - module.exports = __webpack_require__(/*! ./cjs/react-jsx-runtime.development.js */ "./node_modules/react/cjs/react-jsx-runtime.development.js"); -} - - -/***/ }), - -/***/ "react": -/*!************************!*\ - !*** external "React" ***! - \************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["React"]; - -/***/ }), - -/***/ "react-dom": -/*!***************************!*\ - !*** external "ReactDOM" ***! - \***************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["ReactDOM"]; - -/***/ }), - -/***/ "jquery": -/*!*************************!*\ - !*** external "jQuery" ***! - \*************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["jQuery"]; - -/***/ }), - -/***/ "@wordpress/i18n": -/*!******************************!*\ - !*** external ["wp","i18n"] ***! - \******************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["wp"]["i18n"]; - -/***/ }), - -/***/ "./node_modules/@linaria/react/dist/index.mjs": -/*!****************************************************!*\ - !*** ./node_modules/@linaria/react/dist/index.mjs ***! - \****************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "styled": () => (/* binding */ styled_default) -/* harmony export */ }); -/* harmony import */ var _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @emotion/is-prop-valid */ "./node_modules/@linaria/react/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); -/* harmony import */ var _linaria_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @linaria/core */ "./node_modules/@linaria/react/node_modules/@linaria/core/dist/index.mjs"); -// src/styled.ts - - - -var isCapital = (ch) => ch.toUpperCase() === ch; -var filterKey = (keys) => (key) => keys.indexOf(key) === -1; -var omit = (obj, keys) => { - const res = {}; - Object.keys(obj).filter(filterKey(keys)).forEach((key) => { - res[key] = obj[key]; - }); - return res; -}; -function filterProps(asIs, props, omitKeys) { - const filteredProps = omit(props, omitKeys); - if (!asIs) { - const interopValidAttr = typeof _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_0__["default"] === "function" ? { default: _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_0__["default"] } : _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_0__["default"]; - Object.keys(filteredProps).forEach((key) => { - if (!interopValidAttr.default(key)) { - delete filteredProps[key]; - } - }); - } - return filteredProps; -} -var warnIfInvalid = (value, componentName) => { - if (true) { - if (typeof value === "string" || typeof value === "number" && isFinite(value)) { - return; - } - const stringified = typeof value === "object" ? JSON.stringify(value) : String(value); - console.warn( - `An interpolation evaluated to '${stringified}' in the component '${componentName}', which is probably a mistake. You should explicitly cast or transform the value to a string.` - ); - } -}; -function styled(tag) { - return (options) => { - if (true) { - if (Array.isArray(options)) { - throw new Error( - 'Using the "styled" tag in runtime is not supported. Make sure you have set up the Babel plugin correctly. See https://github.com/callstack/linaria#setup' - ); - } - } - const render = (props, ref) => { - const { as: component = tag, class: className } = props; - const shouldKeepProps = options.propsAsIs === void 0 ? !(typeof component === "string" && component.indexOf("-") === -1 && !isCapital(component[0])) : options.propsAsIs; - const filteredProps = filterProps(shouldKeepProps, props, [ - "as", - "class" - ]); - filteredProps.ref = ref; - filteredProps.className = options.atomic ? (0,_linaria_core__WEBPACK_IMPORTED_MODULE_2__.cx)(options.class, filteredProps.className || className) : (0,_linaria_core__WEBPACK_IMPORTED_MODULE_2__.cx)(filteredProps.className || className, options.class); - const { vars } = options; - if (vars) { - const style = {}; - for (const name in vars) { - const variable = vars[name]; - const result = variable[0]; - const unit = variable[1] || ""; - const value = typeof result === "function" ? result(props) : result; - warnIfInvalid(value, options.name); - style[`--${name}`] = `${value}${unit}`; - } - const ownStyle = filteredProps.style || {}; - const keys = Object.keys(ownStyle); - if (keys.length > 0) { - keys.forEach((key) => { - style[key] = ownStyle[key]; - }); - } - filteredProps.style = style; - } - if (tag.__linaria && tag !== component) { - filteredProps.as = component; - return react__WEBPACK_IMPORTED_MODULE_1__.createElement(tag, filteredProps); - } - return react__WEBPACK_IMPORTED_MODULE_1__.createElement(component, filteredProps); - }; - const Result = react__WEBPACK_IMPORTED_MODULE_1__.forwardRef ? react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(render) : (props) => { - const rest = omit(props, ["innerRef"]); - return render(rest, props.innerRef); - }; - Result.displayName = options.name; - Result.__linaria = { - className: options.class, - extends: tag - }; - return Result; - }; -} -var styled_default = true ? new Proxy(styled, { - get(o, prop) { - return o(prop); - } -}) : 0; - -//# sourceMappingURL=index.mjs.map - -/***/ }), - -/***/ "./node_modules/@linaria/react/node_modules/@linaria/core/dist/index.mjs": -/*!*******************************************************************************!*\ - !*** ./node_modules/@linaria/react/node_modules/@linaria/core/dist/index.mjs ***! - \*******************************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "css": () => (/* binding */ css_default), -/* harmony export */ "cx": () => (/* binding */ cx_default) -/* harmony export */ }); -// src/css.ts -var css = () => { - throw new Error( - 'Using the "css" tag in runtime is not supported. Make sure you have set up the Babel plugin correctly.' - ); -}; -var css_default = css; - -// src/cx.ts -var cx = function cx2() { - const presentClassNames = Array.prototype.slice.call(arguments).filter(Boolean); - const atomicClasses = {}; - const nonAtomicClasses = []; - presentClassNames.forEach((arg) => { - const individualClassNames = arg ? arg.split(" ") : []; - individualClassNames.forEach((className) => { - if (className.startsWith("atm_")) { - const [, keyHash] = className.split("_"); - atomicClasses[keyHash] = className; - } else { - nonAtomicClasses.push(className); - } - }); - }); - const result = []; - for (const keyHash in atomicClasses) { - if (Object.prototype.hasOwnProperty.call(atomicClasses, keyHash)) { - result.push(atomicClasses[keyHash]); - } - } - result.push(...nonAtomicClasses); - return result.join(" "); -}; -var cx_default = cx; - -//# sourceMappingURL=index.mjs.map - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // 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/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* 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/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be in strict mode. -(() => { -"use strict"; -/*!********************************!*\ - !*** ./scripts/entries/app.ts ***! - \********************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _utils_appUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/appUtils */ "./scripts/utils/appUtils.ts"); -/* harmony import */ var _iframe_renderIframeApp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../iframe/renderIframeApp */ "./scripts/iframe/renderIframeApp.tsx"); - - -(0,_utils_appUtils__WEBPACK_IMPORTED_MODULE_0__.initAppOnReady)(_iframe_renderIframeApp__WEBPACK_IMPORTED_MODULE_1__["default"]); -})(); - -/******/ })() -; -//# sourceMappingURL=leadin.js.map \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/leadin.js.map b/wp/wp-content/plugins/leadin/build/leadin.js.map deleted file mode 100644 index f98b90af..00000000 --- a/wp/wp-content/plugins/leadin/build/leadin.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"leadin.js","mappings":";;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,OAAO,EAAC;;;;;;;;;;;;;;;;;ACRgB;;AAEvC,2+HAA2+H;;AAE3+H,iCAAiC,4DAAO;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,WAAW,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACd3B;AACA;AACA;AACA;;AACA,SAASK,WAAT,CAAqBC,MAArB,EAA6BC,IAA7B,EAAgE;EAAA,IAA7BC,IAA6B,uEAAtB,EAAsB;EAAA,IAAlBC,WAAkB,uEAAJ,EAAI;EAC5D;EACA,IAAMC,UAAU,GAAG,IAAIC,GAAJ,WAAWR,4DAAX,sBAA8BI,IAA9B,EAAnB;EACAH,uEAAmB,CAACM,UAAD,EAAaD,WAAb,CAAnB;EACA,OAAO,IAAIG,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;IACpC,IAAMC,OAAO,GAAG;MACZC,GAAG,EAAEN,UAAU,CAACO,QAAX,EADO;MAEZX,MAAM,EAANA,MAFY;MAGZY,WAAW,EAAE,kBAHD;MAIZC,UAAU,EAAE,oBAACC,GAAD;QAAA,OAASA,GAAG,CAACC,gBAAJ,CAAqB,YAArB,EAAmCnB,8DAAnC,CAAT;MAAA,CAJA;MAKZoB,OAAO,EAAET,OALG;MAMZU,KAAK,EAAE,eAACC,QAAD,EAAc;QACjBvB,iEAAA,2BAAwCS,UAAxC,gCAAwEc,QAAQ,CAACE,MAAjF,eAA4FF,QAAQ,CAACG,YAArG,GAAqH;UACjHC,WAAW,EAAE,CACT,eADS,EAETrB,IAFS,EAGTiB,QAAQ,CAACE,MAHA,EAITF,QAAQ,CAACG,YAJA;QADoG,CAArH;QAQAb,MAAM,CAACU,QAAD,CAAN;MACH;IAhBW,CAAhB;;IAkBA,IAAIlB,MAAM,KAAK,KAAf,EAAsB;MAClBS,OAAO,CAACP,IAAR,GAAeqB,IAAI,CAACC,SAAL,CAAetB,IAAf,CAAf;IACH;;IACDR,kDAAA,CAAOe,OAAP;EACH,CAvBM,CAAP;AAwBH;;AACM,SAASiB,kBAAT,GAA8B;EACjC,OAAO3B,WAAW,CAAC,KAAD,EAAQ,cAAR,CAAlB;AACH;AACM,SAAS4B,uBAAT,CAAiCC,KAAjC,EAAwC;EAC3C,OAAO7B,WAAW,CAAC,KAAD,EAAQ,oBAAR,EAA8B6B,KAAK,GAAG,GAAH,GAAS,GAA5C,CAAlB;AACH;AACM,SAASC,4BAAT,GAAwC;EAC3C,OAAO9B,WAAW,CAAC,KAAD,EAAQ,oBAAR,CAAX,CAAyC+B,IAAzC,CAA8C,UAAAC,OAAO;IAAA,OAAK;MAC7DA,OAAO,EAAPA;IAD6D,CAAL;EAAA,CAArD,CAAP;AAGH;AACM,SAASC,YAAT,CAAsBC,MAAtB,EAA8B;EACjC,OAAOlC,WAAW,CAAC,KAAD,EAAQ,SAAR,EAAmB;IAAEkC,MAAM,EAANA;EAAF,CAAnB,CAAlB;AACH;AACM,SAASC,UAAT,GAAsB;EACzB,OAAOnC,WAAW,CAAC,MAAD,EAAS,cAAT,CAAlB;AACH;AACM,SAASoC,YAAT,CAAsBC,QAAtB,EAAgC;EACnC,OAAOrC,WAAW,CAAC,MAAD,EAAS,gBAAT,EAA2B;IAAEqC,QAAQ,EAARA;EAAF,CAA3B,CAAX,CAAoDN,IAApD,CAAyD,UAAAC,OAAO;IAAA,OAAK;MACxEA,OAAO,EAAPA;IADwE,CAAL;EAAA,CAAhE,CAAP;AAGH;AACM,SAASM,iBAAT,CAA2BC,cAA3B,EAA2C;EAC9C,OAAOvC,WAAW,CAAC,KAAD,EAAQ,gBAAR,EAA0B;IAAEuC,cAAc,EAAdA;EAAF,CAA1B,CAAlB;AACH;AACM,SAASC,iBAAT,GAA6B;EAChC,OAAOxC,WAAW,CAAC,KAAD,EAAQ,gBAAR,CAAlB;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5DD,2BAA6iByC,MAAM,CAACC,YAApjB;AAAA,IAAQC,WAAR,wBAAQA,WAAR;AAAA,IAAqBC,QAArB,wBAAqBA,QAArB;AAAA,IAA+BC,cAA/B,wBAA+BA,cAA/B;AAAA,IAA+CC,gBAA/C,wBAA+CA,gBAA/C;AAAA,IAAiEC,QAAjE,wBAAiEA,QAAjE;AAAA,IAA2EC,aAA3E,wBAA2EA,aAA3E;AAAA,IAA0FC,GAA1F,wBAA0FA,GAA1F;AAAA,IAA+FC,WAA/F,wBAA+FA,WAA/F;AAAA,IAA4GC,cAA5G,wBAA4GA,cAA5G;AAAA,IAA4HC,kBAA5H,wBAA4HA,kBAA5H;AAAA,IAAgJlB,MAAhJ,wBAAgJA,MAAhJ;AAAA,IAAwJmB,cAAxJ,wBAAwJA,cAAxJ;AAAA,IAAwKC,YAAxK,wBAAwKA,YAAxK;AAAA,IAAsLC,SAAtL,wBAAsLA,SAAtL;AAAA,IAAiMC,UAAjM,wBAAiMA,UAAjM;AAAA,IAA6MC,iBAA7M,wBAA6MA,iBAA7M;AAAA,IAAgOC,mBAAhO,wBAAgOA,mBAAhO;AAAA,IAAqPC,kBAArP,wBAAqPA,kBAArP;AAAA,IAAyQC,mBAAzQ,wBAAyQA,mBAAzQ;AAAA,IAA8RC,iBAA9R,wBAA8RA,iBAA9R;AAAA,IAAiTC,MAAjT,wBAAiTA,MAAjT;AAAA,IAAyTC,QAAzT,wBAAyTA,QAAzT;AAAA,IAAmUC,UAAnU,wBAAmUA,UAAnU;AAAA,IAA+UC,UAA/U,wBAA+UA,UAA/U;AAAA,IAA2VC,OAA3V,wBAA2VA,OAA3V;AAAA,IAAoWC,YAApW,wBAAoWA,YAApW;AAAA,IAAkXC,WAAlX,wBAAkXA,WAAlX;AAAA,IAA+XC,QAA/X,wBAA+XA,QAA/X;AAAA,IAAyYC,aAAzY,wBAAyYA,aAAzY;AAAA,IAAwZzE,SAAxZ,wBAAwZA,SAAxZ;AAAA,IAAmaC,OAAna,wBAAmaA,OAAna;AAAA,IAA4ayE,YAA5a,wBAA4aA,YAA5a;AAAA,IAA0bC,iBAA1b,wBAA0bA,iBAA1b;AAAA,IAA6cC,KAA7c,wBAA6cA,KAA7c;AAAA,IAAodrC,YAApd,wBAAodA,YAApd;AAAA,IAAkesC,SAAle,wBAAkeA,SAAle;AAAA,IAA6eC,YAA7e,wBAA6eA,YAA7e;AAAA,IAA2fC,yBAA3f,wBAA2fA,yBAA3f;AAAA,IAAshBC,iBAAthB,wBAAshBA,iBAAthB;;;;;;;;;;;;;;;;ACAO,IAAMC,WAAW,GAAG;EACvBC,MAAM,EAAE,gBADe;EAEvBC,OAAO,EAAE,4BAFc;EAGvBC,YAAY,EAAE,8BAHS;EAIvBC,cAAc,EAAE,iCAJO;EAKvBC,sBAAsB,EAAE,oCALD;EAMvBC,sBAAsB,EAAE,6BAND;EAOvBC,wBAAwB,EAAE,+BAPH;EAQvBC,sBAAsB,EAAE,6BARD;EASvBC,kBAAkB,EAAE,qBATG;EAUvBC,mBAAmB,EAAE,gCAVE;EAWvBC,oBAAoB,EAAE,6BAXC;EAYvBC,qBAAqB,EAAE,uBAZA;EAavBC,2BAA2B,EAAE,uBAbN;EAcvBC,yBAAyB,EAAE,gCAdJ;EAevBC,qBAAqB,EAAE,yBAfA;EAgBvBC,YAAY,EAAE,eAhBS;EAiBvBC,6BAA6B,EAAE;AAjBR,CAApB;;;;;;;;;;;;;;;;;;;ACAP;AACA;AACA;AACA,IAAMO,oBAAoB,gBAAGD,sDAAM,OAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAA7B;AAeA,IAAMI,WAAW,gBAAGJ,sDAAM,MAANA,CAAM;EAAAE;EAAA;EAAAC;AAAA,CAANH,CAApB;AAMO,IAAMK,eAAe,GAAG,SAAlBA,eAAkB;EAAA,OAAOP,uDAAK,CAACG,oBAAD,EAAuB;IAAEK,QAAQ,EAAE,CAACV,sDAAI,CAAC,KAAD,EAAQ;MAAEW,GAAG,EAAE,kBAAP;MAA2BC,KAAK,EAAE,KAAlC;MAAyCC,GAAG,EAAE;IAA9C,CAAR,CAAL,EAAyIb,sDAAI,CAACQ,WAAD,EAAc;MAAEE,QAAQ,EAAEP,mDAAE,CAAC,4DAAD,EAA+D,QAA/D;IAAd,CAAd,CAA7I,EAAsPH,sDAAI,CAAC,GAAD,EAAM;MAAEU,QAAQ,EAAEP,mDAAE,CAAC,8EAAD,EAAiF,QAAjF;IAAd,CAAN,CAA1P,EAA6WH,sDAAI,CAAC,GAAD,EAAM;MAAEU,QAAQ,EAAEP,mDAAE,CAAC,iEAAD,EAAoE,QAApE;IAAd,CAAN,CAAjX;EAAZ,CAAvB,CAAZ;AAAA,CAAxB;;;;;;;;;;;;;;;;;;;;;;ACxBA,IAAIW,GAAJ;;AACP,CAAC,UAAUA,GAAV,EAAe;EACZA,GAAG,CAACA,GAAG,CAAC,OAAD,CAAH,GAAe,CAAhB,CAAH,GAAwB,OAAxB;EACAA,GAAG,CAACA,GAAG,CAAC,UAAD,CAAH,GAAkB,CAAnB,CAAH,GAA2B,UAA3B;EACAA,GAAG,CAACA,GAAG,CAAC,QAAD,CAAH,GAAgB,CAAjB,CAAH,GAAyB,QAAzB;EACAA,GAAG,CAACA,GAAG,CAAC,gBAAD,CAAH,GAAwB,CAAzB,CAAH,GAAiC,gBAAjC;EACAA,GAAG,CAACA,GAAG,CAAC,YAAD,CAAH,GAAoB,CAArB,CAAH,GAA6B,YAA7B;AACH,CAND,EAMGA,GAAG,KAAKA,GAAG,GAAG,EAAX,CANN;;AAOO,IAAMC,SAAS,iDACjBD,GAAG,CAACE,KADa,EACL,qBADK,+BAEjBF,GAAG,CAACG,QAFa,EAEF,yBAFE,+BAGjBH,GAAG,CAACI,MAHa,EAGJ,uBAHI,+BAIjBJ,GAAG,CAACK,cAJa,EAII,uBAJJ,+BAKjBL,GAAG,CAACM,UALa,EAKA,yBALA,cAAf;;;;;;;;;;;;;;;ACRA,IAAMC,YAAY,GAAG;EACxBC,gBAAgB,EAAE,4CADM;EAExBC,gBAAgB,EAAE,4CAFM;EAGxBC,iBAAiB,EAAE,6CAHK;EAIxBC,mBAAmB,EAAE,+CAJG;EAKxBC,UAAU,EAAE,qCALY;EAMxBC,YAAY,EAAE,wCANU;EAOxBC,uBAAuB,EAAE;AAPD,CAArB;;;;;;;;;;;;;;;ACAA,IAAMC,YAAY,GAAG;EACxBC,uBAAuB,EAAE;AADD,CAArB;;;;;;;;;;;;;;;;;;;;;;;;ACAP;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACHO,IAAMC,gBAAgB,GAAG;EAC5BC,2BAA2B,EAAE;AADD,CAAzB;;;;;;;;;;;;;;;ACAA,IAAMC,cAAc,GAAG;EAC1BC,wBAAwB,EAAE,4BADA;EAE1BC,kBAAkB,EAAE,sBAFM;EAG1BC,YAAY,EAAE,uCAHY;EAI1BC,4BAA4B,EAAE,mCAJJ;EAK1BC,6BAA6B,EAAE,oCALL;EAM1BC,0BAA0B,EAAE,iCANF;EAO1BC,6BAA6B,EAAE,oCAPL;EAQ1BC,2BAA2B,EAAE,kCARH;EAS1BC,wBAAwB,EAAE,6BATA;EAU1BC,yBAAyB,EAAE,oCAVD;EAW1BC,sBAAsB,EAAE,iCAXE;EAY1BC,yBAAyB,EAAE,8BAZD;EAa1BC,uBAAuB,EAAE,4BAbC;EAc1BC,iBAAiB,EAAE,qBAdO;EAe1BC,kBAAkB,EAAE,sBAfM;EAgB1BC,eAAe,EAAE,mBAhBS;EAiB1BC,sBAAsB,EAAE,2BAjBE;EAkB1BC,0BAA0B,EAAE,+BAlBF;EAmB1BC,2BAA2B,EAAE,gCAnBH;EAoB1BC,wBAAwB,EAAE,6BApBA;EAqB1BC,6BAA6B,EAAE,kCArBL;EAsB1BC,8BAA8B,EAAE,mCAtBN;EAuB1BC,2BAA2B,EAAE;AAvBH,CAAvB;;;;;;;;;;;;;;;ACAA,IAAMC,aAAa,GAAG;EACzBC,UAAU,EAAE,aADa;EAEzBC,SAAS,EAAE,YAFc;EAGzBC,sBAAsB,EAAE,2BAHC;EAIzBC,SAAS,EAAE,YAJc;EAKzBC,qBAAqB,EAAE,0BALE;EAMzBC,kCAAkC,EAAE,yCANX;EAOzBC,wBAAwB,EAAE,8BAPD;EAQzBC,uBAAuB,EAAE,2BARA;EASzBC,sBAAsB,EAAE,2BATC;EAUzBC,4BAA4B,EAAE,kCAVL;EAWzBC,uBAAuB,EAAE,4BAXA;EAYzBC,yBAAyB,EAAE,8BAZF;EAazBC,sBAAsB,EAAE,2BAbC;EAczBC,uBAAuB,EAAE,4BAdA;EAezBC,4BAA4B,EAAE,iCAfL;EAgBzBC,0BAA0B,EAAE,+BAhBH;EAiBzBC,uBAAuB,EAAE;AAjBA,CAAtB;;;;;;;;;;;;;;;;;;;ACAP;AACA;AACA;AACA;AACA,IAAMI,aAAa,GAAG,IAAIC,GAAJ,CAAQ,CAC1B,CACI9C,mFADJ,EAEI,UAAClG,OAAD,EAAa;EACTI,qEAAY,CAACJ,OAAO,CAACtB,OAAT,CAAZ;AACH,CAJL,CAD0B,EAO1B,CACIwH,oGADJ,EAEI,UAAClG,OAAD,EAAUiJ,QAAV,EAAuB;EACnBrJ,gFAAuB,CAACI,OAAO,CAACtB,OAAT,CAAvB,CACKqB,IADL,CACU,YAAM;IACZkJ,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,oGADY;MAEjBxH,OAAO,EAAEsB,OAAO,CAACtB;IAFA,CAArB;EAIH,CAND,WAOW,UAAAA,OAAO,EAAI;IAClBuK,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,kGADY;MAEjBxH,OAAO,EAAPA;IAFiB,CAArB;EAIH,CAZD;AAaH,CAhBL,CAP0B,EAyB1B,CACIwH,mGADJ,EAEI,UAACkD,SAAD,EAAYH,QAAZ,EAAyB;EACrBnJ,qFAA4B,GACvBC,IADL,CACU,gBAA0B;IAAA,IAAdrB,OAAc,QAAvBsB,OAAuB;IAChCiJ,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,oGADY;MAEjBxH,OAAO,EAAPA;IAFiB,CAArB;EAIH,CAND,WAOW,UAAAA,OAAO,EAAI;IAClBuK,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,iGADY;MAEjBxH,OAAO,EAAPA;IAFiB,CAArB;EAIH,CAZD;AAaH,CAhBL,CAzB0B,EA2C1B,CACIwH,+FADJ,EAEI,UAACkD,SAAD,EAAYH,QAAZ,EAAyB;EACrBzI,0EAAiB,GACZT,IADL,CACU,UAAArB,OAAO,EAAI;IACjBuK,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,gGADY;MAEjBxH,OAAO,EAAPA;IAFiB,CAArB;EAIH,CAND,WAOW,UAAAA,OAAO,EAAI;IAClBuK,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,6FADY;MAEjBxH,OAAO,EAAPA;IAFiB,CAArB;EAIH,CAZD;AAaH,CAhBL,CA3C0B,EA6D1B,CACIwH,gGADJ,EAEI,UAAClG,OAAD,EAAUiJ,QAAV,EAAuB;EACnB3I,0EAAiB,CAACN,OAAO,CAACtB,OAAT,CAAjB,CACKqB,IADL,CACU,UAAArB,OAAO,EAAI;IACjBuK,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,gGADY;MAEjBxH,OAAO,EAAPA;IAFiB,CAArB;EAIH,CAND,WAOW,UAAAA,OAAO,EAAI;IAClBuK,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,8FADY;MAEjBxH,OAAO,EAAPA;IAFiB,CAArB;EAIH,CAZD;AAaH,CAhBL,CA7D0B,EA+E1B,CACIwH,wFADJ,EAEI,UAACkD,SAAD,EAAYH,QAAZ,EAAyB;EACrB9I,mEAAU,GACLJ,IADL,CACU,UAAArB,OAAO,EAAI;IACjBuK,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,yFADY;MAEjBxH,OAAO,EAAPA;IAFiB,CAArB;EAIH,CAND,WAOW,UAAAA,OAAO,EAAI;IAClBuK,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,sFADY;MAEjBxH,OAAO,EAAPA;IAFiB,CAArB;EAIH,CAZD;AAaH,CAhBL,CA/E0B,EAiG1B,CACIwH,6FADJ,EAEI,UAAClG,OAAD,EAAa;EACT4I,gFAA4B,CAAC5I,OAAO,CAACtB,OAAT,CAA5B;AACH,CAJL,CAjG0B,EAuG1B,CACIwH,iGADJ,EAEI,UAAClG,OAAD,EAAUiJ,QAAV,EAAuB;EACnBH,0EAAY,CAAC9I,OAAO,CAACtB,OAAR,CAAgB2K,KAAjB,CAAZ,CACKtJ,IADL,CACU,UAAArB,OAAO,EAAI;IACjBuK,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,kGADY;MAEjBxH,OAAO,EAAEA;IAFQ,CAArB;EAIH,CAND,WAOW,UAAAA,OAAO,EAAI;IAClBuK,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,+FADY;MAEjBxH,OAAO,EAAPA;IAFiB,CAArB;EAIH,CAZD;AAaH,CAhBL,CAvG0B,EAyH1B,CACIwH,oGADJ,EAEI,UAAClG,OAAD,EAAUiJ,QAAV,EAAuB;EACnBJ,6EAAe,CAAC7I,OAAO,CAACtB,OAAR,CAAgB4K,eAAjB,CAAf,CACKvJ,IADL,CACU,UAAArB,OAAO,EAAI;IACjBuK,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,qGADY;MAEjBxH,OAAO,EAAEA;IAFQ,CAArB;EAIH,CAND,WAOW,UAAAA,OAAO,EAAI;IAClBuK,QAAQ,CAACC,WAAT,CAAqB;MACjBC,GAAG,EAAEjD,kGADY;MAEjBxH,OAAO,EAAPA;IAFiB,CAArB;EAIH,CAZD;AAaH,CAhBL,CAzH0B,CAAR,CAAtB;AA4IO,IAAM6K,iBAAiB,GAAG,SAApBA,iBAAoB,CAACN,QAAD;EAAA,OAAc,UAACjJ,OAAD,EAAa;IACxD,IAAMwJ,IAAI,GAAGT,aAAa,CAACU,GAAd,CAAkBzJ,OAAO,CAACmJ,GAA1B,CAAb;;IACA,IAAIK,IAAJ,EAAU;MACNA,IAAI,CAACxJ,OAAD,EAAUiJ,QAAV,CAAJ;IACH;EACJ,CALgC;AAAA,CAA1B;;;;;;;;;;;;;;;;;;;;;;;;AChJP;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,IAAMY,sBAAsB,GAAG,SAAzBA,sBAAyB,CAACC,KAAD,EAAW;EACtC,IAAMC,SAAS,GAAGC,QAAQ,CAACC,cAAT,CAAwBnH,mFAAxB,CAAlB;EACA,IAAMoH,iBAAiB,GAAGN,2DAAc,CAACE,KAAK,CAACK,GAAP,EAAYL,KAAK,CAACM,WAAlB,EAA+BL,SAA/B,CAAxC;;EACA,IAAIA,SAAS,IAAI,CAACG,iBAAlB,EAAqC;IACjC,oBAAOP,6DAAA,CAAsBG,KAAK,CAACnF,QAA5B,EAAsCoF,SAAtC,CAAP;EACH;;EACD,OAAQ9F,sDAAI,CAACyF,2CAAD,EAAW;IAAE/E,QAAQ,EAAE,CAAC,CAACoF,SAAD,IAAcG,iBAAf,KAAqCjG,sDAAI,CAACS,6DAAD,EAAkB,EAAlB;EAArD,CAAX,CAAZ;AACH,CAPD;;AAQA,IAAM4F,eAAe,GAAG,SAAlBA,eAAkB,GAAM;EAC1B,IAAMC,uBAAuB,GAAGP,QAAQ,CAACC,cAAT,CAAwBnH,mFAAxB,CAAhC;EACA,IAAIqH,GAAJ;EACA,IAAM/L,WAAW,GAAG,IAAIoM,eAAJ,CAAoBC,QAAQ,CAACC,MAA7B,CAApB;EACA,IAAMC,IAAI,GAAGvM,WAAW,CAACqL,GAAZ,CAAgB,MAAhB,CAAb;EACA,IAAMW,WAAW,GAAGhM,WAAW,CAACqL,GAAZ,CAAgB,iBAAhB,MAAuC,QAA3D;;EACA,QAAQkB,IAAR;IACI,KAAK,cAAL;MACIR,GAAG,GAAGpF,iDAAN;MACA;;IACJ,KAAK,kBAAL;MACIoF,GAAG,GAAGpF,oDAAN;MACA;;IACJ,KAAK,iBAAL;MACIoF,GAAG,GAAGpF,0DAAN;MACA;;IACJ,KAAK,mBAAL;IACA;MACIoF,GAAG,GAAGpF,kDAAN;MACA;EAbR;;EAeA4E,uDAAA,CAAgB1F,sDAAI,CAAC4F,sBAAD,EAAyB;IAAEM,GAAG,EAAEA,GAAP;IAAYC,WAAW,EAAEA;EAAzB,CAAzB,CAApB,EAAsFG,uBAAtF;AACH,CAtBD;;AAuBA,iEAAeD,eAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;;AACA,IAAMU,oBAAoB,GAAG,SAAvBA,oBAAuB,GAAM;EAC/B,OAAO;IACHpK,QAAQ,EAAEiB,+EAA0BjB;EADjC,CAAP;AAGH,CAJD;;AAKA,IAAMqK,eAAe,GAAG,SAAlBA,eAAkB,GAAM;EAC1B,IAAMC,gBAAgB,GAAGC,MAAM,CAACC,IAAP,CAAYvJ,sEAAZ,EACpBwJ,MADoB,CACb,UAAAC,CAAC;IAAA,OAAI,OAAOC,IAAP,CAAYD,CAAZ,CAAJ;EAAA,CADY,EAEpBE,MAFoB,CAEb,UAACC,CAAD,EAAIC,CAAJ;IAAA,yCACPA,CADO,EACH7J,sEAAiB,CAAC6J,CAAD,CADd,GAELD,CAFK;EAAA,CAFa,EAKrB,EALqB,CAAzB;EAMA;IACI9K,WAAW,EAAXA,gEADJ;IAEIgL,KAAK,EAAE9J,4EAFX;IAGIjB,QAAQ,EAARA,6DAHJ;IAIIgL,OAAO,EAAE/J,8EAJb;IAKIf,gBAAgB,EAAhBA,qEALJ;IAMIC,QAAQ,EAARA,6DANJ;IAOI8K,KAAK,EAAEhK,4EAPX;IAQIiK,SAAS,EAAEjK,gFARf;IASIkK,SAAS,EAAElK,gFATf;IAUImK,aAAa,EAAEnK,oFAVnB;IAWIoK,QAAQ,EAAEpK,+EAXd;IAYIJ,iBAAiB,EAAjBA,sEAZJ;IAaIC,mBAAmB,EAAnBA,wEAbJ;IAcIC,kBAAkB,EAAlBA,uEAdJ;IAeIC,mBAAmB,EAAnBA,wEAfJ;IAgBIsK,IAAI,EAAErK,2EAhBV;IAiBIwH,KAAK,EAAExH,4EAjBX;IAkBIG,UAAU,EAAVA,+DAlBJ;IAmBIE,OAAO,EAAPA,4DAnBJ;IAoBIC,YAAY,EAAZA,iEApBJ;IAqBIC,WAAW,EAAXA,gEArBJ;IAsBIC,QAAQ,EAARA,6DAtBJ;IAuBIG,iBAAiB,EAAjBA,sEAvBJ;IAwBIC,KAAK,EAALA,0DAxBJ;IAyBIrC,YAAY,EAAEyB,mFAzBlB;IA0BIsK,WAAW,EAAEtK,kFA1BjB;IA2BIa,SAAS,EAATA,8DA3BJ;IA4BIC,YAAY,EAAZA,iEA5BJ;IA6BIC,yBAAyB,EAAzBA,8EA7BJ;IA8BIC,iBAAiB,EAAjBA,sEAAiBA;EA9BrB,GA+BOqI,gBA/BP;AAiCH,CAxCD;;AAyCA,IAAMkB,aAAa,GAAG,SAAhBA,aAAgB,CAACjC,GAAD,EAA8B;EAAA,IAAxBC,WAAwB,uEAAV,KAAU;EAChD,cAAyF3J,MAAzF;EAAA,IAAQ4L,oBAAR,WAAQA,oBAAR;EAAA,IAA8BC,eAA9B,WAA8BA,eAA9B;EAAA,IAA+CC,kBAA/C,WAA+CA,kBAA/C;EAAA,IAAmEC,gBAAnE,WAAmEA,gBAAnE;EACA,IAAIC,OAAJ;;EACA,QAAQtC,GAAR;IACI,KAAKpF,kDAAL;MACI0H,OAAO,GAAG,IAAID,gBAAJ,GAAuBE,eAAvB,CAAuCzB,eAAe,EAAtD,CAAV;MACA;;IACJ,KAAKlG,0DAAL;MACI0H,OAAO,GAAG,IAAID,gBAAJ,GACLE,eADK,CACWzB,eAAe,EAD1B,EAEL0B,qBAFK,EAAV;MAGA;;IACJ,KAAK5H,iDAAL;MACI0H,OAAO,GAAG,IAAIH,eAAJ,GAAsBM,sBAAtB,CAA6C5B,oBAAoB,EAAjE,CAAV;;MACA,IAAIZ,WAAJ,EAAiB;QACbqC,OAAO,GAAGA,OAAO,CAACI,oBAAR,EAAV;MACH;;MACD;;IACJ,KAAK9H,oDAAL;MACI0H,OAAO,GAAG,IAAIF,kBAAJ,EAAV;;MACA,IAAInC,WAAJ,EAAiB;QACbqC,OAAO,GAAGA,OAAO,CAACK,wBAAR,EAAV;MACH;;MACD;;IACJ;MACIL,OAAO,GAAG,IAAIJ,oBAAJ,EAAV;EAtBR;;EAwBA,OAAOI,OAAP;AACH,CA5BD;;AA6Be,SAAS7C,cAAT,CAAwBO,GAAxB,EAA6BC,WAA7B,EAA0CL,SAA1C,EAAqD;EAChEgD,OAAO,CAACC,IAAR,CAAa,6CAAb,EAA4DhI,iDAAS,CAACmF,GAAD,CAArE,EAA4EJ,SAA5E;EACA,IAAMG,iBAAiB,GAAGa,mEAAoB,CAAC/F,iDAAS,CAACmF,GAAD,CAAV,CAA9C;EACAU,gDAAS,CAAC,YAAM;IACZ,eAAkCpK,MAAlC;IAAA,IAAQwM,qBAAR,YAAQA,qBAAR;;IACA,IAAIA,qBAAJ,EAA2B;MACvB,IAAMR,OAAO,GAAGL,aAAa,CAACjC,GAAD,EAAMC,WAAN,CAAb,CACX8C,SADW,CACDpL,2DADC,EAEXqL,WAFW,CAECpM,6DAFD,EAGXqM,eAHW,CAGK7K,iEAHL,CAAhB;MAIA,IAAM0G,QAAQ,GAAG,IAAIgE,qBAAJ,CAA0BjI,iDAAS,CAACmF,GAAD,CAAnC,EAA0C9H,6DAA1C,EAAoDhB,mEAApD,EAAoEyJ,uDAApE,EAAkFvI,iEAAY,GAAG,EAAH,GAAQf,+DAAtG,EAAkH6L,UAAlH,CAA6HZ,OAA7H,CAAjB;MACAxD,QAAQ,CAACqE,SAAT,CAAmB/D,qEAAiB,CAACN,QAAD,CAApC;MACAA,QAAQ,CAACsE,QAAT,CAAkBxD,SAAlB,EAA6B,IAA7B;MACAd,QAAQ,CAACuE,mBAAT,GARuB,CAQS;;MAChC/M,MAAM,CAACwI,QAAP,GAAkBA,QAAlB;IACH;EACJ,CAbQ,EAaN,EAbM,CAAT;;EAcA,IAAIiB,iBAAJ,EAAuB;IACnB6C,OAAO,CAAC7N,KAAR,CAAc,oCAAd,EAAoD;MAChDmD,QAAQ,EAARA,6DADgD;MAEhD0H,SAAS,EAATA,SAFgD;MAGhD0D,OAAO,EAAEzI,iDAAS,CAACmF,GAAD,CAH8B;MAIhDuD,wBAAwB,EAAE,CAAC,CAACjN,MAAM,CAACwM;IAJa,CAApD;IAMArP,mEAAA,CAAuB,IAAIgQ,KAAJ,CAAU,4BAAV,CAAvB,EAAgE;MAC5DrO,WAAW,EAAE,CAAC,kBAAD,EAAqB,oBAArB,CAD+C;MAE5DsO,KAAK,EAAE;QACHxL,QAAQ,EAARA,6DADG;QAEH0H,SAAS,EAATA,SAFG;QAGHI,GAAG,EAAHA,GAHG;QAIH9I,cAAc,EAAdA,mEAJG;QAKHG,UAAU,EAAVA,+DALG;QAMHiM,OAAO,EAAEzI,iDAAS,CAACmF,GAAD,CANf;QAOH2D,eAAe,EAAE,CAAC,CAACvL,iEAAYA;MAP5B;IAFqD,CAAhE;EAYH;;EACD,OAAO2H,iBAAP;AACH;;;;;;;;;;;;;;;;;;;ACvHD;AACA;AACO,SAAS6D,cAAT,GAA0B;EAC7B,IAAI1M,2EAAA,CAAuB,iBAAvB,MAA8C,CAAC,CAAnD,EAAsD;IAClD;EACH;;EACDzD,sDAAA,CAAa,mEAAb,EAAkF;IAC9EsQ,UAAU,EAAE;MACRC,QAAQ,EAAE;IADF,CADkE;IAI9EC,OAAO,EAAExM,wEAAmBA;EAJkD,CAAlF,EAKGyM,OALH;EAMAzQ,8DAAA,CAAqB;IACjB2Q,CAAC,EAAE3M,wEADc;IAEjB4M,GAAG,EAAExM,+DAFY;IAGjByM,SAAS,EAAE/L,8DAASA;EAHH,CAArB;EAKA9E,+DAAA,CAAsB;IAClB+Q,GAAG,EAAEtM,6DADa;IAElBH,OAAO,EAAEiJ,MAAM,CAACC,IAAP,CAAYlJ,4DAAZ,EACJ0M,GADI,CACA,UAAArK,IAAI;MAAA,iBAAOA,IAAP,cAAerC,4DAAO,CAACqC,IAAD,CAAtB;IAAA,CADJ,EAEJsK,IAFI,CAEC,GAFD;EAFS,CAAtB;AAMH;AACD,iEAAejR,iDAAf;;;;;;;;;;;;;;;;;;;ACxBA;AACA;AACO,SAASkR,OAAT,CAAiBC,MAAjB,EAAyB;EAC5BhB,0DAAc;EACdnQ,0DAAA,CAAcmR,MAAd;AACH;AACM,SAASE,cAAT,CAAwBF,MAAxB,EAAgC;EACnC,SAASG,IAAT,GAAgB;IACZvR,6CAAC,CAACoR,MAAD,CAAD;EACH;;EACDD,OAAO,CAACI,IAAD,CAAP;AACH;;;;;;;;;;;;;;;;ACXM,SAASpG,YAAT,CAAsBO,KAAtB,EAA6B;EAChC,IAAM8F,QAAQ,GAAG,IAAIC,QAAJ,EAAjB;EACA,IAAMC,OAAO,GAAG5O,MAAM,CAAC6O,OAAvB;EACAH,QAAQ,CAACI,MAAT,CAAgB,UAAhB,EAA4BlG,KAA5B;EACA8F,QAAQ,CAACI,MAAT,CAAgB,QAAhB,EAA0B,uBAA1B;EACA,OAAOC,KAAK,CAACH,OAAD,EAAU;IAClBpR,MAAM,EAAE,MADU;IAElBwR,IAAI,EAAEN,QAFY;IAGlBO,SAAS,EAAE;EAHO,CAAV,CAAL,CAIJ3P,IAJI,CAIC,UAAA4P,GAAG;IAAA,OAAIA,GAAG,CAACC,IAAJ,EAAJ;EAAA,CAJJ,CAAP;AAKH;AACM,SAAS/G,eAAT,CAAyBgH,UAAzB,EAAqC;EACxC,OAAOL,KAAK,CAACK,UAAD,EAAa;IACrB5R,MAAM,EAAE,MADa;IAErByR,SAAS,EAAE;EAFU,CAAb,CAAL,CAGJ3P,IAHI,CAGC,UAAA4P,GAAG;IAAA,OAAIA,GAAG,CAACC,IAAJ,EAAJ;EAAA,CAHJ,CAAP;AAIH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChBD;AACA,IAAMG,sBAAsB,GAAG,IAA/B;AACO,SAAShF,oBAAT,CAA8BZ,GAA9B,EAAmC;EACtC,gBAAkD2F,+CAAQ,CAAC,KAAD,CAA1D;EAAA;EAAA,IAAO5F,iBAAP;EAAA,IAA0B8F,oBAA1B;;EACAnF,gDAAS,CAAC,YAAM;IACZ,IAAMoF,KAAK,GAAGC,UAAU,CAAC,YAAM;MAC3B,IAAMnN,MAAM,GAAGiH,QAAQ,CAACC,cAAT,CAAwBE,GAAxB,CAAf;;MACA,IAAI,CAACpH,MAAL,EAAa;QACTiN,oBAAoB,CAAC,IAAD,CAApB;MACH;IACJ,CALuB,EAKrBD,sBALqB,CAAxB;IAMA,OAAO,YAAM;MACT,IAAIE,KAAJ,EAAW;QACPE,YAAY,CAACF,KAAD,CAAZ;MACH;IACJ,CAJD;EAKH,CAZQ,EAYN,EAZM,CAAT;EAaA,OAAO/F,iBAAP;AACH;AACM,IAAMY,YAAY,GAAG,SAAfA,YAAe,GAAM;EAC9B,IAAMsF,aAAa,GAAGpG,QAAQ,CAACC,cAAT,CAAwB,eAAxB,CAAtB;EACA,IAAMoG,cAAc,GAAGD,aAAa,GAAGA,aAAa,CAACE,YAAjB,GAAgC,CAApE;EACA,IAAMC,QAAQ,GAAGvG,QAAQ,CAACC,cAAT,CAAwB,YAAxB,CAAjB;EACA,IAAMuG,cAAc,GAAID,QAAQ,IAAIA,QAAQ,CAACD,YAAtB,IAAuC,CAA9D;EACA,IAAMG,MAAM,GAAG,CAAf;;EACA,IAAIhQ,MAAM,CAACiQ,WAAP,GAAqBL,cAAzB,EAAyC;IACrC,OAAOA,cAAc,GAAGI,MAAxB;EACH,CAFD,MAGK;IACD,OAAOhQ,MAAM,CAACiQ,WAAP,GAAqBF,cAArB,GAAsCC,MAA7C;EACH;AACJ,CAZM;;;;;;;;;;;;;;;;ACnBA,SAAS1S,mBAAT,CAA6B4S,SAA7B,EAAwCvS,WAAxC,EAAqD;EACxD+M,MAAM,CAACC,IAAP,CAAYhN,WAAZ,EAAyBwS,OAAzB,CAAiC,UAAAzH,GAAG,EAAI;IACpCwH,SAAS,CAACE,YAAV,CAAuBtB,MAAvB,CAA8BpG,GAA9B,EAAmC/K,WAAW,CAAC+K,GAAD,CAA9C;EACH,CAFD;AAGH;AACM,SAASP,4BAAT,CAAsCO,GAAtC,EAA2C;EAC9C,IAAMsB,QAAQ,GAAG,IAAInM,GAAJ,CAAQmC,MAAM,CAACgK,QAAP,CAAgBqG,IAAxB,CAAjB;EACArG,QAAQ,CAACoG,YAAT,WAA6B1H,GAA7B;EACA1I,MAAM,CAACsQ,OAAP,CAAeC,YAAf,CAA4B,IAA5B,EAAkC,EAAlC,EAAsCvG,QAAQ,CAACqG,IAA/C;AACH;;;;;;;;;;;;ACTD;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;;AAEa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH,kCAAkC;AAClC;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iBAAiB,sBAAsB;AACvC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACPA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,gBAAgB,+CAA+C;;AAE/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACtCA;;AAEA,eAAe,mBAAO,CAAC,wFAA6B;AACpD,gBAAgB,mBAAO,CAAC,gHAAyC;AACjE,uBAAuB,mBAAO,CAAC,iEAAe;;AAE9C,YAAY,mBAAO,CAAC,qDAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,2FAA+B;;AAEvD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;AAC5C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS,GAAG;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,+CAA+C;AAC/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,wBAAwB,iDAAiD;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,+BAA+B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B;AAC3B,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,0CAA0C;AAC1C,2CAA2C;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,MAAM;AACN,2EAA2E;AAC3E;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACr4DA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,mBAAO,CAAC,qDAAS;;AAExC;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;AAC5C;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;;;;;;;;;AC9BA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;;AAE5C;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC;AACnC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oCAAoC;AACpC;AACA;;AAEA;AACA;AACA,wBAAwB;AACxB;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,SAAS;AAClB;AACA;AACA;AACA;AACA,iDAAiD;AACjD,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA,cAAc,0BAA0B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,kCAAkC;AAClC;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChYA,YAAY,mBAAO,CAAC,6DAAiB;;AAErC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;;AAE5C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,qDAAqD,KAAK;AAC1D,uDAAuD,KAAK;AAC5D;AACA,WAAW,aAAa,YAAY;AACpC;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,+DAA+D;AAC/D;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,oBAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,iBAAiB;AAChC;AACA,eAAe,kBAAkB;AACjC;AACA,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,8BAA8B;;AAE9B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;;AAE1B;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,qBAAqB;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAsC,OAAO;AAC7C;AACA,qEAAqE;AACrE,iEAAiE;AACjE;AACA;AACA,kCAAkC;AAClC,kCAAkC;AAClC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,oBAAoB;AACnC;AACA,eAAe,QAAQ;AACvB,eAAe,iBAAiB;AAChC;AACA,eAAe,SAAS;AACxB;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B;AAC1B,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ,0CAA0C;AAClD,eAAe,OAAO;AACtB,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,qEAAqE;AACrE,UAAU;AACV;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,kBAAkB;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;;;;;;;;;;;AC9mBA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB;;AAEpB;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb,IAAI,IAAqC;AACzC;AACA;;AAEA,YAAY,mBAAO,CAAC,oBAAO;AAC3B,cAAc,mBAAO,CAAC,4DAAe;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE,gBAAgB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,+FAA+F,eAAe;AAC9G;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK,GAAG;;AAER,kDAAkD;AAClD;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,4BAA4B;;AAE5B;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;;AAEvC;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,uBAAuB;AACvB;AACA,SAAS;AACT,wBAAwB;AACxB;AACA,SAAS;AACT,wBAAwB;AACxB;AACA,SAAS;AACT,yBAAyB;AACzB;AACA,SAAS;AACT,yBAAyB;AACzB;AACA,SAAS;AACT,kCAAkC;AAClC;AACA,SAAS;AACT,4BAA4B;AAC5B;AACA,SAAS;AACT,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;;;AAGN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,2DAA2D;;AAE3D;AACA;;AAEA;AACA,yDAAyD;AACzD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,kBAAkB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB;;;AAGlB;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAI;;;AAGJ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B;AAC9B;AACA;;AAEA;AACA;AACA;AACA;AACA,2HAA2H;AAC3H;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA,oEAAoE;;AAEpE;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,GAAG;AACd,WAAW,GAAG;AACd,WAAW,eAAe;AAC1B,WAAW,GAAG;AACd,WAAW,GAAG;AACd;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK,GAAG;;AAER;AACA;AACA;AACA;AACA;AACA,KAAK,GAAG;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;;AAEA;AACA;AACA,kBAAkB;;AAElB;AACA;AACA,oBAAoB;AACpB,2DAA2D,UAAU;AACrE,yBAAyB,UAAU;AACnC;AACA,aAAa,UAAU;AACvB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;;;AAGN;AACA;AACA;AACA;AACA,MAAM;;;AAGN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,YAAY,SAAS;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,GAAG;AACd;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,6DAA6D;AAC7D;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,WAAW;AACtB,WAAW,GAAG;AACd;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,iBAAiB;AACvC;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN,4CAA4C;;AAE5C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB;;;AAGA;AACA;AACA;;AAEA,oBAAoB,iBAAiB;AACrC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA,0DAA0D;AAC1D;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAsC;AACtC;;AAEA;;AAEA,WAAW;AACX,YAAY;AACZ,GAAG;AACH;;;;;;;;;;;;ACpsCa;;AAEb,IAAI,KAAqC,EAAE,EAE1C,CAAC;AACF,EAAE,+IAAkE;AACpE;;;;;;;;;;;;ACNA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;ACAA;AAC+C;AACrB;AACS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,oCAAoC,8DAAS,oBAAoB,SAAS,8DAAS,GAAG,EAAE,8DAAS;AACjG;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,MAAM,IAAqC;AAC3C;AACA;AACA;AACA;AACA;AACA,wCAAwC,YAAY,sBAAsB,cAAc;AACxF;AACA;AACA;AACA;AACA;AACA,QAAQ,IAAqC;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,wCAAwC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,iDAAE,wDAAwD,iDAAE;AAC7G,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,KAAK,QAAQ,MAAM,EAAE,KAAK;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,eAAe,gDAAmB;AAClC;AACA,aAAa,gDAAmB;AAChC;AACA,mBAAmB,6CAAgB,GAAG,6CAAgB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,KAAqC;AAC1D;AACA;AACA;AACA,CAAC,IAAI,CAAM;AAGT;AACF;;;;;;;;;;;;;;;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIE;AACF;;;;;;UCtCA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;ACNA;AACA;AACA7B,+DAAc,CAAC3E,+DAAD,CAAd,C","sources":["webpack://leadin/./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js","webpack://leadin/./node_modules/@linaria/react/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js","webpack://leadin/./scripts/api/wordpressApiClient.ts","webpack://leadin/./scripts/constants/leadinConfig.ts","webpack://leadin/./scripts/constants/selectors.ts","webpack://leadin/./scripts/iframe/IframeErrorPage.tsx","webpack://leadin/./scripts/iframe/constants.ts","webpack://leadin/./scripts/iframe/integratedMessages/core/CoreMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/forms/FormsMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/index.ts","webpack://leadin/./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/plugin/PluginMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts","webpack://leadin/./scripts/iframe/messageMiddleware.ts","webpack://leadin/./scripts/iframe/renderIframeApp.tsx","webpack://leadin/./scripts/iframe/useAppEmbedder.ts","webpack://leadin/./scripts/lib/Raven.ts","webpack://leadin/./scripts/utils/appUtils.ts","webpack://leadin/./scripts/utils/contentEmbedInstaller.ts","webpack://leadin/./scripts/utils/iframe.ts","webpack://leadin/./scripts/utils/queryParams.ts","webpack://leadin/./scripts/iframe/IframeErrorPage.tsx?1b3e","webpack://leadin/./node_modules/object-assign/index.js","webpack://leadin/./node_modules/raven-js/src/configError.js","webpack://leadin/./node_modules/raven-js/src/console.js","webpack://leadin/./node_modules/raven-js/src/raven.js","webpack://leadin/./node_modules/raven-js/src/singleton.js","webpack://leadin/./node_modules/raven-js/src/utils.js","webpack://leadin/./node_modules/raven-js/vendor/TraceKit/tracekit.js","webpack://leadin/./node_modules/raven-js/vendor/json-stringify-safe/stringify.js","webpack://leadin/./node_modules/react/cjs/react-jsx-runtime.development.js","webpack://leadin/./node_modules/react/jsx-runtime.js","webpack://leadin/external window \"React\"","webpack://leadin/external window \"ReactDOM\"","webpack://leadin/external window \"jQuery\"","webpack://leadin/external window [\"wp\",\"i18n\"]","webpack://leadin/./node_modules/@linaria/react/dist/index.mjs","webpack://leadin/./node_modules/@linaria/react/node_modules/@linaria/core/dist/index.mjs","webpack://leadin/webpack/bootstrap","webpack://leadin/webpack/runtime/compat get default export","webpack://leadin/webpack/runtime/define property getters","webpack://leadin/webpack/runtime/global","webpack://leadin/webpack/runtime/hasOwnProperty shorthand","webpack://leadin/webpack/runtime/make namespace object","webpack://leadin/./scripts/entries/app.ts"],"sourcesContent":["function memoize(fn) {\n var cache = Object.create(null);\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\n\nexport default memoize;\n","import memoize from '@emotion/memoize';\n\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar isPropValid = /* #__PURE__ */memoize(function (prop) {\n return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n /* o */\n && prop.charCodeAt(1) === 110\n /* n */\n && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\nexport default isPropValid;\n","import $ from 'jquery';\nimport Raven from '../lib/Raven';\nimport { restNonce, restUrl } from '../constants/leadinConfig';\nimport { addQueryObjectToUrl } from '../utils/queryParams';\nfunction makeRequest(method, path, data = {}, queryParams = {}) {\n // eslint-disable-next-line compat/compat\n const restApiUrl = new URL(`${restUrl}leadin/v1${path}`);\n addQueryObjectToUrl(restApiUrl, queryParams);\n return new Promise((resolve, reject) => {\n const payload = {\n url: restApiUrl.toString(),\n method,\n contentType: 'application/json',\n beforeSend: (xhr) => xhr.setRequestHeader('X-WP-Nonce', restNonce),\n success: resolve,\n error: (response) => {\n Raven.captureMessage(`HTTP Request to ${restApiUrl} failed with error ${response.status}: ${response.responseText}`, {\n fingerprint: [\n '{{ default }}',\n path,\n response.status,\n response.responseText,\n ],\n });\n reject(response);\n },\n };\n if (method !== 'get') {\n payload.data = JSON.stringify(data);\n }\n $.ajax(payload);\n });\n}\nexport function healthcheckRestApi() {\n return makeRequest('get', '/healthcheck');\n}\nexport function disableInternalTracking(value) {\n return makeRequest('put', '/internal-tracking', value ? '1' : '0');\n}\nexport function fetchDisableInternalTracking() {\n return makeRequest('get', '/internal-tracking').then(message => ({\n message,\n }));\n}\nexport function updateHublet(hublet) {\n return makeRequest('put', '/hublet', { hublet });\n}\nexport function skipReview() {\n return makeRequest('post', '/skip-review');\n}\nexport function trackConsent(canTrack) {\n return makeRequest('post', '/track-consent', { canTrack }).then(message => ({\n message,\n }));\n}\nexport function setBusinessUnitId(businessUnitId) {\n return makeRequest('put', '/business-unit', { businessUnitId });\n}\nexport function getBusinessUnitId() {\n return makeRequest('get', '/business-unit');\n}\n","const { accountName, adminUrl, activationTime, connectionStatus, deviceId, didDisconnect, env, formsScript, meetingsScript, formsScriptPayload, hublet, hubspotBaseUrl, hubspotNonce, iframeUrl, impactLink, lastAuthorizeTime, lastDeauthorizeTime, lastDisconnectTime, leadinPluginVersion, leadinQueryParams, locale, loginUrl, phpVersion, pluginPath, plugins, portalDomain, portalEmail, portalId, redirectNonce, restNonce, restUrl, refreshToken, reviewSkippedDate, theme, trackConsent, wpVersion, contentEmbed, requiresContentEmbedScope, refreshTokenError, } = window.leadinConfig;\nexport { accountName, adminUrl, activationTime, connectionStatus, deviceId, didDisconnect, env, formsScript, meetingsScript, formsScriptPayload, hublet, hubspotBaseUrl, hubspotNonce, iframeUrl, impactLink, lastAuthorizeTime, lastDeauthorizeTime, lastDisconnectTime, leadinPluginVersion, leadinQueryParams, loginUrl, locale, phpVersion, pluginPath, plugins, portalDomain, portalEmail, portalId, redirectNonce, restNonce, restUrl, refreshToken, reviewSkippedDate, theme, trackConsent, wpVersion, contentEmbed, requiresContentEmbedScope, refreshTokenError, };\n","export const domElements = {\n iframe: '#leadin-iframe',\n subMenu: '.toplevel_page_leadin > ul',\n subMenuLinks: '.toplevel_page_leadin > ul a',\n subMenuButtons: '.toplevel_page_leadin > ul > li',\n deactivatePluginButton: '[data-slug=\"leadin\"] .deactivate a',\n deactivateFeedbackForm: 'form.leadin-deactivate-form',\n deactivateFeedbackSubmit: 'button#leadin-feedback-submit',\n deactivateFeedbackSkip: 'button#leadin-feedback-skip',\n thickboxModalClose: '.leadin-modal-close',\n thickboxModalWindow: 'div#TB_window.thickbox-loading',\n thickboxModalContent: 'div#TB_ajaxContent.TB_modal',\n reviewBannerContainer: '#leadin-review-banner',\n reviewBannerLeaveReviewLink: 'a#leave-review-button',\n reviewBannerDismissButton: 'a#dismiss-review-banner-button',\n leadinIframeContainer: 'leadin-iframe-container',\n leadinIframe: 'leadin-iframe',\n leadinIframeFallbackContainer: 'leadin-iframe-fallback-container',\n};\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { __ } from '@wordpress/i18n';\nimport { styled } from '@linaria/react';\nconst IframeErrorContainer = styled.div `\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n margin-top: 120px;\n font-family: 'Lexend Deca', Helvetica, Arial, sans-serif;\n font-weight: 400;\n font-size: 14px;\n font-size: 0.875rem;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-smoothing: antialiased;\n line-height: 1.5rem;\n`;\nconst ErrorHeader = styled.h1 `\n text-shadow: 0 0 1px transparent;\n margin-bottom: 1.25rem;\n color: #33475b;\n font-size: 1.25rem;\n`;\nexport const IframeErrorPage = () => (_jsxs(IframeErrorContainer, { children: [_jsx(\"img\", { alt: \"Cannot find page\", width: \"175\", src: \"//static.hsappstatic.net/ui-images/static-1.14/optimized/errors/map.svg\" }), _jsx(ErrorHeader, { children: __('The HubSpot for WordPress plugin is not able to load pages', 'leadin') }), _jsx(\"p\", { children: __('Try disabling your browser extensions and ad blockers, then refresh the page', 'leadin') }), _jsx(\"p\", { children: __('Or open the HubSpot for WordPress plugin in a different browser', 'leadin') })] }));\n","export var App;\n(function (App) {\n App[App[\"Forms\"] = 0] = \"Forms\";\n App[App[\"LiveChat\"] = 1] = \"LiveChat\";\n App[App[\"Plugin\"] = 2] = \"Plugin\";\n App[App[\"PluginSettings\"] = 3] = \"PluginSettings\";\n App[App[\"Background\"] = 4] = \"Background\";\n})(App || (App = {}));\nexport const AppIframe = {\n [App.Forms]: 'integrated-form-app',\n [App.LiveChat]: 'integrated-livechat-app',\n [App.Plugin]: 'integrated-plugin-app',\n [App.PluginSettings]: 'integrated-plugin-app',\n [App.Background]: 'integrated-plugin-proxy',\n};\n","export const CoreMessages = {\n HandshakeReceive: 'INTEGRATED_APP_EMBEDDER_HANDSHAKE_RECEIVED',\n SendRefreshToken: 'INTEGRATED_APP_EMBEDDER_SEND_REFRESH_TOKEN',\n ReloadParentFrame: 'INTEGRATED_APP_EMBEDDER_RELOAD_PARENT_FRAME',\n RedirectParentFrame: 'INTEGRATED_APP_EMBEDDER_REDIRECT_PARENT_FRAME',\n SendLocale: 'INTEGRATED_APP_EMBEDDER_SEND_LOCALE',\n SendDeviceId: 'INTEGRATED_APP_EMBEDDER_SEND_DEVICE_ID',\n SendIntegratedAppConfig: 'INTEGRATED_APP_EMBEDDER_CONFIG',\n};\n","export const FormMessages = {\n CreateFormAppNavigation: 'CREATE_FORM_APP_NAVIGATION',\n};\n","export * from './core/CoreMessages';\nexport * from './forms/FormsMessages';\nexport * from './livechat/LiveChatMessages';\nexport * from './plugin/PluginMessages';\nexport * from './proxy/ProxyMessages';\n","export const LiveChatMessages = {\n CreateLiveChatAppNavigation: 'CREATE_LIVE_CHAT_APP_NAVIGATION',\n};\n","export const PluginMessages = {\n PluginSettingsNavigation: 'PLUGIN_SETTINGS_NAVIGATION',\n PluginLeadinConfig: 'PLUGIN_LEADIN_CONFIG',\n TrackConsent: 'INTEGRATED_APP_EMBEDDER_TRACK_CONSENT',\n InternalTrackingFetchRequest: 'INTEGRATED_TRACKING_FETCH_REQUEST',\n InternalTrackingFetchResponse: 'INTEGRATED_TRACKING_FETCH_RESPONSE',\n InternalTrackingFetchError: 'INTEGRATED_TRACKING_FETCH_ERROR',\n InternalTrackingChangeRequest: 'INTEGRATED_TRACKING_CHANGE_REQUEST',\n InternalTrackingChangeError: 'INTEGRATED_TRACKING_CHANGE_ERROR',\n BusinessUnitFetchRequest: 'BUSINESS_UNIT_FETCH_REQUEST',\n BusinessUnitFetchResponse: 'BUSINESS_UNIT_FETCH_FETCH_RESPONSE',\n BusinessUnitFetchError: 'BUSINESS_UNIT_FETCH_FETCH_ERROR',\n BusinessUnitChangeRequest: 'BUSINESS_UNIT_CHANGE_REQUEST',\n BusinessUnitChangeError: 'BUSINESS_UNIT_CHANGE_ERROR',\n SkipReviewRequest: 'SKIP_REVIEW_REQUEST',\n SkipReviewResponse: 'SKIP_REVIEW_RESPONSE',\n SkipReviewError: 'SKIP_REVIEW_ERROR',\n RemoveParentQueryParam: 'REMOVE_PARENT_QUERY_PARAM',\n ContentEmbedInstallRequest: 'CONTENT_EMBED_INSTALL_REQUEST',\n ContentEmbedInstallResponse: 'CONTENT_EMBED_INSTALL_RESPONSE',\n ContentEmbedInstallError: 'CONTENT_EMBED_INSTALL_ERROR',\n ContentEmbedActivationRequest: 'CONTENT_EMBED_ACTIVATION_REQUEST',\n ContentEmbedActivationResponse: 'CONTENT_EMBED_ACTIVATION_RESPONSE',\n ContentEmbedActivationError: 'CONTENT_EMBED_ACTIVATION_ERROR',\n};\n","export const ProxyMessages = {\n FetchForms: 'FETCH_FORMS',\n FetchForm: 'FETCH_FORM',\n CreateFormFromTemplate: 'CREATE_FORM_FROM_TEMPLATE',\n FetchAuth: 'FETCH_AUTH',\n FetchMeetingsAndUsers: 'FETCH_MEETINGS_AND_USERS',\n FetchContactsCreateSinceActivation: 'FETCH_CONTACTS_CREATED_SINCE_ACTIVATION',\n FetchOrCreateMeetingUser: 'FETCH_OR_CREATE_MEETING_USER',\n ConnectMeetingsCalendar: 'CONNECT_MEETINGS_CALENDAR',\n TrackFormPreviewRender: 'TRACK_FORM_PREVIEW_RENDER',\n TrackFormCreatedFromTemplate: 'TRACK_FORM_CREATED_FROM_TEMPLATE',\n TrackFormCreationFailed: 'TRACK_FORM_CREATION_FAILED',\n TrackMeetingPreviewRender: 'TRACK_MEETING_PREVIEW_RENDER',\n TrackSidebarMetaChange: 'TRACK_SIDEBAR_META_CHANGE',\n TrackReviewBannerRender: 'TRACK_REVIEW_BANNER_RENDER',\n TrackReviewBannerInteraction: 'TRACK_REVIEW_BANNER_INTERACTION',\n TrackReviewBannerDismissed: 'TRACK_REVIEW_BANNER_DISMISSED',\n TrackPluginDeactivation: 'TRACK_PLUGIN_DEACTIVATION',\n};\n","import { PluginMessages } from '../iframe/integratedMessages';\nimport { fetchDisableInternalTracking, trackConsent, disableInternalTracking, getBusinessUnitId, setBusinessUnitId, skipReview, } from '../api/wordpressApiClient';\nimport { removeQueryParamFromLocation } from '../utils/queryParams';\nimport { startActivation, startInstall } from '../utils/contentEmbedInstaller';\nconst messageMapper = new Map([\n [\n PluginMessages.TrackConsent,\n (message) => {\n trackConsent(message.payload);\n },\n ],\n [\n PluginMessages.InternalTrackingChangeRequest,\n (message, embedder) => {\n disableInternalTracking(message.payload)\n .then(() => {\n embedder.postMessage({\n key: PluginMessages.InternalTrackingFetchResponse,\n payload: message.payload,\n });\n })\n .catch(payload => {\n embedder.postMessage({\n key: PluginMessages.InternalTrackingChangeError,\n payload,\n });\n });\n },\n ],\n [\n PluginMessages.InternalTrackingFetchRequest,\n (__message, embedder) => {\n fetchDisableInternalTracking()\n .then(({ message: payload }) => {\n embedder.postMessage({\n key: PluginMessages.InternalTrackingFetchResponse,\n payload,\n });\n })\n .catch(payload => {\n embedder.postMessage({\n key: PluginMessages.InternalTrackingFetchError,\n payload,\n });\n });\n },\n ],\n [\n PluginMessages.BusinessUnitFetchRequest,\n (__message, embedder) => {\n getBusinessUnitId()\n .then(payload => {\n embedder.postMessage({\n key: PluginMessages.BusinessUnitFetchResponse,\n payload,\n });\n })\n .catch(payload => {\n embedder.postMessage({\n key: PluginMessages.BusinessUnitFetchError,\n payload,\n });\n });\n },\n ],\n [\n PluginMessages.BusinessUnitChangeRequest,\n (message, embedder) => {\n setBusinessUnitId(message.payload)\n .then(payload => {\n embedder.postMessage({\n key: PluginMessages.BusinessUnitFetchResponse,\n payload,\n });\n })\n .catch(payload => {\n embedder.postMessage({\n key: PluginMessages.BusinessUnitChangeError,\n payload,\n });\n });\n },\n ],\n [\n PluginMessages.SkipReviewRequest,\n (__message, embedder) => {\n skipReview()\n .then(payload => {\n embedder.postMessage({\n key: PluginMessages.SkipReviewResponse,\n payload,\n });\n })\n .catch(payload => {\n embedder.postMessage({\n key: PluginMessages.SkipReviewError,\n payload,\n });\n });\n },\n ],\n [\n PluginMessages.RemoveParentQueryParam,\n (message) => {\n removeQueryParamFromLocation(message.payload);\n },\n ],\n [\n PluginMessages.ContentEmbedInstallRequest,\n (message, embedder) => {\n startInstall(message.payload.nonce)\n .then(payload => {\n embedder.postMessage({\n key: PluginMessages.ContentEmbedInstallResponse,\n payload: payload,\n });\n })\n .catch(payload => {\n embedder.postMessage({\n key: PluginMessages.ContentEmbedInstallError,\n payload,\n });\n });\n },\n ],\n [\n PluginMessages.ContentEmbedActivationRequest,\n (message, embedder) => {\n startActivation(message.payload.activateAjaxUrl)\n .then(payload => {\n embedder.postMessage({\n key: PluginMessages.ContentEmbedActivationResponse,\n payload: payload,\n });\n })\n .catch(payload => {\n embedder.postMessage({\n key: PluginMessages.ContentEmbedActivationError,\n payload,\n });\n });\n },\n ],\n]);\nexport const messageMiddleware = (embedder) => (message) => {\n const next = messageMapper.get(message.key);\n if (next) {\n next(message, embedder);\n }\n};\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Fragment } from 'react';\nimport ReactDOM from 'react-dom';\nimport { domElements } from '../constants/selectors';\nimport useAppEmbedder from './useAppEmbedder';\nimport { App } from './constants';\nimport { IframeErrorPage } from './IframeErrorPage';\nconst IntegratedIframePortal = (props) => {\n const container = document.getElementById(domElements.leadinIframeContainer);\n const iframeNotRendered = useAppEmbedder(props.app, props.createRoute, container);\n if (container && !iframeNotRendered) {\n return ReactDOM.createPortal(props.children, container);\n }\n return (_jsx(Fragment, { children: (!container || iframeNotRendered) && _jsx(IframeErrorPage, {}) }));\n};\nconst renderIframeApp = () => {\n const iframeFallbackContainer = document.getElementById(domElements.leadinIframeContainer);\n let app;\n const queryParams = new URLSearchParams(location.search);\n const page = queryParams.get('page');\n const createRoute = queryParams.get('leadin_route[0]') === 'create';\n switch (page) {\n case 'leadin_forms':\n app = App.Forms;\n break;\n case 'leadin_chatflows':\n app = App.LiveChat;\n break;\n case 'leadin_settings':\n app = App.PluginSettings;\n break;\n case 'leadin_user_guide':\n default:\n app = App.Plugin;\n break;\n }\n ReactDOM.render(_jsx(IntegratedIframePortal, { app: app, createRoute: createRoute }), iframeFallbackContainer);\n};\nexport default renderIframeApp;\n","import { useEffect } from 'react';\nimport Raven from '../lib/Raven';\nimport { accountName, adminUrl, connectionStatus, deviceId, hubspotBaseUrl, leadinQueryParams, locale, plugins, portalDomain, portalEmail, portalId, reviewSkippedDate, refreshToken, impactLink, theme, lastAuthorizeTime, lastDeauthorizeTime, lastDisconnectTime, leadinPluginVersion, phpVersion, wpVersion, contentEmbed, requiresContentEmbedScope, refreshTokenError, } from '../constants/leadinConfig';\nimport { App, AppIframe } from './constants';\nimport { messageMiddleware } from './messageMiddleware';\nimport { resizeWindow, useIframeNotRendered } from '../utils/iframe';\nconst getIntegrationConfig = () => {\n return {\n adminUrl: leadinQueryParams.adminUrl,\n };\n};\nconst getLeadinConfig = () => {\n const utm_query_params = Object.keys(leadinQueryParams)\n .filter(x => /^utm/.test(x))\n .reduce((p, c) => ({\n [c]: leadinQueryParams[c],\n ...p,\n }), {});\n return {\n accountName,\n admin: leadinQueryParams.admin,\n adminUrl,\n company: leadinQueryParams.company,\n connectionStatus,\n deviceId,\n email: leadinQueryParams.email,\n firstName: leadinQueryParams.firstName,\n irclickid: leadinQueryParams.irclickid,\n justConnected: leadinQueryParams.justConnected,\n lastName: leadinQueryParams.lastName,\n lastAuthorizeTime,\n lastDeauthorizeTime,\n lastDisconnectTime,\n leadinPluginVersion,\n mpid: leadinQueryParams.mpid,\n nonce: leadinQueryParams.nonce,\n phpVersion,\n plugins,\n portalDomain,\n portalEmail,\n portalId,\n reviewSkippedDate,\n theme,\n trackConsent: leadinQueryParams.trackConsent,\n websiteName: leadinQueryParams.websiteName,\n wpVersion,\n contentEmbed,\n requiresContentEmbedScope,\n refreshTokenError,\n ...utm_query_params,\n };\n};\nconst getAppOptions = (app, createRoute = false) => {\n const { IntegratedAppOptions, FormsAppOptions, LiveChatAppOptions, PluginAppOptions, } = window;\n let options;\n switch (app) {\n case App.Plugin:\n options = new PluginAppOptions().setLeadinConfig(getLeadinConfig());\n break;\n case App.PluginSettings:\n options = new PluginAppOptions()\n .setLeadinConfig(getLeadinConfig())\n .setPluginSettingsInit();\n break;\n case App.Forms:\n options = new FormsAppOptions().setIntegratedAppConfig(getIntegrationConfig());\n if (createRoute) {\n options = options.setCreateFormAppInit();\n }\n break;\n case App.LiveChat:\n options = new LiveChatAppOptions();\n if (createRoute) {\n options = options.setCreateLiveChatAppInit();\n }\n break;\n default:\n options = new IntegratedAppOptions();\n }\n return options;\n};\nexport default function useAppEmbedder(app, createRoute, container) {\n console.info('HubSpot plugin - starting app embedder for:', AppIframe[app], container);\n const iframeNotRendered = useIframeNotRendered(AppIframe[app]);\n useEffect(() => {\n const { IntegratedAppEmbedder } = window;\n if (IntegratedAppEmbedder) {\n const options = getAppOptions(app, createRoute)\n .setLocale(locale)\n .setDeviceId(deviceId)\n .setRefreshToken(refreshToken);\n const embedder = new IntegratedAppEmbedder(AppIframe[app], portalId, hubspotBaseUrl, resizeWindow, refreshToken ? '' : impactLink).setOptions(options);\n embedder.subscribe(messageMiddleware(embedder));\n embedder.attachTo(container, true);\n embedder.postStartAppMessage(); // lets the app know all all data has been passed to it\n window.embedder = embedder;\n }\n }, []);\n if (iframeNotRendered) {\n console.error('HubSpot plugin Iframe not rendered', {\n portalId,\n container,\n appName: AppIframe[app],\n hasIntegratedAppEmbedder: !!window.IntegratedAppEmbedder,\n });\n Raven.captureException(new Error('Leadin Iframe not rendered'), {\n fingerprint: ['USE_APP_EMBEDDER', 'IFRAME_SETUP_ERROR'],\n extra: {\n portalId,\n container,\n app,\n hubspotBaseUrl,\n impactLink,\n appName: AppIframe[app],\n hasRefreshToken: !!refreshToken,\n },\n });\n }\n return iframeNotRendered;\n}\n","import Raven from 'raven-js';\nimport { hubspotBaseUrl, phpVersion, wpVersion, leadinPluginVersion, portalId, plugins, } from '../constants/leadinConfig';\nexport function configureRaven() {\n if (hubspotBaseUrl.indexOf('app.hubspot.com') === -1) {\n return;\n }\n Raven.config('https://e9b8f382cdd130c0d415cd977d2be56f@exceptions.hubspot.com/1', {\n instrument: {\n tryCatch: false,\n },\n release: leadinPluginVersion,\n }).install();\n Raven.setTagsContext({\n v: leadinPluginVersion,\n php: phpVersion,\n wordpress: wpVersion,\n });\n Raven.setExtraContext({\n hub: portalId,\n plugins: Object.keys(plugins)\n .map(name => `${name}#${plugins[name]}`)\n .join(','),\n });\n}\nexport default Raven;\n","import $ from 'jquery';\nimport Raven, { configureRaven } from '../lib/Raven';\nexport function initApp(initFn) {\n configureRaven();\n Raven.context(initFn);\n}\nexport function initAppOnReady(initFn) {\n function main() {\n $(initFn);\n }\n initApp(main);\n}\n","export function startInstall(nonce) {\n const formData = new FormData();\n const ajaxUrl = window.ajaxurl;\n formData.append('_wpnonce', nonce);\n formData.append('action', 'content_embed_install');\n return fetch(ajaxUrl, {\n method: 'POST',\n body: formData,\n keepalive: true,\n }).then(res => res.json());\n}\nexport function startActivation(requestUrl) {\n return fetch(requestUrl, {\n method: 'POST',\n keepalive: true,\n }).then(res => res.json());\n}\n","import { useEffect, useState } from 'react';\nconst IFRAME_DISPLAY_TIMEOUT = 5000;\nexport function useIframeNotRendered(app) {\n const [iframeNotRendered, setIframeNotRendered] = useState(false);\n useEffect(() => {\n const timer = setTimeout(() => {\n const iframe = document.getElementById(app);\n if (!iframe) {\n setIframeNotRendered(true);\n }\n }, IFRAME_DISPLAY_TIMEOUT);\n return () => {\n if (timer) {\n clearTimeout(timer);\n }\n };\n }, []);\n return iframeNotRendered;\n}\nexport const resizeWindow = () => {\n const adminMenuWrap = document.getElementById('adminmenuwrap');\n const sideMenuHeight = adminMenuWrap ? adminMenuWrap.offsetHeight : 0;\n const adminBar = document.getElementById('wpadminbar');\n const adminBarHeight = (adminBar && adminBar.offsetHeight) || 0;\n const offset = 4;\n if (window.innerHeight < sideMenuHeight) {\n return sideMenuHeight - offset;\n }\n else {\n return window.innerHeight - adminBarHeight - offset;\n }\n};\n","export function addQueryObjectToUrl(urlObject, queryParams) {\n Object.keys(queryParams).forEach(key => {\n urlObject.searchParams.append(key, queryParams[key]);\n });\n}\nexport function removeQueryParamFromLocation(key) {\n const location = new URL(window.location.href);\n location.searchParams.delete(key);\n window.history.replaceState(null, '', location.href);\n}\n","// extracted by mini-css-extract-plugin\nexport {};","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = '' + args.join(' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg = 'Assertion failed: ' + (args.slice(1).join(' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isObject = utils.isObject;\nvar isErrorEvent = utils.isErrorEvent;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n collectWindowErrors: true,\n maxMessageLength: 0,\n\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.19.1',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = undefined;\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} func A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped already\n // for both debugging and to prevent it to being wrapped twice\n wrapped.__raven__ = true;\n wrapped.__inner__ = func;\n\n return wrapped;\n },\n\n /*\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._restoreBuiltIns();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /*\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n // Cases for sending ex as a message, rather than an exception\n var isNotError = !isError(ex);\n var isNotErrorEvent = !isErrorEvent(ex);\n var isErrorEventWithoutError = isErrorEvent(ex) && !ex.error;\n\n if ((isNotError && isNotErrorEvent) || isErrorEventWithoutError) {\n return this.captureMessage(\n ex,\n objectMerge(\n {\n trimHeadFrames: 1,\n stacktrace: true // if we fall back to captureMessage, default to attempting a new trace\n },\n options\n )\n );\n }\n\n // Get actual Error from ErrorEvent\n if (isErrorEvent(ex)) ex = ex.error;\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n\n var data = objectMerge(\n {\n message: msg + '' // Make sure it's actually a string\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = stack.stack[1];\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n if (this._globalOptions.stacktrace || (options && options.stacktrace)) {\n options = objectMerge(\n {\n // fingerprint on msg, not stack trace (legacy behavior, could be\n // revisited)\n fingerprint: msg,\n // since we know this is a synthetic trace, the top N-most frames\n // MUST be from Raven.js, so mark them as in_app later by setting\n // trimHeadFrames\n trimHeadFrames: (options.trimHeadFrames || 0) + 1\n },\n options\n );\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = options || {};\n\n var lastEventId = options.eventId || this.lastEventId();\n if (!lastEventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n var dsn = options.dsn || this._dsn;\n if (!dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var qs = '';\n qs += '?eventId=' + encode(lastEventId);\n qs += '&dsn=' + encode(dsn);\n\n var user = options.user || this._globalContext.user;\n if (user) {\n if (user.name) qs += '&name=' + encode(user.name);\n if (user.email) qs += '&email=' + encode(user.email);\n }\n\n var globalServer = this._getGlobalServer(this._parseDSN(dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/' + qs;\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(originalCallback);\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(fn.handleEvent);\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(fn, undefined, before),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(self.wrap(cb));\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(orig);\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function(data) {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(orig, undefined, onreadystatechangeHandler);\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && 'fetch' in _window) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return origFetch.apply(this, args).then(function(response) {\n fetchData.status_code = response.status;\n\n return response;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n history.pushState &&\n history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function() {\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo.apply(this, arguments);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n culprit: fileurl\n },\n options\n );\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': navigator.userAgent\n };\n }\n\n if (this._hasDocument) {\n if (_document.location && _document.location.href) {\n httpData.url = _document.location.href;\n }\n if (_document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.culprit !== last.culprit // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n retry = request.getResponseHeader('Retry-After');\n retry = parseInt(retry, 10) * 1000; // Retry-After is returned in seconds\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n // If there are no tags/extra, strip the key from the payload alltogther.\n if (isEmptyObject(data.tags)) delete data.tags;\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n var url = opts.url;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n // NOTE: auth is intentionally sent as part of query string (NOT as custom\n // HTTP header) so as to avoid preflight CORS requests\n request.open('POST', url + '?' + urlencode(opts.auth));\n request.send(stringify(opts.data));\n },\n\n _logDebug: function(level) {\n if (this._originalConsoleMethods[level] && this.debug) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n","var _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch ({}.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return supportsErrorEvent() && {}.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isEmptyObject(what) {\n for (var _ in what) return false; // eslint-disable-line guard-for-in, no-unused-vars\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n return !max || str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n if (!match) return {};\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n var orig = obj[name];\n obj[name] = replacement(orig);\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isString: isString,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n return document.location.href;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} message Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(message, url, lineNo, colNo, ex) {\n var stack = null;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (ex && utils.isError(ex)) {\n // non-string `ex` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(ex);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var msg = message; // must be new var or will modify original `arguments`\n var groups;\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n msg = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: msg,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,\n gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\\[native).*?|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i,\n winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n // Used to additionally parse URL/line/column from eval frames\n geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i,\n chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/,\n lines = ex.stack.split('\\n'),\n stack = [],\n submatch,\n parts,\n element,\n reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","/** @license React v17.0.2\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\nvar _assign = require('object-assign');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar REACT_ELEMENT_TYPE = 0xeac7;\nvar REACT_PORTAL_TYPE = 0xeaca;\nexports.Fragment = 0xeacb;\nvar REACT_STRICT_MODE_TYPE = 0xeacc;\nvar REACT_PROFILER_TYPE = 0xead2;\nvar REACT_PROVIDER_TYPE = 0xeacd;\nvar REACT_CONTEXT_TYPE = 0xeace;\nvar REACT_FORWARD_REF_TYPE = 0xead0;\nvar REACT_SUSPENSE_TYPE = 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = 0xead8;\nvar REACT_MEMO_TYPE = 0xead3;\nvar REACT_LAZY_TYPE = 0xead4;\nvar REACT_BLOCK_TYPE = 0xead9;\nvar REACT_SERVER_BLOCK_TYPE = 0xeada;\nvar REACT_FUNDAMENTAL_TYPE = 0xead5;\nvar REACT_SCOPE_TYPE = 0xead7;\nvar REACT_OPAQUE_ID_TYPE = 0xeae0;\nvar REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1;\nvar REACT_OFFSCREEN_TYPE = 0xeae2;\nvar REACT_LEGACY_HIDDEN_TYPE = 0xeae3;\n\nif (typeof Symbol === 'function' && Symbol.for) {\n var symbolFor = Symbol.for;\n REACT_ELEMENT_TYPE = symbolFor('react.element');\n REACT_PORTAL_TYPE = symbolFor('react.portal');\n exports.Fragment = symbolFor('react.fragment');\n REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode');\n REACT_PROFILER_TYPE = symbolFor('react.profiler');\n REACT_PROVIDER_TYPE = symbolFor('react.provider');\n REACT_CONTEXT_TYPE = symbolFor('react.context');\n REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref');\n REACT_SUSPENSE_TYPE = symbolFor('react.suspense');\n REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list');\n REACT_MEMO_TYPE = symbolFor('react.memo');\n REACT_LAZY_TYPE = symbolFor('react.lazy');\n REACT_BLOCK_TYPE = symbolFor('react.block');\n REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block');\n REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental');\n REACT_SCOPE_TYPE = symbolFor('react.scope');\n REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id');\n REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode');\n REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen');\n REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden');\n}\n\nvar MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n }\n\n var argsWithFormat = args.map(function (item) {\n return '' + item;\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// Filter certain DOM attributes (e.g. src, href) if their values are empty strings.\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === exports.Fragment || type === REACT_PROFILER_TYPE || type === REACT_DEBUG_TRACING_MODE_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var functionName = innerType.displayName || innerType.name || '';\n return outerType.displayName || (functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName);\n}\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n}\n\nfunction getComponentName(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case exports.Fragment:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n return getComponentName(type.type);\n\n case REACT_BLOCK_TYPE:\n return getComponentName(type._render);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentName(init(payload));\n } catch (x) {\n return null;\n }\n }\n }\n }\n\n return null;\n}\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: _assign({}, props, {\n value: prevLog\n }),\n info: _assign({}, props, {\n value: prevInfo\n }),\n warn: _assign({}, props, {\n value: prevWarn\n }),\n error: _assign({}, props, {\n value: prevError\n }),\n group: _assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: _assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: _assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if (!fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at ');\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_BLOCK_TYPE:\n return describeFunctionComponentFrame(type._render);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(Object.prototype.hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentName(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie.
\n // or
). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n //
, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentName(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentName(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (Array.isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentName(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentName(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (Array.isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentName(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (Array.isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n if (type === exports.Fragment) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, true);\n }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, false);\n }\n}\n\nvar jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs = jsxWithValidationStatic ;\n\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","module.exports = window[\"React\"];","module.exports = window[\"ReactDOM\"];","module.exports = window[\"jQuery\"];","module.exports = window[\"wp\"][\"i18n\"];","// src/styled.ts\nimport validAttr from \"@emotion/is-prop-valid\";\nimport React from \"react\";\nimport { cx } from \"@linaria/core\";\nvar isCapital = (ch) => ch.toUpperCase() === ch;\nvar filterKey = (keys) => (key) => keys.indexOf(key) === -1;\nvar omit = (obj, keys) => {\n const res = {};\n Object.keys(obj).filter(filterKey(keys)).forEach((key) => {\n res[key] = obj[key];\n });\n return res;\n};\nfunction filterProps(asIs, props, omitKeys) {\n const filteredProps = omit(props, omitKeys);\n if (!asIs) {\n const interopValidAttr = typeof validAttr === \"function\" ? { default: validAttr } : validAttr;\n Object.keys(filteredProps).forEach((key) => {\n if (!interopValidAttr.default(key)) {\n delete filteredProps[key];\n }\n });\n }\n return filteredProps;\n}\nvar warnIfInvalid = (value, componentName) => {\n if (process.env.NODE_ENV !== \"production\") {\n if (typeof value === \"string\" || typeof value === \"number\" && isFinite(value)) {\n return;\n }\n const stringified = typeof value === \"object\" ? JSON.stringify(value) : String(value);\n console.warn(\n `An interpolation evaluated to '${stringified}' in the component '${componentName}', which is probably a mistake. You should explicitly cast or transform the value to a string.`\n );\n }\n};\nfunction styled(tag) {\n return (options) => {\n if (process.env.NODE_ENV !== \"production\") {\n if (Array.isArray(options)) {\n throw new Error(\n 'Using the \"styled\" tag in runtime is not supported. Make sure you have set up the Babel plugin correctly. See https://github.com/callstack/linaria#setup'\n );\n }\n }\n const render = (props, ref) => {\n const { as: component = tag, class: className } = props;\n const shouldKeepProps = options.propsAsIs === void 0 ? !(typeof component === \"string\" && component.indexOf(\"-\") === -1 && !isCapital(component[0])) : options.propsAsIs;\n const filteredProps = filterProps(shouldKeepProps, props, [\n \"as\",\n \"class\"\n ]);\n filteredProps.ref = ref;\n filteredProps.className = options.atomic ? cx(options.class, filteredProps.className || className) : cx(filteredProps.className || className, options.class);\n const { vars } = options;\n if (vars) {\n const style = {};\n for (const name in vars) {\n const variable = vars[name];\n const result = variable[0];\n const unit = variable[1] || \"\";\n const value = typeof result === \"function\" ? result(props) : result;\n warnIfInvalid(value, options.name);\n style[`--${name}`] = `${value}${unit}`;\n }\n const ownStyle = filteredProps.style || {};\n const keys = Object.keys(ownStyle);\n if (keys.length > 0) {\n keys.forEach((key) => {\n style[key] = ownStyle[key];\n });\n }\n filteredProps.style = style;\n }\n if (tag.__linaria && tag !== component) {\n filteredProps.as = component;\n return React.createElement(tag, filteredProps);\n }\n return React.createElement(component, filteredProps);\n };\n const Result = React.forwardRef ? React.forwardRef(render) : (props) => {\n const rest = omit(props, [\"innerRef\"]);\n return render(rest, props.innerRef);\n };\n Result.displayName = options.name;\n Result.__linaria = {\n className: options.class,\n extends: tag\n };\n return Result;\n };\n}\nvar styled_default = process.env.NODE_ENV !== \"production\" ? new Proxy(styled, {\n get(o, prop) {\n return o(prop);\n }\n}) : styled;\nexport {\n styled_default as styled\n};\n//# sourceMappingURL=index.mjs.map","// src/css.ts\nvar css = () => {\n throw new Error(\n 'Using the \"css\" tag in runtime is not supported. Make sure you have set up the Babel plugin correctly.'\n );\n};\nvar css_default = css;\n\n// src/cx.ts\nvar cx = function cx2() {\n const presentClassNames = Array.prototype.slice.call(arguments).filter(Boolean);\n const atomicClasses = {};\n const nonAtomicClasses = [];\n presentClassNames.forEach((arg) => {\n const individualClassNames = arg ? arg.split(\" \") : [];\n individualClassNames.forEach((className) => {\n if (className.startsWith(\"atm_\")) {\n const [, keyHash] = className.split(\"_\");\n atomicClasses[keyHash] = className;\n } else {\n nonAtomicClasses.push(className);\n }\n });\n });\n const result = [];\n for (const keyHash in atomicClasses) {\n if (Object.prototype.hasOwnProperty.call(atomicClasses, keyHash)) {\n result.push(atomicClasses[keyHash]);\n }\n }\n result.push(...nonAtomicClasses);\n return result.join(\" \");\n};\nvar cx_default = cx;\nexport {\n css_default as css,\n cx_default as cx\n};\n//# sourceMappingURL=index.mjs.map","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { initAppOnReady } from '../utils/appUtils';\nimport renderIframeApp from '../iframe/renderIframeApp';\ninitAppOnReady(renderIframeApp);\n"],"names":["$","Raven","restNonce","restUrl","addQueryObjectToUrl","makeRequest","method","path","data","queryParams","restApiUrl","URL","Promise","resolve","reject","payload","url","toString","contentType","beforeSend","xhr","setRequestHeader","success","error","response","captureMessage","status","responseText","fingerprint","JSON","stringify","ajax","healthcheckRestApi","disableInternalTracking","value","fetchDisableInternalTracking","then","message","updateHublet","hublet","skipReview","trackConsent","canTrack","setBusinessUnitId","businessUnitId","getBusinessUnitId","window","leadinConfig","accountName","adminUrl","activationTime","connectionStatus","deviceId","didDisconnect","env","formsScript","meetingsScript","formsScriptPayload","hubspotBaseUrl","hubspotNonce","iframeUrl","impactLink","lastAuthorizeTime","lastDeauthorizeTime","lastDisconnectTime","leadinPluginVersion","leadinQueryParams","locale","loginUrl","phpVersion","pluginPath","plugins","portalDomain","portalEmail","portalId","redirectNonce","refreshToken","reviewSkippedDate","theme","wpVersion","contentEmbed","requiresContentEmbedScope","refreshTokenError","domElements","iframe","subMenu","subMenuLinks","subMenuButtons","deactivatePluginButton","deactivateFeedbackForm","deactivateFeedbackSubmit","deactivateFeedbackSkip","thickboxModalClose","thickboxModalWindow","thickboxModalContent","reviewBannerContainer","reviewBannerLeaveReviewLink","reviewBannerDismissButton","leadinIframeContainer","leadinIframe","leadinIframeFallbackContainer","jsx","_jsx","jsxs","_jsxs","__","styled","IframeErrorContainer","name","propsAsIs","ErrorHeader","IframeErrorPage","children","alt","width","src","App","AppIframe","Forms","LiveChat","Plugin","PluginSettings","Background","CoreMessages","HandshakeReceive","SendRefreshToken","ReloadParentFrame","RedirectParentFrame","SendLocale","SendDeviceId","SendIntegratedAppConfig","FormMessages","CreateFormAppNavigation","LiveChatMessages","CreateLiveChatAppNavigation","PluginMessages","PluginSettingsNavigation","PluginLeadinConfig","TrackConsent","InternalTrackingFetchRequest","InternalTrackingFetchResponse","InternalTrackingFetchError","InternalTrackingChangeRequest","InternalTrackingChangeError","BusinessUnitFetchRequest","BusinessUnitFetchResponse","BusinessUnitFetchError","BusinessUnitChangeRequest","BusinessUnitChangeError","SkipReviewRequest","SkipReviewResponse","SkipReviewError","RemoveParentQueryParam","ContentEmbedInstallRequest","ContentEmbedInstallResponse","ContentEmbedInstallError","ContentEmbedActivationRequest","ContentEmbedActivationResponse","ContentEmbedActivationError","ProxyMessages","FetchForms","FetchForm","CreateFormFromTemplate","FetchAuth","FetchMeetingsAndUsers","FetchContactsCreateSinceActivation","FetchOrCreateMeetingUser","ConnectMeetingsCalendar","TrackFormPreviewRender","TrackFormCreatedFromTemplate","TrackFormCreationFailed","TrackMeetingPreviewRender","TrackSidebarMetaChange","TrackReviewBannerRender","TrackReviewBannerInteraction","TrackReviewBannerDismissed","TrackPluginDeactivation","removeQueryParamFromLocation","startActivation","startInstall","messageMapper","Map","embedder","postMessage","key","__message","nonce","activateAjaxUrl","messageMiddleware","next","get","Fragment","ReactDOM","useAppEmbedder","IntegratedIframePortal","props","container","document","getElementById","iframeNotRendered","app","createRoute","createPortal","renderIframeApp","iframeFallbackContainer","URLSearchParams","location","search","page","render","useEffect","resizeWindow","useIframeNotRendered","getIntegrationConfig","getLeadinConfig","utm_query_params","Object","keys","filter","x","test","reduce","p","c","admin","company","email","firstName","irclickid","justConnected","lastName","mpid","websiteName","getAppOptions","IntegratedAppOptions","FormsAppOptions","LiveChatAppOptions","PluginAppOptions","options","setLeadinConfig","setPluginSettingsInit","setIntegratedAppConfig","setCreateFormAppInit","setCreateLiveChatAppInit","console","info","IntegratedAppEmbedder","setLocale","setDeviceId","setRefreshToken","setOptions","subscribe","attachTo","postStartAppMessage","appName","hasIntegratedAppEmbedder","captureException","Error","extra","hasRefreshToken","configureRaven","indexOf","config","instrument","tryCatch","release","install","setTagsContext","v","php","wordpress","setExtraContext","hub","map","join","initApp","initFn","context","initAppOnReady","main","formData","FormData","ajaxUrl","ajaxurl","append","fetch","body","keepalive","res","json","requestUrl","useState","IFRAME_DISPLAY_TIMEOUT","setIframeNotRendered","timer","setTimeout","clearTimeout","adminMenuWrap","sideMenuHeight","offsetHeight","adminBar","adminBarHeight","offset","innerHeight","urlObject","forEach","searchParams","href","history","replaceState"],"sourceRoot":""} \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/reviewBanner.asset.php b/wp/wp-content/plugins/leadin/build/reviewBanner.asset.php deleted file mode 100644 index 2c4cd9bc..00000000 --- a/wp/wp-content/plugins/leadin/build/reviewBanner.asset.php +++ /dev/null @@ -1 +0,0 @@ - array('jquery'), 'version' => '4c842626cb223d4c40ab'); diff --git a/wp/wp-content/plugins/leadin/build/reviewBanner.js b/wp/wp-content/plugins/leadin/build/reviewBanner.js deleted file mode 100644 index 47a2bb11..00000000 --- a/wp/wp-content/plugins/leadin/build/reviewBanner.js +++ /dev/null @@ -1,3730 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./scripts/constants/leadinConfig.ts": -/*!*******************************************!*\ - !*** ./scripts/constants/leadinConfig.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "accountName": () => (/* binding */ accountName), -/* harmony export */ "activationTime": () => (/* binding */ activationTime), -/* harmony export */ "adminUrl": () => (/* binding */ adminUrl), -/* harmony export */ "connectionStatus": () => (/* binding */ connectionStatus), -/* harmony export */ "contentEmbed": () => (/* binding */ contentEmbed), -/* harmony export */ "deviceId": () => (/* binding */ deviceId), -/* harmony export */ "didDisconnect": () => (/* binding */ didDisconnect), -/* harmony export */ "env": () => (/* binding */ env), -/* harmony export */ "formsScript": () => (/* binding */ formsScript), -/* harmony export */ "formsScriptPayload": () => (/* binding */ formsScriptPayload), -/* harmony export */ "hublet": () => (/* binding */ hublet), -/* harmony export */ "hubspotBaseUrl": () => (/* binding */ hubspotBaseUrl), -/* harmony export */ "hubspotNonce": () => (/* binding */ hubspotNonce), -/* harmony export */ "iframeUrl": () => (/* binding */ iframeUrl), -/* harmony export */ "impactLink": () => (/* binding */ impactLink), -/* harmony export */ "lastAuthorizeTime": () => (/* binding */ lastAuthorizeTime), -/* harmony export */ "lastDeauthorizeTime": () => (/* binding */ lastDeauthorizeTime), -/* harmony export */ "lastDisconnectTime": () => (/* binding */ lastDisconnectTime), -/* harmony export */ "leadinPluginVersion": () => (/* binding */ leadinPluginVersion), -/* harmony export */ "leadinQueryParams": () => (/* binding */ leadinQueryParams), -/* harmony export */ "locale": () => (/* binding */ locale), -/* harmony export */ "loginUrl": () => (/* binding */ loginUrl), -/* harmony export */ "meetingsScript": () => (/* binding */ meetingsScript), -/* harmony export */ "phpVersion": () => (/* binding */ phpVersion), -/* harmony export */ "pluginPath": () => (/* binding */ pluginPath), -/* harmony export */ "plugins": () => (/* binding */ plugins), -/* harmony export */ "portalDomain": () => (/* binding */ portalDomain), -/* harmony export */ "portalEmail": () => (/* binding */ portalEmail), -/* harmony export */ "portalId": () => (/* binding */ portalId), -/* harmony export */ "redirectNonce": () => (/* binding */ redirectNonce), -/* harmony export */ "refreshToken": () => (/* binding */ refreshToken), -/* harmony export */ "refreshTokenError": () => (/* binding */ refreshTokenError), -/* harmony export */ "requiresContentEmbedScope": () => (/* binding */ requiresContentEmbedScope), -/* harmony export */ "restNonce": () => (/* binding */ restNonce), -/* harmony export */ "restUrl": () => (/* binding */ restUrl), -/* harmony export */ "reviewSkippedDate": () => (/* binding */ reviewSkippedDate), -/* harmony export */ "theme": () => (/* binding */ theme), -/* harmony export */ "trackConsent": () => (/* binding */ trackConsent), -/* harmony export */ "wpVersion": () => (/* binding */ wpVersion) -/* harmony export */ }); -var _window$leadinConfig = window.leadinConfig, - accountName = _window$leadinConfig.accountName, - adminUrl = _window$leadinConfig.adminUrl, - activationTime = _window$leadinConfig.activationTime, - connectionStatus = _window$leadinConfig.connectionStatus, - deviceId = _window$leadinConfig.deviceId, - didDisconnect = _window$leadinConfig.didDisconnect, - env = _window$leadinConfig.env, - formsScript = _window$leadinConfig.formsScript, - meetingsScript = _window$leadinConfig.meetingsScript, - formsScriptPayload = _window$leadinConfig.formsScriptPayload, - hublet = _window$leadinConfig.hublet, - hubspotBaseUrl = _window$leadinConfig.hubspotBaseUrl, - hubspotNonce = _window$leadinConfig.hubspotNonce, - iframeUrl = _window$leadinConfig.iframeUrl, - impactLink = _window$leadinConfig.impactLink, - lastAuthorizeTime = _window$leadinConfig.lastAuthorizeTime, - lastDeauthorizeTime = _window$leadinConfig.lastDeauthorizeTime, - lastDisconnectTime = _window$leadinConfig.lastDisconnectTime, - leadinPluginVersion = _window$leadinConfig.leadinPluginVersion, - leadinQueryParams = _window$leadinConfig.leadinQueryParams, - locale = _window$leadinConfig.locale, - loginUrl = _window$leadinConfig.loginUrl, - phpVersion = _window$leadinConfig.phpVersion, - pluginPath = _window$leadinConfig.pluginPath, - plugins = _window$leadinConfig.plugins, - portalDomain = _window$leadinConfig.portalDomain, - portalEmail = _window$leadinConfig.portalEmail, - portalId = _window$leadinConfig.portalId, - redirectNonce = _window$leadinConfig.redirectNonce, - restNonce = _window$leadinConfig.restNonce, - restUrl = _window$leadinConfig.restUrl, - refreshToken = _window$leadinConfig.refreshToken, - reviewSkippedDate = _window$leadinConfig.reviewSkippedDate, - theme = _window$leadinConfig.theme, - trackConsent = _window$leadinConfig.trackConsent, - wpVersion = _window$leadinConfig.wpVersion, - contentEmbed = _window$leadinConfig.contentEmbed, - requiresContentEmbedScope = _window$leadinConfig.requiresContentEmbedScope, - refreshTokenError = _window$leadinConfig.refreshTokenError; - - -/***/ }), - -/***/ "./scripts/constants/selectors.ts": -/*!****************************************!*\ - !*** ./scripts/constants/selectors.ts ***! - \****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "domElements": () => (/* binding */ domElements) -/* harmony export */ }); -var domElements = { - iframe: '#leadin-iframe', - subMenu: '.toplevel_page_leadin > ul', - subMenuLinks: '.toplevel_page_leadin > ul a', - subMenuButtons: '.toplevel_page_leadin > ul > li', - deactivatePluginButton: '[data-slug="leadin"] .deactivate a', - deactivateFeedbackForm: 'form.leadin-deactivate-form', - deactivateFeedbackSubmit: 'button#leadin-feedback-submit', - deactivateFeedbackSkip: 'button#leadin-feedback-skip', - thickboxModalClose: '.leadin-modal-close', - thickboxModalWindow: 'div#TB_window.thickbox-loading', - thickboxModalContent: 'div#TB_ajaxContent.TB_modal', - reviewBannerContainer: '#leadin-review-banner', - reviewBannerLeaveReviewLink: 'a#leave-review-button', - reviewBannerDismissButton: 'a#dismiss-review-banner-button', - leadinIframeContainer: 'leadin-iframe-container', - leadinIframe: 'leadin-iframe', - leadinIframeFallbackContainer: 'leadin-iframe-fallback-container' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/core/CoreMessages.ts": -/*!****************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/core/CoreMessages.ts ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CoreMessages": () => (/* binding */ CoreMessages) -/* harmony export */ }); -var CoreMessages = { - HandshakeReceive: 'INTEGRATED_APP_EMBEDDER_HANDSHAKE_RECEIVED', - SendRefreshToken: 'INTEGRATED_APP_EMBEDDER_SEND_REFRESH_TOKEN', - ReloadParentFrame: 'INTEGRATED_APP_EMBEDDER_RELOAD_PARENT_FRAME', - RedirectParentFrame: 'INTEGRATED_APP_EMBEDDER_REDIRECT_PARENT_FRAME', - SendLocale: 'INTEGRATED_APP_EMBEDDER_SEND_LOCALE', - SendDeviceId: 'INTEGRATED_APP_EMBEDDER_SEND_DEVICE_ID', - SendIntegratedAppConfig: 'INTEGRATED_APP_EMBEDDER_CONFIG' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/forms/FormsMessages.ts": -/*!******************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/forms/FormsMessages.ts ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "FormMessages": () => (/* binding */ FormMessages) -/* harmony export */ }); -var FormMessages = { - CreateFormAppNavigation: 'CREATE_FORM_APP_NAVIGATION' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/index.ts": -/*!****************************************************!*\ - !*** ./scripts/iframe/integratedMessages/index.ts ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CoreMessages": () => (/* reexport safe */ _core_CoreMessages__WEBPACK_IMPORTED_MODULE_0__.CoreMessages), -/* harmony export */ "FormMessages": () => (/* reexport safe */ _forms_FormsMessages__WEBPACK_IMPORTED_MODULE_1__.FormMessages), -/* harmony export */ "LiveChatMessages": () => (/* reexport safe */ _livechat_LiveChatMessages__WEBPACK_IMPORTED_MODULE_2__.LiveChatMessages), -/* harmony export */ "PluginMessages": () => (/* reexport safe */ _plugin_PluginMessages__WEBPACK_IMPORTED_MODULE_3__.PluginMessages), -/* harmony export */ "ProxyMessages": () => (/* reexport safe */ _proxy_ProxyMessages__WEBPACK_IMPORTED_MODULE_4__.ProxyMessages) -/* harmony export */ }); -/* harmony import */ var _core_CoreMessages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/CoreMessages */ "./scripts/iframe/integratedMessages/core/CoreMessages.ts"); -/* harmony import */ var _forms_FormsMessages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./forms/FormsMessages */ "./scripts/iframe/integratedMessages/forms/FormsMessages.ts"); -/* harmony import */ var _livechat_LiveChatMessages__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./livechat/LiveChatMessages */ "./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts"); -/* harmony import */ var _plugin_PluginMessages__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./plugin/PluginMessages */ "./scripts/iframe/integratedMessages/plugin/PluginMessages.ts"); -/* harmony import */ var _proxy_ProxyMessages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./proxy/ProxyMessages */ "./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts"); - - - - - - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts": -/*!************************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "LiveChatMessages": () => (/* binding */ LiveChatMessages) -/* harmony export */ }); -var LiveChatMessages = { - CreateLiveChatAppNavigation: 'CREATE_LIVE_CHAT_APP_NAVIGATION' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/plugin/PluginMessages.ts": -/*!********************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/plugin/PluginMessages.ts ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "PluginMessages": () => (/* binding */ PluginMessages) -/* harmony export */ }); -var PluginMessages = { - PluginSettingsNavigation: 'PLUGIN_SETTINGS_NAVIGATION', - PluginLeadinConfig: 'PLUGIN_LEADIN_CONFIG', - TrackConsent: 'INTEGRATED_APP_EMBEDDER_TRACK_CONSENT', - InternalTrackingFetchRequest: 'INTEGRATED_TRACKING_FETCH_REQUEST', - InternalTrackingFetchResponse: 'INTEGRATED_TRACKING_FETCH_RESPONSE', - InternalTrackingFetchError: 'INTEGRATED_TRACKING_FETCH_ERROR', - InternalTrackingChangeRequest: 'INTEGRATED_TRACKING_CHANGE_REQUEST', - InternalTrackingChangeError: 'INTEGRATED_TRACKING_CHANGE_ERROR', - BusinessUnitFetchRequest: 'BUSINESS_UNIT_FETCH_REQUEST', - BusinessUnitFetchResponse: 'BUSINESS_UNIT_FETCH_FETCH_RESPONSE', - BusinessUnitFetchError: 'BUSINESS_UNIT_FETCH_FETCH_ERROR', - BusinessUnitChangeRequest: 'BUSINESS_UNIT_CHANGE_REQUEST', - BusinessUnitChangeError: 'BUSINESS_UNIT_CHANGE_ERROR', - SkipReviewRequest: 'SKIP_REVIEW_REQUEST', - SkipReviewResponse: 'SKIP_REVIEW_RESPONSE', - SkipReviewError: 'SKIP_REVIEW_ERROR', - RemoveParentQueryParam: 'REMOVE_PARENT_QUERY_PARAM', - ContentEmbedInstallRequest: 'CONTENT_EMBED_INSTALL_REQUEST', - ContentEmbedInstallResponse: 'CONTENT_EMBED_INSTALL_RESPONSE', - ContentEmbedInstallError: 'CONTENT_EMBED_INSTALL_ERROR', - ContentEmbedActivationRequest: 'CONTENT_EMBED_ACTIVATION_REQUEST', - ContentEmbedActivationResponse: 'CONTENT_EMBED_ACTIVATION_RESPONSE', - ContentEmbedActivationError: 'CONTENT_EMBED_ACTIVATION_ERROR' -}; - -/***/ }), - -/***/ "./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts": -/*!******************************************************************!*\ - !*** ./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ProxyMessages": () => (/* binding */ ProxyMessages) -/* harmony export */ }); -var ProxyMessages = { - FetchForms: 'FETCH_FORMS', - FetchForm: 'FETCH_FORM', - CreateFormFromTemplate: 'CREATE_FORM_FROM_TEMPLATE', - FetchAuth: 'FETCH_AUTH', - FetchMeetingsAndUsers: 'FETCH_MEETINGS_AND_USERS', - FetchContactsCreateSinceActivation: 'FETCH_CONTACTS_CREATED_SINCE_ACTIVATION', - FetchOrCreateMeetingUser: 'FETCH_OR_CREATE_MEETING_USER', - ConnectMeetingsCalendar: 'CONNECT_MEETINGS_CALENDAR', - TrackFormPreviewRender: 'TRACK_FORM_PREVIEW_RENDER', - TrackFormCreatedFromTemplate: 'TRACK_FORM_CREATED_FROM_TEMPLATE', - TrackFormCreationFailed: 'TRACK_FORM_CREATION_FAILED', - TrackMeetingPreviewRender: 'TRACK_MEETING_PREVIEW_RENDER', - TrackSidebarMetaChange: 'TRACK_SIDEBAR_META_CHANGE', - TrackReviewBannerRender: 'TRACK_REVIEW_BANNER_RENDER', - TrackReviewBannerInteraction: 'TRACK_REVIEW_BANNER_INTERACTION', - TrackReviewBannerDismissed: 'TRACK_REVIEW_BANNER_DISMISSED', - TrackPluginDeactivation: 'TRACK_PLUGIN_DEACTIVATION' -}; - -/***/ }), - -/***/ "./scripts/lib/Raven.ts": -/*!******************************!*\ - !*** ./scripts/lib/Raven.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "configureRaven": () => (/* binding */ configureRaven), -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! raven-js */ "./node_modules/raven-js/src/singleton.js"); -/* harmony import */ var raven_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(raven_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); - - -function configureRaven() { - if (_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.hubspotBaseUrl.indexOf('app.hubspot.com') === -1) { - return; - } - - raven_js__WEBPACK_IMPORTED_MODULE_0___default().config('https://e9b8f382cdd130c0d415cd977d2be56f@exceptions.hubspot.com/1', { - instrument: { - tryCatch: false - }, - release: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.leadinPluginVersion - }).install(); - raven_js__WEBPACK_IMPORTED_MODULE_0___default().setTagsContext({ - v: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.leadinPluginVersion, - php: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.phpVersion, - wordpress: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.wpVersion - }); - raven_js__WEBPACK_IMPORTED_MODULE_0___default().setExtraContext({ - hub: _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.portalId, - plugins: Object.keys(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.plugins).map(function (name) { - return "".concat(name, "#").concat(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_1__.plugins[name]); - }).join(',') - }); -} -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((raven_js__WEBPACK_IMPORTED_MODULE_0___default())); - -/***/ }), - -/***/ "./scripts/utils/appUtils.ts": -/*!***********************************!*\ - !*** ./scripts/utils/appUtils.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "initApp": () => (/* binding */ initApp), -/* harmony export */ "initAppOnReady": () => (/* binding */ initAppOnReady) -/* harmony export */ }); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _lib_Raven__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/Raven */ "./scripts/lib/Raven.ts"); - - -function initApp(initFn) { - (0,_lib_Raven__WEBPACK_IMPORTED_MODULE_1__.configureRaven)(); - _lib_Raven__WEBPACK_IMPORTED_MODULE_1__["default"].context(initFn); -} -function initAppOnReady(initFn) { - function main() { - jquery__WEBPACK_IMPORTED_MODULE_0___default()(initFn); - } - - initApp(main); -} - -/***/ }), - -/***/ "./scripts/utils/backgroundAppUtils.ts": -/*!*********************************************!*\ - !*** ./scripts/utils/backgroundAppUtils.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "getOrCreateBackgroundApp": () => (/* binding */ getOrCreateBackgroundApp), -/* harmony export */ "initBackgroundApp": () => (/* binding */ initBackgroundApp) -/* harmony export */ }); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _appUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./appUtils */ "./scripts/utils/appUtils.ts"); - - -function initBackgroundApp(initFn) { - function main() { - if (Array.isArray(initFn)) { - initFn.forEach(function (callback) { - return callback(); - }); - } else { - initFn(); - } - } - - (0,_appUtils__WEBPACK_IMPORTED_MODULE_1__.initApp)(main); -} -var getOrCreateBackgroundApp = function getOrCreateBackgroundApp(refreshToken) { - if (window.LeadinBackgroundApp) { - return window.LeadinBackgroundApp; - } - - var _window = window, - IntegratedAppEmbedder = _window.IntegratedAppEmbedder, - IntegratedAppOptions = _window.IntegratedAppOptions; - var options = new IntegratedAppOptions().setLocale(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.locale).setDeviceId(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.deviceId).setRefreshToken(refreshToken); - var embedder = new IntegratedAppEmbedder('integrated-plugin-proxy', _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.portalId, _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_0__.hubspotBaseUrl, function () {}).setOptions(options); - embedder.attachTo(document.body, false); - embedder.postStartAppMessage(); // lets the app know all all data has been passed to it - - window.LeadinBackgroundApp = embedder; - return window.LeadinBackgroundApp; -}; - -/***/ }), - -/***/ "./node_modules/raven-js/src/configError.js": -/*!**************************************************!*\ - !*** ./node_modules/raven-js/src/configError.js ***! - \**************************************************/ -/***/ ((module) => { - -function RavenConfigError(message) { - this.name = 'RavenConfigError'; - this.message = message; -} -RavenConfigError.prototype = new Error(); -RavenConfigError.prototype.constructor = RavenConfigError; - -module.exports = RavenConfigError; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/console.js": -/*!**********************************************!*\ - !*** ./node_modules/raven-js/src/console.js ***! - \**********************************************/ -/***/ ((module) => { - -var wrapMethod = function(console, level, callback) { - var originalConsoleLevel = console[level]; - var originalConsole = console; - - if (!(level in console)) { - return; - } - - var sentryLevel = level === 'warn' ? 'warning' : level; - - console[level] = function() { - var args = [].slice.call(arguments); - - var msg = '' + args.join(' '); - var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}}; - - if (level === 'assert') { - if (args[0] === false) { - // Default browsers message - msg = 'Assertion failed: ' + (args.slice(1).join(' ') || 'console.assert'); - data.extra.arguments = args.slice(1); - callback && callback(msg, data); - } - } else { - callback && callback(msg, data); - } - - // this fails for some browsers. :( - if (originalConsoleLevel) { - // IE9 doesn't allow calling apply on console functions directly - // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193 - Function.prototype.apply.call(originalConsoleLevel, originalConsole, args); - } - }; -}; - -module.exports = { - wrapMethod: wrapMethod -}; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/raven.js": -/*!********************************************!*\ - !*** ./node_modules/raven-js/src/raven.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/*global XDomainRequest:false */ - -var TraceKit = __webpack_require__(/*! ../vendor/TraceKit/tracekit */ "./node_modules/raven-js/vendor/TraceKit/tracekit.js"); -var stringify = __webpack_require__(/*! ../vendor/json-stringify-safe/stringify */ "./node_modules/raven-js/vendor/json-stringify-safe/stringify.js"); -var RavenConfigError = __webpack_require__(/*! ./configError */ "./node_modules/raven-js/src/configError.js"); - -var utils = __webpack_require__(/*! ./utils */ "./node_modules/raven-js/src/utils.js"); -var isError = utils.isError; -var isObject = utils.isObject; -var isObject = utils.isObject; -var isErrorEvent = utils.isErrorEvent; -var isUndefined = utils.isUndefined; -var isFunction = utils.isFunction; -var isString = utils.isString; -var isEmptyObject = utils.isEmptyObject; -var each = utils.each; -var objectMerge = utils.objectMerge; -var truncate = utils.truncate; -var objectFrozen = utils.objectFrozen; -var hasKey = utils.hasKey; -var joinRegExp = utils.joinRegExp; -var urlencode = utils.urlencode; -var uuid4 = utils.uuid4; -var htmlTreeAsString = utils.htmlTreeAsString; -var isSameException = utils.isSameException; -var isSameStacktrace = utils.isSameStacktrace; -var parseUrl = utils.parseUrl; -var fill = utils.fill; - -var wrapConsoleMethod = (__webpack_require__(/*! ./console */ "./node_modules/raven-js/src/console.js").wrapMethod); - -var dsnKeys = 'source protocol user pass host port path'.split(' '), - dsnPattern = /^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/; - -function now() { - return +new Date(); -} - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; -var _document = _window.document; -var _navigator = _window.navigator; - -function keepOriginalCallback(original, callback) { - return isFunction(callback) - ? function(data) { - return callback(data, original); - } - : callback; -} - -// First, check for JSON support -// If there is no JSON, we no-op the core features of Raven -// since JSON is required to encode the payload -function Raven() { - this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify); - // Raven can run in contexts where there's no document (react-native) - this._hasDocument = !isUndefined(_document); - this._hasNavigator = !isUndefined(_navigator); - this._lastCapturedException = null; - this._lastData = null; - this._lastEventId = null; - this._globalServer = null; - this._globalKey = null; - this._globalProject = null; - this._globalContext = {}; - this._globalOptions = { - logger: 'javascript', - ignoreErrors: [], - ignoreUrls: [], - whitelistUrls: [], - includePaths: [], - collectWindowErrors: true, - maxMessageLength: 0, - - // By default, truncates URL values to 250 chars - maxUrlLength: 250, - stackTraceLimit: 50, - autoBreadcrumbs: true, - instrument: true, - sampleRate: 1 - }; - this._ignoreOnError = 0; - this._isRavenInstalled = false; - this._originalErrorStackTraceLimit = Error.stackTraceLimit; - // capture references to window.console *and* all its methods first - // before the console plugin has a chance to monkey patch - this._originalConsole = _window.console || {}; - this._originalConsoleMethods = {}; - this._plugins = []; - this._startTime = now(); - this._wrappedBuiltIns = []; - this._breadcrumbs = []; - this._lastCapturedEvent = null; - this._keypressTimeout; - this._location = _window.location; - this._lastHref = this._location && this._location.href; - this._resetBackoff(); - - // eslint-disable-next-line guard-for-in - for (var method in this._originalConsole) { - this._originalConsoleMethods[method] = this._originalConsole[method]; - } -} - -/* - * The core Raven singleton - * - * @this {Raven} - */ - -Raven.prototype = { - // Hardcode version string so that raven source can be loaded directly via - // webpack (using a build step causes webpack #1617). Grunt verifies that - // this value matches package.json during build. - // See: https://github.com/getsentry/raven-js/issues/465 - VERSION: '3.19.1', - - debug: false, - - TraceKit: TraceKit, // alias to TraceKit - - /* - * Configure Raven with a DSN and extra options - * - * @param {string} dsn The public Sentry DSN - * @param {object} options Set of global options [optional] - * @return {Raven} - */ - config: function(dsn, options) { - var self = this; - - if (self._globalServer) { - this._logDebug('error', 'Error: Raven has already been configured'); - return self; - } - if (!dsn) return self; - - var globalOptions = self._globalOptions; - - // merge in options - if (options) { - each(options, function(key, value) { - // tags and extra are special and need to be put into context - if (key === 'tags' || key === 'extra' || key === 'user') { - self._globalContext[key] = value; - } else { - globalOptions[key] = value; - } - }); - } - - self.setDSN(dsn); - - // "Script error." is hard coded into browsers for errors that it can't read. - // this is the result of a script being pulled in from an external domain and CORS. - globalOptions.ignoreErrors.push(/^Script error\.?$/); - globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/); - - // join regexp rules into one big rule - globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors); - globalOptions.ignoreUrls = globalOptions.ignoreUrls.length - ? joinRegExp(globalOptions.ignoreUrls) - : false; - globalOptions.whitelistUrls = globalOptions.whitelistUrls.length - ? joinRegExp(globalOptions.whitelistUrls) - : false; - globalOptions.includePaths = joinRegExp(globalOptions.includePaths); - globalOptions.maxBreadcrumbs = Math.max( - 0, - Math.min(globalOptions.maxBreadcrumbs || 100, 100) - ); // default and hard limit is 100 - - var autoBreadcrumbDefaults = { - xhr: true, - console: true, - dom: true, - location: true - }; - - var autoBreadcrumbs = globalOptions.autoBreadcrumbs; - if ({}.toString.call(autoBreadcrumbs) === '[object Object]') { - autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs); - } else if (autoBreadcrumbs !== false) { - autoBreadcrumbs = autoBreadcrumbDefaults; - } - globalOptions.autoBreadcrumbs = autoBreadcrumbs; - - var instrumentDefaults = { - tryCatch: true - }; - - var instrument = globalOptions.instrument; - if ({}.toString.call(instrument) === '[object Object]') { - instrument = objectMerge(instrumentDefaults, instrument); - } else if (instrument !== false) { - instrument = instrumentDefaults; - } - globalOptions.instrument = instrument; - - TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors; - - // return for chaining - return self; - }, - - /* - * Installs a global window.onerror error handler - * to capture and report uncaught exceptions. - * At this point, install() is required to be called due - * to the way TraceKit is set up. - * - * @return {Raven} - */ - install: function() { - var self = this; - if (self.isSetup() && !self._isRavenInstalled) { - TraceKit.report.subscribe(function() { - self._handleOnErrorStackInfo.apply(self, arguments); - }); - if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) { - self._instrumentTryCatch(); - } - - if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs(); - - // Install all of the plugins - self._drainPlugins(); - - self._isRavenInstalled = true; - } - - Error.stackTraceLimit = self._globalOptions.stackTraceLimit; - return this; - }, - - /* - * Set the DSN (can be called multiple time unlike config) - * - * @param {string} dsn The public Sentry DSN - */ - setDSN: function(dsn) { - var self = this, - uri = self._parseDSN(dsn), - lastSlash = uri.path.lastIndexOf('/'), - path = uri.path.substr(1, lastSlash); - - self._dsn = dsn; - self._globalKey = uri.user; - self._globalSecret = uri.pass && uri.pass.substr(1); - self._globalProject = uri.path.substr(lastSlash + 1); - - self._globalServer = self._getGlobalServer(uri); - - self._globalEndpoint = - self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/'; - - // Reset backoff state since we may be pointing at a - // new project/server - this._resetBackoff(); - }, - - /* - * Wrap code within a context so Raven can capture errors - * reliably across domains that is executed immediately. - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The callback to be immediately executed within the context - * @param {array} args An array of arguments to be called with the callback [optional] - */ - context: function(options, func, args) { - if (isFunction(options)) { - args = func || []; - func = options; - options = undefined; - } - - return this.wrap(options, func).apply(this, args); - }, - - /* - * Wrap code within a context and returns back a new function to be executed - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The function to be wrapped in a new context - * @param {function} func A function to call before the try/catch wrapper [optional, private] - * @return {function} The newly wrapped functions with a context - */ - wrap: function(options, func, _before) { - var self = this; - // 1 argument has been passed, and it's not a function - // so just return it - if (isUndefined(func) && !isFunction(options)) { - return options; - } - - // options is optional - if (isFunction(options)) { - func = options; - options = undefined; - } - - // At this point, we've passed along 2 arguments, and the second one - // is not a function either, so we'll just return the second argument. - if (!isFunction(func)) { - return func; - } - - // We don't wanna wrap it twice! - try { - if (func.__raven__) { - return func; - } - - // If this has already been wrapped in the past, return that - if (func.__raven_wrapper__) { - return func.__raven_wrapper__; - } - } catch (e) { - // Just accessing custom props in some Selenium environments - // can cause a "Permission denied" exception (see raven-js#495). - // Bail on wrapping and return the function as-is (defers to window.onerror). - return func; - } - - function wrapped() { - var args = [], - i = arguments.length, - deep = !options || (options && options.deep !== false); - - if (_before && isFunction(_before)) { - _before.apply(this, arguments); - } - - // Recursively wrap all of a function's arguments that are - // functions themselves. - while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i]; - - try { - // Attempt to invoke user-land function - // NOTE: If you are a Sentry user, and you are seeing this stack frame, it - // means Raven caught an error invoking your application code. This is - // expected behavior and NOT indicative of a bug with Raven.js. - return func.apply(this, args); - } catch (e) { - self._ignoreNextOnError(); - self.captureException(e, options); - throw e; - } - } - - // copy over properties of the old function - for (var property in func) { - if (hasKey(func, property)) { - wrapped[property] = func[property]; - } - } - wrapped.prototype = func.prototype; - - func.__raven_wrapper__ = wrapped; - // Signal that this function has been wrapped already - // for both debugging and to prevent it to being wrapped twice - wrapped.__raven__ = true; - wrapped.__inner__ = func; - - return wrapped; - }, - - /* - * Uninstalls the global error handler. - * - * @return {Raven} - */ - uninstall: function() { - TraceKit.report.uninstall(); - - this._restoreBuiltIns(); - - Error.stackTraceLimit = this._originalErrorStackTraceLimit; - this._isRavenInstalled = false; - - return this; - }, - - /* - * Manually capture an exception and send it over to Sentry - * - * @param {error} ex An exception to be logged - * @param {object} options A specific set of options for this error [optional] - * @return {Raven} - */ - captureException: function(ex, options) { - // Cases for sending ex as a message, rather than an exception - var isNotError = !isError(ex); - var isNotErrorEvent = !isErrorEvent(ex); - var isErrorEventWithoutError = isErrorEvent(ex) && !ex.error; - - if ((isNotError && isNotErrorEvent) || isErrorEventWithoutError) { - return this.captureMessage( - ex, - objectMerge( - { - trimHeadFrames: 1, - stacktrace: true // if we fall back to captureMessage, default to attempting a new trace - }, - options - ) - ); - } - - // Get actual Error from ErrorEvent - if (isErrorEvent(ex)) ex = ex.error; - - // Store the raw exception object for potential debugging and introspection - this._lastCapturedException = ex; - - // TraceKit.report will re-raise any exception passed to it, - // which means you have to wrap it in try/catch. Instead, we - // can wrap it here and only re-raise if TraceKit.report - // raises an exception different from the one we asked to - // report on. - try { - var stack = TraceKit.computeStackTrace(ex); - this._handleStackInfo(stack, options); - } catch (ex1) { - if (ex !== ex1) { - throw ex1; - } - } - - return this; - }, - - /* - * Manually send a message to Sentry - * - * @param {string} msg A plain message to be captured in Sentry - * @param {object} options A specific set of options for this message [optional] - * @return {Raven} - */ - captureMessage: function(msg, options) { - // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an - // early call; we'll error on the side of logging anything called before configuration since it's - // probably something you should see: - if ( - !!this._globalOptions.ignoreErrors.test && - this._globalOptions.ignoreErrors.test(msg) - ) { - return; - } - - options = options || {}; - - var data = objectMerge( - { - message: msg + '' // Make sure it's actually a string - }, - options - ); - - var ex; - // Generate a "synthetic" stack trace from this point. - // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative - // of a bug with Raven.js. Sentry generates synthetic traces either by configuration, - // or if it catches a thrown object without a "stack" property. - try { - throw new Error(msg); - } catch (ex1) { - ex = ex1; - } - - // null exception name so `Error` isn't prefixed to msg - ex.name = null; - var stack = TraceKit.computeStackTrace(ex); - - // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1] - var initialCall = stack.stack[1]; - - var fileurl = (initialCall && initialCall.url) || ''; - - if ( - !!this._globalOptions.ignoreUrls.test && - this._globalOptions.ignoreUrls.test(fileurl) - ) { - return; - } - - if ( - !!this._globalOptions.whitelistUrls.test && - !this._globalOptions.whitelistUrls.test(fileurl) - ) { - return; - } - - if (this._globalOptions.stacktrace || (options && options.stacktrace)) { - options = objectMerge( - { - // fingerprint on msg, not stack trace (legacy behavior, could be - // revisited) - fingerprint: msg, - // since we know this is a synthetic trace, the top N-most frames - // MUST be from Raven.js, so mark them as in_app later by setting - // trimHeadFrames - trimHeadFrames: (options.trimHeadFrames || 0) + 1 - }, - options - ); - - var frames = this._prepareFrames(stack, options); - data.stacktrace = { - // Sentry expects frames oldest to newest - frames: frames.reverse() - }; - } - - // Fire away! - this._send(data); - - return this; - }, - - captureBreadcrumb: function(obj) { - var crumb = objectMerge( - { - timestamp: now() / 1000 - }, - obj - ); - - if (isFunction(this._globalOptions.breadcrumbCallback)) { - var result = this._globalOptions.breadcrumbCallback(crumb); - - if (isObject(result) && !isEmptyObject(result)) { - crumb = result; - } else if (result === false) { - return this; - } - } - - this._breadcrumbs.push(crumb); - if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) { - this._breadcrumbs.shift(); - } - return this; - }, - - addPlugin: function(plugin /*arg1, arg2, ... argN*/) { - var pluginArgs = [].slice.call(arguments, 1); - - this._plugins.push([plugin, pluginArgs]); - if (this._isRavenInstalled) { - this._drainPlugins(); - } - - return this; - }, - - /* - * Set/clear a user to be sent along with the payload. - * - * @param {object} user An object representing user data [optional] - * @return {Raven} - */ - setUserContext: function(user) { - // Intentionally do not merge here since that's an unexpected behavior. - this._globalContext.user = user; - - return this; - }, - - /* - * Merge extra attributes to be sent along with the payload. - * - * @param {object} extra An object representing extra data [optional] - * @return {Raven} - */ - setExtraContext: function(extra) { - this._mergeContext('extra', extra); - - return this; - }, - - /* - * Merge tags to be sent along with the payload. - * - * @param {object} tags An object representing tags [optional] - * @return {Raven} - */ - setTagsContext: function(tags) { - this._mergeContext('tags', tags); - - return this; - }, - - /* - * Clear all of the context. - * - * @return {Raven} - */ - clearContext: function() { - this._globalContext = {}; - - return this; - }, - - /* - * Get a copy of the current context. This cannot be mutated. - * - * @return {object} copy of context - */ - getContext: function() { - // lol javascript - return JSON.parse(stringify(this._globalContext)); - }, - - /* - * Set environment of application - * - * @param {string} environment Typically something like 'production'. - * @return {Raven} - */ - setEnvironment: function(environment) { - this._globalOptions.environment = environment; - - return this; - }, - - /* - * Set release version of application - * - * @param {string} release Typically something like a git SHA to identify version - * @return {Raven} - */ - setRelease: function(release) { - this._globalOptions.release = release; - - return this; - }, - - /* - * Set the dataCallback option - * - * @param {function} callback The callback to run which allows the - * data blob to be mutated before sending - * @return {Raven} - */ - setDataCallback: function(callback) { - var original = this._globalOptions.dataCallback; - this._globalOptions.dataCallback = keepOriginalCallback(original, callback); - return this; - }, - - /* - * Set the breadcrumbCallback option - * - * @param {function} callback The callback to run which allows filtering - * or mutating breadcrumbs - * @return {Raven} - */ - setBreadcrumbCallback: function(callback) { - var original = this._globalOptions.breadcrumbCallback; - this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback); - return this; - }, - - /* - * Set the shouldSendCallback option - * - * @param {function} callback The callback to run which allows - * introspecting the blob before sending - * @return {Raven} - */ - setShouldSendCallback: function(callback) { - var original = this._globalOptions.shouldSendCallback; - this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback); - return this; - }, - - /** - * Override the default HTTP transport mechanism that transmits data - * to the Sentry server. - * - * @param {function} transport Function invoked instead of the default - * `makeRequest` handler. - * - * @return {Raven} - */ - setTransport: function(transport) { - this._globalOptions.transport = transport; - - return this; - }, - - /* - * Get the latest raw exception that was captured by Raven. - * - * @return {error} - */ - lastException: function() { - return this._lastCapturedException; - }, - - /* - * Get the last event id - * - * @return {string} - */ - lastEventId: function() { - return this._lastEventId; - }, - - /* - * Determine if Raven is setup and ready to go. - * - * @return {boolean} - */ - isSetup: function() { - if (!this._hasJSON) return false; // needs JSON support - if (!this._globalServer) { - if (!this.ravenNotConfiguredError) { - this.ravenNotConfiguredError = true; - this._logDebug('error', 'Error: Raven has not been configured.'); - } - return false; - } - return true; - }, - - afterLoad: function() { - // TODO: remove window dependence? - - // Attempt to initialize Raven on load - var RavenConfig = _window.RavenConfig; - if (RavenConfig) { - this.config(RavenConfig.dsn, RavenConfig.config).install(); - } - }, - - showReportDialog: function(options) { - if ( - !_document // doesn't work without a document (React native) - ) - return; - - options = options || {}; - - var lastEventId = options.eventId || this.lastEventId(); - if (!lastEventId) { - throw new RavenConfigError('Missing eventId'); - } - - var dsn = options.dsn || this._dsn; - if (!dsn) { - throw new RavenConfigError('Missing DSN'); - } - - var encode = encodeURIComponent; - var qs = ''; - qs += '?eventId=' + encode(lastEventId); - qs += '&dsn=' + encode(dsn); - - var user = options.user || this._globalContext.user; - if (user) { - if (user.name) qs += '&name=' + encode(user.name); - if (user.email) qs += '&email=' + encode(user.email); - } - - var globalServer = this._getGlobalServer(this._parseDSN(dsn)); - - var script = _document.createElement('script'); - script.async = true; - script.src = globalServer + '/api/embed/error-page/' + qs; - (_document.head || _document.body).appendChild(script); - }, - - /**** Private functions ****/ - _ignoreNextOnError: function() { - var self = this; - this._ignoreOnError += 1; - setTimeout(function() { - // onerror should trigger before setTimeout - self._ignoreOnError -= 1; - }); - }, - - _triggerEvent: function(eventType, options) { - // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it - var evt, key; - - if (!this._hasDocument) return; - - options = options || {}; - - eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1); - - if (_document.createEvent) { - evt = _document.createEvent('HTMLEvents'); - evt.initEvent(eventType, true, true); - } else { - evt = _document.createEventObject(); - evt.eventType = eventType; - } - - for (key in options) - if (hasKey(options, key)) { - evt[key] = options[key]; - } - - if (_document.createEvent) { - // IE9 if standards - _document.dispatchEvent(evt); - } else { - // IE8 regardless of Quirks or Standards - // IE9 if quirks - try { - _document.fireEvent('on' + evt.eventType.toLowerCase(), evt); - } catch (e) { - // Do nothing - } - } - }, - - /** - * Wraps addEventListener to capture UI breadcrumbs - * @param evtName the event name (e.g. "click") - * @returns {Function} - * @private - */ - _breadcrumbEventHandler: function(evtName) { - var self = this; - return function(evt) { - // reset keypress timeout; e.g. triggering a 'click' after - // a 'keypress' will reset the keypress debounce so that a new - // set of keypresses can be recorded - self._keypressTimeout = null; - - // It's possible this handler might trigger multiple times for the same - // event (e.g. event propagation through node ancestors). Ignore if we've - // already captured the event. - if (self._lastCapturedEvent === evt) return; - - self._lastCapturedEvent = evt; - - // try/catch both: - // - accessing evt.target (see getsentry/raven-js#838, #768) - // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly - // can throw an exception in some circumstances. - var target; - try { - target = htmlTreeAsString(evt.target); - } catch (e) { - target = ''; - } - - self.captureBreadcrumb({ - category: 'ui.' + evtName, // e.g. ui.click, ui.input - message: target - }); - }; - }, - - /** - * Wraps addEventListener to capture keypress UI events - * @returns {Function} - * @private - */ - _keypressEventHandler: function() { - var self = this, - debounceDuration = 1000; // milliseconds - - // TODO: if somehow user switches keypress target before - // debounce timeout is triggered, we will only capture - // a single breadcrumb from the FIRST target (acceptable?) - return function(evt) { - var target; - try { - target = evt.target; - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - var tagName = target && target.tagName; - - // only consider keypress events on actual input elements - // this will disregard keypresses targeting body (e.g. tabbing - // through elements, hotkeys, etc) - if ( - !tagName || - (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable) - ) - return; - - // record first keypress in a series, but ignore subsequent - // keypresses until debounce clears - var timeout = self._keypressTimeout; - if (!timeout) { - self._breadcrumbEventHandler('input')(evt); - } - clearTimeout(timeout); - self._keypressTimeout = setTimeout(function() { - self._keypressTimeout = null; - }, debounceDuration); - }; - }, - - /** - * Captures a breadcrumb of type "navigation", normalizing input URLs - * @param to the originating URL - * @param from the target URL - * @private - */ - _captureUrlChange: function(from, to) { - var parsedLoc = parseUrl(this._location.href); - var parsedTo = parseUrl(to); - var parsedFrom = parseUrl(from); - - // because onpopstate only tells you the "new" (to) value of location.href, and - // not the previous (from) value, we need to track the value of the current URL - // state ourselves - this._lastHref = to; - - // Use only the path component of the URL if the URL matches the current - // document (almost all the time when using pushState) - if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) - to = parsedTo.relative; - if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) - from = parsedFrom.relative; - - this.captureBreadcrumb({ - category: 'navigation', - data: { - to: to, - from: from - } - }); - }, - - /** - * Wrap timer functions and event targets to catch errors and provide - * better metadata. - */ - _instrumentTryCatch: function() { - var self = this; - - var wrappedBuiltIns = self._wrappedBuiltIns; - - function wrapTimeFn(orig) { - return function(fn, t) { - // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - var originalCallback = args[0]; - if (isFunction(originalCallback)) { - args[0] = self.wrap(originalCallback); - } - - // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it - // also supports only two arguments and doesn't care what this is, so we - // can just call the original function directly. - if (orig.apply) { - return orig.apply(this, args); - } else { - return orig(args[0], args[1]); - } - }; - } - - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - - function wrapEventTarget(global) { - var proto = _window[global] && _window[global].prototype; - if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) { - fill( - proto, - 'addEventListener', - function(orig) { - return function(evtName, fn, capture, secure) { - // preserve arity - try { - if (fn && fn.handleEvent) { - fn.handleEvent = self.wrap(fn.handleEvent); - } - } catch (err) { - // can sometimes get 'Permission denied to access property "handle Event' - } - - // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs` - // so that we don't have more than one wrapper function - var before, clickHandler, keypressHandler; - - if ( - autoBreadcrumbs && - autoBreadcrumbs.dom && - (global === 'EventTarget' || global === 'Node') - ) { - // NOTE: generating multiple handlers per addEventListener invocation, should - // revisit and verify we can just use one (almost certainly) - clickHandler = self._breadcrumbEventHandler('click'); - keypressHandler = self._keypressEventHandler(); - before = function(evt) { - // need to intercept every DOM event in `before` argument, in case that - // same wrapped method is re-used for different events (e.g. mousemove THEN click) - // see #724 - if (!evt) return; - - var eventType; - try { - eventType = evt.type; - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - if (eventType === 'click') return clickHandler(evt); - else if (eventType === 'keypress') return keypressHandler(evt); - }; - } - return orig.call( - this, - evtName, - self.wrap(fn, undefined, before), - capture, - secure - ); - }; - }, - wrappedBuiltIns - ); - fill( - proto, - 'removeEventListener', - function(orig) { - return function(evt, fn, capture, secure) { - try { - fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn); - } catch (e) { - // ignore, accessing __raven_wrapper__ will throw in some Selenium environments - } - return orig.call(this, evt, fn, capture, secure); - }; - }, - wrappedBuiltIns - ); - } - } - - fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns); - fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns); - if (_window.requestAnimationFrame) { - fill( - _window, - 'requestAnimationFrame', - function(orig) { - return function(cb) { - return orig(self.wrap(cb)); - }; - }, - wrappedBuiltIns - ); - } - - // event targets borrowed from bugsnag-js: - // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666 - var eventTargets = [ - 'EventTarget', - 'Window', - 'Node', - 'ApplicationCache', - 'AudioTrackList', - 'ChannelMergerNode', - 'CryptoOperation', - 'EventSource', - 'FileReader', - 'HTMLUnknownElement', - 'IDBDatabase', - 'IDBRequest', - 'IDBTransaction', - 'KeyOperation', - 'MediaController', - 'MessagePort', - 'ModalWindow', - 'Notification', - 'SVGElementInstance', - 'Screen', - 'TextTrack', - 'TextTrackCue', - 'TextTrackList', - 'WebSocket', - 'WebSocketWorker', - 'Worker', - 'XMLHttpRequest', - 'XMLHttpRequestEventTarget', - 'XMLHttpRequestUpload' - ]; - for (var i = 0; i < eventTargets.length; i++) { - wrapEventTarget(eventTargets[i]); - } - }, - - /** - * Instrument browser built-ins w/ breadcrumb capturing - * - XMLHttpRequests - * - DOM interactions (click/typing) - * - window.location changes - * - console - * - * Can be disabled or individually configured via the `autoBreadcrumbs` config option - */ - _instrumentBreadcrumbs: function() { - var self = this; - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - - var wrappedBuiltIns = self._wrappedBuiltIns; - - function wrapProp(prop, xhr) { - if (prop in xhr && isFunction(xhr[prop])) { - fill(xhr, prop, function(orig) { - return self.wrap(orig); - }); // intentionally don't track filled methods on XHR instances - } - } - - if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) { - var xhrproto = XMLHttpRequest.prototype; - fill( - xhrproto, - 'open', - function(origOpen) { - return function(method, url) { - // preserve arity - - // if Sentry key appears in URL, don't capture - if (isString(url) && url.indexOf(self._globalKey) === -1) { - this.__raven_xhr = { - method: method, - url: url, - status_code: null - }; - } - - return origOpen.apply(this, arguments); - }; - }, - wrappedBuiltIns - ); - - fill( - xhrproto, - 'send', - function(origSend) { - return function(data) { - // preserve arity - var xhr = this; - - function onreadystatechangeHandler() { - if (xhr.__raven_xhr && xhr.readyState === 4) { - try { - // touching statusCode in some platforms throws - // an exception - xhr.__raven_xhr.status_code = xhr.status; - } catch (e) { - /* do nothing */ - } - - self.captureBreadcrumb({ - type: 'http', - category: 'xhr', - data: xhr.__raven_xhr - }); - } - } - - var props = ['onload', 'onerror', 'onprogress']; - for (var j = 0; j < props.length; j++) { - wrapProp(props[j], xhr); - } - - if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) { - fill( - xhr, - 'onreadystatechange', - function(orig) { - return self.wrap(orig, undefined, onreadystatechangeHandler); - } /* intentionally don't track this instrumentation */ - ); - } else { - // if onreadystatechange wasn't actually set by the page on this xhr, we - // are free to set our own and capture the breadcrumb - xhr.onreadystatechange = onreadystatechangeHandler; - } - - return origSend.apply(this, arguments); - }; - }, - wrappedBuiltIns - ); - } - - if (autoBreadcrumbs.xhr && 'fetch' in _window) { - fill( - _window, - 'fetch', - function(origFetch) { - return function(fn, t) { - // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - - var fetchInput = args[0]; - var method = 'GET'; - var url; - - if (typeof fetchInput === 'string') { - url = fetchInput; - } else if ('Request' in _window && fetchInput instanceof _window.Request) { - url = fetchInput.url; - if (fetchInput.method) { - method = fetchInput.method; - } - } else { - url = '' + fetchInput; - } - - if (args[1] && args[1].method) { - method = args[1].method; - } - - var fetchData = { - method: method, - url: url, - status_code: null - }; - - self.captureBreadcrumb({ - type: 'http', - category: 'fetch', - data: fetchData - }); - - return origFetch.apply(this, args).then(function(response) { - fetchData.status_code = response.status; - - return response; - }); - }; - }, - wrappedBuiltIns - ); - } - - // Capture breadcrumbs from any click that is unhandled / bubbled up all the way - // to the document. Do this before we instrument addEventListener. - if (autoBreadcrumbs.dom && this._hasDocument) { - if (_document.addEventListener) { - _document.addEventListener('click', self._breadcrumbEventHandler('click'), false); - _document.addEventListener('keypress', self._keypressEventHandler(), false); - } else { - // IE8 Compatibility - _document.attachEvent('onclick', self._breadcrumbEventHandler('click')); - _document.attachEvent('onkeypress', self._keypressEventHandler()); - } - } - - // record navigation (URL) changes - // NOTE: in Chrome App environment, touching history.pushState, *even inside - // a try/catch block*, will cause Chrome to output an error to console.error - // borrowed from: https://github.com/angular/angular.js/pull/13945/files - var chrome = _window.chrome; - var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime; - var hasPushAndReplaceState = - !isChromePackagedApp && - _window.history && - history.pushState && - history.replaceState; - if (autoBreadcrumbs.location && hasPushAndReplaceState) { - // TODO: remove onpopstate handler on uninstall() - var oldOnPopState = _window.onpopstate; - _window.onpopstate = function() { - var currentHref = self._location.href; - self._captureUrlChange(self._lastHref, currentHref); - - if (oldOnPopState) { - return oldOnPopState.apply(this, arguments); - } - }; - - var historyReplacementFunction = function(origHistFunction) { - // note history.pushState.length is 0; intentionally not declaring - // params to preserve 0 arity - return function(/* state, title, url */) { - var url = arguments.length > 2 ? arguments[2] : undefined; - - // url argument is optional - if (url) { - // coerce to string (this is what pushState does) - self._captureUrlChange(self._lastHref, url + ''); - } - - return origHistFunction.apply(this, arguments); - }; - }; - - fill(history, 'pushState', historyReplacementFunction, wrappedBuiltIns); - fill(history, 'replaceState', historyReplacementFunction, wrappedBuiltIns); - } - - if (autoBreadcrumbs.console && 'console' in _window && console.log) { - // console - var consoleMethodCallback = function(msg, data) { - self.captureBreadcrumb({ - message: msg, - level: data.level, - category: 'console' - }); - }; - - each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) { - wrapConsoleMethod(console, level, consoleMethodCallback); - }); - } - }, - - _restoreBuiltIns: function() { - // restore any wrapped builtins - var builtin; - while (this._wrappedBuiltIns.length) { - builtin = this._wrappedBuiltIns.shift(); - - var obj = builtin[0], - name = builtin[1], - orig = builtin[2]; - - obj[name] = orig; - } - }, - - _drainPlugins: function() { - var self = this; - - // FIX ME TODO - each(this._plugins, function(_, plugin) { - var installer = plugin[0]; - var args = plugin[1]; - installer.apply(self, [self].concat(args)); - }); - }, - - _parseDSN: function(str) { - var m = dsnPattern.exec(str), - dsn = {}, - i = 7; - - try { - while (i--) dsn[dsnKeys[i]] = m[i] || ''; - } catch (e) { - throw new RavenConfigError('Invalid DSN: ' + str); - } - - if (dsn.pass && !this._globalOptions.allowSecretKey) { - throw new RavenConfigError( - 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key' - ); - } - - return dsn; - }, - - _getGlobalServer: function(uri) { - // assemble the endpoint from the uri pieces - var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : ''); - - if (uri.protocol) { - globalServer = uri.protocol + ':' + globalServer; - } - return globalServer; - }, - - _handleOnErrorStackInfo: function() { - // if we are intentionally ignoring errors via onerror, bail out - if (!this._ignoreOnError) { - this._handleStackInfo.apply(this, arguments); - } - }, - - _handleStackInfo: function(stackInfo, options) { - var frames = this._prepareFrames(stackInfo, options); - - this._triggerEvent('handle', { - stackInfo: stackInfo, - options: options - }); - - this._processException( - stackInfo.name, - stackInfo.message, - stackInfo.url, - stackInfo.lineno, - frames, - options - ); - }, - - _prepareFrames: function(stackInfo, options) { - var self = this; - var frames = []; - if (stackInfo.stack && stackInfo.stack.length) { - each(stackInfo.stack, function(i, stack) { - var frame = self._normalizeFrame(stack, stackInfo.url); - if (frame) { - frames.push(frame); - } - }); - - // e.g. frames captured via captureMessage throw - if (options && options.trimHeadFrames) { - for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) { - frames[j].in_app = false; - } - } - } - frames = frames.slice(0, this._globalOptions.stackTraceLimit); - return frames; - }, - - _normalizeFrame: function(frame, stackInfoUrl) { - // normalize the frames data - var normalized = { - filename: frame.url, - lineno: frame.line, - colno: frame.column, - function: frame.func || '?' - }; - - // Case when we don't have any information about the error - // E.g. throwing a string or raw object, instead of an `Error` in Firefox - // Generating synthetic error doesn't add any value here - // - // We should probably somehow let a user know that they should fix their code - if (!frame.url) { - normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler - } - - normalized.in_app = !// determine if an exception came from outside of our app - // first we check the global includePaths list. - ( - (!!this._globalOptions.includePaths.test && - !this._globalOptions.includePaths.test(normalized.filename)) || - // Now we check for fun, if the function name is Raven or TraceKit - /(Raven|TraceKit)\./.test(normalized['function']) || - // finally, we do a last ditch effort and check for raven.min.js - /raven\.(min\.)?js$/.test(normalized.filename) - ); - - return normalized; - }, - - _processException: function(type, message, fileurl, lineno, frames, options) { - var prefixedMessage = (type ? type + ': ' : '') + (message || ''); - if ( - !!this._globalOptions.ignoreErrors.test && - (this._globalOptions.ignoreErrors.test(message) || - this._globalOptions.ignoreErrors.test(prefixedMessage)) - ) { - return; - } - - var stacktrace; - - if (frames && frames.length) { - fileurl = frames[0].filename || fileurl; - // Sentry expects frames oldest to newest - // and JS sends them as newest to oldest - frames.reverse(); - stacktrace = {frames: frames}; - } else if (fileurl) { - stacktrace = { - frames: [ - { - filename: fileurl, - lineno: lineno, - in_app: true - } - ] - }; - } - - if ( - !!this._globalOptions.ignoreUrls.test && - this._globalOptions.ignoreUrls.test(fileurl) - ) { - return; - } - - if ( - !!this._globalOptions.whitelistUrls.test && - !this._globalOptions.whitelistUrls.test(fileurl) - ) { - return; - } - - var data = objectMerge( - { - // sentry.interfaces.Exception - exception: { - values: [ - { - type: type, - value: message, - stacktrace: stacktrace - } - ] - }, - culprit: fileurl - }, - options - ); - - // Fire away! - this._send(data); - }, - - _trimPacket: function(data) { - // For now, we only want to truncate the two different messages - // but this could/should be expanded to just trim everything - var max = this._globalOptions.maxMessageLength; - if (data.message) { - data.message = truncate(data.message, max); - } - if (data.exception) { - var exception = data.exception.values[0]; - exception.value = truncate(exception.value, max); - } - - var request = data.request; - if (request) { - if (request.url) { - request.url = truncate(request.url, this._globalOptions.maxUrlLength); - } - if (request.Referer) { - request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength); - } - } - - if (data.breadcrumbs && data.breadcrumbs.values) - this._trimBreadcrumbs(data.breadcrumbs); - - return data; - }, - - /** - * Truncate breadcrumb values (right now just URLs) - */ - _trimBreadcrumbs: function(breadcrumbs) { - // known breadcrumb properties with urls - // TODO: also consider arbitrary prop values that start with (https?)?:// - var urlProps = ['to', 'from', 'url'], - urlProp, - crumb, - data; - - for (var i = 0; i < breadcrumbs.values.length; ++i) { - crumb = breadcrumbs.values[i]; - if ( - !crumb.hasOwnProperty('data') || - !isObject(crumb.data) || - objectFrozen(crumb.data) - ) - continue; - - data = objectMerge({}, crumb.data); - for (var j = 0; j < urlProps.length; ++j) { - urlProp = urlProps[j]; - if (data.hasOwnProperty(urlProp) && data[urlProp]) { - data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength); - } - } - breadcrumbs.values[i].data = data; - } - }, - - _getHttpData: function() { - if (!this._hasNavigator && !this._hasDocument) return; - var httpData = {}; - - if (this._hasNavigator && _navigator.userAgent) { - httpData.headers = { - 'User-Agent': navigator.userAgent - }; - } - - if (this._hasDocument) { - if (_document.location && _document.location.href) { - httpData.url = _document.location.href; - } - if (_document.referrer) { - if (!httpData.headers) httpData.headers = {}; - httpData.headers.Referer = _document.referrer; - } - } - - return httpData; - }, - - _resetBackoff: function() { - this._backoffDuration = 0; - this._backoffStart = null; - }, - - _shouldBackoff: function() { - return this._backoffDuration && now() - this._backoffStart < this._backoffDuration; - }, - - /** - * Returns true if the in-process data payload matches the signature - * of the previously-sent data - * - * NOTE: This has to be done at this level because TraceKit can generate - * data from window.onerror WITHOUT an exception object (IE8, IE9, - * other old browsers). This can take the form of an "exception" - * data object with a single frame (derived from the onerror args). - */ - _isRepeatData: function(current) { - var last = this._lastData; - - if ( - !last || - current.message !== last.message || // defined for captureMessage - current.culprit !== last.culprit // defined for captureException/onerror - ) - return false; - - // Stacktrace interface (i.e. from captureMessage) - if (current.stacktrace || last.stacktrace) { - return isSameStacktrace(current.stacktrace, last.stacktrace); - } else if (current.exception || last.exception) { - // Exception interface (i.e. from captureException/onerror) - return isSameException(current.exception, last.exception); - } - - return true; - }, - - _setBackoffState: function(request) { - // If we are already in a backoff state, don't change anything - if (this._shouldBackoff()) { - return; - } - - var status = request.status; - - // 400 - project_id doesn't exist or some other fatal - // 401 - invalid/revoked dsn - // 429 - too many requests - if (!(status === 400 || status === 401 || status === 429)) return; - - var retry; - try { - // If Retry-After is not in Access-Control-Expose-Headers, most - // browsers will throw an exception trying to access it - retry = request.getResponseHeader('Retry-After'); - retry = parseInt(retry, 10) * 1000; // Retry-After is returned in seconds - } catch (e) { - /* eslint no-empty:0 */ - } - - this._backoffDuration = retry - ? // If Sentry server returned a Retry-After value, use it - retry - : // Otherwise, double the last backoff duration (starts at 1 sec) - this._backoffDuration * 2 || 1000; - - this._backoffStart = now(); - }, - - _send: function(data) { - var globalOptions = this._globalOptions; - - var baseData = { - project: this._globalProject, - logger: globalOptions.logger, - platform: 'javascript' - }, - httpData = this._getHttpData(); - - if (httpData) { - baseData.request = httpData; - } - - // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload - if (data.trimHeadFrames) delete data.trimHeadFrames; - - data = objectMerge(baseData, data); - - // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge - data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags); - data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra); - - // Send along our own collected metadata with extra - data.extra['session:duration'] = now() - this._startTime; - - if (this._breadcrumbs && this._breadcrumbs.length > 0) { - // intentionally make shallow copy so that additions - // to breadcrumbs aren't accidentally sent in this request - data.breadcrumbs = { - values: [].slice.call(this._breadcrumbs, 0) - }; - } - - // If there are no tags/extra, strip the key from the payload alltogther. - if (isEmptyObject(data.tags)) delete data.tags; - - if (this._globalContext.user) { - // sentry.interfaces.User - data.user = this._globalContext.user; - } - - // Include the environment if it's defined in globalOptions - if (globalOptions.environment) data.environment = globalOptions.environment; - - // Include the release if it's defined in globalOptions - if (globalOptions.release) data.release = globalOptions.release; - - // Include server_name if it's defined in globalOptions - if (globalOptions.serverName) data.server_name = globalOptions.serverName; - - if (isFunction(globalOptions.dataCallback)) { - data = globalOptions.dataCallback(data) || data; - } - - // Why?????????? - if (!data || isEmptyObject(data)) { - return; - } - - // Check if the request should be filtered or not - if ( - isFunction(globalOptions.shouldSendCallback) && - !globalOptions.shouldSendCallback(data) - ) { - return; - } - - // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests), - // so drop requests until "cool-off" period has elapsed. - if (this._shouldBackoff()) { - this._logDebug('warn', 'Raven dropped error due to backoff: ', data); - return; - } - - if (typeof globalOptions.sampleRate === 'number') { - if (Math.random() < globalOptions.sampleRate) { - this._sendProcessedPayload(data); - } - } else { - this._sendProcessedPayload(data); - } - }, - - _getUuid: function() { - return uuid4(); - }, - - _sendProcessedPayload: function(data, callback) { - var self = this; - var globalOptions = this._globalOptions; - - if (!this.isSetup()) return; - - // Try and clean up the packet before sending by truncating long values - data = this._trimPacket(data); - - // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback, - // but this would require copying an un-truncated copy of the data packet, which can be - // arbitrarily deep (extra_data) -- could be worthwhile? will revisit - if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) { - this._logDebug('warn', 'Raven dropped repeat event: ', data); - return; - } - - // Send along an event_id if not explicitly passed. - // This event_id can be used to reference the error within Sentry itself. - // Set lastEventId after we know the error should actually be sent - this._lastEventId = data.event_id || (data.event_id = this._getUuid()); - - // Store outbound payload after trim - this._lastData = data; - - this._logDebug('debug', 'Raven about to send:', data); - - var auth = { - sentry_version: '7', - sentry_client: 'raven-js/' + this.VERSION, - sentry_key: this._globalKey - }; - - if (this._globalSecret) { - auth.sentry_secret = this._globalSecret; - } - - var exception = data.exception && data.exception.values[0]; - this.captureBreadcrumb({ - category: 'sentry', - message: exception - ? (exception.type ? exception.type + ': ' : '') + exception.value - : data.message, - event_id: data.event_id, - level: data.level || 'error' // presume error unless specified - }); - - var url = this._globalEndpoint; - (globalOptions.transport || this._makeRequest).call(this, { - url: url, - auth: auth, - data: data, - options: globalOptions, - onSuccess: function success() { - self._resetBackoff(); - - self._triggerEvent('success', { - data: data, - src: url - }); - callback && callback(); - }, - onError: function failure(error) { - self._logDebug('error', 'Raven transport failed to send: ', error); - - if (error.request) { - self._setBackoffState(error.request); - } - - self._triggerEvent('failure', { - data: data, - src: url - }); - error = error || new Error('Raven send failed (no additional details provided)'); - callback && callback(error); - } - }); - }, - - _makeRequest: function(opts) { - var request = _window.XMLHttpRequest && new _window.XMLHttpRequest(); - if (!request) return; - - // if browser doesn't support CORS (e.g. IE7), we are out of luck - var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined'; - - if (!hasCORS) return; - - var url = opts.url; - - if ('withCredentials' in request) { - request.onreadystatechange = function() { - if (request.readyState !== 4) { - return; - } else if (request.status === 200) { - opts.onSuccess && opts.onSuccess(); - } else if (opts.onError) { - var err = new Error('Sentry error code: ' + request.status); - err.request = request; - opts.onError(err); - } - }; - } else { - request = new XDomainRequest(); - // xdomainrequest cannot go http -> https (or vice versa), - // so always use protocol relative - url = url.replace(/^https?:/, ''); - - // onreadystatechange not supported by XDomainRequest - if (opts.onSuccess) { - request.onload = opts.onSuccess; - } - if (opts.onError) { - request.onerror = function() { - var err = new Error('Sentry error code: XDomainRequest'); - err.request = request; - opts.onError(err); - }; - } - } - - // NOTE: auth is intentionally sent as part of query string (NOT as custom - // HTTP header) so as to avoid preflight CORS requests - request.open('POST', url + '?' + urlencode(opts.auth)); - request.send(stringify(opts.data)); - }, - - _logDebug: function(level) { - if (this._originalConsoleMethods[level] && this.debug) { - // In IE<10 console methods do not have their own 'apply' method - Function.prototype.apply.call( - this._originalConsoleMethods[level], - this._originalConsole, - [].slice.call(arguments, 1) - ); - } - }, - - _mergeContext: function(key, context) { - if (isUndefined(context)) { - delete this._globalContext[key]; - } else { - this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context); - } - } -}; - -// Deprecations -Raven.prototype.setUser = Raven.prototype.setUserContext; -Raven.prototype.setReleaseContext = Raven.prototype.setRelease; - -module.exports = Raven; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/singleton.js": -/*!************************************************!*\ - !*** ./node_modules/raven-js/src/singleton.js ***! - \************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/** - * Enforces a single instance of the Raven client, and the - * main entry point for Raven. If you are a consumer of the - * Raven library, you SHOULD load this file (vs raven.js). - **/ - -var RavenConstructor = __webpack_require__(/*! ./raven */ "./node_modules/raven-js/src/raven.js"); - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; -var _Raven = _window.Raven; - -var Raven = new RavenConstructor(); - -/* - * Allow multiple versions of Raven to be installed. - * Strip Raven from the global context and returns the instance. - * - * @return {Raven} - */ -Raven.noConflict = function() { - _window.Raven = _Raven; - return Raven; -}; - -Raven.afterLoad(); - -module.exports = Raven; - - -/***/ }), - -/***/ "./node_modules/raven-js/src/utils.js": -/*!********************************************!*\ - !*** ./node_modules/raven-js/src/utils.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; - -function isObject(what) { - return typeof what === 'object' && what !== null; -} - -// Yanked from https://git.io/vS8DV re-used under CC0 -// with some tiny modifications -function isError(value) { - switch ({}.toString.call(value)) { - case '[object Error]': - return true; - case '[object Exception]': - return true; - case '[object DOMException]': - return true; - default: - return value instanceof Error; - } -} - -function isErrorEvent(value) { - return supportsErrorEvent() && {}.toString.call(value) === '[object ErrorEvent]'; -} - -function isUndefined(what) { - return what === void 0; -} - -function isFunction(what) { - return typeof what === 'function'; -} - -function isString(what) { - return Object.prototype.toString.call(what) === '[object String]'; -} - -function isEmptyObject(what) { - for (var _ in what) return false; // eslint-disable-line guard-for-in, no-unused-vars - return true; -} - -function supportsErrorEvent() { - try { - new ErrorEvent(''); // eslint-disable-line no-new - return true; - } catch (e) { - return false; - } -} - -function wrappedCallback(callback) { - function dataCallback(data, original) { - var normalizedData = callback(data) || data; - if (original) { - return original(normalizedData) || normalizedData; - } - return normalizedData; - } - - return dataCallback; -} - -function each(obj, callback) { - var i, j; - - if (isUndefined(obj.length)) { - for (i in obj) { - if (hasKey(obj, i)) { - callback.call(null, i, obj[i]); - } - } - } else { - j = obj.length; - if (j) { - for (i = 0; i < j; i++) { - callback.call(null, i, obj[i]); - } - } - } -} - -function objectMerge(obj1, obj2) { - if (!obj2) { - return obj1; - } - each(obj2, function(key, value) { - obj1[key] = value; - }); - return obj1; -} - -/** - * This function is only used for react-native. - * react-native freezes object that have already been sent over the - * js bridge. We need this function in order to check if the object is frozen. - * So it's ok that objectFrozen returns false if Object.isFrozen is not - * supported because it's not relevant for other "platforms". See related issue: - * https://github.com/getsentry/react-native-sentry/issues/57 - */ -function objectFrozen(obj) { - if (!Object.isFrozen) { - return false; - } - return Object.isFrozen(obj); -} - -function truncate(str, max) { - return !max || str.length <= max ? str : str.substr(0, max) + '\u2026'; -} - -/** - * hasKey, a better form of hasOwnProperty - * Example: hasKey(MainHostObject, property) === true/false - * - * @param {Object} host object to check property - * @param {string} key to check - */ -function hasKey(object, key) { - return Object.prototype.hasOwnProperty.call(object, key); -} - -function joinRegExp(patterns) { - // Combine an array of regular expressions and strings into one large regexp - // Be mad. - var sources = [], - i = 0, - len = patterns.length, - pattern; - - for (; i < len; i++) { - pattern = patterns[i]; - if (isString(pattern)) { - // If it's a string, we need to escape it - // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions - sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1')); - } else if (pattern && pattern.source) { - // If it's a regexp already, we want to extract the source - sources.push(pattern.source); - } - // Intentionally skip other cases - } - return new RegExp(sources.join('|'), 'i'); -} - -function urlencode(o) { - var pairs = []; - each(o, function(key, value) { - pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); - }); - return pairs.join('&'); -} - -// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B -// intentionally using regex and not href parsing trick because React Native and other -// environments where DOM might not be available -function parseUrl(url) { - var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); - if (!match) return {}; - - // coerce to undefined values to empty string so we don't get 'undefined' - var query = match[6] || ''; - var fragment = match[8] || ''; - return { - protocol: match[2], - host: match[4], - path: match[5], - relative: match[5] + query + fragment // everything minus origin - }; -} -function uuid4() { - var crypto = _window.crypto || _window.msCrypto; - - if (!isUndefined(crypto) && crypto.getRandomValues) { - // Use window.crypto API if available - // eslint-disable-next-line no-undef - var arr = new Uint16Array(8); - crypto.getRandomValues(arr); - - // set 4 in byte 7 - arr[3] = (arr[3] & 0xfff) | 0x4000; - // set 2 most significant bits of byte 9 to '10' - arr[4] = (arr[4] & 0x3fff) | 0x8000; - - var pad = function(num) { - var v = num.toString(16); - while (v.length < 4) { - v = '0' + v; - } - return v; - }; - - return ( - pad(arr[0]) + - pad(arr[1]) + - pad(arr[2]) + - pad(arr[3]) + - pad(arr[4]) + - pad(arr[5]) + - pad(arr[6]) + - pad(arr[7]) - ); - } else { - // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 - return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = (Math.random() * 16) | 0, - v = c === 'x' ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); - } -} - -/** - * Given a child DOM element, returns a query-selector statement describing that - * and its ancestors - * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz] - * @param elem - * @returns {string} - */ -function htmlTreeAsString(elem) { - /* eslint no-extra-parens:0*/ - var MAX_TRAVERSE_HEIGHT = 5, - MAX_OUTPUT_LEN = 80, - out = [], - height = 0, - len = 0, - separator = ' > ', - sepLength = separator.length, - nextStr; - - while (elem && height++ < MAX_TRAVERSE_HEIGHT) { - nextStr = htmlElementAsString(elem); - // bail out if - // - nextStr is the 'html' element - // - the length of the string that would be created exceeds MAX_OUTPUT_LEN - // (ignore this limit if we are on the first iteration) - if ( - nextStr === 'html' || - (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN) - ) { - break; - } - - out.push(nextStr); - - len += nextStr.length; - elem = elem.parentNode; - } - - return out.reverse().join(separator); -} - -/** - * Returns a simple, query-selector representation of a DOM element - * e.g. [HTMLElement] => input#foo.btn[name=baz] - * @param HTMLElement - * @returns {string} - */ -function htmlElementAsString(elem) { - var out = [], - className, - classes, - key, - attr, - i; - - if (!elem || !elem.tagName) { - return ''; - } - - out.push(elem.tagName.toLowerCase()); - if (elem.id) { - out.push('#' + elem.id); - } - - className = elem.className; - if (className && isString(className)) { - classes = className.split(/\s+/); - for (i = 0; i < classes.length; i++) { - out.push('.' + classes[i]); - } - } - var attrWhitelist = ['type', 'name', 'title', 'alt']; - for (i = 0; i < attrWhitelist.length; i++) { - key = attrWhitelist[i]; - attr = elem.getAttribute(key); - if (attr) { - out.push('[' + key + '="' + attr + '"]'); - } - } - return out.join(''); -} - -/** - * Returns true if either a OR b is truthy, but not both - */ -function isOnlyOneTruthy(a, b) { - return !!(!!a ^ !!b); -} - -/** - * Returns true if the two input exception interfaces have the same content - */ -function isSameException(ex1, ex2) { - if (isOnlyOneTruthy(ex1, ex2)) return false; - - ex1 = ex1.values[0]; - ex2 = ex2.values[0]; - - if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false; - - return isSameStacktrace(ex1.stacktrace, ex2.stacktrace); -} - -/** - * Returns true if the two input stack trace interfaces have the same content - */ -function isSameStacktrace(stack1, stack2) { - if (isOnlyOneTruthy(stack1, stack2)) return false; - - var frames1 = stack1.frames; - var frames2 = stack2.frames; - - // Exit early if frame count differs - if (frames1.length !== frames2.length) return false; - - // Iterate through every frame; bail out if anything differs - var a, b; - for (var i = 0; i < frames1.length; i++) { - a = frames1[i]; - b = frames2[i]; - if ( - a.filename !== b.filename || - a.lineno !== b.lineno || - a.colno !== b.colno || - a['function'] !== b['function'] - ) - return false; - } - return true; -} - -/** - * Polyfill a method - * @param obj object e.g. `document` - * @param name method name present on object e.g. `addEventListener` - * @param replacement replacement function - * @param track {optional} record instrumentation to an array - */ -function fill(obj, name, replacement, track) { - var orig = obj[name]; - obj[name] = replacement(orig); - if (track) { - track.push([obj, name, orig]); - } -} - -module.exports = { - isObject: isObject, - isError: isError, - isErrorEvent: isErrorEvent, - isUndefined: isUndefined, - isFunction: isFunction, - isString: isString, - isEmptyObject: isEmptyObject, - supportsErrorEvent: supportsErrorEvent, - wrappedCallback: wrappedCallback, - each: each, - objectMerge: objectMerge, - truncate: truncate, - objectFrozen: objectFrozen, - hasKey: hasKey, - joinRegExp: joinRegExp, - urlencode: urlencode, - uuid4: uuid4, - htmlTreeAsString: htmlTreeAsString, - htmlElementAsString: htmlElementAsString, - isSameException: isSameException, - isSameStacktrace: isSameStacktrace, - parseUrl: parseUrl, - fill: fill -}; - - -/***/ }), - -/***/ "./node_modules/raven-js/vendor/TraceKit/tracekit.js": -/*!***********************************************************!*\ - !*** ./node_modules/raven-js/vendor/TraceKit/tracekit.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var utils = __webpack_require__(/*! ../../src/utils */ "./node_modules/raven-js/src/utils.js"); - -/* - TraceKit - Cross brower stack traces - - This was originally forked from github.com/occ/TraceKit, but has since been - largely re-written and is now maintained as part of raven-js. Tests for - this are in test/vendor. - - MIT license -*/ - -var TraceKit = { - collectWindowErrors: true, - debug: false -}; - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = - typeof window !== 'undefined' - ? window - : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; - -// global reference to slice -var _slice = [].slice; -var UNKNOWN_FUNCTION = '?'; - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types -var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/; - -function getLocationHref() { - if (typeof document === 'undefined' || document.location == null) return ''; - - return document.location.href; -} - -/** - * TraceKit.report: cross-browser processing of unhandled exceptions - * - * Syntax: - * TraceKit.report.subscribe(function(stackInfo) { ... }) - * TraceKit.report.unsubscribe(function(stackInfo) { ... }) - * TraceKit.report(exception) - * try { ...code... } catch(ex) { TraceKit.report(ex); } - * - * Supports: - * - Firefox: full stack trace with line numbers, plus column number - * on top frame; column number is not guaranteed - * - Opera: full stack trace with line and column numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - IE: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - * In theory, TraceKit should work on all of the following versions: - * - IE5.5+ (only 8.0 tested) - * - Firefox 0.9+ (only 3.5+ tested) - * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require - * Exceptions Have Stacktrace to be enabled in opera:config) - * - Safari 3+ (only 4+ tested) - * - Chrome 1+ (only 5+ tested) - * - Konqueror 3.5+ (untested) - * - * Requires TraceKit.computeStackTrace. - * - * Tries to catch all unhandled exceptions and report them to the - * subscribed handlers. Please note that TraceKit.report will rethrow the - * exception. This is REQUIRED in order to get a useful stack trace in IE. - * If the exception does not reach the top of the browser, you will only - * get a stack trace from the point where TraceKit.report was called. - * - * Handlers receive a stackInfo object as described in the - * TraceKit.computeStackTrace docs. - */ -TraceKit.report = (function reportModuleWrapper() { - var handlers = [], - lastArgs = null, - lastException = null, - lastExceptionStack = null; - - /** - * Add a crash handler. - * @param {Function} handler - */ - function subscribe(handler) { - installGlobalHandler(); - handlers.push(handler); - } - - /** - * Remove a crash handler. - * @param {Function} handler - */ - function unsubscribe(handler) { - for (var i = handlers.length - 1; i >= 0; --i) { - if (handlers[i] === handler) { - handlers.splice(i, 1); - } - } - } - - /** - * Remove all crash handlers. - */ - function unsubscribeAll() { - uninstallGlobalHandler(); - handlers = []; - } - - /** - * Dispatch stack information to all handlers. - * @param {Object.} stack - */ - function notifyHandlers(stack, isWindowError) { - var exception = null; - if (isWindowError && !TraceKit.collectWindowErrors) { - return; - } - for (var i in handlers) { - if (handlers.hasOwnProperty(i)) { - try { - handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); - } catch (inner) { - exception = inner; - } - } - } - - if (exception) { - throw exception; - } - } - - var _oldOnerrorHandler, _onErrorHandlerInstalled; - - /** - * Ensures all global unhandled exceptions are recorded. - * Supported by Gecko and IE. - * @param {string} message Error message. - * @param {string} url URL of script that generated the exception. - * @param {(number|string)} lineNo The line number at which the error - * occurred. - * @param {?(number|string)} colNo The column number at which the error - * occurred. - * @param {?Error} ex The actual Error object. - */ - function traceKitWindowOnError(message, url, lineNo, colNo, ex) { - var stack = null; - - if (lastExceptionStack) { - TraceKit.computeStackTrace.augmentStackTraceWithInitialElement( - lastExceptionStack, - url, - lineNo, - message - ); - processLastException(); - } else if (ex && utils.isError(ex)) { - // non-string `ex` arg; attempt to extract stack trace - - // New chrome and blink send along a real error object - // Let's just report that like a normal error. - // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror - stack = TraceKit.computeStackTrace(ex); - notifyHandlers(stack, true); - } else { - var location = { - url: url, - line: lineNo, - column: colNo - }; - - var name = undefined; - var msg = message; // must be new var or will modify original `arguments` - var groups; - if ({}.toString.call(message) === '[object String]') { - var groups = message.match(ERROR_TYPES_RE); - if (groups) { - name = groups[1]; - msg = groups[2]; - } - } - - location.func = UNKNOWN_FUNCTION; - - stack = { - name: name, - message: msg, - url: getLocationHref(), - stack: [location] - }; - notifyHandlers(stack, true); - } - - if (_oldOnerrorHandler) { - return _oldOnerrorHandler.apply(this, arguments); - } - - return false; - } - - function installGlobalHandler() { - if (_onErrorHandlerInstalled) { - return; - } - _oldOnerrorHandler = _window.onerror; - _window.onerror = traceKitWindowOnError; - _onErrorHandlerInstalled = true; - } - - function uninstallGlobalHandler() { - if (!_onErrorHandlerInstalled) { - return; - } - _window.onerror = _oldOnerrorHandler; - _onErrorHandlerInstalled = false; - _oldOnerrorHandler = undefined; - } - - function processLastException() { - var _lastExceptionStack = lastExceptionStack, - _lastArgs = lastArgs; - lastArgs = null; - lastExceptionStack = null; - lastException = null; - notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs)); - } - - /** - * Reports an unhandled Error to TraceKit. - * @param {Error} ex - * @param {?boolean} rethrow If false, do not re-throw the exception. - * Only used for window.onerror to not cause an infinite loop of - * rethrowing. - */ - function report(ex, rethrow) { - var args = _slice.call(arguments, 1); - if (lastExceptionStack) { - if (lastException === ex) { - return; // already caught by an inner catch block, ignore - } else { - processLastException(); - } - } - - var stack = TraceKit.computeStackTrace(ex); - lastExceptionStack = stack; - lastException = ex; - lastArgs = args; - - // If the stack trace is incomplete, wait for 2 seconds for - // slow slow IE to see if onerror occurs or not before reporting - // this exception; otherwise, we will end up with an incomplete - // stack trace - setTimeout(function() { - if (lastException === ex) { - processLastException(); - } - }, stack.incomplete ? 2000 : 0); - - if (rethrow !== false) { - throw ex; // re-throw to propagate to the top level (and cause window.onerror) - } - } - - report.subscribe = subscribe; - report.unsubscribe = unsubscribe; - report.uninstall = unsubscribeAll; - return report; -})(); - -/** - * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript - * - * Syntax: - * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below) - * Returns: - * s.name - exception name - * s.message - exception message - * s.stack[i].url - JavaScript or HTML file URL - * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work) - * s.stack[i].args - arguments passed to the function, if known - * s.stack[i].line - line number, if known - * s.stack[i].column - column number, if known - * - * Supports: - * - Firefox: full stack trace with line numbers and unreliable column - * number on top frame - * - Opera 10: full stack trace with line and column numbers - * - Opera 9-: full stack trace with line numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the topmost stacktrace element - * only - * - IE: no line numbers whatsoever - * - * Tries to guess names of anonymous functions by looking for assignments - * in the source code. In IE and Safari, we have to guess source file names - * by searching for function bodies inside all page scripts. This will not - * work for scripts that are loaded cross-domain. - * Here be dragons: some function names may be guessed incorrectly, and - * duplicate functions may be mismatched. - * - * TraceKit.computeStackTrace should only be used for tracing purposes. - * Logging of unhandled exceptions should be done with TraceKit.report, - * which builds on top of TraceKit.computeStackTrace and provides better - * IE support by utilizing the window.onerror event to retrieve information - * about the top of the stack. - * - * Note: In IE and Safari, no stack trace is recorded on the Error object, - * so computeStackTrace instead walks its *own* chain of callers. - * This means that: - * * in Safari, some methods may be missing from the stack trace; - * * in IE, the topmost function in the stack trace will always be the - * caller of computeStackTrace. - * - * This is okay for tracing (because you are likely to be calling - * computeStackTrace from the function you want to be the topmost element - * of the stack trace anyway), but not okay for logging unhandled - * exceptions (because your catch block will likely be far away from the - * inner function that actually caused the exception). - * - */ -TraceKit.computeStackTrace = (function computeStackTraceWrapper() { - // Contents of Exception in various browsers. - // - // SAFARI: - // ex.message = Can't find variable: qq - // ex.line = 59 - // ex.sourceId = 580238192 - // ex.sourceURL = http://... - // ex.expressionBeginOffset = 96 - // ex.expressionCaretOffset = 98 - // ex.expressionEndOffset = 98 - // ex.name = ReferenceError - // - // FIREFOX: - // ex.message = qq is not defined - // ex.fileName = http://... - // ex.lineNumber = 59 - // ex.columnNumber = 69 - // ex.stack = ...stack trace... (see the example below) - // ex.name = ReferenceError - // - // CHROME: - // ex.message = qq is not defined - // ex.name = ReferenceError - // ex.type = not_defined - // ex.arguments = ['aa'] - // ex.stack = ...stack trace... - // - // INTERNET EXPLORER: - // ex.message = ... - // ex.name = ReferenceError - // - // OPERA: - // ex.message = ...message... (see the example below) - // ex.name = ReferenceError - // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message) - // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace' - - /** - * Computes stack trace information from the stack property. - * Chrome and Gecko use this property. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceFromStackProp(ex) { - if (typeof ex.stack === 'undefined' || !ex.stack) return; - - var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i, - gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i, - winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i, - // Used to additionally parse URL/line/column from eval frames - geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i, - chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/, - lines = ex.stack.split('\n'), - stack = [], - submatch, - parts, - element, - reference = /^(.*) is undefined$/.exec(ex.message); - - for (var i = 0, j = lines.length; i < j; ++i) { - if ((parts = chrome.exec(lines[i]))) { - var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line - var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line - if (isEval && (submatch = chromeEval.exec(parts[2]))) { - // throw out eval line/column and use top-most line/column number - parts[2] = submatch[1]; // url - parts[3] = submatch[2]; // line - parts[4] = submatch[3]; // column - } - element = { - url: !isNative ? parts[2] : null, - func: parts[1] || UNKNOWN_FUNCTION, - args: isNative ? [parts[2]] : [], - line: parts[3] ? +parts[3] : null, - column: parts[4] ? +parts[4] : null - }; - } else if ((parts = winjs.exec(lines[i]))) { - element = { - url: parts[2], - func: parts[1] || UNKNOWN_FUNCTION, - args: [], - line: +parts[3], - column: parts[4] ? +parts[4] : null - }; - } else if ((parts = gecko.exec(lines[i]))) { - var isEval = parts[3] && parts[3].indexOf(' > eval') > -1; - if (isEval && (submatch = geckoEval.exec(parts[3]))) { - // throw out eval line/column and use top-most line number - parts[3] = submatch[1]; - parts[4] = submatch[2]; - parts[5] = null; // no column when eval - } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') { - // FireFox uses this awesome columnNumber property for its top frame - // Also note, Firefox's column number is 0-based and everything else expects 1-based, - // so adding 1 - // NOTE: this hack doesn't work if top-most frame is eval - stack[0].column = ex.columnNumber + 1; - } - element = { - url: parts[3], - func: parts[1] || UNKNOWN_FUNCTION, - args: parts[2] ? parts[2].split(',') : [], - line: parts[4] ? +parts[4] : null, - column: parts[5] ? +parts[5] : null - }; - } else { - continue; - } - - if (!element.func && element.line) { - element.func = UNKNOWN_FUNCTION; - } - - stack.push(element); - } - - if (!stack.length) { - return null; - } - - return { - name: ex.name, - message: ex.message, - url: getLocationHref(), - stack: stack - }; - } - - /** - * Adds information about the first frame to incomplete stack traces. - * Safari and IE require this to get complete data on the first frame. - * @param {Object.} stackInfo Stack trace information from - * one of the compute* methods. - * @param {string} url The URL of the script that caused an error. - * @param {(number|string)} lineNo The line number of the script that - * caused an error. - * @param {string=} message The error generated by the browser, which - * hopefully contains the name of the object that caused the error. - * @return {boolean} Whether or not the stack information was - * augmented. - */ - function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) { - var initial = { - url: url, - line: lineNo - }; - - if (initial.url && initial.line) { - stackInfo.incomplete = false; - - if (!initial.func) { - initial.func = UNKNOWN_FUNCTION; - } - - if (stackInfo.stack.length > 0) { - if (stackInfo.stack[0].url === initial.url) { - if (stackInfo.stack[0].line === initial.line) { - return false; // already in stack trace - } else if ( - !stackInfo.stack[0].line && - stackInfo.stack[0].func === initial.func - ) { - stackInfo.stack[0].line = initial.line; - return false; - } - } - } - - stackInfo.stack.unshift(initial); - stackInfo.partial = true; - return true; - } else { - stackInfo.incomplete = true; - } - - return false; - } - - /** - * Computes stack trace information by walking the arguments.caller - * chain at the time the exception occurred. This will cause earlier - * frames to be missed but is the only way to get any stack trace in - * Safari and IE. The top frame is restored by - * {@link augmentStackTraceWithInitialElement}. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceByWalkingCallerChain(ex, depth) { - var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i, - stack = [], - funcs = {}, - recursion = false, - parts, - item, - source; - - for ( - var curr = computeStackTraceByWalkingCallerChain.caller; - curr && !recursion; - curr = curr.caller - ) { - if (curr === computeStackTrace || curr === TraceKit.report) { - // console.log('skipping internal function'); - continue; - } - - item = { - url: null, - func: UNKNOWN_FUNCTION, - line: null, - column: null - }; - - if (curr.name) { - item.func = curr.name; - } else if ((parts = functionName.exec(curr.toString()))) { - item.func = parts[1]; - } - - if (typeof item.func === 'undefined') { - try { - item.func = parts.input.substring(0, parts.input.indexOf('{')); - } catch (e) {} - } - - if (funcs['' + curr]) { - recursion = true; - } else { - funcs['' + curr] = true; - } - - stack.push(item); - } - - if (depth) { - // console.log('depth is ' + depth); - // console.log('stack is ' + stack.length); - stack.splice(0, depth); - } - - var result = { - name: ex.name, - message: ex.message, - url: getLocationHref(), - stack: stack - }; - augmentStackTraceWithInitialElement( - result, - ex.sourceURL || ex.fileName, - ex.line || ex.lineNumber, - ex.message || ex.description - ); - return result; - } - - /** - * Computes a stack trace for an exception. - * @param {Error} ex - * @param {(string|number)=} depth - */ - function computeStackTrace(ex, depth) { - var stack = null; - depth = depth == null ? 0 : +depth; - - try { - stack = computeStackTraceFromStackProp(ex); - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - - try { - stack = computeStackTraceByWalkingCallerChain(ex, depth + 1); - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - return { - name: ex.name, - message: ex.message, - url: getLocationHref() - }; - } - - computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement; - computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp; - - return computeStackTrace; -})(); - -module.exports = TraceKit; - - -/***/ }), - -/***/ "./node_modules/raven-js/vendor/json-stringify-safe/stringify.js": -/*!***********************************************************************!*\ - !*** ./node_modules/raven-js/vendor/json-stringify-safe/stringify.js ***! - \***********************************************************************/ -/***/ ((module, exports) => { - -/* - json-stringify-safe - Like JSON.stringify, but doesn't throw on circular references. - - Originally forked from https://github.com/isaacs/json-stringify-safe - version 5.0.1 on 3/8/2017 and modified to handle Errors serialization - and IE8 compatibility. Tests for this are in test/vendor. - - ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE -*/ - -exports = module.exports = stringify; -exports.getSerialize = serializer; - -function indexOf(haystack, needle) { - for (var i = 0; i < haystack.length; ++i) { - if (haystack[i] === needle) return i; - } - return -1; -} - -function stringify(obj, replacer, spaces, cycleReplacer) { - return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces); -} - -// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106 -function stringifyError(value) { - var err = { - // These properties are implemented as magical getters and don't show up in for in - stack: value.stack, - message: value.message, - name: value.name - }; - - for (var i in value) { - if (Object.prototype.hasOwnProperty.call(value, i)) { - err[i] = value[i]; - } - } - - return err; -} - -function serializer(replacer, cycleReplacer) { - var stack = []; - var keys = []; - - if (cycleReplacer == null) { - cycleReplacer = function(key, value) { - if (stack[0] === value) { - return '[Circular ~]'; - } - return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']'; - }; - } - - return function(key, value) { - if (stack.length > 0) { - var thisPos = indexOf(stack, this); - ~thisPos ? stack.splice(thisPos + 1) : stack.push(this); - ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key); - - if (~indexOf(stack, value)) { - value = cycleReplacer.call(this, key, value); - } - } else { - stack.push(value); - } - - return replacer == null - ? value instanceof Error ? stringifyError(value) : value - : replacer.call(this, key, value); - }; -} - - -/***/ }), - -/***/ "jquery": -/*!*************************!*\ - !*** external "jQuery" ***! - \*************************/ -/***/ ((module) => { - -"use strict"; -module.exports = window["jQuery"]; - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // 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/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* 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/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be in strict mode. -(() => { -"use strict"; -/*!*****************************************!*\ - !*** ./scripts/entries/reviewBanner.ts ***! - \*****************************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "initMonitorReviewBanner": () => (/* binding */ initMonitorReviewBanner) -/* harmony export */ }); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); -/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/backgroundAppUtils */ "./scripts/utils/backgroundAppUtils.ts"); -/* harmony import */ var _constants_selectors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/selectors */ "./scripts/constants/selectors.ts"); -/* harmony import */ var _constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants/leadinConfig */ "./scripts/constants/leadinConfig.ts"); -/* harmony import */ var _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../iframe/integratedMessages */ "./scripts/iframe/integratedMessages/index.ts"); - - - - - -var REVIEW_BANNER_INTRO_PERIOD_DAYS = 15; - -var userIsAfterIntroductoryPeriod = function userIsAfterIntroductoryPeriod() { - var activationDate = new Date(+_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__.activationTime * 1000); - var currentDate = new Date(); - var timeElapsed = new Date(currentDate.getTime() - activationDate.getTime()); - return timeElapsed.getUTCDate() - 1 >= REVIEW_BANNER_INTRO_PERIOD_DAYS; -}; -/** - * Adds some methods to window when review banner is - * displayed to monitor events - */ - - -function initMonitorReviewBanner() { - if (_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__.refreshToken) { - var embedder = (0,_utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_1__.getOrCreateBackgroundApp)(_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__.refreshToken); - var container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(_constants_selectors__WEBPACK_IMPORTED_MODULE_2__.domElements.reviewBannerContainer); - - if (container && userIsAfterIntroductoryPeriod()) { - jquery__WEBPACK_IMPORTED_MODULE_0___default()(_constants_selectors__WEBPACK_IMPORTED_MODULE_2__.domElements.reviewBannerLeaveReviewLink).off('click').on('click', function () { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_4__.ProxyMessages.TrackReviewBannerInteraction - }); - }); - jquery__WEBPACK_IMPORTED_MODULE_0___default()(_constants_selectors__WEBPACK_IMPORTED_MODULE_2__.domElements.reviewBannerDismissButton).off('click').on('click', function () { - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_4__.ProxyMessages.TrackReviewBannerDismissed - }); - }); - embedder.postAsyncMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_4__.ProxyMessages.FetchContactsCreateSinceActivation, - payload: +_constants_leadinConfig__WEBPACK_IMPORTED_MODULE_3__.activationTime * 1000 - }).then(function (_ref) { - var total = _ref.total; - - if (total >= 5) { - container.removeClass('leadin-review-banner--hide'); - embedder.postMessage({ - key: _iframe_integratedMessages__WEBPACK_IMPORTED_MODULE_4__.ProxyMessages.TrackReviewBannerRender - }); - } - }); - } - } -} -(0,_utils_backgroundAppUtils__WEBPACK_IMPORTED_MODULE_1__.initBackgroundApp)(initMonitorReviewBanner); -})(); - -/******/ })() -; -//# sourceMappingURL=reviewBanner.js.map \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/build/reviewBanner.js.map b/wp/wp-content/plugins/leadin/build/reviewBanner.js.map deleted file mode 100644 index 377f5b57..00000000 --- a/wp/wp-content/plugins/leadin/build/reviewBanner.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"reviewBanner.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2BAA6iBA,MAAM,CAACC,YAApjB;AAAA,IAAQC,WAAR,wBAAQA,WAAR;AAAA,IAAqBC,QAArB,wBAAqBA,QAArB;AAAA,IAA+BC,cAA/B,wBAA+BA,cAA/B;AAAA,IAA+CC,gBAA/C,wBAA+CA,gBAA/C;AAAA,IAAiEC,QAAjE,wBAAiEA,QAAjE;AAAA,IAA2EC,aAA3E,wBAA2EA,aAA3E;AAAA,IAA0FC,GAA1F,wBAA0FA,GAA1F;AAAA,IAA+FC,WAA/F,wBAA+FA,WAA/F;AAAA,IAA4GC,cAA5G,wBAA4GA,cAA5G;AAAA,IAA4HC,kBAA5H,wBAA4HA,kBAA5H;AAAA,IAAgJC,MAAhJ,wBAAgJA,MAAhJ;AAAA,IAAwJC,cAAxJ,wBAAwJA,cAAxJ;AAAA,IAAwKC,YAAxK,wBAAwKA,YAAxK;AAAA,IAAsLC,SAAtL,wBAAsLA,SAAtL;AAAA,IAAiMC,UAAjM,wBAAiMA,UAAjM;AAAA,IAA6MC,iBAA7M,wBAA6MA,iBAA7M;AAAA,IAAgOC,mBAAhO,wBAAgOA,mBAAhO;AAAA,IAAqPC,kBAArP,wBAAqPA,kBAArP;AAAA,IAAyQC,mBAAzQ,wBAAyQA,mBAAzQ;AAAA,IAA8RC,iBAA9R,wBAA8RA,iBAA9R;AAAA,IAAiTC,MAAjT,wBAAiTA,MAAjT;AAAA,IAAyTC,QAAzT,wBAAyTA,QAAzT;AAAA,IAAmUC,UAAnU,wBAAmUA,UAAnU;AAAA,IAA+UC,UAA/U,wBAA+UA,UAA/U;AAAA,IAA2VC,OAA3V,wBAA2VA,OAA3V;AAAA,IAAoWC,YAApW,wBAAoWA,YAApW;AAAA,IAAkXC,WAAlX,wBAAkXA,WAAlX;AAAA,IAA+XC,QAA/X,wBAA+XA,QAA/X;AAAA,IAAyYC,aAAzY,wBAAyYA,aAAzY;AAAA,IAAwZC,SAAxZ,wBAAwZA,SAAxZ;AAAA,IAAmaC,OAAna,wBAAmaA,OAAna;AAAA,IAA4aC,YAA5a,wBAA4aA,YAA5a;AAAA,IAA0bC,iBAA1b,wBAA0bA,iBAA1b;AAAA,IAA6cC,KAA7c,wBAA6cA,KAA7c;AAAA,IAAodC,YAApd,wBAAodA,YAApd;AAAA,IAAkeC,SAAle,wBAAkeA,SAAle;AAAA,IAA6eC,YAA7e,wBAA6eA,YAA7e;AAAA,IAA2fC,yBAA3f,wBAA2fA,yBAA3f;AAAA,IAAshBC,iBAAthB,wBAAshBA,iBAAthB;;;;;;;;;;;;;;;;ACAO,IAAMC,WAAW,GAAG;EACvBC,MAAM,EAAE,gBADe;EAEvBC,OAAO,EAAE,4BAFc;EAGvBC,YAAY,EAAE,8BAHS;EAIvBC,cAAc,EAAE,iCAJO;EAKvBC,sBAAsB,EAAE,oCALD;EAMvBC,sBAAsB,EAAE,6BAND;EAOvBC,wBAAwB,EAAE,+BAPH;EAQvBC,sBAAsB,EAAE,6BARD;EASvBC,kBAAkB,EAAE,qBATG;EAUvBC,mBAAmB,EAAE,gCAVE;EAWvBC,oBAAoB,EAAE,6BAXC;EAYvBC,qBAAqB,EAAE,uBAZA;EAavBC,2BAA2B,EAAE,uBAbN;EAcvBC,yBAAyB,EAAE,gCAdJ;EAevBC,qBAAqB,EAAE,yBAfA;EAgBvBC,YAAY,EAAE,eAhBS;EAiBvBC,6BAA6B,EAAE;AAjBR,CAApB;;;;;;;;;;;;;;;ACAA,IAAMC,YAAY,GAAG;EACxBC,gBAAgB,EAAE,4CADM;EAExBC,gBAAgB,EAAE,4CAFM;EAGxBC,iBAAiB,EAAE,6CAHK;EAIxBC,mBAAmB,EAAE,+CAJG;EAKxBC,UAAU,EAAE,qCALY;EAMxBC,YAAY,EAAE,wCANU;EAOxBC,uBAAuB,EAAE;AAPD,CAArB;;;;;;;;;;;;;;;ACAA,IAAMC,YAAY,GAAG;EACxBC,uBAAuB,EAAE;AADD,CAArB;;;;;;;;;;;;;;;;;;;;;;;;ACAP;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACHO,IAAMC,gBAAgB,GAAG;EAC5BC,2BAA2B,EAAE;AADD,CAAzB;;;;;;;;;;;;;;;ACAA,IAAMC,cAAc,GAAG;EAC1BC,wBAAwB,EAAE,4BADA;EAE1BC,kBAAkB,EAAE,sBAFM;EAG1BC,YAAY,EAAE,uCAHY;EAI1BC,4BAA4B,EAAE,mCAJJ;EAK1BC,6BAA6B,EAAE,oCALL;EAM1BC,0BAA0B,EAAE,iCANF;EAO1BC,6BAA6B,EAAE,oCAPL;EAQ1BC,2BAA2B,EAAE,kCARH;EAS1BC,wBAAwB,EAAE,6BATA;EAU1BC,yBAAyB,EAAE,oCAVD;EAW1BC,sBAAsB,EAAE,iCAXE;EAY1BC,yBAAyB,EAAE,8BAZD;EAa1BC,uBAAuB,EAAE,4BAbC;EAc1BC,iBAAiB,EAAE,qBAdO;EAe1BC,kBAAkB,EAAE,sBAfM;EAgB1BC,eAAe,EAAE,mBAhBS;EAiB1BC,sBAAsB,EAAE,2BAjBE;EAkB1BC,0BAA0B,EAAE,+BAlBF;EAmB1BC,2BAA2B,EAAE,gCAnBH;EAoB1BC,wBAAwB,EAAE,6BApBA;EAqB1BC,6BAA6B,EAAE,kCArBL;EAsB1BC,8BAA8B,EAAE,mCAtBN;EAuB1BC,2BAA2B,EAAE;AAvBH,CAAvB;;;;;;;;;;;;;;;ACAA,IAAMC,aAAa,GAAG;EACzBC,UAAU,EAAE,aADa;EAEzBC,SAAS,EAAE,YAFc;EAGzBC,sBAAsB,EAAE,2BAHC;EAIzBC,SAAS,EAAE,YAJc;EAKzBC,qBAAqB,EAAE,0BALE;EAMzBC,kCAAkC,EAAE,yCANX;EAOzBC,wBAAwB,EAAE,8BAPD;EAQzBC,uBAAuB,EAAE,2BARA;EASzBC,sBAAsB,EAAE,2BATC;EAUzBC,4BAA4B,EAAE,kCAVL;EAWzBC,uBAAuB,EAAE,4BAXA;EAYzBC,yBAAyB,EAAE,8BAZF;EAazBC,sBAAsB,EAAE,2BAbC;EAczBC,uBAAuB,EAAE,4BAdA;EAezBC,4BAA4B,EAAE,iCAfL;EAgBzBC,0BAA0B,EAAE,+BAhBH;EAiBzBC,uBAAuB,EAAE;AAjBA,CAAtB;;;;;;;;;;;;;;;;;;;ACAP;AACA;AACO,SAASE,cAAT,GAA0B;EAC7B,IAAIrG,2EAAA,CAAuB,iBAAvB,MAA8C,CAAC,CAAnD,EAAsD;IAClD;EACH;;EACDoG,sDAAA,CAAa,mEAAb,EAAkF;IAC9EI,UAAU,EAAE;MACRC,QAAQ,EAAE;IADF,CADkE;IAI9EC,OAAO,EAAEnG,wEAAmBA;EAJkD,CAAlF,EAKGoG,OALH;EAMAP,8DAAA,CAAqB;IACjBS,CAAC,EAAEtG,wEADc;IAEjBuG,GAAG,EAAEnG,+DAFY;IAGjBoG,SAAS,EAAEvF,8DAASA;EAHH,CAArB;EAKA4E,+DAAA,CAAsB;IAClBa,GAAG,EAAEjG,6DADa;IAElBH,OAAO,EAAEqG,MAAM,CAACC,IAAP,CAAYtG,4DAAZ,EACJuG,GADI,CACA,UAAAC,IAAI;MAAA,iBAAOA,IAAP,cAAexG,4DAAO,CAACwG,IAAD,CAAtB;IAAA,CADJ,EAEJC,IAFI,CAEC,GAFD;EAFS,CAAtB;AAMH;AACD,iEAAelB,iDAAf;;;;;;;;;;;;;;;;;;;ACxBA;AACA;AACO,SAASoB,OAAT,CAAiBC,MAAjB,EAAyB;EAC5BpB,0DAAc;EACdD,0DAAA,CAAcqB,MAAd;AACH;AACM,SAASE,cAAT,CAAwBF,MAAxB,EAAgC;EACnC,SAASG,IAAT,GAAgB;IACZL,6CAAC,CAACE,MAAD,CAAD;EACH;;EACDD,OAAO,CAACI,IAAD,CAAP;AACH;;;;;;;;;;;;;;;;;;ACXD;AACA;AACO,SAASC,iBAAT,CAA2BJ,MAA3B,EAAmC;EACtC,SAASG,IAAT,GAAgB;IACZ,IAAIE,KAAK,CAACC,OAAN,CAAcN,MAAd,CAAJ,EAA2B;MACvBA,MAAM,CAACO,OAAP,CAAe,UAAAC,QAAQ;QAAA,OAAIA,QAAQ,EAAZ;MAAA,CAAvB;IACH,CAFD,MAGK;MACDR,MAAM;IACT;EACJ;;EACDD,kDAAO,CAACI,IAAD,CAAP;AACH;AACM,IAAMM,wBAAwB,GAAG,SAA3BA,wBAA2B,CAAC9G,YAAD,EAAkB;EACtD,IAAIjC,MAAM,CAACgJ,mBAAX,EAAgC;IAC5B,OAAOhJ,MAAM,CAACgJ,mBAAd;EACH;;EACD,cAAwDhJ,MAAxD;EAAA,IAAQiJ,qBAAR,WAAQA,qBAAR;EAAA,IAA+BC,oBAA/B,WAA+BA,oBAA/B;EACA,IAAMC,OAAO,GAAG,IAAID,oBAAJ,GACXE,SADW,CACD9H,2DADC,EAEX+H,WAFW,CAEC/I,6DAFD,EAGXgJ,eAHW,CAGKrH,YAHL,CAAhB;EAIA,IAAMsH,QAAQ,GAAG,IAAIN,qBAAJ,CAA0B,yBAA1B,EAAqDpH,6DAArD,EAA+DhB,mEAA/D,EAA+E,YAAM,CAAG,CAAxF,EAA0F2I,UAA1F,CAAqGL,OAArG,CAAjB;EACAI,QAAQ,CAACE,QAAT,CAAkBC,QAAQ,CAACC,IAA3B,EAAiC,KAAjC;EACAJ,QAAQ,CAACK,mBAAT,GAXsD,CAWtB;;EAChC5J,MAAM,CAACgJ,mBAAP,GAA6BO,QAA7B;EACA,OAAOvJ,MAAM,CAACgJ,mBAAd;AACH,CAdM;;;;;;;;;;ACbP;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACPA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,gBAAgB,+CAA+C;;AAE/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACtCA;;AAEA,eAAe,mBAAO,CAAC,wFAA6B;AACpD,gBAAgB,mBAAO,CAAC,gHAAyC;AACjE,uBAAuB,mBAAO,CAAC,iEAAe;;AAE9C,YAAY,mBAAO,CAAC,qDAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,2FAA+B;;AAEvD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;AAC5C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS,GAAG;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,+CAA+C;AAC/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,wBAAwB,iDAAiD;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,+BAA+B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B;AAC3B,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,0CAA0C;AAC1C,2CAA2C;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,MAAM;AACN,2EAA2E;AAC3E;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACr4DA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,mBAAO,CAAC,qDAAS;;AAExC;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;AAC5C;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;;;;;;;;;AC9BA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;;AAE5C;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC;AACnC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oCAAoC;AACpC;AACA;;AAEA;AACA;AACA,wBAAwB;AACxB;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,SAAS;AAClB;AACA;AACA;AACA;AACA,iDAAiD;AACjD,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA,cAAc,0BAA0B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,kCAAkC;AAClC;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChYA,YAAY,mBAAO,CAAC,6DAAiB;;AAErC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,qBAAM,mBAAmB,qBAAM;;AAE5C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,qDAAqD,KAAK;AAC1D,uDAAuD,KAAK;AAC5D;AACA,WAAW,aAAa,YAAY;AACpC;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,+DAA+D;AAC/D;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,oBAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,iBAAiB;AAChC;AACA,eAAe,kBAAkB;AACjC;AACA,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,8BAA8B;;AAE9B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;;AAE1B;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,qBAAqB;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAsC,OAAO;AAC7C;AACA,qEAAqE;AACrE,iEAAiE;AACjE;AACA;AACA,kCAAkC;AAClC,kCAAkC;AAClC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,oBAAoB;AACnC;AACA,eAAe,QAAQ;AACvB,eAAe,iBAAiB;AAChC;AACA,eAAe,SAAS;AACxB;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B;AAC1B,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ,0CAA0C;AAClD,eAAe,OAAO;AACtB,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,qEAAqE;AACrE,UAAU;AACV;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,kBAAkB;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;;;;;;;;;;;AC9mBA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB;;AAEpB;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACzEA;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA,IAAMa,+BAA+B,GAAG,EAAxC;;AACA,IAAMC,6BAA6B,GAAG,SAAhCA,6BAAgC,GAAM;EACxC,IAAMC,cAAc,GAAG,IAAIC,IAAJ,CAAS,CAAC5J,mEAAD,GAAkB,IAA3B,CAAvB;EACA,IAAM6J,WAAW,GAAG,IAAID,IAAJ,EAApB;EACA,IAAME,WAAW,GAAG,IAAIF,IAAJ,CAASC,WAAW,CAACE,OAAZ,KAAwBJ,cAAc,CAACI,OAAf,EAAjC,CAApB;EACA,OAAOD,WAAW,CAACE,UAAZ,KAA2B,CAA3B,IAAgCP,+BAAvC;AACH,CALD;AAMA;AACA;AACA;AACA;;;AACO,SAASQ,uBAAT,GAAmC;EACtC,IAAIpI,iEAAJ,EAAkB;IACd,IAAMsH,QAAQ,GAAGR,mFAAwB,CAAC9G,iEAAD,CAAzC;IACA,IAAMqI,SAAS,GAAGlC,6CAAC,CAAC3F,mFAAD,CAAnB;;IACA,IAAI6H,SAAS,IAAIR,6BAA6B,EAA9C,EAAkD;MAC9C1B,6CAAC,CAAC3F,yFAAD,CAAD,CACK8H,GADL,CACS,OADT,EAEKC,EAFL,CAEQ,OAFR,EAEiB,YAAM;QACnBjB,QAAQ,CAACkB,WAAT,CAAqB;UACjBC,GAAG,EAAE3E,kGAA0Ce;QAD9B,CAArB;MAGH,CAND;MAOAsB,6CAAC,CAAC3F,uFAAD,CAAD,CACK8H,GADL,CACS,OADT,EAEKC,EAFL,CAEQ,OAFR,EAEiB,YAAM;QACnBjB,QAAQ,CAACkB,WAAT,CAAqB;UACjBC,GAAG,EAAE3E,gGAAwCgB;QAD5B,CAArB;MAGH,CAND;MAOAwC,QAAQ,CACHoB,gBADL,CACsB;QAClBD,GAAG,EAAE3E,wGADa;QAElB6E,OAAO,EAAE,CAACxK,mEAAD,GAAkB;MAFT,CADtB,EAKKyK,IALL,CAKU,gBAAe;QAAA,IAAZC,KAAY,QAAZA,KAAY;;QACrB,IAAIA,KAAK,IAAI,CAAb,EAAgB;UACZR,SAAS,CAACS,WAAV,CAAsB,4BAAtB;UACAxB,QAAQ,CAACkB,WAAT,CAAqB;YACjBC,GAAG,EAAE3E,6FAAqCc;UADzB,CAArB;QAGH;MACJ,CAZD;IAaH;EACJ;AACJ;AACD6B,4EAAiB,CAAC2B,uBAAD,CAAjB,C","sources":["webpack://leadin/./scripts/constants/leadinConfig.ts","webpack://leadin/./scripts/constants/selectors.ts","webpack://leadin/./scripts/iframe/integratedMessages/core/CoreMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/forms/FormsMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/index.ts","webpack://leadin/./scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/plugin/PluginMessages.ts","webpack://leadin/./scripts/iframe/integratedMessages/proxy/ProxyMessages.ts","webpack://leadin/./scripts/lib/Raven.ts","webpack://leadin/./scripts/utils/appUtils.ts","webpack://leadin/./scripts/utils/backgroundAppUtils.ts","webpack://leadin/./node_modules/raven-js/src/configError.js","webpack://leadin/./node_modules/raven-js/src/console.js","webpack://leadin/./node_modules/raven-js/src/raven.js","webpack://leadin/./node_modules/raven-js/src/singleton.js","webpack://leadin/./node_modules/raven-js/src/utils.js","webpack://leadin/./node_modules/raven-js/vendor/TraceKit/tracekit.js","webpack://leadin/./node_modules/raven-js/vendor/json-stringify-safe/stringify.js","webpack://leadin/external window \"jQuery\"","webpack://leadin/webpack/bootstrap","webpack://leadin/webpack/runtime/compat get default export","webpack://leadin/webpack/runtime/define property getters","webpack://leadin/webpack/runtime/global","webpack://leadin/webpack/runtime/hasOwnProperty shorthand","webpack://leadin/webpack/runtime/make namespace object","webpack://leadin/./scripts/entries/reviewBanner.ts"],"sourcesContent":["const { accountName, adminUrl, activationTime, connectionStatus, deviceId, didDisconnect, env, formsScript, meetingsScript, formsScriptPayload, hublet, hubspotBaseUrl, hubspotNonce, iframeUrl, impactLink, lastAuthorizeTime, lastDeauthorizeTime, lastDisconnectTime, leadinPluginVersion, leadinQueryParams, locale, loginUrl, phpVersion, pluginPath, plugins, portalDomain, portalEmail, portalId, redirectNonce, restNonce, restUrl, refreshToken, reviewSkippedDate, theme, trackConsent, wpVersion, contentEmbed, requiresContentEmbedScope, refreshTokenError, } = window.leadinConfig;\nexport { accountName, adminUrl, activationTime, connectionStatus, deviceId, didDisconnect, env, formsScript, meetingsScript, formsScriptPayload, hublet, hubspotBaseUrl, hubspotNonce, iframeUrl, impactLink, lastAuthorizeTime, lastDeauthorizeTime, lastDisconnectTime, leadinPluginVersion, leadinQueryParams, loginUrl, locale, phpVersion, pluginPath, plugins, portalDomain, portalEmail, portalId, redirectNonce, restNonce, restUrl, refreshToken, reviewSkippedDate, theme, trackConsent, wpVersion, contentEmbed, requiresContentEmbedScope, refreshTokenError, };\n","export const domElements = {\n iframe: '#leadin-iframe',\n subMenu: '.toplevel_page_leadin > ul',\n subMenuLinks: '.toplevel_page_leadin > ul a',\n subMenuButtons: '.toplevel_page_leadin > ul > li',\n deactivatePluginButton: '[data-slug=\"leadin\"] .deactivate a',\n deactivateFeedbackForm: 'form.leadin-deactivate-form',\n deactivateFeedbackSubmit: 'button#leadin-feedback-submit',\n deactivateFeedbackSkip: 'button#leadin-feedback-skip',\n thickboxModalClose: '.leadin-modal-close',\n thickboxModalWindow: 'div#TB_window.thickbox-loading',\n thickboxModalContent: 'div#TB_ajaxContent.TB_modal',\n reviewBannerContainer: '#leadin-review-banner',\n reviewBannerLeaveReviewLink: 'a#leave-review-button',\n reviewBannerDismissButton: 'a#dismiss-review-banner-button',\n leadinIframeContainer: 'leadin-iframe-container',\n leadinIframe: 'leadin-iframe',\n leadinIframeFallbackContainer: 'leadin-iframe-fallback-container',\n};\n","export const CoreMessages = {\n HandshakeReceive: 'INTEGRATED_APP_EMBEDDER_HANDSHAKE_RECEIVED',\n SendRefreshToken: 'INTEGRATED_APP_EMBEDDER_SEND_REFRESH_TOKEN',\n ReloadParentFrame: 'INTEGRATED_APP_EMBEDDER_RELOAD_PARENT_FRAME',\n RedirectParentFrame: 'INTEGRATED_APP_EMBEDDER_REDIRECT_PARENT_FRAME',\n SendLocale: 'INTEGRATED_APP_EMBEDDER_SEND_LOCALE',\n SendDeviceId: 'INTEGRATED_APP_EMBEDDER_SEND_DEVICE_ID',\n SendIntegratedAppConfig: 'INTEGRATED_APP_EMBEDDER_CONFIG',\n};\n","export const FormMessages = {\n CreateFormAppNavigation: 'CREATE_FORM_APP_NAVIGATION',\n};\n","export * from './core/CoreMessages';\nexport * from './forms/FormsMessages';\nexport * from './livechat/LiveChatMessages';\nexport * from './plugin/PluginMessages';\nexport * from './proxy/ProxyMessages';\n","export const LiveChatMessages = {\n CreateLiveChatAppNavigation: 'CREATE_LIVE_CHAT_APP_NAVIGATION',\n};\n","export const PluginMessages = {\n PluginSettingsNavigation: 'PLUGIN_SETTINGS_NAVIGATION',\n PluginLeadinConfig: 'PLUGIN_LEADIN_CONFIG',\n TrackConsent: 'INTEGRATED_APP_EMBEDDER_TRACK_CONSENT',\n InternalTrackingFetchRequest: 'INTEGRATED_TRACKING_FETCH_REQUEST',\n InternalTrackingFetchResponse: 'INTEGRATED_TRACKING_FETCH_RESPONSE',\n InternalTrackingFetchError: 'INTEGRATED_TRACKING_FETCH_ERROR',\n InternalTrackingChangeRequest: 'INTEGRATED_TRACKING_CHANGE_REQUEST',\n InternalTrackingChangeError: 'INTEGRATED_TRACKING_CHANGE_ERROR',\n BusinessUnitFetchRequest: 'BUSINESS_UNIT_FETCH_REQUEST',\n BusinessUnitFetchResponse: 'BUSINESS_UNIT_FETCH_FETCH_RESPONSE',\n BusinessUnitFetchError: 'BUSINESS_UNIT_FETCH_FETCH_ERROR',\n BusinessUnitChangeRequest: 'BUSINESS_UNIT_CHANGE_REQUEST',\n BusinessUnitChangeError: 'BUSINESS_UNIT_CHANGE_ERROR',\n SkipReviewRequest: 'SKIP_REVIEW_REQUEST',\n SkipReviewResponse: 'SKIP_REVIEW_RESPONSE',\n SkipReviewError: 'SKIP_REVIEW_ERROR',\n RemoveParentQueryParam: 'REMOVE_PARENT_QUERY_PARAM',\n ContentEmbedInstallRequest: 'CONTENT_EMBED_INSTALL_REQUEST',\n ContentEmbedInstallResponse: 'CONTENT_EMBED_INSTALL_RESPONSE',\n ContentEmbedInstallError: 'CONTENT_EMBED_INSTALL_ERROR',\n ContentEmbedActivationRequest: 'CONTENT_EMBED_ACTIVATION_REQUEST',\n ContentEmbedActivationResponse: 'CONTENT_EMBED_ACTIVATION_RESPONSE',\n ContentEmbedActivationError: 'CONTENT_EMBED_ACTIVATION_ERROR',\n};\n","export const ProxyMessages = {\n FetchForms: 'FETCH_FORMS',\n FetchForm: 'FETCH_FORM',\n CreateFormFromTemplate: 'CREATE_FORM_FROM_TEMPLATE',\n FetchAuth: 'FETCH_AUTH',\n FetchMeetingsAndUsers: 'FETCH_MEETINGS_AND_USERS',\n FetchContactsCreateSinceActivation: 'FETCH_CONTACTS_CREATED_SINCE_ACTIVATION',\n FetchOrCreateMeetingUser: 'FETCH_OR_CREATE_MEETING_USER',\n ConnectMeetingsCalendar: 'CONNECT_MEETINGS_CALENDAR',\n TrackFormPreviewRender: 'TRACK_FORM_PREVIEW_RENDER',\n TrackFormCreatedFromTemplate: 'TRACK_FORM_CREATED_FROM_TEMPLATE',\n TrackFormCreationFailed: 'TRACK_FORM_CREATION_FAILED',\n TrackMeetingPreviewRender: 'TRACK_MEETING_PREVIEW_RENDER',\n TrackSidebarMetaChange: 'TRACK_SIDEBAR_META_CHANGE',\n TrackReviewBannerRender: 'TRACK_REVIEW_BANNER_RENDER',\n TrackReviewBannerInteraction: 'TRACK_REVIEW_BANNER_INTERACTION',\n TrackReviewBannerDismissed: 'TRACK_REVIEW_BANNER_DISMISSED',\n TrackPluginDeactivation: 'TRACK_PLUGIN_DEACTIVATION',\n};\n","import Raven from 'raven-js';\nimport { hubspotBaseUrl, phpVersion, wpVersion, leadinPluginVersion, portalId, plugins, } from '../constants/leadinConfig';\nexport function configureRaven() {\n if (hubspotBaseUrl.indexOf('app.hubspot.com') === -1) {\n return;\n }\n Raven.config('https://e9b8f382cdd130c0d415cd977d2be56f@exceptions.hubspot.com/1', {\n instrument: {\n tryCatch: false,\n },\n release: leadinPluginVersion,\n }).install();\n Raven.setTagsContext({\n v: leadinPluginVersion,\n php: phpVersion,\n wordpress: wpVersion,\n });\n Raven.setExtraContext({\n hub: portalId,\n plugins: Object.keys(plugins)\n .map(name => `${name}#${plugins[name]}`)\n .join(','),\n });\n}\nexport default Raven;\n","import $ from 'jquery';\nimport Raven, { configureRaven } from '../lib/Raven';\nexport function initApp(initFn) {\n configureRaven();\n Raven.context(initFn);\n}\nexport function initAppOnReady(initFn) {\n function main() {\n $(initFn);\n }\n initApp(main);\n}\n","import { deviceId, hubspotBaseUrl, locale, portalId, } from '../constants/leadinConfig';\nimport { initApp } from './appUtils';\nexport function initBackgroundApp(initFn) {\n function main() {\n if (Array.isArray(initFn)) {\n initFn.forEach(callback => callback());\n }\n else {\n initFn();\n }\n }\n initApp(main);\n}\nexport const getOrCreateBackgroundApp = (refreshToken) => {\n if (window.LeadinBackgroundApp) {\n return window.LeadinBackgroundApp;\n }\n const { IntegratedAppEmbedder, IntegratedAppOptions } = window;\n const options = new IntegratedAppOptions()\n .setLocale(locale)\n .setDeviceId(deviceId)\n .setRefreshToken(refreshToken);\n const embedder = new IntegratedAppEmbedder('integrated-plugin-proxy', portalId, hubspotBaseUrl, () => { }).setOptions(options);\n embedder.attachTo(document.body, false);\n embedder.postStartAppMessage(); // lets the app know all all data has been passed to it\n window.LeadinBackgroundApp = embedder;\n return window.LeadinBackgroundApp;\n};\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = '' + args.join(' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg = 'Assertion failed: ' + (args.slice(1).join(' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isObject = utils.isObject;\nvar isErrorEvent = utils.isErrorEvent;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n collectWindowErrors: true,\n maxMessageLength: 0,\n\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.19.1',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = undefined;\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} func A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped already\n // for both debugging and to prevent it to being wrapped twice\n wrapped.__raven__ = true;\n wrapped.__inner__ = func;\n\n return wrapped;\n },\n\n /*\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._restoreBuiltIns();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /*\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n // Cases for sending ex as a message, rather than an exception\n var isNotError = !isError(ex);\n var isNotErrorEvent = !isErrorEvent(ex);\n var isErrorEventWithoutError = isErrorEvent(ex) && !ex.error;\n\n if ((isNotError && isNotErrorEvent) || isErrorEventWithoutError) {\n return this.captureMessage(\n ex,\n objectMerge(\n {\n trimHeadFrames: 1,\n stacktrace: true // if we fall back to captureMessage, default to attempting a new trace\n },\n options\n )\n );\n }\n\n // Get actual Error from ErrorEvent\n if (isErrorEvent(ex)) ex = ex.error;\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n\n var data = objectMerge(\n {\n message: msg + '' // Make sure it's actually a string\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = stack.stack[1];\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n if (this._globalOptions.stacktrace || (options && options.stacktrace)) {\n options = objectMerge(\n {\n // fingerprint on msg, not stack trace (legacy behavior, could be\n // revisited)\n fingerprint: msg,\n // since we know this is a synthetic trace, the top N-most frames\n // MUST be from Raven.js, so mark them as in_app later by setting\n // trimHeadFrames\n trimHeadFrames: (options.trimHeadFrames || 0) + 1\n },\n options\n );\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = options || {};\n\n var lastEventId = options.eventId || this.lastEventId();\n if (!lastEventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n var dsn = options.dsn || this._dsn;\n if (!dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var qs = '';\n qs += '?eventId=' + encode(lastEventId);\n qs += '&dsn=' + encode(dsn);\n\n var user = options.user || this._globalContext.user;\n if (user) {\n if (user.name) qs += '&name=' + encode(user.name);\n if (user.email) qs += '&email=' + encode(user.email);\n }\n\n var globalServer = this._getGlobalServer(this._parseDSN(dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/' + qs;\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(originalCallback);\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(fn.handleEvent);\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(fn, undefined, before),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(self.wrap(cb));\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(orig);\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function(data) {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(orig, undefined, onreadystatechangeHandler);\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && 'fetch' in _window) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return origFetch.apply(this, args).then(function(response) {\n fetchData.status_code = response.status;\n\n return response;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n history.pushState &&\n history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function() {\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo.apply(this, arguments);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n culprit: fileurl\n },\n options\n );\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': navigator.userAgent\n };\n }\n\n if (this._hasDocument) {\n if (_document.location && _document.location.href) {\n httpData.url = _document.location.href;\n }\n if (_document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.culprit !== last.culprit // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n retry = request.getResponseHeader('Retry-After');\n retry = parseInt(retry, 10) * 1000; // Retry-After is returned in seconds\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n // If there are no tags/extra, strip the key from the payload alltogther.\n if (isEmptyObject(data.tags)) delete data.tags;\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n var url = opts.url;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n // NOTE: auth is intentionally sent as part of query string (NOT as custom\n // HTTP header) so as to avoid preflight CORS requests\n request.open('POST', url + '?' + urlencode(opts.auth));\n request.send(stringify(opts.data));\n },\n\n _logDebug: function(level) {\n if (this._originalConsoleMethods[level] && this.debug) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n","var _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch ({}.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return supportsErrorEvent() && {}.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isEmptyObject(what) {\n for (var _ in what) return false; // eslint-disable-line guard-for-in, no-unused-vars\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n return !max || str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n if (!match) return {};\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n var orig = obj[name];\n obj[name] = replacement(orig);\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isString: isString,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n return document.location.href;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} message Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(message, url, lineNo, colNo, ex) {\n var stack = null;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (ex && utils.isError(ex)) {\n // non-string `ex` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(ex);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var msg = message; // must be new var or will modify original `arguments`\n var groups;\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n msg = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: msg,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,\n gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\\[native).*?|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i,\n winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n // Used to additionally parse URL/line/column from eval frames\n geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i,\n chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/,\n lines = ex.stack.split('\\n'),\n stack = [],\n submatch,\n parts,\n element,\n reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","module.exports = window[\"jQuery\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import $ from 'jquery';\nimport { getOrCreateBackgroundApp, initBackgroundApp, } from '../utils/backgroundAppUtils';\nimport { domElements } from '../constants/selectors';\nimport { refreshToken, activationTime } from '../constants/leadinConfig';\nimport { ProxyMessages } from '../iframe/integratedMessages';\nconst REVIEW_BANNER_INTRO_PERIOD_DAYS = 15;\nconst userIsAfterIntroductoryPeriod = () => {\n const activationDate = new Date(+activationTime * 1000);\n const currentDate = new Date();\n const timeElapsed = new Date(currentDate.getTime() - activationDate.getTime());\n return timeElapsed.getUTCDate() - 1 >= REVIEW_BANNER_INTRO_PERIOD_DAYS;\n};\n/**\n * Adds some methods to window when review banner is\n * displayed to monitor events\n */\nexport function initMonitorReviewBanner() {\n if (refreshToken) {\n const embedder = getOrCreateBackgroundApp(refreshToken);\n const container = $(domElements.reviewBannerContainer);\n if (container && userIsAfterIntroductoryPeriod()) {\n $(domElements.reviewBannerLeaveReviewLink)\n .off('click')\n .on('click', () => {\n embedder.postMessage({\n key: ProxyMessages.TrackReviewBannerInteraction,\n });\n });\n $(domElements.reviewBannerDismissButton)\n .off('click')\n .on('click', () => {\n embedder.postMessage({\n key: ProxyMessages.TrackReviewBannerDismissed,\n });\n });\n embedder\n .postAsyncMessage({\n key: ProxyMessages.FetchContactsCreateSinceActivation,\n payload: +activationTime * 1000,\n })\n .then(({ total }) => {\n if (total >= 5) {\n container.removeClass('leadin-review-banner--hide');\n embedder.postMessage({\n key: ProxyMessages.TrackReviewBannerRender,\n });\n }\n });\n }\n }\n}\ninitBackgroundApp(initMonitorReviewBanner);\n"],"names":["window","leadinConfig","accountName","adminUrl","activationTime","connectionStatus","deviceId","didDisconnect","env","formsScript","meetingsScript","formsScriptPayload","hublet","hubspotBaseUrl","hubspotNonce","iframeUrl","impactLink","lastAuthorizeTime","lastDeauthorizeTime","lastDisconnectTime","leadinPluginVersion","leadinQueryParams","locale","loginUrl","phpVersion","pluginPath","plugins","portalDomain","portalEmail","portalId","redirectNonce","restNonce","restUrl","refreshToken","reviewSkippedDate","theme","trackConsent","wpVersion","contentEmbed","requiresContentEmbedScope","refreshTokenError","domElements","iframe","subMenu","subMenuLinks","subMenuButtons","deactivatePluginButton","deactivateFeedbackForm","deactivateFeedbackSubmit","deactivateFeedbackSkip","thickboxModalClose","thickboxModalWindow","thickboxModalContent","reviewBannerContainer","reviewBannerLeaveReviewLink","reviewBannerDismissButton","leadinIframeContainer","leadinIframe","leadinIframeFallbackContainer","CoreMessages","HandshakeReceive","SendRefreshToken","ReloadParentFrame","RedirectParentFrame","SendLocale","SendDeviceId","SendIntegratedAppConfig","FormMessages","CreateFormAppNavigation","LiveChatMessages","CreateLiveChatAppNavigation","PluginMessages","PluginSettingsNavigation","PluginLeadinConfig","TrackConsent","InternalTrackingFetchRequest","InternalTrackingFetchResponse","InternalTrackingFetchError","InternalTrackingChangeRequest","InternalTrackingChangeError","BusinessUnitFetchRequest","BusinessUnitFetchResponse","BusinessUnitFetchError","BusinessUnitChangeRequest","BusinessUnitChangeError","SkipReviewRequest","SkipReviewResponse","SkipReviewError","RemoveParentQueryParam","ContentEmbedInstallRequest","ContentEmbedInstallResponse","ContentEmbedInstallError","ContentEmbedActivationRequest","ContentEmbedActivationResponse","ContentEmbedActivationError","ProxyMessages","FetchForms","FetchForm","CreateFormFromTemplate","FetchAuth","FetchMeetingsAndUsers","FetchContactsCreateSinceActivation","FetchOrCreateMeetingUser","ConnectMeetingsCalendar","TrackFormPreviewRender","TrackFormCreatedFromTemplate","TrackFormCreationFailed","TrackMeetingPreviewRender","TrackSidebarMetaChange","TrackReviewBannerRender","TrackReviewBannerInteraction","TrackReviewBannerDismissed","TrackPluginDeactivation","Raven","configureRaven","indexOf","config","instrument","tryCatch","release","install","setTagsContext","v","php","wordpress","setExtraContext","hub","Object","keys","map","name","join","$","initApp","initFn","context","initAppOnReady","main","initBackgroundApp","Array","isArray","forEach","callback","getOrCreateBackgroundApp","LeadinBackgroundApp","IntegratedAppEmbedder","IntegratedAppOptions","options","setLocale","setDeviceId","setRefreshToken","embedder","setOptions","attachTo","document","body","postStartAppMessage","REVIEW_BANNER_INTRO_PERIOD_DAYS","userIsAfterIntroductoryPeriod","activationDate","Date","currentDate","timeElapsed","getTime","getUTCDate","initMonitorReviewBanner","container","off","on","postMessage","key","postAsyncMessage","payload","then","total","removeClass"],"sourceRoot":""} \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/changelog.txt b/wp/wp-content/plugins/leadin/changelog.txt deleted file mode 100644 index a3ac9c8a..00000000 --- a/wp/wp-content/plugins/leadin/changelog.txt +++ /dev/null @@ -1,305 +0,0 @@ -= 11.1.21 (2024-06-04) = -* Improve load performance by removing redundant retry logic - -= 11.1.20 (2024-05-31) = -* Remove extra logs - -= 11.1.19 (2024-05-31) = -* Add AppIntegrationConfig - -= 11.1.18 (2024-05-30) = -* Add default value in connection process - -= 11.1.15 (2024-05-30) = -* Revert breaking changes in 11.1.13 related to the oauth connection - -= 11.1.14 (2024-05-30) = -* Add apiVersion to gutenberg blocks - -= 11.1.13 (2024-05-23) = -* Add error labels for connection process - -= 11.1.11 (2024-05-16) = -* Add another field to integrated app config - -= 11.1.10 (2024-05-15) = -* fix race condition with our Elementor widgets which would occasionally prevent them from loading. - -= 11.1.9 (2024-05-15) = -* Add extra data to integrated app config - -= 11.1.5 (2024-04-19) = -* Pushing new plugin version with tagging mechanism working correctly. - -= 11.1.3 (2024-04-17) = -* Optimize metadata update on connection - -= 11.1.0 (2024-04-16) = -* Addressing issue with our SVN tagging - -= 11.0.57 (2024-04-16) = -* Update logic that is used to disable blocks in the full site editor - -= 11.0.55 (2024-04-12) = -* Remove support for full site editor for forms and meetings blocks - -= 11.0.37 (2024-04-10) = -* Fix translation keys - -= 11.0.36 (2024-04-09) = -* Refactor connection function and add extra leadin config - -= 11.0.32 (2024-03-27) = -* Update the gutenberg save blocks for wordpress customizer compatibility - -= 11.0.28 (2024-03-22) = -* Fix for the HubSpot gutenberg blogs rendered in the wordpress customizer context - -= 11.0.23 (2024-03-14) = -* Fix error when adding the wordpress sidebar - -= 11.0.15 (2024-03-13) = -* Add better error logging - -= 11.0.9 (2024-03-12) = -* Translations fixed - -= 11.0.8 (2024-03-04) = -* Update review banner display logic - -= 11.0.5 (2024-02-29) = -* Adds ability to delete query param from embedded app - -= 11.0.4 (2024-02-26) = -* Adds version info to leadin config - -= 11.0.3 (2024-02-20) = -* Remove unnecessary "type" attribute from javascript resources - -= 11.0.0 (2024-02-13) = -* Fix locale bug -* Integrated Plugin App embedder -* Remove 3rd party cookies dependency - -= 10.2.23 (2024-01-24) = -* Update link of the review survey - -= 10.2.17 (2023-12-13) = -* Change minimum required version in plugin listing - -= 10.2.14 (2023-11-15) = -* Remove deprecated block_categories method - -= 10.2.13 (2023-11-13) = -* Bump WP tested version and fix feedback banner show up condition - -= 10.2.3 (2023-08-23) = -* Sets device id in embedder options - -= 10.2.0 (2023-08-09) = -* Live chat app embedder - -= 10.1.30 (2023-07-24) = -* Updated readme - -= 10.1.28 (2023-07-11) = -* Removes unused jQuery dependency - -= 10.1.24 (2023-05-31) = -* Add Norwegian language support - -= 10.1.23 (2023-05-17) = -* Fixed form creation by template - -= 10.1.16 (2023-04-11) = -* Updated tested up to WordPress version and HubSpot video - -= 10.1.13 (2023-03-30) = -* Add url sanitizing for meetings shortcode - -= 10.1.0 (2023-03-08) = -* Forms app embedder - -= 10.0.24 (2023-03-07) = -* Change font type - -= 10.0.21 (2023-02-20) = -* Content type default selection for elementor - -= 10.0.18 (2023-01-20) = -* Add business unit proxy - -= 10.0.17 (2023-01-19) = -* Add loader animation to prevent blank screen - -= 10.0.7 (2023-01-10) = -* Remove getHublet endpoint - -= 10.0.0 (2023-01-06) = -* Plugin restructure to use WordPress env and scripts - -= 9.2.26 (2022-12-08) = -* Update feedback survey link - -= 9.2.0 (2022-12-01) = -* Add support for Business Units - -= 9.1.0 (2022-11-30) = -* Make list link external - -= 9.0.499 (2022-11-25) = -* Fix custom post type validation for sidebar - -= 9.0.497 (2022-11-24) = -* Added fallback page if iframe is blocked - -= 9.0.469 (2022-11-21) = -* Replace null parameter for http_build_query method - -= 9.0.432 (2022-11-17) = -* Migrate to TypeScript - -= 9.0.405 (2022-11-14) = -* Add validation to metadata access - -= 9.0.387 (2022-11-01) = -* Use WP set script translations - -= 9.0.365 (2022-10-28) = -* Move ajax to rest endpoints - -= 9.0.320 (2022-10-24) = -* Make report link external - -= 9.0.311 (2022-10-21) = -* Fix for form select sometimes not working in form Gutenberg block - -= 9.0.272 (2022-10-12) = -* Fix for Penpal to connect to correct child when Impact Link is present - -= 9.0.108 (2022-09-14) = -* Enqueue Meetings script - -= 9.0.91 (2022-09-13) = -* Changed the placeholder text for form blocks - -= 9.0.77 (2022-09-12) = -* Change review link to external survey - -= 9.0.74 (2022-09-09) = -* Add filter to pass additional query parameters to iframe - -= 9.0.72 (2022-09-09) = -* Prevent sidebar from rendering when not post or page - -= 9.0.20 (2022-08-30) = -* Remove tests folder and composer.phar file - -= 9.0.0 (2022-08-29) = -* Added HusbSpot Elementor widgets - -= 8.16.25 (2022-08-19) = -* Fixes the headers missing issue by tying the script with a hook - -= 8.16.6 (2022-08-17) = -* Revert changes for open upgrade link in new tab - -= 8.16.5 (2022-08-17) = -* Removed newline before/after php tag - -= 8.16.2 (2022-08-17) = -* Fixes the headers already sent error - -= 8.16.0 (2022-08-17) = -* Made upgrade link open up in a new tab instead of the iframe - -= 8.15.139 (2022-08-04) = -* Fix for content type customization - -= 8.15.65 (2022-07-22) = -* Fix encode URL for affiliate link - -= 8.15.36 (2022-07-19) = -* Add validation for content type in meta data - -= 8.15.0 (2022-07-15) = -* Add hubspot sidebar to set content type - -= 8.14.24 (2022-07-15) = -* Add fallback for affiliate link -* Increase WP tested up to version - -= 8.14.0 (2022-07-13) = -* Add Meetings gutenberg block - -= 8.13.56 (2022-06-10) = -* Use new script to render forms - -= 8.13.52 (2022-06-09) = -* Add defer to forms script - -= 8.13.45 (2022-06-08) = -* Remove char from proxy url - -= 8.13.39 (2022-06-07) = -* Add tracking of events in review banner - -= 8.13.0 (2022-06-01) = -* Add validation to connect method - -= 8.12.33 (2022-05-27) = -* Replaced some whitelisted URLs with regex - -= 8.12.0 (2022-05-24) = -* Added Gutenberg block preview image - -= 8.11.221 (2022-05-24) = -* Update dependencies - -= 8.11.150 (2022-05-13) = -* Update build steps - -= 8.11.0 (2022-04-27) = -* Add option to disable HS analytics tracking for internal WP users - -= 8.10.25 (2022-04-25) = -* Fix Gutenberg block breaking after user disconnects plugin - -= 8.10.0 (2022-04-21) = -* Add templates options to gutenberg form - -= 8.9.22 (2022-04-13) = -* Prevent script to be loaded while Elementor Edit mode is on/or admin - -= 8.9.20 (2022-04-13) = -* Fix security issue related to sanitizing inputs - -= 8.9.14 (2022-04-12) = -* Fix security issue related to form inputs - -= 8.9.0 (2022-04-11) = -* Add api that gets the correct hublet - -= 8.8.15 (2022-04-07) = -* Fix security issue related to proxy URL - -= 8.8.13 (2022-04-07) = -* Whitelist proxy paths - -= 8.8.0 (2022-04-06) = -* Add api that updates hublet -* Add api to track user consent - -= 8.7.5 (2022-03-14) = -* Always add utm params to iframe - -= 8.7.0 (2022-03-11) = -* Validations to when show the review banner -* Add banner to ask the user to leave a review - -= 8.6.0 (2022-03-09) = -* Add banner to ask the user to leave a review - -= 8.5.50 (2022-02-22) = -* Increase WP tested up to version - diff --git a/wp/wp-content/plugins/leadin/languages/leadin-da_DK.mo b/wp/wp-content/plugins/leadin/languages/leadin-da_DK.mo deleted file mode 100644 index 16fda892..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-da_DK.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-da_DK.po b/wp/wp-content/plugins/leadin/languages/leadin-da_DK.po deleted file mode 100644 index b19a9e7f..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-da_DK.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Vi er ked af, at du forlader os" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Hvis du har et øjeblik, mĂĄ du endelig fortælle os, hvorfor du deaktiverer dette plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Jeg kan ikke tilmelde mig eller logge pĂĄ" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Dette plugin pĂĄvirker webstedets performance" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Dette plugin virker ikke" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Dette plugin er ikke nyttigt" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Midlertidig deaktivering eller fejlfinding" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Andet" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Indsend og deaktiver" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Spring over og deaktiver" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Vælg den indholdstype, som HubSpot Analytics bruger til at spore denne side." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Slet automatisk" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blogindlæg" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Vidensartikel" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landingsside" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Listeside" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standardside" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Brugervejledning" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formularer" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Direkte chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Kontakter" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Lister" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Rapportering" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Indstillinger" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Opgradering" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot All-In-One Marketing %1$s kræver PHP %2$s eller højere. Opgrader WordPress først." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "Dette HubSpot-plugin er ikke tilsluttet lige nu. Hvis du vil bruge HubSpot-værktøjer pĂĄ dit WordPress-websted, skal du %1$stilslutte plugin'et nu%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Afvis denne meddelelse." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hej %1$s" - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Har du 2 minutter til at udfylde %1$sdenne undersøgelse %2$som HubSpot for WordPress-plugin?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Vi læser alle svar. Din feedback hjælper vores team med at foretage de forbedringer, som du har mest brug for." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot for WordPress-team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Tak" - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Giv en anmeldelse | link ĂĄbner pĂĄ en ny fane" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formular" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Mødeplanlægger" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-de_AT.mo b/wp/wp-content/plugins/leadin/languages/leadin-de_AT.mo deleted file mode 100644 index cd5ccace..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-de_AT.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-de_AT.po b/wp/wp-content/plugins/leadin/languages/leadin-de_AT.po deleted file mode 100644 index 184eb430..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-de_AT.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Es ist schade, dass Sie uns verlassen." - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Wenn Sie einen Moment Zeit haben, teilen Sie uns bitte mit, warum Sie das Plugin deaktivieren." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Ich kann mich nicht registrieren oder anmelden" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Das Plugin wirkt sich auf die Performance der Website aus" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Das Plugin funktioniert nicht." - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Das Plugin ist nicht praktisch." - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "VorĂĽbergehende Deaktivierung oder Fehlerbehebung" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Sonstige" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback ..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Senden und deaktivieren" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Ăśberspringen und deaktivieren" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Wählen Sie den Content-Typ aus, den HubSpot Analytics zum Nachverfolgen dieser Seite verwendet." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Automatisch erkennen" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blog-Beitrag" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Wissensdatenbankartikel" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landingpage" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Listing-Seite" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standardseite" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Benutzeranleitung" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formulare" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Livechat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Kontaktdatensätze" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-Mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listen" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Berichterstattung" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Einstellungen" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgraden" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "Das All-in-one-Marketing-Plug-in %1$s erfordert PHP %2$s oder höher. Bitte aktualisieren Sie zuerst WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "Das HubSpot-Plug-in ist momentan nicht verknĂĽpft. %1$sVerknĂĽpfen Sie jetzt das Plug-in%2$s, um HubSpot-Tools auf Ihrer WordPress-Website zu verwenden." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorieren Sie diesen Hinweis." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hallo %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Haben Sie 2 Minuten Zeit, um an %1$sdieser Umfrage%2$s zum HubSpot Plugin fĂĽr WordPress teilzunehmen?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Wir lesen jede Antwort. Ihr Feedback hilft unserem Team, die Verbesserungen vorzunehmen, die Sie am meisten benötigen." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot fĂĽr WordPress-Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Danke," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Hinterlassen Sie uns eine Bewertung | Link wird in einem neuen Tab geöffnet" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formular" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Meeting-Planer" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-de_CH_informal.mo b/wp/wp-content/plugins/leadin/languages/leadin-de_CH_informal.mo deleted file mode 100644 index cd5ccace..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-de_CH_informal.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-de_CH_informal.po b/wp/wp-content/plugins/leadin/languages/leadin-de_CH_informal.po deleted file mode 100644 index 184eb430..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-de_CH_informal.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Es ist schade, dass Sie uns verlassen." - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Wenn Sie einen Moment Zeit haben, teilen Sie uns bitte mit, warum Sie das Plugin deaktivieren." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Ich kann mich nicht registrieren oder anmelden" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Das Plugin wirkt sich auf die Performance der Website aus" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Das Plugin funktioniert nicht." - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Das Plugin ist nicht praktisch." - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "VorĂĽbergehende Deaktivierung oder Fehlerbehebung" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Sonstige" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback ..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Senden und deaktivieren" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Ăśberspringen und deaktivieren" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Wählen Sie den Content-Typ aus, den HubSpot Analytics zum Nachverfolgen dieser Seite verwendet." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Automatisch erkennen" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blog-Beitrag" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Wissensdatenbankartikel" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landingpage" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Listing-Seite" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standardseite" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Benutzeranleitung" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formulare" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Livechat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Kontaktdatensätze" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-Mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listen" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Berichterstattung" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Einstellungen" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgraden" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "Das All-in-one-Marketing-Plug-in %1$s erfordert PHP %2$s oder höher. Bitte aktualisieren Sie zuerst WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "Das HubSpot-Plug-in ist momentan nicht verknĂĽpft. %1$sVerknĂĽpfen Sie jetzt das Plug-in%2$s, um HubSpot-Tools auf Ihrer WordPress-Website zu verwenden." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorieren Sie diesen Hinweis." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hallo %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Haben Sie 2 Minuten Zeit, um an %1$sdieser Umfrage%2$s zum HubSpot Plugin fĂĽr WordPress teilzunehmen?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Wir lesen jede Antwort. Ihr Feedback hilft unserem Team, die Verbesserungen vorzunehmen, die Sie am meisten benötigen." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot fĂĽr WordPress-Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Danke," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Hinterlassen Sie uns eine Bewertung | Link wird in einem neuen Tab geöffnet" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formular" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Meeting-Planer" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-de_DE.mo b/wp/wp-content/plugins/leadin/languages/leadin-de_DE.mo deleted file mode 100644 index cd5ccace..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-de_DE.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-de_DE.po b/wp/wp-content/plugins/leadin/languages/leadin-de_DE.po deleted file mode 100644 index 184eb430..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-de_DE.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Es ist schade, dass Sie uns verlassen." - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Wenn Sie einen Moment Zeit haben, teilen Sie uns bitte mit, warum Sie das Plugin deaktivieren." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Ich kann mich nicht registrieren oder anmelden" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Das Plugin wirkt sich auf die Performance der Website aus" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Das Plugin funktioniert nicht." - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Das Plugin ist nicht praktisch." - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "VorĂĽbergehende Deaktivierung oder Fehlerbehebung" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Sonstige" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback ..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Senden und deaktivieren" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Ăśberspringen und deaktivieren" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Wählen Sie den Content-Typ aus, den HubSpot Analytics zum Nachverfolgen dieser Seite verwendet." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Automatisch erkennen" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blog-Beitrag" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Wissensdatenbankartikel" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landingpage" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Listing-Seite" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standardseite" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Benutzeranleitung" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formulare" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Livechat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Kontaktdatensätze" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-Mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listen" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Berichterstattung" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Einstellungen" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgraden" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "Das All-in-one-Marketing-Plug-in %1$s erfordert PHP %2$s oder höher. Bitte aktualisieren Sie zuerst WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "Das HubSpot-Plug-in ist momentan nicht verknĂĽpft. %1$sVerknĂĽpfen Sie jetzt das Plug-in%2$s, um HubSpot-Tools auf Ihrer WordPress-Website zu verwenden." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorieren Sie diesen Hinweis." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hallo %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Haben Sie 2 Minuten Zeit, um an %1$sdieser Umfrage%2$s zum HubSpot Plugin fĂĽr WordPress teilzunehmen?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Wir lesen jede Antwort. Ihr Feedback hilft unserem Team, die Verbesserungen vorzunehmen, die Sie am meisten benötigen." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot fĂĽr WordPress-Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Danke," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Hinterlassen Sie uns eine Bewertung | Link wird in einem neuen Tab geöffnet" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formular" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Meeting-Planer" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-de_DE_formal.mo b/wp/wp-content/plugins/leadin/languages/leadin-de_DE_formal.mo deleted file mode 100644 index cd5ccace..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-de_DE_formal.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-de_DE_formal.po b/wp/wp-content/plugins/leadin/languages/leadin-de_DE_formal.po deleted file mode 100644 index 184eb430..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-de_DE_formal.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Es ist schade, dass Sie uns verlassen." - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Wenn Sie einen Moment Zeit haben, teilen Sie uns bitte mit, warum Sie das Plugin deaktivieren." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Ich kann mich nicht registrieren oder anmelden" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Das Plugin wirkt sich auf die Performance der Website aus" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Das Plugin funktioniert nicht." - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Das Plugin ist nicht praktisch." - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "VorĂĽbergehende Deaktivierung oder Fehlerbehebung" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Sonstige" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback ..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Senden und deaktivieren" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Ăśberspringen und deaktivieren" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Wählen Sie den Content-Typ aus, den HubSpot Analytics zum Nachverfolgen dieser Seite verwendet." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Automatisch erkennen" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blog-Beitrag" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Wissensdatenbankartikel" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landingpage" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Listing-Seite" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standardseite" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Benutzeranleitung" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formulare" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Livechat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Kontaktdatensätze" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-Mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listen" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Berichterstattung" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Einstellungen" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgraden" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "Das All-in-one-Marketing-Plug-in %1$s erfordert PHP %2$s oder höher. Bitte aktualisieren Sie zuerst WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "Das HubSpot-Plug-in ist momentan nicht verknĂĽpft. %1$sVerknĂĽpfen Sie jetzt das Plug-in%2$s, um HubSpot-Tools auf Ihrer WordPress-Website zu verwenden." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorieren Sie diesen Hinweis." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hallo %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Haben Sie 2 Minuten Zeit, um an %1$sdieser Umfrage%2$s zum HubSpot Plugin fĂĽr WordPress teilzunehmen?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Wir lesen jede Antwort. Ihr Feedback hilft unserem Team, die Verbesserungen vorzunehmen, die Sie am meisten benötigen." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot fĂĽr WordPress-Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Danke," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Hinterlassen Sie uns eine Bewertung | Link wird in einem neuen Tab geöffnet" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formular" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Meeting-Planer" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en.mo b/wp/wp-content/plugins/leadin/languages/leadin-en.mo deleted file mode 100644 index d6c9394b..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-en.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en.po b/wp/wp-content/plugins/leadin/languages/leadin-en.po deleted file mode 100644 index 7005594f..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-en.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "We're sorry to see you go" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "If you have a moment, please let us know why you're deactivating the plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "I can't sign up or log in" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "The plugin is impacting website performance" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "The plugin isn't working" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "The plugin isn't useful" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Temporarily disabling or troubleshooting" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Other" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Submit & deactivate" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Skip & deactivate" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Select the content type HubSpot Analytics uses to track this page." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detect Automatically" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blog Post" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Knowledge Article" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing Page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Listing Page" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standard Page" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "User Guide" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Forms" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live Chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Contacts" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Email" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Lists" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Reporting" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Settings" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgrade" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher. Please upgrade WordPress first." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "The HubSpot plugin is not connected right now. To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Dismiss this notice." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hey %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "We read every response. Your feedback helps our team make the improvements that you need the most." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot for WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Thanks," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Leave us a review | link opens in a new tab" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Form" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Meetings Scheduler" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en_AU.mo b/wp/wp-content/plugins/leadin/languages/leadin-en_AU.mo deleted file mode 100644 index d6c9394b..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-en_AU.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en_AU.po b/wp/wp-content/plugins/leadin/languages/leadin-en_AU.po deleted file mode 100644 index 7005594f..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-en_AU.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "We're sorry to see you go" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "If you have a moment, please let us know why you're deactivating the plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "I can't sign up or log in" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "The plugin is impacting website performance" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "The plugin isn't working" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "The plugin isn't useful" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Temporarily disabling or troubleshooting" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Other" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Submit & deactivate" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Skip & deactivate" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Select the content type HubSpot Analytics uses to track this page." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detect Automatically" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blog Post" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Knowledge Article" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing Page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Listing Page" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standard Page" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "User Guide" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Forms" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live Chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Contacts" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Email" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Lists" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Reporting" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Settings" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgrade" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher. Please upgrade WordPress first." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "The HubSpot plugin is not connected right now. To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Dismiss this notice." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hey %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "We read every response. Your feedback helps our team make the improvements that you need the most." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot for WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Thanks," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Leave us a review | link opens in a new tab" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Form" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Meetings Scheduler" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en_CA.mo b/wp/wp-content/plugins/leadin/languages/leadin-en_CA.mo deleted file mode 100644 index d6c9394b..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-en_CA.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en_CA.po b/wp/wp-content/plugins/leadin/languages/leadin-en_CA.po deleted file mode 100644 index 7005594f..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-en_CA.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "We're sorry to see you go" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "If you have a moment, please let us know why you're deactivating the plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "I can't sign up or log in" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "The plugin is impacting website performance" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "The plugin isn't working" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "The plugin isn't useful" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Temporarily disabling or troubleshooting" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Other" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Submit & deactivate" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Skip & deactivate" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Select the content type HubSpot Analytics uses to track this page." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detect Automatically" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blog Post" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Knowledge Article" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing Page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Listing Page" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standard Page" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "User Guide" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Forms" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live Chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Contacts" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Email" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Lists" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Reporting" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Settings" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgrade" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher. Please upgrade WordPress first." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "The HubSpot plugin is not connected right now. To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Dismiss this notice." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hey %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "We read every response. Your feedback helps our team make the improvements that you need the most." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot for WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Thanks," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Leave us a review | link opens in a new tab" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Form" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Meetings Scheduler" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en_GB.mo b/wp/wp-content/plugins/leadin/languages/leadin-en_GB.mo deleted file mode 100644 index d6c9394b..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-en_GB.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en_GB.po b/wp/wp-content/plugins/leadin/languages/leadin-en_GB.po deleted file mode 100644 index 7005594f..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-en_GB.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "We're sorry to see you go" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "If you have a moment, please let us know why you're deactivating the plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "I can't sign up or log in" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "The plugin is impacting website performance" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "The plugin isn't working" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "The plugin isn't useful" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Temporarily disabling or troubleshooting" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Other" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Submit & deactivate" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Skip & deactivate" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Select the content type HubSpot Analytics uses to track this page." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detect Automatically" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blog Post" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Knowledge Article" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing Page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Listing Page" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standard Page" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "User Guide" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Forms" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live Chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Contacts" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Email" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Lists" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Reporting" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Settings" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgrade" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher. Please upgrade WordPress first." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "The HubSpot plugin is not connected right now. To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Dismiss this notice." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hey %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "We read every response. Your feedback helps our team make the improvements that you need the most." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot for WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Thanks," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Leave us a review | link opens in a new tab" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Form" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Meetings Scheduler" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en_NZ.mo b/wp/wp-content/plugins/leadin/languages/leadin-en_NZ.mo deleted file mode 100644 index d6c9394b..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-en_NZ.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en_NZ.po b/wp/wp-content/plugins/leadin/languages/leadin-en_NZ.po deleted file mode 100644 index 7005594f..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-en_NZ.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "We're sorry to see you go" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "If you have a moment, please let us know why you're deactivating the plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "I can't sign up or log in" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "The plugin is impacting website performance" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "The plugin isn't working" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "The plugin isn't useful" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Temporarily disabling or troubleshooting" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Other" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Submit & deactivate" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Skip & deactivate" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Select the content type HubSpot Analytics uses to track this page." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detect Automatically" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blog Post" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Knowledge Article" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing Page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Listing Page" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standard Page" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "User Guide" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Forms" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live Chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Contacts" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Email" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Lists" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Reporting" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Settings" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgrade" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher. Please upgrade WordPress first." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "The HubSpot plugin is not connected right now. To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Dismiss this notice." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hey %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "We read every response. Your feedback helps our team make the improvements that you need the most." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot for WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Thanks," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Leave us a review | link opens in a new tab" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Form" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Meetings Scheduler" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en_US.mo b/wp/wp-content/plugins/leadin/languages/leadin-en_US.mo deleted file mode 100644 index d6c9394b..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-en_US.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en_US.po b/wp/wp-content/plugins/leadin/languages/leadin-en_US.po deleted file mode 100644 index 7005594f..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-en_US.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "We're sorry to see you go" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "If you have a moment, please let us know why you're deactivating the plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "I can't sign up or log in" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "The plugin is impacting website performance" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "The plugin isn't working" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "The plugin isn't useful" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Temporarily disabling or troubleshooting" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Other" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Submit & deactivate" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Skip & deactivate" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Select the content type HubSpot Analytics uses to track this page." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detect Automatically" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blog Post" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Knowledge Article" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing Page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Listing Page" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standard Page" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "User Guide" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Forms" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live Chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Contacts" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Email" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Lists" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Reporting" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Settings" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgrade" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher. Please upgrade WordPress first." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "The HubSpot plugin is not connected right now. To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Dismiss this notice." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hey %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "We read every response. Your feedback helps our team make the improvements that you need the most." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot for WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Thanks," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Leave us a review | link opens in a new tab" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Form" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Meetings Scheduler" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en_ZA.mo b/wp/wp-content/plugins/leadin/languages/leadin-en_ZA.mo deleted file mode 100644 index d6c9394b..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-en_ZA.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-en_ZA.po b/wp/wp-content/plugins/leadin/languages/leadin-en_ZA.po deleted file mode 100644 index 7005594f..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-en_ZA.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "We're sorry to see you go" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "If you have a moment, please let us know why you're deactivating the plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "I can't sign up or log in" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "The plugin is impacting website performance" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "The plugin isn't working" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "The plugin isn't useful" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Temporarily disabling or troubleshooting" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Other" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Submit & deactivate" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Skip & deactivate" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Select the content type HubSpot Analytics uses to track this page." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detect Automatically" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blog Post" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Knowledge Article" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing Page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Listing Page" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standard Page" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "User Guide" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Forms" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live Chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Contacts" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Email" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Lists" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Reporting" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Settings" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgrade" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher. Please upgrade WordPress first." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "The HubSpot plugin is not connected right now. To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Dismiss this notice." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hey %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "We read every response. Your feedback helps our team make the improvements that you need the most." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot for WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Thanks," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Leave us a review | link opens in a new tab" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Form" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Meetings Scheduler" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_AR.mo b/wp/wp-content/plugins/leadin/languages/leadin-es_AR.mo deleted file mode 100644 index 51503d98..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-es_AR.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_AR.po b/wp/wp-content/plugins/leadin/languages/leadin-es_AR.po deleted file mode 100644 index de00face..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-es_AR.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Lamentamos verte partir" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Si tiene un momento, dĂ©janos saber por quĂ© estás desactivando el plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "No puedo registrarme ni iniciar sesiĂłn" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "El plugin está afectando el rendimiento del sitio web" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "El plugin no funciona" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "El plugin no es Ăştil" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Desactivar temporalmente o resolver problemas" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Otro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Enviar y desactivar" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Omitir y desactivar" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Seleccionar el tipo de contenido que HubSpot Analytics utiliza para hacer seguimiento a esta página." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detectar automáticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "PublicaciĂłn de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "ArtĂ­culo de conocimiento" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Páginas de Ă­ndice" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Página estándar" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "GuĂ­a del usuario" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formularios" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr " Contactos" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Correo" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listas" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Informes" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "ConfiguraciĂłn" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Adquirir versiĂłn superior" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot Marketing todo en uno %1$s requiere PHP %2$s o una ediciĂłn superior. Primero, cámbiate a una ediciĂłn superior de WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "El plugin de HubSpot no está conectado. %1$sConĂ©ctalo%2$s para usar las herramientas de HubSpot en tu portal de WordPress." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorar esta notificaciĂłn." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hola, %1$s:" - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "ÂżTienes 2 minutos para responder %1$sesta encuesta%2$s acerca del plugin de HubSpot para WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Leemos todas las respuestas. Tus comentarios ayudan a nuestro equipo a realizar las mejoras que más necesitas." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot para WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Gracias" - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "DĂ©janos tu opiniĂłn | el enlace se abre en una nueva pestaña" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulario" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Programador de reuniones" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_CL.mo b/wp/wp-content/plugins/leadin/languages/leadin-es_CL.mo deleted file mode 100644 index 51503d98..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-es_CL.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_CL.po b/wp/wp-content/plugins/leadin/languages/leadin-es_CL.po deleted file mode 100644 index de00face..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-es_CL.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Lamentamos verte partir" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Si tiene un momento, dĂ©janos saber por quĂ© estás desactivando el plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "No puedo registrarme ni iniciar sesiĂłn" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "El plugin está afectando el rendimiento del sitio web" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "El plugin no funciona" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "El plugin no es Ăştil" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Desactivar temporalmente o resolver problemas" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Otro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Enviar y desactivar" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Omitir y desactivar" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Seleccionar el tipo de contenido que HubSpot Analytics utiliza para hacer seguimiento a esta página." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detectar automáticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "PublicaciĂłn de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "ArtĂ­culo de conocimiento" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Páginas de Ă­ndice" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Página estándar" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "GuĂ­a del usuario" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formularios" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr " Contactos" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Correo" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listas" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Informes" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "ConfiguraciĂłn" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Adquirir versiĂłn superior" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot Marketing todo en uno %1$s requiere PHP %2$s o una ediciĂłn superior. Primero, cámbiate a una ediciĂłn superior de WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "El plugin de HubSpot no está conectado. %1$sConĂ©ctalo%2$s para usar las herramientas de HubSpot en tu portal de WordPress." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorar esta notificaciĂłn." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hola, %1$s:" - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "ÂżTienes 2 minutos para responder %1$sesta encuesta%2$s acerca del plugin de HubSpot para WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Leemos todas las respuestas. Tus comentarios ayudan a nuestro equipo a realizar las mejoras que más necesitas." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot para WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Gracias" - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "DĂ©janos tu opiniĂłn | el enlace se abre en una nueva pestaña" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulario" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Programador de reuniones" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_CO.mo b/wp/wp-content/plugins/leadin/languages/leadin-es_CO.mo deleted file mode 100644 index 51503d98..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-es_CO.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_CO.po b/wp/wp-content/plugins/leadin/languages/leadin-es_CO.po deleted file mode 100644 index de00face..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-es_CO.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Lamentamos verte partir" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Si tiene un momento, dĂ©janos saber por quĂ© estás desactivando el plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "No puedo registrarme ni iniciar sesiĂłn" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "El plugin está afectando el rendimiento del sitio web" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "El plugin no funciona" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "El plugin no es Ăştil" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Desactivar temporalmente o resolver problemas" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Otro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Enviar y desactivar" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Omitir y desactivar" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Seleccionar el tipo de contenido que HubSpot Analytics utiliza para hacer seguimiento a esta página." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detectar automáticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "PublicaciĂłn de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "ArtĂ­culo de conocimiento" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Páginas de Ă­ndice" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Página estándar" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "GuĂ­a del usuario" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formularios" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr " Contactos" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Correo" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listas" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Informes" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "ConfiguraciĂłn" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Adquirir versiĂłn superior" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot Marketing todo en uno %1$s requiere PHP %2$s o una ediciĂłn superior. Primero, cámbiate a una ediciĂłn superior de WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "El plugin de HubSpot no está conectado. %1$sConĂ©ctalo%2$s para usar las herramientas de HubSpot en tu portal de WordPress." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorar esta notificaciĂłn." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hola, %1$s:" - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "ÂżTienes 2 minutos para responder %1$sesta encuesta%2$s acerca del plugin de HubSpot para WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Leemos todas las respuestas. Tus comentarios ayudan a nuestro equipo a realizar las mejoras que más necesitas." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot para WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Gracias" - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "DĂ©janos tu opiniĂłn | el enlace se abre en una nueva pestaña" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulario" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Programador de reuniones" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_CR.mo b/wp/wp-content/plugins/leadin/languages/leadin-es_CR.mo deleted file mode 100644 index 51503d98..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-es_CR.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_CR.po b/wp/wp-content/plugins/leadin/languages/leadin-es_CR.po deleted file mode 100644 index de00face..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-es_CR.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Lamentamos verte partir" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Si tiene un momento, dĂ©janos saber por quĂ© estás desactivando el plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "No puedo registrarme ni iniciar sesiĂłn" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "El plugin está afectando el rendimiento del sitio web" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "El plugin no funciona" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "El plugin no es Ăştil" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Desactivar temporalmente o resolver problemas" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Otro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Enviar y desactivar" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Omitir y desactivar" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Seleccionar el tipo de contenido que HubSpot Analytics utiliza para hacer seguimiento a esta página." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detectar automáticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "PublicaciĂłn de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "ArtĂ­culo de conocimiento" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Páginas de Ă­ndice" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Página estándar" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "GuĂ­a del usuario" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formularios" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr " Contactos" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Correo" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listas" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Informes" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "ConfiguraciĂłn" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Adquirir versiĂłn superior" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot Marketing todo en uno %1$s requiere PHP %2$s o una ediciĂłn superior. Primero, cámbiate a una ediciĂłn superior de WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "El plugin de HubSpot no está conectado. %1$sConĂ©ctalo%2$s para usar las herramientas de HubSpot en tu portal de WordPress." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorar esta notificaciĂłn." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hola, %1$s:" - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "ÂżTienes 2 minutos para responder %1$sesta encuesta%2$s acerca del plugin de HubSpot para WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Leemos todas las respuestas. Tus comentarios ayudan a nuestro equipo a realizar las mejoras que más necesitas." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot para WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Gracias" - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "DĂ©janos tu opiniĂłn | el enlace se abre en una nueva pestaña" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulario" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Programador de reuniones" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_ES.mo b/wp/wp-content/plugins/leadin/languages/leadin-es_ES.mo deleted file mode 100644 index 51503d98..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-es_ES.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_ES.po b/wp/wp-content/plugins/leadin/languages/leadin-es_ES.po deleted file mode 100644 index de00face..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-es_ES.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Lamentamos verte partir" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Si tiene un momento, dĂ©janos saber por quĂ© estás desactivando el plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "No puedo registrarme ni iniciar sesiĂłn" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "El plugin está afectando el rendimiento del sitio web" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "El plugin no funciona" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "El plugin no es Ăştil" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Desactivar temporalmente o resolver problemas" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Otro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Enviar y desactivar" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Omitir y desactivar" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Seleccionar el tipo de contenido que HubSpot Analytics utiliza para hacer seguimiento a esta página." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detectar automáticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "PublicaciĂłn de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "ArtĂ­culo de conocimiento" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Páginas de Ă­ndice" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Página estándar" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "GuĂ­a del usuario" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formularios" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr " Contactos" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Correo" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listas" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Informes" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "ConfiguraciĂłn" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Adquirir versiĂłn superior" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot Marketing todo en uno %1$s requiere PHP %2$s o una ediciĂłn superior. Primero, cámbiate a una ediciĂłn superior de WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "El plugin de HubSpot no está conectado. %1$sConĂ©ctalo%2$s para usar las herramientas de HubSpot en tu portal de WordPress." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorar esta notificaciĂłn." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hola, %1$s:" - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "ÂżTienes 2 minutos para responder %1$sesta encuesta%2$s acerca del plugin de HubSpot para WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Leemos todas las respuestas. Tus comentarios ayudan a nuestro equipo a realizar las mejoras que más necesitas." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot para WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Gracias" - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "DĂ©janos tu opiniĂłn | el enlace se abre en una nueva pestaña" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulario" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Programador de reuniones" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_GT.mo b/wp/wp-content/plugins/leadin/languages/leadin-es_GT.mo deleted file mode 100644 index 51503d98..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-es_GT.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_GT.po b/wp/wp-content/plugins/leadin/languages/leadin-es_GT.po deleted file mode 100644 index de00face..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-es_GT.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Lamentamos verte partir" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Si tiene un momento, dĂ©janos saber por quĂ© estás desactivando el plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "No puedo registrarme ni iniciar sesiĂłn" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "El plugin está afectando el rendimiento del sitio web" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "El plugin no funciona" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "El plugin no es Ăştil" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Desactivar temporalmente o resolver problemas" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Otro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Enviar y desactivar" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Omitir y desactivar" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Seleccionar el tipo de contenido que HubSpot Analytics utiliza para hacer seguimiento a esta página." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detectar automáticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "PublicaciĂłn de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "ArtĂ­culo de conocimiento" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Páginas de Ă­ndice" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Página estándar" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "GuĂ­a del usuario" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formularios" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr " Contactos" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Correo" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listas" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Informes" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "ConfiguraciĂłn" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Adquirir versiĂłn superior" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot Marketing todo en uno %1$s requiere PHP %2$s o una ediciĂłn superior. Primero, cámbiate a una ediciĂłn superior de WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "El plugin de HubSpot no está conectado. %1$sConĂ©ctalo%2$s para usar las herramientas de HubSpot en tu portal de WordPress." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorar esta notificaciĂłn." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hola, %1$s:" - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "ÂżTienes 2 minutos para responder %1$sesta encuesta%2$s acerca del plugin de HubSpot para WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Leemos todas las respuestas. Tus comentarios ayudan a nuestro equipo a realizar las mejoras que más necesitas." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot para WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Gracias" - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "DĂ©janos tu opiniĂłn | el enlace se abre en una nueva pestaña" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulario" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Programador de reuniones" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_MX.mo b/wp/wp-content/plugins/leadin/languages/leadin-es_MX.mo deleted file mode 100644 index 51503d98..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-es_MX.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_MX.po b/wp/wp-content/plugins/leadin/languages/leadin-es_MX.po deleted file mode 100644 index de00face..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-es_MX.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Lamentamos verte partir" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Si tiene un momento, dĂ©janos saber por quĂ© estás desactivando el plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "No puedo registrarme ni iniciar sesiĂłn" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "El plugin está afectando el rendimiento del sitio web" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "El plugin no funciona" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "El plugin no es Ăştil" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Desactivar temporalmente o resolver problemas" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Otro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Enviar y desactivar" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Omitir y desactivar" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Seleccionar el tipo de contenido que HubSpot Analytics utiliza para hacer seguimiento a esta página." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detectar automáticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "PublicaciĂłn de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "ArtĂ­culo de conocimiento" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Páginas de Ă­ndice" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Página estándar" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "GuĂ­a del usuario" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formularios" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr " Contactos" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Correo" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listas" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Informes" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "ConfiguraciĂłn" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Adquirir versiĂłn superior" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot Marketing todo en uno %1$s requiere PHP %2$s o una ediciĂłn superior. Primero, cámbiate a una ediciĂłn superior de WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "El plugin de HubSpot no está conectado. %1$sConĂ©ctalo%2$s para usar las herramientas de HubSpot en tu portal de WordPress." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorar esta notificaciĂłn." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hola, %1$s:" - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "ÂżTienes 2 minutos para responder %1$sesta encuesta%2$s acerca del plugin de HubSpot para WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Leemos todas las respuestas. Tus comentarios ayudan a nuestro equipo a realizar las mejoras que más necesitas." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot para WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Gracias" - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "DĂ©janos tu opiniĂłn | el enlace se abre en una nueva pestaña" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulario" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Programador de reuniones" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_PE.mo b/wp/wp-content/plugins/leadin/languages/leadin-es_PE.mo deleted file mode 100644 index 51503d98..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-es_PE.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_PE.po b/wp/wp-content/plugins/leadin/languages/leadin-es_PE.po deleted file mode 100644 index de00face..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-es_PE.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Lamentamos verte partir" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Si tiene un momento, dĂ©janos saber por quĂ© estás desactivando el plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "No puedo registrarme ni iniciar sesiĂłn" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "El plugin está afectando el rendimiento del sitio web" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "El plugin no funciona" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "El plugin no es Ăştil" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Desactivar temporalmente o resolver problemas" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Otro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Enviar y desactivar" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Omitir y desactivar" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Seleccionar el tipo de contenido que HubSpot Analytics utiliza para hacer seguimiento a esta página." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detectar automáticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "PublicaciĂłn de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "ArtĂ­culo de conocimiento" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Páginas de Ă­ndice" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Página estándar" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "GuĂ­a del usuario" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formularios" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr " Contactos" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Correo" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listas" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Informes" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "ConfiguraciĂłn" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Adquirir versiĂłn superior" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot Marketing todo en uno %1$s requiere PHP %2$s o una ediciĂłn superior. Primero, cámbiate a una ediciĂłn superior de WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "El plugin de HubSpot no está conectado. %1$sConĂ©ctalo%2$s para usar las herramientas de HubSpot en tu portal de WordPress." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorar esta notificaciĂłn." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hola, %1$s:" - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "ÂżTienes 2 minutos para responder %1$sesta encuesta%2$s acerca del plugin de HubSpot para WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Leemos todas las respuestas. Tus comentarios ayudan a nuestro equipo a realizar las mejoras que más necesitas." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot para WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Gracias" - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "DĂ©janos tu opiniĂłn | el enlace se abre en una nueva pestaña" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulario" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Programador de reuniones" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_VE.mo b/wp/wp-content/plugins/leadin/languages/leadin-es_VE.mo deleted file mode 100644 index 51503d98..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-es_VE.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-es_VE.po b/wp/wp-content/plugins/leadin/languages/leadin-es_VE.po deleted file mode 100644 index de00face..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-es_VE.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Lamentamos verte partir" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Si tiene un momento, dĂ©janos saber por quĂ© estás desactivando el plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "No puedo registrarme ni iniciar sesiĂłn" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "El plugin está afectando el rendimiento del sitio web" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "El plugin no funciona" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "El plugin no es Ăştil" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Desactivar temporalmente o resolver problemas" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Otro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Enviar y desactivar" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Omitir y desactivar" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Seleccionar el tipo de contenido que HubSpot Analytics utiliza para hacer seguimiento a esta página." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detectar automáticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "PublicaciĂłn de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "ArtĂ­culo de conocimiento" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Páginas de Ă­ndice" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Página estándar" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "GuĂ­a del usuario" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formularios" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr " Contactos" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Correo" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listas" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Informes" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "ConfiguraciĂłn" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Adquirir versiĂłn superior" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot Marketing todo en uno %1$s requiere PHP %2$s o una ediciĂłn superior. Primero, cámbiate a una ediciĂłn superior de WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "El plugin de HubSpot no está conectado. %1$sConĂ©ctalo%2$s para usar las herramientas de HubSpot en tu portal de WordPress." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorar esta notificaciĂłn." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hola, %1$s:" - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "ÂżTienes 2 minutos para responder %1$sesta encuesta%2$s acerca del plugin de HubSpot para WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Leemos todas las respuestas. Tus comentarios ayudan a nuestro equipo a realizar las mejoras que más necesitas." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot para WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Gracias" - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "DĂ©janos tu opiniĂłn | el enlace se abre en una nueva pestaña" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulario" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Programador de reuniones" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-fi.mo b/wp/wp-content/plugins/leadin/languages/leadin-fi.mo deleted file mode 100644 index 6c08504e..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-fi.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-fi.po b/wp/wp-content/plugins/leadin/languages/leadin-fi.po deleted file mode 100644 index ddde8fd5..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-fi.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Ikävää nähdä sinun lähtevän" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Jos sinulla on hetki aikaa, kerro meille miksi otat lisäosan pois käytöstä." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "En voi rekisteröityä tai kirjautua sisään" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Lisäosa vaikuttaa verkkosivuston suorituskykyyn" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Lisäosa ei toimi" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Tämä lisäosa ei ole hyödyllinen" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Otetaan väliaikaisesti pois käytöstä tai tehdään vianmääritystä" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Muu" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Palaute..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Lähetä ja ota pois käytöstä" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Ohita ja ota pois käytöstä" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Valitse sisältötyyppi, jota HubSpot-analytiikka käyttää tämän sivun seurantaan." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Havaitse automaattisesti" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blogijulkaisu" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Tietämysartikkeli" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Aloitussivu" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Luettelosivu" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Vakiosivu" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Käyttöopas" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Lomakkeet" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live-chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Yhteystiedot" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "Sähköposti" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Luettelot" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Raportointi" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Asetukset" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Päivitä" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpotin All-In-One-markkinointi %1$s vaatii PHP %2$s tai uudemman. Päivitä ensin WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "HubSpot-lisäosaa ei ole yhdistetty juuri nyt. Jos haluat käyttää HubSpot-työkaluja WordPress-sivustollasi, %1$syhdistä lisäosa nyt%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Hylkää tämä ilmoitus." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hei %1$s" - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Onko sinulla kaksi minuuttia aikaa osallistua %1$stähän kyselyyn%2$s HubSpotin WordPress-lisäosasta? " - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Luemme jokaisen vastauksen. Palautteesi auttaa tiimiämme tekemään parannuksia, joita tarvitset eniten." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot WordPress Teamille" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Kiittäen" - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Jätä meille arvostelu | linkki avautuu toisessa välilehdessä" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Lomake" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Kokousten aikatauluttaja" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-fr_BE.mo b/wp/wp-content/plugins/leadin/languages/leadin-fr_BE.mo deleted file mode 100644 index 9e0dafba..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-fr_BE.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-fr_BE.po b/wp/wp-content/plugins/leadin/languages/leadin-fr_BE.po deleted file mode 100644 index 239482ca..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-fr_BE.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Nous regrettons de vous voir partir" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Si vous avez un moment, dites-nous pourquoi vous dĂ©sactivez le plug-in." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Je ne parviens pas Ă  m'inscrire ni Ă  me connecter" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Le plug-in a un impact sur les performances du site web" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Le plug-in ne fonctionne pas" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Le plug-in n'est pas utile" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "DĂ©sactivation temporaire ou dĂ©pannage" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Autre" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Soumettre et dĂ©sactiver" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Ignorer et dĂ©sactiver" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "SĂ©lectionnez le type de contenu utilisĂ© par HubSpot Analytics pour suivre cette page." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "DĂ©tecter automatiquement" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Article de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Article de connaissance" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Page de destination" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Page de listing" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Page standard" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Guide d'utilisation" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formulaires" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Chat en direct" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "contacts" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listes" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Reporting" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Paramètres" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Mettre Ă  niveau" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "Marketing Hub tout-en-un %1$s nĂ©cessite PHP %2$s ou une version ultĂ©rieure. Veuillez d'abord mettre Ă  jour WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "Le plug-in HubSpot n'est pas connectĂ© pour le moment. Pour utiliser les outils HubSpot sur votre site WordPress, %1$sconnectez le plug-in maintenant%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorer cet avis." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Bonjour %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Avez-vous 2 minutes pour rĂ©pondre Ă  %1$scette enquĂŞte%2$s sur le plug-in HubSpot pour WordPress ?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Nous lisons chaque rĂ©ponse. Votre feedback aide notre Ă©quipe Ă  apporter les amĂ©liorations dont vous avez le plus besoin." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "Équipe HubSpot pour WordPress" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Merci," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Nous laisser un avis | le lien s'ouvre dans un nouvel onglet" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulaire" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Planificateur de rĂ©unions" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-fr_CA.mo b/wp/wp-content/plugins/leadin/languages/leadin-fr_CA.mo deleted file mode 100644 index 9e0dafba..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-fr_CA.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-fr_CA.po b/wp/wp-content/plugins/leadin/languages/leadin-fr_CA.po deleted file mode 100644 index 239482ca..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-fr_CA.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Nous regrettons de vous voir partir" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Si vous avez un moment, dites-nous pourquoi vous dĂ©sactivez le plug-in." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Je ne parviens pas Ă  m'inscrire ni Ă  me connecter" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Le plug-in a un impact sur les performances du site web" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Le plug-in ne fonctionne pas" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Le plug-in n'est pas utile" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "DĂ©sactivation temporaire ou dĂ©pannage" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Autre" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Soumettre et dĂ©sactiver" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Ignorer et dĂ©sactiver" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "SĂ©lectionnez le type de contenu utilisĂ© par HubSpot Analytics pour suivre cette page." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "DĂ©tecter automatiquement" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Article de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Article de connaissance" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Page de destination" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Page de listing" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Page standard" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Guide d'utilisation" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formulaires" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Chat en direct" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "contacts" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listes" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Reporting" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Paramètres" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Mettre Ă  niveau" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "Marketing Hub tout-en-un %1$s nĂ©cessite PHP %2$s ou une version ultĂ©rieure. Veuillez d'abord mettre Ă  jour WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "Le plug-in HubSpot n'est pas connectĂ© pour le moment. Pour utiliser les outils HubSpot sur votre site WordPress, %1$sconnectez le plug-in maintenant%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorer cet avis." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Bonjour %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Avez-vous 2 minutes pour rĂ©pondre Ă  %1$scette enquĂŞte%2$s sur le plug-in HubSpot pour WordPress ?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Nous lisons chaque rĂ©ponse. Votre feedback aide notre Ă©quipe Ă  apporter les amĂ©liorations dont vous avez le plus besoin." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "Équipe HubSpot pour WordPress" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Merci," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Nous laisser un avis | le lien s'ouvre dans un nouvel onglet" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulaire" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Planificateur de rĂ©unions" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-fr_FR.mo b/wp/wp-content/plugins/leadin/languages/leadin-fr_FR.mo deleted file mode 100644 index 9e0dafba..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-fr_FR.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-fr_FR.po b/wp/wp-content/plugins/leadin/languages/leadin-fr_FR.po deleted file mode 100644 index 239482ca..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-fr_FR.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Nous regrettons de vous voir partir" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Si vous avez un moment, dites-nous pourquoi vous dĂ©sactivez le plug-in." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Je ne parviens pas Ă  m'inscrire ni Ă  me connecter" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Le plug-in a un impact sur les performances du site web" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Le plug-in ne fonctionne pas" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Le plug-in n'est pas utile" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "DĂ©sactivation temporaire ou dĂ©pannage" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Autre" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Soumettre et dĂ©sactiver" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Ignorer et dĂ©sactiver" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "SĂ©lectionnez le type de contenu utilisĂ© par HubSpot Analytics pour suivre cette page." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "DĂ©tecter automatiquement" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Article de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Article de connaissance" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Page de destination" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Page de listing" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Page standard" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Guide d'utilisation" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formulaires" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Chat en direct" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "contacts" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listes" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Reporting" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Paramètres" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Mettre Ă  niveau" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "Marketing Hub tout-en-un %1$s nĂ©cessite PHP %2$s ou une version ultĂ©rieure. Veuillez d'abord mettre Ă  jour WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "Le plug-in HubSpot n'est pas connectĂ© pour le moment. Pour utiliser les outils HubSpot sur votre site WordPress, %1$sconnectez le plug-in maintenant%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorer cet avis." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Bonjour %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Avez-vous 2 minutes pour rĂ©pondre Ă  %1$scette enquĂŞte%2$s sur le plug-in HubSpot pour WordPress ?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Nous lisons chaque rĂ©ponse. Votre feedback aide notre Ă©quipe Ă  apporter les amĂ©liorations dont vous avez le plus besoin." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "Équipe HubSpot pour WordPress" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Merci," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Nous laisser un avis | le lien s'ouvre dans un nouvel onglet" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulaire" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Planificateur de rĂ©unions" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-it_IT.mo b/wp/wp-content/plugins/leadin/languages/leadin-it_IT.mo deleted file mode 100644 index 061d2305..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-it_IT.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-it_IT.po b/wp/wp-content/plugins/leadin/languages/leadin-it_IT.po deleted file mode 100644 index a1df61f0..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-it_IT.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Ci dispiace di vederti andare via" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Se hai un attimo, facci sapere per quale motivo stai disattivando il plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Non riesco a effettuare la registrazione o a effettuare l'accesso" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Il plugin sta influendo sulle prestazioni del sito web" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Il plugin non funziona" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Il plugin non è utile" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Sto disabilitando temporaneamente o sto effettuando la risoluzione dei problemi" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Altro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Invia e disattiva" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Ignora e disattiva" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Seleziona il tipo di contenuti usato da HubSpot Analytics per monitorare questa pagina." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Rileva automaticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Articolo blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Articolo della knowledge base" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Pagina di prospetto" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Pagina standard" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Guida dell'utente" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Form" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Chat dal vivo" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Contatti" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Elenchi" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Creazione di rapporti" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Impostazioni" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Esegui l'upgrade" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "Marketing all-in-one di HubSpot %1$s richiede il PHP %2$s o superiore. Prima aggiorna WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "Il plugin di HubSpot non è connesso al momento. Per utilizzare gli strumenti di HubSpot sul tuo sito WordPress, %1$sconnetti subito il plugin%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignora questo avviso." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hey %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Hai 2 minuti per completare %1$squesto sondaggio%2$s sul plugin HubSpot per WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Leggiamo ogni risposta. Il tuo feedback aiuta il nostro team ad apportare le migliorie di cui hai piĂą bisogno." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "Il team di HubSpot per WordPress" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Grazie," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Lasciaci una recensione | il link si apre in una nuova scheda" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Form" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Strumento di pianificazione delle riunioni" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-ja.mo b/wp/wp-content/plugins/leadin/languages/leadin-ja.mo deleted file mode 100644 index 852b8976..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-ja.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-ja.po b/wp/wp-content/plugins/leadin/languages/leadin-ja.po deleted file mode 100644 index a5a3cc50..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-ja.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "ă”ĺ©ç”¨ă‚りăŚă¨ă†ă”ă–ă„ăľă—ăź" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "ăŠć™‚é–“ăŚă‚りăľă—ăźă‚‰ă€ă—ă©ă‚°ă‚¤ăłă‚’無効ă«ă™ă‚‹ç†ç”±ă‚’ăŠčžă‹ă›ăŹă ă•ă„。" - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "登録ăľăźăŻă­ă‚°ă‚¤ăłă§ăŤăŞă„" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "ă“ă®ă—ă©ă‚°ă‚¤ăłăŻă‚¦ă‚§ă–サイăă®ă‘ă•ă‚©ăĽăžăłă‚ąă«ĺ˝±éźżă—ăľă™" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "ă—ă©ă‚°ă‚¤ăłăŚć©źč˝ă—ăŞă„" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "ă—ă©ă‚°ă‚¤ăłăŚĺ˝ąă«ç«‹ăźăŞă„" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "一時的ăŞç„ˇĺŠąĺŚ–ăľăźăŻăă©ă–ă«ă‚·ăĄăĽă†ă‚Łăłă‚°" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "ăťă®ä»–" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "ă•ィăĽă‰ăăク..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "é€äżˇă—ă¦ç„ˇĺŠąĺŚ–ă™ă‚‹" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "スキăă—ă—ă¦ç„ˇĺŠąĺŚ–ă™ă‚‹" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "HubSpotアăŠăŞă†ă‚Łă‚Żă‚ąă§ă“ă®ăšăĽă‚¸ă®ăă©ăă‚­ăłă‚°ă«ä˝żç”¨ă•れるコăłă†ăłă„タイă—ă‚’é¸ćŠžă—ăľă™ă€‚" - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "自動的ă«ć¤śĺ‡ş" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "ă–ă­ă‚°č¨äş‹" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "ăŠă¬ăジč¨äş‹" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "ă©ăłă‡ă‚Łăłă‚°ăšăĽă‚¸" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "ăŞă‚ąăăšăĽă‚¸" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "標準ăšăĽă‚¸" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "ă¦ăĽă‚¶ăĽă‚¬ă‚¤ă‰" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "ă•ă‚©ăĽă " - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "ウェă–ăăŁăă" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "コăłă‚żă‚Żă" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "EăˇăĽă«" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "ăŞă‚ąă" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "ă¬ăťăĽă" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "設定" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "アăă—ă‚°ă¬ăĽă‰" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot All-In-One Marketing%1$să«ăŻPHP %2$s以上ăŚĺż…č¦ă§ă™ă€‚ăľăšWordPressをアăă—ă‚°ă¬ăĽă‰ă—ă¦ăŹă ă•ă„。" - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "HubSpotă—ă©ă‚°ă‚¤ăłăŻçŹľĺś¨ćŽĄç¶šă•れă¦ă„ăľă›ă‚“。WordPressサイăă§HubSpotă„ăĽă«ă‚’使用ă™ă‚‹ă«ăŻă€%1$s今ă™ăă—ă©ă‚°ă‚¤ăłă‚’接続%2$să—ă¦ăŹă ă•ă„。" - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "ă“ă®é€šçźĄă‚’無視ă—ă¦ăŹă ă•ă„。" - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "%1$să•ă‚“ă€ă“ă‚“ă«ăˇăŻă€‚" - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "HubSpot for WordPressă—ă©ă‚°ă‚¤ăłă«é–˘ă™ă‚‹%1$să“ă®ă‚˘ăłă‚±ăĽă%2$să«ă”回答ă„ăźă ăŹăźă‚ă€2ĺ†ă»ă©ăŠć™‚é–“ă‚’ă„ăźă ă„ă¦ă‚ろă—ă„ă§ă™ă‹ďĽź" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "回答ăŻĺ…¨ă¦ç›®ă‚’通ă•ă›ă¦ă„ăźă ăŤăľă™ă€‚ă„ăźă ă„ăźă”意見ăŻă€ćś€ă‚‚ă”č¦ćś›ă®ĺ¤šă„機č˝ĺĽ·ĺŚ–ă«ĺ˝ąç«‹ăźă›ă¦ă„ăźă ăŤăľă™ă€‚" - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot for WordPressăăĽă " - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "ă©ă†ăžă‚ろă—ăŹăŠéˇă„ă„ăźă—ăľă™ă€‚" - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "ă¬ă“ăĄăĽă‚’ăŠć›¸ăŤăŹă ă•ă„ | ăŞăłă‚ŻăŚć–°ă—ă„タă–ă§é–‹ăŤăľă™" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "ă•ă‚©ăĽă " - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "ăźăĽă†ă‚Łăłă‚°ć—Ąç¨‹čŞżć•´" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-nb_NO.mo b/wp/wp-content/plugins/leadin/languages/leadin-nb_NO.mo deleted file mode 100644 index 31b81013..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-nb_NO.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-nb_NO.po b/wp/wp-content/plugins/leadin/languages/leadin-nb_NO.po deleted file mode 100644 index 23b1d83e..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-nb_NO.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "SĂĄ synd at du forlater oss" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Hvis du har tid, fortell oss gjerne hvorfor du deaktiverer plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Jeg kan ikke registrere meg eller logge inn" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Plugin pĂĄvirker nettstedytelsen" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Plugin virker ikke" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Plugin er ikke nyttig" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Midlertidig deaktivering eller feilsøking" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Annet" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Tilbakemelding..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Send inn & deaktiver" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Hopp over & deaktiver" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Velg innholdstypen som HubSpot-analyser bruker til ĂĄ spore denne siden." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Oppdag automatisk" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blogginnlegg" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Kunnskapsartikkel" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Destinasjonsside" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Oppføringsside" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standardside" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Brukerveiledning" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Skjemaer" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Direktechat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Kontakter" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-post" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Lister" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Rapportering" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Innstillinger" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Oppgrader" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot All-In-One Marketing %1$s krever PHP %2$s eller høyere. Vennligst oppgrader WordPress først." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "HubSpot-plugin er ikke tilkoblet akkurat nĂĄ. For ĂĄ bruke HubSpot-verktøy pĂĄ WordPress-nettstedet ditt, mĂĄ du %1$skoble til plugins nĂĄ%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Forkast dette varselet." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hei %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Har du 2 minutter til ĂĄ fullføre %1$sdenne undersøkelsen%2$s om HubSpot for WordPress-plugin?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Vi leser alle svar. Din tilbakemelding hjelper teamet vĂĄrt ĂĄ skape de forbedringene du trenger mest." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot for WordPress-team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Takk," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Gi oss en anmeldelse | lenken ĂĄpnes i en ny fane" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Skjema" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Møteplanlegger" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-nl_NL.mo b/wp/wp-content/plugins/leadin/languages/leadin-nl_NL.mo deleted file mode 100644 index 11009a17..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-nl_NL.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-nl_NL.po b/wp/wp-content/plugins/leadin/languages/leadin-nl_NL.po deleted file mode 100644 index b224789a..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-nl_NL.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "We vinden het jammer dat je weggaat" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "We willen graag weten waarom je de plug-in deactiveert." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Ik kan me niet registreren of niet inloggen" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "De plug-in beĂŻnvloedt de websiteprestaties" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "De plug-in werkt niet" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "De plug-in is niet nuttig" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Tijdelijke uitschakeling of probleemoplossing" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Overig" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Verzenden en deactiveren" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Overslaan en deactiveren" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Selecteer het type content dat HubSpot Analytics moet gebruiken om deze pagina te volgen." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Automatisch detecteren" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blogbericht" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Kennisartikel" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landingspagina" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Vermeldingspagina" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standaardpagina" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Gebruikershandleiding" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formulieren" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Live chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Contactpersonen" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Lijsten" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Rapportage" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Instellingen" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgraden" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "Voor HubSpot All-In-One Marketing %1$s is PHP %2$s of hoger vereist. Upgrade eerst WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "De HubSpot-plug-in is momenteel niet gekoppeld. Als je HubSpot-tools wilt gebruiken op je WordPress-site, %1$skoppel je nu de plug-in%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Sluit deze kennisgeving." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hallo %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Heb je 2 minuten om %1$sdeze enquĂŞte%2$s over de HubSpot voor WordPress-plugin in te vullen?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "We lezen elke reactie. Je feedback helpt ons team de verbeteringen aan te brengen die jij het meest nodig hebt." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot for WordPress-team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Bedankt," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Een beoordeling plaatsen | koppeling wordt geopend op een nieuw tabblad" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulier" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Meetingplanner" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-nn_NO.mo b/wp/wp-content/plugins/leadin/languages/leadin-nn_NO.mo deleted file mode 100644 index 31b81013..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-nn_NO.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-nn_NO.po b/wp/wp-content/plugins/leadin/languages/leadin-nn_NO.po deleted file mode 100644 index 23b1d83e..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-nn_NO.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "SĂĄ synd at du forlater oss" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Hvis du har tid, fortell oss gjerne hvorfor du deaktiverer plugin." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Jeg kan ikke registrere meg eller logge inn" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Plugin pĂĄvirker nettstedytelsen" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Plugin virker ikke" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Plugin er ikke nyttig" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Midlertidig deaktivering eller feilsøking" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Annet" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Tilbakemelding..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Send inn & deaktiver" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Hopp over & deaktiver" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "Hubspot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Velg innholdstypen som HubSpot-analyser bruker til ĂĄ spore denne siden." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Oppdag automatisk" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blogginnlegg" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Kunnskapsartikkel" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Destinasjonsside" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Oppføringsside" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standardside" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Brukerveiledning" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Skjemaer" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Direktechat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Kontakter" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-post" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Lister" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Rapportering" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Innstillinger" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Oppgrader" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot All-In-One Marketing %1$s krever PHP %2$s eller høyere. Vennligst oppgrader WordPress først." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "HubSpot-plugin er ikke tilkoblet akkurat nĂĄ. For ĂĄ bruke HubSpot-verktøy pĂĄ WordPress-nettstedet ditt, mĂĄ du %1$skoble til plugins nĂĄ%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Forkast dette varselet." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Hei %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Har du 2 minutter til ĂĄ fullføre %1$sdenne undersøkelsen%2$s om HubSpot for WordPress-plugin?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Vi leser alle svar. Din tilbakemelding hjelper teamet vĂĄrt ĂĄ skape de forbedringene du trenger mest." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot for WordPress-team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Takk," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Gi oss en anmeldelse | lenken ĂĄpnes i en ny fane" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Skjema" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Møteplanlegger" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-pl_PL.mo b/wp/wp-content/plugins/leadin/languages/leadin-pl_PL.mo deleted file mode 100644 index a34b6cf5..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-pl_PL.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-pl_PL.po b/wp/wp-content/plugins/leadin/languages/leadin-pl_PL.po deleted file mode 100644 index 40ff3edf..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-pl_PL.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Przykro nam, ĹĽe rezygnujesz" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "JeĹ›li moĹĽesz poĹ›wiÄ™cić chwilÄ™, powiedz nam, dlaczego dezaktywujesz wtyczkÄ™." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Nie mogÄ™ siÄ™ zarejestrować lub zalogować" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Wtyczka wpĹ‚ywa na wydajność witryny internetowej" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Wtyczka nie dziaĹ‚a" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Wtyczka jest nieprzydatna" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Chwilowe wyłączenie lub rozwiÄ…zywanie problemu" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Inne" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Opinia…" - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "PrzeĹ›lij i dezaktywuj" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "PomiĹ„ i dezaktywuj" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Wybierz typ treĹ›ci, ktĂłrÄ… wykorzystuje analityka HubSpot do Ĺ›ledzenia tej strony." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Wykryj automatycznie" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Wpis na blogu" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "ArtykuĹ‚ w bazie wiedzy" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Strona docelowa" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Strona z listingiem" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Strona standardowa" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Przewodnik uĹĽytkownika" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formularze" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Czat na ĹĽywo" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Kontakty" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listy" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Raportowanie" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Ustawienia" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Uaktualnij" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "Uniwersalny marketing HubSpot %1$s wymaga wersji PHP %2$s lub wyĹĽszej. Najpierw uaktualnij WordPress." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "Wtyczka HubSpot nie jest obecnie połączona. Aby korzystać z narzÄ™dzi HubSpot w witrynie WordPress, %1$społącz teraz wtyczkÄ™%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Odrzuć tÄ™ notatkÄ™." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Cześć, %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Czy masz 2 minuty na wypeĹ‚nienie %1$stej ankiety%2$s na temat wtyczki HubSpot for WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Czytamy wszystkie odpowiedzi. Twoja opinia pomaga naszemu zespoĹ‚owi wprowadzić ulepszenia, ktĂłrych najbardziej potrzebujesz." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot dla zespoĹ‚u WordPress" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "DziÄ™kujemy," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Napisz recenzjÄ™ | ĹÄ…cze otwiera siÄ™ w nowej karcie" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formularz" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Terminarz spotkaĹ„" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-pt_AO.mo b/wp/wp-content/plugins/leadin/languages/leadin-pt_AO.mo deleted file mode 100644 index de739ed6..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-pt_AO.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-pt_AO.po b/wp/wp-content/plugins/leadin/languages/leadin-pt_AO.po deleted file mode 100644 index 0dc6bfd5..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-pt_AO.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "É uma pena vĂŞ-lo partir." - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Se tiver um momento, informe-nos por que está desativando o plug-in." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "NĂŁo consigo me inscrever ou fazer login" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "O plug-in está afetando o desempenho do site" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "O plug-in nĂŁo está funcionando" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "O plug-in nĂŁo Ă© Ăştil" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Desativação temporária ou solução de problemas" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Outro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Enviar e desativar" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Ignorar e desativar" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Selecione o tipo de conteĂşdo que a HubSpot Analytics usa para rastrear esta página." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detectar automaticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Post de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Artigo de conhecimento" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing Page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Página de listagem" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Página padrĂŁo" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Guia do usuário" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formulários" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Contatos" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listas" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "RelatĂłrios" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Configurações" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgrade" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "O software de marketing completo da HubSpot %1$s exige PHP %2$s ou superior. Atualize o WordPress primeiro." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "O plug-in da HubSpot nĂŁo está conectado no momento. Para usar as ferramentas da HubSpot no seu site WordPress, %1$sconecte o plug-in agora%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorar este aviso." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Olá, %1$s." - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "VocĂŞ tem 2 minutos para participar %1$sdesta pesquisa%2$s sobre o plug-in da HubSpot para o WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Lemos cada resposta. Seu feedback ajuda nossa equipe a fazer as melhorias que vocĂŞ mais precisa." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "Equipe da HubSpot para WordPress" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Obrigado," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Deixe-nos uma avaliação | O link abre em uma nova guia" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulário" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Agendador de reuniões" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-pt_BR.mo b/wp/wp-content/plugins/leadin/languages/leadin-pt_BR.mo deleted file mode 100644 index de739ed6..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-pt_BR.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-pt_BR.po b/wp/wp-content/plugins/leadin/languages/leadin-pt_BR.po deleted file mode 100644 index 0dc6bfd5..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-pt_BR.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "É uma pena vĂŞ-lo partir." - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Se tiver um momento, informe-nos por que está desativando o plug-in." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "NĂŁo consigo me inscrever ou fazer login" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "O plug-in está afetando o desempenho do site" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "O plug-in nĂŁo está funcionando" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "O plug-in nĂŁo Ă© Ăştil" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Desativação temporária ou solução de problemas" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Outro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Enviar e desativar" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Ignorar e desativar" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Selecione o tipo de conteĂşdo que a HubSpot Analytics usa para rastrear esta página." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detectar automaticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Post de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Artigo de conhecimento" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing Page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Página de listagem" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Página padrĂŁo" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Guia do usuário" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formulários" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Contatos" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listas" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "RelatĂłrios" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Configurações" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgrade" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "O software de marketing completo da HubSpot %1$s exige PHP %2$s ou superior. Atualize o WordPress primeiro." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "O plug-in da HubSpot nĂŁo está conectado no momento. Para usar as ferramentas da HubSpot no seu site WordPress, %1$sconecte o plug-in agora%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorar este aviso." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Olá, %1$s." - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "VocĂŞ tem 2 minutos para participar %1$sdesta pesquisa%2$s sobre o plug-in da HubSpot para o WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Lemos cada resposta. Seu feedback ajuda nossa equipe a fazer as melhorias que vocĂŞ mais precisa." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "Equipe da HubSpot para WordPress" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Obrigado," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Deixe-nos uma avaliação | O link abre em uma nova guia" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulário" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Agendador de reuniões" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-pt_PT.mo b/wp/wp-content/plugins/leadin/languages/leadin-pt_PT.mo deleted file mode 100644 index de739ed6..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-pt_PT.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-pt_PT.po b/wp/wp-content/plugins/leadin/languages/leadin-pt_PT.po deleted file mode 100644 index 0dc6bfd5..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-pt_PT.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "É uma pena vĂŞ-lo partir." - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Se tiver um momento, informe-nos por que está desativando o plug-in." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "NĂŁo consigo me inscrever ou fazer login" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "O plug-in está afetando o desempenho do site" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "O plug-in nĂŁo está funcionando" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "O plug-in nĂŁo Ă© Ăştil" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Desativação temporária ou solução de problemas" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Outro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Enviar e desativar" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Ignorar e desativar" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Selecione o tipo de conteĂşdo que a HubSpot Analytics usa para rastrear esta página." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detectar automaticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Post de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Artigo de conhecimento" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing Page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Página de listagem" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Página padrĂŁo" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Guia do usuário" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formulários" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Contatos" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listas" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "RelatĂłrios" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Configurações" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgrade" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "O software de marketing completo da HubSpot %1$s exige PHP %2$s ou superior. Atualize o WordPress primeiro." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "O plug-in da HubSpot nĂŁo está conectado no momento. Para usar as ferramentas da HubSpot no seu site WordPress, %1$sconecte o plug-in agora%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorar este aviso." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Olá, %1$s." - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "VocĂŞ tem 2 minutos para participar %1$sdesta pesquisa%2$s sobre o plug-in da HubSpot para o WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Lemos cada resposta. Seu feedback ajuda nossa equipe a fazer as melhorias que vocĂŞ mais precisa." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "Equipe da HubSpot para WordPress" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Obrigado," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Deixe-nos uma avaliação | O link abre em uma nova guia" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulário" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Agendador de reuniões" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-pt_PT_ao90.mo b/wp/wp-content/plugins/leadin/languages/leadin-pt_PT_ao90.mo deleted file mode 100644 index de739ed6..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-pt_PT_ao90.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-pt_PT_ao90.po b/wp/wp-content/plugins/leadin/languages/leadin-pt_PT_ao90.po deleted file mode 100644 index 0dc6bfd5..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-pt_PT_ao90.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "É uma pena vĂŞ-lo partir." - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Se tiver um momento, informe-nos por que está desativando o plug-in." - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "NĂŁo consigo me inscrever ou fazer login" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "O plug-in está afetando o desempenho do site" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "O plug-in nĂŁo está funcionando" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "O plug-in nĂŁo Ă© Ăştil" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Desativação temporária ou solução de problemas" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Outro" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Enviar e desativar" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Ignorar e desativar" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Selecione o tipo de conteĂşdo que a HubSpot Analytics usa para rastrear esta página." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Detectar automaticamente" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Post de blog" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Artigo de conhecimento" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landing Page" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Página de listagem" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Página padrĂŁo" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Guia do usuário" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formulários" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Chat" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Contatos" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-mail" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listas" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "RelatĂłrios" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Configurações" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Upgrade" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "O software de marketing completo da HubSpot %1$s exige PHP %2$s ou superior. Atualize o WordPress primeiro." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "O plug-in da HubSpot nĂŁo está conectado no momento. Para usar as ferramentas da HubSpot no seu site WordPress, %1$sconecte o plug-in agora%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Ignorar este aviso." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "Olá, %1$s." - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "VocĂŞ tem 2 minutos para participar %1$sdesta pesquisa%2$s sobre o plug-in da HubSpot para o WordPress?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Lemos cada resposta. Seu feedback ajuda nossa equipe a fazer as melhorias que vocĂŞ mais precisa." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "Equipe da HubSpot para WordPress" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Obrigado," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Deixe-nos uma avaliação | O link abre em uma nova guia" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulário" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Agendador de reuniões" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-sv_SE.mo b/wp/wp-content/plugins/leadin/languages/leadin-sv_SE.mo deleted file mode 100644 index 0cdbed1a..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-sv_SE.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-sv_SE.po b/wp/wp-content/plugins/leadin/languages/leadin-sv_SE.po deleted file mode 100644 index 065c7939..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-sv_SE.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "Vi är ledsna att du lämnar oss" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "Om du har tid en stund, skulle vi gärna vilja veta varför du avaktiverar detta plugin" - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "Jag kan inte registrera mig eller logga in" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "Detta plugin pĂĄverkar webbsidans prestanda" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "Detta plugin fungerar inte" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "Detta plugin är inte användbart" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "Avaktiverar eller felsöker temporärt" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "Annat" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "Feedback..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "Skicka in och avaktivera" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "Hoppa över och avaktivera" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "Välj den innehĂĄllstyp som HubSpot Analytics använder för att spĂĄra sidan." - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "Upptäck automatiskt" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "Blogginlägg" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "Kunskapsartikel" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "Landningssida" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "Listningssida" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "Standardsida" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "Användarguide" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "Formulär" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "Livechatt" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "Kontakter" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "E-postmeddelande" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "Listor" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "Rapportering" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "Inställningar" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "Uppgradera" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot All-In-One Marketing %1$s kräver PHP %2$s eller högre. Uppgradera WordPress först." - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "Denna HubSpot-plugin är inte ansluten för tillfället. För att använda HubSpot-verktyg pĂĄ din WordPress-webbplats ska du %1$sansluta plugin nu%2$s." - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "Avvisa detta meddelande." - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "HallĂĄ där %1$s," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "Har du lite tid att fylla i %1$s denna undersökning%2$s om HubSpot för WordPress plugin?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "Vi läser alla svar. Din feedback hjälper vĂĄrt team att göra de förbättringar du behöver mest." - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "HubSpot för WordPress Team" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "Tack," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "Skriv ett omdöme | länk öppnas i en ny flik" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "Formulär" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "Mötesplanerare" diff --git a/wp/wp-content/plugins/leadin/languages/leadin-zh_TW.mo b/wp/wp-content/plugins/leadin/languages/leadin-zh_TW.mo deleted file mode 100644 index e2a56251..00000000 Binary files a/wp/wp-content/plugins/leadin/languages/leadin-zh_TW.mo and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/languages/leadin-zh_TW.po b/wp/wp-content/plugins/leadin/languages/leadin-zh_TW.po deleted file mode 100644 index 89254bc3..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin-zh_TW.po +++ /dev/null @@ -1,202 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Language: \n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "HubSpot" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "ć‘們ĺľéşć†ľçś‹ĺ°ä˝ é›˘é–‹" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "如果你有時間,請讓ć‘們知é“ä˝ ĺśç”¨ĺ¤–掛程式的原因。" - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "ć‘無法註冊ć–登入" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "外掛程式正在影響網站ć•č˝" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "外掛程式無法é‹ä˝ś" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "外掛程式不é©ç”¨" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "暫時ĺśç”¨ć–進行疑難排解" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "ĺ…¶ä»–" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "意見回饋..." - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "ćŹäş¤ä¸¦ĺśç”¨" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "č·łéŽä¸¦ĺśç”¨" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "HubSpot" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "é¸ĺŹ– HubSpot Analytics 用於追蹤此é éť˘çš„內容類型。" - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "自動ĺµć¸¬" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "é¨č˝ć Ľć–‡ç« " - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "知č­ć–‡ç« " - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "登陸é éť˘" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "清單é éť˘" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "標準é éť˘" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "使用者指南" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "表單" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "即時čŠĺ¤©" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "連絡人" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "é›»ĺ­éµä»¶" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "清單" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "ĺ†ćžĺ ±ĺ‘Š" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "設定" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "升級" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "HubSpot 一站式行銷%1$séś€č¦ PHP %2$s ć–ć›´ć–°ç‰ćś¬ă€‚č«‹ĺ…升級 WordPress。" - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "ç›®ĺ‰Ťä¸¦ćśŞé€Łçµ HubSpot 外掛程式。若č¦ĺś¨ä˝ çš„ WordPress 網站上使用 HubSpot 工具,請%1$s立即連çµĺ¤–掛程式%2$s。" - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "關閉這則通知。" - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "%1$s 你好," - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "你有 2 ĺ†é時間來完ćé—ść–Ľ HubSpot for WordPress 外掛程式的%1$s這份問卷%2$s嗎?" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "ć‘們詳閱了每一則回應。你的意見回饋有助於ć‘們的ĺśéšŠĺšĺ‡şćś€éś€č¦çš„改進。" - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "WordPress ĺśéšŠç‰ HubSpot" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "謝謝," - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "ĺą«ć‘們留下評論 | 連çµĺ°‡ĺś¨ć–°ĺ†é ä¸­é–‹ĺ•ź" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "表單" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "ćśč­°ćŽ’ç¨‹ĺ™¨" diff --git a/wp/wp-content/plugins/leadin/languages/leadin.pot b/wp/wp-content/plugins/leadin/languages/leadin.pot deleted file mode 100644 index 866a15c4..00000000 --- a/wp/wp-content/plugins/leadin/languages/leadin.pot +++ /dev/null @@ -1,203 +0,0 @@ -# Copyright (C) 2024 HubSpot -# This file is distributed under the GPL v3. -msgid "" -msgstr "" -"Project-Id-Version: HubSpot All-In-One Marketing - Forms, Popups, Live Chat {{ DEV_VERSION }}\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/leadin\n" -"Last-Translator: Hubspot \n" -"Language-Team: Hubspot \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-06-04T16:12:14+00:00\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"X-Generator: WP-CLI 2.10.0\n" -"X-Domain: leadin\n" - -#. Plugin Name of the plugin -#: leadin.php -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#. Plugin URI of the plugin -#: leadin.php -msgid "http://www.hubspot.com/integrations/wordpress" -msgstr "" - -#. Description of the plugin -#: leadin.php -msgid "HubSpot’s official WordPress plugin allows you to add forms, popups, and live chat to your website and integrate with the best WordPress CRM." -msgstr "" - -#. Author of the plugin -#: leadin.php -#: public/admin/class-gutenberg.php:36 -#: public/admin/class-leadinadmin.php:200 -#: public/admin/class-leadinadmin.php:218 -msgid "HubSpot" -msgstr "" - -#. Author URI of the plugin -#: leadin.php -msgid "http://hubspot.com/products/wordpress" -msgstr "" - -#: public/admin/class-deactivationform.php:29 -msgid "We're sorry to see you go" -msgstr "" - -#: public/admin/class-deactivationform.php:39 -msgid "If you have a moment, please let us know why you're deactivating the plugin" -msgstr "" - -#: public/admin/class-deactivationform.php:54 -msgid "I can't sign up or log in" -msgstr "" - -#: public/admin/class-deactivationform.php:55 -msgid "The plugin is impacting website performance" -msgstr "" - -#: public/admin/class-deactivationform.php:56 -msgid "The plugin isn't working" -msgstr "" - -#: public/admin/class-deactivationform.php:57 -msgid "The plugin isn't useful" -msgstr "" - -#: public/admin/class-deactivationform.php:58 -msgid "Temporarily disabling or troubleshooting" -msgstr "" - -#: public/admin/class-deactivationform.php:59 -msgid "Other" -msgstr "" - -#: public/admin/class-deactivationform.php:81 -msgid "Feedback" -msgstr "" - -#: public/admin/class-deactivationform.php:86 -msgid "Submit & deactivate" -msgstr "" - -#: public/admin/class-deactivationform.php:91 -msgid "Skip & deactivate" -msgstr "" - -#: public/admin/class-leadinadmin.php:72 -#: public/class-leadin.php:41 -msgid "Hubspot" -msgstr "" - -#: public/admin/class-leadinadmin.php:80 -msgid "Select the content type HubSpot Analytics uses to track this page" -msgstr "" - -#: public/admin/class-leadinadmin.php:84 -msgid "Detect Automatically" -msgstr "" - -#: public/admin/class-leadinadmin.php:85 -msgid "Blog Post" -msgstr "" - -#: public/admin/class-leadinadmin.php:86 -msgid "Knowledge Article" -msgstr "" - -#: public/admin/class-leadinadmin.php:87 -msgid "Landing Page" -msgstr "" - -#: public/admin/class-leadinadmin.php:88 -msgid "Listing Page" -msgstr "" - -#: public/admin/class-leadinadmin.php:89 -msgid "Standard Page" -msgstr "" - -#: public/admin/class-leadinadmin.php:202 -msgid "User Guide" -msgstr "" - -#: public/admin/class-leadinadmin.php:203 -msgid "Forms" -msgstr "" - -#: public/admin/class-leadinadmin.php:204 -msgid "Live Chat" -msgstr "" - -#: public/admin/class-leadinadmin.php:206 -msgid "Contacts" -msgstr "" - -#: public/admin/class-leadinadmin.php:207 -msgid "Email" -msgstr "" - -#: public/admin/class-leadinadmin.php:208 -msgid "Lists" -msgstr "" - -#: public/admin/class-leadinadmin.php:209 -msgid "Reporting" -msgstr "" - -#: public/admin/class-leadinadmin.php:211 -#: public/admin/class-pluginactionsmanager.php:35 -msgid "Settings" -msgstr "" - -#: public/admin/class-leadinadmin.php:213 -#: public/admin/class-pluginactionsmanager.php:50 -msgid "Upgrade" -msgstr "" - -#: public/admin/class-leadinadmin.php:258 -#: public/admin/class-leadinadmin.php:264 -msgid "HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first" -msgstr "" - -#: public/admin/class-noticemanager.php:35 -msgid "The HubSpot plugin is not connected right now To use HubSpot tools on your WordPress site, %1$sconnect the plugin now%2$s" -msgstr "" - -#: public/admin/class-reviewbanner.php:27 -msgid "Dismiss this notice" -msgstr "" - -#: public/admin/class-reviewbanner.php:29 -msgid "Hey %1$s," -msgstr "" - -#: public/admin/class-reviewbanner.php:32 -msgid "Have you got 2 minutes to complete %1$sthis survey%2$s about the HubSpot for WordPress plugin?" -msgstr "" - -#: public/admin/class-reviewbanner.php:33 -msgid "We read every response Your feedback helps our team make the improvements that you need the most" -msgstr "" - -#: public/admin/class-reviewbanner.php:34 -msgid "HubSpot for WordPress Team" -msgstr "" - -#: public/admin/class-reviewbanner.php:35 -msgid "Thanks," -msgstr "" - -#: public/admin/class-reviewbanner.php:59 -msgid "Leave us a review | link opens in a new tab" -msgstr "" - -#: public/admin/widgets/class-elementorform.php:85 -msgid "Form" -msgstr "" - -#: public/admin/widgets/class-elementormeeting.php:84 -msgid "Meetings Scheduler" -msgstr "" diff --git a/wp/wp-content/plugins/leadin/leadin.php b/wp/wp-content/plugins/leadin/leadin.php deleted file mode 100644 index a801340f..00000000 --- a/wp/wp-content/plugins/leadin/leadin.php +++ /dev/null @@ -1,79 +0,0 @@ -. - */ - -// ============================================= -// Define Constants -// ============================================= -if ( ! defined( 'LEADIN_BASE_PATH' ) ) { - define( 'LEADIN_BASE_PATH', __FILE__ ); -} - -if ( ! defined( 'LEADIN_PATH' ) ) { - define( 'LEADIN_PATH', untrailingslashit( plugins_url( '', LEADIN_BASE_PATH ) ) ); -} - -if ( ! defined( 'LEADIN_ASSETS_PATH' ) ) { - define( 'LEADIN_ASSETS_PATH', untrailingslashit( plugins_url( '', LEADIN_BASE_PATH ) . '/public/assets' ) ); -} - -if ( ! defined( 'LEADIN_JS_BASE_PATH' ) ) { - define( 'LEADIN_JS_BASE_PATH', untrailingslashit( plugins_url( '', LEADIN_BASE_PATH ) . '/build' ) ); -} - -if ( ! defined( 'LEADIN_PLUGIN_DIR' ) ) { - define( 'LEADIN_PLUGIN_DIR', untrailingslashit( dirname( LEADIN_BASE_PATH ) ) ); -} - -if ( ! defined( 'LEADIN_REQUIRED_WP_VERSION' ) ) { - define( 'LEADIN_REQUIRED_WP_VERSION', '5.8' ); -} - -if ( ! defined( 'LEADIN_REQUIRED_PHP_VERSION' ) ) { - define( 'LEADIN_REQUIRED_PHP_VERSION', '7.2' ); -} - -if ( ! defined( 'LEADIN_PLUGIN_VERSION' ) ) { - define( 'LEADIN_PLUGIN_VERSION', '11.1.21' ); -} - - -if ( ! defined( 'LEADIN_PREFIX' ) ) { - define( 'LEADIN_PREFIX', 'leadin' ); -} - -// ============================================= -// Set autoload -// ============================================= -require_once LEADIN_PLUGIN_DIR . '/vendor/autoload.php'; -require_once ABSPATH . 'wp-admin/includes/plugin.php'; - - -use \Leadin\Leadin; - -$leadin = new Leadin(); diff --git a/wp/wp-content/plugins/leadin/license.txt b/wp/wp-content/plugins/leadin/license.txt deleted file mode 100644 index 4c3bbef1..00000000 --- a/wp/wp-content/plugins/leadin/license.txt +++ /dev/null @@ -1,642 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 18. Additional terms - - In the light of Article 7 of the GPL license, the following additional -terms apply: - - a) You are prohibited to make misrepresentations of the origin of that -material, or to require that modified versions of such material be marked -in reasonable ways as different from the original version; - - b) You are limited in the use for publicity purposes of names of -licensors or authors of the material; - - c) You are declined any grant of rights under trademark law for use of -the trade names, trademarks, or service marks of YOAST B.V.; - - d) You are required to indemnify licensors and authors of that material -by anyone who conveys the material (or modified versions of it) with -contractual assumptions of liability to the recipient, for any liability -that these contractual assumptions directly impose on those licensors and -authors. - -END OF TERMS AND CONDITIONS diff --git a/wp/wp-content/plugins/leadin/package.json b/wp/wp-content/plugins/leadin/package.json deleted file mode 100644 index b4855695..00000000 --- a/wp/wp-content/plugins/leadin/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "leadin", - "scripts": { - "start": "wp-scripts start", - "build": "wp-scripts build", - "test-e2e": "wp-scripts test-e2e", - "test-e2e:debug": "wp-scripts test-e2e --puppeteer-devtools", - "plugin-zip": "wp-scripts plugin-zip" - }, - "files": [ - "/public/**", - "/build/**", - "/languages/*", - "/scripts/**/*", - "vendor/*", - "changelog.txt", - "leadin.php", - "uninstall.php", - "phpunit.xml.dist", - "license.txt", - "readme.txt" - ], - "devDependencies": { - "@babel/preset-typescript": "^7.18.6", - "@linaria/babel-preset": "4.0.0-beta.0", - "@linaria/core": "4.0.0-beta.0", - "@linaria/react": "^4.0.0-beta.0", - "@linaria/shaker": "4.0.0-beta.0", - "@types/jest": "^29.2.4", - "@types/jquery": "^3.5.14", - "@types/lodash": "^4.14.188", - "@types/styled-components": "^5.1.26", - "@types/wordpress__block-editor": "^7.0.0", - "@types/wordpress__blocks": "^11.0.7", - "@types/wordpress__edit-post": "^4.0.1", - "@types/wordpress__plugins": "^3.0.0", - "@wordpress/e2e-test-utils": "^8.2.0", - "@wordpress/env": "^5.3.0", - "@wordpress/jest-preset-default": "^10.0.0", - "@wordpress/scripts": "^24.2.0", - "jest": "^29.1.2", - "msw": "^0.49.2", - "ts-loader": "^9.4.1", - "typescript": "^4.8.4" - }, - "dependencies": { - "@babel/cli": "7.18.6", - "@babel/core": "7.18.6", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/preset-env": "7.18.6", - "@babel/preset-react": "7.18.6", - "@linaria/webpack-loader": "4.0.0-beta.0", - "@wordpress/block-editor": "^10.1.0", - "@wordpress/blocks": "^11.17.0", - "@wordpress/edit-post": "^6.18.0", - "@wordpress/i18n": "^4.18.0", - "@wordpress/plugins": "^4.19.0", - "babel-loader": "8.2.5", - "css-loader": "6.7.1", - "mini-css-extract-plugin": "2.6.1", - "penpal": "3.1.3", - "raven-js": "3.19.1", - "styled-components": "^4.3.2", - "webpack": "5.73.0", - "webpack-cli": "4.10.0" - }, - "msw": { - "workerDirectory": "" - } -} diff --git a/wp/wp-content/plugins/leadin/phpunit.xml.dist b/wp/wp-content/plugins/leadin/phpunit.xml.dist deleted file mode 100644 index 11fae88a..00000000 --- a/wp/wp-content/plugins/leadin/phpunit.xml.dist +++ /dev/null @@ -1,15 +0,0 @@ - - - - - ./tests/ - - - diff --git a/wp/wp-content/plugins/leadin/public/admin/class-adminconstants.php b/wp/wp-content/plugins/leadin/public/admin/class-adminconstants.php deleted file mode 100644 index 04f9dfee..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/class-adminconstants.php +++ /dev/null @@ -1,206 +0,0 @@ - 'wordpress-plugin', - 'utm_medium' => 'marketplaces', - ); - - $utm_campaign = self::get_utm_campaign(); - if ( ! empty( $utm_campaign ) ) { - $utm_params['utm_campaign'] = $utm_campaign; - } - return $utm_params; - } - - /** - * Return a nonce used on the connection class - */ - private static function get_connection_nonce() { - return wp_create_nonce( 'hubspot-nonce' ); - } - - /** - * Return an array with the user's pre-fill info for signup - */ - private static function get_signup_prefill_params_array() { - $wp_user = wp_get_current_user(); - $user_info = array( - 'firstName' => $wp_user->user_firstname, - 'lastName' => $wp_user->user_lastname, - 'email' => $wp_user->user_email, - 'company' => get_bloginfo( 'name' ), - ); - - return $user_info; - } - - /** - * Return an array of properties to be included in the signup search string - */ - public static function get_signup_query_params_array() { - $signup_params = array(); - $signup_params['leadinPluginVersion'] = constant( 'LEADIN_PLUGIN_VERSION' ); - $signup_params['trackConsent'] = User_Metadata::get_track_consent(); - $user_prefill_params = self::get_signup_prefill_params_array(); - $signup_params = array_merge( $signup_params, $user_prefill_params ); - return $signup_params; - } - - /** - * Return query params array for the iframe. - */ - public static function get_hubspot_query_params_array() { - $wp_user = wp_get_current_user(); - $hubspot_config = array( - 'l' => get_locale(), - 'php' => Versions::get_php_version(), - 'v' => LEADIN_PLUGIN_VERSION, - 'wp' => Versions::get_wp_version(), - 'theme' => get_option( 'stylesheet' ), - 'adminUrl' => admin_url(), - 'websiteName' => get_bloginfo( 'name' ), - 'domain' => parse_url( get_site_url(), PHP_URL_HOST ), - 'wp_user' => $wp_user->first_name ? $wp_user->first_name : $wp_user->user_nicename, - 'nonce' => self::get_connection_nonce(), - 'accountName' => Portal_Options::get_account_name(), - 'hsdio' => Portal_Options::get_device_id(), - 'portalDomain' => Portal_Options::get_portal_domain(), - ); - - $utm_params = self::get_utm_query_params_array(); - $hubspot_config = array_merge( $hubspot_config, $utm_params ); - - if ( User::is_admin() ) { - $hubspot_config['admin'] = '1'; - } - - if ( Routing::has_just_connected_with_oauth() ) { - $hubspot_config['justConnected'] = true; - } - if ( Routing::is_new_portal_with_oauth() ) { - $hubspot_config['isNewPortal'] = true; - } - - if ( ! Connection::is_connected() ) { - $signup_params = self::get_signup_query_params_array(); - $hubspot_config = array_merge( $hubspot_config, $signup_params, Impact::get_params() ); - } - - return $hubspot_config; - } - - /** - * Returns information about Content embed plugin necessary for user guide to determine if/how to install & activate - */ - public static function get_content_embed_config() { - $content_embed_config = array_merge( - array( - 'userCanInstall' => current_user_can( 'install_plugins' ), - 'userCanActivate' => current_user_can( 'activate_plugins' ), - 'nonce' => wp_create_nonce( ContentEmbedInstaller::INSTALL_ARG ), - ), - ContentEmbedInstaller::is_content_embed_active_installed() - ); - - return $content_embed_config; - } - - /** - * Returns a minimal version of leadinConfig, containing the data needed by the background iframe. - */ - public static function get_background_leadin_config() { - $wp_user_id = get_current_user_id(); - - $background_config = array( - 'adminUrl' => admin_url(), - 'activationTime' => Portal_Options::get_activation_time(), - 'deviceId' => Portal_Options::get_device_id(), - 'formsScript' => Filters::apply_forms_script_url_filters(), - 'formsScriptPayload' => Filters::apply_forms_payload_filters(), - 'meetingsScript' => Filters::apply_meetings_script_url_filters(), - 'hublet' => Filters::apply_hublet_filters(), - 'hubspotBaseUrl' => Filters::apply_base_url_filters( Connection::is_connected() ), - 'leadinPluginVersion' => constant( 'LEADIN_PLUGIN_VERSION' ), - 'locale' => get_locale(), - 'restUrl' => get_rest_url(), - 'restNonce' => wp_create_nonce( 'wp_rest' ), - 'redirectNonce' => wp_create_nonce( Routing::REDIRECT_NONCE ), - 'phpVersion' => Versions::get_php_version(), - 'pluginPath' => constant( 'LEADIN_PATH' ), - 'plugins' => get_plugins(), - 'portalId' => Portal_Options::get_portal_id(), - 'accountName' => Portal_Options::get_account_name(), - 'portalDomain' => Portal_Options::get_portal_domain(), - 'portalEmail' => get_user_meta( $wp_user_id, 'leadin_email', true ), - 'reviewSkippedDate' => User_Metadata::get_skip_review(), - 'theme' => get_option( 'stylesheet' ), - 'wpVersion' => Versions::get_wp_version(), - 'leadinQueryParams' => self::get_hubspot_query_params_array(), - 'connectionStatus' => Connection::is_connected() ? 'Connected' : 'NotConnected', - 'contentEmbed' => self::get_content_embed_config(), - 'requiresContentEmbedScope' => is_plugin_active( 'hubspot-content-embed/content-embed.php' ) ? '1' : '0', - 'lastAuthorizeTime' => Portal_Options::get_last_authorize_time(), - 'lastDeauthorizeTime' => Portal_Options::get_last_deauthorize_time(), - 'lastDisconnectTime' => Portal_Options::get_last_disconnect_time(), - 'refreshTokenError' => Portal_Options::get_refresh_token_error(), - ); - - if ( Connection::is_connected() ) { - $background_config['refreshToken'] = OAuth::get_refresh_token(); - } - - return $background_config; - } - - /** - * Returns leadinConfig, containing all the data needed by the leadin javascript. - */ - public static function get_leadin_config() { - $leadin_config = self::get_background_leadin_config(); - - if ( ! Connection::is_connected() ) { - if ( ! Impact::has_params() ) { - $impact_link = Impact::get_affiliate_link(); - if ( ! empty( $impact_link ) ) { - $leadin_config['impactLink'] = Impact::get_affiliate_link(); - } - } - } - - return $leadin_config; - } -} diff --git a/wp/wp-content/plugins/leadin/public/admin/class-connection.php b/wp/wp-content/plugins/leadin/public/admin/class-connection.php deleted file mode 100644 index be3722ec..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/class-connection.php +++ /dev/null @@ -1,168 +0,0 @@ -ID; - foreach ( $user_meta as $key => $value ) { - add_user_meta( $wp_user_id, $key, $value ); - } - } - - /** - * Retrieves user ID and deletes a piece of the users meta data. - * - * @param String $meta_key is the key of the data you want to delete. - */ - private static function delete_metadata( $meta_key ) { - $wp_user = wp_get_current_user(); - $wp_user_id = $wp_user->ID; - delete_user_meta( $wp_user_id, $meta_key ); - } - - /** - * Connect portal id, domain, name to WordPress options and HubSpot email to user meta data. - * - * @param Number $portal_id HubSpot account id. - * @param String $portal_name HubSpot account name. - * @param String $portal_domain HubSpot account domain. - * @param String $hs_user_email HubSpot user email. - * @param String $hublet HubSpot account's hublet. - */ - public static function connect( $portal_id, $portal_name, $portal_domain, $hs_user_email, $hublet ) { - self::disconnect(); - self::store_portal_info( $portal_id, $portal_name, $portal_domain, $hublet ); - self::add_metadata( array( 'leadin_email' => $hs_user_email ) ); - } - - /** - * Connect the plugin with OAuthorization. Storing OAuth tokens and metadata for the connected portal. - */ - public static function oauth_connect() { - $connect_params = QueryParameters::get_parameters( self::CONNECT_KEYS, 'hubspot-nonce', self::CONNECT_NONCE_ARG ); - - self::disconnect(); - self::store_portal_info( - $connect_params['portal_id'], - $connect_params['portal_name'], - $connect_params['portal_domain'], - $connect_params['hublet'] - ); - - OAuth::authorize( $connect_params['refresh_token'] ); - } - - /** - * Removes portal id and domain from the WordPress options. - */ - public static function disconnect() { - Portal_Options::set_last_disconnect_time(); - - self::delete_portal_info(); - - $users = get_users( - array( 'role__in' => array( 'administrator', 'editor' ) ), - array( 'fields' => array( 'ID' ) ) - ); - foreach ( $users as $user ) { - delete_user_meta( $user->ID, 'leadin_email' ); - delete_user_meta( $user->ID, 'leadin_skip_review' ); - delete_user_meta( $user->ID, 'leadin_review_banner_last_call' ); - delete_user_meta( $user->ID, 'leadin_has_min_contacts' ); - delete_user_meta( $user->ID, 'leadin_track_consent' ); - } - - OAuth::deauthorize(); - } - - /** - * Store the portal metadata for connecting the plugin in the options table - * - * @param String $portal_id ID for connecting portal. - * @param String $portal_name Name of the connecting portal. - * @param String $portal_domain Domain for the connecting portal. - * @param String $hublet Hublet for the connecting portal. - */ - public static function store_portal_info( $portal_id, $portal_name, $portal_domain, $hublet ) { - Portal_Options::set_portal_id( $portal_id ); - Portal_Options::set_account_name( $portal_name ); - Portal_Options::set_portal_domain( $portal_domain ); - Portal_Options::set_hublet( $hublet ); - Portal_Options::set_disable_internal_tracking(); - } - - /** - * Delete stored portal metadata for disconnecting the plugin from the options table - */ - private static function delete_portal_info() { - Portal_Options::delete_portal_id(); - Portal_Options::delete_account_name(); - Portal_Options::delete_portal_domain(); - Portal_Options::delete_hublet(); - Portal_Options::delete_disable_internal_tracking(); - Portal_Options::delete_business_unit_id(); - } -} diff --git a/wp/wp-content/plugins/leadin/public/admin/class-contentembedinstaller.php b/wp/wp-content/plugins/leadin/public/admin/class-contentembedinstaller.php deleted file mode 100644 index ed851f52..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/class-contentembedinstaller.php +++ /dev/null @@ -1,154 +0,0 @@ -install( self::CONTENT_EMBED_LINK ); - - if ( is_wp_error( $result ) ) { - $status['errorCode'] = 'GENERIC_ERROR'; - $status['errorMessage'] = $result->get_error_message(); - wp_send_json_error( $status ); - } - - if ( is_wp_error( $skin->result ) ) { - $status['errorCode'] = 'GENERIC_ERROR'; - $status['errorMessage'] = $skin->result->get_error_message(); - wp_send_json_error( $status ); - } - - if ( $skin->get_errors()->has_errors() ) { - $status['errorCode'] = 'GENERIC_ERROR'; - $status['errorMessage'] = $skin->get_error_messages(); - wp_send_json_error( $status ); - } - - if ( is_null( $result ) ) { - global $wp_filesystem; - $status['errorCode'] = 'FILESYSTEM_ERROR'; - $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 ); - } - - $plugin_info = $upgrader->plugin_info(); - if ( ! $plugin_info ) { - return wp_send_json_error( - array( - 'errorCode' => 'INFO_FETCH_ERROR', - 'errorMessage' => 'Plugin installation failed, could not retrieve plugin info', - ), - 500 - ); - } - - $status = array( - 'message' => 'Plugin installed and activated successfully', - 'plugin_info' => $plugin_info, - 'activated' => false, - ); - - if ( current_user_can( 'activate_plugins' ) ) { - $activation_response = activate_plugin( $plugin_info ); - if ( is_wp_error( $activation_response ) ) { - $status['errorCode'] = 'ACTIVATION_ERROR'; - $status['errorMessage'] = $activation_response->get_error_message(); - } else { - $status['activated'] = true; - } - } - - update_option( self::INSTALL_OPTION, true ); - return wp_send_json_success( $status ); - } - - /** - * Determine if there is a copy of Content embed installed, and if so, if it is active. - * Checks for path names with junk at the end to handle multiple installs - */ - public static function is_content_embed_active_installed() { - $content_embed_regex = '/hubspot-content-embed((-.*)?)\/content-embed.php/'; - if ( ! function_exists( 'get_plugins' ) ) { - require_once ABSPATH . 'wp-admin/includes/plugin.php'; - } - - // Filter based on regex in case there are multiple copies installed for some reason. - $all_plugins = array_keys( get_plugins() ); - $content_embed_paths = array_filter( - $all_plugins, - function ( $plugin_path ) use ( $content_embed_regex ) { - return preg_match( $content_embed_regex, $plugin_path ); - } - ); - - $installed = ! empty( $content_embed_paths ); - $active = ! empty( - array_filter( - $content_embed_paths, - function ( $plugin_path ) { - return is_plugin_active( $plugin_path ); - } - ) - ); - - return array( - 'installed' => $installed, - 'active' => $active, - ); - } -} diff --git a/wp/wp-content/plugins/leadin/public/admin/class-deactivationform.php b/wp/wp-content/plugins/leadin/public/admin/class-deactivationform.php deleted file mode 100644 index a0a285a2..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/class-deactivationform.php +++ /dev/null @@ -1,100 +0,0 @@ -id === 'plugins' ) { - // handlers and logic are added via jQuery in the frontend. - ?> - - 'leadin-blocks', - 'title' => __( 'HubSpot', 'leadin' ), - ), - ) - ); - } - /** - * Register HubSpot Form Gutenberg block. - */ - public function register_gutenberg_block() { - AssetsManager::localize_gutenberg(); - register_block_type( - 'leadin/hubspot-blocks', - array( - 'editor_script' => AssetsManager::GUTENBERG, - ) - ); - } -} diff --git a/wp/wp-content/plugins/leadin/public/admin/class-impact.php b/wp/wp-content/plugins/leadin/public/admin/class-impact.php deleted file mode 100644 index aa38c7eb..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/class-impact.php +++ /dev/null @@ -1,46 +0,0 @@ -start_controls_section( - 'hubspot', - array( - 'label' => esc_html__( 'Hubspot', 'leadin' ), - 'tab' => \Elementor\Controls_Manager::TAB_SETTINGS, - ) - ); - - $document->add_control( - 'content_type', - array( - 'label' => esc_html__( 'Select the content type HubSpot Analytics uses to track this page', 'leadin' ), - 'label_block' => true, - 'type' => \Elementor\Controls_Manager::SELECT, - 'options' => array( - '' => esc_html__( 'Detect Automatically', 'leadin' ), - 'blog-post' => esc_html__( 'Blog Post', 'leadin' ), - 'knowledge-article' => esc_html__( 'Knowledge Article', 'leadin' ), - 'landing-page' => esc_html__( 'Landing Page', 'leadin' ), - 'listing-page' => esc_html__( 'Listing Page', 'leadin' ), - 'standard-page' => esc_html__( 'Standard Page', 'leadin' ), - ), - 'default' => '', - ) - ); - - $document->end_controls_section(); - } - - - - /** - * Load the .mo language files. - */ - public function load_languages() { - load_plugin_textdomain( 'leadin', false, '/leadin/languages' ); - } - - /** - * Handler called on plugin activation. - */ - public function do_activate_action() { - \do_action( 'leadin_activate' ); - } - - /** - * Handler for the leadin_activate action. - */ - public function do_redirect_action() { - \do_action( 'leadin_redirect' ); - } - - /** - * Set transient after activating the plugin. - */ - public function set_redirect_transient() { - set_transient( self::REDIRECT_TRANSIENT, true, 60 ); - } - - /** - * Redirect to the dashboard after activation. - */ - public function redirect_after_activation() { - if ( get_transient( self::REDIRECT_TRANSIENT ) ) { - delete_transient( self::REDIRECT_TRANSIENT ); - wp_safe_redirect( admin_url( 'admin.php?page=leadin' ) ); - exit; - } - } - - /** - * Connect/disconnect the plugin - */ - public function authorize() { - if ( User::is_admin() ) { - if ( Connection::is_connection_requested() ) { - $redirect_params = array(); - Connection::oauth_connect(); - $redirect_params['leadin_just_connected'] = 1; - - if ( Connection::is_new_portal() ) { - $redirect_params['is_new_portal'] = 1; - } - Routing::redirect( MenuConstants::USER_GUIDE, $redirect_params ); - } elseif ( Connection::is_disconnection_requested() ) { - Connection::disconnect(); - Routing::redirect( MenuConstants::ROOT ); - } - } - } - - /** - * Check if query parameter for review is present on the request - * then add user metadata to persist review time - * Redirects if value is equal to true - */ - public function check_review_requested() { - if ( Connection::is_connected() && Routing::has_review_request() ) { - User_Metadata::set_skip_review( time() ); - if ( Routing::is_review_request() ) { - header( 'Location: https://survey.hsforms.com/1ILAEu_k_Ttiy344dpHM--w1h' ); - exit(); - } - } - } - - /** - * Store activation time in a WP option. - */ - public function store_activation_time() { - if ( empty( Portal_Options::get_activation_time() ) ) { - Portal_Options::set_activation_time(); - } - } - - /** - * Adds scripts for the admin section. - */ - public function enqueue_scripts() { - AssetsManager::register_assets(); - AssetsManager::enqueue_admin_assets(); - if ( get_current_screen()->id === 'plugins' ) { - AssetsManager::enqueue_feedback_assets(); - } - } - - /** - * Adds Leadin menu to admin sidebar - */ - public function build_menu() { - if ( Connection::is_connected() ) { - add_menu_page( __( 'HubSpot', 'leadin' ), __( 'HubSpot', 'leadin' ), Filters::apply_view_plugin_menu_capability_filters(), MenuConstants::ROOT, array( $this, 'build_integrated_app' ), 'dashicons-sprocket', '25.100713' ); - - add_submenu_page( MenuConstants::ROOT, __( 'User Guide', 'leadin' ), __( 'User Guide', 'leadin' ), Filters::apply_view_plugin_menu_capability_filters(), MenuConstants::USER_GUIDE, array( $this, 'build_integrated_app' ) ); - add_submenu_page( MenuConstants::ROOT, __( 'Forms', 'leadin' ), __( 'Forms', 'leadin' ), Filters::apply_view_plugin_menu_capability_filters(), MenuConstants::FORMS, array( $this, 'build_integrated_app' ) ); - add_submenu_page( MenuConstants::ROOT, __( 'Live Chat', 'leadin' ), __( 'Live Chat', 'leadin' ), Filters::apply_view_plugin_menu_capability_filters(), MenuConstants::CHATFLOWS, array( $this, 'build_integrated_app' ) ); - - add_submenu_page( MenuConstants::ROOT, __( 'Contacts', 'leadin' ), self::make_external_link( Links::get_iframe_src( MenuConstants::CONTACTS ), __( 'Contacts', 'leadin' ), 'leadin_contacts_link' ), Filters::apply_view_plugin_menu_capability_filters(), MenuConstants::CONTACTS, array( $this, 'build_app' ) ); - add_submenu_page( MenuConstants::ROOT, __( 'Email', 'leadin' ), self::make_external_link( Links::get_iframe_src( MenuConstants::EMAIL ), __( 'Email', 'leadin' ), 'leadin_email_link' ), Filters::apply_view_plugin_menu_capability_filters(), MenuConstants::EMAIL, array( $this, 'build_app' ) ); - add_submenu_page( MenuConstants::ROOT, __( 'Lists', 'leadin' ), self::make_external_link( Links::get_iframe_src( MenuConstants::LISTS ), __( 'Lists', 'leadin' ), 'leadin_lists_link' ), Filters::apply_view_plugin_menu_capability_filters(), MenuConstants::LISTS, array( $this, 'build_app' ) ); - add_submenu_page( MenuConstants::ROOT, __( 'Reporting', 'leadin' ), self::make_external_link( Links::get_iframe_src( MenuConstants::REPORTING ), __( 'Reporting', 'leadin' ), 'leadin_reporting_link' ), Filters::apply_view_plugin_menu_capability_filters(), MenuConstants::REPORTING, array( $this, 'build_app' ) ); - - add_submenu_page( MenuConstants::ROOT, __( 'Settings', 'leadin' ), __( 'Settings', 'leadin' ), Filters::apply_view_plugin_menu_capability_filters(), MenuConstants::SETTINGS, array( $this, 'build_integrated_app' ) ); - - add_submenu_page( MenuConstants::ROOT, __( 'Upgrade', 'leadin' ), self::make_external_link( Links::get_iframe_src( MenuConstants::PRICING ), __( 'Upgrade', 'leadin' ), 'leadin_pricing_link' ), Filters::apply_view_plugin_menu_capability_filters(), MenuConstants::PRICING, array( $this, 'build_app' ) ); - - remove_submenu_page( MenuConstants::ROOT, MenuConstants::ROOT ); - } else { - $notification_icon = ' !'; - add_menu_page( __( 'HubSpot', 'leadin' ), __( 'HubSpot', 'leadin' ) . $notification_icon, Filters::apply_connect_plugin_capability_filters(), MenuConstants::ROOT, array( $this, 'build_integrated_app' ), 'dashicons-sprocket', '25.100713' ); - } - } - - - /** - * Wraps external link. - * - * @param String $href link destination. - * @param String $content link content. - * @param String $class class for ATs. - */ - public function make_external_link( $href, $content, $class ) { - return "$content"; - } - - /** - * Renders the leadin admin page. - */ - public function build_app() { - AssetsManager::enqueue_bridge_assets(); - self::render_app(); - } - - /** - * Renders the integrated forms app. - */ - public function build_integrated_app() { - AssetsManager::enqueue_integrated_app_assets(); - self::render_app(); - } - - /** - * Render app container - */ - public function render_app() { - $error_message = ''; - - if ( Versions::is_php_version_not_supported() ) { - $error_message = sprintf( - __( 'HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first', 'leadin' ), - LEADIN_PLUGIN_VERSION, - LEADIN_REQUIRED_PHP_VERSION - ); - } elseif ( Versions::is_wp_version_not_supported() ) { - $error_message = sprintf( - __( 'HubSpot All-In-One Marketing %1$s requires PHP %2$s or higher Please upgrade WordPress first', 'leadin' ), - LEADIN_PLUGIN_VERSION, - LEADIN_REQUIRED_WP_VERSION - ); - } - - if ( $error_message ) { - ?> -
-

- -

-
- -
-
- - * Where - * - admin_page is a string - * - url is either a string or another map , both strings - */ - public static function get_routes_mapping() { - $portal_id = Portal_Options::get_portal_id(); - $reporting_page = "/reports-dashboard/$portal_id"; - $user_guide = "/wordpress-plugin-ui/$portal_id/onboarding/start"; - - return array( - MenuConstants::ROOT => $user_guide, - MenuConstants::USER_GUIDE => $user_guide, - MenuConstants::REPORTING => $reporting_page, - MenuConstants::CONTACTS => "/contacts/$portal_id", - MenuConstants::LISTS => array( - '' => "/contacts/$portal_id/objectLists/all", - 'default' => "/contacts/$portal_id/objectLists", - 'lists' => "/contacts/$portal_id/lists", - ), - MenuConstants::EMAIL => array( - '' => "/email/$portal_id", - 'cms' => "/content/$portal_id/create/email", - ), - MenuConstants::SETTINGS => array( - '' => "/wordpress-plugin-ui/$portal_id/settings", - 'forms' => "/settings/$portal_id/marketing/form", - ), - MenuConstants::PRICING => "/pricing/$portal_id/marketing", - ); - } - - /** - * Get page name from the current page id. - * E.g. "hubspot_page_leadin_forms" => "forms" - */ - private static function get_page_id() { - $screen_id = get_current_screen()->id; - return preg_replace( '/^(hubspot_page_|toplevel_page_)/', '', $screen_id ); - } - - /** - * Get the parsed `leadin_route` from the query string. - */ - private static function get_iframe_route() { - $iframe_route = QueryParameters::get_param_array( 'leadin_route', 'hubspot-route' ); - return is_array( $iframe_route ) ? $iframe_route : array(); - } - - /** - * Get the parsed `leadin_search` from the query string. - */ - private static function get_iframe_search_string() { - return QueryParameters::get_param( 'leadin_search', 'hubspot-route' ); - } - - /** - * Return query string from object - * - * @param array $arr query parameters to stringify. - */ - private static function http_build_query( $arr ) { - if ( ! is_array( $arr ) ) { - return ''; - } - return http_build_query( $arr, '', ini_get( 'arg_separator.output' ), PHP_QUERY_RFC3986 ); - } - - /** - * Validate static version. - * - * @param String $version version of the static bundle. - */ - private static function is_static_version_valid( $version ) { - preg_match( '/static-\d+\.\d+/', $version, $match ); - return ! empty( $match ); - } - - /** - * Return a string query parameters to add to the iframe src. - */ - public static function get_query_params() { - $config_array = AdminConstants::get_hubspot_query_params_array(); - \array_merge( $config_array, Impact::get_params() ); - - return self::http_build_query( $config_array ); - } - - /** - * This function computes the right iframe src based on query params and current page. - * - * The `page` query param is used as a key to get the url from the get_routes_mapping - * This query param will get ignored if $page_id function param is present - * The `leadin_route[]` query params are added to the url - * - * e.g.: - * ?page=leadin_forms&leadin_route[]=foo&leadin_route[]=bar will redirect to /forms/$portal_id/foo/bar - * - * If the value of get_routes_mapping is an array, the first value of `leadin_route` will be used as key. - * If the key isn't found, it will fall back to '' - * - * e.g.: - * ?page=leadin_settings&leadin=route[]=forms&leadin_route[]=bar will redirect to /settings/$portal_id/forms/bar - * ?page=leadin_settings&leadin=route[]=foo&leadin_route[]=bar will redirect to /wordpress_plugin_ui/$portal_id/settings/foo/bar - * - * @param String $page_id is used as a key to get the url from the get_routes_mapping by overriding the query param. - * - * Returns the right iframe src. - */ - public static function get_iframe_src( $page_id = '' ) { - $leadin_onboarding = 'leadin_onboarding'; - $leadin_new_portal = 'leadin_new_portal'; - $browser_search_string = ''; - - if ( get_transient( $leadin_onboarding ) ) { - delete_transient( $leadin_onboarding ); - $browser_search_string = '&justConnected=true'; - if ( get_transient( $leadin_new_portal ) ) { - delete_transient( $leadin_new_portal ); - $browser_search_string = $browser_search_string . '&isNewPortal=true'; - } - } - - $sub_routes_array = self::get_iframe_route(); - $inframe_search_string = self::get_iframe_search_string(); - $browser_search_string = $browser_search_string . $inframe_search_string; - - if ( empty( Portal_Options::get_portal_id() ) ) { - $wp_user = wp_get_current_user(); - $wp_user_id = $wp_user->ID; - set_transient( $leadin_onboarding, 'true' ); - } else { - if ( '' === $page_id ) { - $page_id = self::get_page_id(); - } - - $routes = self::get_routes_mapping(); - - $is_external = MenuConstants::PRICING === $page_id || MenuConstants::REPORTING === $page_id || MenuConstants::LISTS === $page_id || MenuConstants::CONTACTS === $page_id || MenuConstants::EMAIL === $page_id; - - if ( empty( $route ) && isset( $routes[ $page_id ] ) ) { - $route = $routes[ $page_id ]; - - if ( \is_array( $route ) && isset( $sub_routes_array[0] ) ) { - $first_sub_route = $sub_routes_array[0]; - - if ( isset( $route[ $first_sub_route ] ) ) { - $route = $route[ $first_sub_route ]; - array_shift( $sub_routes_array ); - } - } - - if ( \is_array( $route ) ) { - $route = $route['']; - } - } - } - - $sub_routes = join( '/', $sub_routes_array ); - $sub_routes = empty( $sub_routes ) ? $sub_routes : "/$sub_routes"; - // Query string separator "?" may have been added to the URL already. - $add_separator = strpos( $sub_routes, '?' ) ? '&' : '?'; - $additional_query_params = Filters::apply_query_params_filters(); - - return Filters::apply_base_url_filters() . "$route$sub_routes" . $add_separator . self::get_query_params() . $browser_search_string . $additional_query_params; - } -} diff --git a/wp/wp-content/plugins/leadin/public/admin/class-menuconstants.php b/wp/wp-content/plugins/leadin/public/admin/class-menuconstants.php deleted file mode 100644 index bef89069..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/class-menuconstants.php +++ /dev/null @@ -1,19 +0,0 @@ - -
-

- -   - ', - '' - ); - ?> -

-
- leadin_render_disconnected_banner(); - } elseif ( self::should_show_review_notice() ) { - $review_banner = new ReviewBanner(); - $review_banner->leadin_render_review_banner(); - } - } - } - - /** - * Find if disconnected notice should be shown - */ - public function should_show_disconnected_notice() { - $current_screen = get_current_screen(); - return ! Connection::is_connected() && 'leadin' !== $current_screen->parent_base; - } - - /** - * Find if review notice should be shown - */ - public function should_show_review_notice() { - $current_screen = get_current_screen(); - $is_dashboard = 'index' === $current_screen->parent_base; - $is_not_skipped = empty( User_Metadata::get_skip_review() ); - return $is_dashboard && Connection::is_connected() && $is_not_skipped; - } - -} diff --git a/wp/wp-content/plugins/leadin/public/admin/class-pluginactionsmanager.php b/wp/wp-content/plugins/leadin/public/admin/class-pluginactionsmanager.php deleted file mode 100644 index 7d95bc66..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/class-pluginactionsmanager.php +++ /dev/null @@ -1,55 +0,0 @@ -' . __( 'Settings', 'leadin' ) . ''; - array_unshift( $links, $settings_link ); - return $links; - } - - /** - * Adds upgrade link for Leadin to plugins management page - * - * @param array $links Return the links for the upgrade page. - * @return array - */ - public function leadin_plugin_advanced_features_link( $links ) { - if ( Connection::is_connected() ) { - $portal_id = Portal_Options::get_portal_id(); - $url = Filters::apply_base_url_filters() . '/pricing/' . $portal_id . '/marketing?' . Links::get_query_params(); - $advanced_features_link = '' . esc_html( __( 'Upgrade', 'leadin' ) ) . ''; - array_push( $links, $advanced_features_link ); - } - return $links; - } -} diff --git a/wp/wp-content/plugins/leadin/public/admin/class-reviewbanner.php b/wp/wp-content/plugins/leadin/public/admin/class-reviewbanner.php deleted file mode 100644 index 703f7bc6..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/class-reviewbanner.php +++ /dev/null @@ -1,89 +0,0 @@ - -
- - - - - -
-

- -

- -
- -

- ', - '' - ); - ?> -

-

- -

-
-
-

- -

-
-
- -
- - -

- Kelly -
- -

-
-
- - - get_contacts_from_timestamp( Portal_Options::get_activation_time() ); - $has_min_contacts = count( $contacts->results ) >= self::CONTACTS_CREATED_SINCE_ACTIVATION; - User_Metadata::set_has_min_contacts( $has_min_contacts ); - return $has_min_contacts; - } catch ( \Exception $e ) { - return false; - } - } - - /** - * Check to see if current time is after introductary period. - */ - public static function is_after_introductary_period() { - $activation_time = new \DateTime(); - $activation_time->setTimestamp( Portal_Options::get_activation_time() ); - $diff = $activation_time->diff( new \DateTime() ); - return $diff->days >= self::REVIEW_BANNER_INTRO_PERIOD; - } - - /** - * Check SKIP_REVIEW meta data for a user. - */ - public static function is_reviewed_or_skipped() { - return ! empty( User_Metadata::get_skip_review() ); - } - - /** - * Check if contacts have been fetched at the current day. - */ - public static function should_fetch_contacts() { - $last_call_ts = User_Metadata::get_review_banner_last_call(); - if ( empty( $last_call_ts ) ) { - return true; - } - $last_call_date = new \DateTime(); - $last_call_date->setTimestamp( $last_call_ts ); - $diff = $last_call_date->diff( new \DateTime() ); - return $diff->days >= self::DAYS_SINCE_LAST_FETCH; - } - - /** - * Check if contacts minimun have already been fulfilled . - */ - public static function has_min_contacts() { - return User_Metadata::get_has_min_contacts(); - } - -} diff --git a/wp/wp-content/plugins/leadin/public/admin/class-routing.php b/wp/wp-content/plugins/leadin/public/admin/class-routing.php deleted file mode 100644 index 686531cb..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/class-routing.php +++ /dev/null @@ -1,101 +0,0 @@ - $page ), - array( self::REDIRECT_NONCE => wp_create_nonce( self::REDIRECT_NONCE ) ), - $extra_params - ); - - $redirect_url = add_query_arg( - urlencode_deep( $redirect_params ), - admin_url( 'admin.php' ) - ); - - nocache_headers(); - wp_safe_redirect( $redirect_url ); - exit; - } - - /** - * Return a boolean if the plugin has just been connected. - * Signified by query parameter flag `leadin_just_connected`. - * - * @return bool True if the plugin has just connected. - */ - public static function has_just_connected_with_oauth() { - $just_connected_param = QueryParameters::get_param( - self::JUST_CONNECTED, - self::REDIRECT_NONCE, - self::REDIRECT_NONCE - ); - - return null !== $just_connected_param; - } - - /** - * Return a boolean if the plugin is being used with a new portal. - * Signified by query parameter flag `is_new_portal`. - * - * @return bool True if the plugin has just connected using a new portal. - */ - public static function is_new_portal_with_oauth() { - $just_connected_param = QueryParameters::get_param( - self::IS_NEW_PORTAL, - self::REDIRECT_NONCE, - self::REDIRECT_NONCE - ); - - return null !== $just_connected_param; - } - - /** - * Reads query param to see if request has review request query params - * - * @return bool True if the `leadin_review` query parameter is not empty - */ - public static function has_review_request() { - $is_review_request = QueryParameters::get_param( - self::REVIEW, - 'leadin-review' - ); - return ! empty( $is_review_request ); - } - - /** - * Reads query param to see if request has review request query params set to true - * - * @return bool True if the `leadin_review` query parameter is true - */ - public static function is_review_request() { - $is_review_request = QueryParameters::get_param( - self::REVIEW, - 'leadin-review' - ); - return 'true' === $is_review_request; - } - - -} diff --git a/wp/wp-content/plugins/leadin/public/admin/modules/api/class-hublet-api-controller.php b/wp/wp-content/plugins/leadin/public/admin/modules/api/class-hublet-api-controller.php deleted file mode 100644 index 423fa692..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/modules/api/class-hublet-api-controller.php +++ /dev/null @@ -1,40 +0,0 @@ -get_body(), true ); - $hublet = $data['hublet']; - - if ( ! $hublet ) { - return new \WP_REST_Response( 'Hublet is required', 400 ); - } - Portal_Options::set_hublet( $hublet ); - return new \WP_REST_Response( $hublet, 200 ); - } - -} diff --git a/wp/wp-content/plugins/leadin/public/admin/modules/api/class-internal-tracking-api-controller.php b/wp/wp-content/plugins/leadin/public/admin/modules/api/class-internal-tracking-api-controller.php deleted file mode 100644 index 072d6aee..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/modules/api/class-internal-tracking-api-controller.php +++ /dev/null @@ -1,50 +0,0 @@ -get_body(), true ) ); - return new \WP_REST_Response( 'OK', 200 ); - } - -} diff --git a/wp/wp-content/plugins/leadin/public/admin/modules/api/class-portal-api-controller.php b/wp/wp-content/plugins/leadin/public/admin/modules/api/class-portal-api-controller.php deleted file mode 100644 index 44cfa2e5..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/modules/api/class-portal-api-controller.php +++ /dev/null @@ -1,53 +0,0 @@ -get_body(), true ); - $business_unit_id = $data['businessUnitId']; - Portal_Options::set_business_unit_id( $business_unit_id ); - return new \WP_REST_Response( 'OK', 200 ); - } - -} diff --git a/wp/wp-content/plugins/leadin/public/admin/modules/api/class-user-meta-api-controller.php b/wp/wp-content/plugins/leadin/public/admin/modules/api/class-user-meta-api-controller.php deleted file mode 100644 index 80515434..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/modules/api/class-user-meta-api-controller.php +++ /dev/null @@ -1,54 +0,0 @@ -get_body(), true ); - if ( array_key_exists( 'canTrack', $data ) ) { - $consent = $data['canTrack']; - User_Metadata::set_track_consent( $consent ? 'true' : 'false' ); - } - return new \WP_REST_Response( - json_encode( User_Metadata::get_track_consent(), true ), - 200 - ); - } - -} diff --git a/wp/wp-content/plugins/leadin/public/admin/widgets/class-elementorform.php b/wp/wp-content/plugins/leadin/public/admin/widgets/class-elementorform.php deleted file mode 100644 index cc87585c..00000000 --- a/wp/wp-content/plugins/leadin/public/admin/widgets/class-elementorform.php +++ /dev/null @@ -1,129 +0,0 @@ -start_controls_section( - 'content_section', - array( - 'label' => esc_html( __( 'Form', 'leadin' ) ), - 'tab' => \Elementor\Controls_Manager::TAB_CONTENT, - ) - ); - - $this->add_control( - 'content', - array( - 'type' => 'leadinformselect', - ) - ); - - $this->end_controls_section(); - } - - /** - * Render the widget - */ - protected function render() { - $settings = $this->get_settings_for_display(); - $content = $settings['content']; - - if ( Plugin::$instance->editor->is_edit_mode() ) { - - ?> -
-   -
- -
- -
- true, - 'rows' => 3, - 'hsptform_options' => array(), - ); - } - - /** - * Render Function - */ - public function content_template() { - $control_uid = $this->get_control_uid(); - ?> -
- start_controls_section( - 'content_section', - array( - 'label' => esc_html( __( 'Meetings Scheduler', 'leadin' ) ), - 'tab' => \Elementor\Controls_Manager::TAB_CONTENT, - ) - ); - - $this->add_control( - 'content', - array( - 'type' => 'leadinmeetingselect', - ) - ); - - $this->end_controls_section(); - } - - /** - * Render the widget - */ - protected function render() { - $settings = $this->get_settings_for_display(); - $content = $settings['content']; - - if ( Plugin::$instance->editor->is_edit_mode() ) { - ?> -
> -   -
- - -
- -
- true, - 'rows' => 3, - 'hsptmeeting_options' => array(), - ); - } - - /** - * Render Function - */ - public function content_template() { - $control_uid = $this->get_control_uid(); - ?> -
- - \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/public/assets/images/hubspot-form.png b/wp/wp-content/plugins/leadin/public/assets/images/hubspot-form.png deleted file mode 100644 index fe7c2513..00000000 Binary files a/wp/wp-content/plugins/leadin/public/assets/images/hubspot-form.png and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/public/assets/images/hubspot-meetings.png b/wp/wp-content/plugins/leadin/public/assets/images/hubspot-meetings.png deleted file mode 100644 index 9517ed92..00000000 Binary files a/wp/wp-content/plugins/leadin/public/assets/images/hubspot-meetings.png and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/public/assets/images/hubspot-team-profile.png b/wp/wp-content/plugins/leadin/public/assets/images/hubspot-team-profile.png deleted file mode 100644 index 31815976..00000000 Binary files a/wp/wp-content/plugins/leadin/public/assets/images/hubspot-team-profile.png and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/public/assets/images/hubspot-wordmark.svg b/wp/wp-content/plugins/leadin/public/assets/images/hubspot-wordmark.svg deleted file mode 100644 index fc2733c9..00000000 --- a/wp/wp-content/plugins/leadin/public/assets/images/hubspot-wordmark.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - HubSpot Wordmark - Full Color - Created with Sketch. - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/public/assets/images/hubspot.svg b/wp/wp-content/plugins/leadin/public/assets/images/hubspot.svg deleted file mode 100644 index 0e59856d..00000000 --- a/wp/wp-content/plugins/leadin/public/assets/images/hubspot.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 3 \ No newline at end of file diff --git a/wp/wp-content/plugins/leadin/public/assets/images/loading-dots.svg b/wp/wp-content/plugins/leadin/public/assets/images/loading-dots.svg deleted file mode 100644 index 95c29d33..00000000 --- a/wp/wp-content/plugins/leadin/public/assets/images/loading-dots.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - diff --git a/wp/wp-content/plugins/leadin/public/assets/images/sprocket.svg b/wp/wp-content/plugins/leadin/public/assets/images/sprocket.svg deleted file mode 100644 index a2d622c5..00000000 --- a/wp/wp-content/plugins/leadin/public/assets/images/sprocket.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - HubSpot Sprocket - Full Color - Created with Sketch. - - - - - - - - - - - - - diff --git a/wp/wp-content/plugins/leadin/public/assets/style/fonts/LexendDeca-Bold.woff2 b/wp/wp-content/plugins/leadin/public/assets/style/fonts/LexendDeca-Bold.woff2 deleted file mode 100644 index e1768a72..00000000 Binary files a/wp/wp-content/plugins/leadin/public/assets/style/fonts/LexendDeca-Bold.woff2 and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/public/assets/style/fonts/LexendDeca-Light.woff2 b/wp/wp-content/plugins/leadin/public/assets/style/fonts/LexendDeca-Light.woff2 deleted file mode 100644 index 06520b93..00000000 Binary files a/wp/wp-content/plugins/leadin/public/assets/style/fonts/LexendDeca-Light.woff2 and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/public/assets/style/fonts/LexendDeca-Medium.woff2 b/wp/wp-content/plugins/leadin/public/assets/style/fonts/LexendDeca-Medium.woff2 deleted file mode 100644 index 9eca3d6c..00000000 Binary files a/wp/wp-content/plugins/leadin/public/assets/style/fonts/LexendDeca-Medium.woff2 and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/public/assets/style/fonts/LexendDeca-SemiBold.woff2 b/wp/wp-content/plugins/leadin/public/assets/style/fonts/LexendDeca-SemiBold.woff2 deleted file mode 100644 index 825131b3..00000000 Binary files a/wp/wp-content/plugins/leadin/public/assets/style/fonts/LexendDeca-SemiBold.woff2 and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/public/assets/style/fonts/hs-font.svg b/wp/wp-content/plugins/leadin/public/assets/style/fonts/hs-font.svg deleted file mode 100644 index 3ce780db..00000000 --- a/wp/wp-content/plugins/leadin/public/assets/style/fonts/hs-font.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - -Generated by Fontastic.me - - - - - - - diff --git a/wp/wp-content/plugins/leadin/public/assets/style/fonts/hs-font.woff b/wp/wp-content/plugins/leadin/public/assets/style/fonts/hs-font.woff deleted file mode 100644 index 7fc89788..00000000 Binary files a/wp/wp-content/plugins/leadin/public/assets/style/fonts/hs-font.woff and /dev/null differ diff --git a/wp/wp-content/plugins/leadin/public/assets/style/leadin-bridge.css b/wp/wp-content/plugins/leadin/public/assets/style/leadin-bridge.css deleted file mode 100644 index 2885889f..00000000 --- a/wp/wp-content/plugins/leadin/public/assets/style/leadin-bridge.css +++ /dev/null @@ -1,33 +0,0 @@ -#leadin, -#wpbody, -#wpbody-content, -#wpcontent, -#wpwrap, -body, -html { - height: 100% !important; - background-color: transparent; -} - -body.toplevel_page_leadin { - background-color: #f5f8fa !important; -} - -#wpbody-content, -#wpcontent { - padding: 0 !important; -} - -#wpfooter { - display: none !important; -} - -#leadin-iframe { - position: absolute; - top: 0; - border: 0 none transparent !important; - padding: 0 !important; - width: 100% !important; - left: 0; - background: white; -} diff --git a/wp/wp-content/plugins/leadin/public/assets/style/leadin-feedback.css b/wp/wp-content/plugins/leadin/public/assets/style/leadin-feedback.css deleted file mode 100644 index 16a6830c..00000000 --- a/wp/wp-content/plugins/leadin/public/assets/style/leadin-feedback.css +++ /dev/null @@ -1,201 +0,0 @@ -.leadin-feedback-window { - background-color: #fff; - font-family: 'Lexend Deca', Helvetica, Arial, sans-serif; - font-size: 16px; - color: #33475b; - width: 524px !important; /* need to override the inline styling thickbox applies */ - height: 600px !important; - margin-left: 0px !important; - transform: translateX(-50%); - top: 30px !important; - margin-top: 0px !important; - visibility: visible !important; -} - -.leadin-feedback-window strong { - font-weight: 550; -} - -.leadin-feedback-content { - width: auto !important; /* need to override the inline styling thickbox applies */ - height: auto !important; - background-color: #fff; -} - -.leadin-radio-input-container { - margin-top: 20px; -} - -.leadin-deactivate-form { - margin-top: 30px; -} - -.leadin-input, -.leadin-input[type], -.leadin-feedback-text-area { - border-radius: 3px; - border: 1px solid #cbd6e2; - background-color: #f5f8fa; - margin-top: 10px; - padding: 9px 10px; - width: 100%; -} - -.leadin-input:focus, -.leadin-input[type]:focus, -.leadin-feedback-text-area:focus { - border-color: rgba(0, 208, 228, 0.5); - box-shadow: 0 0 4px 1px rgba(0, 208, 228, 0.3), 0 0 0 1px #00d0e4; - outline: 0; -} - -.leadin-feedback-text-area { - margin-bottom: 30px; - text-align: left; - vertical-align: middle; - - transition-property: all; - transition-duration: 0.15s; - transition-timing-function: ease-out; - transition-delay: 0s; -} - -input[type='radio']:checked:before.leadin-feedback-radio { - background-color: #00a4bd; -} - -input[type='radio']:focus.leadin-feedback-radio { - border-color: #00a4bd; -} - -.leadin-button-container { - margin-top: 30px; - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: center; - align-items: center; -} - -.leadin-button-container .leadin-button { - margin-left: 12px; -} - -.leadin-feedback-header { - background-color: #00bda5; - background-image: linear-gradient(-303deg, #00a4bd, #00afb2 56%, #00bda5); - position: absolute; - top: 0px; - left: 0px; - width: 100%; - - align-items: center; - min-height: 80px; -} - -.leadin-feedback-header h2 { - color: #fff; - font-weight: 500; - font-size: 20px; - line-height: 40px; - margin-left: 50px; -} - -.leadin-feedback-body { - margin-top: 80px; - padding: 10px 20px; -} - -.leadin-modal-close { - color: #fff; - display: flex; - flex-shrink: 0; - justify-content: center; - line-height: normal; - position: absolute; - top: 22px; - right: 22px; - height: 16px; - width: 16px; - z-index: 1; - transition: color 150ms ease-out 0s; - cursor: pointer; -} - -.leadin-close-svg { - display: block; - -webkit-box-flex: 1; - flex-grow: 1; -} - -.leadin-close-path { - fill: currentcolor; - stroke: currentcolor; - stroke-width: 2; -} - -.leadin-modal-close::after { - padding: 20px; - content: ' '; - left: 50%; - position: absolute; - top: 50%; - transform: translate(-50%, -50%); - border-radius: 100%; - padding: 20px; - transition-property: background-color; - transition-duration: 150ms; - transition-timing-function: ease-out; - transition-delay: 0s; -} - -.leadin-modal-close:hover::after { - background-color: rgba(255, 255, 255, 0.1); -} - -.leadin-loader { - opacity: 0; - position: absolute; - top: 18%; - left: 43%; - border-top: 0.2em solid #ffbcac; - border-right: 0.2em solid #ffbcac; - border-bottom: 0.2em solid #ffbcac; - border-left: 0.2em solid #ff7a59; - border-radius: 50%; - width: 1.5em; - height: 1.5em; - -webkit-transform: translateZ(0); - -ms-transform: translateZ(0); - transform: translateZ(0); - -webkit-animation: load8 1.1s infinite linear; - animation: load8 1.1s infinite linear; -} -@-webkit-keyframes load8 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes load8 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -.leadin-loader-button.loading .leadin-loader { - opacity: 1; -} - -.leadin-loader-button.loading .leadin-loader-button-content { - opacity: 0; -} diff --git a/wp/wp-content/plugins/leadin/public/assets/style/leadin.css b/wp/wp-content/plugins/leadin/public/assets/style/leadin.css deleted file mode 100644 index 7528d54d..00000000 --- a/wp/wp-content/plugins/leadin/public/assets/style/leadin.css +++ /dev/null @@ -1,312 +0,0 @@ -@charset "UTF-8"; - -/* For sprocket icon on WordPress admin menu */ -@font-face { - font-family: 'hs-font'; - src: url('fonts/hs-font.woff') format('woff'), - url('fonts/hs-font.svg#hs-font') format('svg'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'Lexend Deca'; - src: url('fonts/LexendDeca-Light.woff2') format('woff2'), - url('fonts/LexendDeca-Medium.woff2') format('woff2'), - url('fonts/LexendDeca-SemiBold.woff2') format('woff2'), - url('fonts/LexendDeca-Bold.woff2') format('woff2'); -} - -#wp-admin-bar-leadin-admin-menu .ab-icon:before, -.dashicons-sprocket:before { - font-family: 'hs-font' !important; - content: attr(data-icon); - font-style: normal !important; - font-weight: normal !important; - font-variant: normal !important; - text-transform: none !important; - speak: none; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -#wp-admin-bar-leadin-admin-menu .ab-icon:before, -.dashicons-sprocket:before { - content: '\61'; -} - -/* Button */ -.leadin-button { - font-size: 14px; - line-height: 14px; - padding: 12px 24px; - font-weight: 500; - border: 1px solid #ff7a59; - border-radius: 3px; - transition: all 0.15s; - transition-timing-function: ease-out; - text-decoration: none; -} - -.leadin-loader-button { - position: relative; -} - -.leadin-button.loading { - background-color: #fff; - color: #ff7a59; - transition-timing-function: ease-out; -} - -.leadin-button.loading:hover { - background-color: #fff8f6; -} - -.leadin-button.loading:active { - background-color: #ffebe6; -} - -.leadin-primary-button { - background-color: #ff7a59; - color: #fff; -} - -.leadin-primary-button:hover { - background-color: #ff8f73; - border-color: #ff8f73; - color: #fff; -} - -.leadin-primary-button:active { - background-color: #e66e50; - border-color: #e66e50; -} - -.leadin-secondary-button { - background-color: #fff; - color: #ff7a53; -} - -.leadin-secondary-button:hover { - background-color: #fff8f6; -} - -.leadin-secondary-button:active { - background-color: #ffebe6; -} - -/* Notice */ -.leadin-notice { - height: fit-content; - padding-top: 27px; - padding-bottom: 27px; -} - -.leadin-notice__logo { - float: left; - padding-left: 20px; - margin-top: -10px; -} - -.leadin-notice__logo > img { - height: 30px; -} - -.leadin-notice__title, -.leadin-notice__content { - margin-left: 25px; -} - -.leadin-notice__title { - font-weight: bold; - font-size: 18px; -} - -.leadin-notice__content { - margin-top: 10px; -} - -.leadin-notice__options { - display: flex; - flex-direction: column; - margin-top: 15px; -} - -.leadin-notice__footer { - display: flex; - margin-top: 15px; -} - -.leadin-notice__footer-text { - display: flex; - flex-direction: column; - margin-left: 10px; -} - -.leadin-notice__footer-image { - margin-top: auto; - margin-bottom: auto; -} - -.leadin-notice__cta { - padding: 6px 14px; - font-size: 13px; - font-weight: normal; -} - -.leadin-banner.notice-warning { - border-left-color: #ff7a59; -} - -.leadin-banner__link { - font-weight: 500; -} - -.leadin-review-banner { - position: relative; - padding: 20px 28px 26px 28px; - color: #5f5f5f; -} - -.leadin-review-banner--hide { - display: none; -} - -.leadin-review-banner__dismiss { - position: absolute; - top: 0; - right: 0; - padding: 22px; -} - -.leadin-review-banner__content { - min-height: 74px; -} - -.leadin-review-banner__content-body { - margin-top: 8px; -} - -.leadin-review-banner__text { - margin: 0 !important; - padding: 0 !important; - - font-size: 14px; - font-weight: 400; - line-height: 19px; -} - -.leadin-review-banner__author { - display: flex; - align-items: center; - flex-direction: row; - gap: 8px; - margin-top: 6px; -} - -.leadin-review-banner__profile { - margin-right: 8px; -} - -#toplevel_page_leadin a[href*='leadin_settings'], -#toplevel_page_leadin a[href*='leadin_user_guide'], -#toplevel_page_leadin a[href*='leadin_forms'], -#toplevel_page_leadin a[href*='leadin_chatflows'], -#toplevel_page_leadin a.leadin_lists_link, -#toplevel_page_leadin a.leadin_reporting_link, -#toplevel_page_leadin a.leadin_contacts_link, -#toplevel_page_leadin a.leadin_email_link, -#toplevel_page_leadin a.leadin_pricing_link { - display: inherit; -} - -#toplevel_page_leadin a[href*='leadin_lists'], -#toplevel_page_leadin a[href*='leadin_reporting'], -#toplevel_page_leadin a[href*='leadin_pricing'], -#toplevel_page_leadin a[href*='leadin_contacts'], -#toplevel_page_leadin a[href*='leadin_email'] { - display: none !important; -} - -#toplevel_page_leadin a[href*='leadin_pricing'] + .external_link { - color: #ff7a59 !important; -} - -#toplevel_page_leadin a[href*='leadin_pricing'] + .external_link:hover { - color: #ffbcac !important; -} - -#toplevel_page_leadin a[href*='leadin_pricing'] + .external_link::after { - background-color: #ff7a59; -} - -#toplevel_page_leadin a[href*='leadin_pricing'] + .external_link:hover::after { - background-color: #ffbcac; -} - -#toplevel_page_leadin .external_link:hover::after { - background-color: #72aee6; -} - -#toplevel_page_leadin .external_link::after { - content: ''; - -webkit-mask: url('../images/external_link.svg') no-repeat 50% 50%; - mask: url('../images/external_link.svg') no-repeat 50% 50%; - -webkit-mask-size: cover; - mask-size: cover; - position: absolute; - height: 12px; - width: 12px; - background-size: contain; - margin: 4px 2px; - background-color: rgba(240, 246, 252, 0.7); -} - -/* Needed to prevent the notice banners being shown briefly under the iframe */ -#leadin-iframe-container { - position: absolute; - top: 0; - height: 100% !important; - width: 100% !important; - left: 0; - z-index: 2; -} - -#leadin-iframe-fallback-container { - position: absolute; - top: 0; - height: 100% !important; - width: 100% !important; - left: 0; - background: white; - z-index: 1; -} - -.elementor-element-editable .hubspot-form-edit-mode + .hubspot-widget-empty, -.elementor-element-editable .hubspot-meeting-edit-mode + .hubspot-widget-empty { - display: none; -} - -.hubspot-form-edit-mode ~ .hbspt-form, -.hubspot-meeting-edit-mode ~ .meetings-iframe-container { - pointer-events: none; -} - -.hubspot-widget-empty { - background-image: url('../images/hubspot.svg'); - background-color: #f5f8fa; - background-repeat: no-repeat; - background-position: center 25px; - background-size: 120px; - color: #33475b; - font-family: 'Lexend Deca', Helvetica, Arial, sans-serif; - font-size: 14px; - padding: 90px 20% 25px; -} - -.hubspot-widget-empty p { - font-size: inherit !important; - line-height: 24px; - margin: 4px 0; -} diff --git a/wp/wp-content/plugins/leadin/public/auth/class-oauth.php b/wp/wp-content/plugins/leadin/public/auth/class-oauth.php deleted file mode 100644 index 6687dda0..00000000 --- a/wp/wp-content/plugins/leadin/public/auth/class-oauth.php +++ /dev/null @@ -1,80 +0,0 @@ -add_category( - 'hubspot', - array( - 'title' => esc_html__( 'Hubspot', 'leadin' ), - 'icon' => 'fa fa-plug', - ) - ); - } - - /** - * Register widgets for Elementor. - * - * @param object $widgets_manager elementor widget manager. - */ - public function register_elementor_widgets( $widgets_manager ) { - $widgets_manager->register( new ElementorForm() ); - $widgets_manager->register( new ElementorMeeting() ); - } - - /** - * Register controls for elementor widget - * - * @param object $controls_manager elementor controls manager. - */ - public function register_hsselectors_control( $controls_manager ) { - $controls_manager->register( new ElementorFormSelect() ); - $controls_manager->register( new ElementorMeetingSelect() ); - } - -} - diff --git a/wp/wp-content/plugins/leadin/public/class-pagehooks.php b/wp/wp-content/plugins/leadin/public/class-pagehooks.php deleted file mode 100644 index 6c4de5db..00000000 --- a/wp/wp-content/plugins/leadin/public/class-pagehooks.php +++ /dev/null @@ -1,149 +0,0 @@ - 'post', // specify a post type here. - 'type' => 'string', - 'single' => true, - 'show_in_rest' => true, - 'auth_callback' => function () { - return current_user_can( 'edit_posts' ); - }, - ) - ); - } - - /** - * Adds the script loader to the page. - */ - public function add_frontend_scripts() { - if ( Portal_Options::get_disable_internal_tracking() && ( is_user_logged_in() || current_user_can( 'install_plugins' ) ) ) { - return; - } - - if ( is_single() ) { - $page_type = 'post'; - } elseif ( is_front_page() ) { - $page_type = 'home'; - } elseif ( is_archive() ) { - $page_type = 'archive'; - } elseif ( is_page() ) { - $page_type = 'page'; - } else { - $page_type = 'other'; - } - - $leadin_wordpress_info = array( - 'userRole' => User::get_role(), - 'pageType' => $page_type, - 'leadinPluginVersion' => LEADIN_PLUGIN_VERSION, - ); - - AssetsManager::enqueue_script_loader( $leadin_wordpress_info ); - } - - /** - * Adds the script containing the information needed by the script loader. - */ - public function add_page_analytics() { - $portal_id = Portal_Options::get_portal_id(); - - if ( empty( $portal_id ) ) { - echo ''; - } else { - $content_type = Filters::apply_page_content_type_filters(); - $page_id = get_the_ID(); - $post_meta = get_post_meta( $page_id ); - if ( isset( $post_meta['content-type'][0] ) && '' !== $post_meta['content-type'][0] ) { - $content_type = $post_meta['content-type'][0]; - } elseif ( is_plugin_active( 'elementor/elementor.php' ) ) { - $page_settings_manager = \Elementor\Core\Settings\Manager::get_settings_managers( 'page' ); - $page_settings_model = $page_settings_manager->get_model( $page_id ); - $elementor_content_type = $page_settings_model->get_settings( 'content_type' ); - if ( ! empty( $elementor_content_type ) ) { - $content_type = $elementor_content_type; - } - } - - ?> - - - - - * - * @param String $tag tag name. - * @param String $handle handle. - */ - public function add_id_to_tracking_code( $tag, $handle ) { - if ( AssetsManager::TRACKING_CODE === $handle ) { - $tag = str_replace( "id='" . $handle . "-js'", "async defer id='hs-script-loader'", $tag ); - } - return $tag; - } - - /** - * Add defer to leadin forms plugin - * - * @param String $tag tag name. - * @param String $handle handle. - */ - public function add_defer_to_forms_script( $tag, $handle ) { - if ( AssetsManager::FORMS_SCRIPT === $handle ) { - $tag = str_replace( 'src', 'defer src', $tag ); - } - return $tag; - } - - /** - * Parse leadin shortcodes - * - * @param array $attributes Shortcode attributes. - */ - public function leadin_add_hubspot_shortcode( $attributes ) { - return ShortcodeRenderUtils::render_shortcode( $attributes ); - } - -} diff --git a/wp/wp-content/plugins/leadin/public/data/class-filters.php b/wp/wp-content/plugins/leadin/public/data/class-filters.php deleted file mode 100644 index b0a897c1..00000000 --- a/wp/wp-content/plugins/leadin/public/data/class-filters.php +++ /dev/null @@ -1,173 +0,0 @@ -roles; - $user_role = array_shift( $user_roles ); - } else { - $user_role = 'visitor'; - } - - return $user_role; - } - - /** - * Return true if the current user has the `manage_options` capability. - */ - public static function is_admin() { - return current_user_can( 'manage_options' ); - } - - /** - * Set metadata for current user - * - * @param String $key metadata key to store data in. - * @param String $data metadata value to store. - */ - public static function set_metadata( $key, $data ) { - update_user_meta( get_current_user_id(), $key, $data ); - } - - /** - * Fetch metadata stored for this user by key - * - * @param String $key metadata to retrieve by the key. - */ - public static function get_metadata( $key ) { - return get_user_meta( get_current_user_id(), $key, true ); - } - - /** - * Delete metadata associated with this user - * - * @param String $key key to delete metadata for. - */ - public static function delete_metadata( $key ) { - delete_user_meta( get_current_user_id(), $key ); - } -} diff --git a/wp/wp-content/plugins/leadin/public/includes/api-loader.php b/wp/wp-content/plugins/leadin/public/includes/api-loader.php deleted file mode 100644 index e693d55d..00000000 --- a/wp/wp-content/plugins/leadin/public/includes/api-loader.php +++ /dev/null @@ -1,27 +0,0 @@ - $methods, - 'callback' => $callback, - 'permission_callback' => array( $this, 'verify_permissions' ), - ) - ); - } - - /** - * Register an admin route with given parameters - * - * @param string $path The path for the route to register the service on. Route gets namespaced with leadin/v1. - * @param string $methods Comma seperated list of methods allowed for this route. - * @param array $callback Method to execute when this endpoint is requested. - */ - public function register_leadin_admin_route( $path, $methods, $callback ) { - register_rest_route( - 'leadin/v1', - $path, - array( - 'methods' => $methods, - 'callback' => $callback, - 'permission_callback' => array( $this, 'verify_admin_permissions' ), - ) - ); - } - - - /** - * Permissions required by user to execute the request. User permissions are already - * verified by nonce 'wp_rest' automatically. - * - * @return bool true if the user has adequate permissions for this endpoint. - */ - public function verify_permissions() { - return current_user_can( Filters::apply_view_plugin_menu_capability_filters() ); - } - - /** - * Permissions required by user to execute the request. User permissions are already - * verified by nonce 'wp_rest' automatically. - * - * @return bool true if the user has adequate admin permissions for this endpoint. - */ - public function verify_admin_permissions() { - return current_user_can( Filters::apply_connect_plugin_capability_filters() ); - } - -} diff --git a/wp/wp-content/plugins/leadin/public/modules/api/class-healthcheck-api-controller.php b/wp/wp-content/plugins/leadin/public/modules/api/class-healthcheck-api-controller.php deleted file mode 100644 index b820d26f..00000000 --- a/wp/wp-content/plugins/leadin/public/modules/api/class-healthcheck-api-controller.php +++ /dev/null @@ -1,33 +0,0 @@ - $error, - ), - intval( $code ) - ); - } - - /** - * Send JSON response with a message key. - * - * @param String $message Message to be sent on te JSON. - */ - public static function send_message( $message ) { - self::send( - array( - 'message' => $message, - ), - 200 - ); - } -} diff --git a/wp/wp-content/plugins/leadin/public/utils/class-shortcoderenderutils.php b/wp/wp-content/plugins/leadin/public/utils/class-shortcoderenderutils.php deleted file mode 100644 index d07c987d..00000000 --- a/wp/wp-content/plugins/leadin/public/utils/class-shortcoderenderutils.php +++ /dev/null @@ -1,179 +0,0 @@ - null ), $shortcode_attrs ); - - $type = $parsed_attributes['type']; - if ( ! isset( $type ) ) { - return; - } - - switch ( $type ) { - case 'form': - return self::render_form( $shortcode_attrs ); - case 'cta': - return self::render_cta( $shortcode_attrs ); - case 'meeting': - return self::render_meeting( $shortcode_attrs ); - } - } - - /** - * Render form leadin shortcodes - * - * @param array $attrs Shortcode attributes. - */ - private static function render_form( $attrs ) { - $parsed_attributes = shortcode_atts( - array( - 'portal' => null, - 'id' => null, - ), - $attrs - ); - - $portal_id = $parsed_attributes['portal']; - $id = $parsed_attributes['id']; - - if ( ! isset( $portal_id ) || ! isset( $id ) || ! is_numeric( $portal_id ) || - ! ( self::is_valid_uuid( $id ) || is_numeric( $id ) ) ) { - return; - } - - $form_div_uuid = self::generate_div_uuid(); - $hublet = Filters::apply_hublet_filters(); - AssetsManager::enqueue_forms_script(); - return ' - -
'; - } - - /** - * Render cta leadin shortcodes - * - * @param array $attrs Shortcode attributes. - */ - private static function render_cta( $attrs ) { - $parsed_attributes = shortcode_atts( - array( - 'portal' => null, - 'id' => null, - ), - $attrs - ); - - $portal_id = $parsed_attributes['portal']; - $id = $parsed_attributes['id']; - - if ( ! isset( $portal_id ) || ! isset( $id ) || ! is_numeric( $portal_id ) || - ! ( self::is_valid_uuid( $id ) || is_numeric( $id ) ) ) { - return; - } - - return ' - - - - - - New call-to-action - - - <' . 'script charset="utf-8" src="//js.hubspot.com/cta/current.js"> - - - - '; - } - - /** - * Render meeting leadin shortcodes - * - * @param array $attrs Shortcode attributes. - */ - private static function render_meeting( $attrs ) { - $parsed_attributes = shortcode_atts( - array( - 'url' => null, - ), - $attrs - ); - - $url = esc_url_raw( $parsed_attributes['url'] ); - - if ( filter_var( $url, FILTER_VALIDATE_URL ) === false ) { - return; - } - - AssetsManager::enqueue_meetings_script(); - - return ' -
- - '; - } - - /** - * Generates 10 characters long string with random values - */ - private static function get_random_number_string() { - $result = ''; - for ( $i = 0; $i < 10; $i++ ) { - $result .= wp_rand( 0, 9 ); - } - return $result; - } - - /** - * Generates a unique uuid - */ - private static function generate_div_uuid() { - return time() * 1000 . '-' . self::get_random_number_string(); - } - - /** - * Checks if input is a valid uuid. - * - * @param String $uuid input to validate. - */ - private static function is_valid_uuid( $uuid ) { - if ( ! is_string( $uuid ) || ( preg_match( '/^[a-f\d]{8}(-[a-f\d]{4}){4}[a-f\d]{8}$/i', $uuid ) !== 1 ) ) { - return false; - } - return true; - } - -} diff --git a/wp/wp-content/plugins/leadin/public/utils/class-versions.php b/wp/wp-content/plugins/leadin/public/utils/class-versions.php deleted file mode 100644 index 6be01a6d..00000000 --- a/wp/wp-content/plugins/leadin/public/utils/class-versions.php +++ /dev/null @@ -1,62 +0,0 @@ - 6.4.2 - * - * @param String $version version. - */ - private static function parse_version( $version ) { - preg_match( '/^\d+(\.\d+){0,2}/', $version, $match ); - if ( empty( $match ) ) { - return ''; - } - return $match[0]; - } - - /** - * Return the current WordPress version. - */ - public static function get_wp_version() { - global $wp_version; - return self::parse_version( $wp_version ); - } - - /** - * Return the current PHP version. - */ - public static function get_php_version() { - return self::parse_version( phpversion() ); - } - - /** - * Return true if the current PHP version is not supported. - */ - public static function is_php_version_not_supported() { - return version_compare( phpversion(), LEADIN_REQUIRED_PHP_VERSION, '<' ); - } - - /** - * Return true if the current WordPress version is not supported. - */ - public static function is_wp_version_not_supported() { - global $wp_version; - return version_compare( $wp_version, LEADIN_REQUIRED_WP_VERSION, '<' ); - } - - /** - * Return true if a given version is less than the supported version - * - * @param String $version Given version to check. - * @param String $version_to_compare The version number to test the given version against. - */ - public static function is_version_less_than( $version, $version_to_compare ) { - return version_compare( $version, $version_to_compare, '<' ); - } -} diff --git a/wp/wp-content/plugins/leadin/public/wp/class-page.php b/wp/wp-content/plugins/leadin/public/wp/class-page.php deleted file mode 100644 index 87a2abf9..00000000 --- a/wp/wp-content/plugins/leadin/public/wp/class-page.php +++ /dev/null @@ -1,33 +0,0 @@ -is_block_editor() ) { - // Gutenberg page on 5+. - return true; - } - return false; - } - - /** - * Return true if the current page is the WP Admin dashboard. - */ - public static function is_dashboard() { - $screen = get_current_screen(); - return 'dashboard' === $screen->id; - } -} diff --git a/wp/wp-content/plugins/leadin/readme.md b/wp/wp-content/plugins/leadin/readme.md deleted file mode 100644 index c63fa456..00000000 --- a/wp/wp-content/plugins/leadin/readme.md +++ /dev/null @@ -1,7 +0,0 @@ -# Leadin plugin - -## How to build - -- yarn install -- yarn build -- yarn plugin-zip diff --git a/wp/wp-content/plugins/leadin/readme.txt b/wp/wp-content/plugins/leadin/readme.txt deleted file mode 100644 index c39ffd4f..00000000 --- a/wp/wp-content/plugins/leadin/readme.txt +++ /dev/null @@ -1,429 +0,0 @@ -=== HubSpot - CRM, Email Marketing, Live Chat, Forms & Analytics === -Contributors: HubSpotDev, leadin -License: GPLv3 -License URI: http://www.gnu.org/licenses/gpl.html -Tags: CRM, Marketing, Live Chat, Forms, Analytics, popups, newsletter, contact management, chat, contact form, marketing automation -Requires at least: 5.8 -Tested up to: 6.4.1 -Requires PHP: 7.2 -Stable tag: 11.1.21 - -The CRM, Sales, and Marketing WordPress plugin to grow your business better. - -Capture, organize, and engage web visitors with free live chat, forms, CRM (contact management), email marketing, and analytics. Easy to use, no coding. - -== Description == - -*HubSpot is a CRM platform with all the tools and integrations you need for marketing, sales, and customer service. Each product in the platform is powerful alone, but the real magic happens when you use them together. See for yourself in the free HubSpot WordPress plugin.* - -Build a relationship with your audience and grow your business with HubSpot. HubSpot's all-in-one WordPress plugin allows you to manage contacts (CRM), create the best email marketing campaigns, engage visitors with live chat and chatbots, add beautiful forms to pages, and more. - -Use HubSpot to: - -- 💬 Connect with visitors on your site in real-time using live chat and chatbots. -- 📋 Capture leads with ease — build custom forms or link existing forms from your website in minutes. -- 📧 Nurture your leads by sending newsletters & automating email marketing campaigns. -- 📠Track the health of your business with easy-to-understand analytics dashboards. -- 🚀 See a unified timeline of a contact’s page views, past conversations, and more in the smart WordPress CRM plugin. - -Ready to get started? Click download in the top right corner of the page. - -### CRM & Contact Management Platform -Your CRM in the HubSpot WordPress plugin is your company's command center. It's the place where you can track every single customer interaction and get a 360-degree view of your customers. You can even use it to manage or automate marketing, sales, and service processes.] - -With HubSpot CRM, you don't need to jump from tool to tool to keep track of everything. Instead, you can store all of your data in one place. - -HubSpot’s free WordPress CRM gives you ultimate visibility into customer interactions across every team in your organization. That means that everyone will be on the same page—from marketing to sales to customer service—and able to help your customers more effectively. - -Best of all, if you’re planning on growing your business (or you already are), HubSpot has the tools to grow with you. - -Features of our top WordPress CRM that you'll love, suited specifically for your business needs: - -✅ Lead generation & lead management on your WordPress website -✅ Pipeline management -✅ WordPress email marketing -✅ WordPress reporting dashboard -✅ Contact management -✅ Prospect tracking - -Streamline your entire business with the free CRM solution that has something for everyone. Try the HubSpot CRM plugin today. - -### [Email Newsletter & Marketing Automation Software](https://www.hubspot.com/products/wordpress/email-marketing) -Would you like to enhance your WordPress email marketing campaigns or build the best email newsletter templates? 🤔 - -Maybe you'd like to explore different automation features, build professional emails in minutes, and send them to your entire contact database with ease. - -Try the HubSpot WordPress email marketing plugin today. Customers love our free email marketing software for features like: - -🤩 **20+ pre-designed free email templates to match your campaign goals. (Choose from free newsletter templates, eBooks, welcome emails, and more!)** - -> All you have to do is add your content and press send! - -⚒️ **Drag and drop WordPress newsletter builder.** - -> Build beautiful newsletter templates with the HubSpot WordPress plugin. Create custom newsletter templates effortlessly with a drag-and-drop builder. - -> Test out newsletters before you send them, schedule publications for the best time to convert, optimize for mobile devices, and save your own email designs to use again later. - -> Send newsletters to targeted contact lists all within the free WordPress newsletter plugin tool.. - -> Adjust typography, designs, colors, and more to create email campaigns your subscribers will love! - -🤖 **Email automation software, email tracking, and A/B testing tools.** - -> Send automated emails anytime someone fills out a form or engages with your live chat & chatbots. You can send messages immediately or use email scheduling to send messages later. - -> Setup an A/B test of your newsletter while designing it. Test out different email calls to action and optimize your newsletters with the best performing versions. - -Email is one of the most effective ways to stay connected to your audience. With email tracking, all of your emails are logged in your database. You can measure email engagement with reports for delivery rates, open rates, and click-through rates — and use that information to improve campaigns. - -### [Live Chat & Chatbots](https://www.hubspot.com/products/wordpress/live-chat) -Make your website a 24-hour marketing machine on autopilot with the HubSpot WordPress live chat plugin. - -Live website chat inside the HubSpot WordPress plugin streamlines the customer experience, making it easier than ever for you to engage with website visitors leads, convert them into customers, and provide them with the support they need. - -HubSpot’s free WordPress live chat solution software offers: - -🀠Custom styling to match your website -🤖 A variety of chatbot options including: - -- ✅ Concierge chatbot -- ✅ Qualify leads chatbot -- ✅ Meetings chatbot -- ✅ Tickets chatbot -- ✅ Knowledge base & support chatbot -- ✅ Offline chatbot - -📲 Real-time live messaging on the go via HubSpot’s mobile app -👨‍💻 A Slack integration to receive and respond to live chat notifications -🕠24/7 live chat support on autopilot - -Our free live chat plugin feature helps you turn website visitors into customers by providing insightful, real-time support. - -### [Forms & Popups](https://www.hubspot.com/products/wordpress/forms) -Want to know the easiest way to learn more about your visitors? - -*Ask them directly.* - -The problem is that forms can come in so many different shapes and sizes that it's hard to know where to start. That's why HubSpot has options for you. - -​​HubSpot's form builder and popup plugin give you the power to create or edit forms in just a few clicks. - -First, get familiar with our different form types: - -✅ Embedded -✅ Standalone page -✅ Pop-up box -✅ Dropdown banner -✅ Slide in left/right box - -Then, when you're ready to go, pick a custom template: - -✅ Contact us -✅ Newsletter sign up form template -✅ Support template -✅ eBook download template -✅ Event registration template -✅ More coming soon - -Choose from a variety of settings, color schemes, and fonts — or start from scratch. HubSpot comes with an intuitive form and popup builder that simplifies the process, no matter what type of form you have in mind. - -Rather stick with your existing forms and popup plugin? That’s fine too! HubSpot integrates with most WordPress form builders, form creators, and popup builders out-of-the-box so you don’t have to worry about a thing. - -### [Live Chat & Chatbots](https://www.hubspot.com/products/wordpress/live-chat) -Make your website a 24-hour marketing machine on autopilot. - -Live web chat inside the HubSpot WordPress plugin streamlines the customer experience, making it easier than ever for you to engage with leads, convert them into customers, and provide them with the support they need. - -HubSpot’s WordPress live chat software offers: - -🀠Custom styling to match your website -🤖 A variety of bot options including: - -- ✅ Concierge bot -- ✅ Qualify leads bot -- ✅ Meetings bot -- ✅ Tickets bot -- ✅ Knowledge base & support bot -- ✅ Offline bot - -📲 Real-time messaging on the go via HubSpot’s mobile app -👨‍💻 A Slack integration to receive and respond to chat notifications -🕠24/7 live support on autopilot - -Our free live chat feature helps you turn website visitors into customers by providing insightful, real-time support. - -### [Analytics](https://www.hubspot.com/products/wordpress/analytics) - -Customers are browsing your website, but what are they actually looking at? - -The HubSpot WordPress plugin gives you a straightforward, visual answer. - -With built-in marketing analytics (email analytics, web traffic analytics, WordPress analytics), it's easy to understand which marketing actions are driving the most results… and which ones you need to fix. Quickly see how your forms, popup forms, live chat & chatbots, email marketing, and sales follow-ups are helping grow your business. - -👩‍💻 **Get a complete picture of who's on your site.** - -What pages are being looked at? Who is visiting the pages? How long do they stay on-site? What parts of the site do they spend the most time on? With our plugin, you'll be able to see everything about your visitor behavior in one place—and learn how to convert them into customers! - -📠**Get detailed reports across marketing channels.** - -Create detailed reports on performance of various assets, from blog posts and landing pages to email campaigns and more. Arrange these views in dashboards in your plugin, so you can easily see the performance of your website and make data-driven decisions. - -### Seamless Integrations -Ready to get started? Now you can easily integrate HubSpot with over 1030 integrations including: - -💻 **Social Media Software, Analytics, & Advertising Software Integrations** - -✅ Adroll -✅ Facebook Ads -✅ Facebook Messenger -✅ Google Ads -✅ Hotjar -✅ Instagram -✅ Linkedin Ads -✅ Twitter -✅ YouTube - -📲 **Communications & Design Integrations** - -✅ Canva -✅ HelloSign -✅ Slack -✅ Vidyard -✅ Integromat -✅ Zoom - -🖥️ **CRM, Email Marketing, & Marketing Automation Integrations** - -✅ Active Campaign -✅ Campaign Monitor -✅ Constant Contact -✅ Drip -✅ Gmail -✅ Hustle -✅ Mailchimp -✅ Ontraport -✅ Outlook -✅ Salesforce -✅ Sendinblue -✅ WP Fusion -✅ Zoho -✅ Neverbounce -✅ Email Delivery Optimization by Seventh Sense - -💵 **E-commerce (Online Store), Recurring Payment, & Payment Processing Integrations** - -✅ BigCommerce -✅ Shopify -✅ Stripe -✅ WooCommerce - -📆 **Events & Meeting Scheduling Software Integrations** - -✅ Calendly -✅ Eventbrite -✅ The Events Calendar - -📋 **Forms, Landing Page Builders, & CRO Integrations** - -✅ Elementor -✅ Formidable Forms -✅ Forminator -✅ Gravity Forms -✅ Instapage -✅ JotForm -✅ Kali Forms -✅ MailOptIn -✅ Ninja Forms -✅ OptInMonster -✅ Sumo -✅ Survey Monkey -✅ Typeform -✅ Unbounce -✅ WPForms - -💬 **Live Chat & Customer Support Software Integrations** - -✅ Drift -✅ Front -✅ Help Scout -✅ Intercom -✅ LiveChat -✅ Pure Chat -✅ Zendesk -✅ Sakari SMS -✅ Treble.ai - -🔋 **Productivity & Project Management Software Integrations** - -✅ Asana -✅ Jira - -### What are people saying about the HubSpot plugin? - -> “HubSpot was a big factor in helping us scale WP Buffs to $1M in revenue. Their plugin and sales CRM made our sales process so much more professional and kept us fully organized as we grew from 1 salesperson to 4. Plus, the reporting dashboards allow me to know where our sales game is strong and where we can still improve with just a few clicks. Needless to say, I'm all in on HubSpot.” – **Joe Howard, Founder & CEO, WP Buffs** - -> “HubSpot educates marketers beyond just the anonymous web analytics they get from Google Analytics. Instead, it digs down to individual users.” – **Michael Shoup, Founder / CEO, 12South Marketing** - -> “HubSpot dramatically cuts down the time I spend on marketing. We used to spend tons of time generating very few inbound leads, but those numbers have gone through the roof with minimal effort.” – **Brian Ruhlmann, Director of Sales & Marketing, AdmitHub** - -== Installation == - -= Search = - -The easiest way to install this plugin is to use the WordPress Admin interface. - -- Go to your admin dashboard -- Find the "Plugins" menu -- Click on "Add New" -- Search for "HubSpot" -- Click "Install Now" -- Go to your "Plugins" menu -- Click "Activate" on the HubSpot - CRM, Email Marketing, Live Chat, Forms & Analytics plugin -- Log in or sign up for a HubSpot account - -Your WordPress site and HubSpot account will be connected and you're ready to get started with HubSpot - CRM, Email Marketing, Live Chat, Forms & Analytics. - -= Upload = - -1. Upload the 'leadin' folder to the '/wp-content/plugins/' directory -2. Activate the plugin through the 'Plugins' menu in WordPress - -Having trouble? Check out our help documentation - -== Frequently Asked Questions == - -= Requirements = - -- Your website or blog must be using WordPress.org version 3.7 or higher on your server. We recommend the latest version. -- The plugin cannot be installed on WordPress.com sites, as they do not allow you to add plugins or Javascript. -- The wp_footer function must be included in your WordPress theme’s footer file (footer.php). -- This function is required for our Javascript snippet to be installed on every page of your site. -- You must be a WordPress admin to be able to install plugins for your site. If you are not the admin, you can forward these instructions to the person who manages your WordPress install. - -= What does the plugin do? = - -HubSpot's WordPress plugin allows you to use HubSpot email marketing, CRM, forms, popups, analytics, and live chat on your WordPress website. This plugin gives you all the tools you need to grow your business and delight your contacts and customers. - -= What is HubSpot? = - -HubSpot is an all-in-one CRM platform that provides a marketing, sales, and customer service products to help you grow your business. - -= Who should use HubSpot? = - -HubSpot is perfect for agencies, business owners (including small businesses and e-commerce companies), bloggers, designers, or anyone with a WordPress website that wants to use a seamless CRM plugin with built-in marketing tools. 135,000+ companies in 100+ countries already use HubSpot to grow their businesses. - -= Are coding skills needed to use the HubSpot WordPress plugin? = - -Not at all! HubSpot’s WordPress plugin is easy to download and starts working seamlessly with your WordPress site right away. You can take advantage of our CRM, live chat, email marketing, forms, and much more without the need to code. - -= What is available for free with HubSpot? = - -With HubSpot’s WordPress plugin, you can use the free CRM software for email marketing, contact management, live chat, customer service, content creation, content management, and more. HubSpot’s full suite of free tools is perfect for small businesses looking to grow and streamline their tech stack. is free to use with forms, contact management, email marketing, and more. - -HubSpot also has paid tiers available for those who want more advanced functionality like blogging, landing pages, search engine optimization (SEO), team email, retargeting, lead scoring, bots, email scheduling, NPS surveys, calls-to-action (CTAs), knowledge base, and more. If you'd like a complete view of the features offered in HubSpot's free and paid tiers, view our pricing page. - -Our CRM for Wordpress is powered by HubSpot’s free CRM. - -= Do I need to install a Wordpress SMTP plugin to use HubSpot's email feature? = - -No, there’s no need to install an additional mail SMTP plugin. - -Unlike other Wordpress form plugins and email plugins that send messages using a PHP mail function, HubSpot is a stand-alone email marketing software. You can define your IMAP and SMTP from your existing mail service (Gmail, Outlook, Yahoo) and stop worrying about email deliverability from within WordPress. - -= What types of forms and popups can I build with HubSpot? = - -Here are some examples of the types of forms and popups you can create with HubSpot: - -- advanced forms -- announcement popup -- appointment form -- banner bar -- calculator form -- conditional form -- conditional logic form -- contact button form -- contact form popup -- contact forms -- coupon popup -- custom form -- custom forms -- custom popup -- custom popups -- donation form -- email form -- email forms -- email submit form -- event form -- exit intent popup forms -- exit popup -- feedback form -- file upload form -- floating bar popup -- inline signup form -- lightbox popup -- mobile popup -- multi page form -- newsletter form -- newsletter popup -- order form -- payment form -- pdf form -- popup form -- quiz form -- quote form -- quote request form -- registration popup -- scroll trigger popup -- signature form -- signup form -- slide-in popup -- slide-in scroll popup -- star rating form -- sticky bar -- sticky popup -- subscription form -- survey form -- survey popup -- targeted popup -- time on site popup -- upload form -- user registration form -- web contact form -- web form -- welcome mat popup -- woocommerce popup - -Rather use your existing form tool? HubSpot integrates with most WordPress form builders and popup builders. - -= Does HubSpot support e-commerce stores? = - -The HubSpot WordPress plugin is great for many types of businesses including ecommerce. For WooCommerce shop owners, consider the HubSpot for WooCommerce plugin for even added functionality in your shop. - -= My question is not listed. = - -Please visit the HubSpot Community for more detailed documentation and support. Thank you! - -== Screenshots == - -1. Measure impact with reports. -2. Organize, track, and nurture your leads in your free HubSpot CRM. -3. Your website forms will automatically sync with your HubSpot CRM. -4. Nurture and convert leads with lists and email. -5. Send contacts a beautiful, effective and personalized email. -6. Add live chat to your website and easily engage & help your site visitors. -7. Add 24/7 chatbots to your website to help automate lead capture and support. -8. Create beautiful forms and popups on your website in minutes using the intuitive drag and drop builder. - -== Changelog == - -Full changelog here -- Current version: 11.1.21 -- Version release date: 2024-06-04 - -= 11.1.21 (2024-06-04) = -* Improve load performance by removing redundant retry logic - -= 11.1.20 (2024-05-31) = -* Remove extra logs - diff --git a/wp/wp-content/plugins/leadin/scripts/api/wordpressApiClient.ts b/wp/wp-content/plugins/leadin/scripts/api/wordpressApiClient.ts deleted file mode 100644 index 31fa798e..00000000 --- a/wp/wp-content/plugins/leadin/scripts/api/wordpressApiClient.ts +++ /dev/null @@ -1,82 +0,0 @@ -import $ from 'jquery'; - -import Raven from '../lib/Raven'; -import { restNonce, restUrl } from '../constants/leadinConfig'; -import { addQueryObjectToUrl } from '../utils/queryParams'; - -function makeRequest( - method: string, - path: string, - data: any = {}, - queryParams = {} -): Promise { - // eslint-disable-next-line compat/compat - const restApiUrl = new URL(`${restUrl}leadin/v1${path}`); - addQueryObjectToUrl(restApiUrl, queryParams); - - return new Promise((resolve, reject) => { - const payload: { [key: string]: any } = { - url: restApiUrl.toString(), - method, - contentType: 'application/json', - beforeSend: (xhr: any) => xhr.setRequestHeader('X-WP-Nonce', restNonce), - success: resolve, - error: (response: any) => { - Raven.captureMessage( - `HTTP Request to ${restApiUrl} failed with error ${response.status}: ${response.responseText}`, - { - fingerprint: [ - '{{ default }}', - path, - response.status, - response.responseText, - ], - } - ); - reject(response); - }, - }; - - if (method !== 'get') { - payload.data = JSON.stringify(data); - } - - $.ajax(payload); - }); -} - -export function healthcheckRestApi() { - return makeRequest('get', '/healthcheck'); -} - -export function disableInternalTracking(value: boolean) { - return makeRequest('put', '/internal-tracking', value ? '1' : '0'); -} - -export function fetchDisableInternalTracking() { - return makeRequest('get', '/internal-tracking').then(message => ({ - message, - })); -} - -export function updateHublet(hublet: string) { - return makeRequest('put', '/hublet', { hublet }); -} - -export function skipReview() { - return makeRequest('post', '/skip-review'); -} - -export function trackConsent(canTrack: boolean) { - return makeRequest('post', '/track-consent', { canTrack }).then(message => ({ - message, - })); -} - -export function setBusinessUnitId(businessUnitId: number) { - return makeRequest('put', '/business-unit', { businessUnitId }); -} - -export function getBusinessUnitId() { - return makeRequest('get', '/business-unit'); -} diff --git a/wp/wp-content/plugins/leadin/scripts/constants/defaultFormOptions.ts b/wp/wp-content/plugins/leadin/scripts/constants/defaultFormOptions.ts deleted file mode 100644 index 8396848b..00000000 --- a/wp/wp-content/plugins/leadin/scripts/constants/defaultFormOptions.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { __ } from '@wordpress/i18n'; - -const REGISTRATION_FORM = 'REGISTRATION_FORM'; -const CONTACT_US_FORM = 'CONTACT_US_FORM'; -const NEWSLETTER_FORM = 'NEWSLETTER_FORM'; -const SUPPORT_FORM = 'SUPPORT_FORM'; -const EVENT_FORM = 'EVENT_FORM'; - -export type FormType = - | typeof REGISTRATION_FORM - | typeof CONTACT_US_FORM - | typeof NEWSLETTER_FORM - | typeof SUPPORT_FORM - | typeof EVENT_FORM; - -export const DEFAULT_OPTIONS = { - label: __('Templates', 'leadin'), - options: [ - { label: __('Registration Form', 'leadin'), value: REGISTRATION_FORM }, - { label: __('Contact us Form', 'leadin'), value: CONTACT_US_FORM }, - { label: __('Newsletter sign-up Form', 'leadin'), value: NEWSLETTER_FORM }, - { label: __('Support Form', 'leadin'), value: SUPPORT_FORM }, - { label: __('Event Registration Form', 'leadin'), value: EVENT_FORM }, - ], -}; - -export function isDefaultForm(value: FormType) { - return ( - value === REGISTRATION_FORM || - value === CONTACT_US_FORM || - value === NEWSLETTER_FORM || - value === SUPPORT_FORM || - value === EVENT_FORM - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/constants/leadinConfig.ts b/wp/wp-content/plugins/leadin/scripts/constants/leadinConfig.ts deleted file mode 100644 index b4b22020..00000000 --- a/wp/wp-content/plugins/leadin/scripts/constants/leadinConfig.ts +++ /dev/null @@ -1,138 +0,0 @@ -interface KeyStringObject { - [key: string]: string; -} - -export type ContentEmbedDetails = { - activated: boolean; - installed: boolean; - canActivate: boolean; - canInstall: boolean; - nonce: string; -}; - -export interface LeadinConfig { - accountName: string; - adminUrl: string; - activationTime: string; - connectionStatus?: 'Connected' | 'NotConnected'; - deviceId: string; - didDisconnect: '1' | '0'; - env: string; - formsScript: string; - meetingsScript: string; - formsScriptPayload: string; - hublet: string; - hubspotBaseUrl: string; - hubspotNonce: string; - iframeUrl: string; - impactLink?: string; - lastAuthorizeTime: string; - lastDeauthorizeTime: string; - lastDisconnectTime: string; - leadinPluginVersion: string; - leadinQueryParams: KeyStringObject; - loginUrl: string; - locale: string; - phpVersion: string; - pluginPath: string; - plugins: KeyStringObject; - portalDomain: string; - portalEmail: string; - portalId: number; - redirectNonce: string; - restNonce: string; - restUrl: string; - reviewSkippedDate: string; - refreshToken?: string; - theme: string; - trackConsent?: boolean | string; - wpVersion: string; - contentEmbed: ContentEmbedDetails; - requiresContentEmbedScope?: boolean; - refreshTokenError?: string; -} - -const { - accountName, - adminUrl, - activationTime, - connectionStatus, - deviceId, - didDisconnect, - env, - formsScript, - meetingsScript, - formsScriptPayload, - hublet, - hubspotBaseUrl, - hubspotNonce, - iframeUrl, - impactLink, - lastAuthorizeTime, - lastDeauthorizeTime, - lastDisconnectTime, - leadinPluginVersion, - leadinQueryParams, - locale, - loginUrl, - phpVersion, - pluginPath, - plugins, - portalDomain, - portalEmail, - portalId, - redirectNonce, - restNonce, - restUrl, - refreshToken, - reviewSkippedDate, - theme, - trackConsent, - wpVersion, - contentEmbed, - requiresContentEmbedScope, - refreshTokenError, -}: //@ts-expect-error global -LeadinConfig = window.leadinConfig; - -export { - accountName, - adminUrl, - activationTime, - connectionStatus, - deviceId, - didDisconnect, - env, - formsScript, - meetingsScript, - formsScriptPayload, - hublet, - hubspotBaseUrl, - hubspotNonce, - iframeUrl, - impactLink, - lastAuthorizeTime, - lastDeauthorizeTime, - lastDisconnectTime, - leadinPluginVersion, - leadinQueryParams, - loginUrl, - locale, - phpVersion, - pluginPath, - plugins, - portalDomain, - portalEmail, - portalId, - redirectNonce, - restNonce, - restUrl, - refreshToken, - reviewSkippedDate, - theme, - trackConsent, - wpVersion, - contentEmbed, - requiresContentEmbedScope, - refreshTokenError, -}; diff --git a/wp/wp-content/plugins/leadin/scripts/constants/selectors.ts b/wp/wp-content/plugins/leadin/scripts/constants/selectors.ts deleted file mode 100644 index 9afb2402..00000000 --- a/wp/wp-content/plugins/leadin/scripts/constants/selectors.ts +++ /dev/null @@ -1,19 +0,0 @@ -export const domElements = { - iframe: '#leadin-iframe', - subMenu: '.toplevel_page_leadin > ul', - subMenuLinks: '.toplevel_page_leadin > ul a', - subMenuButtons: '.toplevel_page_leadin > ul > li', - deactivatePluginButton: '[data-slug="leadin"] .deactivate a', - deactivateFeedbackForm: 'form.leadin-deactivate-form', - deactivateFeedbackSubmit: 'button#leadin-feedback-submit', - deactivateFeedbackSkip: 'button#leadin-feedback-skip', - thickboxModalClose: '.leadin-modal-close', - thickboxModalWindow: 'div#TB_window.thickbox-loading', - thickboxModalContent: 'div#TB_ajaxContent.TB_modal', - reviewBannerContainer: '#leadin-review-banner', - reviewBannerLeaveReviewLink: 'a#leave-review-button', - reviewBannerDismissButton: 'a#dismiss-review-banner-button', - leadinIframeContainer: 'leadin-iframe-container', - leadinIframe: 'leadin-iframe', - leadinIframeFallbackContainer: 'leadin-iframe-fallback-container', -}; diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/Common/ConnectPluginBanner.tsx b/wp/wp-content/plugins/leadin/scripts/elementor/Common/ConnectPluginBanner.tsx deleted file mode 100644 index 9cbe2b45..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/Common/ConnectPluginBanner.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import ElementorBanner from './ElementorBanner'; -import { __ } from '@wordpress/i18n'; - -export default function ConnectPluginBanner() { - return ( - - ' - ) - .replace('%2$s', ''), - }} - > - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/Common/ElementorBanner.tsx b/wp/wp-content/plugins/leadin/scripts/elementor/Common/ElementorBanner.tsx deleted file mode 100644 index 4a35799f..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/Common/ElementorBanner.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; - -interface IElementorBannerProps { - type?: string; -} - -export default function ElementorBanner({ - type = 'warning', - children, -}: React.PropsWithChildren) { - return ( -
-
- {children} -
-
- ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/Common/ElementorButton.tsx b/wp/wp-content/plugins/leadin/scripts/elementor/Common/ElementorButton.tsx deleted file mode 100644 index e041f8c8..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/Common/ElementorButton.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { styled } from '@linaria/react'; -import React from 'react'; - -const Container = styled.div` - display: flex; - justify-content: center; - padding-bottom: 8px; -`; - -export default function ElementorButton({ - children, - ...params -}: React.PropsWithChildren>) { - return ( - - - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/Common/ElementorWrapper.ts b/wp/wp-content/plugins/leadin/scripts/elementor/Common/ElementorWrapper.ts deleted file mode 100644 index 169fd90b..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/Common/ElementorWrapper.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { styled } from '@linaria/react'; - -interface IElementorWrapperProps { - pluginPath?: string; -} - -export default styled.div` - background-image: ${props => - `url(${props.pluginPath}/plugin/assets/images/hubspot.svg)`}; - background-color: #f5f8fa; - background-repeat: no-repeat; - background-position: center 25px; - background-size: 120px; - color: #33475b; - font-family: 'Lexend Deca', Helvetica, Arial, sans-serif; - font-size: 14px; - - padding: ${(props: any) => props.padding || '90px 20% 25px'}; - - p { - font-size: inherit !important; - line-height: 24px; - margin: 4px 0; - } -`; diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/ElementorFormSelect.tsx b/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/ElementorFormSelect.tsx deleted file mode 100644 index ef2768dd..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/ElementorFormSelect.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import React, { useState, useEffect, Fragment } from 'react'; -import { portalId, refreshToken } from '../../constants/leadinConfig'; -import ElementorBanner from '../Common/ElementorBanner'; -import UISpinner from '../../shared/UIComponents/UISpinner'; -import { __ } from '@wordpress/i18n'; -import { - BackgroudAppContext, - useBackgroundAppContext, -} from '../../iframe/useBackgroundApp'; -import useForms from './hooks/useForms'; -import { getOrCreateBackgroundApp } from '../../utils/backgroundAppUtils'; - -interface IElementorFormSelectProps { - formId: string; - setAttributes: Function; -} - -function ElementorFormSelect({ - formId, - setAttributes, -}: IElementorFormSelectProps) { - const { hasError, forms, loading } = useForms(); - - return loading ? ( -
- -
- ) : hasError ? ( - - {__('Please refresh your forms or try again in a few minutes', 'leadin')} - - ) : ( - - ); -} - -function ElementorFormSelectWrapper(props: IElementorFormSelectProps) { - const isBackgroundAppReady = useBackgroundAppContext(); - - return ( - - {!isBackgroundAppReady ? ( -
- -
- ) : ( - - )} -
- ); -} - -export default function ElementorFormSelectContainer( - props: IElementorFormSelectProps -) { - return ( - - - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/FormControlController.tsx b/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/FormControlController.tsx deleted file mode 100644 index f78756e7..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/FormControlController.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React, { Fragment } from 'react'; -import { connectionStatus } from '../../constants/leadinConfig'; -import ConnectPluginBanner from '../Common/ConnectPluginBanner'; -import ElementorFormSelect from './ElementorFormSelect'; -import { IFormAttributes } from './registerFormWidget'; - -const ConnectionStatus = { - Connected: 'Connected', - NotConnected: 'NotConnected', -}; - -export default function FormControlController( - attributes: IFormAttributes, - setValue: Function -) { - return () => { - const render = () => { - if (connectionStatus === ConnectionStatus.Connected) { - return ( - - ); - } else { - return ; - } - }; - return {render()}; - }; -} diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/FormWidgetController.tsx b/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/FormWidgetController.tsx deleted file mode 100644 index ca7a5266..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/FormWidgetController.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import React, { Fragment } from 'react'; -import { connectionStatus } from '../../constants/leadinConfig'; -import ErrorHandler from '../../shared/Common/ErrorHandler'; -import FormEdit from '../../shared/Form/FormEdit'; -import ConnectionStatus from '../../shared/enums/connectionStatus'; -import { IFormAttributes } from './registerFormWidget'; - -export default function FormWidgetController( - attributes: IFormAttributes, - setValue: Function -) { - return () => { - const render = () => { - if (connectionStatus === ConnectionStatus.Connected) { - return ( - - ); - } else { - return ; - } - }; - return {render()}; - }; -} diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/hooks/useForms.ts b/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/hooks/useForms.ts deleted file mode 100644 index 4ebe3d08..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/hooks/useForms.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { useState, useEffect } from 'react'; -import LoadState, { LoadStateType } from '../../../shared/enums/loadState'; -import { ProxyMessages } from '../../../iframe/integratedMessages'; -import { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp'; -import { IForm } from '../../../shared/types'; - -interface FormOption { - label: string; - value: string; -} - -export default function useForms() { - const proxy = usePostAsyncBackgroundMessage(); - const [loadState, setLoadState] = useState( - LoadState.NotLoaded - ); - const [hasError, setError] = useState(null); - const [forms, setForms] = useState([]); - - useEffect(() => { - if (loadState === LoadState.NotLoaded) { - proxy({ - key: ProxyMessages.FetchForms, - payload: { - search: '', - }, - }) - .then(data => { - setForms( - data.map((form: IForm) => ({ - label: form.name, - value: form.guid, - })) - ); - setLoadState(LoadState.Loaded); - }) - .catch(error => { - setError(error); - setLoadState(LoadState.Failed); - }); - } - }, [loadState]); - - return { forms, loading: loadState === LoadState.Loading, hasError }; -} diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/registerFormWidget.ts b/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/registerFormWidget.ts deleted file mode 100644 index a92ae509..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/FormWidget/registerFormWidget.ts +++ /dev/null @@ -1,44 +0,0 @@ -import ReactDOM from 'react-dom'; -import FormControlController from './FormControlController'; -import FormWidgetController from './FormWidgetController'; - -export interface IFormAttributes { - formId: string; - formName: string; - portalId: string; -} - -export default class registerFormWidget { - widgetContainer: Element; - attributes: IFormAttributes; - controlContainer: Element; - setValue: Function; - - constructor(controlContainer: any, widgetContainer: any, setValue: Function) { - const attributes = widgetContainer.dataset.attributes - ? JSON.parse(widgetContainer.dataset.attributes) - : {}; - - this.widgetContainer = widgetContainer; - this.controlContainer = controlContainer; - this.setValue = setValue; - this.attributes = attributes; - } - - render() { - ReactDOM.render( - FormWidgetController(this.attributes, this.setValue)(), - this.widgetContainer - ); - - ReactDOM.render( - FormControlController(this.attributes, this.setValue)(), - this.controlContainer - ); - } - - done() { - ReactDOM.unmountComponentAtNode(this.widgetContainer); - ReactDOM.unmountComponentAtNode(this.controlContainer); - } -} diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/ElementorMeetingSelect.tsx b/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/ElementorMeetingSelect.tsx deleted file mode 100644 index b744287b..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/ElementorMeetingSelect.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import React, { Fragment, useState } from 'react'; -import ElementorBanner from '../Common/ElementorBanner'; -import UISpinner from '../../shared/UIComponents/UISpinner'; -import ElementorMeetingWarning from './ElementorMeetingWarning'; -import useMeetings, { - useSelectedMeetingCalendar, -} from '../../shared/Meeting/hooks/useMeetings'; -import { __ } from '@wordpress/i18n'; -import Raven from 'raven-js'; -import { - BackgroudAppContext, - useBackgroundAppContext, -} from '../../iframe/useBackgroundApp'; -import { refreshToken } from '../../constants/leadinConfig'; -import { getOrCreateBackgroundApp } from '../../utils/backgroundAppUtils'; - -interface IElementorMeetingSelectProps { - url: string; - setAttributes: Function; -} - -function ElementorMeetingSelect({ - url, - setAttributes, -}: IElementorMeetingSelectProps) { - const { - mappedMeetings: meetings, - loading, - error, - reload, - connectCalendar, - } = useMeetings(); - const selectedMeetingCalendar = useSelectedMeetingCalendar(url); - const [localUrl, setLocalUrl] = useState(url); - - const handleConnectCalendar = () => { - return connectCalendar() - .then(() => { - reload(); - }) - .catch(error => { - Raven.captureMessage('Unable to connect calendar', { - extra: { error }, - }); - }); - }; - - return ( - - {loading ? ( -
- -
- ) : error ? ( - - {__( - 'Please refresh your meetings or try again in a few minutes', - 'leadin' - )} - - ) : ( - - {selectedMeetingCalendar && ( - - )} - {meetings.length > 1 && ( - - )} - - )} -
- ); -} - -function ElementorMeetingSelectWrapper(props: IElementorMeetingSelectProps) { - const isBackgroundAppReady = useBackgroundAppContext(); - - return ( - - {!isBackgroundAppReady ? ( -
- -
- ) : ( - - )} -
- ); -} - -export default function ElementorMeetingsSelectContainer( - props: IElementorMeetingSelectProps -) { - return ( - - - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx b/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx deleted file mode 100644 index b0f6d607..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/ElementorMeetingWarning.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import React, { Fragment } from 'react'; -import { CURRENT_USER_CALENDAR_MISSING } from '../../shared/Meeting/constants'; -import ElementorButton from '../Common/ElementorButton'; -import ElementorBanner from '../Common/ElementorBanner'; -import { styled } from '@linaria/react'; -import { __ } from '@wordpress/i18n'; - -const Container = styled.div` - padding-bottom: 8px; -`; - -interface IMeetingWarningPros { - onConnectCalendar: React.MouseEventHandler; - status: string; -} - -export default function MeetingWarning({ - onConnectCalendar, - status, -}: IMeetingWarningPros) { - const isMeetingOwner = status === CURRENT_USER_CALENDAR_MISSING; - const titleText = isMeetingOwner - ? __('Your calendar is not connected', 'leadin') - : __('Calendar is not connected', 'leadin'); - const titleMessage = isMeetingOwner - ? __( - 'Please connect your calendar to activate your scheduling pages', - 'leadin' - ) - : __( - 'Make sure that everybody in this meeting has connected their calendar from the Meetings page in HubSpot', - 'leadin' - ); - return ( - - - - {titleText} -
- {titleMessage} -
-
- {isMeetingOwner && ( - - {__('Connect calendar', 'leadin')} - - )} -
- ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/MeetingControlController.tsx b/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/MeetingControlController.tsx deleted file mode 100644 index be25296e..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/MeetingControlController.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React, { Fragment } from 'react'; -import { connectionStatus } from '../../constants/leadinConfig'; -import ConnectPluginBanner from '../Common/ConnectPluginBanner'; -import ElementorMeetingSelect from './ElementorMeetingSelect'; -import { IMeetingAttributes } from './registerMeetingWidget'; - -const ConnectionStatus = { - Connected: 'Connected', - NotConnected: 'NotConnected', -}; - -export default function MeetingControlController( - attributes: IMeetingAttributes, - setValue: Function -) { - return () => { - const render = () => { - if (connectionStatus === ConnectionStatus.Connected) { - return ( - - ); - } else { - return ; - } - }; - return {render()}; - }; -} diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/MeetingWidgetController.tsx b/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/MeetingWidgetController.tsx deleted file mode 100644 index a34ceccd..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/MeetingWidgetController.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React, { Fragment } from 'react'; -import { connectionStatus } from '../../constants/leadinConfig'; -import ErrorHandler from '../../shared/Common/ErrorHandler'; -import MeetingsEdit from '../../shared/Meeting/MeetingEdit'; -import { IMeetingAttributes } from './registerMeetingWidget'; - -const ConnectionStatus = { - Connected: 'Connected', - NotConnected: 'NotConnected', -}; - -export default function MeetingWidgetController( - attributes: IMeetingAttributes, - setValue: Function -) { - return () => { - const render = () => { - if (connectionStatus === ConnectionStatus.Connected) { - return ( - - ); - } else { - return ; - } - }; - return {render()}; - }; -} diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/registerMeetingWidget.ts b/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/registerMeetingWidget.ts deleted file mode 100644 index 7c890f4b..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/MeetingWidget/registerMeetingWidget.ts +++ /dev/null @@ -1,42 +0,0 @@ -import ReactDOM from 'react-dom'; -import MeetingControlController from './MeetingControlController'; -import MeetingWidgetController from './MeetingWidgetController'; - -export interface IMeetingAttributes { - url: string; -} - -export default class registerMeetingsWidget { - widgetContainer: Element; - controlContainer: Element; - setValue: Function; - attributes: IMeetingAttributes; - - constructor(controlContainer: any, widgetContainer: any, setValue: Function) { - const attributes = widgetContainer.dataset.attributes - ? JSON.parse(widgetContainer.dataset.attributes) - : {}; - - this.widgetContainer = widgetContainer; - this.controlContainer = controlContainer; - this.setValue = setValue; - this.attributes = attributes; - } - - render() { - ReactDOM.render( - MeetingWidgetController(this.attributes, this.setValue)(), - this.widgetContainer - ); - - ReactDOM.render( - MeetingControlController(this.attributes, this.setValue)(), - this.controlContainer - ); - } - - done() { - ReactDOM.unmountComponentAtNode(this.widgetContainer); - ReactDOM.unmountComponentAtNode(this.controlContainer); - } -} diff --git a/wp/wp-content/plugins/leadin/scripts/elementor/elementorWidget.ts b/wp/wp-content/plugins/leadin/scripts/elementor/elementorWidget.ts deleted file mode 100644 index 905d0f08..00000000 --- a/wp/wp-content/plugins/leadin/scripts/elementor/elementorWidget.ts +++ /dev/null @@ -1,46 +0,0 @@ -export default function elementorWidget( - elementor: any, - options: any, - callback: Function, - done = () => {} -) { - return elementor.modules.controls.BaseData.extend({ - onReady() { - const self = this; - const controlContainer = this.ui.contentEditable.prevObject[0].querySelector( - options.controlSelector - ); - let widgetContainer = this.options.element.$el[0].querySelector( - options.containerSelector - ); - if (widgetContainer) { - callback(controlContainer, widgetContainer, (args: any) => - self.setValue(args) - ); - } else { - //@ts-expect-error global - window.elementorFrontend.hooks.addAction( - `frontend/element_ready/${options.widgetName}.default`, - (element: HTMLElement[]) => { - widgetContainer = element[0].querySelector( - options.containerSelector - ); - callback(controlContainer, widgetContainer, (args: any) => - self.setValue(args) - ); - } - ); - } - }, - saveValue(props: any) { - this.setValue(props); - }, - onBeforeDestroy() { - //@ts-expect-error global - window.elementorFrontend.hooks.removeAction( - `frontend/element_ready/${options.widgetName}.default` - ); - done(); - }, - }); -} diff --git a/wp/wp-content/plugins/leadin/scripts/entries/app.ts b/wp/wp-content/plugins/leadin/scripts/entries/app.ts deleted file mode 100644 index 18f769a8..00000000 --- a/wp/wp-content/plugins/leadin/scripts/entries/app.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { initAppOnReady } from '../utils/appUtils'; -import renderIframeApp from '../iframe/renderIframeApp'; - -initAppOnReady(renderIframeApp); diff --git a/wp/wp-content/plugins/leadin/scripts/entries/elementor.ts b/wp/wp-content/plugins/leadin/scripts/entries/elementor.ts deleted file mode 100644 index 43e986e3..00000000 --- a/wp/wp-content/plugins/leadin/scripts/entries/elementor.ts +++ /dev/null @@ -1,79 +0,0 @@ -import elementorWidget from '../elementor/elementorWidget'; -import registerFormWidget from '../elementor/FormWidget/registerFormWidget'; -import { initBackgroundApp } from '../utils/backgroundAppUtils'; -import registerMeetingsWidget from '../elementor/MeetingWidget/registerMeetingWidget'; - -const ELEMENTOR_READY_INTERVAL = 500; -const MAX_POLL_TIMEOUT = 30000; - -const registerElementorWidgets = () => { - initBackgroundApp(() => { - let FormWidget: any; - let MeetingsWidget: any; - - const leadinSelectFormItemView = elementorWidget( - //@ts-expect-error global - window.elementor, - { - widgetName: 'hubspot-form', - controlSelector: '.elementor-hbspt-form-selector', - containerSelector: '.hubspot-form-edit-mode', - }, - (controlContainer: any, widgetContainer: any, setValue: Function) => { - FormWidget = new registerFormWidget( - controlContainer, - widgetContainer, - setValue - ); - FormWidget.render(); - }, - () => { - FormWidget.done(); - } - ); - - const leadinSelectMeetingItemView = elementorWidget( - //@ts-expect-error global - window.elementor, - { - widgetName: 'hubspot-meeting', - controlSelector: '.elementor-hbspt-meeting-selector', - containerSelector: '.hubspot-meeting-edit-mode', - }, - (controlContainer: any, widgetContainer: any, setValue: Function) => { - MeetingsWidget = new registerMeetingsWidget( - controlContainer, - widgetContainer, - setValue - ); - MeetingsWidget.render(); - }, - () => { - MeetingsWidget.done(); - } - ); - - //@ts-expect-error global - window.elementor.addControlView( - 'leadinformselect', - leadinSelectFormItemView - ); - //@ts-expect-error global - window.elementor.addControlView( - 'leadinmeetingselect', - leadinSelectMeetingItemView - ); - }); -}; - -const pollForElementorReady = setInterval(() => { - const elementorFrontend = (window as any).elementorFrontend; - if (elementorFrontend) { - registerElementorWidgets(); - clearInterval(pollForElementorReady); - } -}, ELEMENTOR_READY_INTERVAL); - -setTimeout(() => { - clearInterval(pollForElementorReady); -}, MAX_POLL_TIMEOUT); diff --git a/wp/wp-content/plugins/leadin/scripts/entries/feedback.ts b/wp/wp-content/plugins/leadin/scripts/entries/feedback.ts deleted file mode 100644 index 548c8c59..00000000 --- a/wp/wp-content/plugins/leadin/scripts/entries/feedback.ts +++ /dev/null @@ -1,68 +0,0 @@ -import $ from 'jquery'; -import Raven from '../lib/Raven'; -import { domElements } from '../constants/selectors'; -import ThickBoxModal from '../feedback/ThickBoxModal'; -import { submitFeedbackForm } from '../feedback/feedbackFormApi'; -import { - getOrCreateBackgroundApp, - initBackgroundApp, -} from '../utils/backgroundAppUtils'; -import { refreshToken } from '../constants/leadinConfig'; -import { ProxyMessages } from '../iframe/integratedMessages'; - -function deactivatePlugin() { - const href = $(domElements.deactivatePluginButton).attr('href'); - if (href) { - window.location.href = href; - } -} - -function setLoadingState() { - $(domElements.deactivateFeedbackSubmit).addClass('loading'); -} - -function submitAndDeactivate(e: Event) { - e.preventDefault(); - setLoadingState(); - const feedback = $(domElements.deactivateFeedbackForm) - .serializeArray() - .find(field => field.name === 'feedback'); - - submitFeedbackForm(domElements.deactivateFeedbackForm) - .then(() => { - if (feedback && refreshToken) { - const embedder = getOrCreateBackgroundApp(refreshToken); - embedder.postMessage({ - key: ProxyMessages.TrackPluginDeactivation, - payload: { - type: feedback.value.trim().replace(/[\s']+/g, '_'), - }, - }); - } - }) - .catch((err: Error) => { - Raven.captureException(err); - }) - .finally(() => { - deactivatePlugin(); - }); -} - -function init() { - // eslint-disable-next-line no-new - new ThickBoxModal( - domElements.deactivatePluginButton, - 'leadin-feedback-container', - 'leadin-feedback-window', - 'leadin-feedback-content' - ); - - $(domElements.deactivateFeedbackForm) - .off('submit') - .on('submit', submitAndDeactivate); - $(domElements.deactivateFeedbackSkip) - .off('click') - .on('click', deactivatePlugin); -} - -initBackgroundApp(init); diff --git a/wp/wp-content/plugins/leadin/scripts/entries/gutenberg.ts b/wp/wp-content/plugins/leadin/scripts/entries/gutenberg.ts deleted file mode 100644 index 240bf73b..00000000 --- a/wp/wp-content/plugins/leadin/scripts/entries/gutenberg.ts +++ /dev/null @@ -1,10 +0,0 @@ -import registerFormBlock from '../gutenberg/FormBlock/registerFormBlock'; -import { registerHubspotSidebar } from '../gutenberg/Sidebar/contentType'; -import registerMeetingBlock from '../gutenberg/MeetingsBlock/registerMeetingBlock'; -import { initBackgroundApp } from '../utils/backgroundAppUtils'; - -initBackgroundApp([ - registerFormBlock, - registerMeetingBlock, - registerHubspotSidebar, -]); diff --git a/wp/wp-content/plugins/leadin/scripts/entries/reviewBanner.ts b/wp/wp-content/plugins/leadin/scripts/entries/reviewBanner.ts deleted file mode 100644 index 280b70aa..00000000 --- a/wp/wp-content/plugins/leadin/scripts/entries/reviewBanner.ts +++ /dev/null @@ -1,64 +0,0 @@ -import $ from 'jquery'; -import { - getOrCreateBackgroundApp, - initBackgroundApp, -} from '../utils/backgroundAppUtils'; -import { domElements } from '../constants/selectors'; -import { refreshToken, activationTime } from '../constants/leadinConfig'; -import { ProxyMessages } from '../iframe/integratedMessages'; - -const REVIEW_BANNER_INTRO_PERIOD_DAYS = 15; - -const userIsAfterIntroductoryPeriod = () => { - const activationDate = new Date(+activationTime * 1000); - const currentDate = new Date(); - const timeElapsed = new Date( - currentDate.getTime() - activationDate.getTime() - ); - - return timeElapsed.getUTCDate() - 1 >= REVIEW_BANNER_INTRO_PERIOD_DAYS; -}; - -/** - * Adds some methods to window when review banner is - * displayed to monitor events - */ -export function initMonitorReviewBanner() { - if (refreshToken) { - const embedder = getOrCreateBackgroundApp(refreshToken); - const container = $(domElements.reviewBannerContainer); - if (container && userIsAfterIntroductoryPeriod()) { - $(domElements.reviewBannerLeaveReviewLink) - .off('click') - .on('click', () => { - embedder.postMessage({ - key: ProxyMessages.TrackReviewBannerInteraction, - }); - }); - - $(domElements.reviewBannerDismissButton) - .off('click') - .on('click', () => { - embedder.postMessage({ - key: ProxyMessages.TrackReviewBannerDismissed, - }); - }); - - embedder - .postAsyncMessage({ - key: ProxyMessages.FetchContactsCreateSinceActivation, - payload: +activationTime * 1000, - }) - .then(({ total }: any) => { - if (total >= 5) { - container.removeClass('leadin-review-banner--hide'); - embedder.postMessage({ - key: ProxyMessages.TrackReviewBannerRender, - }); - } - }); - } - } -} - -initBackgroundApp(initMonitorReviewBanner); diff --git a/wp/wp-content/plugins/leadin/scripts/feedback/ThickBoxModal.ts b/wp/wp-content/plugins/leadin/scripts/feedback/ThickBoxModal.ts deleted file mode 100644 index c76e9519..00000000 --- a/wp/wp-content/plugins/leadin/scripts/feedback/ThickBoxModal.ts +++ /dev/null @@ -1,50 +0,0 @@ -import $ from 'jquery'; -import { domElements } from '../constants/selectors'; - -export default class ThickBoxModal { - openTriggerSelector: string; - inlineContentId: string; - windowCssClass: string; - contentCssClass: string; - - constructor( - openTriggerSelector: string, - inlineContentId: string, - windowCssClass: string, - contentCssClass: string - ) { - this.openTriggerSelector = openTriggerSelector; - this.inlineContentId = inlineContentId; - this.windowCssClass = windowCssClass; - this.contentCssClass = contentCssClass; - - $(openTriggerSelector).on('click', this.init.bind(this)); - } - - close() { - //@ts-expect-error global - window.tb_remove(); - } - - init(e: Event) { - //@ts-expect-error global - window.tb_show( - '', - `#TB_inline?inlineId=${this.inlineContentId}&modal=true` - ); - // thickbox doesn't respect the width and height url parameters https://core.trac.wordpress.org/ticket/17249 - // We override thickboxes css with !important in the css - $(domElements.thickboxModalWindow).addClass(this.windowCssClass); - - // have to modify the css of the thickbox content container as well - $(domElements.thickboxModalContent).addClass(this.contentCssClass); - - // we unbind previous handlers because a thickbox modal is a single global object. - // Everytime it is re-opened, it still has old handlers bound - $(domElements.thickboxModalClose) - .off('click') - .on('click', this.close); - - e.preventDefault(); - } -} diff --git a/wp/wp-content/plugins/leadin/scripts/feedback/feedbackFormApi.ts b/wp/wp-content/plugins/leadin/scripts/feedback/feedbackFormApi.ts deleted file mode 100644 index 817fff49..00000000 --- a/wp/wp-content/plugins/leadin/scripts/feedback/feedbackFormApi.ts +++ /dev/null @@ -1,23 +0,0 @@ -import $ from 'jquery'; - -const portalId = '6275621'; -const formId = '0e8807f8-2ac3-4664-b742-44552bfa09e2'; -const formSubmissionUrl = `https://api.hsforms.com/submissions/v3/integration/submit/${portalId}/${formId}`; - -export function submitFeedbackForm(formSelector: string) { - const formSubmissionPayload = { - fields: $(formSelector).serializeArray(), - skipValidation: true, - }; - - return new Promise((resolve, reject) => { - $.ajax({ - type: 'POST', - url: formSubmissionUrl, - contentType: 'application/json', - data: JSON.stringify(formSubmissionPayload), - success: resolve, - error: reject, - }); - }); -} diff --git a/wp/wp-content/plugins/leadin/scripts/gutenberg/Common/CalendarIcon.tsx b/wp/wp-content/plugins/leadin/scripts/gutenberg/Common/CalendarIcon.tsx deleted file mode 100644 index 105497c5..00000000 --- a/wp/wp-content/plugins/leadin/scripts/gutenberg/Common/CalendarIcon.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from 'react'; - -export default function CalendarIcon() { - return ( - - - - - - - - - - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/gutenberg/Common/SidebarSprocketIcon.tsx b/wp/wp-content/plugins/leadin/scripts/gutenberg/Common/SidebarSprocketIcon.tsx deleted file mode 100644 index c642d1a0..00000000 --- a/wp/wp-content/plugins/leadin/scripts/gutenberg/Common/SidebarSprocketIcon.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; - -export default function SidebarSprocketIcon() { - return ( - - - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/gutenberg/Common/SprocketIcon.tsx b/wp/wp-content/plugins/leadin/scripts/gutenberg/Common/SprocketIcon.tsx deleted file mode 100644 index 0fad5d88..00000000 --- a/wp/wp-content/plugins/leadin/scripts/gutenberg/Common/SprocketIcon.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import React from 'react'; - -export default function SprocketIcon() { - return ( - - - - - - - - - - - - - - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/gutenberg/FormBlock/FormBlockSave.tsx b/wp/wp-content/plugins/leadin/scripts/gutenberg/FormBlock/FormBlockSave.tsx deleted file mode 100644 index 3877790a..00000000 --- a/wp/wp-content/plugins/leadin/scripts/gutenberg/FormBlock/FormBlockSave.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; -import { RawHTML } from '@wordpress/element'; -import { IFormBlockAttributes } from './registerFormBlock'; - -export default function FormSaveBlock({ attributes }: IFormBlockAttributes) { - const { portalId, formId } = attributes; - - if (portalId && formId) { - return ( - - {`[hubspot portal="${portalId}" id="${formId}" type="form"]`} - - ); - } - return null; -} diff --git a/wp/wp-content/plugins/leadin/scripts/gutenberg/FormBlock/FormGutenbergPreview.tsx b/wp/wp-content/plugins/leadin/scripts/gutenberg/FormBlock/FormGutenbergPreview.tsx deleted file mode 100644 index 2278af8c..00000000 --- a/wp/wp-content/plugins/leadin/scripts/gutenberg/FormBlock/FormGutenbergPreview.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React, { Fragment } from 'react'; -import { pluginPath } from '../../constants/leadinConfig'; -import UIImage from '../UIComponents/UIImage'; - -export default function FormGutenbergPreview() { - return ( - - - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/gutenberg/FormBlock/registerFormBlock.tsx b/wp/wp-content/plugins/leadin/scripts/gutenberg/FormBlock/registerFormBlock.tsx deleted file mode 100644 index 6cc9b1e6..00000000 --- a/wp/wp-content/plugins/leadin/scripts/gutenberg/FormBlock/registerFormBlock.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import React from 'react'; -import * as WpBlocksApi from '@wordpress/blocks'; -import SprocketIcon from '../Common/SprocketIcon'; -import FormBlockSave from './FormBlockSave'; -import { connectionStatus } from '../../constants/leadinConfig'; -import FormGutenbergPreview from './FormGutenbergPreview'; -import ErrorHandler from '../../shared/Common/ErrorHandler'; -import FormEdit from '../../shared/Form/FormEdit'; -import ConnectionStatus from '../../shared/enums/connectionStatus'; -import { __ } from '@wordpress/i18n'; -import { isFullSiteEditor } from '../../utils/withMetaData'; - -export interface IFormBlockAttributes { - attributes: { - portalId: string; - formId: string; - preview?: boolean; - formName: string; - }; -} - -export interface IFormBlockProps extends IFormBlockAttributes { - setAttributes: Function; - isSelected: boolean; - context?: any; -} - -export default function registerFormBlock() { - const editComponent = (props: IFormBlockProps) => { - if (props.attributes.preview) { - return ; - } else if (connectionStatus === ConnectionStatus.Connected) { - return ; - } else { - return ; - } - }; - - // We do not support the full site editor: https://issues.hubspotcentral.com/browse/WP-1033 - if (!WpBlocksApi || isFullSiteEditor()) { - return null; - } - - WpBlocksApi.registerBlockType('leadin/hubspot-form-block', { - title: __('HubSpot Form', 'leadin'), - description: __('Select and embed a HubSpot form', 'leadin'), - icon: SprocketIcon, - category: 'leadin-blocks', - attributes: { - portalId: { - type: 'string', - default: '', - } as WpBlocksApi.BlockAttribute, - formId: { - type: 'string', - } as WpBlocksApi.BlockAttribute, - formName: { - type: 'string', - } as WpBlocksApi.BlockAttribute, - preview: { - type: 'boolean', - default: false, - } as WpBlocksApi.BlockAttribute, - }, - example: { - attributes: { - preview: true, - }, - }, - edit: editComponent, - save: props => , - }); -} diff --git a/wp/wp-content/plugins/leadin/scripts/gutenberg/MeetingsBlock/MeetingGutenbergPreview.tsx b/wp/wp-content/plugins/leadin/scripts/gutenberg/MeetingsBlock/MeetingGutenbergPreview.tsx deleted file mode 100644 index fcc75fee..00000000 --- a/wp/wp-content/plugins/leadin/scripts/gutenberg/MeetingsBlock/MeetingGutenbergPreview.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React, { Fragment } from 'react'; -import { pluginPath } from '../../constants/leadinConfig'; -import UIImage from '../UIComponents/UIImage'; - -export default function MeetingGutenbergPreview() { - return ( - - - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/gutenberg/MeetingsBlock/MeetingSaveBlock.tsx b/wp/wp-content/plugins/leadin/scripts/gutenberg/MeetingsBlock/MeetingSaveBlock.tsx deleted file mode 100644 index 9501bb43..00000000 --- a/wp/wp-content/plugins/leadin/scripts/gutenberg/MeetingsBlock/MeetingSaveBlock.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; -import { RawHTML } from '@wordpress/element'; -import { IMeetingBlockAttributes } from './registerMeetingBlock'; - -export default function MeetingSaveBlock({ - attributes, -}: IMeetingBlockAttributes) { - const { url } = attributes; - - if (url) { - return ( - {`[hubspot url="${url}" type="meeting"]`} - ); - } - return null; -} diff --git a/wp/wp-content/plugins/leadin/scripts/gutenberg/MeetingsBlock/registerMeetingBlock.tsx b/wp/wp-content/plugins/leadin/scripts/gutenberg/MeetingsBlock/registerMeetingBlock.tsx deleted file mode 100644 index 69b7b5fe..00000000 --- a/wp/wp-content/plugins/leadin/scripts/gutenberg/MeetingsBlock/registerMeetingBlock.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React from 'react'; -import * as WpBlocksApi from '@wordpress/blocks'; -import CalendarIcon from '../Common/CalendarIcon'; -import { connectionStatus } from '../../constants/leadinConfig'; -import MeetingGutenbergPreview from './MeetingGutenbergPreview'; -import MeetingSaveBlock from './MeetingSaveBlock'; -import MeetingEdit from '../../shared/Meeting/MeetingEdit'; -import ErrorHandler from '../../shared/Common/ErrorHandler'; -import { __ } from '@wordpress/i18n'; -import { isFullSiteEditor } from '../../utils/withMetaData'; - -const ConnectionStatus = { - Connected: 'Connected', - NotConnected: 'NotConnected', -}; - -export interface IMeetingBlockAttributes { - attributes: { - url: string; - preview?: boolean; - }; -} - -export interface IMeetingBlockProps extends IMeetingBlockAttributes { - setAttributes: Function; - isSelected: boolean; -} - -export default function registerMeetingBlock() { - const editComponent = (props: IMeetingBlockProps) => { - if (props.attributes.preview) { - return ; - } else if (connectionStatus === ConnectionStatus.Connected) { - return ; - } else { - return ; - } - }; - - // We do not support the full site editor: https://issues.hubspotcentral.com/browse/WP-1033 - if (!WpBlocksApi || isFullSiteEditor()) { - return null; - } - - WpBlocksApi.registerBlockType('leadin/hubspot-meeting-block', { - title: __('Hubspot Meetings Scheduler', 'leadin'), - description: __( - 'Schedule meetings faster and forget the back-and-forth emails Your calendar stays full, and you stay productive', - 'leadin' - ), - icon: CalendarIcon, - category: 'leadin-blocks', - attributes: { - url: { - type: 'string', - default: '', - } as WpBlocksApi.BlockAttribute, - preview: { - type: 'boolean', - default: false, - } as WpBlocksApi.BlockAttribute, - }, - example: { - attributes: { - preview: true, - }, - }, - edit: editComponent, - save: props => , - }); -} diff --git a/wp/wp-content/plugins/leadin/scripts/gutenberg/Sidebar/contentType.tsx b/wp/wp-content/plugins/leadin/scripts/gutenberg/Sidebar/contentType.tsx deleted file mode 100644 index eebedde4..00000000 --- a/wp/wp-content/plugins/leadin/scripts/gutenberg/Sidebar/contentType.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import React from 'react'; -import * as WpPluginsLib from '@wordpress/plugins'; -import { PluginSidebar } from '@wordpress/edit-post'; -import { PanelBody, Icon } from '@wordpress/components'; -import { withSelect } from '@wordpress/data'; -import UISidebarSelectControl from '../UIComponents/UISidebarSelectControl'; -import SidebarSprocketIcon from '../Common/SidebarSprocketIcon'; -import styled from 'styled-components'; -import { __ } from '@wordpress/i18n'; -import { BackgroudAppContext } from '../../iframe/useBackgroundApp'; -import { refreshToken } from '../../constants/leadinConfig'; -import { getOrCreateBackgroundApp } from '../../utils/backgroundAppUtils'; - -export function registerHubspotSidebar() { - const ContentTypeLabelStyle = styled.div` - white-space: normal; - text-transform: none; - `; - - const ContentTypeLabel = ( - - {__( - 'Select the content type HubSpot Analytics uses to track this page', - 'leadin' - )} - - ); - - const LeadinPluginSidebar = ({ postType }: { postType: string }) => - postType ? ( - - } - > - - - - - - - ) : null; - const LeadinPluginSidebarWrapper = withSelect((select: Function) => { - const data = select('core/editor'); - return { - postType: - data && - data.getCurrentPostType() && - data.getEditedPostAttribute('meta'), - }; - })(LeadinPluginSidebar); - if (WpPluginsLib) { - WpPluginsLib.registerPlugin('leadin', { - render: LeadinPluginSidebarWrapper, - icon: SidebarSprocketIcon, - }); - } -} diff --git a/wp/wp-content/plugins/leadin/scripts/gutenberg/UIComponents/UIImage.ts b/wp/wp-content/plugins/leadin/scripts/gutenberg/UIComponents/UIImage.ts deleted file mode 100644 index c3817b7a..00000000 --- a/wp/wp-content/plugins/leadin/scripts/gutenberg/UIComponents/UIImage.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { styled } from '@linaria/react'; - -export default styled.img` - height: ${props => (props.height ? props.height : 'auto')}; - width: ${props => (props.width ? props.width : 'auto')}; -`; diff --git a/wp/wp-content/plugins/leadin/scripts/gutenberg/UIComponents/UISidebarSelectControl.tsx b/wp/wp-content/plugins/leadin/scripts/gutenberg/UIComponents/UISidebarSelectControl.tsx deleted file mode 100644 index 57901d3e..00000000 --- a/wp/wp-content/plugins/leadin/scripts/gutenberg/UIComponents/UISidebarSelectControl.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from 'react'; - -import { SelectControl } from '@wordpress/components'; -import withMetaData from '../../utils/withMetaData'; -import { - useBackgroundAppContext, - usePostBackgroundMessage, -} from '../../iframe/useBackgroundApp'; -import { ProxyMessages } from '../../iframe/integratedMessages'; - -interface IOption { - label: string; - value: string; - disabled?: boolean; -} - -interface IUISidebarSelectControlProps { - metaValue?: string; - metaKey: string; - setMetaValue?: Function; - options: IOption[]; - className: string; - label: JSX.Element; -} - -const UISidebarSelectControl = (props: IUISidebarSelectControlProps) => { - const isBackgroundAppReady = useBackgroundAppContext(); - - const monitorSidebarMetaChange = usePostBackgroundMessage(); - - return ( - { - if (props.setMetaValue) { - props.setMetaValue(content); - } - isBackgroundAppReady && - monitorSidebarMetaChange({ - key: ProxyMessages.TrackSidebarMetaChange, - payload: { - metaKey: props.metaKey, - }, - }); - }} - {...props} - /> - ); -}; - -export default withMetaData(UISidebarSelectControl); diff --git a/wp/wp-content/plugins/leadin/scripts/iframe/IframeErrorPage.tsx b/wp/wp-content/plugins/leadin/scripts/iframe/IframeErrorPage.tsx deleted file mode 100644 index 8a20d9d7..00000000 --- a/wp/wp-content/plugins/leadin/scripts/iframe/IframeErrorPage.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import React from 'react'; -import { __ } from '@wordpress/i18n'; -import { styled } from '@linaria/react'; - -const IframeErrorContainer = styled.div` - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - margin-top: 120px; - font-family: 'Lexend Deca', Helvetica, Arial, sans-serif; - font-weight: 400; - font-size: 14px; - font-size: 0.875rem; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-smoothing: antialiased; - line-height: 1.5rem; -`; - -const ErrorHeader = styled.h1` - text-shadow: 0 0 1px transparent; - margin-bottom: 1.25rem; - color: #33475b; - font-size: 1.25rem; -`; - -export const IframeErrorPage = () => ( - - Cannot find page - - {__( - 'The HubSpot for WordPress plugin is not able to load pages', - 'leadin' - )} - -

- {__( - 'Try disabling your browser extensions and ad blockers, then refresh the page', - 'leadin' - )} -

-

- {__( - 'Or open the HubSpot for WordPress plugin in a different browser', - 'leadin' - )} -

-
-); diff --git a/wp/wp-content/plugins/leadin/scripts/iframe/constants.ts b/wp/wp-content/plugins/leadin/scripts/iframe/constants.ts deleted file mode 100644 index 11d907a9..00000000 --- a/wp/wp-content/plugins/leadin/scripts/iframe/constants.ts +++ /dev/null @@ -1,15 +0,0 @@ -export enum App { - Forms, - LiveChat, - Plugin, - PluginSettings, - Background, -} - -export const AppIframe = { - [App.Forms]: 'integrated-form-app', - [App.LiveChat]: 'integrated-livechat-app', - [App.Plugin]: 'integrated-plugin-app', - [App.PluginSettings]: 'integrated-plugin-app', - [App.Background]: 'integrated-plugin-proxy', -} as const; diff --git a/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/core/CoreMessages.ts b/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/core/CoreMessages.ts deleted file mode 100644 index 263f6d61..00000000 --- a/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/core/CoreMessages.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const CoreMessages = { - HandshakeReceive: 'INTEGRATED_APP_EMBEDDER_HANDSHAKE_RECEIVED', - SendRefreshToken: 'INTEGRATED_APP_EMBEDDER_SEND_REFRESH_TOKEN', - ReloadParentFrame: 'INTEGRATED_APP_EMBEDDER_RELOAD_PARENT_FRAME', - RedirectParentFrame: 'INTEGRATED_APP_EMBEDDER_REDIRECT_PARENT_FRAME', - SendLocale: 'INTEGRATED_APP_EMBEDDER_SEND_LOCALE', - SendDeviceId: 'INTEGRATED_APP_EMBEDDER_SEND_DEVICE_ID', - SendIntegratedAppConfig: 'INTEGRATED_APP_EMBEDDER_CONFIG', -} as const; - -export type CoreMessageType = typeof CoreMessages[keyof typeof CoreMessages]; diff --git a/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/forms/FormsMessages.ts b/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/forms/FormsMessages.ts deleted file mode 100644 index d9cd5bb5..00000000 --- a/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/forms/FormsMessages.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const FormMessages = { - CreateFormAppNavigation: 'CREATE_FORM_APP_NAVIGATION', -} as const; - -export type FormMessageType = typeof FormMessages[keyof typeof FormMessages]; diff --git a/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/index.ts b/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/index.ts deleted file mode 100644 index bfd18a0a..00000000 --- a/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import * as Core from './core/CoreMessages'; -import * as Forms from './forms/FormsMessages'; -import * as LiveChat from './livechat/LiveChatMessages'; -import * as Plugin from './plugin/PluginMessages'; -import * as Proxy from './proxy/ProxyMessages'; - -export type MessageType = - | Core.CoreMessageType - | Forms.FormMessageType - | LiveChat.LiveChatMessageType - | Plugin.PluginMessageType - | Proxy.ProxyMessageType; - -export * from './core/CoreMessages'; -export * from './forms/FormsMessages'; -export * from './livechat/LiveChatMessages'; -export * from './plugin/PluginMessages'; -export * from './proxy/ProxyMessages'; diff --git a/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts b/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts deleted file mode 100644 index a850f130..00000000 --- a/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/livechat/LiveChatMessages.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const LiveChatMessages = { - CreateLiveChatAppNavigation: 'CREATE_LIVE_CHAT_APP_NAVIGATION', -} as const; - -export type LiveChatMessageType = typeof LiveChatMessages[keyof typeof LiveChatMessages]; diff --git a/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/plugin/PluginMessages.ts b/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/plugin/PluginMessages.ts deleted file mode 100644 index a7049970..00000000 --- a/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/plugin/PluginMessages.ts +++ /dev/null @@ -1,27 +0,0 @@ -export const PluginMessages = { - PluginSettingsNavigation: 'PLUGIN_SETTINGS_NAVIGATION', - PluginLeadinConfig: 'PLUGIN_LEADIN_CONFIG', - TrackConsent: 'INTEGRATED_APP_EMBEDDER_TRACK_CONSENT', - InternalTrackingFetchRequest: 'INTEGRATED_TRACKING_FETCH_REQUEST', - InternalTrackingFetchResponse: 'INTEGRATED_TRACKING_FETCH_RESPONSE', - InternalTrackingFetchError: 'INTEGRATED_TRACKING_FETCH_ERROR', - InternalTrackingChangeRequest: 'INTEGRATED_TRACKING_CHANGE_REQUEST', - InternalTrackingChangeError: 'INTEGRATED_TRACKING_CHANGE_ERROR', - BusinessUnitFetchRequest: 'BUSINESS_UNIT_FETCH_REQUEST', - BusinessUnitFetchResponse: 'BUSINESS_UNIT_FETCH_FETCH_RESPONSE', - BusinessUnitFetchError: 'BUSINESS_UNIT_FETCH_FETCH_ERROR', - BusinessUnitChangeRequest: 'BUSINESS_UNIT_CHANGE_REQUEST', - BusinessUnitChangeError: 'BUSINESS_UNIT_CHANGE_ERROR', - SkipReviewRequest: 'SKIP_REVIEW_REQUEST', - SkipReviewResponse: 'SKIP_REVIEW_RESPONSE', - SkipReviewError: 'SKIP_REVIEW_ERROR', - RemoveParentQueryParam: 'REMOVE_PARENT_QUERY_PARAM', - ContentEmbedInstallRequest: 'CONTENT_EMBED_INSTALL_REQUEST', - ContentEmbedInstallResponse: 'CONTENT_EMBED_INSTALL_RESPONSE', - ContentEmbedInstallError: 'CONTENT_EMBED_INSTALL_ERROR', - ContentEmbedActivationRequest: 'CONTENT_EMBED_ACTIVATION_REQUEST', - ContentEmbedActivationResponse: 'CONTENT_EMBED_ACTIVATION_RESPONSE', - ContentEmbedActivationError: 'CONTENT_EMBED_ACTIVATION_ERROR', -} as const; - -export type PluginMessageType = typeof PluginMessages[keyof typeof PluginMessages]; diff --git a/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/proxy/ProxyMessages.ts b/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/proxy/ProxyMessages.ts deleted file mode 100644 index 62fe8729..00000000 --- a/wp/wp-content/plugins/leadin/scripts/iframe/integratedMessages/proxy/ProxyMessages.ts +++ /dev/null @@ -1,21 +0,0 @@ -export const ProxyMessages = { - FetchForms: 'FETCH_FORMS', - FetchForm: 'FETCH_FORM', - CreateFormFromTemplate: 'CREATE_FORM_FROM_TEMPLATE', - FetchAuth: 'FETCH_AUTH', - FetchMeetingsAndUsers: 'FETCH_MEETINGS_AND_USERS', - FetchContactsCreateSinceActivation: 'FETCH_CONTACTS_CREATED_SINCE_ACTIVATION', - FetchOrCreateMeetingUser: 'FETCH_OR_CREATE_MEETING_USER', - ConnectMeetingsCalendar: 'CONNECT_MEETINGS_CALENDAR', - TrackFormPreviewRender: 'TRACK_FORM_PREVIEW_RENDER', - TrackFormCreatedFromTemplate: 'TRACK_FORM_CREATED_FROM_TEMPLATE', - TrackFormCreationFailed: 'TRACK_FORM_CREATION_FAILED', - TrackMeetingPreviewRender: 'TRACK_MEETING_PREVIEW_RENDER', - TrackSidebarMetaChange: 'TRACK_SIDEBAR_META_CHANGE', - TrackReviewBannerRender: 'TRACK_REVIEW_BANNER_RENDER', - TrackReviewBannerInteraction: 'TRACK_REVIEW_BANNER_INTERACTION', - TrackReviewBannerDismissed: 'TRACK_REVIEW_BANNER_DISMISSED', - TrackPluginDeactivation: 'TRACK_PLUGIN_DEACTIVATION', -} as const; - -export type ProxyMessageType = typeof ProxyMessages[keyof typeof ProxyMessages]; diff --git a/wp/wp-content/plugins/leadin/scripts/iframe/messageMiddleware.ts b/wp/wp-content/plugins/leadin/scripts/iframe/messageMiddleware.ts deleted file mode 100644 index 165aaa63..00000000 --- a/wp/wp-content/plugins/leadin/scripts/iframe/messageMiddleware.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { MessageType, PluginMessages } from '../iframe/integratedMessages'; -import { - fetchDisableInternalTracking, - trackConsent, - disableInternalTracking, - getBusinessUnitId, - setBusinessUnitId, - skipReview, -} from '../api/wordpressApiClient'; -import { removeQueryParamFromLocation } from '../utils/queryParams'; -import { startActivation, startInstall } from '../utils/contentEmbedInstaller'; - -export type Message = { key: MessageType; payload?: any }; - -const messageMapper: Map = new Map([ - [ - PluginMessages.TrackConsent, - (message: Message) => { - trackConsent(message.payload); - }, - ], - [ - PluginMessages.InternalTrackingChangeRequest, - (message: Message, embedder: any) => { - disableInternalTracking(message.payload) - .then(() => { - embedder.postMessage({ - key: PluginMessages.InternalTrackingFetchResponse, - payload: message.payload, - }); - }) - .catch(payload => { - embedder.postMessage({ - key: PluginMessages.InternalTrackingChangeError, - payload, - }); - }); - }, - ], - [ - PluginMessages.InternalTrackingFetchRequest, - (__message: Message, embedder: any) => { - fetchDisableInternalTracking() - .then(({ message: payload }) => { - embedder.postMessage({ - key: PluginMessages.InternalTrackingFetchResponse, - payload, - }); - }) - .catch(payload => { - embedder.postMessage({ - key: PluginMessages.InternalTrackingFetchError, - payload, - }); - }); - }, - ], - [ - PluginMessages.BusinessUnitFetchRequest, - (__message: Message, embedder: any) => { - getBusinessUnitId() - .then(payload => { - embedder.postMessage({ - key: PluginMessages.BusinessUnitFetchResponse, - payload, - }); - }) - .catch(payload => { - embedder.postMessage({ - key: PluginMessages.BusinessUnitFetchError, - payload, - }); - }); - }, - ], - [ - PluginMessages.BusinessUnitChangeRequest, - (message: Message, embedder: any) => { - setBusinessUnitId(message.payload) - .then(payload => { - embedder.postMessage({ - key: PluginMessages.BusinessUnitFetchResponse, - payload, - }); - }) - .catch(payload => { - embedder.postMessage({ - key: PluginMessages.BusinessUnitChangeError, - payload, - }); - }); - }, - ], - [ - PluginMessages.SkipReviewRequest, - (__message: Message, embedder: any) => { - skipReview() - .then(payload => { - embedder.postMessage({ - key: PluginMessages.SkipReviewResponse, - payload, - }); - }) - .catch(payload => { - embedder.postMessage({ - key: PluginMessages.SkipReviewError, - payload, - }); - }); - }, - ], - [ - PluginMessages.RemoveParentQueryParam, - (message: Message) => { - removeQueryParamFromLocation(message.payload); - }, - ], - [ - PluginMessages.ContentEmbedInstallRequest, - (message: Message, embedder: any) => { - startInstall(message.payload.nonce) - .then(payload => { - embedder.postMessage({ - key: PluginMessages.ContentEmbedInstallResponse, - payload: payload, - }); - }) - .catch(payload => { - embedder.postMessage({ - key: PluginMessages.ContentEmbedInstallError, - payload, - }); - }); - }, - ], - [ - PluginMessages.ContentEmbedActivationRequest, - (message: Message, embedder: any) => { - startActivation(message.payload.activateAjaxUrl) - .then(payload => { - embedder.postMessage({ - key: PluginMessages.ContentEmbedActivationResponse, - payload: payload, - }); - }) - .catch(payload => { - embedder.postMessage({ - key: PluginMessages.ContentEmbedActivationError, - payload, - }); - }); - }, - ], -]); - -export const messageMiddleware = (embedder: any) => (message: Message) => { - const next = messageMapper.get(message.key); - if (next) { - next(message, embedder); - } -}; diff --git a/wp/wp-content/plugins/leadin/scripts/iframe/renderIframeApp.tsx b/wp/wp-content/plugins/leadin/scripts/iframe/renderIframeApp.tsx deleted file mode 100644 index 9df8b1de..00000000 --- a/wp/wp-content/plugins/leadin/scripts/iframe/renderIframeApp.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import React, { Fragment } from 'react'; -import ReactDOM from 'react-dom'; -import { domElements } from '../constants/selectors'; -import useAppEmbedder from './useAppEmbedder'; -import { App } from './constants'; -import { IframeErrorPage } from './IframeErrorPage'; - -interface PortalProps extends React.PropsWithChildren { - app: App; - createRoute: boolean; -} - -const IntegratedIframePortal = (props: PortalProps) => { - const container = document.getElementById(domElements.leadinIframeContainer); - const iframeNotRendered = useAppEmbedder( - props.app, - props.createRoute, - container - ); - - if (container && !iframeNotRendered) { - return ReactDOM.createPortal(props.children, container); - } - - return ( - - {(!container || iframeNotRendered) && } - - ); -}; - -const renderIframeApp = () => { - const iframeFallbackContainer = document.getElementById( - domElements.leadinIframeContainer - ); - - let app: App; - const queryParams = new URLSearchParams(location.search); - const page = queryParams.get('page'); - const createRoute = queryParams.get('leadin_route[0]') === 'create'; - - switch (page) { - case 'leadin_forms': - app = App.Forms; - break; - case 'leadin_chatflows': - app = App.LiveChat; - break; - case 'leadin_settings': - app = App.PluginSettings; - break; - case 'leadin_user_guide': - default: - app = App.Plugin; - break; - } - - ReactDOM.render( - , - iframeFallbackContainer - ); -}; - -export default renderIframeApp; diff --git a/wp/wp-content/plugins/leadin/scripts/iframe/useAppEmbedder.ts b/wp/wp-content/plugins/leadin/scripts/iframe/useAppEmbedder.ts deleted file mode 100644 index 669d85d0..00000000 --- a/wp/wp-content/plugins/leadin/scripts/iframe/useAppEmbedder.ts +++ /dev/null @@ -1,233 +0,0 @@ -import { useEffect } from 'react'; -import Raven from '../lib/Raven'; - -import { - accountName, - adminUrl, - connectionStatus, - deviceId, - hubspotBaseUrl, - leadinQueryParams, - locale, - plugins, - portalDomain, - portalEmail, - portalId, - reviewSkippedDate, - refreshToken, - impactLink, - theme, - lastAuthorizeTime, - lastDeauthorizeTime, - lastDisconnectTime, - leadinPluginVersion, - phpVersion, - wpVersion, - contentEmbed, - requiresContentEmbedScope, - refreshTokenError, - LeadinConfig, -} from '../constants/leadinConfig'; -import { App, AppIframe } from './constants'; -import { messageMiddleware } from './messageMiddleware'; -import { resizeWindow, useIframeNotRendered } from '../utils/iframe'; - -type PartialLeadinConfig = Pick< - LeadinConfig, - | 'accountName' - | 'adminUrl' - | 'connectionStatus' - | 'deviceId' - | 'plugins' - | 'portalDomain' - | 'portalEmail' - | 'portalId' - | 'reviewSkippedDate' - | 'refreshToken' - | 'impactLink' - | 'theme' - | 'trackConsent' - | 'lastAuthorizeTime' - | 'lastDeauthorizeTime' - | 'lastDisconnectTime' - | 'leadinPluginVersion' - | 'phpVersion' - | 'wpVersion' - | 'contentEmbed' - | 'requiresContentEmbedScope' - | 'refreshTokenError' ->; - -type AppIntegrationConfig = Pick; - -const getIntegrationConfig = (): AppIntegrationConfig => { - return { - adminUrl: leadinQueryParams.adminUrl, - }; -}; - -/** - * A modified version of the original leadinConfig that is passed to some integrated apps. - * - * Important: - * Try not to add new fields here. - * This config is already too large and broad in scope. - * It tightly couples the apps that use it with the WordPress plugin. - * Consider instead passing new required fields as new entry to PluginAppOptions or app-specific options. - */ -type AppLeadinConfig = { - admin: string; - company: string; - email: string; - firstName: string; - irclickid: string; - justConnected: string; - lastName: string; - mpid: string; - nonce: string; - websiteName: string; -} & PartialLeadinConfig; - -const getLeadinConfig = (): AppLeadinConfig => { - const utm_query_params = Object.keys(leadinQueryParams) - .filter(x => /^utm/.test(x)) - .reduce( - (p: { [key: string]: string }, c: string) => ({ - [c]: leadinQueryParams[c], - ...p, - }), - {} - ); - return { - accountName, - admin: leadinQueryParams.admin, - adminUrl, - company: leadinQueryParams.company, - connectionStatus, - deviceId, - email: leadinQueryParams.email, - firstName: leadinQueryParams.firstName, - irclickid: leadinQueryParams.irclickid, - justConnected: leadinQueryParams.justConnected, - lastName: leadinQueryParams.lastName, - lastAuthorizeTime, - lastDeauthorizeTime, - lastDisconnectTime, - leadinPluginVersion, - mpid: leadinQueryParams.mpid, - nonce: leadinQueryParams.nonce, - phpVersion, - plugins, - portalDomain, - portalEmail, - portalId, - reviewSkippedDate, - theme, - trackConsent: leadinQueryParams.trackConsent, - websiteName: leadinQueryParams.websiteName, - wpVersion, - contentEmbed, - requiresContentEmbedScope, - refreshTokenError, - ...utm_query_params, - }; -}; - -const getAppOptions = (app: App, createRoute = false) => { - const { - IntegratedAppOptions, - FormsAppOptions, - LiveChatAppOptions, - PluginAppOptions, - }: any = window; - let options; - switch (app) { - case App.Plugin: - options = new PluginAppOptions().setLeadinConfig(getLeadinConfig()); - break; - case App.PluginSettings: - options = new PluginAppOptions() - .setLeadinConfig(getLeadinConfig()) - .setPluginSettingsInit(); - break; - case App.Forms: - options = new FormsAppOptions().setIntegratedAppConfig( - getIntegrationConfig() - ); - if (createRoute) { - options = options.setCreateFormAppInit(); - } - break; - case App.LiveChat: - options = new LiveChatAppOptions(); - if (createRoute) { - options = options.setCreateLiveChatAppInit(); - } - break; - default: - options = new IntegratedAppOptions(); - } - - return options; -}; - -export default function useAppEmbedder( - app: App, - createRoute: boolean, - container: HTMLElement | null -) { - console.info( - 'HubSpot plugin - starting app embedder for:', - AppIframe[app], - container - ); - const iframeNotRendered = useIframeNotRendered(AppIframe[app]); - - useEffect(() => { - const { IntegratedAppEmbedder }: any = window; - - if (IntegratedAppEmbedder) { - const options = getAppOptions(app, createRoute) - .setLocale(locale) - .setDeviceId(deviceId) - .setRefreshToken(refreshToken); - - const embedder = new IntegratedAppEmbedder( - AppIframe[app], - portalId, - hubspotBaseUrl, - resizeWindow, - refreshToken ? '' : impactLink - ).setOptions(options); - - embedder.subscribe(messageMiddleware(embedder)); - embedder.attachTo(container, true); - embedder.postStartAppMessage(); // lets the app know all all data has been passed to it - - (window as any).embedder = embedder; - } - }, []); - - if (iframeNotRendered) { - console.error('HubSpot plugin Iframe not rendered', { - portalId, - container, - appName: AppIframe[app], - hasIntegratedAppEmbedder: !!(window as any).IntegratedAppEmbedder, - }); - Raven.captureException(new Error('Leadin Iframe not rendered'), { - fingerprint: ['USE_APP_EMBEDDER', 'IFRAME_SETUP_ERROR'], - extra: { - portalId, - container, - app, - hubspotBaseUrl, - impactLink, - appName: AppIframe[app], - hasRefreshToken: !!refreshToken, - }, - }); - } - - return iframeNotRendered; -} diff --git a/wp/wp-content/plugins/leadin/scripts/iframe/useBackgroundApp.ts b/wp/wp-content/plugins/leadin/scripts/iframe/useBackgroundApp.ts deleted file mode 100644 index 47b0d98e..00000000 --- a/wp/wp-content/plugins/leadin/scripts/iframe/useBackgroundApp.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { createContext, useContext } from 'react'; -import { - deviceId, - hubspotBaseUrl, - locale, - portalId, -} from '../constants/leadinConfig'; -import { Message } from './messageMiddleware'; - -export const BackgroudAppContext = createContext(null); - -export function useBackgroundAppContext() { - return useContext(BackgroudAppContext); -} - -export function usePostBackgroundMessage() { - const app = useBackgroundAppContext(); - - return (message: Message) => { - app.postMessage(message); - }; -} - -export function usePostAsyncBackgroundMessage(): ( - message: Message -) => Promise { - const app = useBackgroundAppContext(); - return (message: Message) => app.postAsyncMessage(message); -} diff --git a/wp/wp-content/plugins/leadin/scripts/lib/Raven.ts b/wp/wp-content/plugins/leadin/scripts/lib/Raven.ts deleted file mode 100644 index bd596fee..00000000 --- a/wp/wp-content/plugins/leadin/scripts/lib/Raven.ts +++ /dev/null @@ -1,40 +0,0 @@ -import Raven from 'raven-js'; -import { - hubspotBaseUrl, - phpVersion, - wpVersion, - leadinPluginVersion, - portalId, - plugins, -} from '../constants/leadinConfig'; - -export function configureRaven() { - if (hubspotBaseUrl.indexOf('app.hubspot.com') === -1) { - return; - } - - Raven.config( - 'https://e9b8f382cdd130c0d415cd977d2be56f@exceptions.hubspot.com/1', - { - instrument: { - tryCatch: false, - }, - release: leadinPluginVersion, - } - ).install(); - - Raven.setTagsContext({ - v: leadinPluginVersion, - php: phpVersion, - wordpress: wpVersion, - }); - - Raven.setExtraContext({ - hub: portalId, - plugins: Object.keys(plugins) - .map(name => `${name}#${plugins[name]}`) - .join(','), - }); -} - -export default Raven; diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Common/AsyncSelect.tsx b/wp/wp-content/plugins/leadin/scripts/shared/Common/AsyncSelect.tsx deleted file mode 100644 index b5a4b432..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Common/AsyncSelect.tsx +++ /dev/null @@ -1,311 +0,0 @@ -import React, { useRef, useState, useEffect } from 'react'; -import { styled } from '@linaria/react'; -import { - CALYPSO, - CALYPSO_LIGHT, - CALYPSO_MEDIUM, - OBSIDIAN, -} from '../UIComponents/colors'; -import UISpinner from '../UIComponents/UISpinner'; -import LoadState, { LoadStateType } from '../enums/loadState'; - -const Container = styled.div` - color: ${OBSIDIAN}; - font-family: 'Lexend Deca', Helvetica, Arial, sans-serif; - font-size: 14px; - position: relative; -`; - -interface IControlContainerProps { - focused: boolean; -} - -const ControlContainer = styled.div` - align-items: center; - background-color: hsl(0, 0%, 100%); - border-color: hsl(0, 0%, 80%); - border-radius: 4px; - border-style: solid; - border-width: ${props => (props.focused ? '0' : '1px')}; - cursor: default; - display: flex; - flex-wrap: wrap; - justify-content: space-between; - min-height: 38px; - outline: 0 !important; - position: relative; - transition: all 100ms; - box-sizing: border-box; - box-shadow: ${props => - props.focused ? `0 0 0 2px ${CALYPSO_MEDIUM}` : 'none'}; - &:hover { - border-color: hsl(0, 0%, 70%); - } -`; - -const ValueContainer = styled.div` - align-items: center; - display: flex; - flex: 1; - flex-wrap: wrap; - padding: 2px 8px; - position: relative; - overflow: hidden; - box-sizing: border-box; -`; - -const Placeholder = styled.div` - color: hsl(0, 0%, 50%); - margin-left: 2px; - margin-right: 2px; - position: absolute; - top: 50%; - transform: translateY(-50%); - box-sizing: border-box; - font-size: 16px; -`; - -const SingleValue = styled.div` - color: hsl(0, 0%, 20%); - margin-left: 2px; - margin-right: 2px; - max-width: calc(100% - 8px); - overflow: hidden; - position: absolute; - text-overflow: ellipsis; - white-space: nowrap; - top: 50%; - transform: translateY(-50%); - box-sizing: border-box; -`; - -const IndicatorContainer = styled.div` - align-items: center; - align-self: stretch; - display: flex; - flex-shrink: 0; - box-sizing: border-box; -`; - -const DropdownIndicator = styled.div` - border-top: 8px solid ${CALYPSO}; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - width: 0px; - height: 0px; - margin: 10px; -`; - -const InputContainer = styled.div` - margin: 2px; - padding-bottom: 2px; - padding-top: 2px; - visibility: visible; - color: hsl(0, 0%, 20%); - box-sizing: border-box; -`; - -const Input = styled.input` - box-sizing: content-box; - background: rgba(0, 0, 0, 0) none repeat scroll 0px center; - border: 0px none; - font-size: inherit; - opacity: 1; - outline: currentcolor none 0px; - padding: 0px; - color: inherit; - font-family: inherit; -`; - -const InputShadow = styled.div` - position: absolute; - opacity: 0; - font-size: inherit; -`; - -const MenuContainer = styled.div` - position: absolute; - top: 100%; - background-color: #fff; - border-radius: 4px; - margin-bottom: 8px; - margin-top: 8px; - z-index: 9999; - box-shadow: 0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1); - width: 100%; -`; - -const MenuList = styled.div` - max-height: 300px; - overflow-y: auto; - padding-bottom: 4px; - padding-top: 4px; - position: relative; -`; - -const MenuGroup = styled.div` - padding-bottom: 8px; - padding-top: 8px; -`; - -const MenuGroupHeader = styled.div` - color: #999; - cursor: default; - font-size: 75%; - font-weight: 500; - margin-bottom: 0.25em; - text-transform: uppercase; - padding-left: 12px; - padding-left: 12px; -`; - -interface IMenuItemProps { - selected: boolean; -} - -const MenuItem = styled.div` - display: block; - background-color: ${props => - props.selected ? CALYPSO_MEDIUM : 'transparent'}; - color: ${props => (props.selected ? '#fff' : 'inherit')}; - cursor: default; - font-size: inherit; - width: 100%; - padding: 8px 12px; - &:hover { - background-color: ${props => - props.selected ? CALYPSO_MEDIUM : CALYPSO_LIGHT}; - } -`; - -interface IAsyncSelectProps { - placeholder: string; - value: any; - loadOptions?: Function; - defaultOptions?: any[]; - onChange: Function; -} - -export default function AsyncSelect({ - placeholder, - value, - loadOptions, - onChange, - defaultOptions, -}: IAsyncSelectProps) { - const inputEl = useRef(null); - const inputShadowEl = useRef(null); - const [isFocused, setFocus] = useState(false); - const [loadState, setLoadState] = useState( - LoadState.NotLoaded - ); - const [localValue, setLocalValue] = useState(''); - const [options, setOptions] = useState(defaultOptions); - - const inputSize = `${ - inputShadowEl.current ? inputShadowEl.current.clientWidth + 10 : 2 - }px`; - - useEffect(() => { - if (loadOptions && loadState === LoadState.NotLoaded) { - loadOptions('', (result: any) => { - setOptions(result); - setLoadState(LoadState.Idle); - }); - } - }, [loadOptions, loadState]); - - const renderItems = (items: any[] = [], parentKey?: number) => { - return items.map((item, index) => { - if (item.options) { - return ( - - - {item.label} - -
{renderItems(item.options, index)}
-
- ); - } else { - const key = `async-select-item-${ - parentKey !== undefined ? `${parentKey}-${index}` : index - }`; - return ( - { - onChange(item); - setFocus(false); - }} - > - {item.label} - - ); - } - }); - }; - - return ( - - { - if (isFocused) { - if (inputEl.current) { - inputEl.current.blur(); - } - setFocus(false); - setLocalValue(''); - } else { - if (inputEl.current) { - inputEl.current.focus(); - } - setFocus(true); - } - }} - > - - {localValue === '' && - (!value ? ( - {placeholder} - ) : ( - {value.label} - ))} - - { - setFocus(true); - }} - onChange={e => { - setLocalValue(e.target.value); - setLoadState(LoadState.Loading); - loadOptions && - loadOptions(e.target.value, (result: any) => { - setOptions(result); - setLoadState(LoadState.Idle); - }); - }} - value={localValue} - width={inputSize} - id="asycn-select-input" - /> - {localValue} - - - - {loadState === LoadState.Loading && } - - - - {isFocused && ( - - {renderItems(options)} - - )} - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Common/ErrorHandler.tsx b/wp/wp-content/plugins/leadin/scripts/shared/Common/ErrorHandler.tsx deleted file mode 100644 index 63078bac..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Common/ErrorHandler.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import React from 'react'; -import UIButton from '../UIComponents/UIButton'; -import UIContainer from '../UIComponents/UIContainer'; -import HubspotWrapper from './HubspotWrapper'; -import { adminUrl, redirectNonce } from '../../constants/leadinConfig'; -import { pluginPath } from '../../constants/leadinConfig'; -import { __ } from '@wordpress/i18n'; - -interface IErrorHandlerProps { - status: number; - resetErrorState?: React.MouseEventHandler; - errorInfo?: { - header: string; - message: string; - action: string; - }; -} - -function redirectToPlugin() { - window.location.href = `${adminUrl}admin.php?page=leadin&leadin_expired=${redirectNonce}`; -} - -export default function ErrorHandler({ - status, - resetErrorState, - errorInfo = { header: '', message: '', action: '' }, -}: IErrorHandlerProps) { - const isUnauthorized = status === 401 || status === 403; - const errorHeader = isUnauthorized - ? __("Your plugin isn't authorized", 'leadin') - : errorInfo.header; - const errorMessage = isUnauthorized - ? __('Reauthorize your plugin to access your free HubSpot tools', 'leadin') - : errorInfo.message; - - return ( - - -

{errorHeader}

-

- {errorMessage} -

- {isUnauthorized ? ( - - {__('Go to plugin', 'leadin')} - - ) : ( - - {errorInfo.action} - - )} -
-
- ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Common/HubspotWrapper.ts b/wp/wp-content/plugins/leadin/scripts/shared/Common/HubspotWrapper.ts deleted file mode 100644 index d85a19fb..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Common/HubspotWrapper.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { styled } from '@linaria/react'; - -interface IHubspotWrapperProps { - pluginPath: string; - padding?: string; -} - -export default styled.div` - background-image: ${props => - `url(${props.pluginPath}/public/assets/images/hubspot.svg)`}; - background-color: #f5f8fa; - background-repeat: no-repeat; - background-position: center 25px; - background-size: 120px; - color: #33475b; - font-family: 'Lexend Deca', Helvetica, Arial, sans-serif; - font-size: 14px; - - padding: ${(props: any) => props.padding || '90px 20% 25px'}; - - p { - font-size: inherit !important; - line-height: 24px; - margin: 4px 0; - } -`; diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Common/LoadingBlock.tsx b/wp/wp-content/plugins/leadin/scripts/shared/Common/LoadingBlock.tsx deleted file mode 100644 index 600ed306..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Common/LoadingBlock.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react'; -import HubspotWrapper from './HubspotWrapper'; -import UISpinner from '../UIComponents/UISpinner'; -import { pluginPath } from '../../constants/leadinConfig'; - -export default function LoadingBlock() { - return ( - - - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Form/FormEdit.tsx b/wp/wp-content/plugins/leadin/scripts/shared/Form/FormEdit.tsx deleted file mode 100644 index 90454599..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Form/FormEdit.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import React, { Fragment, useEffect } from 'react'; -import { portalId, refreshToken } from '../../constants/leadinConfig'; -import UISpacer from '../UIComponents/UISpacer'; -import PreviewForm from './PreviewForm'; -import FormSelect from './FormSelect'; -import { IFormBlockProps } from '../../gutenberg/FormBlock/registerFormBlock'; -import { - usePostBackgroundMessage, - BackgroudAppContext, - useBackgroundAppContext, -} from '../../iframe/useBackgroundApp'; -import { ProxyMessages } from '../../iframe/integratedMessages'; -import LoadingBlock from '../Common/LoadingBlock'; -import { getOrCreateBackgroundApp } from '../../utils/backgroundAppUtils'; - -interface IFormEditProps extends IFormBlockProps { - preview: boolean; - origin: 'gutenberg' | 'elementor'; -} - -function FormEdit({ - attributes, - isSelected, - setAttributes, - preview = true, - origin = 'gutenberg', -}: IFormEditProps) { - const { formId, formName } = attributes; - const formSelected = portalId && formId; - - const isBackgroundAppReady = useBackgroundAppContext(); - const monitorFormPreviewRender = usePostBackgroundMessage(); - - const handleChange = (selectedForm: { value: string; label: string }) => { - setAttributes({ - portalId, - formId: selectedForm.value, - formName: selectedForm.label, - }); - }; - - useEffect(() => { - monitorFormPreviewRender({ - key: ProxyMessages.TrackFormPreviewRender, - payload: { - origin, - }, - }); - }, [origin]); - - return !isBackgroundAppReady ? ( - - ) : ( - - {(isSelected || !formSelected) && ( - - )} - {formSelected && ( - - {isSelected && } - {preview && } - - )} - - ); -} - -export default function FormEditContainer(props: IFormEditProps) { - return ( - - - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Form/FormSelect.tsx b/wp/wp-content/plugins/leadin/scripts/shared/Form/FormSelect.tsx deleted file mode 100644 index 48cdc248..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Form/FormSelect.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import React from 'react'; -import FormSelector from './FormSelector'; -import LoadingBlock from '../Common/LoadingBlock'; -import { __ } from '@wordpress/i18n'; -import useForms from './hooks/useForms'; -import useCreateFormFromTemplate from './hooks/useCreateFormFromTemplate'; -import { FormType, isDefaultForm } from '../../constants/defaultFormOptions'; -import ErrorHandler from '../Common/ErrorHandler'; - -interface IFormSelectProps { - formId: string; - formName: string; - handleChange: Function; - origin: 'gutenberg' | 'elementor'; -} - -export default function FormSelect({ - formId, - formName, - handleChange, - origin = 'gutenberg', -}: IFormSelectProps) { - const { search, formApiError, reset } = useForms(); - const { - createFormByTemplate, - reset: createReset, - isCreating, - hasError, - formApiError: createApiError, - } = useCreateFormFromTemplate(origin); - const value = - formId && formName - ? { - label: formName, - value: formId, - } - : null; - - const handleLocalChange = (option: { value: FormType }) => { - if (isDefaultForm(option.value)) { - createFormByTemplate(option.value).then(({ guid, name }) => { - handleChange({ - value: guid, - label: name, - }); - }); - } else { - handleChange(option); - } - }; - - return isCreating ? ( - - ) : formApiError || createApiError ? ( - { - if (hasError) { - createReset(); - } else { - reset(); - } - }} - errorInfo={{ - header: __('There was a problem retrieving your forms', 'leadin'), - message: __( - 'Please refresh your forms or try again in a few minutes', - 'leadin' - ), - action: __('Refresh forms', 'leadin'), - }} - /> - ) : ( - handleLocalChange(option)} - value={value} - /> - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Form/FormSelector.tsx b/wp/wp-content/plugins/leadin/scripts/shared/Form/FormSelector.tsx deleted file mode 100644 index 49d44a82..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Form/FormSelector.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react'; -import HubspotWrapper from '../Common/HubspotWrapper'; -import { pluginPath } from '../../constants/leadinConfig'; -import AsyncSelect from '../Common/AsyncSelect'; -import { __ } from '@wordpress/i18n'; - -interface IFormSelectorProps { - loadOptions: Function; - onChange: Function; - value: any; -} - -export default function FormSelector({ - loadOptions, - onChange, - value, -}: IFormSelectorProps) { - return ( - -

- - {__( - 'Select an existing form or create a new one from a template', - 'leadin' - )} - -

- -
- ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Form/PreviewForm.tsx b/wp/wp-content/plugins/leadin/scripts/shared/Form/PreviewForm.tsx deleted file mode 100644 index 4846b018..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Form/PreviewForm.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React, { useEffect, useRef } from 'react'; -import UIOverlay from '../UIComponents/UIOverlay'; -import { formsScriptPayload, hublet } from '../../constants/leadinConfig'; -import useFormScript from './hooks/useFormsScript'; - -export default function PreviewForm({ - portalId, - formId, -}: { - portalId: number; - formId: string; -}) { - const inputEl = useRef(null); - const ready = useFormScript(); - - useEffect(() => { - if (!ready) { - return; - } - if (inputEl.current) { - inputEl.current.innerHTML = ''; - const embedScript = document.createElement('script'); - embedScript.innerHTML = `hbspt.forms.create({ portalId: '${portalId}', formId: '${formId}', region: '${hublet}', ${formsScriptPayload} });`; - inputEl.current.appendChild(embedScript); - } - }, [formId, portalId, ready, inputEl]); - - return ; -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Form/hooks/useCreateFormFromTemplate.ts b/wp/wp-content/plugins/leadin/scripts/shared/Form/hooks/useCreateFormFromTemplate.ts deleted file mode 100644 index be35f01d..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Form/hooks/useCreateFormFromTemplate.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { useState } from 'react'; -import { - usePostAsyncBackgroundMessage, - usePostBackgroundMessage, -} from '../../../iframe/useBackgroundApp'; -import { FormType } from '../../../constants/defaultFormOptions'; -import LoadState, { LoadStateType } from '../../enums/loadState'; -import { ProxyMessages } from '../../../iframe/integratedMessages'; - -export default function useCreateFormFromTemplate(origin = 'gutenberg') { - const proxy = usePostAsyncBackgroundMessage(); - const track = usePostBackgroundMessage(); - const [loadState, setLoadState] = useState(LoadState.Idle); - const [formApiError, setFormApiError] = useState(null); - - const createFormByTemplate = (type: FormType) => { - setLoadState(LoadState.Loading); - track({ - key: ProxyMessages.TrackFormCreatedFromTemplate, - payload: { - type, - origin, - }, - }); - - return proxy({ - key: ProxyMessages.CreateFormFromTemplate, - payload: type, - }) - .then(form => { - setLoadState(LoadState.Idle); - return form; - }) - .catch(err => { - setFormApiError(err); - track({ - key: ProxyMessages.TrackFormCreationFailed, - payload: { - origin, - }, - }); - setLoadState(LoadState.Failed); - }); - }; - - return { - isCreating: loadState === LoadState.Loading, - hasError: loadState === LoadState.Failed, - formApiError, - createFormByTemplate, - reset: () => setLoadState(LoadState.Idle), - }; -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Form/hooks/useForms.ts b/wp/wp-content/plugins/leadin/scripts/shared/Form/hooks/useForms.ts deleted file mode 100644 index 56eb74ae..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Form/hooks/useForms.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { useState } from 'react'; -import debounce from 'lodash/debounce'; -import { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp'; -import { DEFAULT_OPTIONS } from '../../../constants/defaultFormOptions'; -import { ProxyMessages } from '../../../iframe/integratedMessages'; -import { IForm } from '../../types'; - -export default function useForms() { - const proxy = usePostAsyncBackgroundMessage(); - const [formApiError, setFormApiError] = useState(null); - - const search = debounce( - (search: string, callback: Function) => { - return proxy({ - key: ProxyMessages.FetchForms, - payload: { - search, - }, - }) - .then(forms => { - callback([ - ...forms.map((form: IForm) => ({ - label: form.name, - value: form.guid, - })), - DEFAULT_OPTIONS, - ]); - }) - .catch(error => { - setFormApiError(error); - }); - }, - 300, - { trailing: true } - ); - - return { - search, - formApiError, - reset: () => setFormApiError(null), - }; -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Form/hooks/useFormsScript.ts b/wp/wp-content/plugins/leadin/scripts/shared/Form/hooks/useFormsScript.ts deleted file mode 100644 index 9daab439..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Form/hooks/useFormsScript.ts +++ /dev/null @@ -1,30 +0,0 @@ -import $ from 'jquery'; - -import { useEffect, useState } from 'react'; -import { formsScript } from '../../../constants/leadinConfig'; -import Raven from '../../../lib/Raven'; - -let promise: Promise; - -function loadFormsScript() { - if (!promise) { - promise = new Promise((resolve, reject) => - $.getScript(formsScript) - .done(resolve) - .fail(reject) - ); - } - return promise; -} - -export default function useFormScript() { - const [ready, setReady] = useState(false); - - useEffect(() => { - loadFormsScript() - .then(() => setReady(true)) - .catch(error => Raven.captureException(error)); - }, []); - - return ready; -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingController.tsx b/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingController.tsx deleted file mode 100644 index 80bfac54..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingController.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import React, { Fragment, useEffect } from 'react'; -import LoadingBlock from '../Common/LoadingBlock'; -import MeetingSelector from './MeetingSelector'; -import MeetingWarning from './MeetingWarning'; -import useMeetings, { - useSelectedMeeting, - useSelectedMeetingCalendar, -} from './hooks/useMeetings'; -import HubspotWrapper from '../Common/HubspotWrapper'; -import ErrorHandler from '../Common/ErrorHandler'; -import { pluginPath } from '../../constants/leadinConfig'; -import { __ } from '@wordpress/i18n'; -import Raven from 'raven-js'; - -interface IMeetingControllerProps { - url: string; - handleChange: Function; -} - -export default function MeetingController({ - handleChange, - url, -}: IMeetingControllerProps) { - const { - mappedMeetings: meetings, - loading, - error, - reload, - connectCalendar, - } = useMeetings(); - const selectedMeetingOption = useSelectedMeeting(url); - const selectedMeetingCalendar = useSelectedMeetingCalendar(url); - - useEffect(() => { - if (!url && meetings.length > 0) { - handleChange(meetings[0].value); - } - }, [meetings, url, handleChange]); - - const handleLocalChange = (option: { value: string }) => { - handleChange(option.value); - }; - - const handleConnectCalendar = () => { - return connectCalendar() - .then(() => { - reload(); - }) - .catch(error => { - Raven.captureMessage('Unable to connect calendar', { - extra: { error }, - }); - }); - }; - - return ( - - {loading ? ( - - ) : error ? ( - reload()} - errorInfo={{ - header: __( - 'There was a problem retrieving your meetings', - 'leadin' - ), - message: __( - 'Please refresh your meetings or try again in a few minutes', - 'leadin' - ), - action: __('Refresh meetings', 'leadin'), - }} - /> - ) : ( - - {selectedMeetingCalendar && ( - - )} - {meetings.length > 1 && ( - - )} - - )} - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingEdit.tsx b/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingEdit.tsx deleted file mode 100644 index 343816ed..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingEdit.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import React, { Fragment, useEffect } from 'react'; -import { IMeetingBlockProps } from '../../gutenberg/MeetingsBlock/registerMeetingBlock'; -import MeetingController from './MeetingController'; -import PreviewMeeting from './PreviewMeeting'; -import { - BackgroudAppContext, - useBackgroundAppContext, - usePostBackgroundMessage, -} from '../../iframe/useBackgroundApp'; -import { refreshToken } from '../../constants/leadinConfig'; -import { ProxyMessages } from '../../iframe/integratedMessages'; -import LoadingBlock from '../Common/LoadingBlock'; -import { getOrCreateBackgroundApp } from '../../utils/backgroundAppUtils'; - -interface IMeetingEditProps extends IMeetingBlockProps { - preview?: boolean; - origin?: 'gutenberg' | 'elementor'; -} - -function MeetingEdit({ - attributes: { url }, - isSelected, - setAttributes, - preview = true, - origin = 'gutenberg', -}: IMeetingEditProps) { - const isBackgroundAppReady = useBackgroundAppContext(); - const monitorFormPreviewRender = usePostBackgroundMessage(); - - const handleChange = (newUrl: string) => { - setAttributes({ - url: newUrl, - }); - }; - - useEffect(() => { - monitorFormPreviewRender({ - key: ProxyMessages.TrackMeetingPreviewRender, - payload: { - origin, - }, - }); - }, [origin]); - - return !isBackgroundAppReady ? ( - - ) : ( - - {(isSelected || !url) && ( - - )} - {preview && url && } - - ); -} - -export default function MeetingsEditContainer(props: IMeetingEditProps) { - return ( - - - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingSelector.tsx b/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingSelector.tsx deleted file mode 100644 index d05c9974..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingSelector.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React, { Fragment } from 'react'; -import AsyncSelect from '../Common/AsyncSelect'; -import UISpacer from '../UIComponents/UISpacer'; -import { __ } from '@wordpress/i18n'; - -interface IMeetingSelectorProps { - options: any[]; - onChange: Function; - value: any; -} - -export default function MeetingSelector({ - options, - onChange, - value, -}: IMeetingSelectorProps) { - const optionsWrapper = [ - { - label: __('Meeting name', 'leadin'), - options, - }, - ]; - - return ( - - -

- {__('Select a meeting scheduling page', 'leadin')} -

- -
- ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingWarning.tsx b/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingWarning.tsx deleted file mode 100644 index 197a209c..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingWarning.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import React from 'react'; -import UIAlert from '../UIComponents/UIAlert'; -import UIButton from '../UIComponents/UIButton'; -import { CURRENT_USER_CALENDAR_MISSING } from './constants'; -import { __ } from '@wordpress/i18n'; - -interface IMeetingWarningProps { - status: string; - onConnectCalendar: React.MouseEventHandler; -} - -export default function MeetingWarning({ - status, - onConnectCalendar, -}: IMeetingWarningProps) { - const isMeetingOwner = status === CURRENT_USER_CALENDAR_MISSING; - const titleText = isMeetingOwner - ? __('Your calendar is not connected', 'leadin') - : __('Calendar is not connected', 'leadin'); - const titleMessage = isMeetingOwner - ? __( - 'Please connect your calendar to activate your scheduling pages', - 'leadin' - ) - : __( - 'Make sure that everybody in this meeting has connected their calendar from the Meetings page in HubSpot', - 'leadin' - ); - return ( - - {isMeetingOwner && ( - - {__('Connect calendar', 'leadin')} - - )} - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingsContext.tsx b/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingsContext.tsx deleted file mode 100644 index bd53ffba..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/MeetingsContext.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import React, { useEffect, useState, useCallback } from 'react'; -import useCurrentUserFetch from './hooks/useCurrentUserFetch'; -import useMeetingsFetch from './hooks/useMeetingsFetch'; -import LoadState from '../enums/loadState'; - -interface IMeetingsContextWrapperState { - loading: boolean; - error: any; - meetings: any[]; - currentUser: any; - meetingUsers: any; - selectedMeeting: string; -} - -interface IMeetingsContext extends IMeetingsContextWrapperState { - reload: Function; -} - -interface IMeetingsContextWrapperProps { - url: string; -} - -export const MeetingsContext = React.createContext({ - loading: true, - error: null, - meetings: [], - currentUser: null, - meetingUsers: {}, - selectedMeeting: '', - reload: () => {}, -}); - -export default function MeetingsContextWrapper({ - url, - children, -}: React.PropsWithChildren) { - const [state, setState] = useState({ - loading: true, - error: null, - meetings: [], - currentUser: null, - meetingUsers: {}, - selectedMeeting: url, - }); - - const { - meetings, - meetingUsers, - loadMeetingsState, - error: errorMeeting, - reload: reloadMeetings, - } = useMeetingsFetch(); - - const { - user: currentUser, - loadUserState, - error: errorUser, - reload: reloadUser, - } = useCurrentUserFetch(); - - const reload = useCallback(() => { - reloadUser(); - reloadMeetings(); - }, [reloadUser, reloadMeetings]); - - useEffect(() => { - if ( - !state.loading && - !state.error && - state.currentUser && - state.meetings.length === 0 - ) { - reloadMeetings(); - } - }, [state, reloadMeetings]); - - useEffect(() => { - setState(previous => ({ - ...previous, - loading: - loadUserState === LoadState.Loading || - loadMeetingsState === LoadState.Loading, - currentUser, - meetings, - meetingUsers: meetingUsers.reduce((p, c) => ({ ...p, [c.id]: c }), {}), - error: errorMeeting || errorUser, - selectedMeeting: url, - })); - }, [ - loadUserState, - loadMeetingsState, - currentUser, - meetings, - meetingUsers, - errorMeeting, - errorUser, - url, - setState, - ]); - - return ( - - {children} - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/PreviewMeeting.tsx b/wp/wp-content/plugins/leadin/scripts/shared/Meeting/PreviewMeeting.tsx deleted file mode 100644 index c52f816e..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/PreviewMeeting.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React, { Fragment, useEffect, useRef } from 'react'; -import UIOverlay from '../UIComponents/UIOverlay'; -import useMeetingsScript from './hooks/useMeetingsScript'; - -interface IPreviewForm { - url: string; -} - -export default function PreviewForm({ url }: IPreviewForm) { - const ready = useMeetingsScript(); - const inputEl = useRef(null); - - useEffect(() => { - if (!ready) { - return; - } - if (inputEl.current) { - inputEl.current.innerHTML = ''; - const container = document.createElement('div'); - container.dataset.src = `${url}?embed=true`; - container.classList.add('meetings-iframe-container'); - inputEl.current.appendChild(container); - const embedScript = document.createElement('script'); - embedScript.innerHTML = - 'hbspt.meetings.create(".meetings-iframe-container");'; - inputEl.current.appendChild(embedScript); - } - }, [url, ready, inputEl]); - - return {url && }; -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/constants.ts b/wp/wp-content/plugins/leadin/scripts/shared/Meeting/constants.ts deleted file mode 100644 index b85dd7b9..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const OTHER_USER_CALENDAR_MISSING = 'OTHER_USER_CALENDAR_MISSING'; -export const CURRENT_USER_CALENDAR_MISSING = 'CURRENT_USER_CALENDAR_MISSING'; diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/hooks/useCurrentUserFetch.ts b/wp/wp-content/plugins/leadin/scripts/shared/Meeting/hooks/useCurrentUserFetch.ts deleted file mode 100644 index 27e3e481..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/hooks/useCurrentUserFetch.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { useEffect, useState } from 'react'; -import { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp'; -import LoadState, { LoadStateType } from '../../enums/loadState'; -import { ProxyMessages } from '../../../iframe/integratedMessages'; - -let user: any = null; - -export default function useCurrentUserFetch() { - const proxy = usePostAsyncBackgroundMessage(); - const [loadState, setLoadState] = useState( - LoadState.NotLoaded - ); - const [error, setError] = useState(null); - - const createUser = () => { - if (!user) { - setLoadState(LoadState.NotLoaded); - } - }; - - const reload = () => { - user = null; - setLoadState(LoadState.NotLoaded); - setError(null); - }; - - useEffect(() => { - if (loadState === LoadState.NotLoaded && !user) { - setLoadState(LoadState.Loading); - proxy({ - key: ProxyMessages.FetchOrCreateMeetingUser, - }) - .then(data => { - user = data; - setLoadState(LoadState.Idle); - }) - .catch(err => { - setError(err); - setLoadState(LoadState.Failed); - }); - } - }, [loadState]); - - return { user, loadUserState: loadState, error, createUser, reload }; -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/hooks/useMeetings.ts b/wp/wp-content/plugins/leadin/scripts/shared/Meeting/hooks/useMeetings.ts deleted file mode 100644 index 62198944..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/hooks/useMeetings.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { useCallback } from 'react'; -import { __ } from '@wordpress/i18n'; -import { - CURRENT_USER_CALENDAR_MISSING, - OTHER_USER_CALENDAR_MISSING, -} from '../constants'; -import useMeetingsFetch, { MeetingUser } from './useMeetingsFetch'; -import useCurrentUserFetch from './useCurrentUserFetch'; -import LoadState from '../../enums/loadState'; -import { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp'; -import { ProxyMessages } from '../../../iframe/integratedMessages'; - -function getDefaultMeetingName( - meeting: any, - currentUser: any, - meetingUsers: any -) { - const [meetingOwnerId] = meeting.meetingsUserIds; - let result = __('Default', 'leadin'); - if ( - currentUser && - meetingOwnerId !== currentUser.id && - meetingUsers[meetingOwnerId] - ) { - const user = meetingUsers[meetingOwnerId]; - result += ` (${user.userProfile.fullName})`; - } - return result; -} - -function hasCalendarObject(user: any) { - return ( - user && - user.meetingsUserBlob && - user.meetingsUserBlob.calendarSettings && - user.meetingsUserBlob.calendarSettings.email - ); -} - -export default function useMeetings() { - const proxy = usePostAsyncBackgroundMessage(); - const { - meetings, - meetingUsers, - error: meetingsError, - loadMeetingsState, - reload: reloadMeetings, - } = useMeetingsFetch(); - const { - user: currentUser, - error: userError, - loadUserState, - reload: reloadUser, - } = useCurrentUserFetch(); - - const reload = useCallback(() => { - reloadUser(); - reloadMeetings(); - }, [reloadUser, reloadMeetings]); - - const connectCalendar = () => { - return proxy({ - key: ProxyMessages.ConnectMeetingsCalendar, - }); - }; - - return { - mappedMeetings: meetings.map(meet => ({ - label: - meet.name || getDefaultMeetingName(meet, currentUser, meetingUsers), - value: meet.link, - })), - meetings, - meetingUsers, - currentUser, - error: meetingsError || (userError as any), - loading: - loadMeetingsState == LoadState.Loading || - loadUserState === LoadState.Loading, - reload, - connectCalendar, - }; -} - -export function useSelectedMeeting(url: string) { - const { mappedMeetings: meetings } = useMeetings(); - const option = meetings.find(({ value }) => value === url); - - return option; -} - -export function useSelectedMeetingCalendar(url: string) { - const { meetings, meetingUsers, currentUser } = useMeetings(); - - const meeting = meetings.find(meet => meet.link === url); - - const mappedMeetingUsersId: { - [key: number]: MeetingUser; - } = meetingUsers.reduce((p, c) => ({ ...p, [c.id]: c }), {}); - - if (!meeting) { - return null; - } else { - const { meetingsUserIds } = meeting; - if ( - currentUser && - meetingsUserIds.includes(currentUser.id) && - !hasCalendarObject(currentUser) - ) { - return CURRENT_USER_CALENDAR_MISSING; - } else if ( - meetingsUserIds - .map(id => mappedMeetingUsersId[id]) - .some((user: any) => !hasCalendarObject(user)) - ) { - return OTHER_USER_CALENDAR_MISSING; - } else { - return null; - } - } -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/hooks/useMeetingsFetch.ts b/wp/wp-content/plugins/leadin/scripts/shared/Meeting/hooks/useMeetingsFetch.ts deleted file mode 100644 index 425c6e79..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/hooks/useMeetingsFetch.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { useEffect, useState } from 'react'; -import { usePostAsyncBackgroundMessage } from '../../../iframe/useBackgroundApp'; -import LoadState, { LoadStateType } from '../../enums/loadState'; -import { ProxyMessages } from '../../../iframe/integratedMessages'; - -export interface Meeting { - meetingsUserIds: number[]; - name: string; - link: string; -} - -export interface MeetingUser { - id: string; -} - -let meetings: Meeting[] = []; -let meetingUsers: MeetingUser[] = []; - -export default function useMeetingsFetch() { - const proxy = usePostAsyncBackgroundMessage(); - const [loadState, setLoadState] = useState( - LoadState.NotLoaded - ); - - const [error, setError] = useState(null); - - const reload = () => { - meetings = []; - setError(null); - setLoadState(LoadState.NotLoaded); - }; - - useEffect(() => { - if (loadState === LoadState.NotLoaded && meetings.length === 0) { - setLoadState(LoadState.Loading); - proxy({ - key: ProxyMessages.FetchMeetingsAndUsers, - }) - .then(data => { - setLoadState(LoadState.Loaded); - meetings = data && data.meetingLinks; - meetingUsers = data && data.meetingUsers; - }) - .catch(e => { - setError(e); - setLoadState(LoadState.Failed); - }); - } - }, [loadState]); - - return { - meetings, - meetingUsers, - loadMeetingsState: loadState, - error, - reload, - }; -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/hooks/useMeetingsScript.ts b/wp/wp-content/plugins/leadin/scripts/shared/Meeting/hooks/useMeetingsScript.ts deleted file mode 100644 index 34bd865e..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/Meeting/hooks/useMeetingsScript.ts +++ /dev/null @@ -1,30 +0,0 @@ -import $ from 'jquery'; - -import { useState, useEffect } from 'react'; -import { meetingsScript } from '../../../constants/leadinConfig'; -import Raven from '../../../lib/Raven'; - -let promise: Promise; - -function loadMeetingsScript() { - if (!promise) { - promise = new Promise((resolve, reject) => - $.getScript(meetingsScript) - .done(resolve) - .fail(reject) - ); - } - return promise; -} - -export default function useMeetingsScript() { - const [ready, setReady] = useState(false); - - useEffect(() => { - loadMeetingsScript() - .then(() => setReady(true)) - .catch(error => Raven.captureException(error)); - }, []); - - return ready; -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UIAlert.tsx b/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UIAlert.tsx deleted file mode 100644 index 7d749190..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UIAlert.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import React from 'react'; -import { styled } from '@linaria/react'; -import { MARIGOLD_LIGHT, MARIGOLD_MEDIUM, OBSIDIAN } from './colors'; - -const AlertContainer = styled.div` - background-color: ${MARIGOLD_LIGHT}; - border-color: ${MARIGOLD_MEDIUM}; - color: ${OBSIDIAN}; - font-size: 14px; - align-items: center; - justify-content: space-between; - display: flex; - border-style: solid; - border-top-style: solid; - border-right-style: solid; - border-bottom-style: solid; - border-left-style: solid; - border-width: 1px; - min-height: 60px; - padding: 8px 20px; - position: relative; - text-align: left; -`; - -const Title = styled.p` - font-family: 'Lexend Deca'; - font-style: normal; - font-weight: 700; - font-size: 16px; - line-height: 19px; - color: ${OBSIDIAN}; - margin: 0; - padding: 0; -`; - -const Message = styled.p` - font-family: 'Lexend Deca'; - font-style: normal; - font-weight: 400; - font-size: 14px; - margin: 0; - padding: 0; -`; - -const MessageContainer = styled.div` - display: flex; - flex-direction: column; -`; - -interface IUIAlertProps { - titleText: string; - titleMessage: string; -} - -export default function UIAlert({ - titleText, - titleMessage, - children, -}: React.PropsWithChildren) { - return ( - - - {titleText} - {titleMessage} - - {children} - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UIButton.ts b/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UIButton.ts deleted file mode 100644 index 97c8ba70..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UIButton.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { styled } from '@linaria/react'; -import { HEFFALUMP, LORAX, OLAF } from './colors'; - -interface IButtonProps { - use?: string; -} - -export default styled.button` - background-color:${props => (props.use === 'tertiary' ? HEFFALUMP : LORAX)}; - border: 3px solid ${props => (props.use === 'tertiary' ? HEFFALUMP : LORAX)}; - color: ${OLAF} - border-radius: 3px; - font-size: 14px; - line-height: 14px; - padding: 12px 24px; - font-family: 'Lexend Deca', Helvetica, Arial, sans-serif; - font-weight: 500; - white-space: nowrap; -`; diff --git a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UIContainer.ts b/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UIContainer.ts deleted file mode 100644 index 6f44b8e5..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UIContainer.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { styled } from '@linaria/react'; - -interface IUIContainerProps { - textAlign?: string; -} - -export default styled.div` - text-align: ${props => (props.textAlign ? props.textAlign : 'inherit')}; -`; diff --git a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UIOverlay.ts b/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UIOverlay.ts deleted file mode 100644 index 35d06791..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UIOverlay.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { styled } from '@linaria/react'; - -export default styled.div` - position: relative; - - &:after { - content: ''; - position: absolute; - top: 0; - bottom: 0; - right: 0; - left: 0; - } -`; diff --git a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UISpacer.ts b/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UISpacer.ts deleted file mode 100644 index f014b0cd..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UISpacer.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { styled } from '@linaria/react'; - -export default styled.div` - height: 30px; -`; diff --git a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UISpinner.tsx b/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UISpinner.tsx deleted file mode 100644 index f1494bd2..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/UISpinner.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import React from 'react'; -import { styled } from '@linaria/react'; -import { CALYPSO_MEDIUM, CALYPSO } from './colors'; - -const SpinnerOuter = styled.div` - align-items: center; - color: #00a4bd; - display: flex; - flex-direction: column; - justify-content: center; - width: 100%; - height: 100%; - margin: '2px'; -`; - -const SpinnerInner = styled.div` - align-items: center; - display: flex; - justify-content: center; - width: 100%; - height: 100%; -`; - -interface IColorProp { - color: string; -} - -const Circle = styled.circle` - fill: none; - stroke: ${props => props.color}; - stroke-width: 5; - stroke-linecap: round; - transform-origin: center; -`; - -const AnimatedCircle = styled.circle` - fill: none; - stroke: ${props => props.color}; - stroke-width: 5; - stroke-linecap: round; - transform-origin: center; - animation: dashAnimation 2s ease-in-out infinite, - spinAnimation 2s linear infinite; - - @keyframes dashAnimation { - 0% { - stroke-dasharray: 1, 150; - stroke-dashoffset: 0; - } - - 50% { - stroke-dasharray: 90, 150; - stroke-dashoffset: -50; - } - - 100% { - stroke-dasharray: 90, 150; - stroke-dashoffset: -140; - } - } - - @keyframes spinAnimation { - transform: rotate(360deg); - } -`; - -export default function UISpinner({ size = 20 }) { - return ( - - - - - - - - - ); -} diff --git a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/colors.ts b/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/colors.ts deleted file mode 100644 index 9aaccc62..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/UIComponents/colors.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const CALYPSO = '#00a4bd'; -export const CALYPSO_MEDIUM = '#7fd1de'; -export const CALYPSO_LIGHT = '#e5f5f8'; -export const LORAX = '#ff7a59'; -export const OLAF = '#ffffff'; -export const HEFFALUMP = '#425b76'; -export const MARIGOLD_LIGHT = '#fef8f0'; -export const MARIGOLD_MEDIUM = '#fae0b5'; -export const OBSIDIAN = '#33475b'; diff --git a/wp/wp-content/plugins/leadin/scripts/shared/enums/connectionStatus.ts b/wp/wp-content/plugins/leadin/scripts/shared/enums/connectionStatus.ts deleted file mode 100644 index 62142122..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/enums/connectionStatus.ts +++ /dev/null @@ -1,6 +0,0 @@ -const ConnectionStatus = { - Connected: 'Connected', - NotConnected: 'NotConnected', -} as const; - -export default ConnectionStatus; diff --git a/wp/wp-content/plugins/leadin/scripts/shared/enums/loadState.ts b/wp/wp-content/plugins/leadin/scripts/shared/enums/loadState.ts deleted file mode 100644 index e6c64077..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/enums/loadState.ts +++ /dev/null @@ -1,11 +0,0 @@ -const LoadState = { - NotLoaded: 'NotLoaded', - Loading: 'Loading', - Loaded: 'Loaded', - Idle: 'Idle', - Failed: 'Failed', -} as const; - -export type LoadStateType = typeof LoadState[keyof typeof LoadState]; - -export default LoadState; diff --git a/wp/wp-content/plugins/leadin/scripts/shared/types.ts b/wp/wp-content/plugins/leadin/scripts/shared/types.ts deleted file mode 100644 index 2276fa06..00000000 --- a/wp/wp-content/plugins/leadin/scripts/shared/types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface IForm { - guid: string; - name: string; -} diff --git a/wp/wp-content/plugins/leadin/scripts/utils/appUtils.ts b/wp/wp-content/plugins/leadin/scripts/utils/appUtils.ts deleted file mode 100644 index c08ec5e6..00000000 --- a/wp/wp-content/plugins/leadin/scripts/utils/appUtils.ts +++ /dev/null @@ -1,14 +0,0 @@ -import $ from 'jquery'; -import Raven, { configureRaven } from '../lib/Raven'; - -export function initApp(initFn: Function) { - configureRaven(); - Raven.context(initFn); -} - -export function initAppOnReady(initFn: (...args: any[]) => void) { - function main() { - $(initFn); - } - initApp(main); -} diff --git a/wp/wp-content/plugins/leadin/scripts/utils/backgroundAppUtils.ts b/wp/wp-content/plugins/leadin/scripts/utils/backgroundAppUtils.ts deleted file mode 100644 index 62486af2..00000000 --- a/wp/wp-content/plugins/leadin/scripts/utils/backgroundAppUtils.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { - deviceId, - hubspotBaseUrl, - locale, - portalId, -} from '../constants/leadinConfig'; -import { initApp } from './appUtils'; - -type CallbackFn = (...args: any[]) => void; - -export function initBackgroundApp(initFn: CallbackFn | CallbackFn[]) { - function main() { - if (Array.isArray(initFn)) { - initFn.forEach(callback => callback()); - } else { - initFn(); - } - } - initApp(main); -} - -export const getOrCreateBackgroundApp = (refreshToken: string) => { - if ((window as any).LeadinBackgroundApp) { - return (window as any).LeadinBackgroundApp; - } - const { IntegratedAppEmbedder, IntegratedAppOptions }: any = window; - const options = new IntegratedAppOptions() - .setLocale(locale) - .setDeviceId(deviceId) - .setRefreshToken(refreshToken); - - const embedder = new IntegratedAppEmbedder( - 'integrated-plugin-proxy', - portalId, - hubspotBaseUrl, - () => {} - ).setOptions(options); - - embedder.attachTo(document.body, false); - embedder.postStartAppMessage(); // lets the app know all all data has been passed to it - - (window as any).LeadinBackgroundApp = embedder; - return (window as any).LeadinBackgroundApp; -}; diff --git a/wp/wp-content/plugins/leadin/scripts/utils/contentEmbedInstaller.ts b/wp/wp-content/plugins/leadin/scripts/utils/contentEmbedInstaller.ts deleted file mode 100644 index ae3adf52..00000000 --- a/wp/wp-content/plugins/leadin/scripts/utils/contentEmbedInstaller.ts +++ /dev/null @@ -1,27 +0,0 @@ -type ContentEmbedInfoResponse = { - success: boolean; - data?: { - // Empty if user doesn't have permissions or plugin already activated - activateAjaxUrl?: string; - message: string; - }; -}; - -export function startInstall(nonce: string) { - const formData = new FormData(); - const ajaxUrl = (window as any).ajaxurl; - formData.append('_wpnonce', nonce); - formData.append('action', 'content_embed_install'); - return fetch(ajaxUrl, { - method: 'POST', - body: formData, - keepalive: true, - }).then(res => res.json()); -} - -export function startActivation(requestUrl: string) { - return fetch(requestUrl, { - method: 'POST', - keepalive: true, - }).then(res => res.json()); -} diff --git a/wp/wp-content/plugins/leadin/scripts/utils/iframe.ts b/wp/wp-content/plugins/leadin/scripts/utils/iframe.ts deleted file mode 100644 index 9b80009b..00000000 --- a/wp/wp-content/plugins/leadin/scripts/utils/iframe.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { useEffect, useState } from 'react'; - -const IFRAME_DISPLAY_TIMEOUT = 5000; - -export function useIframeNotRendered(app: string) { - const [iframeNotRendered, setIframeNotRendered] = useState(false); - useEffect(() => { - const timer = setTimeout(() => { - const iframe = document.getElementById(app); - if (!iframe) { - setIframeNotRendered(true); - } - }, IFRAME_DISPLAY_TIMEOUT); - - return () => { - if (timer) { - clearTimeout(timer); - } - }; - }, []); - - return iframeNotRendered; -} - -export const resizeWindow = () => { - const adminMenuWrap = document.getElementById('adminmenuwrap'); - const sideMenuHeight = adminMenuWrap ? adminMenuWrap.offsetHeight : 0; - const adminBar = document.getElementById('wpadminbar'); - const adminBarHeight = (adminBar && adminBar.offsetHeight) || 0; - const offset = 4; - if (window.innerHeight < sideMenuHeight) { - return sideMenuHeight - offset; - } else { - return window.innerHeight - adminBarHeight - offset; - } -}; diff --git a/wp/wp-content/plugins/leadin/scripts/utils/queryParams.ts b/wp/wp-content/plugins/leadin/scripts/utils/queryParams.ts deleted file mode 100644 index 69b5ec88..00000000 --- a/wp/wp-content/plugins/leadin/scripts/utils/queryParams.ts +++ /dev/null @@ -1,14 +0,0 @@ -export function addQueryObjectToUrl( - urlObject: URL, - queryParams: { [key: string]: any } -) { - Object.keys(queryParams).forEach(key => { - urlObject.searchParams.append(key, queryParams[key]); - }); -} - -export function removeQueryParamFromLocation(key: string) { - const location = new URL(window.location.href); - location.searchParams.delete(key); - window.history.replaceState(null, '', location.href); -} diff --git a/wp/wp-content/plugins/leadin/scripts/utils/withMetaData.ts b/wp/wp-content/plugins/leadin/scripts/utils/withMetaData.ts deleted file mode 100644 index 186ded3f..00000000 --- a/wp/wp-content/plugins/leadin/scripts/utils/withMetaData.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { withSelect, withDispatch, select } from '@wordpress/data'; - -// from answer here: https://github.com/WordPress/gutenberg/issues/44477#issuecomment-1263026599 -export const isFullSiteEditor = () => { - return select && !!select('core/edit-site'); -}; - -const applyWithSelect = withSelect((select: Function, props: any): any => { - return { - metaValue: select('core/editor').getEditedPostAttribute('meta')[ - props.metaKey - ], - }; -}); - -const applyWithDispatch = withDispatch( - (dispatch: Function, props: any): any => { - return { - setMetaValue(value: string) { - dispatch('core/editor').editPost({ meta: { [props.metaKey]: value } }); - }, - }; - } -); - -function apply(el: T): T { - return applyWithSelect(applyWithDispatch(el)); -} - -export default apply; diff --git a/wp/wp-content/plugins/leadin/uninstall.php b/wp/wp-content/plugins/leadin/uninstall.php deleted file mode 100644 index c0814058..00000000 --- a/wp/wp-content/plugins/leadin/uninstall.php +++ /dev/null @@ -1,26 +0,0 @@ - array( 'ID' ) ) ); -foreach ( $leadin_users as $leadin_user ) { - delete_user_meta( $leadin_user->ID, 'leadin_email' ); - delete_user_meta( $leadin_user->ID, 'leadin_skip_review' ); - delete_user_meta( $leadin_user->ID, 'leadin_review_banner_last_call' ); - delete_user_meta( $leadin_user->ID, 'leadin_has_min_contacts' ); - delete_user_meta( $leadin_user->ID, 'leadin_track_consent' ); -} - -delete_option( 'leadin_portalId' ); -delete_option( 'leadin_account_name' ); -delete_option( 'leadin_portal_domain' ); -delete_option( 'leadin_hublet' ); -delete_option( 'leadin_disable_internal_tracking' ); -delete_option( 'leadin_business_unit_id' ); -delete_option( 'leadin_access_token' ); -delete_option( 'leadin_refresh_token' ); -delete_option( 'leadin_expiry_time' ); -delete_option( 'leadin_activation_time' ); -delete_option( 'leadin_content_embed_ui_install' ); diff --git a/wp/wp-content/plugins/leadin/vendor/autoload.php b/wp/wp-content/plugins/leadin/vendor/autoload.php deleted file mode 100644 index c139a08b..00000000 --- a/wp/wp-content/plugins/leadin/vendor/autoload.php +++ /dev/null @@ -1,25 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see https://www.php-fig.org/psr/psr-0/ - * @see https://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - /** @var \Closure(string):void */ - private static $includeFile; - - /** @var string|null */ - private $vendorDir; - - // PSR-4 - /** - * @var array> - */ - private $prefixLengthsPsr4 = array(); - /** - * @var array> - */ - private $prefixDirsPsr4 = array(); - /** - * @var list - */ - private $fallbackDirsPsr4 = array(); - - // PSR-0 - /** - * List of PSR-0 prefixes - * - * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) - * - * @var array>> - */ - private $prefixesPsr0 = array(); - /** - * @var list - */ - private $fallbackDirsPsr0 = array(); - - /** @var bool */ - private $useIncludePath = false; - - /** - * @var array - */ - private $classMap = array(); - - /** @var bool */ - private $classMapAuthoritative = false; - - /** - * @var array - */ - private $missingClasses = array(); - - /** @var string|null */ - private $apcuPrefix; - - /** - * @var array - */ - private static $registeredLoaders = array(); - - /** - * @param string|null $vendorDir - */ - public function __construct($vendorDir = null) - { - $this->vendorDir = $vendorDir; - self::initializeIncludeClosure(); - } - - /** - * @return array> - */ - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); - } - - return array(); - } - - /** - * @return array> - */ - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - /** - * @return list - */ - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - /** - * @return list - */ - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - /** - * @return array Array of classname => path - */ - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - * - * @return void - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param list|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - * - * @return void - */ - public function add($prefix, $paths, $prepend = false) - { - $paths = (array) $paths; - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param list|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - * - * @return void - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - $paths = (array) $paths; - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param list|string $paths The PSR-0 base directories - * - * @return void - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param list|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - * - * @return void - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - * - * @return void - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - * - * @return void - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - * - * @return void - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - * - * @return void - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - - if (null === $this->vendorDir) { - return; - } - - if ($prepend) { - self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; - } else { - unset(self::$registeredLoaders[$this->vendorDir]); - self::$registeredLoaders[$this->vendorDir] = $this; - } - } - - /** - * Unregisters this instance as an autoloader. - * - * @return void - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - - if (null !== $this->vendorDir) { - unset(self::$registeredLoaders[$this->vendorDir]); - } - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return true|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - $includeFile = self::$includeFile; - $includeFile($file); - - return true; - } - - return null; - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - /** - * Returns the currently registered loaders keyed by their corresponding vendor directories. - * - * @return array - */ - public static function getRegisteredLoaders() - { - return self::$registeredLoaders; - } - - /** - * @param string $class - * @param string $ext - * @return string|false - */ - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } - - /** - * @return void - */ - private static function initializeIncludeClosure() - { - if (self::$includeFile !== null) { - return; - } - - /** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - * - * @param string $file - * @return void - */ - self::$includeFile = \Closure::bind(static function($file) { - include $file; - }, null, null); - } -} diff --git a/wp/wp-content/plugins/leadin/vendor/composer/InstalledVersions.php b/wp/wp-content/plugins/leadin/vendor/composer/InstalledVersions.php deleted file mode 100644 index 51e734a7..00000000 --- a/wp/wp-content/plugins/leadin/vendor/composer/InstalledVersions.php +++ /dev/null @@ -1,359 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer; - -use Composer\Autoload\ClassLoader; -use Composer\Semver\VersionParser; - -/** - * This class is copied in every Composer installed project and available to all - * - * See also https://getcomposer.org/doc/07-runtime.md#installed-versions - * - * To require its presence, you can require `composer-runtime-api ^2.0` - * - * @final - */ -class InstalledVersions -{ - /** - * @var mixed[]|null - * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null - */ - private static $installed; - - /** - * @var bool|null - */ - private static $canGetVendors; - - /** - * @var array[] - * @psalm-var array}> - */ - private static $installedByVendor = array(); - - /** - * Returns a list of all package names which are present, either by being installed, replaced or provided - * - * @return string[] - * @psalm-return list - */ - public static function getInstalledPackages() - { - $packages = array(); - foreach (self::getInstalled() as $installed) { - $packages[] = array_keys($installed['versions']); - } - - if (1 === \count($packages)) { - return $packages[0]; - } - - return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); - } - - /** - * Returns a list of all package names with a specific type e.g. 'library' - * - * @param string $type - * @return string[] - * @psalm-return list - */ - public static function getInstalledPackagesByType($type) - { - $packagesByType = array(); - - foreach (self::getInstalled() as $installed) { - foreach ($installed['versions'] as $name => $package) { - if (isset($package['type']) && $package['type'] === $type) { - $packagesByType[] = $name; - } - } - } - - return $packagesByType; - } - - /** - * Checks whether the given package is installed - * - * This also returns true if the package name is provided or replaced by another package - * - * @param string $packageName - * @param bool $includeDevRequirements - * @return bool - */ - public static function isInstalled($packageName, $includeDevRequirements = true) - { - foreach (self::getInstalled() as $installed) { - if (isset($installed['versions'][$packageName])) { - return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; - } - } - - return false; - } - - /** - * Checks whether the given package satisfies a version constraint - * - * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: - * - * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') - * - * @param VersionParser $parser Install composer/semver to have access to this class and functionality - * @param string $packageName - * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package - * @return bool - */ - public static function satisfies(VersionParser $parser, $packageName, $constraint) - { - $constraint = $parser->parseConstraints((string) $constraint); - $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); - - return $provided->matches($constraint); - } - - /** - * Returns a version constraint representing all the range(s) which are installed for a given package - * - * It is easier to use this via isInstalled() with the $constraint argument if you need to check - * whether a given version of a package is installed, and not just whether it exists - * - * @param string $packageName - * @return string Version constraint usable with composer/semver - */ - public static function getVersionRanges($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - $ranges = array(); - if (isset($installed['versions'][$packageName]['pretty_version'])) { - $ranges[] = $installed['versions'][$packageName]['pretty_version']; - } - if (array_key_exists('aliases', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); - } - if (array_key_exists('replaced', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); - } - if (array_key_exists('provided', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); - } - - return implode(' || ', $ranges); - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present - */ - public static function getVersion($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['version'])) { - return null; - } - - return $installed['versions'][$packageName]['version']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present - */ - public static function getPrettyVersion($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['pretty_version'])) { - return null; - } - - return $installed['versions'][$packageName]['pretty_version']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference - */ - public static function getReference($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['reference'])) { - return null; - } - - return $installed['versions'][$packageName]['reference']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. - */ - public static function getInstallPath($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @return array - * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} - */ - public static function getRootPackage() - { - $installed = self::getInstalled(); - - return $installed[0]['root']; - } - - /** - * Returns the raw installed.php data for custom implementations - * - * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. - * @return array[] - * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} - */ - public static function getRawData() - { - @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); - - if (null === self::$installed) { - // only require the installed.php file if this file is loaded from its dumped location, - // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 - if (substr(__DIR__, -8, 1) !== 'C') { - self::$installed = include __DIR__ . '/installed.php'; - } else { - self::$installed = array(); - } - } - - return self::$installed; - } - - /** - * Returns the raw data of all installed.php which are currently loaded for custom implementations - * - * @return array[] - * @psalm-return list}> - */ - public static function getAllRawData() - { - return self::getInstalled(); - } - - /** - * Lets you reload the static array from another file - * - * This is only useful for complex integrations in which a project needs to use - * this class but then also needs to execute another project's autoloader in process, - * and wants to ensure both projects have access to their version of installed.php. - * - * A typical case would be PHPUnit, where it would need to make sure it reads all - * the data it needs from this class, then call reload() with - * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure - * the project in which it runs can then also use this class safely, without - * interference between PHPUnit's dependencies and the project's dependencies. - * - * @param array[] $data A vendor/composer/installed.php data set - * @return void - * - * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data - */ - public static function reload($data) - { - self::$installed = $data; - self::$installedByVendor = array(); - } - - /** - * @return array[] - * @psalm-return list}> - */ - private static function getInstalled() - { - if (null === self::$canGetVendors) { - self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); - } - - $installed = array(); - - if (self::$canGetVendors) { - foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { - if (isset(self::$installedByVendor[$vendorDir])) { - $installed[] = self::$installedByVendor[$vendorDir]; - } elseif (is_file($vendorDir.'/composer/installed.php')) { - /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ - $required = require $vendorDir.'/composer/installed.php'; - $installed[] = self::$installedByVendor[$vendorDir] = $required; - if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { - self::$installed = $installed[count($installed) - 1]; - } - } - } - } - - if (null === self::$installed) { - // only require the installed.php file if this file is loaded from its dumped location, - // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 - if (substr(__DIR__, -8, 1) !== 'C') { - /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ - $required = require __DIR__ . '/installed.php'; - self::$installed = $required; - } else { - self::$installed = array(); - } - } - - if (self::$installed !== array()) { - $installed[] = self::$installed; - } - - return $installed; - } -} diff --git a/wp/wp-content/plugins/leadin/vendor/composer/LICENSE b/wp/wp-content/plugins/leadin/vendor/composer/LICENSE deleted file mode 100644 index f27399a0..00000000 --- a/wp/wp-content/plugins/leadin/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) Nils Adermann, Jordi Boggiano - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - diff --git a/wp/wp-content/plugins/leadin/vendor/composer/autoload_classmap.php b/wp/wp-content/plugins/leadin/vendor/composer/autoload_classmap.php deleted file mode 100644 index 906a5704..00000000 --- a/wp/wp-content/plugins/leadin/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,48 +0,0 @@ - $vendorDir . '/composer/InstalledVersions.php', - 'Leadin\\AssetsManager' => $baseDir . '/public/class-assetsmanager.php', - 'Leadin\\Leadin' => $baseDir . '/public/class-leadin.php', - 'Leadin\\PageHooks' => $baseDir . '/public/class-pagehooks.php', - 'Leadin\\admin\\AdminConstants' => $baseDir . '/public/admin/class-adminconstants.php', - 'Leadin\\admin\\Connection' => $baseDir . '/public/admin/class-connection.php', - 'Leadin\\admin\\ContentEmbedInstaller' => $baseDir . '/public/admin/class-contentembedinstaller.php', - 'Leadin\\admin\\DeactivationForm' => $baseDir . '/public/admin/class-deactivationform.php', - 'Leadin\\admin\\Gutenberg' => $baseDir . '/public/admin/class-gutenberg.php', - 'Leadin\\admin\\Impact' => $baseDir . '/public/admin/class-impact.php', - 'Leadin\\admin\\LeadinAdmin' => $baseDir . '/public/admin/class-leadinadmin.php', - 'Leadin\\admin\\Links' => $baseDir . '/public/admin/class-links.php', - 'Leadin\\admin\\MenuConstants' => $baseDir . '/public/admin/class-menuconstants.php', - 'Leadin\\admin\\NoticeManager' => $baseDir . '/public/admin/class-noticemanager.php', - 'Leadin\\admin\\PluginActionsManager' => $baseDir . '/public/admin/class-pluginactionsmanager.php', - 'Leadin\\admin\\ReviewBanner' => $baseDir . '/public/admin/class-reviewbanner.php', - 'Leadin\\admin\\ReviewController' => $baseDir . '/public/admin/class-reviewcontroller.php', - 'Leadin\\admin\\Routing' => $baseDir . '/public/admin/class-routing.php', - 'Leadin\\admin\\api\\Hublet_Api_Controller' => $baseDir . '/public/admin/modules/api/class-hublet-api-controller.php', - 'Leadin\\admin\\api\\Internal_Tracking_Api_Controller' => $baseDir . '/public/admin/modules/api/class-internal-tracking-api-controller.php', - 'Leadin\\admin\\api\\Portal_Api_Controller' => $baseDir . '/public/admin/modules/api/class-portal-api-controller.php', - 'Leadin\\admin\\api\\User_Meta_Api_Controller' => $baseDir . '/public/admin/modules/api/class-user-meta-api-controller.php', - 'Leadin\\admin\\widgets\\ElementorForm' => $baseDir . '/public/admin/widgets/class-elementorform.php', - 'Leadin\\admin\\widgets\\ElementorFormSelect' => $baseDir . '/public/admin/widgets/class-elementorformselect.php', - 'Leadin\\admin\\widgets\\ElementorMeeting' => $baseDir . '/public/admin/widgets/class-elementormeeting.php', - 'Leadin\\admin\\widgets\\ElementorMeetingSelect' => $baseDir . '/public/admin/widgets/class-elementormeetingselect.php', - 'Leadin\\api\\Base_Api_Controller' => $baseDir . '/public/modules/api/class-base-api-controller.php', - 'Leadin\\api\\Healthcheck_Api_Controller' => $baseDir . '/public/modules/api/class-healthcheck-api-controller.php', - 'Leadin\\auth\\OAuth' => $baseDir . '/public/auth/class-oauth.php', - 'Leadin\\auth\\OAuthCrypto' => $baseDir . '/public/auth/class-oauthcrypto.php', - 'Leadin\\data\\Filters' => $baseDir . '/public/data/class-filters.php', - 'Leadin\\data\\Portal_Options' => $baseDir . '/public/data/class-portal-options.php', - 'Leadin\\data\\User' => $baseDir . '/public/data/class-user.php', - 'Leadin\\data\\User_Metadata' => $baseDir . '/public/data/class-user-metadata.php', - 'Leadin\\utils\\QueryParameters' => $baseDir . '/public/utils/class-queryparameters.php', - 'Leadin\\utils\\RequestUtils' => $baseDir . '/public/utils/class-requestutils.php', - 'Leadin\\utils\\ShortcodeRenderUtils' => $baseDir . '/public/utils/class-shortcoderenderutils.php', - 'Leadin\\utils\\Versions' => $baseDir . '/public/utils/class-versions.php', - 'Leadin\\wp\\Page' => $baseDir . '/public/wp/class-page.php', -); diff --git a/wp/wp-content/plugins/leadin/vendor/composer/autoload_namespaces.php b/wp/wp-content/plugins/leadin/vendor/composer/autoload_namespaces.php deleted file mode 100644 index 15a2ff3a..00000000 --- a/wp/wp-content/plugins/leadin/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,9 +0,0 @@ -register(true); - - return $loader; - } -} diff --git a/wp/wp-content/plugins/leadin/vendor/composer/autoload_static.php b/wp/wp-content/plugins/leadin/vendor/composer/autoload_static.php deleted file mode 100644 index a4c35c57..00000000 --- a/wp/wp-content/plugins/leadin/vendor/composer/autoload_static.php +++ /dev/null @@ -1,58 +0,0 @@ - __DIR__ . '/..' . '/composer/InstalledVersions.php', - 'Leadin\\AssetsManager' => __DIR__ . '/../..' . '/public/class-assetsmanager.php', - 'Leadin\\Leadin' => __DIR__ . '/../..' . '/public/class-leadin.php', - 'Leadin\\PageHooks' => __DIR__ . '/../..' . '/public/class-pagehooks.php', - 'Leadin\\admin\\AdminConstants' => __DIR__ . '/../..' . '/public/admin/class-adminconstants.php', - 'Leadin\\admin\\Connection' => __DIR__ . '/../..' . '/public/admin/class-connection.php', - 'Leadin\\admin\\ContentEmbedInstaller' => __DIR__ . '/../..' . '/public/admin/class-contentembedinstaller.php', - 'Leadin\\admin\\DeactivationForm' => __DIR__ . '/../..' . '/public/admin/class-deactivationform.php', - 'Leadin\\admin\\Gutenberg' => __DIR__ . '/../..' . '/public/admin/class-gutenberg.php', - 'Leadin\\admin\\Impact' => __DIR__ . '/../..' . '/public/admin/class-impact.php', - 'Leadin\\admin\\LeadinAdmin' => __DIR__ . '/../..' . '/public/admin/class-leadinadmin.php', - 'Leadin\\admin\\Links' => __DIR__ . '/../..' . '/public/admin/class-links.php', - 'Leadin\\admin\\MenuConstants' => __DIR__ . '/../..' . '/public/admin/class-menuconstants.php', - 'Leadin\\admin\\NoticeManager' => __DIR__ . '/../..' . '/public/admin/class-noticemanager.php', - 'Leadin\\admin\\PluginActionsManager' => __DIR__ . '/../..' . '/public/admin/class-pluginactionsmanager.php', - 'Leadin\\admin\\ReviewBanner' => __DIR__ . '/../..' . '/public/admin/class-reviewbanner.php', - 'Leadin\\admin\\ReviewController' => __DIR__ . '/../..' . '/public/admin/class-reviewcontroller.php', - 'Leadin\\admin\\Routing' => __DIR__ . '/../..' . '/public/admin/class-routing.php', - 'Leadin\\admin\\api\\Hublet_Api_Controller' => __DIR__ . '/../..' . '/public/admin/modules/api/class-hublet-api-controller.php', - 'Leadin\\admin\\api\\Internal_Tracking_Api_Controller' => __DIR__ . '/../..' . '/public/admin/modules/api/class-internal-tracking-api-controller.php', - 'Leadin\\admin\\api\\Portal_Api_Controller' => __DIR__ . '/../..' . '/public/admin/modules/api/class-portal-api-controller.php', - 'Leadin\\admin\\api\\User_Meta_Api_Controller' => __DIR__ . '/../..' . '/public/admin/modules/api/class-user-meta-api-controller.php', - 'Leadin\\admin\\widgets\\ElementorForm' => __DIR__ . '/../..' . '/public/admin/widgets/class-elementorform.php', - 'Leadin\\admin\\widgets\\ElementorFormSelect' => __DIR__ . '/../..' . '/public/admin/widgets/class-elementorformselect.php', - 'Leadin\\admin\\widgets\\ElementorMeeting' => __DIR__ . '/../..' . '/public/admin/widgets/class-elementormeeting.php', - 'Leadin\\admin\\widgets\\ElementorMeetingSelect' => __DIR__ . '/../..' . '/public/admin/widgets/class-elementormeetingselect.php', - 'Leadin\\api\\Base_Api_Controller' => __DIR__ . '/../..' . '/public/modules/api/class-base-api-controller.php', - 'Leadin\\api\\Healthcheck_Api_Controller' => __DIR__ . '/../..' . '/public/modules/api/class-healthcheck-api-controller.php', - 'Leadin\\auth\\OAuth' => __DIR__ . '/../..' . '/public/auth/class-oauth.php', - 'Leadin\\auth\\OAuthCrypto' => __DIR__ . '/../..' . '/public/auth/class-oauthcrypto.php', - 'Leadin\\data\\Filters' => __DIR__ . '/../..' . '/public/data/class-filters.php', - 'Leadin\\data\\Portal_Options' => __DIR__ . '/../..' . '/public/data/class-portal-options.php', - 'Leadin\\data\\User' => __DIR__ . '/../..' . '/public/data/class-user.php', - 'Leadin\\data\\User_Metadata' => __DIR__ . '/../..' . '/public/data/class-user-metadata.php', - 'Leadin\\utils\\QueryParameters' => __DIR__ . '/../..' . '/public/utils/class-queryparameters.php', - 'Leadin\\utils\\RequestUtils' => __DIR__ . '/../..' . '/public/utils/class-requestutils.php', - 'Leadin\\utils\\ShortcodeRenderUtils' => __DIR__ . '/../..' . '/public/utils/class-shortcoderenderutils.php', - 'Leadin\\utils\\Versions' => __DIR__ . '/../..' . '/public/utils/class-versions.php', - 'Leadin\\wp\\Page' => __DIR__ . '/../..' . '/public/wp/class-page.php', - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->classMap = ComposerStaticInit2c7a3473c61a1b3f879a569918ce92c4::$classMap; - - }, null, ClassLoader::class); - } -} diff --git a/wp/wp-content/plugins/leadin/vendor/composer/installed.json b/wp/wp-content/plugins/leadin/vendor/composer/installed.json deleted file mode 100644 index f20a6c47..00000000 --- a/wp/wp-content/plugins/leadin/vendor/composer/installed.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "packages": [], - "dev": false, - "dev-package-names": [] -} diff --git a/wp/wp-content/plugins/leadin/vendor/composer/installed.php b/wp/wp-content/plugins/leadin/vendor/composer/installed.php deleted file mode 100644 index a874bc74..00000000 --- a/wp/wp-content/plugins/leadin/vendor/composer/installed.php +++ /dev/null @@ -1,23 +0,0 @@ - array( - 'name' => 'hubspot/leadin-wordpress-plugin', - 'pretty_version' => '11.1.21', - 'version' => '11.1.21.0', - 'reference' => '7a3ee3937dbf7f2d2aee1ccef200de5880caa064', - 'type' => 'library', - 'install_path' => __DIR__ . '/../../', - 'aliases' => array(), - 'dev' => false, - ), - 'versions' => array( - 'hubspot/leadin-wordpress-plugin' => array( - 'pretty_version' => '11.1.21', - 'version' => '11.1.21.0', - 'reference' => '7a3ee3937dbf7f2d2aee1ccef200de5880caa064', - 'type' => 'library', - 'install_path' => __DIR__ . '/../../', - 'aliases' => array(), - 'dev_requirement' => false, - ), - ), -); diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/LICENSE.txt b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/LICENSE.txt deleted file mode 100644 index 871ce8e6..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/LICENSE.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/class-hubwoo-admin.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/class-hubwoo-admin.php deleted file mode 100644 index 8ae403c7..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/class-hubwoo-admin.php +++ /dev/null @@ -1,3265 +0,0 @@ -plugin_name = $plugin_name; - $this->version = $version; - - // let's modularize our codebase, all the admin actions in one function. - $this->admin_actions(); - } - - /** - * All admin actions. - * - * @since 1.0.0 - */ - public function admin_actions() { - - // add submenu hubspot in woocommerce top menu. - add_action( 'admin_menu', array( &$this, 'add_hubwoo_submenu' ) ); - // add filter. - add_filter( 'woocommerce_order_data_store_cpt_get_orders_query', array( $this, 'hubwoo_ignore_guest_synced' ), 10, 2 ); - } - - /** - * Register the stylesheets for the admin area. - * - * @since 1.0.0 - */ - public function enqueue_styles() { - - $screen = get_current_screen(); - - if ( isset( $screen->id ) && 'woocommerce_page_hubwoo' === $screen->id || 'edit-shop_order' === $screen->id || 'woocommerce_page_wc-orders' === $screen->id ) { - - wp_enqueue_style( 'hubwoo-admin-style', plugin_dir_url( __FILE__ ) . 'css/hubwoo-admin.css', array(), $this->version, 'all' ); - wp_register_style( 'woocommerce_admin_styles', WC()->plugin_url() . '/assets/css/admin.css', array(), WC_VERSION ); - wp_enqueue_style( 'woocommerce_admin_menu_styles' ); - wp_enqueue_style( 'woocommerce_admin_styles' ); - wp_enqueue_style( 'hubwoo_jquery_ui', plugin_dir_url( __FILE__ ) . 'css/jquery-ui.css', array(), $this->version ); - } - // deactivation screen - wp_enqueue_style( 'hubwoo-admin-global-style', plugin_dir_url( __FILE__ ) . 'css/hubwoo-admin-global.css', array(), $this->version, 'all' ); - } - - /** - * Register the JavaScript for the admin area. - * - * @since 1.0.0 - */ - public function enqueue_scripts() { - - $screen = get_current_screen(); - - if ( isset( $screen->id ) && 'woocommerce_page_hubwoo' === $screen->id || 'edit-shop_order' === $screen->id || 'woocommerce_page_wc-orders' === $screen->id ) { - - wp_register_script( 'woocommerce_admin', WC()->plugin_url() . '/assets/js/admin/woocommerce_admin.js', array( 'jquery', 'jquery-blockui', 'jquery-ui-sortable', 'jquery-ui-widget', 'jquery-ui-core', 'jquery-tiptip', 'wc-enhanced-select' ), WC_VERSION, true ); - wp_register_script( 'jquery-tiptip', WC()->plugin_url() . '/assets/js/jquery-tiptip/jquery.tipTip.js', array( 'jquery' ), WC_VERSION, true ); - - $locale = localeconv(); - $decimal = isset( $locale['decimal_point'] ) ? $locale['decimal_point'] : '.'; - $decimal_seperator = wc_get_price_decimal_separator(); - $params = array( - /* translators: %s: decimal */ - 'i18n_decimal_error' => sprintf( esc_html__( 'Please enter in decimal (%s) format without thousand separators.', 'makewebbetter-hubspot-for-woocommerce' ), $decimal ), - /* translators: %s: decimal_separator */ - 'i18n_mon_decimal_error' => sprintf( esc_html__( 'Please enter in monetary decimal (%s) format without thousand separators and currency symbols.', 'makewebbetter-hubspot-for-woocommerce' ), $decimal_seperator ), - 'i18n_country_iso_error' => esc_html__( 'Please enter in country code with two capital letters.', 'makewebbetter-hubspot-for-woocommerce' ), - 'i18_sale_less_than_regular_error' => esc_html__( 'Please enter in a value less than the regular price.', 'makewebbetter-hubspot-for-woocommerce' ), - 'decimal_point' => $decimal, - 'mon_decimal_point' => $decimal_seperator, - 'strings' => array( - 'import_products' => esc_html__( 'Import', 'makewebbetter-hubspot-for-woocommerce' ), - 'export_products' => esc_html__( 'Export', 'makewebbetter-hubspot-for-woocommerce' ), - ), - 'urls' => array( - 'import_products' => esc_url_raw( admin_url( 'edit.php?post_type=product&page=product_importer' ) ), - 'export_products' => esc_url_raw( admin_url( 'edit.php?post_type=product&page=product_exporter' ) ), - ), - ); - wp_enqueue_script( 'jquery-ui-datepicker' ); - wp_enqueue_script( 'hubwoo-datatables', plugin_dir_url( __FILE__ ) . 'js/datatable.js', array( 'jquery' ), $this->version, false ); - wp_localize_script( 'woocommerce_admin', 'woocommerce_admin', $params ); - wp_enqueue_script( 'woocommerce_admin' ); - wp_register_script( 'hubwoo_admin_script', plugin_dir_url( __FILE__ ) . 'js/hubwoo-admin.js', array( 'jquery', 'hubwoo-datatables' ), $this->version, true ); - wp_localize_script( - 'hubwoo_admin_script', - 'hubwooi18n', - array( - 'ajaxUrl' => admin_url( 'admin-ajax.php' ), - 'hubwooSecurity' => wp_create_nonce( 'hubwoo_security' ), - 'hubwooWentWrong' => esc_html__( 'Something went wrong, please try again later!', 'makewebbetter-hubspot-for-woocommerce' ), - 'hubwooSuccess' => esc_html__( 'Setup is completed successfully!', 'makewebbetter-hubspot-for-woocommerce' ), - 'hubwooMailFailure' => esc_html__( 'Mail not sent', 'makewebbetter-hubspot-for-woocommerce' ), - 'hubwooMailSuccess' => esc_html__( 'Mail Sent Successfully. We will get back to you soon.', 'makewebbetter-hubspot-for-woocommerce' ), - 'hubwooAccountSwitch' => esc_html__( 'Want to continue to switch to new HubSpot account? This cannot be reverted and will require running the whole setup again.', 'makewebbetter-hubspot-for-woocommerce' ), - 'hubwooRollback' => esc_html__( 'Doing rollback will require running the whole setup again. Continue?' ), - 'hubwooOverviewTab' => admin_url() . 'admin.php?page=hubwoo&hubwoo_tab=hubwoo-overview', - 'hubwooNoListsSelected' => esc_html__( 'Please select a list to proceed', 'makewebbetter-hubspot-for-woocommerce' ), - 'hubwooOcsSuccess' => esc_html__( 'Congratulations !! Your data has been synced successfully.', 'makewebbetter-hubspot-for-woocommerce' ), - 'hubwooOcsError' => esc_html__( 'Something went wrong, Please check the error log and try re-sync your data.', 'makewebbetter-hubspot-for-woocommerce' ), - ) - ); - wp_enqueue_script( 'hubwoo_admin_script' ); - } - // deactivation screen. - wp_enqueue_script( 'crm-connect-hubspot-sdk', '//js.hsforms.net/forms/shell.js', array(), $this->version, false ); - wp_register_script( 'hubwoo_admin_global_script', plugin_dir_url( __FILE__ ) . 'js/hubwoo-admin-global.js', array( 'jquery' ), $this->version, true ); - wp_localize_script( - 'hubwoo_admin_global_script', - 'hubwooi18n', - array( - 'ajaxUrl' => admin_url( 'admin-ajax.php' ), - 'hubwooSecurity' => wp_create_nonce( 'hubwoo_security' ), - ) - ); - wp_enqueue_script( 'hubwoo_admin_global_script' ); - } - - /** - * Add hubspot submenu in woocommerce menu.. - * - * @since 1.0.0 - */ - public function add_hubwoo_submenu() { - - add_submenu_page( 'woocommerce', esc_html__( 'HubSpot', 'makewebbetter-hubspot-for-woocommerce' ), esc_html__( 'HubSpot', 'makewebbetter-hubspot-for-woocommerce' ), 'manage_woocommerce', 'hubwoo', array( &$this, 'hubwoo_configurations' ) ); - } - - /** - * All the configuration related fields and settings. - * - * @since 1.0.0 - */ - public function hubwoo_configurations() { - - include_once HUBWOO_ABSPATH . 'admin/templates/hubwoo-main-template.php'; - } - - /** - * Handle a custom 'hubwoo_pro_guest_order' query var to get orders with the 'hubwoo_pro_guest_order' meta. - * - * @param array $query - Args for WP_Query. - * @param array $query_vars - Query vars from WC_Order_Query. - * @return array modified $query - */ - public function hubwoo_ignore_guest_synced( $query, $query_vars ) { - - if ( ! empty( $query_vars['hubwoo_pro_guest_order'] ) ) { - - $query['meta_query'][] = array( - 'key' => '_billing_email', - 'value' => '', - 'compare' => 'NOT IN', - ); - - $query['meta_query'] = array( - array( - 'relation' => 'AND', - array( - 'key' => 'hubwoo_pro_guest_order', - 'value' => esc_attr( $query_vars['hubwoo_pro_guest_order'] ), - 'compare' => 'NOT EXISTS', - ), - array( - 'key' => '_customer_user', - 'value' => 0, - 'compare' => '=', - ), - ), - ); - } - - return $query; - } - - /** - * Generating access token. - * - * @since 1.0.0 - */ - public function hubwoo_redirect_from_hubspot() { - - if ( isset( $_GET['code'] ) ) { - - if ( isset( $_GET['mwb_source'] ) && $_GET['mwb_source'] == 'hubspot' ) { - if ( ! isset( $_GET['state'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['state'] ) ), 'hubwoo_security' ) ) { - wp_die( 'The state is not correct from HubSpot Server. Try again.' ); - } - } - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - - if ( $hapikey && $hseckey ) { - if ( ! Hubwoo::is_valid_client_ids_stored() ) { - - if ( HubWooConnectionMananager::get_instance()->hubwoo_fetch_access_token_from_code( $hapikey, $hseckey ) == true ) { - $hubwoo_connection_complete = 'yes'; - update_option( 'hubwoo_static_redirect', 'yes' ); - } else { - $hubwoo_connection_complete = 'no'; - } - - global $hubwoo; - $hubwoo->hubwoo_owners_email_info(); - if ( 'yes' == $hubwoo_connection_complete ) { - update_option( 'hubwoo_connection_complete', 'yes' ); - delete_option( 'hubwoo_connection_issue' ); - wp_safe_redirect( admin_url() . 'admin.php?page=hubwoo&hubwoo_tab=hubwoo-overview&hubwoo_key=grp-pr-setup' ); - } else { - update_option( 'hubwoo_connection_complete', 'no' ); - update_option( 'hubwoo_connection_issue', 'yes' ); - wp_safe_redirect( admin_url() . 'admin.php?page=hubwoo&hubwoo_tab=hubwoo-overview&hubwoo_key=connection-setup' ); - } - } - } - } elseif ( ! empty( $_GET['hubwoo_download'] ) ) { - - // Download log file. - $filename = WC_LOG_DIR . Hubwoo::get_current_crm_name( 'slug' ) . '-sync-log.log'; - header( 'Content-type: text/plain' ); - header( 'Content-Disposition: attachment; filename="' . basename( $filename ) . '"' ); - readfile( $filename ); //phpcs:ignore - exit; - } - } - - - - /** - * WooCommerce privacy policy - * - * @since 1.0.0 - */ - public function hubwoo_pro_add_privacy_message() { - - if ( function_exists( 'wp_add_privacy_policy_content' ) ) { - - $content = '

' . esc_html__( 'We use your email to send your Orders related data over HubSpot.', 'makewebbetter-hubspot-for-woocommerce' ) . '

'; - - $content .= '

' . esc_html__( 'HubSpot is an inbound marketing and sales platform that helps companies attract visitors, convert leads, and close customers.', 'makewebbetter-hubspot-for-woocommerce' ) . '

'; - - $content .= '

' . esc_html__( 'Please see the ', 'makewebbetter-hubspot-for-woocommerce' ) . '' . esc_html__( 'HubSpot Data Privacy', 'makewebbetter-hubspot-for-woocommerce' ) . '' . esc_html__( ' for more details.', 'makewebbetter-hubspot-for-woocommerce' ) . '

'; - - if ( $content ) { - - wp_add_privacy_policy_content( esc_html__( 'MWB HubSpot for WooCommerce', 'makewebbetter-hubspot-for-woocommerce' ), $content ); - } - } - } - - /** - * General setting tab fields for hubwoo old customers sync - * - * @return array woocommerce_admin_fields acceptable fields in array. - * @since 1.0.0 - */ - public static function hubwoo_customers_sync_settings() { - - $settings = array(); - - if ( ! function_exists( 'get_editable_roles' ) ) { - - require_once ABSPATH . 'wp-admin/includes/user.php'; - } - - $existing_user_roles = self::get_all_user_roles(); - - $settings[] = array( - 'title' => esc_html__( 'Export your users and customers to HubSpot', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_customers_settings_title', - 'type' => 'title', - ); - - $settings[] = array( - 'title' => esc_html__( 'Select user role', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_customers_role_settings', - 'type' => 'multiselect', - 'desc' => esc_html__( 'Select a user role from the dropdown. Default will be all user roles.', 'makewebbetter-hubspot-for-woocommerce' ), - 'options' => $existing_user_roles, - 'desc_tip' => true, - 'class' => 'hubwoo-ocs-input-change', - 'custom_attributes' => array( - 'data-keytype' => esc_html__( 'user-role', 'makewebbetter-hubspot-for-woocommerce' ), - ), - ); - - $settings[] = array( - 'title' => esc_html__( 'Select a time period', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_customers_manual_sync', - 'class' => 'hubwoo-ocs-input-change', - 'type' => 'checkbox', - 'desc' => esc_html__( 'Date range for user / order sync', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - $settings[] = array( - 'title' => esc_html__( 'Users registered from date', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_users_from_date', - 'type' => 'text', - 'placeholder' => 'dd-mm-yyyy', - 'default' => gmdate( 'd-m-Y' ), - 'desc' => esc_html__( 'From which date you want to sync the users, select that', 'makewebbetter-hubspot-for-woocommerce' ), - 'desc_tip' => true, - 'class' => 'date-picker hubwoo-date-range hubwoo-ocs-input-change', - 'custom_attributes' => array( - 'data-keytype' => esc_html__( 'from-date', 'makewebbetter-hubspot-for-woocommerce' ), - ), - ); - $settings[] = array( - 'title' => esc_html__( 'Users registered upto date', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_users_upto_date', - 'type' => 'text', - 'default' => gmdate( 'd-m-Y' ), - 'placeholder' => esc_html__( 'dd-mm-yyyy', 'makewebbetter-hubspot-for-woocommerce' ), - 'desc' => esc_html__( 'Upto which date you want to sync the users, select that date', 'makewebbetter-hubspot-for-woocommerce' ), - 'desc_tip' => true, - 'class' => 'date-picker hubwoo-date-range hubwoo-ocs-input-change', - 'custom_attributes' => array( - 'data-keytype' => esc_html__( 'upto-date', 'makewebbetter-hubspot-for-woocommerce' ), - ), - ); - $settings[] = array( - 'type' => 'sectionend', - 'id' => 'hubwoo_customers_settings_end', - ); - return $settings; - } - - /** - * Get all WordPress user roles in formatted way - * - * @return array $existing_user_roles user roles in an array. - * @since 1.0.0 - */ - public static function get_all_user_roles() { - - $existing_user_roles = array(); - - global $wp_roles; - - $user_roles = ! empty( $wp_roles->role_names ) ? $wp_roles->role_names : array(); - - if ( is_array( $user_roles ) && count( $user_roles ) ) { - - foreach ( $user_roles as $role => $role_info ) { - - $role_label = ! empty( $role_info ) ? $role_info : $role; - - $existing_user_roles[ $role ] = $role_label; - } - $existing_user_roles['guest_user'] = 'Guest User'; - } - - return $existing_user_roles; - } - - /** - * Check if the user has cart as abandoned. - * - * @param array $properties array of contact properties. - * @return bool $flag true/false. - * @since 1.0.0 - */ - public static function hubwoo_check_for_cart( $properties ) { - - $flag = false; - - if ( ! empty( $properties ) && is_array( $properties ) ) { - $key = array_search( 'current_abandoned_cart', array_column( $properties, 'property' ) ); - if ( false !== $key ) { - $value = $properties[ $key ]['value']; - $flag = 'yes' === $value ? true : false; - } - } - - return $flag; - } - - - /** - * Check if the key in properties contains specific values - * - * @since 1.0.0 - * @param string $key key name to compare. - * @param string $value value of the property to check. - * @param array $properties array of contact properties. - * @return bool $flag true/false. - */ - public static function hubwoo_check_for_properties( $key, $value, $properties ) { - $flag = false; - - if ( is_array( $properties ) ) { - - $prop_index = array_search( $key, array_column( $properties, 'property' ) ); - - if ( array_key_exists( $prop_index, $properties ) ) { - $property_value = $properties[ $prop_index ]['value']; - $flag = $property_value == $value ? true : false; - } - } - - return $flag; - } - - /** - * Unset the workflow/ROI properties to avoid update on data sync. - * - * @since 1.0.0 - * @param array $properties contact properties data. - */ - public function hubwoo_reset_workflow_properties( $properties ) { - - $workflow_properties = HubWooContactProperties::get_instance()->_get( 'properties', 'roi_tracking' ); - if ( is_array( $workflow_properties ) && count( $workflow_properties ) ) { - foreach ( $workflow_properties as $single_property ) { - $group_name = isset( $single_property['name'] ) ? $single_property['name'] : ''; - if ( ! empty( $group_name ) ) { - if ( 'customer_new_order' !== $group_name ) { - $properties = self::hubwoo_unset_property( $properties, $group_name ); - } - } - } - } - return $properties; - } - - /** - * Unset the key from array of properties. - * - * @since 1.0.0 - * @param array $properties contact properties data. - * @param array $key key to unset. - */ - public static function hubwoo_unset_property( $properties, $key ) { - - if ( ! empty( $properties ) && ! empty( $key ) ) { - if ( array_key_exists( $key, $properties ) ) { - unset( $properties[ $key ] ); - } - } - return $properties; - } - - /** - * Getting next execution for realtime cron, priorities task for old users. - * - * @since 1.0.0 - */ - public function hubwoo_cron_notification() { - - if ( 'yes' == get_option( 'hubwoo-cron-notice-dismiss', 'no' ) ) { - return; - } - - ?> - - -
-
-

- -

-
- - -
-
-
- - - - - -
-
-

- - -

-
-
- - - - hello -
-
-

- -

-
- - -
-
-
- get_customer_id(); - - if ( 0 !== $user_id && 0 < $user_id ) { - - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'yes' ); - } else { - - if ( 'yes' === get_option( 'hubwoo_pro_guest_sync_enable', 'yes' ) ) { - $order->update_meta_data('hubwoo_pro_guest_order', 'yes'); - } - } - $order->save(); - } - } - - /** - * Updating users list to be updated on hubspot when admin changes the role forcefully. - * - * @since 1.0.0 - * @param int $user_id user id. - */ - public function hubwoo_add_user_toupdate( $user_id ) { - - if ( ! empty( $user_id ) ) { - - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'yes' ); - } - } - - /** - * New active groups for subscriptions. - * - * @since 1.0.0 - * @param array $values list of pre-defined groups. - */ - public function hubwoo_subs_groups( $values ) { - - $values[] = array( - 'name' => 'subscriptions_details', - 'label' => __( 'Subscriptions Details', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - return $values; - } - - /** - * New active groups for subscriptions - * - * @since 1.0.0 - * @param array $active_groups list of active groups. - */ - public function hubwoo_active_subs_groups( $active_groups ) { - - $active_groups[] = 'subscriptions_details'; - - return $active_groups; - } - - /** - * Realtime sync for HubSpot CRM. - * - * @since 1.0.0 - */ - public function hubwoo_cron_schedule() { - - if ( 'yes' != get_option( 'hubwoo_greeting_displayed_setup', 'no' ) ) { - return; - } - - $contacts = array(); - - $args['meta_query'] = array( - 'relation' => 'AND', - array( - 'key' => 'hubwoo_pro_user_data_change', - 'value' => 'yes', - 'compare' => '==', - ), - array( - 'key' => 'hubwoo_invalid_contact', - 'compare' => 'NOT EXISTS', - ), - ); - - $args['role__in'] = get_option( 'hubwoo-selected-user-roles', array() ); - - $args['number'] = 5; - - $args['fields'] = 'ID'; - - $hubwoo_updated_user = get_users( $args ); - $hubwoo_unique_users = apply_filters( 'hubwoo_users', $hubwoo_updated_user ); - if ( ! empty( $hubwoo_unique_users ) ) { - $hubwoo_unique_users = array_unique( $hubwoo_unique_users ); - $contacts = HubwooDataSync::get_sync_data( $hubwoo_unique_users ); - } - - if ( ! empty( $contacts ) ) { - - $flag = true; - - if ( Hubwoo::is_access_token_expired() ) { - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - unset( $args ); - $args['ids'] = $hubwoo_unique_users; - $args['type'] = 'user'; - $response = HubWooConnectionMananager::get_instance()->create_or_update_contacts( $contacts, $args ); - if ( ( count( $contacts ) ) && 400 == $response['status_code'] ) { - Hubwoo::hubwoo_handle_contact_sync( $response, $contacts, $args ); - } - } - } - unset( $hubwoo_unique_users ); - unset( $contacts ); - unset( $args ); - - $contacts = array(); - //hpos changes - if( Hubwoo::hubwoo_check_hpos_active() ) { - $query = new WC_Order_Query(array( - 'posts_per_page' => 5, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'orderby' => 'date', - 'order' => 'desc', - 'return' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'post_parent' => 0, - 'customer_id' => 0, - 'meta_query' => array( - 'relation' => 'AND', - array( - 'key' => 'hubwoo_pro_guest_order', - 'compare' => '==', - 'value' => 'yes', - ), - array( - 'key' => 'hubwoo_invalid_contact', - 'compare' => 'NOT EXISTS', - ), - ) - )); - - $hubwoo_orders = $query->get_orders(); - } else { - - $query = new WP_Query(); - - $hubwoo_orders = $query->query( - array( - 'post_type' => 'shop_order', - 'posts_per_page' => 5, - 'post_status' => 'any', - 'orderby' => 'date', - 'order' => 'desc', - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'meta_query' => array( - 'relation' => 'AND', - array( - 'key' => 'hubwoo_pro_guest_order', - 'compare' => '==', - 'value' => 'yes', - ), - array( - 'key' => 'hubwoo_invalid_contact', - 'compare' => 'NOT EXISTS', - ), - ), - ) - ); - } - - $hubwoo_orders = apply_filters( 'hubwoo_guest_orders', $hubwoo_orders ); - - if ( ! empty( $hubwoo_orders ) ) { - $guest_contacts = HubwooDataSync::get_guest_sync_data( $hubwoo_orders ); - - $args['type'] = 'order'; - $args['ids'] = $hubwoo_orders; - - $response = HubWooConnectionMananager::get_instance()->create_or_update_contacts( $guest_contacts, $args ); - - if ( ( count( $guest_contacts ) ) && 400 == $response['status_code'] ) { - Hubwoo::hubwoo_handle_contact_sync( $response, $guest_contacts, $args ); - } - } - - $hubwoo_guest_cart = get_option( 'mwb_hubwoo_guest_user_cart', array() ); - - $guest_abandoned_carts = array(); - - if ( ! empty( $hubwoo_guest_cart ) ) { - foreach ( $hubwoo_guest_cart as $key => &$single_cart ) { - - if ( ! empty( $single_cart['email'] ) ) { - if ( ! empty( $single_cart['sent'] ) && 'yes' == $single_cart['sent'] ) { - if ( empty( $single_cart['cartData'] ) || empty( $single_cart['cartData']['cart'] ) ) { - unset( $hubwoo_guest_cart[ $key ] ); - } - continue; - } - $guest_user_properties = apply_filters( 'hubwoo_pro_track_guest_cart', $single_cart['email'], array() ); - - if ( self::hubwoo_check_for_cart( $guest_user_properties ) ) { - - $single_cart['sent'] = 'yes'; - } elseif ( ! self::hubwoo_check_for_cart( $guest_user_properties ) && self::hubwoo_check_for_cart_contents( $guest_user_properties ) ) { - - $single_cart['sent'] = 'yes'; - } - - if ( ! empty( $guest_user_properties ) ) { - $guest_abandoned_carts[] = array( - 'email' => $single_cart['email'], - 'properties' => $guest_user_properties, - ); - } - } else { - unset( $hubwoo_guest_cart[ $key ] ); - } - } - - update_option( 'mwb_hubwoo_guest_user_cart', $hubwoo_guest_cart ); - } - if ( count( $guest_abandoned_carts ) ) { - - $chunked_array = array_chunk( $guest_abandoned_carts, 50, false ); - - if ( ! empty( $chunked_array ) ) { - - foreach ( $chunked_array as $single_chunk ) { - $response = HubWooConnectionMananager::get_instance()->create_or_update_contacts( $single_chunk ); - if ( ( count( $single_chunk ) ) && 400 == $response['status_code'] ) { - Hubwoo::hubwoo_handle_contact_sync( $response, $single_chunk ); - } - } - } - } - } - - /** - * Check if the user has empty cart. - * - * @since 1.0.0 - * @param array $properties list of properties. - */ - public static function hubwoo_check_for_cart_contents( $properties ) { - - $flag = false; - - if ( ! empty( $properties ) ) { - - foreach ( $properties as $single_record ) { - - if ( ! empty( $single_record['property'] ) ) { - - if ( 'abandoned_cart_products' == $single_record['property'] ) { - - if ( empty( $single_record['value'] ) ) { - - $flag = true; - break; - } - } - } - } - } - - return $flag; - } - - /** - * Split contact batch on failure. - * - * @since 1.0.0 - * @param array $contacts array of contacts for batch upload. - */ - public static function hubwoo_split_contact_batch( $contacts ) { - - $contacts_chunk = array_chunk( $contacts, ceil( count( $contacts ) / 2 ) ); - - $response_chunk = array(); - - if ( isset( $contacts_chunk[0] ) ) { - - $response_chunk = HubWooConnectionMananager::get_instance()->create_or_update_contacts( $contacts_chunk[0] ); - if ( isset( $response_chunk['status_code'] ) && 400 == $response_chunk['status_code'] ) { - - $response_chunk = self::hubwoo_single_contact_upload( $contacts_chunk[0] ); - } - } - if ( isset( $contacts_chunk[1] ) ) { - - $response_chunk = HubWooConnectionMananager::get_instance()->create_or_update_contacts( $contacts_chunk[1] ); - if ( isset( $response_chunk['status_code'] ) && 400 == $response_chunk['status_code'] ) { - - $response_chunk = self::hubwoo_single_contact_upload( $contacts_chunk[1] ); - } - } - - return $response_chunk; - } - - /** - * Fallback for single contact. - * - * @since 1.0.0 - * @param array $contacts array of contacts for batch upload. - */ - public static function hubwoo_single_contact_upload( $contacts ) { - - if ( ! empty( $contacts ) ) { - - foreach ( $contacts as $single_contact ) { - - $response = HubWooConnectionMananager::get_instance()->create_or_update_contacts( array( $single_contact ) ); - } - } - - return $response; - } - - - /** - * Populating Orders column that has been synced as deal. - * - * @since 1.0.0 - * @param array $column Array of available columns. - * @param int $post_id Current Order post id. - */ - public function hubwoo_order_cols_value( $column, $post_id ) { - - $deal_id = get_post_meta( $post_id, 'hubwoo_ecomm_deal_id', true ); - $portal_id = get_option( 'hubwoo_pro_hubspot_id', '' ); - $user_id = get_post_meta( $post_id, '_customer_user', true ); - $user_vid = $user_id > 0 ? get_user_meta( $user_id, 'hubwoo_user_vid', true ) : get_post_meta( $post_id, 'hubwoo_user_vid', true ); - - if ( get_option( 'hubwoo_background_process_running', false ) || get_option( 'hubwoo_contact_vid_update', 0 ) ) { - $contact_tip = 'Contacts are being synced'; - $contact_status = 'yes'; - } else { - $contact_tip = 'Sync Contacts'; - $contact_status = 'no'; - } - - if ( 1 == get_option( 'hubwoo_deals_sync_running', 0 ) ) { - $deal_tip = 'Deals are being synced'; - $deal_status = 'yes'; - } else { - $deal_tip = 'Sync Deals'; - $deal_status = 'no'; - } - - switch ( $column ) { - - case 'hubwoo-deal-sync': - ?> -

- - - - - - - - - -

- esc_html__( 'Abandoned Cart Settings', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_abncart_settings_title', - 'type' => 'title', - 'class' => 'hubwoo-abncart-settings-title', - ); - $settings[] = array( - 'title' => esc_html__( 'Enable/Disable', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_abncart_enable_addon', - 'desc' => esc_html__( 'Track Abandoned Carts', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'checkbox', - 'default' => 'yes', - ); - - $settings[] = array( - 'title' => esc_html__( 'Guest Users ', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_abncart_guest_cart', - 'desc' => esc_html__( 'Track Guest Abandoned Carts', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'checkbox', - 'default' => 'yes', - ); - - $settings[] = array( - 'title' => esc_html__( 'Delete Old Data ', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_abncart_delete_old_data', - 'desc' => esc_html__( 'Delete Abandoned Carts Data', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'checkbox', - 'default' => 'yes', - ); - - $settings[] = array( - 'title' => esc_html__( 'Delete Data Timer( Days )', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_abncart_delete_after', - 'type' => 'number', - 'desc' => esc_html__( 'Delete Abandoned cart data form woocommerce store.', 'makewebbetter-hubspot-for-woocommerce' ), - 'desc_tip' => true, - 'custom_attributes' => array( 'min' => '7' ), - 'default' => '30', - ); - - $settings[] = array( - 'title' => esc_html__( 'Cart Timer( Minutes )', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_abncart_timing', - 'type' => 'number', - 'desc' => esc_html__( 'Set the timer for abandoned cart. Customers abandoned cart data will be updated over HubSpot after the specified timer. Minimum value is 5 minutes.', 'makewebbetter-hubspot-for-woocommerce' ), - 'desc_tip' => true, - 'custom_attributes' => array( 'min' => '5' ), - 'default' => '5', - ); - $settings[] = array( - 'type' => 'sectionend', - 'id' => 'hubwoo_abncart_settings_end', - ); - - return apply_filters( 'hubwoo_abn_cart_settings', $settings ); - } - - /** - * Updating customer properties for abandoned cart on HubSpot. - * - * @since 1.0.0 - * @param array $properties list of contact properties. - * @param int $contact_id user ID. - */ - public function hubwoo_abncart_contact_properties( $properties, $contact_id ) { - - $cart_product_skus = array(); - $cart_categories = array(); - $cart_products = array(); - $in_cart_products = array(); - $abncart_properties = array(); - $abncart_properties['current_abandoned_cart'] = 'no'; - $abncart_properties['abandoned_cart_date'] = ''; - $abncart_properties['abandoned_cart_counter'] = 0; - $abncart_properties['abandoned_cart_url'] = ''; - $abncart_properties['abandoned_cart_products_skus'] = ''; - $abncart_properties['abandoned_cart_products_categories'] = ''; - $abncart_properties['abandoned_cart_products'] = ''; - $abncart_properties['abandoned_cart_tax_value'] = 0; - $abncart_properties['abandoned_cart_subtotal'] = 0; - $abncart_properties['abandoned_cart_total_value'] = 0; - $abncart_properties['abandoned_cart_products_html'] = ''; - - $hubwoo_abncart_timer = get_option( 'hubwoo_abncart_timing', 5 ); - $customer_cart = get_user_meta( $contact_id, '_woocommerce_persistent_cart_' . get_current_blog_id(), true ); - $last_time = get_user_meta( $contact_id, 'hubwoo_pro_last_addtocart', true ); - - if ( isset( $customer_cart['cart'] ) && ! empty( $last_time ) ) { - - if ( count( $customer_cart['cart'] ) ) { - - $current_time = time(); - - $time_diff = round( abs( $current_time - $last_time ) / 60, 2 ); - - $hubwoo_abncart_timer = (int) $hubwoo_abncart_timer; - - if ( $time_diff <= $hubwoo_abncart_timer ) { - return $properties; - } - $last_date = (int) $last_time; - $last_date = HubwooGuestOrdersManager::hubwoo_set_utc_midnight( $last_date ); - $abncart_properties['abandoned_cart_date'] = $last_date; - $locale = get_user_meta( $contact_id, 'hubwoo_pro_cart_locale', true ); - $locale = ! empty( $locale ) ? $locale : get_locale(); - $cart_url = apply_filters( 'wpml_permalink', wc_get_cart_url(), $locale, true ); - - $abncart_properties['current_abandoned_cart'] = 'yes'; - - $cart_products = self::hubwoo_return_abncart_values( $customer_cart['cart'] ); - - if ( count( $cart_products ) ) { - - $abncart_properties['abandoned_cart_products_html'] = self::hubwoo_abncart_product_html( $cart_products ); - } - $cart_url .= '?hubwoo-abncart-retrieve='; - $cart_prod = array(); - foreach ( $customer_cart['cart'] as $single_cart_item ) { - - $item_id = $single_cart_item['product_id']; - $parent_item_sku = get_post_meta( $item_id, '_sku', true ); - if ( ! empty( $single_cart_item['variation_id'] ) ) { - $item_id = $single_cart_item['variation_id']; - } - - $qty = $single_cart_item['quantity'] ? $single_cart_item['quantity'] : 1; - $cart_prod[] = $item_id . ':' . $qty; - if ( get_post_status( $item_id ) == 'trash' || get_post_status( $item_id ) == false ) { - - continue; - } - - $cart_item_sku = get_post_meta( $item_id, '_sku', true ); - - if ( empty( $cart_item_sku ) ) { - $cart_item_sku = $parent_item_sku; - } - - if ( empty( $cart_item_sku ) ) { - $cart_item_sku = $item_id; - } - - $cart_product_skus[] = $cart_item_sku; - - $product_cats_ids = wc_get_product_term_ids( $item_id, 'product_cat' ); - - if ( is_array( $product_cats_ids ) && count( $product_cats_ids ) ) { - - foreach ( $product_cats_ids as $cat_id ) { - - $term = get_term_by( 'id', $cat_id, 'product_cat' ); - $cart_categories[] = $term->slug; - } - } - - $post = get_post( $item_id ); - $post_name = isset( $post->post_name ) ? $post->post_name : ''; - $product_name = $post_name . '-' . $item_id; - $in_cart_products[] = $product_name; - $abncart_properties['abandoned_cart_counter']++; - if ( array_key_exists( 'line_total', $single_cart_item ) ) { - $abncart_properties['abandoned_cart_subtotal'] += $single_cart_item['line_total']; - } else { - $product_obj = wc_get_product( $item_id ); - $abncart_properties['abandoned_cart_subtotal'] += $product_obj->get_price() * $single_cart_item['quantity']; - } - - $abncart_properties['abandoned_cart_tax_value'] += isset( $single_cart_item['line_tax'] ) ? $single_cart_item['line_tax'] : 0; - } - - $cart_url .= implode( ',', $cart_prod ); - - $abncart_properties['abandoned_cart_url'] = $cart_url; - $abncart_properties['abandoned_cart_products_skus'] = HubwooGuestOrdersManager::hubwoo_format_array( $cart_product_skus ); - $abncart_properties['abandoned_cart_products_categories'] = HubwooGuestOrdersManager::hubwoo_format_array( $cart_categories ); - $abncart_properties['abandoned_cart_products'] = HubwooGuestOrdersManager::hubwoo_format_array( $in_cart_products ); - - if ( ! empty( $abncart_properties['abandoned_cart_subtotal'] ) || ! empty( $abncart_properties['abandoned_cart_tax_value'] ) ) { - - $abncart_properties['abandoned_cart_total_value'] = floatval( $abncart_properties['abandoned_cart_subtotal'] + $abncart_properties['abandoned_cart_tax_value'] ); - } - } else { - - delete_user_meta( $contact_id, 'hubwoo_pro_user_left_cart' ); - delete_user_meta( $contact_id, 'hubwoo_pro_last_addtocart' ); - delete_user_meta( $contact_id, 'hubwoo_pro_cart_locale' ); - delete_user_meta( $contact_id, 'hubwoo_pro_user_cart_sent' ); - } - } else { - - delete_user_meta( $contact_id, 'hubwoo_pro_user_left_cart' ); - delete_user_meta( $contact_id, 'hubwoo_pro_last_addtocart' ); - delete_user_meta( $contact_id, 'hubwoo_pro_cart_locale' ); - delete_user_meta( $contact_id, 'hubwoo_pro_user_cart_sent' ); - } - - $abandoned_property_updated = get_option( 'hubwoo_abandoned_property_update', 'no' ); - - if ( ! empty( $abandoned_property_updated ) && 'yes' == $abandoned_property_updated ) { - if ( 'yes' == $abncart_properties['current_abandoned_cart'] ) { - $abncart_properties['current_abandoned_cart'] = true; - } else { - $abncart_properties['current_abandoned_cart'] = false; - } - } - - foreach ( $abncart_properties as $property_name => $property_value ) { - if ( isset( $property_value ) ) { - $properties[] = array( - 'property' => $property_name, - 'value' => $property_value, - ); - } - } - return $properties; - } - - /** - * Preparing few parameters value for abandoned cart details. - * - * @since 1.0.0 - * @param array $customer_cart cart contents. - */ - public static function hubwoo_return_abncart_values( $customer_cart ) { - - $key = 0; - - $cart_products = array(); - - $cart_total = 0; - $cart_counter = 0; - - if ( ! empty( $customer_cart ) ) { - - foreach ( $customer_cart as $single_cart_item ) { - - $item_id = $single_cart_item['product_id']; - $parent_item_img = wp_get_attachment_image_src( get_post_thumbnail_id( $item_id ), 'single-post-thumbnail' ); - $item_img = ''; - if ( ! empty( $single_cart_item['variation_id'] ) ) { - $item_id = $single_cart_item['variation_id']; - $item_img = wp_get_attachment_image_src( get_post_thumbnail_id( $item_id ), 'single-post-thumbnail' ); - } - if ( get_post_status( $item_id ) == 'trash' || get_post_status( $item_id ) == false ) { - - continue; - } - if ( empty( $item_img ) ) { - $item_img = $parent_item_img; - } - $product = wc_get_product( $item_id ); - if ( $product instanceof WC_Product ) { - $cart_products[ $key ]['image'] = $item_img; - $cart_products[ $key ]['name'] = $product->get_name(); - $cart_products[ $key ]['url'] = get_permalink( $item_id ); - $cart_products[ $key ]['price'] = $product->get_price(); - $cart_products[ $key ]['qty'] = $single_cart_item['quantity']; - $cart_products[ $key ]['item_id'] = $item_id; - if ( array_key_exists( 'line_total', $single_cart_item ) ) { - $cart_products[ $key ]['total'] = floatval( $single_cart_item['line_total'] + $single_cart_item['line_tax'] ); - } else { - $product_obj = wc_get_product( $item_id ); - $cart_products[ $key ]['total'] = $product_obj->get_price() * $single_cart_item['quantity']; - } - $key++; - } - } - } - - return $cart_products; - } - - /** - * Preparing cart HTML with products data. - * - * @since 1.0.0 - * @param array $cart_products values for products to be used in html. - */ - public static function hubwoo_abncart_product_html( $cart_products ) { - - $products_html = '

'; - foreach ( $cart_products as $single_product ) { - $products_html .= ''; - } - $products_html .= '
' . __( 'Image', 'makewebbetter-hubspot-for-woocommerce' ) . '' . __( 'Item', 'makewebbetter-hubspot-for-woocommerce' ) . '' . __( 'Qty', 'makewebbetter-hubspot-for-woocommerce' ) . '' . __( 'Cost', 'makewebbetter-hubspot-for-woocommerce' ) . '' . __( 'Total', 'makewebbetter-hubspot-for-woocommerce' ) . '
' . $single_product['name'] . '' . $single_product['qty'] . '' . wc_price( $single_product['price'], array( 'currency' => get_option( 'woocommerce_currency' ) ) ) . '' . wc_price( $single_product['total'], array( 'currency' => get_option( 'woocommerce_currency' ) ) ) . '

'; - - return apply_filters( 'hubwoo_abandoned_cart_html', $products_html, $cart_products ); - } - - /** - * Preparing guest user data for HubSpot. - * - * @since 1.0.0 - * @param string $email user email. - * @param array $properties list of properties. - */ - public function hubwoo_abncart_process_guest_data( $email, $properties = array() ) { - - if ( ! empty( $email ) ) { - $cart_product_skus = array(); - $cart_product_qty = 0; - $cart_subtotal = 0; - $cart_total = 0; - $cart_tax = 0; - $last_date = ''; - $cart_url = ''; - $cart_status = 'no'; - $cart_categories = array(); - $cart_products = array(); - $hubwoo_abncart_timer = get_option( 'hubwoo_abncart_timing', 5 ); - $products_html = ''; - $in_cart_products = array(); - $flag = false; - - $existing_guest_users = get_option( 'mwb_hubwoo_guest_user_cart', array() ); - - if ( ! empty( $existing_guest_users ) ) { - - foreach ( $existing_guest_users as $key => &$single_cart_data ) { - - $flag = false; - - if ( isset( $single_cart_data['email'] ) && $email == $single_cart_data['email'] ) { - - $last_time = ! empty( $single_cart_data['timeStamp'] ) ? $single_cart_data['timeStamp'] : ''; - $current_time = time(); - $time_diff = round( abs( $current_time - $last_time ) / 60, 2 ); - $hubwoo_abncart_timer = (int) $hubwoo_abncart_timer; - $flag = true; - - $cart_data = ! empty( $single_cart_data['cartData']['cart'] ) ? $single_cart_data['cartData']['cart'] : array(); - - if ( count( $cart_data ) ) { - - $cart_products = self::hubwoo_return_abncart_values( $cart_data ); - } - - if ( count( $cart_products ) ) { - - $products_html = self::hubwoo_abncart_product_html( $cart_products ); - } - if ( ! empty( $cart_data ) ) { - $cart_status = 'yes'; - - $last_date = $last_time; - - $locale = ! empty( $single_cart_data['locale'] ) ? $single_cart_data['locale'] : get_locale(); - $cart_url = apply_filters( 'wpml_permalink', wc_get_cart_url(), $locale, true ); - - $cart_url .= '?hubwoo-abncart-retrieve='; - $cart_prod = array(); - - foreach ( $cart_data as $single_cart_item ) { - $item_id = $single_cart_item['product_id']; - $parent_item_sku = get_post_meta( $item_id, '_sku', true ); - if ( ! empty( $single_cart_item['variation_id'] ) ) { - $item_id = $single_cart_item['variation_id']; - } - - $qty = $single_cart_item['quantity'] ? $single_cart_item['quantity'] : 1; - $cart_prod[] = $item_id . ':' . $qty; - if ( get_post_status( $item_id ) == 'trash' || get_post_status( $item_id ) == false ) { - - continue; - } - - $cart_item_sku = get_post_meta( $item_id, '_sku', true ); - - if ( empty( $cart_item_sku ) ) { - - $cart_item_sku = $parent_item_sku; - } - - if ( empty( $cart_item_sku ) ) { - - $cart_item_sku = $item_id; - } - - $cart_product_skus[] = $cart_item_sku; - - $product_cats_ids = wc_get_product_term_ids( $item_id, 'product_cat' ); - - if ( is_array( $product_cats_ids ) && count( $product_cats_ids ) ) { - - foreach ( $product_cats_ids as $cat_id ) { - - $term = get_term_by( 'id', $cat_id, 'product_cat' ); - $cart_categories[] = $term->slug; - } - } - - $post = get_post( $item_id ); - $post_name = isset( $post->post_name ) ? $post->post_name : ''; - $product_name = $post_name . '-' . $item_id; - $in_cart_products[] = $product_name; - $cart_product_qty += $single_cart_item['quantity']; - $cart_subtotal += $single_cart_item['line_total']; - $cart_tax += $single_cart_item['line_tax']; - } - $cart_url .= implode( ',', $cart_prod ); - - } else { - - $this->hubwoo_abncart_clear_data( $email ); - } - - if ( $time_diff <= $hubwoo_abncart_timer ) { - if ( count( $cart_data ) ) { - $flag = false; - break; - } else { - $flag = true; - break; - } - } - break; - } - } - } - - $cart_product_skus = HubwooGuestOrdersManager::hubwoo_format_array( $cart_product_skus ); - $in_cart_products = HubwooGuestOrdersManager::hubwoo_format_array( $in_cart_products ); - $cart_categories = HubwooGuestOrdersManager::hubwoo_format_array( $cart_categories ); - $cart_total = floatval( $cart_tax + $cart_subtotal ); - - if ( $flag ) { - if ( ! empty( $last_date ) ) { - - $last_date = (int) $last_date; - $properties[] = array( - 'property' => 'abandoned_cart_date', - 'value' => HubwooGuestOrdersManager::hubwoo_set_utc_midnight( $last_date ), - ); - } else { - $properties[] = array( - 'property' => 'abandoned_cart_date', - 'value' => '', - ); - } - - $abandoned_property_updated = get_option( 'hubwoo_abandoned_property_update', 'no' ); - - if ( ! empty( $abandoned_property_updated ) && 'yes' == $abandoned_property_updated ) { - if ( 'yes' == $cart_status ) { - $cart_status = true; - } else { - $cart_status = false; - } - } - - $properties[] = array( - 'property' => 'current_abandoned_cart', - 'value' => $cart_status, - ); - $properties[] = array( - 'property' => 'abandoned_cart_counter', - 'value' => $cart_product_qty, - ); - $properties[] = array( - 'property' => 'abandoned_cart_url', - 'value' => $cart_url, - ); - $properties[] = array( - 'property' => 'abandoned_cart_products_skus', - 'value' => $cart_product_skus, - ); - $properties[] = array( - 'property' => 'abandoned_cart_products_categories', - 'value' => $cart_categories, - ); - $properties[] = array( - 'property' => 'abandoned_cart_products', - 'value' => $in_cart_products, - ); - $properties[] = array( - 'property' => 'abandoned_cart_tax_value', - 'value' => $cart_tax, - ); - $properties[] = array( - 'property' => 'abandoned_cart_subtotal', - 'value' => $cart_subtotal, - ); - $properties[] = array( - 'property' => 'abandoned_cart_total_value', - 'value' => $cart_total, - ); - $properties[] = array( - 'property' => 'abandoned_cart_products_html', - 'value' => $products_html, - ); - } - return $properties; - } - } - - /** - * Clear data for email whose cart has been found empty. - * - * @since 1.0.0 - * @param string $email contact email. - */ - public function hubwoo_abncart_clear_data( $email ) { - - $existing_guest_users = get_option( 'mwb_hubwoo_guest_user_cart', array() ); - - if ( ! empty( $existing_guest_users ) ) { - - foreach ( $existing_guest_users as $key => &$single_cart_data ) { - - if ( isset( $single_cart_data['email'] ) && $email == $single_cart_data['email'] ) { - - unset( $existing_guest_users[ $key ] ); - break; - } - } - } - - $existing_guest_users = array_values( $existing_guest_users ); - update_option( 'mwb_hubwoo_guest_user_cart', $existing_guest_users ); - } - - /** - * Clear those abandoned carts who have elapsed the saved timer. - * - * @since 1.0.0 - */ - public function huwoo_abncart_clear_old_cart() { - - if ( get_option( 'hubwoo_abncart_delete_old_data', 'yes' ) == 'yes' ) { - $saved_carts = get_option( 'mwb_hubwoo_guest_user_cart', array() ); - - $hubwoo_abncart_delete_after = (int) get_option( 'hubwoo_abncart_delete_after', '30' ); - - $hubwoo_abncart_delete_after = $hubwoo_abncart_delete_after * ( 24 * 60 * 60 ); - - // process the guest cart data. - if ( ! empty( $hubwoo_abncart_delete_after ) ) { - - if ( ! empty( $saved_carts ) ) { - - foreach ( $saved_carts as $key => &$single_cart ) { - - $cart_time = ! empty( $single_cart['timeStamp'] ) ? $single_cart['timeStamp'] : ''; - - if ( ! empty( $cart_time ) ) { - - $time = time(); - - if ( $time > $cart_time && ( $time - $cart_time ) >= $hubwoo_abncart_delete_after ) { - - unset($saved_carts[$key]); - } - } - } - } - } - - update_option( 'mwb_hubwoo_guest_user_cart', $saved_carts ); - - // process the clearing of meta for registered users but don't clear their cart. - $args['meta_query'] = array( - - array( - 'key' => 'hubwoo_pro_user_left_cart', - 'value' => 'yes', - 'compare' => '==', - ), - ); - - $users = wp_list_pluck( get_users( $args ), 'ID' ); - - if ( ! empty( $users ) ) { - foreach ( $users as $user_id ) { - $cart_time = get_user_meta( $user_id, 'hubwoo_pro_last_addtocart', true ); - if ( ! empty( $cart_time ) ) { - $time = time(); - if ( $time > $cart_time && ( $time - $cart_time ) >= $hubwoo_abncart_delete_after ) { - delete_user_meta( $user_id, 'hubwoo_pro_last_addtocart' ); - delete_user_meta( $user_id, 'hubwoo_pro_user_left_cart' ); - delete_user_meta( $user_id, 'hubwoo_pro_cart_locale' ); - } - } - } - } - } - } - - /** - * Fetching the customers who have abandoned cart. - * - * @since 1.0.0 - * @param array $hubwoo_users list of users ready to be synced on hubspot. - */ - public function hubwoo_abncart_users( $hubwoo_users ) { - - $args['meta_query'] = array( - 'relation' => 'AND', - array( - 'key' => 'hubwoo_pro_user_left_cart', - 'value' => 'yes', - 'compare' => '==', - ), - array( - 'relation' => 'OR', - array( - 'key' => 'hubwoo_pro_user_cart_sent', - 'compare' => 'NOT EXISTS', - ), - array( - 'key' => 'hubwoo_pro_user_cart_sent', - 'value' => 'no', - 'compare' => '==', - ), - ), - ); - $args['number'] = 25; - $args['fields'] = 'ID'; - $hubwoo_abandoned_cart_users = get_users( $args ); - $hubwoo_new_users = array(); - - if ( count( $hubwoo_abandoned_cart_users ) ) { - - $hubwoo_new_users = array_merge( $hubwoo_users, $hubwoo_abandoned_cart_users ); - } else { - - $hubwoo_new_users = $hubwoo_users; - } - - return $hubwoo_new_users; - } - /** - * Get user actions for marketing. - * - * @return array abandoned cart current status. - * @since 1.0.0 - */ - public static function get_abandoned_cart_status() { - - $cart_status = array(); - - $cart_status[] = array( - 'label' => __( 'Yes', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'yes', - ); - $cart_status[] = array( - 'label' => __( 'No', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'no', - ); - - $cart_status = apply_filters( 'hubwoo_customer_cart_statuses', $cart_status ); - - return $cart_status; - } - - /** - * Prepare params for generating plugin settings. - * - * @since 1.0.0 - * @return array $basic_settings array of html settings. - */ - public static function hubwoo_get_plugin_settings() { - - global $hubwoo; - - $existing_user_roles = self::get_all_user_roles(); - - $basic_settings = array(); - - $basic_settings[] = array( - 'title' => esc_html__( 'Plugin Settings', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_checkout_optin_title', - 'type' => 'title', - ); - - $basic_settings[] = array( - 'title' => esc_html__( 'Sync with User Role', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo-selected-user-roles', - 'class' => 'hubwoo-general-settings-fields', - 'type' => 'multiselect', - 'desc' => esc_html__( 'The users with selected roles will be synced on HubSpot. Default will be all user roles.', 'makewebbetter-hubspot-for-woocommerce' ), - 'options' => $existing_user_roles, - 'desc_tip' => true, - - ); - - if ( Hubwoo::hubwoo_subs_active() ) { - $basic_settings[] = array( - 'title' => esc_html__( 'WooCommerce Subscription', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_subs_settings_enable', - 'class' => 'hubwoo-general-settings-fields', - 'desc' => esc_html__( 'Enable subscriptions data sync', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'checkbox', - 'default' => 'yes', - ); - } - - $basic_settings[] = array( - 'title' => esc_html__( 'Show Checkbox on Checkout Page', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_checkout_optin_enable', - 'class' => 'hubwoo-general-settings-fields', - 'desc' => esc_html__( 'Show Opt-In checkbox on Checkout Page', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'checkbox', - 'default' => 'no', - ); - - $basic_settings[] = array( - 'title' => esc_html__( 'Checkbox Label on Checkout Page', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_checkout_optin_label', - 'class' => 'hubwoo-general-settings-fields', - 'desc' => esc_html__( 'Label to show for the checkbox', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'text', - 'default' => esc_html__( 'Subscribe', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - $basic_settings[] = array( - 'title' => esc_html__( 'Show Checkbox on My Account Page', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_registeration_optin_enable', - 'class' => 'hubwoo-general-settings-fields', - 'desc' => esc_html__( 'Show Opt-In checkbox on My Account Page (Registration form)', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'checkbox', - 'default' => 'no', - ); - - $basic_settings[] = array( - 'title' => esc_html__( 'Checkbox Label on My Account Page', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_registeration_optin_label', - 'class' => 'hubwoo-general-settings-fields', - 'desc' => esc_html__( 'Label to show for the checkbox', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'text', - 'default' => esc_html__( 'Subscribe', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - $basic_settings[] = array( - 'title' => esc_html__( 'Calculate ROI for the Selected Status', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_no_status', - 'class' => 'hubwoo-general-settings-fields', - 'type' => 'select', - 'desc' => esc_html__( 'Select an order status from the dropdown for which the new order property will be set/changed on each sync. Default Order Status is Completed', 'makewebbetter-hubspot-for-woocommerce' ), - 'options' => wc_get_order_statuses(), - 'desc_tip' => true, - 'default' => 'wc-completed', - ); - - $basic_settings = apply_filters( 'hubwoo_general_settings_options', $basic_settings ); - - $basic_settings[] = array( - 'type' => 'sectionend', - 'id' => 'hubwoo_pro_settings_end', - ); - - return $basic_settings; - } - - /** - * Get products count. - * - * @since 1.0.0 - * @return int $counter count of woocommerce products. - */ - public static function hubwoo_get_all_products_count() { - $counter = 0; - - $query = new WP_Query(); - - $products = $query->query( - array( - 'post_type' => array( 'product', 'product_variation' ), - 'posts_per_page' => -1, - 'post_status' => array( 'publish' ), - 'orderby' => 'date', - 'order' => 'desc', - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - ) - ); - if ( ! empty( $products ) ) { - $counter = count( $products ); - } - return $counter; - } - - /** - * Get all users count. - * - * @since 1.0.0 - * @param string $constraint ( default = "NOT EXISTS" ). - * @return int $users count of all users - */ - public static function hubwoo_get_all_users_count( $constraint = 'NOT EXISTS' ) { - - global $hubwoo; - - $roles = get_option( 'hubwoo_customers_role_settings', array() ); - - if ( empty( $roles ) ) { - $roles = array_keys( $hubwoo->hubwoo_get_user_roles() ); - $key = array_search( 'guest_user', $roles ); - if ( false !== $key ) { - unset( $roles[ $key ] ); - } - } - - $args['role__in'] = $roles; - - $args['meta_query'] = array( - array( - 'key' => 'hubwoo_pro_user_data_change', - 'compare' => $constraint, - ), - ); - - $args['fields'] = 'ids'; - - return count( get_users( $args ) ); - } - - /** - * Background sync for Deals. - * - * @since 1.0.0 - * @param int $order_id order id. - */ - public function hubwoo_ecomm_deal_upsert( $order_id ) { - - if ( empty( $order_id ) ) { - return; - } - - HubwooObjectProperties::get_instance()->hubwoo_ecomm_deals_sync( $order_id ); - } - - /** - * Background sync for Deals. - * - * @since 1.0.0 - */ - public function hubwoo_ecomm_deal_update( ) { - - if ( 'no' == get_option( 'hubwoo_ecomm_setup_completed', 'no' ) || 'yes' === get_option( 'hubwoo_connection_issue', 'no' ) ) { - return; - } - - //hpos changes - if ( Hubwoo::hubwoo_check_hpos_active() ) { - - $query = new WC_Order_Query(array( - 'posts_per_page' => 3, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'orderby' => 'date', - 'order' => 'desc', - 'return' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'post_parent' => 0, - 'meta_query' => array( - array( - 'key' => 'hubwoo_ecomm_deal_upsert', - 'compare' => '==', - 'value' => 'yes', - ), - ), - )); - - $failed_orders = $query->get_orders(); - } else { - // CPT-based orders are in use. - $query = new WP_Query(); - - $args = array( - 'post_type' => 'shop_order', - 'posts_per_page' => 3, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'orderby' => 'date', - 'order' => 'desc', - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'meta_query' => array( - array( - 'key' => 'hubwoo_ecomm_deal_upsert', - 'compare' => '==', - 'value' => 'yes', - ), - ), - ); - - $failed_orders = $query->query( $args ); - } - - if ( ! empty( $failed_orders ) ) { - foreach ( $failed_orders as $order_id ) { - HubwooObjectProperties::get_instance()->hubwoo_ecomm_deals_sync( $order_id ); - } - } - - } - - /** - * Background sync for Deals. - * - * @since 1.0.0 - */ - public function hubwoo_deals_sync_background() { - - $orders_needs_syncing = self::hubwoo_orders_count_for_deal( 5, false ); - if ( is_array( $orders_needs_syncing ) && count( $orders_needs_syncing ) ) { - foreach ( $orders_needs_syncing as $order_id ) { - HubwooObjectProperties::get_instance()->hubwoo_ecomm_deals_sync( $order_id ); - } - } else { - Hubwoo::hubwoo_stop_sync( 'stop-deal' ); - } - } - - /** - * Background sync for Products. - * - * @since 1.0.0 - */ - public function hubwoo_products_sync_background() { - - if ( 'yes' != get_option( 'hubwoo_greeting_displayed_setup', 'no' ) || 'yes' == get_option( 'hubwoo_product_scope_needed', 'no' ) ) { - return; - } - - $product_data = Hubwoo::hubwoo_get_product_data( 10 ); - if ( ! empty( $product_data ) && is_array( $product_data ) ) { - - foreach ( $product_data as $pro_id => $value ) { - - $filtergps = array(); - $product_data = array( - 'properties' => $value['properties'], - ); - - $flag = true; - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - - $product = wc_get_product( $pro_id ); - - if( $product instanceof WC_Product ) { - - $filtergps = array( - 'filterGroups' => array( - array( - 'filters' => array( - array( - 'value' => $pro_id, - 'propertyName' => 'store_product_id', - 'operator' => 'EQ', - ), - ), - ), - ), - ); - - if( !empty($product->get_sku()) ) { - $filtergps['filterGroups'][] = array( - 'filters' => array( - array( - 'value' => $product->get_sku(), - 'propertyName' => 'hs_sku', - 'operator' => 'EQ', - ), - ), - ); - } - - $response = HubWooConnectionMananager::get_instance()->search_object_record( 'products', $filtergps ); - - if ( 200 == $response['status_code'] ) { - $responce_body = json_decode( $response['body'] ); - $result = $responce_body->results; - if ( ! empty( $result ) ) { - foreach ( $result as $key => $value ) { - update_post_meta( $pro_id, 'hubwoo_ecomm_pro_id', $value->id ); - } - } - } - - $pro_hs_id = get_post_meta( $pro_id, 'hubwoo_ecomm_pro_id', true ); - if ( ! empty( $pro_hs_id ) ) { - $response = HubWooConnectionMananager::get_instance()->update_object_record( 'products', $pro_hs_id, $product_data ); - if ( 200 == $response['status_code'] ) { - delete_post_meta( $pro_id, 'hubwoo_product_synced' ); - } - } else { - $response = HubWooConnectionMananager::get_instance()->create_object_record( 'products', $product_data ); - if ( 201 == $response['status_code'] ) { - $response_body = json_decode( $response['body'] ); - update_post_meta( $pro_id, 'hubwoo_ecomm_pro_id', $response_body->id ); - delete_post_meta( $pro_id, 'hubwoo_product_synced' ); - } - } - do_action( 'hubwoo_update_product_property', $pro_id ); - } - } - } - - if ( ! as_next_scheduled_action( 'hubwoo_products_status_background' ) ) { - as_schedule_recurring_action( time(), 180, 'hubwoo_products_status_background' ); - } - } - } - - /** - * Background sync status for Products. - * - * @since 1.0.0 - */ - public function hubwoo_products_status_background() { - - $products = Hubwoo::hubwoo_get_product_data( 10 ); - if ( empty( $products ) ) { - - $orders_needs_syncing = self::hubwoo_orders_count_for_deal(); - if ( $orders_needs_syncing ) { - - update_option( 'hubwoo_deals_sync_running', 1 ); - update_option( 'hubwoo_deals_sync_total', $orders_needs_syncing ); - if ( ! as_next_scheduled_action( 'hubwoo_deals_sync_background' ) ) { - as_schedule_recurring_action( time(), 300, 'hubwoo_deals_sync_background' ); - } - } - - Hubwoo::hubwoo_stop_sync( 'stop-product-sync' ); - } - } - - /** - * Updates the product whenever there is any change - * - * @since 1.0.0 - * @param int $post_ID post id of the product. - * @param object $post post object. - */ - public function hubwoo_ecomm_update_product( $post_ID, $post ) { - - if ( 'yes' != get_option( 'hubwoo_greeting_displayed_setup', 'no' ) || 'yes' == get_option( 'hubwoo_product_scope_needed', 'no' ) ) { - return; - } - - $post_type = $post->post_type; - if ( 'product' != $post_type ) { - return; - } - $updates = array(); - $hs_new = 'true'; - $object_type = 'PRODUCT'; - if ( is_ajax() ) { - return; - } - $post_status = get_post_status( $post_ID ); - if ( 'publish' == $post_status ) { - if ( ! empty( $post_ID ) ) { - $product = wc_get_product( $post_ID ); - $product_type = $product->get_type(); - if ( ! empty( $product_type ) && ( 'variable' == $product_type || 'variable-subscription' == $product_type ) ) { - $variation_args = array( - 'post_parent' => $post_ID, - 'post_type' => 'product_variation', - 'numberposts' => -1, - ); - $wc_products_array = get_posts( $variation_args ); - if ( is_array( $wc_products_array ) && count( $wc_products_array ) ) { - foreach ( $wc_products_array as $single_var_product ) { - $hubwoo_ecomm_product = new HubwooEcommObject( $single_var_product->ID, $object_type ); - $properties = $hubwoo_ecomm_product->get_object_properties(); - $properties = apply_filters( 'hubwoo_map_ecomm_' . $object_type . '_properties', $properties, $single_var_product->ID ); - $pro_hs_id = get_post_meta( $single_var_product->ID, 'hubwoo_ecomm_pro_id', true ); - $properties['description'] = $properties['pr_description']; - - unset( $properties['pr_description'] ); - if ( ! empty( $pro_hs_id ) ) { - $updates[] = array( - 'id' => $pro_hs_id, - 'properties' => $properties, - ); - $hs_new = 'false'; - } else { - $updates[] = array( - 'properties' => $properties, - ); - } - } - } - } else { - $hubwoo_ecomm_product = new HubwooEcommObject( $post_ID, $object_type ); - $properties = $hubwoo_ecomm_product->get_object_properties(); - $properties = apply_filters( 'hubwoo_map_ecomm_' . $object_type . '_properties', $properties, $post_ID ); - $pro_hs_id = get_post_meta( $post_ID, 'hubwoo_ecomm_pro_id', true ); - $properties['description'] = $properties['pr_description']; - - unset( $properties['pr_description'] ); - if ( ! empty( $pro_hs_id ) ) { - $updates[] = array( - 'id' => $pro_hs_id, - 'properties' => $properties, - ); - $hs_new = 'false'; - } else { - $updates[] = array( - 'properties' => $properties, - ); - } - } - } - } - if ( count( $updates ) ) { - $updates = array( - 'inputs' => $updates, - ); - - $flag = true; - - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - if ( 'true' == $hs_new ) { - $response = HubWooConnectionMananager::get_instance()->create_batch_object_record( 'products', $updates ); - - if ( 201 == $response['status_code'] ) { - $response = json_decode( $response['body'] ); - $result = $response->results; - foreach ( $result as $key => $value ) { - update_post_meta( $value->properties->store_product_id, 'hubwoo_ecomm_pro_id', $value->id ); - delete_post_meta( $value->properties->store_product_id, 'hubwoo_product_synced' ); - do_action( 'hubwoo_update_product_property', $value->properties->store_product_id ); - } - } - } else { - $response = HubWooConnectionMananager::get_instance()->update_batch_object_record( 'products', $updates ); - if ( 200 == $response['status_code'] ) { - $response = json_decode( $response['body'] ); - $result = $response->results; - foreach ( $result as $key => $value ) { - delete_post_meta( $value->properties->store_product_id, 'hubwoo_product_synced' ); - do_action( 'hubwoo_update_product_property', $value->properties->store_product_id ); - } - } - } - } - } - } - - /** - * Fetching total order available and returning count. Also excluding orders with deal id. - * - * @since 1.0.0 - * @param int $number_of_posts posts to fetch in one call. - * @param bool $count true/false. - * @return array $old_orders orders posts. - */ - public static function hubwoo_orders_count_for_deal( $number_of_posts = -1, $count = true ) { - - $sync_data['since_date'] = get_option( 'hubwoo_ecomm_order_ocs_from_date', gmdate( 'd-m-Y' ) ); - $sync_data['upto_date'] = get_option( 'hubwoo_ecomm_order_ocs_upto_date', gmdate( 'd-m-Y' ) ); - $sync_data['selected_order_status'] = get_option( 'hubwoo_ecomm_order_ocs_status', array_keys( wc_get_order_statuses() ) ); - - //hpos changes - if ( Hubwoo::hubwoo_check_hpos_active() ) { - // HPOS is enabled. - $args = array( - 'limit' => $number_of_posts, // Query all orders - 'orderby' => 'date', - 'post_status' => $sync_data['selected_order_status'], - 'order' => 'DESC', - 'return' => 'ids', - 'meta_key' => 'hubwoo_ecomm_deal_created', // The postmeta key field - 'meta_compare' => 'NOT EXISTS', // The comparison argument - 'post_parent' => 0, - ); - } else { - // CPT-based orders are in use. - $args = array( - 'numberposts' => $number_of_posts, - 'post_type' => 'shop_order', - 'fields' => 'ids', - 'post_status' => $sync_data['selected_order_status'], - 'meta_query' => array( - array( - 'key' => 'hubwoo_ecomm_deal_created', - 'compare' => 'NOT EXISTS', - ), - ), - ); - } - - if ( 'yes' == get_option( 'hubwoo_ecomm_order_date_allow', 'no' ) ) { - $args['date_query'] = array( - array( - 'after' => gmdate( 'd-m-Y', strtotime( $sync_data['since_date'] ) ), - 'before' => gmdate( 'd-m-Y', strtotime( $sync_data['upto_date'] . ' +1 day' ) ), - 'inclusive' => true, - ), - ); - } - - //hpos changes - if( Hubwoo::hubwoo_check_hpos_active() ) { - $old_orders = wc_get_orders( $args ); - } else { - $old_orders = get_posts( $args ); - } - - if ( $count ) { - - $orders_count = count( $old_orders ); - - return $orders_count; - - } else { - - return $old_orders; - } - } - - /** - * General setting tab fields. - * - * @return array woocommerce_admin_fields acceptable fields in array. - * @since 1.0.0 - */ - public static function hubwoo_ecomm_general_settings() { - - $settings = array(); - - $settings[] = array( - 'title' => __( 'Apply your settings for Deals and its stages', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_ecomm_deals_settings_title', - 'type' => 'title', - 'class' => 'hubwoo-ecomm-settings-title', - ); - - $settings[] = array( - 'title' => __( 'Enable/Disable', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_ecomm_deal_enable', - 'desc' => __( 'Allow to sync new deals', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'checkbox', - 'class' => 'hubwoo-ecomm-settings-checkbox hubwoo_real_time_changes', - 'default' => 'yes', - ); - - $settings[] = array( - 'title' => __( 'Days required to close a deal', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_ecomm_closedate_days', - 'type' => 'number', - 'desc' => __( 'set the minimum number of days in which the pending/open deals can be closed/won', 'makewebbetter-hubspot-for-woocommerce' ), - 'desc_tip' => true, - 'custom_attributes' => array( 'min' => '5' ), - 'default' => '5', - 'class' => 'hubwoo-ecomm-settings-text hubwoo_real_time_changes', - ); - - $settings[] = array( - 'title' => __( 'Winning Deal Stages', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_ecomm_won_stages', - 'type' => 'multiselect', - 'class' => 'hubwoo-ecomm-settings-multiselect hubwoo_real_time_changes', - 'desc' => __( 'select the deal stages of ecommerce pipeline which are won according to your business needs. "Processing" and "Completed" are default winning stages for extension as well as HubSpot', 'makewebbetter-hubspot-for-woocommerce' ), - 'desc_tip' => true, - 'options' => self::hubwoo_ecomm_get_stages(), - ); - - $settings[] = array( - 'title' => __( 'Enable/Disable', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_assoc_deal_cmpy_enable', - 'desc' => __( 'Allow to associate deal and company', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'checkbox', - 'class' => 'hubwoo-ecomm-settings-checkbox hubwoo_real_time_changes', - 'default' => 'yes', - ); - - $settings[] = array( - 'title' => __( 'Enable Multi Currency Sync', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_deal_multi_currency_enable', - 'desc' => __( 'Enable to sync currency if you are using multi currency on your site.', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'checkbox', - 'class' => 'hubwoo-ecomm-settings-checkbox hubwoo_real_time_changes', - ); - - $settings[] = array( - 'type' => 'sectionend', - 'id' => 'hubwoo_ecomm_deal_settings_end', - ); - - return apply_filters( 'hubwoo_ecomm_deals_settings', $settings ); - } - - - /** - * Updates the product whenever there is any change - * - * @since 1.0.0 - * @return array $settings ecomm ocs settings - */ - public static function hubwoo_ecomm_order_ocs_settings() { - - $settings = array(); - - $settings[] = array( - 'title' => __( 'Export your old orders as Deals on HubSpot', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_ecomm_order_ocs_title', - 'type' => 'title', - 'class' => 'hubwoo-ecomm-settings-title', - ); - - $settings[] = array( - 'title' => __( 'Select order status', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_ecomm_order_ocs_status', - 'type' => 'multiselect', - 'desc' => __( 'Select a order status from the dropdown and all orders for the selected status will be synced as deals', 'makewebbetter-hubspot-for-woocommerce' ), - 'options' => wc_get_order_statuses(), - 'desc_tip' => true, - 'class' => 'hubwoo-ecomm-settings-select', - ); - - $settings[] = array( - 'title' => __( 'Select a time period', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_ecomm_order_date_allow', - 'desc' => __( ' Date range for orders', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'checkbox', - 'class' => 'hubwoo-ecomm-settings-checkbox hubwoo-ecomm-settings-select', - ); - - $settings[] = array( - 'title' => __( 'Orders from date', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_ecomm_order_ocs_from_date', - 'type' => 'text', - 'placeholder' => 'dd-mm-yyyy', - 'default' => gmdate( 'd-m-Y' ), - 'desc' => __( 'From which date you want to sync the orders, select that date', 'makewebbetter-hubspot-for-woocommerce' ), - 'desc_tip' => true, - 'class' => 'hubwoo-date-picker hubwoo-date-d-range hubwoo-ecomm-settings-select', - ); - - $settings[] = array( - 'title' => __( 'Orders up to date', 'makewebbetter-hubspot-for-woocommerce' ), - 'id' => 'hubwoo_ecomm_order_ocs_upto_date', - 'type' => 'text', - 'default' => gmdate( 'd-m-Y' ), - 'placeholder' => __( 'dd-mm-yyyy', 'makewebbetter-hubspot-for-woocommerce' ), - 'desc' => __( 'Up to which date you want to sync the orders, select that date', 'makewebbetter-hubspot-for-woocommerce' ), - 'desc_tip' => true, - 'class' => 'hubwoo-date-picker hubwoo-date-d-range hubwoo-ecomm-settings-select', - ); - - $settings[] = array( - 'type' => 'sectionend', - 'id' => 'hubwoo_ecomm_order_ocs_end', - ); - - return apply_filters( 'hubwoo_ecomm_order_sync_settings', $settings ); - } - - /** - * Updates the product whenever there is any change - * - * @since 1.0.0 - * @return array $mapped_array mapped deal stage and order statuses. - */ - public static function hubwoo_ecomm_get_stages() { - - $mapped_array = array(); - $stages = get_option( 'hubwoo_fetched_deal_stages', '' ); - $deal_stage_id = 'stageId'; - - if ( 'yes' == get_option( 'hubwoo_ecomm_pipeline_created', 'no' ) ) { - $deal_stage_id = 'id'; - } - if ( ! empty( $stages ) ) { - $mapped_array = array_combine( array_column( $stages, $deal_stage_id ), array_column( $stages, 'label' ) ); - } - return $mapped_array; - } - - /** - * Updates the product whenever there is any change - * - * @since 1.0.0 - * @param bool $redirect redirect to contact page ( default = false). - */ - public static function hubwoo_schedule_sync_listener( $redirect = false ) { - - $hubwoodatasync = new HubwooDataSync(); - - $unique_users = $hubwoodatasync->hubwoo_get_all_unique_user( true ); - - update_option( 'hubwoo_total_ocs_need_sync', $unique_users ); - - $hubwoodatasync->hubwoo_start_schedule(); - - if ( $redirect ) { - wp_safe_redirect( admin_url( 'admin.php?page=hubwoo&hubwoo_tab=hubwoo-sync-contacts' ) ); - } - } - - /** - * Download the log file of the plugin. - * - * @return void - */ - public function hubwoo_get_plugin_log() { - - if ( isset( $_GET['action'] ) && 'download-log' == $_GET['action'] ) { - $filename = WC_LOG_DIR . 'hubspot-for-woocommerce-logs.log'; - if ( is_readable( $filename ) && file_exists( $filename ) ) { - header( 'Content-type: text/plain' ); - header( 'Content-Disposition: attachment; filename="' . basename( $filename ) . '"' ); - readfile( $filename ); - exit(); - } - } elseif ( isset( $_GET['action'] ) && 'dismiss-hubwoo-notice' == $_GET['action'] ) { - update_option( 'hubwoo-cron-notice-dismiss', 'yes' ); - wp_safe_redirect( admin_url( 'admin.php' ) . '?page=hubwoo' ); - } - } - - /** - * Re-sync Orders as deals. - * - * @since 1.0.0 - */ - public function hubwoo_deals_sync_check() { - - if ( 'no' == get_option( 'hubwoo_ecomm_setup_completed', 'no' ) || 'yes' === get_option( 'hubwoo_connection_issue', 'no' ) ) { - return; - } - - //hpos changes - if ( Hubwoo::hubwoo_check_hpos_active() ) { - // HPOS is enabled. - $args = array( - 'limit' => 3, // Query all orders - 'orderby' => 'date', - 'post_status' => array_keys( wc_get_order_statuses() ), - 'order' => 'DESC', - 'return' => 'ids', - 'meta_key' => 'hubwoo_ecomm_deal_created', // The postmeta key field - 'meta_compare' => 'NOT EXISTS', // The comparison argument - 'post_parent' => 0, - ); - } else { - // CPT-based orders are in use. - $query = new WP_Query(); - - $args = array( - 'post_type' => 'shop_order', - 'posts_per_page' => 3, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'orderby' => 'date', - 'order' => 'desc', - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'meta_query' => array( - array( - 'key' => 'hubwoo_ecomm_deal_created', - 'compare' => 'NOT EXISTS', - ), - ), - ); - } - - $activated_time = get_option( 'hubwoo_plugin_activated_time', '' ); - if ( ! empty( $activated_time ) ) { - $args['date_query'] = array( - array( - 'after' => gmdate( 'd-m-Y', strtotime( '-1 day', $activated_time ) ), - 'inclusive' => true, - ), - ); - } - //hpos changes - if( Hubwoo::hubwoo_check_hpos_active() ) { - $failed_orders = wc_get_orders( $args ); - } else { - $failed_orders = $query->query( $args ); - } - - if ( ! empty( $failed_orders ) ) { - foreach ( $failed_orders as $order_id ) { - HubwooObjectProperties::get_instance()->hubwoo_ecomm_deals_sync( $order_id ); - } - } - } - - /** - * Re-sync Orders as deals. - * - * @since 1.0.0 - */ - public function hubwoo_products_sync_check() { - - if ( 'yes' != get_option( 'hubwoo_greeting_displayed_setup', 'no' ) || 'yes' == get_option( 'hubwoo_product_scope_needed', 'no' ) ) { - return; - } - - $product_data = Hubwoo::hubwoo_get_product_data( 10 ); - - if ( ! empty( $product_data ) && is_array( $product_data ) ) { - foreach ( $product_data as $pro_id => $value ) { - - $filtergps = array(); - $product_data = array( - 'properties' => $value['properties'], - ); - - $flag = true; - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - - $product = wc_get_product( $pro_id ); - - $filtergps = array( - 'filterGroups' => array( - array( - 'filters' => array( - array( - 'value' => $pro_id, - 'propertyName' => 'store_product_id', - 'operator' => 'EQ', - ), - ), - ), - ), - ); - - if( !empty($product->get_sku()) ) { - $filtergps['filterGroups'][] = array( - 'filters' => array( - array( - 'value' => $product->get_sku(), - 'propertyName' => 'hs_sku', - 'operator' => 'EQ', - ), - ), - ); - } - - $response = HubWooConnectionMananager::get_instance()->search_object_record( 'products', $filtergps ); - - if ( 200 == $response['status_code'] ) { - $responce_body = json_decode( $response['body'] ); - $result = $responce_body->results; - if ( ! empty( $result ) ) { - foreach ( $result as $key => $value ) { - update_post_meta( $pro_id, 'hubwoo_ecomm_pro_id', $value->id ); - } - } - } - - $pro_hs_id = get_post_meta( $pro_id, 'hubwoo_ecomm_pro_id', true ); - - if ( ! empty( $pro_hs_id ) ) { - $response = HubWooConnectionMananager::get_instance()->update_object_record( 'products', $pro_hs_id, $product_data ); - if ( 200 == $response['status_code'] ) { - delete_post_meta( $pro_id, 'hubwoo_product_synced' ); - } - } else { - $response = HubWooConnectionMananager::get_instance()->create_object_record( 'products', $product_data ); - if ( 201 == $response['status_code'] ) { - $response_body = json_decode( $response['body'] ); - update_post_meta( $pro_id, 'hubwoo_ecomm_pro_id', $response_body->id ); - delete_post_meta( $pro_id, 'hubwoo_product_synced' ); - } - } - do_action( 'hubwoo_update_product_property', $pro_id ); - } - } - } - } - - /** - * Contact sync in background. - * - * @since 1.0.4 - */ - public function hubwoo_contacts_sync_background() { - - $user_data = array(); - $hubwoo_datasync = new HubwooDataSync(); - $users_need_syncing = $hubwoo_datasync->hubwoo_get_all_unique_user(); - if ( ! count( $users_need_syncing ) ) { - $users_need_syncing = $hubwoo_datasync->hubwoo_get_all_unique_user( false, 'guestOrder' ); - $user_data = HubwooDataSync::get_guest_sync_data( $users_need_syncing ); - $mark['type'] = 'order'; - $mark['ids'] = $users_need_syncing; - } else { - $user_data = HubwooDataSync::get_sync_data( $users_need_syncing ); - $mark['type'] = 'user'; - $mark['ids'] = $users_need_syncing; - } - - if ( ! empty( $user_data ) ) { - $response = HubWooConnectionMananager::get_instance()->create_or_update_contacts( $user_data, $mark ); - if ( ( count( $user_data ) ) && 400 == $response['status_code'] ) { - Hubwoo::hubwoo_handle_contact_sync( $response, $user_data, $mark ); - } - } else { - Hubwoo::hubwoo_stop_sync( 'stop-contact' ); - } - } - - /** - * Re-sync Contacts to fetch Vid. - * - * @since 1.0.0 - */ - public function hubwoo_update_contacts_vid() { - - $contact_data = array(); - - $mark = array(); - - $args['meta_query'] = array( - - array( - 'key' => 'hubwoo_user_vid', - 'compare' => 'NOT EXISTS', - ), - ); - $args['role__in'] = get_option( 'hubwoo-selected-user-roles', array() ); - $args['number'] = 20; - $args['fields'] = 'ID'; - - $users = get_users( $args ); - - if ( ! empty( $users ) ) { - $mark['type'] = 'user'; - $mark['ids'] = $users; - - foreach ( $users as $user_id ) { - $user_data = array(); - $user = get_user_by( 'id', $user_id ); - $user_data['email'] = $user->data->user_email; - $user_data['customer_group'] = ! empty( $user->data->roles ) ? HubwooGuestOrdersManager::hubwoo_format_array( $user->data->roles ) : 'customer'; - $user_data['firstname'] = get_user_meta( $user_id, 'first_name', true ); - $user_data['lastname'] = get_user_meta( $user_id, 'last_name', true ); - $contacts[] = $user_data; - } - } else { - - //hpos changes - if ( Hubwoo::hubwoo_check_hpos_active() ) { - // HPOS is enabled. - $query = new WC_Order_Query(array( - 'limit' => 20, // Query all orders - 'orderby' => 'date', - 'post_status' => array_keys( wc_get_order_statuses() ), - 'order' => 'DESC', - 'return' => 'ids', - 'meta_key' => 'hubwoo_user_vid', // The postmeta key field - 'meta_compare' => 'NOT EXISTS', // The comparison argument - 'post_parent' => 0, - 'customer_id' => 0, - )); - $customer_orders = $query->get_orders(); - } else { - // CPT-based orders are in use. - $query = new WP_Query(); - - $customer_orders = $query->query( - array( - 'post_type' => 'shop_order', - 'posts_per_page' => 20, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'orderby' => 'date', - 'order' => 'desc', - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'meta_query' => array( - 'relation' => 'AND', - array( - 'key' => '_customer_user', - 'value' => 0, - ), - array( - 'key' => 'hubwoo_user_vid', - 'compare' => 'NOT EXISTS', - ), - ), - ) - ); - } - - if ( ! empty( $customer_orders ) ) { - - $mark['type'] = 'order'; - $mark['ids'] = $customer_orders; - - foreach ( $customer_orders as $order_id ) { - $order = wc_get_order($order_id); - $user_data = array(); - $user_data['email'] = $order->get_billing_email(); - $user_data['customer_group'] = 'guest'; - $user_data['firstname'] = $order->get_billing_first_name(); - $user_data['lastname'] = $order->get_billing_last_name(); - $contacts[] = $user_data; - } - } - } - - if ( ! empty( $contacts ) ) { - - $prepared_data = array(); - - array_walk( - $contacts, - function( $user_data ) use ( &$prepared_data ) { - if ( ! empty( $user_data ) ) { - $temp_data = array(); - - if ( isset( $user_data['email'] ) ) { - $temp_data['email'] = $user_data['email']; - unset( $user_data['email'] ); - foreach ( $user_data as $name => $value ) { - if ( ! empty( $value ) ) { - $temp_data['properties'][] = array( - 'property' => $name, - 'value' => $value, - ); - } - } - $prepared_data[] = $temp_data; - } - } - } - ); - - HubWooConnectionMananager::get_instance()->create_or_update_contacts( $prepared_data, $mark ); - } else { - delete_option( 'hubwoo_contact_vid_update' ); - as_unschedule_action( 'hubwoo_update_contacts_vid' ); - } - } - - /** - * Source tracking from Checkout form. - * - * @since 1.0.4 - */ - public function hubwoo_submit_checkout_form() { - - if ( ! empty( $_REQUEST['woocommerce-process-checkout-nonce'] ) ) { - - $request = sanitize_text_field( wp_unslash( $_REQUEST['woocommerce-process-checkout-nonce'] ) ); - $hub_cookie = isset( $_COOKIE['hubspotutk'] ) ? sanitize_text_field( wp_unslash( $_COOKIE['hubspotutk'] ) ) : ''; - $nonce_value = wc_get_var( $request ); - - if ( ! empty( $nonce_value ) && wp_verify_nonce( $nonce_value, 'woocommerce-process_checkout' ) ) { - $data = array(); - $form_id = get_option( 'hubwoo_checkout_form_id', '' ); - $portal_id = get_option( 'hubwoo_pro_hubspot_id', '' ); - $form_data = ! empty( $_POST ) ? map_deep( wp_unslash( $_POST ), 'sanitize_text_field' ) : ''; - $required_data = array( - 'billing_email' => 'email', - 'billing_first_name' => 'firstname', - 'billing_last_name' => 'lastname', - ); - - foreach ( $required_data as $key => $name ) { - if ( array_key_exists( $key, $form_data ) ) { - $value = $form_data[ $key ]; - if ( empty( $value ) ) { - continue; - } - $data[] = array( - 'name' => $name, - 'value' => $value, - ); - } - } - if ( ! empty( $data ) ) { - - $data = array( 'fields' => $data ); - $context = self::hubwoo_page_source( $hub_cookie ); - - if ( ! empty( $context['context'] ) ) { - $data = array_merge( $data, $context ); - } - } - $response = HubWooConnectionMananager::get_instance()->submit_form_data( $data, $portal_id, $form_id ); - if ( 200 != $response['status_code'] ) { - $all_errors = json_decode( $response['body'] ); - if ( ! empty( $all_errors ) ) { - $get_errors = $all_errors->errors; - } - if ( ! empty( $get_errors ) ) { - $get_error_type = $get_errors[0]->errorType; - } - if ( ! empty( $get_error_type ) && 'INVALID_HUTK' === $get_error_type ) { - $context_data = self::hubwoo_page_source(); - if ( ! empty( $context_data['context'] ) ) { - $data = array_merge( $data, $context_data ); - HubWooConnectionMananager::get_instance()->submit_form_data( $data, $portal_id, $form_id ); - } - } - } - } - } - } - - /** - * Fetching current page context. - * - * @since 1.0.4 - * @param string $hub_cookie hubspot cookies. - * @return array $context. - */ - public static function hubwoo_page_source( $hub_cookie = '' ) { - - $referrer = wp_get_referer(); - $obj_id = 0; - $ip = isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ) : ''; - - if ( $referrer ) { - $obj_id = url_to_postid( $referrer ); - } - - $current_url = get_permalink( $obj_id ); - $page_name = get_the_title( $obj_id ); - $context = array(); - - if ( ! empty( $current_url ) ) { - $context['pageUri'] = $current_url; - } - if ( ! empty( $page_name ) ) { - $context['pageName'] = $page_name; - } - if ( ! empty( $hub_cookie ) ) { - $context['hutk'] = $hub_cookie; - } - if ( ! empty( $ip ) ) { - if ( filter_var( $ip, FILTER_VALIDATE_IP ) ) { - $context['ipAddress'] = $ip; - } - } - $context = array( - 'context' => $context, - ); - - return $context; - } - - /** - * Fetching property value. - * - * @since 1.2.6 - */ - public function hubwoo_check_property_value() { - - if ( 1 == get_option( 'hubwoo_pro_lists_setup_completed', 0 ) ) { - - $property_updated = get_option( 'hubwoo_newsletter_property_update' ); - $abandoned_property_updated = get_option( 'hubwoo_abandoned_property_update' ); - - if ( empty( $property_updated ) ) { - - $flag = true; - $object_type = 'contacts'; - $property_name = 'newsletter_subscription'; - $property_changed = 'no'; - - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - $response = HubWooConnectionMananager::get_instance()->hubwoo_read_object_property( $object_type, $property_name ); - - if ( 200 == $response['status_code'] ) { - $results = json_decode( $response['body'] ); - - if ( isset( $results->options ) ) { - $options = $results->options; - - if ( 'no' == $options[0]->value || 'yes' == $options[0]->value ) { - $property_changed = 'no'; - } else { - $property_changed = 'yes'; - } - } - } - } - - update_option( 'hubwoo_newsletter_property_update', $property_changed ); - } - - if ( empty( $abandoned_property_updated ) ) { - - $flag = true; - $object_type = 'contacts'; - $property_name = 'current_abandoned_cart'; - $abandoned_property_changed = 'no'; - - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - $response = HubWooConnectionMananager::get_instance()->hubwoo_read_object_property( $object_type, $property_name ); - - if ( 200 == $response['status_code'] ) { - $results = json_decode( $response['body'] ); - - if ( isset( $results->options ) ) { - $options = $results->options; - - if ( 'no' == $options[0]->value || 'yes' == $options[0]->value ) { - $abandoned_property_changed = 'no'; - } else { - $abandoned_property_changed = 'yes'; - } - } - } - } - - update_option( 'hubwoo_abandoned_property_update', $abandoned_property_changed ); - } - } - } - - /** - * Check and create new properties. - * - * @since 1.4.0 - */ - public function hubwoo_check_update_changes() { - if ( 1 == get_option( 'hubwoo_pro_lists_setup_completed', 0 ) ) { - - $flag = true; - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - - if ( 'yes' != get_option( 'hubwoo_product_property_created', 'no' ) && 'yes' != get_option( 'hubwoo_product_scope_needed', 'no' ) ) { - $product_properties = Hubwoo::hubwoo_get_product_properties(); - - $response = HubWooConnectionMananager::get_instance()->create_batch_properties( $product_properties, 'products' ); - if ( 201 == $response['status_code'] || 207 == $response['status_code'] ) { - update_option( 'hubwoo_product_property_created', 'yes' ); - } else if ( 403 == $response['status_code'] ) { - update_option( 'hubwoo_product_scope_needed', 'yes' ); - update_option( 'hubwoo_ecomm_setup_completed', 'yes' ); - } - } - - if ( 'yes' != get_option( 'hubwoo_deal_property_created', 'no' ) ) { - $deal_properties = Hubwoo::hubwoo_get_deal_properties(); - - $response = HubWooConnectionMananager::get_instance()->create_batch_properties( $deal_properties, 'deals' ); - if ( 201 == $response['status_code'] || 207 == $response['status_code'] ) { - update_option( 'hubwoo_deal_property_created', 'yes' ); - } - } - - if ( 'yes' != get_option( 'hubwoo_contact_new_property_created', 'no' ) ) { - $group_properties[] = array( - 'name' => 'customer_source_store', - 'label' => __( 'Customer Source Store', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - 'groupName' => 'customer_group', - ); - - $response = HubWooConnectionMananager::get_instance()->create_batch_properties( $group_properties, 'contacts' ); - if ( 201 == $response['status_code'] || 207 == $response['status_code'] ) { - update_option( 'hubwoo_contact_new_property_created', 'yes' ); - } - } - - if ( as_next_scheduled_action( 'hubwoo_deal_update_schedule' ) ) { - as_unschedule_action( 'hubwoo_deal_update_schedule' ); - } - } - } - } - - /** - * Update a ecomm deal. - * - * @since 1.0.0 - * @param int $order_id order id to be updated. - */ - public function hubwoo_ecomm_deal_update_order( $order_id ) { - - if ( ! empty( $order_id ) ) { - - $order = wc_get_order( $order_id ); - - $upsert_meta = $order->get_meta('hubwoo_ecomm_deal_upsert', 'no'); - - if( $upsert_meta == 'yes'){ - return; - } - - $post_type = get_post_type( $order_id ); - - if ( 'shop_subscription' == $post_type ) { - return; - } - - if ('yes' == get_option('woocommerce_custom_orders_table_data_sync_enabled', 'no') && 'yes' == get_option('woocommerce_custom_orders_table_enabled', 'no')) { - return; - } - - $order->update_meta_data('hubwoo_ecomm_deal_upsert', 'yes'); - $order->save(); - - } - } - - /** - * Initiate deactivation screen. - */ - public static function init_deactivation() { - $params = array(); - try { - $result = wc_get_template( - '/templates/deactivation-screen.php', - $params, - '', - plugin_dir_path( __FILE__ ) - ); - - } catch ( \Throwable $th ) { - echo( esc_html( $th->getMessage() ) ); - die; - } - } - - /** - * Check and delete logs. - */ - public function hubwoo_check_logs() { - global $wpdb; - $table_name = $wpdb->prefix . 'hubwoo_log'; - $delete_timestamp = time() - ( 30 * 24 * 60 * 60 ); - - $wpdb->get_results( $wpdb->prepare( 'DELETE FROM %1s WHERE time < %d', $table_name, $delete_timestamp ) ); - } -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/css/hubwoo-admin-global.css b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/css/hubwoo-admin-global.css deleted file mode 100644 index b4768570..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/css/hubwoo-admin-global.css +++ /dev/null @@ -1,59 +0,0 @@ -/*//deactivation screen*/ - -.mwb-g-modal__cover { - background-color: rgba(0, 0, 0, 0.2); - bottom: 0; - display: none; - left: 0; - position: fixed; - right: 0; - top: 0; -} - -.mwb-g-modal__close { - cursor: pointer; - font-size: 24px; - font-weight: 600; - position: absolute; - right: 7px; - top: 3px; - transform: rotate(45deg); -} - -.mwb-g-modal__message { - background-color: #fff; - border-radius: 5px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); - color: #053500; - left: -200%; - max-width: 600px; - min-height: 50px; - padding: 15px 20px; - position: fixed; - text-align: center; - top: 50%; - transform: translate(-50%, -50%); - transition: centre 1.2s linear; - width: 80%; -} - -.show-g_modal_cover { - display: block; -} - -.show-g_modal_message { - left: 50%; -} - -.mwb-g-modal__content__header { - margin: auto; -} - -/* Additional fixes. */ -.mwb-g-modal__content { - margin-bottom: -80px; -} - -.mwb-g-modal iframe { - height: 536px !important; -} \ No newline at end of file diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/css/hubwoo-admin.css b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/css/hubwoo-admin.css deleted file mode 100644 index 636537e8..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/css/hubwoo-admin.css +++ /dev/null @@ -1,3803 +0,0 @@ -@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"); -@import url('https://fonts.googleapis.com/css?family=Nunito+Sans:300,400,800,900&display=swap'); - -/*====================================== -= Log Table = -======================================*/ - -table.dataTable { - width: 100%; - margin: 0 auto; - clear: both; - border-collapse: separate; - border-spacing: 0; -} - -table.dataTable thead th, table.dataTable tfoot th { - font-weight: bold; -} - -table.dataTable thead th, table.dataTable thead td { - padding: 10px 18px; - border-bottom: 1px solid #111; -} - -table.dataTable thead th:active, table.dataTable thead td:active { - outline: none; -} - -table.dataTable tfoot th, table.dataTable tfoot td { - padding: 10px 18px 6px 18px; - border-top: 1px solid #111; -} - -table.dataTable thead .sorting, table.dataTable thead .sorting_asc, table.dataTable thead .sorting_desc, table.dataTable thead .sorting_asc_disabled, table.dataTable thead .sorting_desc_disabled { - cursor: pointer; - *cursor: hand; - background-repeat: no-repeat; - background-position: center right; -} - -table.dataTable thead .sorting { - background-image: url("../images/sort_both.png"); -} - -table.dataTable thead .sorting_asc { - background-image: url("../images/sort_asc.png"); -} - -table.dataTable thead .sorting_desc { - background-image: url("../images/sort_desc.png"); -} - -table.dataTable thead .sorting_asc_disabled { - background-image: url("../images/sort_asc_disabled.png"); -} - -table.dataTable thead .sorting_desc_disabled { - background-image: url("../images/sort_desc_disabled.png"); -} - -table.dataTable tbody tr { - background-color: #ffffff; -} - -table.dataTable tbody tr.selected { - background-color: #B0BED9; -} - -table.dataTable tbody th, table.dataTable tbody td { - padding: 8px 10px; -} - -table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { - border-top: 1px solid #ddd; -} - -table.dataTable.row-border tbody tr:first-child th, table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, table.dataTable.display tbody tr:first-child td { - border-top: none; -} - -table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { - border-top: 1px solid #ddd; - border-right: 1px solid #ddd; -} - -table.dataTable.cell-border tbody tr th:first-child, table.dataTable.cell-border tbody tr td:first-child { - border-left: 1px solid #ddd; -} - -table.dataTable.cell-border tbody tr:first-child th, table.dataTable.cell-border tbody tr:first-child td { - border-top: none; -} - -table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { - background-color: #f9f9f9; -} - -table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { - background-color: #acbad4; -} - -table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover { - background-color: #f6f6f6; -} - -table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected { - background-color: #aab7d1; -} - -table.dataTable.order-column tbody tr > .sorting_1, table.dataTable.order-column tbody tr > .sorting_2, table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, table.dataTable.display tbody tr > .sorting_2, table.dataTable.display tbody tr > .sorting_3 { - background-color: #fafafa; -} - -table.dataTable.order-column tbody tr.selected > .sorting_1, table.dataTable.order-column tbody tr.selected > .sorting_2, table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, table.dataTable.display tbody tr.selected > .sorting_2, table.dataTable.display tbody tr.selected > .sorting_3 { - background-color: #acbad5; -} - -table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { - background-color: #f1f1f1; -} - -table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { - background-color: #f3f3f3; -} - -table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { - background-color: whitesmoke; -} - -table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { - background-color: #a6b4cd; -} - -table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { - background-color: #a8b5cf; -} - -table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { - background-color: #a9b7d1; -} - -table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { - background-color: #fafafa; -} - -table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { - background-color: #fcfcfc; -} - -table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { - background-color: #fefefe; -} - -table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { - background-color: #acbad5; -} - -table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { - background-color: #aebcd6; -} - -table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { - background-color: #afbdd8; -} - -table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 { - background-color: #eaeaea; -} - -table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 { - background-color: #ececec; -} - -table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 { - background-color: #efefef; -} - -table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 { - background-color: #a2aec7; -} - -table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 { - background-color: #a3b0c9; -} - -table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 { - background-color: #a5b2cb; -} - -table.dataTable.no-footer { - border-bottom: 1px solid #111; -} - -table.dataTable.nowrap th, table.dataTable.nowrap td { - white-space: nowrap; -} - -table.dataTable.compact thead th, table.dataTable.compact thead td { - padding: 4px 17px 4px 4px; -} - -table.dataTable.compact tfoot th, table.dataTable.compact tfoot td { - padding: 4px; -} - -table.dataTable.compact tbody th, table.dataTable.compact tbody td { - padding: 4px; -} - -table.dataTable th.dt-left, table.dataTable td.dt-left { - text-align: left; -} - -table.dataTable th.dt-center, table.dataTable td.dt-center, table.dataTable td.dataTables_empty { - text-align: center; -} - -table.dataTable th.dt-right, table.dataTable td.dt-right { - text-align: right; -} - -table.dataTable th.dt-justify, table.dataTable td.dt-justify { - text-align: justify; -} - -table.dataTable th.dt-nowrap, table.dataTable td.dt-nowrap { - white-space: nowrap; -} - -table.dataTable thead th.dt-head-left, table.dataTable thead td.dt-head-left, table.dataTable tfoot th.dt-head-left, table.dataTable tfoot td.dt-head-left { - text-align: left; -} - -table.dataTable thead th.dt-head-center, table.dataTable thead td.dt-head-center, table.dataTable tfoot th.dt-head-center, table.dataTable tfoot td.dt-head-center { - text-align: center; -} - -table.dataTable thead th.dt-head-right, table.dataTable thead td.dt-head-right, table.dataTable tfoot th.dt-head-right, table.dataTable tfoot td.dt-head-right { - text-align: right; -} - -table.dataTable thead th.dt-head-justify, table.dataTable thead td.dt-head-justify, table.dataTable tfoot th.dt-head-justify, table.dataTable tfoot td.dt-head-justify { - text-align: justify; -} - -table.dataTable thead th.dt-head-nowrap, table.dataTable thead td.dt-head-nowrap, table.dataTable tfoot th.dt-head-nowrap, table.dataTable tfoot td.dt-head-nowrap { - white-space: nowrap; -} - -table.dataTable tbody th.dt-body-left, table.dataTable tbody td.dt-body-left { - text-align: left; -} - -table.dataTable tbody th.dt-body-center, table.dataTable tbody td.dt-body-center { - text-align: center; -} - -table.dataTable tbody th.dt-body-right, table.dataTable tbody td.dt-body-right { - text-align: right; -} - -table.dataTable tbody th.dt-body-justify, table.dataTable tbody td.dt-body-justify { - text-align: justify; -} - -table.dataTable tbody th.dt-body-nowrap, table.dataTable tbody td.dt-body-nowrap { - white-space: nowrap; -} - -table.dataTable, table.dataTable th, table.dataTable td { - box-sizing: content-box; -} - -.dataTables_wrapper { - position: relative; - clear: both; - *zoom: 1; - zoom: 1; -} - -.dataTables_wrapper tr .dtr-control { - position: relative; -} - -.dataTables_wrapper tr .dtr-control::after { - background: #ff7a59; - border-radius: 50%; - color: #ffffff; - content: '+'; - cursor: pointer; - font-family: "NunitoSans-Bold"; - font-size: 16px; - height: 16px; - line-height: 15px; - position: absolute; - text-align: center; - top: 50%; - transform: translateY(-50%); - width: 16px; -} - -.dataTables_wrapper tr.parent .dtr-control:after { - background: #ff7a59; - content: '-'; -} - -.dataTables_wrapper .dataTables_length { - float: left; -} - -.dataTables_wrapper .dataTables_filter { - float: right; - text-align: right; - margin: 10px; -} - -.dataTables_wrapper .dataTables_filter input { - margin-left: 0.5em; -} - -.dataTables_wrapper .dataTables_info { - clear: both; - float: left; - padding-top: 0.755em; -} - -.dataTables_wrapper .dataTables_paginate { - float: right; - text-align: right; - padding-top: 0.25em; -} - -.dataTables_wrapper .dataTables_paginate .paginate_button { - box-sizing: border-box; - display: inline-block; - min-width: 1.5em; - padding: 0.5em 1em; - margin-left: 2px; - text-align: center; - text-decoration: none !important; - cursor: pointer; - *cursor: hand; - color: #333 !important; - border: 1px solid transparent; - border-radius: 2px; -} - -.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { - color: #333 !important; - border: 1px solid #979797; - background-color: white; - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc)); - background: -webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%); - background: -moz-linear-gradient(top, #fff 0%, #dcdcdc 100%); - background: -ms-linear-gradient(top, #fff 0%, #dcdcdc 100%); - background: -o-linear-gradient(top, #fff 0%, #dcdcdc 100%); - background: linear-gradient(to bottom, #fff 0%, #dcdcdc 100%); -} - -.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { - cursor: default; - color: #666 !important; - border: 1px solid transparent; - background: transparent; - box-shadow: none; -} - -.dataTables_wrapper .dataTables_paginate .paginate_button:hover { - color: white !important; - border: 1px solid #111; - background-color: #585858; - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111)); - background: -webkit-linear-gradient(top, #585858 0%, #111 100%); - background: -moz-linear-gradient(top, #585858 0%, #111 100%); - background: -ms-linear-gradient(top, #585858 0%, #111 100%); - background: -o-linear-gradient(top, #585858 0%, #111 100%); - background: linear-gradient(to bottom, #585858 0%, #111 100%); -} - -.dataTables_wrapper .dataTables_paginate .paginate_button:active { - outline: none; - background-color: #2b2b2b; - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c)); - background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); - background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); - background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); - background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); - background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%); - box-shadow: inset 0 0 3px #111; -} - -.dataTables_wrapper .dataTables_paginate .ellipsis { - padding: 0 1em; -} - -.dataTables_wrapper .dataTables_processing { - position: absolute; - top: 50%; - left: 50%; - width: 100%; - height: 40px; - margin-left: -50%; - margin-top: -25px; - padding-top: 20px; - text-align: center; - font-size: 1.2em; - background-color: white; - background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); - background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); - background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); - background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); - background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); - background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); -} - -.dataTables_wrapper .dataTables_length, .dataTables_wrapper .dataTables_filter, .dataTables_wrapper .dataTables_info, .dataTables_wrapper .dataTables_processing, .dataTables_wrapper .dataTables_paginate { - color: #333; -} - -.dataTables_wrapper .dataTables_scroll { - clear: both; -} - -.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody { - *margin-top: -1px; - -webkit-overflow-scrolling: touch; -} - -.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td { - vertical-align: middle; -} - -.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing { - height: 0; - overflow: hidden; - margin: 0 !important; - padding: 0 !important; -} - -.dataTables_wrapper.no-footer .dataTables_scrollBody { - border-bottom: 1px solid #111; -} - -.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable, .dataTables_wrapper.no-footer div.dataTables_scrollBody > table { - border-bottom: none; -} - -.dataTables_wrapper:after { - visibility: hidden; - display: block; - content: ""; - clear: both; - height: 0; -} - -.hubwoo-content-wrap { - background: #ffffff; - border-radius: 8px; - margin-bottom: 10px; - padding: 15px; -} - -.hubwoo-table td.child { - padding: 20px !important; - text-align: left; - word-break: break-word; -} - -#hubwoo-woo-crm-reauth, -#hubwoo-woo-crm-disconnect { - margin-top: 10px; -} - -.hubwoo-btn__loader { - font-family: dashicons; - padding-left: 35px !important; - position: relative; -} - -.hubwoo-btn__loader:before { - animation: loading 1s infinite linear; - content: "\f113"; - font-size: 20px; - left: 10px; - position: absolute; - top: 5px; -} - -.hubwoo-logs__header .hubwoo-logs__settings-list .hubwoo-logs__settings-list-item .hubwoo-logs__setting-link { - color: #2196f3; - font-size: 12px; - display: block; - background: #f4f4f4; - padding: 4px 8px; - border-radius: 8px; - cursor: pointer; -} - -.hubwoo-logs__header .hubwoo-logs__settings-list .hubwoo-logs__settings-list-item { - display: inline-block; - vertical-align: middle; - margin-right: 15px; -} - -.hubwoo-logs__header .hubwoo-logs__settings-list { - flex: 0 0 60%; - max-width: 60%; - text-align: right; -} - -.hubwoo-logs__header .hubwoo-logs__heading-wrap { - flex: 0 0 40%; - max-width: 40%; -} - -.hubwoo-logs__header { - display: flex; - flex-wrap: wrap; -} - -.hubwoo-table__wrapper .bottom:last-child { - display: flex; - flex-wrap: wrap; - justify-content: flex-end; - align-items: center; - padding: 10px 0; -} - -.hubwoo-table__wrapper .bottom .dataTables_info { - padding: 0 !important; - font-size: 14px; -} - -.hubwoo-table__wrapper .bottom .dataTables_info, .hubwoo-table__wrapper .bottom .dataTables_length, .hubwoo-table__wrapper .bottom .dataTables_paginate { - margin-right: 25px; -} - -@media screen and (max-width: 767px) { - .dataTables_wrapper .dataTables_info, .dataTables_wrapper .dataTables_paginate { - float: none; - text-align: center; - } - .dataTables_wrapper .dataTables_paginate { - margin-top: 0.5em; - } - .hubwoo-about__list-item .hubwoo-about__list-item-text .hubwoo-sync-form__field label { - width: 100% !important; - margin-bottom: 10px; - } - .hubwoo-feeds__form-wrap.hubwoo-fields-form-row .hubwoo-form-wrapper .hubwoo-fields-form-section-form label { - width: 100% !important; - } - #hubwoo-woo-crm-reauth, - #hubwoo-woo-crm-disconnect { - min-width: 140px; - margin-top: 10px; - } - .hubwoo-feeds__form-wrap.hubwoo-fields-form-row .hubwoo-form-wrapper .hubwoo-fields-form-section-form .custom-value-select { - margin-left: 0 !important; - margin-top: 25px; - } - .hubwoo-feeds__content .hubwoo-form-wrapper label { - width: 100% !important; - margin-bottom: 10px; - } -} - -@media screen and (max-width: 640px) { - .dataTables_wrapper .dataTables_length, .dataTables_wrapper .dataTables_filter { - float: none; - text-align: center; - } - .dataTables_wrapper .dataTables_filter { - margin-top: 0.5em; - } -} - -table.DTFC_Cloned thead, table.DTFC_Cloned tfoot { - background-color: white; -} - -div.DTFC_Blocker { - background-color: white; -} - -div.DTFC_LeftWrapper table.dataTable, div.DTFC_RightWrapper table.dataTable { - margin-bottom: 0; - z-index: 2; -} - -div.DTFC_LeftWrapper table.dataTable.no-footer, div.DTFC_RightWrapper table.dataTable.no-footer { - border-bottom: none; -} - -table.dataTable.display tbody tr.DTFC_NoData { - background-color: transparent; -} - -/*==================================== -= LOGS SECTION = -====================================*/ -.hubwoo-table__wrapper { - border-radius: 3px; - border: 1px solid #c7c7c7; - margin-top: 15px; -} - -.hubwoo-table__wrapper thead th { - font-size: 16px; - font-weight: 400; - letter-spacing: 0.25px; - line-height: 26px; -} - -.hubwoo-table { - text-align: center; -} - -table.hubwoo-table, -.hubwoo-table th, -.hubwoo-table td { - border-bottom: 1px solid #c7c7c7 !important; - border-collapse: collapse; -} - -tr:last-child { - border-bottom: 0; -} - -.hubwoo-table-btn { - background-color: transparent; - border: none; - cursor: pointer; - display: inline-block; - margin: 0; - max-width: 25px; - vertical-align: middle; - width: 100%; -} - -.hubwoo-table-btn:focus { - outline: none; -} - -.hubwoo-logs__header { - display: flex; - flex-wrap: wrap; -} - -.hubwoo-logs__header .hubwoo-logs__heading-wrap { - flex: 0 0 40%; - max-width: 40%; -} - -.hubwoo-logs__header .hubwoo-logs__settings-list { - flex: 0 0 60%; - max-width: 60%; - text-align: right; -} - -@media (max-width: 768px) { - .hubwoo-logs__header .hubwoo-logs__settings-list { - flex: 0 0 100%; - max-width: 100%; - margin: 10px 0 5px; - text-align: left; - } -} - -.hubwoo-logs__header .hubwoo-logs__settings-list .hubwoo-logs__settings-list-item { - display: inline-block; - vertical-align: middle; - margin-right: 15px; -} - -.hubwoo-logs__header .hubwoo-logs__settings-list .hubwoo-logs__settings-list-item .hubwoo-logs__setting-link { - color: #2196f3; - font-size: 12px; - display: block; - background: #f4f4f4; - padding: 4px 8px; - border-radius: 8px; -} - -.hubwoo-logs__header .hubwoo-logs__settings-list .hubwoo-logs__settings-list-item:last-child { - margin-right: 0; -} - -.hubwoo-logs__header .hubwoo-logs__settings-list .hubwoo-logs__settings-list-item .hubwoo-logs__setting-img { - display: block; - padding: 8px; - background-color: #f4f4f4; - border-radius: 8px; -} - -/*===== End of LOGS SECTION ======*/ - -/*====================================== -= Plugin Wrapper = -======================================*/ -.hub-woo-main-wrapper * { - box-sizing: border-box; -} -.hub-woo-main-wrapper { - box-sizing: border-box; - box-shadow: 0 0 100px 10px rgba(0,0,0,.05); - font-family: 'Nunito Sans', sans-serif; - margin: 20px auto 0; - width: 98%; -} -.hubwoo_pop_up_wrap { - background-color: rgba(0, 0, 0, 0.55); - bottom: 0; - height: 100%; - left: 0; - position: fixed; - right: 0; - top: 0; - width: 100%; - z-index: 9999; - padding: 15px; - display: flex; - align-items: center; - justify-content: center; -} -.hubwoo_pop_up_wrap .pop_up_sub_wrap { - background-color: #fff; - border-radius: 3px; - box-shadow: 0 6px 5px rgba(0, 0, 0, 0.1); - box-sizing: border-box; - left: 0; - margin: 0 auto; - max-width: 900px; - right: 0; - display: flex; - flex-wrap: wrap; - align-items: center; - overflow: hidden; -} - -.hubwoo_pop_up_wrap .pop_up_sub_wrap .button_wrap { - margin-top: 35px; - text-align: center; -} -.hubwoo_pop_up_wrap .pop_up_sub_wrap .button_wrap a { - border-radius: 3px; - box-sizing: border-box; - color: #fff; - display: block; - font-size: 17px; - padding: 10px; - text-decoration: none; - width: 80%; - margin: 0 auto 15px; -} -.hubwoo_pop_up_wrap .pop_up_sub_wrap .button_wrap a:nth-child(1) { - background-color: #fff; - color: #333333; -} -.hubwoo_pop_up_wrap .pop_up_sub_wrap .button_wrap a:nth-child(2) { - text-decoration: underline; - color: #ffffff; - font-weight: 600; -} -.hubwoo_pop_up_wrap--image--inner-content { - text-align: center; - font-size: 20px; - line-height: 1.3; -} -#hub-lists-form .hubwoo-fields-created .hubwoo_groups span { - padding-left: 40px; -} -#hub-lists-form .hubwoo-fields-created { - margin-bottom: 20px; -} -.hubwoo_pop_up_wrap--content { - max-width: 40%; - flex: 0 0 40%; -} -.hubwoo_pop_up_wrap--image { - max-width: 60%; - flex: 0 0 60%; -} -.hubwoo_pop_up_wrap--image img { - max-width: 100%; - width: auto; -} -.hubwoo_pop_up_wrap--inner-content { - padding: 80px 20px; - background-color: #ff7a59; - color: #ffffff; -} -.hubwoo_pop_up_wrap--image--inner-content{ - padding: 20px; -} -.hubwoo_pop_up_wrap--inner-content h2 { - text-align: center !important; - font-weight: bold; - font-size: 30px; - color: #ffffff !important; - line-height: 1.3 !important; -} -a { - outline: none !important; - box-shadow: none !important; -} -.mwb-heb-wlcm, .mwb-heb-wlcm *, .mwb-heb-setup-wrapper, .mwb-heb-setup-wrapper *, .mwb-heb-dash-wrapper, .mwb-heb-dash-wrapper * { - box-sizing: border-box; -} -.hub-woo-main-wrapper h1, -.hub-woo-main-wrapper h2, -.hub-woo-main-wrapper h3, -.hub-woo-main-wrapper h4, -.hub-woo-main-wrapper h5, -.hub-woo-main-wrapper h6{ - color: #2d3e50; -} -.hubwoo-inner-container { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: space-between; -} -.hubwoo-static-menu { - background: #2D3E50; - border-left: 1px solid #566b7c; - display: inline-block; - padding: 20px 15px; -} -.mwb-heb-welcome { - color: #181a25; - font-family: 'Nunito Sans', sans-serif; - padding: 0px 15px 70px; - width: 100%; - z-index: 1; -} -/*===== End of Plugin Wrapper ======*/ - -/*====================================== -= header-section = -======================================*/ - -.hubwoo-go-pro-banner { - background: #253342; - border-bottom: 10px solid #ff7a59; -} -.hubwoo-name-wrapper { - align-items: center; - display: flex; - flex: 0 0 50%; - padding: 20px 15px; -} -.hubwoo-name-wrapper img { - margin-right: 15px; - max-width: 70px; -} -.hubwoo-static-menu { - flex: 0 0 50%; - padding: 26px 15px; -} -.hubwoo-static-menu:after{ - display: block; - content: ""; - clear: both; -} - -.hubwoo-static-menu li { - display: inline-block; - margin: 0; -} -.hubwoo-static-menu ul{ - float: right; - margin: 0; -} -.hubwoo-name-wrapper p { - color: #fff; - font-size: 18px; - margin: 0 !important; - font-weight: bold; - letter-spacing: 1px; -} -.hubwoo-static-menu li a { - font-size: 14px; - color: #a7b8c6; - margin-bottom: 5px; - margin-left: 15px; - text-decoration: none; -} -.hubwoo-static-menu li:first-child a { - margin-left: 0; -} -.hubwoo-static-menu li a:focus { - border: none; - box-shadow: none; - outline: 0; -} -.hubwoo-overview-go-pro, .hubwoo-next-connect-tab, .hubwoo__btn, -.hubwoo-general-settings .submit input[type="submit"], -#hubwoo-pro-email-logs, -.hubwoo-ocs-template .submit input[type="submit"], -#hubwoo_pro_upgrade, -#hubwoo_pro_up_date, .hubwoo-add-action, -.hubwoo-advanced-settings .submit input[type="submit"], -#hubwoo-rfm-form .submit input[type="submit"], -.hubwoo-field-text-col .hubwoo-create-single-workflow { - background: #ff7a59; - border-radius: 3px; - color: #ffffff; - display: inline-block; - font-size: 11px; - font-weight: bold; - min-width: 125px; - padding: 8px 22px; - letter-spacing: 1px; - text-transform: uppercase; - text-decoration: none; - margin-right: 20px; - cursor: pointer; - line-height: 28px; - border: none; - text-align: center; - height: auto; - text-shadow: none; - box-shadow: none; -} -.hubwoo-overview-go-pro:hover, .hubwoo__btn:hover, -.hubwoo-overview-go-pro:focus, .hubwoo__btn:focus -,.hubwoo-general-settings .submit input[type="submit"]:hover, -.hubwoo-general-settings .submit input[type="submit"]:focus, -#hubwoo-pro-email-logs:hover, -#hubwoo-pro-email-logs:focus, -.hubwoo-ocs-template .submit input[type="submit"]:hover,.hubwoo-ocs-template .submit input[type="submit"]:focus, -#hubwoo_pro_upgrade:hover, #hubwoo_pro_upgrade:focus, #hubwoo_pro_up_date:hover, #hubwoo_pro_up_date:focus, -.hubwoo-add-action:hover, .hubwoo-add-action:focus, -.hubwoo-advanced-settings .submit input[type="submit"]:hover, -.hubwoo-advanced-settings .submit input[type="submit"]:focus, -#hubwoo-rfm-form .submit input[type="submit"]:hover, -#hubwoo-rfm-form .submit input[type="submit"]:focus, -.hubwoo-field-text-col .hubwoo-create-single-workflow:hover, .hubwoo-field-text-col .hubwoo-create-single-workflow:focus{ - background-color: #ff8f73; - color: #ffffff; - outline: 0; -} -.hubwoo-next-connect-tab:hover { - background: #ff7a59; -} -.hubwoo-overview-go-pro { - margin-right: 30px; -} -.hubwoo-disabled { - pointer-events: none; - opacity: .35; -} -.hubwoo-align-class { - text-align: center !important; -} -.hubwoo_btn_0 { - margin: 0 !important; -} -.checked{ - max-width: 34px; -} -/*===== End of header-section ======*/ - -/*====================================== -= custom-css = -======================================*/ -.hubwoo-field-checked img { - max-width: 30px; -} -.list-progress-bar { - margin-top: 20px; -} -.gen-text{ - font-size: 16px; - margin-top: 15px !important; -} -.align-big { - font-size: 20px; - text-align: center !important; -} -.mwb__accordian-heading-wrap .hubwoo-font-icon { - position: absolute; - left: 15px; - top: 52%; - transform: translateY(-50%); -} -.hubwoo_tooltip_wrap, .hub-woo__checkmark { - position: absolute; - left: 0; - right: 0; - top: 52px; - background-color: #33475B; - z-index: 11; - border-radius: 3px; - padding: 5px; - line-height: 18px; - opacity: 0; - visibility: hidden; - transition: 0.2s linear all; - font-size: 13px; - font-weight: 400; - text-transform: none; - color: #ffffff; -} -.hubwoo_tooltip_wrap::before, .hub-woo__checkmark:before { - content: ""; - position: absolute; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #33475B; - top: -6px; - left: 50%; -} -.hubwoo_update_loader{ - max-width: 30px; - margin-left: 10px; - vertical-align: middle; -} - -.hubwoo_email_loader{ - max-width: 30px; - margin-left: 95px; - vertical-align: middle; -} -.hub-woo__checkmark { - min-width: 150px; - top: auto; - bottom: 27px; -} -.hub-woo__checkmark:before { - left: 5px; - top: auto; - bottom: -6px; - transform: rotate(180deg); -} -.hubwoo_pro_support_dev { - margin: 20px -1% 0 -1%; - display: flex; - flex-wrap: wrap; - justify-content: center; -} -.hubwoo_pro_support_dev a { - margin: 0; - display: block; -} -.hubwoo_pro_support_dev .hubwoo_pro_support_link:hover .hubwoo_tooltip_wrap, .hub-req-checkbox:hover .hub-woo__checkmark { - opacity: 1; - visibility: visible; - transition: 0.2s linear all; -} -.hubwoo_pro_support_link{ - position: relative; - width: 31.33%; - margin: 0 1% 10px 1%; -} -.hubwoo-common-header { - margin-bottom: 30px; -} -.hubwoo-main-template h2{ - color: #444444; - font-size: 28px; - font-weight: 500; - line-height: 33px; - margin: 20px 0 10px; - text-align: left; -} -.hubwoo-body-template { - background: #ffffff; - display: flex; - flex-wrap: wrap; - width: 100%; -} -.hubwoo-navigator-template { - display: block; - flex: 0 0 20%; -} -.hubwoo .hubwoo-nav-tab-wrapper .nav-tab-active{ - background: #fff; -} -.hubwoo-tabs .nav-tab-active, -.hubwoo-tabs .nav-tab-active:focus, -.hubwoo-tabs .nav-tab-active:focus:active, -.hubwoo-tabs .nav-tab-active:hover -{ - - border-color: #ff7a59 !important; - background-color: #ffffff; - color: #2d3e50; -} -.hubwoo-tabs .nav-tab-active{ - position: relative; -} -.hubwoo-tab-disabled img { - opacity: .35; -} -.hubwoo-tab-disabled .hubwoo-disable-white { - display: none !important; -} -.hubwoo-tab-disabled{ - cursor:not-allowed; -} -.hubwoo-content-template { - box-shadow: -1px -5px 4px 2px rgba(0,0,0,.05); - color: #2d3e50; - font-size: 16px; - flex: 0 0 80%; - max-width: 80%; - padding: 10px 30px 10px 40px; - position: relative; -} -.hubwoo-content-template p { - font-size: 16px; -} -.hubwoo-content-template { - line-height: 28px; -} -.hubwoo-content-container .notice.notice-success.is-dismissible{ - box-shadow: 2px 2px 11px #cecece; - color: #46B450; - font-weight: bold; -} -.hubwoo-content-container .notice.error { - box-shadow: 2px 2px 11px #cecece; - color: red; - font-weight: bold; - margin-top: 20px; -} -#hubwoo-skype-link img { - margin-right: 5px; - vertical-align: text-bottom; -} - -.grp-pr-list{ - font-size: 16px; - list-style: disc; - margin-left: 20px; -} -.hubwoo-content__para--greeting { - display: flex; - align-items: center; - justify-content: center; - flex-direction: row-reverse; -} -.hubwoo-content__para--greeting-img { - max-width: 80%; - flex: 0 0 80%; -} -.hubwoo-content__para--greeting-content { - flex: 0 0 20%; - max-width: 20%; -} -/*===== End of custom-css ======*/ - -/*====================================== -= hubwoo-nav-tabs-css = -======================================*/ -.hubwoo-nav { - border-bottom: 1px solid #eee; -} -.hubwoo-nav-tab { - background-color: #fff; - border-image: none; - border-bottom: 2px solid transparent !important; - color: #939393; - display: block; - font-size: 11px; - font-weight: bold; - letter-spacing: 1.2px; - line-height: 22px; - padding: 20px 15px; - text-decoration: none; - text-transform: uppercase; - text-align: center; -} -.hubwoo-nav-tab:hover { - color: #2d3e50; -} -.hubwoo-nav-tab:focus, .hubwoo-nav-tab:hover { - box-shadow: none; -} -.hubwoo-navigator-template { - display: block; - flex: 0 0 20%; -} - -/*===== End of nav-tab-css ======*/ - -/*====================================== -= loader-css = -======================================*/ -#hubwoo_loader.loading-style-bg img { - left: 0; - margin: 0 auto; - position: absolute; - right: 0; - top: 50%; - transform: translateY(-50%); - width: 100px; -} -#hubwoo_loader.loading-style-bg { - background-color: rgba(0, 0, 0, 0.65); - bottom: 0; - height: 100%; - left: 0; - position: fixed; - right: 0; - top: 0; - width: 100%; - z-index: 2147483647; -} - -/*===== End of loader-css ======*/ - - -.hubwoo-overview-footer{ - text-align: center; - padding: 5px; -} -.hubwoo-overview-footer-content-2{ - text-align: center; - margin-bottom: 20px; - margin-top: 40px; -} - -.hubwoo-overview-footer-content-2 img{ - vertical-align: middle; - margin-right: 10px; -} -.hubwoo-overview-footer-content-1.hubwoo-footer-container { - background: #efefef; - padding: 15px; - margin: 20px; -} -.hubwoo-overview-footer-content-1.hubwoo-footer-container p { - color: #2D1665; - font-size: 18px; - margin-bottom: 0; -} -/*===== End of overview-footer-css ======*/ - -/*=================================== - video section and sidecontent to it - *===================================*/ - .hubwoo-ow-intro { - display: flex; - flex-wrap: wrap; - flex-direction: column-reverse; - } - .hubwoo-ow-doc, .hubwoo-ow-support { - flex: 0 0 100%; - padding: 10px; - } - .hubwoo-ow-support { - padding: 0; - } - .hubwoo-ow-doc { - max-width: 470px; - margin: 15px auto 0; - width: 100%; - } - .hubwoo-ow-doc__video { - margin: 0 0 20px; - } - .hubwoo-ow-support h2 { - margin-top: 0; - } - .hubwoo-ow-doc__btn { - text-align: center; - } - .hubwoo-ow-doc { - padding-left: 0px; - } - .hubwoo-ow-support { - padding-right: 0; - } - .hubwoo-ow-support__list { - margin: 0; - padding-left: 14px; -} -.hubwoo-ow-support__content .hubwoo-ow-support__list a { - color: #00a4bd; - text-decoration: none; - font-weight: bold; -} -/*======end of video section=======*/ - -/*============================================ -= connect-form-section = -============================================*/ -.hubwoo-connect-form-desc { - font-size: 15px; - line-height: 24px; - margin-bottom: 25px; - margin-top: 25px; -} -.hubwoo-connection-container label { - font-size: 16px; -} -.hubwoo-connection-container input { - margin-bottom: 19px; - margin-left: 25px; -} -.hubwoo_msg_notice { - display: block; - margin: 15px 0; - background: #214460; -} -.hubwoo_msg_notice label { - display: inline-block; - padding: 10px 30px 10px 10px !important; - background: #214460 !important; - margin: 0 !important; - border-left: 5px solid #ff7a59 !important; - color: #fff !important; -} -.hubwoo_msg_notice label:after { - border-left: 10px solid #ffffff !important; -} -.hubwoo_msg_notice .hubwoo__btn { - float: right; - margin-top: 5px; - margin-right: 10px; - background: #ff7a59; - text-shadow: none; - box-shadow: none; - border: none; - padding: 5px 20px; -} -/*===== End of connect-form-section ======*/ - -/*======================================= -= connect-section = -=======================================*/ - -.hubwoo-connect-form table tr th{ - padding: 20px !important; - background: #ffffff; -} -.hubwoo-connect-form table tr td{ - text-align: left; - padding: 10px; -} -.hubwoo-connect-form input{ - margin-bottom: 0 !important; - margin-left: 0 !important -} -.hubwoo-connect-form table{ - background: #efefef; - border: 1px solid #bababa; -} -.hubwoo-connect-form table tr{ - border: 1px solid #bababa; -} -.hubwoo-connect-form .submit{ - text-align: center !important; -} -.hubwoo-connection .hubwoo-connection-status-text, .hubwoo-acces-token-renewal { - font-size: 13px; - margin: 6px 0 0; - word-break: break-word; -} -.hubwoo-inner-header { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - margin-bottom: 20px; -} -.hubwoo-inner-header .hubwoo__btn { - margin: 20px 0 10px; -} -.hubwoo-connection .hubwoo-connection-label, -.hubwoo-connection .hubwoo-acc-email-label, -.hubwoo-connection .hubwoo-token-expiry-label { - color: #555d66; - font-size: 18px; - font-weight: bold; - margin: 20px 0 0; -} -.hubwoo-connection .hubwoo-connection-status-text, .hubwoo-acces-token-renewal { - font-size: 13px; - margin: 6px 0 0; - word-break: break-word; -} -/*===== End of connect-section ======*/ - -/*======================================= - checkboxes - ========================================*/ - .hubwoo-general-settings .forminp-checkbox label, - #hubwoo-ocs-form .forminp-checkbox label, - .mwb-hub-custom-checkbox, .hubwoo-custom-chheckbox, - .hubwoo-connection-container .forminp-checkbox label { - padding-left: 10px; - position: relative; - } - .hubwoo-general-settings .forminp-checkbox label input[type="checkbox"], - #hubwoo-ocs-form .forminp-checkbox label input[type="checkbox"], - .mwb-hub-custom-checkbox input[type="checkbox"], - .hubwoo-custom-chheckbox input[type="checkbox"], - .hubwoo-connection-container .forminp-checkbox label input[type="checkbox"] { - margin: 0; - padding: 0 !important; - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - -o-appearance: none; - border: none; - background-color: transparent; - box-shadow: none; - } - .hubwoo-disconnect-form label { - position: relative; - } - .hubwoo-disconnect-form input[type="checkbox"] { - margin-right: 15px; - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - -o-appearance: none; - border: none; - background-color: transparent; - box-shadow: none; - } - .hubwoo-general-settings .forminp-checkbox label input[type="checkbox"]::after, - .hubwoo-disconnect-form input[type="checkbox"]::after, - #hubwoo-ocs-form .forminp-checkbox label input[type="checkbox"]::after, - .mwb-hub-custom-checkbox input[type="checkbox"]::after, - .hubwoo-custom-chheckbox input[type="checkbox"]::after, - .hubwoo-connection-container .forminp-checkbox label input[type="checkbox"]::after { - position: absolute; - content: ""; - width: 16px; - height: 16px; - border: 2px solid #10AAC1; - left: 0; - border-radius: 3px; - } - .hubwoo-general-settings .forminp-checkbox label input[type="checkbox"]:checked::after, - .hubwoo-disconnect-form input[type="checkbox"]:checked::after, - #hubwoo-ocs-form .forminp-checkbox label input[type="checkbox"]:checked::after, - .mwb-hub-custom-checkbox input[type="checkbox"]:checked::after, - .hubwoo-custom-chheckbox input[type="checkbox"]:checked::after, - .hubwoo-connection-container .forminp-checkbox label input[type="checkbox"]:checked::after { - background-color: #10AAC1; - } - .hubwoo-general-settings .forminp-checkbox label input[type="checkbox"]::before, - .hubwoo-disconnect-form input[type="checkbox"]::before, - #hubwoo-ocs-form .forminp-checkbox label input[type="checkbox"]::before , - .mwb-hub-custom-checkbox input[type="checkbox"]::before, - .hubwoo-custom-chheckbox input[type="checkbox"]:before, - .hubwoo-connection-container .forminp-checkbox label input[type="checkbox"]::before { - content: "\f147"; - display: block; - position: absolute; - left: -1px; - top: 5px; - margin: 0 auto; - border-radius: 4px; - bottom: 0; - color: #fff; - line-height: 17px; - text-align: center; - opacity: 0; - visibility: hidden; - transition: 0.2s linear all; - transform: scale(0); - font-family: dashicons; - z-index: 1; - } - .hubwoo-general-settings .forminp-checkbox label input[type="checkbox"]:checked::before, - #hubwoo-ocs-form .forminp-checkbox label input[type="checkbox"]:checked::before, - .mwb-hub-custom-checkbox input[type="checkbox"]:checked::before, - .hubwoo-custom-chheckbox input[type="checkbox"]:checked::before, - .hubwoo-connection-container .forminp-checkbox label input[type="checkbox"]:checked::before, - .hubwoo-disconnect-form input[type="checkbox"]:checked::before { - opacity: 1; - visibility: visible; - transition: 0.2s linear all; - transform: scale(1); - } - - .hubwoo_listwork_img { - max-width: 30px; - vertical-align: middle; - } - /*====end======*/ - -/*======================================= -= connect-section = -=======================================*/ -.hubwoo-connection-info { - display: flex; - flex-wrap: wrap; - justify-content: space-between; -} -.hubwoo-connection { - background-color: #ffffff; - border-radius: 8px; - box-shadow: 0px 5px 20px 0px rgba(70, 46, 46, 0.2); - flex: 0 0 30%; - margin-top: 25px; - max-width: 30%; - padding: 40px 20px 40px 20px; - position: relative; - text-align: center; - word-wrap: break-word; - z-index: 5; -} -.hubwoo-connection:hover { - box-shadow: 0px 1px 20px 0px rgba(70, 46, 46, 0.35); -} -/*========end===============*/ - -/*======================================= -= setup-section = -=======================================*/ - -.hubwoo-form-wizard-link-disabled { - pointer-events: none; -} - -.hubwoo-form-wizard-wrapper .hubwoo-form-wizardmove-button { - position: absolute; - width: 0px; /* tab width*/ - left: 0; - top: -4px; - bottom: -4px; - border-radius: 0; - background-color: #FF7A59; - -webkit-transition: all 0.5s cubic-bezier(0.29, 1.42, 0.79, 1) 0s; - -moz-transition: all 0.5s cubic-bezier(0.29, 1.42, 0.79, 1) 0s; - -ms-transition: all 0.5s cubic-bezier(0.29, 1.42, 0.79, 1) 0s; - -o-transition: all 0.5s cubic-bezier(0.29, 1.42, 0.79, 1) 0s; - transition: all 0.5s cubic-bezier(0.29, 1.42, 0.79, 1) 0s; - -webkit-box-shadow: 0 16px 26px -10px rgba(244, 67, 54, 0.56), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(244, 67, 54, 0.2); - -moz-box-shadow: 0 16px 26px -10px rgba(244, 67, 54, 0.56), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(244, 67, 54, 0.2); - -ms-box-shadow: 0 16px 26px -10px rgba(244, 67, 54, 0.56), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(244, 67, 54, 0.2); - -o-box-shadow: 0 16px 26px -10px rgba(244, 67, 54, 0.56), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(244, 67, 54, 0.2); - box-shadow: 0 16px 26px -10px rgba(244, 67, 54, 0.56), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(244, 67, 54, 0.2); -} -.hubwoo-form-wizard-wrapper > ul { - background-color: #DFE3EB; - z-index: 1; - border-radius: 0; - display: flex; - justify-content: center; - position: relative; - margin: 0; - padding: 0; -} -.hubwoo-form-wizard-wrapper > ul > li { - list-style-type: none; - width: 100%; - text-align: center; - display: flex; - margin: 0 0 4px; - justify-content: center; -} -.hubwoo-form-wizard-wrapper > ul > li > a { - display: block; - padding: 10px; - width: 100%; - color: #2d3e50; - text-decoration: none; - outline: none !important; - box-shadow: none !important; -} -.hubwoo-form-wizard-wrapper > ul > li > a.active { - color: #ffffff; -} -.hubwoo-form-wizard-link-disabled { - opacity: .5; - pointer-events: none; -} -.hubwoo-form-wizard-wrapper > ul > li > a:focus{ - outline: 0; -} -.hubwoo-form-wizard-wrapper > ul > li > a > span { - position: relative; - z-index: 1; -} -.hubwoo-form-wizard-wrapper > ul > li.active > a { - background-color: #ffffff; -} -.hubwoo-form-wizard-wrapper .hubwoo-form-wizard-content { - background-color: #ffffff; - padding: 0; - color: #181a25; - position: static; - left: 0; - right: 0; - bottom: 0; - top: 0; - display: block; - margin-bottom: 25px; -} -.hubwoo-form-wizard-wrapper .hubwoo-form-wizard-content.show { - display: block; - transform: translate3d(0px, 0px, 0px); -} -.hubwoo-form-wizard-wrapper .hubwoo-form-wizard-content h6 { - font-size: 18px; - font-weight: bold; - margin: 0 0 10px; -} -.hubwoo-full-wdth .hubwoo__btn { - margin: 0; -} -.grLoader, .grSuccess, .grError, .grToCreate { - position: absolute; - max-width: 70px; - width: 100%; - top: 50%; - right: 9px; - transform: translateY(-50%); - text-align: center; - cursor: pointer; - font-weight: bold; -} -.mwb-woo__accordion-wrapper:hover { - background: #ececec; -} -.mwb-woo__custom-prop .mwb-woo__custom { - padding-bottom: 4px; -} -.mwb-woo__accordion-wrapper:hover .grLoader, .mwb-woo__accordion-wrapper:hover .grSuccess, .mwb-woo__accordion-wrapper:hover .grError, .mwb-woo__accordion-wrapper:hover .grToCreate { - display: inline-block; -} -.hubwoo-cr-btn { - cursor: pointer; - font-weight: bold; - font-size: 13px; -} -.grLoader img, .grSuccess img, .grError img { - max-width:30px; - display: block; - width: auto; - background-color: #EAF0F6; -} -.grSuccess .fa, .grCreateNew .fa { - font-size: 18px; - color: #ff7a59; -} -.grCreateNew .fa { - color: #2e3f51; -} -.listLoader, .listSuccess, .listError { - position: absolute; - right: 20px; - top: 50%; - transform: translateY(-50%); - width: 30px; - padding: 0 !important; -} -.listLoader img, .listSuccess img, .listError img { - max-width: 100%; - display: block; -} -.hubwoo-form-wizard-submit-btn { - cursor: pointer; -} -.hubwoo-form-wizard-submit-btn .hub-gr-props-setup { - background: transparent; - border: none; - color: #fff; -} -.hubwoo-form-wizard-wrapper .hubwoo-form-wizard-content .hubwoo-form-wizard-previous-btn { - background-color: #f1f1f1; - color: #000000; -} -label.hub-pr-created, .hub-pr-create { - position: absolute; - max-width: 15px; - left: -30px; - top: 50%; - transform: translateY(-50%); -} -label.hub-pr-created img, label.hub-pr-created span, label.hub-pr-created, -label.hub-pr-create img, label.hub-pr-create span, label.hub-pr-create { - display: block; -} -label.hub-pr-created img, label.hub-pr-create img { - max-width: 100%; -} -.hubwoo-form-wizard-content-wrapper { - position: relative; -} -.hubwoo-custom-chheckbox input[type="checkbox"]::before { - top: 2px; -} -.hubwoo-fields-created-list table { - border-collapse: collapse; - width: 100%; -} -span.hubwoo-cr-btn.hubwoo-crd-btn { - border: 1px solid; - padding: 6px 13px !important; - display: inline-block; - text-decoration: none; - border-radius: 4px; - max-width: 70px; -} -span.hubwoo-cr-btn.hubwoo-crd-btn:hover { - background: #2e3f51; - color: #fff; -} -.hubwoo-fields-created-list table th { - color: #2d3e50; - text-align: left; - font-weight: bold; - font-size: 18px; - line-height: 40px; -} -.hubwoo-fields-created-list table th, .hubwoo-fields-created-list table td { - font-weight: 600; - padding: 10px 25px; -} -.hubwoo-field-heading-col { - text-align: right; -} -.hubwoo-field-heading-col { - text-align: right; -} -.hubwoo-fields-created .hubwoo_groups { - border-bottom: 1px solid #ddd; - position: relative; -} -.hubwoo-fields-created .hubwoo_groups:hover { - background-color: #ececec !important; -} -.hubwoo-fields-created .hubwoo_groups span { - display: inline-block; - padding-left: 20px; -} -.hubwoo-fields-created .hubwoo-custom-chheckbox { - position: absolute; - top: 45%; - transform: translateY(-50%); -} -#hub-lists-form .hubwoo-fields-created .hubwoo-custom-chheckbox { - top: 8px; - left: 5px; - transform: translateY(0); -} -.hubwoo_groups-content.hubwoo_groups-content--p { - padding-left: 40px !important; - padding-right: 0 !important; -} -.gr_uncreated { - opacity: 0.55; -} -.hubwoo-list-desc { - margin-top: 20px; -} -.hubwoo-fields-created .hubwoo-custom-chheckbox input[type="checkbox"]::before { - top: 10px; -} -label.hubwoo-list-created, .hubwoo-list-create { - font-size: 18px; - position: absolute; - right: 19px; - top: 50%; - transform: translateY(-50%); - width: 70px; - text-align: center; -} -label.hubwoo-list-created span, .hubwoo-list-create span { - padding: 0 !important; - display: block !important; -} -label.hubwoo-list-created img, .hubwoo-list-create img { - max-width: 100%; - display: block; -} -.hubwoo_groups-content, .hubwoo-wf-text { - padding: 0 100px 0 20px; - font-weight: normal; - font-size: 14px; - margin-top: 5px; -} -.hubwoo-wf-text { - padding: 0; -} -.hubwoo-fields-created-list tr { - border-bottom: 1px solid #ddd; -} -.mwb-woo__accordion-wrapper { - padding: 5px 10px; -} -.mwb__accordian-heading-wrap { - padding-left: 30px; - position: relative; -} -.mwb-woo__accordian-heading { - box-shadow: none !important; - color:#2e3f51 !important; - font-weight: bold; - margin-left: 10px; - display: block; - text-decoration: none; - outline: none !important; - padding: 10px 0; -} -.mwb-woo__accordion-content { - padding-left: 45px; -} -li.mwb-woo__custom { - position: relative; -} -ul.mwb-woo__custom-prop { - margin: 0; - padding: 0; - padding-left: 40px; - list-style: none; -} -.mwb-woo__custom .mwb-hub-custom-checkbox { - left: -30px !important; -} -.mwb-hub-custom-checkbox { - padding-left: 0; - position: absolute; - left: 10px; - top: 43%; - transform: translateY(-50%); -} -.mwb-hub-custom-checkbox input[type="checkbox"]::before { - top: 9px; -} -.clearfix:after{ - display: block; - content: ''; - clear: both; -} -.hubwoo-full-wdth{ - width: 100%; -} -.hubwoo-full-wdth { - position: relative; - min-height: 1px; -} -.hubwoo-float-right{ - float: right; - margin: 0!important; -} -.hubwoo-float-left{ - float: left; -} -.hubwoo-form-row { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - margin-right: -15px; - margin-left: -15px; -} -.hubwoo-notice { - padding: 10px; - border-left: 4px solid #ff7a59; - box-shadow: rgba(61, 61, 61, 0.08) 0px 3px 10px 0px; - margin: 35px 0 15px; -} -.hubwoo-log-notice-txt { - display: flex; - align-items: center; - justify-content: space-between; - margin: 0; -} -/*=========end========================*/ - -/*======================================= -= RFM-section = -=======================================*/ -.hubwoo_rfm_settings{ - overflow-y: auto; -} -.hubwoo_rfm_settings table th { - background-color: #253342; - color: #fff !important; - font-size: 16px; -} -.hubwoo_rfm_settings table th p { - color: #ffffff; - margin: 7px 0 0 0; -} -.hubwoo_rfm_settings input[type="number"] { - display: block; -} -/*==========end of RFM section============*/ -/*======================================= -= general setting = -=======================================*/ - - -.hubwoo-general-settings, .hubwoo-advanced-settings__form-wrap, -#hubwoo-ocs-form { - margin-bottom: 0; - padding: 0; - overflow: hidden; -} -.hubwoo-general-settings form h2, .hubwoo-advanced-settings__form-wrap h2, -#hubwoo-ocs-form h2 { - margin: 0; - font-size: 20px; - color: #2D3E50; - line-height: 1.6; -} -#hubwoo-selected-user-roles ~ .select2.select2-container { - min-width: 300px; - padding: 4px; -} -.hubwoo-general-settings form label { - min-width: 180px; - display: inline-block; -} -.hubwoo-general-settings input[type="text"], -.hubwoo-general-settings input[type="number"], -.hubwoo-general-settings select, -.hubwoo-advanced-settings select, -#hubwoo-ocs-form input[type="text"], -#hubwoo-ocs-form input[type="number"], -#hubwoo-ocs-form select { - padding: 10px; - border-radius: 4px; - min-width: 300px; - height: auto; - box-shadow: rgba(61, 61, 61, 0.08) 0px 3px 10px 0px; -} -#hubwoo_ecomm_order_ocs_status { - width:100%; -} -#reset-deal-stages{ - padding: inherit; -} - -.deal-sync_progress{ - margin: 0px 25px 0px 0px !important; - width: 88%; -} -.redirect-link{ - text-decoration: none !important; -} -#deals-save-message { -} -/*===== End of general setting ======*/ - -/*======================================= -= Hubspot Deals = -=======================================*/ -.hubwoo-group-wrap__deal_notice { - display: flex; - flex-wrap: wrap; - align-items: center; - margin: 20px 0; - padding: 10px 15px; - color: #2d3e50; - font-weight: 600; - border-left: 2px solid #fd8567; - box-shadow: rgba(61, 61, 61, 0.08) 0px 3px 10px 0px; -} -select#hubwoo_ecomm_order_ocs_status ~ .select2-container { - width: 100% !important; -} - -.stop-ecomm-sync{ -float: right; - margin-left: 10px; - padding: 2px 0px; -} - -#reset-deal-stages{ - padding: inherit; -} - -.deal-sync_progress{ - margin: 0px 25px 0px 0px !important; - width: 88%; -} -.redirect-link{ - text-decoration: none !important; -} -#deals-save-message { - display: flex; - align-items: center; -} -.psync_desc{ - display: block; - margin-bottom: 10px; - width: 70%; -} -.hubwoo-group-wrap__deal_notice p { - margin: 0 10px 0 0; - font-size: 16px; -} -.hubwoo-group-wrap__deal_notice .hubwoo__btn { - padding: 8px 10px; - width: auto; - min-width: auto; - margin: 0; - font-size: 10px; - line-height: normal; -} -.manage-ocs-bar { - display: flex; - align-items: flex-start; -} - -table.hubwoo-deals-stages-conf-table { - table-layout: fixed; -} -th.hubwoo-deal-wrap-con__thead { - width: 240px !important; -} -table.hubwoo-deals-stages-conf-table.form-table th { - width: 100%; -} -.hubwoo-deals-multiselect ~ .select2 { - width: 100% !important; -} -#hubwoo_real_time_deal_settings > h2, #hubwoo_deals_ocs_form > h2 { - display: none; -} -.mwb-heb-setup-content { - padding: 0 0 20px; - margin: 0 auto; - position: relative; -} -.mwb-heb-setup-content .dashicons { - color: #cccccc; - font-size: 80px; - height: auto; - width: auto; - display: none; -} -.mwb-heb-setup-content { - position: relative; -} - -.mwb-heb-setup-box { - flex: 0 0 38%; - padding: 15px; - position: relative; - opacity: 1; - background-color: #f6f6f6; - z-index: 55; - -} -.mwb-heb-setup-progress { - display: flex; - align-items: center; - margin-bottom: 0; - padding: 20px 20px 10px; - background: #f6f6f6; -} -.mwb-heb-setup-pregress__number { - - margin-right: 40px; -} -.mwb-heb-setup-pregress__number span { - display: inline-block; - height: 30px; - width: 30px; - text-align: center; - line-height: 30px; - color: #2D3E50; - font-weight: bold; - font-size: 14px; - margin-right: 5px; - border: 1px solid #2D3E50; - border-radius: 50%; -} -.hubwoo-list-desc__notice-sec p { - margin-bottom: 5px; - padding: 8px 10px; - background: #f2f2f2; - display: flex; - align-items: center; -} -.mwb-heb-setup-pregress__number.done span { - color: #fff; - background: #ff7a59; - border-color: #ff7a59; -} -form#hubwoo-ocs-form > div { - padding: 15px 25px 0; -} -.mwb-heb-setup-box:after { - background: rgba(232, 232, 232, 0.38); - bottom: 0; - content: ""; - height: 100%; - left: 0; - position: absolute; - right: 0; - top: 0; - width: 100%; - z-index: 66; -} -.mwb-heb-setup-box.active { - filter: blur(0); - pointer-events: unset; - opacity: 1; - position: relative; - z-index: 55; -} -.mwb-heb-setup-box.active:after { - display: none; -} -.mwb-heb-setup-title { - font-weight: bold; - font-size: 20px; - line-height: 28px; - margin-bottom: 9px; -} -.mwb-heb-setup-text { - color: #181a25; - font-size: 16px; - line-height: 1.6; - margin: 0 0 15px; -} -.mwb-heb-gbtn:hover { - color: #ffffff; -} -.mwb-heb-gbtn:focus { - outline: 0; -} -.mwb-heb-setup__info { - display: flex; - flex-wrap: wrap; - justify-content: center; - margin-bottom: 20px; - position: relative; -} -.mwb-heb__info-icon { - color: #354558 !important; - font-size: 40px !important; -} -.mwb-heb-setup__info .dashicons:hover + .mwb-heb-setup__info-content { - display: block; -} -.mwb-heb-setup__info-content { - background: #2d3e52; - border: 1px solid #2d3e52; - border-radius: 5px; - bottom: calc( 100% + 6px); - color: #fff; - display: none; - padding: 5px; - position: absolute; - text-align: center; - font-size: 15px; -} -.mwb-heb-setup__info-content:after { - bottom: -9px; - border-left: 8px solid transparent; - border-right: 8px solid transparent; - border-top: 8px solid #2d3e52; - content: ""; - height: 0; - left: 0; - margin: 0 auto; - position: absolute; - right: 0; - width: 0; -} -.mwb-heb-setup__success { - background: #63b36d; - border-radius: 50%; - color: #ffffff; - display: none; - height: 35px; - margin: 0 auto 20px; - max-width: 35px; - text-align: center; -} -.mwb-heb__success-icon { - color: #ffffff !important; - display: inline-block; - font-size: 30px !important; - margin-top: 4px; -} -.mwb-heb-setup-box.completed .mwb-heb-setup__success { - display: block; -} -.mwb-heb-setup-box.completed .mwb-heb-setup__info { - display: none; -} -.mwb-heb-setup-box.completed + .dashicons { - color: #63b36d; -} -.deal-progress{ - width: 80%; - display: none !important; -} -#hubwoo_ecomm_won_stages ~ .select2.select2-container.select2-container--default { - width: 100% !important; -} -.hubwoo_update_pipelines{ - margin: 20px; - text-decoration: none; - color: #000; - cursor: pointer; -} - -/*===== End of hubspot deals ======*/ - -/*======================================= -= advance setting = -=======================================*/ -.hubwoo-advanced-settings table { - table-layout: fixed; -} -.hubwoo-advanced-settings table th { - padding: 15px 10px; - vertical-align: middle; -} -.hubwoo-advanced-settings select { - min-width: auto; - width: 100%; -} -.order-list-rule-rem { - cursor: pointer; -} -.hubwoo-dib-w { - min-width: 220px; - display: inline-block; -} -#hubwoo_pro_upgrade, #hubwoo_pro_up_date { - vertical-align: middle; - padding: 1px 13px !important; - min-width: 90px !important; - margin-right: 0 !important; - margin-left: 15px; -} -.hubwoo-add-more-workflow-actions, .hubwoo-add-more-list-actions { - padding: 15px 10px 0; -} -/*===== End of advance setting ======*/ - -/*======================================= -= error-section = -=======================================*/ -.hubwoo-error-navs a { - text-decoration: none; - padding: 3px 10px; - display: inline-block; - border-bottom: 1px solid #2D3E50; - color: #2D3E50; - margin-left: 41px; - font-weight: bold; -} -.hubwoo-error-navs { - text-align: center; - margin: 60px 0 10px; -} -.hubwoo-error-navs a:first-child { - margin: 0; -} -.hubwoo-error-navs a.active { - color: #ff7a59; - border-bottom: 1px solid #ff7a59; -} -#hubwoo-pro-email-logs{ - margin: 0 0 0 15px!important; -} -.hubwoo-extn-status img { - max-width: 34px; - margin-left: 10px; -} -.hubwoo-log-viewer #log-viewer { - height: 250px; - overflow-y: auto; - margin-top: 25px; - background-color: #F5F8FA; -} -.hubwoo-notice-sym { - animation: pulse 1s infinite; - display: inline-block; - height: 20px; - width: 20px; - text-align: center; - border: 1px solid #ff5353; - line-height: 14px; - border-radius: 50%; -} -.hubwoo-notice-sym span { - height: 8px; - width: 8px; - background: #ff5353; - border-radius: 50%; - display: inline-block; -} -@-webkit-keyframes pulse { - 0% { - -webkit-box-shadow: 0 0 0 0 rgba(255,83,83, 0.4); - } - 70% { - -webkit-box-shadow: 0 0 0 10px rgba(255,83,83, 0); - } - 100% { - -webkit-box-shadow: 0 0 0 0 rgba(255,83,83, 0); - } -} -@keyframes pulse { - 0% { - -moz-box-shadow: 0 0 0 0 rgba(255,83,83, 0.4); - box-shadow: 0 0 0 0 rgba(255,83,83, 0.4); - } - 70% { - -moz-box-shadow: 0 0 0 10px rgba(255,83,83, 0); - box-shadow: 0 0 0 10px rgba(255,83,83, 0); - } - 100% { - -moz-box-shadow: 0 0 0 0 rgba(255,83,83, 0); - box-shadow: 0 0 0 0 rgba(255,83,83, 0); - } -} - -@-webkit-keyframes pulsesuccess { - 0% { - -webkit-box-shadow: 0 0 0 0 rgba(56,165,56, 0.4); - } - 70% { - -webkit-box-shadow: 0 0 0 10px rgba(56,165,56, 0); - } - 100% { - -webkit-box-shadow: 0 0 0 0 rgba(56,165,56, 0); - } -} -@keyframes pulsesuccess { - 0% { - -moz-box-shadow: 0 0 0 0 rgba(56,165,56, 0.4); - box-shadow: 0 0 0 0 rgba(56,165,56, 0.4); - } - 70% { - -moz-box-shadow: 0 0 0 10px rgba(56,165,56, 0); - box-shadow: 0 0 0 10px rgba(56,165,56, 0); - } - 100% { - -moz-box-shadow: 0 0 0 0 rgba(56,165,56, 0); - box-shadow: 0 0 0 0 rgba(56,165,56, 0); - } -} -.hubwoo-error-info { - display: flex; - flex-wrap: wrap; - justify-content: space-between; -} -.hubwoo-error { - box-shadow: rgba(61, 61, 61, 0.17) 0px 3px 10px 0; - display: flex; - flex-direction: column; - flex: 0 0 31%; - justify-content: center; - margin-top: 25px; - padding: 20px 15px; - text-align: left; - width: 100%; - word-wrap: break-word; -} -.hubwoo-error .hubwoo-total-calls, .hubwoo-success-calls, .hubwoo-failed-calls, -.hubwoo-success-calls,.hubwoo-failed-calls{ - font-size: 20px!important; - font-weight: bold; - margin: 0 0 5px; - color: #2b5d89; -} -.hubwoo-error .hubwoo-success-calls{ - color: #38a538; -} -.hubwoo-error .hubwoo-failed-calls{ - color: #ff5353; -} -.hubwoo-error .hubwoo-error-text{ - font-size: 16px; - margin: 0; -} - -/*===== End of error-section ======*/ - -/*===================================== -= one cick sync = -=====================================*/ - -select#hubwoo_customers_role_settings ~ .select2-container { - width: 90% !important; -} -.hubwoo-ocs-notice-wrap .hubwoo-ocs-options { - font-size: 16px;, - display: flex; - align-items: center; - margin-bottom: 10px; - justify-content: space-between; -} -.hubwoo-ocs-notice-wrap > div a.hubwoo__btn { - padding: 5px 10px; - margin: 0; -} -.hubwoo-ocs-notice-wrap { - margin: 15px 25px; - padding: 15px; - color: #2d3e50; - font-weight: 600; - border-left: 2px solid #fd8567; - box-shadow: rgba(61, 61, 61, 0.08) 0px 3px 10px 0px; -} -.progress-cover { - margin: 0px 25px; -} -.hubwoo-progress-wrap,#hubwoo-ocs-form table tr:nth-child(3), -#hubwoo-ocs-form table tr:nth-child(4) { - display: none; - margin-top: 10px; -} -.hubwoo-progress-wrap,#hubwoo-ocs-form table tr:nth-child(3), -#hubwoo-ocs-form table tr:nth-child(4) { - display: none; - margin-top: 10px; -} -.hubwoo-progress { - background-color: #EAF0F6; - border-radius: 6px; - display: -ms-flexbox; - display: flex; - font-size: 12px; - height: 32px; - overflow: hidden; -} -.hubwoo-progress-bar { - background-color: #00BDA5; - background-image: linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); - background-size: 15px; - -webkit-animation: progress-bar-stripes 1s linear infinite; - animation: progress-bar-stripes 1s linear infinite; - display: -ms-flexbox; - display: flex; - -ms-flex-direction: column; - flex-direction: column; - -ms-flex-pack: center; - justify-content: center; - color: #fff; - text-align: center; - transition: width .6s ease; - font-size: 20px; -} -.hubwoo-progress-bar.hubwoo-progress-error { - background-color: #F42525; -} -.hubwoo-user-notice { - padding: 10px 17px; - color: #2d3e50; - width: 500px; - font-weight: 600; - font-size: 16px; - border-left: 2px solid #fd8567; - box-shadow: rgba(61, 61, 61, 0.08) 0px 3px 10px 0px; -} -/*===== End of one-click sync ======*/ - -/*===================================== -= HubSpot Deal Page CSS = -=====================================*/ -.form-table th { - margin-bottom: 9px; - padding: 15px 10px; - line-height: 1.3; - vertical-align: middle; -} -.hubwoo_coupons_list .widefat tfoot tr td, .hubwoo_coupons_list .widefat tfoot tr th, .hubwoo_coupons_list .widefat thead tr td, .hubwoo_coupons_list .widefat thead tr th { - padding: 15px 10px; -} -.hubwoo_coupons_list .widefat tfoot tr th, .hubwoo_coupons_list .widefat thead tr th { - background-color: #2D3E50; - color: #ffffff; -} -.hubwoo_oauth_span label { - font-weight: bold; - color: #2D3E50; - display: inline-block; - margin-right: 15px; -} -.hubwoo-common--custom { - display: flex; - align-items: center; - justify-content: space-between; - margin-top: 20px; -} -.hubwoo-common--custom h2, .hubwoo-common--custom .hubwoo__btn { - margin: 0; -} -.hubwoo-connect-form-submit.hubwoo-connect-form--submit p.submit { - margin: 30px 0 0; - padding: 20px 15px; -} -.hubwoo-connect-form-submit.hubwoo-connect-form--submit { - background: #253342; -} - -/*===== End of HubSpot Deal Page CSS ======*/ -/* Card Layout CSS */ - -.hubwoo-box-card .grLoader img, .hubwoo-box-card .grSuccess img, .hubwoo-box-card .grError img { - background: transparent; -} -.hubwoo-box-card .hubwoo-fields-created .hubwoo_groups { - background: transparent; -} -.hubwoo-box-card .hubwoo-common-header h2 { - margin: 0; - line-height: 1.6; -} -.hubwoo-box-card .hubwoo-common-header, .hubwoo-deal-wrap-con .hubwoo-common-header { - margin: 0 0 0; -} -.hubwoo-common-header > h2 > a { - color: #2d3e50; - text-decoration: none; -} -.hubwoo-box-card .mwb-woo__accordion-wrapper { - padding: 0 10px; -} -.hubwoo-box-card .hubwoo-group-wrap__glist .mwb-hub-custom-checkbox { - left: 0px; -} -.hubwoo-btn-cshow__content { - display: none; - width: 100% !important; -} -.hubwoo-btn-cshow__btn { -} -.hubwoo-success__heading { - display: flex; - width: 100%; - justify-content: space-between; - align-items: center; -} -.hubwoo-success__heading img { - max-width: 40px; -} -.hubwoo_oauth_span.hubwoo_auth_section { - margin-bottom: 20px; -} -.hubwoo-strip--button { - padding: 10px; - text-align: center; - background: #253342; -} -.hubwoo_pro_support a i { - margin-right: 9px; - font-size: 18px; -} -.hubwoo_pro_support a { - display: flex; - align-items: center; - justify-content: center; - max-width: 260px; -} -.hubwoo-connect-section__con { - padding-bottom: 25px; - border-bottom: 1px solid #ddd; -} -.hubwoo-connect-section__wrapper .hubwoo-connect-section__con:last-child { - border-bottom: none; -} -.hubwoo-general-setting{ - box-shadow: none; - border-radius: 0; - margin-bottom: 0; - -} -/* End of Card Layout CSS */ - -/* Start of New Setup */ - -.mwb-heb-wlcm__title h2 { - color: #2d3e50; - font-size: 32px; - font-weight: 700; - display: inline-block; - line-height: normal; - margin: 50px 0 0 0; -} -.mwb-heb-wlcm-wrapper, .mwb-heb-setup-wrapper, .mwb-heb-dash-wrapper { - background: #ffffff; - margin: 20px 15px 0 0; - overflow: hidden; - position: relative; - font-size: 18px; - line-height: 1.6; -} -.mwb-heb-wlcm.active { - display: block; - opacity: 1; - z-index: 5; -} -.hubwoo-box { - max-width: 1000px; - margin: 0 auto; -} -.hubwoo-box .hubwoo-deal-wrap-con__store { - display: block; -} -.hubwoo-box th.hubwoo-deal-wrap-con__thead { - width: 320px !important; -} -.mwb-heb-wlcm__content { - padding: 0 15px; -} -.hubwoo-content__para { - margin-bottom: 25px; -} -.mwb-heb-wlcm__content p { - font-size: 16px; - line-height: 25px; - margin: 0 0 15px; - font-weight: 400; - color: #181a25; -} -.hubwoo-content__para p:last-child { - margin: 0; -} -.mwb-heb-wlcm, .mwb-heb-wlcm *, .mwb-heb-setup-wrapper, .mwb-heb-setup-wrapper *, .mwb-heb-dash-wrapper, .mwb-heb-dash-wrapper * { - box-sizing: border-box; -} -.hubwoo-btn--primary { - display: inline-block; - padding: 13px 30px; - text-decoration: none; - background: #ff7a59; - color: #fff!important; - font-size: 11px; - font-weight: 700; - letter-spacing: 1px; - border-radius: 3px; - box-shadow: none!important; - text-transform: uppercase; - border: 2px solid #ff7a59; -} -.hubwoo-btn--secondary { - background-color: #fff; - color: #ff7a59 !important; - border-color: #ff7a59; - margin-left: 20px; -} -.hubwoo-hub-login { - font-size: 14px; - margin: 15px 0 0; -} -.mwb-heb-wlcm { - align-items: center; - color: #181a25; - flex-direction: column; - font-family: 'Nunito Sans', sans-serif; - justify-content: center; - min-height: 464px; - padding: 100px 15px; - width: 100%; - height: 100%; - top: 0; - opacity: 0; - z-index: 1; -} -.mwb-heb-wlcm { - align-items: center; - color: #181a25; - flex-direction: column; - font-family: 'Nunito Sans', sans-serif; - justify-content: center; - min-height: 464px; - padding: 100px 15px; - width: 100%; - height: 100%; - top: 0; - opacity: 0; - z-index: 1; -} -.mwb-heb-wlcm { - align-items: center; - color: #181a25; - flex-direction: column; - font-family: 'Nunito Sans', sans-serif; - justify-content: center; - min-height: 464px; - padding: 100px 15px; - width: 100%; - height: 100%; - top: 0; - opacity: 0; - z-index: 1; -} - -.mwb-heb-wlcm__btn:hover { - color: #fb9772; -} -.hubwoo-hub-login a { - font-weight: bold; - text-decoration: none; - color: #00AFA0 !important; - box-shadow: none !important; -} -.mwb-heb-wlcm__btn--next { - float: right; -} -.hubwoo-connect--img { - max-width: 100px; - margin-left: 15px; - opacity: .85; -} -.mwb-heb-wlcm__title { - padding: 0 15px; - margin-bottom: 20px; -} -.mwb-heb-wlcm__content-link { - margin-top: 30px !important; -} -.mwb-heb-wlcm__btn:hover { - color: #fb9772; -} -a { - color: #0073aa; - transition-property: border,background,color; - transition-duration: .05s; - transition-timing-function: ease-in-out; -} -.mwb-heb-wlcm__btn--previous { - float: left; -} -.mwb-heb-wlcm__btn span { - margin-top: 4px; -} -.hubwoo-group__manage { - display: none; - margin: 30px 0 0; -} -.hubwoo-group__manage-list a { - display: block; - color: #474747; - text-decoration: none; - font-weight: 700; - font-size: 16px; - padding: 10px 0; - box-shadow: none !important; -} - -.hubwoo-progress__bar { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-color: #00AFA0; - height: 10px; - width: 30%; - transition: 0.3s linear all; - -webkit-animation: progress-bar-stripes 1s linear infinite; - -o-animation: progress-bar-stripes 1s linear infinite; - animation: progress-bar-stripes 1s linear infinite; - background-size: 40px 40px; -} -/* End of New Setup */ - -/*============================================= -= Nav Setion CSS = -=============================================*/ -.mwb-heb-wlcm { - padding-top: 30px; -} -.mwb-heb__nav, .mwb-heb__nav * { - box-sizing: border-box; -} - - -/*===== End of Nav Setion CSS ======*/ - -/*================================================ -= Dashboard Section Design = -================================================*/ -.hubwoo-nav ul, .hubwoo-nav ul li { - margin: 0; -} -.hubwoo-discon { - margin-right: 22px; -} -.hubwoo-db-wrap, .hubwoo-db-wrap *, .hubwoo-nav-wrap, .hubwoo-nav-wrap * { - box-sizing: border-box; -} -.hubwoo-disconnect-wrapper { - padding: 10px 40px; -} -.hubwoo-disconnect-wrapper h2 { - font-size: 20px; - display: inline-block; -} -form.hubwoo-disconnect-form label { - font-size: 16px; -} -.hubwoo-discon-btn { - display: block; - margin: 3% 0; -} -.hubwoo-discon-spinner { - display: none; - text-align: center; - margin: 2% 0; -} -.hubwoo-discon-spinner span { - font-size: 32px; -} -.hubwoo-ocs-notice-wrap-error { - margin: 14px 18px 11px 15px; - padding: 9px; - color: #2d3e50; - background: white; - font-weight: 600; - border-left: 4px solid #ff3c0b; - box-shadow: rgba(61, 61, 61, 0.08) 0px 3px 10px 0px; -} -.hubwoo-db-wrap { - font-family: 'Nunito Sans', sans-serif; - padding: 30px 25px 50px; - background: #fff; - margin: 0 15px 0 0; - color: #181a25; -} -.hubwoo-nav-wrap { - background: #fff; - margin: 20px 15px 0 0; - padding: 0; -} -.hubwoo-nav ul { - display: flex; - flex-wrap: wrap; -} -nav.hubwoo-nav li a { - display: inline-block; - padding: 15px 10px; - text-decoration: none; - font-size: 16px; - color: #fff; -} -.hubwoo-nav li:hover,.hubwoo-nav li.active { - background: #1c1a1a; -} -.hubwoo-db__column .hubwoo-db__box { - flex: 0 0 24%; - margin-bottom: 25px; - max-width: 24%; -} -.hubwoo-db__colum-graph { - width: 100%; -} -img.hubwoo-graph-img { - margin: 30px 0 0; - max-width: 490px; -} -.hubwoo-db__column { - flex: 0 0 100%; - display: flex; - flex-wrap: wrap; - justify-content: space-between; -} -.hubwoo-db__row { - display: flex; - flex-wrap: wrap; - justify-content: space-between; -} -.hubwoo-db__box { - flex: 0 0 100%; - max-width: 100%; - border-right: 1px solid #ddd; - padding: 20px 0 23px; - box-shadow: rgba(61, 61, 61, 0.17) 0px 3px 10px 0px; -} -.hubwoo-db__box-full { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - border: 1px solid #dddddd; - padding: 45px 20px; - box-shadow: rgba(61, 61, 61, 0.17) 0px 3px 10px 0px; - width: 100%; - align-items: center; - border-radius: 4px; -} -.hubwoo-db__box-full .hubwoo-db__box-title p span { - color: #999; - margin-left: 10px; -} -.hubwoo-db__box-full .hubwoo-db__box-title h4 { - margin: 0; - font-size: 20px; - text-transform: capitalize; -} -.hubwoo-db__box-full .hubwoo-db__box-title p { - margin: 8px 0 0 0; - text-align: left; -} -.hubwoo-db__box:last-child { - border-right: none; -} - -.hubwoo-db__box-title { - font-size: 20px; - font-weight: 600; - line-height: 1.3; - letter-spacing: 1px; -} - -.hubwoo-db__box.hubwoo-db__box--info .hubwoo-db__box-title { - margin-bottom: 20px; - text-align: center; - color: #2d3e50; -} -.hubwoo-db__row--info__mtitle { - flex: 0 0 100%; - max-width: 100%; - text-align: center; -} -.hubwoo-db__row--info__mtitle h2 { - color: #2d3e50; - font-size: 26px; - font-weight: 700; - margin: 0 0 20px; - line-height: normal; -} -.hubwoo-db__box-content { - text-align: center; - font-size: 50px; - line-height: 1.6; - font-weight: bold; - color: #00AFA0; -} -.hubwoo-db__row--info { - margin-top: 70px; - margin-bottom: 50px; -} -.hubwoo-btn--primary.hubwoo-btn--dashboard { - min-width: 220px; - padding: 15px; - text-align: center; - text-transform: unset; - font-size: 14px; -} -.hubwoo-btn--primary.hubwoo-btn--dashboard.hubwoo-btn--dashboard-chat { - margin-right: 20px; -} -.hubwoo-db__box.hubwoo-db__box--info { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - border: 1px solid #dddddd; - padding: 45px 20px 130px 20px; - margin-bottom: 20px; - box-shadow: rgba(61, 61, 61, 0.17) 0px 3px 10px 0px; - max-width: 31%; - border-radius: 4px; - position: relative; -} -.hubwoo-db__box--infoImg iframe { - width: 100%; -} -.hubwoo-ocs-btn-notice { - display: inline-block; - font-size: 14px; - font-weight: 700; -} -.hubwoo-deal-order-count{ - display: inline-block; - font-size: 16px; - font-weight: bold; - padding: 18px 10px; -} -.hubwoo-db__box--infoImg { - flex: 0 0 15%; - max-width: 15%; -} -.hubwoo-db__box--infoImg img { - max-width: 100%; -} -.hubwoo-db__box-row-content p { - font-size: 16px; - line-height: 1.6; - text-align: center; - margin: 8px 0; -} -.hubwoo-db__box--info .mwb-heb-wlcm__btn-wrap { - text-align: center; - position: absolute; - left: 0; - right: 0; - bottom: 45px; -} -.hubwoo-db__strip--infoCon { - display: flex; - flex-wrap: wrap; - padding: 20px; - border-radius: 4px; - align-items: center; - border: 1px solid #dddddd; - box-shadow: rgba(61, 61, 61, 0.17) 0px 3px 10px 0px; -} -.hubwoo-db__strip-row-content { - flex: 0 0 100%; - margin-right: 10px; - max-width: calc(70% - 5px); -} -.hubwoo-db__strip-row-content p { - margin: 0; - font-size: 14px; - font-weight: 600; -} -.hubwoo-db__strip--infoCon .mwb-heb-wlcm__btn-wrap { - flex: 0 0 100%; - max-width: calc(30% - 5px); - min-width: unset; - text-align: right; -} -.mwb-heb-wlcm { - padding-top: 30px; -} -.mwb-heb__nav, .mwb-heb__nav * { - box-sizing: border-box; -} -nav.mwb-heb__nav { - border-bottom: 1px solid #eee; - margin-top: 0; -} -.mwb-heb__nav-list { - display: flex; - flex-wrap: wrap; - margin: 0 auto; - max-width: 1000px; - padding: 0 20px; -} -.mwb-heb__nav-list-item { - margin: 0; - position: relative; -} - -.mwb-heb__nav-list-item a { - border-bottom: 2px solid transparent; - font-size: 11px; - font-weight: 700; - display: inline-block; - text-decoration: none; - padding: 20px 15px; - color: #939393; - text-transform: uppercase; - position: relative; - z-index: 5; - outline: none !important; - box-shadow: none !important; - text-align: center; - letter-spacing: 1.2px; - pointer-events: none; -} -.mwb-heb__nav-list-item.active .mwb-heb__nav-count { - background-color: #ff7a59; - border-color: #ff7a59; - color: #ffffff; -} -.mwb-heb__nav-list-item.completed .mwb-heb__nav-count { - border-color: #00A4BD; - color: #fff; - background-color: #00A4BD; -} -.mwb-heb__nav-list-item a:hover, .mwb-heb__nav-list-item.completed a, .mwb-heb__nav-list-item.active a { - background-color: #ffffff; - color: #2d3e50; -} -.mwb-heb__nav-list-item.completed a, .mwb-heb__nav-list-item.active a { - pointer-events: unset !important; -} -.mwb-heb__nav-count { - display: inline-block; - height: 25px; - width: 25px; - border: 1px solid; - text-align: center; - line-height: 22px; - border-radius: 50%; - margin-right: 5px; - position: relative; -} -.mwb-heb__nav-list-item.completed .mwb-heb__nav-count::after { - content: "\f00c"; - background-color: #00A4BD; - width: 100%; - position: absolute; - left: 0; - right: 0; - border-radius: 50%; - font-family: FontAwesome; - display: flex; - align-items: center; - justify-content: center; - top: 0; - bottom: 0; -} -/*===== End of Nav Setion CSS ======*/ - - -.hubwoo-db__connection { - padding: 20px 25px; - background: #f7fff1; - font-size: 16px; - line-height: 1.6; - display: flex; - justify-content: space-between; - flex-wrap: wrap; -} -.hubwoo-db__connection-notice { - display: flex; - align-items: center; -} -.hubwoo-db__connection-notice i { - color: #529123; - font-size: 22px; - margin-right: 10px; -} -.hubwoo-db__connection-links a { - text-decoration: none; - font-weight: 600; -} -.hubwoo-db__connection-links { - font-weight: 600; -} -.hubwoo-db-notice-box { - width: 100%; - margin: 0 auto 50px; - display: flex; - justify-content: space-between; - align-items: center; - padding: 10px; - border-left: 2px solid #fd8567; - box-shadow: rgba(61, 61, 61, 0.08) 0px 3px 10px 0px; -} -.hubwoo-db-notice__heading { - font-size: 20px; - line-height: 28px; - text-align: left; - font-weight: 600; - margin-bottom: 10px; -} -.hubwoo-db-notice__blink { - font-weight: 600; - font-size: 16px; - display: flex; - flex-wrap: wrap; - align-items: center; -} -.hubwoo-db-notice__blink .hubwpp-db-notice__link { - background: #eaf8df; - border: 2px solid #fff; - color: #000; - display: inline-block; - font-size: 20px; - margin-left: 10px; - height: 40px; - width: 40px; - text-align: center; - line-height: 40px; - position: relative; - outline: none !important; - box-shadow: none !important; -} -.hubwoo-db-notice__blink .hubwpp-db-notice__link:hover .hubwoo-tooltipp { - display: block; -} -.hubwoo-tooltipp { - position: absolute; - width: 200px; - font-size: 14px; - line-height: 20px; - top: -45px; - background: #515151; - padding: 8px 15px; - color: #fff; - font-weight: 500; - left: 0; - display: none; -} -.hubwoo-tooltipp:after { - content: ""; - position: absolute; - border-left: 8px solid transparent; - height: 8px; - border-top: 8px solid #515151; - border-right: 8px solid transparent; - bottom: -16px; - left: 0; -} -.hubwoo-db-notice__blink img, .hubwoo-db-notice__blink .fa-globe, .hubwoo-db-notice__blink .fa-icon { - display: inline-block; - margin-right: 10px; - font-size: 20px; -} -.hubwoo-m-wrap-c { - padding: 30px 0 50px; - background: #fff; - color: #181a25; -} -.hubwoo-inner-header > div { - margin-bottom: 12px; -} -.hubwoo-db__connection-notice--default .fa-icon { - color: #181a25; -} -.hubwoo-m-wrap-c form h2 { - padding: 0 25px; -} -.hubwoo-m-wrap-c form table th { - padding-left: 25px; -} -.hubwoo-m-wrap-c form .submit { - padding-bottom: 0; - padding-left: 25px; - margin-bottom: 0; -} -.hubwoo-discon { - display: inline-block; - margin-top: 0; - color: #595c5d; - font-weight: 600; - font-size: 14px; - line-height: 1.6; - text-decoration: none; - margin-left: 28px; -} -.hubwoo-db__connection-links .hubwoo__btn { - padding: 7px 11px; - min-width: auto; - margin-right: 9px; -} -.hubwoo-db__connection-links .hubwoo__btn:last-child { - margin-right: 0; -} - - -/*** General Setting ***/ -.hubwoo-btn-cshow__content { - background: #fcfcfc; - color: #2e3f51; - margin-top: 15px; -} -.hubwoo-gs-wrap, .hubwoo-et-wrap { - padding: 30px 25px; - color: #181a25; -} -.hubwoo-gs-wrap--gen .hubwoo-common-header h2, .hubwoo-deal-wrap-con .hubwoo-common-header h2{ - font-size: 20px; - color: #2D3E50; - line-height: 1.6; -} -.hubwoo-deal-wrap-con .hubwoo-common-header h2 { - margin: 0; -} -.hubwoo-gs-wrap--gen .hubwoo-box-card__subtitle, .hubwoo-deal-wrap-con__intro { - font-size: 16px; - line-height: 1.6; - margin-bottom: 8px; -} -.hubwoo-gs-wrap--gen .hubwoo-box-card, .hubwoo-form-wizard-wrapper .hubwoo-form-wizard-content { - padding: 15px 0; - border-bottom: 1px solid #bebebe; - margin-bottom: 0; -} -.hubwoo-setting-heading { - margin-top: 0; - font-size: 28px; - margin-bottom: 10px; -} -.hubwoo-addon-heading { - margin-top: 28px; - font-size: 28px; - margin-bottom: 10px; -} -#hubwoo_create_lists { - margin-bottom: 50px; -} -.hubwoo-gs-wrap--gen .hubwoo-box-card:last-child, .hubwoo-form-wizard-wrapper .hubwoo-form-wizard-content:last-child { - border-bottom: 0; - padding-bottom: 0; -} -.hubwoo-gs-wrap--gen .hubwoo-box-card:first-child, .hubwoo-form-wizard-wrapper .hubwoo-form-wizard-content:first-child { - padding-top: 0; -} -.hubwoo-gs-wrap--gen .hubwoo-box-card:last-child { - margin: 0; -} -.mwb-woo__custom-prop, .mwb__accordian-heading-wrap, .hubwoo-btn-cshow__content .hubwoo-fields-created-list table th { - color: #2e3f51; -} -.mwb-woo__accordian-main-wrapper { - padding: 10px 0; -} -.hubwoo-fields-created .hubwoo_groups { - background: transparent; - padding: 10px 0; - font-weight: bold; -} -.label.hubwoo-list-created { - left: 13px; -} -.hubwoo-m-wrap-c th { - color: #2d3e50; - font-size: 16px; -} - - -/** Advance Setting **/ -.select2-container .select2-selection { - border-radius: 4px !important; -} -.hubwoo-adv-settingg__heading { - line-height: 1.6; - font-size: 20px; - margin: 0; -} -.hubwoo-adv-settingg__content p { - font-size: 16px; - margin: 0 0 10px; - line-height: 1.6; -} - -.hubwoo-adv-settingg__wrapper, .hubwoo-box-n-card, .hubwoo-deal-wrap-con-flex { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - align-items: center; -} -.hubwoo-adv-settingg__con, .hubwoo-box-n-card__content, .hubwoo-deal-wrap-con__h-con { - flex: 0 0 80%; - max-width: 80%; -} -.hubwoo-adv-settingg__btn, .hubwoo-box-n-card__btn, .hubwoo-deal-wrap-con__h-btn { - margin-bottom: 0; - flex: 0 0 17%; - text-align: right; -} -.hubwoo-box-n-card__btn .hubwoo__btn { - margin: 0; -} -.hubwoo-box-n-card .hubwoo-btn-cshow { - flex: 0 0 100%; - max-width: 100%; -} -.hubwoo-adv-settingg__btn a, .hubwoo-deal-wrap-con__h-btn a { - margin: 0; -} -.hubwoo-adv-settingg form > h2 { - display: none; -} -.hubwoo-form-wizard-wrapper { - padding: 30px 25px; -} -.hubwoo_rfm_settings .tablenav.top { - display: none; -} -#hubwoo-rfm-form { - padding-top: 15px !important; -} -.hubwoo-adv-settingg__form { - display: none; - width: 100% !important; -} -.hubwoo-advanced-settings__form-wrap h2 { - font-size: 18px; - padding: 0 10px; -} -#hubwoo-enroll { - padding: 20px !important; - background: #f8f8f8; - width: 100% !important; -} -#hubwoo-enroll .form-table { - background-color: #ffffff; - border: 1px solid #e3e3e3; - border-bottom: none; -} -.hubwoo-adv-table-app-btn { - background: #fff; - padding: 15px 10px; - border: 1px solid #e3e3e3; - border-top: none; -} -form#hubwoo-enroll .submit { - margin-top: 25px; - padding-bottom: 0; - margin-bottom: 5px; -} -#hubwoo-enroll h2 { - margin-bottom: 18px; -} -.hubwoo-advanced-settings__form-wrap { - margin-bottom: 45px; -} -.hubwoo-advanced-settings__form-wrap:last-child { - margin-bottom: 0; -} -form#hubwoo-enroll .submit { - margin-top: 20px; - padding-top: 0; -} -.hubwoo-adv-table-app-btn .hubwoo-add-action { - margin: 0; - padding: 4px 12px; - min-width: 80px; -} -.hubwoo-abncart-setup-form--d th { - padding-left: 0; -} -.connect-list { - list-style: disc; - margin-left: 20px; - font-size: 16px; -} -/** HubSpot Deals **/ -.hubwoo-deal-wrap-con__store { - display: none; -} - -.hubwoo-deal-wrap-con__store td { - padding: 10px; - font-size: 16px; - -} -.hubwoo-deal-wrap-con__store th { - font-weight: 600; -} -.hubwoo-deal-head-form h2 { - display: none; -} - -/** Error Tracking CSS **/ -.hubwoo-et-wrap .hubwoo-connect-form-header h2 { - line-height: 1.6; - margin: 0; - font-size: 20px; -} -.hubwoo-deal-wrap-con__store { - width: 100% !important; -} -.hubwoo-right { - float: right; -} - -.hubwoo-btn--primary.hubwoo-btn--disconnect { - text-align: center; - text-transform: unset; - font-size: 14px; -} -/*================================================ -= End Dashboard Section Design = -=================================================*/ - - - -@media screen and (max-width: 767px) { - .hubwoo-db__box.hubwoo-db__box--info{ - max-width: 100%; - } - .hubwoo-db__strip--infoCon { - justify-content: center; - } - .hubwoo-db__strip-row-content { - margin-bottom: 10px; - } - .hubwoo-db__strip-row-content, - .hubwoo-db__strip--infoCon .mwb-heb-wlcm__btn-wrap { - max-width: 100%; - text-align: center; - } - .hubwoo-btn--primary.hubwoo-btn--dashboard.hubwoo-btn--dashboard-chat { - margin: 20px 0; - } - .hubwoo-db__box-full.box-services { - text-align: center; - } - .hubwoo-btn--primary.hubwoo-btn--dashboard.hubwoo-btn--dashboard-chat { - margin: 20px 0; - } - .hubwoo-btn--primary.hubwoo-btn--dashboard { - min-width: 190px; - padding: 15px 6px; - font-size: 13px; - } -} - -/*========================================= -= Onboarding Section = -==========================================*/ -.hubwoo-onboard-suburb-label{ - margin: 15px 0px; -} -.onboard-spinner { - display: none; - text-align: center; -} -.onboard-spinner span { - font-size: 28px; -} -.hubwoo-onboarding-email__items>span { - font-size:14px; -} -.hubwoo-onboarding-email__body-content { - margin: auto 20%; - max-width: 545px; - padding-top: 10px; -} -.hubwoo-onboard-notice { - padding: 10px 17px; - color: #2d3e50; - font-weight: 600; - font-size: 16px; - border-left: 2px solid #fd8567; - display: none; - box-shadow: rgba(61, 61, 61, 0.08) 0px 3px 10px 0px; -} -.hubwoo-onboarding-email__items label { - display: block; - font-size: 14px; - font-weight: 600; - margin-bottom: 10px; -} -.hubwoo-onboarding-email__items { - margin-bottom: 4%; - position: relative; -} - -.hubwoo-onboarding-email__items .hubwoo-onboard-img { - position: absolute; - top: 55%; - right: -30px; - display: none; -} -.hubwoo-onboarding-email__butttons { - margin-top: 50px; -} -.hubwoo-onboarding-email__butttons { - text-align: center; -} -.hubwoo-form-control { - background-color: #F6F8FA!important; - border: 1px solid #D3DBE5 !important; - display: block; - padding: 10px 19px !important; - width: 100%; - line-height: 1.5 !important; - max-width: 100% !important; -} -.hubwoo-form-control-flname { - background-color: #F6F8FA!important; - border: 1px solid #D3DBE5 !important; - display: block; - padding: 10px 19px !important; - width: 100%; - line-height: 1.5 !important; - max-width: 100% !important; -} -.hubwoo-onboarding-email__items.flname { - display: inline-block; - width: 100%; - max-width: 49%; -} - -.hubwoo_register.hidefield { - display: none; -} - -.hubwoo-onboarding-message { - display: block; - font-size: 14px; - color: #ff0000; -} - -.hubwoo-onboarding-skip--link { - margin-top: 15px; -} -.hubwoo-onboarding-skip--link a { - color: #000000; - text-decoration: none; - font-size: 14px; -} -.hubwoo-nav ul { - position: relative; -} -.hubwoo-nav ul .hubwoo-tabs:last-child { - position: absolute; - right: 26px; -} -.hubwoo-db__counter { - align-items: center; - border-radius: 4px; - border: 1px solid #dddddd; - box-shadow: rgba(61, 61, 61, 0.17) 0px 3px 10px 0px; - margin-top: 70px; - padding: 70px 20px 45px 20px; - text-align: center; - width: 100%; -} -.hubwoo-db__counter-column { - max-width: 31%; - flex: 0 0 31%; -} -.hubwoo-db__counter-title { - font-size: 14px; - color: #000; - font-weight: 600; - text-transform: uppercase; - margin: 0; -} -.hubwoo-db__counter-number { - margin: 0; - font-size: 50px; - line-height: 1.5; - color: #00BDA5!important; - font-weight: normal; -} - -.hubwoo-db__counter-number > a { - color: #00BDA5!important; - text-decoration: none; -} - -.hubwoo-db__counter-desc { - font-size: 14px; - color: #737373; -} - -.hubwoo-db__counter-desc > a { - text-decoration: none; - color: #737373; -} -.hubwoo-db__counter-button { - background-color: #E7E7E7; - border-radius: 5px; - color: #434343; - display: inline-block; - font-size: 14px; - font-style: italic; - padding: 8px 20px; - text-decoration: none; -} -.hubwoo-db__counter-button:hover, -.hubwoo-db__counter-button:focus{ - color: #434343; -} -.hubwoo-db__counter-button--wrap { - margin-top: 50px; -} -.hubwoo-box-card.hubwoo-box-n-card .hubwoo-box-n-card { - flex-grow: 1; -} -.hubwoo-onboard-suburb { - margin-left: 2%; -} -.hubwoo-onboard-suburb p { - font-size: 16px -} -/*===== End of onboarding emails ======*/ - -/*===== Order Edit Page ======*/ -.hubwoo-action-icon { - display: inline-flex; -} -th#hubwoo-deal-sync{ - text-align:center; -} -.hubwoo-deal-sync { - position: relative; -} -.hs-action-active { - display: block; -} -.tooltip { - position: absolute; - border-radius:4px; - padding: 6px 12px; - font-family: arial; - font-size: 11px; - z-index: 55; - text-shadow: 0px 1px 1px #000; - background: #1e1e1e; - color: #f7f7f7; - border-radius: 5px; - max-width: 85px; - text-align: center; -} -.tooltip:before { - content: ''; - position: absolute; - width: 0px; - top: -7px; - display: block; - left: 45%; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #1e1e1e; -} -.hubwoo-contact-ac:before{ - left:70px !important; -} -.hubwoo-deal-ac:before{ - left:110px !important; -} -a.hubwoo-action-icon { - position: relative; -} -.hubwoo-action-tool { - min-width: none!important; - background: #252a2d !important; - color: #ffffff !important; - text-align: center; - font-size: 11px; - left: 0; - right: 0; - padding: 10px 10px!important; -} -.hubwoo-action-tool:before { - content: ''; - position: absolute; - width: 0px; - top: -10px; - display: block; - left: 110px; - border-left: 10px solid transparent; - border-right: 10px solid transparent; - border-bottom: 10px solid #252a2d!important; -} -.hubwoo-action-tool p { - color: #ffffff; - font-size: 12px; -} -a.hubwoo-action-icon > img { - width: 32px; -} - - - -/*deactivation pop-up css codee*/ -/*//deactivation screen*/ -.mwb-g-modal__cover { - background-color: rgba(0, 0, 0, 0.2); - bottom: 0; - display: none; - left: 0; - position: fixed; - right: 0; - top: 0; -} - -.mwb-g-modal__close { - cursor: pointer; - font-size: 24px; - font-weight: 600; - position: absolute; - right: 7px; - top: 3px; - transform: rotate(45deg); -} - -.mwb-g-modal__message { - background-color: #fff; - border-radius: 5px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); - color: #053500; - left: -200%; - max-width: 600px; - min-height: 50px; - padding: 15px 20px; - position: fixed; - text-align: center; - top: 50%; - transform: translate(-50%, -50%); - transition: centre 1.2s linear; - width: 80%; -} - -.show-g_modal_cover { - display: block; -} - -.show-g_modal_message { - left: 50%; -} - -.mwb-g-modal__content__header { - margin: auto; -} - -/* Additional fixes. */ -.mwb-g-modal__content { - margin-bottom: -80px; -} - -.mwb-g-modal iframe { - height: 536px !important; -} - -/*===== End of Order Edit Page ======*/ - - diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/css/index.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/css/index.php deleted file mode 100644 index 0de7bcdd..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/css/index.php +++ /dev/null @@ -1,2 +0,0 @@ - - - - - diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/Documentation.svg b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/Documentation.svg deleted file mode 100644 index 0ecff0eb..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/Documentation.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/Support.svg b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/Support.svg deleted file mode 100644 index 18541242..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/Support.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/checked.png b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/checked.png deleted file mode 100644 index cabbdf37..00000000 Binary files a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/checked.png and /dev/null differ diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/congo.jpg b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/congo.jpg deleted file mode 100644 index 7ce6a51f..00000000 Binary files a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/congo.jpg and /dev/null differ diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/contact.png b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/contact.png deleted file mode 100644 index 3d578576..00000000 Binary files a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/contact.png and /dev/null differ diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/deal.png b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/deal.png deleted file mode 100644 index 07e23b61..00000000 Binary files a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/deal.png and /dev/null differ diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/hubspot-pricing.png b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/hubspot-pricing.png deleted file mode 100644 index 720f5309..00000000 Binary files a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/images/hubspot-pricing.png and /dev/null differ diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/index.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/index.php deleted file mode 100644 index 0de7bcdd..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/index.php +++ /dev/null @@ -1,2 +0,0 @@ -").css({position:"fixed",top:0,left:-1*h(E).scrollLeft(),height:1,width:1, -overflow:"hidden"}).append(h("
").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(h("
").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser,n.__browser);a.oScroll.iBarWidth=n.__browser.barWidth} -function hb(a,b,c,d,e,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;d!==e;)a.hasOwnProperty(d)&&(g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Ea(a,b){var c=n.defaults.column,d=a.aoColumns.length,c=h.extend({},n.models.oColumn,c,{nTh:b?b:H.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},n.models.oSearch,c[d]);ka(a,d,h(b).data())}function ka(a,b,c){var b=a.aoColumns[b], -d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var f=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(fb(c),J(n.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),h.extend(b,c),F(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),F(b,c,"aDataSort"));var g=b.mData,j=S(g),i=b.mRender? -S(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=j(a,b,k,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return N(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone, -b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function $(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Fa(a);for(var c=0,d=b.length;cq[f])d(l.length+q[f],m);else if("string"=== -typeof q[f]){j=0;for(i=l.length;jb&&a[e]--; -1!=d&&c===k&&a.splice(d, -1)}function da(a,b,c,d){var e=a.aoData[b],f,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);c.innerHTML=B(a,b,d,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=Ia(a,e,d,d===k?k:e._aData).data;else{var j=e.anCells;if(j)if(d!==k)g(j[d],d);else{c=0;for(f=j.length;c").appendTo(g));b=0;for(c=l.length;btr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(m.sHeaderTH);h(j).find(">tr>th, >tr>td").addClass(m.sFooterTH);if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);var g=a._iDisplayStart,m=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&!lb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:m;for(j=j?0:g;j",{"class":e?d[0]:""}).append(h("",{valign:"top",colSpan:V(a),"class":a.oClasses.sRowEmpty}).html(c))[0];r(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ka(a),g,m,i]);r(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ka(a),g,m,i]);d=h(a.nTBody);d.children().detach(); -d.append(h(b));r(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function T(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&mb(a);d?ga(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;P(a);a._drawHold=!1}function nb(a){var b=a.oClasses,c=h(a.nTable),c=h("
").insertBefore(c),d=a.oFeatures,e=h("
",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore= -a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,m,l,q,k=0;k")[0];m=f[k+1];if("'"==m||'"'==m){l="";for(q=2;f[k+q]!=m;)l+=f[k+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(m=l.split("."),i.id=m[0].substr(1,m[0].length-1),i.className=m[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;k+=q}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==j&&d.bPaginate&&d.bLengthChange)g=ob(a);else if("f"==j&& -d.bFilter)g=pb(a);else if("r"==j&&d.bProcessing)g=qb(a);else if("t"==j)g=rb(a);else if("i"==j&&d.bInfo)g=sb(a);else if("p"==j&&d.bPaginate)g=tb(a);else if(0!==n.ext.feature.length){i=n.ext.feature;q=0;for(m=i.length;q',j=d.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_", -g):j+g,b=h("
",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("
").addClass(b.sLength);a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",i).val(a._iDisplayLength).on("change.DT",function(){Ra(a,h(this).val());P(a)});h(a.nTable).on("length.dt.DT",function(b,c,d){a=== -c&&h("select",i).val(d)});return i[0]}function tb(a){var b=a.sPaginationType,c=n.ext.pager[b],d="function"===typeof c,e=function(a){P(a)},b=h("
").addClass(a.oClasses.sPaging+b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),k,l=0;for(k=f.p.length;lf&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]} -function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");r(a,null,"processing",[a,b])}function rb(a){var b=h(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),m=h(b[0].cloneNode(!1)),l=b.children("tfoot");l.length||(l=null);i=h("
",{"class":f.sScrollWrapper}).append(h("
",{"class":f.sScrollHead}).css({overflow:"hidden", -position:"relative",border:0,width:d?!d?null:v(d):"100%"}).append(h("
",{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("
",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:!d?null:v(d)}).append(b));l&&i.append(h("
",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:v(d):"100%"}).append(h("
", -{"class":f.sScrollFootInner}).append(m.removeAttr("id").css("margin-left",0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=i.children(),k=b[0],f=b[1],t=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(t.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=t;a.aoDrawCallback.push({fn:la,sName:"scrolling"});return i[0]}function la(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,b=b.iBarWidth, -f=h(a.nScrollHead),g=f[0].style,j=f.children("div"),i=j[0].style,m=j.children("table"),j=a.nScrollBody,l=h(j),q=j.style,t=h(a.nScrollFoot).children("div"),n=t.children("table"),o=h(a.nTHead),p=h(a.nTable),s=p[0],r=s.style,u=a.nTFoot?h(a.nTFoot):null,x=a.oBrowser,U=x.bScrollOversize,Xb=D(a.aoColumns,"nTh"),Q,L,R,w,Ua=[],y=[],z=[],A=[],B,C=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};L=j.scrollHeight>j.clientHeight;if(a.scrollBarVis!== -L&&a.scrollBarVis!==k)a.scrollBarVis=L,$(a);else{a.scrollBarVis=L;p.children("thead, tfoot").remove();u&&(R=u.clone().prependTo(p),Q=u.find("tr"),R=R.find("tr"));w=o.clone().prependTo(p);o=o.find("tr");L=w.find("tr");w.find("th, td").removeAttr("tabindex");c||(q.width="100%",f[0].style.width="100%");h.each(ra(a,w),function(b,c){B=aa(a,b);c.style.width=a.aoColumns[B].sWidth});u&&I(function(a){a.style.width=""},R);f=p.outerWidth();if(""===c){r.width="100%";if(U&&(p.find("tbody").height()>j.offsetHeight|| -"scroll"==l.css("overflow-y")))r.width=v(p.outerWidth()-b);f=p.outerWidth()}else""!==d&&(r.width=v(d),f=p.outerWidth());I(C,L);I(function(a){z.push(a.innerHTML);Ua.push(v(h(a).css("width")))},L);I(function(a,b){if(h.inArray(a,Xb)!==-1)a.style.width=Ua[b]},o);h(L).height(0);u&&(I(C,R),I(function(a){A.push(a.innerHTML);y.push(v(h(a).css("width")))},R),I(function(a,b){a.style.width=y[b]},Q),h(R).height(0));I(function(a,b){a.innerHTML='
'+z[b]+"
";a.childNodes[0].style.height= -"0";a.childNodes[0].style.overflow="hidden";a.style.width=Ua[b]},L);u&&I(function(a,b){a.innerHTML='
'+A[b]+"
";a.childNodes[0].style.height="0";a.childNodes[0].style.overflow="hidden";a.style.width=y[b]},R);if(p.outerWidth()j.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(U&&(j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")))r.width=v(Q-b);(""===c||""!==d)&&K(a,1,"Possible column misalignment",6)}else Q="100%";q.width=v(Q); -g.width=v(Q);u&&(a.nScrollFoot.style.width=v(Q));!e&&U&&(q.height=v(s.offsetHeight+b));c=p.outerWidth();m[0].style.width=v(c);i.width=v(c);d=p.height()>j.clientHeight||"scroll"==l.css("overflow-y");e="padding"+(x.bScrollbarLeft?"Left":"Right");i[e]=d?b+"px":"0px";u&&(n[0].style.width=v(c),t[0].style.width=v(c),t[0].style[e]=d?b+"px":"0px");p.children("colgroup").insertBefore(p.children("thead"));l.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop=0}}function I(a,b,c){for(var d=0,e=0, -f=b.length,g,j;e").appendTo(j.find("tbody"));j.find("thead, tfoot").remove();j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());j.find("tfoot th, tfoot td").css("width","");m=ra(a,j.find("thead")[0]);for(n=0;n").css({width:o.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(n=0;n").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(j).appendTo(k);f&&g?j.width(g):f?(j.css("width","auto"),j.removeAttr("width"),j.width()").css("width",v(a)).appendTo(b||H.body),d=c[0].offsetWidth;c.remove();return d}function Fb(a, -b){var c=Gb(a,b);if(0>c)return null;var d=a.aoData[c];return!d.nTr?h("").html(B(a,c,b,"display"))[0]:d.anCells[b]}function Gb(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;fd&&(d=c.length,e=f);return e}function v(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function X(a){var b,c,d=[],e=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var m=[];f=function(a){a.length&& -!h.isArray(a[0])?m.push(a):h.merge(m,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;ae?1:0,0!==c)return"asc"===j.dir?c:-c;c=d[a];e=d[b];return ce?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,n=f[a]._aSortData,o=f[b]._aSortData;for(j=0;jg?1:0})}a.bSorted=!0}function Ib(a){for(var b,c,d=a.aoColumns,e=X(a),a=a.oLanguage.oAria,f=0,g=d.length;f/g,"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0e?e+1:3));e=0;for(f=d.length;ee?e+1:3))}a.aLastSort=d}function Hb(a,b){var c=a.aoColumns[b],d=n.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ba(a,b)));for(var f,g=n.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j=f.length?[0,c[1]]:c)}));b.search!==k&&h.extend(a.oPreviousSearch,Bb(b.search));if(b.columns){d=0;for(e=b.columns.length;d=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Na(a,b){var c=a.renderer,d=n.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"=== -typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ia(a,b){var c=[],c=Kb.numbers_length,d=Math.floor(c/2);b<=c?c=Y(0,b):a<=d?(c=Y(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=Y(b-(c-2),b):(c=Y(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function Da(a){h.each({num:function(b){return za(b,a)},"num-fmt":function(b){return za(b,a,Ya)},"html-num":function(b){return za(b, -a,Aa)},"html-num-fmt":function(b){return za(b,a,Aa,Ya)}},function(b,c){x.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(x.type.search[b+a]=x.type.search.html)})}function Lb(a){return function(){var b=[ya(this[n.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return n.ext.internal[a].apply(this,b)}}var n=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new s(ya(this[x.iApiIndex])):new s(this)}; -this.fnAddData=function(a,b){var c=this.api(!0),d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return d.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===k||a?b.draw(!1):(""!==d.sX||""!==d.sY)&&la(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a, -b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===k||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b||b===k?e.search(a,c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==d||"th"==d?c.cell(a,b).data(): -c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]}; -this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return ya(this[x.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===k||e)&&h.columns.adjust(); -(d===k||d)&&h.draw();return 0};this.fnVersionCheck=x.fnVersionCheck;var b=this,c=a===k,d=this.length;c&&(a={});this.oApi=this.internal=x.internal;for(var e in n.ext.internal)e&&(this[e]=Lb(e));this.each(function(){var e={},g=1").appendTo(q)); -p.nTHead=b[0];b=q.children("tbody");b.length===0&&(b=h("").appendTo(q));p.nTBody=b[0];b=q.children("tfoot");if(b.length===0&&a.length>0&&(p.oScroll.sX!==""||p.oScroll.sY!==""))b=h("").appendTo(q);if(b.length===0||b.children().length===0)q.addClass(u.sNoFooter);else if(b.length>0){p.nTFoot=b[0];ea(p.aoFooter,p.nTFoot)}if(g.aaData)for(j=0;j/g,Zb=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,$b=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Ya=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkÉΞ]/gi,M=function(a){return!a||!0===a||"-"===a?!0:!1},Nb=function(a){var b=parseInt(a,10);return!isNaN(b)&& -isFinite(a)?b:null},Ob=function(a,b){Za[b]||(Za[b]=RegExp(Qa(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Za[b],"."):a},$a=function(a,b,c){var d="string"===typeof a;if(M(a))return!0;b&&d&&(a=Ob(a,b));c&&d&&(a=a.replace(Ya,""));return!isNaN(parseFloat(a))&&isFinite(a)},Pb=function(a,b,c){return M(a)?!0:!(M(a)||"string"===typeof a)?null:$a(a.replace(Aa,""),b,c)?!0:null},D=function(a,b,c){var d=[],e=0,f=a.length;if(c!==k)for(;ea.length)){b=a.slice().sort();for(var c=b[0],d=1,e=b.length;d")[0],Wb=va.textContent!==k,Yb= -/<.*?>/g,Oa=n.util.throttle,Rb=[],w=Array.prototype,ac=function(a){var b,c,d=n.settings,e=h.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,e),-1!==b?[d[b]]:null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,e);return-1!==b?d[b]:null}).toArray()};s=function(a,b){if(!(this instanceof -s))return new s(a,b);var c=[],d=function(a){(a=ac(a))&&(c=c.concat(a))};if(h.isArray(a))for(var e=0,f=a.length;ea?new s(b[a],this[a]):null},filter:function(a){var b=[];if(w.filter)b=w.filter.call(this,a,this);else for(var c=0,d=this.length;c").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=V(d),e.push(c[0]))};f(a,b);c._details&&c._details.detach();c._details=h(e); -c._detailsShow&&c._details.insertAfter(c.nTr)}return this});o(["row().child.show()","row().child().show()"],function(){Tb(this,!0);return this});o(["row().child.hide()","row().child().hide()"],function(){Tb(this,!1);return this});o(["row().child.remove()","row().child().remove()"],function(){db(this);return this});o("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var bc=/^([^:]+):(name|visIdx|visible)$/,Ub=function(a,b, -c,d,e){for(var c=[],d=0,f=e.length;d=0?b:g.length+b];if(typeof a==="function"){var e=Ba(c,f);return h.map(g,function(b,f){return a(f,Ub(c,f,0,0,e),i[f])?f:null})}var k=typeof a==="string"?a.match(bc): -"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var n=h.map(g,function(a,b){return a.bVisible?b:null});return[n[n.length+b]]}return[aa(c,b)];case "name":return h.map(j,function(a,b){return a===k[1]?b:null});default:return[]}if(a.nodeName&&a._DT_CellIndex)return[a._DT_CellIndex.column];b=h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray();if(b.length||!a.nodeName)return b;b=h(a).closest("*[data-dt-column]");return b.length?[b.data("dt-column")]:[]},c,f)}, -1);c.selector.cols=a;c.selector.opts=b;return c});u("columns().header()","column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});u("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});u("columns().data()","column().data()",function(){return this.iterator("column-rows",Ub,1)});u("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData}, -1)});u("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return ja(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});u("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ja(a.aoData,e,"anCells",b)},1)});u("columns().visible()","column().visible()",function(a,b){var c=this.iterator("column",function(b,c){if(a===k)return b.aoColumns[c].bVisible;var f=b.aoColumns,g=f[c],j=b.aoData, -i,m,l;if(a!==k&&g.bVisible!==a){if(a){var n=h.inArray(!0,D(f,"bVisible"),c+1);i=0;for(m=j.length;id;return!0};n.isDataTable= -n.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;if(a instanceof n.Api)return!0;h.each(n.settings,function(a,e){var f=e.nScrollHead?h("table",e.nScrollHead)[0]:null,g=e.nScrollFoot?h("table",e.nScrollFoot)[0]:null;if(e.nTable===b||f===b||g===b)c=!0});return c};n.tables=n.fnTables=function(a){var b=!1;h.isPlainObject(a)&&(b=a.api,a=a.visible);var c=h.map(n.settings,function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable});return b?new s(c):c};n.camelToHungarian=J;o("$()",function(a,b){var c= -this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){o(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0]=h.map(a[0].split(/\s/),function(a){return!a.match(/\.dt\b/)?a+".dt":a}).join(" ");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});o("clear()",function(){return this.iterator("table",function(a){oa(a)})});o("settings()",function(){return new s(this.context,this.context)});o("init()",function(){var a= -this.context;return a.length?a[0].oInit:null});o("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});o("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(e),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),o;b.bDestroying=!0;r(b,"aoDestroyCallback","destroy",[b]);a||(new s(b)).columns().visible(!0);k.off(".DT").find(":not(tbody *)").off(".DT"); -h(E).off(".DT-"+b.sInstance);e!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&e!=j.parentNode&&(i.children("tfoot").detach(),i.append(j));b.aaSorting=[];b.aaSortingFixed=[];wa(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);f.children().detach();f.append(l);g=a?"remove":"detach";i[g]();k[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),i.css("width",b.sDestroyWidth).removeClass(d.sTable), -(o=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%o])}));c=h.inArray(b,n.settings);-1!==c&&n.settings.splice(c,1)})});h.each(["column","row","cell"],function(a,b){o(b+"s().every()",function(a){var d=this.selector.opts,e=this;return this.iterator(b,function(f,g,h,i,m){a.call(e[b](g,"cell"===b?h:d,"cell"===b?d:k),g,h,i,m)})})});o("i18n()",function(a,b,c){var d=this.context[0],a=S(a)(d.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]: -a._);return a.replace("%d",c)});n.version="1.10.18";n.settings=[];n.models={};n.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};n.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};n.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null, -sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};n.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1, -bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+ -a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"}, -oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({}, -n.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};Z(n.defaults);n.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null}; -Z(n.defaults.column);n.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[], -aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button", -iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==y(this)?1*this._iRecordsTotal: -this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==y(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};n.ext=x={buttons:{}, -classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:n.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:n.version};h.extend(x,{afnFiltering:x.search,aTypes:x.type.detect,ofnSearch:x.type.search,oSort:x.type.order,afnSortData:x.order,aoFeatures:x.feature,oApi:x.internal,oStdClasses:x.classes,oPagination:x.pager}); -h.extend(n.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled", -sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"", -sJUIHeader:"",sJUIFooter:""});var Kb=n.ext.pager;h.extend(Kb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){return[ia(a,b)]},simple_numbers:function(a,b){return["previous",ia(a,b),"next"]},full_numbers:function(a,b){return["first","previous",ia(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",ia(a,b),"last"]},_numbers:ia,numbers_length:7});h.extend(!0,n.ext.renderer,{pageButton:{_:function(a,b,c,d,e, -f){var g=a.oClasses,j=a.oLanguage.oPaginate,i=a.oLanguage.oAria.paginate||{},m,l,n=0,o=function(b,d){var k,s,u,r,v=function(b){Ta(a,b.data.action,true)};k=0;for(s=d.length;k").appendTo(b);o(u,r)}else{m=null;l="";switch(r){case "ellipsis":b.append('');break;case "first":m=j.sFirst;l=r+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":m=j.sPrevious;l=r+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":m= -j.sNext;l=r+(e",{"class":g.sPageButton+" "+l,"aria-controls":a.sTableId,"aria-label":i[r],"data-dt-idx":n,tabindex:a.iTabIndex,id:c===0&&typeof r==="string"?a.sTableId+"_"+r:null}).html(m).appendTo(b);Wa(u,{action:r},v);n++}}}},s;try{s=h(b).find(H.activeElement).data("dt-idx")}catch(u){}o(h(b).empty(),d);s!==k&&h(b).find("[data-dt-idx="+ -s+"]").focus()}}});h.extend(n.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return $a(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&!Zb.test(a))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||M(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return $a(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Pb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Pb(a,c,!0)?"html-num-fmt"+c:null},function(a){return M(a)|| -"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(n.ext.type.search,{html:function(a){return M(a)?a:"string"===typeof a?a.replace(Mb," ").replace(Aa,""):""},string:function(a){return M(a)?a:"string"===typeof a?a.replace(Mb," "):a}});var za=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Ob(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(x.type.order,{"date-pre":function(a){a=Date.parse(a);return isNaN(a)?-Infinity:a},"html-pre":function(a){return M(a)? -"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return M(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return ab?1:0},"string-desc":function(a,b){return ab?-1:0}});Da("");h.extend(!0,n.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc: -c.sSortingClass)}})},jqueryui:function(a,b,c,d){h("
").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(h[e]== -"asc"?d.sSortJUIAsc:h[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});var Vb=function(a){return"string"===typeof a?a.replace(//g,">").replace(/"/g,"""):a};n.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return Vb(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g, -a)+f+(e||"")}}},text:function(){return{display:Vb}}};h.extend(n.ext.internal,{_fnExternApiFunc:Lb,_fnBuildAjax:sa,_fnAjaxUpdate:lb,_fnAjaxParameters:ub,_fnAjaxUpdateDraw:vb,_fnAjaxDataSrc:ta,_fnAddColumn:Ea,_fnColumnOptions:ka,_fnAdjustColumnSizing:$,_fnVisibleToColumnIndex:aa,_fnColumnIndexToVisible:ba,_fnVisbleColumns:V,_fnGetColumns:ma,_fnColumnTypes:Ga,_fnApplyColumnDefs:ib,_fnHungarianMap:Z,_fnCamelToHungarian:J,_fnLanguageCompat:Ca,_fnBrowserDetect:gb,_fnAddData:O,_fnAddTr:na,_fnNodeToDataIndex:function(a, -b){return b._DT_RowIndex!==k?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:B,_fnSetCellData:jb,_fnSplitObjNotation:Ja,_fnGetObjectDataFn:S,_fnSetObjectDataFn:N,_fnGetDataMaster:Ka,_fnClearTable:oa,_fnDeleteIndex:pa,_fnInvalidate:da,_fnGetRowElements:Ia,_fnCreateTr:Ha,_fnBuildHead:kb,_fnDrawHead:fa,_fnDraw:P,_fnReDraw:T,_fnAddOptionsHtml:nb,_fnDetectHeader:ea,_fnGetUniqueThs:ra,_fnFeatureHtmlFilter:pb,_fnFilterComplete:ga,_fnFilterCustom:yb, -_fnFilterColumn:xb,_fnFilter:wb,_fnFilterCreateSearch:Pa,_fnEscapeRegex:Qa,_fnFilterData:zb,_fnFeatureHtmlInfo:sb,_fnUpdateInfo:Cb,_fnInfoMacros:Db,_fnInitialise:ha,_fnInitComplete:ua,_fnLengthChange:Ra,_fnFeatureHtmlLength:ob,_fnFeatureHtmlPaginate:tb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:qb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:rb,_fnScrollDraw:la,_fnApplyToChildren:I,_fnCalculateColumnWidths:Fa,_fnThrottle:Oa,_fnConvertToWidth:Eb,_fnGetWidestNode:Fb,_fnGetMaxLenString:Gb,_fnStringToCss:v, -_fnSortFlatten:X,_fnSort:mb,_fnSortAria:Ib,_fnSortListener:Va,_fnSortAttachListener:Ma,_fnSortingClasses:wa,_fnSortData:Hb,_fnSaveState:xa,_fnLoadState:Jb,_fnSettingsFromNode:ya,_fnLog:K,_fnMap:F,_fnBindAction:Wa,_fnCallbackReg:z,_fnCallbackFire:r,_fnLengthOverflow:Sa,_fnRenderer:Na,_fnDataSource:y,_fnRowAttributes:La,_fnExtend:Xa,_fnCalculateEnd:function(){}});h.fn.dataTable=n;n.$=h;h.fn.dataTableSettings=n.settings;h.fn.dataTableExt=n.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()}; -h.each(n,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable}); - -/*! - Responsive 2.2.7 - 2014-2021 SpryMedia Ltd - datatables.net/license -*/ -(function(d){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(m){return d(m,window,document)}):"object"===typeof exports?module.exports=function(m,l){m||(m=window);if(!l||!l.fn.dataTable)l=require("datatables.net")(m,l).$;return d(l,m,m.document)}:d(jQuery,window,document)})(function(d,m,l,q){function t(a,b,c){var e=b+"-"+c;if(n[e])return n[e];for(var d=[],a=a.cell(b,c).node().childNodes,b=0,c=a.length;btd, >th", -c).each(function(c){c=b.column.index("toData",c);!1===a.s.current[c]&&d(this).css("display","none")})});b.on("destroy.dtr",function(){b.off(".dtr");d(b.table().body()).off(".dtr");d(m).off("resize.dtr orientationchange.dtr");b.cells(".dtr-control").nodes().to$().removeClass("dtr-control");d.each(a.s.current,function(b,c){!1===c&&a._setColumnVis(b,!0)})});this.c.breakpoints.sort(function(a,b){return a.widthb.width?-1:0});this._classLogic();this._resizeAuto();c=this.c.details;!1!== -c.type&&(a._detailsInit(),b.on("column-visibility.dtr",function(){a._timer&&clearTimeout(a._timer);a._timer=setTimeout(function(){a._timer=null;a._classLogic();a._resizeAuto();a._resize(!0);a._redrawChildren()},100)}),b.on("draw.dtr",function(){a._redrawChildren()}),d(b.table().node()).addClass("dtr-"+c.type));b.on("column-reorder.dtr",function(){a._classLogic();a._resizeAuto();a._resize(true)});b.on("column-sizing.dtr",function(){a._resizeAuto();a._resize()});b.on("preXhr.dtr",function(){var c=[]; -b.rows().every(function(){this.child.isShown()&&c.push(this.id(true))});b.one("draw.dtr",function(){a._resizeAuto();a._resize();b.rows(c).every(function(){a._detailsDisplay(this,false)})})});b.on("draw.dtr",function(){a._controlClass()}).on("init.dtr",function(c){if(c.namespace==="dt"){a._resizeAuto();a._resize();d.inArray(false,a.s.current)&&b.columns.adjust()}});this._resize()},_columnsVisiblity:function(a){var b=this.s.dt,c=this.s.columns,e,f,g=c.map(function(a,b){return{columnIdx:b,priority:a.priority}}).sort(function(a, -b){return a.priority!==b.priority?a.priority-b.priority:a.columnIdx-b.columnIdx}),j=d.map(c,function(c,e){return!1===b.column(e).visible()?"not-visible":c.auto&&null===c.minWidth?!1:!0===c.auto?"-":-1!==d.inArray(a,c.includeIn)}),h=0;e=0;for(f=j.length;eh-c[k].minWidth?(s=!0,j[k]=!1):j[k]=!0,h-=c[k].minWidth)}g=!1;e=0;for(f=c.length;e=k&&f(c,b[d].name)}else{if("not-"===g){d=0;for(g=b.length;d").append(j).appendTo(f)}d("").append(g).appendTo(e);"inline"===this.c.details.type&&d(c).addClass("dtr-inline collapsed");d(c).find("[name]").removeAttr("name");d(c).css("position","relative");c=d("
").css({width:1,height:1,overflow:"hidden",clear:"both"}).append(c);c.insertBefore(a.table().node());g.each(function(d){d=a.column.index("fromVisible",d);b[d].minWidth=this.offsetWidth||0});c.remove()}},_responsiveOnlyHidden:function(){var a=this.s.dt;return d.map(this.s.current, -function(b,d){return!1===a.column(d).visible()?!0:b})},_setColumnVis:function(a,b){var c=this.s.dt,e=b?"":"none";d(c.column(a).header()).css("display",e);d(c.column(a).footer()).css("display",e);c.column(a).nodes().to$().css("display",e);d.isEmptyObject(n)||c.cells(null,a).indexes().each(function(a){r(c,a.row,a.column)})},_tabIndexes:function(){var a=this.s.dt,b=a.cells({page:"current"}).nodes().to$(),c=a.settings()[0],e=this.c.details.target;b.filter("[data-dtr-keyboard]").removeData("[data-dtr-keyboard]"); -"number"===typeof e?a.cells(null,e,{page:"current"}).nodes().to$().attr("tabIndex",c.iTabIndex).data("dtr-keyboard",1):("td:first-child, th:first-child"===e&&(e=">td:first-child, >th:first-child"),d(e,a.rows({page:"current"}).nodes()).attr("tabIndex",c.iTabIndex).data("dtr-keyboard",1))}});i.breakpoints=[{name:"desktop",width:Infinity},{name:"tablet-l",width:1024},{name:"tablet-p",width:768},{name:"mobile-l",width:480},{name:"mobile-p",width:320}];i.display={childRow:function(a,b,c){if(b){if(d(a.node()).hasClass("parent"))return a.child(c(), -"child").show(),!0}else{if(a.child.isShown())return a.child(!1),d(a.node()).removeClass("parent"),!1;a.child(c(),"child").show();d(a.node()).addClass("parent");return!0}},childRowImmediate:function(a,b,c){if(!b&&a.child.isShown()||!a.responsive.hasHidden())return a.child(!1),d(a.node()).removeClass("parent"),!1;a.child(c(),"child").show();d(a.node()).addClass("parent");return!0},modal:function(a){return function(b,c,e){if(c)d("div.dtr-modal-content").empty().append(e());else{var f=function(){g.remove(); -d(l).off("keypress.dtr")},g=d('
').append(d('
').append(d('
').append(e())).append(d('
×
').click(function(){f()}))).append(d('
').click(function(){f()})).appendTo("body");d(l).on("keyup.dtr",function(a){27===a.keyCode&&(a.stopPropagation(),f())})}a&&a.header&&d("div.dtr-modal-content").prepend("

"+a.header(b)+"

")}}};var n={};i.renderer= -{listHiddenNodes:function(){return function(a,b,c){var e=d('
    '),f=!1;d.each(c,function(b,c){c.hidden&&(d("
  • '+c.title+"
  • ").append(d('').append(t(a,c.rowIndex,c.columnIndex))).appendTo(e),f=!0)});return f?e:!1}},listHidden:function(){return function(a, -b,c){return(a=d.map(c,function(a){var b=a.className?'class="'+a.className+'"':"";return a.hidden?"
  • '+a.title+' '+a.data+"
  • ":""}).join(""))?d('
      ').append(a):!1}},tableAll:function(a){a=d.extend({tableClass:""},a);return function(b,c,e){b=d.map(e,function(a){return"'+a.title+": "+a.data+""}).join("");return d('').append(b)}}};i.defaults={breakpoints:i.breakpoints,auto:!0,details:{display:i.display.childRow,renderer:i.renderer.listHidden(),target:0,type:"inline"},orthogonal:"display"};var p=d.fn.dataTable.Api;p.register("responsive()",function(){return this});p.register("responsive.index()", -function(a){a=d(a);return{column:a.data("dtr-index"),row:a.parent().data("dtr-index")}});p.register("responsive.rebuild()",function(){return this.iterator("table",function(a){a._responsive&&a._responsive._classLogic()})});p.register("responsive.recalc()",function(){return this.iterator("table",function(a){a._responsive&&(a._responsive._resizeAuto(),a._responsive._resize())})});p.register("responsive.hasHidden()",function(){var a=this.context[0];return a._responsive?-1!==d.inArray(!1,a._responsive._responsiveOnlyHidden()): -!1});p.registerPlural("columns().responsiveHidden()","column().responsiveHidden()",function(){return this.iterator("column",function(a,b){return a._responsive?a._responsive._responsiveOnlyHidden()[b]:!1},1)});i.version="2.2.7";d.fn.dataTable.Responsive=i;d.fn.DataTable.Responsive=i;d(l).on("preInit.dt.dtr",function(a,b){if("dt"===a.namespace&&(d(b.nTable).hasClass("responsive")||d(b.nTable).hasClass("dt-responsive")||b.oInit.responsive||o.defaults.responsive)){var c=b.oInit.responsive;!1!==c&&new i(b, -d.isPlainObject(c)?c:{})}});return i}); - -/*! - DataTables styling wrapper for FixedColumns - ©2018 SpryMedia Ltd - datatables.net/license -*/ -(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-dt","datatables.net-fixedcolumns"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-dt")(a,b).$;b.fn.dataTable.FixedColumns||require("datatables.net-fixedcolumns")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){return c.fn.dataTable}); diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/js/hubwoo-admin-global.js b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/js/hubwoo-admin-global.js deleted file mode 100644 index 1e128aef..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/js/hubwoo-admin-global.js +++ /dev/null @@ -1,68 +0,0 @@ -const ajaxUrl = hubwooi18n.ajaxUrl; -const hubwooSecurity = hubwooi18n.hubwooSecurity; - -jQuery( document ).ready(function($){ - let href = ''; - //deactivation screen - // Deactivate Modal Open. - jQuery('#deactivate-makewebbetter-hubspot-for-woocommerce').on('click', function(evt) { - evt.preventDefault(); - href = jQuery(this).attr( 'href' ); - jQuery('.mwb-g-modal__cover').addClass('show-g_modal_cover'); - jQuery('.mwb-g-modal__message').addClass('show-g_modal_message'); - }); - - // Deactivate Modal close. - jQuery('.mwb-w-modal__cover, .mwb-g-modal__close').on('click', function() { - jQuery('.mwb-g-modal__cover').removeClass('show-g_modal_cover'); - jQuery('.mwb-g-modal__message').removeClass('show-g_modal_message'); - - if ( href.length > 0 ) { - window.location.replace( href ); - } - }); - - jQuery(document).on( - 'click', - '.hubwoo-hide-rev-notice', - async function() { - const response = await jQuery.ajax( - { - type : 'POST', - url : ajaxUrl, - data : { - action : 'hubwoo_hide_rev_notice', - hubwooSecurity, - }, - dataType : 'json', - } - ); - - if( true == response.status ) { - jQuery('.hubwoo-review-notice-wrapper').hide(); - } - } - ); - - jQuery(document).on( - 'click', - '.hubwoo-hide-hpos-notice', - async function() { - const response = await jQuery.ajax( - { - type : 'POST', - url : ajaxUrl, - data : { - action : 'hubwoo_hide_hpos_notice', - hubwooSecurity, - }, - dataType : 'json', - } - ); - - if( true == response.status ) { - jQuery('.hubwoo-hpos-notice-wrapper').hide(); - } - } - ); -}); \ No newline at end of file diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/js/hubwoo-admin.js b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/js/hubwoo-admin.js deleted file mode 100644 index e7af1eb6..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/js/hubwoo-admin.js +++ /dev/null @@ -1,2192 +0,0 @@ -( function( $ ) { - 'use strict'; - - // i18n variables - const ajaxUrl = hubwooi18n.ajaxUrl; - const hubwooWentWrong = hubwooi18n.hubwooWentWrong; - const hubwooMailSuccess = hubwooi18n.hubwooMailSuccess; - const hubwooMailFailure = hubwooi18n.hubwooMailFailure; - const hubwooSecurity = hubwooi18n.hubwooSecurity; - const hubwooAccountSwitch = hubwooi18n.hubwooAccountSwitch; - const hubwooOcsSuccess = hubwooi18n.hubwooOcsSuccess; - const hubwooOcsError = hubwooi18n.hubwooOcsError; - const hubwooOverviewTab = hubwooi18n.hubwooOverviewTab; - const dataCounter = { - percentage: 0, - totalCount: 0, - totalGrpPrCreated: 0, - setupRunning: false - }; - - jQuery( document ).ready( - function() { - const createLists = ( list ) => { - return new Promise( - ( resolve, reject ) => { - const listData = { - action: 'hubwoo_create_list', - listDetails: list, - hubwooSecurity, - }; - jQuery.ajax( { url: ajaxUrl, type: 'POST', data: listData } ) - .then( - ( listResponse ) => { - if ( listResponse != null ) { - const response = jQuery.parseJSON( listResponse ); - const responseCode = response.status_code; - if ( responseCode == 200 || responseCode == 409 ) { - dataCounter.totalGrpPrCreated += 1; - dataCounter.percentage = ( ( dataCounter.totalGrpPrCreated / dataCounter.totalCount ) * 100 ).toFixed( 0 ); - updateProgressBar( dataCounter.percentage ); - resolve( response ); - } else { - reject( response ); - } - } - }, - ); - }, - ); - }; - - const createGroupsToHS = ( groupName, type ) => { - let action = ''; - - if ( type == 'contact' ) { - action = 'hubwoo_create_property_group'; - } else if ( type == 'deal' ) { - action = 'hubwoo_deals_create_group'; - } - - const groupData = { - action, - createNow: 'group', - groupName, - hubwooSecurity, - }; - - return new Promise( - ( resolve, reject ) => { - jQuery.ajax( { url: ajaxUrl, type: 'POST', data: groupData } ) - .done( - ( groupResponse ) => { - const groupRes = jQuery.parseJSON( groupResponse ); - groupRes.name = groupName; - if ( groupRes.status_code == 201 || groupRes.status_code == 409 ) { - dataCounter.totalGrpPrCreated += 1; - dataCounter.percentage = ( ( dataCounter.totalGrpPrCreated / dataCounter.totalCount ) * 100 ).toFixed( 0 ); - updateProgressBar( dataCounter.percentage ); - resolve( groupRes ); - } else { - reject( groupRes ); - } - }, - ); - }, - ); - }; - - const createPropertiesToHS = ( dealProperty, type ) => { - let action = ''; - if ( type == 'contact' ) { - action = 'hubwoo_create_group_property'; - } else if ( type == 'deal' ) { - action = 'hubwoo_deals_create_property'; - } - - return new Promise( - ( resolve, reject ) => { - const createProperties = { - action, - propertyDetails: dealProperty, - hubwooSecurity, - }; - jQuery.ajax( { url: ajaxUrl, type: 'POST', data: createProperties } ) - .done( - function( propertyResponse ) { - const propRes = jQuery.parseJSON( propertyResponse ); - - if ( propRes.status_code == 201 ) { - dataCounter.totalGrpPrCreated += propRes.body.results.length; - dataCounter.percentage = ( ( dataCounter.totalGrpPrCreated / dataCounter.totalCount ) * 100 ).toFixed( 0 ); - updateProgressBar( dataCounter.percentage ); - resolve( propRes ); - } else if ( propRes.status_code == 207 ) { - dataCounter.totalGrpPrCreated += propRes.body.numErrors; - dataCounter.percentage = ( ( dataCounter.totalGrpPrCreated / dataCounter.totalCount ) * 100 ).toFixed( 0 ); - updateProgressBar( dataCounter.percentage ); - resolve( propRes ); - } else { - reject( propRes ); - } - }, - ); - }, - ); - }; - - const debounce = ( func, delay ) => { - let callDebounce; - - return function() { - const context = this; - const args = arguments; - clearTimeout( callDebounce ); - callDebounce = setTimeout( () => func.apply( context, args ), delay ); - }; - }; - - const trackInputCheckboxes = () => { - return { - hubwoo_customers_manual_sync: '.hubwoo-date-range', - hubwoo_abncart_delete_old_data: '.delete-after-date', - hubwoo_checkout_optin_enable: '#hubwoo_checkout_optin_label', - hubwoo_registeration_optin_enable: '#hubwoo_registeration_optin_label', - hubwoo_ecomm_order_date_allow: '.hubwoo-date-d-range', - }; - }; - - const arrayChunk = ( array, size ) => { - const tempArray = []; - - const length = array.length; - let initialIndex = 0, - maxLength = Math.round( length / size ), - lastIndex = size; - - for ( let index = 0; index < maxLength + 1; index += 1 ) { - const cutArr = array.slice( initialIndex, lastIndex ); - if ( cutArr.length > 0 ) { - tempArray.push( cutArr ); - } - initialIndex = lastIndex; - lastIndex += size; - } - - return tempArray; - }; - - const runEcommSetup = async () => { - - const totalProducts = jQuery( '.hubwoo-info' ).data( 'products' ); - await jQuery.ajax( { url: ajaxUrl, type: 'POST', data: { action: 'hubwoo_ecomm_setup', hubwooSecurity, process: 'start-products-sync' } } ); - if(dataCounter.setupRunning) { updateProgressBar( 95 ) } - let response = await jQuery.ajax( { url: ajaxUrl, type: 'POST', data: { action: 'hubwoo_ecomm_setup', hubwooSecurity, process: 'update-deal-stages' } } ); - - return response - } - - - const manageSpinText = ( job, type, result = 'none' ) => { - if ( type == 'add' ) { - job.addClass( 'fa' ); - job.removeClass( 'hubwoo-cr-btn' ); - job.removeClass( 'hubwoo-crd-btn' ); - job.addClass( 'fa-spinner' ); - job.addClass( 'fa-spin' ); - job.text( '' ); - } else if ( type == 'remove' ) { - job.removeClass( 'fa' ); - job.removeClass( 'fa-spinner' ); - job.removeClass( 'fa-spin' ); - job.addClass( 'hubwoo-cr-btn' ); - job.text( 'Created' ); - - if ( result == 'failed' ) { - job.addClass( 'hubwoo-crd-btn' ); - job.text( 'Create' ); - } - } - }; - - const updateProgressBar = ( percentage, mode = 1 ) => { - if ( mode == 1 ) { - jQuery( '.hubwoo-progress-bar' ).css( 'width', percentage + '%' ); - jQuery( '.hubwoo-progress-bar' ).html( percentage + '%' ); - jQuery( '.hubwoo-progress-notice' ).html( hubwooOcsSuccess ); - } else if ( mode == 2 ) { - jQuery( '.hubwoo-progress-notice' ).html( hubwooOcsError ); - jQuery( '.hubwoo-progress-bar' ).addClass( 'hubwoo-progress-error' ); - jQuery( '.hubwoo-progress-bar' ).css( 'width', '100%' ); - jQuery( '.hubwoo-progress-bar' ).html( 'Failed! Please check error log or contact support' ); - } - }; - - const capitalize = (s) => { - if (typeof s !== 'string') return '' - return s.charAt(0).toUpperCase() + s.slice(1) - } - - const transferScreen = async( screenKey, lastKey = undefined ) => { - let redirectUrl, - redirect = true, - currentPage = window.location.href; - - if ( lastKey == undefined ) { - lastKey = 'hubwoo_key'; - } - - if ( ! currentPage.includes( lastKey ) ) { - currentPage = jQuery( '.mwb-heb__nav-list-item:eq(0) a' ).attr( 'href' ); - } - redirectUrl = currentPage.substring( 0, currentPage.indexOf( lastKey ) ); - redirectUrl += lastKey; - - switch ( screenKey ) { - case 'move-to-grp-pr': - redirectUrl += '=grp-pr-setup'; - break; - case 'move-to-list': - redirectUrl += '=list-setup'; - break; - case 'move-to-sync': - redirectUrl += '=sync'; - break; - case 'move-to-pipeline': - redirectUrl += '=pipeline-setup'; - break; - case 'greet-to-dashboard': - await saveUpdates( { 'hubwoo_connection_setup_established': 1 } ); - redirectUrl += '=hubwoo-overview'; - break; - case 'move-to-dashboard': - redirectUrl += '=hubwoo-overview'; - break; - case 'skip-list-creation': - jQuery( '.hubwoo_pop_up_wrap' ).slideUp( 800 ); - redirect = lastKey != 'hubwoo_key' - ? false - : 'true' == await saveUpdates( { 'hubwoo_pro_lists_setup_completed': 1 } ) - ? true - : false; - break; - default: - location.reload(); - } - - if ( redirect ) { - window.location.href = redirectUrl; - } - }; - - const getCurrentUsersToSync = () => { - jQuery.post( - ajaxUrl, - { action: 'hubwoo_get_user_for_current_roles', hubwooSecurity }, - function( totalUsers ) { - let message = 'We have found ' + totalUsers + ' Users'; - - if ( jQuery( '#hubwoo_customers_manual_sync' ).is( ':checked' ) ) { - message += ` from ${ jQuery( '#hubwoo_users_from_date' ).val() } to ${ jQuery( '#hubwoo_users_upto_date' ).val() }`; - } - jQuery('#hubwoo-usr-spin').hide() - jQuery( '.hubwoo-ocs-btn-notice' ).text( message + ' ready to be synced over HubSpot' ); - if ( totalUsers > 0 ) { - jQuery( '.hubwoo-osc-instant-sync' ).attr( 'data-total_users', totalUsers ); - jQuery( '#hubwoo-osc-instant-sync' ).fadeIn(); - jQuery( '#hubwoo-osc-schedule-sync' ).hide(); - } else { - jQuery( '.hubwoo-ocs-btn-notice' ).delay( 1500 ).slideDown( 5000 ); - jQuery( '.hubwoo-ocs-btn-notice' ).text( 'We could not find any user / order, please try changing the filters' ); - jQuery( '#hubwoo-osc-instant-sync' ).hide(); - jQuery( '#hubwoo-osc-schedule-sync' ).hide(); - } - - if ( totalUsers > 500 ) { - jQuery( '#hubwoo-osc-schedule-sync' ).fadeIn(); - jQuery( '#hubwoo-osc-instant-sync' ).hide(); - } - - const userRoles = jQuery( '#hubwoo_customers_role_settings' ).val(); - - if ( userRoles === undefined || userRoles.length === 0 ) { - jQuery( '.hubwoo-ocs-btn-notice' ).hide(); - jQuery( '#hubwoo-osc-instant-sync' ).hide(); - jQuery( '#hubwoo-osc-schedule-sync' ).hide(); - } - }, - ); - }; - const startContactSync = async( step, progress ) => { - const response = await jQuery.ajax( - { - type: 'POST', - url: ajaxUrl, - data: { - action: 'hubwoo_ocs_instant_sync', - step, - hubwooSecurity, - }, - dataType: 'json', - }, - ).fail( - ( response ) => { - updateProgressBar( response.progress, 2 ); - saveUpdates( [ 'hubwoo_total_ocs_need_sync' ], 'delete' ); - }, - ); - - if ( 100 == response.progress && response.propertyError != true ) { - updateProgressBar( response.progress ); - jQuery( '.hubwoo-progress-notice' ).html( hubwooOcsSuccess ); - jQuery( 'a#hubwoo-osc-instant-sync' ).hide(); - await saveUpdates( { 'hubwoo_greeting_displayed_setup': 'yes' } ); - location.reload(); - } else if ( response.propertyError == true ) { - updateProgressBar( 100, 2 ); - saveUpdates( [ 'hubwoo_total_ocs_need_sync' ], 'delete' ); - } else { - updateProgressBar( Math.ceil( response.progress ) ); - startContactSync( parseInt( response.step ), parseInt( response.progress ) ); - } - }; - - const getDealsUsersToSync = async() => { - const ocsCount = await jQuery.post( ajaxUrl, { action: 'hubwoo_ecomm_get_ocs_count', hubwooSecurity } ); - - let message = 'No Users found. Please change the filters below.'; - - if ( ocsCount > 0 ) { - message = `We have found ${ ocsCount } Orders for the selected order statuses`; - jQuery( '.manage_deals_ocs' ).fadeIn(); - } else { - jQuery( '.manage_deals_ocs' ).hide(); - jQuery( '.deal-sync_progress' ).hide(); - message = 'No Orders found for the selected order statuses'; - } - if(jQuery('#hubwoo_ecomm_order_date_allow').is(':checked')) { - message += ' and date range' - } - - jQuery( '.hubwoo_deals_message[data-sync-type="order"]' ).text( message ); - jQuery( '.hubwoo-group-wrap__deal_notice[data-type="pBar"]' ).slideDown( 'slow' ); - }; - - const saveUpdates = ( data, action = 'update' ) => { - return jQuery.post( ajaxUrl, { action: 'hubwoo_save_updates', hubwooSecurity, updates: data, type: action } ); - }; - - const prepareFormData = ( data, enableKeys = null, singleKeys = false ) => { - const preparedFormData = {}; - - data.map( - ( formElement ) => { - let { name, value } = formElement; - if ( enableKeys != null ) { - enableKeys.map( - ( enableKey ) => { - if ( name == enableKey.key ) { - enableKey.status = 'yes'; - } - }, - ); - } - if ( name.includes( '[]' ) == false && singleKeys ) { - preparedFormData[ name ] = value; - } - if ( name.includes( '[]' ) && value != '' ) { - name = name.replace( '[]', '' ); - - if ( preparedFormData.hasOwnProperty( name ) ) { - preparedFormData[ name ].push( value ); - } else { - preparedFormData[ name ] = [ value ]; - } - } - }, - ); - - if ( enableKeys !== null ) { - enableKeys.map( - ( enableKey ) => { - preparedFormData[ enableKey.key ] = enableKey.status; - }, - ); - } - - return preparedFormData; - }; - - Object.entries( trackInputCheckboxes() ).map( - ( elementData ) => { - const [ key, hideField ] = elementData; - if ( jQuery( `#${ key }` ).is( ':checked' ) ) { - jQuery( '.hubwoo-date-range' ).closest( 'tr' ).slideDown(); - } else { - jQuery( hideField ).closest( 'tr' ).hide(); - } - } - ); - - jQuery( '#hubwoo_pro_switch' ).on( - 'click', - function( e ) { - if ( ! confirm( hubwooAccountSwitch ) ) { - e.preventDefault(); - return false; - } - }, - ); - - if ( jQuery( '#get_workflow_scope' ).val() == 'false' ) { - setTimeout( - function() { - jQuery( '.hubwoo_pop_up_wrap' ).slideDown( 'slow' ); - }, - 1000 - ); - } - const dataOfSelected = jQuery( '#hubwoo_customers_role_settings' ).val(); - if ( dataOfSelected != null ) { - jQuery.post( - ajaxUrl, - { action: 'hubwoo_get_current_sync_status', hubwooSecurity, data: { type: 'contact' } }, - function( response ) { - // response = jQuery.parseJSON( response ); - if ( response === true || response == 1 ) { - jQuery( '#hubwoo_customers_role_settings' ).attr( { disabled: 'true' } ); - jQuery( '#hubwoo_customers_manual_sync' ).attr( { disabled: 'true' } ); - } else { - getCurrentUsersToSync(); - } - }, - ); - } - - const innerWidth = jQuery( '.hubwoo-form-wizard-wrapper' ).find( '.hubwoo-form-wizard-link' ).innerWidth(); - const position = jQuery( '.hubwoo-form-wizard-wrapper' ).find( '.hubwoo-form-wizard-link' ).position(); - if ( position != null ) { - jQuery( '.hubwoo-form-wizardmove-button' ).css( { left: position.left, width: innerWidth } ); - } - - if( new URLSearchParams(window.location.search).get('trn') == 'shDls') { - window.scroll( { - top: 200, - behavior: 'smooth' - } ); - jQuery('.hubwoo-group-wrap__deal_ocs[data-txn="ocs-form"]').slideDown() - } - - jQuery( '.hubwoo-form-wizard-wrapper' ).find( '.hubwoo-form-wizard-link' ).click( - function() { - jQuery( '.hubwoo-form-wizard-link' ).removeClass( 'active' ); - const innerWidth = jQuery( this ).innerWidth(); - jQuery( this ).addClass( 'active' ); - const position = jQuery( this ).position(); - jQuery( '.hubwoo-form-wizardmove-button' ).css( { left: position.left, width: innerWidth } ); - const attr = jQuery( this ).attr( 'data-attr' ); - jQuery( '.hubwoo-form-wizard-content' ).each( - function() { - if ( jQuery( this ).attr( 'data-tab-content' ) == attr ) { - jQuery( this ).addClass( 'show' ); - } else { - jQuery( this ).removeClass( 'show' ); - } - }, - ); - }, - ); - - jQuery( '.hubwoo-form-wizard-next-btn' ).click( - function() { - const next = jQuery( this ); - next.parents( '.hubwoo-form-wizard-content' ).toggle( 'slow' ); - next.parents( '.hubwoo-form-wizard-content' ).next( '.hubwoo-form-wizard-content' ).toggle( 'slow' ); - jQuery( document ).find( '.hubwoo-form-wizard-content' ).each( - function() { - if ( jQuery( this ).hasClass( 'show' ) ) { - const formAtrr = jQuery( this ).attr( 'data-tab-content' ); - jQuery( document ).find( '.hubwoo-form-wizard-wrapper li a' ).each( - function() { - if ( jQuery( this ).attr( 'data-attr' ) == formAtrr ) { - jQuery( this ).addClass( 'active' ); - const innerWidth = jQuery( this ).innerWidth(); - const position = jQuery( this ).position(); - jQuery( document ).find( '.hubwoo-form-wizardmove-button' ).css( { left: position.left, width: innerWidth } ); - } else { - jQuery( this ).removeClass( 'active' ); - } - }, - ); - } - }, - ); - }, - ); - - jQuery( '.hubwoo-form-wizard-previous-btn' ).click( - function() { - const prev = jQuery( this ); - prev.parents( '.hubwoo-form-wizard-content' ).removeClass( 'show' ); - prev.parents( '.hubwoo-form-wizard-content' ).prev( '.hubwoo-form-wizard-content' ).addClass( 'show' ); - jQuery( document ).find( '.hubwoo-form-wizard-content' ).each( - function() { - if ( jQuery( this ).hasClass( 'show' ) ) { - const formAtrr = jQuery( this ).attr( 'data-tab-content' ); - jQuery( document ).find( '.hubwoo-form-wizard-wrapper li a' ).each( - function() { - if ( jQuery( this ).attr( 'data-attr' ) == formAtrr ) { - jQuery( this ).addClass( 'active' ); - const innerWidth = jQuery( this ).innerWidth(); - const position = jQuery( this ).position(); - jQuery( document ).find( '.hubwoo-form-wizardmove-button' ).css( { left: position.left, width: innerWidth } ); - } else { - jQuery( this ).removeClass( 'active' ); - } - }, - ); - } - }, - ); - }, - ); - - jQuery( '.mwb-woo__accordian-heading' ).click( - function() { - const name = $( this ).data( 'name' ); - jQuery( '.grToCreate' ).removeClass( 'fa-minus' ).addClass( 'fa-plus' ); - if ( jQuery( '.mwb-woo__accordian-heading' ).is( '.gr_created' ) ) { - jQuery( '.gr_created' ).parent( 'div' ).children( 'i' ).removeClass( 'fa fa-chevron-down' ).addClass( 'fa fa-chevron-right' ); - } - - if ( ! jQuery( this ).hasClass( 'active' ) ) { - jQuery( '#fa-drag-' + name ).removeClass( 'fa-plus' ).addClass( 'fa-minus' ); - if ( jQuery( this ).hasClass( 'gr_created' ) ) { - jQuery( this ).parent( 'div' ).children( 'i' ).removeClass( 'fa fa-chevron-right' ).addClass( 'fa fa-chevron-down' ); - jQuery( '#' + 'fa-' + name ).removeClass( 'fa fa-chevron-right' ).addClass( 'fa fa-chevron-down' ); - } - if ( ! jQuery( this ).hasClass( 'gr_uncreated' ) ) { - jQuery( '.mwb-woo__accordian-heading' ).removeClass( 'active' ); - jQuery( '.mwb-woo__accordion-content' ).slideUp( 500 ); - jQuery( this ).addClass( 'active' ); - jQuery( this ).parents( '.mwb-woo__accordion-wrapper' ).children( '.mwb-woo__accordion-content' ).slideDown( 500 ); - } - } else if ( jQuery( this ).hasClass( 'active' ) ) { - if ( jQuery( this ).hasClass( 'gr_created' ) ) { - jQuery( '#' + 'fa-' + name ).removeClass( 'fa fa-chevron-down' ).addClass( 'fa fa-chevron-right' ); - } - if ( ! jQuery( this ).hasClass( 'gr_uncreated' ) ) { - jQuery( this ).removeClass( 'active' ); - jQuery( this ).parents( '.mwb-woo__accordion-wrapper' ).children( '.mwb-woo__accordion-content' ).slideUp( 500 ); - } - } - }, - ); - - jQuery( '.mwb-woo__accordian-heading' ).hover( - function() { - if ( jQuery( this ).parent( 'div' ).children( 'span' ).hasClass( 'grCreateNew' ) ) { - jQuery( this ).prop( 'title', 'Create group first, before creating properties.' ); - } - }, - ); - - jQuery( 'input.hub-group' ).on( - 'click', - function() { - const groupID = jQuery( this ).data( 'group' ); - const groupRequired = jQuery( this ).data( 'req' ); - const currentChecked = jQuery( this ).prop( 'checked' ); - - if ( 'yes' == groupRequired ) { - return false; - } - - jQuery( 'div#' + groupID ).find( 'input[type=checkbox]' ).each( - function() { - jQuery( this ).attr( 'checked', currentChecked ); - if ( currentChecked ) { - jQuery( this ).removeAttr( 'disabled' ); - } else { - jQuery( this ).attr( 'disabled', true ); - } - }, - ); - }, - ); - - jQuery( '#hubwoo-re-auth' ).click( - ( e ) => { - e.preventDefault(); - saveUpdates( [ 'hubwoo_pro_oauth_success', 'hubwoo_pro_account_scopes', 'hubwoo_pro_valid_client_ids_stored' ], 'delete' ); - window.location.href = jQuery( '#hubwoo-re-auth' ).attr( 'href' ); - }, - ); - - jQuery( 'input.hub-prop' ).on( - 'click', - function() { - const propRequired = jQuery( this ).data( 'req' ); - if ( 'yes' == propRequired ) { - return false; - } - }, - ); - - jQuery( '#hub-lists-form' ).submit( - async( event ) => { - event.preventDefault(); - jQuery( '.hubwoo-list__manage' ).slideUp(); - jQuery( '.hubwoo-btn-list' ).hide(); - jQuery( '.hubwoo-list__progress' ).css( 'display', 'block' ); - updateProgressBar( 0 ); - const countLists = jQuery( 'input[name=\'selectedLists[]\']' ).length; - const currentCounter = 0; - const maxCounter = countLists != null ? countLists : 3; - const data = jQuery( 'form#hub-lists-form' ).serializeArray(); - const selectedLists = []; - jQuery.each( - data, - function( i, input ) { - if ( input.name == 'selectedLists[]' ) { - selectedLists.push( input.value ); - } - }, - ); - let oauth_response = await jQuery.post( ajaxUrl, { action: 'hubwoo_check_oauth_access_token', hubwooSecurity } ); - oauth_response = jQuery.parseJSON( oauth_response ); - const oauth_status = oauth_response.status; - - if ( oauth_status ) { - let listsResponse = await jQuery.post( ajaxUrl, { action: 'hubwoo_get_lists', hubwooSecurity } ); - listsResponse = jQuery.parseJSON( listsResponse ); - - const tempLists = []; - - jQuery.each( - listsResponse, - function( i, singleList ) { - if ( selectedLists.includes( singleList.name ) ) { - tempLists.push( singleList ); - } - }, - ); - - dataCounter.totalCount = tempLists.length; - try { - const createdLists = []; - let upgradeRequired = false; - const allListResults = await Promise.all( - tempLists.map( - async( singleList ) => { - try { - const response = await createLists( singleList ); - if ( response.status_code == 200 || response.status_code == 409 ) { - createdLists.push( singleList.name ); - } - return response; - } catch ( errors ) { - if ( errors.status_code == 402 ) { - upgradeRequired = true; - } else if ( errors.status_code == 400 ) { - - const promessage = jQuery.parseJSON(errors.body); - const errormessage = promessage.message; - if(errormessage.indexOf('The following list names already exist') != -1) { - createdLists.push( singleList.name ); - } - } else { - console.error( errors ); - } - } - }, - ), - ); - - if ( upgradeRequired ) { - jQuery( '.hubwoo_pop_up_wrap' ).slideDown( 'slow' ); - } else { - await saveUpdates( { 'hubwoo-lists-created': createdLists, 'hubwoo_pro_lists_setup_completed': 1 } ); - transferScreen( 'move-to-pipeline' ); - } - } catch ( error ) { - console.error( error ); - } - } else { - alert( hubwooWentWrong ); - return false; - } - }, - ); - - jQuery( 'span.hubwoo-create-single-group' ).on( - 'click', - function() { - const name = $( this ).data( 'name' ); - const job = $( this ); - - manageSpinText( job, 'add' ); - - jQuery.post( - ajaxUrl, - { action: 'hubwoo_check_oauth_access_token', hubwooSecurity }, - function( response ) { - const oauth_response = jQuery.parseJSON( response ); - const oauth_status = oauth_response.status; - if ( oauth_status ) { - jQuery.post( - ajaxUrl, - { action: 'hubwoo_create_single_group', name, hubwooSecurity }, - function( response ) { - const proresponse = jQuery.parseJSON( response ); - const proerrors = proresponse.errors; - const prohubMessage = ''; - - if ( ! proerrors ) { - const proresponseCode = proresponse.status_code; - - if ( proresponseCode == 200 ) { - manageSpinText( job, 'remove' ); - job.addClass( 'grSuccess' ); - - jQuery( '#' + name ).removeClass( 'mwb-woo__accordion-content-disable' ).addClass( 'mwb-woo__accordion-content' ); - if ( jQuery( '.mwb-woo__accordian-heading' ).hasClass( name ) ) { - jQuery( '.' + name ).removeClass( 'gr_uncreated' ).addClass( 'gr_created' ); - } - } else if ( proresponseCode == 409 ) { - manageSpinText( job, 'remove' ); - job.addClass( 'grSuccess' ); - jQuery( '#' + name ).removeClass( 'mwb-woo__accordion-content-disable' ).addClass( 'mwb-woo__accordion-content' ); - if ( jQuery( '.mwb-woo__accordian-heading' ).hasClass( name ) ) { - jQuery( '.' + name ).removeClass( 'gr_uncreated' ).addClass( 'gr_created' ); - } - } else { - manageSpinText( job, 'remove', 'failed' ); - } - } - }, - ); - } else { - manageSpinText( job, 'remove', 'failed' ); - return false; - } - }, - ); - }, - ); - - jQuery( 'span.hubwoo-create-single-field' ).on( - 'click', - function() { - const name = $( this ).data( 'name' ); - - const group = $( this ).data( 'group' ); - - const job = $( '.pr-' + name ); - job.removeClass( 'fa-plus' ); - job.addClass( 'fa-spinner' ); - job.addClass( 'fa-spin' ); - jQuery.post( - ajaxUrl, - { action: 'hubwoo_check_oauth_access_token', hubwooSecurity }, - function( response ) { - const oauth_response = jQuery.parseJSON( response ); - const oauth_status = oauth_response.status; - - if ( oauth_status ) { - jQuery.post( - ajaxUrl, - { action: 'hubwoo_create_single_property', name, group, hubwooSecurity }, - function( response ) { - const proresponse = jQuery.parseJSON( response ); - const proerrors = proresponse.errors; - const prohubMessage = ''; - - if ( ! proerrors ) { - const proresponseCode = proresponse.status_code; - - if ( proresponseCode == 200 ) { - job.removeClass( 'fa-spinner' ); - job.removeClass( 'fa-spin' ); - job.addClass( 'fa-check' ); - } else if ( proresponseCode == 409 ) { - job.removeClass( 'fa-spinner' ); - job.removeClass( 'fa-spin' ); - job.addClass( 'fa-check' ); - } else { - job.removeClass( 'fa-spinner' ); - job.removeClass( 'fa-spin' ); - job.addClass( 'fa-plus' ); - } - } - }, - ); - } else { - job.removeClass( 'fa-spinner' ); - job.removeClass( 'fa-spin' ); - job.addClass( 'fa-plus' ); - return false; - } - }, - ); - }, - ); - - jQuery( '.hubwoo-create-single-list' ).on( - 'click', - function() { - const name = $( this ).data( 'name' ); - const job = $( this ); - - manageSpinText( job, 'add' ); - - jQuery.post( - ajaxUrl, - { action: 'hubwoo_check_oauth_access_token', hubwooSecurity }, - function( response ) { - const oauth_response = jQuery.parseJSON( response ); - const oauth_status = oauth_response.status; - - if ( oauth_status ) { - jQuery.post( - ajaxUrl, - { action: 'hubwoo_create_single_list', name, hubwooSecurity }, - function( response ) { - const proresponse = jQuery.parseJSON( response ); - const proerrors = proresponse.errors; - const prohubMessage = ''; - - if ( ! proerrors ) { - const proresponseCode = proresponse.status_code; - if ( proresponseCode == 200 ) { - manageSpinText( job, 'remove' ); - } else if ( proresponseCode == 409 ) { - manageSpinText( job, 'remove' ); - } else if ( proresponseCode == 400 ) { - const promessage = jQuery.parseJSON(proresponse.body); - const errormessage = promessage.message; - if(errormessage.indexOf('The following list names already exist') != -1) { - manageSpinText( job, 'remove' ); - } else { - jQuery( '.hubwoo_pop_up_wrap' ).slideDown( 'slow' ); - manageSpinText( job, 'remove', 'failed' ); - } - } else { - manageSpinText( job, 'remove', 'failed' ); - } - } - }, - ); - } else { - manageSpinText( job, 'remove', 'failed' ); - return false; - } - }, - ); - }, - ); - - jQuery( '#save-deal-stages' ).click( - async( e ) => { - e.preventDefault(); - if ( jQuery( '#hubwoo-ecomm-deal-stage' ).length ) { - await saveUpdates( { 'hubwoo_ecomm_mapping_setup': 'yes' } ); - } - window.location.reload( true ); - }, - ); - - setInterval( - function() { - jQuery( '.hubwoo-progress-bar' ).map( - async function( element ) { - const currentElement = jQuery( this ); - if ( 'yes' == currentElement.data( 'sync-status' ) ) { - const type = currentElement.data( 'sync-type' ); - let response = await jQuery.ajax( { url: ajaxUrl, type: 'POST', data: { action: 'hubwoo_sync_status_tracker', hubwooSecurity, process: type } } ); - response = jQuery.parseJSON( response ); - currentElement.css( 'width', response.percentage + '%' ); - currentElement.text( response.percentage + '%' ); - if ( response.hasOwnProperty( 'eta' ) ) { - const currentDesc = jQuery( '.sync-desc[data-sync-type=\'' + type + '\']' ); - let text = currentDesc.text().trim(); - const previousEta = currentDesc.attr( 'data-sync-eta' ); - text = text.replace( previousEta, response.eta ); - currentDesc.attr( 'data-sync-eta', response.eta ); - currentDesc.text( text ); - } - if ( 'no' == response.is_running || 100 == currentElement.data( 'percentage' ) || 100 == response.percentage ) { - currentElement.css( 'width', '100%' ); - currentElement.text( '100%' ); - window.location.href = window.location.href; - } - } - } - ); - }, - 25000 - ); - - jQuery( '#reset-deal-stages' ).click( - async( e ) => { - e.preventDefault(); - let pipeline = jQuery( '.hubwoo_selected_pipeline' ).find(":selected").text(); - await jQuery.ajax( { url: ajaxUrl, type: 'POST', data: { action: 'hubwoo_ecomm_setup', hubwooSecurity, process: 'reset-mapping', pipeline } } ); - window.location.reload( true ); - }, - ); - - jQuery( '.hubwoo-create-single-workflow-data' ).on( - 'click', - function() { - const btnThis = jQuery( this ); - var name = jQuery( this ).data( 'name' ); - const tab = jQuery( this ).closest( '.hubwoo-field-text-col' ); - tab.removeClass( 'hubwoo-align-class' ).addClass( 'align-big' ); - var name = $( this ).data( 'name' ); - const job = $( this ); - - manageSpinText( job, 'add' ); - - jQuery.post( - ajaxUrl, - { action: 'hubwoo_check_oauth_access_token', hubwooSecurity }, - function( response ) { - const oauth_response = jQuery.parseJSON( response ); - const oauth_status = oauth_response.status; - - if ( oauth_status ) { - jQuery.post( - ajaxUrl, - { action: 'hubwoo_create_single_workflow', name, hubwooSecurity }, - function( response ) { - const proresponse = jQuery.parseJSON( response ); - const proerrors = proresponse.errors; - const prohubMessage = ''; - - if ( ! proerrors ) { - const proresponseCode = proresponse.status_code; - - if ( proresponseCode == 200 ) { - manageSpinText( job, 'remove' ); - - tab.removeClass( 'align-big' ).addClass( 'hubwoo-align-class' ); - - jQuery.post( - ajaxUrl, - { action: 'hubwoo_update_workflow_tab' }, - function( data ) { - var data = JSON.parse( data ); - $.each( - data, - function( index, value ) { - $( '.workflow-tab[data-name="' + value + '"]' ).removeClass( 'hubwoo-disabled' ); - }, - ); - }, - ); - - btnThis.parents( '.hubwoo-field-text-col' ).children( 'div.hubwoo-field-checked' ).show(); - } else if ( proresponseCode == 404 ) { - let message = JSON.parse( proresponse.response ); - message = message.message; - manageSpinText( job, 'remove', 'failed' ); - tab.removeClass( 'align-big' ).addClass( 'hubwoo-align-class' ); - alert( message ); - } else { - alert( hubwooWentWrong ); - manageSpinText( job, 'remove', 'failed' ); - tab.removeClass( 'align-big' ).addClass( 'hubwoo-align-class' ); - } - } - }, - ); - } else { - tab.removeClass( 'align-big' ).addClass( 'hubwoo-align-class' ); - manageSpinText( job, 'remove', 'failed' ); - return false; - } - }, - ); - }, - ); - - jQuery( '.hubwoo-onquest' ).select2( - { - placeholder: "Select from the options", - ajax: { - url: ajaxurl, - dataType: 'json', - delay: 100, - type: 'POST', - data( params ) { - return { - q: params.term, - action: 'hubwoo_get_onboard_form', - key: jQuery(this).attr('name'), - hubwooSecurity:hubwooSecurity - }; - }, - processResults( data ) { - const options = []; - if ( data ) { - $.each( - data, - function( index, text ) { - options.push( { id: text[ 0 ], text: text[ 1 ] } ); - }, - ); - } - return { - results: options, - }; - }, - cache: true, - }, - }, - ); - - jQuery( '#hubwoo_ecomm_order_ocs_status' ).select2( - { - placeholder: 'Processing, Completed etc.', - ajax: { - url: ajaxurl, - dataType: 'json', - delay: 200, - data( params ) { - return { - q: params.term, - action: 'hubwoo_search_for_order_status', - }; - }, - processResults( data ) { - const options = []; - if ( data ) { - $.each( - data, - function( index, text ) { - options.push( { id: text[ 0 ], text: text[ 1 ] } ); - }, - ); - } - return { - results: options, - }; - }, - cache: true, - }, - }, - ); - - jQuery( '#hubwoo-selected-user-roles, #hubwoo_customers_role_settings' ).select2( - { - placeholder: 'All Users Roles are Selected except Guest.', - ajax: { - url: ajaxurl, - dataType: 'json', - delay: 200, - data( params ) { - return { - q: params.term, - action: 'hubwoo_get_for_user_roles', - }; - }, - processResults( data ) { - const options = []; - if ( data ) { - $.each( - data, - function( index, text ) { - options.push( { id: text[ 0 ], text: text[ 1 ] } ); - }, - ); - } - return { - results: options, - }; - }, - cache: true, - }, - }, - ); - - jQuery( 'input[type="checkbox"]' ).on( - 'change', - function() { - const elementId = jQuery( this ).attr( 'id' ); - const checkboxes = trackInputCheckboxes(); - if ( checkboxes.hasOwnProperty( elementId ) ) { - const hideField = checkboxes[ elementId ]; - if ( jQuery( this ).is( ':checked' ) ) { - jQuery( hideField ).closest( 'tr' ).fadeIn(); - } else { - jQuery( hideField ).closest( 'tr' ).fadeOut(); - } - } - }, - ); - - jQuery( '.date-picker' ).datepicker( { dateFormat: 'dd-mm-yy', maxDate: 0, changeMonth: true, changeYear: true } ); - - jQuery( document ).on( - 'click', - '#hubwoo-osc-instant-sync', - async function( event ) { - event.preventDefault(); - jQuery( '#hubwoo-osc-instant-sync' ).hide(); - const progress = 0; - jQuery( '#hubwoo-ocs-form' ).slideUp( 600 ); - jQuery( '#hubwoo-osc-instant-sync' ).addClass( 'hubwoo-disable' ); - jQuery( '#hubwoo-osc-schedule-sync' ).addClass( 'hubwoo-disable' ); - jQuery( '.hubwoo-progress-wrap' ).css( 'display', 'block' ); - const totalUsers = jQuery( '.hubwoo-osc-instant-sync' ).data( 'total_users' ); - await saveUpdates( { 'hubwoo_total_ocs_need_sync': totalUsers } ); - await saveUpdates( [ 'hubwoo_ocs_contacts_synced' ], 'delete' ); - updateProgressBar( 0 ); - startContactSync( 1, progress ); - }, - ); - - jQuery( '.hubwoo-date-picker' ).datepicker( { dateFormat: 'dd-mm-yy', maxDate: 0, changeMonth: true, changeYear: true } ); - - jQuery( '#hubwoo-pro-email-logs' ).on( - 'click', - function( e ) { - e.preventDefault(); - jQuery( '#hubwoo_email_loader' ).css( { display: 'inline-block' } ); - - jQuery.post( - ajaxUrl, - { action: 'hubwoo_email_the_error_log', hubwooSecurity }, - function( response ) { - const res_parsed = jQuery.parseJSON(response); - if ( res_parsed != null ) { - if ( res_parsed == 'success' ) { - alert( hubwooMailSuccess ); - jQuery( '#hubwoo_email_loader' ).css( { display: 'none' } ); - jQuery( '#hubwoo_email_success' ).css( { display: 'inline-block' } ); - } else { - alert( hubwooMailFailure ); - jQuery( '#hubwoo_email_loader' ).css( { display: 'none' } ); - } - } else { - // close the popup and show the error. - alert( hubwooMailFailure ); - jQuery( '#hubwoo_email_loader' ).css( { display: 'none' } ); - } - jQuery( '#hubwoo_email_success' ).css( { display: 'none' } ); - }, - ); - }, - ); - - jQuery( '.hubwoo-general-settings-fields' ).on( - 'change', - function() { - const data = jQuery( '#plugin-settings-gen-adv' ).serializeArray(); - const enableKeys = [ - { key: 'hubwoo_checkout_optin_enable', status: 'no' }, - { key: 'hubwoo_registeration_optin_enable', status: 'no' }, - { key: 'hubwoo_subs_settings_enable', status: 'no' }, - ]; - const multiSelectKeys = [ - { key: 'hubwoo-selected-user-roles', status: 'EMPTY_ARRAY' }, - ]; - const preparedFormData = prepareFormData( data, enableKeys, true ); - multiSelectKeys.map( - ( singleKey ) => { - if ( preparedFormData.hasOwnProperty( singleKey.key ) == false ) { - preparedFormData[ singleKey.key ] = singleKey.status; - } - }, - ); - saveUpdates( preparedFormData ); - }, - ); - - jQuery( '.hubwoo_rfm_data_fields' ).on( - 'change', - debounce( - function() { - const data = jQuery( '#hubwoo-rfm-form' ).serializeArray(); - const preparedFormData = prepareFormData( data ); - saveUpdates( preparedFormData ); - }, - 800, - ), - ); - - // Deals - - if( new URLSearchParams(window.location.search).get('hubwoo_tab') == 'hubwoo-deals') { - jQuery.post( - ajaxUrl, - { action: 'hubwoo_get_current_sync_status', hubwooSecurity, data: { type: 'deal' } }, - function( response ) { - // response = jQuery.parseJSON( response ); - if ( response != true || response != 1 ) { - getDealsUsersToSync(); - } else { - $("#hubwoo_deals_ocs_form :input").map(function() { - $(this).attr( { disabled: 'true' } ); - }) - } - }, - ); - } - - jQuery( '.hubwoo_real_time_changes' ).on( - 'change', - debounce( - () => { - const data = jQuery( '#hubwoo_real_time_deal_settings' ).serializeArray(); - const enableKeys = [ { key: 'hubwoo_ecomm_deal_enable', status: 'no' }, { key: 'hubwoo_assoc_deal_cmpy_enable', status: 'no' }, { key: 'hubwoo_deal_multi_currency_enable', status: 'no' } ]; - const multiSelectKeys = [ { key: 'hubwoo_ecomm_won_stages', status: 'EMPTY_ARRAY' } ]; - const formData = prepareFormData( data, enableKeys, true ); - multiSelectKeys.map( - ( singleKey ) => { - if ( formData.hasOwnProperty( singleKey.key ) == false ) { - formData[ singleKey.key ] = singleKey.status; - } - }, - ); - saveUpdates( formData ); - }, - 800, - ), - ); - - jQuery( '.hubwoo_ecomm_mapping' ).on( - 'change', - debounce( - () => { - const data = jQuery( '.hubwoo_save_ecomm_mapping' ).serializeArray(); - const formData = []; - for ( let index = 0; index < data.length; index++ ) { - const preparedData = {}; - preparedData.status = data[ index ].value; - preparedData.deal_stage = data[ ++index ].value; - formData.push( preparedData ); - } - saveUpdates( { 'hubwoo_ecomm_final_mapping': formData } ); - }, - 300, - ), - ); - - jQuery( document ).on( - 'change', - '.hubwoo_selected_pipeline', - debounce( - async () => { - const selected_pipeline = jQuery( this ).find(":selected").val(); - const response = await jQuery.ajax( - { - type : 'POST', - url : ajaxUrl, - data : { - action : 'hubwoo_fetch_deal_stages', - selected_pipeline, - hubwooSecurity, - }, - dataType : 'json', - } - ); - if ( response.success ) { - window.location.reload( true ); - } - }, - 300, - ), - ); - - jQuery( '#hubwoo_ecomm_won_stages' ).select2( - { - placeholder: 'Select Winning Deal Stages.', - ajax: { - url: ajaxurl, - dataType: 'json', - delay: 200, - data( params ) { - return { - q: params.term, - action: 'hubwoo_deals_search_for_stages', - }; - }, - processResults( data ) { - const options = []; - if ( data ) { - $.each( - data, - function( index, text ) { - options.push( { id: text[ 0 ], text: text[ 1 ] } ); - }, - ); - } - return { - results: options, - }; - }, - cache: true, - }, - }, - ); - - jQuery( '.hubwoo-ecomm-settings-select' ).on( - 'change', - async() => { - const data = jQuery( '#hubwoo_deals_ocs_form' ).serializeArray(); - const enableKeys = [ { key: 'hubwoo_ecomm_order_date_allow', status: 'no' } ]; - const multiSelectKeys = [ { key: 'hubwoo_ecomm_order_ocs_status', status: 'EMPTY_ARRAY' } ]; - const formData = prepareFormData( data, enableKeys, true ); - multiSelectKeys.map( - ( singleKey ) => { - if ( formData.hasOwnProperty( singleKey.key ) == false ) { - formData[ singleKey.key ] = singleKey.status; - } - } - ); - - if(formData.hubwoo_ecomm_order_date_allow == 'no') { - delete formData.hubwoo_ecomm_order_ocs_from_date - delete formData.hubwoo_ecomm_order_ocs_upto_date - } - const syncReponse = await jQuery.post( ajaxUrl, { action: 'hubwoo_get_current_sync_status', hubwooSecurity, data: { type: 'deal' } } ); - if ( syncReponse != true || syncReponse != 1 ) { - const savedResponse = await saveUpdates( formData ); - if ( savedResponse ) { - const ocsCount = await jQuery.get( ajaxUrl, { action: 'hubwoo_ecomm_get_ocs_count', hubwooSecurity } ); - if ( ocsCount !== undefined || ocsCount !== null ) { - jQuery( '.hubwoo_deals_message[data-sync-type="order"]' ).slideDown( 20 ); - jQuery( '.hubwoo_deals_message[data-sync-type="order"]' ).css( 'display', 'inline-block' ); - jQuery( '.hubwoo-group-wrap__deal_notice[data-type="pBar"]' ).slideDown( 200 ); - - let message = ''; - - if ( ocsCount > 0 ) { - message = `We have found ${ ocsCount } Orders for the selected order statuses`; - if(jQuery('#hubwoo_ecomm_order_date_allow').is(':checked')) { - message += ' and date range' - } - jQuery( '.manage_deals_ocs' ).fadeIn(); - } else { - jQuery( '.manage_deals_ocs' ).fadeOut(); - message = 'No Orders found for the selected order statuses'; - if(jQuery('#hubwoo_ecomm_order_date_allow').is(':checked')) { - message += ' and date range' - } - } - - jQuery( '.hubwoo_deals_message[data-sync-type="order"]' ).text( message ); - } - } - } else { - jQuery( '.hubwoo-deals-settings-select' ).attr( { disabled: 'true' } ); - } - }, - ); - - $('#hubwoo-initiate-oauth').click( function(e) { - e.preventDefault() - const url = $(this).attr('href') - // track connect count and redirect - window.location.href = url - }) - - jQuery( '.manage_deals_ocs, .manage_contact_sync, .manage_product_sync' ).click( - async function() { - const syncAction = jQuery( this ).data( 'action' ); - if ( syncAction !== undefined ) { - if( 'run-ecomm-setup' === syncAction ) { - await runEcommSetup(); - } else { - await jQuery.post( ajaxUrl, { action: 'hubwoo_manage_sync', hubwooSecurity, process: syncAction } ); - } - window.location.reload( true ); - } - }, - ); - - // Abandoned Cart - jQuery( '.hubwoo-abncart-setup-form' ).on( - 'change', - debounce( - function() { - const data = jQuery( '.hubwoo-abncart-setup-form' ).serializeArray(); - const enableKeys = [ - { key: 'hubwoo_abncart_enable_addon', status: 'no' }, - { key: 'hubwoo_abncart_guest_cart', status: 'no' }, - { key: 'hubwoo_abncart_delete_old_data', status: 'no' }, - ]; - const preparedFormData = prepareFormData( data, enableKeys, true ); - saveUpdates( preparedFormData ); - }, - 700, - ), - ); - - // Show Setup Content on Click - jQuery( '.hubwoo-btn-cshow__btn a' ).click( - function( e ) { - e.preventDefault(); - $( this ).parents( '.hubwoo-box-card' ).find( '.hubwoo-btn-cshow__content' ).toggle( 'slow' ); - }, - ); - - jQuery( '.hubwoo-btn-data' ).click( - function( e ) { - e.preventDefault(); - jQuery( this ).parents( '.hubwoo-btn-list' ).next( '.hubwoo-sub-content' ).children( 'div' ).hide(); - const datavalue = jQuery( this ).data( 'action' ); - if ( datavalue == 'group_setup' ) { - jQuery( this ).parents( '.hubwoo-btn-list' ).next( '.hubwoo-sub-content' ).children( '.hubwoo-group__progress' ).show(); - jQuery( '#hubwoo_create_group_prop_setup' ).hide(); - jQuery( '.gen-text' ).hide(); - jQuery( '#hub-gr-props-form' ).submit(); - } else if ( datavalue == 'group_manage_setup' ) { - jQuery( '.grp-pr-heading' ).text( 'Created Properties & Groups' ); - jQuery( '.hubwoo-content__para' ).hide(); - jQuery( this ).parents( '.hubwoo-btn-list' ).next( '.hubwoo-sub-content' ).children( '.hubwoo-group__manage' ).slideDown( 'slow' ); - jQuery( '.hubwoo-group-desc' ).show(); - jQuery( '#hubwoo_create_group_prop_setup' ).hide(); - jQuery( '#hubwoo-manage-setup' ).hide(); - } - - if ( datavalue == 'lists_setup' ) { - jQuery( this ).parents( '.hubwoo-btn-list' ).next( '.hubwoo-sub-content' ).children( '.hubwoo-list__progress' ).show(); - jQuery( '#hub-lists-form' ).submit(); - } else if ( datavalue == 'lists_setup_manage' ) { - jQuery( this ).parents( '.hubwoo-btn-list' ).next( '.hubwoo-sub-content' ).children( '.hubwoo-list__manage' ).slideDown( 'slow' ); - jQuery( '.list-setup-heading' ).text( 'Lists' ); - jQuery( '.hubwoo-content__para' ).hide(); - jQuery( '.hubwoo-list-desc' ).show(); - jQuery( '.hubwoo-btn-data' ).hide(); - jQuery( '#hub-lists-form' ).slideDown(); - } - }, - ); - - jQuery( '.hubwoo_manage_screen' ).click( - () => { - const screenKey = jQuery( '.hubwoo_manage_screen' ).data( 'process' ); - const lastKey = jQuery( '.hubwoo_manage_screen' ).data( 'tab' ); - transferScreen( screenKey, lastKey ); - }, - ); - - jQuery( '.hubwoo-adv-settingg__btn a' ).click( - function() { - jQuery( this ).parents( '.hubwoo-adv-settingg' ).children( '.hubwoo-adv-settingg__form' ).toggle( 'slow' ); - }, - ); - jQuery( '.hubwoo-deal-wrap-con__h-btn a' ).click( - function( e ) { - e.preventDefault(); - jQuery( this ).parents( '.hubwoo-deal-wrap-con' ).children( '.hubwoo-deal-wrap-con__store' ).toggle( 'slow' ); - }, - ); - - jQuery( '.hubwoo-manage-account' ).on('click', - function() { - let formData = {} - switch (jQuery(this).data('type')) { - case 'disconnect-form': - jQuery('.hubwoo_pop_up_wrap').fadeIn(); - break; - case 'disconnect': - formData = jQuery('.hubwoo-disconnect-form').serializeArray(); - const enableKeys = [ { key: 'delete_meta', status: 'no' } ]; - formData = prepareFormData( formData, enableKeys ); - case 'change-account': - jQuery('.hubwoo-discon-spinner').slideDown('slow') - const currentPage = window.location.href; - let redirectUrl = currentPage.substring( 0, currentPage.indexOf( 'hubwoo' ) ); - redirectUrl += 'hubwoo'; - - const action = { action: 'hubwoo_disconnect_account', hubwooSecurity } - - if(Object.keys(formData).length !== 0) { - action.data = formData - } - jQuery.post( - ajaxUrl, - action, - function( status ) { - if ( status ) { - window.location.href = redirectUrl - } - }, - ); - break; - case 'cancel': - jQuery('.hubwoo_pop_up_wrap').hide(); - default: - break; - } - } - ); - - jQuery( '.hubwoo-ocs-input-change' ).on( - 'change', - async() => { - const data = jQuery( '#hubwoo-ocs-form' ).serializeArray(); - const enableKeys = [ { key: 'hubwoo_customers_manual_sync', status: 'no' } ]; - const multiSelectKeys = [ { key: 'hubwoo_customers_role_settings', status: 'EMPTY_ARRAY' } ]; - const preparedFormData = prepareFormData( data, enableKeys, true ); - multiSelectKeys.map( - ( singleKey ) => { - if ( preparedFormData.hasOwnProperty( singleKey.key ) == false ) { - preparedFormData[ singleKey.key ] = singleKey.status; - } - }, - ); - saveUpdates( preparedFormData ); - jQuery.post( - ajaxUrl, - { action: 'hubwoo_get_current_sync_status', hubwooSecurity, data: { type: 'contact' } }, - function( response ) { - // response = jQuery.parseJSON( response ); - if ( response != true || response != 1 ) { - getCurrentUsersToSync(); - } else { - jQuery( '#hubwoo_customers_role_settings' ).attr( { disabled: 'true' } ); - jQuery( '#hubwoo_customers_manual_sync' ).attr( { disabled: 'true' } ); - } - }, - ); - }, - ); - - jQuery(document).on('change', '.which_hubspot_packages_do_you_currently_use_', function() { - var hubwoo_package = jQuery(this).val(); - if( hubwoo_package.includes("I don’t currently use HubSpot") ){ - jQuery('.hubwoo_register').removeClass('hidefield'); - } else { - jQuery('.hubwoo_register').addClass('hidefield'); - } - - }); - - jQuery('.hubwoo-onboard-manage').click( async function(e){ - e.preventDefault() - - switch (jQuery(this).data('type')) { - case 'sync': - - let inputFields = true - let formData = jQuery('#hubwoo-onboarding-form').serializeArray(); - formData = prepareFormData(formData, null, true); - let hubwoo_package = jQuery('.which_hubspot_packages_do_you_currently_use_').val(); - - const onboardKeys = [ - { key: 'mwb_hs_familarity', status: '' }, - { key: 'mwb_woo_familarity', status: '' }, - { key: 'which_hubspot_packages_do_you_currently_use_', status: '' }, - { key: 'firstname', status: '' }, - { key: 'lastname', status: '' }, - { key: 'company', status: '' }, - { key: 'website', status: '' }, - { key: 'email', status: '' }, - { key: 'phone', status: '' }, - ]; - - if( ! hubwoo_package.includes("I don’t currently use HubSpot") ){ - onboardKeys.splice(3,4); - delete formData["firstname"]; - delete formData["lastname"]; - delete formData["company"]; - delete formData["website"]; - } - - onboardKeys.map( - ( singleKey ) => { - if ( formData.hasOwnProperty( singleKey.key ) == false ) { - formData[ singleKey.key ] = singleKey.status; - } - }, - ); - Object.keys(formData).forEach((key) => { - if(formData[key] !== '') { - jQuery('.hubwoo-onboard-img[name='+key+']').show() - } else { - inputFields = false - jQuery('.hubwoo-onboard-img[name='+key+']').hide() - } - }) - - if(inputFields) { - jQuery('.hubwoo-onboard-notice').slideUp() - jQuery('.onboard-spinner').slideDown() - await jQuery.post( ajaxUrl, { action: 'hubwoo_onboard_form', formData, hubwooSecurity } ); - } else { - $('html,body').animate({ scrollTop: $(".mwb-heb-wlcm__title").outerHeight() + 220 }, 'slow', function() { - jQuery('.hubwoo-onboard-notice').slideDown('slow') - }); - break; - } - case 'skip': - await saveUpdates({'hubwoo_onboard_user': 'yes'}) - jQuery("#hubwoo-onboard-user").hide() - jQuery("#hubwoo-visit-dashboard").show() - default: - break; - } - }) - - jQuery('.hubwoo-action-icon').tipTip({ - 'attribute': 'data-tip', - delay: 150, - fadeIn: 150, - fadeOut: 200, - }) - - $('.hubwoo-action-icon').click( async function(e) { - if('no' == $(this).data("status")) { - e.preventDefault() - - if( 'yes' == $(this).attr('data-sync-status')) { - return; - } - - let triggerStatus = false - const type = $(this).data('type'); - const firstChild = document.body.firstChild; - const popupWrap = document.createElement("div"); - popupWrap.className = 'hubwoo_pop_up_wrap'; - firstChild.parentNode.insertBefore(popupWrap, firstChild); - $(popupWrap).css('display','none'); - $(popupWrap).fadeIn() - $(popupWrap).append('

      '); - $('.hubwoo-disconnect-wrapper').append('
      '); - $('.hubwoo-disconnect-wrapper').append(''); - $('.hubwoo-disconnect-wrapper > h2').text("Schedule a background sync") - $('.hubwoo-disconnect-wrapper > p').text("Would you like to schedule a background sync for all of the "+ capitalize(type)+ "s") - $('.hubwoo-objects').click( async function() { - if( 'sync' == $(this).data('type') ) { - $('.hubwoo-discon-spinner').fadeIn('slow'); - switch (type) { - case 'contact': - await jQuery.post( ajaxUrl, { action: 'hubwoo_manage_vids', hubwooSecurity, process: type } ); - window.location.reload() - break; - case 'deal': - await jQuery.post( ajaxUrl, { action: 'hubwoo_manage_vids', hubwooSecurity, process: type } ); - window.location.reload() - break; - default: - break; - } - } else { - $('.hubwoo_pop_up_wrap').hide(); - } - }) - } - }) - - jQuery( '#hub-gr-props-form' ).submit( - async( event ) => { - event.preventDefault(); - const data = jQuery( 'form#hub-gr-props-form' ).serializeArray(); - const progress = 0; - const selectedGroups = []; - const selectedProps = []; - jQuery( '.hubwoo-group__progress' ).css( 'display', 'block' ); - updateProgressBar( 0 ); - jQuery.each( - data, - function( i, input ) { - if ( input.name == 'selectedGroups[]' ) { - selectedGroups.push( input.value ); - } else if ( input.name == 'selectedProps[]' ) { - selectedProps.push( input.value ); - } - }, - ); - dataCounter.setupRunning = true; - dataCounter.totalCount = selectedGroups.length + selectedProps.length; - const ecommSetupCount = 10 * dataCounter.totalCount / 100; - dataCounter.totalCount += ecommSetupCount; - let oauth_response = await jQuery.post( ajaxUrl, { action: 'hubwoo_check_oauth_access_token', hubwooSecurity } ); - oauth_response = jQuery.parseJSON( oauth_response ); - const oauth_status = oauth_response.status; - - if ( oauth_status ) { - const allCreatedGroups = []; - let allCreatedProperties = []; - let chunkedProperties = []; - - for (let i = selectedGroups.length - 1; i >= 0; i--) { - const singleCreatedGroup = await createGroupsToHS( selectedGroups[i], 'contact' ); - let groupName = null; - - if ( singleCreatedGroup.status_code == 200 ) { - groupName = singleCreatedGroup.name; - } else if ( singleCreatedGroup.status_code == 409 ) { - groupName = singleCreatedGroup.name; - } else if ( singleCreatedGroup.status_code == 201 ) { - groupName = singleCreatedGroup.name; - } - allCreatedGroups.push( groupName ); - } - - for (let i = allCreatedGroups.length - 1; i >= 0; i--) { - let groupName = allCreatedGroups[i]; - let tempPropertiesToCreate = await jQuery.ajax( { url: ajaxUrl, type: 'POST', data: { action: 'hubwoo_get_group_properties', groupName, hubwooSecurity } } ); - - if ( tempPropertiesToCreate != undefined || tempPropertiesToCreate.length > 0 ) { - tempPropertiesToCreate = jQuery.parseJSON( tempPropertiesToCreate ); - tempPropertiesToCreate = tempPropertiesToCreate.map( ( property ) => ( { ...property, groupName } ) ); - chunkedProperties.push(arrayChunk( tempPropertiesToCreate, 16 ) ); - } - } - - if(chunkedProperties.length > 0) { - - chunkedProperties = chunkedProperties.flat(); - - for (let i = chunkedProperties.length - 1; i >= 0; i--) { - let singleChunk = chunkedProperties[i] - try { - const response = await createPropertiesToHS( singleChunk, 'contact' ); - let results = []; - - if ( response.status_code == 201 ) { - results = response.body.results; - results.map( - ( createdProperty ) => { - allCreatedProperties.push( createdProperty.name ); - } - ); - } else if ( response.status_code == 207 ) { - results = response.body.errors; - results.map( - ( createdProperty ) => { - const message = createdProperty.message; - const propertyName = message.slice( message.indexOf( 'named' ) + 5, message.indexOf( 'already' ) - 1 ); - allCreatedProperties.push( propertyName ); - } - ); - } - } catch ( errors ) { - console.error( errors ); - continue; - } - } - } - - const deal_property = await jQuery.ajax({ type : 'POST', url : ajaxUrl, data : { action : 'hubwoo_deals_create_property', hubwooSecurity, }, dataType : 'json', }); - - allCreatedProperties = allCreatedProperties.map((prop) => { return prop.replace(/["']/g, "").trim()}) - await saveUpdates( { 'hubwoo-groups-created': allCreatedGroups, 'hubwoo-properties-created': allCreatedProperties, 'hubwoo_fields_setup_completed': 1, 'hubwoo_pro_setup_completed': 1, 'hubwoo_plugin_version': '1.5.6' } ); - await runEcommSetup(); - updateProgressBar( 100 ); - transferScreen( 'move-to-list' ); - } - }, - ); - - /* CSV creation and syncing of products, contacts, deals start. */ - jQuery( document ).on( - 'click', - '#hubwoo-osc-instant-sync-historical', - async function( event ) { - event.preventDefault(); - jQuery( '#hubwoo-osc-instant-sync-historical' ).hide(); - const progress = 0; - jQuery( '#hubwoo-ocs-form' ).slideUp( 600 ); - jQuery( '#hubwoo-osc-instant-sync' ).addClass( 'hubwoo-disable' ); - jQuery( '#hubwoo-osc-schedule-sync' ).addClass( 'hubwoo-disable' ); - jQuery( '.hubwoo-progress-wrap' ).css( 'display', 'block' ); - jQuery( '#hubwoo-osc-schedule-sync' ).css( 'display', 'none' ); - updateProgressBar( 0 ); - - checkHistoricalData( 1, progress ); - - }, - ); - - - const checkHistoricalData = async( step, progress ) => { - const response = await jQuery.ajax( - { - type : 'POST', - url : ajaxUrl, - data : { - action : 'hubwoo_ocs_historical_contact', - step, - hubwooSecurity, - }, - dataType : 'json', - } - ).fail( - ( response ) => { - updateProgressBar ( response.progress, 2 ); - } - ); - - var max_item = Math.ceil( response.max_time / 100); - - if ( 0 == response.progress && response.propertyError != true && response.status == true ) { - updateProgressBar( response.progress ); - var con_batches = Math.ceil( response.contact / max_item ); - var con_batch_count = 1; - var con_bar_update = parseFloat( 100 / con_batches ); - con_bar_update = parseFloat( con_bar_update.toFixed(2) ); - var con_progress_bar = parseFloat( 0 ); - var con_deal_response = ''; - var con_get_vid = 'process_request'; - - while ( con_batch_count <= con_batches ) { - - con_progress_bar += con_bar_update; - con_progress_bar = parseFloat( con_progress_bar.toFixed(2) ); - - if ( con_batch_count == con_batches ) { - con_progress_bar = 100; - con_get_vid = 'final_request'; - } - - con_deal_response = await bulkContactSync( 1, con_progress_bar, max_item, con_get_vid ); - con_batch_count++; - - } - - - } else if( 100 == response.progress && response.propertyError != true && response.status == true ) { - con_get_vid = 'final_request'; - await bulkContactSync( 1, response.progress, max_item, con_get_vid ); - } else if ( response.propertyError == true ) { - updateProgressBar( 100, 2 ); - - } else { - con_get_vid = 'final_request'; - updateProgressBar( Math.ceil( response.progress ) ); - bulkContactSync( parseInt( response.step ), parseInt( response.progress ), max_item, con_get_vid ); - } - }; - - const bulkContactSync = async( step, progress, max_item, con_get_vid ) => { - - const response = await jQuery.ajax( - { - type : 'POST', - url : ajaxUrl, - data : { - action : 'hubwoo_historical_contact_sync', - step, - hubwooSecurity, - max_item, - con_get_vid, - }, - dataType : 'json', - } - ).fail( - ( response ) => { - updateProgressBar ( response.progress, 2 ); - } - ); - - if ( 100 == progress && response.propertyError != true && response.status == true ) { - updateProgressBar( progress ); - jQuery( '.hubwoo-progress-wrap' ).children( 'p' ).append( 'Completed !' ); - - if ( 'false' == response.skip_product ) { - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).css( 'width', 0 + '%' ); - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).html( 0 + '%' ); - jQuery( '.hubwoo-progress-wrap-import' ).show(500); - } else { - jQuery( '.hubwoo-progress-wrap-import-deals p strong' ).html( '2. Syncing your Deals to Hubspot. This should only take a few moments. Thanks for your patience!' ); - } - - var total_prod = response.total_prod; - var total_deals = response.total_deals; - - if ( total_prod == 0 ) { - - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).css( 'width', 100 + '%' ); - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).html( 100 + '%' ); - jQuery( '.hubwoo-progress-wrap-import' ).children( 'p' ).append( 'Completed !' ); - - if ( total_deals != 0 ) { - - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).css( 'width', 0 + '%' ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).html( 0 + '%' ); - jQuery( '.hubwoo-progress-wrap-import-deals' ).show(1000); - - await deals_check( total_deals, max_item ); - } else if ( total_deals == 0 ) { - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).css( 'width', 100 + '%' ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).html( 100 + '%' ); - jQuery( '.hubwoo-progress-wrap-import-deals' ).show(1000); - jQuery( '.hubwoo-progress-wrap-import-deals' ).children( 'p' ).append( 'Completed !' ); - - jQuery( '.hubwoo-progress-notice' ).html( hubwooOcsSuccess ); - await saveUpdates( { 'hubwoo_greeting_displayed_setup': 'yes' } ); - setTimeout(function(){ location.reload();}, 3000 ); - } - - } else { - - var pro_batches = Math.ceil( total_prod / max_item ); - var batch_count = 1; - var bar_update = parseFloat( 100 / pro_batches ); - bar_update = parseFloat( bar_update.toFixed(2) ); - var progress_bar = parseFloat( 0 ); - var last_request = false; - var bulk_pro_response = ''; - var total_deals = ''; - var pro_get_vid = 'process_request'; - - while ( batch_count <= pro_batches ) { - - progress_bar += bar_update; - progress_bar = parseFloat( progress_bar.toFixed(2) ); - - if ( batch_count == pro_batches ){ - progress_bar = 100; - last_request = true; - pro_get_vid = 'final_request'; - } - - bulk_pro_response = await bulkProductsSync( 1, progress_bar, last_request, max_item, pro_get_vid ); - total_deals = bulk_pro_response.total_deals; - batch_count++; - } - - if ( 100 == progress_bar ) { - jQuery( '.hubwoo-progress-wrap-import' ).children( 'p' ).append( 'Completed !' ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).css( 'width', 0 + '%' ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).html( 0 + '%' ); - jQuery( '.hubwoo-progress-wrap-import-deals' ).show(1000); - - if ( true == last_request && total_deals == 0 ) { - - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).css( 'width', 100 + '%' ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).html( 100 + '%' ); - jQuery( '.hubwoo-progress-wrap-import-deals' ).children( 'p' ).append( 'Completed !' ); - - } else { - - await deals_check( total_deals, max_item ); - } - - } - } - - } else if ( response.propertyError == true ) { - updateProgressBar( 100, 2 ); - } else { - updateProgressBar( Math.ceil( progress ) ); - // bulkContactSync( parseInt( response.step ), parseInt( response.progress ) ); - } - - return response; - } - - const bulkProductsSync = async( step, progress, last_request, max_item, pro_get_vid ) => { - const response = await jQuery.ajax( - { - type : 'POST', - url : ajaxUrl, - data : { - action : 'hubwoo_historical_products_import', - step, - hubwooSecurity, - last_request, - max_item, - pro_get_vid, - }, - dataType : 'json', - } - ).fail( - ( response ) => { - jQuery( '.hubwoo-progress-notice' ).html( hubwooOcsError ); - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).addClass( 'hubwoo-progress-error' ); - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).css( 'width', '100%' ); - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).html( 'Failed! Please check error log or contact support' ); - } - ); - - if ( true == response.status && response.propertyError != true && response.status == true ) { - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).css( 'width', progress + '%' ); - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).html( progress + '%' ); - jQuery( '.hubwoo-progress-wrap-import' ).show(500); - - } else if ( response.propertyError == true ) { - jQuery( '.hubwoo-progress-notice' ).html( hubwooOcsError ); - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).addClass( 'hubwoo-progress-error' ); - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).css( 'width', '100%' ); - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).html( 'Failed! Please check error log or contact support' ); - } else { - jQuery( '.hubwoo-progress-notice' ).html( hubwooOcsError ); - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).addClass( 'hubwoo-progress-error' ); - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).css( 'width', '100%' ); - jQuery( '.hubwoo-progress-wrap-import .hubwoo-progress-bar' ).html( 'Failed! Please check error log or contact support' ); - } - - return response; - } - - const bulkDealsSync = async( step, progress, max_item ) => { - - const response = await jQuery.ajax( - { - type : 'POST', - url : ajaxUrl, - data : { - action : 'hubwoo_historical_deals_sync', - step, - hubwooSecurity, - max_item, - }, - dataType : 'json', - } - ).fail( - ( response ) => { - jQuery( '.hubwoo-progress-notice' ).html( hubwooOcsError ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).addClass( 'hubwoo-progress-error' ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).css( 'width', '100%' ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).html( 'Failed! Please check error log or contact support' ); - } - ); - - if ( true == response.status && response.propertyError != true && response.status == true ) { - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).css( 'width', progress + '%' ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).html( progress + '%' ); - jQuery( '.hubwoo-progress-wrap-import-deals' ).show(1000); - - } else if ( response.propertyError == true ) { - jQuery( '.hubwoo-progress-notice' ).html( hubwooOcsError ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).addClass( 'hubwoo-progress-error' ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).css( 'width', '100%' ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).html( 'Failed! Please check error log or contact support' ); - } else { - jQuery( '.hubwoo-progress-notice' ).html( hubwooOcsError ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).addClass( 'hubwoo-progress-error' ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).css( 'width', '100%' ); - jQuery( '.hubwoo-progress-wrap-import-deals .hubwoo-progress-bar' ).html( 'Failed! Please check error log or contact support' ); - - } - } - - const deals_check = async( total_deals, max_item ) => { - - var deal_batches = Math.ceil( total_deals / max_item ); - var deal_batch_count = 1; - var deal_bar_update = parseFloat( 100 / deal_batches ); - deal_bar_update = parseFloat( deal_bar_update.toFixed(2) ); - var deal_progress_bar = parseFloat( 0 ); - var bulk_deal_response = ''; - - while ( deal_batch_count <= deal_batches ) { - - deal_progress_bar += deal_bar_update; - deal_progress_bar = parseFloat( deal_progress_bar.toFixed(2) ); - - if ( deal_batch_count == deal_batches ) { - deal_progress_bar = 100; - - } - - bulk_deal_response = await bulkDealsSync( 1, deal_progress_bar, max_item ); - deal_batch_count++; - - if ( 100 == deal_progress_bar ) { - jQuery( '.hubwoo-progress-wrap-import-deals' ).children( 'p' ).append( 'Completed !' ); - jQuery( '.hubwoo-progress-notice' ).html( hubwooOcsSuccess ); - await saveUpdates( { 'hubwoo_greeting_displayed_setup': 'yes' } ); - location.reload(); - } - } - } - - if( new URLSearchParams(window.location.search).get('hubwoo_tab') == 'hubwoo-logs') { - - var ajax_url = ajaxUrl + '?action=hubwoo_get_datatable_data&hubwooSecurity='+hubwooSecurity; - - jQuery('#hubwoo-table').dataTable({ - "processing": true, - "serverSide": true, - "ajax": ajax_url, - "dom": 'f<"bottom">tr<"bottom"ilp>', - "ordering": false, - language: { - "lengthMenu": "Rows per page _MENU_", - "info": "_START_ - _END_ of _TOTAL_", - - paginate: { - next: '', - previous: '' - } - } - }); - } - - jQuery(document).on('click', '#hubwoo-download-log', async function(e){ - e.preventDefault(); - var button = jQuery(this); - button.addClass('hubwoo-btn__loader'); - const response = await jQuery.ajax( - { - type : 'POST', - url : ajaxUrl, - data : { - action : 'hubwoo_download_sync_log', - hubwooSecurity, - }, - dataType : 'json', - } - ); - if ( response.success ) { - button.removeClass('hubwoo-btn__loader'); - window.location.href = response.redirect; - } - }); - - jQuery(document).on('click', '#hubwoo-clear-log', async function(e){ - e.preventDefault(); - var button = jQuery(this); - button.addClass('hubwoo-btn__loader'); - const response = await jQuery.ajax( - { - type : 'POST', - url : ajaxUrl, - data : { - action : 'hubwoo_clear_sync_log', - hubwooSecurity, - }, - dataType : 'json', - } - ); - if ( response.success ) { - button.removeClass('hubwoo-btn__loader'); - window.location.href = response.redirect; - } - }); - - jQuery( document ).on( - 'click', - '#hubwoo-save-pipeline', - async function( event ) { - await saveUpdates( { 'hubwoo_pipeline_setup_completed': 1 } ); - transferScreen( 'move-to-sync' ); - }, - ); - - jQuery( document ).on( - 'click', - '.hubwoo_update_pipelines', - async function( event ) { - const selected_pipeline = jQuery( '.hubwoo_selected_pipeline' ).find(":selected").val(); - jQuery(this).find('.fa-refresh').addClass('fa-spin'); - const response = await jQuery.ajax( - { - type : 'POST', - url : ajaxUrl, - data : { - action : 'hubwoo_fetch_update_pipelines', - selected_pipeline, - hubwooSecurity, - }, - dataType : 'json', - } - ); - if ( response.success ) { - jQuery(this).find('.fa-refresh').removeClass('fa-spin'); - window.location.href = window.location.href; - } - } - ); - }, - ); -}( jQuery ) ); diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/js/index.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/js/index.php deleted file mode 100644 index 0de7bcdd..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/js/index.php +++ /dev/null @@ -1,2 +0,0 @@ - - -
      -
      -
      - + -
      - -
      -
      -
      diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-abncart.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-abncart.php deleted file mode 100644 index d5300fa4..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-abncart.php +++ /dev/null @@ -1,27 +0,0 @@ - -
      -
      -
      -
      -
      -
      -
      - - -
      -
      -
      -
      -
      -
      diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-add-ons.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-add-ons.php deleted file mode 100644 index 129cd107..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-add-ons.php +++ /dev/null @@ -1,169 +0,0 @@ - - -
      -
      -
      -
      -
      -

      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      -
      -
      -

      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      -
      -
      -

      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      -
      -
      -

      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      -

      -
      -
      -
      -
      -

      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      -
      -
      -

      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      -
      -
      -

      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      -
      -
      -

      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      -
      diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-automation.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-automation.php deleted file mode 100644 index f6789944..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-automation.php +++ /dev/null @@ -1,134 +0,0 @@ -hubwoo_get_final_workflows(); -$workflows_dependencies = $hubwoo->hubwoo_workflows_dependency(); -$hubwoo_workflow_desc = $hubwoo->get_workflow_description(); -$automation_enabled = $hubwoo->is_automation_enabled(); -$access_workflow = get_option( 'hubwoo_access_workflow', 'yes' ); -$popup_display = ( 'yes' == $access_workflow ) ? 'true' : 'false'; -?> - -
      - - -
      -
      - - - - - - - - - - - - - is_workflow_dependent( $single_workflow['detail']['name'] ) ) { - if ( $automation_enabled ) { - $class = ''; - } else { - $class = 'hubwoo-disabled'; - } - ?> - - - - - - - - - - - -
      - -
      - -
      -
      -
      - Created -
      -
      - -
      - -
      -
      - -
      - -
      - -
      -
      - -
      -
-
diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-deals.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-deals.php deleted file mode 100644 index 8d45e59e..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-deals.php +++ /dev/null @@ -1,285 +0,0 @@ - -
-
- - - -
-

- -

-
-
-
-
-
-

- -
-
- -
-
-
- - - -
-
-
- -
- - - - - - - -
-
- % -
-
-
-
-
- - - -
-
-
-
-

-
-
- -
-
-
- - - -
-
- -
-
- - - - - -
- - -
-
-
- - - - - - - - - - $order_label ) { - $stage = Hubwoo::get_selected_deal_stage( $order_key ); - ?> - - - - - - - - - - - - -
- - - - -
- -
-
-
-
- -
-
-
-
-
-

-
-
- -
-
-
- - - -
-
-
- -
-
-
- -
-
-
-
-
-

-
-
- -
-
-
- - - -
-
-
-
-

- - - - -

-
-
-
-
- % -
-
-
- -
-
- -
-
-
-
-
diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-general-settings.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-general-settings.php deleted file mode 100644 index afa3b0c9..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-general-settings.php +++ /dev/null @@ -1,401 +0,0 @@ - -_get( 'groups' ); ?> -hubwoo_get_final_groups(); ?> -hubwoo_workflows_and_list_groups(); ?> -hubwoo_workflows_and_list_properties(); ?> - -is_field_setup_completed(); ?> -is_list_setup_completed(); ?> -hubwoo_get_final_lists(); ?> -get_lists_description(); ?> - -
-

-
-
-
-
-

-
-
- -
-
-
-
- -
-
-
-
-
- -
-
-
- $single_group ) { - ?> -
-
- - - - - -
- -
- -
-
-
- - -
-
- -
-
- - - - - - - - - Created - - - -
- -
- -
-
- -
-
-
- -
- -
-
-
-

-
-
- -
-
-
-
- -
-
-
-
-
- -
-
- $single_list ) { - - ?> -
- - -
- -
-
- -
- $single_list ) { - - ?> -
- - - - - - - - -
- -
-
- -
- -
-
-
-

-
-
-
-
-
-
-

- -

-
-

- - -

-
-
-
- - - -
-
-
- - -
-
-
-
-
- -
-
- prepare_items(); - ?> -
-
-

- -

-
-

- - -

-
-
- -
- - - -
-
-
-
- display(); - ?> -
-
-
-
- -
diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-logs.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-logs.php deleted file mode 100644 index 6a019684..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-logs.php +++ /dev/null @@ -1,61 +0,0 @@ - -
-
-
-

- -

-
- - - -
- -
- - - - - - - - - - - -
- -
-
- -
- -
- -
diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-main-template.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-main-template.php deleted file mode 100644 index 02b874c5..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-main-template.php +++ /dev/null @@ -1,207 +0,0 @@ - - -hubwoo_default_tabs(); -?> - -is_field_setup_completed(); ?> -is_list_setup_completed(); ?> -hubwoo_get_final_lists(); ?> - -
-
- - -
-
- 100 ? 100 : $perc; - - ?> -
-
-
-
-
- % -
-
-
- -
-
- load_template_view( $tab_content_path, $active_tab ); - ?> -
-
- - -
- - load_template_view( $tab_content_path, $setup_tab ); - ?> -
- diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-overview.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-overview.php deleted file mode 100644 index 339eba83..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-overview.php +++ /dev/null @@ -1,232 +0,0 @@ - - -
-
-
-
-
-
-

-

- - - - -

-
- -
-
-
-
-
-
-

-
- -
-
-

-
- -
-
-

-
- -
-
-
- -
-
-
-
-
-
- -
-
-

- - -

-
-
- -
-
-
-
-
-
- -
-
-

- -

-
-
- -
-
-
-
-
-
- - -
-
-

- -

-

- - - - - -

-
-
- -
-
-
-
-
-
- - -
-
-

- -

-
-
- -
-
-
-
-
-
- - -
-
-

- -

-
-
- -
-
-
-
-
-
- - -
-
-

- -

-
-
- -
-
-
-
-
-
- -
-
-
-
diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-support.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-support.php deleted file mode 100644 index 787cbc29..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-support.php +++ /dev/null @@ -1,137 +0,0 @@ - - -
-
-
-
-
-

-
-
- -
-
-
- -
-
-
-
-
-
-
-

-
-
- -
-
-
- -
-
-
-
-
-
-
-

-
-
- -
-
-
- -
-
-
-
-
-
-
-

-
-
- -
-
-
- -
-
-
-
-
-
-
-

-
-
- -
-
-
- -
-
-
-
-
-
-
-

-
-
- -
-
-
- -
-
-
-
-
-
-
-

-
-
- -
-
-
-
- -
-
-
-
-
diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-sync-contacts.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-sync-contacts.php deleted file mode 100644 index 6463f572..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/hubwoo-sync-contacts.php +++ /dev/null @@ -1,47 +0,0 @@ - - -
- -
- -
-
- -
- - -
-
- - -
diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/index.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/index.php deleted file mode 100644 index 0de7bcdd..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/index.php +++ /dev/null @@ -1,2 +0,0 @@ -hubwoo_notice( $notice, 'hubwoo-notice' ); -} -?> - -
-
-
-

- -

-
-
-
-

- -

-

- -

    -
  • -
  • -
  • -
  • -
-

-
-

- -

- -
- - -
-
-
-
- -
-
-
-

- -

-
-
-
- -

- -

- - -

- - -

-
-
- - -
-
-
-
- -hubwoo_switch_account( false ); -} -?> diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/setup/hubwoo-grp-pr-setup.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/setup/hubwoo-grp-pr-setup.php deleted file mode 100644 index 26d26e4f..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/setup/hubwoo-grp-pr-setup.php +++ /dev/null @@ -1,264 +0,0 @@ -_get( 'groups' ); -$final_groups = $hubwoo->hubwoo_get_final_groups(); -$hubwoo_required_groups = $hubwoo->hubwoo_workflows_and_list_groups(); -$hubwoo_required_props = $hubwoo->hubwoo_workflows_and_list_properties(); -$final_properties = array_map( - function( $property ) { - return str_replace( "'", '', $property ); - }, - get_option( 'hubwoo-properties-created', array() ) -); -$field_setup = $hubwoo->is_field_setup_completed(); - -if ( 1 == get_option( 'hubwoo_fields_setup_completed', 0 ) ) { - $cta['will_create'] = 'none'; - $cta['did_created'] = 'inline-block'; - $cta['gen_text'] = 'none'; - -} else { - $cta['will_create'] = 'inline-block'; - $cta['did_created'] = 'none'; - $cta['gen_text'] = 'block'; -} -?> -
-
-
-

- -

-
-
-
-

- -

-

- -

-
    -
  • -
  • -
  • -
  • -
-
-
- - -
-
- - -
-
- - - -
-
-
- $single_group ) { - - ?> -
-
- - - - - -
- -
- -
-
-
- -
-
- - -
- - - -
- -
-
- - - - - - - - - - - - -
- -
- -
-
- -
-
-
-
-
-
diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/setup/hubwoo-list-setup.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/setup/hubwoo-list-setup.php deleted file mode 100644 index 7d000a02..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/setup/hubwoo-list-setup.php +++ /dev/null @@ -1,175 +0,0 @@ -is_automation_enabled(); -$list_setup = $hubwoo->is_list_setup_completed(); -$hubwoo_lists = $hubwoo->hubwoo_get_final_lists(); -$hubwoo_lists_desc = $hubwoo->get_lists_description(); -$dynamic_lists = HubWooConnectionMananager::get_instance()->get_dynamic_lists(); - -if ( 1 == get_option( 'hubwoo_pro_lists_setup_completed', 0 ) ) { - $cta['create'] = 'none'; - $cta['created'] = 'inline-block'; - $cta['gen-text'] = 'none'; -} else { - $cta['create'] = 'inline-block'; - $cta['created'] = 'none'; - $cta['gen-text'] = 'block'; -} - -?> -
- -
-
-

- -

-
-
-
-

- - -

-
-

- -

    -
  • -
  • -
  • -
-

-
-
-
- - -
-
- - -
-
-
-
diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/setup/hubwoo-pipeline-setup.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/setup/hubwoo-pipeline-setup.php deleted file mode 100644 index dcdbd76e..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/setup/hubwoo-pipeline-setup.php +++ /dev/null @@ -1,116 +0,0 @@ - - -
-
-
-

Map Deal Stages with eCommerce pipeline

-
-
-
- - - - - -
- - -
-
-
- - - - - - - - - - $order_label ) { - $stage = Hubwoo::get_selected_deal_stage( $order_key ); - ?> - - - - - - - - - - - - -
- - - - -
- - - -
-
-
-
-
diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/setup/hubwoo-sync.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/setup/hubwoo-sync.php deleted file mode 100644 index 6d43f18f..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/admin/templates/setup/hubwoo-sync.php +++ /dev/null @@ -1,209 +0,0 @@ - - -
-
-
-

- -

-
-
-
-

- -

-

- -

-
-
- - - - - -
-
-
- - - -
-
-
- -
-
-
-

- -

-
-
-
-
-

- -

-
- -
-
-
- -
-
-
-
-
- -
-
-
-

- -

-
-
-

-
-
-
-
-
- -
- $data ) { - ?> -
- - - -
- - - - - - - -
- - - -
- - -
- - - -
- - -
- - - -
- - -
- - - -
- - -
- - - -
- - -
- - - -
- -
-
- - -
-
-
-
-
-
diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/changelog.txt b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/changelog.txt deleted file mode 100644 index 861507da..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/changelog.txt +++ /dev/null @@ -1,120 +0,0 @@ - *** MWB HubSpot for WooCommerce Changelog *** -2024-06-04 - version 1.5.6 -* Fix - Deal Update Fix for HPOS. - -2024-04-12 - version 1.5.5 -* Fix - Minor Fixes. - -2024-04-10 - version 1.5.4 -* Fix - Minor Fixes. - -2024-03-06 - version 1.5.3 -* Added - HPOS Compatibility Addon. - -2024-01-12 - version 1.5.2 -* Fix - Minor Fixes. - -2023-09-22 - version 1.5.1 -* Fix - Minor Bug Fixes. - -2023-08-21 - version 1.5.0 -* Added - Refresh Pipeline. - -2023-08-01 - version 1.4.9 -* Added - Delete Abandoned Data. - -2023-06-29 - version 1.4.8 -* Fix - Minor Bug Fixes. - -2023-05-22 - version 1.4.7 -* Fix - Minor Bug Fixes. - -2023-05-03 - version 1.4.6 -* Add - UTM links. - -2023-03-17 - version 1.4.5 -* Fix - Minor Bug Fixes. - -2023-01-31 - version 1.4.4 -* Fix - Redirect URI. - -2023-01-19 - version 1.4.3 -* Fix - Update filter. - -2022-11-17 - version 1.4.2 -* Fix - Minor Bug Fixes. - -2022-11-10 - version 1.4.1 -* Fix - Minor Bug Fixes. - -2022-11-07 - version 1.4.0 -* Added - New API endpoints. - -2022-09-15 - version 1.3.3 -* Added - migration notice & subscribe us form. - -2022-08-08 - version 1.3.2 -* Added - Update multi currency. - -2022-06-02 - version 1.3.1 -* Fix - Minor Bug Fixes. - -2022-04-14 - version 1.3.0 -* Added - Line item filter. - -2022-03-17 - version 1.2.9 -* Fix - Minor Bug Fixes. - -2022-01-31 - version 1.2.8 -* Added - Update Scopes. - -2022-01-13 - version 1.2.7 -* Added - Deal Company association. - -2021-12-06 - version 1.2.6 -* Fix - Newsletter Subscription Property issue. - -2021-11-12 - version 1.2.5 -* Fix - Sync message issue. - -2021-10-20 - version 1.2.4 -* Fix - Minor Bug Fixes. - -2021-09-13 - version 1.2.3 -* Add - Content Part - -2021-08-18 - version 1.2.2 -* Add - Fixed deal and contact association issue. - -2021-05-29 - version 1.2.1 -* Add - Bug Fixes. - -2021-04-23 - version 1.2.0 -* Add - Historical Sync Data. - -2021-04-23 - version 1.0.8 -* Fix - Creating Groups issue. - -2021-04-06 - version 1.0.7 -* Fix - Authentication issue. - -2020-10-18 - version 1.0.6 -* Fix - Deal update issue. - -2020-09-30 - version 1.0.5 -* Fix - Source tracking. - -2020-06-23 - version 1.0.4 -* Fix - Session issue and minor bugs. - -2020-05-21 - version 1.0.3 -* Add - Shipment tracking and re-sync deals. - -2020-05-15 - version 1.0.2 -* Add - Multi site support. - -2020-05-07 - version 1.0.1 -* Fix - Contact sync from sync tab. - -2020-01-24 - version 1.0.0 -* Initial release. \ No newline at end of file diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoo-activator.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoo-activator.php deleted file mode 100644 index 7e4f53cf..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoo-activator.php +++ /dev/null @@ -1,74 +0,0 @@ - true, - 'message' => esc_html__( 'Success', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $response['status'] = false; - $response['message'] = esc_html__( 'Something went wrong. Please verify your HubSpot Connection once.', 'makewebbetter-hubspot-for-woocommerce' ); - } - } - - echo wp_json_encode( $response ); - - wp_die(); - } - - /** - * Create new group for contact properties. - * - * @since 1.0.0 - */ - public function hubwoo_create_property_group() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - if ( ! empty( $_POST['groupName'] ) ) { - $group_name = sanitize_key( wp_unslash( $_POST['groupName'] ) ); - } - $object_type = 'contacts'; - $groups = HubWooContactProperties::get_instance()->_get( 'groups' ); - $group_details = array(); - if ( ! empty( $groups ) ) { - foreach ( $groups as $single_group ) { - if ( $single_group['name'] == $group_name ) { - $group_details = $single_group; - break; - } - } - } - $response = HubWooConnectionMananager::get_instance()->create_group( $group_details, $object_type ); - echo wp_json_encode( $response ); - wp_die(); - } - - /** - * Get hubwoo group properties by group name. - * - * @since 1.0.0 - */ - public function hubwoo_get_group_properties() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - if ( isset( $_POST['groupName'] ) ) { - - $group_name = sanitize_text_field( wp_unslash( $_POST['groupName'] ) ); - $properties = HubWooContactProperties::get_instance()->_get( 'properties', $group_name ); - echo wp_json_encode( $properties ); - } - - wp_die(); - } - - /** - * Create an group property on ajax request. - * - * @since 1.0.0 - */ - public function hubwoo_create_group_property() { - - // check the nonce sercurity. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - if ( isset( $_POST['propertyDetails'] ) ) { - $property_details = map_deep( wp_unslash( $_POST['propertyDetails'] ), 'sanitize_text_field' ); - $response = HubWooConnectionMananager::get_instance()->create_batch_properties( $property_details, 'contact' ); - $response['body'] = json_decode( $response['body'], true ); - echo wp_json_encode( $response ); - wp_die(); - } - } - - /** - * Create deal group property on ajax request. - * - * @since 1.4.0 - */ - public function hubwoo_deals_create_property() { - // check the nonce sercurity. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - $product_properties = Hubwoo::hubwoo_get_product_properties(); - $object_type = 'products'; - $response = HubWooConnectionMananager::get_instance()->create_batch_properties( $product_properties, $object_type ); - if ( 201 == $response['status_code'] || 207 == $response['status_code'] ) { - update_option( 'hubwoo_product_property_created', 'yes' ); - $response['body'] = json_decode( $response['body'], true ); - } else if ( 403 == $response['status_code'] ) { - update_option( 'hubwoo_product_scope_needed', 'yes' ); - update_option( 'hubwoo_ecomm_setup_completed', 'yes' ); - } - - $deal_properties = Hubwoo::hubwoo_get_deal_properties(); - $object_type = 'deals'; - $response = HubWooConnectionMananager::get_instance()->create_batch_properties( $deal_properties, $object_type ); - if ( 201 == $response['status_code'] || 207 == $response['status_code'] ) { - update_option( 'hubwoo_deal_property_created', 'yes' ); - $response['body'] = json_decode( $response['body'], true ); - } - - echo wp_json_encode( $response ); - wp_die(); - } - - - /** - * Get lists to be created on husbpot. - * - * @since 1.0.0 - */ - public function hubwoo_get_lists_to_create() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - $lists = HubWooContactProperties::get_instance()->_get( 'lists' ); - - echo wp_json_encode( $lists ); - - wp_die(); - } - - /** - * Create bulk lists on hubspot. - * - * @since 1.0.0 - */ - public function hubwoo_create_list() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - if ( isset( $_POST['listDetails'] ) ) { - - $list_details = map_deep( wp_unslash( $_POST['listDetails'] ), 'sanitize_text_field' ); - $response = HubWooConnectionMananager::get_instance()->create_list( $list_details ); - echo wp_json_encode( $response ); - } - - wp_die(); - } - - - /** - * Create single group on HubSpot. - * - * @since 1.0.0 - */ - public function hubwoo_create_single_group() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - if ( ! empty( $_POST['name'] ) ) { - $group_name = sanitize_text_field( wp_unslash( $_POST['name'] ) ); - } else { - $group_name = ''; - } - $groups = HubWooContactProperties::get_instance()->_get( 'groups' ); - $group_details = ''; - $object_type = 'contacts'; - - if ( is_array( $groups ) && count( $groups ) ) { - - foreach ( $groups as $single_group ) { - - if ( $single_group['name'] === $group_name ) { - - $group_details = $single_group; - break; - } - } - } - - if ( ! empty( $group_details ) ) { - - $response = HubWooConnectionMananager::get_instance()->create_group( $group_details, $object_type ); - } - - if ( isset( $response['status_code'] ) && ( 201 === $response['status_code'] || 409 === $response['status_code'] ) ) { - - $add_groups = get_option( 'hubwoo-groups-created', array() ); - $add_groups[] = $group_details['name']; - update_option( 'hubwoo-groups-created', $add_groups ); - } - - echo wp_json_encode( $response ); - wp_die(); - } - - /** - * Create single property on HubSpot. - * - * @since 1.0.0 - */ - public function hubwoo_create_single_property() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - if ( ! empty( $_POST['group'] ) ) { - $group_name = sanitize_text_field( wp_unslash( $_POST['group'] ) ); - } else { - $group_name = ''; - } - - if ( ! empty( $_POST['name'] ) ) { - $property_name = sanitize_text_field( wp_unslash( $_POST['name'] ) ); - } else { - $property_name = ''; - } - - $properties = HubWooContactProperties::get_instance()->_get( 'properties', $group_name ); - - if ( ! empty( $properties ) && count( $properties ) ) { - - foreach ( $properties as $single_property ) { - - if ( ! empty( $single_property['name'] ) && $single_property['name'] == $property_name ) { - - $property_details = $single_property; - break; - } - } - } - - if ( ! empty( $property_details ) ) { - - $property_details['groupName'] = $group_name; - - $response = HubWooConnectionMananager::get_instance()->create_property( $property_details, 'contacts' ); - } - - if ( isset( $response['status_code'] ) && ( 201 === $response['status_code'] || 409 === $response['status_code'] ) ) { - - $add_properties = get_option( 'hubwoo-properties-created', array() ); - $add_properties[] = $property_details['name']; - update_option( 'hubwoo-properties-created', $add_properties ); - } - - echo wp_json_encode( $response ); - - wp_die(); - } - - /** - * Create single list on hubspot. - * - * @since 1.0.0 - */ - public function hubwoo_create_single_list() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - if ( isset( $_POST['name'] ) ) { - - $list_name = sanitize_text_field( wp_unslash( $_POST['name'] ) ); - - $lists = HubWooContactProperties::get_instance()->_get( 'lists' ); - - if ( ! empty( $lists ) && count( $lists ) ) { - - foreach ( $lists as $single_list ) { - - if ( ! empty( $single_list['name'] ) && $single_list['name'] == $list_name ) { - - $list_details = $single_list; - break; - } - } - } - - if ( ! empty( $list_details ) ) { - - $response = HubWooConnectionMananager::get_instance()->create_list( $list_details ); - } - - if ( isset( $response['status_code'] ) && ( 200 === $response['status_code'] || 409 === $response['status_code'] ) ) { - - $add_lists = get_option( 'hubwoo-lists-created', array() ); - $add_lists[] = $list_name; - update_option( 'hubwoo-lists-created', $add_lists ); - } - - echo wp_json_encode( $response ); - wp_die(); - } - } - - /** - * Create single list on hubspot. - * - * @since 1.0.0 - */ - public function hubwoo_create_single_workflow() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - if ( ! empty( $_POST['name'] ) ) { - - $name = sanitize_text_field( wp_unslash( $_POST['name'] ) ); - - $add_workflows = get_option( 'hubwoo-workflows-created', array() ); - - if ( in_array( $name, $add_workflows ) ) { - return; - } - - $workflows = HubWooContactProperties::get_instance()->_get( 'workflows' ); - - if ( ! empty( $workflows ) ) { - - foreach ( $workflows as $single_workflow ) { - - if ( isset( $single_workflow['name'] ) && $single_workflow['name'] == $name ) { - - $workflow_details = $single_workflow; - break; - } - } - } - - if ( ! empty( $workflow_details ) ) { - - $response = HubWooConnectionMananager::get_instance()->create_workflow( $workflow_details ); - - if ( isset( $response['status_code'] ) && ( 200 != $response['status_code'] ) ) { - - $response = HubwooErrorHandling::get_instance()->hubwoo_handle_response( $response, HubwooConst::HUBWOOWORKFLOW, array( 'current_workflow' => $workflow_details ) ); - } - - if ( 200 == $response['status_code'] ) { - - $add_workflows[] = $workflow_details['name']; - update_option( 'hubwoo-workflows-created', $add_workflows ); - - $workflow_data = isset( $response['body'] ) ? $response['body'] : ''; - - if ( ! empty( $workflow_data ) ) { - - $workflow_data = json_decode( - $workflow_data - ); - $id = isset( $workflow_data->id ) ? $workflow_data->id : ''; - update_option( $workflow_details['name'], $id ); - } - } - - echo wp_json_encode( $response ); - wp_die(); - } - } - } - - /** - * Ajax search for order statuses. - * - * @since 1.0.0 - */ - public function hubwoo_search_for_order_status() { - - $order_statuses = wc_get_order_statuses(); - - $modified_order_statuses = array(); - - if ( ! empty( $order_statuses ) ) { - - foreach ( $order_statuses as $status_key => $single_status ) { - - $modified_order_statuses[] = array( $status_key, $single_status ); - } - } - - echo wp_json_encode( $modified_order_statuses ); - - wp_die(); - } - - /** - * User roles for batch sync. - * - * @since 1.0.0 - */ - public function hubwoo_get_for_user_roles() { - - global $hubwoo; - - $user_roles = $hubwoo->hubwoo_get_user_roles(); - - $modified_order_statuses = array(); - - if ( ! empty( $user_roles ) ) { - - foreach ( $user_roles as $user_key => $single_role ) { - - $modified_order_statuses[] = array( $user_key, $single_role ); - } - } - - echo wp_json_encode( $modified_order_statuses ); - - wp_die(); - } - - /** - * Callback to sync contacts to hubspot in 1 click. - * - * @since 1.0.0 - */ - public function hubwoo_ocs_instant_sync() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - if ( ! empty( $_POST['step'] ) ) { - $step = sanitize_text_field( wp_unslash( $_POST['step'] ) ); - } else { - $step = ''; - } - - $contact_sync = true; - $hubwoo_datasync = new HubwooDataSync(); - - $total_need_syncing = $hubwoo_datasync->hubwoo_get_all_unique_user( true ); - - if ( ! $total_need_syncing ) { - - $percentage_done = 100; - $response = array( - 'step' => $step + 1, - 'progress' => $percentage_done, - 'completed' => true, - 'nocontacts' => true, - ); - - echo wp_json_encode( $response ); - wp_die(); - } - - $users_need_syncing = $hubwoo_datasync->hubwoo_get_all_unique_user(); - - $user_data = array(); - - $args = array(); - - if ( is_array( $users_need_syncing ) && count( $users_need_syncing ) ) { - - $user_data = $hubwoo_datasync->get_sync_data( $users_need_syncing ); - $args['ids'] = $users_need_syncing; - $args['type'] = 'user'; - } else { - - $roles = get_option( 'hubwoo_customers_role_settings', array() ); - - if ( in_array( 'guest_user', $roles, true ) ) { - - $contact_sync = false; - - $user_to_sync = $hubwoo_datasync->hubwoo_get_all_unique_user( false, 'guestOrder' ); - - $user_data = $hubwoo_datasync->get_guest_sync_data( $user_to_sync ); - $args['ids'] = $user_to_sync; - $args['type'] = 'order'; - } - } - - if ( ! empty( $user_data ) ) { - - if ( Hubwoo::is_valid_client_ids_stored() ) { - - $flag = true; - - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - $response = HubWooConnectionMananager::get_instance()->create_or_update_contacts( $user_data, $args ); - - if ( ( count( $user_data ) > 1 ) && isset( $response['status_code'] ) && 400 === $response['status_code'] ) { - - if ( isset( $response['response'] ) ) { - $error_response = json_decode( $response['response'], true ); - - if ( isset( $error_response['failureMessages'] ) ) { - - $failure_messages = $error_response['failureMessages']; - - if ( is_array( $failure_messages ) ) { - foreach ( $failure_messages as $failure_error ) { - $property_validation_error = isset( $failure_error['propertyValidationResult'] ) ? 1 : 0; - if ( $property_validation_error ) { - $percentage_done = 100; - $response = array( - 'step' => $step + 1, - 'progress' => $percentage_done, - 'completed' => true, - 'propertyError' => true, - ); - - echo wp_json_encode( $response ); - wp_die(); - } - } - } - } - } - $response = Hubwoo_Admin::hubwoo_split_contact_batch( $user_data ); - } - $hsocssynced = get_option( 'hubwoo_ocs_contacts_synced', 0 ); - - if ( ! empty( $user_to_sync ) ) { - $hsocssynced += count( $user_to_sync ); - } - - if ( $contact_sync ) { - foreach ( $users_need_syncing as $user_id ) { - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'synced' ); - } - } else { - foreach ( $user_to_sync as $order_id ) { - //hpos changes - $order = wc_get_order($order_id); - $order->update_meta_data('hubwoo_pro_guest_order', 'synced'); - $order->save(); - } - } - - update_option( 'hubwoo_ocs_contacts_synced', $hsocssynced ); - } - } - } - - $percentage_done = 0; - $total_users = get_option( 'hubwoo_total_ocs_need_sync', 0 ); - if ( $total_users ) { - - $synced = $total_users - $total_need_syncing; - $percentage = ( $synced / $total_users ) * 100; - $percentage_done = sprintf( '%.2f', $percentage ); - } - - $response = array( - 'step' => $step + 1, - 'progress' => $percentage_done, - 'totalNeedSyncing' => $total_need_syncing, - 'synced' => wp_json_encode( $users_need_syncing ), - ); - - $contactqueue = $hubwoo_datasync->hubwoo_get_all_unique_user( true ); - - if ( ! $contactqueue ) { - $response['progress'] = 100; - $response['completed'] = true; - delete_option( 'hubwoo_total_ocs_need_sync' ); - delete_option( 'hubwoo_ocs_contacts_synced' ); - } - - echo wp_json_encode( $response ); - - wp_die(); - } - - - /** - * Update workflow listing window when a workflow is created. - * - * @since 1.0.0 - */ - public function hubwoo_update_workflow_tab() { - - global $hubwoo; - - $created_workflows = get_option( 'hubwoo-workflows-created', '' ); - - $workflows_dependencies = $hubwoo->hubwoo_workflows_dependency(); - - $updated_tabs = array(); - - $dependencies_count = 0; - - if ( is_array( $workflows_dependencies ) && count( $workflows_dependencies ) ) { - foreach ( $workflows_dependencies as $workflows ) { - $dependencies_count = count( $workflows['dependencies'] ); - $counter = 0; - foreach ( $workflows['dependencies'] as $dependencies ) { - if ( is_array( $created_workflows ) && count( $created_workflows ) ) { - if ( in_array( $dependencies, $created_workflows, true ) ) { - $counter++; - } - } - } - if ( $counter === $dependencies_count ) { - $updated_tabs[] = $workflows['workflow']; - } - } - } - echo wp_json_encode( $updated_tabs ); - wp_die(); - } - - /** - * Email the hubspot API error log. - * - * @since 1.0.0 - */ - public function hubwoo_email_the_error_log() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - $log_dir = WC_LOG_DIR . 'hubspot-for-woocommerce-logs.log'; - $attachments = array( $log_dir ); - $to = 'integrations@makewebbetter.com'; - $subject = 'HubSpot Pro Error Logs'; - $headers = array( 'Content-Type: text/html; charset=UTF-8' ); - $message = 'admin email: ' . get_option( 'admin_email', '' ) . '
'; - $status = wp_mail( $to, $subject, $message, $headers, $attachments ); - - if ( 1 === $status ) { - $status = 'success'; - } else { - $status = 'failure'; - } - update_option( 'hubwoo_pro_alert_param_set', false ); - echo wp_json_encode( $status ); - wp_die(); - } - - - /** - * Disconnect hubspot account. - * - * @since 1.0.0 - */ - public function hubwoo_disconnect_account() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - global $hubwoo; - - $delete_meta = false; - - if ( isset( $_POST['data'] ) ) { - $data = map_deep( wp_unslash( $_POST['data'] ), 'sanitize_text_field' ); - $delete_meta = 'yes' == $data['delete_meta'] ? true : false; - } - - $hubwoo->hubwoo_switch_account( true, $delete_meta ); - echo wp_json_encode( true ); - wp_die(); - } - - /** - * Get wordpress/woocommerce user roles. - * - * @since 1.0.0 - */ - public function hubwoo_get_user_for_current_roles() { - // check the nonce sercurity. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - $hubwoo_data_sync = new HubwooDataSync(); - $unique_users = $hubwoo_data_sync->hubwoo_get_all_unique_user( true ); - update_option( 'hubwoo_total_ocs_need_sync', $unique_users ); - echo wp_json_encode( $unique_users ); - wp_die(); - } - - /** - * Get sync status for contact/deal. - * - * @since 1.0.0 - */ - public function hubwoo_get_current_sync_status() { - // check the nonce sercurity. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - if ( ! empty( $_POST['data'] ) ) { - $type = map_deep( wp_unslash( $_POST['data'] ), 'sanitize_text_field' ); - } else { - $type = ''; - } - if ( isset( $type['type'] ) ) { - switch ( $type['type'] ) { - case 'contact': - $status = get_option( 'hubwoo_background_process_running', false ); - break; - case 'deal': - $status = get_option( 'hubwoo_deals_sync_running', 0 ); - break; - default: - $status = false; - break; - } - echo wp_json_encode( $status ); - } - wp_die(); - } - - /** - * Saving Updates to the Database. - * - * @since 1.0.0 - */ - public function hubwoo_save_updates() { - - // check the nonce sercurity. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - if ( isset( $_POST['updates'] ) && ! empty( $_POST['action'] ) ) { - $updates = map_deep( wp_unslash( $_POST['updates'] ), 'sanitize_text_field' ); - - if ( isset( $_POST['type'] ) ) { - $action = map_deep( wp_unslash( $_POST['type'] ), 'sanitize_text_field' ); - $status = false; - if ( count( $updates ) ) { - - foreach ( $updates as $db_key => $value ) { - - if ( 'update' === $action ) { - $value = 'EMPTY_ARRAY' === $value ? array() : $value; - update_option( $db_key, $value ); - } elseif ( 'delete' === $action ) { - delete_option( $value ); - } - } - - $status = true; - } - echo wp_json_encode( $status ); - wp_die(); - } - } - } - - /** - * Saving Updates to the Database. - * - * @since 1.0.0 - */ - public function hubwoo_manage_sync() { - - // check the nonce sercurity. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - if ( ! empty( $_POST['process'] ) ) { - $process = map_deep( wp_unslash( $_POST['process'] ), 'sanitize_text_field' ); - - if ( ! empty( $process ) ) { - - if ( 'start-deal' === $process ) { - $orders_needs_syncing = Hubwoo_Admin::hubwoo_orders_count_for_deal(); - if ( $orders_needs_syncing ) { - - update_option( 'hubwoo_deals_sync_running', 1 ); - update_option( 'hubwoo_deals_sync_total', $orders_needs_syncing ); - as_schedule_recurring_action( time(), 300, 'hubwoo_deals_sync_background' ); - } - } else { - Hubwoo::hubwoo_stop_sync( $process ); - } - echo true; - } - } - - wp_die(); - } - - /** - * Manages Vids to Database. - * - * @since 1.0.0 - */ - public function hubwoo_manage_vids() { - - // check the nonce sercurity. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - $status = false; - - if ( ! empty( $_POST['process'] ) ) { - $process = map_deep( wp_unslash( $_POST['process'] ), 'sanitize_text_field' ); - if ( ! empty( $process ) ) { - switch ( $process ) { - case 'contact': - update_option( 'hubwoo_contact_vid_update', 1 ); - as_schedule_recurring_action( time(), 300, 'hubwoo_update_contacts_vid' ); - $status = true; - break; - case 'deal': - delete_option( 'hubwoo_ecomm_order_date_allow' ); - $orders_needs_syncing = Hubwoo_Admin::hubwoo_orders_count_for_deal(); - if ( $orders_needs_syncing ) { - update_option( 'hubwoo_deals_sync_running', 1 ); - update_option( 'hubwoo_deals_sync_total', $orders_needs_syncing ); - as_schedule_recurring_action( time(), 300, 'hubwoo_deals_sync_background' ); - $status = true; - } - break; - default: - break; - } - } - } - echo wp_json_encode( $status ); - wp_die(); - } - - /** - * Ajax call to search for deal stages. - * - * @since 1.0.0 - */ - public function hubwoo_deals_search_for_stages() { - - $stages = get_option( 'hubwoo_fetched_deal_stages', array() ); - - $existing_stages = array(); - - $deal_stage_id = 'stageId'; - - if ( 'yes' == get_option( 'hubwoo_ecomm_pipeline_created', 'no' ) ) { - $deal_stage_id = 'id'; - } - - if ( is_array( $stages ) && count( $stages ) ) { - - foreach ( $stages as $stage ) { - - $existing_stages[] = array( $stage[ $deal_stage_id ], $stage['label'] ); - } - } - - echo wp_json_encode( $existing_stages ); - wp_die(); - } - - /** - * Get orders count for 1 click sync. - * - * @since 1.0.0 - */ - public function hubwoo_ecomm_get_ocs_count() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - $ocs_order_count = Hubwoo_Admin::hubwoo_orders_count_for_deal(); - if ( 1 != get_option( 'hubwoo_deals_sync_running', 0 ) ) { - update_option( 'hubwoo_deals_current_sync_total', $ocs_order_count ); - } - echo wp_json_encode( $ocs_order_count ); - wp_die(); - } - - /** - * Track sync percentage and eta for background processes - * - * @since 1.0.0 - */ - public function hubwoo_sync_status_tracker() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - $response = array( - 'percentage' => 0, - 'is_running' => 'no', - ); - - if ( isset( $_POST['process'] ) ) { - $process = map_deep( wp_unslash( $_POST['process'] ), 'sanitize_text_field' ); - if ( ! empty( $process ) ) { - switch ( $process ) { - case 'contact': - if ( get_option( 'hubwoo_background_process_running', false ) ) { - - $unique_users = Hubwoo::hubwoo_get_total_contact_need_sync(); - update_option( 'hubwoo_total_ocs_contact_need_sync', $unique_users ); - - $users_to_sync = get_option( 'hubwoo_total_ocs_contact_need_sync', 0 ); - $current_user_sync = get_option( 'hubwoo_ocs_contacts_synced', 0 ); - $perc = round( $current_user_sync * 100 / $users_to_sync ); - $response['percentage'] = $perc > 100 ? 100 : $perc; - $response['is_running'] = 'yes'; - - if ( 100 == $response['percentage'] ) { - update_option( 'hubwoo_background_process_running', false ); - } - } - - break; - case 'product': - if ( 'yes' == get_option( 'hubwoo_start_product_sync', 'no' ) ) { - $total_products = get_option( 'hubwoo_products_to_sync', 0 ); - $sync_result = Hubwoo::hubwoo_make_db_query( 'total_synced_products' ); - if ( ! empty( $sync_result ) ) { - $sync_result = (array) $sync_result[0]; - $synced_products = $sync_result['COUNT(post_id)']; - if ( 0 != $total_products ) { - $response['percentage'] = round( $synced_products * 100 / $total_products ); - $response['eta'] = Hubwoo::hubwoo_create_sync_eta( $synced_products, $total_products, 3, 5 ); - $response['is_running'] = 'yes'; - } - } - } - break; - case 'order': - if ( 1 == get_option( 'hubwoo_deals_sync_running', 0 ) ) { - $data = Hubwoo::get_sync_status(); - $response['percentage'] = $data['deals_progress']; - $response['eta'] = $data['eta_deals_sync']; - $response['is_running'] = 'yes'; - } - break; - } - echo wp_json_encode( $response ); - } - } - wp_die(); - } - /** - * Upserting ecomm bridge settings for hubspot objects-contact,deal,product,line-item - * - * @since 1.0.0 - */ - public function hubwoo_ecomm_setup() { - - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - $response = array( - 'status_code' => 404, - 'response' => 'E-Commerce Bridge Setup Failed.', - ); - - if ( ! empty( $_POST['process'] ) ) { - $process = map_deep( wp_unslash( $_POST['process'] ), 'sanitize_text_field' ); - - if ( ! empty( $process ) ) { - switch ( $process ) { - case 'get-total-products': - $store = Hubwoo::get_store_data(); - break; - case 'update-deal-stages': - $deal_stages = Hubwoo::fetch_deal_stages_from_pipeline( 'Ecommerce Pipeline', false ); - $deal_model = Hubwoo::hubwoo_deal_stage_model(); - $process_deal_stages = array_map( - function ( $deal_stage_data ) use ( $deal_model ) { - $updates = ( isset( $deal_model[ $deal_stage_data['id'] ] ) && ! empty( $deal_model[ $deal_stage_data['id'] ] ) ) ? $deal_model[ $deal_stage_data['id'] ] : ''; - if ( ! empty( $updates ) ) { - foreach ( $updates as $key => $value ) { - if ( array_key_exists( $key, $deal_stage_data ) ) { - $deal_stage_data[ $key ] = $value; - } - } - } - return $deal_stage_data; - }, - $deal_stages['stages'] - ); - $deal_stages['stages'] = $process_deal_stages; - $pipeline_id = $deal_stages['id']; - unset( $deal_stages['id'] ); - $response = HubWooConnectionMananager::get_instance()->update_deal_pipeline( $deal_stages, $pipeline_id ); - update_option( 'hubwoo_ecomm_final_mapping', Hubwoo::hubwoo_deals_mapping() ); - break; - case 'reset-mapping': - if ( ! empty( $_POST['pipeline'] ) ) { - $selected_pipeline = map_deep( wp_unslash( $_POST['pipeline'] ), 'sanitize_text_field' ); - if ( 'Ecommerce Pipeline' == $selected_pipeline ) { - update_option( 'hubwoo_ecomm_final_mapping', Hubwoo::hubwoo_deals_mapping() ); - } else if ( 'Sales Pipeline' == $selected_pipeline ) { - update_option( 'hubwoo_ecomm_final_mapping', Hubwoo::hubwoo_sales_deals_mapping() ); - } - } else { - update_option( 'hubwoo_ecomm_final_mapping', '' ); - } - break; - case 'start-products-sync': - if ( ! as_next_scheduled_action( 'hubwoo_products_sync_background' ) ) { - update_option( 'hubwoo_start_product_sync', 'yes' ); - as_schedule_recurring_action( time(), 180, 'hubwoo_products_sync_background' ); - } - $response['status_code'] = 200; - $response['response'] = 'Product Sync-Status has been initiated'; - break; - - } - echo wp_json_encode( $response ); - } - } - wp_die(); - } - - /** - * Get the onboarding submission data. - * - * @since 1.0.4 - */ - public function hubwoo_get_onboard_form() { - - // check the nonce sercurity. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - if ( ! empty( $_POST['key'] ) ) { - $key = map_deep( wp_unslash( $_POST['key'] ), 'sanitize_text_field' ); - $key = str_replace( '[]', '', $key ); - $options = array_map( - function( $option ) { - return array( $option, $option ); - }, - Hubwoo::hubwoo_onboarding_questionaire()[ $key ]['options'] - ); - echo json_encode( $options ); - } - wp_die(); - } - - /** - * Handle the onboarding form submision. - * - * @since 1.0.4 - */ - public function hubwoo_onboard_form() { - // check the nonce sercurity. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - if ( ! empty( $_POST['formData'] ) ) { - $form_data = map_deep( wp_unslash( $_POST['formData'] ), 'sanitize_text_field' ); - if ( ! empty( $form_data ) ) { - $form_details = array(); - array_walk( - $form_data, - function( $field, $name ) use ( &$form_details ) { - if ( is_array( $field ) ) { - $field = HubwooGuestOrdersManager::hubwoo_format_array( $field ); - } - $form_details['fields'][] = array( - 'name' => $name, - 'value' => $field, - ); - } - ); - echo json_encode( HubWooConnectionMananager::get_instance()->submit_form_data( $form_details, '5373140', '0354594f-26ce-414d-adab-4e89f2104902' ) ); - } - } - wp_die(); - } - - - /** - * Generate Contacts CSV file. - */ - public function hubwoo_ocs_historical_contact() { - - // Nonce verification. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - if ( ! empty( $_POST['step'] ) ) { - $step = sanitize_text_field( wp_unslash( $_POST['step'] ) ); - } else { - $step = ''; - } - - $hubwoo_datasync = new HubwooDataSync(); - $total_need_syncing = $hubwoo_datasync->hubwoo_get_all_unique_user( true ); - $server_time = ini_get( 'max_execution_time' ); - - if ( isset( $server_time ) && $server_time < 1500 ) { - $server_time = 1500; - } - - if ( ! $total_need_syncing ) { - - $percentage_done = 100; - - echo wp_json_encode( - array( - 'step' => $step + 1, - 'progress' => $percentage_done, - 'max_time' => empty( $server_time ) ? 1500 : $server_time, - 'status' => true, - 'response' => true, - ) - ); - wp_die(); - - } else { - $percentage_done = 0; - - echo wp_json_encode( - array( - 'step' => $step, - 'progress' => $percentage_done, - 'max_time' => empty( $server_time ) ? '1500' : $server_time, - 'status' => true, - 'contact' => $total_need_syncing, - 'response' => 'Historical contact data found.', - ) - ); - wp_die(); - } - - } - - /** - * Import historical contacts csv to hubspot. - */ - public function hubwoo_historical_contact_sync() { - - // Nonce verification. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - if ( ! empty( $_POST['step'] ) ) { - $step = sanitize_text_field( wp_unslash( $_POST['step'] ) ); - } else { - $step = ''; - } - - if ( ! empty( $_POST['max_item'] ) ) { - $max_item = sanitize_text_field( wp_unslash( $_POST['max_item'] ) ); - } else { - $max_item = 15; - } - - $con_get_vid = ! empty( $_POST['con_get_vid'] ) ? sanitize_text_field( wp_unslash( $_POST['con_get_vid'] ) ) : 'final_request'; - $skip_product = 'false'; - $user_ids = array(); - - $contraints = array( - array( - 'key' => 'hubwoo_ecomm_pro_id', - 'compare' => 'NOT EXISTS', - ), - array( - 'key' => 'hubwoo_ecomm_invalid_pro', - 'compare' => 'NOT EXISTS', - ), - array( - 'key' => 'hubwoo_product_synced', - 'compare' => 'NOT EXISTS', - ), - 'relation' => 'AND', - ); - - $total_products = Hubwoo::hubwoo_ecomm_get_products( -1, $contraints ); - - if ( 'yes' == get_option( 'hubwoo_product_scope_needed', 'no' ) ) { - $total_products = array(); - $skip_product = 'true'; - } - - if ( count( $total_products ) == 0 ) { - - if( Hubwoo::hubwoo_check_hpos_active() ) { - $query = new WC_Order_Query(array( - 'posts_per_page' => -1, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'orderby' => 'date', - 'order' => 'desc', - 'return' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'post_parent' => 0, - 'meta_key' => 'hubwoo_ecomm_deal_created', - 'meta_compare' => 'NOT EXISTS', - )); - - $order_ids = $query->get_orders(); - } else { - $query = new WP_Query(); - - $order_args = array( - 'post_type' => 'shop_order', - 'posts_per_page' => -1, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'orderby' => 'date', - 'order' => 'desc', - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'meta_query' => array( - array( - 'key' => 'hubwoo_ecomm_deal_created', - 'compare' => 'NOT EXISTS', - ), - ), - ); - - $order_ids = $query->query( $order_args ); - } - } - - $hubwoo_datasync = new HubwooDataSync(); - $user_ids = $hubwoo_datasync->hubwoo_get_all_unique_user( false, 'customer', $max_item ); - - $response = ''; - - if ( empty( $user_ids ) ) { - $percentage_done = 100; - echo wp_json_encode( - array( - 'step' => $step + 1, - 'progress' => $percentage_done, - 'status' => true, - 'total_prod' => empty( $total_products ) ? 0 : count( $total_products ), - 'total_deals' => empty( $order_ids ) ? 0 : count( $order_ids ), - 'skip_product' => $skip_product, - 'response' => 'No Contact found.', - ) - ); - wp_die(); - } - - foreach ( $user_ids as $user_id ) { - - $user_info = json_decode( json_encode( get_userdata( $user_id ) ), true ); - $user_email = $user_info['data']['user_email']; - $contact = array(); - $properties = array(); - - $hubwoo_customer = new HubWooCustomer( $user_id ); - $properties = $hubwoo_customer->get_contact_properties(); - $user_properties = $hubwoo_customer->get_user_data_properties( $properties ); - foreach ( $user_properties as $key => $property ) { - $contact[ $property['property'] ] = $property['value']; - } - $contact['email'] = $user_email; - $contact = array( - 'properties' => $contact, - ); - - if ( ! empty( $contact ) ) { - $flag = true; - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - - $response = HubWooConnectionMananager::get_instance()->create_object_record( 'contacts', $contact ); - - if ( 201 == $response['status_code'] ) { - $contact_vid = json_decode( $response['body'] ); - update_user_meta( $user_id, 'hubwoo_user_vid', $contact_vid->id ); - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'synced' ); - - } else if ( 409 == $response['status_code'] ) { - $contact_vid = json_decode( $response['body'] ); - $hs_id = explode( 'ID: ', $contact_vid->message ); - update_user_meta( $user_id, 'hubwoo_user_vid', $hs_id[1] ); - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'synced' ); - } else if ( 400 == $response['status_code'] ) { - update_user_meta( $user_id, 'hubwoo_invalid_contact', 'yes' ); - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'synced' ); - } - - do_action( 'hubwoo_ecomm_contact_synced', $user_email ); - } - } - } - - echo wp_json_encode( - array( - 'step' => $step + 1, - 'status' => true, - 'total_prod' => empty( $total_products ) ? 0 : count( $total_products ), - 'total_deals' => empty( $order_ids ) ? 0 : count( $order_ids ), - 'skip_product' => $skip_product, - 'response' => 'Historical contacts synced successfully.', - ) - ); - wp_die(); - - } - - /** - * Sync historical products data. - */ - public function hubwoo_historical_products_import() { - - // Nonce verification. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - $order_ids = array(); - - $step = ! empty( $_POST['step'] ) ? sanitize_text_field( wp_unslash( $_POST['step'] ) ) : ''; - - $pro_get_vid = ! empty( $_POST['pro_get_vid'] ) ? sanitize_text_field( wp_unslash( $_POST['pro_get_vid'] ) ) : 'final_request'; - - if ( ! empty( $_POST['max_item'] ) ) { - $max_item = sanitize_text_field( wp_unslash( $_POST['max_item'] ) ); - } else { - $max_item = 15; - } - - if( Hubwoo::hubwoo_check_hpos_active() ) { - $query = new WC_Order_Query(array( - 'posts_per_page' => -1, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'orderby' => 'date', - 'order' => 'desc', - 'return' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'post_parent' => 0, - 'meta_key' => 'hubwoo_ecomm_deal_created', - 'meta_compare' => 'NOT EXISTS', - )); - - $order_ids = $query->get_orders(); - } else { - - $query = new WP_Query(); - - $order_args = array( - 'post_type' => 'shop_order', - 'posts_per_page' => -1, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'orderby' => 'date', - 'order' => 'desc', - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'meta_query' => array( - array( - 'key' => 'hubwoo_ecomm_deal_created', - 'compare' => 'NOT EXISTS', - ), - ), - ); - - $order_ids = $query->query( $order_args ); - } - - $product_data = Hubwoo::hubwoo_get_product_data( $max_item ); - - if ( empty( $product_data ) ) { - echo wp_json_encode( - array( - 'step' => $step + 1, - 'status' => true, - 'total_deals' => empty( $order_ids ) ? '' : count( $order_ids ), - 'response' => 'No products found to sync.', - ) - ); - wp_die(); - } - - if ( ! empty( $product_data ) && is_array( $product_data ) ) { - foreach ( $product_data as $pro_id => $value ) { - - $filtergps = array(); - $product_data = array( - 'properties' => $value['properties'], - ); - - $flag = true; - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - - $product = wc_get_product( $pro_id ); - - $filtergps = array( - 'filterGroups' => array( - array( - 'filters' => array( - array( - 'value' => $pro_id, - 'propertyName' => 'store_product_id', - 'operator' => 'EQ', - ), - ), - ), - ), - ); - - if( !empty($product->get_sku()) ) { - $filtergps['filterGroups'][] = array( - 'filters' => array( - array( - 'value' => $product->get_sku(), - 'propertyName' => 'hs_sku', - 'operator' => 'EQ', - ), - ), - ); - } - - $response = HubWooConnectionMananager::get_instance()->search_object_record( 'products', $filtergps ); - - if ( 200 == $response['status_code'] ) { - $responce_body = json_decode( $response['body'] ); - $result = $responce_body->results; - if ( ! empty( $result ) ) { - foreach ( $result as $key => $value ) { - update_post_meta( $pro_id, 'hubwoo_ecomm_pro_id', $value->id ); - } - } - } - - $pro_hs_id = get_post_meta( $pro_id, 'hubwoo_ecomm_pro_id', true ); - - if ( ! empty( $pro_hs_id ) ) { - $response = HubWooConnectionMananager::get_instance()->update_object_record( 'products', $pro_hs_id, $product_data ); - if ( 200 == $response['status_code'] ) { - delete_post_meta( $pro_id, 'hubwoo_product_synced' ); - } - } else { - $response = HubWooConnectionMananager::get_instance()->create_object_record( 'products', $product_data ); - if ( 201 == $response['status_code'] ) { - $response_body = json_decode( $response['body'] ); - update_post_meta( $pro_id, 'hubwoo_ecomm_pro_id', $response_body->id ); - delete_post_meta( $pro_id, 'hubwoo_product_synced' ); - } - } - do_action( 'hubwoo_update_product_property', $pro_id ); - } - } - - if ( 'final_request' == $pro_get_vid ) { - update_option( 'hubwoo_ecomm_setup_completed', 'yes' ); - } - - echo wp_json_encode( - array( - 'step' => $step + 1, - 'status' => true, - 'total_deals' => empty( $order_ids ) ? '' : count( $order_ids ), - 'response' => 'Products batch synced succesfully', - ) - ); - wp_die(); - } - } - - /** - * Sync historical deals to HubSpot. - */ - public function hubwoo_historical_deals_sync() { - - // Nonce verification. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - $object_type = 'DEAL'; - $deal_updates = array(); - - $step = ! empty( $_POST['step'] ) ? sanitize_text_field( wp_unslash( $_POST['step'] ) ) : ''; - - if ( ! empty( $_POST['max_item'] ) ) { - $max_item = sanitize_text_field( wp_unslash( $_POST['max_item'] ) ); - } else { - $max_item = 15; - } - - if( Hubwoo::hubwoo_check_hpos_active() ) { - $query = new WC_Order_Query(array( - 'posts_per_page' => $max_item, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'orderby' => 'date', - 'order' => 'desc', - 'return' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'post_parent' => 0, - 'meta_key' => 'hubwoo_ecomm_deal_created', - 'meta_compare' => 'NOT EXISTS', - )); - - $order_ids = $query->get_orders(); - } else { - - $query = new WP_Query(); - - $order_args = array( - 'post_type' => 'shop_order', - 'posts_per_page' => $max_item, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'orderby' => 'date', - 'order' => 'desc', - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'meta_query' => array( - array( - 'key' => 'hubwoo_ecomm_deal_created', - 'compare' => 'NOT EXISTS', - ), - ), - ); - - $order_ids = $query->query( $order_args ); - } - - if ( empty( $order_ids ) ) { - - echo wp_json_encode( - array( - 'step' => $step + 1, - 'status' => true, - 'response' => 'No deals found to sync.', - ) - ); - wp_die(); - - } - - foreach ( $order_ids as $order_id ) { - - $order = wc_get_order( $order_id ); - $deal_updates = array(); - - if ( $order instanceof WC_Order ) { - - $customer_id = $order->get_customer_id(); - - if ( ! empty( $customer_id ) ) { - $source = 'user'; - HubwooObjectProperties::hubwoo_ecomm_contacts_with_id( $customer_id ); - - } else { - $source = 'guest'; - $guest_object_type = 'CONTACT'; - - $guest_user_properties = $this->mwb_get_guestuser_properties( $order_id ); - $contact_properties = array(); - foreach ( $guest_user_properties as $key => $value ) { - - $contact_properties[ $value['property'] ] = $value['value']; - } - $guest_contact_properties = apply_filters( 'hubwoo_map_ecomm_guest_' . $guest_object_type . '_properties', $contact_properties, $order_id ); - - $contacts = array(); - if ( isset( $order_id ) ) { - //hpos changes - $user_data = array(); - $user_data['email'] = $order->get_billing_email(); - $user_data['customer_group'] = 'guest'; - $user_data['firstname'] = $order->get_billing_first_name(); - $user_data['lastname'] = $order->get_billing_last_name(); - $user_data['customer_source_store'] = get_bloginfo( 'name' ); - $user_data['hs_language'] = $order->get_meta('hubwoo_preferred_language', true); - foreach ( $guest_contact_properties as $key => $value ) { - $user_data[ $key ] = $value; - } - $user_vid = $order->get_meta('hubwoo_user_vid', true); - $contacts = array( - 'properties' => $user_data, - ); - } - - if ( ! empty( $contacts ) ) { - - $flag = true; - - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - - if ( ! empty( $user_vid ) ) { - $response = HubWooConnectionMananager::get_instance()->update_object_record( 'contacts', $user_vid, $contacts ); - } else { - $response = HubWooConnectionMananager::get_instance()->create_object_record( 'contacts', $contacts ); - - if ( 201 == $response['status_code'] ) { - $contact_vid = json_decode( $response['body'] ); - $order->update_meta_data('hubwoo_user_vid', $contact_vid->id); - $order->update_meta_data('hubwoo_pro_guest_order', 'synced'); - $order->save(); - - } else if ( 409 == $response['status_code'] ) { - $contact_vid = json_decode( $response['body'] ); - $hs_id = explode( 'ID: ', $contact_vid->message ); - $order->update_meta_data('hubwoo_user_vid', $hs_id[1]); - $order->update_meta_data('hubwoo_pro_guest_order', 'synced'); - $order->save(); - } else if ( 400 == $response['status_code'] ) { - $order->update_meta_data('hubwoo_invalid_contact', 'yes'); - $order->update_meta_data('hubwoo_pro_user_data_change', 'synced'); - $order->update_meta_data('hubwoo_pro_guest_order', 'synced'); - $order->save(); - } - } - - $user_email = $order->get_billing_email(); - do_action( 'hubwoo_ecomm_contact_synced', $user_email ); - } - } - } - } - - $assc_deal_cmpy = get_option( 'hubwoo_assoc_deal_cmpy_enable', 'yes' ); - $pipeline_id = get_option( 'hubwoo_ecomm_pipeline_id', false ); - $hubwoo_ecomm_deal = new HubwooEcommObject( $order_id, $object_type ); - $deal_properties = $hubwoo_ecomm_deal->get_object_properties(); - $deal_properties = apply_filters( 'hubwoo_map_ecomm_' . $object_type . '_properties', $deal_properties, $order_id ); - - if ( 'yes' == get_option( 'hubwoo_deal_multi_currency_enable', 'no' ) ) { - $currency = $order->get_currency(); - if ( ! empty( $currency ) ) { - $deal_properties['deal_currency_code'] = $currency; - } - } - - if ( empty( $pipeline_id ) ) { - Hubwoo::get_all_deal_stages(); - $pipeline_id = get_option( 'hubwoo_ecomm_pipeline_id', false ); - } - - $deal_properties['pipeline'] = $pipeline_id; - - $deal_updates = array( - 'properties' => $deal_properties, - ); - $response = ''; - - if ( 'user' == $source ) { - $user_info = json_decode( wp_json_encode( get_userdata( $customer_id ) ), true ); - $user_email = $user_info['data']['user_email']; - $contact = $user_email; - if ( empty( $contact ) ) { - $contact = $customer_id; - } - $contact_vid = get_user_meta( $customer_id, 'hubwoo_user_vid', true ); - $invalid_contact = get_user_meta( $customer_id, 'hubwoo_invalid_contact', true ); - } else { - $contact_vid = $order->get_meta('hubwoo_user_vid', true); - $contact = $order->get_billing_email(); - $invalid_contact = $order->get_meta('hubwoo_invalid_contact', true); - } - - if ( count( $deal_updates ) ) { - - $flag = true; - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - - $deal_name = '#' . $order_id; - - $user_detail['first_name'] = $order->get_billing_first_name(); - $user_detail['last_name'] = $order->get_billing_last_name(); - - foreach ( $user_detail as $value ) { - if ( ! empty( $value ) ) { - $deal_name .= ' ' . $value; - } - } - - $filtergps = array( - 'filterGroups' => array( - array( - 'filters' => array( - array( - 'value' => $deal_name, - 'propertyName' => 'dealname', - 'operator' => 'EQ', - ), - ), - ), - ), - ); - - $response = HubWooConnectionMananager::get_instance()->search_object_record( 'deals', $filtergps ); - - if ( 200 == $response['status_code'] ) { - $responce_body = json_decode( $response['body'] ); - $result = $responce_body->results; - if ( ! empty( $result ) ) { - foreach ( $result as $key => $value ) { - $order->update_meta_data('hubwoo_ecomm_deal_id', $value->id); - $order->update_meta_data('hubwoo_order_line_item_created', 'yes'); - $order->save(); - } - } - } - - $hubwoo_ecomm_deal_id = $order->get_meta('hubwoo_ecomm_deal_id', true); - - if ( empty( $hubwoo_ecomm_deal_id ) ) { - $response = HubWooConnectionMananager::get_instance()->create_object_record( 'deals', $deal_updates ); - if ( 201 == $response['status_code'] ) { - $response_body = json_decode( $response['body'] ); - $hubwoo_ecomm_deal_id = $response_body->id; - $order->update_meta_data('hubwoo_ecomm_deal_id', $hubwoo_ecomm_deal_id ); - $order->save(); - } - } else { - $response = HubWooConnectionMananager::get_instance()->update_object_record( 'deals', $hubwoo_ecomm_deal_id, $deal_updates ); - } - - HubWooConnectionMananager::get_instance()->associate_object( 'deal', $hubwoo_ecomm_deal_id, 'contact', $contact_vid, 3 ); - - do_action( 'hubwoo_ecomm_deal_created', $order_id ); - - if ( 'yes' == $assc_deal_cmpy ) { - if ( ! empty( $contact ) && empty( $invalid_contact ) ) { - Hubwoo::hubwoo_associate_deal_company( $contact, $hubwoo_ecomm_deal_id ); - } - } - $this->bulk_line_item_link( $order_id ); - } - } - } - - echo wp_json_encode( - array( - 'step' => $step + 1, - 'status' => true, - 'response' => 'Deals batch synced succesfully', - ) - ); - wp_die(); - - } - - /** - * Hide review notice. - */ - public function hubwoo_hide_rev_notice() { - - // Nonce verification. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - update_option( 'hubwoo_hide_rev_notice', 'yes' ); - - echo wp_json_encode( - array( - 'status' => true, - 'response' => 'Notice hide succesfully', - ) - ); - wp_die(); - } - - /** - * Hide HPOS notice - */ - public function hubwoo_hide_hpos_notice(){ - // Nonce verification. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - update_option( 'hubwoo_hide_hpos_notice', 'yes' ); - - echo wp_json_encode( - array( - 'status' => true, - 'response' => 'Notice hide succesfully', - ) - ); - wp_die(); - } - - /** - * Get guest user properties. - * - * @param int $order_id Order ID. - */ - public function mwb_get_guestuser_properties( $order_id ) { - - global $hubwoo; - - $hubwoo_guest_order = wc_get_order( $order_id ); - - if ( $hubwoo_guest_order instanceof WC_Order ) { - //hpos changes - $guest_email = $hubwoo_guest_order->get_billing_email(); - - $guest_order_callback = new HubwooGuestOrdersManager( $order_id ); - - $guest_user_properties = $guest_order_callback->get_order_related_properties( $order_id, $guest_email ); - - $guest_user_properties = $hubwoo->hubwoo_filter_contact_properties( $guest_user_properties ); - - $fname = $hubwoo_guest_order->get_billing_first_name(); - if ( ! empty( $fname ) ) { - $guest_user_properties[] = array( - 'property' => 'firstname', - 'value' => $fname, - ); - } - - $lname = $hubwoo_guest_order->get_billing_last_name(); - if ( ! empty( $lname ) ) { - $guest_user_properties[] = array( - 'property' => 'lastname', - 'value' => $lname, - ); - } - - $cname = $hubwoo_guest_order->get_billing_company(); - if ( ! empty( $cname ) ) { - $guest_user_properties[] = array( - 'property' => 'company', - 'value' => $cname, - ); - } - - $city = $hubwoo_guest_order->get_billing_city(); - if ( ! empty( $city ) ) { - $guest_user_properties[] = array( - 'property' => 'city', - 'value' => $city, - ); - } - - $state = $hubwoo_guest_order->get_billing_state(); - if ( ! empty( $state ) ) { - $guest_user_properties[] = array( - 'property' => 'state', - 'value' => $state, - ); - } - - $country = $hubwoo_guest_order->get_billing_country(); - if ( ! empty( $country ) ) { - $guest_user_properties[] = array( - 'property' => 'country', - 'value' => Hubwoo::map_country_by_abbr( $country ), - ); - } - - $address1 = $hubwoo_guest_order->get_billing_address_1(); - $address2 = $hubwoo_guest_order->get_billing_address_2(); - if ( ! empty( $address1 ) || ! empty( $address2 ) ) { - $address = $address1 . ' ' . $address2; - $guest_user_properties[] = array( - 'property' => 'address', - 'value' => $address, - ); - } - - $zip = $hubwoo_guest_order->get_billing_postcode(); - if ( ! empty( $zip ) ) { - $guest_user_properties[] = array( - 'property' => 'zip', - 'value' => $zip, - ); - } - - $guest_phone = $hubwoo_guest_order->get_billing_phone(); - - if ( ! empty( $guest_phone ) ) { - $guest_user_properties[] = array( - 'property' => 'mobilephone', - 'value' => $guest_phone, - ); - $guest_user_properties[] = array( - 'property' => 'phone', - 'value' => $guest_phone, - ); - } - - $customer_new_order_flag = 'no'; - $prop_index = array_search( 'customer_new_order', array_column( $guest_user_properties, 'property' ) ); - - if ( Hubwoo_Admin::hubwoo_check_for_properties( 'order_recency_rating', 5, $guest_user_properties ) ) { - - if ( Hubwoo_Admin::hubwoo_check_for_properties( 'last_order_status', get_option( 'hubwoo_no_status', 'wc-completed' ), $guest_user_properties ) ) { - - $customer_new_order_flag = 'yes'; - } - } - - if ( $prop_index ) { - $guest_user_properties[ $prop_index ]['value'] = $customer_new_order_flag; - } else { - $guest_user_properties[] = array( - 'property' => 'customer_new_order', - 'value' => $customer_new_order_flag, - ); - } - } - return $guest_user_properties; - } - - /** - * Sync line items to deals over Hubspot. - * - * @param int $order_id Order ID. - */ - public function bulk_line_item_link( $order_id ) { - - if ( ! empty( $order_id ) ) { - $object_type = 'LINE_ITEM'; - $order = wc_get_order( $order_id ); - $line_updates = array(); - $order_items = $order->get_items(); - $object_ids = array(); - $response = array( 'status_code' => 206 ); - $no_products_found = false; - - if ( is_array( $order_items ) && count( $order_items ) ) { - - foreach ( $order_items as $item_key => $single_item ) : - - $product_id = $single_item->get_variation_id(); - if ( 0 === $product_id ) { - $product_id = $single_item->get_product_id(); - if ( 0 === $product_id ) { - $no_products_found = true; - } - } - if ( get_post_status( $product_id ) == 'trash' || get_post_status( $product_id ) == false ) { - continue; - } - $item_sku = get_post_meta( $product_id, '_sku', true ); - if ( empty( $item_sku ) ) { - $item_sku = $product_id; - } - - $line_item_hs_id = wc_get_order_item_meta( $item_key, 'hubwoo_ecomm_line_item_id', true ); - - if ( ! empty( $line_item_hs_id ) || 'yes' == $order->get_meta('hubwoo_order_line_item_created', 'no') ) { - continue; - } - - $quantity = ! empty( $single_item->get_quantity() ) ? $single_item->get_quantity() : 0; - $item_total = ! empty( $single_item->get_total() ) ? $single_item->get_total() : 0; - $item_sub_total = ! empty( $single_item->get_subtotal() ) ? $single_item->get_subtotal() : 0; - $product = $single_item->get_product(); - $name = HubwooObjectProperties::get_instance()->hubwoo_ecomm_product_name( $product ); - $discount_amount = abs( $item_total - $item_sub_total ); - $discount_amount = $discount_amount / $quantity; - $item_sub_total = $item_sub_total / $quantity; - $hs_product_id = get_post_meta( $product_id, 'hubwoo_ecomm_pro_id', true ); - $object_ids[] = $item_key; - - $properties = array( - 'quantity' => $quantity, - 'price' => $item_sub_total, - 'amount' => $item_total, - 'name' => $name, - 'discount_amount' => $discount_amount, - 'sku' => $item_sku, - 'tax_amount' => $single_item->get_total_tax(), - ); - - if ( 'yes' != get_option( 'hubwoo_product_scope_needed', 'no' ) ) { - $properties['hs_product_id'] = $hs_product_id; - } - - $properties = apply_filters( 'hubwoo_line_item_properties', $properties, $product_id, $order_id ); - - $line_updates[] = array( - 'properties' => $properties, - ); - endforeach; - } - - $line_updates = apply_filters( 'hubwoo_custom_line_item', $line_updates, $order_id ); - - if ( count( $line_updates ) ) { - $line_updates = array( - 'inputs' => $line_updates, - ); - - $flag = true; - if ( Hubwoo::is_access_token_expired() ) { - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - if ( ! $status ) { - $flag = false; - } - } - if ( $flag ) { - - $response = HubWooConnectionMananager::get_instance()->create_batch_object_record( 'line_items', $line_updates ); - } - } - - if ( 201 == $response['status_code'] || 204 == $response['status_code'] || empty( $object_ids ) ) { - - $order->update_meta_data( 'hubwoo_ecomm_deal_created', 'yes' ); - $order->save(); - - $deal_id = $order->get_meta( 'hubwoo_ecomm_deal_id', true ); - if ( isset( $response['body'] ) && ! empty( $response['body'] ) ) { - $response_body = json_decode( $response['body'] ); - foreach ( $order_items as $item_key => $single_item ) : - - $product_id = $single_item->get_variation_id(); - if ( 0 === $product_id ) { - $product_id = $single_item->get_product_id(); - if ( 0 === $product_id ) { - $no_products_found = true; - } - } - if ( get_post_status( $product_id ) == 'trash' || get_post_status( $product_id ) == false ) { - continue; - } - - $product = $single_item->get_product(); - $name = HubwooObjectProperties::get_instance()->hubwoo_ecomm_product_name( $product ); - - if ( isset( $response_body ) && ! empty( $response_body ) ) { - - foreach ( $response_body->results as $key => $value ) { - - $line_item_hs_id = $value->id; - $order->update_meta_data( 'hubwoo_order_line_item_created', 'yes' ); - $order->save(); - $response = HubWooConnectionMananager::get_instance()->associate_object( 'deal', $deal_id, 'line_item', $line_item_hs_id, 19 ); - } - } - endforeach; - - if ( 1 == get_option( 'hubwoo_deals_sync_running', 0 ) ) { - - $current_count = get_option( 'hubwoo_deals_current_sync_count', 0 ); - update_option( 'hubwoo_deals_current_sync_count', ++$current_count ); - } - } - } - } - } - - /** - * Fetch logs from database. - */ - public function hubwoo_get_datatable_data() { - // Nonce verification. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - $request = $_GET; - $offset = $request['start']; - $limit = $request['length']; - - $search_data = $request['search']; - $search_value = $search_data['value']; - - if ( '' !== $search_value ) { - $log_data = Hubwoo::hubwoo_get_log_data( $search_value ); - } else { - - $log_data = Hubwoo::hubwoo_get_log_data( false, $limit, $offset ); - } - - $count_data = Hubwoo::hubwoo_get_total_log_count(); - $total_count = $count_data[0]; - $data = array(); - foreach ( $log_data as $key => $value ) { - $value[ Hubwoo::get_current_crm_name( 'slug' ) . '_object' ] = ! empty( $value[ Hubwoo::get_current_crm_name( 'slug' ) . '_object' ] ) ? $value[ Hubwoo::get_current_crm_name( 'slug' ) . '_object' ] : '-'; - $value[ Hubwoo::get_current_crm_name( 'slug' ) . '_id' ] = ! empty( $value[ Hubwoo::get_current_crm_name( 'slug' ) . '_id' ] ) ? $value[ Hubwoo::get_current_crm_name( 'slug' ) . '_id' ] : '-'; - - $current_request = $value['request']; //phpcs:ignore - $response = unserialize( $value['response'] ); //phpcs:ignore - - $temp = array( - '', - $value['event'], - $value[ Hubwoo::get_current_crm_name( 'slug' ) . '_object' ], - gmdate( 'd-m-Y h:i A', esc_html( $value['time'] ) ), - $current_request, - wp_json_encode( $response ), - ); - - $data[] = $temp; - } - - $json_data = array( - 'draw' => intval( $request['draw'] ), - 'recordsTotal' => $total_count, - 'recordsFiltered' => $total_count, - 'data' => $data, - ); - - echo wp_json_encode( $json_data ); - wp_die(); - } - - /** - * Download logs from database. - */ - public function hubwoo_download_sync_log() { - // Nonce verification. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - $crm_name = Hubwoo::get_current_crm_name( 'slug' ); - $log_data = Hubwoo::hubwoo_get_log_data( false, 25, 0, true ); - $data = array(); - $log_dir = WC_LOG_DIR . $crm_name . '-sync-log.log'; - if ( ! is_dir( $log_dir ) ) { - $log_dir = WC_LOG_DIR . $crm_name . '-sync-log.log'; - } - - global $wp_filesystem; // Define global object of WordPress filesystem. - WP_Filesystem(); // Intialise new file system object. - - $file_data = ''; - $wp_filesystem->put_contents( $log_dir, '' ); - - foreach ( $log_data as $key => $value ) { - $value[ $crm_name . '_id' ] = ! empty( $value[ $crm_name . '_id' ] ) ? $value[ $crm_name . '_id' ] : '-'; - $log = 'Feed : ' . $value['event'] . PHP_EOL; - $log .= ucwords( $crm_name ) . ' Object : ' . $value[ $crm_name . '_object' ] . PHP_EOL; - $log .= 'Time : ' . gmdate( 'd-m-Y h:i A', esc_html( $value['time'] ) ) . PHP_EOL; - $log .= 'Request : ' . $value['request'] . PHP_EOL; // phpcs:ignore - $log .= 'Response : ' . wp_json_encode( unserialize( $value['response'] ) ) . PHP_EOL; // phpcs:ignore - $log .= '-----------------------------------------------------------------------' . PHP_EOL; - - $file_data .= $log; - $wp_filesystem->put_contents( $log_dir, $file_data ); - } - - $json_data = array( - 'success' => true, - 'redirect' => admin_url( 'admin.php?page=hubwoo&hubwoo_tab=hubwoo-logs&hubwoo_download=1' ), - ); - - echo wp_json_encode( $json_data ); - wp_die(); - } - - /** - * Clear log from database - */ - public function hubwoo_clear_sync_log() { - // Nonce verification. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - global $wpdb; - $table_name = $wpdb->prefix . 'hubwoo_log'; - - $wpdb->get_results( $wpdb->prepare( 'DELETE FROM %1s', $table_name ) ); - - $json_data = array( - 'success' => true, - 'redirect' => admin_url( 'admin.php?page=hubwoo&hubwoo_tab=hubwoo-logs' ), - ); - - echo wp_json_encode( $json_data ); - wp_die(); - } - - /** - * Fetch pipeline deal stages. - */ - public function hubwoo_fetch_deal_stages() { - // Nonce verification. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - $selected_pipeline = ! empty( $_POST['selected_pipeline'] ) ? sanitize_text_field( wp_unslash( $_POST['selected_pipeline'] ) ) : ''; - - $all_pipeline = get_option( 'hubwoo_potal_pipelines', true ); - update_option( 'hubwoo_ecomm_pipeline_id', $selected_pipeline ); - $deal_stages = ''; - - foreach ( $all_pipeline as $single_pipeline ) { - if ( $single_pipeline['id'] == $selected_pipeline ) { - $deal_stages = $single_pipeline['stages']; - if ( 'Ecommerce Pipeline' == $single_pipeline['label'] ) { - Hubwoo::update_deal_stages_mapping( $deal_stages ); - } else if ( 'Sales Pipeline' == $single_pipeline['label'] ) { - update_option( 'hubwoo_ecomm_final_mapping', Hubwoo::hubwoo_sales_deals_mapping() ); - } - } - } - - if ( ! empty( $deal_stages ) ) { - - update_option( 'hubwoo_ecomm_pipeline_created', 'yes' ); - update_option( 'hubwoo_fetched_deal_stages', $deal_stages ); - update_option( 'hubwoo_ecomm_won_stages', '' ); - } - - echo wp_json_encode( - array( - 'success' => true, - ) - ); - wp_die(); - } - - /** - * Fetch deal pipelines. - */ - public function hubwoo_fetch_update_pipelines() { - // Nonce verification. - check_ajax_referer( 'hubwoo_security', 'hubwooSecurity' ); - - $selected_pipeline = ! empty( $_POST['selected_pipeline'] ) ? sanitize_text_field( wp_unslash( $_POST['selected_pipeline'] ) ) : ''; - - $all_deal_pipelines = HubWooConnectionMananager::get_instance()->fetch_all_deal_pipelines(); - - if ( ! empty( $all_deal_pipelines['results'] ) ) { - update_option( 'hubwoo_potal_pipelines', $all_deal_pipelines['results'] ); - } - - $all_pipeline = get_option( 'hubwoo_potal_pipelines', true ); - update_option( 'hubwoo_ecomm_pipeline_id', $selected_pipeline ); - $deal_stages = ''; - - foreach ( $all_pipeline as $single_pipeline ) { - if ( $single_pipeline['id'] == $selected_pipeline ) { - $deal_stages = $single_pipeline['stages']; - } - } - - if ( ! empty( $deal_stages ) ) { - - update_option( 'hubwoo_ecomm_pipeline_created', 'yes' ); - update_option( 'hubwoo_fetched_deal_stages', $deal_stages ); - update_option( 'hubwoo_ecomm_won_stages', '' ); - } - - echo wp_json_encode( - array( - 'success' => true, - ) - ); - wp_die(); - } - } -} - -new Hubwoo_Ajax_Handler(); diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoo-csv-handler.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoo-csv-handler.php deleted file mode 100644 index 00c772fd..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoo-csv-handler.php +++ /dev/null @@ -1,185 +0,0 @@ -folder = $folder; - - // Create Base Activity Directory. - $this->working_path = $this->base_dir . $this->folder; - $this->dirpath = $this->check_and_create_folder( $this->working_path ); - - } - - /** - * Library functions :: Check/create folder. - * - * @param string $path Path to create folder. - * - * @since 1.0.0 - */ - public function check_and_create_folder( $path = '' ) { - - if ( ! empty( $path ) && ! is_dir( $path ) && is_writable( $this->base_dir ) ) { - - $directory = mkdir( $path, 0755, true ); - - if ( $directory ) { - return array( - 'status' => $directory, - ); - } - } else { - return array( - 'status' => false, - 'message' => 'We do not have write permission to create dir/file.', - ); - } - } - - /** - * Generate Contacts csv. - * - * @param array $contacts An array of all users properties data. - */ - public function generate_contacts_csv( $contacts = array() ) { - - $contact_file = fopen( $this->working_path . '/contacts-import.csv', 'w' ); - - fputcsv( - $contact_file, - array( - 'Firstname', - 'Lastname', - 'Email Address', - 'Company', - 'Phone Number', - 'Mobile Number', - 'Address', - 'City', - 'State', - 'Country', - 'Postcode', - ) - ); - - foreach ( $contacts as $key => $value ) { - $contact_cells = $this->format_contact_csv_cells( $value ); - - fputcsv( - $contact_file, - array( - $contact_cells['firstname'], - $contact_cells['lastname'], - $contact_cells['email'], - $contact_cells['company'], - $contact_cells['phone'], - $contact_cells['mobilephone'], - $contact_cells['address'], - $contact_cells['city'], - $contact_cells['state'], - $contact_cells['country'], - $contact_cells['zip'], - ) - ); - } - - return fclose( $contact_file ); - - } - - /** - * Returns a set of contact propertieis to be mapped in CSV. - * - * @param array $contact An array of user data. - * - * @return array An array of set of contact properties - */ - public function format_contact_csv_cells( $contact = array() ) { - - $email = ! empty( $contact['email'] ) ? $contact['email'] : false; - unset( $contact['email'] ); - - $properties = ! empty( $contact['properties'] ) ? $this->format_contact_properties( $contact['properties'] ) : array(); - $properties['email'] = ! empty( $email ) ? $email : false; - - return $properties; - } - - /** - * Format properties of an array of contact data. - * - * @param array $properties Set of properties to format. - * - * @return string Resultant of an array key. - */ - public function format_contact_properties( $properties = array() ) { - - $resultant = array(); - - if ( ! empty( $properties ) && is_array( $properties ) ) { - - foreach ( $properties as $key => $value ) { - $resultant[ $value['property'] ] = ! empty( $value['value'] ) ? $value['value'] : false; - } - } - - return $resultant; - } - - -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoo-deactivator.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoo-deactivator.php deleted file mode 100644 index 00e55ebe..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoo-deactivator.php +++ /dev/null @@ -1,54 +0,0 @@ -actions = array(); - $this->filters = array(); - } - - /** - * Add a new action to the collection to be registered with WordPress. - * - * @since 1.0.0 - * @param string $hook The name of the WordPress action that is being registered. - * @param object $component A reference to the instance of the object on which the action is defined. - * @param string $callback The name of the function definition on the $component. - * @param int $priority Optional. The priority at which the function should be fired. Default is 10. - * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1. - */ - public function add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) { - $this->actions = $this->add( $this->actions, $hook, $component, $callback, $priority, $accepted_args ); - } - - /** - * Add a new filter to the collection to be registered with WordPress. - * - * @since 1.0.0 - * @param string $hook The name of the WordPress filter that is being registered. - * @param object $component A reference to the instance of the object on which the filter is defined. - * @param string $callback The name of the function definition on the $component. - * @param int $priority Optional. The priority at which the function should be fired. Default is 10. - * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1. - */ - public function add_filter( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) { - $this->filters = $this->add( $this->filters, $hook, $component, $callback, $priority, $accepted_args ); - } - - /** - * A utility function that is used to register the actions and hooks into a single - * collection. - * - * @since 1.0.0 - * @param array $hooks The collection of hooks that is being registered (that is, actions or filters). - * @param string $hook The name of the WordPress filter that is being registered. - * @param object $component A reference to the instance of the object on which the filter is defined. - * @param string $callback The name of the function definition on the $component. - * @param int $priority The priority at which the function should be fired. - * @param int $accepted_args The number of arguments that should be passed to the $callback. - * @return array The collection of actions and filters registered with WordPress. - */ - private function add( $hooks, $hook, $component, $callback, $priority, $accepted_args ) { - - $hooks[] = array( - 'hook' => $hook, - 'component' => $component, - 'callback' => $callback, - 'priority' => $priority, - 'accepted_args' => $accepted_args, - ); - - return $hooks; - } - - /** - * Register the filters and actions with WordPress. - * - * @since 1.0.0 - */ - public function run() { - - foreach ( $this->filters as $hook ) { - add_filter( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] ); - } - - foreach ( $this->actions as $hook ) { - add_action( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] ); - } - } -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoo-rfm-configuration.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoo-rfm-configuration.php deleted file mode 100644 index 8a7a75a8..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoo-rfm-configuration.php +++ /dev/null @@ -1,251 +0,0 @@ -get_columns(); - $hidden = array(); - $sortable = array(); - $this->_column_headers = array( $columns, $hidden, $sortable ); - $data = $this->table_data(); - $current_page = $this->get_pagenum(); - $total_items = count( $data ); - $this->set_pagination_args( - array( - 'total_items' => $total_items, - 'per_page' => $per_page, - ) - ); - $data = array_slice( $data, ( ( $current_page - 1 ) * $per_page ), $per_page ); - $this->items = $data; - } - - /** - * Get the RFM Setting column. - * - * @since 1.0.0 - */ - public function get_columns() { - - $columns = array( - 'score' => __( 'Score', 'makewebbetter-hubspot-for-woocommerce' ) . '

(' . __( 'Ratings for RFM Segmentation', 'makewebbetter-hubspot-for-woocommerce' ) . ')

', - 'recency' => __( 'Recency', 'makewebbetter-hubspot-for-woocommerce' ) . '

(' . __( 'Days Since last Order', 'makewebbetter-hubspot-for-woocommerce' ) . ')

', - 'frequency' => __( 'Frequency', 'makewebbetter-hubspot-for-woocommerce' ) . '

(' . __( 'Total Orders Placed', 'makewebbetter-hubspot-for-woocommerce' ) . ')

', - 'monetary' => __( 'Monetary', 'makewebbetter-hubspot-for-woocommerce' ) . '

(' . __( 'Total Money Spent', 'makewebbetter-hubspot-for-woocommerce' ) . ')

', - ); - return $columns; - } - - /** - * Display the table data its values. - * - * @since 1.0.0 - */ - private function table_data() { - - $temp_data = array(); - - $rfm_settings = array( - 'score_5' => 5, - 'score_4' => 4, - 'score_3' => 3, - 'score_2' => 2, - 'score_1' => 1, - ); - $hubwoo_rfm_at_5 = get_option( - 'hubwoo_rfm_5', - array( - 0 => 30, - 1 => 20, - 2 => 1000, - ) - ); - $hubwoo_from_rfm_4 = get_option( - 'hubwoo_from_rfm_4', - array( - 0 => 31, - 1 => 10, - 2 => 750, - ) - ); - $hubwoo_to_rfm_4 = get_option( - 'hubwoo_to_rfm_4', - array( - 0 => 90, - 1 => 20, - 2 => 1000, - ) - ); - $hubwoo_from_rfm_3 = get_option( - 'hubwoo_from_rfm_3', - array( - 0 => 91, - 1 => 5, - 2 => 500, - ) - ); - $hubwoo_to_rfm_3 = get_option( - 'hubwoo_to_rfm_3', - array( - 0 => 180, - 1 => 10, - 2 => 750, - ) - ); - $hubwoo_from_rfm_2 = get_option( - 'hubwoo_from_rfm_2', - array( - 0 => 181, - 1 => 2, - 2 => 250, - ) - ); - $hubwoo_to_rfm_2 = get_option( - 'hubwoo_to_rfm_2', - array( - 0 => 360, - 1 => 5, - 2 => 500, - ) - ); - $hubwoo_rfm_at_1 = get_option( - 'hubwoo_rfm_1', - array( - 0 => 361, - 1 => 2, - 2 => 250, - ) - ); - - foreach ( $rfm_settings as $key => $single_setting ) { - - if ( 5 == $single_setting ) { - - $new_data = array( - 'score' => '

' . $single_setting . '

', - 'recency' => '

' . __( 'Less than', 'makewebbetter-hubspot-for-woocommerce' ) . '

', - 'frequency' => '

' . __( 'More than', 'makewebbetter-hubspot-for-woocommerce' ) . '

', - 'monetary' => '

' . __( 'More than', 'makewebbetter-hubspot-for-woocommerce' ) . '

', - ); - } elseif ( 1 == $single_setting ) { - - $new_data = array( - 'score' => '

' . $single_setting . '

', - 'recency' => '

' . __( 'More than', 'makewebbetter-hubspot-for-woocommerce' ) . '

', - 'frequency' => '

' . __( 'Less than', 'makewebbetter-hubspot-for-woocommerce' ) . '

', - 'monetary' => '

' . __( 'Less than', 'makewebbetter-hubspot-for-woocommerce' ) . '

', - ); - } else { - - if ( 4 == $single_setting ) { - - $rfm_from_0 = $hubwoo_from_rfm_4[0]; - $rfm_from_1 = $hubwoo_from_rfm_4[1]; - $rfm_from_2 = $hubwoo_from_rfm_4[2]; - $rfm_to_0 = $hubwoo_to_rfm_4[0]; - $rfm_to_1 = $hubwoo_to_rfm_4[1]; - $rfm_to_2 = $hubwoo_to_rfm_4[2]; - } elseif ( 3 == $single_setting ) { - - $rfm_from_0 = $hubwoo_from_rfm_3[0]; - $rfm_from_1 = $hubwoo_from_rfm_3[1]; - $rfm_from_2 = $hubwoo_from_rfm_3[2]; - $rfm_to_0 = $hubwoo_to_rfm_3[0]; - $rfm_to_1 = $hubwoo_to_rfm_3[1]; - $rfm_to_2 = $hubwoo_to_rfm_3[2]; - } elseif ( 2 == $single_setting ) { - - $rfm_from_0 = $hubwoo_from_rfm_2[0]; - $rfm_from_1 = $hubwoo_from_rfm_2[1]; - $rfm_from_2 = $hubwoo_from_rfm_2[2]; - $rfm_to_0 = $hubwoo_to_rfm_2[0]; - $rfm_to_1 = $hubwoo_to_rfm_2[1]; - $rfm_to_2 = $hubwoo_to_rfm_2[2]; - } - - $new_data = array( - 'score' => '

' . $single_setting . '

', - 'recency' => '

' . __( 'From', 'makewebbetter-hubspot-for-woocommerce' ) . '

' . __( 'To', 'makewebbetter-hubspot-for-woocommerce' ) . '

', - 'frequency' => '

' . __( 'From', 'makewebbetter-hubspot-for-woocommerce' ) . '

' . __( 'To', 'makewebbetter-hubspot-for-woocommerce' ) . '

', - 'monetary' => '

' . __( 'From', 'makewebbetter-hubspot-for-woocommerce' ) . '

' . __( 'To', 'makewebbetter-hubspot-for-woocommerce' ) . '

', - ); - } - - $temp_data[] = $new_data; - } - - return $temp_data; - } - - /** - * Return default column name. - * - * @since 1.0.0 - * @param int $item rfm setting column type. - * @param string $column_name column name. - * @since 1.0.0 - */ - public function column_default( $item, $column_name ) { - - switch ( $column_name ) { - case 'score': - case 'recency': - case 'frequency': - case 'monetary': - return $item[ $column_name ]; - default: - return $item; - } - } - - /** - * Display the row placeholder. - * - * @since 1.0.0 - */ - public function display_rows_or_placeholder() { - - if ( $this->has_items() ) { - - $this->display_rows(); - } else { - - ?> - - no_items(); - ?> - - version = HUBWOO_VERSION; - } else { - - $this->version = '1.5.6'; - } - - $this->plugin_name = 'makewebbetter-hubspot-for-woocommerce'; - $this->load_dependencies(); - $this->set_locale(); - $this->define_admin_hooks(); - $this->define_public_hooks(); - } - - /** - * Load the required dependencies for this plugin. - * - * Include the following files that make up the plugin: - * - * - Hubwoo_Loader. Orchestrates the hooks of the plugin. - * - Hubwoo_I18n. Defines internationalization functionality. - * - Hubwoo_Admin. Defines all hooks for the admin area. - * - Hubwoo_Public. Defines all hooks for the public side of the site. - * - * Create an instance of the loader which will be used to register the hooks - * with WordPress. - * - * @since 1.0.0 - */ - private function load_dependencies() { - - /** - * The class responsible for orchestrating the actions and filters of the - * core plugin. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwoo-loader.php'; - - /** - * The class responsible for defining internationalization functionality - * of the plugin. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwoo-i18n.php'; - - /** - * The class responsible for handling background data sync from WooCommerce to - * HubSpot. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwoodatasync.php'; - - /** - * The class for Managing Enums. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/classes/class-hubwooenum.php'; - - /** - * The class for Error Handling. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwooerrorhandling.php'; - - /** - * The class responsible for plugin constants. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwooconst.php'; - - /** - * The class responsible for defining all actions that occur in the admin area. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'admin/class-hubwoo-admin.php'; - - /** - * The class responsible for defining all actions that occur in the public area. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'public/class-hubwoo-public.php'; - - $this->loader = new Hubwoo_Loader(); - - /** - * The class responsible for all api actions with hubspot. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwooconnectionmananager.php'; - - /** - * The class contains all the information related to customer groups and properties. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwoocontactproperties.php'; - - /** - * The class contains are readymade contact details to send it to - * hubspot. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwoocustomer.php'; - - /** - * The class responsible for property values. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwoopropertycallbacks.php'; - - /** - * The class responsible for handling ajax requests. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwoo-ajax-handler.php'; - - /** - * The class responsible for rfm configuration settings. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwoo-rfm-configuration.php'; - - /** - * The class responsible for manging guest orders. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwooguestordersmanager.php'; - - /** - * The class responsible for defining all upsert settings and ecomm mappings for deals and line items - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwooecommproperties.php'; - - /** - * The class responsible for defining functions related to get values/date for ecomm objects - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwooecommobject.php'; - - /** - * The class responsible for defining functions related to get values/date for ecomm objects - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwooobjectproperties.php'; - - /** - * The class responsible for defining functions to return values as per ecomm settings upserted - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwooecommpropertycallbacks.php'; - - /** - * The class responsible for defining functions for CSV generations of the respective hubspot objects. - */ - require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-hubwoo-csv-handler.php'; - } - - /** - * Define the locale for this plugin for internationalization. - * - * Uses the Hubwoo_I18n class in order to set the domain and to register the hook - * with WordPress. - * - * @since 1.0.0 - */ - private function set_locale() { - - $plugin_i18n = new Hubwoo_I18n(); - - $this->loader->add_action( 'plugins_loaded', $plugin_i18n, 'load_plugin_textdomain' ); - } - - /** - * Register all of the hooks related to the admin area functionality - * of the plugin. - * - * @since 1.0.0 - */ - private function define_admin_hooks() { - - $plugin_admin = new Hubwoo_Admin( $this->get_plugin_name(), $this->get_version() ); - $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_styles' ); - $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' ); - $this->loader->add_action( 'admin_init', $plugin_admin, 'hubwoo_redirect_from_hubspot' ); - $this->loader->add_action( 'admin_init', $plugin_admin, 'hubwoo_pro_add_privacy_message' ); - $this->loader->add_action( 'admin_init', $plugin_admin, 'hubwoo_get_plugin_log' ); - $this->loader->add_action( 'admin_init', $plugin_admin, 'hubwoo_check_property_value' ); - $this->loader->add_action( 'admin_init', $plugin_admin, 'hubwoo_check_update_changes' ); - $this->loader->add_action( 'admin_notices', $plugin_admin, 'hubwoo_cron_notification' ); - $this->loader->add_action( 'admin_notices', $plugin_admin, 'hubwoo_review_notice', 99 ); - //hpos changes - $this->loader->add_action( 'admin_notices', $plugin_admin, 'hubwoo_hpos_notice', 99 ); - // hubspot deal hooks. - if ( 'yes' == get_option( 'hubwoo_ecomm_deal_enable', 'yes' ) ) { - - $this->loader->add_filter( 'manage_edit-shop_order_columns', $plugin_admin, 'hubwoo_order_cols', 11 ); - $this->loader->add_action( 'manage_shop_order_posts_custom_column', $plugin_admin, 'hubwoo_order_cols_value', 10, 2 ); - } - - // deactivation screen. - $this->loader->add_action( 'admin_footer', $plugin_admin, 'init_deactivation' ); - - // hubspot abandon carts. - $this->loader->add_filter( 'hubwoo_users', $plugin_admin, 'hubwoo_abncart_users' ); - $this->loader->add_filter( 'hubwoo_contact_modified_fields', $plugin_admin, 'hubwoo_abncart_contact_properties', 10, 2 ); - $this->loader->add_filter( 'hubwoo_pro_track_guest_cart', $plugin_admin, 'hubwoo_abncart_process_guest_data', 10, 2 ); - - $this->loader->add_action( 'huwoo_abncart_clear_old_cart', $plugin_admin, 'huwoo_abncart_clear_old_cart' ); - - if ( get_option( 'hubwoo_checkout_form_created', 'no' ) == 'yes' ) { - - $this->loader->add_action( 'woocommerce_checkout_process', $plugin_admin, 'hubwoo_submit_checkout_form' ); - } - - if ( $this->is_plugin_enable() == 'yes' ) { - - if ( $this->is_setup_completed() ) { - - $this->loader->add_action( 'hubwoo_cron_schedule', $plugin_admin, 'hubwoo_cron_schedule' ); - $this->loader->add_filter( 'hubwoo_unset_workflow_properties', $plugin_admin, 'hubwoo_reset_workflow_properties' ); - $this->loader->add_action( 'woocommerce_order_status_changed', $plugin_admin, 'hubwoo_update_order_changes' ); - $this->loader->add_action( 'set_user_role', $plugin_admin, 'hubwoo_add_user_toupdate', 10 ); - } - - if ( $this->hubwoo_subs_active() ) { - - $this->loader->add_filter( 'hubwoo_contact_groups', $plugin_admin, 'hubwoo_subs_groups' ); - $this->loader->add_filter( 'hubwoo_active_groups', $plugin_admin, 'hubwoo_active_subs_groups' ); - } - - // HubSpot Deals. - if ( false === wp_cache_get( 'hubwoo_product_update_lock' ) ) { - wp_cache_set( 'hubwoo_product_update_lock', true ); - $this->loader->add_action( 'save_post', $plugin_admin, 'hubwoo_ecomm_update_product', 10, 2 ); - } - if ( 'yes' == get_option( 'hubwoo_ecomm_deal_enable', 'yes' ) ) { - - $this->loader->add_action( 'hubwoo_ecomm_deal_upsert', $plugin_admin, 'hubwoo_ecomm_deal_upsert' ); - $this->loader->add_action( 'hubwoo_ecomm_deal_update', $plugin_admin, 'hubwoo_ecomm_deal_update' ); - $this->loader->add_action( 'hubwoo_deals_sync_check', $plugin_admin, 'hubwoo_deals_sync_check' ); - $this->loader->add_action( 'hubwoo_products_sync_check', $plugin_admin, 'hubwoo_products_sync_check' ); - $this->loader->add_action( 'hubwoo_deals_sync_background', $plugin_admin, 'hubwoo_deals_sync_background', 10, 2 ); - $this->loader->add_action( 'hubwoo_products_sync_background', $plugin_admin, 'hubwoo_products_sync_background' ); - $this->loader->add_action( 'hubwoo_products_status_background', $plugin_admin, 'hubwoo_products_status_background' ); - } - - $this->loader->add_action( 'hubwoo_check_logs', $plugin_admin, 'hubwoo_check_logs' ); - - // HubSpot deals hooks. - if ( 'yes' == get_option( 'hubwoo_ecomm_setup_completed', 'no' ) ) { - - if( 'yes' != get_option('woocommerce_custom_orders_table_enabled', 'no') ) { - $this->loader->add_action( 'save_post_shop_order', $plugin_admin, 'hubwoo_ecomm_deal_update_order' ); - } - } - - $this->loader->add_action( 'hubwoo_contacts_sync_background', $plugin_admin, 'hubwoo_contacts_sync_background' ); - $this->loader->add_action( 'hubwoo_update_contacts_vid', $plugin_admin, 'hubwoo_update_contacts_vid' ); - } - } - - /** - * Register all of the hooks related to the public-facing functionality - * of the plugin. - * - * @since 1.0.0 - */ - private function define_public_hooks() { - - $plugin_public = new Hubwoo_Public( $this->get_plugin_name(), $this->get_version() ); - - if ( $this->is_plugin_enable() == 'yes' ) { - - $this->loader->add_action( 'profile_update', $plugin_public, 'hubwoo_woocommerce_save_account_details' ); - $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'hubwoo_add_hs_script' ); - $this->loader->add_action( 'user_register', $plugin_public, 'hubwoo_woocommerce_save_account_details' ); - $this->loader->add_action( 'woocommerce_customer_save_address', $plugin_public, 'hubwoo_woocommerce_save_account_details' ); - $this->loader->add_action( 'woocommerce_checkout_update_user_meta', $plugin_public, 'hubwoo_woocommerce_save_account_details' ); - if ( 'yes' == get_option( 'hubwoo_pro_guest_sync_enable', 'yes' ) ) { - $this->loader->add_action( 'woocommerce_update_order', $plugin_public, 'hubwoo_pro_woocommerce_guest_orders' ); - } - if ( 'yes' == get_option( 'hubwoo_checkout_optin_enable', 'no' ) ) { - $this->loader->add_action( 'woocommerce_after_checkout_billing_form', $plugin_public, 'hubwoo_pro_checkout_field' ); - $this->loader->add_action( 'woocommerce_checkout_order_processed', $plugin_public, 'hubwoo_pro_process_checkout_optin' ); - } - if ( 'yes' == get_option( 'hubwoo_registeration_optin_enable', 'no' ) ) { - $this->loader->add_action( 'woocommerce_register_form', $plugin_public, 'hubwoo_pro_register_field' ); - $this->loader->add_action( 'woocommerce_created_customer', $plugin_public, 'hubwoo_save_register_optin' ); - } - $this->loader->add_action( 'wp_loaded', $plugin_public, 'hubwoo_add_abncart_products', 10 ); - - $subs_enable = get_option( 'hubwoo_subs_settings_enable', 'yes' ); - - if ( 'yes' == $subs_enable && $this->hubwoo_subs_active() ) { - - $this->loader->add_action( 'woocommerce_renewal_order_payment_complete', $plugin_public, 'hubwoo_pro_save_renewal_orders' ); - $this->loader->add_action( 'woocommerce_scheduled_subscription_payment', $plugin_public, 'hubwoo_pro_save_renewal_orders' ); - $this->loader->add_action( 'woocommerce_subscription_renewal_payment_complete', $plugin_public, 'hubwoo_pro_update_subs_changes' ); - $this->loader->add_action( 'woocommerce_subscription_payment_failed', $plugin_public, 'hubwoo_pro_update_subs_changes' ); - $this->loader->add_action( 'woocommerce_subscription_renewal_payment_failed', $plugin_public, 'hubwoo_pro_update_subs_changes' ); - $this->loader->add_action( 'woocommerce_subscription_payment_complete', $plugin_public, 'hubwoo_pro_update_subs_changes' ); - $this->loader->add_action( 'woocommerce_subscription_status_updated', $plugin_public, 'hubwoo_pro_update_subs_changes' ); - $this->loader->add_action( 'woocommerce_customer_changed_subscription_to_cancelled', $plugin_public, 'hubwoo_save_changes_in_subs' ); - $this->loader->add_action( 'woocommerce_customer_changed_subscription_to_active', $plugin_public, 'hubwoo_save_changes_in_subs' ); - $this->loader->add_action( 'woocommerce_customer_changed_subscription_to_on-hold', $plugin_public, 'hubwoo_save_changes_in_subs' ); - $this->loader->add_action( 'init', $plugin_public, 'hubwoo_subscription_switch' ); - } - - // HubSpot Abandon Carts. - if ( get_option( 'hubwoo_abncart_enable_addon', 'yes' ) == 'yes' ) { - - if ( get_option( 'hubwoo_abncart_guest_cart', 'yes' ) == 'yes' ) { - - $this->loader->add_action( 'init', $plugin_public, 'hubwoo_abncart_start_session', 10 ); - $this->loader->add_action( 'template_redirect', $plugin_public, 'hubwoo_track_cart_for_formuser' ); - $this->loader->add_action( 'wp_ajax_nopriv_hubwoo_save_guest_user_cart', $plugin_public, 'hubwoo_save_guest_user_cart' ); - $this->loader->add_action( 'wp_ajax_nopriv_get_order_detail', $plugin_public, 'get_order_detail' ); - $this->loader->add_action( 'woocommerce_after_checkout_billing_form', $plugin_public, 'hubwoo_track_email_for_guest_users', 10 ); - $this->loader->add_action( 'woocommerce_after_checkout_billing_form', $plugin_public, 'get_email_checkout_page' ); - $this->loader->add_action( 'woocommerce_new_order', $plugin_public, 'hubwoo_abncart_woocommerce_new_orders' ); - $this->loader->add_action( 'woocommerce_cart_updated', $plugin_public, 'hubwoo_abncart_track_guest_cart', 99, 0 ); - $this->loader->add_action( 'user_register', $plugin_public, 'hubwoo_abncart_user_registeration' ); - $this->loader->add_action( 'wp_logout', $plugin_public, 'hubwoo_clear_session' ); - } - $this->loader->add_filter( 'woocommerce_update_cart_action_cart_updated', $plugin_public, 'hubwoo_guest_cart_updated' ); - $this->loader->add_action( 'woocommerce_add_to_cart', $plugin_public, 'hubwoo_abncart_woocommerce_add_to_cart', 20, 0 ); - } - - $active_plugins = get_option( 'active_plugins' ); - if ( in_array( 'sitepress-multilingual-cms/sitepress.php', $active_plugins ) ) { - $this->loader->add_action( 'woocommerce_thankyou', $plugin_public, 'hubwoo_update_user_prefered_lang' ); - } - - $this->loader->add_filter( 'woocommerce_order_item_get_formatted_meta_data', $plugin_public, 'hubwoo_hide_line_item_meta', 20, 2 ); - } - } - - /** - * Run the loader to execute all of the hooks with WordPress. - * - * @since 1.0.0 - */ - public function run() { - - $this->loader->run(); - } - - /** - * The name of the plugin used to uniquely identify it within the context of - * WordPress and to define internationalization functionality. - * - * @since 1.0.0 - * @return string The name of the plugin. - */ - public function get_plugin_name() { - - return $this->plugin_name; - } - - /** - * The reference to the class that orchestrates the hooks with the plugin. - * - * @since 1.0.0 - * @return Hubwoo_Loader Orchestrates the hooks of the plugin. - */ - public function get_loader() { - - return $this->loader; - } - - /** - * Retrieve the version number of the plugin. - * - * @since 1.0.0 - * @return string The version number of the plugin. - */ - public function get_version() { - - return $this->version; - } - - /** - * Predefined default hubwoo tabs. - * - * @since 1.0.0 - */ - public function hubwoo_default_tabs() { - - $default_tabs = array(); - - $common_dependency = array( 'is_oauth_success', 'is_valid_client_ids_stored', 'is_field_setup_completed' ); - - $default_tabs['hubwoo-overview'] = array( - 'name' => __( 'Dashboard', 'makewebbetter-hubspot-for-woocommerce' ), - 'dependency' => array(), - 'title' => esc_html__( 'Integrate your WooCommerce store with HubSpot', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - $default_tabs['hubwoo-sync-contacts'] = array( - 'name' => __( 'Contacts', 'makewebbetter-hubspot-for-woocommerce' ), - 'dependency' => $common_dependency, - 'title' => esc_html__( 'Sync all your woocommerce data to HubSpot', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - $default_tabs['hubwoo-deals'] = array( - 'name' => __( 'Deals', 'makewebbetter-hubspot-for-woocommerce' ), - 'dependency' => $common_dependency, - 'title' => esc_html__( 'Sync All of your woocommerce orders as HubSpot Deals', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - $default_tabs['hubwoo-abncart'] = array( - 'name' => __( 'Abandoned Carts', 'makewebbetter-hubspot-for-woocommerce' ), - 'dependency' => $common_dependency, - 'title' => esc_html__( 'Sync all of the cart abandoners on your website', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - $default_tabs['hubwoo-automation'] = array( - 'name' => __( 'Automation', 'makewebbetter-hubspot-for-woocommerce' ), - 'dependency' => $common_dependency, - 'title' => esc_html__( 'Create Workflows to Track ROI and Retrieve Abandoned Carts', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - $default_tabs['hubwoo-add-ons'] = array( - 'name' => __( 'Add Ons', 'makewebbetter-hubspot-for-woocommerce' ), - 'dependency' => '', - 'title' => esc_html__( 'Add-ons for the HubSpot Integrations', 'makewebbetter-hubspot-for-woocommerce' ), - ); - $default_tabs['hubwoo-general-settings'] = array( - 'name' => __( 'Settings', 'makewebbetter-hubspot-for-woocommerce' ), - 'dependency' => array( 'is_oauth_success', 'is_valid_client_ids_stored' ), - 'title' => esc_html__( 'General And Advanced Settings', 'makewebbetter-hubspot-for-woocommerce' ), - ); - $default_tabs['hubwoo-logs'] = array( - 'name' => __( 'Logs', 'makewebbetter-hubspot-for-woocommerce' ), - 'dependency' => array( 'is_oauth_success', 'is_valid_client_ids_stored' ), - 'title' => esc_html__( 'HubSpot Logs', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - $default_tabs = apply_filters( 'hubwoo_navigation_tabs', $default_tabs ); - - $default_tabs['hubwoo-support'] = array( - 'name' => __( 'Support', 'makewebbetter-hubspot-for-woocommerce' ), - 'dependency' => array( 'is_oauth_success', 'is_valid_client_ids_stored' ), - 'title' => esc_html__( 'Support', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - return $default_tabs; - } - - /** - * Checking dependencies for tabs. - * - * @since 1.0.0 - * @param array $dependency list of dependencies of function. - */ - public function check_dependencies( $dependency = array() ) { - - $flag = true; - - global $hubwoo; - - if ( count( $dependency ) ) { - - foreach ( $dependency as $single_dependency ) { - - if ( ! empty( $hubwoo->$single_dependency() ) ) { - $flag = $flag & $hubwoo->$single_dependency(); - } - } - } - - return $flag; - } - - /** - * Get started with setup. - * - * @since 1.0.0 - */ - public static function hubwoo_pro_get_started() { - - $last_version = self::hubwoo_pro_last_version(); - - if ( HUBWOO_VERSION != $last_version ) { - - return true; - } elseif ( HUBWOO_VERSION != $last_version && ! get_option( 'hubwoo_pro_get_started', false ) ) { - - return false; - } elseif ( HUBWOO_VERSION == $last_version && get_option( 'hubwoo_pro_get_started', false ) ) { - - return true; - } else { - - return get_option( 'hubwoo_pro_get_started', false ); - } - } - - /** - * Fetching the last version from user database - * - * @since 1.0.0 - */ - public static function hubwoo_pro_last_version() { - - if ( self::is_setup_completed() ) { - - return get_option( 'hubwoo_pro_version', '1.5.6' ); - } else { - - return HUBWOO_VERSION; - } - } - - /** - * Verify if the hubspot setup is completed. - * - * @since 1.0.0 - * @return boolean true/false - */ - public static function is_setup_completed() { - - return get_option( 'hubwoo_pro_setup_completed', false ); - } - - /** - * Check if hubspot oauth has been successful. - * - * @since 1.0.0 - * @return boolean true/false - */ - public function is_oauth_success() { - - return get_option( 'hubwoo_pro_oauth_success', false ); - } - - /** - * Check if plugin feature is enbled or not. - * - * @since 1.0.0 - * @return boolean true/false - */ - public function is_plugin_enable() { - - return get_option( 'hubwoo_pro_settings_enable', 'yes' ); - } - - /** - * Check if valid hubspot client Ids is stored. - * - * @since 1.0.0 - * @return boolean true/false - */ - public static function is_valid_client_ids_stored() { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - - if ( $hapikey && $hseckey ) { - - return get_option( 'hubwoo_pro_valid_client_ids_stored', false ); - } - - return false; - } - - /** - * Checking the properties setup status. - * - * @since 1.0.0 - */ - public function is_field_setup_completed() { - - $last_version = self::hubwoo_pro_last_version(); - - if ( HUBWOO_VERSION != $last_version ) { - - return true; - } else { - - return get_option( 'hubwoo_fields_setup_completed', false ); - } - } - - /** - * Locate and load appropriate tempate. - * - * @since 1.0.0 - * @param string $path path of the file. - * @param string $tab tab name. - */ - public function load_template_view( $path, $tab = '' ) { - - $file_path = HUBWOO_ABSPATH . $path; - - if ( file_exists( $file_path ) ) { - - include $file_path; - } else { - - $file_path = apply_filters( 'hubwoo_load_template_path', $tab ); - - if ( file_exists( $file_path ) ) { - - include $file_path; - } else { - - /* translators: %s: file path */ - $notice = sprintf( esc_html__( 'Unable to locate file path at location %s some features may not work properly in HubSpot Integration, please contact us!', 'makewebbetter-hubspot-for-woocommerce' ), $file_path ); - $this->hubwoo_notice( $notice, 'error' ); - } - } - } - - /** - * Show admin notices. - * - * @param string $message Message to display. - * @param string $type notice type, accepted values - error/update/update-nag. - * @since 1.0.0 - */ - public static function hubwoo_notice( $message, $type = 'error' ) { - - $classes = 'notice '; - - switch ( $type ) { - - case 'update': - $classes .= 'updated'; - break; - - case 'update-nag': - $classes .= 'update-nag'; - break; - - case 'success': - $classes .= 'notice-success is-dismissible'; - break; - case 'hubwoo-notice': - $classes .= 'hubwoo-notice'; - break; - default: - $classes .= 'error'; - } - - $notice = '
'; - $notice .= '

' . $message . '

'; - $notice .= '
'; - - echo wp_kses_post( $notice ); - } - - /** - * Fetch owner email info from HubSpot. - * - * @since 1.0.0 - * @return boolean true/false - */ - public function hubwoo_owners_email_info() { - - $owner_email = get_option( 'hubwoo_pro_hubspot_id', '' ); - - if ( empty( $owner_email ) ) { - - if ( self::is_valid_client_ids_stored() ) { - - $flag = true; - - if ( self::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - - $owner_email = HubWooConnectionMananager::get_instance()->hubwoo_get_owners_info(); - - if ( ! empty( $owner_email ) ) { - - update_option( 'hubwoo_pro_hubspot_id', $owner_email ); - } - } - } - } - - return $owner_email; - } - - /** - * Check if access token is expired. - * - * @since 1.0.0 - * @return boolean true/false - */ - public static function is_access_token_expired() { - - $get_expiry = get_option( 'hubwoo_pro_token_expiry', false ); - - if ( $get_expiry ) { - - $current_time = time(); - - if ( ( $get_expiry > $current_time ) && ( $get_expiry - $current_time ) <= 50 ) { - - return true; - } elseif ( ( $current_time > $get_expiry ) ) { - - return true; - } - } - - return false; - } - - /** - * Reset saved options for setup. - * - * @param bool $redirect whether to redirect. - * @param bool $delete_meta whether to delete meta. - * @since 1.0.0 - */ - public function hubwoo_switch_account( $redirect = true, $delete_meta = false ) { - - global $wpdb; - $wpdb->query( "DELETE FROM `{$wpdb->options}` WHERE `option_name` LIKE '%hubwoo%'" ); - as_unschedule_action( 'hubwoo_contacts_sync_background' ); - as_unschedule_action( 'hubwoo_deals_sync_background' ); - as_unschedule_action( 'hubwoo_products_sync_background' ); - as_unschedule_action( 'hubwoo_products_status_background' ); - as_unschedule_action( 'hubwoo_update_contacts_vid' ); - - if ( $delete_meta ) { - delete_option( 'WooCommerce: set Order Recency 1 Ratings' ); - delete_option( 'WooCommerce: set Order Recency 2 Ratings' ); - delete_option( 'WooCommerce: set Order Recency 3 Ratings' ); - delete_option( 'WooCommerce: set Order Recency 4 Ratings' ); - delete_option( 'WooCommerce: set Order Recency 5 Ratings' ); - delete_option( 'WooCommerce: MQL to Customer lifecycle stage Conversion' ); - delete_option( 'WooCommerce: Welcome New Customer & Get a 2nd Order' ); - delete_option( 'WooCommerce: 2nd Order Thank You & Get a 3rd Order' ); - delete_option( 'WooCommerce: 3rd Order Thank You' ); - delete_option( 'WooCommerce: ROI Calculation' ); - delete_option( 'WooCommerce: Order Workflow' ); - delete_option( 'WooCommerce: Update Historical Order Recency Rating' ); - delete_option( 'WooCommerce: After order Workflow' ); - delete_option( 'WooCommerce: Enroll Customers for Recency Settings' ); - delete_metadata( 'user', 0, 'hubwoo_pro_user_data_change', '', true ); - delete_metadata( 'user', 0, 'hubwoo_user_vid', '', true ); - delete_metadata( 'post', 0, 'hubwoo_pro_user_data_change', '', true ); - delete_metadata( 'post', 0, 'hubwoo_pro_guest_order', '', true ); - delete_metadata( 'post', 0, 'hubwoo_ecomm_deal_id', '', true ); - delete_metadata( 'post', 0, 'hubwoo_ecomm_pro_id', '', true ); - delete_metadata( 'post', 0, 'hubwoo_ecomm_deal_created', '', true ); - delete_metadata( 'post', 0, 'hubwoo_product_synced', '', true ); - delete_metadata( 'post', 0, 'hubwoo_user_vid', '', true ); - - //hpos changes - if( 'yes' == get_option('woocommerce_custom_orders_table_enabled', 'no') ) { - $wpdb->query( "DELETE FROM `{$wpdb->prefix}wc_orders_meta` WHERE `meta_key` IN ('hubwoo_pro_guest_order', 'hubwoo_ecomm_deal_id', 'hubwoo_ecomm_deal_created', 'hubwoo_user_vid', 'hubwoo_pro_user_data_change')" ); - } - } - - if ( $redirect ) { - wp_safe_redirect( admin_url( 'admin.php?page=hubwoo' ) ); - } else { - update_option( 'hubwoo_clear_previous_options', 'yes' ); - } - exit(); - } - - /** - * Getting the final groups after the setup. - * - * @since 1.0.0 - */ - public function hubwoo_get_final_groups() { - - $final_groups = array(); - - $hubwoo_groups = HubWooContactProperties::get_instance()->_get( 'groups' ); - - $last_version = self::hubwoo_pro_last_version(); - - if ( HUBWOO_VERSION != $last_version && '2.0.0' > $last_version ) { - - if ( is_array( $hubwoo_groups ) && count( $hubwoo_groups ) ) { - - foreach ( $hubwoo_groups as $single_group ) { - - if ( 'subscriptions_details' == $single_group['name'] && ! self::is_subs_group_setup_completed() ) { - - $final_groups[] = array( - 'detail' => $single_group, - 'status' => 'false', - ); - } else { - - $final_groups[] = array( - 'detail' => $single_group, - 'status' => 'created', - ); - } - } - } - } else { - - $added_groups = get_option( 'hubwoo-groups-created', array() ); - - if ( get_option( 'hubwoo_abncart_added', 0 ) == 1 ) { - $added_groups = apply_filters( 'hubwoo_active_groups', $added_groups ); - } - - if ( is_array( $hubwoo_groups ) && count( $hubwoo_groups ) ) { - - foreach ( $hubwoo_groups as $single_group ) { - - if ( in_array( $single_group['name'], $added_groups ) ) { - - $final_groups[] = array( - 'detail' => $single_group, - 'status' => 'created', - ); - } else { - - $final_groups[] = array( - 'detail' => $single_group, - 'status' => 'false', - ); - } - } - } - } - - return $final_groups; - } - - /** - * Verify if the hubspot subscription group setup is completed. - * - * @since 1.0.0 - * @return boolean true/false - */ - public static function is_subs_group_setup_completed() { - - $last_version = self::hubwoo_pro_last_version(); - - if ( HUBWOO_VERSION != $last_version ) { - - if ( get_option( 'hubwoo_subs_setup_completed', false ) ) { - - return true; - } else { - - if ( in_array( 'subscriptions_details', get_option( 'hubwoo-groups-created', array() ) ) ) { - - return true; - } else { - - return false; - } - } - } - } - - /** - * Required groups for lists and workflows. - * - * @since 1.0.0 - */ - public function hubwoo_workflows_and_list_groups() { - - return array( 'rfm_fields', 'roi_tracking', 'customer_group', 'order', 'abandoned_cart' ); - } - - /** - * Required properties for lists abd workflows. - * - * @since 1.0.0 - */ - public function hubwoo_workflows_and_list_properties() { - - $required_fields = array(); - - $roi_tracking_properties = HubWooContactProperties::get_instance()->_get( 'properties', 'roi_tracking' ); - - if ( ! empty( $roi_tracking_properties ) ) { - - foreach ( $roi_tracking_properties as $single_property ) { - - if ( isset( $single_property['name'] ) ) { - - $required_fields[] = $single_property['name']; - } - } - } - - $required_fields[] = 'newsletter_subscription'; - $required_fields[] = 'total_number_of_orders'; - $required_fields[] = 'last_order_date'; - $required_fields[] = 'last_order_value'; - $required_fields[] = 'average_days_between_orders'; - $required_fields[] = 'monetary_rating'; - $required_fields[] = 'order_frequency_rating'; - $required_fields[] = 'order_recency_rating'; - - return $required_fields; - } - - /** - * Get final lists to be created on HubSpot. - * - * @since 1.0.0 - */ - public function hubwoo_get_final_lists() { - - $final_lists = array(); - - $hubwoo_lists = HubWooContactProperties::get_instance()->_get( 'lists' ); - if ( is_array( $hubwoo_lists ) && count( $hubwoo_lists ) ) { - - foreach ( $hubwoo_lists as $single_list ) { - $list_filter_created = self::is_list_filter_created( $single_list['filters'] ); - if ( $list_filter_created ) { - - $final_lists[] = $single_list; - } - } - } - - if ( count( $final_lists ) ) { - - $add_lists = get_option( 'hubwoo-lists-created', array() ); - - $filtered_final_lists = array(); - - foreach ( $final_lists as $single_list ) { - - if ( in_array( $single_list['name'], $add_lists ) ) { - - $filtered_final_lists[] = array( - 'detail' => $single_list, - 'status' => 'created', - ); - } else { - - $filtered_final_lists[] = array( - 'detail' => $single_list, - 'status' => 'false', - ); - } - } - } - - return $filtered_final_lists; - } - - /** - * Checking the list filter to be created. - * - * @since 1.0.0 - * @param array $filters list of filters in a list. - */ - public function is_list_filter_created( $filters ) { - - $status = true; - - if ( is_array( $filters ) && count( $filters ) ) { - - foreach ( $filters as $key => $single_filter ) { - - foreach ( $single_filter as $single_filter_detail ) { - - if ( isset( $single_filter_detail['property'] ) ) { - - $status &= self::check_field_existence( $single_filter_detail['property'] ); - } - } - } - } - - return $status; - } - - /** - * Checking field existense for the lists. - * - * @since 1.0.0 - * @param string $field name of the field. - */ - public static function check_field_existence( $field = '' ) { - - $status = false; - - if ( 'lifecyclestage' == $field ) { - - return true; - } - - global $hubwoo; - - $hubwoo_fields = get_option( 'hubwoo-properties-created', array() ); - - $status = in_array( $field, $hubwoo_fields ) ? true : false; - - return $status; - } - - /** - * Checking the lists setup status. - * - * @since 1.0.0 - */ - public function is_list_setup_completed() { - - return get_option( 'hubwoo_pro_lists_setup_completed', false ); - } - - /** - * Workflow description. - * - * @since 1.0.0 - */ - public function get_workflow_description() { - return array( - 'WooCommerce: MQL to Customer lifecycle stage Conversion' => 'It is designed to get a qualified lead to make the first purchase.', - 'WooCommerce: Welcome New Customer & Get a 2nd Order' => 'This workflow triggers shortly after a first purchase, and are designed to push the customer towards a 2nd order.', - 'WooCommerce: 2nd Order Thank You & Get a 3rd Order' => 'This workflow triggers shortly after the 2nd Purchase and is designed to thank customers to become repeat buyers.', - 'WooCommerce: 3rd Order Thank You' => 'This workflow triggers for those customers who have placed their order for at least 3 times.', - 'WooCommerce: ROI Calculation' => 'This workflow triggers to track conversions in your marketing system by knowing Return-On-Investment.', - 'WooCommerce: After order Workflow' => 'This workflow triggers when any new order gets placed.', - 'WooCommerce: Order Workflow' => 'This workflow triggers to track purchase if a prospect gets convert into a customer.', - 'WooCommerce: set Order Recency 1 Ratings' => 'This workflow triggers for those customers with Order Recency Rating - 1.', - 'WooCommerce: set Order Recency 2 Ratings' => 'This workflow triggers for those customers with Order Recency Rating - 2', - 'WooCommerce: set Order Recency 3 Ratings' => 'This workflow triggers for those customers with Order Recency Rating - 3', - 'WooCommerce: set Order Recency 4 Ratings' => 'This workflow triggers for those customers with Order Recency Rating - 4', - 'WooCommerce: set Order Recency 5 Ratings' => 'This workflow triggers for those customers with Order Recency Rating - 5', - 'WooCommerce: Update Historical Order Recency Rating' => 'This workflow triggers when any historical order recency rating gets updated.', - 'WooCommerce: Enroll Customers for Recency Settings' => 'This workflow triggers when any customer has made its first purchase and enrolled for Order Recency.', - 'WooCommerce: Abandoned Cart Recovery' => 'This workflow triggers when any user abandons their cart on your store.', - ); - } - - /** - * Checking the lists setup status. - * - * @since 1.0.0 - */ - public function get_lists_description() { - - return array( - 'Repeat Buyers' => 'Repeat Buyers is the smart list of HubSpot which helps to segment customers those who shop on your store regularly and their HubSpot property Average days between orders is also under the count of 30 days.', - 'DisEngaged Customers' => 'Disengaged Customers is the smart list where you can see the list of customers that didn’t reach you from more than 60-180 days. It is the most useful list where you can target your those customers who are disengaged for a long period of time.', - 'Abandoned Cart' => 'Send Reminders, Capture emails and Recover Lost Sales in real-time with an Automated Cart Recovery Solution for your WooCommerce store.', - 'Engaged Customers' => 'Engaged Customers is the smart list of HubSpot that will list all your contacts whose last brought item is less than 60days. It will show the list of your loyal and regular customers.', - 'Customers' => 'This list will enroll customers according to their customer’s lifecycle stage. Whenever any customer’s lifecycle changes it would filter all those customers.', - 'Marketing Qualified Leads' => 'It will enlist all those marketing qualified lead (MQL) who has been deemed more likely to become a customer compared to other leads. This qualification is based on what web pages a person has visited, what they’ve downloaded, and similar engagement with the business’s content.', - 'Leads' => 'It will list all those leads who have indicated interest in your company’s product or service in some way, shape, or form.', - 'Bought four or more times' => 'It will list all those customers who have purchased 4 times from your store. You can provide special benefits to those customers.', - 'Three time purchase customers' => 'It will list all those customers who have purchased only three times from your store. You can encourage them to buy more frequently.', - 'Two time purchase customers' => 'It will list all those customers who have brought only 2 times from your store. You can pay special attention to those customers as they are interested but you have to educate them about your product and service.', - 'One time purchase customers' => 'It will list all those customers whose total number of order is 1. As the list shows, the total number of order is 1, so you have to work hard on these customers and start nurturing them and educate them about your product and services.', - 'Newsletter Subscriber' => 'It will list all those newsletter subscribers who have subscribed for a printed report containing news (information) of the activities of a business or an organization (institutions, societies, associations) that is sent by mail regularly to all its members, customers, employees or people, who are interested.', - 'Low Spenders' => 'This list shows the contact property whose Monetary rating is equal to 1. It notifies that your customer is not spending much on your store.', - 'Mid Spenders' => 'This list shows the contact property whose Monetary rating is equal to 3. It means that he not frequently buying from your store.', - 'Big Spenders' => 'This list shows the contact property whose Monetary rating is equal to 5. These are the customers who are spending lavishly and purchasing more often from your store.', - 'About to Sleep' => 'It is the list in which customer whose Recency Frequency and Monetary (RFM) value lie between 1 & 2 and they are about to sleep. It means that their engagement with your website is getting less on each successive day.', - 'Customers needing attention' => 'In this list, Monetary and Frequency of the customer are 3 but Recency lies between 1 & 2. This list shows that customer has spent time and money both on your website but his last order was long-ago.', - 'New Customers' => 'This list shows new contact whose Frequency and Recency is 1. They are the new customer they are not yet engaged with your website.', - 'Low Value Lost Customers' => 'It is the list of those customers whose Recency, Frequency & Monetary is 1. These are the customer who is on the verge of getting lost as their engagement with the website is very low.', - 'Churning Customers' => 'It is the list of those customers whose Monetary and Order frequency is 5 but Recency is 1. The churning rate, also known as the rate of attrition, it is the percentage of subscribers to a service who discontinue their subscriptions to the service within a given time period.', - 'Loyal Customers' => 'It is the list of those customers whose Frequency and Recency of order is 5. It is the list which exhibits customer loyalty when they consistently purchase a certain product or brand over an extended period of time and describes the loyalty which is established between a customer and companies.', - 'Best Customers' => 'It is the list of those customers whose RFM (Recency, Frequency & Monetary) rating is perfect 5. It is the list of your loyal customers that are consistently positive & emotional, physical attribute-based satisfaction and perceived value of an experience, which includes the product or services.', - ); - } - - /** - * Required lists to create. - * - * @since 1.0.0 - * @param string $list_name name of the list. - */ - public function required_lists_to_create( $list_name ) { - - $required_lists = array( 'Customers', 'Leads', 'Abandoned Cart' ); - - return in_array( $list_name, $required_lists ) ? "checked='checked'" : ''; - } - - /** - * Getting the final groups after the setup. - * - * @since 1.0.0 - */ - public function hubwoo_get_final_workflows() { - - $final_workflows = array(); - - $hubwoo_workflows = HubWooContactProperties::get_instance()->_get( 'workflows' ); - - $add_workflows = get_option( 'hubwoo-workflows-created', array() ); - - if ( is_array( $hubwoo_workflows ) && count( $hubwoo_workflows ) ) { - - foreach ( $hubwoo_workflows as $single_workflow ) { - - if ( in_array( $single_workflow['name'], $add_workflows ) ) { - - $final_workflows[] = array( - 'detail' => $single_workflow, - 'status' => 'created', - ); - } else { - - $final_workflows[] = array( - 'detail' => $single_workflow, - 'status' => 'false', - ); - } - } - } - - return $final_workflows; - } - - /** - * All dependencies for workflows. - * - * @since 1.0.0 - */ - public static function hubwoo_workflows_dependency() { - - $workflows = array(); - - $workflows[] = array( - 'workflow' => 'WooCommerce: set Order Recency 1 Ratings', - 'dependencies' => array( 'WooCommerce: Order Workflow' ), - ); - - $workflows[] = array( - 'workflow' => 'WooCommerce: set Order Recency 2 Ratings', - 'dependencies' => array( 'WooCommerce: set Order Recency 1 Ratings' ), - ); - - $workflows[] = array( - 'workflow' => 'WooCommerce: set Order Recency 3 Ratings', - 'dependencies' => array( 'WooCommerce: set Order Recency 2 Ratings' ), - ); - - $workflows[] = array( - 'workflow' => 'WooCommerce: set Order Recency 4 Ratings', - 'dependencies' => array( 'WooCommerce: set Order Recency 3 Ratings' ), - ); - - $workflows[] = array( - 'workflow' => 'WooCommerce: set Order Recency 5 Ratings', - 'dependencies' => array( 'WooCommerce: set Order Recency 4 Ratings', 'WooCommerce: Order Workflow' ), - ); - - $workflows[] = array( - 'workflow' => 'WooCommerce: Enroll Customers for Recency Settings', - 'dependencies' => array( 'WooCommerce: Update Historical Order Recency Rating' ), - ); - - $workflows[] = array( - 'workflow' => 'WooCommerce: Update Historical Order Recency Rating', - 'dependencies' => array( 'WooCommerce: set Order Recency 5 Ratings' ), - ); - - $workflows[] = array( - 'workflow' => 'WooCommerce: Order Workflow', - 'dependencies' => array( 'WooCommerce: ROI Calculation', 'WooCommerce: After order Workflow' ), - ); - - $workflows[] = array( - 'workflow' => 'WooCommerce: After order Workflow', - 'dependencies' => array( 'WooCommerce: 3rd Order Thank You', 'WooCommerce: 2nd Order Thank You & Get a 3rd Order', 'WooCommerce: Welcome New Customer & Get a 2nd Order' ), - ); - - $workflows[] = array( - 'workflow' => 'WooCommerce: Abandoned Cart Recovery', - 'dependencies' => array( 'WooCommerce: Order Workflow' ), - ); - - return $workflows; - } - - /** - * Checking workflow dependency. - * - * @since 1.0.0 - * @param string $workflow name of workflow. - */ - public function is_workflow_dependent( $workflow = '' ) { - - if ( ! empty( $workflow ) ) { - - $workflow_dependencies = self::hubwoo_workflows_dependency(); - - $dependencies = array(); - - $status = true; - - if ( ! empty( $workflow_dependencies ) ) { - - foreach ( $workflow_dependencies as $single_workflow ) { - - if ( isset( $single_workflow['workflow'] ) && $workflow == $single_workflow['workflow'] ) { - - $dependencies = $single_workflow['dependencies']; - break; - } - } - } - - if ( ! empty( $dependencies ) ) { - - foreach ( $dependencies as $single_dependency ) { - - $status &= self::is_hubwoo_workflow_exists( $single_dependency ); - } - } - - return $status; - } - } - - /** - * Check for workflow existence. - * - * @since 1.0.0 - * @param string $workflow workflow name. - */ - public static function is_hubwoo_workflow_exists( $workflow = '' ) { - - $status = false; - - if ( ! empty( $workflow ) ) { - - return in_array( $workflow, get_option( 'hubwoo-workflows-created', array() ) ); - } - - return $status; - } - - /** - * Checking for workflows scope. - * - * @since 1.0.0 - */ - public function is_automation_enabled() { - - $scopes = get_option( 'hubwoo_pro_account_scopes', array() ); - - HubWooConnectionMananager::get_instance()->get_workflows(); - - if ( empty( $scopes ) ) { - - HubWooConnectionMananager::get_instance()->hubwoo_pro_get_access_token_info(); - } - - if ( in_array( 'automation', $scopes ) ) { - - return true; - } - } - - - /** - * Get array of all workflows with id and name. - * - * @since 1.0.0 - */ - public static function hubwoo_get_all_workflows_id_name() { - - $all_workflows = array(); - - $all_workflows = HubWooConnectionMananager::get_instance()->get_workflows(); - - return $all_workflows; - } - - /** - * Get selected order action. - * - * @since 1.0.0 - * @param string $action name of action to get html. - */ - public static function hubwoo_get_selected_order_action( $action = '' ) { - - $actions_for_workflows = self::hubwoo_order_actions_for_workflows(); - - $option = ''; - - if ( ! empty( $actions_for_workflows ) ) { - - foreach ( $actions_for_workflows as $key => $value ) { - - if ( $key == $action ) { - - $option .= ''; - } else { - - $option .= ''; - } - } - } - - return $option; - } - - /** - * Get selected workflow. - * - * @since 1.0.0 - * @param array $all_workflows list of all workflows. - * @param string $workflow workflow name. - */ - public static function hubwoo_get_selected_workflow( $all_workflows, $workflow = '' ) { - - $option = ''; - - if ( ! empty( $all_workflows ) ) { - - foreach ( $all_workflows as $key => $value ) { - - if ( $key == $workflow ) { - - $option .= ''; - } else { - - $option .= ''; - } - } - } - - return $option; - } - - - - /** - * Get selected customer action. - * - * @since 1.0.0 - * @param string $action key to be make selected. - */ - public static function hubwoo_get_selected_customer_action( $action = '' ) { - - $actions_for_workflows = self::hubwoo_customer_actions_for_workflows(); - - $option = ''; - - if ( ! empty( $actions_for_workflows ) ) { - - foreach ( $actions_for_workflows as $key => $value ) { - - if ( $key == $action ) { - - $option .= ''; - } else { - - $option .= ''; - } - } - } - - return $option; - } - - /** - * Get array of customer activity actions. - * - * @since 1.0.0 - */ - public static function hubwoo_customer_actions_for_workflows() { - - $actions = array(); - - $actions['user_register'] = esc_html__( 'New User Registration', 'makewebbetter-hubspot-for-woocommerce' ); - - return apply_filters( 'hubwoo_customer_actions_for_workflows', $actions ); - } - - /** - * Get array of order status transition actions. - * - * @since 1.0.0 - */ - public static function hubwoo_order_actions_for_workflows() { - - $actions = array(); - - $actions['woocommerce_order_status_completed'] = esc_html__( 'When order status changes to Completed', 'makewebbetter-hubspot-for-woocommerce' ); - $actions['woocommerce_order_status_processing'] = esc_html__( 'When order status changes to Processing', 'makewebbetter-hubspot-for-woocommerce' ); - $actions['woocommerce_order_status_failed'] = esc_html__( 'When order status changes to Failed', 'makewebbetter-hubspot-for-woocommerce' ); - $actions['woocommerce_order_status_on-hold'] = esc_html__( 'When order status changes to On-hold', 'makewebbetter-hubspot-for-woocommerce' ); - $actions['woocommerce_order_status_refunded'] = esc_html__( 'When order status changes to Refunded', 'makewebbetter-hubspot-for-woocommerce' ); - $actions['woocommerce_order_status_cancelled'] = esc_html__( 'When order status changes to Cancelled', 'makewebbetter-hubspot-for-woocommerce' ); - - return apply_filters( 'hubwoo_order_actions_for_workflows', $actions ); - } - - /** - * Get array of all static lists with id and name. - * - * @since 1.0.0 - */ - public static function hubwoo_get_all_static_lists_id_name() { - - $all_lists = array(); - - $all_lists = HubWooConnectionMananager::get_instance()->get_static_list(); - - return $all_lists; - } - - /** - * Get selected list. - * - * @since 1.0.0 - * @param array $all_lists array of all lists. - * @param string $list name of list. - */ - public static function hubwoo_get_selected_list( $all_lists, $list = '' ) { - - $option = ''; - - if ( ! empty( $all_lists ) ) { - - foreach ( $all_lists as $key => $value ) { - - if ( $key == $list ) { - - $option .= ''; - } else { - - $option .= ''; - } - } - } - - return $option; - } - - /** - * Get array of all user roles of WordPress. - * - * @since 1.0.0 - */ - public static function hubwoo_get_user_roles() { - - global $wp_roles; - - $exiting_user_roles = array(); - - $user_roles = ! empty( $wp_roles->role_names ) ? $wp_roles->role_names : array(); - - if ( is_array( $user_roles ) && count( $user_roles ) ) { - - foreach ( $user_roles as $role => $role_info ) { - - $role_label = ! empty( $role_info ) ? $role_info : $role; - - $exiting_user_roles[ $role ] = $role_label; - } - - $exiting_user_roles['guest_user'] = 'Guest User'; - } - - return $exiting_user_roles; - } - - /** - * Check whether subscriptions are active or not. - * - * @since 1.0.0 - * @return boolean true/false - */ - public static function hubwoo_subs_active() { - - $flag = false; - - if ( in_array( 'woocommerce-subscriptions/woocommerce-subscriptions.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) { - - $flag = true; - } - - return $flag; - } - - /** - * Get full country name. - * - * @since 1.0.0 - * @param string $value country abbreviation. - */ - public static function map_country_by_abbr( $value ) { - - if ( ! empty( $value ) ) { - if ( class_exists( 'WC_Countries' ) ) { - $wc_countries = new WC_Countries(); - $countries = $wc_countries->__get( 'countries' ); - } - if ( ! empty( $countries ) ) { - foreach ( $countries as $abbr => $country_name ) { - if ( $value == $abbr ) { - $value = $country_name; - break; - } - } - } - } - return $value; - } - - /** - * Get full state name. - * - * @since 1.0.0 - * @param string $value abbrevarion for state. - * @param string $country name of country. - */ - public static function map_state_by_abbr( $value, $country ) { - - if ( ! empty( $value ) && ! empty( $country ) ) { - if ( class_exists( 'WC_Countries' ) ) { - $wc_countries = new WC_Countries(); - $states = $wc_countries->__get( 'states' ); - } - if ( ! empty( $states ) ) { - foreach ( $states as $country_abbr => $country_states ) { - if ( $country == $country_abbr ) { - foreach ( $country_states as $state_abbr => $state_name ) { - if ( $value == $state_abbr ) { - $value = $state_name; - break; - } - } - break; - } - } - } - } - return $value; - } - - /** - * Filter contact properties with the help of created properties. - * - * @since 1.0.0 - * @param array $properties list of contact properties. - */ - public function hubwoo_filter_contact_properties( $properties = array() ) { - - $filtered_properties = array(); - - $created_properties = array_map( - function( $property ) { - return str_replace( "'", '', $property ); - }, - get_option( 'hubwoo-properties-created', array() ) - ); - - if ( ! empty( $properties ) && count( $properties ) ) { - - foreach ( $properties as $single_property ) { - - if ( ! empty( $single_property['property'] ) ) { - - if ( in_array( $single_property['property'], $created_properties ) ) { - - $filtered_properties[] = $single_property; - } - } - } - } - - return $filtered_properties; - } - - /** - * Returning saved access token. - * - * @since 1.0.0 - */ - public static function hubwoo_get_access_token() { - - if ( self::is_valid_client_ids_stored() ) { - - if ( self::is_access_token_expired() ) { - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - } - } - - return get_option( 'hubwoo_pro_access_token', false ); - } - - /** - * Get auth url. - * - * @since 1.0.0 - */ - public static function hubwoo_get_auth_url() { - - $url = 'https://app.hubspot.com/oauth/authorize'; - - $hapikey = HUBWOO_CLIENT_ID; - - $hubspot_url = add_query_arg( - array( - 'response_type' => 'code', - 'state' => urlencode( self::get_oauth_state() ), - 'client_id' => $hapikey, - 'optional_scope' => 'automation%20files%20timeline%20content%20forms%20integration-sync%20e-commerce%20crm.objects.custom.read%20crm.objects.custom.write', - 'scope' => 'oauth%20crm.objects.owners.read%20crm.objects.contacts.write%20crm.objects.companies.write%20crm.lists.write%20crm.objects.companies.read%20crm.lists.read%20crm.objects.deals.read%20crm.objects.deals.write%20crm.objects.contacts.read%20crm.schemas.companies.write%20crm.schemas.contacts.write%20crm.schemas.deals.read%20crm.schemas.deals.write%20crm.schemas.contacts.read%20crm.schemas.companies.read', - 'redirect_uri' => 'https://auth.makewebbetter.com/integration/hubspot-auth/', - ), - $url - ); - - return $hubspot_url; - } - - /** - * Get oauth state with current instance redirect url. - * - * @since 1.4.4 - * @return string State. - */ - public static function get_oauth_state( ) { - - $nonce = wp_create_nonce( 'hubwoo_security' ); - - $admin_redirect_url = admin_url(); - $args = array( - 'mwb_nonce' => $nonce, - 'mwb_source' => 'hubspot', - ); - $admin_redirect_url = add_query_arg( $args, $admin_redirect_url ); - return $admin_redirect_url; - } - - /** - * Get selected deal stage by order key. - * - * @since 1.0.0 - * @param string $order_key order key. - */ - public static function get_selected_deal_stage( $order_key ) { - - $deal_stage = array(); - if ( ! empty( $order_key ) ) { - $saved_mapping = get_option( 'hubwoo_ecomm_final_mapping', array() ); - if ( ! empty( $saved_mapping ) ) { - foreach ( $saved_mapping as $single_mapping ) { - if ( $order_key == $single_mapping['status'] ) { - $deal_stage = $single_mapping['deal_stage']; - break; - } - } - } - } - return $deal_stage; - } - - /** - * Get contact sync status. - * - * @since 1.0.0 - */ - public static function get_sync_status() { - - $sync_status['current'] = get_option( 'hubwoo_deals_current_sync_count', 0 ); - $sync_status['total'] = get_option( 'hubwoo_deals_current_sync_total', 0 ); - $sync_status['eta_deals_sync'] = ''; - - if ( $sync_status['total'] ) { - $perc = round( ( $sync_status['current'] / $sync_status['total'] ) * 100 ); - $sync_status['deals_progress'] = $perc > 100 ? 99 : $perc; - $sync_status['eta_deals_sync'] = self::hubwoo_create_sync_eta( $sync_status['current'], $sync_status['total'], 5, 5 ); - } - - if ( ( $sync_status['current'] == $sync_status['total'] ) || ( $sync_status['current'] > $sync_status['total'] ) ) { - self::hubwoo_stop_sync( 'stop-deal' ); - } - return $sync_status; - } - - /** - * Get contact sync status. - * - * @since 1.0.0 - * @param string $query_action which query to run. - * @return array|string query result. - */ - public static function hubwoo_make_db_query( $query_action ) { - - global $wpdb; - - switch ( $query_action ) { - case 'total_products_to_sync': - return $wpdb->get_results( "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_type IN ( 'product', 'product_variation' ) AND ID NOT IN (SELECT post_parent FROM {$wpdb->posts} WHERE post_type IN ( 'product', 'product_variation' ) ) AND post_status IN ( 'publish', 'draft' )" ); - case 'total_synced_products': - return $wpdb->get_results( "SELECT COUNT(post_id) FROM {$wpdb->postmeta} WHERE meta_key LIKE 'hubwoo_ecomm_pro_id'" ); - case 'total_synced_deals': - return $wpdb->get_results( "SELECT COUNT(post_id) FROM {$wpdb->postmeta} WHERE meta_key LIKE 'hubwoo_ecomm_deal_created'" ); - case 'total_synced_contacts': - return $wpdb->get_results( "SELECT COUNT(user_id) FROM {$wpdb->usermeta} WHERE meta_key = 'hubwoo_pro_user_data_change' AND meta_value = 'synced'" ); - case 'total_synced_guest_contacts': - return $wpdb->get_results( "SELECT COUNT(post_id) FROM {$wpdb->postmeta} WHERE meta_key = 'hubwoo_pro_guest_order' AND meta_value = 'synced'" ); - default: - return ''; - } - } - - /** - * Get contact sync status. - * - * @since 1.0.0 - */ - public static function get_deals_presenter() { - - $synced_products = 0; - $percentage_done = 0; - $display_data = array(); - $total_products = get_option( 'hubwoo_products_to_sync', 0 ); - - if ( 0 == $total_products ) { - $result = self::hubwoo_make_db_query( 'total_products_to_sync' ); - if ( ! empty( $result ) ) { - $result = (array) $result[0]; - $total_products = $result['COUNT(ID)']; - update_option( 'hubwoo_products_to_sync', $total_products ); - } - } - $display_data['total_products'] = $total_products; - - if ( 'yes' == get_option( 'hubwoo_ecomm_setup_completed', 'no' ) ) { - $display_data['view_all'] = 'block'; - $display_data['view_mapping'] = 'none'; - $display_data['view_button'] = 'inline-block'; - } else { - $display_data['view_mapping'] = 'block'; - $display_data['view_all'] = 'none'; - $display_data['view_button'] = 'none'; - $display_data['p_run_sync'] = 'block'; - } - - $display_data['is_psync_running'] = 'no'; - if ( 'yes' == get_option( 'hubwoo_start_product_sync', 'no' ) ) { - - $display_data['p_run_sync'] = 'block'; - $display_data['is_psync_running'] = 'yes'; - $display_data['view_btn_mapping'] = 'none'; - $display_data['h_sync'] = 'none'; - $display_data['heading'] = 'eCommerce Pipeline setup is now running, please wait.'; - $sync_result = self::hubwoo_make_db_query( 'total_synced_products' ); - - if ( ! empty( $sync_result ) ) { - $sync_result = (array) $sync_result[0]; - $synced_products = $sync_result['COUNT(post_id)']; - } - if ( 0 != $total_products ) { - $percentage_done = round( $synced_products * 100 / $total_products ); - $percentage_done = $percentage_done > 100 ? 99 : $percentage_done; - } - - $display_data['eta_product_sync'] = self::hubwoo_create_sync_eta( $synced_products, $total_products, 3, 5 ); - $display_data['percentage_done'] = $percentage_done; - if ( 100 == $percentage_done ) { - self::hubwoo_stop_sync( 'stop-product-sync' ); - } - } else { - $display_data['heading'] = 'Connect with eCommerce Pipeline'; - $display_data['h_sync'] = 'block'; - $display_data['p_run_sync'] = 'none'; - } - - $display_data['is_dsync'] = 'no'; - if ( 1 == get_option( 'hubwoo_deals_sync_running', 0 ) ) { - $display_data['is_dsync'] = 'yes'; - $display_data['message'] = 'block'; - $display_data['button'] = 'none'; - $display_data['btn_data'] = 'stop-deal'; - $display_data['btn_text'] = 'Stop Sync'; - } else { - $display_data['btn_text'] = 'Start Sync'; - $display_data['btn_data'] = 'start-deal'; - $display_data['message'] = 'none'; - $display_data['button'] = 'inline-block'; - } - - $scopes = get_option( 'hubwoo_pro_account_scopes', array() ); - - $display_data['scope_notice'] = 'none'; - if ( ! in_array( 'integration-sync', $scopes ) ) { - $display_data['scope_notice'] = 'block'; - } - - return $display_data; - } - - /** - * Get all deal stages - * - * @since 1.0.0 - * @param bool $update true/false. - */ - public static function get_all_deal_stages( $update = false ) { - - $deal_stages = get_option( 'hubwoo_fetched_deal_stages', '' ); - $pipeline_id = get_option( 'hubwoo_ecomm_pipeline_id', '' ); - if ( empty( $deal_stages ) || $update || empty( $pipeline_id ) ) { - - $deal_stages = self::fetch_deal_stages_from_pipeline(); - if ( ! empty( $deal_stages ) ) { - update_option( 'hubwoo_fetched_deal_stages', $deal_stages ); - } - } - return $deal_stages; - } - - /** - * Get deal stages from sales pipeline. - * - * @since 1.0.0 - * @param string $pipeline_label name of pipeline ( default Ecommerce Pipline). - * @param bool $only_stages return only stages (default true). - */ - public static function fetch_deal_stages_from_pipeline( $pipeline_label = 'Ecommerce Pipeline', $only_stages = true ) { - - $all_deal_pipelines = HubWooConnectionMananager::get_instance()->fetch_all_deal_pipelines(); - $fetched_pipeline = array(); - if ( ! empty( $all_deal_pipelines['results'] ) ) { - update_option( 'hubwoo_potal_pipelines', $all_deal_pipelines['results'] ); - array_map( - function( $single_pipeline ) use ( $pipeline_label, &$fetched_pipeline, $only_stages ) { - - if ( $single_pipeline['label'] == $pipeline_label ) { - - $fetched_pipeline = $only_stages ? $single_pipeline['stages'] : $single_pipeline; - - $pipeline_id = $single_pipeline['id']; - update_option( 'hubwoo_ecomm_pipeline_id', $pipeline_id ); - - self::update_deal_stages_mapping( $fetched_pipeline ); - } - }, - $all_deal_pipelines['results'] - ); - } - - if ( empty( $fetched_pipeline ) ) { - - $create_pipeline = array( - 'label' => 'Ecommerce Pipeline', - 'displayOrder' => 0, - 'stages' => self::get_ecomm_deal_stages(), - ); - - $flag = true; - if ( self::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - - $response = HubWooConnectionMananager::get_instance()->create_deal_pipeline( $create_pipeline ); - if ( 201 == $response['status_code'] ) { - $all_deal_pipelines = HubWooConnectionMananager::get_instance()->fetch_all_deal_pipelines(); - array_map( - function( $single_pipeline ) use ( $pipeline_label, &$fetched_pipeline, $only_stages ) { - - if ( $single_pipeline['label'] == $pipeline_label ) { - - $fetched_pipeline = $only_stages ? $single_pipeline['stages'] : $single_pipeline; - $pipeline_id = $single_pipeline['id']; - update_option( 'hubwoo_ecomm_pipeline_id', $pipeline_id ); - } - }, - $all_deal_pipelines['results'] - ); - - self::update_deal_stages_mapping( $fetched_pipeline ); - } - } - } - - return $fetched_pipeline; - } - - /** - * Get deal stages from sales pipeline. - * - * @since 1.4.0 - * @param string $fetched_pipeline array of deal stages. - */ - public static function update_deal_stages_mapping( $fetched_pipeline = array() ) { - - if ( empty( $fetched_pipeline ) ) { - return; - } - - $mapping_with_new_stages = array(); - - foreach ( $fetched_pipeline as $single_pipeline ) { - $label = isset( $single_pipeline['label'] ) ? $single_pipeline['label'] : ''; - switch ( $label ) { - case 'Checkout Abandoned': - $mapping_with_new_stages['checkout_abandoned'] = $single_pipeline['id']; - break; - case 'Payment Pending/Failed': - $mapping_with_new_stages['checkout_pending'] = $single_pipeline['id']; - break; - case 'On hold': - $mapping_with_new_stages['checkout_completed'] = $single_pipeline['id']; - break; - case 'Processing': - $mapping_with_new_stages['processed'] = $single_pipeline['id']; - break; - case 'Completed': - $mapping_with_new_stages['shipped'] = $single_pipeline['id']; - break; - case 'Refunded/Cancelled': - $mapping_with_new_stages['cancelled'] = $single_pipeline['id']; - break; - } - } - update_option( 'hubwoo_ecomm_pipeline_created', 'yes' ); - update_option( 'hubwoo_ecomm_deal_stage_ids', $mapping_with_new_stages ); - update_option( 'hubwoo_ecomm_final_mapping', self::hubwoo_deals_mapping() ); - } - - /** - * Fetch Ecomm pipeline deal stages. - * - * @since 1.4.0 - * @return array formatted array with get request. - */ - public static function get_ecomm_deal_stages() { - return array( - array( - 'label' => 'Checkout Abandoned', - 'displayOrder' => 0, - 'metadata' => array( - 'isClosed' => false, - 'probability' => 0.1, - ), - ), - array( - 'label' => 'Payment Pending/Failed', - 'displayOrder' => 1, - 'metadata' => array( - 'isClosed' => false, - 'probability' => 0.2, - ), - ), - array( - 'label' => 'On hold', - 'displayOrder' => 2, - 'metadata' => array( - 'isClosed' => false, - 'probability' => 0.6, - ), - ), - array( - 'label' => 'Processing', - 'displayOrder' => 3, - 'metadata' => array( - 'isClosed' => true, - 'probability' => 1.0, - ), - ), - array( - 'label' => 'Completed', - 'displayOrder' => 4, - 'metadata' => array( - 'isClosed' => true, - 'probability' => 1.0, - ), - ), - array( - 'label' => 'Refunded/Cancelled', - 'displayOrder' => 5, - 'metadata' => array( - 'isClosed' => true, - 'probability' => 0.0, - ), - ), - - ); - } - - /** - * Stop deals sync. - * - * @since 1.0.0 - * @param string $type stop a specific task. - * @return void - */ - public static function hubwoo_stop_sync( $type ) { - - if ( 'stop-contact' == $type ) { - - update_option( 'hubwoo_ocs_data_synced', true ); - delete_option( 'hubwoo_background_process_running' ); - delete_option( 'hubwoo_total_ocs_need_sync' ); - as_unschedule_action( 'hubwoo_contacts_sync_background' ); - - } elseif ( 'stop-deal' == $type ) { - - delete_option( 'hubwoo_deals_sync_total' ); - delete_option( 'hubwoo_deals_sync_running' ); - delete_option( 'hubwoo_deals_current_sync_count' ); - as_unschedule_action( 'hubwoo_deals_sync_background' ); - } elseif ( 'stop-product-sync' ) { - update_option( 'hubwoo_ecomm_setup_completed', 'yes' ); - delete_option( 'hubwoo_start_product_sync' ); - delete_option( 'hubwoo_products_to_sync' ); - as_unschedule_action( 'hubwoo_products_sync_background' ); - as_unschedule_action( 'hubwoo_products_status_background' ); - } - } - - /** - * Get the eCommerce Store Data. - * - * @since 1.0.0 - * @return array store data . - */ - public static function get_store_data() { - - $blog_name = get_bloginfo( 'name' ); - $blog_id = preg_replace( '/[^a-zA-Z0-9]/', '', $blog_name ); - $store = array( - 'id' => $blog_id . '-' . get_current_blog_id(), - 'label' => $blog_name, - 'adminUri' => get_admin_url(), - ); - return $store; - } - - /** - * Stop deals sync. - * - * @since 1.0.0 - * @param int $number_of_products number of products to prepare. - * @return array products info as eCommerce products. - */ - public static function hubwoo_get_product_data( $number_of_products = 5 ) { - - $contraints = array( - array( - 'key' => 'hubwoo_ecomm_pro_id', - 'compare' => 'NOT EXISTS', - ), - array( - 'key' => 'hubwoo_ecomm_invalid_pro', - 'compare' => 'NOT EXISTS', - ), - array( - 'key' => 'hubwoo_product_synced', - 'compare' => 'NOT EXISTS', - ), - 'relation' => 'AND', - ); - - $products = self::hubwoo_ecomm_get_products( $number_of_products, $contraints ); - - $products_info = array(); - - if ( is_array( $products ) && count( $products ) ) { - - $object_type = 'PRODUCT'; - - foreach ( $products as $product_id ) { - - if ( ! empty( $product_id ) ) { - - $product = wc_get_product( $product_id ); - $product_type = $product->get_type(); - - if ( 'variable' == $product_type && ( ! empty( $product_type ) ) || 'variable-subscription' == $product_type || null == $product_type ) { - update_post_meta( $product_id, 'hubwoo_ecomm_invalid_pro', 'yes' ); - continue; - } else { - - $hubwoo_ecomm_product = new HubwooEcommObject( $product_id, $object_type ); - $properties = $hubwoo_ecomm_product->get_object_properties(); - $properties = apply_filters( 'hubwoo_map_ecomm_' . $object_type . '_properties', $properties, $product_id ); - $properties['description'] = isset( $properties['pr_description'] ) ? $properties['pr_description'] : ''; - - unset( $properties['pr_description'] ); - $products_info[ $product_id ] = array( - 'properties' => $properties, - ); - } - } - } - } - return $products_info; - } - - /** - * Retrieve all of the products. - * - * @since 1.0.0 - * @param int $post_per_page number of products to prepare. - * @param array $constraints meta query constraints. - * @return array products ids. - */ - public static function hubwoo_ecomm_get_products( $post_per_page = 10, $constraints = array() ) { - - $response = array( - 'status_code' => 400, - 'reponse' => 'No Products Found', - ); - $query = new WP_Query(); - $request = array( - 'post_type' => array( 'product', 'product_variation' ), - 'posts_per_page' => $post_per_page, - 'post_status' => array( 'publish', 'draft' ), - 'orderby' => 'date', - 'order' => 'desc', - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - ); - - if ( ! empty( $constraints ) ) { - if ( isset( $constraints['relation'] ) ) { - $request['meta_query']['relation'] = array_pop( $constraints ); - } - $request['meta_query'] = array_merge( $constraints ); - } - - $response = $query->query( $request ); - return $response; - } - - /** - * Update the eCommerce pipeline deal stages - * with WooCommerce Deal stages and probability. - * - * @since 1.0.0 - * @return array deal stage data. - */ - public static function hubwoo_deal_stage_model() { - return array( - 'checkout_abandoned' => array( - 'label' => esc_html__( 'Checkout Abandoned', 'makewebbetter-hubspot-for-woocommerce' ), - 'metadata' => array( - 'isClosed' => false, - 'probability' => 0.1, - ), - ), - 'checkout_pending' => array( - 'label' => esc_html__( 'Payment Pending/Failed', 'makewebbetter-hubspot-for-woocommerce' ), - 'metadata' => array( - 'isClosed' => false, - 'probability' => 0.2, - ), - ), - 'checkout_completed' => array( - 'label' => esc_html__( 'On hold', 'makewebbetter-hubspot-for-woocommerce' ), - 'metadata' => array( - 'isClosed' => false, - 'probability' => 0.6, - ), - ), - 'processed' => array( - 'label' => esc_html__( 'Processing', 'makewebbetter-hubspot-for-woocommerce' ), - 'metadata' => array( - 'isClosed' => true, - 'probability' => 1, - ), - ), - 'shipped' => array( - 'label' => esc_html__( 'Completed', 'makewebbetter-hubspot-for-woocommerce' ), - 'metadata' => array( - 'isClosed' => true, - 'probability' => 1, - ), - ), - 'cancelled' => array( - 'label' => esc_html__( 'Refunded/Cancelled', 'makewebbetter-hubspot-for-woocommerce' ), - 'metadata' => array( - 'isClosed' => true, - 'probability' => 0, - ), - ), - ); - } - - /** - * Get the default model of order status and deal stage. - * - * @since 1.0.0 - * @return array mapped deal stage and order status. - */ - public static function hubwoo_deals_mapping() { - - $mapping = array(); - - $default_dealstages = array( - 'wc-pending' => 'checkout_pending', - 'wc-processing' => 'processed', - 'wc-on-hold' => 'checkout_completed', - 'wc-completed' => 'shipped', - 'wc-cancelled' => 'cancelled', - 'wc-refunded' => 'cancelled', - 'wc-failed' => 'checkout_pending', - ); - - if ( 'yes' == get_option( 'hubwoo_ecomm_pipeline_created', 'no' ) ) { - $new_stages = get_option( 'hubwoo_ecomm_deal_stage_ids', true ); - foreach ( $default_dealstages as $key => $value ) { - $new_stage_value = isset( $new_stages[ $value ] ) ? $new_stages[ $value ] : ''; - $default_dealstages[ $key ] = $new_stage_value; - } - } - - $mapping = array_map( - function( $order_status ) use ( $default_dealstages ) { - $mapped_data['status'] = $order_status; - if ( array_key_exists( $order_status, $default_dealstages ) ) { - $mapped_data['deal_stage'] = $default_dealstages[ $order_status ]; - } else { - $mapped_data['deal_stage'] = 'checkout_completed'; - } - return $mapped_data; - }, - array_keys( wc_get_order_statuses() ) - ); - return $mapping; - } - - /** - * Get the default model of order status and deal stage. - * - * @since 1.0.0 - * @return array mapped deal stage and order status. - */ - public static function hubwoo_sales_deals_mapping() { - $default_dealstages = array( - 'wc-pending' => 'appointmentscheduled', - 'wc-processing' => 'contractsent', - 'wc-on-hold' => 'presentationscheduled', - 'wc-completed' => 'closedwon', - 'wc-cancelled' => 'closedlost', - 'wc-refunded' => 'closedlost', - 'wc-failed' => 'appointmentscheduled', - ); - - update_option( 'hubwoo_ecomm_pipeline_created', 'yes' ); - $mapping = array_map( - function( $order_status ) use ( $default_dealstages ) { - $mapped_data['status'] = $order_status; - if ( array_key_exists( $order_status, $default_dealstages ) ) { - $mapped_data['deal_stage'] = $default_dealstages[ $order_status ]; - } else { - $mapped_data['deal_stage'] = 'presentationscheduled'; - } - return $mapped_data; - }, - array_keys( wc_get_order_statuses() ) - ); - - return $mapping; - } - - /** - * Setup the overview section of the dashboard. - * - * @since 1.0.0 - * @param bool $install_plugin default ( false ). - * @return array|void $display_data display data for the HS plugin. - */ - public function hubwoo_setup_overview( $install_plugin = false ) { - - global $hubwoo; - - if ( 'no' == get_option( 'hubwoo_checkout_form_created', 'no' ) ) { - $form_data = self::form_data_model( HubwooConst::CHECKOUTFORM ); - $flag = true; - if ( self::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - $res = HubWooConnectionMananager::get_instance()->create_form_data( $form_data ); - if ( 200 == $res['status_code'] ) { - update_option( 'hubwoo_checkout_form_created', 'yes' ); - $res = json_decode( $res['body'], true ); - if ( isset( $res['guid'] ) ) { - update_option( 'hubwoo_checkout_form_id', $res['guid'] ); - } - } else { - HubwooErrorHandling::get_instance()->hubwoo_handle_response( $res, HubwooConst::CHECKOUTFORM ); - } - } - } - - if ( $install_plugin ) { - - WC_Install::background_installer( - 'leadin', - array( - 'name' => esc_html__( 'HubSpot All-In-One Marketing - Forms, Popups, Live Chat', 'makewebbetter-hubspot-for-woocommerce' ), - 'repo-slug' => 'leadin', - ) - ); - ?> - - setTimestamp( $last_sync ); - $display_data['last_sync'] = 'Last Sync: ' . date_format( $date, 'jS F Y \a\t g:ia ' ); - } - //hpos changes - if( self::hubwoo_check_hpos_active() ) { - $query = new WC_Order_Query(array( - 'posts_per_page' => -1, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'orderby' => 'date', - 'order' => 'desc', - 'return' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'post_parent' => 0, - 'meta_key' => 'hubwoo_ecomm_deal_created', - 'meta_compare' => 'NOT EXISTS', - )); - - $customer_orders = $query->get_orders(); - } else { - - $query = new WP_Query(); - - $customer_orders = $query->query( - array( - 'post_type' => 'shop_order', - 'posts_per_page' => -1, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'meta_query' => array( - array( - 'key' => 'hubwoo_ecomm_deal_created', - 'compare' => 'NOT EXISTS', - ), - ), - ) - ); - } - - $display_data['deals_left'] = empty( $customer_orders ) ? 'Sync completed' : count( $customer_orders ) . ' waiting to sync'; - - $roles = get_option( 'hubwoo_customers_role_settings', array() ); - - if ( empty( $roles ) ) { - - $roles = array_keys( $hubwoo->hubwoo_get_user_roles() ); - } - - $guest_key = array_search( 'guest_user', $roles ); - - if ( false !== $guest_key ) { - unset( $roles[ $guest_key ] ); - } - - $args['meta_query'] = array( - array( - 'key' => 'hubwoo_pro_user_data_change', - 'compare' => 'NOT EXISTS', - ), - ); - $args['role__in'] = $roles; - $args['number'] = -1; - $args['fields'] = 'ID'; - - $users = get_users( $args ); - - $display_data['contacts_left'] = empty( $users ) ? 'Sync completed' : count( $users ) . ' waiting to sync'; - - //hpos changes - if( self::hubwoo_check_hpos_active() ) { - $synced_orders = new WC_Order_Query(array( - 'posts_per_page' => -1, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'orderby' => 'date', - 'order' => 'desc', - 'return' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'meta_key' => 'hubwoo_ecomm_deal_created', - 'meta_compare' => 'EXISTS', - )); - - $total_order_synced = $synced_orders->get_orders(); - - $object_data['deal'][] = strval(count($total_order_synced)); - } else { - $object_data['deal'] = self::hubwoo_make_db_query( 'total_synced_deals' ); - } - - $object_data['reg_users'] = self::hubwoo_make_db_query( 'total_synced_contacts' ); - $object_data['guest_users'] = self::hubwoo_make_db_query( 'total_synced_guest_contacts' ); - $object_data['product'] = self::hubwoo_make_db_query( 'total_synced_products' ); - $object_data['total_products'] = self::hubwoo_make_db_query( 'total_products_to_sync' ); - - array_walk( - $object_data, - function( $data, $type ) use ( &$display_data ) { - if ( ! empty( $data ) ) { - $data = (array) $data[0]; - $data = array_pop( $data ); - $display_data[ $type ] = ! empty( $data ) ? $data : 0; - } - } - ); - $display_data['products_left'] = intval( $display_data['total_products'] ) - intval( $display_data['product'] ); - $display_data['products_left'] = $display_data['products_left'] > 0 ? $display_data['products_left'] . ' waiting to sync' : 'Sync completed'; - return $display_data; - } - - /** - * Create an ETA for the current running sync. - * - * @since 1.0.0 - * @param int $current current sync count. - * @param int $total total sync count. - * @param int $timer scheduled timer. - * @param int $limiter limiter of the sync. - * @return string $eta_string returns the calculated eta string. - */ - public static function hubwoo_create_sync_eta( $current, $total, $timer, $limiter ) { - $eta_string = ''; - $left_items_timer = round( ( $total - $current ) / $limiter ) * $timer; - - if ( $left_items_timer > 90 ) { - $float_timer = number_format( ( $left_items_timer / 60 ), 2 ); - $hours = intval( $float_timer ); - $minutes = round( ( $float_timer - $hours ) * 0.6 ); - $eta_string = "{$hours} hours and {$minutes} minutes "; - } elseif ( 0 == $left_items_timer ) { - $eta_string = 'less than a minute'; - } else { - $eta_string = "{$left_items_timer} minutes"; - } - return $eta_string; - } - - /** - * Handle the Contact sync for failed cases. - * - * @since 1.0.0 - * @param array $response response from HubSpot. - * @param array $contact_data prepared contact data. - * @param array $args data and type of sync object. - * @return void. - */ - public static function hubwoo_handle_contact_sync( $response, &$contact_data, $args = array() ) { - - $response = json_decode( $response['body'], true ); - - if ( ! empty( $response['invalidEmails'] ) ) { - - $failed_indexes = array_column( $response['failureMessages'], 'index' ); - - if ( ! empty( $failed_indexes ) ) { - - array_walk( - $failed_indexes, - function( $index ) use ( &$contact_data ) { - unset( $contact_data[ $index ] ); - } - ); - - $contact_data = array_values( $contact_data ); - - HubWooConnectionMananager::get_instance()->create_or_update_contacts( $contact_data, $args ); - } - } else { - Hubwoo_Admin::hubwoo_split_contact_batch( $contact_data ); - } - } - - /** - * Handle the Contact sync for failed cases. - * - * @since 1.0.0 - * @param array $ids object ids to be marked. - * @param string $type type of object id. - * @return void. - */ - public static function hubwoo_marked_sync( $ids, $type ) { - - if ( ! empty( $ids ) ) { - - $emails = ''; - $user_data = array(); - - $method_calls['user'] = array( - 'get' => 'get_user_meta', - 'update' => 'update_user_meta', - 'get_key' => 'billing_email', - 'update_key' => 'hubwoo_pro_user_data_change', - ); - $method_calls['order'] = array( - 'get' => 'get_post_meta', - 'update' => 'update_post_meta', - 'get_key' => '_billing_email', - 'update_key' => 'hubwoo_pro_guest_order', - ); - $unsynced_ids = array_filter( - $ids, - function( $id ) use ( &$method_calls, &$type ) { - return empty( $method_calls[ $type ]['get']( $id, 'hubwoo_user_vid', true ) ); - } - ); - - if ( empty( $unsynced_ids ) && 'user' == $type ) { - foreach ( $ids as $id ) { - $method_calls[ $type ]['update']( $id, $method_calls[ $type ]['update_key'], 'synced' ); - } - return; - } - - switch ( $type ) { - case 'user': - foreach ( $unsynced_ids as $id ) { - $user = get_user_by( 'id', $id ); - $usr_email = $user->data->user_email; - if ( ! empty( $usr_email ) ) { - $usr_email = strtolower( $usr_email ); - $user_data[ $usr_email ] = $id; - $emails .= 'email=' . $usr_email . '&'; - } - } - break; - case 'order': - foreach ( $unsynced_ids as $id ) { - $usr_email = $method_calls[ $type ]['get']( $id, $method_calls[ $type ]['get_key'], true ); - if ( ! empty( $usr_email ) ) { - $usr_email = strtolower( $usr_email ); - $user_data[ $usr_email ] = $id; - $emails .= 'email=' . $usr_email . '&'; - } - } - break; - default: - return; - } - - $response = HubWooConnectionMananager::get_instance()->hubwoo_get_batch_vids( $emails ); - - if ( 200 == $response['status_code'] && ! empty( $response['body'] ) ) { - $users = json_decode( $response['body'], true ); - if ( 0 == count( $users ) ) { - return; } - - foreach ( $users as $vid => $data ) { - if ( ! empty( $data['properties']['email'] ) ) { - if ( array_key_exists( $data['properties']['email']['value'], $user_data ) ) { - $method_calls[ $type ]['update']( $user_data[ $data['properties']['email']['value'] ], 'hubwoo_user_vid', $vid ); - $method_calls[ $type ]['update']( $user_data[ $data['properties']['email']['value'] ], $method_calls[ $type ]['update_key'], 'synced' ); - } - } - } - } - } - } - - /** - * Displays Cron status. - * - * @since 1.0.0 - * @return array. - */ - public static function hubwoo_cron_status() { - - $cron_status = array( - 'status' => true, - 'type' => 'Cron Events are working fine on your website.', - ); - - if ( ! as_next_scheduled_action( 'hubwoo_cron_schedule' ) ) { - as_schedule_recurring_action( time(), 300, 'hubwoo_cron_schedule' ); - } - - if ( ! as_next_scheduled_action( 'hubwoo_deals_sync_check' ) ) { - as_schedule_recurring_action( time(), 300, 'hubwoo_deals_sync_check' ); - } - - if ( ! as_next_scheduled_action( 'hubwoo_ecomm_deal_update' ) ) { - as_schedule_recurring_action( time(), 300, 'hubwoo_ecomm_deal_update' ); - } - - if ( ! as_next_scheduled_action( 'hubwoo_products_sync_check' ) ) { - as_schedule_recurring_action( time(), 300, 'hubwoo_products_sync_check' ); - } - - if ( ! as_next_scheduled_action( 'hubwoo_check_logs' ) ) { - as_schedule_recurring_action( time(), 86400, 'hubwoo_check_logs' ); - } - - if ( ! as_next_scheduled_action( 'huwoo_abncart_clear_old_cart' ) ) { - as_schedule_recurring_action( time(), 86400, 'huwoo_abncart_clear_old_cart' ); - } - - if ( ! as_next_scheduled_action( 'hubwoo_cron_schedule' ) || ! as_next_scheduled_action( 'hubwoo_deals_sync_check' ) || ! as_next_scheduled_action( 'hubwoo_ecomm_deal_update' ) ) { - $cron_status['status'] = false; - $cron_status['type'] = esc_html__( 'You are having issues with your MWB HubSpot for WooCommerce sync. Please read this doc on how to fix your integration.', 'makewebbetter-hubspot-for-woocommerce' ); - } - - return $cron_status; - } - - /** - * Onboarding questionaire Model. - * - * @since 1.0.0 - * @return array. - */ - public static function hubwoo_onboarding_questionaire() { - - return array( - 'mwb_hs_familarity' => array( - 'allow' => '', - 'label' => 'Which of these sounds most like your HubSpot ability?', - 'options' => array( - '', - 'I have never used a CRM before', - 'I\'m new to HubSpot, but I have used a CRM before', - 'I know my way around HubSpot pretty well', - ), - ), - 'mwb_woo_familarity' => array( - 'allow' => '', - 'label' => 'Which of these sounds most like your WooCommerce ability?', - 'options' => array( - '', - 'I have never used an e-Commerce platform before', - 'I\'m new to WooCommerce, but I have used an e-Commerce platform before', - 'I know my way around WooCommerce pretty well', - ), - ), - 'which_hubspot_packages_do_you_currently_use_' => array( - 'allow' => 'multiple', - 'label' => 'Which HubSpot plan you are using?', - 'options' => array( - 'I don’t currently use HubSpot', - 'HubSpot Free', - 'Marketing Starter', - 'Marketing Pro', - 'Marketing Enterprise', - 'Sales Starter', - 'Sales Pro', - 'Sales Enterprise', - 'Service Starter', - 'Service Pro', - 'Service Enterprise', - 'CMS Hub', - 'Other', - ), - ), - ); - } - - /** - * Form Model Data. - * - * @since 1.0.0 - * @param stgring $type type of form model. - * @return array. - */ - public static function form_data_model( $type ) { - switch ( $type ) { - case HubwooConst::CHECKOUTFORM: - return array( - array( - 'name' => HubwooConst::CHECKOUTFORMNAME, - 'submitText' => 'Submit', - 'formFieldGroups' => array( - array( - 'fields' => array( - array( - 'name' => 'firstname', - 'label' => 'First Name', - 'required' => false, - ), - array( - 'name' => 'lastname', - 'label' => 'Last Name', - 'required' => false, - ), - array( - 'name' => 'email', - 'label' => 'Email', - 'required' => false, - ), - ), - ), - ), - ), - ); - default: - return array(); - } - } - - /** - * Get contact sync status. - * - * @since 1.2.7 - * @return int $unique_users number of unique users. - */ - public static function hubwoo_get_total_contact_need_sync() { - - $unique_users = count( get_users() ); - - $order_args = array( - 'return' => 'ids', - 'limit' => -1, - 'type' => wc_get_order_types(), - 'status' => array_keys( wc_get_order_statuses() ), - 'customer' => 0, - ); - - $guest_orders = wc_get_orders( $order_args ); - $unique_users += count( $guest_orders ); - - return $unique_users; - } - - /** - * Currently CRM name. - * - * @param string $get The slug for crm we want to integrate with. - */ - public static function get_current_crm_name( $get = '' ) { - $slug = 'hubwoo'; - if ( 'slug' === $get ) { - return esc_html( ( $slug ) ); - } else { - return esc_html( ucwords( $slug ) ); - } - } - - /** - * Check if log is enable. - * - * @return boolean - */ - public static function is_log_enable() { - $enable = get_option( 'hubwoo_' . self::get_current_crm_name( 'slug' ) . '_enable_log', 'yes' ); - $enable = ( 'yes' === $enable ); - return $enable; - } - - /** - * Check if table exists. - * - * @param string $table_name Table name to be checked. - */ - public static function hubwoo_log_table_exists( $table_name ) { - global $wpdb; - - if ( $wpdb->get_var( $wpdb->prepare('show tables like %s', $wpdb->esc_like( $table_name ) ) ) === $table_name ) { - return 'exists'; - } else { - return false; - } - } - - /** - * Create log table in database. - * - * @param string $slug crm slug. - */ - public static function hubwoo_create_log_table( $slug = '' ) { - - global $wpdb; - $crm_log_table = $wpdb->prefix . 'hubwoo_log'; - - // If exists true. - if ( 'exists' === self::hubwoo_log_table_exists( $crm_log_table ) ) { - return; - } - - $crm_object = $slug . '_object'; - - global $wpdb; - $wpdb->get_results( $wpdb->prepare( - 'CREATE TABLE IF NOT EXISTS %1s ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `%1s` varchar(255) NOT NULL, - `event` varchar(255) NOT NULL, - `request` text NOT NULL, - `response` text NOT NULL, - `time` int(11) NOT NULL, - PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8;', $crm_log_table, $crm_object ) ); - } - - /** - * Get CRM log data from database. - * - * @param string|boolean $search_value Search value. - * @param integer $limit Max limit of data. - * @param integer $offset Offest to start. - * @param boolean $all Return all results. - * @return array Array of data. - */ - public static function hubwoo_get_log_data( $search_value = false, $limit = 25, $offset = 0, $all = false ) { - - global $wpdb; - $table_name = $wpdb->prefix . 'hubwoo_log'; - $log_data = array(); - - if ( $all ) { - - $log_data = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM %1s ORDER BY `id` DESC', $table_name ), ARRAY_A ); // @codingStandardsIgnoreLine. - return $log_data; - - } - - if ( ! $search_value ) { - - $log_data = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM %1s ORDER BY `id` DESC LIMIT %d OFFSET %d ', $table_name, $limit, $offset ), ARRAY_A ); // @codingStandardsIgnoreLine. - return $log_data; - - } - - $log_data = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM %1s WHERE `hubwoo_object` = %s ORDER BY `id` DESC', $table_name, $search_value ), ARRAY_A ); // @codingStandardsIgnoreLine. - - return $log_data; - } - - /** - * Get total count from log table. - * - * @return integer Total count. - */ - public static function hubwoo_get_total_log_count() { - global $wpdb; - $table_name = $wpdb->prefix . 'hubwoo_log'; - - $count = $wpdb->get_results( $wpdb->prepare( 'SELECT COUNT(*) as `total_count` FROM %1s', $table_name ) ); // @codingStandardsIgnoreLine. - $count[0] = $count[0]->total_count; - return $count; - } - - /** - * Get deal group properties. - * - * @return array array of properties. - */ - public static function hubwoo_get_deal_properties() { - $update_properties = array( - array( - 'name' => 'discount_amount', - 'label' => __( 'Discount savings', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'groupName' => 'dealinformation', - ), - array( - 'name' => 'order_number', - 'label' => __( 'Order number', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - 'groupName' => 'dealinformation', - ), - array( - 'name' => 'shipment_ids', - 'label' => __( 'Shipment IDs', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - 'groupName' => 'dealinformation', - ), - array( - 'name' => 'tax_amount', - 'label' => __( 'Tax amount', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'groupName' => 'dealinformation', - ), - ); - - return $update_properties; - } - - /** - * Get product group properties. - * - * @return array array of properties. - */ - public static function hubwoo_get_product_properties() { - return array( - array( - 'name' => 'store_product_id', - 'label' => __( 'Store Product Id', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'groupName' => 'productinformation', - ), - array( - 'name' => 'product_source_store', - 'label' => __( 'Product Source Store', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - 'groupName' => 'productinformation', - ), - ); - } - - /** - * Associate deal with company. - * - * @param integer $contact Contact hubspot id. - * @param integer $deal_id Deal hubspot id. - */ - public static function hubwoo_associate_deal_company( $contact = '', $deal_id = '' ) { - - if ( ! empty( $contact ) && ! empty( $deal_id ) ) { - $contact_response = HubWooConnectionMananager::get_instance()->get_customer_vid_historical( $contact ); - if ( 200 == $contact_response['status_code'] ) { - $decoded_response = json_decode( $contact_response['body'] ); - $comp = $decoded_response->properties; - $comp_meta = ( isset( $comp->associatedcompanyid ) ) ? $comp->associatedcompanyid : ''; - $company_id = ( isset( $comp_meta->value ) ) ? $comp_meta->value : ''; - if ( ! empty( $company_id ) ) { - HubWooConnectionMananager::get_instance()->associate_object( 'deal', $deal_id, 'company', $company_id, 5 ); - - } - } - } - - } - - public static function hubwoo_check_hpos_active() { - if( 'yes' == get_option('woocommerce_custom_orders_table_enabled', 'no') && true == get_option( 'hubwoo_hpos_license_check', 0 ) ) { - return true; - } - - return false; - } - } -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooconnectionmananager.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooconnectionmananager.php deleted file mode 100644 index 418fc776..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooconnectionmananager.php +++ /dev/null @@ -1,2893 +0,0 @@ - 'refresh_token', - 'client_id' => $hapikey, - 'client_secret' => $hseckey, - 'refresh_token' => $refresh_token, - 'redirect_uri' => $redirect_uri, - ); - - $body = http_build_query( $data ); - - return $this->hubwoo_oauth_post_api( $endpoint, $body, 'refresh' ); - } - - /** - * Fetching access token from code. - * - * @since 1.0.0 - * @param string $hapikey client id for app. - * @param string $hseckey secret id for app. - */ - public function hubwoo_fetch_access_token_from_code( $hapikey, $hseckey ) { - - if ( isset( $_GET['code'] ) ) { - $code = sanitize_key( $_GET['code'] ); - $endpoint = '/oauth/v1/token'; - $data = array( - 'grant_type' => 'authorization_code', - 'client_id' => $hapikey, - 'client_secret' => $hseckey, - 'code' => $code, - 'redirect_uri' => 'https://auth.makewebbetter.com/integration/hubspot-auth/', - ); - $body = http_build_query( $data ); - return $this->hubwoo_oauth_post_api( $endpoint, $body, 'access' ); - } - } - - /** - * Post api for oauth access and refresh token. - * - * @since 1.0.0 - * @param string $endpoint API endpoint to call. - * @param array $body formatted data to be sent in hubspot api request. - * @param string $action refresh/access. - */ - public function hubwoo_oauth_post_api( $endpoint, $body, $action ) { - - $headers = array( - 'Content-Type: application/x-www-form-urlencoded;charset=utf-8', - ); - - $response = wp_remote_post( - $this->base_url . $endpoint, - array( - 'body' => $body, - 'headers' => $headers, - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - - $parsed_response = array( - 'status_code' => 400, - 'response' => 'error', - ); - - if ( 200 === $status_code ) { - - $api_body = wp_remote_retrieve_body( $response ); - - if ( $api_body ) { - $api_body = json_decode( $api_body ); - } - - if ( ! empty( $api_body->refresh_token ) && ! empty( $api_body->access_token ) && ! empty( $api_body->expires_in ) ) { - - update_option( 'hubwoo_pro_access_token', $api_body->access_token ); - update_option( 'hubwoo_pro_refresh_token', $api_body->refresh_token ); - update_option( 'hubwoo_pro_token_expiry', time() + $api_body->expires_in ); - update_option( 'hubwoo_pro_valid_client_ids_stored', true ); - $message = esc_html__( 'Fetching and refreshing access token', 'makewebbetter-hubspot-for-woocommerce' ); - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - $this->create_log( $message, $endpoint, $parsed_response, $action ); - - if ( 'access' === $action ) { - - $this->hubwoo_pro_get_access_token_info(); - } - - update_option( 'hubwoo_pro_send_suggestions', true ); - update_option( 'hubwoo_pro_oauth_success', true ); - return true; - } - } elseif ( 400 === $status_code ) { - $message = ! empty( $api_body['message'] ) ? $api_body['message'] : ''; - } elseif ( 403 === $status_code ) { - $message = esc_html__( 'You are forbidden to use this scope', 'makewebbetter-hubspot-for-woocommerce' ); - } else { - $message = esc_html__( 'Something went wrong.', 'makewebbetter-hubspot-for-woocommerce' ); - } - - update_option( 'hubwoo_pro_send_suggestions', false ); - update_option( 'hubwoo_pro_api_validation_error_message', $message ); - update_option( 'hubwoo_pro_valid_client_ids_stored', false ); - $this->create_log( $message, $endpoint, $parsed_response, 'access_token' ); - return false; - } - - - /** - * Fetch access token info for automation enabling. - * - * @since 1.0.0 - */ - public function hubwoo_pro_get_access_token_info() { - - $access_token = Hubwoo::hubwoo_get_access_token(); - $endpoint = '/oauth/v1/access-tokens/' . $access_token; - $headers = $this->get_token_headers(); - - $response = wp_remote_get( $this->base_url . $endpoint, array( 'headers' => $headers ) ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - - if ( 200 === $status_code ) { - $api_body = wp_remote_retrieve_body( $response ); - if ( $api_body ) { - $api_body = json_decode( $api_body, true ); - } - if ( ! empty( $api_body['scopes'] ) ) { - update_option( 'hubwoo_pro_account_scopes', $api_body['scopes'] ); - } - } - - $message = esc_html__( 'Getting access token information', 'makewebbetter-hubspot-for-woocommerce' ); - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - $this->create_log( $message, $endpoint, $parsed_response, 'access_token' ); - } - - /** - * Sending details of hubspot. - * - * @since 1.0.0 - */ - public function send_clients_details() { - - $send_status = get_option( 'hubwoo_pro_send_suggestions', false ); - - if ( $send_status ) { - - $url = '/owners/v2/owners'; - $headers = $this->get_token_headers(); - - $response = wp_remote_get( $this->base_url . $url, array( 'headers' => $headers ) ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - - if ( 200 == $status_code ) { - - $api_body = wp_remote_retrieve_body( $response ); - - if ( $api_body ) { - $api_body = json_decode( $api_body ); - } - - $message = ''; - - if ( ! empty( $api_body ) ) { - - foreach ( $api_body as $single_row ) { - //phpcs:disable - $message = 'portalId: ' . $single_row->portalId . '
'; - $message .= 'ownerId: ' . $single_row->ownerId . '
'; - $message .= 'type: ' . $single_row->type . '
'; - $message .= 'firstName: ' . $single_row->firstName . '
'; - $message .= 'lastName: ' . $single_row->lastName . '
'; - $message .= 'email: ' . $single_row->email . '
'; - //phpcs:enable - break; - } - - $to = 'integrations@makewebbetter.com'; - $subject = 'HubSpot PRO Customers Details'; - $headers = array( 'Content-Type: text/html; charset=UTF-8' ); - $status = wp_mail( $to, $subject, $message, $headers ); - return $status; - } - } - } - return false; - } - - /** - * Get hubspot owner email. - * - * @since 1.0.0 - * @return int $portalId portal id for hubspot account. - */ - public function hubwoo_get_owners_info() { - - $url = '/account-info/v3/details'; - $headers = $this->get_token_headers(); - - $response = wp_remote_get( $this->base_url . $url, array( 'headers' => $headers ) ); - - $portal_id = ''; - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - - if ( 200 === $status_code ) { - - $api_body = wp_remote_retrieve_body( $response ); - - if ( $api_body ) { - $api_body = json_decode( $api_body ); - } - //phpcs:disable - if ( ! empty( $api_body ) && isset( $api_body->portalId ) ) { - $portal_id = $api_body->portalId; - } - //phpcs:enable - } - - return $portal_id; - } - - /** - * Create group on hubspot. - * - * @since 1.0.0 - * @param array $group_details formatted data to create new group. - * @param array $object_type type of object. - * @return array $parsed_response formatted array with status code/response. - */ - public function create_group( $group_details, $object_type ) { - - if ( is_array( $group_details ) ) { - - if ( isset( $group_details['name'] ) && isset( $group_details['label'] ) ) { - - $url = '/crm/v3/properties/' . $object_type . '/groups'; - $headers = $this->get_token_headers(); - - $group_details = wp_json_encode( $group_details ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $group_details, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Creating ' . $object_type . ' Groups', 'makewebbetter-hubspot-for-woocommerce' ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - $this->create_log( $message, $url, $parsed_response, 'groups' ); - return $parsed_response; - } - } - } - - /** - * Read a property from HubSpot. - * - * @since 1.0.0 - * @param array $object_type Object name. - * @param array $property_name Property name. - * @return array $parsed_response Parsed Response. - */ - public function hubwoo_read_object_property( $object_type, $property_name ) { - - $url = '/crm/v3/properties/' . $object_type . '/' . $property_name; - $headers = $this->get_token_headers(); - $res_body = ''; - $response = wp_remote_get( $this->base_url . $url, array( 'headers' => $headers ) ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - $message = __( 'Reading object property', 'makewebbetter-hubspot-for-woocommerce' ); - - $this->create_log( $message, $url, $parsed_response, 'properties' ); - - return $parsed_response; - } - - /** - * Create property on hubspot. - * - * @since 1.0.0 - * @param array $prop_details formatted data to create new property. - * @param array $object_type HubSpot Object type. - * @return array $parsed_response formatted array with status/message. - */ - public function create_property( $prop_details, $object_type ) { - - if ( is_array( $prop_details ) ) { - - if ( isset( $prop_details['name'] ) && isset( $prop_details['groupName'] ) ) { - - $url = '/crm/v3/properties/' . $object_type; - $headers = $this->get_token_headers(); - $res_body = ''; - $prop_details = wp_json_encode( $prop_details ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $prop_details, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Creating Properties', 'makewebbetter-hubspot-for-woocommerce' ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $this->create_log( $message, $url, $parsed_response, 'properties' ); - return $parsed_response; - } - } - } - - /** - * Create Bulk Contact Property in HubSpot. - * - * @since 1.0.0 - * @param array $properties_data all of the hs properties. - * @param array $object_type HubSpot Object type. - * @return array $parsed_response formatted array with status/message. - */ - public function create_batch_properties( $properties_data, $object_type ) { - - $request_body['inputs'] = $properties_data; - $request_body['objectType'] = $object_type; - - if ( is_array( $request_body ) ) { - - $url = '/crm/v3/properties/' . $object_type . '/batch/create'; - $headers = $this->get_token_headers(); - $res_body = ''; - $request_body = wp_json_encode( $request_body ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $request_body, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Creating ' . $object_type . ' Batch Properties', 'makewebbetter-hubspot-for-woocommerce' ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $this->create_log( $message, $url, $parsed_response, 'properties' ); - return $parsed_response; - } - } - - /** - * Update property on hubspot. - * - * @since 1.0.0 - * @param array $prop_details formatted data to update hubspot property. - * @param array $object_type HubSpot Object type. - * @return array $parsed_response formatted array with status/message. - */ - public function update_property( $prop_details, $object_type ) { - // check if in the form of array. - if ( is_array( $prop_details ) ) { - // check for name and groupName. - if ( isset( $prop_details['name'] ) && isset( $prop_details['groupName'] ) ) { - - // let's update. - $url = '/crm/v3/properties/' . $object_type . '/' . $prop_details['name']; - - $headers = $this->get_token_headers(); - $prop_details = wp_json_encode( $prop_details ); - $response = wp_remote_request( - $this->base_url . $url, - array( - 'method' => 'PUT', - 'headers' => $headers, - 'body' => $prop_details, - ) - ); - - $message = __( 'Updating Properties', 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - - $this->create_log( $message, $url, $parsed_response, 'properties' ); - - return $parsed_response; - } - } - } - - /** - * Fetch batch properties on hubspot. - * - * @since 1.4.0 - * @param array $prop_data list of property name to be fetch. - * @param array $object_type HubSpot Object type. - * @return array $parsed_response formatted array with status/message. - */ - public function hubwoo_read_batch_object_properties( $prop_data, $object_type ) { - if ( is_array( $prop_data ) ) { - $url = '/crm/v3/properties/' . $object_type . '/batch/read'; - - $headers = $this->get_token_headers(); - $prop_data = wp_json_encode( $prop_data ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'headers' => $headers, - 'body' => $prop_data, - ) - ); - - $message = __( 'Fetch batch properties', 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - - $this->create_log( $message, $url, $parsed_response, 'properties' ); - - return $parsed_response; - } - } - - /** - * Create a single contact on HS. - * - * @since 1.0.0 - * @param array $contact formatted data to create single contact on hubspot. - * @return array $parsed_response formatted array with status/message. - */ - public function create_single_contact( $contact ) { - - if ( is_array( $contact ) ) { - - $url = '/contacts/v1/contact'; - $headers = $this->get_token_headers(); - $contact = wp_json_encode( $contact ); - $res_body = ''; - $response = wp_remote_post( - $this->base_url . $url, - array( - 'headers' => $headers, - 'body' => $contact, - ) - ); - $message = __( 'Creating Single Contact', 'makewebbetter-hubspot-for-woocommerce' ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $this->create_log( $message, $url, $parsed_response, 'contacts' ); - return $parsed_response; - } - } - - /** - * Create or update contacts. - * - * @param array $contacts hubspot acceptable contacts array. - * @param array $args ids of contacts or orders. - * @since 1.0.0 - * @return array $parsed_response formatted array with status/message - */ - public function create_or_update_contacts( $contacts, $args = array() ) { - - if ( is_array( $contacts ) ) { - - $url = '/contacts/v1/contact/batch/'; - $headers = $this->get_token_headers(); - $res_body = ''; - - $contacts = wp_json_encode( $contacts ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $contacts, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Updating or Creating users data', 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - if ( 202 == $status_code ) { - update_option( 'hubwoo_last_sync_date', time() ); - if ( ! empty( $args ) && get_option( 'hubwoo_background_process_running', false ) ) { - $hsocssynced = get_option( 'hubwoo_ocs_contacts_synced', 0 ); - $hsocssynced += count( $args['ids'] ); - update_option( 'hubwoo_ocs_contacts_synced', $hsocssynced ); - } - if ( isset( $args['ids'] ) && isset( $args['type'] ) ) { - Hubwoo::hubwoo_marked_sync( $args['ids'], $args['type'] ); - } - } elseif ( 400 === $status_code ) { - - $api_body = wp_remote_retrieve_body( $response ); - - if ( $api_body ) { - $api_body = json_decode( $api_body ); - } - //phpcs:disable - if ( ! empty( $api_body->invalidEmails ) ) { - $savedinvalidemails = get_option( 'hubwoo_pro_invalid_emails', array() ); - foreach ( $api_body->invalidEmails as $single_email ) { - //phpcs:enable - if ( ! in_array( $single_email, $savedinvalidemails, true ) ) { - $savedinvalidemails[] = $single_email; - $user_exists = email_exists( $single_email ); - if ( $user_exists ) { - - update_user_meta( $user_exists, 'hubwoo_invalid_contact', 'yes' ); - update_user_meta( $user_exists, 'hubwoo_pro_user_data_change', 'synced' ); - } else { - $query = new WC_Order_Query(array( - 'posts_per_page' => -1, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'order' => 'desc', - 'post_parent' => 0, - 'customer' => $single_email, - 'return' => 'ids', - )); - - $customer_orders = $query->get_orders(); - - if ( count( $customer_orders ) ) { - foreach ( $customer_orders as $key => $value ) { - $order = wc_get_order($order_id); - $order->update_meta_data('hubwoo_invalid_contact', 'yes'); - $order->save(); - } - } - } - } - } - } - - update_option( 'hubwoo_newsletter_property_update', '' ); - update_option( 'hubwoo_abandoned_property_update', '' ); - } - - if ( ! empty( $savedinvalidemails ) ) { - update_option( 'hubwoo_pro_invalid_emails', $savedinvalidemails ); - } - $this->create_log( $message, $url, $parsed_response, 'contacts' ); - return $parsed_response; - } - } - - /** - * Create or update contacts. - * - * @param array $contacts hubspot acceptable contact properties array. - * @param string $email email of contact. - * @since 1.2.6 - * @return array $parsed_response formatted array with status/message - */ - public function create_or_update_single_contact( $contacts, $email ) { - - if ( is_array( $contacts ) ) { - - $url = '/contacts/v1/contact/createOrUpdate/email/' . $email . '/'; - $headers = $this->get_token_headers(); - $res_body = ''; - - $contacts = wp_json_encode( $contacts ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $contacts, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Updating or Creating single users data', 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - $this->create_log( $message, $url, $parsed_response, 'contacts' ); - return $parsed_response; - } - } - - /** - * Create list on hubspot. - * - * @since 1.0.0 - * @param array $list_details formatted data to create new list on hubspot. - * @return array $parsed_response formatted array with status/message. - */ - public function create_list( $list_details ) { - - if ( is_array( $list_details ) ) { - if ( isset( $list_details['name'] ) ) { - $url = '/contacts/v1/lists'; - $headers = $this->get_token_headers(); - $res_body = ''; - $list_details = wp_json_encode( $list_details ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $list_details, - 'headers' => $headers, - ) - ); - $message = __( 'Creating Lists', 'makewebbetter-hubspot-for-woocommerce' ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $this->create_log( $message, $url, $parsed_response, 'lists' ); - return $parsed_response; - } - } - } - - /** - * Get all static lists from HS. - * - * @since 1.0.0 - * @return array $lists formatted array with list id and name. - */ - public function get_static_list() { - - $lists = array(); - $lists['select'] = __( '--Please Select a Static List--', 'makewebbetter-hubspot-for-woocommerce' ); - - $url = '/contacts/v1/lists/static?count=250'; - $headers = $this->get_token_headers(); - $response = wp_remote_get( $this->base_url . $url, array( 'headers' => $headers ) ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - - $message = __( 'Get Static Lists', 'makewebbetter-hubspot-for-woocommerce' ); - - $this->create_log( $message, $url, $parsed_response, 'lists' ); - - if ( 200 == $status_code ) { - $api_body = wp_remote_retrieve_body( $response ); - if ( $api_body ) { - $api_body = json_decode( $api_body, true ); - } - if ( ! empty( $api_body->lists ) ) { - - foreach ( $api_body->lists as $single_list ) { - //phpcs:disable - if ( isset( $single_list->name ) && isset( $single_list->listId ) ) { - - $lists[ $single_list->listId ] = $single_list->name; - } - //phpcs:enable - } - } - } - - return $lists; - } - - /** - * Get all active lists from HS. - * - * @since 1.0.0 - * @return array $lists formatted array with list id and name. - */ - public function get_dynamic_lists() { - - $lists = array(); - - $url = '/contacts/v1/lists/dynamic?count=250'; - $headers = $this->get_token_headers(); - $response = wp_remote_get( $this->base_url . $url, array( 'headers' => $headers ) ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - - $message = __( 'Get Dynamic Lists', 'makewebbetter-hubspot-for-woocommerce' ); - - $this->create_log( $message, $url, $parsed_response, 'lists' ); - - if ( 200 == $status_code ) { - $api_body = wp_remote_retrieve_body( $response ); - if ( $api_body ) { - $api_body = json_decode( $api_body, true ); - } - if ( ! empty( $api_body['lists'] ) ) { - - foreach ( $api_body['lists'] as $single_list ) { - //phpcs:disable - if ( isset( $single_list['name'] ) && isset( $single_list['listId'] ) ) { - - $lists[ $single_list['listId'] ] = $single_list['name']; - } - //phpcs:enable - } - } - } - - return $lists; - } - - /** - * Enroll a contact email in a list. - * - * @since 1.0.0 - * @param string $email contact email to be enrolled. - * @param string $list_id id of the hubspot list. - * @return array $parsed_response formatted array with status/response. - */ - public function list_enrollment( $email, $list_id ) { - - if ( ! empty( $email ) && ! empty( $list_id ) ) { - - $url = '/contacts/v1/lists/' . $list_id . '/add'; - $headers = $this->get_token_headers(); - $emails = array(); - $emails[] = $email; - $request = array( 'emails' => $emails ); - $request = wp_json_encode( $request ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $request, - 'headers' => $headers, - ) - ); - $message = __( 'Enrolling in Static List', 'makewebbetter-hubspot-for-woocommerce' ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - $this->create_log( $message, $url, $parsed_response, 'lists' ); - return $parsed_response; - } - } - - /** - * Create workflow on hubspot. - * - * @since 1.0.0 - * @param array $workflow_details formatted array with workflow details. - * @return array $parsed_response formatted array with status/response. - */ - public function create_workflow( $workflow_details ) { - - if ( is_array( $workflow_details ) ) { - - if ( isset( $workflow_details['name'] ) ) { - - $url = '/automation/v3/workflows'; - $headers = $this->get_token_headers(); - $res_body = ''; - $workflow = wp_json_encode( $workflow_details ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $workflow, - 'headers' => $headers, - ) - ); - $message = __( 'Creating Workflows', 'makewebbetter-hubspot-for-woocommerce' ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $this->create_log( $message, $url, $parsed_response, 'workflows' ); - return $parsed_response; - } - } - } - - /** - * Get all workflows from hubspot. - * - * @since 1.0.0 - */ - public function get_workflows() { - - $workflows = array(); - $workflows['select'] = esc_html__( '--Please Select a Workflow--', 'makewebbetter-hubspot-for-woocommerce' ); - $url = '/automation/v3/workflows'; - $headers = $this->get_token_headers(); - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - - $message = __( 'Getting all Workflows', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'workflows' ); - - if ( 200 == $status_code ) { - $api_body = wp_remote_retrieve_body( $response ); - if ( $api_body ) { - $api_body = json_decode( $api_body, true ); - } - update_option( 'hubwoo_access_workflow', 'yes' ); - } else { - $workflows = array(); - update_option( 'hubwoo_access_workflow', 'no' ); - } - - if ( ! empty( $response->workflows ) ) { - - foreach ( $response->workflows as $single_workflow ) { - - if ( isset( $single_workflow->name ) && isset( $single_workflow->id ) ) { - - $workflows[ $single_workflow->id ] = $single_workflow->name; - } - } - } - - return $workflows; - } - - /** - * Get all workflows from hubspot. - * - * @since 1.4.0 - * @param array $workflow_id workflow id to fetch. - * @return array $workflows formatted array with status/response. - */ - public function get_workflow( $workflow_id ) { - - $workflows = array(); - $workflows['select'] = esc_html__( '--Please Select a Workflow--', 'makewebbetter-hubspot-for-woocommerce' ); - $url = '/automation/v3/workflows/' . $workflow_id; - $headers = $this->get_token_headers(); - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - - $message = __( 'Get single Workflows', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'workflows' ); - - if ( 200 == $status_code ) { - $api_body = wp_remote_retrieve_body( $response ); - if ( $api_body ) { - $api_body = json_decode( $api_body, true ); - } - update_option( 'hubwoo_access_workflow', 'yes' ); - } else { - $workflows = array(); - update_option( 'hubwoo_access_workflow', 'no' ); - } - - if ( ! empty( $response->workflows ) ) { - - foreach ( $response->workflows as $single_workflow ) { - - if ( isset( $single_workflow->name ) && isset( $single_workflow->id ) ) { - - $workflows[ $single_workflow->id ] = $single_workflow->name; - } - } - } - - return $workflows; - } - - /** - * Enroll a contact email in a worlflow. - * - * @since 1.0.0 - * @param string $email contact email. - * @param string $workflow_id id of hubspot workflow. - */ - public function workflow_enrollment( $email, $workflow_id ) { - - if ( ! empty( $email ) && ! empty( $workflow_id ) ) { - - $url = '/automation/v2/workflows/' . $workflow_id . '/enrollments/contacts/' . $email; - $headers = $this->get_token_headers(); - $response = $this->_post( $url, array(), $headers ); - $message = __( 'Enrolling in Workflow', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $response, 'workflows' ); - } - } - - /** - * Create log of requests. - * - * @param string $message hubspot log message. - * @param string $url hubspot acceptable url. - * @param array $response hubspot response array. - * @since 1.0.0 - */ - public function create_log( $message, $url, $response, $object_type = '' ) { - - if ( isset( $response['status_code'] ) ) { - - if ( 400 == $response['status_code'] || 401 == $response['status_code'] ) { - - update_option( 'hubwoo_pro_alert_param_set', true ); - $error_apis = get_option( 'hubwoo-error-api-calls', 0 ); - $error_apis ++; - update_option( 'hubwoo-error-api-calls', $error_apis ); - } elseif ( 200 == $response['status_code'] || 202 == $response['status_code'] || 201 == $response['status_code'] || 204 == $response['status_code'] ) { - - $success_apis = get_option( 'hubwoo-success-api-calls', 0 ); - $success_apis ++; - update_option( 'hubwoo-success-api-calls', $success_apis ); - update_option( 'hubwoo_pro_alert_param_set', false ); - } else { - - update_option( 'hubwoo_pro_alert_param_set', false ); - } - - if ( 200 == $response['status_code'] ) { - - $final_response['status_code'] = 200; - } elseif ( 202 == $response['status_code'] ) { - - $final_response['status_code'] = 202; - } else { - - $final_response = $response; - } - - $final_response['body'] = isset( $final_response['body'] ) ? json_decode( $final_response['body'] ) : ''; - - // Create log table in database. - Hubwoo::hubwoo_create_log_table( Hubwoo::get_current_crm_name( 'slug' ) ); - // Insert log in table - self::log_request_in_db( $message, $object_type, $url, $final_response ); - } - } - - /** - * Log request and response in database. - * - * @param string $event Event of which data is synced. - * @param string $crm_object Update or create crm object. - * @param array $request Request data. - * @param array $response Api response. - */ - public function log_request_in_db( $event, $crm_object, $request, $response ) { - - global $wpdb; - - $log_data = array( - 'event' => $event, - 'request' => $request, - 'response' => serialize( $response ), - Hubwoo::get_current_crm_name( 'slug' ) . '_object' => $crm_object, - 'time' => time(), - ); - - $table = $wpdb->prefix . 'hubwoo_log'; - $response = $wpdb->insert( $table, $log_data ); //phpcs:ignore - } - - /** - * Getting all hubspot properties. - * - * @since 1.0.0 - * @param array $object_type HubSpot Object type. - * @return array $response formatted array with status/response. - */ - public function get_all_hubspot_properties( $object_type ) { - - $response = ''; - - $url = '/crm/v3/properties/' . $object_type; - - $headers = $this->get_token_headers(); - - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - - $message = esc_html__( 'Fetching all ' . $object_type . ' Properties', 'makewebbetter-hubspot-for-woocommerce' ); - - $this->create_log( $message, $url, $response, 'properties' ); - - if ( isset( $response['status_code'] ) && 200 == $response['status_code'] ) { - - if ( isset( $response['response'] ) ) { - - $response = json_decode( $response['response'] ); - } - } - - return $response; - } - - /** - * Get all contcat lists from hubspot. - * - * @since 1.0.0 - * @param int $count count of list to get from HubSpot. - * @param int $offset offset for get call. - */ - public function get_all_contact_lists( $count, $offset ) { - - $response = array(); - - $url = '/contacts/v1/lists?count=' . $count . '&offset=' . $offset; - - $headers = $this->get_token_headers(); - - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - - $message = __( 'Fetching Contact Lists', 'makewebbetter-hubspot-for-woocommerce' ); - - $this->create_log( $message, $url, $response, 'lists' ); - - if ( isset( $response['status_code'] ) && 200 == $response['status_code'] ) { - - if ( isset( $response['response'] ) ) { - - $response = json_decode( $response['response'] ); - } - } - - return $response; - } - - /** - * Get all contacts in a list. - * - * @since 1.0.0 - * @param int $list_id id of the list. - * @param int $offset list offset. - */ - public function get_contacts_in_list( $list_id, $offset ) { - - $response = array(); - - $url = '/contacts/v1/lists/' . $list_id . '/contacts/all?count=50&vidOffset=' . $offset; - - $headers = $this->get_token_headers(); - - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - - $message = __( 'Fetching Contacts from List', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $response, 'lists' ); - - if ( isset( $response['status_code'] ) && 200 == $response['status_code'] ) { - - if ( isset( $response['response'] ) ) { - - $response = json_decode( $response['response'] ); - } - } - - return $response; - } - - /** - * Getting single object record. - * - * @since 1.4.0 - * @param array $object_type HubSpot Object type. - * @param int $object_id id of the object. - * @return array $parsed_response formatted array with status/response. - */ - public function get_object_record( $object_type, $object_id ) { - $url = '/crm/v3/objects/' . $object_type . '/' . $object_id; - $headers = $this->get_token_headers(); - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $message = esc_html__( 'Fetching ' . $object_type . ' object', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, $object_type ); - - return $parsed_response; - } - - /** - * Create single object record. - * - * @since 1.4.0 - * @param array $object_type HubSpot Object type. - * @param array $properties_data array of object properties. - * @return array $parsed_response formatted array with status/response. - */ - public function create_object_record( $object_type, $properties_data ) { - if ( is_array( $properties_data ) ) { - - $url = '/crm/v3/objects/' . $object_type; - $headers = $this->get_token_headers(); - $res_body = ''; - - $properties_data = wp_json_encode( $properties_data ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $properties_data, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Creating single ' . $object_type . ' data', 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - $this->create_log( $message, $url, $parsed_response, $object_type ); - return $parsed_response; - } - } - - /** - * Update single object record. - * - * @since 1.4.0 - * @param array $object_type HubSpot Object type. - * @param int $object_id id of object. - * @param array $properties_data array of object properties. - * @return array $parsed_response formatted array with status/response. - */ - public function update_object_record( $object_type, $object_id, $properties_data ) { - if ( is_array( $properties_data ) ) { - - $url = '/crm/v3/objects/' . $object_type . '/' . $object_id; - $headers = $this->get_token_headers(); - $res_body = ''; - - $properties_data = wp_json_encode( $properties_data ); - $response = wp_remote_request( - $this->base_url . $url, - array( - 'method' => 'PATCH', - 'body' => $properties_data, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Updated single ' . $object_type . ' data', 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - $this->create_log( $message, $url, $parsed_response, $object_type ); - return $parsed_response; - } - } - - /** - * Search single object record. - * - * @since 1.4.0 - * @param array $object_type HubSpot Object type. - * @param array $filter_data array of object filter. - * @return array $parsed_response formatted array with status/response. - */ - public function search_object_record( $object_type, $filter_data ) { - if ( is_array( $filter_data ) ) { - $url = '/crm/v3/objects/' . $object_type . '/search'; - $headers = $this->get_token_headers(); - $res_body = ''; - - $filter_data = wp_json_encode( $filter_data ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $filter_data, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Search single ' . $object_type . ' data', 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - $this->create_log( $message, $url, $parsed_response, $object_type ); - return $parsed_response; - } - } - - /** - * Fetch bulk object record. - * - * @since 1.4.0 - * @param array $object_type HubSpot Object type. - * @param array $object_data array of object data. - * @return array $parsed_response formatted array with status/response. - */ - public function get_batch_object_record( $object_type, $object_data ) { - if ( is_array( $object_data ) ) { - $url = '/crm/v3/objects/' . $object_type . '/batch/read'; - $headers = $this->get_token_headers(); - $res_body = ''; - $object_data = wp_json_encode( $object_data ); - - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $object_data, - 'headers' => $headers, - ) - ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $message = esc_html__( 'Fetching Batch ' . $object_type, 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, $object_type ); - - return $parsed_response; - } - } - - /** - * Create bulk object record. - * - * @since 1.4.0 - * @param array $object_type HubSpot Object type. - * @param array $object_data array of object data. - * @return array $parsed_response formatted array with status/response. - */ - public function create_batch_object_record( $object_type, $object_data ) { - if ( is_array( $object_data ) ) { - - $url = '/crm/v3/objects/' . $object_type . '/batch/create'; - $headers = $this->get_token_headers(); - $res_body = ''; - - $object_data = wp_json_encode( $object_data ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $object_data, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Creating bulk ' . $object_type . ' data', 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - $this->create_log( $message, $url, $parsed_response, $object_type ); - return $parsed_response; - } - } - - /** - * Update bulk object record. - * - * @since 1.4.0 - * @param array $object_type HubSpot Object type. - * @param array $object_data array of object data. - * @return array $parsed_response formatted array with status/response. - */ - public function update_batch_object_record( $object_type, $object_data ) { - if ( is_array( $object_data ) ) { - - $url = '/crm/v3/objects/' . $object_type . '/batch/update'; - $headers = $this->get_token_headers(); - $res_body = ''; - - $object_data = wp_json_encode( $object_data ); - $response = wp_remote_request( - $this->base_url . $url, - array( - 'method' => 'POST', - 'body' => $object_data, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Updated bulk ' . $object_type . ' data', 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - $this->create_log( $message, $url, $parsed_response, $object_type ); - return $parsed_response; - } - } - - /** - * Associate single object record. - * - * @since 1.4.0 - * @param array $from_object associate from object type. - * @param array $from_object_id associate from object id. - * @param array $to_object associate to object type. - * @param array $to_object_id associate to object id. - * @param array $association_id id of association type. - * @return array $parsed_response formatted array with status/response. - */ - public function associate_object( $from_object, $from_object_id, $to_object, $to_object_id, $association_id ) { - - if ( isset( $from_object ) && isset( $to_object ) ) { - - $url = '/crm/v4/objects/' . $from_object . '/' . $from_object_id . '/associations/' . $to_object . '/' . $to_object_id; - $headers = $this->get_token_headers(); - $res_body = ''; - - $associate_body[] = array( - 'associationCategory' => 'HUBSPOT_DEFINED', - 'associationTypeId' => $association_id, - ); - $associate_body = wp_json_encode( $associate_body ); - - $response = wp_remote_request( - $this->base_url . $url, - array( - 'method' => 'PUT', - 'body' => $associate_body, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Associate ' . $from_object . ' to ' . $to_object, 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - $this->create_log( $message, $url, $parsed_response, 'association' ); - return $parsed_response; - } - } - - /** - * Delete association single object record. - * - * @since 1.4.0 - * @param array $from_object associate from object type. - * @param array $from_object_id associate from object id. - * @param array $to_object associate to object type. - * @param array $to_object_id associate to object id. - * @return array $parsed_response formatted array with status/response. - */ - public function remove_associated_object( $from_object, $from_object_id, $to_object, $to_object_id ) { - if ( isset( $from_object ) && isset( $to_object ) ) { - - $url = '/crm/v4/objects/' . $from_object . '/' . $from_object_id . '/associations/' . $to_object . '/' . $to_object_id; - $headers = $this->get_token_headers(); - $res_body = ''; - - $response = wp_remote_request( - $this->base_url . $url, - array( - 'method' => 'DELETE', - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Delete association ' . $from_object . ' to ' . $to_object, 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - $this->create_log( $message, $url, $parsed_response, 'association' ); - return $parsed_response; - } - } - - /** - * Bulk associate single object record. - * - * @since 1.4.0 - * @param array $from_object associate from object type. - * @param array $to_object associate to object type. - * @param array $associate_body array of associated data. - * @return array $parsed_response formatted array with status/response. - */ - public function associate_batch_object( $from_object, $to_object, $associate_body ) { - $url = '/crm/v4/associations/' . $from_object . '/' . $to_object . '/batch/create'; - $headers = $this->get_token_headers(); - $res_body = ''; - - $associate_body = wp_json_encode( $associate_body ); - - $response = wp_remote_request( - $this->base_url . $url, - array( - 'method' => 'POST', - 'body' => $associate_body, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Associate batch ' . $from_object . ' to ' . $to_object, 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - $this->create_log( $message, $url, $parsed_response, 'association' ); - return $parsed_response; - } - - /** - * Bulk delete associate single object record. - * - * @since 1.4.0 - * @param array $from_object associate from object type. - * @param array $to_object associate to object type. - * @param array $associate_body array of associated data. - * @return array $parsed_response formatted array with status/response. - */ - public function remove_associate_batch_object( $from_object, $to_object, $associate_body ) { - $url = '/crm/v4/associations/' . $from_object . '/' . $to_object . '/batch/archive'; - $headers = $this->get_token_headers(); - $res_body = ''; - - $associate_body = wp_json_encode( $associate_body ); - - $response = wp_remote_request( - $this->base_url . $url, - array( - 'method' => 'POST', - 'body' => $associate_body, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Delete batch association ' . $from_object . ' to ' . $to_object, 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - $this->create_log( $message, $url, $parsed_response, 'association' ); - return $parsed_response; - } - - /** - * Fetch marketing emails. - * - * @since 1.4.0 - * @param array $limit number of emails to be fetched. - * @return array $parsed_response formatted array with status/response. - */ - public function get_marketing_emails( $limit = 10 ) { - $url = '/marketing-emails/v1/emails?limit=' . $limit; - $headers = $this->get_token_headers(); - $res_body = ''; - - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $message = esc_html__( 'Fetching marketing emails', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'marketing_emails' ); - - return $parsed_response; - } - - /** - * Create marketing emails. - * - * @since 1.4.0 - * @param array $email_template email template data. - * @return array $parsed_response formatted array with status/response. - */ - public function create_marketing_emails( $email_template ) { - if ( is_array( $email_template ) ) { - - $url = '/marketing-emails/v1/emails'; - $headers = $this->get_token_headers(); - $res_body = ''; - - $email_template = wp_json_encode( $email_template ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $email_template, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Creating marketing email.', 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - $this->create_log( $message, $url, $parsed_response, 'marketing_emails' ); - return $parsed_response; - } - } - - /** - * Remove deal associations on email change. - * - * @since 1.0.0 - * @param string $deal_id id of the deal. - * @param string $vid id of the contact. - * @return array $response formatted aray for response. - */ - public function remove_deal_associations( $deal_id, $vid ) { - - $url = '/crm-associations/v1/associations/delete'; - $headers = $this->get_token_headers(); - $request = array( - 'fromObjectId' => $vid, - 'toObjectId' => $deal_id, - 'category' => 'HUBSPOT_DEFINED', - 'definitionId' => '4', - ); - $request = json_encode( $request ); - $response = wp_remote_request( - $this->base_url . $url, - array( - 'body' => $request, - 'headers' => $headers, - 'method' => 'PUT', - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - $message = __( 'Removing Deal Association With Contact', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'association' ); - return $response; - } - - /** - * Create deal associations. - * - * @since 1.0.0 - * @param string $deal_id id of the deal. - * @param string $vid id of the contact. - * @return array $response formatted aray for response. - */ - public function create_deal_associations( $deal_id, $vid ) { - - $url = '/crm-associations/v1/associations'; - $headers = $this->get_token_headers(); - $request = array( - 'fromObjectId' => $vid, - 'toObjectId' => $deal_id, - 'category' => 'HUBSPOT_DEFINED', - 'definitionId' => '4', - ); - $request = json_encode( $request ); - - $response = wp_remote_request( - $this->base_url . $url, - array( - 'body' => $request, - 'headers' => $headers, - 'method' => 'PUT', - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - $message = __( 'Creating Deal Association With Contact', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'association' ); - return $parsed_response; - } - - /** - * Create deal and company associations. - * - * @since 1.2.7 - * @param string $deal_id id of the deal. - * @param string $company_id id of the company. - * @return array $response formatted aray for response. - */ - public function create_deal_company_associations( $deal_id, $company_id ) { - - $url = '/crm-associations/v1/associations'; - $headers = $this->get_token_headers(); - $request = array( - 'fromObjectId' => $company_id, - 'toObjectId' => $deal_id, - 'category' => 'HUBSPOT_DEFINED', - 'definitionId' => '6', - ); - $request = json_encode( $request ); - - $response = wp_remote_request( - $this->base_url . $url, - array( - 'body' => $request, - 'headers' => $headers, - 'method' => 'PUT', - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - $message = __( 'Creating Deal Association With Company', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'association' ); - return $parsed_response; - } - - /** - * Updating deals. - * - * @since 1.0.0 - * @param string $deal_id id of the deal. - * @param array $deal_details details of the deal. - */ - public function update_existing_deal( $deal_id, $deal_details ) { - - $url = '/deals/v1/deal/' . $deal_id; - $headers = $this->get_token_headers(); - $res_body = ''; - $deal_details = json_encode( $deal_details ); - - $response = wp_remote_request( - $this->base_url . $url, - array( - 'body' => $deal_details, - 'headers' => $headers, - 'method' => 'PUT', - ) - ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $message = __( 'Updating HubSpot Deals', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'deals' ); - return $parsed_response; - } - - /** - * Creating groups for deals on HubSpot. - * - * @since 1.0.0 - * @param array $deal_groups formatted array for deal groups. - * @return array $parsed_response formatted array for API response. - */ - public function create_deal_group( $deal_groups ) { - - $url = '/properties/v1/deals/groups/'; - $headers = $this->get_token_headers(); - $parsed_response = array( - 'status_code' => 400, - 'response' => 'error', - ); - if ( is_array( $deal_groups ) && count( $deal_groups ) ) { - $deal_details = wp_json_encode( $deal_groups ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $deal_details, - 'headers' => $headers, - ) - ); - $message = __( 'Creating deal custom groups', 'makewebbetter-hubspot-for-woocommerce' ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - $this->create_log( $message, $url, $parsed_response, 'groups' ); - return $parsed_response; - } - } - - /** - * Creating properties for deals. - * - * @since 1.0.0 - * @param array $prop_details formatted array for creating deal property. - * @return array $parsed_response formatted response from API. - */ - public function create_deal_property( $prop_details ) { - - $url = '/properties/v1/deals/properties/'; - if ( is_array( $prop_details ) ) { - if ( isset( $prop_details['name'] ) && isset( $prop_details['groupName'] ) ) { - $url = '/properties/v1/deals/properties/'; - $headers = $this->get_token_headers(); - $parsed_response = array( - 'status_code' => 400, - 'response' => 'error', - ); - $prop_details = wp_json_encode( $prop_details ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $prop_details, - 'headers' => $headers, - ) - ); - $message = __( 'Creating deal custom properties', 'makewebbetter-hubspot-for-woocommerce' ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - $this->create_log( $message, $url, $parsed_response, 'properties' ); - return $parsed_response; - } - } - } - - /** - * Updating deal properties. - * - * @since 1.0.0 - * @param array $deal_property details to create new deal. - * @return array $response api response. - */ - public function update_deal_property( $deal_property ) { - - if ( is_array( $deal_property ) ) { - if ( isset( $deal_property['name'] ) && isset( $deal_property['groupName'] ) ) { - $url = '/properties/v1/deals/properties/named/' . $deal_property['name']; - $headers = $this->get_token_headers(); - $deal_property = json_encode( $deal_property ); - $response = wp_remote_request( - $this->base_url . $url, - array( - 'body' => $deal_property, - 'headers' => $headers, - 'method' => 'PUT', - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - - $message = __( 'Updating HubSpot Deal Properties', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'properties' ); - return $parsed_response; - } - } - } - - /** - * Get customer vid using email. - * - * @since 1.0.0 - * @param string $email contact email. - * @return string $vid hubspot vid of contact. - */ - public function get_customer_vid( $email ) { - - $vid = ''; - $url = '/contacts/v1/contact/email/' . $email . '/profile'; - $headers = $this->get_token_headers(); - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - $message = esc_html__( 'Fetching Contact VID by email', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'contacts' ); - return $vid; - } - - /** - * Get customer vid using email. - * - * @since 1.0.0 - * @param string $email contact email. - * @return string $vid hubspot vid of contact. - */ - public function get_customer_vid_historical( $email ) { - $vid = ''; - $url = '/contacts/v1/contact/email/' . $email . '/profile'; - $headers = $this->get_token_headers(); - $res_body = ''; - - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $message = esc_html__( 'Fetching Contact VID by email', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'contacts' ); - return $parsed_response; - } - - /** - * Creating deals on HubSpot. - * - * @since 1.0.0 - * @param array $deal_details details to create new deal. - * @return array $parsed_response formatted array with status/response. - */ - public function create_new_deal( $deal_details ) { - - $url = '/deals/v1/deal/'; - $headers = $this->get_token_headers(); - $res_body = ''; - $deal_details = wp_json_encode( $deal_details ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $deal_details, - 'headers' => $headers, - ) - ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $message = esc_html__( 'Creating New deal', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'deals' ); - return $parsed_response; - } - - /** - * Fetching all of the deal stages - * - * @since 1.0.0 - * @return array $api_body formatted object with get request - */ - public function fetch_all_deal_pipelines() { - - $url = '/crm/v3/pipelines/deals'; - $headers = $this->get_token_headers(); - - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - - if ( 200 === $status_code ) { - $api_body = wp_remote_retrieve_body( $response ); - if ( $api_body ) { - $api_body = json_decode( $api_body, true ); - } - } else { - $api_body = array(); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - $message = __( 'Fetch all pipeline', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'pipeline' ); - - return $api_body; - } - - /** - * Fetching pipeline by it's id. - * - * @since 1.0.0 - * @param string $pipeline_id id of pipeline. - * @return array $api_body formatted object with get request - */ - public function get_deal_pipeline( $pipeline_id ) { - - $url = '/crm/v3/pipelines/deals/' . $pipeline_id; - $headers = $this->get_token_headers(); - - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - - if ( 200 === $status_code ) { - $api_body = wp_remote_retrieve_body( $response ); - if ( $api_body ) { - $api_body = json_decode( $api_body, true ); - } - } else { - $api_body = array(); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - - $message = __( 'Get deal pipeline info', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'pipeline' ); - - return $api_body; - } - - /** - * Create new deal pipeline. - * - * @since 1.0.0 - * @param array $pipeline_date array of pipeline label and it's stages. - * @return array $api_body formatted object with get request. - */ - public function create_deal_pipeline( $pipeline_data ) { - if ( is_array( $pipeline_data ) ) { - $url = '/crm/v3/pipelines/deals'; - $headers = $this->get_token_headers(); - $res_body = ''; - - $pipeline_data = wp_json_encode( $pipeline_data ); - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $pipeline_data, - 'headers' => $headers, - ) - ); - $message = esc_html__( 'Creating deal pipeline', 'makewebbetter-hubspot-for-woocommerce' ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - $this->create_log( $message, $url, $parsed_response, 'pipeline' ); - return $parsed_response; - } - } - - /** - * Updating the deal stages in eCommerce Pipeline - * - * @since 1.0.0 - * @param string $pipeline_updates updated pipeline data. - * @param string $pipeline_id id of pipeline. - * @return array $response formatted aray for response. - */ - public function update_deal_pipeline( $pipeline_updates, $pipeline_id ) { - - $url = '/crm/v3/pipelines/deals/' . $pipeline_id; - $headers = $this->get_token_headers(); - $pipeline_updates = json_encode( $pipeline_updates ); - $response = wp_remote_request( - $this->base_url . $url, - array( - 'body' => $pipeline_updates, - 'headers' => $headers, - 'method' => 'PUT', - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - ); - $message = __( 'Updating the ecommerce pipeline deal stages', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'pipeline' ); - return $parsed_response; - } - - /** - * Get General Headers for API Calls. - * - * @since 1.0.0 - * @param array $additional_args (default: array()) Additional headers to be passed. - * @return array $headers All of the headers. - */ - private function get_token_headers( $additional_args = array() ) { - - $access_token = Hubwoo::hubwoo_get_access_token(); - $headers = array( - 'Content-Type' => 'application/json', - 'Authorization' => 'Bearer ' . $access_token, - ); - - if ( ! empty( $additional_args ) ) { - $headers = array_merge( $headers, $additional_args ); - } - - return $headers; - } - - /** - * Get General Headers for API Calls. - * - * @since 1.0.0 - * @param array $stores store details required for HubSpot. - * @return array $parsed_response Response from HubSpot. - */ - public function create_or_update_store( $stores ) { - - $headers = self::get_token_headers(); - $res_body = ''; - $url = '/extensions/ecomm/v2/stores'; - $stores = json_encode( $stores ); - $response = wp_remote_request( - $this->base_url . $url, - array( - 'body' => $stores, - 'headers' => $headers, - 'method' => 'PUT', - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => json_decode( $res_body ), - ); - $message = __( 'Creating or Updating Store', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'store' ); - return $parsed_response; - } - - /** - * Sending sync messages to hubspot - * - * @since 1.0.0 - * @param array $updates array of properties showing the changes. - * @param string $object_type hubspot object name. - * @return array response from HubSpot. - */ - public function ecomm_sync_messages( $updates, $object_type ) { - - $messages = array(); - $messages['storeId'] = get_option( 'hubwoo_ecomm_store_id', '' ); - $messages['objectType'] = $object_type; - $messages['messages'] = $updates; - $url = '/extensions/ecomm/v2/sync/messages'; - $headers = self::get_token_headers(); - $messages = json_encode( $messages ); - $res_body = ''; - - $response = wp_remote_request( - $this->base_url . $url, - array( - 'body' => $messages, - 'headers' => $headers, - 'method' => 'PUT', - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $message = 'Updating/Creating Ecomm Bridge - ' . $object_type; - $this->create_log( $message, $url, $parsed_response, $object_type ); - return $parsed_response; - } - - /** - * Sending sync messages to hubspot - * - * @since 1.0.0 - * @param array $object_id external object Id. - * @param string $object_type hubspot object name. - * @return array response from HubSpot. - */ - public function ecomm_sync_status( $object_id, $object_type ) { - - $store_id = get_option( 'hubwoo_ecomm_store_id', '' ); - $url = '/extensions/ecomm/v2/sync/status/' . $store_id . '/' . $object_type . '/' . $object_id; - $headers = self::get_token_headers(); - $res_body = ''; - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $message = 'Checking Sync Status of object id -' . $object_id . ' and type ' . $object_type; - $this->create_log( $message, $url, $parsed_response, $object_type ); - return $parsed_response; - } - - /** - * Create a form data. - * - * @since 1.0.4 - * @param array $form_data post form data. - * @return array $response formatted aray for response. - */ - public function create_form_data( $form_data ) { - - $url = '/forms/v2/forms'; - $headers = $this->get_token_headers(); - $form_data = wp_json_encode( $form_data ); - $res_body = ''; - - $response = wp_remote_post( - $this->base_url . $url, - array( - 'body' => $form_data, - 'headers' => $headers, - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $message = __( 'Creating a form data', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'form' ); - return $parsed_response; - } - - /** - * Submit a form data to HubSpot. - * - * @since 1.0.0 - * @param array $form_data form fields. - * @param string $portal_id portal id. - * @param string $form_guid form id. - * @return array $response formatted aray for response. - */ - public function submit_form_data( $form_data, $portal_id, $form_guid ) { - - $url = 'https://api.hsforms.com/submissions/v3/integration/submit/' . $portal_id . '/' . $form_guid; - $headers = $this->get_token_headers(); - $res_body = ''; - - $form_data = json_encode( $form_data ); - - $response = wp_remote_post( - $url, - array( - 'body' => $form_data, - 'headers' => $headers, - ) - ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $message = __( 'Submitting Form data', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'form' ); - return $parsed_response; - } - - /** - * Get Batch contacts from emails. - * - * @since 1.0.0 - * @param array $batch_emails batch email string. - * @return array $response formatted aray for response. - */ - public function hubwoo_get_batch_vids( $batch_emails ) { - - $url = '/contacts/v1/contact/emails/batch/?' . $batch_emails . 'property=email'; - $headers = $this->get_token_headers(); - $res_body = ''; - - $batch_emails = json_encode( $batch_emails ); - - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $message = __( 'Fetching Batch Vids', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'contacts' ); - return $parsed_response; - } - - - /** - * Get All forms. - * - * @since 1.0. - * @return array $response formatted aray for response. - */ - public function hubwoo_get_all_forms() { - - $url = '/forms/v2/forms'; - $headers = $this->get_token_headers(); - $res_body = ''; - - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $message = __( 'Fetching All Forms', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'form' ); - return $parsed_response; - } - - /** - * Fetchig user by email. - * - * @since 1.0.0 - * @param string $email email of user. - */ - public function get_customer_by_email( $email ) { - - $vid = ''; - $url = '/contacts/v1/contact/email/' . $email . '/profile'; - $headers = $this->get_token_headers(); - $response = wp_remote_get( - $this->base_url . $url, - array( - 'headers' => $headers, - ) - ); - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - - if ( 200 == $parsed_response['status_code'] ) { - $parsed_response['body'] = json_decode( $parsed_response['body'], true ); - if ( ! empty( $parsed_response['body'] ) && isset( $parsed_response['body']['vid'] ) ) { - $vid = $parsed_response['body']['vid']; - } - } - $message = esc_html__( 'Fetching Contact by email', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'contacts' ); - return $vid; - } - - /** - * Updating products. - * - * @since 1.2.7 - * @param string $hubwoo_ecomm_pro_id hubspot product id. - * @param array $properties product properties. - */ - public function update_existing_products( $hubwoo_ecomm_pro_id, $properties ) { - - $url = '/crm-objects/v1/objects/products/' . $hubwoo_ecomm_pro_id; - $headers = $this->get_token_headers(); - $properties = json_encode( $properties ); - $response = wp_remote_request( - $this->base_url . $url, - array( - 'body' => $properties, - 'headers' => $headers, - 'method' => 'PUT', - ) - ); - - if ( is_wp_error( $response ) ) { - $status_code = $response->get_error_code(); - $res_message = $response->get_error_message(); - } else { - $status_code = wp_remote_retrieve_response_code( $response ); - $res_message = wp_remote_retrieve_response_message( $response ); - $res_body = wp_remote_retrieve_body( $response ); - } - $parsed_response = array( - 'status_code' => $status_code, - 'response' => $res_message, - 'body' => $res_body, - ); - $message = __( 'Updating HubSpot Products', 'makewebbetter-hubspot-for-woocommerce' ); - $this->create_log( $message, $url, $parsed_response, 'products' ); - return $parsed_response; - } - -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooconst.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooconst.php deleted file mode 100644 index ffcbb8de..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooconst.php +++ /dev/null @@ -1,23 +0,0 @@ -groups = $this->_set( 'groups' ); - $this->properties = $this->_set( 'properties' ); - $this->lists = $this->_set( 'lists' ); - $this->workflows = $this->_set( 'workflows' ); - } - - /** - * Get groups/properties. - * - * @param string $option groups/properties. - * @param string $group_name name of group to get properties. - * @param bool $all true/false. - * @return array array of groups/properties/lists/workflows information. - */ - public function _get( $option, $group_name = '', $all = false ) { - - if ( 'groups' === $option ) { - - return $this->groups; - } elseif ( 'properties' === $option ) { - - if ( $all ) { - $properties = $this->get_all_active_groups_properties( true ); - return $properties; - } - - if ( ! empty( $group_name ) && isset( $this->properties[ $group_name ] ) && ! $all ) { - return $this->properties[ $group_name ]; - } else { - return $this->_get_group_properties( $group_name ); - } - } elseif ( 'lists' === $option ) { - return $this->lists; - } elseif ( 'workflows' === $option ) { - return $this->workflows; - } - } - - /** - * Get an array of required option. - * - * @param String $option the identifier. - * @return Array An array of values. - * @since 1.0.0 - */ - private function _set( $option ) { - - $values = array(); - - if ( 'groups' === $option ) { - - // order details. - $values[] = array( - 'name' => 'order', - 'label' => __( 'Order Information', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - // products bought details. - $values[] = array( - 'name' => 'last_products_bought', - 'label' => __( 'Products Bought', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - // shopping cart details. - $values[] = array( - 'name' => 'shopping_cart_fields', - 'label' => __( 'Shopping Cart Information', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - // customer details. - $values[] = array( - 'name' => 'customer_group', - 'label' => __( 'Customer Group', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - // categories bought details. - $values[] = array( - 'name' => 'categories_bought', - 'label' => __( 'Categories Bought', 'makewebbetter-hubspot-for-woocommerce' ), - ); - // RFM details. - $values[] = array( - 'name' => 'rfm_fields', - 'label' => __( 'RFM Information', 'makewebbetter-hubspot-for-woocommerce' ), - ); - // skus bought details. - $values[] = array( - 'name' => 'skus_bought', - 'label' => __( 'SKUs Bought', 'makewebbetter-hubspot-for-woocommerce' ), - ); - // roi tracking. - $values[] = array( - 'name' => 'roi_tracking', - 'label' => __( 'ROI Tracking', 'makewebbetter-hubspot-for-woocommerce' ), - ); - // Abandeond Cart. - $values[] = array( - 'name' => 'abandoned_cart', - 'label' => __( 'Abandoned Cart Details', 'makewebbetter-hubspot-for-woocommerce' ), - ); - - // filter for new groups. - $values = apply_filters( 'hubwoo_sync_groups', $values ); - } elseif ( 'properties' === $option ) { - - // let's check for all active tracking groups and get there associated properties. - $values = $this->get_all_active_groups_properties(); - } elseif ( 'lists' === $option ) { - - $values = $this->get_all_active_lists(); - } elseif ( 'workflows' === $option ) { - - $values = $this->get_all_workflows(); - } - - // add your values to the either groups or properties. - return apply_filters( 'hubwoo_contact_' . $option, $values ); - } - - /** - * Add subscription groups. - * - * @param array $values predefined groups. - * @return Array Properties array with there associated group. - * @since 1.0.0 - */ - public static function _get_subs_groups( $values = array() ) { - - $values[] = array( - 'name' => 'subscriptions_details', - 'label' => __( 'Subscriptions Details', 'makewebbetter-hubspot-for-woocommerce' ), - ); - return apply_filters( 'hubwoo_subs_groups', $values ); - } - - /** - * Check for the active groups and get there properties. - * - * @param bool $all to get all propertues or not. - * @return Array Properties array with there associated group. - * @since 1.0.0 - */ - private function get_all_active_groups_properties( $all = false ) { - - $active_groups_properties = array(); - - $active_groups = $all ? $this->_get( 'groups' ) : $this->get_active_groups(); - - if ( is_array( $active_groups ) && count( $active_groups ) ) { - - foreach ( $active_groups as $active_group ) { - - if ( ! empty( $active_group ) ) { - - if ( $all ) { - $active_groups_properties[ $active_group['name'] ] = $this->_get_group_properties( $active_group['name'] ); - } else { - $active_groups_properties[ $active_group ] = $this->_get_group_properties( $active_group ); - } - } - } - } - - return apply_filters( 'hubwoo_active_groups_properties', $active_groups_properties ); - } - - /** - * Filter extra properties to avaoid error on hubspot. - * - * @return only created properties - * @since 1.0.0 - */ - public function hubwoo_get_filtered_properties() { - - $filtered_properties = array(); - - $all_filtered_properties = array(); - - $active_groups = $this->get_active_groups(); - - if ( is_array( $active_groups ) && count( $active_groups ) ) { - - foreach ( $active_groups as $active_group ) { - - if ( ! empty( $active_group ) && ! is_array( $active_group ) ) { - - $active_groups_properties[ $active_group ] = $this->_get_group_properties( $active_group ); - } - } - } - - if ( ! empty( $active_groups_properties ) ) { - - $group_name = ''; - - $created_properties = array_map( - function( $property ) { - return str_replace( "'", '', $property ); - }, - get_option( 'hubwoo-properties-created', array() ) - ); - - foreach ( $active_groups_properties as $group_name_key => $single_group_property ) { - - $group_name = $group_name_key; - - $filtered_properties = array(); - - foreach ( $single_group_property as $single_property ) { - - if ( isset( $single_property['name'] ) && in_array( $single_property['name'], $created_properties ) ) { - - $filtered_properties[] = $single_property; - } - } - - $all_filtered_properties[ $group_name ] = $filtered_properties; - } - } - - return apply_filters( 'hubwoo_active_groups_properties', $all_filtered_properties ); - } - - - /** - * Filter for active groups only. - * - * @return Array active group names. - * @since 1.0.0 - */ - private function get_active_groups() { - - $active_groups = array(); - - $all_groups = $this->_get( 'groups' ); - if ( is_array( $all_groups ) && count( $all_groups ) ) { - - foreach ( $all_groups as $group_details ) { - - $group_name = isset( $group_details['name'] ) ? $group_details['name'] : ''; - - if ( ! empty( $group_name ) ) { - - $created_groups = get_option( 'hubwoo-groups-created', array() ); - - $is_active = false; - - if ( in_array( $group_name, $created_groups ) ) { - - $is_active = true; - } - - if ( $is_active ) { - - $active_groups[] = $group_name; - } - } - } - } - return apply_filters( 'hubwoo_active_groups', $active_groups ); - } - - - /** - * Get all the groups properties. - * - * @param string $group_name name of the existed valid hubspot contact properties group. - * @return Array Properties array. - * @since 1.0.0 - */ - private function _get_group_properties( $group_name ) { - - $group_properties = array(); - - if ( ! empty( $group_name ) ) { - - if ( 'customer_group' === $group_name ) { - - $group_properties[] = array( - 'name' => 'customer_group', - 'label' => __( 'Customer Group/ User role', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'newsletter_subscription', - 'label' => __( 'Accepts Marketing', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'select', - 'formField' => true, - 'options' => $this->get_user_marketing_action(), - ); - - $group_properties[] = array( - 'name' => 'marketing_newsletter', - 'label' => __( 'Marketing Newsletter', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'checkbox', - 'formField' => true, - 'options' => $this->get_user_marketing_sources(), - ); - - $group_properties[] = array( - 'name' => 'shopping_cart_customer_id', - 'label' => __( 'Shopping Cart ID', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'customer_source_store', - 'label' => __( 'Customer Source Store', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - ); - } elseif ( 'shopping_cart_fields' === $group_name ) { - - $group_properties[] = array( - 'name' => 'shipping_address_line_1', - 'label' => __( 'Shipping Address Line 1', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => true, - ); - - $group_properties[] = array( - 'name' => 'shipping_address_line_2', - 'label' => __( 'Shipping Address Line 2', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => true, - ); - - $group_properties[] = array( - 'name' => 'shipping_city', - 'label' => __( 'Shipping City', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => true, - ); - - $group_properties[] = array( - 'name' => 'shipping_state', - 'label' => __( 'Shipping State', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => true, - ); - - $group_properties[] = array( - 'name' => 'shipping_postal_code', - 'label' => __( 'Shipping Postal Code', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => true, - ); - - $group_properties[] = array( - 'name' => 'shipping_country', - 'label' => __( 'Shipping Country', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => true, - ); - - $group_properties[] = array( - 'name' => 'billing_address_line_1', - 'label' => __( 'Billing Address Line 1', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => true, - ); - - $group_properties[] = array( - 'name' => 'billing_address_line_2', - 'label' => __( 'Billing Address Line 2', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => true, - ); - - $group_properties[] = array( - 'name' => 'billing_city', - 'label' => __( 'Billing City', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => true, - ); - - $group_properties[] = array( - 'name' => 'billing_state', - 'label' => __( 'Billing State', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => true, - ); - - $group_properties[] = array( - 'name' => 'billing_postal_code', - 'label' => __( 'Billing Postal Code', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => true, - ); - - $group_properties[] = array( - 'name' => 'billing_country', - 'label' => __( 'Billing Country', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => true, - ); - } elseif ( 'last_products_bought' === $group_name ) { - - $group_properties[] = array( - 'name' => 'last_product_bought', - 'label' => __( 'Last Product Bought', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_product_types_bought', - 'label' => __( 'Last Product Types Bought', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought', - 'label' => __( 'Last Products Bought', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought_html', - 'label' => __( 'Last Products Bought HTML', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_total_number_of_products_bought', - 'label' => __( 'Last Total Number Of Products Bought', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'product_types_bought', - 'label' => __( 'Product Types Bought', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'products_bought', - 'label' => __( 'Products Bought', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'total_number_of_products_bought', - 'label' => __( 'Total Number Of Products Bought', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought_product_1_image_url', - 'label' => __( 'Last Products Bought Product 1 Image URL', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought_product_1_name', - 'label' => __( 'Last Products Bought Product 1 Name', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought_product_1_price', - 'label' => __( 'Last Products Bought Product 1 Price', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'showCurrencySymbol' => true, - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought_product_1_url', - 'label' => __( 'Last Products Bought Product 1 Url', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought_product_2_image_url', - 'label' => __( 'Last Products Bought Product 2 Image URL', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought_product_2_name', - 'label' => __( 'Last Products Bought Product 2 Name', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought_product_2_price', - 'label' => __( 'Last Products Bought Product 2 Price', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'showCurrencySymbol' => true, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought_product_2_url', - 'label' => __( 'Last Products Bought Product 2 Url', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought_product_3_image_url', - 'label' => __( 'Last Products Bought Product 3 Image URL', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought_product_3_name', - 'label' => __( 'Last Products Bought Product 3 Name', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought_product_3_price', - 'label' => __( 'Last Products Bought Product 3 Price', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'showCurrencySymbol' => true, - ); - - $group_properties[] = array( - 'name' => 'last_products_bought_product_3_url', - 'label' => __( 'Last Products Bought Product 3 Url', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => false, - ); - } elseif ( 'order' === $group_name ) { - - $group_properties[] = array( - 'name' => 'last_order_status', - 'label' => __( 'Last Order Status', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'select', - 'formField' => false, - 'options' => $this->get_order_statuses(), - ); - - $group_properties[] = array( - 'name' => 'last_order_fulfillment_status', - 'label' => __( 'Last Order Fulfillment Status', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'select', - 'formField' => false, - 'options' => $this->get_order_statuses(), - ); - - $group_properties[] = array( - 'name' => 'last_order_tracking_number', - 'label' => __( 'Last Order Tracking Number', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_order_tracking_url', - 'label' => __( 'Last Order Tracking URL', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_order_shipment_date', - 'label' => __( 'Last Order Shipment Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_order_order_number', - 'label' => __( 'Last Order Number', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_order_currency', - 'label' => __( 'Last Order Currency', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'total_number_of_current_orders', - 'label' => __( 'Total Number of Current Orders', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - ); - } elseif ( 'rfm_fields' === $group_name ) { - - $group_properties[] = array( - 'name' => 'total_value_of_orders', - 'label' => __( 'Total Value of Orders', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'showCurrencySymbol' => true, - ); - - $group_properties[] = array( - 'name' => 'average_order_value', - 'label' => __( 'Average Order Value', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'showCurrencySymbol' => true, - ); - - $group_properties[] = array( - 'name' => 'total_number_of_orders', - 'label' => __( 'Total Number of Orders', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'first_order_value', - 'label' => __( 'First Order Value', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'showCurrencySymbol' => true, - ); - - $group_properties[] = array( - 'name' => 'first_order_date', - 'label' => __( 'First Order Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_order_value', - 'label' => __( 'Last Order Value', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'showCurrencySymbol' => true, - ); - - $group_properties[] = array( - 'name' => 'last_order_date', - 'label' => __( 'Last Order Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'average_days_between_orders', - 'label' => __( 'Average Days Between Orders', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'account_creation_date', - 'label' => __( 'Account Creation Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'monetary_rating', - 'label' => __( 'Monetary Rating', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'select', - 'formField' => false, - 'options' => $this->get_rfm_rating(), - ); - - $group_properties[] = array( - 'name' => 'order_frequency_rating', - 'label' => __( 'Order Frequency Rating', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'select', - 'formField' => false, - 'options' => $this->get_rfm_rating(), - ); - - $group_properties[] = array( - 'name' => 'order_recency_rating', - 'label' => __( 'Order Recency Rating', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'select', - 'formField' => false, - 'options' => $this->get_rfm_rating(), - ); - } elseif ( 'categories_bought' === $group_name ) { - - $group_properties[] = array( - 'name' => 'last_categories_bought', - 'label' => __( 'Last Categories Bought', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'categories_bought', - 'label' => __( 'Categories Bought', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - ); - } elseif ( 'skus_bought' === $group_name ) { - - $group_properties[] = array( - 'name' => 'last_skus_bought', - 'label' => __( 'Last SKUs Bought', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'skus_bought', - 'label' => __( 'SKUs Bought', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - ); - } elseif ( 'subscriptions_details' == $group_name ) { - - $group_properties[] = array( - 'name' => 'last_subscription_order_number', - 'label' => __( 'Last Subscription Order Number', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_subscription_parent_order_number', - 'label' => __( 'Last Subscription Parent Order Number', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_subscription_order_status', - 'label' => __( 'Last Subscription Order Status', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'select', - 'formField' => false, - 'options' => $this->get_subscription_status_options(), - ); - - $group_properties[] = array( - 'name' => 'last_subscription_order_creation_date', - 'label' => __( 'Last Subscription Order Creation Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_subscription_order_paid_date', - 'label' => __( 'Last Subscription Order Paid Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_subscription_order_completed_date', - 'label' => __( 'Last Subscription Order Completed Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'related_last_order_creation_date', - 'label' => __( 'Related Last Order Creation Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'related_last_order_paid_date', - 'label' => __( 'Related Last Order Paid Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'related_last_order_completed_date', - 'label' => __( 'Related Last Order Completed Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_subscription_trial_end_date', - 'label' => __( 'Last Subscription Trial End Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_subscription_next_payment_date', - 'label' => __( 'Last Subscription Next Payment Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'last_subscription_billing_period', - 'label' => __( 'Last Subscription Billing Period', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'select', - 'formField' => false, - 'options' => $this->get_subscriptions_billing_period(), - ); - - $group_properties[] = array( - 'name' => 'last_subscription_billing_interval', - 'label' => __( 'Last Subscription Billing Interval', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'select', - 'formField' => false, - 'options' => $this->get_subscriptions_billing_interval(), - ); - - $group_properties[] = array( - 'name' => 'last_subscription_products', - 'label' => __( 'Last Subscription Products', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formField' => false, - ); - } elseif ( 'roi_tracking' === $group_name ) { - - $group_properties[] = array( - 'name' => 'customer_new_order', - 'label' => __( 'Customer New Order', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'select', - 'options' => $this->hubwoo_new_order_status(), - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_recovery_workflow_conversion', - 'label' => __( 'Abandoned Cart Recovery Workflow Conversion', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'booleancheckbox', - 'formField' => false, - 'options' => $this->hubwoo_campaign_conversion_options(), - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_recovery_workflow_conversion_amount', - 'label' => __( 'Abandoned Cart Recovery Workflow Conversion Amount', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'showCurrencySymbol' => true, - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_recovery_workflow_conversion_date', - 'label' => __( 'Abandoned Cart Recovery Workflow Conversion Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_recovery_workflow_start_date', - 'label' => __( 'Abandoned Cart Recovery Workflow Start Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'current_roi_campaign', - 'label' => __( 'Current ROI Campaign', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'select', - 'formField' => false, - 'options' => $this->get_all_campaign_names(), - ); - - $group_properties[] = array( - 'name' => 'customer_reengagement_workflow_conversion', - 'label' => __( 'Customer Reengagement Workflow Conversion', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'booleancheckbox', - 'formField' => false, - 'options' => $this->hubwoo_campaign_conversion_options(), - ); - - $group_properties[] = array( - 'name' => 'customer_reengagement_workflow_conversion_amount', - 'label' => __( 'Customer Reengagement Workflow Conversion Amount', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'showCurrencySymbol' => true, - ); - - $group_properties[] = array( - 'name' => 'customer_reengagement_workflow_conversion_date', - 'label' => __( 'Customer Reengagement Workflow Conversion Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'customer_reengagement_workflow_start_date', - 'label' => __( 'Customer Reengagement Workflow Start Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'customer_rewards_workflow_conversion', - 'label' => __( 'Customer Rewards Workflow Conversion', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'booleancheckbox', - 'formField' => false, - 'options' => $this->hubwoo_campaign_conversion_options(), - ); - - $group_properties[] = array( - 'name' => 'customer_rewards_workflow_conversion_amount', - 'label' => __( 'Customer Rewards Workflow Conversion Amount', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'showCurrencySymbol' => true, - ); - - $group_properties[] = array( - 'name' => 'customer_rewards_workflow_conversion_date', - 'label' => __( 'Customer Rewards Workflow Conversion Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'customer_rewards_workflow_start_date', - 'label' => __( 'Customer Rewards Workflow Start Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'mql_capture_nurture_conversion_conversion', - 'label' => __( 'MQL Capture, Nurture & Conversion Conversion', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'booleancheckbox', - 'formField' => false, - 'options' => $this->hubwoo_campaign_conversion_options(), - ); - - $group_properties[] = array( - 'name' => 'mql_capture_nurture_conversion_conversion_amount', - 'label' => __( 'MQL Capture, Nurture & Conversion Conversion Amount', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'showCurrencySymbol' => true, - ); - - $group_properties[] = array( - 'name' => 'mql_capture_nurture_conversion_conversion_date', - 'label' => __( 'MQL Capture, Nurture & Conversion Conversion Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'mql_capture_nurture_conversion_start_date', - 'label' => __( 'MQL Capture, Nurture & Conversion Start date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'new_customer_workflow_conversion', - 'label' => __( 'New Customer Workflow Conversion', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'booleancheckbox', - 'formField' => false, - 'options' => $this->hubwoo_campaign_conversion_options(), - ); - - $group_properties[] = array( - 'name' => 'new_customer_workflow_conversion_amount', - 'label' => __( 'New Customer Workflow Conversion Amount', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'showCurrencySymbol' => true, - ); - - $group_properties[] = array( - 'name' => 'new_customer_workflow_conversion_date', - 'label' => __( 'New Customer Workflow Conversion Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'new_customer_workflow_start_date', - 'label' => __( 'New Customer Workflow Start Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'second_purchase_workflow_conversion', - 'label' => __( 'Second Purchase Workflow Conversion', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'booleancheckbox', - 'formField' => false, - 'options' => $this->hubwoo_campaign_conversion_options(), - ); - - $group_properties[] = array( - 'name' => 'second_purchase_workflow_conversion_amount', - 'label' => __( 'Second Purchase Workflow Conversion Amount', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'showCurrencySymbol' => true, - ); - - $group_properties[] = array( - 'name' => 'second_purchase_workflow_conversion_date', - 'label' => __( 'Second Purchase Workflow Conversion Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'second_purchase_workflow_start_date', - 'label' => __( 'Second Purchase Workflow Start Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'third_purchase_workflow_conversion', - 'label' => __( 'Third Purchase Workflow Conversion', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'booleancheckbox', - 'formField' => false, - 'options' => $this->hubwoo_campaign_conversion_options(), - ); - - $group_properties[] = array( - 'name' => 'third_purchase_workflow_conversion_amount', - 'label' => __( 'Third Purchase Workflow Conversion Amount', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formField' => false, - 'showCurrencySymbol' => true, - ); - - $group_properties[] = array( - 'name' => 'third_purchase_workflow_conversion_date', - 'label' => __( 'Third Purchase Workflow Conversion Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - - $group_properties[] = array( - 'name' => 'third_purchase_workflow_start_date', - 'label' => __( 'Third Purchase Workflow Start Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formField' => false, - ); - } elseif ( 'abandoned_cart' === $group_name ) { - - $group_properties[] = array( - 'name' => 'current_abandoned_cart', - 'label' => __( 'Current Abandoned Cart', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'enumeration', - 'fieldType' => 'select', - 'formfield' => false, - 'options' => Hubwoo_Admin::get_abandoned_cart_status(), - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_date', - 'label' => __( 'Abandoned Cart Date', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'date', - 'fieldType' => 'date', - 'formfield' => false, - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_counter', - 'label' => __( 'Abandoned Cart Counter', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'formfield' => false, - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_url', - 'label' => __( 'Abandoned Cart URL', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'text', - 'formfield' => false, - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_products_skus', - 'label' => __( 'Abandoned Cart Products SKUs', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formfield' => false, - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_products_categories', - 'label' => __( 'Abandoned Cart Products Categories', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formfield' => false, - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_products', - 'label' => __( 'Abandoned Cart Products', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formfield' => false, - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_products_html', - 'label' => __( 'Abandoned Cart Products HTML', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'string', - 'fieldType' => 'textarea', - 'formfield' => false, - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_tax_value', - 'label' => __( 'Abandoned Cart Tax Value', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'showCurrencySymbol' => true, - 'formfield' => false, - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_subtotal', - 'label' => __( 'Abandoned Cart Subtotal', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'showCurrencySymbol' => true, - 'formfield' => false, - ); - - $group_properties[] = array( - 'name' => 'abandoned_cart_total_value', - 'label' => __( 'Abandoned Cart Total Value', 'makewebbetter-hubspot-for-woocommerce' ), - 'type' => 'number', - 'fieldType' => 'number', - 'showCurrencySymbol' => true, - 'formfield' => false, - ); - } - } - - return apply_filters( 'hubwoo_group_properties', $group_properties, $group_name ); - } - - /** - * Get all active lists for hubspot. - * - * @since 1.0.0 - */ - private function get_all_active_lists() { - - $lists = array(); - - $optin = 'yes'; - $abandoned_status = 'yes'; - $property_updated = get_option( 'hubwoo_newsletter_property_update', 'no' ); - $abandoned_property_updated = get_option( 'hubwoo_abandoned_property_update', 'no' ); - - if ( ! empty( $property_updated ) && 'yes' == $property_updated ) { - if ( 'yes' == $optin ) { - $optin = true; - } - } - - if ( ! empty( $abandoned_property_updated ) && 'yes' == $abandoned_property_updated ) { - - $abandoned_status = true; - } - - $lists[] = array( - - 'name' => __( 'Customers', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 'customer', - 'property' => 'lifecyclestage', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Leads', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 'lead', - 'property' => 'lifecyclestage', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Abandoned Cart', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => $abandoned_status, - 'property' => 'current_abandoned_cart', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Best Customers', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 5, - 'property' => 'monetary_rating', - 'type' => 'enumeration', - ), - array( - 'operator' => 'EQ', - 'value' => 5, - 'property' => 'order_frequency_rating', - 'type' => 'enumeration', - ), - array( - 'operator' => 'EQ', - 'value' => 5, - 'property' => 'order_recency_rating', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Big Spenders', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 5, - 'property' => 'monetary_rating', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Loyal Customers', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 5, - 'property' => 'order_frequency_rating', - 'type' => 'enumeration', - ), - array( - 'operator' => 'EQ', - 'value' => 5, - 'property' => 'order_recency_rating', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Churning Customers', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 5, - 'property' => 'monetary_rating', - 'type' => 'enumeration', - ), - array( - 'operator' => 'EQ', - 'value' => 5, - 'property' => 'order_frequency_rating', - 'type' => 'enumeration', - ), - array( - 'operator' => 'EQ', - 'value' => 1, - 'property' => 'order_recency_rating', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Low Value Lost Customers', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 1, - 'property' => 'monetary_rating', - 'type' => 'enumeration', - ), - array( - 'operator' => 'EQ', - 'value' => 1, - 'property' => 'order_frequency_rating', - 'type' => 'enumeration', - ), - array( - 'operator' => 'EQ', - 'value' => 1, - 'property' => 'order_recency_rating', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'New Customers', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 1, - 'property' => 'order_frequency_rating', - 'type' => 'enumeration', - ), - array( - 'operator' => 'EQ', - 'value' => 1, - 'property' => 'order_recency_rating', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Customers needing attention', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 3, - 'property' => 'monetary_rating', - 'type' => 'enumeration', - ), - array( - 'operator' => 'EQ', - 'value' => 3, - 'property' => 'order_frequency_rating', - 'type' => 'enumeration', - ), - array( - 'operator' => 'SET_ANY', - 'value' => implode( ';', array( 1, 2 ) ), - 'property' => 'order_recency_rating', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'About to Sleep', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'SET_ANY', - 'value' => implode( ';', array( 1, 2 ) ), - 'property' => 'monetary_rating', - 'type' => 'enumeration', - ), - array( - 'operator' => 'SET_ANY', - 'value' => implode( ';', array( 1, 2 ) ), - 'property' => 'order_frequency_rating', - 'type' => 'enumeration', - ), - array( - 'operator' => 'SET_ANY', - 'value' => implode( ';', array( 1, 2 ) ), - 'property' => 'order_recency_rating', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Mid Spenders', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 3, - 'property' => 'monetary_rating', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Low Spenders', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 1, - 'property' => 'monetary_rating', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Newsletter Subscriber', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => $optin, - 'property' => 'newsletter_subscription', - 'type' => 'enumeration', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'One time purchase customers', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 1, - 'property' => 'total_number_of_orders', - 'type' => 'number', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Two time purchase customers', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 2, - 'property' => 'total_number_of_orders', - 'type' => 'number', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Three time purchase customers', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 3, - 'property' => 'total_number_of_orders', - 'type' => 'number', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Bought four or more times', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 4, - 'property' => 'total_number_of_orders', - 'type' => 'number', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'Marketing Qualified Leads', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'EQ', - 'value' => 'marketingqualifiedlead', - 'property' => 'lifecyclestage', - 'type' => 'enumeration', - ), - ), - ), - ); - $lists[] = array( - - 'name' => __( 'Engaged Customers', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'operator' => 'WITHIN_TIME', - 'withinLastTime' => 60, - 'withinLastTimeUnit' => 'DAYS', - 'withinLastDays' => 60, - 'withinTimeMode' => 'PAST', - 'property' => 'last_order_date', - 'type' => 'date', - ), - ), - ), - ); - - $lists[] = array( - - 'name' => __( 'DisEngaged Customers', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'withinLastTime' => 60, - 'withinLastTimeUnit' => 'DAYS', - 'reverseWithinTimeWindow' => true, - 'withinLastDays' => 60, - 'withinTimeMode' => 'PAST', - 'type' => 'date', - 'operator' => 'WITHIN_TIME', - 'property' => 'last_order_date', - ), - array( - 'withinLastTime' => 180, - 'withinLastTimeUnit' => 'DAYS', - 'withinLastDays' => 180, - 'withinTimeMode' => 'PAST', - 'type' => 'date', - 'operator' => 'WITHIN_TIME', - 'property' => 'last_order_date', - ), - ), - ), - ); - - $lists[] = array( - 'name' => __( 'Repeat Buyers', 'makewebbetter-hubspot-for-woocommerce' ), - 'dynamic' => true, - 'filters' => array( - array( - array( - 'type' => 'number', - 'operator' => 'GTE', - 'property' => 'total_number_of_orders', - 'value' => 5, - ), - array( - 'type' => 'number', - 'operator' => 'LTE', - 'property' => 'average_days_between_orders', - 'value' => 30, - ), - ), - ), - ); - - return apply_filters( 'hubwoo_lists', $lists ); - } - - /** - * Get all workflows. - * - * @since 1.0.0 - */ - private function get_all_workflows() { - - $workflows = array(); - - $abandoned_status = 'yes'; - $abandoned_property_updated = get_option( 'hubwoo_abandoned_property_update', 'no' ); - - if ( ! empty( $abandoned_property_updated ) && 'yes' == $abandoned_property_updated ) { - - $abandoned_status = true; - } - - $workflows[] = array( - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: MQL to Customer lifecycle stage Conversion', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'DATE_STAMP_PROPERTY', - 'propertyName' => 'mql_capture_nurture_conversion_start_date', - 'name' => 'MQL Capture, Nurture & Conversion Start Date', - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'MQL Nurture & Conversion', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Current ROI Campaign', - ), - array( - 'type' => 'DELAY', - 'delayMillis' => 172800000, - ), - array( - 'type' => 'DELAY', - 'delayMillis' => 432000000, - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'None', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Current ROI Campaign', - ), - ), - 'goalCriteria' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'type' => 'enumeration', - 'property' => 'lifecyclestage', - 'value' => 'customer', - 'operator' => 'SET_ANY', - ), - ), - ), - ); - - $workflows[] = array( - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: Welcome New Customer & Get a 2nd Order', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'New Customer Welcome & Get a 2nd Order', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Current ROI Campaign', - ), - array( - 'type' => 'DATE_STAMP_PROPERTY', - 'propertyName' => 'second_purchase_workflow_start_date', - 'name' => 'Second Purchase Workflow Start Date', - ), - array( - 'type' => 'DELAY', - 'delayMillis' => 172800000, - ), - array( - 'type' => 'DELAY', - 'delayMillis' => 172800000, - ), - array( - 'type' => 'DELAY', - 'delayMillis' => 604800000, - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'None', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Current ROI Campaign', - ), - ), - 'goalCriteria' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'type' => 'number', - 'property' => 'total_number_of_orders', - 'value' => 1, - 'operator' => 'GT', - ), - ), - ), - 'onlyExecOnBizDays' => true, - ); - - $workflows[] = array( - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: 2nd Order Thank You & Get a 3rd Order', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'DELAY', - 'delayMillis' => 172800000, - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => '2nd Order Thank You & Get a 3rd Order', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Current ROI Campaign', - ), - array( - 'type' => 'DATE_STAMP_PROPERTY', - 'propertyName' => 'third_purchase_workflow_start_date', - 'name' => 'Third Purchase Workflow Start Date', - ), - array( - 'type' => 'DELAY', - 'delayMillis' => 172800000, - ), - - array( - 'type' => 'DELAY', - 'delayMillis' => 172800000, - ), - - array( - 'type' => 'DELAY', - 'delayMillis' => 432000000, - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'None', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Current ROI Campaign', - ), - ), - 'goalCriteria' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'type' => 'number', - 'property' => 'total_number_of_orders', - 'value' => 2, - 'operator' => 'GT', - ), - ), - ), - 'onlyExecOnBizDays' => true, - ); - - $workflows[] = array( - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: 3rd Order Thank You', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'DELAY', - 'delayMillis' => 172800000, - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => '3rd Order Thank You', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Current ROI Campaign', - ), - - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'None', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Current ROI Campaign', - ), - ), - 'onlyExecOnBizDays' => true, - ); - - $workflows[] = array( - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: ROI Calculation', - 'enabled' => true, - 'enrollOnCriteriaUpdate' => true, - 'actions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'type' => 'enumeration', - 'property' => 'current_roi_campaign', - 'value' => 'MQL Nurture & Conversion', - 'operator' => 'SET_ANY', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'true', - 'propertyName' => 'mql_capture_nurture_conversion_conversion', - 'name' => 'Set Property', - ), - array( - 'type' => 'COPY_PROPERTY', - 'sourceProperty' => 'last_order_value', - 'targetProperty' => 'mql_capture_nurture_conversion_conversion_amount', - 'targetModel' => 'CONTACT', - 'name' => 'Copy property', - ), - array( - 'type' => 'DATE_STAMP_PROPERTY', - 'propertyName' => 'mql_capture_nurture_conversion_conversion_date', - 'model' => 'CONTACT', - 'name' => 'MQL Capture, Nurture & Conversion Conversion Date', - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'None', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Set Property', - ), - ), - 'rejectActions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'type' => 'enumeration', - 'property' => 'current_roi_campaign', - 'value' => 'New Customer Welcome & Get a 2nd Order', - 'operator' => 'SET_ANY', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'true', - 'propertyName' => 'new_customer_workflow_conversion', - 'name' => 'Set Property', - ), - array( - 'type' => 'COPY_PROPERTY', - 'sourceProperty' => 'last_order_value', - 'targetProperty' => 'new_customer_workflow_conversion_amount', - 'targetModel' => 'CONTACT', - 'name' => 'Copy property', - ), - array( - 'type' => 'DATE_STAMP_PROPERTY', - 'propertyName' => 'new_customer_workflow_conversion_date', - 'model' => 'CONTACT', - 'name' => 'New Customer Workflow Conversion Date', - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'None', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Set Property', - ), - ), - 'rejectActions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'type' => 'enumeration', - 'property' => 'current_roi_campaign', - 'value' => '2nd Order Thank You & Get a 3rd Order', - 'operator' => 'SET_ANY', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'true', - 'propertyName' => 'second_purchase_workflow_conversion', - 'name' => 'Set Property', - ), - array( - 'type' => 'COPY_PROPERTY', - 'sourceProperty' => 'last_order_value', - 'targetProperty' => 'second_purchase_workflow_conversion_amount', - 'targetModel' => 'CONTACT', - 'name' => 'Copy property', - ), - array( - 'type' => 'DATE_STAMP_PROPERTY', - 'propertyName' => 'second_purchase_workflow_conversion_date', - 'model' => 'CONTACT', - 'name' => 'Second Purchase Workflow Conversion Date', - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'None', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Set Property', - ), - ), - 'rejectActions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'type' => 'enumeration', - 'property' => 'current_roi_campaign', - 'value' => '3rd Order Thank You', - 'operator' => 'SET_ANY', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'true', - 'propertyName' => 'third_purchase_workflow_conversion', - 'name' => 'Set Property', - ), - array( - 'type' => 'COPY_PROPERTY', - 'sourceProperty' => 'last_order_value', - 'targetProperty' => 'third_purchase_workflow_conversion_amount', - 'targetModel' => 'CONTACT', - 'name' => 'COPY_PROPERTY', - ), - array( - 'type' => 'DATE_STAMP_PROPERTY', - 'propertyName' => 'third_purchase_workflow_conversion_date', - 'model' => 'CONTACT', - 'name' => 'Third Purchase Workflow Conversion Date', - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'None', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Set Property', - ), - ), - 'rejectActions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'type' => 'enumeration', - 'property' => 'current_roi_campaign', - 'value' => 'Customer Reengagement', - 'operator' => 'SET_ANY', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'true', - 'propertyName' => 'customer_reengagement_workflow_conversion', - 'name' => 'Set Property', - ), - array( - 'type' => 'COPY_PROPERTY', - 'sourceProperty' => 'last_order_value', - 'targetProperty' => 'customer_reengagement_workflow_conversion_amount', - 'targetModel' => 'CONTACT', - 'name' => 'Copy property', - ), - array( - 'type' => 'DATE_STAMP_PROPERTY', - 'propertyName' => 'customer_reengagement_workflow_conversion_date', - 'name' => 'Customer Reengagement Workflow Conversion Date', - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'None', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Set Property', - ), - ), - 'rejectActions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'type' => 'enumeration', - 'property' => 'current_roi_campaign', - 'value' => 'Customer Rewards', - 'operator' => 'SET_ANY', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'true', - 'propertyName' => 'customer_rewards_workflow_conversion', - 'name' => 'Set Property', - ), - array( - 'type' => 'COPY_PROPERTY', - 'sourceProperty' => 'last_order_value', - 'targetProperty' => 'customer_rewards_workflow_conversion_amount', - 'targetModel' => 'CONTACT', - 'name' => 'Copy property', - ), - array( - 'type' => 'DATE_STAMP_PROPERTY', - 'propertyName' => 'customer_rewards_workflow_conversion_date', - 'model' => 'CONTACT', - 'name' => 'Customer Rewards Workflow Conversion Date', - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'None', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Set Property', - ), - ), - 'rejectActions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'type' => 'enumeration', - 'property' => 'current_roi_campaign', - 'value' => 'Abandoned Cart Recovery', - 'operator' => 'SET_ANY', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'true', - 'propertyName' => 'abandoned_cart_recovery_workflow_conversion', - 'name' => 'Set Property', - ), - array( - 'type' => 'COPY_PROPERTY', - 'sourceProperty' => 'last_order_value', - 'targetProperty' => 'abandoned_cart_recovery_workflow_conversion_amount', - 'targetModel' => 'CONTACT', - 'name' => 'Copy Property', - ), - array( - 'type' => 'DATE_STAMP_PROPERTY', - 'propertyName' => 'abandoned_cart_recovery_workflow_conversion_date', - 'model' => 'CONTACT', - 'name' => 'Abandoned Cart Recovery Workflow Conversion Date', - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'None', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Set Property', - ), - ), - 'rejectActions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'None', - 'propertyName' => 'current_roi_campaign', - 'name' => 'Set Property', - ), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ); - $workflows[] = array( - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: After order Workflow', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'type' => 'number', - 'property' => 'total_number_of_orders', - 'value' => 3, - 'operator' => 'EQ', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'name' => 'WooCommerce: 3rd Order Thank You', - 'workflowId' => get_option( 'WooCommerce: 3rd Order Thank You', '' ), - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => '', - 'propertyName' => 'customer_new_order', - 'name' => 'Customer New Order', - ), - ), - 'rejectActions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'type' => 'number', - 'property' => 'total_number_of_orders', - 'value' => 2, - 'operator' => 'EQ', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'name' => 'WooCommerce: 2nd Order Thank You & Get a 3rd Order', - 'workflowId' => get_option( 'WooCommerce: 2nd Order Thank You & Get a 3rd Order', '' ), - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => '', - 'propertyName' => 'customer_new_order', - 'name' => 'Customer New Order', - ), - ), - 'rejectActions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'type' => 'number', - 'property' => 'total_number_of_orders', - 'value' => 1, - 'operator' => 'EQ', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'name' => 'WooCommerce: Welcome New Customer & Get a 2nd Order', - 'workflowId' => get_option( 'WooCommerce: Welcome New Customer & Get a 2nd Order', '' ), - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => '', - 'propertyName' => 'customer_new_order', - 'name' => 'Customer New Order', - ), - ), - 'rejectActions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => '', - 'propertyName' => 'customer_new_order', - 'name' => 'Customer New Order', - ), - ), - ), - ), - ), - ), - ), - ), - ); - - $workflows[] = array( - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: Order Workflow', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'DELAY', - 'delayMillis' => 300000, - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => '', - 'propertyName' => 'lifecyclestage', - 'name' => 'Lifecycle stage', - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 'customer', - 'propertyName' => 'lifecyclestage', - 'name' => 'Lifecycle stage', - ), - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'workflowId' => get_option( 'WooCommerce: ROI Calculation', '' ), - 'name' => 'WooCommerce: ROI Calculation', - ), - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'workflowId' => get_option( 'WooCommerce: After order Workflow', '' ), - 'name' => 'WooCommerce: After order Workflow', - ), - ), - 'enrollOnCriteriaUpdate' => true, - 'segmentCriteria' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'filterFamily' => 'PropertyValue', - 'type' => 'enumeration', - 'property' => 'customer_new_order', - 'value' => 'yes', - 'operator' => 'SET_ANY', - ), - ), - ), - ); - - if ( 'yes' == get_option( 'hubwoo_abncart_enable_addon', 'yes' ) ) { - - $workflows[] = array( - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: Abandoned Cart Recovery', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'propertyName' => 'current_roi_campaign', - 'newValue' => 'Abandoned Cart Recovery', - 'name' => 'Current ROI Campaign', - ), - array( - 'type' => 'DATE_STAMP_PROPERTY', - 'propertyName' => 'abandoned_cart_recovery_workflow_start_date', - 'name' => 'Abandoned Cart Recovery Workflow Start Date', - ), - - array( - 'type' => 'DELAY', - 'delayMillis' => 345600000, - ), - - array( - 'type' => 'DELAY', - 'delayMillis' => 1209600000, - ), - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'propertyName' => 'current_roi_campaign', - 'newValue' => 'None', - 'name' => 'Current ROI Campaign', - ), - ), - 'onlyExecOnBizDays' => true, - 'enrollOnCriteriaUpdate' => true, - 'segmentCriteria' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'filterFamily' => 'PropertyValue', - 'type' => 'enumeration', - 'property' => 'current_abandoned_cart', - 'value' => $abandoned_status, - 'operator' => 'SET_ANY', - ), - ), - ), - 'goalCriteria' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'filterFamily' => 'Workflow', - 'workflowId' => get_option( 'WooCommerce: Order Workflow', '' ), - 'operator' => 'ACTIVE_IN_WORKFLOW', - ), - ), - ), - 'reEnrollmentTriggerSets' => array( - array( - array( - 'type' => 'CONTACT_PROPERTY_NAME', - 'id' => 'current_abandoned_cart', - ), - array( - 'type' => 'CONTACT_PROPERTY_VALUE', - 'id' => $abandoned_status, - ), - ), - ), - ); - - } - - $workflows[] = array( - - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: set Order Recency 1 Ratings', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 1, - 'propertyName' => 'order_recency_rating', - 'name' => 'Order Recency Rating', - ), - ), - 'goalCriteria' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'filterFamily' => 'Workflow', - 'workflowId' => get_option( 'WooCommerce: Order Workflow', '' ), - 'operator' => 'ACTIVE_IN_WORKFLOW', - ), - ), - ), - ); - - $workflows[] = array( - - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: set Order Recency 2 Ratings', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 2, - 'propertyName' => 'order_recency_rating', - 'name' => 'Order Recency Rating', - ), - array( - 'type' => 'DELAY', - 'delayMillis' => '31104000000', - ), - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'name' => 'WooCommerce: set Order Recency 1 Ratings', - 'workflowId' => get_option( 'WooCommerce: set Order Recency 1 Ratings', '' ), - ), - ), - 'goalCriteria' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'filterFamily' => 'Workflow', - 'workflowId' => get_option( 'WooCommerce: Order Workflow', '' ), - 'operator' => 'ACTIVE_IN_WORKFLOW', - ), - ), - ), - ); - - $workflows[] = array( - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: set Order Recency 3 Ratings', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 3, - 'propertyName' => 'order_recency_rating', - 'name' => 'Order Recency Rating', - ), - array( - 'type' => 'DELAY', - 'delayMillis' => '15552000000', - ), - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'name' => 'WooCommerce: set Order Recency 2 Ratings', - 'workflowId' => get_option( 'WooCommerce: set Order Recency 2 Ratings', '' ), - ), - ), - 'goalCriteria' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'filterFamily' => 'Workflow', - 'workflowId' => get_option( 'WooCommerce: Order Workflow', '' ), - 'operator' => 'ACTIVE_IN_WORKFLOW', - ), - ), - ), - ); - - $workflows[] = array( - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: set Order Recency 4 Ratings', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 4, - 'propertyName' => 'order_recency_rating', - 'name' => 'Order Recency Rating', - ), - array( - 'type' => 'DELAY', - 'delayMillis' => '7776000000', - ), - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'name' => 'WooCommerce: set Order Recency 3 Ratings', - 'workflowId' => get_option( 'WooCommerce: set Order Recency 3 Ratings', '' ), - ), - ), - 'goalCriteria' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'filterFamily' => 'Workflow', - 'workflowId' => get_option( 'WooCommerce: Order Workflow', '' ), - 'operator' => 'ACTIVE_IN_WORKFLOW', - ), - ), - ), - ); - - $workflows[] = array( - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: set Order Recency 5 Ratings', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'SET_CONTACT_PROPERTY', - 'newValue' => 5, - 'propertyName' => 'order_recency_rating', - 'name' => 'Order Recency Rating', - ), - array( - 'type' => 'DELAY', - 'delayMillis' => '2592000000', - ), - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'name' => 'WooCommerce: set Order Recency 4 Ratings', - 'workflowId' => get_option( 'WooCommerce: set Order Recency 4 Ratings', '' ), - ), - ), - 'goalCriteria' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'filterFamily' => 'Workflow', - 'workflowId' => get_option( 'WooCommerce: Order Workflow', '' ), - 'operator' => 'ACTIVE_IN_WORKFLOW', - ), - ), - ), - ); - - $workflows[] = array( - - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: Update Historical Order Recency Rating', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinLastTime' => 31, - 'withinLastTimeUnit' => 'DAYS', - 'withinLastDays' => 31, - 'withinTimeMode' => 'PAST', - 'type' => 'date', - 'property' => 'last_order_date', - 'operator' => 'WITHIN_TIME', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'name' => 'WooCommerce: set Order Recency 5 Ratings', - 'workflowId' => get_option( 'WooCommerce: set Order Recency 5 Ratings', '' ), - ), - ), - 'rejectActions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinLastTime' => 30, - 'withinLastTimeUnit' => 'DAYS', - 'reverseWithinTimeWindow' => true, - 'withinLastDays' => 30, - 'withinTimeMode' => 'PAST', - 'type' => 'date', - 'property' => 'last_order_date', - 'operator' => 'WITHIN_TIME', - ), - array( - 'withinLastTime' => 91, - 'withinLastTimeUnit' => 'DAYS', - 'withinLastDays' => 91, - 'withinTimeMode' => 'PAST', - 'type' => 'date', - 'property' => 'last_order_date', - 'operator' => 'WITHIN_TIME', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'name' => 'WooCommerce: set Order Recency 4 Ratings', - 'workflowId' => get_option( 'WooCommerce: set Order Recency 4 Ratings', '' ), - ), - ), - 'rejectActions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinLastTime' => 90, - 'withinLastTimeUnit' => 'DAYS', - 'reverseWithinTimeWindow' => true, - 'withinLastDays' => 90, - 'withinTimeMode' => 'PAST', - 'type' => 'date', - 'property' => 'last_order_date', - 'operator' => 'WITHIN_TIME', - ), - array( - 'withinLastTime' => 181, - 'withinLastTimeUnit' => 'DAYS', - 'withinLastDays' => 181, - 'withinTimeMode' => 'PAST', - 'type' => 'date', - 'property' => 'last_order_date', - 'operator' => 'WITHIN_TIME', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'name' => 'WooCommerce: set Order Recency 3 Ratings', - 'workflowId' => get_option( 'WooCommerce: set Order Recency 3 Ratings', '' ), - ), - ), - 'rejectActions' => array( - array( - 'type' => 'BRANCH', - 'filters' => array( - array( - array( - 'withinLastTime' => 180, - 'withinLastTimeUnit' => 'DAYS', - 'reverseWithinTimeWindow' => true, - 'withinLastDays' => 180, - 'withinTimeMode' => 'PAST', - 'type' => 'date', - 'property' => 'last_order_date', - 'operator' => 'WITHIN_TIME', - ), - array( - 'withinLastTime' => 365, - 'withinLastTimeUnit' => 'DAYS', - 'withinLastDays' => 365, - 'withinTimeMode' => 'PAST', - 'type' => 'date', - 'property' => 'last_order_date', - 'operator' => 'WITHIN_TIME', - ), - ), - ), - 'acceptActions' => array( - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'name' => 'WooCommerce: set Order Recency 2 Ratings', - 'workflowId' => get_option( 'WooCommerce: set Order Recency 2 Ratings', '' ), - ), - ), - 'rejectActions' => array( - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'name' => 'WooCommerce: set Order Recency 1 Ratings', - 'workflowId' => get_option( 'WooCommerce: set Order Recency 1 Ratings', '' ), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ); - - $workflows[] = array( - 'type' => 'DRIP_DELAY', - 'name' => 'WooCommerce: Enroll Customers for Recency Settings', - 'enabled' => true, - 'actions' => array( - array( - 'type' => 'WORKFLOW_ENROLLMENT', - 'workflowId' => get_option( 'WooCommerce: Update Historical Order Recency Rating', '' ), - 'name' => 'WooCommerce: Update Historical Order Recency Rating', - ), - ), - 'enrollOnCriteriaUpdate' => true, - 'segmentCriteria' => array( - array( - array( - 'withinTimeMode' => 'PAST', - 'filterFamily' => 'PropertyValue', - 'type' => 'enumeration', - 'property' => 'lifecyclestage', - 'value' => 'customer', - 'operator' => 'SET_ANY', - ), - ), - ), - 'reEnrollmentTriggerSets' => array( - array( - array( - 'type' => 'CONTACT_PROPERTY_NAME', - 'id' => 'lifecyclestage', - ), - array( - 'type' => 'CONTACT_PROPERTY_VALUE', - 'id' => 'customer', - ), - ), - ), - ); - - return apply_filters( 'hubwoo_workflows', $workflows ); - } - - /** - * Customer new order. - * - * @since 1.0.0 - */ - public function hubwoo_new_order_status() { - - $values = array(); - - $values[] = array( - 'label' => __( 'Yes', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'yes', - ); - $values[] = array( - 'label' => __( 'No', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'no', - ); - - return $values; - } - - /** - * Get optin sources. - * - * @since 1.0.0 - */ - public function get_user_marketing_sources() { - - $sources = array(); - $sources[] = array( - 'label' => __( 'Checkout', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'checkout', - ); - $sources[] = array( - 'label' => __( 'Registration', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'registration', - ); - $sources[] = array( - 'label' => __( 'Others', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'other', - ); - $sources = apply_filters( 'hubwoo_user_marketing_sources', $sources ); - return $sources; - } - - /** - * Get all campaigns names for hubspot. - * - * @since 1.0.0 - */ - public function get_all_campaign_names() { - - $all_names = array(); - - $all_names[] = array( - 'label' => 'MQL Nurture & Conversion', - 'value' => 'MQL Nurture & Conversion', - ); - - $all_names[] = array( - 'label' => 'New Customer Welcome & Get a 2nd Order', - 'value' => 'New Customer Welcome & Get a 2nd Order', - ); - - $all_names[] = array( - 'label' => '2nd Order Thank You & Get a 3rd Order', - 'value' => '2nd Order Thank You & Get a 3rd Order', - ); - - $all_names[] = array( - 'label' => '3rd Order Thank You', - 'value' => '3rd Order Thank You', - ); - - $all_names[] = array( - 'label' => 'Customer Reengagement', - 'value' => 'Customer Reengagement', - ); - - $all_names[] = array( - 'label' => 'Customer Rewards', - 'value' => 'Customer Rewards', - ); - - $all_names[] = array( - 'label' => 'Abandoned Cart Recovery', - 'value' => 'Abandoned Cart Recovery', - ); - - $all_names[] = array( - 'label' => 'None', - 'value' => 'None', - ); - - return $all_names; - } - - /** - * Conversion options for campaigns on hubspot. - * - * @since 1.0.0 - */ - public function hubwoo_campaign_conversion_options() { - - $values = array(); - - $values[] = array( - 'label' => __( 'Yes', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'true', - ); - $values[] = array( - 'label' => __( 'No', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'false', - ); - - return $values; - } - - /** - * Get subscriptions billing period for hubspot. - * - * @since 1.0.0 - */ - public static function get_subscriptions_billing_period() { - - $values = array(); - - $values[] = array( - 'label' => __( 'Day', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'day', - ); - $values[] = array( - 'label' => __( 'Week', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'week', - ); - $values[] = array( - 'label' => __( 'Month', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'month', - ); - $values[] = array( - 'label' => __( 'Year', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'year', - ); - - $values = apply_filters( 'hubwoo_subscriptions_period', $values ); - - return $values; - } - - /** - * Get subscriptions billing interval for hubspot. - * - * @since 1.0.0 - */ - public static function get_subscriptions_billing_interval() { - - $values = array(); - - $values[] = array( - 'label' => __( 'Every', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 1, - ); - $values[] = array( - 'label' => __( 'Every Second', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 2, - ); - $values[] = array( - 'label' => __( 'Every Third', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 3, - ); - $values[] = array( - 'label' => __( 'Every Fourth', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 4, - ); - $values[] = array( - 'label' => __( 'Every Fifth', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 5, - ); - $values[] = array( - 'label' => __( 'Every Sixth', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 6, - ); - - $values = apply_filters( 'hubwoo_subscriptions_interval', $values ); - - return $values; - } - - /** - * Get all available woocommerce order statuses. - * - * @return JSON Order statuses in the form of enumaration options. - * @since 1.0.0 - */ - public static function get_order_statuses() { - - $all_wc_statuses = array(); - - // get all statuses. - $all_status = wc_get_order_statuses(); - - // if status available. - if ( is_array( $all_status ) && count( $all_status ) ) { - - foreach ( $all_status as $status_id => $status_label ) { - - $all_wc_statuses[] = array( - 'label' => $status_label, - 'value' => $status_id, - ); - } - } - $all_wc_statuses = apply_filters( 'hubwoo_order_status_options', $all_wc_statuses ); - - return $all_wc_statuses; - } - - /** - * Get all available woocommerce order statuses for subscriptions. - * - * @return JSON Order statuses in the form of enumaration options. - * @since 1.0.0 - */ - public static function get_subscription_status_options() { - - $all_wc_subs_status = array(); - - // get all statuses. - $all_status = wcs_get_subscription_statuses(); - - // if status available. - if ( is_array( $all_status ) && count( $all_status ) ) { - - foreach ( $all_status as $status_id => $status_label ) { - - $all_wc_subs_status[] = array( - 'label' => $status_label, - 'value' => $status_id, - ); - } - } - - $all_wc_subs_status = apply_filters( 'hubwoo_order_status_options', $all_wc_subs_status ); - - return $all_wc_subs_status; - } - - /** - * Get ratings for RFM analysis. - * - * @return ratings for RFM analysis. - * @since 1.0.0 - */ - public function get_rfm_rating() { - - $rating = array(); - - $rating[] = array( - 'label' => __( '5', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 5, - ); - $rating[] = array( - 'label' => __( '4', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 4, - ); - $rating[] = array( - 'label' => __( '3', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 3, - ); - $rating[] = array( - 'label' => __( '2', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 2, - ); - $rating[] = array( - 'label' => __( '1', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 1, - ); - - $rating = apply_filters( 'hubwoo_rfm_ratings', $rating ); - - return $rating; - } - - /** - * Get user actions for marketing. - * - * @return array marketing actions for users. - * @since 1.0.0 - */ - public function get_user_marketing_action() { - - $user_actions = array(); - - $user_actions[] = array( - 'label' => __( 'Yes', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'yes', - ); - $user_actions[] = array( - 'label' => __( 'No', 'makewebbetter-hubspot-for-woocommerce' ), - 'value' => 'no', - ); - - $user_actions = apply_filters( 'hubwoo_user_marketing_actions', $user_actions ); - - return $user_actions; - } - - /** - * Last order products html for hubspot. - * - * @since 1.0.0 - * @param int $last_order_id last order if to create html. - */ - public function hubwoo_last_order_html( $last_order_id = '' ) { - - $products_html = ''; - - if ( ! empty( $last_order_id ) ) { - - $order = new WC_Order( $last_order_id ); - - $key = 0; - - $last_order_products = array(); - - if ( ! empty( $order ) || ! is_wp_error( $order ) ) { - - $order_items = $order->get_items(); - - if ( is_array( $order_items ) && count( $order_items ) ) { - - foreach ( $order_items as $item_id_1 => $wc_order_item_product ) { - - if ( ! empty( $wc_order_item_product ) && $wc_order_item_product instanceof WC_Order_Item ) { - - $item_id = $wc_order_item_product->get_variation_id(); - - if ( empty( $item_id ) ) { - $item_id = $wc_order_item_product->get_product_id(); - } - - $product = wc_get_product( $item_id ); - - if ( get_post_status( $item_id ) == 'trash' || get_post_status( $item_id ) == false ) { - - continue; - } - - $attachment_src = wp_get_attachment_image_src( get_post_thumbnail_id( $product->get_id() ), 'single-post-thumbnail' ); - - $last_order_products[ $key ]['image'] = isset( $attachment_src[0] ) ? $attachment_src[0] : ''; - $last_order_products[ $key ]['name'] = get_the_title( $item_id ); - $last_order_products[ $key ]['url'] = get_permalink( $item_id ); - $last_order_products[ $key ]['price'] = $product->get_price(); - $last_order_products[ $key ]['qty'] = $wc_order_item_product->get_quantity(); - $last_order_products[ $key ]['disc'] = $wc_order_item_product->get_total(); - $key++; - } - } - } - } - - if ( count( $last_order_products ) ) { - - $products_html = '

'; - - foreach ( $last_order_products as $single_product ) { - - $total = $single_product['disc']; - $disc = ( (int) $single_product['price'] * $single_product['qty'] ) - $total; - $products_html .= ''; - } - - $products_html .= '
' . __( 'Image', 'makewebbetter-hubspot-for-woocommerce' ) . '' . __( 'Item', 'makewebbetter-hubspot-for-woocommerce' ) . '' . __( 'Qty', 'makewebbetter-hubspot-for-woocommerce' ) . '' . __( 'Price', 'huwboo' ) . '' . __( 'Discount', 'makewebbetter-hubspot-for-woocommerce' ) . '' . __( 'Total', 'makewebbetter-hubspot-for-woocommerce' ) . '
' . $single_product['name'] . '' . $single_product['qty'] . '' . wc_price( $single_product['price'], array( 'currency' => $order->get_currency() ) ) . '' . wc_price( $disc, array( 'currency' => $order->get_currency() ) ) . '' . wc_price( $total, array( 'currency' => $order->get_currency() ) ) . '

'; - } - } - - return $products_html; - } -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoocustomer.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoocustomer.php deleted file mode 100644 index a9d1f7d3..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoocustomer.php +++ /dev/null @@ -1,311 +0,0 @@ -_contact_id = $contact_id; - - // store the instance of property callback. - $this->_callback_instance = new HubWooPropertyCallbacks( $this->_contact_id ); - - // prepare the modified fields data and store it in the contact. - $this->prepare_modified_fields(); - } - - /** - * Get user email. - * - * @since 1.0.0 - */ - public function get_email() { - - return $this->_callback_instance->_get_mail(); - } - - /** - * Get all properties with values. - * - * @return array and key value pair array of properties. - * @since 1.0.0 - */ - public function get_contact_properties() { - - // let others decide if they have modified fields in there integration. - $this->_properties = apply_filters( 'hubwoo_contact_modified_fields', $this->_properties, $this->_contact_id ); - return $this->_properties; - } - - /** - * Get all properties with values. - * - * @param array $properties array of contact properties. - * @return array $properties array of properties with user value. - * @since 1.0.0 - */ - public function get_user_data_properties( $properties ) { - - $fname = get_user_meta( $this->_contact_id, 'first_name', true ); - if ( ! empty( $fname ) ) { - $properties[] = array( - 'property' => 'firstname', - 'value' => $fname, - ); - } - - $lname = get_user_meta( $this->_contact_id, 'last_name', true ); - if ( ! empty( $lname ) ) { - $properties[] = array( - 'property' => 'lastname', - 'value' => $lname, - ); - } - - $cname = get_user_meta( $this->_contact_id, 'billing_company', true ); - if ( ! empty( $cname ) ) { - $properties[] = array( - 'property' => 'company', - 'value' => $cname, - ); - } - - $phone = get_user_meta( $this->_contact_id, 'billing_phone', true ); - if ( ! empty( $phone ) ) { - $properties[] = array( - 'property' => 'mobilephone', - 'value' => $phone, - ); - $properties[] = array( - 'property' => 'phone', - 'value' => $phone, - ); - } - - $city = get_user_meta( $this->_contact_id, 'billing_city', true ); - if ( ! empty( $city ) ) { - $properties[] = array( - 'property' => 'city', - 'value' => $city, - ); - } - - $state = get_user_meta( $this->_contact_id, 'billing_state', true ); - if ( ! empty( $state ) ) { - $properties[] = array( - 'property' => 'state', - 'value' => $state, - ); - } - - $country = get_user_meta( $this->_contact_id, 'billing_country', true ); - if ( ! empty( $country ) ) { - $properties[] = array( - 'property' => 'country', - 'value' => Hubwoo::map_country_by_abbr( $country ), - ); - } - - $address1 = get_user_meta( $this->_contact_id, 'billing_address_1', true ); - $address2 = get_user_meta( $this->_contact_id, 'billing_address_2', true ); - - if ( ! empty( $address1 ) || ! empty( $address2 ) ) { - $address = $address1 . ' ' . $address2; - $properties[] = array( - 'property' => 'address', - 'value' => $address, - ); - } - - $postcode = get_user_meta( $this->_contact_id, 'billing_postcode', true ); - if ( ! empty( $postcode ) ) { - $properties[] = array( - 'property' => 'zip', - 'value' => $postcode, - ); - } - - $prop_index = array_search( 'customer_new_order', array_column( $properties, 'property' ) ); - - $customer_new_order_flag = 'no'; - - if ( ! Hubwoo_Admin::hubwoo_check_for_cart( $properties ) ) { - if ( Hubwoo_Admin::hubwoo_check_for_properties( 'order_recency_rating', 5, $properties ) ) { - if ( Hubwoo_Admin::hubwoo_check_for_properties( 'last_order_status', get_option( 'hubwoo_no_status', 'wc-completed' ), $properties ) ) { - $customer_new_order_flag = 'yes'; - } - } - } - - if ( $prop_index ) { - $properties[ $prop_index ]['value'] = $customer_new_order_flag; - } else { - $properties[] = array( - 'property' => 'customer_new_order', - 'value' => $customer_new_order_flag, - ); - } - - $properties = apply_filters( 'hubwoo_unset_workflow_properties', $properties ); - $properties = apply_filters( 'hubwoo_map_new_properties', $properties, $this->_contact_id ); - - if ( Hubwoo_Admin::hubwoo_check_for_cart( $properties ) ) { - update_user_meta( $this->_contact_id, 'hubwoo_pro_user_cart_sent', 'yes' ); - } - return $properties; - } - - /** - * Format modified fields of customer. - * - * Check for all the modified fields till the last update - * and prepare them in the hubspot api acceptable form. - * - * @since 1.0.0 - */ - private function prepare_modified_fields() { - - $hubwoo_vid = $this->get_hubwoo_vid(); - - if ( ! empty( $hubwoo_vid ) && $hubwoo_vid > 0 ) { - - $modified_fields = $this->get_contact_modified_fields(); - } else { - - $modified_fields = HubWooContactProperties::get_instance()->hubwoo_get_filtered_properties(); - } - - if ( is_array( $modified_fields ) && count( $modified_fields ) ) { - - foreach ( $modified_fields as $group_fields ) { - - if ( is_array( $group_fields ) ) { - - foreach ( $group_fields as $field ) { - $property = $this->_prepare_property( $field ); - - if ( is_array( $property ) && ! empty( $property['value'] ) ) { - - $this->_properties[] = array( - 'property' => $property['property'], - 'value' => $property['value'], - ); - } - } - } - } - } - } - - /** - * Check if the contact is not uploaded to hubspot. - * - * @return Int/null hubspot vid if pre-uploaded either null. - * @since 1.0.0 - */ - private function get_hubwoo_vid() { - - return get_user_meta( $this->_contact_id, 'hubwoo_vid', true ); - } - - /** - * Get modified fields since last update of the contact. - * - * @return Array Array of fields modified. - */ - public function get_contact_modified_fields() { - - $modified_fields = get_user_meta( $this->_contact_id, 'hubwoo_modified_fields', true ); - - if ( ! is_array( $modified_fields ) ) { - - $modified_fields = array(); - } - - return $modified_fields; - } - - /** - * Prepare property in the form of key value accepted by hubspot. - * - * @param array $property array of the property details to validate the value. - * @return array formatted key value pair. - */ - public function _prepare_property( $property ) { - - $property_name = isset( $property['name'] ) ? $property['name'] : ''; - - if ( ! empty( $property_name ) ) { - - $property_val = $this->_callback_instance->_get_property_value( $property_name, $this->_contact_id ); - - $property = array( - 'property' => $property_name, - 'value' => $property_val, - ); - - return $property; - } - } -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoodatasync.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoodatasync.php deleted file mode 100644 index 16f9c967..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoodatasync.php +++ /dev/null @@ -1,376 +0,0 @@ -hubwoo_get_user_roles() ); - $key = array_search( 'guest_user', $roles ); - if ( false !== $key ) { - unset( $roles[ $key ] ); - } - } - - if ( in_array( 'guest_user', $roles ) ) { - - $key = array_search( 'guest_user', $roles ); - - $order_statuses = get_option( 'hubwoo-selected-order-status', array() ); - - if ( empty( $order_statuses ) || ( ! is_array( $order_statuses ) && count( $order_statuses ) < 1 ) ) { - $order_statuses = array_keys( wc_get_order_statuses() ); - } - - if ( false !== $key ) { - unset( $roles[ $key ] ); - } - - $order_args = array( - 'return' => 'ids', - 'limit' => $limit, - 'type' => wc_get_order_types(), - 'status' => $order_statuses, - 'customer' => 0, - 'hubwoo_pro_guest_order' => 'synced', - ); - - if ( $date_range ) { - $order_args['date_modified'] = gmdate( 'Y-m-d', strtotime( $from_date ) ) . '...' . gmdate( 'Y-m-d', strtotime( $upto_date . ' +1 day' ) ); - } - - $guest_orders = wc_get_orders( $order_args ); - - $guest_emails = array_unique( self::get_guest_sync_data( $guest_orders, true ) ); - - if ( 'guestOrder' == $response_type ) { - return $guest_orders; - } - - if ( is_array( $guest_orders ) ) { - $unique_users += count( $guest_emails ); - } - } else { - - if ( 'guestOrder' == $response_type ) { - return false; - } - } - - if ( $date_range ) { - - $args['date_query'] = array( - array( - 'after' => gmdate( 'd-m-Y', strtotime( $from_date ) ), - 'before' => gmdate( 'd-m-Y', strtotime( $upto_date . ' +1 day' ) ), - 'inclusive' => true, - ), - ); - } - - // creating args for registered users. - $args['meta_query'] = array( - - 'relation' => 'OR', - array( - 'key' => 'hubwoo_pro_user_data_change', - 'compare' => 'NOT EXISTS', - ), - array( - 'key' => 'hubwoo_pro_user_data_change', - 'value' => 'synced', - 'compare' => '!=', - ), - ); - - $args['role__in'] = $roles; - - $args['number'] = $limit; - - $args['fields'] = 'ID'; - - $registered_users = get_users( $args ); - - if ( $count ) { - $unique_users += count( $registered_users ); - return $unique_users; - } - - return $registered_users; - } - - /** - * Retrieve User Data - * for Guest Users - * - * @param array $hubwoo_orders array of order to be synced. - * @param bool $only_email true/false. - */ - public static function get_guest_sync_data( $hubwoo_orders, $only_email = false ) { - - global $hubwoo; - - $guest_user_emails = array(); - $guest_contacts = array(); - $guest_user_properties = array(); - - if ( ! empty( $hubwoo_orders ) && count( $hubwoo_orders ) ) { - - foreach ( $hubwoo_orders as $order_id ) { - - $hubwoo_guest_order = wc_get_order( $order_id ); - - if ( $hubwoo_guest_order instanceof WC_Order ) { - - $guest_email = $hubwoo_guest_order->get_billing_email(); - - if ( ! empty( $guest_email ) && $only_email ) { - $guest_user_emails[] = $guest_email; - continue; - } - - if ( empty( $guest_email ) ) { - - $hubwoo_guest_order->delete_meta_data('hubwoo_pro_guest_order'); - continue; - } - - $guest_order_callback = new HubwooGuestOrdersManager( $order_id ); - - $guest_user_properties = $guest_order_callback->get_order_related_properties( $order_id, $guest_email ); - - $guest_user_properties = $hubwoo->hubwoo_filter_contact_properties( $guest_user_properties ); - - $fname = $hubwoo_guest_order->get_billing_first_name(); - if ( ! empty( $fname ) ) { - $guest_user_properties[] = array( - 'property' => 'firstname', - 'value' => $fname, - ); - } - - $lname = $hubwoo_guest_order->get_billing_last_name(); - if ( ! empty( $lname ) ) { - $guest_user_properties[] = array( - 'property' => 'lastname', - 'value' => $lname, - ); - } - - $cname = $hubwoo_guest_order->get_billing_company(); - if ( ! empty( $cname ) ) { - $guest_user_properties[] = array( - 'property' => 'company', - 'value' => $cname, - ); - } - - $city = $hubwoo_guest_order->get_billing_city(); - if ( ! empty( $city ) ) { - $guest_user_properties[] = array( - 'property' => 'city', - 'value' => $city, - ); - } - - $state = $hubwoo_guest_order->get_billing_state(); - if ( ! empty( $state ) ) { - $guest_user_properties[] = array( - 'property' => 'state', - 'value' => $state, - ); - } - - $country = $hubwoo_guest_order->get_billing_country(); - if ( ! empty( $country ) ) { - $guest_user_properties[] = array( - 'property' => 'country', - 'value' => Hubwoo::map_country_by_abbr( $country ), - ); - } - - $address1 = $hubwoo_guest_order->get_billing_address_1(); - $address2 = $hubwoo_guest_order->get_billing_address_2(); - if ( ! empty( $address1 ) || ! empty( $address2 ) ) { - $address = $address1 . ' ' . $address2; - $guest_user_properties[] = array( - 'property' => 'address', - 'value' => $address, - ); - } - - $zip = $hubwoo_guest_order->get_billing_postcode(); - if ( ! empty( $zip ) ) { - $guest_user_properties[] = array( - 'property' => 'zip', - 'value' => $zip, - ); - } - - $guest_phone = $hubwoo_guest_order->get_billing_phone(); - - if ( ! empty( $guest_phone ) ) { - $guest_user_properties[] = array( - 'property' => 'mobilephone', - 'value' => $guest_phone, - ); - $guest_user_properties[] = array( - 'property' => 'phone', - 'value' => $guest_phone, - ); - } - - $customer_new_order_flag = 'no'; - $prop_index = array_search( 'customer_new_order', array_column( $guest_user_properties, 'property' ) ); - - if ( Hubwoo_Admin::hubwoo_check_for_properties( 'order_recency_rating', 5, $guest_user_properties ) ) { - - if ( Hubwoo_Admin::hubwoo_check_for_properties( 'last_order_status', get_option( 'hubwoo_no_status', 'wc-completed' ), $guest_user_properties ) ) { - - $customer_new_order_flag = 'yes'; - } - } - - if ( $prop_index ) { - $guest_user_properties[ $prop_index ]['value'] = $customer_new_order_flag; - } else { - $guest_user_properties[] = array( - 'property' => 'customer_new_order', - 'value' => $customer_new_order_flag, - ); - } - - $guest_user_properties_data = array( - 'email' => $guest_email, - 'properties' => $guest_user_properties, - ); - - $guest_contacts[] = $guest_user_properties_data; - - $hubwoo_guest_order->delete_meta_data('hubwoo_pro_guest_order'); - } - } - } - $response = $only_email ? $guest_user_emails : $guest_contacts; - - return $response; - } - - /** - * Scheduling Background Tasks - */ - public function schedule_background_task() { - - delete_option( 'hubwoo_ocs_data_synced' ); - delete_option( 'hubwoo_ocs_contacts_synced' ); - update_option( 'hubwoo_background_process_running', true ); - - if ( ! as_next_scheduled_action( 'hubwoo_contacts_sync_background' ) ) { - as_schedule_recurring_action( time(), 300, 'hubwoo_contacts_sync_background' ); - } - } - - /** - * Starts Scheduling once - * the data has been retrieved - */ - public function hubwoo_start_schedule() { - - $hubwoo_unique_users = $this->hubwoo_get_all_unique_user( true ); - - if ( $hubwoo_unique_users ) { - $this->schedule_background_task(); - } - } - - /** - * Retrieving Data For Registered - * Users - * - * @param array $hubwoo_unique_users array of users to sync. - * @return User Data - */ - public static function get_sync_data( $hubwoo_unique_users ) { - - // basic data function for user ids. - $contacts = array(); - $role__in = get_option( 'hubwoo-selected-user-roles', array() ); - $user_role_in = get_option( 'hubwoo_customers_role_settings', array() ); - - if ( ! empty( $hubwoo_unique_users ) && count( $hubwoo_unique_users ) ) { - - foreach ( $hubwoo_unique_users as $key => $id ) { - - $hubwoo_customer = new HubWooCustomer( $id ); - - $email = $hubwoo_customer->get_email(); - $user_data = get_user_by( 'email', $email ); - - if( ! empty( $user_data ) ) { - - if( ! empty( $user_data->roles[0] ) ) { - - $role = $user_data->roles[0]; - if ( in_array( $role, $role__in ) || in_array( $role, $user_role_in ) ) { - - if ( empty( $email ) ) { - delete_user_meta( $id, 'hubwoo_pro_user_data_change' ); - continue; - } - $properties = $hubwoo_customer->get_contact_properties(); - $user_properties = $hubwoo_customer->get_user_data_properties( $properties ); - $properties_data = array( - 'email' => $email, - 'properties' => $user_properties, - ); - - $contacts[] = $properties_data; - } - } - } - } - } - return $contacts; - } -} - diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooecommobject.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooecommobject.php deleted file mode 100644 index c8ccd476..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooecommobject.php +++ /dev/null @@ -1,169 +0,0 @@ -_object_id = $id; - - // load the object type in the class property. - $this->_object_type = $object_type; - - // store the instance of property callback. - $this->_callback_instance = new HubwooEcommPropertyCallbacks( $this->_object_id, $this->_object_type ); - - // prepare the modified fields data and store it in the object. - $this->prepare_modified_fields(); - } - - /** - * All properties for sync messages. - * - * @return array and key value pair array of properties. - * @since 1.0.0 - */ - public function get_object_properties() { - - // let others decide if they have modified fields in there integration. - $this->_properties = apply_filters( 'hubwoo_ecomm_' . $this->_object_type . '_modified_fields', $this->_properties, $this->_object_id ); - return $this->_properties; - } - - /** - * All properties for creation - * - * @return array and key value pair array of properties. - * @since 1.0.0 - */ - public function get_object_properties_for_creation() { - - $modified_fields = HubwooEcommProperties::get_instance()->hubwoo_ecomm_get_properties_for_object( $this->_object_type ); - - $properties = array(); - - if ( is_array( $modified_fields ) && count( $modified_fields ) ) { - - foreach ( $modified_fields as $single_field ) { - - $property_val = $this->_return_property_value( $single_field ); - - if ( ! empty( $property_val ) ) { - - $properties[] = array( - 'name' => $single_field, - 'value' => $property_val, - ); - } - } - } - - return $properties; - } - - /** - * Format modified fields of customer. - * - * Check for all the modified fields till the last update - * and prepare them in the hubspot api acceptable form. - * - * @since 1.0.0 - */ - private function prepare_modified_fields() { - - // need to update all fields, so lets get all the properties that we are working with. - $modified_fields = HubwooEcommProperties::get_instance()->hubwoo_ecomm_get_properties_for_object( $this->_object_type ); - - if ( is_array( $modified_fields ) && count( $modified_fields ) ) { - - foreach ( $modified_fields as $single_field ) { - - $property = $this->_return_property_value( $single_field ); - - if ( ! empty( $property ) ) { - - $this->_properties[ $single_field ] = $property; - } - } - } - } - - - /** - * Prepare property in the form of key value accepted by hubspot. - * - * @param array $property_name array of the property details to validate the value. - * @return string property value - */ - public function _return_property_value( $property_name ) { - - // if property name is not empty. - if ( ! empty( $property_name ) ) { - // get property value. - $property_val = $this->_callback_instance->_get_object_property_value( $property_name, $this->_object_id ); - return $property_val; - } - } -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooecommproperties.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooecommproperties.php deleted file mode 100644 index 2afed49f..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooecommproperties.php +++ /dev/null @@ -1,376 +0,0 @@ -objects = $this->_set( 'objects' ); - $this->properties = $this->_set( 'properties' ); - } - - /** - * Get groups/properties. - * - * @param string $option groups/properties. - * @return array Array of groups/properties information. - */ - public function _get( $option ) { - - if ( 'objects' === $option ) { - - return $this->objects; - } elseif ( 'properties' === $option ) { - - return $this->properties; - } - } - - /** - * Get an array of required option. - * - * @param String $option the identifier. - * @return Array An array of values. - * @since 1.0.0 - */ - private function _set( $option ) { - - $values = array(); - - if ( 'objects' === $option ) { - $values = array( 'CONTACT', 'PRODUCT', 'DEAL', 'LINE_ITEM' ); - } elseif ( 'properties' === $option ) { - $values = $this->hubwoo_ecomm_get_object_properties(); - } - - return apply_filters( 'hubwoo_ecomm_' . $option, $values ); - } - - - /** - * Get the required properties for an hubspot object for installation - * - * @return Array object properties - * @since 1.0.0 - */ - private function hubwoo_ecomm_get_object_properties() { - - $objects = $this->_get( 'objects' ); - - $ecomm_object_properties = array(); - - if ( is_array( $objects ) && count( $objects ) ) { - foreach ( $objects as $single_object ) { - $ecomm_object_properties[ $single_object ] = $this->hubwoo_ecomm_set_all_properties( $single_object ); - } - } - - return apply_filters( 'hubwoo_ecomm_bridge_object_properties', $ecomm_object_properties ); - } - - /** - * Get the required properties for sync messages to hubspot. - * - * @since 1.0.0 - * @param string $object type of object. - * @return Array object properties - */ - public function hubwoo_ecomm_get_properties_for_object( $object ) { - - $object_properties = array(); - - if ( ! empty( $object ) ) { - $properties = $this->hubwoo_ecomm_set_all_properties( $object ); - if ( is_array( $properties ) && count( $properties ) ) { - foreach ( $properties as $single_property ) { - if ( ! empty( $single_property['externalPropertyName'] ) ) { - $object_properties[] = $single_property['externalPropertyName']; - } - } - } - } - - return apply_filters( 'hubwoo_ecomm_bridge_' . $object . '_properties', $object_properties ); - } - - - /** - * Prepares all the properties for hubspot objects. - * - * @since 1.0.0 - * @param string $object_name object type. - * @return Array object properties - */ - public function hubwoo_ecomm_set_all_properties( $object_name ) { - - $object_properties = array(); - - if ( ! empty( $object_name ) ) { - - switch ( $object_name ) { - - case 'CONTACT': - $object_properties[] = array( - 'externalPropertyName' => 'email', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'email', - ); - $object_properties[] = array( - 'externalPropertyName' => 'firstname', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'firstname', - ); - $object_properties[] = array( - 'externalPropertyName' => 'lastname', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'lastname', - ); - $object_properties[] = array( - 'externalPropertyName' => 'company', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'company', - ); - $object_properties[] = array( - 'externalPropertyName' => 'phone', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'phone', - ); - $object_properties[] = array( - 'externalPropertyName' => 'mobilephone', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'mobilephone', - ); - $object_properties[] = array( - 'externalPropertyName' => 'address', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'address', - ); - $object_properties[] = array( - 'externalPropertyName' => 'city', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'city', - ); - $object_properties[] = array( - 'externalPropertyName' => 'state', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'state', - ); - $object_properties[] = array( - 'externalPropertyName' => 'country', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'country', - ); - $object_properties[] = array( - 'externalPropertyName' => 'zip', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'zip', - ); - - break; - - case 'PRODUCT': - $object_properties[] = array( - 'externalPropertyName' => 'name', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'name', - ); - $object_properties[] = array( - 'externalPropertyName' => 'hs_images', - 'dataType' => 'AVATAR_IMAGE', - 'hubspotPropertyName' => 'hs_images', - ); - $object_properties[] = array( - 'externalPropertyName' => 'price', - 'dataType' => 'NUMBER', - 'hubspotPropertyName' => 'price', - ); - $object_properties[] = array( - 'externalPropertyName' => 'pr_description', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'description', - ); - $object_properties[] = array( - 'externalPropertyName' => 'store_product_id', - 'dataType' => 'NUMBER', - 'hubspotPropertyName' => 'store_product_id', - ); - $object_properties[] = array( - 'externalPropertyName' => 'product_source_store', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'product_source_store', - ); - $object_properties[] = array( - 'externalPropertyName' => 'hs_sku', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'hs_sku', - ); - - break; - - case 'DEAL': - $object_properties[] = array( - 'externalPropertyName' => 'dealstage', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'dealstage', - ); - $object_properties[] = array( - 'externalPropertyName' => 'dealname', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'dealname', - ); - $object_properties[] = array( - 'externalPropertyName' => 'closedate', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'closedate', - ); - $object_properties[] = array( - 'externalPropertyName' => 'createdate', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'createdate', - ); - $object_properties[] = array( - 'externalPropertyName' => 'amount', - 'dataType' => 'NUMBER', - 'hubspotPropertyName' => 'amount', - ); - $object_properties[] = array( - 'externalPropertyName' => 'discount_amount', - 'dataType' => 'NUMBER', - 'hubspotPropertyName' => 'discount_amount', - ); - $object_properties[] = array( - 'externalPropertyName' => 'order_number', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'order_number', - ); - $object_properties[] = array( - 'externalPropertyName' => 'shipment_ids', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'shipment_ids', - ); - $object_properties[] = array( - 'externalPropertyName' => 'tax_amount', - 'dataType' => 'NUMBER', - 'hubspotPropertyName' => 'tax_amount', - ); - $object_properties[] = array( - 'externalPropertyName' => 'description', - 'dataType' => 'NUMBER', - 'hubspotPropertyName' => 'description', - ); - - break; - - case 'LINE_ITEM': - $object_properties[] = array( - 'externalPropertyName' => 'discount_amount', - 'dataType' => 'NUMBER', - 'hubspotPropertyName' => 'discount', - ); - $object_properties[] = array( - 'externalPropertyName' => 'quantity', - 'dataType' => 'NUMBER', - 'hubspotPropertyName' => 'quantity', - ); - $object_properties[] = array( - 'externalPropertyName' => 'name', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'name', - ); - $object_properties[] = array( - 'externalPropertyName' => 'price', - 'dataType' => 'NUMBER', - 'hubspotPropertyName' => 'price', - ); - $object_properties[] = array( - 'externalPropertyName' => 'sku', - 'dataType' => 'STRING', - 'hubspotPropertyName' => 'description', - ); - $object_properties[] = array( - 'externalPropertyName' => 'amount', - 'dataType' => 'NUMBER', - 'hubspotPropertyName' => 'amount', - ); - $object_properties[] = array( - 'externalPropertyName' => 'tax_amount', - 'dataType' => 'NUMBER', - 'hubspotPropertyName' => 'tax', - ); - - break; - } - } - - return $object_properties; - } -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooecommpropertycallbacks.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooecommpropertycallbacks.php deleted file mode 100644 index d66f4c27..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooecommpropertycallbacks.php +++ /dev/null @@ -1,458 +0,0 @@ - 'hubwoo_get_user_mail', - 'firstname' => 'hubwoo_get_user_meta', - 'lastname' => 'hubwoo_get_user_meta', - 'address' => 'hubwoo_get_user_meta', - 'company' => 'hubwoo_get_user_meta', - 'city' => 'hubwoo_get_user_meta', - 'state' => 'hubwoo_get_user_meta', - 'zip' => 'hubwoo_get_user_meta', - 'country' => 'hubwoo_get_user_meta', - 'phone' => 'hubwoo_get_user_meta', - 'mobilephone' => 'hubwoo_get_user_meta', - - 'name' => 'hubwoo_ecomm_product_info', - 'hs_images' => 'hubwoo_ecomm_product_info', - 'price' => 'hubwoo_ecomm_product_info', - 'pr_description' => 'hubwoo_ecomm_product_info', - 'product_source_store' => 'hubwoo_ecomm_product_info', - 'store_product_id' => 'hubwoo_ecomm_product_info', - 'hs_sku' => 'hubwoo_ecomm_product_info', - - 'dealstage' => 'hubwoo_ecomm_deal_info', - 'dealname' => 'hubwoo_ecomm_deal_info', - 'closedate' => 'hubwoo_ecomm_deal_info', - 'amount' => 'hubwoo_ecomm_deal_info', - 'order_abandoned_cart_url' => 'hubwoo_ecomm_deal_info', - 'discount_amount' => 'hubwoo_ecomm_deal_info', - 'order_number' => 'hubwoo_ecomm_deal_info', - 'shipment_ids' => 'hubwoo_ecomm_deal_info', - 'tax_amount' => 'hubwoo_ecomm_deal_info', - 'createdate' => 'hubwoo_ecomm_deal_info', - 'description' => 'hubwoo_ecomm_deal_info', - ); - - /** - * Constructor - * - * @param int $object_id object id to get property values of. - * @param string $object_type object type to get property values of. - */ - public function __construct( $object_id, $object_type ) { - - $this->_object_id = $object_id; - $this->_object = $object_type; - } - - /** - * Property value. - * - * @param string $property_name name of the object property. - * @since 1.0.0 - */ - public function _get_object_property_value( $property_name ) { - - $value = ''; - - if ( ! empty( $property_name ) ) { - // get the callback. - $callback_function = $this->_get_property_callback( $property_name ); - - if ( ! empty( $callback_function ) ) { - - // get the value by calling respective callback. - $value = $this->$callback_function( $property_name ); - } - } - - $value = apply_filters( 'hubwoo-ecomm_contact_property_value', $value, $property_name, $this->_object_id, $this->_object ); - - return $value; - } - - /** - * Filter the property callback to get value of. - * - * @param strig $property_name name of the property. - * @return string/false callback function name or false. - */ - private function _get_property_callback( $property_name ) { - // check if the property name exists in the array. - if ( array_key_exists( $property_name, $this->_property_callbacks ) ) { - // if exists then get the callback name. - $callback = $this->_property_callbacks[ $property_name ]; - - return $callback; - } - - return false; - } - - /** - * User email - * - * @since 1.0.0 - */ - public function hubwoo_get_user_mail() { - // get it from user object. - $user = get_user_by( 'id', $this->_object_id ); - return $user->data->user_email; - } - - /** - * Get customer meta - * - * @param string $key meta key. - * @return string customer meta detail. - * @since 1.0.0 - */ - public function hubwoo_get_user_meta( $key ) { - - $value = ''; - - switch ( $key ) { - - case 'firstname': - $value = get_user_meta( $this->_object_id, 'first_name', true ); - break; - - case 'lastname': - $value = get_user_meta( $this->_object_id, 'last_name', true ); - break; - - case 'company': - $value = get_user_meta( $this->_object_id, 'billing_company', true ); - break; - - case 'city': - $value = get_user_meta( $this->_object_id, 'billing_city', true ); - break; - - case 'state': - $value = get_user_meta( $this->_object_id, 'billing_state', true ); - break; - - case 'country': - $value = get_user_meta( $this->_object_id, 'billing_country', true ); - break; - - case 'address': - $address1 = get_user_meta( $this->_object_id, 'billing_address_1', true ); - $address2 = get_user_meta( $this->_object_id, 'billing_address_2', true ); - $address = ''; - if ( ! empty( $address1 ) || ! empty( $address2 ) ) { - $address = $address1 . ' ' . $address2; - } - $value = $address; - break; - - case 'zip': - $value = get_user_meta( $this->_object_id, 'billing_postcode', true ); - break; - - case 'mobilephone': - case 'phone': - $value = get_user_meta( $this->_object_id, 'billing_phone', true ); - break; - } - return $value; - } - - /** - * Create user date. - * - * @since 1.0.0 - * @return string user registered date - */ - public function hubwoo_create_date() { - - $create_date = ''; - $customer = new WP_User( $this->_object_id ); - $account_creation = isset( $customer->data->user_registered ) ? $customer->data->user_registered : ''; - if ( ! empty( $account_creation ) ) { - $account_creation = strtotime( $account_creation ); - } - if ( ! empty( $account_creation ) ) { - $create_date = HubwooObjectProperties::get_instance()->hubwoo_set_utc_midnight( $account_creation ); - } - return $create_date; - } - - /** - * Get contact lifecycle stage - * - * @return string customer lifecycle stage - * @since 1.0.0 - */ - public function hubwoo_contact_stage() { - - $stage = ''; - - $orders_count = 0; - - //hpos changes - $query = new WC_Order_Query(array( - 'posts_per_page' => -1, - 'post_status' => array_keys( wc_get_order_statuses() ), - 'order' => 'desc', - 'post_parent' => 0, - 'customer_id' => $this->_object_id, - )); - - $customer_orders = $query->get_orders(); - - if ( is_array( $customer_orders ) && count( $customer_orders ) ) { - - $orders_count = count( $customer_orders ); - } - - if ( $orders_count > 0 ) { - - $stage = 'customer'; - } else { - - $stage = 'lead'; - } - - return $stage; - } - - /** - * Callback for products objects - * - * @param string $key meta key. - * @return string product properties - * @since 1.0.0 - */ - public function hubwoo_ecomm_product_info( $key ) { - - $product = wc_get_product( $this->_object_id ); - - $value = ''; - - if ( ! empty( $product ) && ! is_wp_error( $product ) ) { - - switch ( $key ) { - - case 'name': - $value = HubwooObjectProperties::hubwoo_ecomm_product_name( $product ); - break; - - case 'hs_images': - $attachment_src = wp_get_attachment_image_src( get_post_thumbnail_id( $this->_object_id ), 'single-post-thumbnail' ); - $image_url = isset( $attachment_src[0] ) ? $attachment_src[0] : wc_placeholder_img_src(); - $value = $image_url; - break; - - case 'price': - $value = $product->get_price(); - break; - - case 'pr_description': - $value = $product->get_short_description(); - break; - - case 'store_product_id': - $value = $this->_object_id; - break; - - case 'product_source_store': - $value = get_bloginfo( 'name' ); - break; - - case 'hs_sku': - $value = $product->get_sku(); - break; - } - } - - return $value; - } - - /** - * Callback for deal objects. - * - * @since 1.0.0 - * @param string $key meta key. - * @return string object properties - */ - public function hubwoo_ecomm_deal_info( $key ) { - - $order = wc_get_order( $this->_object_id ); - - $value = ''; - - if ( $order instanceof WC_Order ) { - $status = $order->get_status(); - $deal_name = '#' . $order->get_order_number(); - $order_date = get_post_time( 'U', true, $this->_object_id ); - - $create_date = $order_date; - - $user_info['first_name'] = $order->get_billing_first_name(); - $user_info['last_name'] = $order->get_billing_last_name(); - - foreach ( $user_info as $value ) { - if ( ! empty( $value ) ) { - $deal_name .= ' ' . $value; - } - } - $deal_stage = self::hubwoo_get_valid_deal_stage( 'wc-' . $status ); - - if ( ! in_array( $deal_stage, self::hubwoo_ecomm_won_stages() ) ) { - - $order_date = get_post_time( 'U', true, $this->_object_id ) + ( get_option( 'hubwoo_ecomm_closedate_days', 1 ) * 24 * 60 * 60 ); - } - - if ( ! empty( $order ) && ! is_wp_error( $order ) ) { - - switch ( $key ) { - - case 'dealstage': - $value = $deal_stage; - break; - - case 'dealname': - $value = $deal_name; - break; - - case 'closedate': - $value = HubwooObjectProperties::get_instance()->hubwoo_set_utc_midnight( $order_date ); - break; - - case 'createdate': - $value = HubwooObjectProperties::get_instance()->hubwoo_set_utc_midnight( $create_date ); - break; - - case 'amount': - $value = $order->get_total(); - break; - - case 'order_abandoned_cart_url': - $value = $order->get_checkout_payment_url(); - break; - - case 'discount_amount': - $value = $order->get_discount_total(); - break; - - case 'order_number': - $value = $order->get_order_number(); - break; - - case 'shipment_ids': - $value = $order->get_shipping_method(); - break; - - case 'tax_amount': - $value = $order->get_total_tax(); - break; - - case 'description': - $value = $order->get_customer_note(); - break; - } - } - } - - return $value; - } - - /** - * Format an array in hubspot accepted enumeration value. - * - * @param array $properties Array of values. - * @return string formatted string. - * @since 1.0.0 - */ - public static function hubwoo_ecomm_format_array( $properties ) { - - if ( is_array( $properties ) ) { - - $properties = array_unique( $properties ); - $properties = implode( ',', $properties ); - } - - return $properties; - } - - /** - * Return a valid deal stage for the order status - * - * @since 1.0.0 - * @param string $order_key order status key. - * @return string hubspot deal stage - */ - public static function hubwoo_get_valid_deal_stage( $order_key ) { - - $saved_mappings = get_option( 'hubwoo_ecomm_final_mapping', array() ); - $key = array_search( $order_key, array_column( $saved_mappings, 'status' ) ); - return false === $key ? 'checkout_completed' : $saved_mappings[ $key ]['deal_stage']; - } - - /** - * Returns won deal stages. - * - * @since 1.0.0 - * @return array won deal stages - */ - public static function hubwoo_ecomm_won_stages() { - - $won_stages = get_option( 'hubwoo_ecomm_won_stages', array() ); - - if ( empty( $won_stages ) ) { - - $won_stages = array( 'processed', 'shipped' ); - } - - return $won_stages; - } -} - diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooerrorhandling.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooerrorhandling.php deleted file mode 100644 index 7a123bed..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooerrorhandling.php +++ /dev/null @@ -1,157 +0,0 @@ -hubwoo_handle_workflow( $response, $additional_args ); - case HubwooConst::CHECKOUTFORM: - return $this->hubwoo_handle_form( $response, $additional_args ); - default: - return; - } - } - - /** - * Handling errors in Forms. - * - * @since 1.0.4 - * @param array $response response from HubSpot. - * @param array $additional_args any additional args. - */ - public function hubwoo_handle_form( $response, $additional_args ) { - - switch ( $response['status_code'] ) { - case 409: - $res = HubWooConnectionMananager::get_instance()->hubwoo_get_all_forms(); - if ( 200 == $res['status_code'] ) { - $res = json_decode( $res['body'], true ); - if ( ! empty( $res ) ) { - foreach ( $res as $form_value ) { - if ( HubwooConst::CHECKOUTFORMNAME == $form_value['name'] ) { - update_option( 'hubwoo_checkout_form_created', 'yes' ); - update_option( 'hubwoo_checkout_form_id', $form_value['guid'] ); - break; - } - } - } - } - break; - default: - return; - } - } - - /** - * Handling errors in Workflows. - * - * @since 1.0.4 - * @param array $response response from HubSpot. - * @param array $additional_args any additional args. - */ - public function hubwoo_handle_workflow( $response, $additional_args ) { - - if ( array_key_exists( 'current_workflow', $additional_args ) && ! empty( $additional_args['current_workflow'] ) ) { - - $properties = array(); - - $current_workflow = $additional_args['current_workflow']; - - switch ( $response['status_code'] ) { - case 500: - foreach ( $current_workflow['actions'] as $action ) { - if ( array_key_exists( 'propertyName', $action ) ) { - $properties[] = $action['propertyName']; - } - } - if ( ! empty( $properties ) ) { - $all_properties = HubWooContactProperties::get_instance()->_get( 'properties', '', true ); - foreach ( $properties as $property ) { - - $response = HubWooConnectionMananager::get_instance()->hubwoo_read_object_property( 'contact', $property ); - if ( 404 == $response['status_code'] ) { - $this->hubwoo_prepare_single_property( $all_properties, $property ); - } - } - return HubWooConnectionMananager::get_instance()->create_workflow( $current_workflow ); - } - break; - default: - return; - } - } - } - - /** - * Read and create property in HubSpot. - * - * @since 1.0.4 - * @param array $all_properties all properties. - * @param string $property current property to be checked. - */ - public function hubwoo_prepare_single_property( $all_properties, $property ) { - $property_details = array(); - foreach ( $all_properties as $group_name => $group_properties ) { - foreach ( $group_properties as $group_property ) { - if ( $property == $group_property['name'] ) { - $property_details = $group_property; - $property_details['groupName'] = $group_name; - HubWooConnectionMananager::get_instance()->create_property( $property_details, 'contacts' ); - } - } - } - } - -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooguestordersmanager.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooguestordersmanager.php deleted file mode 100644 index 30a622a2..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooguestordersmanager.php +++ /dev/null @@ -1,837 +0,0 @@ -_order_id = $order_id; - } - - /** - * Get customer shopping cart details from order meta. - * - * @return string order meta detail. - * @param int $order_id id of the order. - * @param string $property_name name of the property. - * @since 1.0.0 - */ - public static function get_order_meta( $order_id, $property_name ) { - //hpos changes - $order = wc_get_order( $order_id ); - - return $order->get_meta($property_name, true); - } - - /** - * Guest customer details. - * - * @param int $order_id id of the order. - * @param string $email email of the user. - * @return array full of HubSpot contact properties and values - * @since 1.0.0 - */ - public static function get_order_related_properties( $order_id, $email ) { - - $guest_user_properties = array(); - - $order = wc_get_order($order_id); - - $billing_country = $order->get_billing_country(); - $billing_state = $order->get_billing_state(); - $shipping_state = $order->get_shipping_state(); - $shipping_country = $order->get_shipping_country(); - - $guest_user_properties[] = array( - 'property' => 'shipping_address_line_1', - 'value' => $order->get_shipping_address_1(), - ); - - $guest_user_properties[] = array( - 'property' => 'shipping_address_line_2', - 'value' => $order->get_shipping_address_2(), - ); - - $guest_user_properties[] = array( - 'property' => 'shipping_city', - 'value' => $order->get_shipping_city(), - ); - - $guest_user_properties[] = array( - 'property' => 'shipping_country', - 'value' => Hubwoo::map_country_by_abbr( $shipping_country ), - ); - - $guest_user_properties[] = array( - 'property' => 'shipping_state', - 'value' => Hubwoo::map_state_by_abbr( $shipping_state, $shipping_country ), - ); - - $guest_user_properties[] = array( - 'property' => 'shipping_postal_code', - 'value' => $order->get_shipping_postcode(), - ); - - $guest_user_properties[] = array( - 'property' => 'billing_address_line_1', - 'value' => $order->get_billing_address_1(), - ); - - $guest_user_properties[] = array( - 'property' => 'billing_address_line_2', - 'value' => $order->get_billing_address_2(), - ); - - $guest_user_properties[] = array( - 'property' => 'billing_city', - 'value' => $order->get_billing_city(), - ); - - $guest_user_properties[] = array( - 'property' => 'billing_country', - 'value' => Hubwoo::map_country_by_abbr( $billing_country ), - ); - - $guest_user_properties[] = array( - 'property' => 'billing_state', - 'value' => Hubwoo::map_state_by_abbr( $billing_state, $billing_country ), - ); - - $guest_user_properties[] = array( - 'property' => 'billing_postal_code', - 'value' => $order->get_billing_postcode(), - ); - - $categories_bought = array(); - $skus_bought = array(); - $product_types_bought = array(); - $last_3_products_ids = array(); - $last_products_bought = array(); - $last_order_date = 0; - $last_products_bought_html = array(); - $days_differences = array(); - $last_type_bought = ''; - $first_date = 0; - $last_date = 0; - $average_days = array(); - $products_bought = array(); - $last_product_bought = ''; - $total_value_of_orders = 0; - $total_number_of_orders = 0; - $total_number_of_current_orders = 0; - $last_order_for_html = 0; - $last_order_id = 0; - - $order_statuses = get_option( 'hubwoo-selected-order-status', array() ); - - if ( empty( $order_statuses ) ) { - - $order_statuses = array_keys( wc_get_order_statuses() ); - } - - //hpos changes - if( Hubwoo::hubwoo_check_hpos_active() ) { - $query = new WC_Order_Query(array( - 'posts_per_page' => -1, - 'post_status' => $order_statuses, - 'orderby' => 'date', - 'order' => 'desc', - 'return' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'customer' => $email, - )); - - $customer_orders = $query->get_orders(); - - } else { - $query = new WP_Query(); - - $customer_orders = $query->query( - array( - 'post_type' => 'shop_order', - 'posts_per_page' => -1, - 'post_status' => $order_statuses, - 'orderby' => 'date', - 'order' => 'desc', - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'meta_query' => array( - array( - 'key' => '_billing_email', - 'value' => $email, - ), - ), - ) - ); - } - - $guest_user_properties[] = array( - 'property' => 'customer_group', - 'value' => 'guest', - ); - - $last_order = ! empty( $customer_orders ) && is_array( $customer_orders ) ? $customer_orders[0] : ''; - $last_order_object = wc_get_order($last_order); - $order_tracking_number = $last_order_object->get_meta('_wc_shipment_tracking_items', true); - if ( ! empty( $order_tracking_number ) ) { - - $shipment_data = $order_tracking_number[0]; - - if ( ! empty( $shipment_data['date_shipped'] ) ) { - $guest_user_properties[] = array( - 'property' => 'last_order_shipment_date', - 'value' => self::hubwoo_set_utc_midnight( $shipment_data['date_shipped'] ), - ); - } - if ( ! empty( $shipment_data['tracking_number'] ) ) { - $guest_user_properties[] = array( - 'property' => 'last_order_tracking_number', - 'value' => $shipment_data['tracking_number'], - ); - } - if ( ! empty( $shipment_data['custom_tracking_link'] ) ) { - $guest_user_properties[] = array( - 'property' => 'last_order_tracking_url', - 'value' => $shipment_data['custom_tracking_link'], - ); - } - } - - $optin = $order->get_meta('hubwoo_checkout_marketing_optin', true); - $optin_sources = array(); - if ( ! empty( $optin ) && 'yes' == $optin ) { - $optin_sources[] = 'checkout'; - } else { - $optin = 'no'; - } - - $property_updated = get_option( 'hubwoo_newsletter_property_update', 'no' ); - - if ( ! empty( $property_updated ) && 'yes' == $property_updated ) { - if ( 'yes' == $optin ) { - $optin = true; - } else { - $optin = false; - } - } - - $guest_user_properties[] = array( - 'property' => 'newsletter_subscription', - 'value' => $optin, - ); - $guest_user_properties[] = array( - 'property' => 'marketing_newsletter', - 'value' => self::hubwoo_format_array( $optin_sources ), - ); - - // if customer have orders. - if ( is_array( $customer_orders ) && count( $customer_orders ) ) { - - // total number of customer orders. - $total_number_of_orders = count( $customer_orders ); - - $guest_user_properties[] = array( - 'property' => 'total_number_of_orders', - 'value' => count( $customer_orders ), - ); - - $order_frequency = count( $customer_orders ); - - $counter = 0; - - $products_count = 0; - - foreach ( $customer_orders as $order_id ) { - - // if order id not found let's check for another order. - if ( ! $order_id ) { - continue; - } - - // order date. - $order_date = get_post_time( 'U', false, $order_id ); - - $last_date = $order_date; - - if ( 0 == $first_date ) { - $first_date = $last_date; - } - - $average_days[] = self::hubwoo_get_average_days( $first_date, $last_date ); - - $first_date = $last_date; - - // get order. - $order = new WC_Order( $order_id ); - - // check for WP_Error object. - if ( empty( $order ) || is_wp_error( $order ) ) { - continue; - } - - $order_status = $order->get_status(); - - if ( 'failed' !== $order_status && 'cancelled' !== $order_status ) { - - $last_order_for_html ++; - - $order_items = $order->get_items(); - - // check if order has items. - if ( is_array( $order_items ) && count( $order_items ) ) { - - // let's loop each order item to get the details. - foreach ( $order_items as $item_id_1 => $wc_order_item_product ) { - - if ( ! empty( $wc_order_item_product ) && $wc_order_item_product instanceof WC_Order_Item ) { - - $item_id = $wc_order_item_product->get_product_id(); - $parent_item_sku = get_post_meta( $item_id, '_sku', true ); - $item_var_id = $wc_order_item_product->get_variation_id(); - - if ( get_post_status( $item_id ) == 'trash' || get_post_status( $item_id ) == false ) { - - continue; - } - - $product_cats_ids = wc_get_product_term_ids( $item_id, 'product_cat' ); - - if ( is_array( $product_cats_ids ) && count( $product_cats_ids ) ) { - - foreach ( $product_cats_ids as $cat_id ) { - - $term = get_term_by( 'id', $cat_id, 'product_cat' ); - $categories_bought[] = $term->slug; - } - } - - if ( $item_var_id ) { - - $item_id = $item_var_id; - } - - $products_count += $wc_order_item_product->get_quantity(); - - $item_sku = get_post_meta( $item_id, '_sku', true ); - - if ( empty( $item_sku ) || '' == $item_sku ) { - - $item_sku = $parent_item_sku; - } - - if ( empty( $item_sku ) || '' == $item_sku ) { - - $item_sku = $item_id; - } - - $skus_bought[] = $item_sku; - - $post = get_post( $item_id ); - - $product_uni_name = isset( $post->post_name ) ? $post->post_name : ''; - - if ( ! empty( $product_uni_name ) ) { - - $products_bought[] = $product_uni_name . '-' . $item_id; - $last_product_bought = $product_uni_name . '-' . $item_id; - $last_products_bought[] = $product_uni_name . '-' . $item_id; - } - - $product = $wc_order_item_product->get_product(); - - if ( $product instanceof WC_Product ) { - - $product_type = $product->get_type(); - } else { - - $product_type = ''; - } - - if ( 'variation' == $product_type ) { - $product_type = 'variable'; - } - - if ( 'subscription_variation' == $product_type ) { - $product_type = 'variable-subscription'; - } - - if ( ! empty( $product_type ) ) { - - $product_types_bought[] = $product_type; - } - - if ( count( $last_3_products_ids ) < 3 ) { - - $last_3_products_ids[] = $item_id; - } - - if ( 1 == $last_order_for_html ) { - - $last_order_id = $order_id; - } - } - } - } - } - - $order_total = $order->get_total(); - - $total_value_of_orders += floatval( $order_total ); - - if ( 'failed' !== $order_status && 'cancelled' !== $order_status && 'refunded' !== $order_status && 'completed' !== $order_status ) { - - $total_number_of_current_orders ++; - } - - // check for last order and finish all last order calculations. - if ( ! $counter ) { - - // last order date. - $guest_user_properties[] = array( - 'property' => 'last_order_date', - 'value' => self::hubwoo_set_utc_midnight( get_post_time( 'U', false, $order_id ) ), - ); - - $last_order_date = get_post_time( 'U', false, $order_id ); - - $guest_user_properties[] = array( - 'property' => 'last_order_value', - 'value' => $order_total, - ); - - $guest_user_properties[] = array( - 'property' => 'last_order_order_number', - 'value' => $order_id, - ); - - $guest_user_properties[] = array( - 'property' => 'last_order_fulfillment_status', - 'value' => 'wc-' . $order->get_status(), - ); - - $guest_user_properties[] = array( - 'property' => 'last_order_status', - 'value' => 'wc-' . $order->get_status(), - ); - - $guest_user_properties[] = array( - 'property' => 'last_order_currency', - 'value' => $order->get_currency(), - ); - - $guest_user_properties[] = array( - 'property' => 'last_product_bought', - 'value' => self::hubwoo_format_array( $last_product_bought ), - ); - - $guest_user_properties[] = array( - 'property' => 'last_products_bought', - 'value' => self::hubwoo_format_array( $last_products_bought ), - ); - - $guest_user_properties[] = array( - 'property' => 'last_skus_bought', - 'value' => self::hubwoo_format_array( $skus_bought ), - ); - - $guest_user_properties[] = array( - 'property' => 'last_categories_bought', - 'value' => self::hubwoo_format_array( $categories_bought ), - ); - - $guest_user_properties[] = array( - 'property' => 'last_product_types_bought', - 'value' => self::hubwoo_format_array( $product_types_bought ), - ); - - $guest_user_properties[] = array( - 'property' => 'last_total_number_of_products_bought', - 'value' => $products_count, - ); - - $guest_user_properties[] = array( - 'property' => 'last_products_bought_html', - 'value' => HubWooContactProperties::get_instance()->hubwoo_last_order_html( $last_order_id ), - ); - - } - - // check for first order. - if ( ( count( $customer_orders ) - 1 ) == $counter ) { - - // first order based calculation here.. - $guest_user_properties[] = array( - 'property' => 'first_order_date', - 'value' => self::hubwoo_set_utc_midnight( get_post_time( 'U', false, $order_id ) ), - ); - $guest_user_properties[] = array( - 'property' => 'first_order_value', - 'value' => $order_total, - ); - } - - $counter++; - } - - // rest calculations here. - $guest_user_properties[] = array( - 'property' => 'average_order_value', - 'value' => floatval( $total_value_of_orders / $total_number_of_orders ), - ); - - $guest_user_properties[] = array( - 'property' => 'total_number_of_current_orders', - 'value' => $total_number_of_current_orders, - ); - - $guest_user_properties[] = array( - 'property' => 'total_value_of_orders', - 'value' => $total_value_of_orders, - ); - - $guest_user_properties[] = array( - 'property' => 'average_days_between_orders', - 'value' => floatval( array_sum( $average_days ) / $total_number_of_orders ), - ); - - $guest_user_properties[] = array( - 'property' => 'skus_bought', - 'value' => self::hubwoo_format_array( $skus_bought ), - ); - - $guest_user_properties[] = array( - 'property' => 'categories_bought', - 'value' => self::hubwoo_format_array( $categories_bought ), - ); - - $guest_user_properties[] = array( - 'property' => 'product_types_bought', - 'value' => self::hubwoo_format_array( $product_types_bought ), - ); - - $guest_user_properties[] = array( - 'property' => 'products_bought', - 'value' => self::hubwoo_format_array( $products_bought ), - ); - - $guest_user_properties[] = array( - 'property' => 'total_number_of_products_bought', - 'value' => $products_count, - ); - - if ( is_array( $last_3_products_ids ) && count( $last_3_products_ids ) ) { - - $counter = 1; - - foreach ( $last_3_products_ids as $last_3_product_id ) { - - $_product = wc_get_product( $last_3_product_id ); - - if ( $_product instanceof WC_Product ) { - - $image_url = ''; - - $guest_user_properties[] = array( - 'property' => 'last_products_bought_product_' . $counter . '_name', - 'value' => $_product->get_title(), - ); - - $attachment_src = wp_get_attachment_image_src( get_post_thumbnail_id( $last_3_product_id ), 'single-post-thumbnail' ); - - if ( empty( $attachment_src[0] ) ) { - - $parent_id = $_product->get_parent_id(); - $attachment_src = wp_get_attachment_image_src( get_post_thumbnail_id( $parent_id ), 'single-post-thumbnail' ); - } - - if ( ! empty( $attachment_src[0] ) ) { - $image_url = $attachment_src[0]; - } - - $guest_user_properties[] = array( - 'property' => 'last_products_bought_product_' . $counter . '_image_url', - 'value' => $image_url, - ); - - $guest_user_properties[] = array( - 'property' => 'last_products_bought_product_' . $counter . '_price', - 'value' => $_product->get_price(), - ); - - $guest_user_properties[] = array( - 'property' => 'last_products_bought_product_' . $counter . '_url', - 'value' => get_permalink( $last_3_product_id ), - ); - - $counter++; - } - } - } - - $hubwoo_rfm_at_5 = get_option( - 'hubwoo_rfm_5', - array( - 0 => 30, - 1 => 20, - 2 => 1000, - ) - ); - - $hubwoo_from_rfm_4 = get_option( - 'hubwoo_from_rfm_4', - array( - 0 => 31, - 1 => 10, - 2 => 750, - ) - ); - - $hubwoo_to_rfm_4 = get_option( - 'hubwoo_to_rfm_4', - array( - 0 => 90, - 1 => 20, - 2 => 1000, - ) - ); - - $hubwoo_from_rfm_3 = get_option( - 'hubwoo_from_rfm_3', - array( - 0 => 91, - 1 => 5, - 2 => 500, - ) - ); - - $hubwoo_to_rfm_3 = get_option( - 'hubwoo_to_rfm_3', - array( - 0 => 180, - 1 => 10, - 2 => 750, - ) - ); - - $hubwoo_from_rfm_2 = get_option( - 'hubwoo_from_rfm_2', - array( - 0 => 181, - 1 => 2, - 2 => 250, - ) - ); - - $hubwoo_to_rfm_2 = get_option( - 'hubwoo_to_rfm_2', - array( - 0 => 365, - 1 => 5, - 2 => 500, - ) - ); - - $hubwoo_rfm_at_1 = get_option( - 'hubwoo_rfm_1', - array( - 0 => 365, - 1 => 2, - 2 => 250, - ) - ); - - $order_monetary = $total_value_of_orders; - - $current_date = gmdate( 'Y-m-d H:i:s', time() ); - $current_date = new DateTime( $current_date ); - $last_order_date = gmdate( 'Y-m-d H:i:s', $last_order_date ); - $last_order_date = new DateTime( $last_order_date ); - $order_recency = date_diff( $current_date, $last_order_date, true ); - - $order_recency = $order_recency->days; - $monetary_rating = 1; - $order_recency_rating = 1; - $order_frequency_rating = 1; - - if ( $order_recency <= $hubwoo_rfm_at_5[0] ) { - $order_recency_rating = 5; - } elseif ( $order_recency >= $hubwoo_from_rfm_4[0] && $order_recency <= $hubwoo_to_rfm_4[0] ) { - $order_recency_rating = 4; - } elseif ( $order_recency >= $hubwoo_from_rfm_3[0] && $order_recency <= $hubwoo_to_rfm_3[0] ) { - $order_recency_rating = 3; - } elseif ( $order_recency >= $hubwoo_from_rfm_2[0] && $order_recency <= $hubwoo_to_rfm_2[0] ) { - $order_recency_rating = 2; - } else { - $order_recency_rating = 1; - } - - $guest_user_properties[] = array( - 'property' => 'order_recency_rating', - 'value' => $order_recency_rating, - ); - - if ( $order_frequency > $hubwoo_rfm_at_5[1] ) { - $order_frequency_rating = 5; - } elseif ( $order_frequency >= $hubwoo_from_rfm_4[1] && $order_frequency < $hubwoo_to_rfm_4[1] ) { - $order_frequency_rating = 4; - } elseif ( $order_frequency >= $hubwoo_from_rfm_3[1] && $order_frequency < $hubwoo_to_rfm_3[1] ) { - $order_frequency_rating = 3; - } elseif ( $order_frequency >= $hubwoo_from_rfm_2[1] && $order_frequency < $hubwoo_to_rfm_2[1] ) { - $order_frequency_rating = 2; - } else { - $order_frequency_rating = 1; - } - - $guest_user_properties[] = array( - 'property' => 'order_frequency_rating', - 'value' => $order_frequency_rating, - ); - - if ( $order_monetary > $hubwoo_rfm_at_5[2] ) { - $monetary_rating = 5; - } elseif ( $order_monetary >= $hubwoo_from_rfm_4[2] && $order_monetary < $hubwoo_to_rfm_4[2] ) { - $monetary_rating = 4; - } elseif ( $order_monetary >= $hubwoo_from_rfm_3[2] && $order_monetary < $hubwoo_to_rfm_3[2] ) { - $monetary_rating = 3; - } elseif ( $order_monetary >= $hubwoo_from_rfm_2[2] && $order_monetary < $hubwoo_to_rfm_2[2] ) { - $monetary_rating = 2; - } else { - $monetary_rating = 1; - } - - $guest_user_properties[] = array( - 'property' => 'monetary_rating', - 'value' => $monetary_rating, - ); - } else { - - $guest_user_properties[] = array( - 'property' => 'total_number_of_orders', - 'value' => $total_number_of_orders, - ); - $guest_user_properties[] = array( - 'property' => 'total_number_of_products_bought', - 'value' => 0, - ); - $guest_user_properties[] = array( - 'property' => 'total_number_of_current_orders', - 'value' => $total_number_of_current_orders, - ); - $guest_user_properties[] = array( - 'property' => 'total_value_of_orders', - 'value' => $total_value_of_orders, - ); - $guest_user_properties[] = array( - 'property' => 'last_total_number_of_products_bought', - 'value' => 0, - ); - - $guest_user_properties[] = array( - 'property' => 'monetary_rating', - 'value' => 1, - ); - $guest_user_properties[] = array( - 'property' => 'order_frequency_rating', - 'value' => 1, - ); - $guest_user_properties[] = array( - 'property' => 'order_recency_rating', - 'value' => 1, - ); - } - - return $guest_user_properties; - } - - /** - * Format an array in hubspot accepted enumeration value. - * - * @param array $properties Array of values. - * @return string formatted string. - * @since 1.0.0 - */ - public static function hubwoo_format_array( $properties ) { - - if ( is_array( $properties ) ) { - - $properties = array_unique( $properties ); - - $properties = implode( ';', $properties ); - } - - return $properties; - } - - /** - * Convert unix timestamp to hubwoo formatted midnight time. - * - * @param int $unix_timestamp timestamp for date. - * @param bool $for_deals true/false. - * @return Unix midnight timestamp. - * @since 1.0.0 - */ - public static function hubwoo_set_utc_midnight( $unix_timestamp, $for_deals = false ) { - $string = gmdate( 'Y-m-d H:i:s', $unix_timestamp ); - $date = new DateTime( $string ); - - if ( $for_deals ) { - - $wptimezone = get_option( 'timezone_string', '' ); - if ( empty( $wptimezone ) ) { - $wptimezone = 'UTC'; - } - $timezone = new DateTimeZone( $wptimezone ); - //phpcs:disable - $date->setTimezone( $timezone ); - //phpcs:enable - } else { - $wptimezone = 'UTC'; - $timezone = new DateTimeZone( $wptimezone ); - $date->setTimezone( $timezone ); - $date->modify( 'midnight' ); - } - return $date->getTimestamp() * 1000; - } - - /** - * Return days between two dates. - * - * @param int $first_date first order date. - * @param int $last_date last order date. - * @return int $datediff date differences. - * @since 1.0.0 - */ - public static function hubwoo_get_average_days( $first_date, $last_date ) { - - $now = $first_date; - $your_date = $last_date; - $datediff = $now - $your_date; - return floor( $datediff / ( 60 * 60 * 24 ) ); - } -} - diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooobjectproperties.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooobjectproperties.php deleted file mode 100644 index 9b42e9b7..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwooobjectproperties.php +++ /dev/null @@ -1,572 +0,0 @@ -get_object_properties(); - $contact_properties = apply_filters( 'hubwoo_map_ecomm_' . $object_type . '_properties', $contact_properties, $user_id ); - $user_vid = get_user_meta( $user_id, 'hubwoo_user_vid', true ); - - $contact = $contact_properties; - $contact['email'] = $user_email; - $contact = array( - 'properties' => $contact, - ); - - if ( count( $contact ) ) { - - $flag = true; - - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - - if ( ! empty( $user_vid ) ) { - $response = HubWooConnectionMananager::get_instance()->update_object_record( 'contacts', $user_vid, $contact ); - } else { - $response = HubWooConnectionMananager::get_instance()->create_object_record( 'contacts', $contact ); - - if ( 201 == $response['status_code'] ) { - $contact_vid = json_decode( $response['body'] ); - update_user_meta( $user_id, 'hubwoo_user_vid', $contact_vid->id ); - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'synced' ); - - } else if ( 409 == $response['status_code'] ) { - $contact_vid = json_decode( $response['body'] ); - $hs_id = explode( 'ID: ', $contact_vid->message ); - update_user_meta( $user_id, 'hubwoo_user_vid', $hs_id[1] ); - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'synced' ); - } else if ( 400 == $response['status_code'] ) { - update_user_meta( $user_id, 'hubwoo_invalid_contact', 'yes' ); - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'synced' ); - } - } - - do_action( 'hubwoo_ecomm_contact_synced', $user_email ); - } - } - } - - /** - * Create/update a guest user and associate with a deal. - * - * @since 1.0.0 - * @param int $order_id - order id of the contact. - * @static - * @return void. - */ - public static function hubwoo_ecomm_guest_user( $order_id ) { - - global $hubwoo; - - $order = wc_get_order($order_id); - $guest_email = $order->get_billing_email(); - - $contact = array(); - - if ( ! empty( $guest_email ) ) { - - $object_type = 'CONTACT'; - $guest_user_info = array(); - $guest_order_callback = new HubwooGuestOrdersManager( $order_id ); - $guest_user_properties = $guest_order_callback->get_order_related_properties( $order_id, $guest_email ); - $guest_user_properties = $hubwoo->hubwoo_filter_contact_properties( $guest_user_properties ); - - foreach ( $guest_user_properties as $key => $value ) { - $guest_user_info[ $value['property'] ] = $value['value']; - } - - $guest_user_info['email'] = $guest_email; - $guest_user_info['firstname'] = $order->get_billing_first_name(); - $guest_user_info['lastname'] = $order->get_billing_last_name(); - $guest_user_info['phone'] = $order->get_billing_phone(); - $guest_user_info['billing_address_line_1'] = $order->get_billing_address_1(); - $guest_user_info['billing_address_line_2'] = $order->get_billing_address_2(); - $guest_user_info['billing_city'] = $order->get_billing_city(); - $guest_user_info['billing_state'] = $order->get_billing_state(); - $guest_user_info['billing_country'] = $order->get_billing_country(); - $guest_user_info['billing_postal_code'] = $order->get_billing_postcode(); - $guest_user_info['lifecyclestage'] = 'customer'; - $guest_user_info['customer_source_store'] = get_bloginfo( 'name' ); - $guest_user_info['hs_language'] = $order->get_meta('hubwoo_preferred_language', true); - $guest_contact_properties = apply_filters( 'hubwoo_map_ecomm_guest_' . $object_type . '_properties', $guest_user_info, $order_id ); - $user_vid = $order->get_meta('hubwoo_user_vid', true); - $contact = array( - 'properties' => $guest_contact_properties, - ); - } - if ( count( $contact ) ) { - - $flag = true; - - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - - if ( ! empty( $user_vid ) ) { - $response = HubWooConnectionMananager::get_instance()->update_object_record( 'contacts', $user_vid, $contact ); - } else { - $response = HubWooConnectionMananager::get_instance()->create_object_record( 'contacts', $contact ); - - if ( 201 == $response['status_code'] ) { - $contact_vid = json_decode( $response['body'] ); - $order->update_meta_data('hubwoo_user_vid', $contact_vid->id); - $order->update_meta_data('hubwoo_pro_guest_order', 'synced'); - $order->save(); - - } else if ( 409 == $response['status_code'] ) { - $contact_vid = json_decode( $response['body'] ); - $hs_id = explode( 'ID: ', $contact_vid->message ); - $order->update_meta_data('hubwoo_user_vid', $hs_id[1]); - $order->update_meta_data('hubwoo_pro_guest_order', 'synced'); - $order->save(); - } else if ( 400 == $response['status_code'] ) { - $order->update_meta_data('hubwoo_invalid_contact', 'yes'); - $order->update_meta_data('hubwoo_pro_guest_order', 'synced'); - $order->update_meta_data('hubwoo_pro_user_data_change', 'synced'); - $order->save(); - } - } - - do_action( 'hubwoo_ecomm_contact_synced', $guest_email ); - } - } - } - - /** - * Create/update an ecommerce deal. - * - * @since 1.0.0 - * @param int $order_id - order id. - * @param int $source - register or guest. - * @param int $customer_id - user id. - * @static - * @return array sync response from HubSpot. - */ - public static function hubwoo_ecomm_sync_deal( $order_id, $source, $customer_id ) { - $object_type = 'DEAL'; - $deal_updates = array(); - $assc_deal_cmpy = get_option( 'hubwoo_assoc_deal_cmpy_enable', 'yes' ); - $pipeline_id = get_option( 'hubwoo_ecomm_pipeline_id', false ); - $hubwoo_ecomm_deal = new HubwooEcommObject( $order_id, $object_type ); - $deal_properties = $hubwoo_ecomm_deal->get_object_properties(); - $deal_properties = apply_filters( 'hubwoo_map_ecomm_' . $object_type . '_properties', $deal_properties, $order_id ); - $order = wc_get_order($order_id); - - if ( 'yes' == get_option( 'hubwoo_deal_multi_currency_enable', 'no' ) ) { - $currency = $order->get_currency(); - if ( ! empty( $currency ) ) { - $deal_properties['deal_currency_code'] = $currency; - } - } - - if ( empty( $pipeline_id ) ) { - Hubwoo::get_all_deal_stages(); - $pipeline_id = get_option( 'hubwoo_ecomm_pipeline_id', false ); - } - - $deal_properties['pipeline'] = $pipeline_id; - - $deal_updates = array( - 'properties' => $deal_properties, - ); - $response = ''; - - if ( 'user' == $source ) { - $user_info = json_decode( wp_json_encode( get_userdata( $customer_id ) ), true ); - $user_email = $user_info['data']['user_email']; - $contact = $user_email; - if ( empty( $contact ) ) { - $contact = $customer_id; - } - $contact_vid = get_user_meta( $customer_id, 'hubwoo_user_vid', true ); - $invalid_contact = get_user_meta( $customer_id, 'hubwoo_invalid_contact', true ); - } else { - $contact_vid = $order->get_meta('hubwoo_user_vid', true); - $contact = $order->get_billing_email(); - $invalid_contact = $order->get_meta('hubwoo_invalid_contact', true); - } - - if ( count( $deal_updates ) ) { - - $flag = true; - if ( Hubwoo::is_access_token_expired() ) { - - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - - if ( ! $status ) { - - $flag = false; - } - } - - if ( $flag ) { - - $deal_name = '#' . $order_id; - - $user_detail['first_name'] = $order->get_billing_first_name(); - $user_detail['last_name'] = $order->get_billing_last_name(); - - foreach ( $user_detail as $value ) { - if ( ! empty( $value ) ) { - $deal_name .= ' ' . $value; - } - } - - $filtergps = array( - 'filterGroups' => array( - array( - 'filters' => array( - array( - 'value' => $deal_name, - 'propertyName' => 'dealname', - 'operator' => 'EQ', - ), - ), - ), - ), - ); - - $response = HubWooConnectionMananager::get_instance()->search_object_record( 'deals', $filtergps ); - - if ( 200 == $response['status_code'] ) { - $responce_body = json_decode( $response['body'] ); - $result = $responce_body->results; - if ( ! empty( $result ) ) { - foreach ( $result as $key => $value ) { - $order->update_meta_data('hubwoo_ecomm_deal_id', $value->id); - $order->update_meta_data('hubwoo_order_line_item_created', 'yes'); - $order->save(); - } - } - } - - $hubwoo_ecomm_deal_id =$order->get_meta('hubwoo_ecomm_deal_id', true); - - if ( empty( $hubwoo_ecomm_deal_id ) ) { - $response = HubWooConnectionMananager::get_instance()->create_object_record( 'deals', $deal_updates ); - if ( 201 == $response['status_code'] ) { - $response_body = json_decode( $response['body'] ); - $hubwoo_ecomm_deal_id = $response_body->id; - $order->update_meta_data('hubwoo_ecomm_deal_id', $hubwoo_ecomm_deal_id); - $order->save(); - } - } else { - $response = HubWooConnectionMananager::get_instance()->update_object_record( 'deals', $hubwoo_ecomm_deal_id, $deal_updates ); - } - - HubWooConnectionMananager::get_instance()->associate_object( 'deal', $hubwoo_ecomm_deal_id, 'contact', $contact_vid, 3 ); - - do_action( 'hubwoo_ecomm_deal_created', $order_id ); - - if ( 'yes' == $assc_deal_cmpy ) { - if ( ! empty( $contact ) && empty( $invalid_contact ) ) { - Hubwoo::hubwoo_associate_deal_company( $contact, $hubwoo_ecomm_deal_id ); - } - } - - $order->update_meta_data('hubwoo_ecomm_deal_upsert', 'no'); - $order->delete_meta_data('hubwoo_ecomm_deal_upsert'); - $order->save(); - - $response = self::hubwoo_ecomm_sync_line_items( $order_id ); - - return $response; - } - } - } - - /** - * Create and Associate Line Items for an order. - * - * @since 1.0.0 - * @param int $order_id - order id. - * @static - * @return array sync response from HubSpot. - */ - public static function hubwoo_ecomm_sync_line_items( $order_id ) { - - if ( ! empty( $order_id ) ) { - - $order = wc_get_order( $order_id ); - $line_updates = array(); - $order_items = $order->get_items(); - $object_ids = array(); - $response = array( 'status_code' => 206 ); - $no_products_found = false; - - if ( is_array( $order_items ) && count( $order_items ) ) { - - foreach ( $order_items as $item_key => $single_item ) : - - $product_id = $single_item->get_variation_id(); - if ( 0 === $product_id ) { - $product_id = $single_item->get_product_id(); - if ( 0 === $product_id ) { - $no_products_found = true; - } - } - if ( get_post_status( $product_id ) == 'trash' || get_post_status( $product_id ) == false ) { - continue; - } - $item_sku = get_post_meta( $product_id, '_sku', true ); - if ( empty( $item_sku ) ) { - $item_sku = $product_id; - } - - $line_item_hs_id = wc_get_order_item_meta( $item_key, 'hubwoo_ecomm_line_item_id', true ); - - if ( ! empty( $line_item_hs_id ) || 'yes' == $order->get_meta('hubwoo_order_line_item_created', 'no') ) { - continue; - } - - $quantity = ! empty( $single_item->get_quantity() ) ? $single_item->get_quantity() : 0; - $item_total = ! empty( $single_item->get_total() ) ? $single_item->get_total() : 0; - $item_sub_total = ! empty( $single_item->get_subtotal() ) ? $single_item->get_subtotal() : 0; - $product = $single_item->get_product(); - $name = self::hubwoo_ecomm_product_name( $product ); - $discount_amount = abs( $item_total - $item_sub_total ); - $discount_amount = $discount_amount / $quantity; - $item_sub_total = $item_sub_total / $quantity; - $hs_product_id = get_post_meta( $product_id, 'hubwoo_ecomm_pro_id', true ); - $object_ids[] = $item_key; - - $properties = array( - 'quantity' => $quantity, - 'price' => $item_sub_total, - 'amount' => $item_total, - 'name' => $name, - 'discount_amount' => $discount_amount, - 'sku' => $item_sku, - 'tax_amount' => $single_item->get_total_tax(), - ); - - if ( 'yes' != get_option( 'hubwoo_product_scope_needed', 'no' ) ) { - $properties['hs_product_id'] = $hs_product_id; - } - - $properties = apply_filters( 'hubwoo_line_item_properties', $properties, $product_id, $order_id ); - - $line_updates[] = array( - 'properties' => $properties, - ); - endforeach; - } - - $line_updates = apply_filters( 'hubwoo_custom_line_item', $line_updates, $order_id ); - - if ( count( $line_updates ) ) { - - $line_updates = array( - 'inputs' => $line_updates, - ); - - $flag = true; - if ( Hubwoo::is_access_token_expired() ) { - $hapikey = HUBWOO_CLIENT_ID; - $hseckey = HUBWOO_SECRET_ID; - $status = HubWooConnectionMananager::get_instance()->hubwoo_refresh_token( $hapikey, $hseckey ); - if ( ! $status ) { - $flag = false; - } - } - if ( $flag ) { - $response = HubWooConnectionMananager::get_instance()->create_batch_object_record( 'line_items', $line_updates ); - } - } - - if ( 201 == $response['status_code'] || 206 == $response['status_code'] || empty( $object_ids ) ) { - - $order->update_meta_data('hubwoo_ecomm_deal_created', 'yes'); - $order->save(); - - $deal_id = $order->get_meta('hubwoo_ecomm_deal_id', true); - if ( isset( $response['body'] ) && ! empty( $response['body'] ) ) { - $response_body = json_decode( $response['body'] ); - foreach ( $order_items as $item_key => $single_item ) : - - $product_id = $single_item->get_variation_id(); - if ( 0 === $product_id ) { - $product_id = $single_item->get_product_id(); - if ( 0 === $product_id ) { - $no_products_found = true; - } - } - if ( get_post_status( $product_id ) == 'trash' || get_post_status( $product_id ) == false ) { - continue; - } - - $product = $single_item->get_product(); - $name = self::get_instance()->hubwoo_ecomm_product_name( $product ); - - if ( isset( $response_body ) && ! empty( $response_body ) ) { - - foreach ( $response_body->results as $key => $value ) { - - $line_item_hs_id = $value->id; - $order->update_meta_data('hubwoo_order_line_item_created', 'yes'); - $order->save(); - $response = HubWooConnectionMananager::get_instance()->associate_object( 'deal', $deal_id, 'line_item', $line_item_hs_id, 19 ); - } - } - endforeach; - - if ( 1 == get_option( 'hubwoo_deals_sync_running', 0 ) ) { - - $current_count = get_option( 'hubwoo_deals_current_sync_count', 0 ); - update_option( 'hubwoo_deals_current_sync_count', ++$current_count ); - } - } - } - - return $response; - } - } - - - /** - * Start syncing an ecommerce deal - * - * @since 1.0.0 - * @param int $order_id - order id. - * @return array sync response from HubSpot. - */ - public function hubwoo_ecomm_deals_sync( $order_id ) { - - if ( ! empty( $order_id ) ) { - $hubwoo_ecomm_order = wc_get_order( $order_id ); - if ( $hubwoo_ecomm_order instanceof WC_Order ) { - $customer_id = $hubwoo_ecomm_order->get_customer_id(); - - if ( ! empty( $customer_id ) ) { - $source = 'user'; - self::hubwoo_ecomm_contacts_with_id( $customer_id ); - } else { - $source = 'guest'; - self::hubwoo_ecomm_guest_user( $order_id ); - } - - $response = self::hubwoo_ecomm_sync_deal( $order_id, $source, $customer_id ); - update_option( 'hubwoo_last_sync_date', time() ); - return $response; - } - } - } - /** - * Create a formatted name of the product. - * - * @since 1.0.0 - * @param int $product product object. - * @return string formatted name of the product. - */ - public static function hubwoo_ecomm_product_name( $product ) { - - if ( $product->get_sku() ) { - $identifier = $product->get_sku(); - } else { - $identifier = '#' . $product->get_id(); - } - return sprintf( '%2$s (%1$s)', $identifier, $product->get_name() ); - } - - - /** - * Return formatted time for HubSpot - * - * @param int $unix_timestamp current timestamp. - * @return string formatted time. - * @since 1.0.0 - */ - public static function hubwoo_set_utc_midnight( $unix_timestamp ) { - - $string = gmdate( 'Y-m-d H:i:s', $unix_timestamp ); - $date = new DateTime( $string ); - $wp_time_zone = get_option( 'timezone_string', '' ); - if ( empty( $wp_time_zone ) ) { - $wp_time_zone = 'UTC'; - } - $time_zone = new DateTimeZone( $wp_time_zone ); - $date->setTimezone( $time_zone ); - return $date->getTimestamp() * 1000; // in miliseconds. - } -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoopropertycallbacks.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoopropertycallbacks.php deleted file mode 100644 index cacb3010..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/class-hubwoopropertycallbacks.php +++ /dev/null @@ -1,1029 +0,0 @@ - 'get_contact_group', - 'newsletter_subscription' => 'hubwoo_user_meta', - 'shopping_cart_customer_id' => 'hubwoo_user_meta', - 'customer_source_store' => 'hubwoo_user_meta', - 'hs_language' => 'hubwoo_user_meta', - 'marketing_newsletter' => 'hubwoo_user_meta', - - 'shipping_address_line_1' => 'get_user_meta', - 'shipping_address_line_2' => 'get_user_meta', - 'shipping_city' => 'get_user_meta', - 'shipping_state' => 'get_user_meta', - 'shipping_postal_code' => 'get_user_meta', - 'shipping_country' => 'get_user_meta', - 'billing_address_line_1' => 'get_user_meta', - 'billing_address_line_2' => 'get_user_meta', - 'billing_city' => 'get_user_meta', - 'billing_state' => 'get_user_meta', - 'billing_postal_code' => 'get_user_meta', - 'billing_country' => 'get_user_meta', - - 'skus_bought' => 'hubwoo_user_meta', - 'last_skus_bought' => 'hubwoo_user_meta', - - 'categories_bought' => 'hubwoo_user_meta', - 'last_categories_bought' => 'hubwoo_user_meta', - - 'last_order_status' => 'hubwoo_user_meta', - 'last_order_fulfillment_status' => 'hubwoo_user_meta', - 'last_order_tracking_number' => 'hubwoo_user_meta', - 'last_order_tracking_url' => 'hubwoo_user_meta', - 'last_order_shipment_date' => 'hubwoo_user_meta', - 'last_order_order_number' => 'hubwoo_user_meta', - 'last_order_currency' => 'hubwoo_user_meta', - 'total_number_of_current_orders' => 'hubwoo_user_meta', - - 'total_value_of_orders' => 'hubwoo_user_meta', - 'average_order_value' => 'hubwoo_user_meta', - 'total_number_of_orders' => 'hubwoo_user_meta', - 'first_order_date' => 'hubwoo_user_meta', - 'first_order_value' => 'hubwoo_user_meta', - 'last_order_date' => 'hubwoo_user_meta', - 'last_order_value' => 'hubwoo_user_meta', - 'average_days_between_orders' => 'hubwoo_user_meta', - 'account_creation_date' => 'hubwoo_user_meta', - 'monetary_rating' => 'hubwoo_user_meta', - 'order_frequency_rating' => 'hubwoo_user_meta', - 'order_recency_rating' => 'hubwoo_user_meta', - - 'last_product_bought' => 'hubwoo_user_meta', - 'last_product_types_bought' => 'hubwoo_user_meta', - 'last_products_bought' => 'hubwoo_user_meta', - 'last_products_bought_html' => 'hubwoo_user_meta', - 'last_total_number_of_products_bought' => 'hubwoo_user_meta', - 'product_types_bought' => 'hubwoo_user_meta', - 'last_products_bought_product_1_image_url' => 'hubwoo_user_meta', - 'last_products_bought_product_1_name' => 'hubwoo_user_meta', - 'last_products_bought_product_1_price' => 'hubwoo_user_meta', - 'last_products_bought_product_1_url' => 'hubwoo_user_meta', - 'last_products_bought_product_2_image_url' => 'hubwoo_user_meta', - 'last_products_bought_product_2_name' => 'hubwoo_user_meta', - 'last_products_bought_product_2_price' => 'hubwoo_user_meta', - 'last_products_bought_product_2_url' => 'hubwoo_user_meta', - 'last_products_bought_product_3_image_url' => 'hubwoo_user_meta', - 'last_products_bought_product_3_name' => 'hubwoo_user_meta', - 'last_products_bought_product_3_price' => 'hubwoo_user_meta', - 'last_products_bought_product_3_url' => 'hubwoo_user_meta', - 'products_bought' => 'hubwoo_user_meta', - 'total_number_of_products_bought' => 'hubwoo_user_meta', - - 'last_subscription_order_number' => 'hubwoo_user_subs_data', - 'last_subscription_parent_order_number' => 'hubwoo_user_subs_data', - 'last_subscription_order_status' => 'hubwoo_user_subs_data', - 'last_subscription_order_creation_date' => 'hubwoo_user_subs_data', - 'last_subscription_order_paid_date' => 'hubwoo_user_subs_data', - 'last_subscription_order_completed_date' => 'hubwoo_user_subs_data', - 'last_subscription_trial_end_date' => 'hubwoo_user_subs_data', - 'last_subscription_next_payment_date' => 'hubwoo_user_subs_data', - 'last_subscription_billing_period' => 'hubwoo_user_subs_data', - 'last_subscription_billing_interval' => 'hubwoo_user_subs_data', - 'last_subscription_products' => 'hubwoo_user_subs_data', - 'related_last_order_creation_date' => 'hubwoo_user_subs_data', - 'related_last_order_paid_date' => 'hubwoo_user_subs_data', - 'related_last_order_completed_date' => 'hubwoo_user_subs_data', - ); - - /** - * Constructor. - * - * @since 1.0.0 - * @param int $contact_id contact id to get property values of. - */ - public function __construct( $contact_id ) { - - $this->_contact_id = $contact_id; - - $this->_user = get_user_by( 'id', $this->_contact_id ); - } - - /** - * Property value. - * - * @param string $property_name name of the contact property. - * @since 1.0.0 - */ - public function _get_property_value( $property_name ) { - - $value = ''; - - if ( ! empty( $property_name ) ) { - - $callback_function = $this->_get_property_callback( $property_name ); - - if ( ! empty( $callback_function ) ) { - - $value = $this->$callback_function( $property_name ); - } - } - - $value = apply_filters( 'hubwoo_contact_property_value', $value, $property_name, $this->_contact_id ); - - return $value; - } - - /** - * Filter the property callback to get value of. - * - * @param strig $property_name name of the property. - * @return string/false callback function name or false. - */ - private function _get_property_callback( $property_name ) { - - if ( array_key_exists( $property_name, $this->_property_callbacks ) ) { - - $callback = $this->_property_callbacks[ $property_name ]; - return $callback; - } - - return false; - } - - /** - * Get contact user role. - * - * @return string user role of the current contact. - * @since 1.0.0 - */ - public function get_contact_group() { - - $user_roles = isset( $this->_user->roles ) ? $this->_user->roles : ''; - - return HubwooGuestOrdersManager::hubwoo_format_array( $user_roles ); - } - - /** - * User email. - * - * @since 1.0.0 - */ - public function _get_mail() { - - return $this->_user->data->user_email; - } - - /** - * Get customer meta. - * - * @since 1.0.0 - * @param string $property_name name of property. - */ - public function get_user_meta( $property_name ) { - - switch ( $property_name ) { - - case 'shipping_address_line_1': - $key = 'shipping_address_1'; - break; - - case 'shipping_address_line_2': - $key = 'shipping_address_2'; - break; - - case 'shipping_postal_code': - $key = 'shipping_postcode'; - break; - - case 'billing_address_line_1': - $key = 'billing_address_1'; - break; - - case 'billing_address_line_2': - $key = 'billing_address_2'; - break; - - case 'billing_postal_code': - $key = 'billing_postcode'; - break; - - default: - $key = $property_name; - } - - if ( 'billing_country' == $key ) { - $value = get_user_meta( $this->_contact_id, $key, true ); - $value = Hubwoo::map_country_by_abbr( $value ); - } elseif ( 'billing_state' == $key ) { - $value = get_user_meta( $this->_contact_id, $key, true ); - $value = Hubwoo::map_state_by_abbr( $value, get_user_meta( $this->_contact_id, 'billing_country', true ) ); - } elseif ( 'shipping_country' == $key ) { - $value = get_user_meta( $this->_contact_id, $key, true ); - $value = Hubwoo::map_country_by_abbr( $value ); - } elseif ( 'shipping_state' == $key ) { - $value = get_user_meta( $this->_contact_id, $key, true ); - $value = Hubwoo::map_state_by_abbr( $value, get_user_meta( $this->_contact_id, 'shipping_country', true ) ); - } else { - $value = get_user_meta( $this->_contact_id, $key, true ); - } - return $value; - } - - /** - * User details with hubwoo_ prefix. - * - * @since 1.0.0 - * @param string $key name of the user key. - */ - public function hubwoo_user_meta( $key ) { - - if ( array_key_exists( $key, $this->_cache ) ) { - - return $this->_cache[ $key ]; - } - - $order_statuses = get_option( 'hubwoo-selected-order-status', array() ); - - if ( empty( $order_statuses ) ) { - - $order_statuses = array_keys( wc_get_order_statuses() ); - } - - //hpos changes - if( Hubwoo::hubwoo_check_hpos_active() ) { - $query = new WC_Order_Query(array( - 'posts_per_page' => -1, - 'post_status' => $order_statuses, - 'orderby' => 'date', - 'order' => 'desc', - 'return' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'customer_id' => $this->_contact_id, - )); - - $customer_orders = $query->get_orders(); - } else { - $query = new WP_Query(); - - $customer_orders = $query->query( - array( - 'post_type' => 'shop_order', - 'posts_per_page' => -1, - 'post_status' => $order_statuses, - 'orderby' => 'date', - 'order' => 'desc', - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'meta_query' => array( - array( - 'key' => '_customer_user', - 'value' => $this->_contact_id, - ), - ), - ) - ); - } - - $last_order = ! empty( $customer_orders ) && is_array( $customer_orders ) ? $customer_orders[0] : ''; - $customer = new WP_User( $this->_contact_id ); - - $order_frequency = 0; - - $account_creation = isset( $customer->data->user_registered ) ? $customer->data->user_registered : ''; - - if ( ! empty( $account_creation ) ) { - - $account_creation = strtotime( $account_creation ); - } - - if ( ! empty( $account_creation ) && 0 < $account_creation ) { - - $this->_cache['account_creation_date'] = HubwooGuestOrdersManager::hubwoo_set_utc_midnight( $account_creation ); - } - - $categories_bought = array(); - $skus_bought = array(); - $product_types_bought = array(); - $last_3_products_ids = array(); - $last_products_bought = array(); - $last_order_date = 0; - $last_products_bought_html = array(); - $days_differences = array(); - $last_type_bought = ''; - $first_date = 0; - $last_date = 0; - $average_days = array(); - $products_bought = array(); - $last_product_bought = ''; - $last_order_for_html = 0; - $last_order_id = 0; - - $order_tracking_number = get_post_meta( $last_order, '_wc_shipment_tracking_items', true ); - if ( ! empty( $order_tracking_number ) ) { - - $shipment_data = $order_tracking_number[0]; - - if ( ! empty( $shipment_data['date_shipped'] ) ) { - $this->_cache['last_order_shipment_date'] = HubwooGuestOrdersManager::hubwoo_set_utc_midnight( $shipment_data['date_shipped'] ); - } - if ( ! empty( $shipment_data['tracking_number'] ) ) { - $this->_cache['last_order_tracking_number'] = $shipment_data['tracking_number']; - } - if ( ! empty( $shipment_data['custom_tracking_link'] ) ) { - $this->_cache['last_order_tracking_url'] = $shipment_data['custom_tracking_link']; - } - } - - $contact_preferred_lang = get_user_meta( $this->_contact_id, 'hubwoo_preferred_language', true ); - - if ( isset( $contact_preferred_lang ) && ! empty( $contact_preferred_lang ) ) { - $this->_cache['hs_language'] = $contact_preferred_lang; - } - - $this->_cache['shopping_cart_customer_id'] = $this->_contact_id; - - $this->_cache['customer_source_store'] = get_bloginfo( 'name' ); - - $this->_cache['total_number_of_current_orders'] = 0; - - $this->_cache['last_total_number_of_products_bought'] = 0; - - $this->_cache['total_number_of_orders'] = 0; - - $this->_cache['order_recency_rating'] = 1; - - $this->_cache['order_frequency_rating'] = 1; - - $this->_cache['monetary_rating'] = 1; - - $optin = 'yes'; - $reg_optin = get_user_meta( $this->_contact_id, 'hubwoo_registeration_marketing_optin', true ); - $check_optin = get_user_meta( $this->_contact_id, 'hubwoo_checkout_marketing_optin', true ); - - $optin_sources = array(); - - if ( empty( $reg_optin ) ) { - $optin = $check_optin; - } - - if ( empty( $optin ) ) { - $optin = 'no'; - } - - $property_updated = get_option( 'hubwoo_newsletter_property_update', 'no' ); - - if ( ! empty( $property_updated ) && 'yes' == $property_updated ) { - if ( 'yes' == $optin ) { - $optin = true; - } else { - $optin = false; - } - } - - if ( ! empty( $reg_optin ) && 'yes' == $reg_optin ) { - $optin_sources[] = 'registration'; - } - - if ( ! empty( $check_optin ) && 'yes' == $check_optin ) { - $optin_sources[] = 'checkout'; - } - - $this->_cache['newsletter_subscription'] = $optin; - - $this->_cache['marketing_newsletter'] = HubwooGuestOrdersManager::hubwoo_format_array( $optin_sources ); - - $this->_cache['total_value_of_orders'] = 0; - - $this->_cache['total_number_of_products_bought'] = 0; - - // if customer have orders. - if ( is_array( $customer_orders ) && count( $customer_orders ) ) { - - $this->_cache['total_number_of_orders'] = count( $customer_orders ); - - $order_frequency = $this->_cache['total_number_of_orders']; - - $counter = 0; - - $products_count = 0; - - foreach ( $customer_orders as $order_id ) { - - if ( ! $order_id ) { - - continue; - } - - // order date. - $order_date = get_post_time( 'U', false, $order_id ); - - $last_date = $order_date; - - if ( 0 == $first_date ) { - - $first_date = $last_date; - } - - $average_days[] = $this->hubwoo_get_average_days( $first_date, $last_date ); - - $first_date = $last_date; - - // get order. - $order = new WC_Order( $order_id ); - - // check for WP_Error object. - if ( empty( $order ) || is_wp_error( $order ) ) { - continue; - } - - $order_status = $order->get_status(); - - if ( 'failed' !== $order_status && 'cancelled' !== $order_status ) { - - $last_order_for_html++; - - $order_items = $order->get_items(); - - // check if order has items. - if ( is_array( $order_items ) && count( $order_items ) ) { - - // let's loop each order item to get the details. - foreach ( $order_items as $item_id_1 => $wc_order_item_product ) { - - if ( ! empty( $wc_order_item_product ) && $wc_order_item_product instanceof WC_Order_Item ) { - - $item_id = $wc_order_item_product->get_product_id(); - $parent_item_sku = get_post_meta( $item_id, '_sku', true ); - $item_var_id = $wc_order_item_product->get_variation_id(); - - if ( 'trash' == get_post_status( $item_id ) || false == get_post_status( $item_id ) ) { - - continue; - } - - $product_cats_ids = wc_get_product_term_ids( $item_id, 'product_cat' ); - - if ( is_array( $product_cats_ids ) && count( $product_cats_ids ) ) { - - foreach ( $product_cats_ids as $cat_id ) { - - $term = get_term_by( 'id', $cat_id, 'product_cat' ); - $categories_bought[] = $term->slug; - } - } - - if ( $item_var_id ) { - - $item_id = $item_var_id; - } - - $products_count += $wc_order_item_product->get_quantity(); - - $item_sku = get_post_meta( $item_id, '_sku', true ); - - if ( empty( $item_sku ) || '' == $item_sku ) { - - $item_sku = $parent_item_sku; - } - - if ( empty( $item_sku ) || '' == $item_sku ) { - - $item_sku = $item_id; - } - - $skus_bought[] = $item_sku; - - $post = get_post( $item_id ); - - $product_uni_name = isset( $post->post_name ) ? $post->post_name : ''; - - if ( ! empty( $product_uni_name ) ) { - - $products_bought[] = $product_uni_name . '-' . $item_id; - $last_product_bought = $product_uni_name . '-' . $item_id; - $last_products_bought[] = $product_uni_name . '-' . $item_id; - } - - $product = $wc_order_item_product->get_product(); - - if ( $product instanceof WC_Product ) { - - $product_type = $product->get_type(); - } else { - - $product_type = ''; - } - - if ( 'variation' == $product_type ) { - - $product_type = 'variable'; - } - - if ( 'subscription_variation' == $product_type ) { - - $product_type = 'variable-subscription'; - } - - if ( ! empty( $product_type ) ) { - - $product_types_bought[] = $product_type; - } - - if ( count( $last_3_products_ids ) < 3 ) { - - $last_3_products_ids[] = $item_id; - } - - if ( 1 == $last_order_for_html ) { - - $last_order_id = $order_id; - } - } - } - } - } - - $order_total = $order->get_total(); - - $this->_cache['total_value_of_orders'] += floatval( $order_total ); - - if ( 'failed' !== $order_status && 'cancelled' !== $order_status && 'refunded' !== $order_status && 'completed' !== $order_status ) { - - $this->_cache['total_number_of_current_orders'] += 1; - } - - // check for last order and finish all last order calculations. - if ( ! $counter ) { - - $last_order_date = get_post_time( 'U', false, $order_id ); - - if ( ! empty( $last_order_date ) ) { - - $this->_cache['last_order_date'] = HubwooGuestOrdersManager::hubwoo_set_utc_midnight( $last_order_date ); - } - - $this->_cache['last_order_value'] = $order_total; - - $this->_cache['last_order_order_number'] = $order_id; - - $this->_cache['last_order_currency'] = $order->get_currency(); - - $this->_cache['last_order_fulfillment_status'] = 'wc-' . $order_status; - - $this->_cache['last_order_status'] = 'wc-' . $order->get_status(); - - $this->_cache['last_product_bought'] = HubwooGuestOrdersManager::hubwoo_format_array( $last_product_bought ); - - $this->_cache['last_products_bought'] = HubwooGuestOrdersManager::hubwoo_format_array( $last_products_bought ); - - $this->_cache['last_skus_bought'] = HubwooGuestOrdersManager::hubwoo_format_array( $skus_bought ); - - $this->_cache['last_categories_bought'] = HubwooGuestOrdersManager::hubwoo_format_array( $categories_bought ); - - $this->_cache['last_product_types_bought'] = HubwooGuestOrdersManager::hubwoo_format_array( $product_types_bought ); - - $this->_cache['last_total_number_of_products_bought'] = $products_count; - - $this->_cache['last_products_bought_html'] = HubWooContactProperties::get_instance()->hubwoo_last_order_html( $last_order_id ); - } - - // check for first order. - if ( ( count( $customer_orders ) - 1 ) == $counter ) { - - // first order based calculation here.. - $first_order_date = get_post_time( 'U', false, $order_id ); - - if ( ! empty( $first_order_date ) ) { - - $this->_cache['first_order_date'] = HubwooGuestOrdersManager::hubwoo_set_utc_midnight( $first_order_date ); - } - - $this->_cache['first_order_value'] = $order_total; - } - - $counter++; - } - - // rest calculations here. - $this->_cache['average_order_value'] = floatval( $this->_cache['total_value_of_orders'] / $this->_cache['total_number_of_orders'] ); - - $this->_cache['average_days_between_orders'] = floatval( array_sum( $average_days ) / $this->_cache['total_number_of_orders'] ); - - $this->_cache['skus_bought'] = HubwooGuestOrdersManager::hubwoo_format_array( $skus_bought ); - - $this->_cache['categories_bought'] = HubwooGuestOrdersManager::hubwoo_format_array( $categories_bought ); - - $this->_cache['product_types_bought'] = HubwooGuestOrdersManager::hubwoo_format_array( $product_types_bought ); - - $this->_cache['products_bought'] = HubwooGuestOrdersManager::hubwoo_format_array( $products_bought ); - - $this->_cache['total_number_of_products_bought'] = $products_count; - - if ( is_array( $last_3_products_ids ) && count( $last_3_products_ids ) ) { - - $counter = 1; - - foreach ( $last_3_products_ids as $last_3_product_id ) { - - $_product = wc_get_product( $last_3_product_id ); - - if ( $_product instanceof WC_Product ) { - - $image_url = ''; - - $this->_cache[ 'last_products_bought_product_' . $counter . '_name' ] = $_product->get_title(); - - $attachment_src = wp_get_attachment_image_src( get_post_thumbnail_id( $last_3_product_id ), 'single-post-thumbnail' ); - - if ( empty( $attachment_src[0] ) ) { - - $parent_id = $_product->get_parent_id(); - $attachment_src = wp_get_attachment_image_src( get_post_thumbnail_id( $parent_id ), 'single-post-thumbnail' ); - } - - if ( ! empty( $attachment_src[0] ) ) { - $image_url = $attachment_src[0]; - } - - $this->_cache[ 'last_products_bought_product_' . $counter . '_image_url' ] = $image_url; - - $this->_cache[ 'last_products_bought_product_' . $counter . '_price' ] = $_product->get_price(); - - $this->_cache[ 'last_products_bought_product_' . $counter . '_url' ] = get_permalink( $last_3_product_id ); - - $counter++; - } - } - } - - $hubwoo_rfm_at_5 = get_option( - 'hubwoo_rfm_5', - array( - 0 => 30, - 1 => 20, - 2 => 1000, - ) - ); - - $hubwoo_from_rfm_4 = get_option( - 'hubwoo_from_rfm_4', - array( - 0 => 31, - 1 => 10, - 2 => 750, - ) - ); - - $hubwoo_to_rfm_4 = get_option( - 'hubwoo_to_rfm_4', - array( - 0 => 90, - 1 => 20, - 2 => 1000, - ) - ); - - $hubwoo_from_rfm_3 = get_option( - 'hubwoo_from_rfm_3', - array( - 0 => 91, - 1 => 5, - 2 => 500, - ) - ); - - $hubwoo_to_rfm_3 = get_option( - 'hubwoo_to_rfm_3', - array( - 0 => 180, - 1 => 10, - 2 => 750, - ) - ); - - $hubwoo_from_rfm_2 = get_option( - 'hubwoo_from_rfm_2', - array( - 0 => 181, - 1 => 2, - 2 => 250, - ) - ); - - $hubwoo_to_rfm_2 = get_option( - 'hubwoo_to_rfm_2', - array( - 0 => 365, - 1 => 5, - 2 => 500, - ) - ); - - $hubwoo_rfm_at_1 = get_option( - 'hubwoo_rfm_1', - array( - 0 => 365, - 1 => 2, - 2 => 250, - ) - ); - - $order_monetary = $this->_cache['total_value_of_orders']; - - $current_date = gmdate( 'Y-m-d H:i:s', time() ); - $current_date = new DateTime( $current_date ); - $last_order_date = gmdate( 'Y-m-d H:i:s', $last_order_date ); - $last_order_date = new DateTime( $last_order_date ); - $order_recency = date_diff( $current_date, $last_order_date, true ); - - $order_recency = $order_recency->days; - - if ( $order_recency <= $hubwoo_rfm_at_5[0] ) { - - $this->_cache['order_recency_rating'] = 5; - } elseif ( $order_recency >= $hubwoo_from_rfm_4[0] && $order_recency <= $hubwoo_to_rfm_4[0] ) { - - $this->_cache['order_recency_rating'] = 4; - } elseif ( $order_recency >= $hubwoo_from_rfm_3[0] && $order_recency <= $hubwoo_to_rfm_3[0] ) { - - $this->_cache['order_recency_rating'] = 3; - } elseif ( $order_recency >= $hubwoo_from_rfm_2[0] && $order_recency <= $hubwoo_to_rfm_2[0] ) { - - $this->_cache['order_recency_rating'] = 2; - } else { - - $this->_cache['order_recency_rating'] = 1; - } - - if ( $order_frequency > $hubwoo_rfm_at_5[1] ) { - - $this->_cache['order_frequency_rating'] = 5; - } elseif ( $order_frequency >= $hubwoo_from_rfm_4[1] && $order_frequency < $hubwoo_to_rfm_4[1] ) { - - $this->_cache['order_frequency_rating'] = 4; - } elseif ( $order_frequency >= $hubwoo_from_rfm_3[1] && $order_frequency < $hubwoo_to_rfm_3[1] ) { - - $this->_cache['order_frequency_rating'] = 3; - } elseif ( $order_frequency >= $hubwoo_from_rfm_2[1] && $order_frequency < $hubwoo_to_rfm_2[1] ) { - - $this->_cache['order_frequency_rating'] = 2; - } else { - - $this->_cache['order_frequency_rating'] = 1; - } - - if ( $order_monetary > $hubwoo_rfm_at_5[2] ) { - - $this->_cache['monetary_rating'] = 5; - } elseif ( $order_monetary >= $hubwoo_from_rfm_4[2] && $order_monetary <= $hubwoo_to_rfm_4[2] ) { - - $this->_cache['monetary_rating'] = 4; - } elseif ( $order_monetary >= $hubwoo_from_rfm_3[2] && $order_monetary < $hubwoo_to_rfm_3[2] ) { - - $this->_cache['monetary_rating'] = 3; - } elseif ( $order_monetary >= $hubwoo_from_rfm_2[2] && $order_monetary < $hubwoo_to_rfm_2[2] ) { - - $this->_cache['monetary_rating'] = 2; - } else { - - $this->_cache['monetary_rating'] = 1; - } - } - - if ( isset( $this->_cache[ $key ] ) ) { - - return $this->_cache[ $key ]; - } - } - - /** - * Contact subscriptions data. - * - * @param string $key for subscription properties. - * @since 1.0.0 - */ - public function hubwoo_user_subs_data( $key ) { - - if ( Hubwoo::hubwoo_subs_active() && 'no' == get_option( 'hubwoo_subs_settings_enable', 'yes' ) ) { - - return; - } - - if ( array_key_exists( $key, $this->_cache ) ) { - - return $this->_cache[ $key ]; - } - - $query = new WP_Query(); - - $customer_orders = $query->query( - array( - 'post_type' => 'shop_subscription', - 'posts_per_page' => 1, - 'post_status' => 'any', - 'orderby' => 'date', - 'order' => 'desc', - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'meta_query' => array( - array( - 'key' => '_customer_user', - 'value' => $this->_contact_id, - ), - ), - ) - ); - - // if customer have orders. - if ( is_array( $customer_orders ) && count( $customer_orders ) ) { - - foreach ( $customer_orders as $counter => $order_id ) { - - // if order id not found let's check for another order. - if ( ! $order_id ) { - continue; - } - - // get order. - $order = wc_get_order( $order_id ); - - // check for WP_Error object. - if ( empty( $order ) || is_wp_error( $order ) ) { - - continue; - } - - $subs_order = new WC_Subscription( $order_id ); - - $order_items = $order->get_items(); - - if ( is_array( $order_items ) && count( $order_items ) ) { - - $subs_products = array(); - - // let's loop each order item to get the details. - foreach ( $order_items as $item_id_1 => $wc_order_item_product ) { - - if ( ! empty( $wc_order_item_product ) && $wc_order_item_product instanceof WC_Order_Item ) { - - $item_id = $wc_order_item_product->get_product_id(); - - if ( get_post_status( $item_id ) == 'trash' || get_post_status( $item_id ) == false ) { - - continue; - } - - $post = get_post( $item_id ); - - $product_uni_name = isset( $post->post_name ) ? $post->post_name : ''; - - if ( ! empty( $product_uni_name ) ) { - - $subs_products[] = $product_uni_name . '-' . $item_id; - } - } - } - - if ( count( $subs_products ) ) { - - $this->_cache['last_subscription_products'] = HubwooGuestOrdersManager::hubwoo_format_array( $subs_products ); - } - - if ( $subs_order->get_status() == 'pending-cancel' || $subs_order->get_status() == 'cancelled' ) { - - $this->_cache['last_subscription_products'] = ' '; - } - } - - $order_data = $order->get_data(); - - if ( ! empty( $order_data['schedule_trial_end'] ) ) { - - $this->_cache['last_subscription_trial_end_date'] = HubwooGuestOrdersManager::hubwoo_set_utc_midnight( $order_data['schedule_trial_end']->getTimestamp() ); - } - - if ( ! empty( $order_data['schedule_next_payment'] ) && $order_data['schedule_next_payment'] instanceof WC_DateTime ) { - - $this->_cache['last_subscription_next_payment_date'] = HubwooGuestOrdersManager::hubwoo_set_utc_midnight( $order_data['schedule_next_payment']->getTimestamp() ); - } - - $this->_cache['last_subscription_order_status'] = 'wc-' . $subs_order->get_status(); - - $this->_cache['last_subscription_order_number'] = $subs_order->get_id(); - - $this->_cache['last_subscription_parent_order_number'] = $subs_order->get_parent_id(); - - $date_created = ! empty( $subs_order->get_date( 'date_created' ) ) ? $subs_order->get_date( 'date_created' ) : ''; - - if ( ! empty( $date_created ) ) { - - $this->_cache['last_subscription_order_creation_date'] = HubwooGuestOrdersManager::hubwoo_set_utc_midnight( strtotime( $date_created ) ); - } - - $date_paid = ! empty( $subs_order->get_date( 'date_paid' ) ) ? $subs_order->get_date( 'date_paid' ) : ''; - - if ( ! empty( $date_paid ) ) { - - $this->_cache['last_subscription_order_paid_date'] = HubwooGuestOrdersManager::hubwoo_set_utc_midnight( strtotime( $date_paid ) ); - } - - $date_completed = ! empty( $subs_order->get_date( 'date_completed' ) ) ? $subs_order->get_date( 'date_completed' ) : ''; - - if ( ! empty( $date_completed ) ) { - - $this->_cache['last_subscription_order_completed_date'] = HubwooGuestOrdersManager::hubwoo_set_utc_midnight( strtotime( $date_completed ) ); - } - - $last_order_creation_date = ! empty( $subs_order->get_date( 'last_order_date_created' ) ) ? $subs_order->get_date( 'last_order_date_created' ) : ''; - - if ( ! empty( $last_order_creation_date ) ) { - - $this->_cache['related_last_order_creation_date'] = HubwooGuestOrdersManager::hubwoo_set_utc_midnight( strtotime( $last_order_creation_date ) ); - } - - $last_order_paid_date = ! empty( $subs_order->get_date( 'last_order_date_paid' ) ) ? $subs_order->get_date( 'last_order_date_paid' ) : ''; - - if ( ! empty( $last_order_date_paid ) ) { - - $this->_cache['related_last_order_paid_date'] = HubwooGuestOrdersManager::hubwoo_set_utc_midnight( strtotime( $last_order_paid_date ) ); - } - - $last_order_completion_date = ! empty( $subs_order->get_date( 'last_order_date_completed' ) ) ? $subs_order->get_date( 'last_order_date_completed' ) : ''; - - if ( ! empty( $last_order_completion_date ) ) { - - $this->_cache['related_last_order_completed_date'] = HubwooGuestOrdersManager::hubwoo_set_utc_midnight( strtotime( $last_order_completion_date ) ); - } - - $this->_cache['last_subscription_billing_period'] = ! empty( $subs_order->get_billing_period() ) ? $subs_order->get_billing_period() : ''; - - $this->_cache['last_subscription_billing_interval'] = ! empty( $subs_order->get_billing_interval() ) ? $subs_order->get_billing_interval() : ''; - } - } - - if ( isset( $this->_cache[ $key ] ) ) { - - return $this->_cache[ $key ]; - } - } - - /** - * Return days between two dates - * - * @param int $first_date first order date. - * @param int $last_date last order date. - * @since 1.0.0 - */ - public function hubwoo_get_average_days( $first_date, $last_date ) { - - $now = $first_date; - $your_date = $last_date; - $datediff = $now - $your_date; - return floor( $datediff / ( 60 * 60 * 24 ) ); - } -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/classes/class-hubwooenum.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/classes/class-hubwooenum.php deleted file mode 100644 index 31f4005f..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/classes/class-hubwooenum.php +++ /dev/null @@ -1,43 +0,0 @@ -getConstants() ) ) { - throw IllegalArgumentException(); - } - $this->value = $value; - } - - /** - * Conver the Enum value to String. - * - * @since 1.0.4 - */ - final public function __toString() { - return $this->value; - } -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/index.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/index.php deleted file mode 100644 index 0de7bcdd..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/includes/index.php +++ /dev/null @@ -1,2 +0,0 @@ -\r\n" -"\t\t\t\t\t\t\t\t\tClick on a Group to Select/De-Select its Group Properties." -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:163 -msgid "Create Now" -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:170 -msgid "All of the created Groups and Properties are below." -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:200 -#: admin/templates/setup/hubwoo-list-setup.php:149 -msgid "Created" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:63 -msgid "Create lists in HubSpot" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:70 -msgid "" -"Set up lists to segment your contacts and customers based on their previous " -"actions and behaviors." -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:77 -msgid "You can set up the following lists:" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:80 -msgid "Leads: contacts that have not yet made any orders" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:81 -msgid "Customers: contacts that have made at least one order" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:82 -msgid "" -"Abandoned Cart: contacts that have added products to their carts, but have " -"not purchased" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:88 -msgid "Create Lists" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:89 -msgid "View All Lists" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:94 -msgid "" -"List creation is in progress. This should only take a few moments. Thanks " -"for your patience!" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:108 -msgid "Select the Groups and Properties that you need on HubSpot." -msgstr "" - -#: admin/templates/setup/hubwoo-pipeline-setup.php:104 -msgid "Save" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:46 -msgid "Sync WooCommerce data with HubSpot" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:52 -msgid "" -"You’re almost done! The last step is to sync your existing WooCommerce data " -"to HubSpot. This will sync all your Contacts, Deals, and Products data to " -"HubSpot." -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:55 -msgid "" -"Once you sync your data, you’ll see all your WooCommerce information on " -"HubSpot so you can start engaging with them right away." -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:62 -msgid "Skip Historical Data Sync" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:69 -msgid "" -"1. Syncing Your Contacts to HubSpot. This should only take a few moments. " -"Thanks for your patience!" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:77 -msgid "" -"2. Syncing your Products to HubSpot. This should only take a few moments. " -"Thanks for your patience!" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:85 -msgid "" -"3. Syncing your Deals to Hubspot. This should only take a few moments. " -"Thanks for your patience!" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:99 -msgid "" -"Congrats! You’ve successfully set up the MWB HubSpot for WooCommerce plugin" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:106 -msgid "What's next? Go to your dashboard to learn more about the integration." -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:109 -msgid "Visit DashBoard" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:124 -msgid "Get tailored onboarding emails straight to your inbox" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:128 -msgid "Help us make your experience even better by telling us:" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:134 -msgid "Please fill all of the below fields before submission" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:152 -msgid "Choosing the ideal plan for your company might be confusing. " -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:153 -msgid "Connect Us " -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:154 -msgid "and we can assist you for free." -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:158 -msgid "First Name" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:165 -msgid "Last Name" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:172 -msgid "Company Name" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:179 -msgid "Website URL" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:186 -msgid "Email Address" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:193 -msgid "Phone Number" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:200 -msgid "Complete Onboarding" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:202 -msgid "Skip for now" -msgstr "" - -#: includes/class-hubwoo-ajax-handler.php:125 -msgid "Success" -msgstr "" - -#: includes/class-hubwoo-ajax-handler.php:139 -msgid "Something went wrong. Please verify your HubSpot Connection once." -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:58 -msgid "Score" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:58 -msgid "Ratings for RFM Segmentation" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:59 -msgid "Recency" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:59 -msgid "Days Since last Order" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:60 -msgid "Frequency" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:60 -msgid "Total Orders Placed" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:61 -msgid "Monetary" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:61 -msgid "Total Money Spent" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:153 -#: includes/class-hubwoo-rfm-configuration.php:162 -#: includes/class-hubwoo-rfm-configuration.php:163 -msgid "Less than" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:154 -#: includes/class-hubwoo-rfm-configuration.php:155 -#: includes/class-hubwoo-rfm-configuration.php:161 -msgid "More than" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:195 -#: includes/class-hubwoo-rfm-configuration.php:196 -#: includes/class-hubwoo-rfm-configuration.php:197 -msgid "From" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:195 -#: includes/class-hubwoo-rfm-configuration.php:196 -#: includes/class-hubwoo-rfm-configuration.php:197 -msgid "To" -msgstr "" - -#: includes/class-hubwoo.php:444 -msgid "Dashboard" -msgstr "" - -#: includes/class-hubwoo.php:446 -msgid "Integrate your WooCommerce store with HubSpot" -msgstr "" - -#: includes/class-hubwoo.php:450 -msgid "Contacts" -msgstr "" - -#: includes/class-hubwoo.php:452 -msgid "Sync all your woocommerce data to HubSpot" -msgstr "" - -#: includes/class-hubwoo.php:456 -msgid "Deals" -msgstr "" - -#: includes/class-hubwoo.php:458 -msgid "Sync All of your woocommerce orders as HubSpot Deals" -msgstr "" - -#: includes/class-hubwoo.php:462 -msgid "Abandoned Carts" -msgstr "" - -#: includes/class-hubwoo.php:464 -msgid "Sync all of the cart abandoners on your website" -msgstr "" - -#: includes/class-hubwoo.php:468 -msgid "Automation" -msgstr "" - -#: includes/class-hubwoo.php:470 -msgid "Create Workflows to Track ROI and Retrieve Abandoned Carts" -msgstr "" - -#: includes/class-hubwoo.php:474 -msgid "Add Ons" -msgstr "" - -#: includes/class-hubwoo.php:476 -msgid "Add-ons for the HubSpot Integrations" -msgstr "" - -#: includes/class-hubwoo.php:479 makewebbetter-hubspot-for-woocommerce.php:165 -msgid "Settings" -msgstr "" - -#: includes/class-hubwoo.php:481 -msgid "General And Advanced Settings" -msgstr "" - -#: includes/class-hubwoo.php:484 -msgid "Logs" -msgstr "" - -#: includes/class-hubwoo.php:486 -msgid "HubSpot Logs" -msgstr "" - -#: includes/class-hubwoo.php:492 includes/class-hubwoo.php:494 -msgid "Support" -msgstr "" - -#: includes/class-hubwoo.php:659 -#, php-format -msgid "" -"Unable to locate file path at location %s some features may not work " -"properly in HubSpot Integration, please contact us!" -msgstr "" - -#: includes/class-hubwoo.php:1436 -msgid "New User Registration" -msgstr "" - -#: includes/class-hubwoo.php:1450 -msgid "When order status changes to Completed" -msgstr "" - -#: includes/class-hubwoo.php:1451 -msgid "When order status changes to Processing" -msgstr "" - -#: includes/class-hubwoo.php:1452 -msgid "When order status changes to Failed" -msgstr "" - -#: includes/class-hubwoo.php:1453 -msgid "When order status changes to On-hold" -msgstr "" - -#: includes/class-hubwoo.php:1454 -msgid "When order status changes to Refunded" -msgstr "" - -#: includes/class-hubwoo.php:1455 -msgid "When order status changes to Cancelled" -msgstr "" - -#: includes/class-hubwoo.php:2218 -msgid "Checkout Abandoned" -msgstr "" - -#: includes/class-hubwoo.php:2225 -msgid "Payment Pending/Failed" -msgstr "" - -#: includes/class-hubwoo.php:2232 -msgid "On hold" -msgstr "" - -#: includes/class-hubwoo.php:2239 -msgid "Processing" -msgstr "" - -#: includes/class-hubwoo.php:2246 -msgid "Completed" -msgstr "" - -#: includes/class-hubwoo.php:2253 -msgid "Refunded/Cancelled" -msgstr "" - -#: includes/class-hubwoo.php:2384 -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#: includes/class-hubwoo.php:2710 -msgid "" -"You are having issues with your MWB HubSpot for WooCommerce sync. Please " -"read this doc on how to fix your integration." -msgstr "" - -#: includes/class-hubwoo.php:2960 -msgid "Discount savings" -msgstr "" - -#: includes/class-hubwoo.php:2968 -msgid "Order number" -msgstr "" - -#: includes/class-hubwoo.php:2976 -msgid "Shipment IDs" -msgstr "" - -#: includes/class-hubwoo.php:2984 -msgid "Tax amount" -msgstr "" - -#: includes/class-hubwoo.php:3004 -msgid "Store Product Id" -msgstr "" - -#: includes/class-hubwoo.php:3012 -msgid "Product Source Store" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:165 -msgid "Fetching and refreshing access token" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:184 -msgid "You are forbidden to use this scope" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:186 -msgid "Something went wrong." -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:227 -msgid "Getting access token information" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:359 -#: includes/class-hubwooconnectionmananager.php:485 -msgid "Creating " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:406 -msgid "Reading object property" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:438 -msgid "Creating Properties" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:533 -msgid "Updating Properties" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:577 -msgid "Fetch batch properties" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:620 -msgid "Creating Single Contact" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:664 -msgid "Updating or Creating users data" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:770 -msgid "Updating or Creating single users data" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:814 -msgid "Creating Lists" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:844 -msgid "--Please Select a Static List--" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:862 -msgid "Get Static Lists" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:913 -msgid "Get Dynamic Lists" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:963 -msgid "Enrolling in Static List" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1004 -msgid "Creating Workflows" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1032 -#: includes/class-hubwooconnectionmananager.php:1093 -msgid "--Please Select a Workflow--" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1055 -msgid "Getting all Workflows" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1116 -msgid "Get single Workflows" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1158 -msgid "Enrolling in Workflow" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1258 -msgid "Fetching all " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1295 -msgid "Fetching Contact Lists" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1332 -msgid "Fetching Contacts from List" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1376 -msgid "Fetching " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1405 -msgid "Creating single " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1452 -msgid "Updated single " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1496 -msgid "Search single " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1553 -msgid "Fetching Batch " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1583 -msgid "Creating bulk " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1629 -msgid "Updated bulk " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1684 -msgid "Associate " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1730 -msgid "Delete association " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1776 -msgid "Associate batch " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1821 -msgid "Delete batch association " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1873 -msgid "Fetching marketing emails" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1901 -msgid "Creating marketing email." -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1962 -msgid "Removing Deal Association With Contact" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2007 -msgid "Creating Deal Association With Contact" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2052 -msgid "Creating Deal Association With Company" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2092 -msgid "Updating HubSpot Deals" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2121 -msgid "Creating deal custom groups" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2164 -msgid "Creating deal custom properties" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2217 -msgid "Updating HubSpot Deal Properties" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2253 -#: includes/class-hubwooconnectionmananager.php:2290 -msgid "Fetching Contact VID by email" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2328 -msgid "Creating New deal" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2371 -msgid "Fetch all pipeline" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2418 -msgid "Get deal pipeline info" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2445 -msgid "Creating deal pipeline" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2500 -msgid "Updating the ecommerce pipeline deal stages" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2562 -msgid "Creating or Updating Store" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2687 -msgid "Creating a form data" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2729 -msgid "Submitting Form data" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2769 -msgid "Fetching Batch Vids" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2807 -msgid "Fetching All Forms" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2849 -msgid "Fetching Contact by email" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2888 -msgid "Updating HubSpot Products" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:149 -msgid "Order Information" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:155 -#: includes/class-hubwoocontactproperties.php:563 -msgid "Products Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:161 -msgid "Shopping Cart Information" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:167 -msgid "Customer Group" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:173 -#: includes/class-hubwoocontactproperties.php:858 -msgid "Categories Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:178 -msgid "RFM Information" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:183 -#: includes/class-hubwoocontactproperties.php:875 -msgid "SKUs Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:188 -msgid "ROI Tracking" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:193 -msgid "Abandoned Cart Details" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:375 -msgid "Customer Group/ User role" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:383 -msgid "Accepts Marketing" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:392 -msgid "Marketing Newsletter" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:401 -msgid "Shopping Cart ID" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:418 -msgid "Shipping Address Line 1" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:426 -msgid "Shipping Address Line 2" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:434 -msgid "Shipping City" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:442 -msgid "Shipping State" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:450 -msgid "Shipping Postal Code" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:458 -msgid "Shipping Country" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:466 -msgid "Billing Address Line 1" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:474 -msgid "Billing Address Line 2" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:482 -msgid "Billing City" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:490 -msgid "Billing State" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:498 -msgid "Billing Postal Code" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:506 -msgid "Billing Country" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:515 -msgid "Last Product Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:523 -msgid "Last Product Types Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:531 -msgid "Last Products Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:539 -msgid "Last Products Bought HTML" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:547 -msgid "Last Total Number Of Products Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:555 -msgid "Product Types Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:571 -msgid "Total Number Of Products Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:579 -msgid "Last Products Bought Product 1 Image URL" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:587 -msgid "Last Products Bought Product 1 Name" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:595 -msgid "Last Products Bought Product 1 Price" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:604 -msgid "Last Products Bought Product 1 Url" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:612 -msgid "Last Products Bought Product 2 Image URL" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:620 -msgid "Last Products Bought Product 2 Name" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:628 -msgid "Last Products Bought Product 2 Price" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:637 -msgid "Last Products Bought Product 2 Url" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:645 -msgid "Last Products Bought Product 3 Image URL" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:653 -msgid "Last Products Bought Product 3 Name" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:661 -msgid "Last Products Bought Product 3 Price" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:670 -msgid "Last Products Bought Product 3 Url" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:679 -msgid "Last Order Status" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:688 -msgid "Last Order Fulfillment Status" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:697 -msgid "Last Order Tracking Number" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:705 -msgid "Last Order Tracking URL" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:713 -msgid "Last Order Shipment Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:721 -msgid "Last Order Number" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:729 -msgid "Last Order Currency" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:737 -msgid "Total Number of Current Orders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:746 -msgid "Total Value of Orders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:755 -msgid "Average Order Value" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:764 -msgid "Total Number of Orders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:772 -msgid "First Order Value" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:781 -msgid "First Order Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:789 -msgid "Last Order Value" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:798 -msgid "Last Order Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:806 -msgid "Average Days Between Orders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:814 -msgid "Account Creation Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:822 -msgid "Monetary Rating" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:831 -msgid "Order Frequency Rating" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:840 -msgid "Order Recency Rating" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:850 -msgid "Last Categories Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:867 -msgid "Last SKUs Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:884 -msgid "Last Subscription Order Number" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:892 -msgid "Last Subscription Parent Order Number" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:900 -msgid "Last Subscription Order Status" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:909 -msgid "Last Subscription Order Creation Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:917 -msgid "Last Subscription Order Paid Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:925 -msgid "Last Subscription Order Completed Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:933 -msgid "Related Last Order Creation Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:941 -msgid "Related Last Order Paid Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:949 -msgid "Related Last Order Completed Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:957 -msgid "Last Subscription Trial End Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:965 -msgid "Last Subscription Next Payment Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:973 -msgid "Last Subscription Billing Period" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:982 -msgid "Last Subscription Billing Interval" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:991 -msgid "Last Subscription Products" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1000 -msgid "Customer New Order" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1008 -msgid "Abandoned Cart Recovery Workflow Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1017 -msgid "Abandoned Cart Recovery Workflow Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1026 -msgid "Abandoned Cart Recovery Workflow Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1034 -msgid "Abandoned Cart Recovery Workflow Start Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1042 -msgid "Current ROI Campaign" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1051 -msgid "Customer Reengagement Workflow Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1060 -msgid "Customer Reengagement Workflow Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1069 -msgid "Customer Reengagement Workflow Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1077 -msgid "Customer Reengagement Workflow Start Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1085 -msgid "Customer Rewards Workflow Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1094 -msgid "Customer Rewards Workflow Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1103 -msgid "Customer Rewards Workflow Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1111 -msgid "Customer Rewards Workflow Start Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1119 -msgid "MQL Capture, Nurture & Conversion Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1128 -msgid "MQL Capture, Nurture & Conversion Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1137 -msgid "MQL Capture, Nurture & Conversion Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1145 -msgid "MQL Capture, Nurture & Conversion Start date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1153 -msgid "New Customer Workflow Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1162 -msgid "New Customer Workflow Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1171 -msgid "New Customer Workflow Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1179 -msgid "New Customer Workflow Start Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1187 -msgid "Second Purchase Workflow Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1196 -msgid "Second Purchase Workflow Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1205 -msgid "Second Purchase Workflow Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1213 -msgid "Second Purchase Workflow Start Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1221 -msgid "Third Purchase Workflow Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1230 -msgid "Third Purchase Workflow Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1239 -msgid "Third Purchase Workflow Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1247 -msgid "Third Purchase Workflow Start Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1256 -msgid "Current Abandoned Cart" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1265 -msgid "Abandoned Cart Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1273 -msgid "Abandoned Cart Counter" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1281 -msgid "Abandoned Cart URL" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1289 -msgid "Abandoned Cart Products SKUs" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1297 -msgid "Abandoned Cart Products Categories" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1305 -msgid "Abandoned Cart Products" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1313 -msgid "Abandoned Cart Products HTML" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1321 -msgid "Abandoned Cart Tax Value" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1330 -msgid "Abandoned Cart Subtotal" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1339 -msgid "Abandoned Cart Total Value" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1378 -msgid "Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1394 -msgid "Leads" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1410 -msgid "Abandoned Cart" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1426 -msgid "Best Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1454 -msgid "Big Spenders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1470 -msgid "Loyal Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1492 -msgid "Churning Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1520 -msgid "Low Value Lost Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1548 -msgid "New Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1570 -msgid "Customers needing attention" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1598 -msgid "About to Sleep" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1626 -msgid "Mid Spenders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1642 -msgid "Low Spenders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1658 -msgid "Newsletter Subscriber" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1674 -msgid "One time purchase customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1690 -msgid "Two time purchase customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1706 -msgid "Three time purchase customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1722 -msgid "Bought four or more times" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1738 -msgid "Marketing Qualified Leads" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1753 -msgid "Engaged Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1772 -msgid "DisEngaged Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1800 -msgid "Repeat Buyers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:2924 -msgid "Checkout" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:2928 -msgid "Registration" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:2932 -msgid "Others" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3022 -msgid "Day" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3026 -msgid "Week" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3030 -msgid "Month" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3034 -msgid "Year" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3053 -msgid "Every" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3057 -msgid "Every Second" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3061 -msgid "Every Third" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3065 -msgid "Every Fourth" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3069 -msgid "Every Fifth" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3073 -msgid "Every Sixth" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3258 -msgid "Price" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3258 -msgid "Discount" -msgstr "" - -#: makewebbetter-hubspot-for-woocommerce.php:127 -msgid "Onboarding Services" -msgstr "" - -#: makewebbetter-hubspot-for-woocommerce.php:128 -msgid "Docs" -msgstr "" - -#: makewebbetter-hubspot-for-woocommerce.php:129 -msgid "KB" -msgstr "" - -#: makewebbetter-hubspot-for-woocommerce.php:171 -msgid "Get Premium Support" -msgstr "" - -#: makewebbetter-hubspot-for-woocommerce.php:243 -msgid "" -"WooCommerce is not activated. Please activate WooCommerce first to install " -"MWB HubSpot for WooCommerce" -msgstr "" - -#: makewebbetter-hubspot-for-woocommerce.php:263 -msgid "" -"Oops! You tried activating the MWB HubSpot for WooCommerce without " -"deactivating the another version of the integration created by " -"MakewebBetter. Kindly deactivate the other version of HubSpot WooCommerce " -"Integration and then try again." -msgstr "" diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/languages/makewebbetter-hubspot-for-woocommerce.mo b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/languages/makewebbetter-hubspot-for-woocommerce.mo deleted file mode 100644 index 0862f22f..00000000 Binary files a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/languages/makewebbetter-hubspot-for-woocommerce.mo and /dev/null differ diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/languages/makewebbetter-hubspot-for-woocommerce.pot b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/languages/makewebbetter-hubspot-for-woocommerce.pot deleted file mode 100644 index e96fa35d..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/languages/makewebbetter-hubspot-for-woocommerce.pot +++ /dev/null @@ -1,2499 +0,0 @@ -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: MWB HubSpot for WooCommerce 1.5.6\n" -"POT-Creation-Date: 2024-06-03 11:58+0530\n" -"PO-Revision-Date: 2024-03-05 15:13+0530\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: en_US\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.4.3\n" -"X-Poedit-Basepath: ..\n" -"X-Poedit-SourceCharset: UTF-8\n" -"X-Poedit-KeywordsList: __;_e;_n;_x;_ex;_nx;esc_attr__;esc_attr_e;esc_attr_x;" -"esc_html;esc_html__;esc_html_e;esc_html_x;_n_noop;_nx_noop;" -"translate_nooped_plural\n" -"X-Poedit-SearchPath-0: .\n" - -#: admin/class-hubwoo-admin.php:108 -#, php-format -msgid "Please enter in decimal (%s) format without thousand separators." -msgstr "" - -#: admin/class-hubwoo-admin.php:110 -#, php-format -msgid "" -"Please enter in monetary decimal (%s) format without thousand separators and " -"currency symbols." -msgstr "" - -#: admin/class-hubwoo-admin.php:111 -msgid "Please enter in country code with two capital letters." -msgstr "" - -#: admin/class-hubwoo-admin.php:112 -msgid "Please enter in a value less than the regular price." -msgstr "" - -#: admin/class-hubwoo-admin.php:116 -msgid "Import" -msgstr "" - -#: admin/class-hubwoo-admin.php:117 -msgid "Export" -msgstr "" - -#: admin/class-hubwoo-admin.php:135 -msgid "Something went wrong, please try again later!" -msgstr "" - -#: admin/class-hubwoo-admin.php:136 -msgid "Setup is completed successfully!" -msgstr "" - -#: admin/class-hubwoo-admin.php:137 -msgid "Mail not sent" -msgstr "" - -#: admin/class-hubwoo-admin.php:138 -msgid "Mail Sent Successfully. We will get back to you soon." -msgstr "" - -#: admin/class-hubwoo-admin.php:139 -msgid "" -"Want to continue to switch to new HubSpot account? This cannot be reverted " -"and will require running the whole setup again." -msgstr "" - -#: admin/class-hubwoo-admin.php:140 -msgid "Doing rollback will require running the whole setup again. Continue?" -msgstr "" - -#: admin/class-hubwoo-admin.php:142 -msgid "Please select a list to proceed" -msgstr "" - -#: admin/class-hubwoo-admin.php:143 -msgid "Congratulations !! Your data has been synced successfully." -msgstr "" - -#: admin/class-hubwoo-admin.php:144 -msgid "" -"Something went wrong, Please check the error log and try re-sync your data." -msgstr "" - -#: admin/class-hubwoo-admin.php:170 -msgid "HubSpot" -msgstr "" - -#: admin/class-hubwoo-admin.php:283 -msgid "We use your email to send your Orders related data over HubSpot." -msgstr "" - -#: admin/class-hubwoo-admin.php:285 -msgid "" -"HubSpot is an inbound marketing and sales platform that helps companies " -"attract visitors, convert leads, and close customers." -msgstr "" - -#: admin/class-hubwoo-admin.php:287 -msgid "Please see the " -msgstr "" - -#: admin/class-hubwoo-admin.php:287 -msgid "HubSpot Data Privacy" -msgstr "" - -#: admin/class-hubwoo-admin.php:287 -msgid " for more details." -msgstr "" - -#: admin/class-hubwoo-admin.php:291 -msgid "MWB HubSpot for WooCommerce" -msgstr "" - -#: admin/class-hubwoo-admin.php:314 -msgid "Export your users and customers to HubSpot" -msgstr "" - -#: admin/class-hubwoo-admin.php:320 -msgid "Select user role" -msgstr "" - -#: admin/class-hubwoo-admin.php:323 -msgid "Select a user role from the dropdown. Default will be all user roles." -msgstr "" - -#: admin/class-hubwoo-admin.php:328 -msgid "user-role" -msgstr "" - -#: admin/class-hubwoo-admin.php:333 admin/class-hubwoo-admin.php:2502 -msgid "Select a time period" -msgstr "" - -#: admin/class-hubwoo-admin.php:337 -msgid "Date range for user / order sync" -msgstr "" - -#: admin/class-hubwoo-admin.php:341 -msgid "Users registered from date" -msgstr "" - -#: admin/class-hubwoo-admin.php:346 -msgid "From which date you want to sync the users, select that" -msgstr "" - -#: admin/class-hubwoo-admin.php:350 -msgid "from-date" -msgstr "" - -#: admin/class-hubwoo-admin.php:354 -msgid "Users registered upto date" -msgstr "" - -#: admin/class-hubwoo-admin.php:358 admin/class-hubwoo-admin.php:2525 -msgid "dd-mm-yyyy" -msgstr "" - -#: admin/class-hubwoo-admin.php:359 -msgid "Upto which date you want to sync the users, select that date" -msgstr "" - -#: admin/class-hubwoo-admin.php:363 -msgid "upto-date" -msgstr "" - -#: admin/class-hubwoo-admin.php:540 -msgid "View Document" -msgstr "" - -#: admin/class-hubwoo-admin.php:629 -msgid "" -"The HubSpot for WooCommerce plugin isn’t connected right now. To start sync " -"store data to HubSpot " -msgstr "" - -#: admin/class-hubwoo-admin.php:630 -msgid "connect the plugin now." -msgstr "" - -#: admin/class-hubwoo-admin.php:715 -msgid "" -"We noticed you're using WooCommerce HPOS. To ensure compatibility with the " -"HubSpot WooCommerce plugin, please install the HPOS Addon." -msgstr "" - -#: admin/class-hubwoo-admin.php:718 -msgid "Install Now" -msgstr "" - -#: admin/class-hubwoo-admin.php:778 -#: includes/class-hubwoocontactproperties.php:225 -msgid "Subscriptions Details" -msgstr "" - -#: admin/class-hubwoo-admin.php:1146 -msgid "HubSpot Actions" -msgstr "" - -#: admin/class-hubwoo-admin.php:1162 admin/templates/hubwoo-overview.php:121 -msgid "Abandoned Cart Settings" -msgstr "" - -#: admin/class-hubwoo-admin.php:1168 admin/class-hubwoo-admin.php:2419 -#: admin/class-hubwoo-admin.php:2449 -msgid "Enable/Disable" -msgstr "" - -#: admin/class-hubwoo-admin.php:1170 -msgid "Track Abandoned Carts" -msgstr "" - -#: admin/class-hubwoo-admin.php:1176 -msgid "Guest Users " -msgstr "" - -#: admin/class-hubwoo-admin.php:1178 -msgid "Track Guest Abandoned Carts" -msgstr "" - -#: admin/class-hubwoo-admin.php:1184 -msgid "Delete Old Data " -msgstr "" - -#: admin/class-hubwoo-admin.php:1186 -msgid "Delete Abandoned Carts Data" -msgstr "" - -#: admin/class-hubwoo-admin.php:1192 -msgid "Delete Data Timer( Days )" -msgstr "" - -#: admin/class-hubwoo-admin.php:1195 -msgid "Delete Abandoned cart data form woocommerce store." -msgstr "" - -#: admin/class-hubwoo-admin.php:1202 -msgid "Cart Timer( Minutes )" -msgstr "" - -#: admin/class-hubwoo-admin.php:1205 -msgid "" -"Set the timer for abandoned cart. Customers abandoned cart data will be " -"updated over HubSpot after the specified timer. Minimum value is 5 minutes." -msgstr "" - -#: admin/class-hubwoo-admin.php:1441 -#: includes/class-hubwoocontactproperties.php:3258 -msgid "Image" -msgstr "" - -#: admin/class-hubwoo-admin.php:1441 -#: includes/class-hubwoocontactproperties.php:3258 -msgid "Item" -msgstr "" - -#: admin/class-hubwoo-admin.php:1441 -#: includes/class-hubwoocontactproperties.php:3258 -msgid "Qty" -msgstr "" - -#: admin/class-hubwoo-admin.php:1441 -msgid "Cost" -msgstr "" - -#: admin/class-hubwoo-admin.php:1441 -#: includes/class-hubwoocontactproperties.php:3258 -msgid "Total" -msgstr "" - -#: admin/class-hubwoo-admin.php:1802 -#: includes/class-hubwoocontactproperties.php:2904 -#: includes/class-hubwoocontactproperties.php:3001 -#: includes/class-hubwoocontactproperties.php:3188 -msgid "Yes" -msgstr "" - -#: admin/class-hubwoo-admin.php:1806 -#: includes/class-hubwoocontactproperties.php:2908 -#: includes/class-hubwoocontactproperties.php:3005 -#: includes/class-hubwoocontactproperties.php:3192 -msgid "No" -msgstr "" - -#: admin/class-hubwoo-admin.php:1830 -#: admin/templates/hubwoo-general-settings.php:303 -msgid "Plugin Settings" -msgstr "" - -#: admin/class-hubwoo-admin.php:1836 -msgid "Sync with User Role" -msgstr "" - -#: admin/class-hubwoo-admin.php:1840 -msgid "" -"The users with selected roles will be synced on HubSpot. Default will be all " -"user roles." -msgstr "" - -#: admin/class-hubwoo-admin.php:1848 -msgid "WooCommerce Subscription" -msgstr "" - -#: admin/class-hubwoo-admin.php:1851 -msgid "Enable subscriptions data sync" -msgstr "" - -#: admin/class-hubwoo-admin.php:1858 -msgid "Show Checkbox on Checkout Page" -msgstr "" - -#: admin/class-hubwoo-admin.php:1861 -msgid "Show Opt-In checkbox on Checkout Page" -msgstr "" - -#: admin/class-hubwoo-admin.php:1867 -msgid "Checkbox Label on Checkout Page" -msgstr "" - -#: admin/class-hubwoo-admin.php:1870 admin/class-hubwoo-admin.php:1888 -msgid "Label to show for the checkbox" -msgstr "" - -#: admin/class-hubwoo-admin.php:1872 admin/class-hubwoo-admin.php:1890 -#: public/class-hubwoo-public.php:198 public/class-hubwoo-public.php:219 -msgid "Subscribe" -msgstr "" - -#: admin/class-hubwoo-admin.php:1876 -msgid "Show Checkbox on My Account Page" -msgstr "" - -#: admin/class-hubwoo-admin.php:1879 -msgid "Show Opt-In checkbox on My Account Page (Registration form)" -msgstr "" - -#: admin/class-hubwoo-admin.php:1885 -msgid "Checkbox Label on My Account Page" -msgstr "" - -#: admin/class-hubwoo-admin.php:1894 -msgid "Calculate ROI for the Selected Status" -msgstr "" - -#: admin/class-hubwoo-admin.php:1898 -msgid "" -"Select an order status from the dropdown for which the new order property " -"will be set/changed on each sync. Default Order Status is Completed" -msgstr "" - -#: admin/class-hubwoo-admin.php:2412 -msgid "Apply your settings for Deals and its stages" -msgstr "" - -#: admin/class-hubwoo-admin.php:2421 -msgid "Allow to sync new deals" -msgstr "" - -#: admin/class-hubwoo-admin.php:2428 -msgid "Days required to close a deal" -msgstr "" - -#: admin/class-hubwoo-admin.php:2431 -msgid "" -"set the minimum number of days in which the pending/open deals can be closed/" -"won" -msgstr "" - -#: admin/class-hubwoo-admin.php:2439 -msgid "Winning Deal Stages" -msgstr "" - -#: admin/class-hubwoo-admin.php:2443 -msgid "" -"select the deal stages of ecommerce pipeline which are won according to your " -"business needs. \"Processing\" and \"Completed\" are default winning stages " -"for extension as well as HubSpot" -msgstr "" - -#: admin/class-hubwoo-admin.php:2451 -msgid "Allow to associate deal and company" -msgstr "" - -#: admin/class-hubwoo-admin.php:2458 -msgid "Enable Multi Currency\tSync" -msgstr "" - -#: admin/class-hubwoo-admin.php:2460 -msgid "Enable to sync currency if you are using multi currency on your site." -msgstr "" - -#: admin/class-hubwoo-admin.php:2485 -msgid "Export your old orders as Deals on HubSpot" -msgstr "" - -#: admin/class-hubwoo-admin.php:2492 -msgid "Select order status" -msgstr "" - -#: admin/class-hubwoo-admin.php:2495 -msgid "" -"Select a order status from the dropdown and all orders for the selected " -"status will be synced as deals" -msgstr "" - -#: admin/class-hubwoo-admin.php:2504 -msgid " Date range for orders" -msgstr "" - -#: admin/class-hubwoo-admin.php:2510 -msgid "Orders from date" -msgstr "" - -#: admin/class-hubwoo-admin.php:2515 -msgid "From which date you want to sync the orders, select that date" -msgstr "" - -#: admin/class-hubwoo-admin.php:2521 -msgid "Orders up to date" -msgstr "" - -#: admin/class-hubwoo-admin.php:2526 -msgid "Up to which date you want to sync the orders, select that date" -msgstr "" - -#: admin/class-hubwoo-admin.php:3182 -#: includes/class-hubwoocontactproperties.php:409 -msgid "Customer Source Store" -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:20 -msgid "HubSpot Recommended Products Addon" -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:24 -msgid "" -"Recommend related products automatically to increase average order value at " -"your store. With this add-on, you can select the products you want to offer " -"as recommendations and send them through automated emails after the purchase." -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:30 admin/templates/hubwoo-add-ons.php:49 -msgid "$79 Buy Now" -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:39 -msgid "HubSpot Field To Field Sync" -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:43 -msgid "" -"Automate the process of syncing all of your customer information to HubSpot " -"for quicker access and efficient decision making process. With Field to " -"Field Sync for HubSpot, you can easily map HubSpot contact properties and " -"the WordPress users’ fields." -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:58 -msgid "HubSpot Deals For WooCommerce Memberships" -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:62 -msgid "" -"HubSpot Deals for WooCommerce Memberships enables you to organize your site " -"members as HubSpot deals with relevant deal stage, plans and the opening and " -"closing dates." -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:68 -msgid "$59 Buy Now" -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:77 -msgid "HubSpot Automated Coupons" -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:81 -msgid "" -"Create and send discount coupon codes automatically to your customers using " -"HubSpot. Also, monitor your coupon usage with automated coupons." -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:87 admin/templates/hubwoo-add-ons.php:107 -#: admin/templates/hubwoo-add-ons.php:126 -#: admin/templates/hubwoo-add-ons.php:145 -#: admin/templates/hubwoo-add-ons.php:164 admin/templates/hubwoo-support.php:80 -#: admin/templates/hubwoo-support.php:132 -msgid "Get Started" -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:92 -msgid "Additional Services" -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:97 -msgid "HubSpot Onboarding Services" -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:101 -msgid "" -"Maximize your business’s potential with our HubSpot Onboarding Services. Our " -"onboarding services include a personalized approach to streamline HubSpot " -"implementation and training processes." -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:116 -msgid "Custom App/Integration Development Services" -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:120 -msgid "" -"Scale your business to new heights with unique functionalities and features " -"that your customers will love. Get our dedicated HubSpot custom app/" -"integration services to fulfill your unique business needs." -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:135 -msgid "HubSpot Themes" -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:139 -msgid "" -"Create aesthetic & responsive web pages with minimal efforts with HubSpot " -"themes and offer a great experience on every device." -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:154 -msgid "HubSpot Migration Services" -msgstr "" - -#: admin/templates/hubwoo-add-ons.php:158 -msgid "" -"Our HubSpot Migration Services help you to migrate your website from any CMS " -"to HubSpot along with the blogs, automations, leads, deals, SMSs, calls & " -"emails, etc. with experienced Hubspot migration consultants." -msgstr "" - -#: admin/templates/hubwoo-automation.php:28 -msgid "Automate your marketing, sales, and services" -msgstr "" - -#: admin/templates/hubwoo-automation.php:31 -msgid "Upgrade your HubSpot plan to create automated workflows." -msgstr "" - -#: admin/templates/hubwoo-automation.php:34 -#: admin/templates/hubwoo-general-settings.php:383 -#: admin/templates/setup/hubwoo-list-setup.php:42 -msgid "Upgrade plan" -msgstr "" - -#: admin/templates/hubwoo-automation.php:36 -#: admin/templates/hubwoo-general-settings.php:384 -#: admin/templates/setup/hubwoo-list-setup.php:43 -msgid "Skip this step" -msgstr "" - -#: admin/templates/hubwoo-automation.php:43 -#: admin/templates/hubwoo-general-settings.php:391 -#: admin/templates/setup/hubwoo-list-setup.php:50 -msgid "Connect with MakeWebBetter to learn more about HubSpot’s plans" -msgstr "" - -#: admin/templates/hubwoo-automation.php:46 -#: admin/templates/setup/hubwoo-list-setup.php:53 -msgid "" -"MakeWebBetter is a HubSpot Elite Solutions Partner. Schedule a meeting with " -"our experts to learn more about HubSpot." -msgstr "" - -#: admin/templates/hubwoo-automation.php:48 -#: admin/templates/hubwoo-general-settings.php:396 -#: admin/templates/setup/hubwoo-list-setup.php:55 -msgid "Schedule meeting" -msgstr "" - -#: admin/templates/hubwoo-automation.php:57 -msgid "Workflow" -msgstr "" - -#: admin/templates/hubwoo-automation.php:58 -msgid "Status" -msgstr "" - -#: admin/templates/hubwoo-automation.php:105 -#: admin/templates/hubwoo-automation.php:122 -#: admin/templates/hubwoo-general-settings.php:161 -#: admin/templates/setup/hubwoo-grp-pr-setup.php:205 -#: admin/templates/setup/hubwoo-list-setup.php:154 -msgid "Create" -msgstr "" - -#: admin/templates/hubwoo-deals.php:34 -msgid "" -"eCommerce scopes are missing, please Re-authorize with a Super Admin account " -"from the dashboard to start eCommerce pipeline setup." -msgstr "" - -#: admin/templates/hubwoo-deals.php:48 -msgid "" -"Connect with HubSpot eCommerce pipeline to create deals for your WooCommerce " -"orders. " -msgstr "" - -#: admin/templates/hubwoo-deals.php:53 admin/templates/hubwoo-deals.php:99 -#: admin/templates/hubwoo-deals.php:204 admin/templates/hubwoo-deals.php:241 -msgid "View" -msgstr "" - -#: admin/templates/hubwoo-deals.php:58 -msgid "Run Setup" -msgstr "" - -#: admin/templates/hubwoo-deals.php:74 -msgid "Stop" -msgstr "" - -#: admin/templates/hubwoo-deals.php:91 -msgid "Map Deal Stages with eCommerce pipeline" -msgstr "" - -#: admin/templates/hubwoo-deals.php:94 -msgid "" -"Sync order statuses with deal stages so you can manage your eCommerce " -"pipeline in HubSpot." -msgstr "" - -#: admin/templates/hubwoo-deals.php:108 -#: admin/templates/setup/hubwoo-pipeline-setup.php:32 -msgid "Select Pipeline" -msgstr "" - -#: admin/templates/hubwoo-deals.php:137 -#: admin/templates/setup/hubwoo-pipeline-setup.php:61 -msgid "WooCommerce Order Status" -msgstr "" - -#: admin/templates/hubwoo-deals.php:138 -#: admin/templates/hubwoo-main-template.php:190 -#: admin/templates/setup/hubwoo-pipeline-setup.php:62 -msgid "Deal Stage" -msgstr "" - -#: admin/templates/hubwoo-deals.php:181 -#: admin/templates/setup/hubwoo-pipeline-setup.php:107 -msgid " Reset to Default Mapping" -msgstr "" - -#: admin/templates/hubwoo-deals.php:196 -msgid "Create Deals for New Orders" -msgstr "" - -#: admin/templates/hubwoo-deals.php:199 -msgid "" -"Create Deals in real time for the new orders that are mapped with winning " -"deal stages." -msgstr "" - -#: admin/templates/hubwoo-deals.php:233 -msgid "Sync Historical Orders as Deals" -msgstr "" - -#: admin/templates/hubwoo-deals.php:236 -msgid "" -"Select Order status and the time frame and start syncing all of those orders " -"as deals in HubSpot." -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:32 -msgid "Basic Settings" -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:37 -#: admin/templates/hubwoo-main-template.php:178 -msgid "Groups & Properties" -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:41 -msgid "" -"Groups & properties are used to store data on certain objects in HubSpot, " -"such as contacts, companies, deals, and tickets. You can have up to 1,000 " -"properties per object, including the default HubSpot properties." -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:47 -#: admin/templates/hubwoo-general-settings.php:234 -#: admin/templates/hubwoo-general-settings.php:316 -#: admin/templates/hubwoo-general-settings.php:359 -msgid "Manage" -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:75 -#: admin/templates/setup/hubwoo-grp-pr-setup.php:112 -msgid "Required Group for Lists & Workflows" -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:103 -#: admin/templates/setup/hubwoo-grp-pr-setup.php:140 -msgid "Required Property for Lists & Workflows" -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:224 -#: admin/templates/hubwoo-main-template.php:184 -msgid "Lists" -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:228 -msgid "" -"Lists are HubSpot lists that update automatically, enrolling the contacts " -"who meet the membership criteria and removing those who no longer meet it." -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:295 -msgid "Advanced Settings" -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:308 -msgid "Manage all your HubSpot plugin's additional settings from here." -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:345 -msgid "RFM Settings( Manage ROI Tracking )" -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:350 -msgid "" -"RFM (Recency, Frequency and Monetary) segmentation allows marketers to " -"target specific clusters of customers with communications that are much more " -"relevant for their particular behavior – and thus generate much higher rates " -"of response, plus increased loyalty and customer lifetime value." -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:377 -#: admin/templates/setup/hubwoo-list-setup.php:36 -msgid "Create more dynamic / active lists" -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:380 -#: admin/templates/setup/hubwoo-list-setup.php:39 -msgid "" -"You have reached maximum limit of Dynamic / Active Lists creation as per " -"your CRM plan." -msgstr "" - -#: admin/templates/hubwoo-general-settings.php:394 -msgid "" -"MakeWebBetter is a HubSpot Elite Solutions Partner. Schedule a meeting with " -"our experts to learn more about HubSpot" -msgstr "" - -#: admin/templates/hubwoo-logs.php:18 -msgid "Sync Log" -msgstr "" - -#: admin/templates/hubwoo-logs.php:25 -msgid "Clear Log" -msgstr "" - -#: admin/templates/hubwoo-logs.php:30 admin/templates/hubwoo-support.php:114 -msgid "Download" -msgstr "" - -#: admin/templates/hubwoo-logs.php:41 -msgid "Expand" -msgstr "" - -#: admin/templates/hubwoo-logs.php:42 -msgid "Feed" -msgstr "" - -#: admin/templates/hubwoo-logs.php:46 -msgid " Object" -msgstr "" - -#: admin/templates/hubwoo-logs.php:49 -msgid "Time" -msgstr "" - -#: admin/templates/hubwoo-logs.php:50 -msgid "Request" -msgstr "" - -#: admin/templates/hubwoo-logs.php:51 -msgid "Response" -msgstr "" - -#: admin/templates/hubwoo-logs.php:58 -msgid "Please enable the log" -msgstr "" - -#: admin/templates/hubwoo-main-template.php:96 -msgid "" -"Your contacts are syncing in the background so you can safely leave this " -"page." -msgstr "" - -#: admin/templates/hubwoo-main-template.php:110 -msgid "Stop Sync" -msgstr "" - -#: admin/templates/hubwoo-main-template.php:171 -#: includes/class-hubwoocontactproperties.php:3168 -msgid "1" -msgstr "" - -#: admin/templates/hubwoo-main-template.php:172 -msgid "Connection" -msgstr "" - -#: admin/templates/hubwoo-main-template.php:177 -#: includes/class-hubwoocontactproperties.php:3164 -msgid "2" -msgstr "" - -#: admin/templates/hubwoo-main-template.php:183 -#: includes/class-hubwoocontactproperties.php:3160 -msgid "3" -msgstr "" - -#: admin/templates/hubwoo-main-template.php:189 -#: includes/class-hubwoocontactproperties.php:3156 -msgid "4" -msgstr "" - -#: admin/templates/hubwoo-main-template.php:195 -#: includes/class-hubwoocontactproperties.php:3152 -msgid "5" -msgstr "" - -#: admin/templates/hubwoo-main-template.php:196 -msgid "Sync" -msgstr "" - -#: admin/templates/hubwoo-overview.php:25 -msgid "Disconnect your WooCommerce store from HubSpot" -msgstr "" - -#: admin/templates/hubwoo-overview.php:27 -msgid "" -"Do you want to delete all your WooCommerce data from HubSpot? If yes, check " -"the box." -msgstr "" - -#: admin/templates/hubwoo-overview.php:34 -msgid "Confirm and Disconnect" -msgstr "" - -#: admin/templates/hubwoo-overview.php:35 -msgid "Cancel and Go Back" -msgstr "" - -#: admin/templates/hubwoo-overview.php:46 -msgid "Connected Hubspot Account" -msgstr "" - -#: admin/templates/hubwoo-overview.php:50 -msgid "Re-Authorize your Account" -msgstr "" - -#: admin/templates/hubwoo-overview.php:56 -msgid "Disconnect Store" -msgstr "" - -#: admin/templates/hubwoo-overview.php:59 -msgid "Open HubSpot" -msgstr "" - -#: admin/templates/hubwoo-overview.php:68 -msgid "CONTACTS SYNCED" -msgstr "" - -#: admin/templates/hubwoo-overview.php:73 -msgid "DEALS SYNCED" -msgstr "" - -#: admin/templates/hubwoo-overview.php:78 -msgid "PRODUCTS SYNCED" -msgstr "" - -#: admin/templates/hubwoo-overview.php:92 -msgid "Sync WooCommerce orders with HubSpot eCommerce pipeline" -msgstr "" - -#: admin/templates/hubwoo-overview.php:98 -msgid "" -"Automatically create deals in your HubSpot sales pipeline when new " -"WooCommerce orders are created." -msgstr "" - -#: admin/templates/hubwoo-overview.php:104 -msgid "Deals Settings" -msgstr "" - -#: admin/templates/hubwoo-overview.php:111 -msgid "Set up abandoned cart capture" -msgstr "" - -#: admin/templates/hubwoo-overview.php:116 -msgid "" -"Automatically track people that have added products to their cart and did " -"not check out." -msgstr "" - -#: admin/templates/hubwoo-overview.php:129 -msgid "Automate your sales, marketing and support" -msgstr "" - -#: admin/templates/hubwoo-overview.php:136 -msgid "" -"Convert more leads into customers, drive more sales, and scale your support." -msgstr "" - -#: admin/templates/hubwoo-overview.php:140 -msgid "This requires a " -msgstr "" - -#: admin/templates/hubwoo-overview.php:143 -msgid "HubSpot Professional or Enterprise plan." -msgstr "" - -#: admin/templates/hubwoo-overview.php:150 -msgid "Automation Settings" -msgstr "" - -#: admin/templates/hubwoo-overview.php:158 -msgid "Manage basic & advanced settings" -msgstr "" - -#: admin/templates/hubwoo-overview.php:165 -msgid "" -"Modify any of your basic & advanced settings to make sure the MWB HubSpot " -"for WooCommerce integration is set up for your business needs." -msgstr "" - -#: admin/templates/hubwoo-overview.php:170 -msgid "View Basic & Advanced Settings" -msgstr "" - -#: admin/templates/hubwoo-overview.php:178 -msgid "Download HubSpot’s WordPress plugin" -msgstr "" - -#: admin/templates/hubwoo-overview.php:185 -msgid "" -"Do even more for your online store with HubSpot’s official WordPress plugin. " -"Download the plugin to easily manage your HubSpot account without navigating " -"away from the WordPress backend." -msgstr "" - -#: admin/templates/hubwoo-overview.php:198 -msgid "User guide documentation" -msgstr "" - -#: admin/templates/hubwoo-overview.php:205 -msgid "" -"To get the most out of the WooCommerce HubSpot integration, check out the " -"user guide documentation for more details." -msgstr "" - -#: admin/templates/hubwoo-overview.php:210 -msgid "View User Guides" -msgstr "" - -#: admin/templates/hubwoo-overview.php:221 -msgid "" -"Our HubSpot Onboarding Services offer a personalized strategy to streamline " -"HubSpot implementations, migrations, integrations, and training." -msgstr "" - -#: admin/templates/hubwoo-support.php:20 -msgid "User Guide and Documentation" -msgstr "" - -#: admin/templates/hubwoo-support.php:24 -msgid "" -"Follow through the steps and directions mentioned in our documentation for " -"hands-on experience." -msgstr "" - -#: admin/templates/hubwoo-support.php:29 -msgid "View Guide" -msgstr "" - -#: admin/templates/hubwoo-support.php:37 -msgid "Knowledgebase of HubSpot Plugins" -msgstr "" - -#: admin/templates/hubwoo-support.php:41 -msgid "" -"Learn more about your HubSpot integration and get your basic queries " -"resolved with our detailed Q/A guides." -msgstr "" - -#: admin/templates/hubwoo-support.php:46 -msgid "Learn More" -msgstr "" - -#: admin/templates/hubwoo-support.php:54 -msgid "Free Support" -msgstr "" - -#: admin/templates/hubwoo-support.php:58 -msgid "" -"We’re available 24/7 at your service. Get connected with our skilled and " -"experienced experts to get your queries resolved in no time." -msgstr "" - -#: admin/templates/hubwoo-support.php:63 -msgid "Connect Us" -msgstr "" - -#: admin/templates/hubwoo-support.php:71 -msgid "Custom Development Service" -msgstr "" - -#: admin/templates/hubwoo-support.php:75 -msgid "" -"Explore our custom development services if you need to get any specific " -"feature for your business process to function more smoothly." -msgstr "" - -#: admin/templates/hubwoo-support.php:88 -msgid "Book a Meeting" -msgstr "" - -#: admin/templates/hubwoo-support.php:92 -msgid "" -"Need personalized and dedicated assistance from our skilled experts? " -"Schedule a 15-minutes meeting and get your business started with HubSpot." -msgstr "" - -#: admin/templates/hubwoo-support.php:97 -msgid "Book Now" -msgstr "" - -#: admin/templates/hubwoo-support.php:105 -msgid "Download Plugin Log File" -msgstr "" - -#: admin/templates/hubwoo-support.php:109 -msgid "" -"Share your log files, if you face troubles working with the plugin, with our " -"tech team." -msgstr "" - -#: admin/templates/hubwoo-support.php:122 -msgid "HubSpot CMS Services" -msgstr "" - -#: admin/templates/hubwoo-support.php:126 -msgid "" -"Build amazingly beautiful and interactive websites with our easy-to-use " -"HubSpot themes." -msgstr "" - -#: admin/templates/hubwoo-sync-contacts.php:31 -msgid "Fetching all of the recently updated and un-synced users / orders" -msgstr "" - -#: admin/templates/hubwoo-sync-contacts.php:33 -#: admin/templates/setup/hubwoo-sync.php:60 -msgid "Sync Now" -msgstr "" - -#: admin/templates/hubwoo-sync-contacts.php:34 -msgid "Schedule Sync" -msgstr "" - -#: admin/templates/hubwoo-sync-contacts.php:40 -msgid "Contact sync is in progress." -msgstr "" - -#: admin/templates/hubwoo-sync-contacts.php:41 -msgid "This should only take a few moments. Thanks for your patience!" -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:23 -msgid "Failed to connect to HubSpot, Try to reconnect or please contact us!" -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:33 -msgid "Getting started with HubSpot and WooCommerce" -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:40 -msgid "" -"With this WooCommerce HubSpot integration, you can automatically sync all " -"your WooCommerce contacts and customers with HubSpot’s CRM and marketing " -"platform." -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:45 -msgid "Once you set up this integration, you will be able to:" -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:48 -msgid "" -"See every action each contact has taken including their page views, past " -"orders, abandoned carts, and more — in HubSpot CRM’s tidy timeline view" -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:49 -msgid "" -"Segment contacts and customers into lists based on their previous " -"interactions with your store" -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:50 -msgid "Easily create and send beautiful, responsive emails to drive sales" -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:51 -msgid "Measure your store’s performance with custom reports and dashboards" -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:56 -msgid "" -"To get started, connect your HubSpot account. If you don’t have a HubSpot " -"account, create one then return to this window to connect it." -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:60 -msgid "Connect your Account" -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:61 -msgid "Create a free HubSpot Account" -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:71 -msgid "Congratulation your account is now connected." -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:81 -msgid "Connected Portal ID : " -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:89 -msgid "Switch to Another Account -" -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:91 -msgid "Click Here" -msgstr "" - -#: admin/templates/setup/hubwoo-connection-setup.php:96 -msgid "Continue" -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:40 -msgid "Set up groups & properties in HubSpot" -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:47 -msgid "" -"In order to view your WooCommerce data correctly in HubSpot, you need to set " -"up groups and properties in your HubSpot account." -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:51 -msgid "" -"Once you set up groups and properties, you can easily see the following " -"information about your contacts and customers:" -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:54 -msgid "Order information" -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:55 -msgid "Previous purchases" -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:56 -msgid "Abandoned cart details" -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:57 -msgid "And more" -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:61 -msgid "Create Groups & Properties " -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:62 -msgid "View Created Properties and Groups " -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:67 -msgid "" -"Group and property creation is in progress. This should only take a few " -"moments. Thanks for your patience!" -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:82 -msgid "" -"Select the Groups and Properties that you need on HubSpot.
\r\n" -"\t\t\t\t\t\t\t\t\tClick on a Group to Select/De-Select its Group Properties." -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:163 -msgid "Create Now" -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:170 -msgid "All of the created Groups and Properties are below." -msgstr "" - -#: admin/templates/setup/hubwoo-grp-pr-setup.php:200 -#: admin/templates/setup/hubwoo-list-setup.php:149 -msgid "Created" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:63 -msgid "Create lists in HubSpot" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:70 -msgid "" -"Set up lists to segment your contacts and customers based on their previous " -"actions and behaviors." -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:77 -msgid "You can set up the following lists:" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:80 -msgid "Leads: contacts that have not yet made any orders" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:81 -msgid "Customers: contacts that have made at least one order" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:82 -msgid "" -"Abandoned Cart: contacts that have added products to their carts, but have " -"not purchased" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:88 -msgid "Create Lists" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:89 -msgid "View All Lists" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:94 -msgid "" -"List creation is in progress. This should only take a few moments. Thanks " -"for your patience!" -msgstr "" - -#: admin/templates/setup/hubwoo-list-setup.php:108 -msgid "Select the Groups and Properties that you need on HubSpot." -msgstr "" - -#: admin/templates/setup/hubwoo-pipeline-setup.php:104 -msgid "Save" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:46 -msgid "Sync WooCommerce data with HubSpot" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:52 -msgid "" -"You’re almost done! The last step is to sync your existing WooCommerce data " -"to HubSpot. This will sync all your Contacts, Deals, and Products data to " -"HubSpot." -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:55 -msgid "" -"Once you sync your data, you’ll see all your WooCommerce information on " -"HubSpot so you can start engaging with them right away." -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:62 -msgid "Skip Historical Data Sync" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:69 -msgid "" -"1. Syncing Your Contacts to HubSpot. This should only take a few moments. " -"Thanks for your patience!" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:77 -msgid "" -"2. Syncing your Products to HubSpot. This should only take a few moments. " -"Thanks for your patience!" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:85 -msgid "" -"3. Syncing your Deals to Hubspot. This should only take a few moments. " -"Thanks for your patience!" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:99 -msgid "" -"Congrats! You’ve successfully set up the MWB HubSpot for WooCommerce plugin" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:106 -msgid "What's next? Go to your dashboard to learn more about the integration." -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:109 -msgid "Visit DashBoard" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:124 -msgid "Get tailored onboarding emails straight to your inbox" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:128 -msgid "Help us make your experience even better by telling us:" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:134 -msgid "Please fill all of the below fields before submission" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:152 -msgid "Choosing the ideal plan for your company might be confusing. " -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:153 -msgid "Connect Us " -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:154 -msgid "and we can assist you for free." -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:158 -msgid "First Name" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:165 -msgid "Last Name" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:172 -msgid "Company Name" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:179 -msgid "Website URL" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:186 -msgid "Email Address" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:193 -msgid "Phone Number" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:200 -msgid "Complete Onboarding" -msgstr "" - -#: admin/templates/setup/hubwoo-sync.php:202 -msgid "Skip for now" -msgstr "" - -#: includes/class-hubwoo-ajax-handler.php:125 -msgid "Success" -msgstr "" - -#: includes/class-hubwoo-ajax-handler.php:139 -msgid "Something went wrong. Please verify your HubSpot Connection once." -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:58 -msgid "Score" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:58 -msgid "Ratings for RFM Segmentation" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:59 -msgid "Recency" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:59 -msgid "Days Since last Order" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:60 -msgid "Frequency" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:60 -msgid "Total Orders Placed" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:61 -msgid "Monetary" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:61 -msgid "Total Money Spent" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:153 -#: includes/class-hubwoo-rfm-configuration.php:162 -#: includes/class-hubwoo-rfm-configuration.php:163 -msgid "Less than" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:154 -#: includes/class-hubwoo-rfm-configuration.php:155 -#: includes/class-hubwoo-rfm-configuration.php:161 -msgid "More than" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:195 -#: includes/class-hubwoo-rfm-configuration.php:196 -#: includes/class-hubwoo-rfm-configuration.php:197 -msgid "From" -msgstr "" - -#: includes/class-hubwoo-rfm-configuration.php:195 -#: includes/class-hubwoo-rfm-configuration.php:196 -#: includes/class-hubwoo-rfm-configuration.php:197 -msgid "To" -msgstr "" - -#: includes/class-hubwoo.php:444 -msgid "Dashboard" -msgstr "" - -#: includes/class-hubwoo.php:446 -msgid "Integrate your WooCommerce store with HubSpot" -msgstr "" - -#: includes/class-hubwoo.php:450 -msgid "Contacts" -msgstr "" - -#: includes/class-hubwoo.php:452 -msgid "Sync all your woocommerce data to HubSpot" -msgstr "" - -#: includes/class-hubwoo.php:456 -msgid "Deals" -msgstr "" - -#: includes/class-hubwoo.php:458 -msgid "Sync All of your woocommerce orders as HubSpot Deals" -msgstr "" - -#: includes/class-hubwoo.php:462 -msgid "Abandoned Carts" -msgstr "" - -#: includes/class-hubwoo.php:464 -msgid "Sync all of the cart abandoners on your website" -msgstr "" - -#: includes/class-hubwoo.php:468 -msgid "Automation" -msgstr "" - -#: includes/class-hubwoo.php:470 -msgid "Create Workflows to Track ROI and Retrieve Abandoned Carts" -msgstr "" - -#: includes/class-hubwoo.php:474 -msgid "Add Ons" -msgstr "" - -#: includes/class-hubwoo.php:476 -msgid "Add-ons for the HubSpot Integrations" -msgstr "" - -#: includes/class-hubwoo.php:479 makewebbetter-hubspot-for-woocommerce.php:165 -msgid "Settings" -msgstr "" - -#: includes/class-hubwoo.php:481 -msgid "General And Advanced Settings" -msgstr "" - -#: includes/class-hubwoo.php:484 -msgid "Logs" -msgstr "" - -#: includes/class-hubwoo.php:486 -msgid "HubSpot Logs" -msgstr "" - -#: includes/class-hubwoo.php:492 includes/class-hubwoo.php:494 -msgid "Support" -msgstr "" - -#: includes/class-hubwoo.php:659 -#, php-format -msgid "" -"Unable to locate file path at location %s some features may not work " -"properly in HubSpot Integration, please contact us!" -msgstr "" - -#: includes/class-hubwoo.php:1436 -msgid "New User Registration" -msgstr "" - -#: includes/class-hubwoo.php:1450 -msgid "When order status changes to Completed" -msgstr "" - -#: includes/class-hubwoo.php:1451 -msgid "When order status changes to Processing" -msgstr "" - -#: includes/class-hubwoo.php:1452 -msgid "When order status changes to Failed" -msgstr "" - -#: includes/class-hubwoo.php:1453 -msgid "When order status changes to On-hold" -msgstr "" - -#: includes/class-hubwoo.php:1454 -msgid "When order status changes to Refunded" -msgstr "" - -#: includes/class-hubwoo.php:1455 -msgid "When order status changes to Cancelled" -msgstr "" - -#: includes/class-hubwoo.php:2218 -msgid "Checkout Abandoned" -msgstr "" - -#: includes/class-hubwoo.php:2225 -msgid "Payment Pending/Failed" -msgstr "" - -#: includes/class-hubwoo.php:2232 -msgid "On hold" -msgstr "" - -#: includes/class-hubwoo.php:2239 -msgid "Processing" -msgstr "" - -#: includes/class-hubwoo.php:2246 -msgid "Completed" -msgstr "" - -#: includes/class-hubwoo.php:2253 -msgid "Refunded/Cancelled" -msgstr "" - -#: includes/class-hubwoo.php:2384 -msgid "HubSpot All-In-One Marketing - Forms, Popups, Live Chat" -msgstr "" - -#: includes/class-hubwoo.php:2710 -msgid "" -"You are having issues with your MWB HubSpot for WooCommerce sync. Please " -"read this doc on how to fix your integration." -msgstr "" - -#: includes/class-hubwoo.php:2960 -msgid "Discount savings" -msgstr "" - -#: includes/class-hubwoo.php:2968 -msgid "Order number" -msgstr "" - -#: includes/class-hubwoo.php:2976 -msgid "Shipment IDs" -msgstr "" - -#: includes/class-hubwoo.php:2984 -msgid "Tax amount" -msgstr "" - -#: includes/class-hubwoo.php:3004 -msgid "Store Product Id" -msgstr "" - -#: includes/class-hubwoo.php:3012 -msgid "Product Source Store" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:165 -msgid "Fetching and refreshing access token" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:184 -msgid "You are forbidden to use this scope" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:186 -msgid "Something went wrong." -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:227 -msgid "Getting access token information" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:359 -#: includes/class-hubwooconnectionmananager.php:485 -msgid "Creating " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:406 -msgid "Reading object property" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:438 -msgid "Creating Properties" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:533 -msgid "Updating Properties" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:577 -msgid "Fetch batch properties" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:620 -msgid "Creating Single Contact" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:664 -msgid "Updating or Creating users data" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:770 -msgid "Updating or Creating single users data" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:814 -msgid "Creating Lists" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:844 -msgid "--Please Select a Static List--" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:862 -msgid "Get Static Lists" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:913 -msgid "Get Dynamic Lists" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:963 -msgid "Enrolling in Static List" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1004 -msgid "Creating Workflows" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1032 -#: includes/class-hubwooconnectionmananager.php:1093 -msgid "--Please Select a Workflow--" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1055 -msgid "Getting all Workflows" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1116 -msgid "Get single Workflows" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1158 -msgid "Enrolling in Workflow" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1258 -msgid "Fetching all " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1295 -msgid "Fetching Contact Lists" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1332 -msgid "Fetching Contacts from List" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1376 -msgid "Fetching " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1405 -msgid "Creating single " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1452 -msgid "Updated single " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1496 -msgid "Search single " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1553 -msgid "Fetching Batch " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1583 -msgid "Creating bulk " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1629 -msgid "Updated bulk " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1684 -msgid "Associate " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1730 -msgid "Delete association " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1776 -msgid "Associate batch " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1821 -msgid "Delete batch association " -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1873 -msgid "Fetching marketing emails" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1901 -msgid "Creating marketing email." -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:1962 -msgid "Removing Deal Association With Contact" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2007 -msgid "Creating Deal Association With Contact" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2052 -msgid "Creating Deal Association With Company" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2092 -msgid "Updating HubSpot Deals" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2121 -msgid "Creating deal custom groups" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2164 -msgid "Creating deal custom properties" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2217 -msgid "Updating HubSpot Deal Properties" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2253 -#: includes/class-hubwooconnectionmananager.php:2290 -msgid "Fetching Contact VID by email" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2328 -msgid "Creating New deal" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2371 -msgid "Fetch all pipeline" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2418 -msgid "Get deal pipeline info" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2445 -msgid "Creating deal pipeline" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2500 -msgid "Updating the ecommerce pipeline deal stages" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2562 -msgid "Creating or Updating Store" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2687 -msgid "Creating a form data" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2729 -msgid "Submitting Form data" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2769 -msgid "Fetching Batch Vids" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2807 -msgid "Fetching All Forms" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2849 -msgid "Fetching Contact by email" -msgstr "" - -#: includes/class-hubwooconnectionmananager.php:2888 -msgid "Updating HubSpot Products" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:149 -msgid "Order Information" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:155 -#: includes/class-hubwoocontactproperties.php:563 -msgid "Products Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:161 -msgid "Shopping Cart Information" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:167 -msgid "Customer Group" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:173 -#: includes/class-hubwoocontactproperties.php:858 -msgid "Categories Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:178 -msgid "RFM Information" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:183 -#: includes/class-hubwoocontactproperties.php:875 -msgid "SKUs Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:188 -msgid "ROI Tracking" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:193 -msgid "Abandoned Cart Details" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:375 -msgid "Customer Group/ User role" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:383 -msgid "Accepts Marketing" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:392 -msgid "Marketing Newsletter" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:401 -msgid "Shopping Cart ID" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:418 -msgid "Shipping Address Line 1" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:426 -msgid "Shipping Address Line 2" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:434 -msgid "Shipping City" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:442 -msgid "Shipping State" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:450 -msgid "Shipping Postal Code" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:458 -msgid "Shipping Country" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:466 -msgid "Billing Address Line 1" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:474 -msgid "Billing Address Line 2" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:482 -msgid "Billing City" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:490 -msgid "Billing State" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:498 -msgid "Billing Postal Code" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:506 -msgid "Billing Country" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:515 -msgid "Last Product Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:523 -msgid "Last Product Types Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:531 -msgid "Last Products Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:539 -msgid "Last Products Bought HTML" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:547 -msgid "Last Total Number Of Products Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:555 -msgid "Product Types Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:571 -msgid "Total Number Of Products Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:579 -msgid "Last Products Bought Product 1 Image URL" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:587 -msgid "Last Products Bought Product 1 Name" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:595 -msgid "Last Products Bought Product 1 Price" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:604 -msgid "Last Products Bought Product 1 Url" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:612 -msgid "Last Products Bought Product 2 Image URL" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:620 -msgid "Last Products Bought Product 2 Name" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:628 -msgid "Last Products Bought Product 2 Price" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:637 -msgid "Last Products Bought Product 2 Url" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:645 -msgid "Last Products Bought Product 3 Image URL" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:653 -msgid "Last Products Bought Product 3 Name" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:661 -msgid "Last Products Bought Product 3 Price" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:670 -msgid "Last Products Bought Product 3 Url" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:679 -msgid "Last Order Status" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:688 -msgid "Last Order Fulfillment Status" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:697 -msgid "Last Order Tracking Number" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:705 -msgid "Last Order Tracking URL" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:713 -msgid "Last Order Shipment Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:721 -msgid "Last Order Number" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:729 -msgid "Last Order Currency" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:737 -msgid "Total Number of Current Orders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:746 -msgid "Total Value of Orders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:755 -msgid "Average Order Value" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:764 -msgid "Total Number of Orders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:772 -msgid "First Order Value" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:781 -msgid "First Order Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:789 -msgid "Last Order Value" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:798 -msgid "Last Order Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:806 -msgid "Average Days Between Orders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:814 -msgid "Account Creation Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:822 -msgid "Monetary Rating" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:831 -msgid "Order Frequency Rating" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:840 -msgid "Order Recency Rating" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:850 -msgid "Last Categories Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:867 -msgid "Last SKUs Bought" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:884 -msgid "Last Subscription Order Number" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:892 -msgid "Last Subscription Parent Order Number" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:900 -msgid "Last Subscription Order Status" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:909 -msgid "Last Subscription Order Creation Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:917 -msgid "Last Subscription Order Paid Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:925 -msgid "Last Subscription Order Completed Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:933 -msgid "Related Last Order Creation Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:941 -msgid "Related Last Order Paid Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:949 -msgid "Related Last Order Completed Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:957 -msgid "Last Subscription Trial End Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:965 -msgid "Last Subscription Next Payment Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:973 -msgid "Last Subscription Billing Period" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:982 -msgid "Last Subscription Billing Interval" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:991 -msgid "Last Subscription Products" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1000 -msgid "Customer New Order" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1008 -msgid "Abandoned Cart Recovery Workflow Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1017 -msgid "Abandoned Cart Recovery Workflow Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1026 -msgid "Abandoned Cart Recovery Workflow Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1034 -msgid "Abandoned Cart Recovery Workflow Start Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1042 -msgid "Current ROI Campaign" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1051 -msgid "Customer Reengagement Workflow Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1060 -msgid "Customer Reengagement Workflow Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1069 -msgid "Customer Reengagement Workflow Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1077 -msgid "Customer Reengagement Workflow Start Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1085 -msgid "Customer Rewards Workflow Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1094 -msgid "Customer Rewards Workflow Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1103 -msgid "Customer Rewards Workflow Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1111 -msgid "Customer Rewards Workflow Start Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1119 -msgid "MQL Capture, Nurture & Conversion Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1128 -msgid "MQL Capture, Nurture & Conversion Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1137 -msgid "MQL Capture, Nurture & Conversion Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1145 -msgid "MQL Capture, Nurture & Conversion Start date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1153 -msgid "New Customer Workflow Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1162 -msgid "New Customer Workflow Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1171 -msgid "New Customer Workflow Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1179 -msgid "New Customer Workflow Start Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1187 -msgid "Second Purchase Workflow Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1196 -msgid "Second Purchase Workflow Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1205 -msgid "Second Purchase Workflow Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1213 -msgid "Second Purchase Workflow Start Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1221 -msgid "Third Purchase Workflow Conversion" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1230 -msgid "Third Purchase Workflow Conversion Amount" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1239 -msgid "Third Purchase Workflow Conversion Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1247 -msgid "Third Purchase Workflow Start Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1256 -msgid "Current Abandoned Cart" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1265 -msgid "Abandoned Cart Date" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1273 -msgid "Abandoned Cart Counter" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1281 -msgid "Abandoned Cart URL" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1289 -msgid "Abandoned Cart Products SKUs" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1297 -msgid "Abandoned Cart Products Categories" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1305 -msgid "Abandoned Cart Products" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1313 -msgid "Abandoned Cart Products HTML" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1321 -msgid "Abandoned Cart Tax Value" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1330 -msgid "Abandoned Cart Subtotal" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1339 -msgid "Abandoned Cart Total Value" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1378 -msgid "Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1394 -msgid "Leads" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1410 -msgid "Abandoned Cart" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1426 -msgid "Best Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1454 -msgid "Big Spenders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1470 -msgid "Loyal Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1492 -msgid "Churning Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1520 -msgid "Low Value Lost Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1548 -msgid "New Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1570 -msgid "Customers needing attention" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1598 -msgid "About to Sleep" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1626 -msgid "Mid Spenders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1642 -msgid "Low Spenders" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1658 -msgid "Newsletter Subscriber" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1674 -msgid "One time purchase customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1690 -msgid "Two time purchase customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1706 -msgid "Three time purchase customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1722 -msgid "Bought four or more times" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1738 -msgid "Marketing Qualified Leads" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1753 -msgid "Engaged Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1772 -msgid "DisEngaged Customers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:1800 -msgid "Repeat Buyers" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:2924 -msgid "Checkout" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:2928 -msgid "Registration" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:2932 -msgid "Others" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3022 -msgid "Day" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3026 -msgid "Week" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3030 -msgid "Month" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3034 -msgid "Year" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3053 -msgid "Every" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3057 -msgid "Every Second" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3061 -msgid "Every Third" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3065 -msgid "Every Fourth" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3069 -msgid "Every Fifth" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3073 -msgid "Every Sixth" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3258 -msgid "Price" -msgstr "" - -#: includes/class-hubwoocontactproperties.php:3258 -msgid "Discount" -msgstr "" - -#: makewebbetter-hubspot-for-woocommerce.php:127 -msgid "Onboarding Services" -msgstr "" - -#: makewebbetter-hubspot-for-woocommerce.php:128 -msgid "Docs" -msgstr "" - -#: makewebbetter-hubspot-for-woocommerce.php:129 -msgid "KB" -msgstr "" - -#: makewebbetter-hubspot-for-woocommerce.php:171 -msgid "Get Premium Support" -msgstr "" - -#: makewebbetter-hubspot-for-woocommerce.php:243 -msgid "" -"WooCommerce is not activated. Please activate WooCommerce first to install " -"MWB HubSpot for WooCommerce" -msgstr "" - -#: makewebbetter-hubspot-for-woocommerce.php:263 -msgid "" -"Oops! You tried activating the MWB HubSpot for WooCommerce without " -"deactivating the another version of the integration created by " -"MakewebBetter. Kindly deactivate the other version of HubSpot WooCommerce " -"Integration and then try again." -msgstr "" diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/makewebbetter-hubspot-for-woocommerce.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/makewebbetter-hubspot-for-woocommerce.php deleted file mode 100644 index cc70199c..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/makewebbetter-hubspot-for-woocommerce.php +++ /dev/null @@ -1,323 +0,0 @@ -' . esc_html__( 'Onboarding Services', 'makewebbetter-hubspot-for-woocommerce' ) . ''; - $links_array[] = '' . esc_html__( 'Docs', 'makewebbetter-hubspot-for-woocommerce' ) . ''; - $links_array[] = '' . esc_html__( 'KB', 'makewebbetter-hubspot-for-woocommerce' ) . ''; - } - return $links_array; - } - add_filter( 'plugin_row_meta', 'hubwoo_custom_settings_at_plugin_tab', 10, 2 ); - - /** - * Define constant if not already set. - * - * @param string $name name for the constant. - * @param string $value value for the constant. - * @since 1.0.0 - */ - function hubwoo_pro_define( $name, $value ) { - if ( ! defined( $name ) ) { - define( $name, $value ); - } - } - - /** - * Setting Page Link. - * - * @param array $actions actions for the plugin. - * @param string $plugin_file name of the plugin. - * @return array - * @since 1.0.0 - */ - function hubwoo_pro_admin_settings( $actions, $plugin_file ) { - static $plugin; - - if ( ! isset( $plugin ) ) { - $plugin = plugin_basename( __FILE__ ); - } - - if ( $plugin === $plugin_file ) { - $settings = array( - 'settings' => '' . esc_html__( 'Settings', 'makewebbetter-hubspot-for-woocommerce' ) . '', - ); - - $actions = array_merge( $settings, $actions ); - - $premium_support = array( - 'premium_support' => '' . esc_html__( 'Get Premium Support', 'makewebbetter-hubspot-for-woocommerce' ) . '', - ); - - $actions = array_merge( $premium_support, $actions ); - } - - return $actions; - } - - // add link for settings. - add_filter( 'plugin_action_links', 'hubwoo_pro_admin_settings', 10, 2 ); - - /** - * Auto Redirection to settings page after plugin activation - * - * @since 1.0.0 - * @param string $plugin name of the plugin. - * @link https://makewebbetter.com/ - */ - function hubwoo_pro_activation_redirect( $plugin ) { - if ( WC()->is_rest_api_request() ) { - return; - } - - if ( plugin_basename( __FILE__ ) === $plugin ) { - wp_safe_redirect( admin_url( 'admin.php?page=hubwoo&hubwoo_tab=hubwoo-overview&hubwoo_key=connection-setup' ) ); - exit(); - } - } - // redirect to settings page as soon as plugin is activated. - add_action( 'activated_plugin', 'hubwoo_pro_activation_redirect' ); - - /** - * Begins execution of the plugin. - * - * Since everything within the plugin is registered via hooks, - * then kicking off the plugin from this point in the file does - * not affect the page life cycle. - * - * @since 1.0.0 - */ - function run_hubwoo_pro() { - // define contants if not defined.. - hubwoo_pro_define_constants(); - - $hub_woo = new Hubwoo(); - $hub_woo->run(); - - $GLOBALS['hubwoo'] = $hub_woo; - } - run_hubwoo_pro(); -} elseif ( ! $hubwoo_pro_activated && 0 === $hubwoo_pro_flag ) { - add_action( 'admin_init', 'hubwoo_pro_plugin_deactivate' ); - - /** - * Call Admin notices - * - * @link https://www.makewebbetter.com/ - */ - function hubwoo_pro_plugin_deactivate() { - deactivate_plugins( plugin_basename( __FILE__ ) ); - add_action( 'admin_notices', 'hubwoo_pro_plugin_error_notice' ); - } - - /** - * Show warning message if woocommerce is not install - * - * @since 1.0.0 - * @link https://www.makewebbetter.com/ - */ - function hubwoo_pro_plugin_error_notice() { ?> -
-

-
- - -
-

-
- - plugin_name = $plugin_name; - $this->version = $version; - } - - /** - * Update key as soon as user data is updated. - * - * @since 1.0.0 - * @param string $user_id User Id. - */ - public function hubwoo_woocommerce_save_account_details( $user_id ) { - - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'yes' ); - } - - /** - * Enqueuing the HubSpot Tracking Script - * in the footer file - * - * @since 1.0.0 - */ - public function hubwoo_add_hs_script() { - if ( ! in_array( 'leadin/leadin.php', get_option( 'active_plugins' ), true ) ) { - $portal_id = get_option( 'hubwoo_pro_hubspot_id', '' ); - if ( ! empty( $portal_id ) ) { - wp_enqueue_script( 'hs-script-loader', '//js.hs-scripts.com/' . $portal_id . '.js', array( 'jquery' ), WC_VERSION, true ); - } - } - } - - /** - * Update key as soon as guest order is done - * - * @since 1.0.0 - * @param string $order_id Order Id. - */ - public function hubwoo_pro_woocommerce_guest_orders( $order_id ) { - - if ( ! empty( $order_id ) ) { - //hpos changes - $order = wc_get_order($order_id); - $customer_id = $order->get_customer_id(); - - if ( empty( $customer_id ) || 0 == $customer_id ) { - if ('yes' != $order->get_meta('hubwoo_pro_guest_order', true)) { - $order->update_meta_data('hubwoo_pro_guest_order', 'yes'); - $order->save(); - } - } else { - update_user_meta( $customer_id, 'hubwoo_pro_user_data_change', 'yes' ); - } - } - } - - /** - * Update key as soon as order is renewed - * - * @since 1.0.0 - * @param string $order_id Order Id. - */ - public function hubwoo_pro_save_renewal_orders( $order_id ) { - - if ( ! empty( $order_id ) ) { - - $order = wc_get_order($order_id); - $user_id = (int) $order->get_customer_id(); - - if ( 0 !== $user_id && 0 < $user_id ) { - - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'yes' ); - } - } - } - - /** - * Update key as soon as customer make changes in his/her subscription orders - * - * @since 1.0.0 - */ - public function hubwoo_save_changes_in_subs() { - - $user_id = get_current_user_id(); - - if ( $user_id ) { - - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'yes' ); - } - } - - /** - * Update key as soon as customer make changes in his/her subscription orders - * - * @since 1.0.0 - */ - public function hubwoo_subscription_switch() { - - if ( isset( $_GET['switch-subscription'] ) && isset( $_GET['item'] ) ) { - - $user_id = get_current_user_id(); - - if ( $user_id ) { - - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'yes' ); - } - } - } - - /** - * Update key as soon as subscriptions order status changes. - * - * @since 1.0.0 - * @param object $subs subscription order object. - */ - public function hubwoo_pro_update_subs_changes( $subs ) { - - if ( ! empty( $subs ) && ( $subs instanceof WC_Subscription ) ) { - - $order_id = $subs->get_id(); - - if ( ! empty( $order_id ) ) { - - $order = wc_get_order($order_id); - $user_id = (int) $order->get_customer_id(); - - if ( 0 !== $user_id && 0 < $user_id ) { - - update_user_meta( $user_id, 'hubwoo_pro_user_data_change', 'yes' ); - } - } - } - } - - - /** - * Add checkout optin checkbox at woocommerce checkout - * - * @since 1.0.0 - * @param object $checkout woocommerce checkut object. - */ - public function hubwoo_pro_checkout_field( $checkout ) { - - if ( is_user_logged_in() ) { - $subscribe_status = get_user_meta( get_current_user_id(), 'hubwoo_checkout_marketing_optin', true ); - $registeration_optin = get_user_meta( get_current_user_id(), 'hubwoo_registeration_marketing_optin', true ); - } - if ( ! empty( $subscribe_status ) && 'yes' === $subscribe_status ) { - return; - } elseif ( ! empty( $registeration_optin ) && 'yes' === $registeration_optin ) { - return; - } - $label = get_option( 'hubwoo_checkout_optin_label', __( 'Subscribe', 'makewebbetter-hubspot-for-woocommerce' ) ); - echo '
'; - woocommerce_form_field( - 'hubwoo_checkout_marketing_optin', - array( - 'type' => 'checkbox', - 'class' => array( 'hubwoo-input-checkbox', 'woocommerce-form__input', 'woocommerce-form__input-checkbox' ), - 'label' => $label, - ), - WC()->checkout->get_value( 'hubwoo_checkout_marketing_optin' ) - ); - echo '
'; - } - - /** - * Optin checkbox on My Account page. - * - * @since 1.0.0 - */ - public function hubwoo_pro_register_field() { - - $label = get_option( 'hubwoo_registeration_optin_label', __( 'Subscribe', 'makewebbetter-hubspot-for-woocommerce' ) ); - echo '
'; - woocommerce_form_field( - 'hubwoo_registeration_marketing_optin', - array( - 'type' => 'checkbox', - 'class' => array( 'hubwoo-input-checkbox', 'woocommerce-form__input', 'woocommerce-form__input-checkbox' ), - 'label' => $label, - 'default' => 'yes', - ), - 'yes' - ); - echo '
'; - } - - /** - * Save order meta when any user optin through checkout. - * - * @since 1.0.0 - * @param int $order_id order ID. - */ - public function hubwoo_pro_process_checkout_optin( $order_id ) { - - if ( ! empty( $_REQUEST['woocommerce-process-checkout-nonce'] ) ) { - - $request = sanitize_text_field( wp_unslash( $_REQUEST['woocommerce-process-checkout-nonce'] ) ); - - $nonce_value = wc_get_var( $request ); - - if ( ( ! empty( $nonce_value ) && wp_verify_nonce( $nonce_value, 'woocommerce-process_checkout' ) ) || is_user_logged_in() ) { - if ( ! empty( $_POST['hubwoo_checkout_marketing_optin'] ) ) { - - if ( ! empty( $order_id ) ) { - - if ( is_user_logged_in() ) { - - update_user_meta( get_current_user_id(), 'hubwoo_checkout_marketing_optin', 'yes' ); - } else { - - $order = wc_get_order($order_id); - $order->update_meta_data( 'hubwoo_checkout_marketing_optin', 'yes' ); - $order->save(); - } - } - } - } - } - } - - /** - * Save user meta when they optin via woocommerce registeration form. - * - * @since 1.0.0 - * @param int $user_id user ID. - */ - public function hubwoo_save_register_optin( $user_id ) { - - if ( empty( $user_id ) ) { - return; - } - $nonce_value = isset( $_POST['woocommerce-register-nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['woocommerce-register-nonce'] ) ) : ''; - if ( isset( $_POST['email'] ) && wp_verify_nonce( $nonce_value, 'woocommerce-register' ) ) { - if ( isset( $_POST['hubwoo_registeration_marketing_optin'] ) ) { - update_user_meta( $user_id, 'hubwoo_registeration_marketing_optin', 'yes' ); - } - } - } - - /** - * Start session for abandonec carts. - * - * @since 1.0.0 - */ - public function hubwoo_abncart_start_session() { - if ( WC()->is_rest_api_request() ) { - return; - } - - if ( function_exists( 'WC' ) && ! empty( WC()->session ) && ! is_admin() ) { - - WC()->session; - self::hubwoo_abncart_set_locale(); - } - } - - /** - * Save cart of the user if captured by HubSpot. - * - * @since 1.0.0 - */ - public function hubwoo_track_cart_for_formuser() { - - if ( ! empty( WC()->session ) ) { - if ( ! empty( WC()->session->get( 'mwb_guest_user_email' ) ) && empty( WC()->session->get( 'hs_form_user_tracked' ) ) ) { - - $guest_user_cart = array(); - - if ( function_exists( 'WC' ) ) { - - $guest_user_cart['cart'] = WC()->session->cart; - } else { - - $guest_user_cart['cart'] = $woocommerce->session->cart; - } - - if ( empty( $guest_user_cart['cart'] ) ) { - return; - } - - $get_cookie = WC()->session->get_session_cookie(); - - $session_id = ''; - if ( ! empty( $get_cookie ) ) { - $session_id = $get_cookie[0]; - } - - $locale = ! empty( WC()->session->get( 'locale' ) ) ? WC()->session->get( 'locale' ) : ''; - - $user_data = array( - 'email' => WC()->session->get( 'mwb_guest_user_email' ), - 'cartData' => $guest_user_cart, - 'timeStamp' => time(), - 'sessionID' => $session_id, - 'locale' => $locale, - 'sent' => 'no', - ); - - self::hubwoo_abncart_update_new_data( WC()->session->get( 'mwb_guest_user_email' ), $user_data, $session_id ); - - WC()->session->set( 'hs_form_user_tracked', true ); - } - } - } - - /** - * Save cart when billing email is entered on checkout. - * - * @since 1.0.0 - */ - public function hubwoo_save_guest_user_cart() { - - check_ajax_referer( 'hubwoo_cart_security', 'nonce' ); - - if ( ! empty( $_POST['email'] ) ) { - - $posted_email = sanitize_email( wp_unslash( $_POST['email'] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized - - $guest_user_cart = array(); - - if ( function_exists( 'WC' ) ) { - - $guest_user_cart['cart'] = WC()->session->cart; - } else { - - $guest_user_cart['cart'] = $woocommerce->session->cart; - } - - $get_cookie = WC()->session->get_session_cookie(); - - $session_id = ''; - if ( ! empty( $get_cookie ) ) { - $session_id = $get_cookie[0]; - } - - if ( ! empty( $session_id ) ) { - - $locale = ! empty( $_POST['locale'] ) ? sanitize_text_field( wp_unslash( $_POST['locale'] ) ) : ''; - - if ( empty( WC()->session->get( 'mwb_guest_user_email' ) ) ) { - - WC()->session->set( 'mwb_guest_user_email', ! empty( $posted_email ) ? $posted_email : '' ); - $user_data = array( - 'email' => WC()->session->get( 'mwb_guest_user_email' ), - 'cartData' => $guest_user_cart, - 'timeStamp' => time(), - 'sessionID' => $session_id, - 'locale' => $locale, - 'sent' => 'no', - ); - - self::hubwoo_abncart_update_new_data( WC()->session->get( 'mwb_guest_user_email' ), $user_data, $session_id ); - } else { - - $new_email_entered = ! empty( $posted_email ) ? $posted_email : ''; - - $before_entered_email = WC()->session->get( 'mwb_guest_user_email' ); - - WC()->session->set( 'mwb_guest_user_email', $new_email_entered ); - - $existing_cart_data = get_option( 'mwb_hubwoo_guest_user_cart', array() ); - - if ( ! empty( $existing_cart_data ) ) { - - if ( $new_email_entered === $before_entered_email ) { - - foreach ( $existing_cart_data as $key => &$single_cart_data ) { - - if ( array_key_exists( 'sessionID', $single_cart_data ) && $single_cart_data['sessionID'] == $session_id ) { - - $single_cart_data['cartData'] = $guest_user_cart; - $single_cart_data['timeStamp'] = time(); - $single_cart_data['locale'] = $locale; - $single_cart_data['sent'] = 'no'; - break; - } elseif ( array_key_exists( 'email', $single_cart_data ) && $single_cart_data['email'] == $before_entered_email ) { - - $single_cart_data['cartData'] = $guest_user_cart; - $single_cart_data['timeStamp'] = time(); - $single_cart_data['locale'] = $locale; - $single_cart_data['sent'] = 'no'; - break; - } - } - } else { - - foreach ( $existing_cart_data as $key => &$single_cart_data ) { - - if ( array_key_exists( 'sessionID', $single_cart_data ) && $single_cart_data['sessionID'] == $session_id ) { - - $single_cart_data['cartData'] = $guest_user_cart; - $single_cart_data['timeStamp'] = time(); - $single_cart_data['email'] = $new_email_entered; - $single_cart_data['locale'] = $locale; - $single_cart_data['sent'] = 'no'; - - $user_data = array( - 'email' => $before_entered_email, - 'cartData' => '', - 'timeStamp' => time(), - 'sessionID' => $session_id, - 'locale' => $locale, - 'sent' => 'no', - ); - $existing_cart_data[] = $user_data; - break; - } - } - } - } else { - - WC()->session->set( 'mwb_guest_user_email', ! empty( $posted_email ) ? $posted_email : '' ); - $user_data = array( - 'email' => WC()->session->get( 'mwb_guest_user_email' ), - 'cartData' => $guest_user_cart, - 'timeStamp' => time(), - 'sessionID' => $session_id, - 'locale' => $locale, - 'sent' => 'no', - ); - self::hubwoo_abncart_update_new_data( WC()->session->get( 'mwb_guest_user_email' ), $user_data, $session_id ); - } - - update_option( 'mwb_hubwoo_guest_user_cart', $existing_cart_data ); - } - } - - wp_die(); - } - } - - /** - * Set site local in session. - * - * @since 1.0.0 - */ - public static function hubwoo_abncart_set_locale() { - - if ( defined( 'ICL_LANGUAGE_CODE' ) ) { - - $locale = ICL_LANGUAGE_CODE; - } else { - - $locale = get_locale(); - } - - if ( ! empty( $locale ) ) { - - WC()->session->set( 'locale', $locale ); - } - } - - /** - * Track billing form for email on checkout. - * - * @since 1.0.0 - */ - public function hubwoo_track_email_for_guest_users() { - - if ( ! is_user_logged_in() ) { - - if ( defined( 'ICL_LANGUAGE_CODE' ) ) { - - $locale = ICL_LANGUAGE_CODE; - } else { - - $locale = get_locale(); - } - ?> - - session ) ) { - return; } - - $get_cookie = WC()->session->get_session_cookie(); - - $session_id = ''; - if ( ! empty( $get_cookie ) ) { - $session_id = $get_cookie[0]; - } - - if ( ! empty( $order_id ) ) { - - $order = new WC_Order( $order_id ); - - $order_status = $order->get_status(); - - $order_email = $order->get_billing_email(); - - $existing_cart_data = get_option( 'mwb_hubwoo_guest_user_cart', array() ); - - if ( 'failed' !== $order_status ) { - - if ( ! empty( $existing_cart_data ) ) { - - foreach ( $existing_cart_data as $key => &$single_cart_data ) { - - if ( array_key_exists( 'sessionID', $single_cart_data ) && $single_cart_data['sessionID'] == $session_id ) { - - if ( isset( $single_cart_data['cartData']['cart'] ) ) { - - $single_cart_data['cartData']['cart'] = ''; - $single_cart_data['sent'] = 'no'; - } - } - - if ( array_key_exists( 'email', $single_cart_data ) && $single_cart_data['email'] == $order_email ) { - - if ( isset( $single_cart_data['cartData']['cart'] ) ) { - - $single_cart_data['cartData']['cart'] = ''; - $single_cart_data['sent'] = 'no'; - } - } - - if ( array_key_exists( 'email', $single_cart_data ) && null !== WC()->session->get( 'mwb_guest_user_email' ) && WC()->session->get( 'mwb_guest_user_email' ) == $single_cart_data['email'] ) { - - if ( isset( $single_cart_data['cartData']['cart'] ) ) { - - $single_cart_data['cartData']['cart'] = ''; - $single_cart_data['sent'] = 'no'; - } - } - } - - update_option( 'mwb_hubwoo_guest_user_cart', $existing_cart_data ); - } - } - - if ( is_user_logged_in() ) { - - update_user_meta( get_current_user_id(), 'hubwoo_pro_user_cart_sent', 'no' ); - } - } - } - - /** - * Track changes on cart being updated. - * - * @since 1.0.0 - */ - public static function hubwoo_abncart_track_guest_cart() { - - if ( ! is_user_logged_in() ) { - - $get_cookie = WC()->session->get_session_cookie(); - - if ( ! empty( $get_cookie ) ) { - - $session_id = $get_cookie[0]; - - if ( ! empty( $session_id ) ) { - - if ( null !== WC()->session->get( 'mwb_guest_user_email' ) ) { - - $guest_user_email = WC()->session->get( 'mwb_guest_user_email' ); - - if ( ! empty( $guest_user_email ) ) { - - $guest_user_cart = array(); - - $locale = ! empty( WC()->session->get( 'locale' ) ) ? WC()->session->get( 'locale' ) : ''; - - if ( function_exists( 'WC' ) ) { - - $guest_user_cart['cart'] = WC()->session->cart; - } else { - - $guest_user_cart['cart'] = $woocommerce->session->cart; - } - - $existing_cart_data = get_option( 'mwb_hubwoo_guest_user_cart', array() ); - - $saved_cart = array(); - - if ( ! empty( $existing_cart_data ) ) { - - foreach ( $existing_cart_data as $single_cart_data ) { - - if ( array_key_exists( 'email', $single_cart_data ) && WC()->session->get( 'mwb_guest_user_email' ) == $single_cart_data['email'] ) { - - if ( array_key_exists( 'cartData', $single_cart_data ) ) { - - if ( ! empty( $single_cart_data['cartData']['cart'] ) ) { - $saved_cart = $single_cart_data['cartData']['cart']; - } - } - break; - } - } - } - - if ( $saved_cart === $guest_user_cart['cart'] ) { - - return; - } - - $user_data = array( - 'email' => WC()->session->get( 'mwb_guest_user_email' ), - 'cartData' => $guest_user_cart, - 'timeStamp' => time(), - 'sessionID' => $session_id, - 'locale' => $locale, - 'sent' => 'no', - ); - - self::hubwoo_abncart_update_new_data( WC()->session->get( 'mwb_guest_user_email' ), $user_data, $session_id ); - } - } - } - } - } - } - - /** - * Callback to update cart data in DB. - * - * @since 1.0.0 - * @param string $email email of the contact. - * @param array $user_data formatted data for cart. - * @param string $session session id for the cart activity. - */ - public static function hubwoo_abncart_update_new_data( $email, $user_data, $session ) { - - $existing_cart_data = get_option( 'mwb_hubwoo_guest_user_cart', array() ); - $update_flag = false; - - if ( ! empty( $existing_cart_data ) ) { - - foreach ( $existing_cart_data as $key => &$single_cart_data ) { - - if ( ! empty( $single_cart_data['email'] ) && $single_cart_data['email'] == $email ) { - - $single_cart_data = $user_data; - $update_flag = true; - break; - } elseif ( ! empty( $single_cart_data['sessionID'] ) && $single_cart_data['sessionID'] == $session ) { - - $single_cart_data = $user_data; - $update_flag = true; - break; - } - } - } - - if ( ! $update_flag ) { - - $existing_cart_data[] = $user_data; - } - - update_option( 'mwb_hubwoo_guest_user_cart', $existing_cart_data ); - } - - /** - * Transfer guest cart to user on account registeration. - * - * @since 1.0.0 - * @param int $user_id user ID. - */ - public function hubwoo_abncart_user_registeration( $user_id ) { - - $user = get_user_by( 'id', $user_id ); - $email = ! empty( $user->data->user_email ) ? $user->data->user_email : ''; - if ( empty( $email ) || null == WC()->session ) { - return; - } - $get_cookie = WC()->session->get_session_cookie(); - - if ( ! empty( $get_cookie ) ) { - - $session_id = $get_cookie[0]; - $existing_cart_data = get_option( 'mwb_hubwoo_guest_user_cart', array() ); - foreach ( $existing_cart_data as $key => &$single_cart_data ) { - if ( array_key_exists( 'sessionID', $single_cart_data ) && $single_cart_data['sessionID'] === $session_id ) { - if ( ! empty( $single_cart_data['sent'] ) && 'no' === $single_cart_data['sent'] ) { - unset( $existing_cart_data[ $key ] ); - } else { - $single_cart_data['cartData'] = ''; - $single_cart_data['sent'] = 'no'; - } - } elseif ( array_key_exists( 'email', $single_cart_data ) && $single_cart_data['email'] === $email ) { - if ( ! empty( $single_cart_data['sent'] ) && 'no' === $single_cart_data['sent'] ) { - unset( $existing_cart_data[ $key ] ); - } else { - $single_cart_data['cartData'] = ''; - $single_cart_data['sent'] = 'no'; - } - } - } - - update_option( 'mwb_hubwoo_guest_user_cart', $existing_cart_data ); - - $locale = ! empty( WC()->session->get( 'locale' ) ) ? WC()->session->get( 'locale' ) : ''; - - update_user_meta( $user_id, 'hubwoo_pro_user_left_cart', 'yes' ); - update_user_meta( $user_id, 'hubwoo_pro_last_addtocart', time() ); - update_user_meta( $user_id, 'hubwoo_pro_user_cart_sent', 'no' ); - update_user_meta( $user_id, 'hubwoo_pro_cart_locale', $locale ); - } - } - - /** - * Clear session on logout. - * - * @since 1.0.0 - */ - public function hubwoo_clear_session() { - - if ( null !== WC()->session->get( 'locale' ) ) { - WC()->session->set( 'locale', null ); - } - if ( null !== WC()->session->get( 'mwb_guest_user_email' ) ) { - WC()->session->set( 'mwb_guest_user_email', null ); - } - } - - /** - * Handles the cart data when the guest user updates the cart. - * - * @since 1.0.0 - * @param bool $cart_updated true/false. - * @return bool $cart_updated true/false. - */ - public function hubwoo_guest_cart_updated( $cart_updated ) { - - if ( is_user_logged_in() ) { - - $user_id = get_current_user_id(); - //phpcs:disable - $locale = ! empty( WC()->session->get( 'locale' ) ) ? WC()->session->get( 'locale' ) : ''; - //phpcs:enable - if ( ! empty( $user_id ) && $user_id ) { - - update_user_meta( $user_id, 'hubwoo_pro_user_left_cart', 'yes' ); - update_user_meta( $user_id, 'hubwoo_pro_last_addtocart', time() ); - update_user_meta( $user_id, 'hubwoo_pro_cart_locale', $locale ); - update_user_meta( $user_id, 'hubwoo_pro_user_cart_sent', 'no' ); - } - } else { - - self::hubwoo_abncart_track_guest_cart(); - } - return $cart_updated; - } - - /** - * Update key as soon as user makes a addtocart action - * - * @since 1.0.0 - */ - public function hubwoo_abncart_woocommerce_add_to_cart() { - - if ( is_user_logged_in() ) { - - $user_id = get_current_user_id(); - //phpcs:disable - $locale = ! empty( WC()->session->get( 'locale' ) ) ? WC()->session->get( 'locale' ) : ''; - //phpcs:enable - if ( ! empty( $user_id ) && $user_id ) { - - update_user_meta( $user_id, 'hubwoo_pro_user_left_cart', 'yes' ); - - update_user_meta( $user_id, 'hubwoo_pro_last_addtocart', time() ); - - update_user_meta( $user_id, 'hubwoo_pro_cart_locale', $locale ); - - update_user_meta( $user_id, 'hubwoo_pro_user_cart_sent', 'no' ); - } - } else { - - self::hubwoo_abncart_track_guest_cart(); - } - } - - /** - * Tracking the abandonded cart products. - * - * @since 1.0.4 - */ - public function hubwoo_add_abncart_products() { - $product_string = ! empty( $_GET['hubwoo-abncart-retrieve'] ) ? sanitize_text_field( wp_unslash( $_GET['hubwoo-abncart-retrieve'] ) ) : ''; - if ( ! empty( $product_string ) ) { - $seperated_products = explode( ',', $product_string ); - if ( ! empty( $seperated_products ) ) { - global $woocommerce; - $woocommerce->cart->empty_cart(); - foreach ( $seperated_products as $product ) { - $pro_qty = array(); - $pro_qty = explode( ':', $product ); - $pro_qty[1] = ! empty( $pro_qty[1] ) ? $pro_qty[1] : 1; - $woocommerce->cart->add_to_cart( $pro_qty[0], $pro_qty[1] ); - } - wp_safe_redirect( wc_get_cart_url(), 301 ); - exit; - } - } - } - - /** - * Tracking subscribe box for guest users - * - * @since 1.2.2 - */ - public function get_email_checkout_page() { - if ( ! is_user_logged_in() ) { - ?> - - - -1, - 'post_status' => $order_statuses, - 'orderby' => 'id', - 'order' => 'desc', - 'return' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'customer' => $email, - )); - - $customer_orders = $query->get_orders(); - - } else { - $query = new WP_Query(); - - $customer_orders = $query->query( - array( - 'post_type' => 'shop_order', - 'posts_per_page' => 1, - 'post_status' => $order_statuses, - 'orderby' => 'id', - 'order' => 'desc', - 'fields' => 'ids', - 'no_found_rows' => true, - 'ignore_sticky_posts' => true, - 'meta_query' => array( - array( - 'key' => '_billing_email', - 'value' => $fetched_email, - ), - ), - ) - ); - } - - $value = null; - - foreach ( $customer_orders as $single_order ) { - $orders = wc_get_order( $single_order ); - $meta_data = $orders->get_meta_data(); - foreach ( $meta_data as $data ) { - $key = $data->key; - if ( 'hubwoo_checkout_marketing_optin' == $key ) { - $value = 'success'; - break; - } else { - $value = 'failure'; - } - } - } - - echo wp_json_encode( $value ); - } - - wp_die(); - } - - /** - * Getting current language of user - * - * @since 1.3.2 - */ - public function hubwoo_update_user_prefered_lang( $order_id ) { - $current_lang = apply_filters( 'wpml_current_language', null ); - - $order = wc_get_order( $order_id ); - $customer_id = $order->get_customer_id(); - - if ( ! empty( $customer_id ) ) { - update_user_meta( $customer_id, 'hubwoo_preferred_language', $current_lang ); - - } else { - $order->update_meta_data('hubwoo_preferred_language', $current_lang); - $order->save(); - } - } - - /** - * Hide line item meta. - * - * @since 1.4.1 - */ - public function hubwoo_hide_line_item_meta( $meta_data, $item ) { - $new_meta = array(); - foreach ( $meta_data as $id => $meta_array ) { - if ( 'hubwoo_ecomm_line_item_id' === $meta_array->key ) { - continue; - } - $new_meta[ $id ] = $meta_array; - } - return $new_meta; - } -} diff --git a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/public/index.php b/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/public/index.php deleted file mode 100644 index 0de7bcdd..00000000 --- a/wp/wp-content/plugins/makewebbetter-hubspot-for-woocommerce/public/index.php +++ /dev/null @@ -1,2 +0,0 @@ - Note “Hands-down the BEST support team I’ve ever interacted with. The plugins work great, and if you ever have any issues, the support staff is super responsive and helpful. I’ve recently completed a very complex integration with HubSpot utilizing the plugin... 5 stars and two thumbs up... world-class!” *– Joe Peterson* - -> Note “As a HubSpot agency, we’ve set up many eCommerce websites, and even more Inbound marketing campaigns. This plugin helps to bridge the gap between an online shop and the Inbound Methodology. Additionally, the implementation time is reduced by many hours. No question, this is one of the best investments we make for our eCom clients. Lower cost to implement, much faster Return on HubSpot Investment, and quicker time to market. It’s a win, win, win. -” *– MediaTown* - -If you don’t find the solution to your problem in our documentation, you can [Contact us](https://makewebbetter.com/contact-us/?utm_source=MWB-HubspotFree-ORG&utm_medium=MWB-ORG&utm_campaign=ORG) with your query. - - -== Installation == - -= Automatic installation = - -Automatic installation is the easiest option as WordPress handles the file transfers itself and you don't need to leave your web browser. To do an automatic install of MWB HubSpot for WooCommerce, log in to your WordPress dashboard, navigate to the Plugins menu and click Add New. - -In the search field type "MWB HubSpot for WooCommerce" and click Search Plugins. Once you've found our MWB HubSpot for WooCommerce plugin you can view details about it such as the point release, rating and description. Most importantly, of course, you can install it by simply clicking "Install Now". - -= Manual installation = - -The manual installation method involves downloading our MWB HubSpot for WooCommerce and uploading it to your webserver via your favorite FTP application. The WordPress codex contains [instructions on how to do this here](http://codex.wordpress.org/Managing_Plugins#Manual_Plugin_Installation). - -= Updating = - -Automatic updates should work like a charm as always though, ensure you backup your site just in case. - - -== Screenshots == - -1. Abandoned cart view -2. Ads view -3. Contacts View -4. Dashboard view -5. Email marketing view -6. List View -7. Reporting view - -== Frequently Asked Questions == - -= What does the plugin do? = -The [MWB HubSpot for WooCommerce](https://makewebbetter.com/product/hubspot-for-woocommerce/?utm_source=MWB-HubspotFree-ORG&utm_medium=MWB-ORG&utm_campaign=ORG) plugin allows you to sync your WooCommerce data with HubSpot, so you can engage your online store’s visitors with targeted email marketing, automation, and ads. With the combined power of WooCommerce and HubSpot, this plugin gives you all the tools you need to grow your WooCommerce online store and delight your contacts and customers. - -= What is HubSpot? = -[HubSpot](https://hubspot.com/) is an all-in-one growth platform that provides free CRM, marketing, sales, and customer service products to help you grow your business. 100,000+ websites in 100+ countries already use HubSpot to grow their businesses. - -= Who should use the MWB HubSpot for WooCommerce plugin? = -This plugin is perfect for WooCommerce store owners who want to use a free CRM to track their leads, customers, and abandoned carts, send marketing emails, and access robust analytics to see how their store is performing. - -= Are coding skills needed to use the MWB HubSpot for WooCommerce plugin? = -Not at all! The MWB HubSpot for WooCommerce plugin is easy to download and starts working seamlessly with your WordPress site right away. - -= Who is MakeWebBetter? = -[MakeWebBetter](http://www.makewebbetter.com/?utm_source=MWB-HubspotFree-ORG&utm_medium=MWB-ORG&utm_campaign=ORG) is a premier HubSpot partner, experts in WooCommerce, and creator of this free plugin! They build, maintain, and optimize WooCommerce stores to help businesses grow better. To learn more about MakeWebBetter, visit their website. - -= Is there any way to make the synchronization faster for those who have 1000+ contacts? = -If you have over 1000+ contacts, synchronization may take a while. You can [connect with us](https://makewebbetter.com/product/hubspot-for-woocommerce/?utm_source=MWB-HubspotFree-ORG&utm_medium=MWB-ORG&utm_campaign=ORG) for faster syncing. - -= My question is not listed = -Please visit the MakeWebBetter [knowledge base](https://support.makewebbetter.com/hubspot-integrations/category/hubspot-woocommerce-integration-kb/?utm_source=MWB-HubspotFree-ORG&utm_medium=MWB-ORG&utm_campaign=ORG) for more detailed [documentation and support.](https://docs.makewebbetter.com/hubspot-integration-for-woocommerce/?utm_source=MWB-HubspotFree-ORG&utm_medium=MWB-ORG&utm_campaign=ORG) - -= What product data can I send over HubSpot through this plugin? = -If you have the free HubSpot plan, you can sync Product Name, Product Image, Product Price, Product Description. And if you use a Marketing professional or enterprise plan, you can sync all the data included in the free plan along with the Product SKU and Product Image URL. - -== Changelog == -= 1.5.6 - Released on 04 June 2024 = -* Fix - Deal Update Fix for HPOS. -= 1.5.5 - Released on 12 April 2024 = -* Fix - Minor Fixes. -= 1.5.4 - Released on 10 April 2024 = -* Fix - Minor Fixes. -= 1.5.3 - Released on 06 March 2024 = -* Added - HPOS Compatibility Addon. -= 1.5.2 - Released on 12 Jan 2024 = -* Fix - Minor Fixes. -= 1.5.1 - Released on 22 September 2023 = -* Fix - Minor Bug Fixes. -= 1.5.0 - Released on 21 August 2023 = -* Added - Refresh Pipeline. -= 1.4.9 - Released on 01 August 2023 = -* Added - Delete Abandoned Data. -= 1.4.8 - Released on 29 June 2023 = -* Fix - Minor Bug Fixes. -= 1.4.7 - Released on 22 May 2023 = -* Fix - Minor Bug Fixes. -= 1.4.6 - Released on 03 May 2023 = -* Add - UTM links. -= 1.4.5 - Released on 17 March 2023 = -* Fix - Minor Bug Fixes. -= 1.4.4 - Released on 31 Jan 2023 = -* Fix - Redirect URI. -= 1.4.3 - Released on 19 Jan 2023 = -* Fix - Update filter. -= 1.4.2 - Released on 17 Nov 2022 = -* Fix - Minor Bug Fixes. -= 1.4.1 - Released on 10 Nov 2022 = -* Fix - Minor Bug Fixes. -= 1.4.0 - Released on 07 Nov 2022 = -* Added - New API endpoints. -= 1.3.3 - Released on 15 September 2022 = -* Added - migration notice & subscribe us form. -= 1.3.2 - Released on 08 August 2022 = -* Added - Update multi currency. -= 1.3.1 - Released on 02 June 2022 = -* Fix - Minor Bug Fixes. -= 1.3.0 - Released on 14 April 2022 = -* Added - Line item filter. -= 1.2.9 - Released on 17 March 2022 = -* Fix - Minor Bug Fixes. -= 1.2.8 - Released on 31 Jan 2022 = -* Added - Update Scopes. -= 1.2.7 - Released on 13 Jan 2022 = -* Added - Deal Company association. -= 1.2.6 - Released on 06 Dec 2021 = -* Fix - Newsletter Subscription Property issue. -= 1.2.5 - Released on 12 Nov 2021 = -* Fix - Sync message issue. -= 1.2.4 - Released on 20 Oct 2021 = -* Fix - Minor Bug Fixes. -= 1.2.3 - Released on 13 Sep 2021 = -* Added - Content Part -= 1.2.2 - Released on 18 August 2021 = -* Added - Fixed deal and contact association issue -= 1.2.1 - Released on 29 May 2021 = -* Added - Bug Fixes. -= 1.2.0 - Released on 23 April 2021 = -* Added - Historical Sync Data. -= 1.0.8 - Released on 23 April 2021 = -* Fix - Creating Groups issue. -= 1.0.7 - Released on 06 April 2021 = -* Fix - Authentication issue -= 1.0.6 - Released on 18 December 2020 = -* Fix - Deal update issue -= 1.0.5 = -* Fix - Bug Fixes. -= 1.0.4 = -* Session issue and minor bugs -= 1.0.3 = -* Shipment tracking and re-sync deals -= 1.0.2 = -* Multi site support -= 1.0.1 = -* Contact sync fixed -= 1.0.0 = -* Initial release - - -== Upgrade Notice == - -= 1.5.6 - Released on 04 June 2024 = -* Fix - Minor Fixes. diff --git a/wp/wp-content/plugins/relevanssi/changelog.txt b/wp/wp-content/plugins/relevanssi/changelog.txt deleted file mode 100644 index 45f6f4fe..00000000 --- a/wp/wp-content/plugins/relevanssi/changelog.txt +++ /dev/null @@ -1,1379 +0,0 @@ -= 4.17.1 = -* Minor fix: WooCommerce layered navigation compatibility caused enough problems that I've disabled it by default. You can enable it with `add_filter( 'woocommerce_get_filtered_term_product_counts_query', 'relevanssi_filtered_term_product_counts_query' );`. -* Minor fix: Data attribute handling for in-document highlighting is now better. - -= 4.17.0 = -* New feature: You can now look at how the posts appear in the database from the Debugging tab. -* New feature: Relevanssi now works with WooCommerce layered navigation filters. The filter post counts should now match the Relevanssi search results. -* New feature: New function `relevanssi_count_term_occurrances()` can be used to display how many times search terms appear in the database. -* Changed behaviour: Relevanssi post update trigger is now on `wp_after_insert_post` instead of `wp_insert_post`. This makes the indexing more reliable and better compatible with other plugins. -* Changed behaviour: Previously, throttling searches has been impossible when results are sorted by date. Now if you set Relevanssi to sort by post date from the searching settings, you can enable the throttle and the throttling will make sure to keep the most recent posts. This does not work if you set the `orderby` to `post_date` elsewhere. -* Minor fix: Prevents Relevanssi from interfering in fringe cases (including The Event Calendar event search). -* Minor fix: Relevanssi added the `highlight` parameter to home page URLs, even though it shouldn't. -* Minor fix: Indexing `nav_menu_item` posts is stopped earlier in the process to avoid problems with big menus. -* Minor fix: If the `sentence` query variable is used to enable phrase searching, Relevanssi now adds quotes to the `highlight` parameter. -* Minor fix: Add support for JetSmartFilters. -* Minor fix: Add support for WooCommerce products attribute lookup table filtering. -* Minor fix: Improve excerpts to avoid breaking HTML tags when tags are allowed. -* Minor fix: Fix broken tag and category weight settings. -* Minor fix: Improve Polylang language detection. -* Minor fix: Relevanssi now hyphenates long search terms in the User searches page. This prevents long search terms from messing up the display. -* Minor fix: Improve WPFD file content indexing support. Relevanssi indexing now happens after the WPFD indexing is done. -* Minor fix: Add support for TablePress `table_filter` shortcodes. -* Minor fix: Stopped some problems with Did you mean suggestions suggesting the same word if a hyphen was included. -* Minor fix: Paging didn't work in admin searches for hierarchical post types (like pages). -* Minor fix: In-document highlighting could break certain elements thanks to Relevanssi messing up data attributes. -* Minor fix: Relevanssi now recursively runs `relevanssi_block_to_render` and the CSS `relevanssi_noindex` filtering for inner blocks. - -= 4.16.0 = -* New feature: Oxygen compatibility has been upgraded to support JSON data from Oxygen 4. This is still in early stages, so feedback from Oxygen users is welcome. -* New feature: New filter hook `relevanssi_oxygen_element` is used to filter Oxygen JSON elements. The earlier `relevanssi_oxygen_section_filters` and `relevanssi_oxygen_section_content` filters are no longer used with Oxygen 4; this hook is the only way to filter Oxygen elements. -* Changed behaviour: Relevanssi now applies `remove_accents()` to all strings. This is because default database collations do not care for accents and having accents may cause missing information in indexing. If you use a database collation that doesn't ignore accents, make sure you disable this filter. -* Minor fix: Relevanssi used `the_category` filter with too few parameters. The missing parameters have been added. -* Minor fix: Stops drafts and pending posts from showing up in Relevanssi Live Ajax Searches. -* Minor fix: Phrases weren't used in some cases where a multiple-word phrase looked like a single-word phrase. -* Minor fix: Prevents fatal errors from `relevanssi_strip_all_tags()`. - -= 4.15.2 = -* New feature: New filter hook `relevanssi_didyoumean_token` lets you filter Did you mean words before correction. You can use this filter hook to exclude words from being corrected. -* Minor fix: Phrase search couldn't find phrases that include an ampersand if they matched the post title. This works now. -* Minor fix: Relevanssi now adds spaces after table cell tags to avoid table cell content sticking together in excerpts. -* Minor fix: The 'Allowable tags in excerpts' function now automatically corrects the entered value to match what Relevanssi expects the value to be. - -= 4.15.1 = -* Changed behaviour: Relevanssi now ignores WordPress metadata custom fields that aren't interesting for Relevanssi indexing. -* Changed behaviour: Both `relevanssi_get_permalink()` and `relevanssi_the_permalink()` now can take post ID or a post object as a parameter and can thus be used outside the Loop. -* Changed behaviour: The `relevanssi_hits_filter` hook now gets the WP_Query object as the second parameter. -* Minor fix: Avoid error messages for missing `mysqlcolumn_matches` array key. - -= 4.15.0 = -* New feature: The action hook `relevanssi_init` runs at the end of the `relevanssi_init()` function. -* New feature: New filter hook `relevanssi_author_query_filter` filters the post author MySQL query. -* New feature: New filter hook `relevanssi_by_date_query_filter` filters the by_date MySQL query. -* New feature: New filter hook `relevanssi_date_query_filter` filters the date query MySQL query. -* New feature: New filter hook `relevanssi_parent_query_filter` filters the post parent MySQL query. -* New feature: New filter hook `relevanssi_post_query_filter` filters the post__in and post__not_in MySQL query. -* New feature: New filter hook `relevanssi_post_status_query_filter` filters the post_status MySQL query. -* New feature: New filter hook `relevanssi_post_type_query_filter` filters the post_type MySQL query. -* Minor fix: The Bricks compatibility was improved, Relevanssi now notices changes to Bricks posts more often. Relevanssi also only reads the text from the `_bricks_page_content_2` custom field. - -= 4.14.7 = -* User interface: The synonym settings page now alerts if the synonyms aren't active because of the AND search. - -= 4.14.6 = -* Security fix: Extra hardening for AJAX requests. Some AJAX actions in Relevanssi could leak information to site subscribers who knew what to look for. - -= 4.14.5 = -* Security fix: Any registered user could empty the Relevanssi index by triggering the index truncate AJAX action. That is no longer possible. -* New feature: The [searchform] shortcode has a new parameter, 'checklist', which you can use to create taxonomy checklists. -* Changed behaviour: The `relevanssi_search_again` parameter array has more parameters the filter can modify. -* Changed behaviour: The `relevanssi_show_matches` filter hook gets the post object as the second parameter. -* Minor fix: The `cats` and `tags` parameters work better and support array values. - -= 4.14.4 = -* Minor fix: `relevanssi_orderby` did not always accept an array-format orderby parameter. -* Minor fix: Removes a highlighting problem stemming from uppercase search terms. -* Minor fix: Relevanssi removes highlights better from inside multiline HTML tags. -* Minor fix: When image attachment indexing was disabled, saving image attachments would still index the images. Image attachment blocking is now a `relevanssi_indexing_restriction` filter function, which means it's always active. - -= 4.14.3 = -* Security fix: User searches page had a XSS vulnerability. - -= 4.14.2 = -* Minor fix: Remove unnecessary database calls from admin pages. -* Minor fix: Improved Oxygen compatibility. - -= 4.14.1 = -* Adds a missing file. - -= 4.14.0 = -* New feature: New filter hook `relevanssi_render_blocks` controls whether Relevanssi renders blocks in a post or not. If you are having problems updating long posts with lots of blocks, having this filter hook return `false` for the post in question will likely help, as rendering the blocks in a long post can take huge amounts of memory. -* New feature: The user searches page has been improved a lot. -* New feature: The [searchform] shortcode has a new parameter, 'post_type_boxes', which creates a checkbox for each post type you list in the value. For example [searchform post_type_boxes='*post,page'] would create a search with a checkbox for 'post' and 'page' post types, with 'post' pre-checked. -* New feature: You can now have multiple dropdowns in one [searchform] shortcode. Anything that begins with 'dropdown' is considered a dropdown parameter, so you can do [searchform dropdown_1='category' dropdown_2='post_tag'] for example. -* New feature: New filter hook `relevanssi_search_params` lets you filter search parameters after they've been collected from the WP_Query. -* New feature: New filter hook `relevanssi_excerpt_post` lets you make Relevanssi skip creating excerpts for specific posts. -* Changed behaviour: Filter hooks `relevanssi_1day`, `relevanssi_7days` and `relevanssi_30days` are removed, as the user searches page is now different. The default value for `relevanssi_user_searches_limit` is now 100 instead of 20. -* Minor fix: In some languages, iOS uses „“ for quotes. Relevanssi now understands those for the phrase operator. -* Minor fix: Stops Relevanssi from blocking the admin search for WooCommerce coupons and other WooCommerce custom post types. -* Minor fix: Fixes problems with the WP-Members compatibility. -* Minor fix: New parameter for `relevanssi_tokenize()` introduces the context (indexing or search query). The `relevanssi_extract_phrases()` is only used on search queries. -* Minor fix: Relevanssi won't let you adjust synonyms and stopwords anymore if you use Polylang and are in 'Show all languages' mode. -* Minor fix: Highlighting is improved by a more precise HTML entity filter, thanks to Jacob Bearce. - -= 4.13.3.1 = -* Minor fix: The Bricks compatibility was broken. This version fixes it. - -= 4.13.3 = -* New feature: You can now add a post type dropdown to search forms with the [searchform] shortcode with the parameter 'dropdown' set to 'post_type'. -* New feature: Adds compatibility for Product GTIN (EAN, UPC, ISBN) for WooCommerce plugin. -* New feature: New filter hook `relevanssi_post_to_excerpt` lets you filter the post object before an excerpt is created from it. -* New feature: Relevanssi is now compatible with the Bricks page builder theme (requires Bricks 1.3.2). -* Minor fix: The ″ character is now counted as a quote. -* Minor fix: Running indexing through WP CLI doesn't cause PHP notices anymore. -* Minor fix: Sometimes the Did you mean would return really weird long suggestions from the search logs. That won't happen anymore. -* Minor fix: Improves tax_query handling in fringe cases with multiple AND clauses joined together with OR. -* Minor fix: Oxygen compatibility has been improved. Rich text fields and updating posts when they are saved in Oxygen now work better, and revisions are no longer indexed. -* Minor fix: Searching without a search term works much better now, you get more posts in the results (default value is up to 500). - -= 4.13.2 = -* New feature: Adds support for Avada Live Search. -* New feature: Adds support for Fibo Search. -* Minor fix: Elementor library searches are not broken anymore when Relevanssi is enabled in admin. -* Minor fix: Relevanssi now understands array-style post_type[] parameters. -* Minor fix: Relevanssi now automatically considers the Turkish 'ı' the same as 'i'. - -= 4.13.1 = -* New feature: Adds compatibility for WP-Members plugin, preventing blocked posts from showing up in the search results. -* New feature: New function `relevanssi_get_attachment_suffix()` can be used to return the attachment file suffix based on a post object or a post ID. -* Minor fix: Improves the Oxygen compatibility. Now also the [oxygen] shortcode tags are removed. - -= 4.13.0 = -* New feature: New filter hook `relevanssi_phrase` filters each phrase before it's used in the MySQL query. -* New feature: Relevanssi can now add Google-style missing term lists to the search results. You can either use the `%missing%` tag in the search results breakdown settings, or you can create your own code: the missing terms are also in `$post->missing_terms`. Relevanssi Premium will also add "Must have" links when there's just one missing term. -* New feature: New filter hook `relevanssi_missing_terms_tag` controls which tag is used to wrap the missing terms. -* New feature: New filter hook `relevanssi_missing_terms_template` can be used to filter the template used to display the missing terms. -* New feature: New function `relevanssi_get_post_meta_for_all_posts()` can be used to fetch particular meta field for a number of posts with just one query. -* New feature: New filter hook `relevanssi_post_author` lets you filter the post author display_name before it is indexed. -* Changed behaviour: `relevanssi_strip_tags()` used to add spaces between HTML tags before stripping them. It no longer does that, but instead adds a space after specific list of tags (p, br, h1-h6, div, blockquote, hr, li, img) to avoid words being stuck to each other in excerpts. -* Changed behaviour: Relevanssi now indexes the contents of Oxygen Builder PHP & HTML code blocks. -* Changed behaviour: Relevanssi now handles synonyms inside phrases differently. If the new filter hook `relevanssi_phrase_synonyms` returns `true` (default value), synonyms create a new phrase (with synonym 'dog=hound', phrase `"dog biscuits"` becomes `"dog biscuits" "hound biscuits"`). If the value is `false`, synonyms inside phrases are ignored. -* Minor fix: Warnings when creating excerpts with search terms that contain a slash were removed. -* Minor fix: Better Ninja Tables compatibility to avoid problems with lightbox images. -* Minor fix: Relevanssi did not work well in the Media Library grid view. Relevanssi is now blocked there. If you need Relevanssi in Media Library searches, use the list view. -* Minor fix: Relevanssi excerpt creation didn't work correctly when numerical search terms were used. - -= 4.12.5 = -* Changed behaviour: `relevanssi_excerpt_custom_field_content` now gets the post ID and list of custom field names as a parameter. -* Minor fix: Makes sure Relevanssi options are not wiped when the free version is deleted while Premium is active. -* Minor fix: Adds a trailing slash to the blog URL in Did you mean links. - -= 4.12.4 = -* New feature: New action hooks `relevanssi_pre_the_content` and `relevanssi_post_the_content` fire before and after Relevanssi applies `the_content` filter to the post excerpts. Some Relevanssi default behaviour has been moved to these hooks so it can be modified. -* Changed behaviour: The `relevanssi_do_not_index` gets the post object as a third parameter. -* Minor fix: Remove errors from `relevanssi_strip_all_tags()` getting a `null` parameter. - -= 4.12.3 = -* Major fix: Post type weights did not work; improving the caching had broken them. -* Minor fix: Relevanssi works better with soft hyphens now, removing them in indexing and excerpt-building. -* Minor fix: Stops indexing error messages in WPML. - -= 4.12.2 = -* Major fix: Stops more problems with ACF custom field indexing. -* Major fix: Fixes a bug in search result caching that caused Relevanssi to make lots of unnecessary database queries. - -= 4.12.1 = -* Major fix: Stops TypeError crashes from null custom field indexing. - -= 4.12.0 = -* New feature: New filter hook `relevanssi_phrase_queries` can be used to add phrase matching queries to support more content types. -* New feature: New filter hook `relevanssi_excerpt_gap` lets you adjust the first line of excerpt optimization. -* Changed behaviour: The `relevanssi_admin_search_element` filter hook now gets the post object as the second parameter, rendering the filter hook more useful. -* Changed behaviour: Relevanssi now automatically optimizes excerpt creation in long posts. You can still use `relevanssi_optimize_excerpts` for further optimization, but it's probably not necessary. -* Changed behaviour: The `relevanssi_tag_before_tokenize` filter hook parameters were changed in order to be actually useful and to match what the filter hook is supposed to do. -* Minor fix: In some cases Relevanssi wouldn't highlight the last word of the title. This is more reliable now. -* Minor fix: Relevanssi will now add the `highlight` parameter only to search results, and not to other links on the search results page. -* Minor fix: Improved fringe cases in nested taxonomy queries. -* Minor fix: Taxonomy terms in WPML were not indexed correctly. Instead of the post language, the current language was used, so if your admin dashboard is in English, German posts would get English translations of the terms, not German. This is now fixed. -* Minor fix: Excerpt creation is now faster when multiple excerpts are not used. -* Minor fix: The SEO plugin noindex setting did not actually work. That has been fixed now. - -= 4.11.1 = -* Major fix: The type hinting introduced for some functions turned out to be too strict, causing fatal errors. The type hinting has been relaxed (using nullable types would help, but that's a PHP 7.4 feature, and we don't want that). - -= 4.11.0 = -* New feature: New filter hook `relevanssi_rendered_block` filters Gutenberg block content after the block has been rendered with `render_block()`. -* New feature: New filter hook `relevanssi_log_query` can be used to filter the search query before it's logged. This can be used to log instead the query that includes synonyms (available as a parameter to the filter hook). -* New feature: New filter hook `relevanssi_add_all_results` can be used to make Relevanssi add a list of all result IDs found to `$query->relevanssi_all_results`. Just make this hook return `true`. -* New feature: New filter hook `relevanssi_acceptable_hooks` can be used to adjust where in WP admin the Relevanssi admin javascripts are enqueued. -* New feature: Support for All-in-One SEO. Posts marked as 'Robots No Index' are not indexed by Relevanssi. -* New feature: New setting in advanced indexing settings to control whether Relevanssi respects the SEO plugin 'noindex' setting or not. -* Changed behaviour: Type hinting has been added to Relevanssi functions, which may cause errors if the filter functions are sloppy with data types. -* Changed behaviour: `relevanssi_the_title()` now supports the same parameters as `the_title()`, so you can just replace `the_title()` with it and keep everything else the same. The old behaviour is still supported. -* Changed behaviour: Relevanssi no longer logs queries with the added synonyms. You can use the `relevanssi_log_query` filter hook to return to the previous behaviour of logging the synonyms too. Thanks to Jan Willem Oostendorp. -* Changed behaviour: When using ACF and custom fields indexing set to 'all', Relevanssi will no longer index the meta fields (where the content begins with `field_`). -* Minor fix: The Oxygen compatibility made it impossible to index other custom fields than the Oxygen `ct_builder_shortcodes`. This has been improved now. -* Minor fix: Old legacy scripts that caused Javascript warnings on admin pages have been removed. -* Minor fix: In some cases, having less than or greater than symbols in PDF content would block that PDF content from being indexed. - -= 4.10.2 = -* New feature: You can force Relevanssi to be active by setting the query variable `relevanssi` to `true`. Thanks to Jan Willem Oostendorp. -* Changed behaviour: Relevanssi has been moved from `the_posts` filter to `posts_pre_query`. This change doesn't do much, but increases performance slightly as WordPress needs to do less useless work, as now the default query is no longer run. Thanks to Jan Willem Oostendorp. -* Minor fix: Highlighting didn't work properly when highlighting something immediately following a HTML tag. -* Minor fix: You can no longer set the value of minimum word length to less than 1 or higher than 9 from the settings page. -* Minor fix: Importing options broke synonym and stopword settings. -* Minor fix: Improves the Rank Math SEO compatibility to avoid errors in plugin activation. -* Minor fix: WPML search results that included non-post results caused fatal errors and crashes. This fixes the crashing and makes non-post results work better in both WPML and Polylang. - -= 4.10.1 = -* Major fix: The multilingual stopwords and synonyms were used based on the global language. Now when indexing posts, the post language is used instead of the global language. - -= 4.10.0 = -* New feature: Relevanssi now supports multilingual synonyms and stopwords. Relevanssi now has a different set of synonyms and stopwords for each language. This feature is compatible with WPML and Polylang. -* New feature: SEO by Rank Math compatibility is added: posts marked as 'noindex' with Rank Math are not indexed by Relevanssi. -* Minor fix: With keyword matching set to 'whole words' and the 'expand highlights' disabled, words that ended with an 's' weren't highlighted correctly. -* Minor fix: The 'Post exclusion' setting didn't work correctly. It has been fixed. -* Minor fix: It's now impossible to set negative weights in searching settings. They did not work as expected anyway. -* Minor fix: Relevanssi had an unnecessary index on the `doc` column in the `wp_relevanssi` database table. It is now removed to save space. Thanks to Matthew Wang. -* Minor fix: Improved Oxygen Builder support makes sure `ct_builder_shortcodes` custom field is always indexed. - -= 4.9.1 = -* Changed behaviour: The `relevanssi_excerpt_part` filter hook now gets the post ID as a second parameter. The documentation for the filter has been fixed to match actual use: this filter is applied to the excerpt part after the highlighting and the ellipsis have been added. -* Changed behaviour: The `relevanssi_index_custom_fields` filter hook is no longer used when determining which custom fields are used for phrase searching. If you have a use case where this change matters, please contact us. -* Minor fix: The `relevanssi_excerpt` filter hook was removed in 4.9.0. It is now restored and behaves the way it did before. -* Minor fix: Avoids undefined variable warnings from the Pretty Links compatibility code. -* Minor fix: The Oxygen Builder compatibility has been improved. Now shortcodes in Oxygen Builder content are expanded, if that setting is enabled in Relevanssi settings. - -= 4.9.0 = -* New feature: There's now a "Debugging" tab in the Relevanssi settings, letting you see how the Relevanssi index sees posts. This is familiar to Premium users, but is now available in the free version as well. -* New feature: The SEO Framework plugin is now supported and posts set excluded from the search in SEO Framework settings will be excluded from the index. -* New feature: There's a new option, "Expand highlights". Enabling it makes Relevanssi expand partial-word highlights to cover the full word. This is useful when doing partial matching and when using a stemmer. -* New feature: New filter hook `relevanssi_excerpt_part` allows you to modify the excerpt parts before they are combined together. This doesn't do much in the free version. -* New feature: Improved compatibility with Oxygen Builder. Relevanssi automatically indexes the Oxygen Builder content and cleans it up. New filter hooks `relevanssi_oxygen_section_filters` and `relevanssi_oxygen_section_content` allow easier filtering of Oxygen content to eg. remove unwanted sections. -* Changed behaviour: The "Uncheck this for non-ASCII highlights" option has been removed. Highlights are now done in a slightly different way that should work in all cases, including for example Cyrillic text, thus this option is no longer necessary. -* Minor fix: Fixes phrase searching using non-US alphabet. -* Minor fix: Relevanssi would break admin searching for hierarchical post types. This is now fixed, Relevanssi won't do that anymore. -* Minor fix: Relevanssi indexing now survives better shortcodes that change the global `$post`. -* Minor fix: Warnings about missing `relevanssi_update_counts` function are now removed. -* Minor fix: Paid Membership Pro support now takes notice of the "filter queries" setting. -* Minor fix: OR logic didn't work correctly when two phrases both had the same word (for example "freedom of speech" and "free speech"). The search would always be an AND search in those cases. That has been fixed. -* Minor fix: Relevanssi no longer blocks the Pretty Links admin page search. -* Minor fix: The "Respect 'exclude_from_search'" setting did not work if no post type parameter was included in the search parameters. -* Minor fix: The category inclusion and exclusion setting checkboxes on the Searching tab didn't work. The setting was saved, but the checkboxes wouldn't appear. - -= 4.8.3 = -* New feature: Both `relevanssi_fuzzy_query` and `relevanssi_term_where` now get the current search term as a parameter. -* Minor fix: Relevanssi database tables don't have PRIMARY keys, only UNIQUE keys. In case this is a problem (for example on Digital Ocean servers), deactivate and activate Relevanssi to fix the problem. -* Minor fix: When `posts_per_page` was set to -1, the `max_num_pages` was incorrectly set to the number of posts found. It should, of course, be 1. -* Minor fix: Excluding from logs didn't work if user IDs had spaces between them ('user_a, user_b'). This is now fixed for good, the earlier fix didn't work. - -= 4.8.2 = -* New feature: New filter hook `relevanssi_term_where` lets you filter the term WHERE conditional for the search query. -* Minor fix: Doing the document count updates asynchronously caused problems in some cases (eg. importing posts). Now the document count is only updated after a full indexing and once per week. -* Minor fix: Phrase matching has been improved to make it possible to search for phrases that include characters like the ampersand. - -= 4.8.1 = -* Major fix: Changes in WooCommerce 4.4.0 broke the Relevanssi searches. This makes the WooCommerce search work again. -* Minor fix: Excluding from logs didn't work if user IDs had spaces between them ('user_a, user_b'). Now the extra spaces don't matter. -* Minor fix: The asynchronous doc count action in the previous version could cause an infinite loop with the Snitch logger plugin. This is prevented now: the async action doesn't run after indexing unless a post is actually indexed. -* Minor fix: Relevanssi indexing procedure was triggered for autosaved drafts, causing possible problems with the asynchronous doc count action. -* Minor fix: The `relevanssi_index_custom_fields` filter hook was not applied when doing phrase matching, thus phrases could not be found when they were in custom fields added with the filter. - -= 4.8.0 = -* Changed behaviour: Relevanssi now requires PHP 7. -* Changed behaviour: Relevanssi now sorts strings with `strnatcasecmp()` instead of `strcasecmp()`, leading to a more natural results with strings that include numbers. -* Changed behaviour: Relevanssi init is now moved from priority 10 to priority 1 on the `init` hook to avoid problems with missing TablePress compatibility. -* New feature: New filter hook `relevanssi_get_approved_comments_args` filters the arguments to `get_approved_comments` in comment indexing. This can be used to index custom comment types, for example. -* New feature: Content wrapped in the `noindex` tags is no longer used for excerpts. -* New feature: The `[et_pb_fullwidth_code]` shortcode is now removed completely, including the contents, when Relevanssi is indexing and building excerpts. -* Major fix: Relevanssi didn't index new comments when they were added; when a post was indexed or the whole index rebuilt, comment content was included. We don't know how long this bug has existed, but it is now fixed. Rebuild the index to get all comment content included in the index. -* Minor fix: Autoload has been disabled for several options that are not needed often. -* Minor fix: Phrase matching did not work correctly in visible custom fields. -* Minor fix: TablePress support could cause halting errors if posts were inserted before Relevanssi has loaded itself (on `init` priority 10). These errors will no longer happen. -* Minor fix: The doc count update, which is a heavy task, is now moved to an asynchronous action to avoid slowing down the site for users. -* Minor fix: Relevanssi only updates doc count on `relevanssi_insert_edit()` when the post is indexed. - -= 4.7.2 = -* Minor fix: Media Library searches failed if Relevanssi was enabled in the WP admin, but the `attachment` post type wasn't indexed. Relevanssi will no longer block the default Media Library search in these cases. -* Minor fix: Adds more backwards compatibility for the `relevanssi_indexing_restriction` change, there's now an alert on indexing tab if there's a problem. - -= 4.7.1 = -* New feature: New filter hook `relevanssi_post_content_after_shortcodes` filters the post content after shortcodes have been processed but before the HTML tags are stripped. -* Minor fix: Adds more backwards compatibility for the `relevanssi_indexing_restriction` change. - -= 4.7.0 = -* New feature: New filter hook `relevanssi_admin_search_blocked_post_types` makes it easy to block Relevanssi from searching a specific post type in the admin dashboard. There's built-in support for Reusable Content Blocks `rc_blocks` post type, for example. -* New feature: The reason why a post is not indexed is now stored in the `_relevanssi_noindex_reason` custom field. -* Changed behaviour: The `relevanssi_indexing_restriction` filter hook has a changed format. Instead of a string value, the filter now expects an array with the MySQL query in the index 'mysql' and a reason in string format in 'reason'. There's some temporary backwards compatibility for this. -* Changed behaviour: Relevanssi now applies minimum word length when tokenizing search query terms. -* Changed behaviour: Content stopwords are removed from the search queries when doing excerpts and highlights. When Relevanssi uses the untokenized search terms for excerpt-building, stopwords are removed from those words. This should lead to better excerpts. -* Minor fix: Improves handling of emoji in indexing. If the database supports emoji, they are allowed, otherwise they are encoded. - -= 4.6.0 = -* Changed behaviour: Phrases in OR search are now less restrictive. A search for 'foo "bar baz"' used to only return posts with the "bar baz" phrase, but now also posts with just the word 'foo' will be returned. -* Minor fix: User Access Manager showed drafts in search results for all users. This is now fixed. - -= 4.5.0 = -* New feature: New filter hook `relevanssi_disable_stopwords` can be used to disable stopwords completely. Just add a filter function that returns `true`. -* Changed behaviour: Stopwords are no longer automatically restored if emptied. It's now possible to empty the stopword list. If you want to restore the stopwords from the file (or from the database, if you're upgrading from an earlier version of Relevanssi and find your stopwords missing), just click the button on the stopwords settings page that restores the stopwords. -* Changed behaviour: Changes to post weights in the `relevanssi_results` hook did not affect the relevance scores shown in excerpts. That's changed now, and the displayed scores are now taken from the `$doc_weight` array, which is returned in the return value array from `relevanssi_search()`. -* Changed behaviour: Excerpt length and type are now checked outside the loop that goes through the posts. This reduces the number of database calls required. -* Minor fix: Searching for regex special characters (for example parentheses, brackets) caused problems in excerpts. -* Minor fix: Improvements in handling highlighting for words with apostrophes. -* Minor fix: Disregard hanging commas at the end of post exclusion settings. -* Minor fix: Sometimes excerpts wouldn't have an ellipsis in the beginning even though they should. - -= 4.4.1 = -* Major fix: Returns the missing stopwords. - -= 4.4.0 = -* New feature: It's now possible to exclude image attachments from the index with a simple setting on the indexing settings page. -* New feature: Page builder short codes are now removed in Relevanssi indexing. This should reduce the amount of garbage data indexed for posts in Divi, Avada and other page builder themes. -* Changed behaviour: The `relevanssi_page_builder_shortcodes` filter hook is now applied both in indexing and excerpts, and has a second parameter that will inform you of the current context. -* Minor fix: Stopwords weren't case insensitive like they should. They are now. Also, stopwords are no longer stored in the `wp_relevanssi_stopwords` database table, but are now stored in the `relevanssi_stopwords` option. -* Minor fix: A comma at the end of the custom field indexing setting made Relevanssi index all custom fields. This doesn't happen anymore and trailing commas are automatically removed, too. -* Minor fix: Accessibility improvements all around the admin interface. Screen reader support should be better, feel free to report any further ways to make this better. -* Minor fix: Doing searches without search terms and with the throttle disabled could cause problems. Relevanssi now makes sure throttle is always on when doing termless searches. -* Minor fix: Untokenized search terms are used for building excerpts, which makes highlighting in excerpts work better. -* Minor fix: Indexing did not adjust the number of posts indexed at one go like it should. - -= 4.3.4 = -* New feature: You can now give Gutenberg blocks a CSS class `relevanssi_noindex` to exclude them from being indexed. Relevanssi will not index Gutenberg blocks that have the class. -* New feature: Relevanssi automatically skips some custom fields from common plugins that only contain unnecessary metadata. -* New feature: The search results breakdown is added to the post objects and can be found in $post->relevanssi_hits. The data also includes new fields and the breakdown from the excerpt settings page can now show author, excerpt, custom field and MySQL column hits. -* New feature: Relevanssi can now index Ninja Tables table content. This is something of an experimental feature right now, feedback is welcome. -* New feature: New filter hook `relevanssi_indexing_query` filters the indexing query and is mostly interesting for debugging reasons. -* Minor fix: Deleted and trashed comment contents were not deindexed when the comment was removed. That has been corrected now. -* Minor fix: Phrase matching is now applied to attachments as well, including the attachments indexed for parent post. -* Minor fix: Phrase matching only looks at custom fields that are indexed by Relevanssi. -* Minor fix: Exact match bonus now uses the original query without synonyms added for the exact match check. -* Minor fix: Paid Membership Pro filtering is only applied to published posts to prevent drafts from showing up in the search results. - -= 4.3.3 = -* New feature: New filter hook `relevanssi_indexing_adjust` can be used to stop Relevanssi from adjusting the number of posts indexed at once during the indexing. -* New feature: New filter hook `relevanssi_acf_field_value` filters ACF field values before they are indexed. -* New feature: New filter hook `relevanssi_disabled_shortcodes` filters the array containing shortcodes that are disabled when indexing. -* Removed feature: The `relevanssi_indexing_limit` option wasn't really used anymore, so it has been removed. -* Changed behaviour: Indexing exclusions from Yoast SEO and SEOPress are applied in a different way in the indexing, making for a smoother indexing process. -* Changed behaviour: WP Table Reloaded support has been removed; you really shouldn't be using WP Table Reloaded anymore. -* Minor fix: Relevanssi won't choke on ACF fields with array or object values anymore. -* Minor fix: Relevanssi uninstall process left couple of Relevanssi options in the database. -* Minor fix: WPML language filter didn't work when `fields` was set to `ids` or `id=>parent`. - -= 4.3.2 = -* New feature: SEOPress support, posts marked "noindex" in SEOPress are no longer indexed by Relevanssi by default. -* Changed behaviour: Membership plugin compatibility is removed from `relevanssi_default_post_ok` function and has been moved to individual compatibility functions for each supported membership plugin. This makes it much easier to for example disable the membership plugin features if required. -* Minor fix: The `searchform` shortcode now works better with different kinds of search forms. -* Minor fix: Yoast SEO compatibility won't block indexing of posts with explicitly allowed indexing. -* Minor fix: The `relevanssi_the_tags()` function printed out plain text, not HTML code like it should. The function now also accepts the post ID as a parameter. -* Minor fix: Excerpt creation and highlighting have been improved a little. - -= 4.3.1.1 = -* Remove notice about undefined index. - -= 4.3.1 = -* Adding a missing file. - -= 4.3.0 = -* New feature: Multi-phrase searches now respect AND and OR operators. If multiple phrases are included in an OR search, any posts with at least one phrase will be included. In AND search, all phrases must be included. -* New feature: Admin search has been improved: there's a post type dropdown and the search is triggered when you press enter. The debug information has a `div` tag around it with the id `debugging`, so you can hide them with CSS if you want to. The numbering of results also makes more sense. -* New feature: The date parameters (`year`, `monthnum`, `w`, `day`, `hour`, `minute`, `second`, `m`) are now supported. -* New feature: New filter hook `relevanssi_indexing_limit` filters the default number of posts to index (10). If you have issues with indexing timing out, you can try adjusting this to a smaller number like 5 or 1. -* New feature: Support for Paid Membership Pro added. -* New feature: WordPress SEO support, posts marked "noindex" in WordPress SEO are no longer indexed by Relevanssi by default. -* Removed feature: qTranslate is no longer supported. -* Major fix: Tax query searching had some bugs in it, manifesting especially into Polylang not limiting the languages correctly. Some problems with the test suites were found and fixed, and similar problems won't happen again. -* Minor fix: Admin search only shows editing options to users with enough capabilities to use them. -* Minor fix: Phrase searching now uses filterable post statuses instead of a hard-coded set of post statuses. -* Minor fix: The plugin action links were missing on the Plugins page list, they're back now. -* Minor fix: Search terms with slashes won't cause errors anymore. -* Minor fix: Relevanssi admin pages have been examined for accessibility and form labels have been improved in many places. -* Deprecated: `relevanssi_get_term_taxonomy()` function is deprecated and will be removed at some point in the future. - -= 4.2.0 = -* New feature: The search form shortcode has a new parameter `dropdown` which can be used to add a category dropdown, like this: `[searchform dropdown="category"]`. -* New feature: Relevanssi can now use the contents of the PDF files indexed with WP File Download. -* New filter: `relevanssi_indexing_tokens` can be used to filter the tokens (individual words) before they are indexed. -* Removed filter: `relevanssi_default_meta_query_relation` did not have any effect anymore. -* Changed behaviour: The default taxonomy relation was set to AND in 4.1.4, but wasn't properly applied before. Now it is really switched. -* Changed behaviour: New post types have been added to list of forbidden post types Relevanssi won't show as indexing options (ACF, TablePress and WooCommerce). -* Major fix: Tax query processing has been completely refactored, eliminating all sorts of bugs, especially with various edge cases. -* Major fix: Gutenberg block indexing only worked with the Gutenberg plugin enabled. It now works with WP 5.0 built-in Gutenberg as well. If you use Gutenberg blocks, reindex to get all the block content in the index. -* Major fix: Excerpt-building and highlighting did not respect the "Keyword matching" setting. They do now, and the excerpts should be better now. -* Major fix: AND searches needed queries that could get too long for the database to handle. This has been fixed and optimized. -* Major fix: Taxonomy term subquery relations didn't work; now they are applied. -* Minor fix: iOS uses curly quotes by default, and that didn't work as a phrase operator. Now phrase operator works with curly quotes and straight quotes. -* Minor fix: The Did you mean broke with search terms longer than 255 characters. -* Minor fix: Phrases with numbers and one word like "team 17" didn't work, because numbers weren't counted as words. - -= 4.1.4 = -* `EXISTS` and `NOT EXISTS` didn’t work for taxonomy terms in searches. -* WPML post type handling has been improved. If post type allows fallback for default language, Relevanssi will support that. -* Relevanssi now reminds you to set up automatic trimming for the logs. It’s a really good idea, otherwise the logs will become bloated, which will hurt search performance. -* The Groups posts filter is only applied to public posts to avoid drafts being shown to people who shouldn’t see them. -* The `posts_per_page` query variable didn’t work; it’s now added to the introduced query variables so that it works. -* Relevanssi won’t log empty queries anymore. -* The default tax query relation was switched from `OR` to `AND` to match the WP_Query default behaviour. -* When used with WP 5.1, Relevanssi will now use `wp_insert_site` instead of the now-deprecated `wpmu_new_blog`. -* Multisite blog creation is handled better in WP 5.1+. -* Relevanssi now supports Restrict Content Pro permissions. - -= 4.1.3 = -* Improvements to meta key sorting. -* Relevanssi settings page won't let you exclude categories you have restricted the search to. -* Members plugin compatibility has been improved: it's only used if the 'content permissions' feature has been enabled. -* The excerpt settings page was a bit buggy. -* Slimstat analytics is now added to the blocked shortcodes list. -* New filter: `relevanssi_search_form` works exactly like `get_search_form`, but only applies to the Relevanssi shortcode search forms. -* New JetPack taxonomies and post types have been added to the block list so they won't appear in Relevanssi settings. - -= 4.1.2 = -* Choosing "CSS Style" for highlighting was not possible. That is now fixed. -* Gutenberg reusable block indexing was fatally broken with the latest Gutenberg version. That has been updated. -* Relevanssi now by default respects the WooCommerce "exclude from search" setting. -* `post__not_in` still didn't work properly, it does now. -* New filter: `relevanssi_comparison_order` can be used to define the sorting order when sorting the results by post type. -* "Did you mean" process included a very slow query. It is now cached, leading in some cases to massive performance improvements (we're talking about several seconds here). -* Highlights inside `code` and similar blocks are handled better now. - -= 4.1.1.2 = -* Fixes the broken User searches page. - -= 4.1.1.1 = -* Adding the missing Gutenberg compatibility file. - -= 4.1.1 = -* Relevanssi can now index Gutenberg reusable blocks. (This functionality broke once already before release, so that can happen, since Gutenberg is still in very active development.) -* The `post__in` and `post__not_in` parameters didn't work, and are now fixed. `post_parent__in` and `post_parent__not_in` are also improved. -* You can use named meta queries for sorting posts. Meta query sorting is improved in other ways as well. -* Log export didn't work properly. -* Adding stopwords from the common word list has been fixed. -* The `relevanssi_get_words_having` filter hook is now also applied to the free version Did you mean queries. -* New filters: `relevanssi_1day` and `relevanssi_7days` can be used to adjust the number of days for log displays, so instead of 1, 7 and 30 days you can have anything you want. - -= 4.1.0.1 = -* Actually working admin search. - -= 4.1 = -* New feature: You can now export the search log as a CSV file. -* New feature: Admin Search page allows you to perform searches in WP admin using Relevanssi. -* New filter: `relevanssi_admin_search_capability` can be used to adjust who sees the admin search page. -* New filter: `relevanssi_entities_inside_pre` and `relevanssi_entities_inside_code` adjust how HTML entities are handled inside `pre` and `code` tags. -* Numeric meta values (`meta_value_num`) are now sorted as numbers and not strings. -* Pinned posts have `$post->relevanssi_pinned` set to 1 for debugging purposes, but you can also use this for styling the posts in the search results templates. -* The Did you mean feature has been toned down a bit, to make the suggestions slightly less weird in some cases. -* Post parent parameters now accept 0 as a value, making it easier to search for children of any post or posts without a parent. -* Polylang compatibility has been improved. -* Phrases with apostrophes inside work better. -* The `relevanssi_excerpt` filter hook got a second parameter that holds the post ID. -* Custom field sorting actually works now. -* WP Search Suggest compatibility added. - -= 4.0.11 = -* Home page links were getting the highlight parameter even though they shouldn't. This has been fixed. -* Added support for WP JV Post Reading Groups. -* Improved handling of HTML entities. -* Events Made Easy Calendar shortcodes are now removed when building excerpts. -* `set_time_limit()` was removed from the indexing; it's no longer necessary, and it can break the indexing on sites that don't allow the use of the function. -* `relevanssi_post_title_before_tokenize` filter was moved a bit so that it's the last thing that runs before tokenizing. -* Disabled shortcodes are handled better in the indexing: the shortcode names won't be indexed anymore like they were before. -* Made sure there won't be a warning for non-numeric values when searching. -* New filter: `relevanssi_clean_excerpt` lets you remove unwanted highlights from excerpts. -* Highlighting works better with `pre` and `code` tags. -* New filter: `relevanssi_comment_author_to_index` lets you filter comment author names before indexing. -* `relevanssi_comment_content_to_index` doesn't include the comment author name anymore. - -= 4.0.10.1 = -* The privacy features caused an error notice with certain Relevanssi configurations, and the plugin required WP 4.9.6. - -= 4.0.10 = -* Privacy: If you log search queries, Relevanssi will suggest some additional content to your privacy policy page. -* Privacy: Relevanssi now supports the new Privacy Policy and Personal Data tools in WordPress 4.9.6. -* Saving synonyms with quotes worked, but the synonyms showed up wrong. -* Relevanssi could in some situations override navigation menu links with links to the user profiles or taxonomy terms found in the search. This update fixes that behaviour. -* Random order works again; using orderby `rand` didn't work properly. The `rand(seed)` format is also supported now. -* Fixed quotes and apostrophes in Did you mean suggestions. - -= 4.0.9 = -* Fixes broken tag and category indexing and searching. If you use tags and categories, rebuild the index after updating. -* Phrases were not highlighted correctly on documents. This is now fixed. -* Shortcode fix: 'wp_show_posts' shouldn't cause problems anymore. -* New filter: `relevanssi_indexing_restriction` allows filtering posts before indexing. -* New WooCommerce product visibility filtering tool makes WooCommerce product indexing faster. -* MemberPress post controls were loose and showed drafts to searchers. That is now fixed. -* Highlighting was too loose, even if matching was set to whole words. -* Highlighting now works better in cases where there's a hyphen or an apostrophe inside a word. - -= 4.0.8 = -* Fixed cases where Relevanssi added an ellipsis even if the excerpt was from the start of the post. -* Highlighting now works with numeric search strings. -* Improved highlighting for accented words. Thanks to Paul Ryan. -* A surplus comma at the end of post exclusion setting won't break the search anymore. -* Fixed instructions for adjusting the throttle limit. - -= 4.0.7 = -* Recent post bonus is now applied to searches. -* Exact term setting can now be disabled. -* Users of Members plugin would have drafts appear in search results. This is now fixed. - -= 4.0.6 = -* Indexing bugs squashed. -* Missing tag and category weight settings returned. -* Fusion builder shortcodes are removed from excerpts. -* MemberPress post control was backwards. -* User searches page reset buttons fixed. -* WPML language filter fix. - -= 4.0.4 = -* Fixed shortcode: `searchform` shortcode didn't work properly. -* Setting post type or post content weight to 0 didn't work. -* Gravity Forms shortcode is now disabled in Relevanssi indexing. -* New filter: `relevanssi_excerpt_query` filters the search query before building excerpts. -* HTML tags are stripped from post excerpts when using the excerpt to build Relevanssi excerpts. -* Fixed filter: `relevanssi_custom_field_value` didn't have the correct post ID parameter. -* `relevanssi_get_permalink` doesn't add the `highlight` parameter to URLs outside search results pages anymore, and won't add the parameter to front page links either. -* Relevanssi used `sanitize_hex_color`, which isn't actually reliably available. -* Did you mean suggestions have been improved. -* Single-word phrases are not allowed anymore, as they do no good. They are silently converted to non-phrases now. - -= 4.0.3 = -* Relevanssi didn't index all posts with one go. It does now. -* © and ® symbols caused problems in indexing; they are now included in the default punctuation removal. -* In some cases excerpt-building could take ages because of autoembed link discovery. Relevanssi now blocks the autoembed procedure in link-building. -* New filter: `relevanssi_custom_field_value` is used to filter custom field values both before indexing and before excerpt-building. Parameters include the field name and the post ID. -* Updated filter: `relevanssi_index_custom_fields` now gets a second parameter that contains the post ID. - -= 4.0.2 = -* Removed couple of error notices in the code. -* Improved the support for page builders. -* Improvements to the Polylang setting. - -= 4.0.1 = -* The plugin can now be uninstalled. - -= 4.0 = -* Legacy code has been removed. If you have a version older than 3.6, update first to 3.6.2.2 to guarantee smooth upgrade process. -* Improved indexing: no more clicking "Continue indexing" again and again! -* Settings pages have been completely rewritten. -* There's documentation in the WordPress contextual help: just click Help on the top right corner. -* Better Polylang support. A new option to remove the Polylang language filter. -* Logs can be automatically trimmed. Old log entries are removed to save space. -* Finally a setting to adjust content weight! -* Excerpts can use the custom field content. -* Highlighting in documents is changed: it now requires a `highlight` query parameter. This helps getting pass caching and makes the highlighting more reliable. To get the query parameter active, use `relevanssi_get_permalink()` to print out the permalinks on the search results templates. -* Relevanssi added synonyms to highlighting even if synonyms were not used for searching. In some cases, synonyms were added twice. -* The User Searches page got a makeover, too. -* Relevanssi is automatically disabled in REST API searches. -* Groups and Simple Membership support has been improved. -* Sorting search results is now up to 300 times faster than before. -* Lots of improvements all over the place. -* New filter: `relevanssi_excerpt_custom_field_content` lets you modify custom field content that is used for excerpts. -* New filter: `relevanssi_punctuation_filter` allows for easy modification of punctuation handling. -* New filter: `relevanssi_default_punctuation_replacement` changes the default way to handle the rest of the punctuation. -* New filter: `relevanssi_search_again` lets you run the search again if no results are found and to modify the parameters between search runs. -* New filter: `relevanssi_fallback` allows you to do fallback searches. -* New filter: `relevanssi_page_builder_shortcodes` lets you control which page builder shortcodes Relevanssi removes before building the excerpts. -* New filter: `relevanssi_optimize_excerpts` makes excerpt-building faster, if you make the filter return `true`. - -= 3.6.2.2 = -* A bug in post sorting broke string sorting (mostly post title sorting). - -= 3.6.2.1 = -* A bug was left in the post ordering code. That bug is now squashed. - -= 3.6.2 = -* Simple Membership plugin is now supported automatically to restrict access to posts. -* Relevanssi can now handle orderby parameter in array format. -* Relevanssi now blocks Easy Digital Downloads shortcodes when indexing to improve compatibility with EDD. -* When using `fields` to only fetch post IDs, Relevanssi doesn't try to highlight post titles. -* New action: `relevanssi_update_options` lets you adjust Relevanssi options immediately after the defaults are set. -* Remove notices about duplicated database columns when installing the plugin. - -= 3.6.1 = -* SECURITY: This version fixes a SQL injection vulnerability, where a site admin could theoretically inject SQL code into Relevanssi search queries. Doing this required access to Relevanssi settings page and in my tests, I couldn't do any damage, just break the Relevanssi search, but in any case, this vulnerability is now fixed. -* Search and Filter shortcode is added to the blacklist. -* Groups plugin is now supported automatically to restrict access to posts. -* The filter `relevanssi_index_custom_fields` now works even if the custom field setting is empty. -* The filter `relevanssi_post_to_index` now has a second parameter. For posts, it simply repeats the post object, but for taxonomy terms, it has the term object. - -= 3.6.0 = -* Changed a bit how Relevanssi attaches itself to queries. Instead of the global $wp_query, Relevanssi now uses the query passed as the parameter to `the_posts` filter hook. This should improve compatibility in some cases, but may cause problems in some fringe cases. If you're doing something unusual with Relevanssi, try this out before deploying to public use. -* Some meta queries caused major problems with the Relevanssi weighting algorithm. This has now been fixed. -* Error notices caused by trying to use a non-existing taxonomy term have been removed. - -= 3.5.12 = -* Post type exclusion didn't work as expected. -* Relevanssi couldn't handle nested tax queries (such as those generated by WooCommerce product visibility filtering) properly. - -= 3.5.11.1 = -* New filter: `relevanssi_allow_one_letter_highlights` lets you allow one-letter highlights. Just make the filter function return `true`. -* New filter: `relevanssi_block_one_letter_searches` by default blocks one-letter searches. If you want to enable them, add a filter function that always returns `false`. -* Fixed an undefined variable notice. - -= 3.5.11 = -* Synonym indexing failed if synonyms contained a forward slash. -* Highlighting HTML tags has been improved further. -* New filter: `relevanssi_tag_before_tokenize` allows you to access tag content before indexing. -* Relevanssi now actively blocks one-letter search terms, as they are generally pointless and can cause "out of memory" issues. One-letter search terms are no longer highlighted, either. These are usually caused by cases like "word's" being interpreted as "word s". -* New filter: `relevanssi_disable_shortcodes_excerpt` lets you add more shortcodes to be disabled before excerpts are built. - -= 3.5.10 = -* Some users got a fatal parse error. That shouldn't happen anymore. -* FacetWP users ran into trouble, as `relevanssi_do_query()` started to explicitly expect a WP_Query object in version 1.15.0. That expectation is removed; it's still highly recommended for future compatibility that you use WP_Query objects. -* Small bug fix: `get_current_screen()` is now only used when it's available to avoid occasional fatal errors. -* Error messages from `DOING_AJAX` being undefined should be removed. - -= 3.5.9.1 = -* WP.org plugin repo didn't like 3.5.9 for some reason, hoping to have better luck with this. - -= 3.5.9 = -* Improved the way highlighting handles HTML tags, especially when highlighting on post pages. -* The throttle limit setting was removed from the settings page for causing trouble. If you need to change it, update `relevanssi_throttle_limit` option directly. -* Relevanssi didn't support tax_queries with `field` set to `name`. That works now. -* Much faster way of showing the 25 most common words in the index. If you've disabled this feature because it was so slow, try enabling it - you might be surprised! - -= 3.5.8 = -* Did you mean function had a XSS vulnerability, which is now removed. -* Minimum word length wasn't applied to titles in indexing. It is now fixed. If you think this is a problem, rebuild the index. -* TablePress compatibility has been improved. -* Meta query handling has been improved, thanks to Maxime Culea. -* Improved WP_Query parameter support: setting query variable `sentence` to 1 forces phrase search. -* Improved ACF compatibility. - -= 3.5.7.1 = -* Small fix for a bug that broke the settings page. - -= 3.5.7 = -* An improved version of the sorting function will not throw notices when Intuitive Custom Post Order plugin is used. -* New filter: `relevanssi_missing_sort_key` can be used to adjust the result sorting when using keys that are not present in all posts (eg. menu_order). -* Czech translation and stopwords, thanks to Michael Kucera. -* Relevanssi broke the WP admin menu search when admin searches were enabled. -* Relevanssi broke the admin page search under WP 4.7. Relevanssi is now disabled in admin page searches. -* The way accented characters are handled in highlighting is improved. A new filter, `relevanssi_accents_replacement_arrays`, can be used to adjust the accent replacement. - -= 3.5.6.1 = -* Fix for a fatal bug in 3.5.6. - -= 3.5.6 = -* Relevanssi admin page had a vulnerability that allowed SQL injection attacks. That is now fixed. -* Relevanssi didn't like to highlight search terms that are followed by a ?, an ! or an apostrophe. -* New filter: `relevanssi_ok_to_log` lets you control whether search queries are logged or not. - -= 3.5.5 = -* 500 errors caused by arrays in custom fields should be gone now. -* Improvements to the ACF "select" field support. -* Relevanssi will not break when frontend plugins insert posts. -* `relevanssi_match` filter has a new parameter, which contains the search term. -* Polylang support has been improved. -* WPML and Polylang filters work when "fields" is set to "ids". -* New filter: `relevanssi_log_get_user` gets passed the user object before Relevanssi decides if the query should be logged or not. - -= 3.5.4 = -* Relevanssi had a bug that lead to inflated relevancy scores for posts. -* Relevanssi can now index the human-readable labels of ACF "select" fields. (Thanks to RaphaĂ«l Droz.) -* New filter: `relevanssi_30days` can be used to adjust the 30 day logs to a different number of days. -* Adding stopwords that contain apostrophes didn't work. -* Ensured PHP7 and WP 4.6 compatibility. -* Fixed a small glitch that could happen if a highlighted term is next to a starting square bracket. - -= 3.5.3 = -* New filter `relevanssi_user_searches_limit` to adjust the number of user searches shown in the logs. -* Old data check is only done on Relevanssi settings page, not on all admin pages. That should improve admin performance. -* Fixed a fatal error when searching includes private posts. -* New filter: `relevanssi_remote_addr` can be used to modify the IP address logged to Relevanssi logs. -* Blocked CFDB and WooCommerce shortcodes that are causing problems with Relevanssi. - -= 3.5.2 = -* Added correct support for `term_taxonomy_id` in the `fields` parameter in tax_queries. - -= 3.5.1 = -* Fixed an error in the Did you mean function. -* Fixed an error if the search term was not found in content. -* Fixed an error when building excerpts from posts shorter than the excerpt length. -* Blocked the `[starpro]` shortcode that was causing problems with Relevanssi. -* New filter: `relevanssi_remove_stopwords_in_titles` allows you to include stopwords in titles. -* Added support for `term_tax_id` in the `fields` parameter in tax_queries. -* Excerpt-building failed if multibyte string operations were missing. It should work now. - -= 3.5 = -* Tokenizer was using `strlen()` and not `mb_strlen()`, so word lengths were not calculated properly. If your site uses non-ASCII alphabet, rebuilding the index is a good idea. -* Small improvement to WPML multilanguage filtering. -* `relevanssi_the_title()` got a new parameter: if you don't want to echo the title, you can use it like `relevanssi_the_title(false)` to make it return the title. -* Relevanssi had `the_title` filter hook calls that were missing the second parameter; that's now fixed. -* The excerpt-building algorithm is completely rewritten based on work by Ben Boyter (http://www.boyter.org/). -* The `[watupro]` shortcode didn't work with Relevanssi, so Relevanssi will now bypass it. -* The plugin i18n features have been improved slightly. -* New filter: `relevanssi_didyoumean_suggestion` lets you modify the Did you mean? suggestion before it's displayed. -* `relevanssi_didyoumean()` has a new parameter: you can now choose whether the result is echoed out (the default value) or just returned. -* In the search results breakdown, you can now use %categories% and %taxonomies% to show the number of matches in categories and taxonomies other than tags and cats, respectively. -* Relevanssi supports `fields` parameter (both `ids` and `id=>parent`) to return only post IDs or post IDs and post parents. - -= 3.4.2 = -* Empty lines on synonym settings caused problems. Fixed that. -* In WordPress 4.2 installations, emoji in will be handled better. Emoji in posts may cause problems with WordPress versions below 4.2, so please update! - -= 3.4.1 = -* Removed a notice about an undefined variable. - -= 3.4 = -* New filter: `relevanssi_valid_admin_status` can be used to adjust post statuses that Relevanssi will handle. -* If Relevanssi creates an empty excerpt for a post and there's a user-set excerpt for the post, that excerpt is used. -* No ellipsis is added to the post excerpt, if the post excerpt shows the whole post. -* The `relevanssi_post_title_before_tokenize` filter now has a second parameter that contains the post object. -* New filter: `relevanssi_display_common_words` can be used to disable the "25 most common words" listing on the settings page, if it's too heavy to load. -* Relevanssi was sanitizing taxonomy titles too aggressively. That is now toned down a bit. -* Relevanssi now supports `post_parent`, `post_parent__in` and `post_parent__not_in`, though you have to set them in `relevanssi_modify_wp_query` filter for them to work. -* Meta query support should now be perfect; there were some limitations with complicated meta queries before. - -= 3.3.8 = -* Fixed a bug that caused the results to change depending of the order of words in a multi-word search query. -* Added `product_categories` and `recent_products` from WooCommerce to the list of blocked shortcodes. -* There are improvements in excerpt-building and highlighting, especially when fuzzy search is enabled. -* Fixed a possible (if quite unlikely) XSS vulnerability. -* Improved search performance (thanks to MikeNGarrett). -* Sometimes highlights in documents make the document content disappear. I don't know why, but I've added a fix that should make the content visible (without the highlights) if a problem appears. - -= 3.3.7.1 = -* Fixed bbPress compatibility. - -= 3.3.7 = -* Fixed bbPress compatibility. - -= 3.3.6 = -* Relevanssi handles taxonomy terms in search better. The change requires a reindexing. -* Fix in indexing: Relevanssi will now bypass the global $post when indexing. This should help with problems with the Cookie Law Info plugin, for example. -* Tax query relation setting didn't work properly. It is now fixed. -* Word-based excerpt building sometimes created too short excerpts. That is now fixed. -* Synonyms are now highlighted. -* Phrase matching had issues where searching for a too common phrase crashed the search. That has been fixed. -* LIKE operator didn't work properly in meta_queries. -* Problems with Avatar Upload plugin are fixed. -* Offset errors with mb_stripos() shouldn't happen anymore. -* A small problem in taxonomy search MySQL fixed, also a small problem with AND operator in tax_queries. -* New filter: `relevanssi_post_to_index` lets you access the post object before the post is indexed. -* New filter: `relevanssi_orderby` lets you modify the $orderby value before Relevanssi sorts posts. -* New filter: `relevanssi_order` lets you modify the $order value before Relevanssi sorts posts. -* New filter: `relevanssi_post_title_before_tokenize` lets you modify post titles before indexing. -* New filter: `relevanssi_private_cap` lets you adjust the capability setting for private posts in custom post types. -* Deprecated use of `like_escape` has been fixed. - -= 3.3.5 = -* Fixed a bug where excluding posts would cause the search to fail. -* Fixed a bug causing duplicate search results in WPML searches. -* Increased plugin safety against hackers. -* There was a bug in `relevanssi_comment_content_to_index` filter. -* Some people had problems with the log entry timestamps. Fixed that. -* New filter: `relevanssi_prevent_default_request` gives you more control over where Relevanssi prevents the default query from running. -* New filter: `relevanssi_private_cap` lets you set the correct capability for finding private posts in custom post types. -* The option to exclude categories and tags from search only worked for categories, not tags. Tags have been separated to a different option. - -= 3.3.4 = -* Couple of bug fixes. - -= 3.3.3 = -* OR fallback had problems. -* Indexing sub pages didn't work. -* Relevanssi now automatically treats 'Ăź' as 'ss'. If your site has 'Ăź' in text, reindexing the database is a good idea. -* Query variable `post_status` is now supported. - -= 3.3.2 = -* Fixed a warning on search results page. - -= 3.3.1 = -* Fixed bugs related to the removal of the cache feature. - -= 3.3 = -* Improvements to excerpts: excerpts with phrases work much better now, and the excerpt creation logic has been improved: the excerpts are now better. The process takes a bit more time, though. -* Allowing HTML tags in excerpts could lead to those tags being left open. Relevanssi will now try to close open HTML tags in excerpts. -* Allowed tags were not controlled in comments. They are now. -* Highlighting in documents didn't always work; it should be more reliable now. -* Non-integer values are removed from `post__in` and `post__not_in` before processing them. -* Query variables `p` and `page_id` are now supported. -* Relevanssi now understands `date_query` variables as well. -* The original post excerpt is stored in $post->original_excerpt. -* Taxonomy search works better with term id parameters (for example from `wp_category_dropdown`). -* Errors about $wpdb->prepare() missing an argument removed. -* New functions: `relevanssi_the_title()` and `relevanssi_get_the_title()` can be used to display highlighted titles in search results. -* The old title highlighting method has been disabled, because it caused highlights in wrong places. Now the highlighted title is stored in $post->highlighted_post_title, take it from there or use the Relevanssi title functions to display it. -* Polylang and WPML support was adjusted to perform better in edge cases. -* Indexing is faster, thanks to some improved code from Tom Novelli. -* MySQL injection attack vulnerability removed. -* The cache feature is now removed. Relevanssi should automatically drop the cache tables. -* New filter: `relevanssi_indexing_data` lets you modify the data before it's indexed. - -= 3.2 = -* Fixed a bug in the TablePress support. -* Titles are put through the_title filter before indexing. -* New filter: `relevanssi_join` can be used to join tables in the Relevanssi search MySQL queries. Thanks to Ninos Ego. -* New filter: `relevanssi_post_content` can be used to modify post content before any Relevanssi processing. -* New filter: `relevanssi_post_content_before_tokenize` can be used to modify post content just before it's tokenized. -* New filter: `relevanssi_indexing_values` can be used to modify what Relevanssi stores in the index. -* New filter: `relevanssi_default_meta_query_relation` can be used to change the default meta query relation (default value is "AND"). -* When using a meta_query, `relation` can be set to OR now. -* Phrases are now matched to excerpts. -* Number of queries Relevanssi generates is much, much lower. -* New filter: `relevanssi_didyoumean_url` lets you modify the URL generated by the did you mean feature. -* Better set of Russian stopwords. -* Relevanssi now highlights search query synonyms as well in documents. - -= 3.1.9 = -* Fix to make Relevanssi compatible with WordPress 3.7. -* Fixed a mistyped database table name. -* Relevanssi disables responsive-flipbook shortcode in indexing; it was causing problems. -* Fixed a problem with an author dropdown with no author selected. - -= 3.1.8 = -* Category restriction and exclusion and couple of other category-related settings didn't work properly. -* Support for Polylang broke the support for WPML. That is now fixed. -* One deprecated `$wpdb->escape()` was still left; it's gone now. -* Shortcode `layerslider` was causing problems with Relevanssi; Relevanssi now disables it before building excerpts. -* Relevanssi won't break BBPress search anymore. -* If Relevanssi Premium is installed, deleting Relevanssi will not remove the databases and the options. - -= 3.1.7 = -* New filter: `relevanssi_comment_content_to_index` lets you modify comment content before it's indexed by Relevanssi (to index comment meta, for example). -* Facetious support: if post_type is set to -1, Relevanssi will not hang up on it. -* Numerical search terms work better now. -* Excerpt-building had issues, which are now fixed. -* Punctuation removal now replaces   with a space. -* "starrater" short code from GD Star Rating is now disabled in indexing. -* Punctuation removal now replaces invisible spaces with a normal space. -* Division by zero error caused by 0 in posts_per_page is now prevented, and -1 value for posts_per_page handled better. -* Relevanssi doesn't apply `get_the_excerpt` filters to excerpts it builds any more. -* New filter: `relevanssi_excerpt` lets you modify the excerpts Relevanssi creates. -* Relevanssi now suspends WP post cache while indexing, making indexing a lot more efficient. Thanks to Julien Mession for this one. -* Deprecated function errors in 3.6 removed. -* When search included user profiles or taxonomy terms, Relevanssi would generate lots of MySQL errors. Not anymore. -* New filter: `relevanssi_valid_status` lets you modify the post statuses Relevanssi indexes. -* New filter: `relevanssi_index_taxonomies_args` lets you modify the arguments passed to get_terms() when indexing taxonomies (for example to set 'hide_empty' to false). -* Searching by taxonomy ID could confuse two taxonomies with the same term_id. The search is now checking the taxonomy as well to see it's correct. -* Basic support for Polylang plugin. -* Russian and Italian stopwords are now included, thanks to Flector and Valerio Vendrame. -* Small fix in the way user meta fields are handled. - -= 3.1.6 = -* DEACTIVATE AND ACTIVATE THE PLUGIN AFTER YOU UPDATE. -* Fuzzy searches are now a lot more efficient; they were a huge resource hog before. -* Fixed a possible MySQL injection attack. -* Fixed MySQL errors from empty meta queries. -* Sort order (orderby and order variables) are now read from query variables instead of global variables. -* Relevanssi will not choke on bad values of orderby anymore. -* Limit searches is improved: when using AND search it is less likely to miss results. -* Phrase recognition read the whole post content (which it didn't need) from database, causing memory issues in some cases. Fixed that. -* Highlighting was broken, and should work much better now. - -= 3.1.5 = -* OR fallback didn't actually fall back to OR, but instead got stuck in an endless loop of AND searches. -* Meta queries didn't work without a key; now they work with just meta_value or meta_value_num. -* Meta queries had problems with meta_value being set to null. -* Relevanssi now supports category__and. By default this sets include_children to false. -* When querying by slug, the term taxonomy is also taken into consideration, fixing problems when same slug appears in different taxonomies. -* Author search didn't work. -* Fixed an error message caused by all-number synonyms starting with zero, like 02. -* Synonyms are now case-insensitive. -* New filter: `relevanssi_default_tax_query_relation` can be used to change the default tax query relation from OR to AND. -* Fixed undefined variable errors when doing an OR fallback. -* New filter: `relevanssi_bots_to_not_log` makes it possible to block bots from logs. The format matches what other plugins, ie. WP-Useronline, use for bot blocking, so you can share block lists. -* New filter: `relevanssi_admin_search_ok` gives you more control when Relevanssi overrides the default WP search in admin, useful for fixing P2P_Box AJAX search. -* Ordering search results by title or date in admin search works now. -* Modified the way the highlights work; now highlighting words with apostrophes should produce more meaningful results. -* Highlighting should not highlight anything between & and ; or in @siu', - '@]*?.*?@siu', - '@]*?.*?@siu', - '@]*?.*?@siu', - '@]*?.*?@siu', - '@]*?.*?@siu', - '@]*?.*?@siu', - '@]*?.*?@siu', - '@]*?.*?@siu', - '@@siu', - ), - ' ', - $text - ); - return $text; -} - -/** - * Strips tags from contents, keeping the allowed tags. - * - * The allowable tags are read from the relevanssi_excerpt_allowable_tags - * option. Relevanssi also adds extra spaces after some tags to make sure words - * are not stuck together after the tags are removed. The function also removes - * invisible content. - * - * @uses relevanssi_strip_invisibles() Used to remove scripts and other tags. - * @see strip_tags() Used to remove tags. - * - * @param string|null $content The content. - * - * @return string The content without tags. - */ -function relevanssi_strip_tags( $content ) { - if ( ! is_string( $content ) ) { - $content = strval( $content ); - } - $content = relevanssi_strip_invisibles( $content ); - - $space_tags = array( - '/(<\/?p.*?>)/', - '/(<\/?br.*?>)/', - '/(<\/?h[1-6].*?>)/', - '/(<\/?div.*?>)/', - '/(<\/?blockquote.*?>)/', - '/(<\/?hr.*?>)/', - '/(<\/?li.*?>)/', - '/()/', - '/(<\/td>)/', - ); - - $content = preg_replace( $space_tags, '$1 ', $content ); - return strip_tags( - $content, - get_option( 'relevanssi_excerpt_allowable_tags', '' ) - ); -} - -/** - * Returns the position of substring in the string. - * - * Uses mb_stripos() if possible, falls back to mb_strpos() and mb_strtoupper() - * if that cannot be found, and falls back to just strpos() if even that is not - * possible. - * - * @param string $haystack String where to look. - * @param string $needle The string to look for. - * @param int $offset Where to start, default 0. - * - * @return mixed False, if no result or $offset outside the length of $haystack, - * otherwise the position (which can be non-false 0!). - */ -function relevanssi_stripos( $haystack, $needle, int $offset = 0 ) { - if ( ! is_string( $haystack ) ) { - $haystack = strval( $haystack ); - } - if ( ! is_string( $needle ) ) { - $needle = strval( $needle ); - } - if ( $offset > relevanssi_strlen( $haystack ) ) { - return false; - } - - if ( preg_match( '/[\?\*]/', $needle ) ) { - // There's a ? or an * in the string, which means it's a wildcard search - // query (a Premium feature) and requires some extra steps. - $needle_regex = str_replace( - array( '?', '*' ), - array( '.', '.*' ), - preg_quote( $needle, '/' ) - ); - $pos_found = false; - while ( ! $pos_found ) { - preg_match( - "/$needle_regex/i", - $haystack, - $matches, - PREG_OFFSET_CAPTURE, - $offset - ); - /** - * This trickery is necessary, because PREG_OFFSET_CAPTURE gives - * wrong offsets for multibyte strings. The mb_strlen() gives the - * correct offset, the rest of this is because the $offset received - * as a parameter can be before the first $position, leading to an - * infinite loop. - */ - $pos = isset( $matches[0][1] ) - ? mb_strlen( substr( $haystack, 0, $matches[0][1] ) ) - : false; - if ( $pos && $pos > $offset ) { - $pos_found = true; - } elseif ( $pos ) { - ++$offset; - } else { - $pos_found = true; - } - } - } elseif ( function_exists( 'mb_stripos' ) ) { - if ( '' === $haystack ) { - $pos = false; - } else { - $pos = mb_stripos( $haystack, $needle, $offset ); - } - } elseif ( function_exists( 'mb_strpos' ) && function_exists( 'mb_strtoupper' ) && function_exists( 'mb_substr' ) ) { - $pos = mb_strpos( - mb_strtoupper( $haystack ), - mb_strtoupper( $needle ), - $offset - ); - } else { - $pos = strpos( strtoupper( $haystack ), strtoupper( $needle ), $offset ); - } - return $pos; -} - -/** - * Returns the length of the string. - * - * Uses mb_strlen() if available, otherwise falls back to strlen(). - * - * @param string $s The string to measure. - * - * @return int The length of the string. - */ -function relevanssi_strlen( $s ) { - if ( ! is_string( $s ) ) { - $s = strval( $s ); - } - if ( function_exists( 'mb_strlen' ) ) { - return mb_strlen( $s ); - } - return strlen( $s ); -} - -/** - * Multibyte friendly strtolower. - * - * If multibyte string functions are available, returns mb_strtolower() and - * falls back to strtolower() if multibyte functions are not available. - * - * @param string $str The string to lowercase. - * - * @return string $str The string in lowercase. - */ -function relevanssi_strtolower( $str ) { - if ( ! is_string( $str ) ) { - $str = strval( $str ); - } - if ( ! function_exists( 'mb_strtolower' ) ) { - return strtolower( $str ); - } else { - return mb_strtolower( $str ); - } -} - -/** - * Multibyte friendly substr. - * - * If multibyte string functions are available, returns mb_substr() and falls - * back to substr() if multibyte functions are not available. - * - * @param string $str The source string. - * @param int $start If start is non-negative, the returned string will - * start at the start'th position in str, counting from zero. If start is - * negative, the returned string will start at the start'th character from the - * end of string. - * @param int|null $length Maximum number of characters to use from string. If - * omitted or null is passed, extract all characters to the end of the string. - * - * @return string $str The string in lowercase. - */ -function relevanssi_substr( $str, int $start, $length = null ) { - if ( ! is_string( $str ) ) { - $str = strval( $str ); - } - if ( ! function_exists( 'mb_substr' ) ) { - return substr( $str, $start, $length ); - } else { - return mb_substr( $str, $start, $length ); - } -} - -/** - * Prints out the post excerpt. - * - * Prints out the post excerpt from $post->post_excerpt, unless the post is - * protected. Only works in the Loop. - * - * @see post_password_required() Used to check for password requirements. - * - * @global $post The global post object. - */ -function relevanssi_the_excerpt() { - global $post; - if ( ! post_password_required( $post ) ) { - echo '

' . $post->post_excerpt . '

'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - } else { - esc_html_e( 'There is no excerpt because this is a protected post.', 'relevanssi' ); - } -} - -/** - * Echoes out the permalink to the current post within Loop. - * - * Uses get_permalink() to get the permalink, then adds the 'highlight' - * parameter if necessary using relevanssi_add_highlight(), then echoes it out. - * - * @param int|WP_Post $post Post ID or post object. Default is the global $post. - * - * @uses relevanssi_get_permalink() Fetches the current post permalink. - */ -function relevanssi_the_permalink( $post = 0 ) { - echo esc_url( relevanssi_get_permalink( $post ) ); -} - -/** - * Prints out a list of tags for post. - * - * Replacement for the_tags() that does the same, but applies Relevanssi search term - * highlighting on the results. - * - * @param string $before What is printed before the tags, default ''. - * @param string $separator The separator between items, default ', '. - * @param string $after What is printed after the tags, default ''. - * @param boolean $echoed If true, echo, otherwise return the result. Default true. - * @param int $post_id The post ID. Default current post ID (in the Loop). - */ -function relevanssi_the_tags( string $before = '', string $separator = ', ', string $after = '', bool $echoed = true, int $post_id = 0 ) { - $tag_list = get_the_tag_list( $before, $separator, $after, $post_id ); - $found = preg_match_all( '~~', $tag_list, $matches ); - if ( $found ) { - $originals = $matches[0]; - $tag_names = $matches[1]; - $highlighted = array(); - - $count = count( $matches[0] ); - for ( $i = 0; $i < $count; $i++ ) { - $highlighted_tag_name = relevanssi_highlight_terms( $tag_names[ $i ], get_search_query(), true ); - $highlighted[ $i ] = str_replace( '>' . $tag_names[ $i ] . '<', '>' . $highlighted_tag_name . '<', $originals[ $i ] ); - } - - $tag_list = str_replace( $originals, $highlighted, $tag_list ); - } - - if ( $echoed ) { - echo $tag_list; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - } else { - return $tag_list; - } -} - -/** - * Prints out post title with highlighting. - * - * Uses the global $post object. Reads the highlighted title from - * $post->post_highlighted_title. This used to accept one parameter, the - * `$echo` boolean, but in 2.12.3 / 4.10.3 the function signature was matched - * to copy `the_title()` function in WordPress core. The original behaviour is - * still supported: `relevanssi_the_title()` without arguments works exactly as - * before and `relevanssi_the_title( false )` returns the title. - * - * @global object $post The global post object. - * - * @param boolean|string $before Markup to prepend to the title. Can also be a - * boolean for whether to echo or return the title. - * @param string $after Markup to append to the title. - * @param boolean $echoed Whether to echo or return the title. Default - * true for echo. - * - * @return void|string Void if $echoed argument is true, current post title with - * highlights if $echoed is false. - */ -function relevanssi_the_title( $before = true, string $after = '', bool $echoed = true ) { - if ( true === $before ) { - $before = ''; - $echoed = true; - } elseif ( false === $before ) { - $before = ''; - $echoed = false; - } - global $post; - if ( empty( $post->post_highlighted_title ) ) { - $post->post_highlighted_title = $post->post_title; - } - if ( relevanssi_strlen( $post->post_highlighted_title ) === 0 ) { - return; - } - $title = $before . $post->post_highlighted_title . $after; - if ( $echoed ) { - echo $title; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - } else { - return $title; - } -} - -/** - * Turns off options, ie. sets them to "off". - * - * If the specified options don't exist in the request array, they are set to - * "off". - * - * @param array $request The _REQUEST array, passed as reference. - * @param array $options An array of option names. - */ -function relevanssi_turn_off_options( array &$request, array $options ) { - array_walk( - $options, - function ( $option ) use ( &$request ) { - if ( ! isset( $request[ $option ] ) ) { - $request[ $option ] = 'off'; - } - } - ); -} - -/** - * Sets an option after doing floatval. - * - * @param array $request An array of option values. - * @param string $option The key to check. - * @param boolean $autoload Should the option autoload, default true. - * @param float $def_val The default value if floatval() fails, default 0. - * @param boolean $positive If true, replace negative values and zeroes with - * $def_val. - */ -function relevanssi_update_floatval( array $request, string $option, bool $autoload = true, float $def_val = 0, bool $positive = false ) { - if ( isset( $request[ $option ] ) ) { - $value = floatval( $request[ $option ] ); - if ( ! $value ) { - $value = $def_val; - } - if ( $positive && $value <= 0 ) { - $value = $def_val; - } - update_option( $option, $value, $autoload ); - } -} - -/** - * Sets an option after doing intval. - * - * @param array $request An array of option values. - * @param string $option The key to check. - * @param boolean $autoload Should the option autoload, default true. - * @param int $def_val The default value if intval() fails, default 0. - */ -function relevanssi_update_intval( array $request, string $option, bool $autoload = true, int $def_val = 0 ) { - if ( isset( $request[ $option ] ) ) { - $value = intval( $request[ $option ] ); - if ( ! $value ) { - $value = $def_val; - } - update_option( $option, $value, $autoload ); - } -} - -/** - * Sets an option with one of the listed legal values. - * - * @param array $request An array of option values. - * @param string $option The key to check. - * @param array $values The legal values. - * @param string $def_val The default value. - * @param boolean $autoload Should the option autoload, default true. - */ -function relevanssi_update_legal_value( array $request, string $option, array $values, string $def_val, bool $autoload = true ) { - if ( isset( $request[ $option ] ) ) { - $value = $def_val; - if ( in_array( $request[ $option ], $values, true ) ) { - $value = $request[ $option ]; - } - update_option( $option, $value, $autoload ); - } -} - -/** - * Sets an on/off option according to the request value. - * - * @param array $request An array of option values. - * @param string $option The key to check. - * @param boolean $autoload Should the option autoload, default true. - */ -function relevanssi_update_off_or_on( array $request, string $option, bool $autoload = true ) { - relevanssi_update_legal_value( - $request, - $option, - array( 'off', 'on' ), - 'off', - $autoload - ); -} - -/** - * Sets an option after sanitizing and unslashing the value. - * - * @param array $request An array of option values. - * @param string $option The key to check. - * @param boolean $autoload Should the option autoload, default true. - */ -function relevanssi_update_sanitized( array $request, string $option, bool $autoload = true ) { - if ( isset( $request[ $option ] ) ) { - $value = sanitize_text_field( wp_unslash( $request[ $option ] ) ); - update_option( $option, $value, $autoload ); - } -} - -/** - * Returns true if $_SERVER['HTTP_USER_AGENT'] is on the bot block list. - * - * Looks for bot user agents in the $_SERVER['HTTP_USER_AGENT'] and returns true - * if a match is found. - * - * @return bool True if $_SERVER['HTTP_USER_AGENT'] is a bot. - */ -function relevanssi_user_agent_is_bot(): bool { - if ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) { - /** - * Filters the bots Relevanssi should block from search queries. - * - * Lets you filter the bots that are blocked from Relevanssi search - * queries. - * - * @param array $bots An array of bot user agents. - */ - $bots = apply_filters( 'relevanssi_bots_to_block', relevanssi_bot_block_list() ); - foreach ( array_values( $bots ) as $lookfor ) { - if ( false !== stristr( $_SERVER['HTTP_USER_AGENT'], $lookfor ) ) { - return true; - } - } - } - return false; -} - -/** - * Validates that the parameter is a valid taxonomy type. - * - * @parameter string $taxonomy The taxonomy to validate. - * - * @return string The validated taxonomy, empty string if invalid. - */ -function relevanssi_validate_taxonomy( $taxonomy ) { - $taxonomy = sanitize_text_field( $taxonomy ); - if ( taxonomy_exists( $taxonomy ) ) { - return $taxonomy; - } - return ''; -} diff --git a/wp/wp-content/plugins/relevanssi/readme.txt b/wp/wp-content/plugins/relevanssi/readme.txt deleted file mode 100644 index 5f7cfe20..00000000 --- a/wp/wp-content/plugins/relevanssi/readme.txt +++ /dev/null @@ -1,254 +0,0 @@ -=== Relevanssi - A Better Search === -Contributors: msaari -Donate link: https://www.relevanssi.com/buy-premium/ -Tags: search, relevance, better search, product search, woocommerce search -Requires at least: 4.9 -Tested up to: 6.5 -Requires PHP: 7.0 -Stable tag: 4.22.2 -License: GPLv2 or later -License URI: http://www.gnu.org/licenses/gpl-2.0.html - -Relevanssi replaces the default search with a partial-match search that sorts results by relevance. It also indexes comments and shortcode content. - -== Description == - -Relevanssi replaces the standard WordPress search with a better search engine, with lots of features and configurable options. You'll get better results, better presentation of results - your users will thank you. - -This is the free version of Relevanssi. There's also Relevanssi Premium, which has added features. For more information about Premium, see [Relevanssi.com](https://www.relevanssi.com/). - -Do note that using Relevanssi may require large amounts (hundreds of megabytes) of database space (for a reasonable estimate, multiply the size of your `wp_posts` database table by three). If your hosting setup has a limited amount of space for database tables, using Relevanssi may cause problems. In those cases use of Relevanssi cannot be recommended. - -= Key features = -* Search results sorted in the order of relevance, not by date. -* Fuzzy matching: match partial words, if complete words don't match. -* Find documents matching either just one search term (OR query) or require all words to appear (AND query). -* Search for phrases with quotes, for example "search phrase". -* Create custom excerpts that show where the hit was made, with the search terms highlighted. -* Highlight search terms in the documents when user clicks through search results. -* Search comments, tags, categories and custom fields. -* Multisite friendly. -* bbPress support. -* Gutenberg friendly. - -= Advanced features = -* Adjust the weighting for titles, tags and comments. -* Log queries, show most popular queries and recent queries with no hits. -* Restrict searches to categories and tags using a hidden variable or plugin settings. -* Index custom post types and custom taxonomies. -* Index the contents of shortcodes. -* Google-style "Did you mean?" suggestions based on successful user searches. -* Support for [WPML multi-language plugin](http://wpml.org/) and [Polylang](https://wordpress.org/plugins/polylang/). -* Support for [s2member membership plugin](http://www.s2member.com/), [Members](https://wordpress.org/plugins/members/), [Groups](https://wordpress.org/plugins/groups/), [Simple Membership](https://wordpress.org/plugins/simple-membership/) and other membership plugins. -* Advanced filtering to help hacking the search results the way you want. -* Search result throttling to improve performance on large databases. -* Disable indexing of post content and post titles with a simple filter hook. - -= Premium features (only in Relevanssi Premium) = -* Indexing attachment content (PDF, Office, Open Office). -* Improved spelling correction in "Did you mean?" suggestions. -* Searching across multiple sites in the same multisite installation. -* Search and index user profiles. -* Search and index taxonomy term pages (categories, tags, custom taxonomies). -* Search and index arbitrary columns in wp_posts MySQL table. -* Assign weights to any post types and taxonomies. -* Assign extra weight to new posts. -* Let the user choose between AND and OR searches, use + and - operator (AND and NOT). -* Export and import settings. -* [WP CLI commands](https://www.relevanssi.com/user-manual/wp-cli/). -* [Related posts](https://www.relevanssi.com/knowledge-base/related-posts/). -* [Redirects for searches](https://www.relevanssi.com/user-manual/redirects/). - -== Screenshots == - -1. Overview page -2. Indexing settings -3. Searching settings -4. Logging settings -5. Excerpts and highlights -6. Synonym settings -7. Stopword settings - -== Installation == - -1. Install the plugin from the WordPress plugin screen. -1. Activate the plugin. -1. Go to the plugin settings page and build the index following the instructions there. -1. That's it! - -Relevanssi uses the standard search form and doesn't usually need any changes in the search results template. - -If the search does not bring any results, your theme probably has a query_posts() call in the search results template. That throws Relevanssi off. For more information, see [The most important Relevanssi debugging trick](https://www.relevanssi.com/knowledge-base/query_posts/). - -= Uninstalling = -To uninstall the plugin remove the plugin using the normal WordPress plugin management tools (from the Plugins page, first Deactivate, then Delete). If you remove the plugin files manually, the database tables and options will remain. - -== Frequently Asked Questions == - -= Knowledge Base = -You can find solutions and answers at the [Relevanssi Knowledge Base](https://www.relevanssi.com/category/knowledge-base/). - -= Contextual help = -Answers to many common problems can be found from the contextual menu. Just click "Help" in the top right corner of your WordPress admin dashboard on the Relevanssi settings page. - -= Relevanssi doesn't work = -If you the results don't change after installing and activating Relevanssi, the most likely reason is that you have a call to `query_posts()` on your search results template. This confuses Relevanssi. Try removing the `query_posts()` call and see what happens. - -= Searching for words with ampersands or hyphens doesn't work = -Please read [Words with punctuation can't be found](https://www.relevanssi.com/knowledge-base/words-ampersands-cant-found/). This is a Relevanssi feature, but you can fix it from Relevanssi indexing settings. - -= Where are the user search logs? = -See the top of the admin menu. There's 'User searches'. - -= Displaying the relevance score = -Relevanssi stores the relevance score it uses to sort results in the $post variable. Just add something like - -`echo $post->relevance_score` - -to your search results template inside a PHP code block to display the relevance score. - -= Did you mean? suggestions = -Relevanssi offers Google-style "Did you mean?" suggestions. See ["Did you mean" suggestions](https://www.relevanssi.com/knowledge-base/did-you-mean-suggestions/) in the Knowledge Base for more details. - -= What is tf * idf weighing? = - -It's the basic weighing scheme used in information retrieval. Tf stands for *term frequency* while idf is *inverted document frequency*. Term frequency is simply the number of times the term appears in a document, while document frequency is the number of documents in the database where the term appears. - -Thus, the weight of the word for a document increases the more often it appears in the document and the less often it appears in other documents. - -= What are stop words? = - -Each document database is full of useless words. All the little words that appear in just about every document are completely useless for information retrieval purposes. Basically, their inverted document frequency is really low, so they never have much power in matching. Also, removing those words helps to make the index smaller and searching faster. - -== Thanks == -* Cristian Damm for tag indexing, comment indexing, post/page exclusion and general helpfulness. -* Marcus Dalgren for UTF-8 fixing. -* Warren Tape for 2.5.5 fixes. -* Mohib Ebrahim for relentless bug hunting. -* John Calahan for extensive 4.0 beta testing. - -== Changelog == -= 4.22.2 = -* Security fix: Prevent CSV injection attack in log export. -* Security fix: Restrict access to doc count updates. -* Minor fix: Product variations check the parent product for access restrictions, to avoid situations where variations of a draft product appear in the results. -* Minor fix: Improved TablePress compatibility. -* Minor fix: Added error handling to the Ninja Table compatibility code. - -= 4.22.1 = -* Security fix: Relevanssi had a vulnerability where anyone could access the search logs and click logs. The log export is now protected. -* Minor fix: Relevanssi had problems with Polylang when a post or term didn't have language specified. Now Relevanssi handles those situations better. -* Minor fix: Post date throttling had a MySQL error that made it replace JOINs instead of concatenating. -* Minor fix: The log database table now has an index on session_id, as not having that index can slow down the search a lot. - -= 4.22.0 = -* New feature: New filter hook `relevanssi_searchform_dropdown_args` filters the arguments for `wp_dropdown_categories()` in search forms. -* Changed behaviour: Search form shortcode taxonomy dropdowns are now sorted alphabetically and not by term ID. -* Minor fix: Caught a bug in excerpt-building with empty words. -* Minor fix: It's now possible to set both `post__in` and `post__not_in` and likewise for `parent__in` and `parent__not_in`. -* Minor fix: The `post_status` is no longer available as a query parameter. -* Minor fix: It's now possible to sort posts in ascending order of relevance. - -= 4.21.2 = -* Minor fix: Meta query boolean to array conversion. - -= 4.21.1 = -* Changed behaviour: The 'relevanssi_index_content' and 'relevanssi_index_titles' filter hooks now get the post object as a second parameter. -* Minor fix: Relevanssi is now blocked in the reusable content block search. -* Minor fix: Stop Relevanssi from blocking the feed searches. -* Minor fix: Improve exact match boosts with accented letters. -* Minor fix: Entering synonyms in Polylang all languages mode was possible; it shouldn't be. - -= 4.21.0 = -* New feature: New filter hook `relevanssi_highlight_regex` makes it possible to adjust the regex used for highlighting. -* New feature: New filter hook `relevanssi_excerpt_custom_fields` filters the list of custom fields used for creating the excerpt. -* New feature: New filter hook `relevanssi_phrase_custom_fields` filters the list of custom fields used for phrase matching. Return an empty array to disable phrase matching in custom fields. -* New feature: New filter hook `relevanssi_phrase_taxonomies` filters the list of taxonomies used for phrase matching. Return an empty array to disable phrase matching in taxonomies. -* New feature: If RELEVANSSI_DEBUG, WP_DEBUG and WP_DEBUG_DISPLAY are all true, Relevanssi will print out indexing debugging messages to the error log (PHP error log or whatever is defined in WP_DEBUG_LOG). -* Minor fix: Some ACF fields change the global $post, leading to indexing problems. Relevanssi tries to prevent that now. -* Minor fix: Avoid fatal errors from `action` query variable being a non-string. -* Minor fix: Term indexing with WPML only indexed the terms in the current admin language. Now the terms are indexed in all languages. - -= 4.20.0 = -* New feature: Relevanssi can now create custom field specific excerpts that come from one custom field only and know which field that is. -* New feature: You can see the list of indexed custom field names in the indexing and excerpt settings. -* New feature: New filter hook `relevanssi_excerpt_specific_custom_field_content` filters the excerpt custom field content if `relevanssi_excerpt_specific_fields` is enabled. -* Changed behaviour: The `relevanssi_get_custom_field_content()` function now returns an array instead of string. If `relevanssi_excerpt_specific_fields` is off, the previous string return value is returned as a single-item array with the string in index 0. If the setting is on, the array keys are the field names. -* Minor fix: The stopword population during the multisite installation used the wrong database table, leading to failed population. -* Minor fix: Multisite installation is moved from `wp_insert_site` (priority 10) to `wp_initialize_site` (priority 200) in order to avoid trouble. -* Minor fix: The session ID is now included in the log export. -* Minor fix: The "none" value in category dropdowns from the searchform shortcode is changed from -1 to 0. - -= 4.19.0 = -* New feature: Logging now includes a session ID (based on user ID for logged-in users, HTTP user agent for others, and current time, stable for 10 minutes per user). This is used to remove duplicate searches from live searches, keeping only the final search query. - -= 4.18.4 = -* New feature: New filter hook `relevanssi_highlight_query` lets you modify the search query for highlighting. -* Changed behavior: Relevanssi no longer searches in feed searches by default. - -= 4.18.3 = -* New feature: New filter hook `relevanssi_blocked_field_types` can be used to control which ACF field types are excluded from the index. By default, this includes 'repeater', 'flexible_content', and 'group'. -* New feature: New filter hook `relevanssi_acf_field_object` can be used to filter the ACF field object before Relevanssi indexes it. Return false to have Relevanssi ignore the field type. -* New feature: Relevanssi debug mode has more features now. -* Minor fix: ACF field exclusion is now recursive. If a parent field is excluded, all sub fields will also be excluded. -* Minor fix: Handling of data attributes in in-document highlighting had a bug that caused problems with third-party plugins. -* Minor fix: The indexing settings tab now checks if the wp_relevanssi database table exists and will create the table if it doesn't. - -= 4.18.2 = -* New feature: Relevanssi now has a debug mode that will help troubleshooting and support. -* Minor fix: Using the_permalink() caused problems with search result links. That is now fixed. Relevanssi no longer hooks onto `the_permalink` hook and instead uses `post_link` and other similar hooks. - -= 4.18.1 = -* New feature: New filter hook `relevanssi_add_highlight_and_tracking` can be used to force Relevanssi to add the `highlight` and tracking parameters to permalinks. -* Changed behaviour: The 'relevanssi_wpml_filter' filter function now runs on priority 9 instead of 10 to avoid problems with custom filters on relevanssi_hits_filter. -* Minor fix: Handle cases of missing posts better; relevanssi_get_post() now returns a WP_Error if no post is found. -* Minor fix: Search queries that contain apostrophes and quotes can now be deleted from the log. -* Minor fix: Avoid a slow query on the searching tab when the throttle is not enabled. - -= 4.18.0 = -* New feature: Relevanssi now shows the MySQL `max_allowed_packet` size on the debug tab. -* New feature: Relevanssi now shows the indexing query on the debug tab. -* New feature: ACF field settings now include a 'Exclude from Relevanssi index' setting. You can use that to exclude ACF fields from the Relevanssi index. -* Minor fix: Relevanssi was adding extra quotes around search terms in the `highlight` parameter. -* Minor fix: Yet another update to data attributes in highlighting. Thanks to Faeddur. -* Minor fix: Taxonomy query handling was improved. This should help in particular Polylang users who've had problems with Relevanssi ignoring Polylang language restrictions. - -== Upgrade notice == -= 4.22.2 = -* Security hardening, improved compatibility with WooCommerce, TablePress and Ninja Tables. - -= 4.22.1 = -* Security hardening, better Polylang support. - -= 4.22.0 = -* Improvements to search form shortcode. - -= 4.21.2 = -* Bug fixes: meta query boolean to array conversion errors. - -= 4.21.1 = -* Bug fixes: Polylang compatibility, feed searches, accented letters. - -= 4.21.0 = -* New filter hooks, debugging tools and bug fixes. - -= 4.20.0 = -* Better method for handling custom fields in excerpts, bug fixes. - -= 4.19.0 = -* Logs now include a session ID. - -= 4.18.4 = -* No more searching in RSS feeds, new filter hook. - -= 4.18.3 = -* Better ACF field controls, bug fixes. - -= 4.18.2 = -* Fixes problems with broken permalinks. - -= 4.18.1 = -* Small bug fixes. - -= 4.18.0 = -* Debugging features, improved ACF support and bug fixes. \ No newline at end of file diff --git a/wp/wp-content/plugins/relevanssi/relevanssi.php b/wp/wp-content/plugins/relevanssi/relevanssi.php deleted file mode 100644 index fd585409..00000000 --- a/wp/wp-content/plugins/relevanssi/relevanssi.php +++ /dev/null @@ -1,92 +0,0 @@ - - * @license https://wordpress.org/about/gpl/ GNU General Public License - * @see https://www.relevanssi.com/ - * - * @wordpress-plugin - * Plugin Name: Relevanssi - * Plugin URI: https://www.relevanssi.com/ - * Description: This plugin replaces WordPress search with a relevance-sorting search. - * Version: 4.22.2 - * Author: Mikko Saari - * Author URI: http://www.mikkosaari.fi/ - * Text Domain: relevanssi - * License: GPLv2 or later - * License URI: http://www.gnu.org/licenses/gpl-2.0.html - */ - -/** - * Copyright 2024 Mikko Saari (email: mikko@mikkosaari.fi) - * This file is part of Relevanssi, a search plugin for WordPress. - * - * Relevanssi is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Relevanssi 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 Relevanssi. If not, see . - */ - -define( 'RELEVANSSI_PREMIUM', false ); - -add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), 'relevanssi_action_links' ); - -global $wp_version; -if ( version_compare( $wp_version, '5.1', '>=' ) ) { - add_action( 'wp_insert_site', 'relevanssi_new_blog', 10, 1 ); -} else { - add_action( 'wpmu_new_blog', 'relevanssi_new_blog', 10, 1 ); -} - -global $relevanssi_variables; -global $wpdb; - -$relevanssi_variables['relevanssi_table'] = $wpdb->prefix . 'relevanssi'; -$relevanssi_variables['stopword_table'] = $wpdb->prefix . 'relevanssi_stopwords'; -$relevanssi_variables['log_table'] = $wpdb->prefix . 'relevanssi_log'; -$relevanssi_variables['content_boost_default'] = 1; -$relevanssi_variables['comment_boost_default'] = 0.75; -$relevanssi_variables['title_boost_default'] = 5; -$relevanssi_variables['comment_boost_default'] = 0.75; -$relevanssi_variables['post_type_weight_defaults']['post_tag'] = 0.75; -$relevanssi_variables['post_type_weight_defaults']['category'] = 0.75; -$relevanssi_variables['post_type_index_defaults'] = array( 'post', 'page' ); -$relevanssi_variables['database_version'] = 8; -$relevanssi_variables['file'] = __FILE__; -$relevanssi_variables['plugin_dir'] = plugin_dir_path( __FILE__ ); -$relevanssi_variables['plugin_basename'] = plugin_basename( __FILE__ ); -$relevanssi_variables['plugin_version'] = '4.22.2'; - -require_once 'lib/admin-ajax.php'; -require_once 'lib/common.php'; -require_once 'lib/debug.php'; -require_once 'lib/didyoumean.php'; -require_once 'lib/excerpts-highlights.php'; -require_once 'lib/indexing.php'; -require_once 'lib/init.php'; -require_once 'lib/install.php'; -require_once 'lib/interface.php'; -require_once 'lib/log.php'; -require_once 'lib/options.php'; -require_once 'lib/phrases.php'; -require_once 'lib/privacy.php'; -require_once 'lib/search.php'; -require_once 'lib/search-tax-query.php'; -require_once 'lib/search-query-restrictions.php'; -require_once 'lib/shortcodes.php'; -require_once 'lib/sorting.php'; -require_once 'lib/stopwords.php'; -require_once 'lib/user-searches.php'; -require_once 'lib/utils.php'; diff --git a/wp/wp-content/plugins/relevanssi/relevanssi.po b/wp/wp-content/plugins/relevanssi/relevanssi.po deleted file mode 100644 index b13d6cbd..00000000 --- a/wp/wp-content/plugins/relevanssi/relevanssi.po +++ /dev/null @@ -1,2413 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: Relevanssi\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-02-25 10:14+0200\n" -"PO-Revision-Date: \n" -"Last-Translator: Mikko Saari \n" -"Language-Team: \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Poedit-KeywordsList: _e;__;esc_html__;esc_html_e;_n\n" -"X-Poedit-Basepath: .\n" -"X-Generator: Poedit 2.4.2\n" -"X-Poedit-SearchPath-0: .\n" -"X-Poedit-SearchPath-1: lib\n" - -#: lib/admin-ajax.php:91 vendor/lib/admin-ajax.php:89 -#, php-format -msgid "Indexed %1$d post (total %2$d), processed %3$d / %4$d." -msgstr "" - -#: lib/admin-ajax.php:214 lib/tabs/indexing-tab.php:130 -#: vendor/lib/admin-ajax.php:212 vendor/lib/tabs/indexing-tab.php:125 -msgid "Results" -msgstr "" - -#: lib/admin-ajax.php:218 vendor/lib/admin-ajax.php:216 -#, php-format -msgid "Found a total of %1$d posts, showing posts %2$d–%3$s." -msgstr "" - -#: lib/admin-ajax.php:220 vendor/lib/admin-ajax.php:218 -msgid "Previous page" -msgstr "" - -#: lib/admin-ajax.php:223 vendor/lib/admin-ajax.php:221 -msgid "Next page" -msgstr "" - -#: lib/admin-ajax.php:227 vendor/lib/admin-ajax.php:225 -msgid "Score:" -msgstr "" - -#: lib/admin-ajax.php:252 vendor/lib/admin-ajax.php:250 -msgid "Edit" -msgstr "" - -#: lib/admin-ajax.php:300 vendor/lib/admin-ajax.php:296 -msgid "Query variables" -msgstr "" - -#: lib/admin-ajax.php:369 vendor/lib/admin-ajax.php:365 -msgid "Filters" -msgstr "" - -#: lib/admin-ajax.php:370 vendor/lib/admin-ajax.php:366 -msgid "show" -msgstr "" - -#: lib/admin-ajax.php:371 vendor/lib/admin-ajax.php:367 -msgid "hide" -msgstr "" - -#: lib/common.php:999 vendor/lib/common.php:1601 -msgid "25 most common words in the index" -msgstr "" - -#: lib/common.php:1000 vendor/lib/common.php:1602 -msgid "" -"These words are excellent stopword material. A word that appears in most of " -"the posts in the database is quite pointless when searching. This is also an " -"easy way to create a completely new stopword list, if one isn't available in " -"your language. Click the word to add the word to the stopword list. The word " -"will also be removed from the index, so rebuilding the index is not " -"necessary." -msgstr "" - -#: lib/common.php:1006 vendor/lib/common.php:1608 -msgid "Stopword Candidates" -msgstr "" - -#: lib/common.php:1011 vendor/lib/common.php:1613 -msgid "Add to stopwords" -msgstr "" - -#: lib/common.php:1014 vendor/lib/common.php:1616 -msgid "Add to content stopwords" -msgstr "" - -#: lib/common.php:1334 -#, php-format -msgid "Nothing found for post ID %d." -msgstr "" - -#: lib/common.php:1341 -msgid "Possible reasons this post is not indexed" -msgstr "" - -#: lib/common.php:1345 -msgid "Post title" -msgstr "" - -#: lib/common.php:1349 -msgid "Post content" -msgstr "" - -#: lib/common.php:1353 lib/tabs/indexing-tab.php:320 -#: vendor/lib/tabs/indexing-tab.php:265 -msgid "Comments" -msgstr "" - -#: lib/common.php:1357 -msgid "Tags" -msgstr "" - -#: lib/common.php:1361 -msgid "Categories" -msgstr "" - -#: lib/common.php:1365 -msgid "Other taxonomies" -msgstr "" - -#: lib/common.php:1369 -msgid "Links" -msgstr "" - -#: lib/common.php:1373 -msgid "Authors" -msgstr "" - -#: lib/common.php:1377 -msgid "Excerpt" -msgstr "" - -#: lib/common.php:1381 lib/tabs/indexing-tab.php:334 -#: vendor/lib/tabs/indexing-tab.php:279 -msgid "Custom fields" -msgstr "" - -#: lib/common.php:1385 -msgid "MySQL content" -msgstr "" - -#: lib/compatibility/aioseo.php:88 -msgid "Use All-in-One SEO noindex" -msgstr "" - -#: lib/compatibility/aioseo.php:93 -msgid "Use All-in-One SEO noindex." -msgstr "" - -#: lib/compatibility/aioseo.php:95 -msgid "" -"If checked, Relevanssi will not index posts marked as \"No index\" in All-in-" -"One SEO settings." -msgstr "" - -#: lib/compatibility/rankmath.php:80 -msgid "Use Rank Math SEO noindex" -msgstr "" - -#: lib/compatibility/rankmath.php:85 -msgid "Use Rank Math SEO noindex." -msgstr "" - -#: lib/compatibility/rankmath.php:87 -msgid "" -"If checked, Relevanssi will not index posts marked as \"No index\" in Rank " -"Math SEO settings." -msgstr "" - -#: lib/compatibility/seoframework.php:76 -msgid "Use SEO Framework noindex" -msgstr "" - -#: lib/compatibility/seoframework.php:81 -msgid "Use SEO Framework noindex." -msgstr "" - -#: lib/compatibility/seoframework.php:83 -msgid "" -"If checked, Relevanssi will not index posts marked as \"No index\" in SEO " -"Framework settings." -msgstr "" - -#: lib/compatibility/seopress.php:82 -msgid "Use SEOPress noindex" -msgstr "" - -#: lib/compatibility/seopress.php:87 -msgid "Use SEOPress noindex." -msgstr "" - -#: lib/compatibility/seopress.php:89 -msgid "" -"If checked, Relevanssi will not index posts marked as \"No index\" in " -"SEOPress settings." -msgstr "" - -#: lib/compatibility/yoast-seo.php:82 -msgid "Use Yoast SEO noindex" -msgstr "" - -#: lib/compatibility/yoast-seo.php:87 -msgid "Use Yoast SEO noindex." -msgstr "" - -#: lib/compatibility/yoast-seo.php:89 -msgid "" -"If checked, Relevanssi will not index posts marked as \"No index\" in Yoast " -"SEO settings." -msgstr "" - -#: lib/contextual-help.php:24 vendor/lib/contextual-help.php:28 -#, php-format -msgid "" -"To adjust the post order, you can use the %1$s query parameter. With %1$s, " -"you can use multiple layers of different sorting methods. See WordPress Codex for more details on using arrays for orderby." -msgstr "" - -#: lib/contextual-help.php:26 vendor/lib/contextual-help.php:35 -#, php-format -msgid "" -"To get inside-word highlights, uncheck the \"%s\" option. That has a side-" -"effect of enabling the inside-word highlights." -msgstr "" - -#: lib/contextual-help.php:26 vendor/lib/contextual-help.php:35 -#: vendor/lib/tabs/excerpts-tab.php:378 vendor/lib/tabs/excerpts-tab.php:387 -msgid "Uncheck this if you use non-ASCII characters" -msgstr "" - -#: lib/contextual-help.php:28 vendor/lib/contextual-help.php:37 -#, php-format -msgid "In order to adjust the throttle limit, you can use the %s filter hook." -msgstr "" - -#: lib/contextual-help.php:33 lib/interface.php:446 -#: lib/tabs/overview-tab.php:56 vendor/lib/contextual-help.php:25 -#: vendor/lib/interface.php:831 vendor/lib/tabs/overview-tab.php:56 -msgid "Searching" -msgstr "" - -#: lib/contextual-help.php:36 vendor/lib/contextual-help.php:29 -msgid "" -"Inside-word matching is disabled by default, because it increases garbage " -"results that don't really match the search term. If you want to enable it, " -"add the following function to your theme functions.php:" -msgstr "" - -#: lib/contextual-help.php:44 vendor/lib/contextual-help.php:39 -msgid "" -"It's not usually necessary to adjust the limit from 500, but in some cases " -"performance gains can be achieved by setting a lower limit. We don't suggest " -"going under 200, as low values will make the results worse." -msgstr "" - -#: lib/contextual-help.php:50 vendor/lib/contextual-help.php:54 -#, php-format -msgid "For all the possible options, see the Codex documentation for %s." -msgstr "" - -#: lib/contextual-help.php:55 vendor/lib/contextual-help.php:46 -msgid "Restrictions" -msgstr "" - -#: lib/contextual-help.php:57 vendor/lib/contextual-help.php:48 -msgid "" -"If you want the general search to target all posts, but have a single search " -"form target only certain posts, you can add a hidden input variable to the " -"search form. " -msgstr "" - -#: lib/contextual-help.php:58 vendor/lib/contextual-help.php:49 -msgid "" -"For example in order to restrict the search to categories 10, 14 and 17, you " -"could add this to the search form:" -msgstr "" - -#: lib/contextual-help.php:60 vendor/lib/contextual-help.php:51 -msgid "" -"To restrict the search to posts tagged with alfa AND beta, you could add " -"this to the search form:" -msgstr "" - -#: lib/contextual-help.php:67 vendor/lib/contextual-help.php:64 -#, php-format -msgid "" -"For more exclusion options, see the Codex documentation for %s. For example, " -"to exclude tag ID 10, use" -msgstr "" - -#: lib/contextual-help.php:69 vendor/lib/contextual-help.php:67 -#, php-format -msgid "" -"To exclude posts from the index and not just from the search, you can use " -"the %s filter hook. This would not index posts that have a certain taxonomy " -"term:" -msgstr "" - -#: lib/contextual-help.php:71 lib/contextual-help.php:153 -#: vendor/lib/contextual-help.php:77 vendor/lib/contextual-help.php:133 -#, php-format -msgid "" -"For more examples, see the related knowledge base posts." -msgstr "" - -#: lib/contextual-help.php:76 vendor/lib/contextual-help.php:61 -msgid "Exclusions" -msgstr "" - -#: lib/contextual-help.php:95 vendor/lib/contextual-help.php:87 -#, php-format -msgid "" -"By default, the User searches page shows 20 most common keywords. In order " -"to see more, you can adjust the value with the %s filter hook, like this:" -msgstr "" - -#: lib/contextual-help.php:97 vendor/lib/contextual-help.php:90 -#, php-format -msgid "" -"The complete logs are stored in the %s database table, where you can access " -"them if you need more information than what the User searches page provides." -msgstr "" - -#: lib/contextual-help.php:102 vendor/lib/contextual-help.php:84 -msgid "Logs" -msgstr "" - -#: lib/contextual-help.php:112 vendor/lib/contextual-help.php:101 -#, php-format -msgid "" -"Custom snippets require that the search results template uses %s to print " -"out the excerpts." -msgstr "" - -#: lib/contextual-help.php:114 vendor/lib/contextual-help.php:104 -#, php-format -msgid "" -"If you want more control over what content Relevanssi uses to create the " -"excerpts, you can use the %1$s and %2$s filter hooks to adjust the content." -msgstr "" - -#: lib/contextual-help.php:116 vendor/lib/contextual-help.php:106 -#, php-format -msgid "" -"Some shortcode do not work well with Relevanssi excerpt-generation. " -"Relevanssi disables some shortcodes automatically to prevent problems. This " -"can be adjusted with the %s filter hook." -msgstr "" - -#: lib/contextual-help.php:118 vendor/lib/contextual-help.php:108 -#, php-format -msgid "" -"If you want Relevanssi to build excerpts faster and don't mind that they may " -"be less than perfect in quality, add a filter that returns true on hook %s." -msgstr "" - -#: lib/contextual-help.php:123 lib/tabs/indexing-tab.php:393 -#: vendor/lib/contextual-help.php:97 vendor/lib/tabs/indexing-tab.php:341 -msgid "Excerpts" -msgstr "" - -#: lib/contextual-help.php:125 vendor/lib/contextual-help.php:99 -msgid "" -"Building custom excerpts can be slow. If you are not actually using the " -"excerpts, make sure you disable the option." -msgstr "" - -#: lib/contextual-help.php:127 vendor/lib/contextual-help.php:102 -msgid "" -"Generally, Relevanssi generates the excerpts from post content. If you want " -"to include custom field content in the excerpt-building, this can be done " -"with a simple setting from the excerpt settings." -msgstr "" - -#: lib/contextual-help.php:137 vendor/lib/contextual-help.php:120 -#, php-format -msgid "" -"In order to see title highlights from Relevanssi, replace %1$s in the search " -"results template with %2$s. It does the same thing, but supports Relevanssi " -"title highlights." -msgstr "" - -#: lib/contextual-help.php:142 vendor/lib/contextual-help.php:116 -msgid "Highlights" -msgstr "" - -#: lib/contextual-help.php:144 vendor/lib/contextual-help.php:118 -msgid "" -"Title highlights don't appear automatically, because that led to problems " -"with highlights appearing in wrong places and messing up navigation menus, " -"for example." -msgstr "" - -#: lib/contextual-help.php:151 vendor/lib/contextual-help.php:131 -#, php-format -msgid "" -"For more fine-tuned changes, you can use %1$s filter hook to adjust what is " -"replaced with what, and %2$s filter hook to completely override the default " -"punctuation control." -msgstr "" - -#: lib/contextual-help.php:158 vendor/lib/contextual-help.php:127 -msgid "Punctuation" -msgstr "" - -#: lib/contextual-help.php:160 vendor/lib/contextual-help.php:129 -msgid "" -"Relevanssi removes punctuation. Some punctuation is removed, some replaced " -"with spaces. Advanced indexing settings include some of the more common " -"settings people want to change." -msgstr "" - -#: lib/contextual-help.php:168 vendor/lib/contextual-help.php:143 -#, php-format -msgid "" -"If you have content that you don't want indexed, you can wrap that content " -"in a %s shortcode." -msgstr "" - -#: lib/contextual-help.php:170 vendor/lib/contextual-help.php:145 -#, php-format -msgid "" -"If you need a search form on some page on your site, you can use the %s " -"shortcode to print out a basic search form." -msgstr "" - -#: lib/contextual-help.php:172 vendor/lib/contextual-help.php:147 -#, php-format -msgid "" -"If you need to add query variables to the search form, the shortcode takes " -"parameters, which are then printed out as hidden input fields. To get a " -"search form with a post type restriction, you can use %1$s. To restrict the " -"search to categories 10, 14 and 17, you can use %2$s and so on." -msgstr "" - -#: lib/contextual-help.php:174 vendor/lib/contextual-help.php:149 -#, php-format -msgid "" -"You can use the %1$s parameter to add a taxonomy dropdown to the search " -"form. Just use the name of the taxonomy, like %2$s. This works best with " -"hierarchical taxonomies like categories with relatively few options " -"available." -msgstr "" - -#: lib/contextual-help.php:179 vendor/lib/contextual-help.php:140 -msgid "Helpful shortcodes" -msgstr "" - -#: lib/contextual-help.php:190 vendor/lib/contextual-help.php:160 -#, php-format -msgid "" -"For more details how to fix that issue, see WooCommerce tips in " -"Relevanssi user manual." -msgstr "" - -#: lib/contextual-help.php:195 vendor/lib/contextual-help.php:156 -msgid "WooCommerce" -msgstr "" - -#: lib/contextual-help.php:197 vendor/lib/contextual-help.php:158 -msgid "" -"If your SKUs include hyphens or other punctuation, do note that Relevanssi " -"replaces most punctuation with spaces. That's going to cause issues with SKU " -"searches." -msgstr "" - -#: lib/contextual-help.php:199 vendor/lib/contextual-help.php:161 -msgid "" -"If you don't want to index products that are out of stock, excluded from the " -"catalog or excluded from the search, there's a product visibility filtering " -"method that is described in the user manual (see link above)." -msgstr "" - -#: lib/contextual-help.php:205 vendor/lib/contextual-help.php:171 -#, php-format -msgid "" -"To adjust the amount of the exact match bonus, you can use the %s filter " -"hook. It works like this:" -msgstr "" - -#: lib/contextual-help.php:207 vendor/lib/contextual-help.php:177 -#, php-format -msgid "The default values are %1$s for titles and %2$s for content." -msgstr "" - -#: lib/contextual-help.php:212 vendor/lib/contextual-help.php:168 -msgid "Exact match bonus" -msgstr "" - -#: lib/contextual-help.php:223 vendor/lib/contextual-help.php:181 -msgid "For more information:" -msgstr "" - -#: lib/contextual-help.php:224 vendor/lib/contextual-help.php:182 -msgid "Plugin knowledge base" -msgstr "" - -#: lib/contextual-help.php:225 vendor/lib/contextual-help.php:183 -msgid "WordPress.org forum" -msgstr "" - -#: lib/indexing.php:463 -msgid "Relevanssi index exclude" -msgstr "" - -#: lib/indexing.php:491 -msgid "Blocked by a filter function" -msgstr "" - -#: lib/init.php:109 vendor/lib/init.php:88 -msgid "" -"You do not have an index! Remember to build the index (click the \"Build the " -"index\" button), otherwise searching won't work." -msgstr "" - -#: lib/init.php:121 vendor/lib/init.php:100 -msgid "" -"Multibyte string functions are not available. Relevanssi may not work well " -"without them. Please install (or ask your host to install) the mbstring " -"extension." -msgstr "" - -#: lib/init.php:298 lib/init.php:299 lib/interface.php:109 -#: lib/tabs/logging-tab.php:48 vendor/lib/init.php:237 vendor/lib/init.php:238 -#: vendor/lib/interface.php:469 vendor/lib/tabs/logging-tab.php:48 -msgid "User searches" -msgstr "" - -#: lib/init.php:310 lib/init.php:311 lib/tabs/searching-tab.php:248 -#: vendor/lib/init.php:249 vendor/lib/init.php:250 -#: vendor/lib/tabs/searching-tab.php:248 -msgid "Admin search" -msgstr "" - -#: lib/init.php:523 vendor/lib/init.php:441 -msgid "Settings" -msgstr "" - -#: lib/init.php:526 vendor/lib/init.php:444 -msgid "Go Premium!" -msgstr "" - -#: lib/interface.php:18 vendor/lib/interface.php:18 -msgid "Relevanssi Search Options" -msgstr "" - -#: lib/interface.php:20 vendor/lib/interface.php:20 -msgid "Relevanssi Premium Search Options" -msgstr "" - -#: lib/interface.php:111 vendor/lib/interface.php:471 -msgid "Relevanssi User Searches" -msgstr "" - -#: lib/interface.php:129 vendor/lib/interface.php:494 -msgid "Enable query logging to see stats here." -msgstr "" - -#: lib/interface.php:141 vendor/lib/interface.php:506 -msgid "Admin Search" -msgstr "" - -#: lib/interface.php:166 vendor/lib/interface.php:536 -msgid "Logs clear!" -msgstr "" - -#: lib/interface.php:168 vendor/lib/interface.php:538 -msgid "Clearing the logs failed." -msgstr "" - -#: lib/interface.php:202 vendor/lib/interface.php:572 -msgid "Total Searches" -msgstr "" - -#: lib/interface.php:204 vendor/lib/interface.php:574 -msgid "Totals" -msgstr "" - -#: lib/interface.php:208 vendor/lib/interface.php:578 -msgid "Common Queries" -msgstr "" - -#: lib/interface.php:218 vendor/lib/interface.php:588 -#, php-format -msgid "" -"Here you can see the %d most common user search queries, how many times " -"those queries were made and how many results were found for those queries." -msgstr "" - -#: lib/interface.php:222 lib/interface.php:244 lib/interface.php:293 -#: vendor/lib/interface.php:592 vendor/lib/interface.php:614 -#: vendor/lib/interface.php:664 -msgid "Today and yesterday" -msgstr "" - -#: lib/interface.php:225 lib/interface.php:231 lib/interface.php:236 -#: lib/interface.php:253 vendor/lib/interface.php:595 -#: vendor/lib/interface.php:601 vendor/lib/interface.php:606 -#: vendor/lib/interface.php:623 -#, php-format -msgid "Last %d days" -msgstr "" - -#: lib/interface.php:241 vendor/lib/interface.php:611 -msgid "Unsuccessful Queries" -msgstr "" - -#: lib/interface.php:248 lib/interface.php:294 vendor/lib/interface.php:618 -#: vendor/lib/interface.php:665 -msgid "Last 7 days" -msgstr "" - -#: lib/interface.php:259 vendor/lib/interface.php:629 -msgid "Reset Logs" -msgstr "" - -#: lib/interface.php:268 -msgid "" -"To reset the logs, type \"reset\" into the box here and click the Reset " -"button" -msgstr "" - -#: lib/interface.php:271 -msgid "Reset" -msgstr "" - -#: lib/interface.php:295 vendor/lib/interface.php:666 -msgid "Last 30 days" -msgstr "" - -#: lib/interface.php:296 vendor/lib/interface.php:667 -msgid "Forever" -msgstr "" - -#: lib/interface.php:306 vendor/lib/interface.php:677 -msgid "When" -msgstr "" - -#: lib/interface.php:307 vendor/lib/interface.php:678 -msgid "Searches" -msgstr "" - -#: lib/interface.php:369 lib/log.php:195 vendor/lib/interface.php:740 -#: vendor/lib/log.php:178 -msgid "Query" -msgstr "" - -#: lib/interface.php:370 vendor/lib/interface.php:741 -msgid "Hits" -msgstr "" - -#: lib/interface.php:425 vendor/lib/interface.php:828 -msgid "Overview" -msgstr "" - -#: lib/interface.php:432 lib/tabs/overview-tab.php:44 -#: vendor/lib/interface.php:829 vendor/lib/tabs/overview-tab.php:44 -msgid "Indexing" -msgstr "" - -#: lib/interface.php:439 vendor/lib/interface.php:830 -msgid "Attachments" -msgstr "" - -#: lib/interface.php:453 vendor/lib/interface.php:832 -msgid "Logging" -msgstr "" - -#: lib/interface.php:460 lib/tabs/overview-tab.php:60 -#: vendor/lib/interface.php:833 vendor/lib/tabs/overview-tab.php:60 -msgid "Excerpts and highlights" -msgstr "" - -#: lib/interface.php:467 lib/tabs/synonyms-tab.php:27 -#: lib/tabs/synonyms-tab.php:32 vendor/lib/interface.php:834 -#: vendor/lib/tabs/synonyms-tab.php:25 vendor/lib/tabs/synonyms-tab.php:30 -msgid "Synonyms" -msgstr "" - -#: lib/interface.php:474 lib/tabs/stopwords-tab.php:18 -#: vendor/lib/interface.php:835 vendor/lib/tabs/stopwords-tab.php:18 -msgid "Stopwords" -msgstr "" - -#: lib/interface.php:481 lib/tabs/redirects-tab.php:18 -#: vendor/lib/interface.php:836 vendor/lib/tabs/redirects-tab.php:18 -msgid "Redirects" -msgstr "" - -#: lib/interface.php:488 lib/tabs/debugging-tab.php:28 -msgid "Debugging" -msgstr "" - -#: lib/interface.php:590 vendor/lib/interface.php:958 -msgid "Click OK to copy Relevanssi options to all subsites" -msgstr "" - -#: lib/interface.php:591 vendor/lib/interface.php:959 -msgid "Are you sure you want to remove all stopwords?" -msgstr "" - -#: lib/interface.php:592 vendor/lib/interface.php:960 -msgid "Wiping out the index..." -msgstr "" - -#: lib/interface.php:593 vendor/lib/interface.php:961 -msgid "Done." -msgstr "" - -#: lib/interface.php:594 vendor/lib/interface.php:962 -msgid "Indexing users..." -msgstr "" - -#: lib/interface.php:595 vendor/lib/interface.php:963 -msgid "Indexing the following taxonomies:" -msgstr "" - -#: lib/interface.php:596 vendor/lib/interface.php:964 -msgid "Indexing attachments..." -msgstr "" - -#: lib/interface.php:597 vendor/lib/interface.php:965 -msgid "Counting posts..." -msgstr "" - -#: lib/interface.php:598 vendor/lib/interface.php:966 -msgid "Counting taxonomy terms..." -msgstr "" - -#: lib/interface.php:599 vendor/lib/interface.php:967 -msgid "Counting users..." -msgstr "" - -#: lib/interface.php:600 vendor/lib/interface.php:968 -msgid "Counting attachments..." -msgstr "" - -#: lib/interface.php:601 vendor/lib/interface.php:969 -msgid "posts found." -msgstr "" - -#: lib/interface.php:602 vendor/lib/interface.php:970 -msgid "taxonomy terms found." -msgstr "" - -#: lib/interface.php:603 vendor/lib/interface.php:971 -msgid "users found." -msgstr "" - -#: lib/interface.php:604 vendor/lib/interface.php:972 -msgid "attachments found." -msgstr "" - -#: lib/interface.php:605 vendor/lib/interface.php:973 -msgid "Taxonomy term indexing is disabled." -msgstr "" - -#: lib/interface.php:606 vendor/lib/interface.php:974 -msgid "User indexing is disabled." -msgstr "" - -#: lib/interface.php:607 vendor/lib/interface.php:975 -msgid "Indexing complete." -msgstr "" - -#: lib/interface.php:608 vendor/lib/interface.php:976 -msgid "posts excluded." -msgstr "" - -#: lib/interface.php:609 vendor/lib/interface.php:977 -msgid "Settings have changed, please save the options before indexing." -msgstr "" - -#: lib/interface.php:610 vendor/lib/interface.php:978 -msgid "Reload the page to refresh the state of the index." -msgstr "" - -#: lib/interface.php:611 vendor/lib/interface.php:979 -msgid "Are you sure you want to delete all attachment content from the index?" -msgstr "" - -#: lib/interface.php:612 vendor/lib/interface.php:980 -msgid "Relevanssi attachment data wiped clean." -msgstr "" - -#: lib/interface.php:613 -msgid "There were problems wiping the Relevanssi attachment data clean." -msgstr "" - -#: lib/interface.php:614 vendor/lib/interface.php:981 -msgid "hour" -msgstr "" - -#: lib/interface.php:615 vendor/lib/interface.php:982 -msgid "hours" -msgstr "" - -#: lib/interface.php:616 vendor/lib/interface.php:983 -msgid "about" -msgstr "" - -#: lib/interface.php:617 vendor/lib/interface.php:984 -msgid "about an hour" -msgstr "" - -#: lib/interface.php:618 vendor/lib/interface.php:985 -msgid "about an hour and a half" -msgstr "" - -#: lib/interface.php:619 vendor/lib/interface.php:986 -msgid "minute" -msgstr "" - -#: lib/interface.php:620 vendor/lib/interface.php:987 -msgid "minutes" -msgstr "" - -#: lib/interface.php:621 vendor/lib/interface.php:988 -msgid "less than a minute" -msgstr "" - -#: lib/interface.php:622 vendor/lib/interface.php:989 -msgid "we're done!" -msgstr "" - -#: lib/interface.php:689 vendor/lib/interface.php:1056 -msgid "Tag weight" -msgstr "" - -#: lib/interface.php:697 vendor/lib/interface.php:1064 -msgid "Category weight" -msgstr "" - -#: lib/log.php:188 -msgid "Logged searches" -msgstr "" - -#: lib/log.php:191 vendor/lib/log.php:174 -msgid "Time" -msgstr "" - -#: lib/log.php:199 vendor/lib/log.php:182 -msgid "Hits found" -msgstr "" - -#: lib/log.php:203 vendor/lib/log.php:186 -msgid "IP address" -msgstr "" - -#: lib/log.php:298 -msgid "No search keywords logged." -msgstr "" - -#: lib/privacy.php:34 vendor/lib/privacy.php:34 -msgid "What personal data we collect and why we collect it" -msgstr "" - -#: lib/privacy.php:36 vendor/lib/privacy.php:36 -msgid "IP address for searches" -msgstr "" - -#: lib/privacy.php:37 vendor/lib/privacy.php:37 -msgid "" -"All searches performed using the internal site search are logged in the " -"database, including the following information: the search query, the number " -"of hits found, user ID for users who are logged in, date and time and the IP " -"address. The IP address is stored for security and auditing purposes." -msgstr "" - -#: lib/privacy.php:39 vendor/lib/privacy.php:39 -msgid "" -"All searches performed using the internal site search are logged in the " -"database, including the following information: the search query, the number " -"of hits found, user ID for users who are logged in and date and time." -msgstr "" - -#: lib/privacy.php:42 vendor/lib/privacy.php:42 -msgid "How long we retain your data" -msgstr "" - -#: lib/privacy.php:45 vendor/lib/privacy.php:45 -#, php-format -msgid "" -"The search logs are stored for %d days before they are automatically removed." -msgstr "" - -#: lib/privacy.php:47 vendor/lib/privacy.php:47 -msgid "The search logs are stored indefinitely." -msgstr "" - -#: lib/privacy.php:64 lib/privacy.php:81 vendor/lib/privacy.php:64 -#: vendor/lib/privacy.php:81 -msgid "Relevanssi Search Logs" -msgstr "" - -#: lib/shortcodes.php:126 vendor/lib/shortcodes.php:131 -msgid "None" -msgstr "" - -#: lib/stopwords.php:38 -msgid "Added stopwords from the database." -msgstr "" - -#: lib/stopwords.php:53 -#, php-format -msgid "The stopword file for the language '%s' doesn't exist." -msgstr "" - -#: lib/stopwords.php:69 -msgid "Couldn't read the stopwords from the file." -msgstr "" - -#: lib/stopwords.php:79 -msgid "Added stopwords from the stopword file." -msgstr "" - -#: lib/stopwords.php:138 vendor/lib/stopwords.php:96 -#, php-format -msgid "Successfully added %1$d/%2$d terms to stopwords!" -msgstr "" - -#: lib/stopwords.php:157 vendor/lib/stopwords.php:107 -#, php-format -msgid "Term '%s' added to stopwords!" -msgstr "" - -#: lib/stopwords.php:166 vendor/lib/stopwords.php:110 -#, php-format -msgid "Couldn't add term '%s' to stopwords!" -msgstr "" - -#: lib/stopwords.php:317 vendor/lib/stopwords.php:162 -msgid "All stopwords removed! Remember to re-index." -msgstr "" - -#: lib/stopwords.php:325 vendor/lib/stopwords.php:164 -msgid "There was a problem, and stopwords couldn't be removed." -msgstr "" - -#: lib/stopwords.php:362 vendor/lib/stopwords.php:187 -#, php-format -msgid "Term '%s' removed from stopwords! Re-index to get it back to index." -msgstr "" - -#: lib/stopwords.php:375 vendor/lib/stopwords.php:193 -#, php-format -msgid "Couldn't remove term '%s' from stopwords!" -msgstr "" - -#: lib/tabs/attachments-tab.php:18 vendor/lib/tabs/attachments-tab.php:18 -msgid "Indexing attachment content" -msgstr "" - -#: lib/tabs/attachments-tab.php:20 vendor/lib/tabs/attachments-tab.php:20 -msgid "" -"With Relevanssi Premium, you can index the text contents of attachments " -"(PDFs, Word documents, Open Office documents and many other types). The " -"contents of the attachments are processed on an external service, which " -"makes the feature reliable and light on your own server performance." -msgstr "" - -#: lib/tabs/attachments-tab.php:22 lib/tabs/redirects-tab.php:22 -#: vendor/lib/tabs/attachments-tab.php:22 vendor/lib/tabs/redirects-tab.php:22 -#, php-format -msgid "" -"In order to access this and many other delightful Premium features, %1$sbuy " -"Relevanssi Premium here%2$s." -msgstr "" - -#: lib/tabs/debugging-tab.php:30 -msgid "" -"In order to figure out problems with indexing posts, you can test how " -"Relevanssi sees the post by entering the post ID number in the field below." -msgstr "" - -#: lib/tabs/debugging-tab.php:34 -#, php-format -msgid "" -"In Relevanssi Premium, you can find this feature for each post on the post " -"edit page. %1$sBuy Relevanssi Premium here%2$s." -msgstr "" - -#: lib/tabs/debugging-tab.php:37 -msgid "The post ID" -msgstr "" - -#: lib/tabs/excerpts-tab.php:84 vendor/lib/tabs/excerpts-tab.php:84 -msgid "Custom excerpts/snippets" -msgstr "" - -#: lib/tabs/excerpts-tab.php:89 vendor/lib/tabs/excerpts-tab.php:89 -msgid "Custom search result snippets" -msgstr "" - -#: lib/tabs/excerpts-tab.php:94 vendor/lib/tabs/excerpts-tab.php:93 -#: vendor/lib/tabs/excerpts-tab.php:96 -msgid "Create custom search result snippets" -msgstr "" - -#: lib/tabs/excerpts-tab.php:96 vendor/lib/tabs/excerpts-tab.php:99 -msgid "Only enable this if you actually use the custom excerpts." -msgstr "" - -#: lib/tabs/excerpts-tab.php:103 vendor/lib/tabs/excerpts-tab.php:106 -#, php-format -msgid "" -"Looks like you are using Divi. In order to use custom excerpts with Divi, " -"you need to make some changes to your templates. %1$sSee instructions here" -"%2$s." -msgstr "" - -#: lib/tabs/excerpts-tab.php:115 vendor/lib/tabs/excerpts-tab.php:118 -msgid "Length of the snippet" -msgstr "" - -#: lib/tabs/excerpts-tab.php:125 vendor/lib/tabs/excerpts-tab.php:128 -msgid "Excerpt length type" -msgstr "" - -#: lib/tabs/excerpts-tab.php:133 vendor/lib/tabs/excerpts-tab.php:136 -msgid "characters" -msgstr "" - -#: lib/tabs/excerpts-tab.php:134 vendor/lib/tabs/excerpts-tab.php:137 -msgid "words" -msgstr "" - -#: lib/tabs/excerpts-tab.php:136 vendor/lib/tabs/excerpts-tab.php:139 -msgid "" -"Using words is much faster than characters. Don't use characters, unless you " -"have a really good reason and your posts are short." -msgstr "" - -#: lib/tabs/excerpts-tab.php:152 vendor/lib/tabs/excerpts-tab.php:150 -msgid "Allowable tags in excerpts" -msgstr "" - -#: lib/tabs/excerpts-tab.php:162 vendor/lib/tabs/excerpts-tab.php:160 -msgid "" -"List all tags you want to allow in excerpts. For example: <p><a>" -"<strong>." -msgstr "" - -#: lib/tabs/excerpts-tab.php:173 vendor/lib/tabs/excerpts-tab.php:171 -msgid "Use custom fields for excerpts" -msgstr "" - -#: lib/tabs/excerpts-tab.php:184 vendor/lib/tabs/excerpts-tab.php:175 -#: vendor/lib/tabs/excerpts-tab.php:184 -msgid "Use custom field content for building excerpts" -msgstr "" - -#: lib/tabs/excerpts-tab.php:186 vendor/lib/tabs/excerpts-tab.php:187 -msgid "" -"Use the custom fields setting for indexing for excerpt-making as well. " -"Enabling this option will show custom field content in Relevanssi-generated " -"excerpts." -msgstr "" - -#: lib/tabs/excerpts-tab.php:189 vendor/lib/tabs/excerpts-tab.php:190 -msgid "Enable this option to use PDF content for excerpts." -msgstr "" - -#: lib/tabs/excerpts-tab.php:194 vendor/lib/tabs/excerpts-tab.php:195 -msgid "Current custom field setting" -msgstr "" - -#: lib/tabs/excerpts-tab.php:197 vendor/lib/tabs/excerpts-tab.php:198 -msgid "all visible custom fields" -msgstr "" - -#: lib/tabs/excerpts-tab.php:199 vendor/lib/tabs/excerpts-tab.php:200 -msgid "all custom fields" -msgstr "" - -#: lib/tabs/excerpts-tab.php:203 vendor/lib/tabs/excerpts-tab.php:204 -msgid "Just PDF content" -msgstr "" - -#: lib/tabs/excerpts-tab.php:205 vendor/lib/tabs/excerpts-tab.php:206 -msgid "None selected" -msgstr "" - -#: lib/tabs/excerpts-tab.php:213 vendor/lib/tabs/excerpts-tab.php:214 -msgid "Search hit highlighting" -msgstr "" - -#: lib/tabs/excerpts-tab.php:224 vendor/lib/tabs/excerpts-tab.php:225 -msgid "Highlight type" -msgstr "" - -#: lib/tabs/excerpts-tab.php:234 vendor/lib/tabs/excerpts-tab.php:235 -msgid "No highlighting" -msgstr "" - -#: lib/tabs/excerpts-tab.php:238 lib/tabs/excerpts-tab.php:248 -#: vendor/lib/tabs/excerpts-tab.php:239 vendor/lib/tabs/excerpts-tab.php:249 -msgid "Text color" -msgstr "" - -#: lib/tabs/excerpts-tab.php:239 lib/tabs/excerpts-tab.php:262 -#: vendor/lib/tabs/excerpts-tab.php:240 vendor/lib/tabs/excerpts-tab.php:263 -msgid "Background color" -msgstr "" - -#: lib/tabs/excerpts-tab.php:240 vendor/lib/tabs/excerpts-tab.php:241 -msgid "CSS Style" -msgstr "" - -#: lib/tabs/excerpts-tab.php:241 vendor/lib/tabs/excerpts-tab.php:242 -msgid "CSS Class" -msgstr "" - -#: lib/tabs/excerpts-tab.php:243 lib/tabs/excerpts-tab.php:406 -#: vendor/lib/tabs/excerpts-tab.php:244 vendor/lib/tabs/excerpts-tab.php:422 -msgid "Requires custom snippets to work." -msgstr "" - -#: lib/tabs/excerpts-tab.php:276 vendor/lib/tabs/excerpts-tab.php:277 -msgid "CSS style for highlights" -msgstr "" - -#: lib/tabs/excerpts-tab.php:287 vendor/lib/tabs/excerpts-tab.php:288 -#, php-format -msgid "" -"The highlights will be wrapped in a %s with this CSS in the style parameter." -msgstr "" - -#: lib/tabs/excerpts-tab.php:292 vendor/lib/tabs/excerpts-tab.php:293 -msgid "CSS class for highlights" -msgstr "" - -#: lib/tabs/excerpts-tab.php:303 vendor/lib/tabs/excerpts-tab.php:304 -#, php-format -msgid "The highlights will be wrapped in a %s with this class." -msgstr "" - -#: lib/tabs/excerpts-tab.php:308 vendor/lib/tabs/excerpts-tab.php:309 -msgid "Highlight in titles" -msgstr "" - -#: lib/tabs/excerpts-tab.php:319 vendor/lib/tabs/excerpts-tab.php:313 -#: vendor/lib/tabs/excerpts-tab.php:322 -msgid "Highlight query terms in titles" -msgstr "" - -#: lib/tabs/excerpts-tab.php:322 vendor/lib/tabs/excerpts-tab.php:326 -#, php-format -msgid "" -"Highlights in titles require changes to the search results template. You " -"need to replace %1$s in the search results template with %2$s. For more " -"information, see the contextual help." -msgstr "" - -#: lib/tabs/excerpts-tab.php:327 vendor/lib/tabs/excerpts-tab.php:331 -msgid "Highlight in documents" -msgstr "" - -#: lib/tabs/excerpts-tab.php:338 vendor/lib/tabs/excerpts-tab.php:335 -#: vendor/lib/tabs/excerpts-tab.php:344 -msgid "Highlight query terms in documents" -msgstr "" - -#: lib/tabs/excerpts-tab.php:341 vendor/lib/tabs/excerpts-tab.php:348 -#, php-format -msgid "" -"Highlights hits when user opens the post from search results. This requires " -"an extra parameter (%s) to the links from the search results pages, which " -"Relevanssi should add automatically." -msgstr "" - -#: lib/tabs/excerpts-tab.php:346 vendor/lib/tabs/excerpts-tab.php:353 -msgid "Highlight in comments" -msgstr "" - -#: lib/tabs/excerpts-tab.php:357 vendor/lib/tabs/excerpts-tab.php:357 -#: vendor/lib/tabs/excerpts-tab.php:366 -msgid "Highlight query terms in comments" -msgstr "" - -#: lib/tabs/excerpts-tab.php:359 vendor/lib/tabs/excerpts-tab.php:369 -msgid "" -"Highlights hits in comments when user opens the post from search results." -msgstr "" - -#: lib/tabs/excerpts-tab.php:364 -msgid "Expand highlights" -msgstr "" - -#: lib/tabs/excerpts-tab.php:375 -msgid "Expand highlights to cover full words" -msgstr "" - -#: lib/tabs/excerpts-tab.php:377 -msgid "" -"When a highlight matches part of the word, if this option is enabled, the " -"highlight will be expanded to highlight the whole word." -msgstr "" - -#: lib/tabs/excerpts-tab.php:382 vendor/lib/tabs/excerpts-tab.php:395 -msgid "Breakdown of search results" -msgstr "" - -#: lib/tabs/excerpts-tab.php:393 vendor/lib/tabs/excerpts-tab.php:406 -msgid "Breakdown of search hits in excerpts" -msgstr "" - -#: lib/tabs/excerpts-tab.php:404 vendor/lib/tabs/excerpts-tab.php:419 -msgid "Show the breakdown of search hits in the excerpts." -msgstr "" - -#: lib/tabs/excerpts-tab.php:411 vendor/lib/tabs/excerpts-tab.php:427 -msgid "The breakdown format" -msgstr "" - -#: lib/tabs/excerpts-tab.php:421 -msgid "" -"Use %body%, %title%, %categories%, %tags%, %taxonomies%, %comments%, " -"%customfields%, %author%, %excerpt% and %mysqlcolumns% to display the number " -"of hits (in different parts of the post), %total% for total hits, %score% to " -"display the document weight and %terms% to show how many hits each search " -"term got." -msgstr "" - -#: lib/tabs/indexing-tab.php:117 vendor/lib/tabs/indexing-tab.php:112 -#, php-format -msgid "%s empties the existing index and rebuilds it from scratch." -msgstr "" - -#: lib/tabs/indexing-tab.php:117 vendor/lib/tabs/indexing-tab.php:112 -msgid "Build the index" -msgstr "" - -#: lib/tabs/indexing-tab.php:119 vendor/lib/tabs/indexing-tab.php:114 -#, php-format -msgid "" -"%s doesn't empty the index and only indexes those posts that are not " -"indexed. You can use it if you have to interrupt building the index." -msgstr "" - -#: lib/tabs/indexing-tab.php:119 vendor/lib/tabs/indexing-tab.php:114 -msgid "Index unindexed posts" -msgstr "" - -#: lib/tabs/indexing-tab.php:122 vendor/lib/tabs/indexing-tab.php:117 -msgid "This doesn't index any taxonomy terms or users." -msgstr "" - -#: lib/tabs/indexing-tab.php:129 vendor/lib/tabs/indexing-tab.php:124 -msgid "Time elapsed" -msgstr "" - -#: lib/tabs/indexing-tab.php:129 vendor/lib/tabs/indexing-tab.php:124 -msgid "Time remaining" -msgstr "" - -#: lib/tabs/indexing-tab.php:129 vendor/lib/tabs/indexing-tab.php:124 -msgid "some time" -msgstr "" - -#: lib/tabs/indexing-tab.php:131 vendor/lib/tabs/indexing-tab.php:126 -msgid "" -"Indexing should respond quickly. If nothing happens in couple of minutes, " -"it's probably stuck. The most common reasons for indexing issues are " -"incompatible shortcodes, so try disabling the shortcode expansion setting " -"and try again. Also, if you've just updated Relevanssi, doing a hard refresh " -"in your browser will make sure your browser is not trying to use an outdated " -"version of the Relevanssi scripts." -msgstr "" - -#: lib/tabs/indexing-tab.php:135 vendor/lib/tabs/indexing-tab.php:130 -msgid "State of the index" -msgstr "" - -#: lib/tabs/indexing-tab.php:136 vendor/lib/tabs/indexing-tab.php:131 -msgid "document in the index." -msgstr "" - -#: lib/tabs/indexing-tab.php:138 vendor/lib/tabs/indexing-tab.php:133 -msgid "user in the index." -msgstr "" - -#: lib/tabs/indexing-tab.php:139 vendor/lib/tabs/indexing-tab.php:134 -msgid "taxonomy term in the index." -msgstr "" - -#: lib/tabs/indexing-tab.php:142 vendor/lib/tabs/indexing-tab.php:137 -msgid "term in the index." -msgstr "" - -#: lib/tabs/indexing-tab.php:143 vendor/lib/tabs/indexing-tab.php:138 -msgid "is the lowest post ID indexed." -msgstr "" - -#: lib/tabs/indexing-tab.php:145 -#, php-format -msgid "" -"These values may be inaccurate. If you need exact values, %1$supdate the " -"counts%2$s" -msgstr "" - -#: lib/tabs/indexing-tab.php:155 vendor/lib/tabs/indexing-tab.php:148 -msgid "" -"WARNING: You've chosen no post types to index. Nothing will be indexed. " -"Choose some post types to index." -msgstr "" - -#: lib/tabs/indexing-tab.php:160 vendor/lib/tabs/indexing-tab.php:153 -msgid "Indexing options" -msgstr "" - -#: lib/tabs/indexing-tab.php:162 vendor/lib/tabs/indexing-tab.php:155 -msgid "" -"Any changes to the settings on this page require reindexing before they take " -"effect." -msgstr "" - -#: lib/tabs/indexing-tab.php:166 vendor/lib/tabs/indexing-tab.php:159 -msgid "Post types" -msgstr "" - -#: lib/tabs/indexing-tab.php:170 -msgid "Post types to index" -msgstr "" - -#: lib/tabs/indexing-tab.php:174 vendor/lib/tabs/indexing-tab.php:165 -msgid "Type" -msgstr "" - -#: lib/tabs/indexing-tab.php:175 lib/tabs/indexing-tab.php:267 -#: vendor/lib/tabs/indexing-tab.php:166 vendor/lib/tabs/indexing-tab.php:226 -msgid "Index" -msgstr "" - -#: lib/tabs/indexing-tab.php:176 vendor/lib/tabs/indexing-tab.php:167 -msgid "Excluded from search?" -msgstr "" - -#: lib/tabs/indexing-tab.php:193 -#, php-format -msgid "Index post type %s" -msgstr "" - -#: lib/tabs/indexing-tab.php:195 lib/tabs/indexing-tab.php:289 -#: vendor/lib/tabs/indexing-tab.php:184 vendor/lib/tabs/indexing-tab.php:244 -msgid "yes" -msgstr "" - -#: lib/tabs/indexing-tab.php:197 -#, php-format -msgid "Post type %s is excluded from search" -msgstr "" - -#: lib/tabs/indexing-tab.php:199 lib/tabs/indexing-tab.php:285 -#: vendor/lib/tabs/indexing-tab.php:186 vendor/lib/tabs/indexing-tab.php:242 -msgid "no" -msgstr "" - -#: lib/tabs/indexing-tab.php:201 -#, php-format -msgid "Post type %s can be searched" -msgstr "" - -#: lib/tabs/indexing-tab.php:232 vendor/lib/tabs/indexing-tab.php:212 -msgid "" -"If you want to index a post type that's marked 'Excluded from search', you " -"can do that without worrying about it – but you need to uncheck the 'Respect " -"exclude_from_search' setting from the Searching tab." -msgstr "" - -#: lib/tabs/indexing-tab.php:244 -msgid "Index image files" -msgstr "" - -#: lib/tabs/indexing-tab.php:249 -msgid "Index image attachments" -msgstr "" - -#: lib/tabs/indexing-tab.php:251 -msgid "" -"If this option is enabled, Relevanssi will include image attachments in the " -"index. If the option is disabled, only other attachment types are included." -msgstr "" - -#: lib/tabs/indexing-tab.php:253 -#, php-format -msgid "" -"For more detailed control over the attachment type indexing, see " -"%1$sControlling attachment types in the Knowledge base%2$s." -msgstr "" - -#: lib/tabs/indexing-tab.php:259 vendor/lib/tabs/indexing-tab.php:218 -msgid "Taxonomies" -msgstr "" - -#: lib/tabs/indexing-tab.php:266 vendor/lib/tabs/indexing-tab.php:225 -msgid "Taxonomy" -msgstr "" - -#: lib/tabs/indexing-tab.php:268 vendor/lib/tabs/indexing-tab.php:227 -msgid "Public?" -msgstr "" - -#: lib/tabs/indexing-tab.php:284 -#, php-format -msgid "Index taxonomy %s" -msgstr "" - -#: lib/tabs/indexing-tab.php:287 -#, php-format -msgid "Taxonomy %s is not public" -msgstr "" - -#: lib/tabs/indexing-tab.php:291 -#, php-format -msgid "Taxonomy %s is public" -msgstr "" - -#: lib/tabs/indexing-tab.php:313 vendor/lib/tabs/indexing-tab.php:258 -msgid "" -"If you check a taxonomy here, the terms for that taxonomy are indexed with " -"the posts. If you for example choose \"post_tag\", searching for a tag will " -"find all posts that have the tag." -msgstr "" - -#: lib/tabs/indexing-tab.php:324 lib/tabs/indexing-tab.php:338 -#: vendor/lib/tabs/indexing-tab.php:269 vendor/lib/tabs/indexing-tab.php:283 -msgid "none" -msgstr "" - -#: lib/tabs/indexing-tab.php:325 vendor/lib/tabs/indexing-tab.php:270 -msgid "comments" -msgstr "" - -#: lib/tabs/indexing-tab.php:326 vendor/lib/tabs/indexing-tab.php:271 -msgid "comments and pingbacks" -msgstr "" - -#: lib/tabs/indexing-tab.php:328 vendor/lib/tabs/indexing-tab.php:273 -msgid "" -"If you choose to index comments, you can choose if you want to index just " -"comments, or everything including comments and track- and pingbacks." -msgstr "" - -#: lib/tabs/indexing-tab.php:339 vendor/lib/tabs/indexing-tab.php:284 -msgid "all" -msgstr "" - -#: lib/tabs/indexing-tab.php:340 vendor/lib/tabs/indexing-tab.php:285 -msgid "visible" -msgstr "" - -#: lib/tabs/indexing-tab.php:341 lib/tabs/indexing-tab.php:373 -#: vendor/lib/tabs/indexing-tab.php:286 vendor/lib/tabs/indexing-tab.php:318 -msgid "some" -msgstr "" - -#: lib/tabs/indexing-tab.php:345 vendor/lib/tabs/indexing-tab.php:290 -msgid "'All' indexes all custom fields for posts." -msgstr "" - -#: lib/tabs/indexing-tab.php:347 vendor/lib/tabs/indexing-tab.php:292 -msgid "" -"'Visible' only includes the custom fields that are visible in the user " -"interface (with names that don't start with an underscore)." -msgstr "" - -#: lib/tabs/indexing-tab.php:349 vendor/lib/tabs/indexing-tab.php:294 -msgid "'Some' lets you choose individual custom fields to index." -msgstr "" - -#: lib/tabs/indexing-tab.php:355 vendor/lib/tabs/indexing-tab.php:300 -msgid "" -"Advanced Custom Fields has lots of invisible custom fields with meta data. " -"Selecting \"all\" will include lots of garbage in the index and excerpts. " -"\"Visible\" is usually a better option with ACF." -msgstr "" - -#: lib/tabs/indexing-tab.php:366 vendor/lib/tabs/indexing-tab.php:311 -msgid "Custom fields to index" -msgstr "" - -#: lib/tabs/indexing-tab.php:368 vendor/lib/tabs/indexing-tab.php:313 -msgid "" -"Enter a comma-separated list of custom fields to include in the index. With " -"Relevanssi Premium, you can also use 'fieldname_%_subfieldname' notation for " -"ACF repeater fields." -msgstr "" - -#: lib/tabs/indexing-tab.php:369 vendor/lib/tabs/indexing-tab.php:314 -msgid "" -"You can use 'relevanssi_index_custom_fields' filter hook to adjust which " -"custom fields are indexed." -msgstr "" - -#: lib/tabs/indexing-tab.php:373 vendor/lib/tabs/indexing-tab.php:318 -#, php-format -msgid "" -"If you want the SKU included, choose %1$s and enter %2$s. Also see the " -"contextual help for more details." -msgstr "" - -#: lib/tabs/indexing-tab.php:380 vendor/lib/tabs/indexing-tab.php:325 -msgid "Author display names" -msgstr "" - -#: lib/tabs/indexing-tab.php:385 vendor/lib/tabs/indexing-tab.php:329 -#: vendor/lib/tabs/indexing-tab.php:332 -msgid "Index the post author display name" -msgstr "" - -#: lib/tabs/indexing-tab.php:387 vendor/lib/tabs/indexing-tab.php:334 -msgid "" -"Searching for the post author display name will return posts by that author." -msgstr "" - -#: lib/tabs/indexing-tab.php:398 vendor/lib/tabs/indexing-tab.php:345 -#: vendor/lib/tabs/indexing-tab.php:348 vendor/lib/tabs/indexing-tab.php:369 -msgid "Index the post excerpt" -msgstr "" - -#: lib/tabs/indexing-tab.php:400 vendor/lib/tabs/indexing-tab.php:350 -msgid "Relevanssi will find posts by the content in the excerpt." -msgstr "" - -#: lib/tabs/indexing-tab.php:402 vendor/lib/tabs/indexing-tab.php:352 -msgid "" -"WooCommerce stores the product short description in the excerpt, so it's a " -"good idea to index excerpts." -msgstr "" - -#: lib/tabs/indexing-tab.php:409 vendor/lib/tabs/indexing-tab.php:360 -msgid "Shortcodes" -msgstr "" - -#: lib/tabs/indexing-tab.php:414 vendor/lib/tabs/indexing-tab.php:365 -msgid "Expand shortcodes" -msgstr "" - -#: lib/tabs/indexing-tab.php:419 vendor/lib/tabs/indexing-tab.php:372 -msgid "Expand shortcodes when indexing" -msgstr "" - -#: lib/tabs/indexing-tab.php:422 vendor/lib/tabs/indexing-tab.php:375 -msgid "" -"WooCommerce has shortcodes that don't work well with Relevanssi. With " -"WooCommerce, make sure the option is disabled." -msgstr "" - -#: lib/tabs/indexing-tab.php:424 vendor/lib/tabs/indexing-tab.php:377 -msgid "" -"If checked, Relevanssi will expand shortcodes in post content before " -"indexing. Otherwise shortcodes will be stripped." -msgstr "" - -#: lib/tabs/indexing-tab.php:425 vendor/lib/tabs/indexing-tab.php:378 -msgid "" -"If you use shortcodes to include dynamic content, Relevanssi will not keep " -"the index updated, the index will reflect the status of the shortcode " -"content at the moment of indexing." -msgstr "" - -#: lib/tabs/indexing-tab.php:439 vendor/lib/tabs/indexing-tab.php:409 -msgid "Advanced indexing settings" -msgstr "" - -#: lib/tabs/indexing-tab.php:441 vendor/lib/tabs/indexing-tab.php:411 -msgid "Show advanced settings" -msgstr "" - -#: lib/tabs/indexing-tab.php:446 vendor/lib/tabs/indexing-tab.php:416 -msgid "Minimum word length" -msgstr "" - -#: lib/tabs/indexing-tab.php:450 vendor/lib/tabs/indexing-tab.php:420 -msgid "Words shorter than this many letters will not be indexed." -msgstr "" - -#: lib/tabs/indexing-tab.php:452 vendor/lib/tabs/indexing-tab.php:422 -#, php-format -msgid "" -"To enable one-letter searches, you need to add a filter function on the " -"filter hook %1$s that returns %2$s." -msgstr "" - -#: lib/tabs/indexing-tab.php:456 vendor/lib/tabs/indexing-tab.php:426 -msgid "Punctuation control" -msgstr "" - -#: lib/tabs/indexing-tab.php:457 vendor/lib/tabs/indexing-tab.php:427 -msgid "" -"Here you can adjust how the punctuation is controlled. For more information, " -"see help. Remember that any changes here require reindexing, otherwise " -"searches will fail to find posts they should." -msgstr "" - -#: lib/tabs/indexing-tab.php:461 vendor/lib/tabs/indexing-tab.php:431 -msgid "Hyphens and dashes" -msgstr "" - -#: lib/tabs/indexing-tab.php:465 lib/tabs/indexing-tab.php:492 -#: lib/tabs/indexing-tab.php:506 vendor/lib/tabs/indexing-tab.php:435 -#: vendor/lib/tabs/indexing-tab.php:462 vendor/lib/tabs/indexing-tab.php:476 -msgid "Keep" -msgstr "" - -#: lib/tabs/indexing-tab.php:466 lib/tabs/indexing-tab.php:479 -#: lib/tabs/indexing-tab.php:493 lib/tabs/indexing-tab.php:507 -#: vendor/lib/tabs/indexing-tab.php:436 vendor/lib/tabs/indexing-tab.php:449 -#: vendor/lib/tabs/indexing-tab.php:463 vendor/lib/tabs/indexing-tab.php:477 -msgid "Replace with spaces" -msgstr "" - -#: lib/tabs/indexing-tab.php:467 lib/tabs/indexing-tab.php:480 -#: lib/tabs/indexing-tab.php:494 lib/tabs/indexing-tab.php:508 -#: vendor/lib/tabs/indexing-tab.php:437 vendor/lib/tabs/indexing-tab.php:450 -#: vendor/lib/tabs/indexing-tab.php:464 vendor/lib/tabs/indexing-tab.php:478 -msgid "Remove" -msgstr "" - -#: lib/tabs/indexing-tab.php:469 vendor/lib/tabs/indexing-tab.php:439 -msgid "" -"How Relevanssi should handle hyphens and dashes (en and em dashes)? " -"Replacing with spaces is generally the best option, but in some cases " -"removing completely is the best option. Keeping them is rarely the best " -"option." -msgstr "" - -#: lib/tabs/indexing-tab.php:475 vendor/lib/tabs/indexing-tab.php:445 -msgid "Apostrophes and quotes" -msgstr "" - -#: lib/tabs/indexing-tab.php:482 vendor/lib/tabs/indexing-tab.php:452 -msgid "" -"How Relevanssi should handle apostrophes and quotes? It's not possible to " -"keep them; that would lead to problems. Default behaviour is to replace with " -"spaces, but sometimes removing makes sense." -msgstr "" - -#: lib/tabs/indexing-tab.php:488 vendor/lib/tabs/indexing-tab.php:458 -msgid "Ampersands" -msgstr "" - -#: lib/tabs/indexing-tab.php:496 vendor/lib/tabs/indexing-tab.php:466 -msgid "" -"How Relevanssi should handle ampersands? Replacing with spaces is generally " -"the best option, but if you talk a lot about D&D, for example, keeping " -"the ampersands is useful." -msgstr "" - -#: lib/tabs/indexing-tab.php:502 vendor/lib/tabs/indexing-tab.php:472 -msgid "Decimal separators" -msgstr "" - -#: lib/tabs/indexing-tab.php:510 vendor/lib/tabs/indexing-tab.php:480 -msgid "" -"How Relevanssi should handle periods between decimals? Replacing with spaces " -"is the default option, but that often leads to the numbers being removed " -"completely. If you need to search decimal numbers a lot, keep the periods." -msgstr "" - -#: lib/tabs/indexing-tab.php:520 vendor/lib/tabs/indexing-tab.php:498 -msgid "Hide advanced settings" -msgstr "" - -#: lib/tabs/logging-tab.php:33 vendor/lib/tabs/logging-tab.php:33 -msgid "Enable logs" -msgstr "" - -#: lib/tabs/logging-tab.php:37 lib/tabs/logging-tab.php:40 -#: vendor/lib/tabs/logging-tab.php:37 vendor/lib/tabs/logging-tab.php:40 -msgid "Keep a log of user queries." -msgstr "" - -#: lib/tabs/logging-tab.php:47 vendor/lib/tabs/logging-tab.php:47 -#, php-format -msgid "" -"If enabled, Relevanssi will log user queries. The logs can be examined under " -"'%1$s' on the Dashboard admin menu and are stored in the %2$s database table." -msgstr "" - -#: lib/tabs/logging-tab.php:57 vendor/lib/tabs/logging-tab.php:57 -msgid "Log user IP" -msgstr "" - -#: lib/tabs/logging-tab.php:61 lib/tabs/logging-tab.php:64 -#: vendor/lib/tabs/logging-tab.php:61 vendor/lib/tabs/logging-tab.php:64 -msgid "Log the user's IP with the queries." -msgstr "" - -#: lib/tabs/logging-tab.php:67 vendor/lib/tabs/logging-tab.php:67 -msgid "" -"If enabled, Relevanssi will log user's IP adress with the queries. Note that " -"this may be illegal where you live, and in EU will create a person registry " -"that falls under the GDPR." -msgstr "" - -#: lib/tabs/logging-tab.php:72 vendor/lib/tabs/logging-tab.php:72 -msgid "Exclude users" -msgstr "" - -#: lib/tabs/logging-tab.php:76 vendor/lib/tabs/logging-tab.php:76 -msgid "" -"Comma-separated list of numeric user IDs or user login names that will not " -"be logged." -msgstr "" - -#: lib/tabs/logging-tab.php:86 vendor/lib/tabs/logging-tab.php:86 -msgid "Trim logs" -msgstr "" - -#: lib/tabs/logging-tab.php:90 vendor/lib/tabs/logging-tab.php:90 -msgid "How many days of logs to keep in the database." -msgstr "" - -#: lib/tabs/logging-tab.php:94 vendor/lib/tabs/logging-tab.php:94 -msgid "" -"Big log database table will eventually start to slow down the search, so " -"it's a good idea to use some level of automatic log trimming." -msgstr "" - -#: lib/tabs/logging-tab.php:99 vendor/lib/tabs/logging-tab.php:99 -#, php-format -msgid " Set to %d for no trimming." -msgstr "" - -#: lib/tabs/logging-tab.php:108 vendor/lib/tabs/logging-tab.php:108 -msgid "Export logs" -msgstr "" - -#: lib/tabs/logging-tab.php:111 vendor/lib/tabs/logging-tab.php:111 -msgid "Export the log as a CSV file" -msgstr "" - -#: lib/tabs/logging-tab.php:112 vendor/lib/tabs/logging-tab.php:112 -msgid "Push the button to export the search log as a CSV file." -msgstr "" - -#: lib/tabs/overview-tab.php:22 vendor/lib/tabs/overview-tab.php:22 -msgid "Welcome to Relevanssi!" -msgstr "" - -#: lib/tabs/overview-tab.php:38 vendor/lib/tabs/overview-tab.php:38 -msgid "Getting started" -msgstr "" - -#: lib/tabs/overview-tab.php:40 vendor/lib/tabs/overview-tab.php:40 -msgid "" -"You've already installed Relevanssi. That's a great first step towards good " -"search experience!" -msgstr "" - -#: lib/tabs/overview-tab.php:44 vendor/lib/tabs/overview-tab.php:44 -#, php-format -msgid "" -"Now, you need an index. Head over to the %1$s%2$s%3$s tab to set up the " -"basic indexing options and to build the index." -msgstr "" - -#: lib/tabs/overview-tab.php:45 vendor/lib/tabs/overview-tab.php:45 -msgid "You need to check at least the following options:" -msgstr "" - -#: lib/tabs/overview-tab.php:46 vendor/lib/tabs/overview-tab.php:46 -msgid "Make sure the post types you want to include in the index are indexed." -msgstr "" - -#: lib/tabs/overview-tab.php:48 vendor/lib/tabs/overview-tab.php:48 -#, php-format -msgid "" -"Do you use custom fields to store content you want included? If so, add " -"those too. WooCommerce user? You probably want to include %s." -msgstr "" - -#: lib/tabs/overview-tab.php:49 vendor/lib/tabs/overview-tab.php:49 -msgid "" -"Then just save the options and build the index. First time you have to do it " -"manually, but after that, it's fully automatic: all changes are reflected in " -"the index without reindexing. (That said, it's a good idea to rebuild the " -"index once a year.)" -msgstr "" - -#: lib/tabs/overview-tab.php:52 vendor/lib/tabs/overview-tab.php:52 -msgid "Great, you already have an index!" -msgstr "" - -#: lib/tabs/overview-tab.php:56 vendor/lib/tabs/overview-tab.php:56 -#, php-format -msgid "" -"On the %1$s%2$s%3$s tab, choose whether you want the default operator to be " -"AND (less results, but more precise) or OR (more results, less precise)." -msgstr "" - -#: lib/tabs/overview-tab.php:60 vendor/lib/tabs/overview-tab.php:60 -#, php-format -msgid "" -"The next step is the %1$s%2$s%3$s tab, where you can enable the custom " -"excerpts that show the relevant part of post in the search results pages." -msgstr "" - -#: lib/tabs/overview-tab.php:61 vendor/lib/tabs/overview-tab.php:61 -msgid "" -"There are couple of options related to that, so if you want highlighting in " -"the results, you can adjust the styles for that to suit the look of your " -"site." -msgstr "" - -#: lib/tabs/overview-tab.php:64 vendor/lib/tabs/overview-tab.php:64 -msgid "" -"That's about it! Now you should have Relevanssi up and running. The rest of " -"the options is mostly fine-tuning." -msgstr "" - -#: lib/tabs/overview-tab.php:67 vendor/lib/tabs/overview-tab.php:67 -msgid "" -"Relevanssi doesn't have a separate search widget. Instead, Relevanssi uses " -"the default search widget. Any standard search form will do!" -msgstr "" - -#: lib/tabs/overview-tab.php:71 vendor/lib/tabs/overview-tab.php:71 -msgid "Privacy and GDPR compliance" -msgstr "" - -#: lib/tabs/overview-tab.php:74 vendor/lib/tabs/overview-tab.php:74 -#, php-format -msgid "" -"%1$sGDPR Compliance at Relevanssi knowledge base%2$s explains how using " -"Relevanssi affects the GDPR compliance and the privacy policies of your " -"site. Relevanssi also supports the %3$sprivacy policy tool%2$s and the " -"WordPress user data export and erase tools." -msgstr "" - -#: lib/tabs/overview-tab.php:78 vendor/lib/tabs/overview-tab.php:78 -msgid "For more information" -msgstr "" - -#: lib/tabs/overview-tab.php:80 vendor/lib/tabs/overview-tab.php:80 -msgid "" -"Relevanssi uses the WordPress contextual help. Click 'Help' on the top right " -"corner for more information on many Relevanssi topics." -msgstr "" - -#: lib/tabs/overview-tab.php:82 vendor/lib/tabs/overview-tab.php:82 -#, php-format -msgid "" -"%1$sRelevanssi knowledge base%2$s has lots of information about advanced " -"Relevanssi use, including plenty of code samples." -msgstr "" - -#: lib/tabs/overview-tab.php:86 vendor/lib/tabs/overview-tab.php:86 -msgid "Do you like Relevanssi?" -msgstr "" - -#: lib/tabs/overview-tab.php:88 vendor/lib/tabs/overview-tab.php:88 -msgid "" -"If you do, the best way to show your appreciation is to spread the word and " -"perhaps give us a good review on WordPress.org." -msgstr "" - -#: lib/tabs/overview-tab.php:90 vendor/lib/tabs/overview-tab.php:90 -#, php-format -msgid "" -"If you like Relevanssi, leaving a five-star review on WordPress.org will " -"help others discover Relevanssi. %1$sYou can add your review here%2$s." -msgstr "" - -#: lib/tabs/overview-tab.php:95 vendor/lib/tabs/overview-tab.php:95 -msgid "Relevanssi on Facebook" -msgstr "" - -#: lib/tabs/overview-tab.php:98 vendor/lib/tabs/overview-tab.php:98 -msgid "" -"Check out the Relevanssi page on Facebook for news and updates about " -"Relevanssi." -msgstr "" - -#: lib/tabs/overview-tab.php:104 vendor/lib/tabs/overview-tab.php:104 -msgid "Buy Relevanssi Premium" -msgstr "" - -#: lib/tabs/overview-tab.php:107 vendor/lib/tabs/overview-tab.php:107 -msgid "Buy Relevanssi Premium now" -msgstr "" - -#: lib/tabs/overview-tab.php:109 vendor/lib/tabs/overview-tab.php:109 -#, php-format -msgid "" -"use coupon code %1$s for 20%% discount (valid at least until the end of %2$s)" -msgstr "" - -#: lib/tabs/overview-tab.php:110 vendor/lib/tabs/overview-tab.php:110 -msgid "Here are some improvements Relevanssi Premium offers:" -msgstr "" - -#: lib/tabs/overview-tab.php:112 vendor/lib/tabs/overview-tab.php:112 -msgid "PDF content indexing" -msgstr "" - -#: lib/tabs/overview-tab.php:113 vendor/lib/tabs/overview-tab.php:113 -msgid "A Related posts feature" -msgstr "" - -#: lib/tabs/overview-tab.php:114 vendor/lib/tabs/overview-tab.php:114 -msgid "Index and search user profile pages" -msgstr "" - -#: lib/tabs/overview-tab.php:115 vendor/lib/tabs/overview-tab.php:115 -msgid "Index and search taxonomy term pages" -msgstr "" - -#: lib/tabs/overview-tab.php:116 vendor/lib/tabs/overview-tab.php:116 -msgid "Multisite searches across many subsites" -msgstr "" - -#: lib/tabs/overview-tab.php:117 vendor/lib/tabs/overview-tab.php:117 -msgid "WP CLI commands" -msgstr "" - -#: lib/tabs/overview-tab.php:118 vendor/lib/tabs/overview-tab.php:118 -msgid "Adjust weights separately for each post type and taxonomy" -msgstr "" - -#: lib/tabs/overview-tab.php:119 vendor/lib/tabs/overview-tab.php:119 -msgid "Internal link anchors can be search terms for the target posts" -msgstr "" - -#: lib/tabs/overview-tab.php:120 vendor/lib/tabs/overview-tab.php:120 -msgid "Index and search any columns in the wp_posts database" -msgstr "" - -#: lib/tabs/overview-tab.php:121 vendor/lib/tabs/overview-tab.php:121 -msgid "" -"Hide Relevanssi branding from the User Searches page on a client installation" -msgstr "" - -#: lib/tabs/overview-tab.php:122 vendor/lib/tabs/overview-tab.php:122 -msgid "Redirect search queries to custom URLs" -msgstr "" - -#: lib/tabs/redirects-tab.php:20 vendor/lib/tabs/redirects-tab.php:20 -msgid "" -"With Relevanssi Premium, you can set up redirects. These are keywords that " -"automatically redirect the user to certain page, without going through the " -"usual search process. For example, you could set it up so that all searches " -"for \"job\" automatically lead to your \"Careers\" page." -msgstr "" - -#: lib/tabs/search-page.php:18 vendor/lib/tabs/search-page.php:18 -msgid "" -"You can use this search to perform Relevanssi searches without any " -"restrictions from WordPress. You can search all post types here." -msgstr "" - -#: lib/tabs/search-page.php:24 vendor/lib/tabs/search-page.php:24 -msgid "Search terms" -msgstr "" - -#: lib/tabs/search-page.php:32 vendor/lib/tabs/search-page.php:32 -msgid "Post type" -msgstr "" - -#: lib/tabs/search-page.php:36 vendor/lib/tabs/search-page.php:36 -msgid "Any" -msgstr "" - -#: lib/tabs/search-page.php:59 vendor/lib/tabs/search-page.php:59 -msgid "Posts per page" -msgstr "" - -#: lib/tabs/search-page.php:63 vendor/lib/tabs/search-page.php:63 -msgid "All" -msgstr "" - -#: lib/tabs/search-page.php:72 vendor/lib/tabs/search-page.php:72 -msgid "Search parameters" -msgstr "" - -#: lib/tabs/search-page.php:77 vendor/lib/tabs/search-page.php:77 -#, php-format -msgid "" -"Use query parameter formatting here, the same that would appear on search " -"page results URL. For example %s." -msgstr "" - -#: lib/tabs/searching-tab.php:66 vendor/lib/tabs/searching-tab.php:66 -msgid "Default operator" -msgstr "" - -#: lib/tabs/searching-tab.php:70 vendor/lib/tabs/searching-tab.php:70 -msgid "AND - require all terms" -msgstr "" - -#: lib/tabs/searching-tab.php:71 vendor/lib/tabs/searching-tab.php:71 -msgid "OR - any term present is enough" -msgstr "" - -#: lib/tabs/searching-tab.php:73 vendor/lib/tabs/searching-tab.php:73 -msgid "This setting determines the default operator for the search." -msgstr "" - -#: lib/tabs/searching-tab.php:77 vendor/lib/tabs/searching-tab.php:77 -#, php-format -msgid "" -"You can override this setting with the %1$s query parameter, like this: %2$s" -msgstr "" - -#: lib/tabs/searching-tab.php:84 vendor/lib/tabs/searching-tab.php:84 -msgid "Fallback to OR" -msgstr "" - -#: lib/tabs/searching-tab.php:88 lib/tabs/searching-tab.php:91 -#: vendor/lib/tabs/searching-tab.php:88 vendor/lib/tabs/searching-tab.php:91 -msgid "Disable the OR fallback." -msgstr "" - -#: lib/tabs/searching-tab.php:94 vendor/lib/tabs/searching-tab.php:94 -msgid "" -"By default, if AND search fails to find any results, Relevanssi will switch " -"the operator to OR and run the search again. You can prevent that by " -"checking this option." -msgstr "" - -#: lib/tabs/searching-tab.php:99 vendor/lib/tabs/searching-tab.php:99 -msgid "Default order" -msgstr "" - -#: lib/tabs/searching-tab.php:103 vendor/lib/tabs/searching-tab.php:103 -msgid "Relevance (highly recommended)" -msgstr "" - -#: lib/tabs/searching-tab.php:104 vendor/lib/tabs/searching-tab.php:104 -msgid "Post date" -msgstr "" - -#: lib/tabs/searching-tab.php:107 vendor/lib/tabs/searching-tab.php:107 -#, php-format -msgid "" -"If you want to override this or use multi-layered ordering (eg. first order " -"by relevance, but sort ties by post title), you can use the %s query " -"variable. See Help for more information." -msgstr "" - -#: lib/tabs/searching-tab.php:109 vendor/lib/tabs/searching-tab.php:109 -msgid "" -" If you want date-based results, see the recent post bonus in the Weights " -"section." -msgstr "" - -#: lib/tabs/searching-tab.php:115 vendor/lib/tabs/searching-tab.php:115 -msgid "Keyword matching" -msgstr "" - -#: lib/tabs/searching-tab.php:119 vendor/lib/tabs/searching-tab.php:119 -msgid "Whole words" -msgstr "" - -#: lib/tabs/searching-tab.php:120 lib/tabs/searching-tab.php:125 -#: vendor/lib/tabs/searching-tab.php:120 vendor/lib/tabs/searching-tab.php:125 -msgid "Partial words" -msgstr "" - -#: lib/tabs/searching-tab.php:121 vendor/lib/tabs/searching-tab.php:121 -msgid "Partial words if no hits for whole words" -msgstr "" - -#: lib/tabs/searching-tab.php:125 vendor/lib/tabs/searching-tab.php:125 -#, php-format -msgid "" -"Choosing the \"%1$s\" option may lead to unexpected results. Most of the " -"time the \"%2$s\" option is the better choice." -msgstr "" - -#: lib/tabs/searching-tab.php:125 vendor/lib/tabs/searching-tab.php:125 -msgid "Partial words if not hits for whole words" -msgstr "" - -#: lib/tabs/searching-tab.php:127 vendor/lib/tabs/searching-tab.php:127 -msgid "" -"Whole words means Relevanssi only finds posts that include the whole search " -"term." -msgstr "" - -#: lib/tabs/searching-tab.php:128 vendor/lib/tabs/searching-tab.php:128 -msgid "" -"Partial words also includes cases where the word in the index begins or ends " -"with the search term (searching for 'ana' will match 'anaconda' or 'banana', " -"but not 'banal'). See Help, if you want to make Relevanssi match also inside " -"words." -msgstr "" - -#: lib/tabs/searching-tab.php:133 vendor/lib/tabs/searching-tab.php:133 -msgid "Weights" -msgstr "" - -#: lib/tabs/searching-tab.php:136 vendor/lib/tabs/searching-tab.php:136 -msgid "" -"All the weights in the table are multipliers. To increase the weight of an " -"element, use a higher number. To make an element less significant, use a " -"number lower than 1." -msgstr "" - -#: lib/tabs/searching-tab.php:140 vendor/lib/tabs/searching-tab.php:140 -msgid "Element" -msgstr "" - -#: lib/tabs/searching-tab.php:141 vendor/lib/tabs/searching-tab.php:141 -msgid "Weight" -msgstr "" - -#: lib/tabs/searching-tab.php:146 vendor/lib/tabs/searching-tab.php:146 -msgid "Content" -msgstr "" - -#: lib/tabs/searching-tab.php:154 vendor/lib/tabs/searching-tab.php:154 -msgid "Titles" -msgstr "" - -#: lib/tabs/searching-tab.php:167 vendor/lib/tabs/searching-tab.php:167 -msgid "Comment text" -msgstr "" - -#: lib/tabs/searching-tab.php:196 vendor/lib/tabs/searching-tab.php:196 -msgid "Boost exact matches" -msgstr "" - -#: lib/tabs/searching-tab.php:200 lib/tabs/searching-tab.php:203 -#: vendor/lib/tabs/searching-tab.php:200 vendor/lib/tabs/searching-tab.php:203 -msgid "Give boost to exact matches." -msgstr "" - -#: lib/tabs/searching-tab.php:207 vendor/lib/tabs/searching-tab.php:207 -#, php-format -msgid "" -"If you enable this option, matches where the search query appears in title " -"or content as a phrase will get a weight boost. To adjust the boost, you can " -"use the %s filter hook. See Help for more details." -msgstr "" - -#: lib/tabs/searching-tab.php:215 vendor/lib/tabs/searching-tab.php:215 -msgid "WPML" -msgstr "" - -#: lib/tabs/searching-tab.php:219 lib/tabs/searching-tab.php:222 -#: vendor/lib/tabs/searching-tab.php:219 vendor/lib/tabs/searching-tab.php:222 -msgid "Limit results to current language." -msgstr "" - -#: lib/tabs/searching-tab.php:225 vendor/lib/tabs/searching-tab.php:225 -msgid "" -"Enabling this option will restrict the results to the currently active " -"language. If the option is disabled, results will include posts in all " -"languages." -msgstr "" - -#: lib/tabs/searching-tab.php:232 vendor/lib/tabs/searching-tab.php:232 -msgid "Polylang" -msgstr "" - -#: lib/tabs/searching-tab.php:236 lib/tabs/searching-tab.php:239 -#: vendor/lib/tabs/searching-tab.php:236 vendor/lib/tabs/searching-tab.php:239 -msgid "Allow results from all languages." -msgstr "" - -#: lib/tabs/searching-tab.php:242 vendor/lib/tabs/searching-tab.php:242 -msgid "" -"By default Polylang restricts the search to the current language. Enabling " -"this option will lift this restriction." -msgstr "" - -#: lib/tabs/searching-tab.php:252 lib/tabs/searching-tab.php:255 -#: vendor/lib/tabs/searching-tab.php:252 vendor/lib/tabs/searching-tab.php:255 -msgid "Use Relevanssi for admin searches." -msgstr "" - -#: lib/tabs/searching-tab.php:258 vendor/lib/tabs/searching-tab.php:258 -msgid "" -"If checked, Relevanssi will be used for searches in the admin interface. The " -"page search doesn't use Relevanssi, because WordPress works like that." -msgstr "" - -#: lib/tabs/searching-tab.php:264 vendor/lib/tabs/searching-tab.php:264 -#, php-format -msgid "Respect %s" -msgstr "" - -#: lib/tabs/searching-tab.php:268 vendor/lib/tabs/searching-tab.php:268 -msgid "Respect exclude_from_search for custom post types" -msgstr "" - -#: lib/tabs/searching-tab.php:272 vendor/lib/tabs/searching-tab.php:272 -#, php-format -msgid "Respect %s for custom post types" -msgstr "" - -#: lib/tabs/searching-tab.php:274 vendor/lib/tabs/searching-tab.php:274 -msgid "" -"If checked, Relevanssi won't display posts of custom post types that have " -"'exclude_from_search' set to true." -msgstr "" - -#: lib/tabs/searching-tab.php:286 vendor/lib/tabs/searching-tab.php:286 -msgid "" -"You probably should uncheck this option, because you've set Relevanssi to " -"index the following non-public post types:" -msgstr "" - -#: lib/tabs/searching-tab.php:299 vendor/lib/tabs/searching-tab.php:299 -msgid "Throttle searches" -msgstr "" - -#: lib/tabs/searching-tab.php:309 vendor/lib/tabs/searching-tab.php:309 -msgid "Throttling the search does not work when sorting the posts by date." -msgstr "" - -#: lib/tabs/searching-tab.php:319 lib/tabs/searching-tab.php:322 -#: vendor/lib/tabs/searching-tab.php:319 vendor/lib/tabs/searching-tab.php:322 -msgid "Throttle searches." -msgstr "" - -#: lib/tabs/searching-tab.php:326 vendor/lib/tabs/searching-tab.php:326 -msgid "Your database is so small that you don't need to enable this." -msgstr "" - -#: lib/tabs/searching-tab.php:328 vendor/lib/tabs/searching-tab.php:328 -msgid "" -"If this option is checked, Relevanssi will limit search results to at most " -"500 results per term. This will improve performance, but may cause some " -"relevant documents to go unfound. See Help for more details." -msgstr "" - -#: lib/tabs/searching-tab.php:334 lib/tabs/searching-tab.php:340 -#: vendor/lib/tabs/searching-tab.php:334 vendor/lib/tabs/searching-tab.php:340 -msgid "Category restriction" -msgstr "" - -#: lib/tabs/searching-tab.php:360 vendor/lib/tabs/searching-tab.php:360 -msgid "" -"You can restrict search results to a category for all searches. For " -"restricting on a per-search basis and more options (eg. tag restrictions), " -"see Help." -msgstr "" - -#: lib/tabs/searching-tab.php:365 lib/tabs/searching-tab.php:371 -#: vendor/lib/tabs/searching-tab.php:365 vendor/lib/tabs/searching-tab.php:371 -msgid "Category exclusion" -msgstr "" - -#: lib/tabs/searching-tab.php:391 vendor/lib/tabs/searching-tab.php:391 -msgid "" -"Posts in these categories are not included in search results. To exclude the " -"posts completely from the index, see Help." -msgstr "" - -#: lib/tabs/searching-tab.php:396 vendor/lib/tabs/searching-tab.php:396 -msgid "Post exclusion" -msgstr "" - -#: lib/tabs/searching-tab.php:400 vendor/lib/tabs/searching-tab.php:400 -msgid "" -"Enter a comma-separated list of post or page ID's to exclude those pages " -"from the search results." -msgstr "" - -#: lib/tabs/searching-tab.php:402 vendor/lib/tabs/searching-tab.php:402 -msgid "" -"With Relevanssi Premium, it's better to use the check box on post edit " -"pages. That will remove the posts completely from the index, and will work " -"with multisite searches unlike this setting." -msgstr "" - -#: lib/tabs/stopwords-tab.php:25 vendor/lib/tabs/stopwords-tab.php:25 -msgid "Content stopwords" -msgstr "" - -#: lib/tabs/stopwords-tab.php:34 vendor/lib/tabs/stopwords-tab.php:31 -msgid "" -"Content stopwords are a premium feature where you can set stopwords that " -"only apply to the post content. Those stopwords will still be indexed if " -"they appear in post titles, tags, categories, custom fields or other parts " -"of the post. To use content stopwords, you need Relevanssi Premium." -msgstr "" - -#: lib/tabs/stopwords-tab.php:64 vendor/lib/tabs/stopwords-tab.php:59 -msgid "" -"Enter a word here to add it to the list of stopwords. The word will " -"automatically be removed from the index, so re-indexing is not necessary. " -"You can enter many words at the same time, separate words with commas." -msgstr "" - -#: lib/tabs/stopwords-tab.php:72 vendor/lib/tabs/stopwords-tab.php:64 -msgid "Stopword(s) to add" -msgstr "" - -#: lib/tabs/stopwords-tab.php:80 vendor/lib/tabs/stopwords-tab.php:72 -msgid "" -"Here's a list of stopwords in the database. Click a word to remove it from " -"stopwords. Removing stopwords won't automatically return them to index, so " -"you need to re-index all posts after removing stopwords to get those words " -"back to index." -msgstr "" - -#: lib/tabs/stopwords-tab.php:85 vendor/lib/tabs/stopwords-tab.php:77 -msgid "Current stopwords" -msgstr "" - -#: lib/tabs/stopwords-tab.php:122 lib/tabs/stopwords-tab.php:125 -#: vendor/lib/tabs/stopwords-tab.php:98 vendor/lib/tabs/stopwords-tab.php:101 -msgid "Exportable list of stopwords" -msgstr "" - -#: lib/tabs/stopwords-tab.php:127 vendor/lib/tabs/stopwords-tab.php:103 -msgid "" -"You can copy the list of stopwords here if you want to back up the list, " -"copy it to a different blog or otherwise need the list." -msgstr "" - -#: lib/tabs/synonyms-tab.php:35 vendor/lib/tabs/synonyms-tab.php:33 -msgid "" -"Add synonyms here to make the searches find better results. If you notice " -"your users frequently misspelling a product name, or for other reasons use " -"many names for one thing, adding synonyms will make the results better." -msgstr "" - -#: lib/tabs/synonyms-tab.php:37 vendor/lib/tabs/synonyms-tab.php:35 -msgid "" -"Do not go overboard, though, as too many synonyms can make the search " -"confusing: users understand if a search query doesn't match everything, but " -"they get confused if the searches match to unexpected things." -msgstr "" - -#: lib/tabs/synonyms-tab.php:41 vendor/lib/tabs/synonyms-tab.php:39 -msgid "" -"The format here is key = value. If you add dog = hound to the list of synonyms, searches for dog automatically " -"become a search for dog hound and will thus match to posts that " -"include either dog or hound. This only works in OR " -"searches: in AND searches the synonyms only restrict the search, as now the " -"search only finds posts that contain both dog " -"and hound." -msgstr "" - -#: lib/tabs/synonyms-tab.php:43 vendor/lib/tabs/synonyms-tab.php:41 -msgid "" -"The synonyms are one direction only. If you want both directions, add the " -"synonym again, reversed: hound = dog." -msgstr "" - -#: lib/tabs/synonyms-tab.php:45 vendor/lib/tabs/synonyms-tab.php:43 -msgid "" -"It's possible to use phrases for the value, but not for the key. dog = " -"\"great dane\" works, but \"great dane\" = dog doesn't." -msgstr "" - -#: lib/tabs/synonyms-tab.php:48 vendor/lib/tabs/synonyms-tab.php:46 -msgid "" -"If you want to use synonyms in AND searches, enable synonym indexing on the " -"Indexing tab." -msgstr "" - -#: lib/utils.php:926 vendor/lib/excerpts-highlights.php:24 -msgid "There is no excerpt because this is a protected post." -msgstr "" - -#: vendor/lib/interface.php:637 -#, php-format -msgid "To reset the logs, type \"reset\" into the box here %1$s and click %2$s" -msgstr "" - -#: vendor/lib/interface.php:838 -msgid "Related" -msgstr "" - -#: vendor/lib/interface.php:839 -msgid "Import / Export options" -msgstr "" - -#: vendor/lib/log.php:171 -msgid "Logged seaches" -msgstr "" - -#: vendor/lib/tabs/excerpts-tab.php:374 -msgid "Highlighting problems with non-ASCII alphabet?" -msgstr "" - -#: vendor/lib/tabs/excerpts-tab.php:390 -msgid "" -"If you use non-ASCII characters (like Cyrillic alphabet) and the highlights " -"don't work, unchecking this option may make the highlights work." -msgstr "" - -#: vendor/lib/tabs/excerpts-tab.php:410 -msgid "Show the breakdown of search hits in the excerpts" -msgstr "" - -#: vendor/lib/tabs/excerpts-tab.php:437 -msgid "" -"Use %body%, %title%, %tags% and %comments% to display the number of hits (in " -"different parts of the post), %total% for total hits, %score% to display the " -"document weight and %terms% to show how many hits each search term got." -msgstr "" - -#: vendor/lib/tabs/indexing-tab.php:211 -#, php-format -msgid "" -"%1$s includes all attachment types. If you want to index only some " -"attachments, see %2$sControlling attachment types in the Knowledge base%3$s." -msgstr "" diff --git a/wp/wp-content/plugins/relevanssi/stopwords/stopword.zh_TW b/wp/wp-content/plugins/relevanssi/stopwords/stopword.zh_TW deleted file mode 100644 index 5e13ccad..00000000 --- a/wp/wp-content/plugins/relevanssi/stopwords/stopword.zh_TW +++ /dev/null @@ -1,769 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.cs_CZ b/wp/wp-content/plugins/relevanssi/stopwords/stopwords.cs_CZ deleted file mode 100644 index 9e8b426a..00000000 --- a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.cs_CZ +++ /dev/null @@ -1,327 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.de_DE b/wp/wp-content/plugins/relevanssi/stopwords/stopwords.de_DE deleted file mode 100644 index be4105ea..00000000 --- a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.de_DE +++ /dev/null @@ -1,1037 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.en_GB b/wp/wp-content/plugins/relevanssi/stopwords/stopwords.en_GB deleted file mode 100644 index 86215bda..00000000 --- a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.en_GB +++ /dev/null @@ -1,323 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.en_US b/wp/wp-content/plugins/relevanssi/stopwords/stopwords.en_US deleted file mode 100644 index 86215bda..00000000 --- a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.en_US +++ /dev/null @@ -1,323 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.es_ES b/wp/wp-content/plugins/relevanssi/stopwords/stopwords.es_ES deleted file mode 100644 index 4dbeea01..00000000 --- a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.es_ES +++ /dev/null @@ -1,386 +0,0 @@ - diff --git a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.fi b/wp/wp-content/plugins/relevanssi/stopwords/stopwords.fi deleted file mode 100644 index c9e56028..00000000 --- a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.fi +++ /dev/null @@ -1,365 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.fr_FR b/wp/wp-content/plugins/relevanssi/stopwords/stopwords.fr_FR deleted file mode 100644 index 87290ad5..00000000 --- a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.fr_FR +++ /dev/null @@ -1,72 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.it_IT b/wp/wp-content/plugins/relevanssi/stopwords/stopwords.it_IT deleted file mode 100644 index 10aa1b0f..00000000 --- a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.it_IT +++ /dev/null @@ -1,666 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.pt_BR b/wp/wp-content/plugins/relevanssi/stopwords/stopwords.pt_BR deleted file mode 100644 index b0798a02..00000000 --- a/wp/wp-content/plugins/relevanssi/stopwords/stopwords.pt_BR +++ /dev/null @@ -1,173 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/relevanssi/uninstall.php b/wp/wp-content/plugins/relevanssi/uninstall.php deleted file mode 100644 index edcb0ae0..00000000 --- a/wp/wp-content/plugins/relevanssi/uninstall.php +++ /dev/null @@ -1,31 +0,0 @@ -get_col( "SELECT blog_id FROM $wpdb->blogs" ); - $old_blogid = $wpdb->blogid; - foreach ( $blogids as $uninstall_blog_id ) { - switch_to_blog( $uninstall_blog_id ); - relevanssi_uninstall_free(); - restore_current_blog(); - } -} else { - relevanssi_uninstall_free(); -} diff --git a/wp/wp-content/plugins/user-role-editor/changelog.txt b/wp/wp-content/plugins/user-role-editor/changelog.txt deleted file mode 100644 index 64ec5567..00000000 --- a/wp/wp-content/plugins/user-role-editor/changelog.txt +++ /dev/null @@ -1,1026 +0,0 @@ -CHANGES LOG (full version). -=========================== - -= [4.64.2] 19.02.2024 = -* Update: Marked as compatible with WordPress 6.4.3 -* Update: URE_Advertisement: rand() is replaced with wp_rand(). -* Update: URE_Ajax_Proccessor: json_encode() is replaced with wp_json_encode(). -* Update: User_Role_Editor::load_translation(): load_plugin_textdomain() is called with the 2nd parameter value false, instead of deprecated ''. -* Update: URE_Lib::is_right_admin_path(): parse_url() is replaced with wp_parse_url(). -* Update: URE_Lib::user_is_admin() does not call WP_User::has_cap() to enhance performance. -* Update: Plugin version was added to CSS loaded to the "Users", "Users->User Role Editor", "Settings->User Role Editor" pages. -* Update: All JavaScript files are loaded in footer now. -* Fix: "Users->Add New Users". Unneeded extra '
' HTML tags was removed (thanks to Alejandro A. for this bug report). - -= [4.64.1] 24.10.2023 = -* Update: Marked as compatible with WordPress 6.4 -* Fix: Notice shown by PHP 8.3 is removed: PHP Deprecated: Creation of dynamic property URE_Editor::$hide_pro_banner is deprecated in /wp-content/plugins/user-role-editor/includes/classes/editor.php on line 166 -* Fix: Notice shown by PHP 8.3 is removed: PHP Deprecated: Creation of dynamic property URE_Role_View::$caps_to_remove is deprecated in /wp-content/plugins/user-role-editor/includes/classes/role-view.php on line 23 -* Fix: Notice shown by PHP 8.3 is removed: PHP Deprecated: Function utf8_decode() is deprecated in /wp-content/plugins/user-role-editor-pro/includes/classes/editor.php on line 984 - -= [4.64] 08.08.2023 = -* Update: "Show capabilities in human readable form" checkbox switches between capability 2 text forms without full page reloading using JavaScript. -* Fix: Missed 'message' parameter was added to a response for AJAX request. It fixed the PHP Warning: Undefined array key "message" in expressions like "strpos( $data['message'], ... - -= [4.63.3] 12.03.2023 = -* Fix: PHP version 8.2 showed warning: Creation of dynamic property User_Role_Editor::$settings_page_hook is deprecated : wp-content/plugins/user-role-editor/includes/classes/user-role-editor.php:603 -* Fix: PHP Fatal error: Uncaught TypeError: in_array(): Argument #2 ($haystack) must be of type array, int given in wp-content/plugins/user-role-editor/includes/classes/view.php:81 -* Fix: PHP Parse error: syntax error, unexpected â€:’, expecting â€;’ or â€{â€: wp-content/plugins/user-role-editor/includes/classes/base-lib.php on line 119, type declarations were removed for compatibility with older PHP versions. - -= [4.63.2] 16.12.2022 = -* Update: symbols '{}$' are removed from capability name before use it for internal purpose, to exclude cases like when one of plugins broke URE work adding capability like 'edit_{$type}s'. -* Update: array_merge() function is replaced with wrapper ure_array_merge(), to exclude fatal error: Argument #2 must be of type array. - -= [4.63.1] 20.09.2022 = -* Marked as compatible with WordPress version 6.0.2 -* Fix: PHP Warning: Attempt to read property “ID” on null in /wp-content/plugins/user-role-editor/includes/classes/user-role-editor.php on line 369 -* Fix: Deprecated: Automatic conversion of false to array is deprecated in ./includes/classes/base-lib.php on line 212 - -= [4.63] 11.07.2022 = -* Update: Marked as compatible with WordPress 6.1 -* Update: Few notices (e.g. "Constant FILTER_SANITIZE_STRING is deprecated") was fixed for better compatibility with PHP 8.1. -* Update: URE does not try to deactivate itself in case another instance is active, just shows notice and stops execution. - -= [4.62] 05.05.2022 = -* Update: Marked as compatible with WordPress 6.0 -* New: It's possible to translate custom role names using [PolyLang](https://wordpress.org/plugins/polylang/) plugin. -* Update: URE does not sort roles in WordPress dropdown lists. In order to sort roles by name return 'name' from 'ure_sort_wp_roles_list' filter. -* Update: User capabilities view page minor CSS enhancements. -* Update: Settings->About: "Donate" link was removed. - -= [4.61.2] 01.03.2022 = -* Fix: "Users->Add New" page - other selected roles were not saved. -* Update: URE uses WordPress notification styles for own operation result output. - -= [4.61.1] 25.01.2022 = -* Update: Marked as compatible with WordPress 5.9. -* Update: PHP 7.3 is marked as required. -* Update: If installed PHP/WordPress version is lower than required one, script termination ( wp_die() ) was replaced with notice-warning admin notice output. - -= [4.61] 28.12.2021 = -* Update: WordPress 4.4 is marked as required. -* Update: PHP 7.4 is marked as required. -* Update: "Settings->User Role Editor->Tools->Reset" button is additionally protected from the unintended/accidental usage by text input field. Manual input of "Permanently delete all custom user roles and capabilities" text is required to enable the "Reset" button. -* Update: Partial code review and refactoring according with WordPress & PHP coding standards. -* Fix: "Users->selected user->Capabilities" page: 'select all' checkbox did not work. - -= [4.60.2] 20.09.2021 = -* Update: Marked as compatible with WordPress 5.8.1 -* Fix: Multisite: URE_Editor::is_full_network_sync() returned FALSE, instead TRUE for the AJAX call, while call was made from the Network Admin (wp-admin/network/). - -= [4.60.1] 21.07.2021 = -* Update: Marked as compatible with WordPress 5.8. -* Fix: PHP Notice: Undefined property: URE_User_View::$multisite in /wp-content/plugins/user-role-editor/includes/classes/user-view.php on line 145 - -= [4.60] 24.06.2021 = -* New: Notification box was replaced with one based on the [jpillora/nofifyjs](https://notifyjs.jpillora.com/) jQuery plugin. It does not move down page content. It disappears automatically after 5 seconds. Click on it to remove it manually. -* Fix: "Add capability" shows warning styled notification when needed (invalid characters, etc.) instead of a successful one. -* Fix: Capabilities group uncheck and revert selection is blocked for the administrator role to exclude accident deletion of permissions from it. - -= [4.59.1] 11.05.2021 = -* New: Multisite: When update role at the main site with "Apply to all sites" option and PHP constant URE_MULTISITE_DIRECT_UPDATE === 1 (update roles directly in database, not via WordPress API), -* URE overwrites all subsite roles with roles from the main site. It's possible now to leave selected role(s) for selected subsite(s) unchanged: add filter 'ure_network_update_leave_roles' and -* return from it the array like this one - array( (int) blog_id => array('role_id1', 'role_id2', ... ); -* Update: "Other roles" section at user profile is available now only for users with 'promote_users' capability. -* Update: Notice at the top of URE page about action result is not removed automatically after 7 seconds as earlier. -* Update: 'ure_sort_wp_roles_list' filter accepts these values for the single input parameter: false - leave roles list as it is; true, 'id' - sort roles list by role ID; 'name' - sort roles by role name. - -= [4.59] 02.04.2021 = -* Update: PHP constant URE_WP_ADMIN_URL was replaced with direct 'admin_url()' call to respect the 'admin_url' filter applied by the get_admin_url() WordPress API function. -* Update: Editing roles and capabilities granted to selected user ("Capabilities" link under user row at the "Users" list) executes 'add_user_role' or 'remove_user_role' actions only in case it really grants or revokes roles and/or capabilities. - Previous versions fully revoked and granted again all roles during user permissions update even in case roles list was not changed. It was leaded to the false execution of the mentioned add/remove role actions. - -= [4.58.3] 26.02.2021 = -* Update: URE automatically adds custom taxonomies user capabilities to administrator role before opening "Users->User Role Editor" page. -* Fix: Role changes were not saved with option "Confirm role update" switched off. - -= [4.58.2] 15.01.2021 = -* Fix: Additional options turned ON for a role was not saved during role update. -* Update: All JavaScript files are loaded with URE plugin version number as a query string for cache busting purpose. - -= [4.58.1] 11.01.2021 = -* Fix: User lost assigned role(s) after click "Update" at the user permissions page, opened via "Selected user->Capabilities" or "User Profile->Capabilities->Edit" link. - -= [4.58] 11.01.2021 = -* Update: Users->User Role Editor: Update button saves changes via AJAX without full page reload. -* Fix: New user registered via frontend (wp-login.php?action=register) automatically receives additional (other) default role(s) according to selection made at User Role Editor settings "Other default roles" tab. -* Fix: "JQMIGRATE: jquery.fn.resize() event shorthand is deprecated" notice was fixed. -* Fix: "JQMIGRATE: jQuery.fn.click() event shorthand is deprecated" notice was fixed. -* Fix: "JQMIGRATE: Number-typed values are deprecated for jQuery.fn.css( (property name), value )" notice was fixed. - -= [4.57.1] 10.12.2020 = -* Fix: Nextgen Gallery's user capabilities were not shown as granted after current role change via roles selection dropdown list. -* Fix: PHP Warning: The magic method __wakeup() must have public visibility. __wakeup() method was defined as private as a part of the Singleton design partern. Method was redefined as public but with exception inside to prevent its usage. -* Update: jQuery [MultiSelect](http://multiple-select.wenzhixin.net.cn/) plugin was updated to version 1.5.2 - -= [4.57] 09.11.2020 = -* Update: Marked as compatible with WordPress 5.6. -* Update: " jQuery( document ).ready( handler ) " was replaced globally with " jQuery( handler ) " for compatibility with [jQuery 3.0](https://api.jquery.com/ready/) and WordPress 5.6. -* Update: jQuery UI CSS was updated to version 1.12.1 -* Fix: "Grant Roles" button produced JavaScript error, if single user without any role granted (None) was selected. - -= [4.56.1] 05.09.2020 = -* New: WordPress multisite: Main site: Users->User Role Editor->Apply to All->Update: 'ure_after_network_roles_update' action hook was added. It is executed after all roles were replicated from the main site to the all other subsites of the network. -* Fix: "Granted Only" filter did not work. -* Fix: Warning was fixed: wp-content/plugins/user-role-editor/js/ure.js: jQuery.fn.attr('checked') might use property instead of attribute. - -= [4.56] 09.08.2020 = -* New: User capabilities 'install_languages', 'resume_plugins', 'resume_themes', 'view_site_health_checks' were added to the list of supported WordPress built-in user capabilities. -* Update: Single site WordPress installation: URE automatically grants all existing user capabilities to WordPress built-in 'administrator' role before opening its page "Users->User Role Editor". -* Fix: Extra slash was removed between URE_PLUGIN_URL and the image resource when outputting URE_PLUGIN_URL .'/images/ajax-loader.gif' at 'Users->User Role Editor' page. -* Info: Marked as compatible with WordPress 5.5. - -= [4.55.1] 06.06.2020 = -* Security fix: User with 'edit_users' capability could assign to another user a role not included into the editable roles list. This fix is required to install ASAP for all sites which have user(s) with 'edit_users' capability granted not via 'administrator' role. -* Update: URE_Uninstall class properties were made 'protected' to be accessible in URE_Uninstall_Pro class included into the Pro version. - -= [4.55] 03.06.2020 = -* Update: User Role Editor uninstallation was refactored. It fully removes the ('ure_%') user capabilities from the user roles data. - -= [4.54] 02.05.2020 = -New: Quick filter hides capabilities, which do not contain search string -Update: CSS enhancement: When site has many custom post types capabilities list section maximal height is limited by real height of the left side (capabilities groups) section, not by 720px as earlier. - -= [4.53.1] 22.03.2020 = -* New: "Hide Pro banner" checkbox works via AJAX without full page refresh. -* Fix: Undefined variable: $message at wp-content/plugins/user-role-editor/includes/classes/editor.php:898 -* Update: Few English grammar enhancements. - -= [4.53] 01.02.2020 = -* Update: "Add role", "Delete role", "Rename role", "Add capability", "Delete capability" do not reload full page on completion, but use AJAX for data exchange with server and refresh parts of the page via JavaScript. -* Update: Multisite: "Allow non super administrators to create, edit, and delete users" option: priority for 'map_meta_cap' filter priority was raised from 1 to 99, in order make possible to overwrite changes made by other plugins, like WooCommerce. -* Fix: Some English grammar mistakes. - -= [4.52.2] 26.12.2019 = -* Fix: Custom capabilities for custom post types was not created by URE automatically since version 4.52.1. -* Fix: 'administrator' role protection did not show to power users roles with 'administrator' word inside, like 'shop_administrator', etc. - -= [4.52.1] 11.11.2019 = -* Update: URE requires PHP version 5.6. -* ure_cpt_editor_roles filter was added. It takes 2 parameters: array $roles with 1 element 'administrator' by default and $post_type with post type name string. Add other role(s) to which you wish automatically add all user capabilities for custom post type $post_type. URE updates roles this way before opening "Users->User Role Editor" page. -* New user capability 'ure_nav_menus_access' was added. It's used at the User Role Editor Pro only. - -= [4.52] 07.10.2019 = -* New: Multisite: WordPress (tested up to version 5.2.3) shows "Change role to..." drop-down list at "Network Admin->Sites->selected site->Users tab" with roles filled from the main site, but should use roles list from the selected site. URE replaces this roles list with roles from the selected site and excludes error with message "Sorry, you are not allowed to give users that role.", when you try to grant to a user a role from the main site, which does not exist at the selected site. - -= [4.51.3] 02.09.2019 = -* Fix: line #281 at /includes/classes/view.php contained a call to the not existing class property. -* Fix: Roles have saved in alphabet order after any role update. Roles order in the database is not changed now. Sorting is made for a view purpose only. -* Update: Roles sorting inside WordPress roles dropdown lists is switched OFF by default. In order to switch WP roles dropdown lists sorting ON, return TRUE from 'ure_sort_wp_roles_list' filter. - -= [4.51.2] 15.07.2019 = -* Fix: Dialog button labels inside User Role Editor ('Cancel' buttons especially) were shown with not correct translation or not translated at all. Thanks to @lucaboccianti for [this bug report](https://wordpress.org/support/topic/buttons-delete-role-cancel-dont-delete-role-inverted-functions-italian/). -* Update: Roles inside WordPress roles dropdown lists are sorted by alphabet. - -= [4.51.1] 15.06.2019 = -* Fix: Superadmin could not revoke capabilities from 'administrator' role under WordPress multisite. - -= [4.51] 21.05.2019 = -* New: Bulk actions were added to the Users page: "Add Role", "Revoke Role". Select role from the related drop-down menu and add/revoke it to/from the list of pre-selected users. -* Update: Bulk grant roles feature ("Grant roles" button at the "Users" page) and Bulk grant role to users without role ("Without role" button at the "Users" page) are protected by 'promote_users' capability instead of 'edit_users', exactly the same way as WordPress itself does for its "Change role to". -* Update: 'load-users.php' action is used instead of 'admin_init' to load support code for "Without role" and "Grant roles" button at the "Users" page. -* Update: URE ignores now a capability without ID in case it was added to the database somehow (other plugin bug, etc.). Such incorrect empty capability is removed from the capabilities list as a result after any role update. - -= [4.50.2] 01.04.2019 = -* Fix: WordPress multisite: PHP Notice "wpmu_new_blog is deprecated since version 5.1.0! Use wp_insert_site instead." was removed. URE uses 'wp_initialize_site' action now instead of deprecated 'wpmu_new_blog'. This fix provides correct roles replication from the main blog/site to a new created blog/site. - -= [4.50.1] 16.03.2019 = -* Fix: WP Multisite: Users->Capabilities->Update: "Fatal error: Uncaught Error: Call to undefined method URE_Editor::check_blog_user() in /wp-content/plugins/user-role-editor/includes/classes/editor.php on line 576" was fixed. -* Fix: WooCommerce group was not shown under "Custom capabilities" section. - -= [4.50] 20.02.2019 = -* Update: General code restructure and optimization. -* Update: URE_Base_Lib::get_blog_ids() returns null, if it's called under WordPress single site (not multisite). -* Update: URE_Editor::prepare_capabilities_to_save() : "Invalid argument supplied for foreach()" warning was excluded in case there was no valid data structures initialization. -* Update: 'administrator' role protection was enhanced. URE always does not allow to revoke capability from 'administrator' role. That was possible earlier after the 'administrator' role update. - -= [4.49] 15.01.2019 = -* Update: Selected role ID was added to "Delete role" confirmation dialog. -* Update: Method URE_Base_Lib::get_short_list_str() was enhanced. -* Update: Method URE_Base_Lib::get_blog_ids() was made public. -* Update: Method URE_Lib::get_usermeta_table_name() was excluded. -* Fix: PHP warning "Undefined index:'unexisted role ID'" was fixed at URE_Lib::roles_text() (wp-content/plugins/user-role-editor/includes/classes/lib.php:360). -* Fix: Bug was fixed with incorrect usage of transient for option "Show deprecated capabilities". - -= [4.48] 03.01.2019 = -* Update: Multisite: Sites list is not requested from the database on every page opened in order to reduce server load. -* Update: URE plugin version update routine is called now at the wp-admin backend only. -* Update: Direct access to URE_Lib::bbpress property was excluded as a preparation to future code enhancements. - -= [4.47] 12.11.2018 = -* Fix: "Users->User Role Editor": Capabilities view was not refreshed properly for new selected role in case "Granted Only" filter was turned ON before other role selection. -* Update: Unused code was removed from user-role-editor/includes/classes/bbpress.php -* Update: Prevent sudden revoke role 'administrator' from a user(s) during capability with the same ID ('administrator') deletion from roles. -* Update: Adding custom capability with ID 'administrator' was prohibited. -* Update: Marked as compatible with WordPress version 5.0 - -= [4.46] 20.09.2018 -* Update: "Users" page, "Without role" button: underlying SQL queries were replaced with more robust versions (about 10 times faster). - It is critical for sites with large quant of users.New query does not take into account though some cases with incorrect users data (usually imported from the external sources). - It's possible to use older (comprehensive but slower) query version defining a PHP constant: "define('URE_COUNT_USERS_WITHOUT_ROLE_THOROUGHLY', true);" or - return false from a custom 'ure_count_users_without_role_quick' filter. -* Update: error checking was enhanced after default role change for the subsite under WordPress multisite. - -= [4.45] 18.08.2018 = -* Fix: Capability checkbox was shown as turned ON incorrectly for not granted capability included into a role, JSON: "caps":{"sample_cap":"false"}. Bug took place after the changing a currently selected role. -* Fix: Custom capabilities groups "User Role Editor" and "WooCommerce" were registered at the wrong 3rd tree level - changed to 2. - -= [4.44] 05.07.2018 = -* Update: URE had executed 'profile_update' action after update of user permissions from the user permissions editor page: Users->selected user->Capabilities. - It was replaced with 'ure_user_permissions_update' action now. It will allow to exclude conflicts with other plugins - "WP Members" [lost checkbox fields values](https://wordpress.org/support/topic/conflict-with-wp-members-2/), for example. -* Update: Additional options for role (like "Hide admin bar" at the bottom of URE page) did not applied to the user with 'ure_edit_roles' capability. This conditon was removed. -* Update: fix PHP notice 'Undefined offset: 0 in ...' at includes/classes/protect-admin.php, not_edit_admin(), where the 1st element of $caps array not always has index 0. -* Update: PHP required version was increased up to 5.4. - -= [4.43] 05.06.2018 = -* Update: references to non-existed roles are removed from the URE role additional options data storage after any role update. -* Fix: Additional options section view for the current role was not refreshed properly after other current role selection. - -= [4.42] 16.05.2018 = -* Fix: Type checking was added (URE_Lib::restore_visual_composer_caps()) to fix "Warning: Invalid argument supplied for foreach() in .../user-role-editor-pro/includes/classes/ure-lib.php on line 315". - -= [4.41] 07.05.2018 = -* New: URE changes currently selected role via AJAX request, without full "Users->User Role Editor" page refresh. -* Update: All [WPBakery Visual Composer](http://vc.wpbakery.com) plugin custom user capabilities (started from 'vc_access_rules_') were excluded from processing by User Role Editor. Visual Composer loses settings made via its own "Role Manager" after the role update by User Role Editor in other case. The reason - Visual Composer stores not boolean values with user capabilities granted to the roles via own "Role Manager". User Role Editor converted them to related boolean values during role(s) update. - -= [4.40.3] 05.04.2018 = -* Update: bbPress detection and code for integration with it was updated to support multisite installations when URE is network activated but bbPress is activated on some sites of the network only. Free version does not support bbPress roles. It excludes them from processing as bbPress creates them dynamically. - -= [4.40.2] 04.04.2018 = -* Update: Load required .php files from the active bbPress plugin directly, as in some cases URE code may be executed earlier than they are loaded by bbPress. - -= [4.40.1] 09.03.2018 = -* Update: wp_roles() function (introduced with WP 4.3) was included conditionally to URE code for backward compatibility with WordPress 4.0+ -* Fix: WordPress multisite: bbPress plugin detection code was changed from checking bbPress API function existence to checking WordPress active plugins list. bbPress plugin activated for the site was not available yet for the network activated User Role Editor at the point of URE instance creation. URE did not work with bbPress roles as it should by design for that reason. URE (free version) should ignore bbPress roles and capabilities as the special efforts are required for this. - -= [4.40] 31.01.2018 = -* Update: use wp_roles() function from WordPress API instead of initializing $wp_roles global variable directly. -* Fix: Bug was introduced by version 4.37 with users recalculation for "All" tab after excluding users with "administrator" role. Code worked incorrectly for Japanese locale. - -= [4.39] 19.12.2017 = -* Update: Plugin settings management code moved to the separate URE_Settings class. -* Update: 'create_posts', 'create_pages' user capabilities are not added by default to WordPress built-in capabilities groups as they are supported by the Pro version only. -* Update: Type checking enhanced for values received from a user input and for variable arguments inside database queries. -* Update: Own code to build usermeta db table name was excluded. A value from $wpdb->usermeta is used instead. - -= [4.38] 27.11.2017 = -* Security: XSS vulnerability was fixed at URE's options page. Bug was discovered and fixed at tab index value numeric type checking. Tab index value is additionally escaped before output also. -* Security: Deprecated code for debug output to the .log file in case of database query error was removed. -* Security: Multiple select jQuery plugin (https://github.com/wenzhixin/multiple-select/) was updated to the latest available version 1.2.1, which fixed XSS vulnerability, existed in earlier versions. - -= [4.37] 01.11.2017 = -* New: New option was added. It's possible to select permanent quant of capabilities columns at the "Settings->User Role Editor->General" tab. -* Update: User capabilities are shown for custom post types which use the WordPress built-in 'post' or 'page' capability type. (0/0) was shown earlier instead of the quantity of user capabilities really used. -* Update: Restriction was added for 'do_not_allow' user capability (used internally by WordPress). You can not add it manually. -* Fix: URE hides users with 'administrator' role by default from any other user. Quantity of users of 'All' view (tab) at 'Users' page is decreased now for the quantity of hidden administrators. - -= [4.36.1] 02.10.2017 = -* Update: Direct access to the global $current_user variable was excluded. Current user data is initialized via WordPress core functions wp_get_current_user() or get_current_user_id(). - -= [4.36] 19.09.2017 = -* New: It's possible to set any URE's option value programmatically: use custom filter 'ure_get_option_'. It takes a single parameter with current/default value for required options. - Full list of User Role Editor options is available here: https://www.role-editor.com/documentation/options-list -* Update: Users page - Grant Roles. It's possible to change just "Other roles" for multiple users and leave their primary roles untouched. Just leave a "Primary role" field empty. If you select the "- No role for this site -" option from a "Primary role" drop-down list, plugin will revoke all roles from the selected users. -* Update: Options page screen help text was updated. -* Fix: Additional (other) default roles set at URE's settings page are not granted to a new user now, if they were deselected at a 'Add New User' page. - -= [4.35.3] 20.07.2017 = -* Fix: Multiple roles assignment (including default roles) did not work at "Users->Add New" new-user.php (contexts: add-existing-user, add-new-user) page for WordPress multisite. - -= [4.35.2] 18.07.2017 = -* Fix: Multiple default roles (if defined at URE's settings) are selected automatically at new-user.php (context: add-new-user) page. -* Update: Code enhancement for protection of users with 'administrator' role from each other. Current user can see his own record and edit own profile. - -= [4.35.1] 10.07.2017 = -* Fix: "Grant Roles" button at the bottom of "Users" page did not work as had the same ID as a similar button at the top of this page. -* Update: when bbPress plugin is active, "Grant Roles" does not revoke bbPress role granted to user anymore. -* Fix: The same ID "move_from_no_role" and "move_from_no_role_dialog" were included twice to the "Users" page. - -= [4.35] 11.06.2017 = -* Update: Bulk capabilities selection checkbox is not shown for 'administrator' role for single site WP, and is shown if current user is superadmin for multisite WP. It was done to exclude sudden revoke of all capabilities from the 'administrator' role. -* Update: Full copy of JQuery UI 1.11.4 custom theme CSS file (jquery-ui.css) was included. -* Fix: User->User Role Editor page apparently loads own jQuery UI CSS (instead of use of WordPress default one) in order to exclude the conflicts with themes and plugins which can load own jQuery UI CSS globally not for own pages only. -* Fix: "Change Log" link was replaced with secure https://www.role-editor.com/changelog - -= [4.34] 02.06.2017 = -* New: Multisite 'upgrade_network' capability support was added for compatibility with WordPress 4.8. -* New: Multisite 'delete_sites' capability support was added. -* Update: Users->Grant Roles: if a single user was selected for "Grant Roles" bulk action, dialog will show the current roles of selected user with checkboxes turned ON (pre-selected). -* Fix: Transients caching was removed from URE_Lib::_get_post_types() function. It cached post types list too early in some cases. -* Fix: jQuery UI CSS was updated to fix minor view inconsistency at the URE's Settings page. -* Fix: "Reset" presentation code remainders were removed from the main User Role Editor page. -* Fix: 'manage_links' capability was included into a wrong subgroup instead of "Core->General". It was a mistake in the capabilities group counters for that reason. - -= [4.33] 19.05.2017 = -* Fix: "Users->Without Roles", "Users->Grant Roles" are shown only to the users with 'edit_users' capability. -* Fix: Roles were updated for all sites of all networks for WordPress multisite. "Apply to All Sites" option updates roles inside a current network only. -* Update: "Reset" button moved from the "Users->User Role Editor" main page to the "Settings->User Role Editor->Tools" tab. -* Update: "Users->Grant Roles" button worked only for superadmin or user with 'ure_manage_options' capability. User with 'edit_users' can use this feature now. -* New: boolean filter 'ure_bulk_grant_roles' allows to not show "Users->Grant Roles" button if you don't need it. -* New: boolean filter 'ure_users_select_primary_role' can hide 'Primary role' selection controls from the user profile edit page. -* New: boolean filter 'ure_users_show_wp_change_role' can hide "Change Role" bulk action selection control from the Users page. So it's possible to configure permissions for user who can change just other roles of a user without changing his primary role. -* Update: Settings tabs and dialog stylesheets was updated to jQuery UI 1.11.4 default theme. - -= [4.32.3] 03.04.2017 = -* Fix: Boolean false was sent to WordPress core wp_enqueue_script() function as the 2nd parameter instead of an empty string. We should respect the type of parameter which code author supposed to use initially. -* Fix: Bulk grant to users multiple roles JavaScript code is loaded now for users.php page only, not globally. - -= [4.32.2] 17.03.2017 = -* Fix: "Users->Grant Roles" button did not work with switched off option "Count Users without role" at "Settings->User Role Editor->Additional Modules" tab. "JQuery UI" library was not loaded. -* Update: minimal PHP version was raised to 5.3. - -= [4.32.1] 09.03.2017 = -* Fix: URL to users.php page was built incorrectly after bulk roles assignment to the users selected at the 1st page of a users list. - -= [4.32] 09.03.2017 = -* New: Button "Grant Roles" allows to "Assign multiple roles to the selected users" directly from the "Users" page. -* Update: singleton template was applied to the main User_Role_Editor class. While GLOBALS['user-role-editor'] reference to the instance of User_Role_Editor class is still available for the compatibility purpose, call to User_Role_Editor::get_instance() is the best way now to get a reference to the instance of User_Role_Editor class. -* Fix: Missed 'unfiltered_html' capability is shown now at the 'General' capabilities group too. - -= [4.31.1] 06.01.2017 = -* Fix: WP transients get/set were removed from URE_Own_Capabilities class. It leaded to the MySQL deadlock in some cases. -* Update: Base_Lib::get_request_var() sanitizes user input by PHP's filter_var() in addition to WordPress core's esc_attr(). - -= [4.31] 14.12.2016 = -* New: It's possible to remove unused user capabilities by list. -* Fix: There was no support for installations with the hidden/changed URL to wp-admin. URE uses 'admin_url()' now to get and check admin URL, instead of direct comparing URL with 'wp-admin' string. -* Fix: Deprecated capabilities were shown in some cases at the 'Core' group even with "Show deprecated capabilities" mode switched off. -* Update: Capability groups CSS classes are prefixed with 'ure-' in order to minimize possible CSS conflicts with other plugins/themes which may load styles with the same classes globally and break URE's markup. - -= [4.30] 01.12.2016 = -* Update: compatible with WordPress 4.7 -* New: "Granted Only" checkbox to the right from the "Quick Filter" input control allows to show only granted capabilities for the selected role or user. - -= [4.29] 10.11.2016 = -* New: User Role Editor own user capabilities are grouped separately under Custom capabilities. -* Update: URE_Lib::is_super_admin() uses WordPress core is_super_admin() for multisite setup only. Superadmin is a user with 'administrator' role in the case of single site WordPress installation. - This is the difference with the WordPress core which counts as a superadmin (for single site WP installation) any user with a 'delete_users' capability. -* Update: BaseLib::option_selected() calls were replaced with the calls of a similar selected() function from WordPress core. - -= [4.28] 20.10.2016 = -* New: WooCommerce plugin user capabilities (if exist) are grouped separately under Custom capabilities. -* Update: Temporally raised permissions flag is taken into account when checking, if user has a superadmin privileges. WordPress is_super_admin() function was replaced with custom wrapper to define if current user is a real superadmin or just a local admin with the temporally raised (add/edit users pages) permissions. - -= [4.27.2] 15.09.2016 = -* Update: There was a conflict with plugins which use a '|' character at the custom user capabilities: e.g. 'Nginx Helper | Config' from "Nginx Helper' plugin. -* Fix: PHP notice was removed: Undefined property: URE_Role_View::$multisite in wp-content/plugins/user-role-editor/includes/classes/view.php on line 143 -* Fix: WordPress multisite: Settings link under the URE plugin at the plugins list leads to the network admin now, not to the the single site settings page, which does not exist. -* Fix: WordPress multisite: conflict with "Visual Composer" plugin was resolved: single site administrators could now use Visual Composer editor. -* Fix: WordPress multisite: changed role name was not replicated to other sites when user clicked "Update" with "Apply to All Sites" option turned ON. - -= [4.27.1] 22.08.2016 = -* Update: There was a conflict with plugins which use a '/' character at the custom user capabilities: e.g. vc_access_rules_backend_editor/disabled_ce_editor from Visual Composer. -* Update: add/delete, escape, validate user capability code extracted from URE_Lib to the separate URE_Capability class - -= [4.27] 18.08.2016 = -* New: Total/Granted counters were added to the capabilities groups titles. -* New: "Columns" drop-down menu allows to change capabilities section layout to 1, 2 or 3 columns. -* New: Capabilities section is limited in height and has independent scrollbar. -* Update: User Role Editor page markup was updated to use more available space on page. -* Update: URE_Ajax_Processor class allows to differentiate required user permissions according to action submitted by user. -* Fix: CSS updated to exclude text overlapping at capabilities groups section when custom post type name is not fitted into 1 line. -* Fix: required JavaScript files were not loaded at "Network Admin->Settings->User Role Editor" page. - -= [4.26.3] 25.07.2016 = -* Fix: Selecting a sub-group/list of caps does make the ure_select_all_caps checkbox select all within that group, but checking that box when at the "All" top-level group did not work. -* Fix: Notice: Undefined property: URE_Role_View::$apply_to_all - -= [4.26.1] 14.07.2016 = -* Fix: some bugs, like 'undefined property' notices, etc. - -= [4.26] 14.07.2016 = -* New: User capabilities were groupd by functionality for more convenience. -* Update: URE_KEY_CAPABILITY constant was changed from 'ure_edit_roles' to 'ure_manage_options'. To make possible for non-admin users access to the User Role Editor without access to the 'administrator' role and users with 'administrator' role. -* Update: User receives full access to User Role Editor under WordPress multisite if he has 'manage_network_plugins' capability instead of 'manager_network_users' as earlier. This allows to give user ability to edit network users without giving him access to the User Role Editor. -* Update: Multisite: use WordPress's global $current_site->blog_id to define main blog ID instead of selecting the 1st one from the sorted list of blogs. -* Update: use WP transients at URE_Lib::_get_post_types() to reduce response time. -* Update: various internal optimizations. - -= [4.25.2] 03.05.2016 = -* Update: Enhanced inner processing of available custom post types list. -* Update: Uses 15 seconds transient cache in order to not count users without role twice when 'restrict_manage_users' action fires. -* Update: URE fires action 'profile_update' after direct update of user permissions in order other plugins may catch such change. -* Update: All URE's PHP classes files renamed and moved to the includes/classes subdirectory - -= [4.25.1] 15.04.2016 = -* Fix: Selected role's capabilities list was returned back to old after click "Update" button. It was showed correctly according to the recent updates just after additional page refresh. -* Update: deprecated function get_current_user_info() call was replaced with wp_get_current_user(). - -= [4.25] 02.04.2016 = -* Important security update: Any registered user could get an administrator access. Thanks to [John Muncaster](http://johnmuncaster.com/) for discovering and wisely reporting it. -* URE pages title tag was replaced from h2 to h1, for compatibility with other WordPress pages. -* Fix: "Assign role to the users without role" feature ignored role selected by user. -* Fix: PHP fatal error (line 34) was raised at uninstall.php for WordPress multisite. -* Update: action priority 99 was added for role additional options hook action setup. - -= [4.24] 17.03.2016 = -* Fix: PHP notice was generated by class-role-additional-options.php in case when some option does not exist anymore -* Enhance: 'Add Capability' button have added capability to the WordPress built-in administrator role by default. It did not work, if 'administrator' role did not exist. - Now script selects automatically as an admin role a role with the largest quant of capabilities and adds new capability to the selected role. -* New: User capabilities page was integrated with "[User Switching](https://wordpress.org/plugins/user-switching/)" plugin - "Switch To" the editing user link iss added if "User Switching" plugin is available. -* Marked as compatible with WordPress 4.5. - -= [4.23.2] 03.02.2016 = -* Fix: PHP warning "Strict Standards: Static function URE_Base_Lib::get_instance() should not be abstract" was generated - -= [4.23.1] 01.02.2016 = -* Fix: 'get_called_class()' function call was excluded for the compatibility with PHP 5.2.* -* Fix: ure-users.js was loaded not only to the 'Users' page. - -= [4.23] 31.01.2016 = -* Fix: "Users - Without Role" button showed empty roles drop down list on the 1st call. -* Update: Own task queue was added, so code which should executed once after plugin activation is executed by the next request to WP and may use a selected WordPress action to fire with a needed priority. -* Update: Call of deprecated mysql_server_info() is replaced with $wpdb->db_version(). -* Update: Singleton patern is applied to the URE_Lib class. -* Minor code enhancements - -= [4.22] 15.01.2016 = -* Unused 'add_users' capability was removed from the list of core capabilities as it was removed from WordPress starting from version 4.4 -* bbPress user capabilities are supported for use in the non-bbPress roles. You can not edit roles created by bbPress, as bbPress re-creates them dynamically for every request to the server. Full support for bbPress roles editing will be included into User Role Editor Pro version 4.22. -* Self-added "Other Roles" column removed from "Users" list, as WordPress started to show all roles assigned to the user in its own "Role" column. -* 'ure_show_additional_capabilities_section' filter allows to hide 'Other Roles' section at the 'Add new user', 'Edit user' pages. - -= [4.21.1] 16.12.2015 = -* Fix: 'Update' button did not work at User's Capabilities page due to confirmation dialog call error. - - -= [4.21] 11.12.2015 = -* It's possible to switch off the update role confirmation (Settings - User Role Editor - General tab). -* Standard JavaScript confirm box before role update was replaced with custom one to exclude 'Prevent this page from creating additional dialogs' option in the Google Chrome browser. -* Fix: Removed hard coded folder name (user-role-editor) from the used paths. - - -= [4.20.1] 15.11.2015 = -* Fix: "Primary default role" drop-down menu was not shown at "Settings - User Role Editor - Default Roles" tab for WordPress single site installation. - -= [4.20] 15.11.2015 = -* "Additional options" section was added to the user role editor page. Currently it contains the only "Hide admin bar". The list of options may be customized/extended by developers via "ure_role_additonal_options" filter. -* "Default Role" button is hidden to not duplicate functionality. Use "Settings - User Role Editor - Default Roles" tab instead. This button is available only for the single sites of WP multisite now. -* Code restructure, optimization: administrator protection parts extracted to the separate class. - -= [4.19.3] 14.10.2015 = -* Fix: minor CSS change. -* Automatically add all available custom post types capabilities to the administrator role under the single site environment. Custom posts types selection query updated to include all custom post types except 'built-in' when adding custom capabilities for them -* Special flag was set to indicate that single site administrator gets raised (superadmin) permissions temporary especially for the 'user-new.php' page, but current user is not the superadmin really. - (This temporary permissions raising is done to allow single site administrator to add new users under multisite if related option is active.) - -= [4.19.2] 01.10.2015 = -* Fix: multiple default roles assignment did not work under the multisite environment, when user was created from front-end by WooCommerce, etc. -* Update: the translation text domain was changed to the plugin slug (user-role-editor) for the compatibility with translations.wordpress.org -* Update: CSS enhanced to exclude column wrapping for the capabilities with the long names. - -= [4.19.1] 20.08.2015 = -* Default role value has not been refreshed automatically after change at the "Default Role" dialog - fixed. -* More detailed notice messages are shown after default role change - to reflect a possible error or problem. -* Other default roles (in addition to the primary role) has been assigned to a new registered user for requests from the admin back-end only. Now this feature works for the requests from the front-end user registration forms too. - -= 4.19 = -* 28.07.2015 -* It is possible to assign to the user multiple roles directly through a user profile edit page. -* Custom SQL-query (checked if the role is in use and slow on the huge data) was excluded and replaced with WordPress built-in function call. [Thanks to Aaron](https://wordpress.org/support/topic/poorly-scaling-queries). -* Bulk role assignment to the users without role was rewritten for cases with a huge quant of users. It processes just 50 users without role for the one request to return the answer from the server in the short time. The related code was extracted to the separate class. -* Code to fix JavaScript and CSS compatibility issues introduced by other plugins and themes, which load its stuff globally, was extracted into the separate class. -* Custom filters were added: 'ure_full_capabilites' - takes 1 input parameter, array with a full list of user capabilities visible at URE, 'ure_built_in_wp_caps' - takes 1 input parameter, array with a list of WordPress core user capabilities. These filters may be useful if you give access to the URE for some not administrator user, and wish to change the list of capabilities which are available to him at URE. -* Dutch translation was updated. Thanks to Gerhard Hoogterp. - -= 4.18.4 = -* 30.04.2015 -* Calls to the function add_query_arg() is properly escaped with esc_url_raw() to exclude potential XSS vulnerabilities. Nothing critical: both calls of add_query_arg() are placed at the unused sections of the code. -* Italian translation was updated. Thanks to Leo. - -= 4.18.3 = -* 24.02.2015 -* Fixed PHP fatal error for roles reset operation. -* Fixed current user capability checking before URE Options page open. -* 3 missed phrases were added to the translations files. Thanks to [Morteza](https://wordpress.org/support/profile/mo0orteza) -* Hebrew translation updated. Thanks to [atar4u](http://atar4u.com) -* Persian translation updated. Thanks to [Morteza](https://wordpress.org/support/profile/mo0orteza) - -= 4.18.2 = -* 06.02.2015 -* New option "Edit user capabilities" was added. If it is unchecked - capabilities section of selected user will be shown in the readonly mode. Administrator (except superadmin for multisite) can not assign capabilities to the user directly. He should make it using roles only. -* More universal checking applied to the custom post type capabilities creation to exclude not existing property notices. -* Multisite: URE's options page is prohibited by 'manage_network_users' capability instead of 'ure_manage_options' in case single site administrators does not have permission to use URE. -* URE protects administrator user from editing by other users by default. If you wish to turn off such protection, you may add filter 'ure_supress_administrators_protection' and return 'true' from it. -* Plugin installation to the WordPress multisite with large (thousands) subsites had a problem with script execution time. Fixed. URE does not try to update all subsites at once now. It does it for every subsite separately, only when you visit that subsite. -* Fixed JavaScript bug with 'Reset Roles' for FireFox v.34. - -= 4.18.1 = -* 14.12.2014 -* As activation hook does not fire during bulk plugins update, automatic plugin version check and upgrade execution were added. - -= 4.18 = -* 14.12.2014 -* Own custom user capabilities, e.g. 'ure_edit_roles' are used to restrict access to User Role Editor functionality ([read more](https://www.role-editor.com/user-role-editor-4-18-new-permissions/)). -* If custom post type uses own custom user capabilities URE add them to the 'Custom Capabilities' section automatically. -* Multisite: You may allow to the users without superadmin privileges to add/create site users without sending them email confirmation request. -* Bug fix: when non-admin user updated other user profile, that user lost secondary roles. -* Italian translation was added. Thanks to [Giuseppe Velardo](http://www.comprensivoleopardi.gov.it/). - -= 4.17.3 = -* 23.11.2014 -* French and Turkish translation were updated. Thanks to [Transifex](https://www.transifex.com) translation team. - -= 4.17.2 = -* 21.10.2014 -* Notice: "Undefined property: Ure_Lib::$pro in .../class-user-role-editor.php on line 550" was fixed. -* Settings help screen text was updated. -* Russian translation was updated. -* Hungarian translation was updated. Thanks to NĂ©meth Balázs. -* French and Turkish translation were updated. Thanks to [Transifex](https://www.transifex.com) translation team. - - -= 4.17.1 = -* 01.10.2014 -* Bug fix for the PHP Fatal error: Call to undefined function is_plugin_active_for_network(). It may take place under multisite only, -in case no one of the other active plugins load file with this function already before User Role Editor v. 4.17 tries to call it. - -= 4.17 = -* 01.10.2014 -* Multisite (update for cases when URE was not network activated): It is possible to use own settings for single site activated instances of User Role Editor. - Earlier User Role Editor used the settings values from the main blog only located under "Network Admin - Settings". - Some critical options were hidden from the "Multisite" tab for single site administrators and visible to the superadmin only. - Single site admin should not have access to the options which purpose is to restrict him. - Important! In case you decide to allow single site administrator activate/deactivate User Role Editor himself, setup this PHP constant at the wp-config.php file: - define('URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE', 1); - Otherwise single site admin will not see User Role Editor in the plugins list after its activation. User Role Editor hides itself under multisite from all users except superadmin by default. -* Help screen for the Settings page was updated. -* Hungarian translation was added. Thanks to NĂ©meth Balázs. -* Dutch translation was added. Thanks to Arjan Bosch. - - -= 4.16 = -* 11.09.2014 -* "create_sites" user capability was added to the list of built-in WordPress user capabilities for WordPress multisite. It does not exist by default. But it is used to control "Add New" button at the "Sites" page under WordPress multisite network admin. -* bug fix: WordPress database prefix value was not used in 2 SQL queries related to the "count users without role" module - updated. - -= 4.15 = -* 08.09.2014 -* Rename role button was added to the URE toolbar. It allows to change user role display name (role ID is always the same). Be careful and double think before rename some built-in WordPress role. - -= 4.14.4 = -* 08.08.2014 -* Missed "manage_sites" user capability was added to the list of built-in WordPress capabilities managed by User Role Editor. -* Russian translation was updated. - -= 4.14.3 = -* 25.07.2014 -* Integer "1" as default capability value for new added empty role was excluded for the better compatibility with WordPress core. Boolean "true" is used instead as WordPress itself does. -* Integration with Gravity Forms permissions system was enhanced for WordPress multisite. - -= 4.14.2 = -* 18.07.2014 -* The instance of main plugin class User_Role_Editor is available for other developers now via $GLOBALS['user_role_editor'] -* Compatibility issue with the theme ["WD TechGoStore"](http://wpdance.com) is resolved. This theme loads its JS and CSS stuff for admin backend uncoditionally - for all pages. While the problem is caused just by CSS URE unloads all this theme JS and CSS for optimizaiton purpose for WP admin backend pages where conflict is possible. - -= 4.14.1 = -* 13.06.2014 -* MySQL query optimizing to reduce memory consumption. Thanks to [SebastiaanO](http://wordpress.org/support/topic/allowed-memory-size-exhausted-fixed). -* Extra WordPress nonce field was removed from the post at main role editor page to exclude nonce duplication. -* Minor code enhancements. -* Fixes for some missed translations. - -= 4.14 = -* 16.05.2014 -* Persian translation was added. Thanks to Morteza. - -= 4.12 = -* 22.04.2014 -* Bug was fixed. It had prevented bulk move users without role (--No role for this site--) to the selected role in case such users were shown more than at one WordPress Users page. -* Korean translation was added. Thanks to [Taek Yoon](http://www.ajinsys.com). - -= 4.11 = -* 06.04.2014 -* Single-site: It is possible to bulk move users without role (--No role for this site--) to the selected role or automatically created role "No rights" without any capabilities. Get more details at https://role-editor.com/no-role-for-this-site/ -* Plugin uses for dialogs jQuery UI CSS included into WordPress package. - -= 4.10 = -* 15.02.2014 -* Security enhancement: WordPress text translation functions were replaced with more secure esc_html__() and esc_html_e() variants. - -= 4.9 = -* 19.01.2014 -* New tab "Default Roles" was added to the User Role Editor settings page. It is possible to select multiple default roles to assign them automatically to the new registered user. -* CSS and dialog windows layout various enhancements. -* 'members_get_capabilities' filter was applied to provide better compatibility with themes and plugins which may use it to add its own user capabilities. -* jQuery UI CSS was updated to version 1.10.4. - -= 4.8 = -* 10.12.2013 -* Role ID validation rule was added to prohibit numeric role ID - WordPress does not support them. -* Plugin "Options" page was divided into sections (tabs): General, Multisite, About. Section with information about plugin author, his site, etc. was moved from User Role Editor main page to its "Options" page - "About" tab. -* HTML markup was updated to provide compatibility with upcoming WordPress 3.8 new administrator backend theme "MP6". -* Restore previous blog 'switch_to_blog($old_blog_id)' call was replaced to 'restore_current_blog()' where it is possible to provide better compatibility with WordPress API. -After use 'switch_to_blog()' in cycle, URE clears '_wp_switched_stack' global variable directly instead of call 'restore_current_blog()' inside the cycle to work faster. - -= 4.7 = -* 04.11.2013 -* "Delete Role" menu has "Delete All Unused Roles" menu item now. -* More detailed warning was added before fulfill "Reset" roles command in order to reduce accident use of this critical operation. -* Bug was fixed at Ure_Lib::reset_user_roles() method. Method did not work correctly for the rest sites of the network except the main blog. - -= 4.6 = -* 21.10.2013 -* Multi-site: 'unfiltered_html' capability marked as deprecated one. Read this post for more information (http://shinephp.com/is-unfiltered_html-capability-deprecated/). -* Multi-site: 'manage_network%' capabilities were included into WordPress core capabilities list. -* On screen help was added to the "User Role Editor Options" page - click "Help" at the top right corner to read it. -* Bug fix: turning off capability at the Administrator role fully removed that capability from capabilities list. -* Various internal code enhancements. -* Information about GPLv2 license was added to show apparently - "User Role Editor" is licensed under GPLv2 or later. - -= 4.5.2 = -* 23.09.2013 -* User capabilities editor updated to support capabilities beyond the user roles - capabilities added by other plugins directly to the users, or deleted from the user roles. -* Bug fixed - custom capabilities was not shown in User capabilities editor in some cases. -* Spanish translation was added. Thanks to [Dario Ferrer](http://darioferrer.com/). - -= 4.5.1 = -* 29.08.2013 -* Bug with multi-site super-admin access to the User Role Editor is fixed. Version 4.5. showed message "Insufficient permissions to work with User Role Editor" until add "manage_network_users" capability to the "Administrator" role. It is enough now to be the "Superadmin" at multi-site network. - -= 4.5 = -* 29.08.2013 -* Direct checking of the "administrator" role is removed from the code to support ability to change User Role Editor access key capability. -URE uses by default the "administrator" role for single site as the key capability to permit access to the User Role Editor. -You may change this capability manually by replacing value of URE_KEY_CAPABILITY constant at includes/define_constants.php file. Pro version -starting from 4.5 allows to change this key capability name (input your own, custom one) via User Role Editor settings page. -* The Hebrew translation is added. Thanks to [atar4u](http://atar4u.com). - -= 4.4 = -* 15.08.2013 -* Bug fixed which prevented creation of current roles backup record during User Role Editor plugin installation and produced unexpected output (PHP notices). - -= 4.3 = -* 12.08.2013 -* Multisite update: roles from the main (1st) blog are copied to the new added blog automatically, -even new site is added from front-end after new user registration, e.g. Gravity Forms "Register User" addon does. Earlier this feature worked -for administrator back-end operations only. -* Bug prevented to apply role changes to all sites of the network is fixed. In case when one of the sites have exactly the same roles as applied from the main site, MySQL returned 0 rows affected. URE recognized that as error and stopped further network updated. It is fixed now. -* Bug prevented to save empty (without capabilities) role is fixed. -* User interface bug with options 'Show capabilities in human readable form' and 'Show deprecated capabilities' fixed. -Now this checkboxes work this way: It takes global values from the User Role Editor Settings 1st. If you change it at Roles/User editor form plugin, -it remembers your change temporally for 10 minutes. After that this value will be returned to the URE global settings. -If you wish to make permanent change make it at URE settings page. - -= 4.2 = -* 02.08.2013 -* Separate setting page is added for User Role Editor under Settings menu. It is available under Network Center "Settings" for the multi-site. -* Option 'show Administrator role in the User Role Editor' was added. -* User with super-admin privilege only may create, edit, delete users by default under multi-site configuration. -Use new "Allow create, edit and delete user to not super-administrators" option to workaround this obstacle. -Such user still should have correspondent user capabilities as "create_users", "edit_users", "delete_users". -Thanks to [Sjobidoo](http://wordpress.org/support/profile/sjobidoo) for suggested -[decision](http://wordpress.org/support/topic/plugin-user-role-editor-not-able-to-add-ability-to-edit-users). -* PHP fatal error caused by typo in the 'uninstall.php' file is fixed. -* Miscellaneous code enhancements. - -= 4.1.1 = -* 15.07.2013 -* Issue when "users with "Editor" credentials were no longer able to change the author name in the drop down on each post to someone with administrative credentials" is fixed. -* Limitation when user with 'Administrator' role could not edit/delete other users with 'Administrator' role is removed. -* "Apply to All sites" checkbox is excluded from "Select All" operation. -* Quick filter is added to the user's capabilities edit form. Capabilities selection buttons work is fixed after that. - -= 4.1 = -* 03.07.2013 -* Quick Filter is added. Type part of any capability. All capabilities containing that word, e.g. 'edit' or 'users' will be highlighted by green color. -While 'quick filter' is in action 'Select All', 'Unselect All', 'Inverse' buttons work with highlighted capabilities sub-set only. -Read [this post](http://role-editor.com/user-role-editor-version-4-1-is-available/) for more information: -* Class property and method access modifiers fatal errors were fixed (http://wordpress.org/support/topic/fatalerror-1). - -= 4.0 = -* 30.06.2013 -* Pro version only: added 'Export/Import' functionality to 'export' all user roles to the local file and 'import' them then to other WordPress blog or other sites of muliti-site WordPress network, or just restore roles to previous state after playing with them with test purpose. -* Added integration with the Gravity Forms plugin. User Role Editor shows Gravity Forms user capabilities at the custom capabilities section. -* Code is fully restructured and encapsulated to PHP classes. Internal global variables are not in use anymore. - -= 3.14.1 = -* 24.05.2013 -* Bug, which prevented the correct use of WordPress nonces on some installations (Windows), is fixed; -* DIRECTORY_SEPARATOR constant used in path to User Role Editor CSS file was empty on some installations (Windows). Constant DIRECTORY_SEPARATOR is excluded from the plugin code; -* User capabilities page: roles checkboxes are excluded from 'Select All', 'Unselect All', 'Inverse' operations. Only capabilities checkboxes are processed. -* Turkish [Muhammed YILDIRIM](http://ben.muhammed.im) translation is updated. - -= 3.14 = -* 17.05.2013 -* Interface update: role/capability add/remove stuff was removed from the page. Plugin has toolbar at the right side now. Click on the button opens needed dialog window. -* New role may have different attrubutes "ID" and "Name". While ID is still restricted by latin characters hyphen, underscore and digits only, Name could contain spaces and national languages characters. -* General code cleanup and security enhancements: all data changes request are processed via POST instead of GET now. So its more difficult to send modified malicious request without special software. Presence of special nonce field is checked for all requests. -* Setting up the 'administrator' role as default one for new registered users is prohibited at server side. -* JavaScript code separated from PHP one whenever it's possible. - -* 14.05.2013 -* Update for administrators of multi-site WordPress installations. Single-site WordPress installation administrator could skip this update. -* "Apply to All Sites" feature did not work at version 3.12. It is fixed. -* "Apply to All Sites" feature is available now from main site of the network only - -= 3.12 = -* 01.05.2013 -* Critical update: persistent cross-site scripting vulnerability is fixed. -* WordPress built-in constants, like WP_PLUGIN_URL are not used in order to provide compatibility with sites which use SSL. plugin_dir_url(), plugin_dir_path() functions are used to define paths to the plugin's files instead. -* "Greetings" section is removed from the plugin's main page. All that content is still available at [plugin page](http://shinephp.com/user-role-editor-wordpress-plugin) - - -= 3.11 = -* 24.03.2013 -* Required WordPress version checking is moved to plugin activation hook. -* Administrator can now exclude non-core (custom) capabilities from his role. It is useful if you need to fully remove some capability as capability deletion is prohibited while it is used at least one role. -* bbPress compatibility issue is fixed: capabilities created by bbPress dinamically are excluded from the capabilities set in User Role Editor to not store them in the database as persistent WP roles data. -* Additional roles are assigned to user without overriding her primary WordPress role and bbPress role. -* Changing Wordpress user primary role at user profile doesn't clear additonal roles assigned with User Role Editor earlier. -* Brasilian Portuguese translation is updated. - -= 3.10 = -* 04.02.2013 -* You can assign to user multiple roles simultaneously. Use user level roles and capabilities editor for that. You can click 'Capabilities' link under selected user row at users list or 'Assign Roles and Additional Capabilities' link at user profile. -* Critical bug fix: hidden deprecated WordPress core capabilities had turned on after any update made to the role. Deprecated capabilities are not currently in use by WordPress itself. But old plugins or themes could still use them. If you use some outdated code I recommend you to check all roles, you modified with User Role Editor, and turn off unneeded deprecated capabilities there. -* User with Administrator role is secured better from editing, deletion by user with lower capabilities. - -= 3.9 = -* 07.01.2013 -* Compatibility with bbPress 2.2 new user roles model is provided. More details about the reason of such update at http://shinephp.com/bbpress-user-role-editor-conflict-fix/ -* "Reset" button works differently now. It restores WordPress roles data to its 1st, default state, exactly that, what WordPress has just after fresh install/latest version update. Be careful with it, make database backup copy before fulfill this operation. Some plugin could require reactivation to function properly after roles reset. -* Arabic translation is added. Thanks to [Yaser](http://www.englize.com/) -* Slovak translation is added. Thanks to Branco. - -= 3.8.3 = -* 14.12.2012 -* Compatibility issue with WordPress 3.5 was found (thanks to Sonja) and fixed: $wpdb->prepare() was called without 2nd $args parameter - removed. - -= 3.8.2 = -* 02.12.2012 -* load_plugin_textdomain() call moved to the 'plugins_loaded' hook for higher compatibility with translation plugins. -* Traditional Chinese translation is added. Thanks to Jingxin Lai. - -= 3.8.1 = -* 21.10.2012 -* Fix: URE taked roles names from the database directly and ignored changes made to roles names on the fly by other plugins or themes, names, which were cached by WordPress internally, but were not written to the database. URE uses WordPress internal cache now. -* Roles names translation update: if URE translation file doesn't exist for blog default language, URE uses WordPress internal translation now. -* Serbian translation is added. Thanks to [Diana](http://wpcouponshop.com). - -= 3.8 = -* 01.09.2012 -* Bug fix: Some times URE didn't show real changes it made to the database. The reason was that direct update of database did not invalidate data stored at WordPress cache. Special thanks to [Knut Sparhell](http://sparhell.no/knut/) for the help to detect this critical issue. -* WordPress core capabilities are shown separately from capabilities added by plugins and manually. -* If you configured URE to show you 'Administrator' role, you will see its capabilities, but you can not exclude any capability from it. I may just add capabilities to the Administrator role now. The reason - Administrator role should have all existing capabilities included. -* Brasilian Portuguese translation is updated. Thanks to [Onbiz](http://www.onbiz.com.br/). - -= 3.7.5 = -* 11.08.2012 -* Minor fix of German language translation file. One string translation was the reason of URE empty screen. Just replace your German language translation files in the ./lang directory with files from this package. - -= 3.7.5 = -* 29.07.2012 -* Polish translation is updated. Thanks to Bartosz. -* "User Role Editor" menu item could be shown in translated form now. Do not lose it - it is on the same place at the "Users" submenu. - -= 3.7.4 = -* 26.07.2012 -* Persian translation is updated. Thanks to Amir Khalilnejad. - -= 3.7.3 = -* 25.07.2012 -* German translation is updated. Thanks to Piter. - -= 3.7.2 = -* 20.07.2012 -* SQL-injection vulnerability was found and fixed. Thanks to DDave for reporting it, look this [thread](http://shinephp.com/community/topic/little-bug-in-ure_has_administrator_role#post-819) for the details. - -= 3.7.1 = -* 25.06.2012 -* Bug fix for "Fatal error: Call to a member function get_role() on a non-object in .../wp-content/plugins/user-role-editor/user-role-editor.php on line 185" - -= 3.7 = -* 23.06.2012 -* 'Select All', 'Unselect All', 'Inverse' buttons were added to the from for more convenient capabilities management while role editing. -* Role and capability name could be started from digit, and underscore '_' character. Hyphen '-' character could be included into such name too. -* Old versions used 'edit_users' capability to check if show/hide 'User Role Editor' menu item under 'Users' menu. Starting from version 3.7 'administrator' role is checked. Existed inconsistency, when non-admin user with 'edit_users' capability saws 'User Role Editor' menu, but got 'Only Administrator is allowed to use User Role Editor' error message, was removed. -* Bug fix: if you work with WordPress admin via https, URE will use https instead of http, as it made in older versions. - -= 3.6.2 = -* 23.05.2012 -* Hindi translation is added. Thanks to Love Chandel. - -= 3.6.1 = -* 07.05.2012 -* Italian translation is updated. Thanks to Tristano Ajmone. - -= 3.6 = -* 30.04.2012 -* CSS and page layout fix for compatibility with WordPress 3.4. -* WordPress multi-site: when new blog created default role setting is copied for it from the main blog default role value now. -* Minor translations files update, e.g Russian roles names in plugin are identical to those WordPress uses itself now, etc. - -= 3.5.4 = -* 4.04.2012 -* Lithuanian translation is added, thanks to Vincent G. -* Spanish translation is updated, thanks to Victor Ricardo DĂ­az. - -= 3.5.3 = -* 24.03.2012 -* French translation is updated, thanks to Presse et Multimedia. -* Hebrew translation is updated, thanks to Aryo Digital. -* Persian translation is updated, thanks to Parsa. -* Minor CSS fix to provide compatibility with RTL languages. - -= 3.5.2 = -* 17.03.2012 -* Turkish translation is updated, thanks to Muhammed YILDIRIM. -* Dutch translation is updated, thanks to Frank Groeneveld. - -= 3.5.1 = -* 24.02.2012 -* Bugs for multi-site WordPress network installation were discovered and fixed: 1) blocked login to admin back-end; 2) empty users list for administrators of single sites; 3) empty authors drop down list at the post editor page. -* If URE plugin is not enabled for single site administrator, then URE is automatically excluded from plugins list available to that administrator. - -= 3.5 = -* 19.02.2012 -* User Role Editor could be available now for single site administrators (Administrator role) under multi-site environment. You should define URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE constant in your blog wp-config.php file for that. Insert this line "define('URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE', 1);" there, if you decide to give single site admin such opportunity. -* One of "User Role Editor" users with 1100+ sites in the multi-site network reported that URE doesn't update roles for all sites, but stalls somewhere in the middle. Other network update method is realized as alternative. Due to my tests it works approximately 30 times faster. If you met the same problem, try it. It will be great if you share your experience with me. In order select alternative method of all sites update add this line to you blog wp-config.php file "define('URE_MULTISITE_DIRECT_UPDATE', 1);". But be careful. It's recommended to make 1st try on the backup copy, not on a live site. -* Persian translation is updated. Thanks to [Parsa](http://parsa.ws). - -= 3.4 = -* 21.01.2012 -* You can see/edit "Administrator" role now. Insert this line of code "define('URE_SHOW_ADMIN_ROLE', 1);" into your wp-config.php file and login with administrator account for that. - If for some reason your Administrator role missed some capabilities added by plugins or themes, you can fix that. But be careful with changing "Administrator" role, do not turn off accidentally some critical capabilities to not block your admin users. - -= 3.3.3 = -* 11.01.2012 -* Spanish (Dario) and Swedish (AndrĂ©as) translations update. - -= 3.3.2 = -* 02.01.2012 -* Enhance server side validation for user input of new role name, minor bug fixes. - -= 3.3.1 = -* 12.12.2011 -* Compatibility with Internet Explorer fix: It automatically replaced '©' in '©_from_user_role' URL parameter inside JavaScript code to copyright sign.So I should use other name for this parameter. Thanks to Michael Wiekenberg for the help with isolating this issue. - -= 3.3 = -* 10.12.2011 -* New role can be created as a copy of other existing one. -* You can hide/show deprecated capabilties (level_1 - level_10). -* Users with "Administrator" role are not shown to other users with "list_users" capability. -* Plugin data cleanup is added - plugin options will be automatically deleted if you delete plugin via WordPress link. -* Some code enhancements are applied, e.g. optimization and using of WordPress API instead of self-written routine. -* New bugs are added :) - it's a joke of course, but if you find some, please report, I will fix it ASAP. - -= 3.2.1 = -* 01.08.2011 -* This is minor bug-fix update. If you didn't meet this bug you can skip this update. "usermeta" table doesn't exist bug appearing on some multi-site blogs is fixed. Read [this post](http://wordpress.org/support/topic/multisite-setup-gives-usermeta-table-error) for more information. Thanks to harpinder for discovering this bug and for the help with testing updated code. "usermeta" Db table name is define by more universal way now. - -= 3.2 = -* 25.07.2011 -* If you run multi-site WordPress network, User Role Editor will automatically duplicate all roles from the main blog (blog with mininal ID) to every new created blog. -* Some fixes, refactoring and logic change were applied to code to enhance its productivity. There were some complaints for PHP timeout error after trying to open plugin Settings page. -* Thanks to Grant Norwood for code fix to hide PHP warnings he met during plugin usage. -* Hebrew translation is added. Thanks to Sagive. -* French translation is updated. Thanks to Whiler. -* Japan translation is updated. Thanks to Kaz. -* Spanish translation is updated. Thanks to Dario. - -= 3.1.1 = -* 07.07.2011 -* CUSTOM_USER_META_TABLE constant is used now for more compatibility with core WordPress API. Thanks to [Lorenzo Nicoletti](http://www.extera.com) -* Turkish translation is updated. Thanks to Muhammed YILDIRIM. Other language translators are welcome! - -= 3.1 = -* 03.06.2011 -* Add/Remove capability boxes are added to the User Role Editor -* Capabilities could be assigned directly to the user, additionally to the assigned role -* PHP4 is not supported by this plugin anymore. Update your site to PHP5 in order to use this plugin and [near to release WordPress 3.2 :)](http://wordpress.org/about/requirements/) -* Minor compatibility issues with other plugins were fixed - -= 3.0.4 = -* 18.04.2011 -* minor update: PHP4 compatibility issue in code was discovered and fixed. PHP5 users could skip it. PHP4 users should think about update to PHP5, as WordPress 3.2 (planned to July 2011) will not provide PHP4 compatibility more. - -= 3.0.3 = -* 17.04.2011 -* Capabilities in human readable form are sorted by alphabet (usefull for translated form) now, not by inner capability name. -* Finnish translation is added. - -= 3.0.2 = -* 11.04.2011 -* Swedish translation is added. -* Alternative Italian translation is added. Rename ure-it_IT_1.* files to ure-it_IT.* if wish to try it. -* ShinePHP.com RSS feed is excluded from plugin settings page. Use this link http://feeds.feedburner.com/shinephp with your favorite RSS reader if you wish to read it. - -= 3.0.1 = -* 27.02.2011 -* Spanish translation is updated. Thanks to [Dario Ferrer](http://www.darioferrer.com). Other language translation wait for update too. You are welcome :). - -= 3.0 = -* 06.02.2011 -* Compatibility with WordPress 3.1 Release Candidate 3 and real multi-site feature are provided. -* Role capabilities list are sorted now in the alphabetical order. Easier to find - easier to manage. -* Code fix: allows to not lose new custom capability if it is added to other than 'Administrator' role. Thanks to Marcin for the contribution to the code of this plugin. -* Under multi-site environment: -* 1) URE has additional option 'Apply to All Sites' which allows you to apply updates to the selected role at all sites of your network. If some site has not such role, it will be added. You should know, that this option works for the role update only. All other actions as 'Add' or 'Delete' role still works for the currently selected blog/site only. -* 2) URE plugin settings page is available only to user with network superadministrator rights. - -= 2.2.3 = -* 08.11.2010 -* It is the security update. Old problem returned after 2.2.2 update and was discovered by saharusa. You can read this [thread](http://wordpress.org/support/topic/plugin-user-role-editor-editor-can-edit-admin). -Only user with Administrator role and superadmin user under multi-site environment have access to the User Role Editor Settings page now. - -= 2.2.2 = -* 07.11.2010 -* URE plugin Settings page was unavailable for some installations in multi-site environment. It is fixed by changing 'add_users' capability for administrator access to the 'edit_users'. -* Turkish translation is added. - -= 2.2.1 = -* 09.10.2010 -* Critical bug "Fatal error: Class 'SimplePie' not found in /" is fixed. This is a required update as URE plugin Settings page did not opened in previous version if you have not some of other my plugins installed :). - -= 2.2 = -* 08.10.2010 -* Technical update for WordPress 3.0 full compatibility. Staff deprecated since WordPress v.3.0 is excluded. If you use earlier WordPress versions, do not update URE plugin to v.2.2 or higher. -* Italian translation update. Thanks to [Alessandro Mariani](http://technodin.org). - -= 2.1.10 = -* 21.09.2010 -* German translation is updated. Thanks to [Peter](http://www.red-socks-reinbek.de). - -= 2.1.9 = -* 17.09.2010 -* Persian translation is added. - -= 2.1.8 = -* 16.08.2010 -* Compatibility issue with other plugins (like Flash Album Gallery), which use capabilities names with spaces inside (non valid JavaScript identifier), is fixed. -* Missed translation slots are added for some new WordPress 3.0 capabilities. Translators (former and new) are welcome to update correspondent language files. -* Brasilian Portuguese translation is added. - -= 2.1.7 = -* 07.07.2010 -* Chinese translation is added. - -= 2.1.6 = -* 06.07.2010 -* Dutch translation is added. - -= 2.1.5 = -* 18.06.2010 -* Hungarian translation is added. - -= 2.1.4 = -* 08.05.2010 -* Italian translation is added. -* Minor javascript bug (undefined parameter value was sent to the server) is fixed. - -= 2.1.3 = -* 27.04.2010 -* Japanese translation is updated. - -= 2.1.2 = -* 26.04.2010 -* Polish translation is added. - -= 2.1.1 = -* 19.04.2010 -* Form layout changed slightly to fit more long phrases in other languages -* Belorussian translation is added. Thanks to [Marsis G.](http://pc.de/). -* French, Japanese, Russian, Spanish translations are updated. - -= 2.1 = -* 17.04.2010 -* Two ways of capabilities names presentation are available for the user choice: standard WordPress name like 'edit_pages' and mouse pointer hint 'Edit pages', and vice versa - human readable form 'Edit pages' with mouse hint for WP standard name 'edit-pages'. Human readable form will be available in translated variant after correspondent translation file will be updated. -* Form layout changed slightly to fit more long phrases in other languages -* Russian, Spanish translations are updated. - -= 2.0.3 = -* 14.04.2010 -* Japanese translation is added. Thanks to [Technolog.jp](http://technolog.jp/). - -= 2.0.2 = -* 11.04.2010 -* German translation is verified and updated. Thanks to [Peter](http://www.red-socks-reinbek.de). - -= 2.0.1 = -* 04.04.2010 -* It is the critical update - security issue is fixed. Thanks to [Saharuza](http://wordpress.org/support/profile/2855662) for discover and telling me about it. -User with 'edit_users' permission could still use URL request with special parameters to remove Administrator role from Admin user or delete Admin user record. Check [this thread](http://wordpress.org/support/topic/383935) for more details. - -= 2.0 = -* 04.04.2010 -* Create New Role feature was added -* Delete self-made not used role feature was added. You can not delete any WordPress standard role. -* Change default role for new user feature was added -* Administator role and users with Administrator role permission were hidden from "Users" and "Edit User" page. This is done in case of delegation of add_user, edit_user or delete_user capabilities to some role. - -= 1.2 = -* 28.03.2010 -* User Role Editor plugin menu item is moved to the Users menu -* Roles in the dropdown list are translated -* French translation is added - -= 1.1 = -* 24.03.2010 -* Critical bug is fixed. If you click 'Reset' button before any changes to the role data saved (that is click Update button) at least one time, you met with all roles data lost problem. Backup data created automatically before the 1st role data update. If no update - no backup. Special checking for that was added. -* German translation is added. -* Spanish translation is added. - -= 1.0 = -* 22.03.2010 -* 1st release. diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_444444_256x240.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_444444_256x240.png deleted file mode 100644 index fc499fc8..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_444444_256x240.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_555555_256x240.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_555555_256x240.png deleted file mode 100644 index ec8bbf8f..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_555555_256x240.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_777620_256x240.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_777620_256x240.png deleted file mode 100644 index e0b507ce..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_777620_256x240.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_777777_256x240.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_777777_256x240.png deleted file mode 100644 index df63027b..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_777777_256x240.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_cc0000_256x240.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_cc0000_256x240.png deleted file mode 100644 index a3666247..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_cc0000_256x240.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_ffffff_256x240.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_ffffff_256x240.png deleted file mode 100644 index 470f4301..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_ffffff_256x240.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/css/index.php b/wp/wp-content/plugins/user-role-editor/css/index.php deleted file mode 100644 index 62200328..00000000 --- a/wp/wp-content/plugins/user-role-editor/css/index.php +++ /dev/null @@ -1,2 +0,0 @@ - .ui-controlgroup-item { - float: left; - margin-left: 0; - margin-right: 0; -} -.ui-controlgroup > .ui-controlgroup-item:focus, -.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { - z-index: 9999; -} -.ui-controlgroup-vertical > .ui-controlgroup-item { - display: block; - float: none; - width: 100%; - margin-top: 0; - margin-bottom: 0; - text-align: left; -} -.ui-controlgroup-vertical .ui-controlgroup-item { - box-sizing: border-box; -} -.ui-controlgroup .ui-controlgroup-label { - padding: .4em 1em; -} -.ui-controlgroup .ui-controlgroup-label span { - font-size: 80%; -} -.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { - border-left: none; -} -.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { - border-top: none; -} -.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { - border-right: none; -} -.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { - border-bottom: none; -} - -/* Spinner specific style fixes */ -.ui-controlgroup-vertical .ui-spinner-input { - - /* Support: IE8 only, Android < 4.4 only */ - width: 75%; - width: calc( 100% - 2.4em ); -} -.ui-controlgroup-vertical .ui-spinner .ui-spinner-up { - border-top-style: solid; -} - -.ui-checkboxradio-label .ui-icon-background { - box-shadow: inset 1px 1px 1px #ccc; - border-radius: .12em; - border: none; -} -.ui-checkboxradio-radio-label .ui-icon-background { - width: 16px; - height: 16px; - border-radius: 1em; - overflow: visible; - border: none; -} -.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, -.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { - background-image: none; - width: 8px; - height: 8px; - border-width: 4px; - border-style: solid; -} -.ui-checkboxradio-disabled { - pointer-events: none; -} -.ui-datepicker { - width: 17em; - padding: .2em .2em 0; - display: none; -} -.ui-datepicker .ui-datepicker-header { - position: relative; - padding: .2em 0; -} -.ui-datepicker .ui-datepicker-prev, -.ui-datepicker .ui-datepicker-next { - position: absolute; - top: 2px; - width: 1.8em; - height: 1.8em; -} -.ui-datepicker .ui-datepicker-prev-hover, -.ui-datepicker .ui-datepicker-next-hover { - top: 1px; -} -.ui-datepicker .ui-datepicker-prev { - left: 2px; -} -.ui-datepicker .ui-datepicker-next { - right: 2px; -} -.ui-datepicker .ui-datepicker-prev-hover { - left: 1px; -} -.ui-datepicker .ui-datepicker-next-hover { - right: 1px; -} -.ui-datepicker .ui-datepicker-prev span, -.ui-datepicker .ui-datepicker-next span { - display: block; - position: absolute; - left: 50%; - margin-left: -8px; - top: 50%; - margin-top: -8px; -} -.ui-datepicker .ui-datepicker-title { - margin: 0 2.3em; - line-height: 1.8em; - text-align: center; -} -.ui-datepicker .ui-datepicker-title select { - font-size: 1em; - margin: 1px 0; -} -.ui-datepicker select.ui-datepicker-month, -.ui-datepicker select.ui-datepicker-year { - width: 45%; -} -.ui-datepicker table { - width: 100%; - font-size: .9em; - border-collapse: collapse; - margin: 0 0 .4em; -} -.ui-datepicker th { - padding: .7em .3em; - text-align: center; - font-weight: bold; - border: 0; -} -.ui-datepicker td { - border: 0; - padding: 1px; -} -.ui-datepicker td span, -.ui-datepicker td a { - display: block; - padding: .2em; - text-align: right; - text-decoration: none; -} -.ui-datepicker .ui-datepicker-buttonpane { - background-image: none; - margin: .7em 0 0 0; - padding: 0 .2em; - border-left: 0; - border-right: 0; - border-bottom: 0; -} -.ui-datepicker .ui-datepicker-buttonpane button { - float: right; - margin: .5em .2em .4em; - cursor: pointer; - padding: .2em .6em .3em .6em; - width: auto; - overflow: visible; -} -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { - float: left; -} - -/* with multiple calendars */ -.ui-datepicker.ui-datepicker-multi { - width: auto; -} -.ui-datepicker-multi .ui-datepicker-group { - float: left; -} -.ui-datepicker-multi .ui-datepicker-group table { - width: 95%; - margin: 0 auto .4em; -} -.ui-datepicker-multi-2 .ui-datepicker-group { - width: 50%; -} -.ui-datepicker-multi-3 .ui-datepicker-group { - width: 33.3%; -} -.ui-datepicker-multi-4 .ui-datepicker-group { - width: 25%; -} -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { - border-left-width: 0; -} -.ui-datepicker-multi .ui-datepicker-buttonpane { - clear: left; -} -.ui-datepicker-row-break { - clear: both; - width: 100%; - font-size: 0; -} - -/* RTL support */ -.ui-datepicker-rtl { - direction: rtl; -} -.ui-datepicker-rtl .ui-datepicker-prev { - right: 2px; - left: auto; -} -.ui-datepicker-rtl .ui-datepicker-next { - left: 2px; - right: auto; -} -.ui-datepicker-rtl .ui-datepicker-prev:hover { - right: 1px; - left: auto; -} -.ui-datepicker-rtl .ui-datepicker-next:hover { - left: 1px; - right: auto; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane { - clear: right; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane button { - float: left; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, -.ui-datepicker-rtl .ui-datepicker-group { - float: right; -} -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { - border-right-width: 0; - border-left-width: 1px; -} - -/* Icons */ -.ui-datepicker .ui-icon { - display: block; - text-indent: -99999px; - overflow: hidden; - background-repeat: no-repeat; - left: .5em; - top: .3em; -} -.ui-dialog { - position: absolute; - top: 0; - left: 0; - padding: .2em; - outline: 0; -} -.ui-dialog .ui-dialog-titlebar { - padding: .4em 1em; - position: relative; -} -.ui-dialog .ui-dialog-title { - float: left; - margin: .1em 0; - white-space: nowrap; - width: 90%; - overflow: hidden; - text-overflow: ellipsis; -} -.ui-dialog .ui-dialog-titlebar-close { - position: absolute; - right: .3em; - top: 50%; - width: 20px; - margin: -10px 0 0 0; - padding: 1px; - height: 20px; -} -.ui-dialog .ui-dialog-content { - position: relative; - border: 0; - padding: .5em 1em; - background: none; - overflow: auto; -} -.ui-dialog .ui-dialog-buttonpane { - text-align: left; - border-width: 1px 0 0 0; - background-image: none; - margin-top: .5em; - padding: .3em 1em .5em .4em; -} -.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { - float: right; -} -.ui-dialog .ui-dialog-buttonpane button { - margin: .5em .4em .5em 0; - cursor: pointer; -} -.ui-dialog .ui-resizable-n { - height: 2px; - top: 0; -} -.ui-dialog .ui-resizable-e { - width: 2px; - right: 0; -} -.ui-dialog .ui-resizable-s { - height: 2px; - bottom: 0; -} -.ui-dialog .ui-resizable-w { - width: 2px; - left: 0; -} -.ui-dialog .ui-resizable-se, -.ui-dialog .ui-resizable-sw, -.ui-dialog .ui-resizable-ne, -.ui-dialog .ui-resizable-nw { - width: 7px; - height: 7px; -} -.ui-dialog .ui-resizable-se { - right: 0; - bottom: 0; -} -.ui-dialog .ui-resizable-sw { - left: 0; - bottom: 0; -} -.ui-dialog .ui-resizable-ne { - right: 0; - top: 0; -} -.ui-dialog .ui-resizable-nw { - left: 0; - top: 0; -} -.ui-draggable .ui-dialog-titlebar { - cursor: move; -} -.ui-progressbar { - height: 2em; - text-align: left; - overflow: hidden; -} -.ui-progressbar .ui-progressbar-value { - margin: -1px; - height: 100%; -} -.ui-progressbar .ui-progressbar-overlay { - background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); - height: 100%; - filter: alpha(opacity=25); /* support: IE8 */ - opacity: 0.25; -} -.ui-progressbar-indeterminate .ui-progressbar-value { - background-image: none; -} -.ui-selectmenu-menu { - padding: 0; - margin: 0; - position: absolute; - top: 0; - left: 0; - display: none; -} -.ui-selectmenu-menu .ui-menu { - overflow: auto; - overflow-x: hidden; - padding-bottom: 1px; -} -.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { - font-size: 1em; - font-weight: bold; - line-height: 1.5; - padding: 2px 0.4em; - margin: 0.5em 0 0 0; - height: auto; - border: 0; -} -.ui-selectmenu-open { - display: block; -} -.ui-selectmenu-text { - display: block; - margin-right: 20px; - overflow: hidden; - text-overflow: ellipsis; -} -.ui-selectmenu-button.ui-button { - text-align: left; - white-space: nowrap; - width: 14em; -} -.ui-selectmenu-icon.ui-icon { - float: right; - margin-top: 0; -} -.ui-slider { - position: relative; - text-align: left; -} -.ui-slider .ui-slider-handle { - position: absolute; - z-index: 2; - width: 1.2em; - height: 1.2em; - cursor: default; - -ms-touch-action: none; - touch-action: none; -} -.ui-slider .ui-slider-range { - position: absolute; - z-index: 1; - font-size: .7em; - display: block; - border: 0; - background-position: 0 0; -} - -/* support: IE8 - See #6727 */ -.ui-slider.ui-state-disabled .ui-slider-handle, -.ui-slider.ui-state-disabled .ui-slider-range { - filter: inherit; -} - -.ui-slider-horizontal { - height: .8em; -} -.ui-slider-horizontal .ui-slider-handle { - top: -.3em; - margin-left: -.6em; -} -.ui-slider-horizontal .ui-slider-range { - top: 0; - height: 100%; -} -.ui-slider-horizontal .ui-slider-range-min { - left: 0; -} -.ui-slider-horizontal .ui-slider-range-max { - right: 0; -} - -.ui-slider-vertical { - width: .8em; - height: 100px; -} -.ui-slider-vertical .ui-slider-handle { - left: -.3em; - margin-left: 0; - margin-bottom: -.6em; -} -.ui-slider-vertical .ui-slider-range { - left: 0; - width: 100%; -} -.ui-slider-vertical .ui-slider-range-min { - bottom: 0; -} -.ui-slider-vertical .ui-slider-range-max { - top: 0; -} -.ui-spinner { - position: relative; - display: inline-block; - overflow: hidden; - padding: 0; - vertical-align: middle; -} -.ui-spinner-input { - border: none; - background: none; - color: inherit; - padding: .222em 0; - margin: .2em 0; - vertical-align: middle; - margin-left: .4em; - margin-right: 2em; -} -.ui-spinner-button { - width: 1.6em; - height: 50%; - font-size: .5em; - padding: 0; - margin: 0; - text-align: center; - position: absolute; - cursor: default; - display: block; - overflow: hidden; - right: 0; -} -/* more specificity required here to override default borders */ -.ui-spinner a.ui-spinner-button { - border-top-style: none; - border-bottom-style: none; - border-right-style: none; -} -.ui-spinner-up { - top: 0; -} -.ui-spinner-down { - bottom: 0; -} -.ui-tabs { - position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ - padding: .2em; -} -.ui-tabs .ui-tabs-nav { - margin: 0; - padding: .2em .2em 0; -} -.ui-tabs .ui-tabs-nav li { - list-style: none; - float: left; - position: relative; - top: 0; - margin: 1px .2em 0 0; - border-bottom-width: 0; - padding: 0; - white-space: nowrap; -} -.ui-tabs .ui-tabs-nav .ui-tabs-anchor { - float: left; - padding: .5em 1em; - text-decoration: none; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-active { - margin-bottom: -1px; - padding-bottom: 1px; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, -.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, -.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { - cursor: text; -} -.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { - cursor: pointer; -} -.ui-tabs .ui-tabs-panel { - display: block; - border-width: 0; - padding: 1em 1.4em; - background: none; -} -.ui-tooltip { - padding: 8px; - position: absolute; - z-index: 9999; - max-width: 300px; -} -body .ui-tooltip { - border-width: 2px; -} - -/* Component containers -----------------------------------*/ -.ui-widget { - font-family: Arial,Helvetica,sans-serif; - font-size: 1em; -} -.ui-widget .ui-widget { - font-size: 1em; -} -.ui-widget input, -.ui-widget select, -.ui-widget textarea, -.ui-widget button { - font-family: Arial,Helvetica,sans-serif; - font-size: 1em; -} -.ui-widget.ui-widget-content { - border: 1px solid #c5c5c5; -} -.ui-widget-content { - border: 1px solid #dddddd; - background: #ffffff; - color: #333333; -} -.ui-widget-content a { - color: #333333; -} -.ui-widget-header { - border: 1px solid #dddddd; - background: #e9e9e9; - color: #333333; - font-weight: bold; -} -.ui-widget-header a { - color: #333333; -} - -/* Interaction states -----------------------------------*/ -.ui-state-default, -.ui-widget-content .ui-state-default, -.ui-widget-header .ui-state-default, -.ui-button, - -/* We use html here because we need a greater specificity to make sure disabled -works properly when clicked or hovered */ -html .ui-button.ui-state-disabled:hover, -html .ui-button.ui-state-disabled:active { - border: 1px solid #c5c5c5; - background: #f6f6f6; - font-weight: normal; - color: #454545; -} -.ui-state-default a, -.ui-state-default a:link, -.ui-state-default a:visited, -a.ui-button, -a:link.ui-button, -a:visited.ui-button, -.ui-button { - color: #454545; - text-decoration: none; -} -.ui-state-hover, -.ui-widget-content .ui-state-hover, -.ui-widget-header .ui-state-hover, -.ui-state-focus, -.ui-widget-content .ui-state-focus, -.ui-widget-header .ui-state-focus, -.ui-button:hover, -.ui-button:focus { - border: 1px solid #cccccc; - background: #ededed; - font-weight: normal; - color: #2b2b2b; -} -.ui-state-hover a, -.ui-state-hover a:hover, -.ui-state-hover a:link, -.ui-state-hover a:visited, -.ui-state-focus a, -.ui-state-focus a:hover, -.ui-state-focus a:link, -.ui-state-focus a:visited, -a.ui-button:hover, -a.ui-button:focus { - color: #2b2b2b; - text-decoration: none; -} - -.ui-visual-focus { - box-shadow: 0 0 3px 1px rgb(94, 158, 214); -} -.ui-state-active, -.ui-widget-content .ui-state-active, -.ui-widget-header .ui-state-active, -a.ui-button:active, -.ui-button:active, -.ui-button.ui-state-active:hover { - border: 1px solid #003eff; - background: #007fff; - font-weight: normal; - color: #ffffff; -} -.ui-icon-background, -.ui-state-active .ui-icon-background { - border: #003eff; - background-color: #ffffff; -} -.ui-state-active a, -.ui-state-active a:link, -.ui-state-active a:visited { - color: #ffffff; - text-decoration: none; -} - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, -.ui-widget-content .ui-state-highlight, -.ui-widget-header .ui-state-highlight { - border: 1px solid #dad55e; - background: #fffa90; - color: #777620; -} -.ui-state-checked { - border: 1px solid #dad55e; - background: #fffa90; -} -.ui-state-highlight a, -.ui-widget-content .ui-state-highlight a, -.ui-widget-header .ui-state-highlight a { - color: #777620; -} -.ui-state-error, -.ui-widget-content .ui-state-error, -.ui-widget-header .ui-state-error { - border: 1px solid #f1a899; - background: #fddfdf; - color: #5f3f3f; -} -.ui-state-error a, -.ui-widget-content .ui-state-error a, -.ui-widget-header .ui-state-error a { - color: #5f3f3f; -} -.ui-state-error-text, -.ui-widget-content .ui-state-error-text, -.ui-widget-header .ui-state-error-text { - color: #5f3f3f; -} -.ui-priority-primary, -.ui-widget-content .ui-priority-primary, -.ui-widget-header .ui-priority-primary { - font-weight: bold; -} -.ui-priority-secondary, -.ui-widget-content .ui-priority-secondary, -.ui-widget-header .ui-priority-secondary { - opacity: .7; - filter:Alpha(Opacity=70); /* support: IE8 */ - font-weight: normal; -} -.ui-state-disabled, -.ui-widget-content .ui-state-disabled, -.ui-widget-header .ui-state-disabled { - opacity: .35; - filter:Alpha(Opacity=35); /* support: IE8 */ - background-image: none; -} -.ui-state-disabled .ui-icon { - filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ -} - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { - width: 16px; - height: 16px; -} -.ui-icon, -.ui-widget-content .ui-icon { - background-image: url("images/ui-icons_444444_256x240.png"); -} -.ui-widget-header .ui-icon { - background-image: url("images/ui-icons_444444_256x240.png"); -} -.ui-state-hover .ui-icon, -.ui-state-focus .ui-icon, -.ui-button:hover .ui-icon, -.ui-button:focus .ui-icon { - background-image: url("images/ui-icons_555555_256x240.png"); -} -.ui-state-active .ui-icon, -.ui-button:active .ui-icon { - background-image: url("images/ui-icons_ffffff_256x240.png"); -} -.ui-state-highlight .ui-icon, -.ui-button .ui-state-highlight.ui-icon { - background-image: url("images/ui-icons_777620_256x240.png"); -} -.ui-state-error .ui-icon, -.ui-state-error-text .ui-icon { - background-image: url("images/ui-icons_cc0000_256x240.png"); -} -.ui-button .ui-icon { - background-image: url("images/ui-icons_777777_256x240.png"); -} - -/* positioning */ -.ui-icon-blank { background-position: 16px 16px; } -.ui-icon-caret-1-n { background-position: 0 0; } -.ui-icon-caret-1-ne { background-position: -16px 0; } -.ui-icon-caret-1-e { background-position: -32px 0; } -.ui-icon-caret-1-se { background-position: -48px 0; } -.ui-icon-caret-1-s { background-position: -65px 0; } -.ui-icon-caret-1-sw { background-position: -80px 0; } -.ui-icon-caret-1-w { background-position: -96px 0; } -.ui-icon-caret-1-nw { background-position: -112px 0; } -.ui-icon-caret-2-n-s { background-position: -128px 0; } -.ui-icon-caret-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -65px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -65px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 1px -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-on { background-position: -96px -144px; } -.ui-icon-radio-off { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-all, -.ui-corner-top, -.ui-corner-left, -.ui-corner-tl { - border-top-left-radius: 3px; -} -.ui-corner-all, -.ui-corner-top, -.ui-corner-right, -.ui-corner-tr { - border-top-right-radius: 3px; -} -.ui-corner-all, -.ui-corner-bottom, -.ui-corner-left, -.ui-corner-bl { - border-bottom-left-radius: 3px; -} -.ui-corner-all, -.ui-corner-bottom, -.ui-corner-right, -.ui-corner-br { - border-bottom-right-radius: 3px; -} - -/* Overlays */ -.ui-widget-overlay { - background: #aaaaaa; - opacity: .3; - filter: Alpha(Opacity=30); /* support: IE8 */ -} -.ui-widget-shadow { - -webkit-box-shadow: 0px 0px 5px #666666; - box-shadow: 0px 0px 5px #666666; -} diff --git a/wp/wp-content/plugins/user-role-editor/css/jquery-ui.min.css b/wp/wp-content/plugins/user-role-editor/css/jquery-ui.min.css deleted file mode 100644 index f5c97f02..00000000 --- a/wp/wp-content/plugins/user-role-editor/css/jquery-ui.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! jQuery UI - v1.12.1 - 2020-11-08 -* http://jqueryui.com -* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css -* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif -* Copyright jQuery Foundation and other contributors; Licensed MIT */ - -.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.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-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;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;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}.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-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/css/multiple-select.css b/wp/wp-content/plugins/user-role-editor/css/multiple-select.css deleted file mode 100644 index 753e1fe5..00000000 --- a/wp/wp-content/plugins/user-role-editor/css/multiple-select.css +++ /dev/null @@ -1,183 +0,0 @@ -@charset "UTF-8"; -/** - * @author zhixin wen - */ -.ms-offscreen { - clip: rect(0 0 0 0) !important; - width: 1px !important; - height: 1px !important; - border: 0 !important; - margin: 0 !important; - padding: 0 !important; - overflow: hidden !important; - position: absolute !important; - outline: 0 !important; - left: auto !important; - top: auto !important; } - -.ms-parent { - display: inline-block; - position: relative; - vertical-align: middle; } - -.ms-choice { - display: block; - width: 100%; - height: 26px; - padding: 0; - overflow: hidden; - cursor: pointer; - border: 1px solid #aaa; - text-align: left; - white-space: nowrap; - line-height: 26px; - color: #444; - text-decoration: none; - border-radius: 4px; - background-color: #fff; } - .ms-choice.disabled { - background-color: #f4f4f4; - background-image: none; - border: 1px solid #ddd; - cursor: default; } - .ms-choice > span { - position: absolute; - top: 0; - left: 0; - right: 20px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - display: block; - padding-left: 8px; } - .ms-choice > span.placeholder { - color: #999; } - .ms-choice > div.icon-close { - position: absolute; - top: 0px; - right: 16px; - height: 100%; - width: 16px; } - .ms-choice > div.icon-close:before { - content: 'Ă—'; - color: #888; - font-weight: bold; - position: absolute; - top: 50%; - margin-top: -14px; } - .ms-choice > div.icon-close:hover:before { - color: #333; } - .ms-choice > div.icon-caret { - position: absolute; - width: 0; - height: 0; - top: 50%; - right: 8px; - margin-top: -2px; - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; } - .ms-choice > div.icon-caret.open { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; } - -.ms-drop { - width: auto; - min-width: 100%; - overflow: hidden; - display: none; - margin-top: -1px; - padding: 0; - position: absolute; - z-index: 1000; - background: #fff; - color: #000; - border: 1px solid #aaa; - border-radius: 4px; } - .ms-drop.bottom { - top: 100%; - box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15); } - .ms-drop.top { - bottom: 100%; - box-shadow: 0 -4px 5px rgba(0, 0, 0, 0.15); } - -.ms-search { - display: inline-block; - margin: 0; - min-height: 26px; - padding: 2px; - position: relative; - white-space: nowrap; - width: 100%; - z-index: 10000; - box-sizing: border-box; } - .ms-search input { - width: 100%; - height: auto !important; - min-height: 24px; - padding: 0 5px; - margin: 0; - outline: 0; - font-family: sans-serif; - border: 1px solid #aaa; - border-radius: 5px; - box-shadow: none; } - -.ms-drop ul { - overflow: auto; - margin: 0; - padding: 0; } - .ms-drop ul > li { - list-style: none; - display: list-item; - background-image: none; - position: static; - padding: .25rem 8px; } - .ms-drop ul > li .disabled { - font-weight: normal !important; - opacity: .35; - filter: Alpha(Opacity=35); - cursor: default; } - .ms-drop ul > li.multiple { - display: block; - float: left; } - .ms-drop ul > li.group { - clear: both; } - .ms-drop ul > li.multiple label { - width: 100%; - display: block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; } - .ms-drop ul > li label { - position: relative; - padding-left: 1.25rem; - margin-bottom: 0; - font-weight: normal; - display: block; - white-space: nowrap; - cursor: pointer; } - .ms-drop ul > li label.optgroup { - font-weight: bold; } - .ms-drop ul > li.hide-radio { - padding: 0; } - .ms-drop ul > li.hide-radio:focus, .ms-drop ul > li.hide-radio:hover { - background-color: #f8f9fa; } - .ms-drop ul > li.hide-radio.selected { - color: #fff; - background-color: #007bff; } - .ms-drop ul > li.hide-radio label { - margin-bottom: 0; - padding: 5px 8px; } - .ms-drop ul > li.hide-radio input { - display: none; } - .ms-drop ul > li.option-level-1 label { - padding-left: 28px; } - -.ms-drop input[type="radio"], .ms-drop input[type="checkbox"] { - position: absolute; - margin-top: .3rem; - margin-left: -1.25rem; } - -.ms-drop .ms-no-results { - display: none; } diff --git a/wp/wp-content/plugins/user-role-editor/css/multiple-select.min.css b/wp/wp-content/plugins/user-role-editor/css/multiple-select.min.css deleted file mode 100644 index 5a6f1b19..00000000 --- a/wp/wp-content/plugins/user-role-editor/css/multiple-select.min.css +++ /dev/null @@ -1,10 +0,0 @@ -/** - * multiple-select - Multiple select is a jQuery plugin to select multiple elements with checkboxes :). - * - * @version v1.5.2 - * @homepage http://multiple-select.wenzhixin.net.cn - * @author wenzhixin (http://wenzhixin.net.cn/) - * @license MIT - */ - -@charset "UTF-8";.ms-offscreen{clip:rect(0 0 0 0)!important;width:1px!important;height:1px!important;border:0!important;margin:0!important;padding:0!important;overflow:hidden!important;position:absolute!important;outline:0!important;left:auto!important;top:auto!important}.ms-parent{display:inline-block;position:relative;vertical-align:middle}.ms-choice{display:block;width:100%;height:26px;padding:0;overflow:hidden;cursor:pointer;border:1px solid #aaa;text-align:left;white-space:nowrap;line-height:26px;color:#444;text-decoration:none;border-radius:4px;background-color:#fff}.ms-choice.disabled{background-color:#f4f4f4;background-image:none;border:1px solid #ddd;cursor:default}.ms-choice>span{position:absolute;top:0;left:0;right:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;padding-left:8px}.ms-choice>span.placeholder{color:#999}.ms-choice>div.icon-close{position:absolute;top:0;right:16px;height:100%;width:16px}.ms-choice>div.icon-close:before{content:'Ă—';color:#888;font-weight:bold;position:absolute;top:50%;margin-top:-14px}.ms-choice>div.icon-close:hover:before{color:#333}.ms-choice>div.icon-caret{position:absolute;width:0;height:0;top:50%;right:8px;margin-top:-2px;border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px}.ms-choice>div.icon-caret.open{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.ms-drop{width:auto;min-width:100%;overflow:hidden;display:none;margin-top:-1px;padding:0;position:absolute;z-index:1000;background:#fff;color:#000;border:1px solid #aaa;border-radius:4px}.ms-drop.bottom{top:100%;box-shadow:0 4px 5px rgba(0,0,0,0.15)}.ms-drop.top{bottom:100%;box-shadow:0 -4px 5px rgba(0,0,0,0.15)}.ms-search{display:inline-block;margin:0;min-height:26px;padding:2px;position:relative;white-space:nowrap;width:100%;z-index:10000;box-sizing:border-box}.ms-search input{width:100%;height:auto!important;min-height:24px;padding:0 5px;margin:0;outline:0;font-family:sans-serif;border:1px solid #aaa;border-radius:5px;box-shadow:none}.ms-drop ul{overflow:auto;margin:0;padding:0}.ms-drop ul>li{list-style:none;display:list-item;background-image:none;position:static;padding:.25rem 8px}.ms-drop ul>li .disabled{font-weight:normal!important;opacity:.35;filter:Alpha(Opacity=35);cursor:default}.ms-drop ul>li.multiple{display:block;float:left}.ms-drop ul>li.group{clear:both}.ms-drop ul>li.multiple label{width:100%;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ms-drop ul>li label{position:relative;padding-left:1.25rem;margin-bottom:0;font-weight:normal;display:block;white-space:nowrap;cursor:pointer}.ms-drop ul>li label.optgroup{font-weight:bold}.ms-drop ul>li.hide-radio{padding:0}.ms-drop ul>li.hide-radio:focus,.ms-drop ul>li.hide-radio:hover{background-color:#f8f9fa}.ms-drop ul>li.hide-radio.selected{color:#fff;background-color:#007bff}.ms-drop ul>li.hide-radio label{margin-bottom:0;padding:5px 8px}.ms-drop ul>li.hide-radio input{display:none}.ms-drop ul>li.option-level-1 label{padding-left:28px}.ms-drop input[type="radio"],.ms-drop input[type="checkbox"]{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.ms-drop .ms-no-results{display:none} \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/css/multiple-select.png b/wp/wp-content/plugins/user-role-editor/css/multiple-select.png deleted file mode 100644 index b1282ce4..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/css/multiple-select.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/css/ure-admin.css b/wp/wp-content/plugins/user-role-editor/css/ure-admin.css deleted file mode 100644 index 492510f5..00000000 --- a/wp/wp-content/plugins/user-role-editor/css/ure-admin.css +++ /dev/null @@ -1,294 +0,0 @@ -/* - Document : ure_admin - Created on : 10.03.2010 - Author : Vladimir Garagulya - Description: - User Role Editor plugin Admin Settings Page CSS -*/ - -/* - Syntax recommendation http://www.w3.org/TR/REC-CSS2/ -*/ - - -.txt_left { - text-align: left; -} -.txt_center { - text-align: center; -} -.txt_right { - text-align: right; -} - -.nowrap { - white-space: nowrap; -} - -img.input_radio { - vertical-align: middle; -} - -a.ure_rsb_link { - padding:4px; - display:block; - padding-left:25px; - background-repeat:no-repeat; - background-position:5px 50%; - text-decoration:none; - border:none; -} - -a.ure_rsb_link:hover { - border-bottom-width:1px; -} - -input.warning:hover, a.warning:hover { - color: red; -} - -#ure_container { - display: table; - width: 100%; -} - -.ure-table { - display: table; -} - -.ure-table-cell { - display: table-cell; - margin: 0; - padding: 0; - vertical-align: top; -} - -#ure-sidebar { - width: 270px; - padding-left: 20px; -} - -.filtered, .hidden { - display: none; -} - -#user_role_editor { - -} - - -#ure_form_controls { -} - -#ure_role_selector { - padding: 10px 0 0 10px; -} - -#ure_user_caps_header { - padding: 10px 0 0 10px; - font-size: 16px; -} - -#ure_user_caps_title { - font-weight: bold; -} - -#ure_role_select_label { - font-size: 16px; - font-weight: bold; -} - -.ure-caps-option { - padding-left: 20px; -} - -#ure_caps_container { - width: 100%; - -} - -#ure_toolbar { - margin-top: 10px; - border: 1px solid #dfdfdf; - -webkit-box-shadow: inset 0 1px 0 #fff; - box-shadow: inset 0 1px 0 #fff; - -webkit-border-radius: 3px; - border-radius: 3px; - background: #f5f5f5; - padding: 5px; -} - -.ure_toolbar_button { - width: 100%; - margin-bottom: 3px; -} - -#ure_update { - width: 100%; - margin-top: 10px; - margin-bottom: 10px; -} - -#ure_service_tools { - margin-top: 10px; -} - -.ure-modal-dialog { - display: none; - padding: 10px; -} - -.ure-label { - clear: left; - float: left; - display: block; - width: 150px; -} - -.ure-input { - float: left; - display: inline; - width: 200px; - margin-bottom: 5px; -} - -#ure_user_roles { - vertical-align: text-top; - padding-right: 10px; - padding-top: 5px; - font-size: 1.1em; - border-top: 1px solid #cccccc; - border-right: 1px solid #cccccc; - min-width: 200px; - width: 20%; -} - -.ure-user-role-section-title { - margin-top: 5px; - margin-bottom: 5px; - font-weight: bold; -} - -/* Multipe select */ -.countLabel { - color:Gray; - font-style:italic; -} - -.storageBox { - display:none; -} - -.copiedOption { - background-color:Yellow; -} - -.ure-caps-cell { - vertical-align:top; - padding-top: 5px; -} - - -.ure-cap-div { - white-space: nowrap; -} - - -#other_default_roles { - display: block; - margin: 10px; -} - -.ure-dialog { - display: none; -} - -#ure_admin_menu_access_table td { - cursor: pointer; -} - -#ure_admin_menu_access_table tr:hover { - background-color: #04a4cc; - color: #ffffff; -} - -.ure_table_row_selected { - background-color: #04a4cc; - color: #ffffff; -} - -#ure_caps_groups_td { - padding:0 10px 0 10px; - min-width:25%; - border-right: 1px solid #cccccc; -} - -#ure_caps_td { - width:60%; - padding-left: 10px; -} - -#ure_toolbar_td { - width: 15%; - min-width:200px; - padding-left: 10px; -} - - -#ure_editor_options { - margin-bottom: 10px; -} - -#ure_caps_groups_title { - min-width: 250px; - vertical-align:middle; - border-bottom: 1px solid #cccccc; - border-right: 1px solid #cccccc; -} - -#ure_caps_select { - vertical-align:middle; - border-bottom: 1px solid #cccccc; - padding: 5px 5px 5px 10px; -} - -#ure_toolbar_title { - border-bottom: 1px solid #cccccc; -} - -#ure_caps_groups_list .ui-selecting { - background: #DDDDDD; -} - -#ure_caps_groups_list .ui-selected { - background: #CCCCCC; - color: #444444; -} - -#ure_caps_groups_list li { - min-height: 20px; - line-height: 20px; - cursor: pointer; -} - -.plugins { - color: #444444; -} - - -#ure_caps_list_container { - float: left; - width: 100%; - overflow: auto; - min-height: 600px; - max-height: 720px; -} - -#ure_caps_list { - -moz-column-count: 1; - -webkit-column-count: 1; - column-count: 1; - column-width: auto; - display: inline-block; - min-width: 100%; -} \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/images/admin-menu-editor-pro.jpg b/wp/wp-content/plugins/user-role-editor/images/admin-menu-editor-pro.jpg deleted file mode 100644 index da145b17..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/images/admin-menu-editor-pro.jpg and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/images/ajax-loader.gif b/wp/wp-content/plugins/user-role-editor/images/ajax-loader.gif deleted file mode 100644 index fe62f3de..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/images/ajax-loader.gif and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/images/changelog-icon.png b/wp/wp-content/plugins/user-role-editor/images/changelog-icon.png deleted file mode 100644 index 6026d65b..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/images/changelog-icon.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/images/donate-icon.png b/wp/wp-content/plugins/user-role-editor/images/donate-icon.png deleted file mode 100644 index ae4f2e7e..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/images/donate-icon.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/images/faq-icon.png b/wp/wp-content/plugins/user-role-editor/images/faq-icon.png deleted file mode 100644 index b284bb29..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/images/faq-icon.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/images/help.png b/wp/wp-content/plugins/user-role-editor/images/help.png deleted file mode 100644 index 5c870176..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/images/help.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/images/index.php b/wp/wp-content/plugins/user-role-editor/images/index.php deleted file mode 100644 index 4e6c07c7..00000000 --- a/wp/wp-content/plugins/user-role-editor/images/index.php +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/images/remove-16.png b/wp/wp-content/plugins/user-role-editor/images/remove-16.png deleted file mode 100644 index c9219f8d..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/images/remove-16.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/images/user-role-editor-icon.png b/wp/wp-content/plugins/user-role-editor/images/user-role-editor-icon.png deleted file mode 100644 index 1b67d843..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/images/user-role-editor-icon.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/images/user-role-editor-page-icon.png b/wp/wp-content/plugins/user-role-editor/images/user-role-editor-page-icon.png deleted file mode 100644 index a8baad39..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/images/user-role-editor-page-icon.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/images/user-role-editor-pro-728x90.jpg b/wp/wp-content/plugins/user-role-editor/images/user-role-editor-pro-728x90.jpg deleted file mode 100644 index e8754e92..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/images/user-role-editor-pro-728x90.jpg and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/images/vladimir.png b/wp/wp-content/plugins/user-role-editor/images/vladimir.png deleted file mode 100644 index 0ebfdf2d..00000000 Binary files a/wp/wp-content/plugins/user-role-editor/images/vladimir.png and /dev/null differ diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/admin-notice.php b/wp/wp-content/plugins/user-role-editor/includes/classes/admin-notice.php deleted file mode 100644 index 3fe0e19d..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/admin-notice.php +++ /dev/null @@ -1,37 +0,0 @@ -message = $message; - $this->message_class = $message_class; - - add_action('admin_notices', array($this, 'render') ); - } - // end of __construct() - - - public function render() { - - printf('

%s

', $this->message_class, $this->message ); - - } - // end of render() - -} -// end of class URE_Admin_Notice diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/advertisement.php b/wp/wp-content/plugins/user-role-editor/includes/classes/advertisement.php deleted file mode 100644 index e34083fd..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/advertisement.php +++ /dev/null @@ -1,113 +0,0 @@ -init(); - - } - // end of __construct - - /** - * Returns random number not included into input array - * - * @param array $used - array of numbers used already - * - * @return int - */ - private function rand_unique( $max_ind, $used = array(-1) ) { - if ( $max_ind<0 ) { - $max_ind = 0; - } - $index = wp_rand( 0, $max_ind ); - $iterations = 0; - while ( in_array( $index, $used ) && $iterations<=$max_ind * 3 ) { - $index = wp_rand( 0, $max_ind ); - $iterations++; - } - - return $index; - } - // return rand_unique() - - - private function init() { - - $this->slots = array(); - $used = array(-1); - $max_ind = $this->slots_quantity - 1; - $index = $this->rand_unique( $max_ind, $used ); - $this->slots[$index] = $this->admin_menu_editor(); - /* - $used[] = $index; - $index = $this->rand_unique( $used, $max_ind ); - $this->slots[$index] = $this->some_other_slot(); - ksort( $this->slots ); - * - */ - } - // end of init() - -/* - private function some_other_slot() { - $output = ' -
- bla-bla-bla; -
'; - return $output; - } -*/ - - // content of Admin Menu Editor advertisement slot - private function admin_menu_editor() { - - $output = ' -
- - Admin Menu Editor Pro - -
- '; - - return $output; - } - // end of admin_menu_editor() - - - /** - * Output all existed ads slots - */ - public function display() { - - if ( empty( $this->slots ) ) { - return; - } -?> -
-slots as $slot) { - echo $slot . "\n"; - } -?> -
- lib = URE_Lib::get_instance(); - $this->debug = ( defined('WP_PHP_UNIT_TEST') && WP_PHP_UNIT_TEST==true ); - - } - // end of __construct() - - - protected function get_action() { - $action = $this->lib->get_request_var( 'sub_action', 'post' ); - if ( empty( $action ) ) { - $action = $this->lib->get_request_var( 'sub_action', 'get' ); - } - - return $action; - } - // end of get_action() - - - protected function get_required_cap() { - - if ( $this->action=='grant_roles' || $this->action=='get_user_roles' ) { - $cap = 'promote_users'; - } else { - $cap = URE_Own_Capabilities::get_key_capability(); - } - - return $cap; - } - // end of get_required_cap() - - - protected function valid_nonce() { - - if ( !isset( $_REQUEST['wp_nonce'] ) || !wp_verify_nonce( $_REQUEST['wp_nonce'], 'user-role-editor' ) ) { - echo wp_json_encode( array('result'=>'error', 'message'=>'URE: Wrong or expired request') ); - return false; - } else { - return true; - } - - } - // end of check_nonce() - - - protected function user_can() { - - $capability = $this->get_required_cap(); - if ( !current_user_can( $capability ) ) { - echo wp_json_encode( array('result'=>'error', 'message'=>'URE: Insufficient permissions') ); - return false; - } else { - return true; - } - } - // end of check_user_cap() - - - protected function add_role() { - - $editor = URE_Editor::get_instance(); - $response = $editor->add_new_role(); - - $answer = array( - 'result'=>$response['result'], - 'role_id'=>$response['role_id'], - 'role_name'=>$response['role_name'], - 'message'=>$response['message'] - ); - - return $answer; - } - // end of add_role() - - - protected function update_role() { - - $editor = URE_Editor::get_instance(); - $response = $editor->update_role(); - - $answer = array( - 'result'=>$response['result'], - 'role_id'=>$response['role_id'], - 'role_name'=>$response['role_name'], - 'message'=>$response['message'] - ); - - return $answer; - } - // end of add_role() - - - protected function add_capability() { - - $response = URE_Capability::add( 'role' ); - $editor = URE_Editor::get_instance(); - $editor->init1(); - $message = $editor->init_current_role_name(); - if ( empty( $message ) ) { - $view = new URE_View(); - $html = $view->_show_capabilities( true, true ); - } else { - $html = ''; - $response['result'] = 'error'; - $response['message'] = $message; - } - - $answer = array('result'=>$response['result'], 'html'=>$html, 'message'=>$response['message']); - - return $answer; - } - // end of add_capability() - - - protected function delete_capability() { - - $result = URE_Capability::delete(); - if ( is_array( $result ) ) { - $notification = $result['message']; - $deleted_caps = $result['deleted_caps']; - } else { - $notification = $result; - $deleted_caps = array(); - } - - $answer = array('result'=>'success', 'deleted_caps'=>$deleted_caps, 'message'=>$notification); - - return $answer; - } - // end of delete_cap() - - - protected function delete_role() { - - $editor = URE_Editor::get_instance(); - $response = $editor->delete_role(); - $answer = array( - 'result'=>$response['result'], - 'message'=>$response['message'], - 'deleted_roles'=> $response['deleted_roles'] - ); - - return $answer; - } - // end of delete_role() - - - protected function rename_role() { - - $editor = URE_Editor::get_instance(); - $response = $editor->rename_role(); - $answer = array( - 'result'=>$response['result'], - 'message'=>$response['message'], - 'role_id'=> $response['role_id'], - 'role_name'=>$response['role_name'] - ); - - return $answer; - } - // end of rename_role() - - - protected function get_caps_to_remove() { - - $html = URE_Role_View::caps_to_remove_html(); - $answer = array('result'=>'success', 'html'=>$html, 'message'=>'success'); - - return $answer; - } - // end of get_caps_to_remove() - - - protected function get_users_without_role() { - - $new_role = $this->lib->get_request_var( 'new_role', 'post' ); - if ( empty( $new_role ) ) { - $answer = array('result'=>'error', 'message'=>'Provide new role'); - return $answer; - } - - $assign_role = $this->lib->get_assign_role(); - if ( $new_role==='no_rights') { - $assign_role->create_no_rights_role(); - } - - $wp_roles = wp_roles(); - if ( !isset( $wp_roles->roles[$new_role] ) ) { - $answer = array('result'=>'error', 'message'=>'Selected new role does not exist'); - return $answer; - } - - $users = $assign_role->get_users_without_role(); - $answer = array( - 'result'=>'success', - 'users'=>$users, - 'new_role'=>$new_role, - 'message'=>'success' - ); - - return $answer; - } - // end of get_users_without_role() - - - protected function grant_roles() { - - $answer = URE_Grant_Roles::grant_roles(); - - return $answer; - - } - // end of grant_roles() - - - protected function get_user_roles() { - - $answer = URE_Grant_Roles::get_user_roles(); - - return $answer; - - } - // end of get_user_roles() - - - protected function get_role_caps() { - - $role = $this->lib->get_request_var('role', 'post' ); - if ( empty( $role ) ) { - $answer = array('result'=>'error', 'message'=>'Provide role ID'); - return $answer; - } - - $wp_roles = wp_roles(); - if ( !isset( $wp_roles->roles[$role] ) ) { - $answer = array('result'=>'error', 'message'=>'Requested role does not exist'); - return $answer; - } - - $active_items = URE_Role_Additional_Options::get_active_items(); - if ( isset( $active_items[$role] ) ) { - $role_options = $active_items[$role]; - } else { - $role_options = array(); - } - - $caps = array(); - foreach( $wp_roles->roles[$role]['capabilities'] as $cap_id=>$allowed ) { - $cap = URE_Capability::escape( $cap_id ); - $caps[$cap] = $allowed; - } - - $answer = array( - 'result'=>'success', - 'message'=>'Role capabilities retrieved successfully', - 'role_id'=>$role, - 'role_name'=>$wp_roles->roles[$role]['name'], - 'caps'=>$caps, - 'options'=>$role_options - ); - - return $answer; - } - // end of get_role_caps() - - - protected function hide_pro_banner() { - - $this->lib->put_option('ure_hide_pro_banner', 1); - $this->lib->flush_options(); - - $answer = array( - 'result'=>'success', - 'message'=>'Pro banner was hidden' - ); - - return $answer; - } - // end of hide_pro_banner() - - - protected function _dispatch() { - - switch ( $this->action ) { - case 'update_role': - $answer = $this->update_role(); - break; - case 'add_role': - $answer = $this->add_role(); - break; - case 'add_capability': - $answer = $this->add_capability(); - break; - case 'delete_capability': - $answer = $this->delete_capability(); - break; - case 'delete_role': - $answer = $this->delete_role(); - break; - case 'get_caps_to_remove': - $answer = $this->get_caps_to_remove(); - break; - case 'get_users_without_role': - $answer = $this->get_users_without_role(); - break; - case 'grant_roles': - $answer = $this->grant_roles(); - break; - case 'get_user_roles': - $answer = $this->get_user_roles(); - break; - case 'get_role_caps': - $answer = $this->get_role_caps(); - break; - case 'rename_role': - $answer = $this->rename_role(); - break; - case 'hide_pro_banner': - $answer = $this->hide_pro_banner(); - break; - default: - $answer = array('result' => 'error', 'message' => 'Unknown action "' . $this->action . '"'); - } - - return $answer; - } - // end of _dispatch() - - - /** - * AJAX requests dispatcher - */ - public function dispatch() { - - $this->action = $this->get_action(); - if ( !$this->valid_nonce() || !$this->user_can() ) { - die; - } - - $answer = $this->_dispatch(); - - $json_answer = wp_json_encode($answer); - echo $json_answer; - die; - - } - // end of dispatch() - -} -// end of URE_Ajax_Processor diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/assign-role.php b/wp/wp-content/plugins/user-role-editor/includes/classes/assign-role.php deleted file mode 100644 index 698d78ef..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/assign-role.php +++ /dev/null @@ -1,177 +0,0 @@ -lib = URE_Lib::get_instance(); - $this->quick_count = $this->count_quick_or_thoroughly(); - } - // end of __construct() - - - public function create_no_rights_role() { - - $role_id = 'no_rights'; - $role_name = 'No rights'; - - $wp_roles = wp_roles(); - if ( isset( $wp_roles->roles[$role_id] ) ) { - return; - } - - add_role( $role_id, $role_name, array() ); - - } - // end of create_no_rights_role() - - - private function count_quick_or_thoroughly() { - - $quick_count = true; - if ( defined('URE_COUNT_USERS_WITHOUT_ROLE_THOROUGHLY') && URE_COUNT_USERS_WITHOUT_ROLE_THOROUGHLY ) { - $quick_count = false; - } elseif ( $this->lib->is_pro() ) { - $count_thoroughly = $this->lib->get_option( 'count_users_without_role_thoroughly', false ); - if ( $count_thoroughly ) { - $quick_count = false; - } - } - - $quick_count = apply_filters('ure_count_users_without_role_quick', $quick_count ); - - return $quick_count; - } - // end of count_quick_or_thoroughly() - - - private function get_thorougly_where_condition() { - global $wpdb; - - $usermeta = $wpdb->usermeta; - $id = get_current_blog_id(); - $blog_prefix = $wpdb->get_blog_prefix( $id ); - $where = "WHERE NOT EXISTS (SELECT user_id from {$usermeta} ". - "WHERE user_id=users.ID AND meta_key='{$blog_prefix}capabilities') OR ". - "EXISTS (SELECT user_id FROM {$usermeta} ". - "WHERE user_id=users.ID AND meta_key='{$blog_prefix}capabilities' AND ". - "(meta_value='a:0:{}' OR meta_value IS NULL))"; - - return $where; - } - // end of get_thoroughly_where_condition() - - - private function get_quick_query_part2() { - global $wpdb; - - $usermeta = $wpdb->usermeta; - $id = get_current_blog_id(); - $blog_prefix = $wpdb->get_blog_prefix($id); - $query = "FROM {$usermeta} usermeta ". - "INNER JOIN {$wpdb->users} users ON usermeta.user_id=users.ID ". - "WHERE usermeta.meta_key='{$blog_prefix}capabilities' AND ". - "(usermeta.meta_value = 'a:0:{}' OR usermeta.meta_value is NULL)"; - - return $query; - } - // end of get_quick_query_part2() - - - private function get_users_count_query() { - global $wpdb; - - if ( $this->quick_count ) { - $part2 = $this->get_quick_query_part2(); - $query = "SELECT COUNT(DISTINCT usermeta.user_id) {$part2}"; - } else { - $where = $this->get_thorougly_where_condition(); - $query = "SELECT count(ID) FROM {$wpdb->users} users {$where}"; - } - - return $query; - } - // end of get_users_count_query() - - - public function count_users_without_role() { - - global $wpdb; - - $users_quant = get_transient('ure_users_without_role'); - if (empty($users_quant)) { - $query = $this->get_users_count_query(); - $users_quant = $wpdb->get_var( $query ); - set_transient('ure_users_without_role', $users_quant, 15 ); - } - - return $users_quant; - } - // end of count_users_without_role() - - - public function get_users_without_role() { - global $wpdb; - - $top_limit = self::MAX_USERS_TO_PROCESS; - - if ( $this->quick_count ) { - $part2 = $this->get_quick_query_part2(); - $query = "SELECT DISTINCT usermeta.user_id {$part2} - LIMIT 0, {$top_limit}"; - } else { - $where = $this->get_thorougly_where_condition(); - $query = "SELECT users.ID FROM {$wpdb->users} users - {$where} - LIMIT 0, {$top_limit}"; - } - $users0 = $wpdb->get_col( $query ); - - return $users0; - } - // end of get_users_without_role() - - - public function show_html() { - - $users_quant = $this->count_users_without_role(); - if ($users_quant==0) { - return; - } - $button_number = (self::$counter>0) ? '_2': ''; - -?> -    - -
-
-
-multisite = function_exists( 'is_multisite' ) && is_multisite(); - if ( $this->multisite ) { - // get Id of the 1st (main) blog - $this->main_blog_id = $this->get_main_site(); - } - - $this->init_options( $options_id ); - - } - // end of __construct() - - - public function get( $property_name ) { - - if ( !property_exists( $this, $property_name ) ) { - syslog( LOG_ERR, 'Lib class does not have such property '. $property_name ); - return null; - } - - return $this->$property_name; - } - // end of get_property() - - - public function set( $property_name, $property_value ) { - - if ( !property_exists( $this, $property_name ) ) { - syslog( LOG_ERR, 'Lib class does not have such property '. $property_name ); - } - - $this->$property_name = $property_value; - } - // end of get_property() - - - public function get_main_site() { - global $current_site; - - $blog_id = is_object( $current_site ) ? $current_site->blog_id : null; - - return $blog_id; - } - // end of get_main_site() - - - /** - * get current options for this plugin - */ - protected function init_options( $options_id ) { - - $this->options_id = $options_id; - $this->options = get_option( $options_id, array() ); - - } - // end of init_options() - - /** - * Return HTML formatted message - * - * @param string $message message text - * @param string $error_style message div CSS style - */ - public function show_message( $message, $error_style = false ) { - - if ( $message ) { - if ( $error_style ) { - echo '
'; - } else { - echo '
'; - } - echo '

'. $message . '

'; - } - } - // end of show_message() - - - /* - * Replacer for FILTER_SANITIZE_STRING deprecated with PHP 8.1 - */ - public static function filter_string_polyfill( $string ) { - - $str = preg_replace('/\x00|<[^>]*>?/', '', $string); - return str_replace(["'", '"'], [''', '"'], $str); - - } - // end of filter_string_polyfill() - - public static function filter_string_var( $raw_str ) { - - $value1 = filter_var( $raw_str, FILTER_UNSAFE_RAW ); - $value2 = self::filter_string_polyfill( $value1 ); - - return $value2; - } - // end of filter_string_var() - - /** - * Returns value by name from GET/POST/REQUEST. Minimal type checking is provided - * - * @param string $var_name Variable name to return - * @param string $request_type type of request to process get/post/request (default) - * @param string $var_type variable type to provide value checking - * @return mix variable value from request - */ - public function get_request_var( $var_name, $request_type = 'request', $var_type = 'string') { - - $result = 0; - $request_type = strtolower( $request_type ); - switch ( $request_type ) { - case 'get': { - if ( isset( $_GET[$var_name] ) ) { - $result = self::filter_string_var( $_GET[$var_name] ); - } - break; - } - case 'post': { - if ( isset( $_POST[$var_name] ) ) { - if ( $var_type!='checkbox') { - $result = self::filter_string_var( $_POST[$var_name] ); - } else { - $result = 1; - } - } - break; - } - case 'request': { - if ( isset( $_REQUEST[$var_name] ) ) { - $result = self::filter_string_var( $_REQUEST[$var_name] ); - } - break; - } - default: { - $result = -1; // Wrong request type value, possible mistake in a function call - } - } - - if ( $result ) { - if ( $var_type == 'int' && !is_numeric( $result ) ) { - $result = 0; - } - if ( $var_type != 'int') { - $result = esc_attr( $result ); - } - } - - return $result; - } - // end of get_request_var() - - - /** - * returns option value for option with name in $option_name - */ - public function get_option( $option_name, $default = false ) { - - if ( isset( $this->options[$option_name] ) ) { - $value = $this->options[$option_name]; - } else { - $value = $default; - } - $value = apply_filters('ure_get_option_'. $option_name, $value ); - - return $value; - } - // end of get_option() - - - /** - * puts option value according to $option_name option name into options array property - */ - public function put_option( $option_name, $option_value, $flush_options = false ) { - - if ( !is_array( $this->options ) ) { - $this->options = array(); - } - $this->options[$option_name] = $option_value; - if ( $flush_options ) { - $this->flush_options(); - } - } - // end of put_option() - - - /** - * Delete URE option with name option_name - * @param string $option_name - * @param bool $flush_options - */ - public function delete_option( $option_name, $flush_options = false ) { - if ( array_key_exists( $option_name, $this->options ) ) { - unset( $this->options[$option_name] ); - if ( $flush_options ) { - $this->flush_options(); - } - } - } - // end of delete_option() - - - /** - * Saves options array into WordPress database wp_options table - */ - public function flush_options() { - - update_option( $this->options_id, $this->options ); - } - // end of flush_options() - - - /** - * Check product version and stop execution if product version is not compatible with required one - * @param string $version1 - * @param string $version2 - * @param string $error_message - * @return void - */ - public static function check_version( $version1, $version2, $error_message, $plugin_file_name ) { - - if ( version_compare($version1, $version2, '<') ) { - if ( is_admin() && ( !defined('DOING_AJAX') || !DOING_AJAX ) ) { - require_once ABSPATH . '/wp-admin/includes/plugin.php'; - deactivate_plugins( $plugin_file_name ); - new URE_Admin_Notice('warning', $error_message ); - return false; - } - } - - return true; - } - // end of check_version() - - - public function get_current_url() { - global $wp; - - $current_url = esc_url_raw( add_query_arg( $wp->query_string, '', home_url( $wp->request ) ) ); - - return $current_url; - } - // end of get_current_url() - - - /** - * Returns comma separated list from the first $items_count element of $full_list array - * - * @param array $full_list - * @param int $items_count - * @return string - */ - public function get_short_list_str( $full_list, $items_count=3 ) { - - if ( empty( $full_list ) || !is_array( $full_list ) ) { - return '...'; - } - - $short_list = array(); $i = 0; - foreach($full_list as $item) { - if ( $i>=$items_count ) { - break; - } - $short_list[] = $item; - $i++; - } - - $str = implode(', ', $short_list ); - if ( $items_countprepare( $str, $list_values ); - - return $result; - } - // end of esc_sql_in_list() - - - /** - * Returns the array of multi-site WP sites/blogs IDs for the current network - * @global wpdb $wpdb - * @return array - */ - public function get_blog_ids() { - global $wpdb; - - if ( !$this->multisite ) { - return null; - } - - $network = get_current_site(); - $query = $wpdb->prepare( - "SELECT blog_id FROM {$wpdb->blogs} - WHERE site_id=%d ORDER BY blog_id ASC", - array( $network->id ) ); - $blog_ids = $wpdb->get_col( $query ); - - return $blog_ids; - } - // end of get_blog_ids() - - - /** - * Prevent cloning of the instance of the *Singleton* instance. - * - * @return void - */ - public function __clone() { - throw new \Exception('Do not clone a singleton instance.'); - } - // end of __clone() - - /** - * Prevent unserializing of the *Singleton* instance. - * - * @return void - */ - public function __wakeup() { - throw new \Exception('Do not unserialize a singleton instance.'); - } - // end of __wakeup() - -} -// end of URE_Base_Lib class diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/bbpress.php b/wp/wp-content/plugins/user-role-editor/includes/classes/bbpress.php deleted file mode 100644 index 4489bf8c..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/bbpress.php +++ /dev/null @@ -1,116 +0,0 @@ -bbpress_detected = false; - if ( function_exists('bbp_filter_blog_editable_roles') ) { - $this->bbpress_detected = true; // bbPress plugin is installed and active - } - - } - // end of detect_bbpress() - - - public function is_active() { - - return $this->bbpress_detected; - } - // end of is_active() - - - /** - * Exclude roles created by bbPress - * - * @global array $wp_roles - * @return array - */ - public function get_roles() { - - $wp_roles = wp_roles(); - if ($this->bbpress_detected) { - $roles = bbp_filter_blog_editable_roles( $wp_roles->roles ); // exclude bbPress roles - } else { - $roles = $wp_roles->roles; - } - - return $roles; - } - // end of get_roles() - - - /** - * Get full list user capabilities created by bbPress - * - * @return array - */ - public function get_caps() { - - if ( $this->bbpress_detected ) { - $caps = array_keys( bbp_get_caps_for_role( bbp_get_keymaster_role() ) ); - } else { - $caps = array(); - } - - return $caps; - } - // end of get_caps() - - - /** - * Return empty array in order do not include bbPress roles into selectable lists: supported by Pro version only - * @return array - */ - public function get_bbp_editable_roles() { - - $all_bbp_roles = array(); - - return $all_bbp_roles; - } - // end of get_bbp_editable_roles() - - - /** - * Return bbPress roles found at $roles array. Used to exclude bbPress roles from processing as free version should not support them - * - * @param array $roles - * @return array - */ - public function extract_bbp_roles($roles) { - - $user_bbp_roles = array(); - if ( $this->bbpress_detected ) { - $all_bbp_roles = array_keys( bbp_get_dynamic_roles() ); - foreach( $roles as $role ) { - if ( in_array( $role, $all_bbp_roles ) ) { - $user_bbp_roles[] = $role; - } - } - } - - return $user_bbp_roles; - } - // end of extract_bbp_roles() - -} -// end of URE_bbPress class \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/capabilities-groups-manager.php b/wp/wp-content/plugins/user-role-editor/includes/classes/capabilities-groups-manager.php deleted file mode 100644 index 12c62a08..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/capabilities-groups-manager.php +++ /dev/null @@ -1,505 +0,0 @@ - - * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya - **/ - -class URE_Capabilities_Groups_Manager { - - private static $instance = null; - private $lib = null; - private $groups = null; - private $built_in_wp_caps = null; - private $cpt_caps = null; - - - public static function get_instance() { - - if (self::$instance === null) { - // new static() will work too - self::$instance = new URE_Capabilities_Groups_Manager(); - } - - return self::$instance; - } - // end of get_instance() - - - private function __construct() { - - $this->lib = URE_Lib::get_instance(); - $this->_get_built_in_wp_caps(); - $this->_get_all_custom_post_types_caps(); - - } - // end of __construct() - - - public function add_custom_post_types() { - - $this->groups['custom_post_types'] = array( - 'caption'=>esc_html__('Custom Post Types', 'user-role-editor'), - 'parent'=>'all', - 'level'=>1 - ); - - $post_types = get_post_types( array(), 'objects'); - $_post_types = $this->lib->_get_post_types(); - $built_in_pt = array('post', 'page'); - if ( $post_types['attachment']->cap->edit_posts=='edit_posts') { - $built_in_pt[] = 'attachment'; - } - - $show_wc_post_types_under_wc_only = apply_filters('ure_show_wc_post_types_under_wc_only', false); - foreach( $post_types as $post_type ) { - if ( !isset( $_post_types[$post_type->name] ) || in_array( $post_type->name, $built_in_pt ) ) { - continue; - } - if ( $show_wc_post_types_under_wc_only && in_array( $post_type->name, URE_Woocommerce_Capabilities::$post_types ) ) { - continue; - } - /* - if (!$post_type->public) { - continue; - } - * - */ - $this->groups[$post_type->name] = array( - 'caption'=>$post_type->labels->name, - 'parent'=>'custom_post_types', - 'level'=>2 - ); - } - } - // end of add_custom_post_types() - - - private function add_ure_group() { - - $this->groups['user_role_editor'] = array( - 'caption'=>esc_html__('User Role Editor', 'user-role-editor'), - 'parent'=>'custom', - 'level'=>2 - ); - - } - // end of get_ure_group() - - - private function add_woocommerce_groups() { - - $full_caps = $this->lib->init_full_capabilities( 'role' ); - if ( !isset( $full_caps['manage_woocommerce'] ) ) { - return; - } - - $post_types = get_post_types( array(), 'objects'); - - $this->groups['woocommerce'] = array( - 'caption'=>esc_html__('WooCommerce', 'user-role-editor'), - 'parent'=>'custom', - 'level'=>2 - ); - $this->groups['woocommerce_core'] = array( - 'caption'=>esc_html__('Core', 'user-role-editor'), - 'parent'=>'woocommerce', - 'level'=>3 - ); - foreach( URE_Woocommerce_Capabilities::$post_types as $post_type ) { - if ( !isset( $post_types[$post_type] ) ) { - continue; - } - $this->groups['woocommerce_'. $post_type] = array( - 'caption'=>$post_types[$post_type]->labels->name, - 'parent'=>'woocommerce', - 'level'=>3 - ); - } - - } - // end of add_woocommerce_group() - - - private function get_base_wp_groups() { - $groups = array( - 'all'=>array( - 'caption'=>esc_html__('All', 'user-role-editor'), - 'parent'=>null, - 'level'=>0 - ), - 'core'=>array( - 'caption'=>esc_html__('Core', 'user-role-editor'), - 'parent'=>'all', - 'level'=>1 - ), - 'general'=>array( - 'caption'=>esc_html__('General', 'user-role-editor'), - 'parent'=>'core', - 'level'=>2 - ), - 'themes'=>array( - 'caption'=>esc_html__('Themes', 'user-role-editor'), - 'parent'=>'core', - 'level'=>2 - ), - 'posts'=>array( - 'caption'=>esc_html__('Posts', 'user-role-editor'), - 'parent'=>'core', - 'level'=>2 - ), - 'pages'=>array( - 'caption'=>esc_html__('Pages', 'user-role-editor'), - 'parent'=>'core', - 'level'=>2 - ), - 'plugins'=>array( - 'caption'=>esc_html__('Plugins', 'user-role-editor'), - 'parent'=>'core', - 'level'=>2 - ), - 'users'=>array( - 'caption'=>esc_html__('Users', 'user-role-editor'), - 'parent'=>'core', - 'level'=>2 - ) - ); - - return $groups; - } - // end of get_base_wp_groups - - - public function get_groups_tree() { - - if ($this->groups!==null) { - return $this->groups; - } - - $this->groups = $this->get_base_wp_groups(); - - $multisite = $this->lib->get('multisite'); - if ( $multisite ) { - $this->groups['multisite'] = array( - 'caption'=>esc_html__('Multisite', 'user-role-editor'), - 'parent'=>'core', - 'level'=>2 - ); - } - - $this->groups['deprecated'] = array( - 'caption'=>esc_html__('Deprecated', 'user-role-editor'), - 'parent'=>'core', - 'level'=>2 - ); - - $this->add_custom_post_types(); - $this->groups['custom'] = array( - 'caption'=>esc_html__('Custom capabilities', 'user-role-editor'), - 'parent'=>'all', - 'level'=>1 - ); - $this->add_ure_group(); - $this->add_woocommerce_groups(); - - $this->groups = apply_filters('ure_capabilities_groups_tree', $this->groups); - - return $this->groups; - } - // end of get_groups_tree() - - - /** - * return array of built-in WP capabilities (WP 3.1 wp-admin/includes/schema.php) - * - * @return array - */ - private function _get_built_in_wp_caps() { - - $wp_version = get_bloginfo('version'); - $multisite = $this->lib->get('multisite'); - - $caps = array(); - $caps['switch_themes'] = array('core', 'themes'); - $caps['edit_themes'] = array('core', 'themes'); - $caps['activate_plugins'] = array('core', 'plugins'); - $caps['edit_plugins'] = array('core', 'plugins'); - $caps['edit_users'] = array('core', 'users'); - $caps['edit_files'] = array('core', 'deprecated'); - $caps['manage_options'] = array('core', 'general'); - $caps['moderate_comments'] = array('core', 'posts', 'general'); - $caps['manage_categories'] = array('core', 'posts', 'general'); - $caps['manage_links'] = array('core', 'general'); - $caps['upload_files'] = array('core', 'general'); - $caps['import'] = array('core', 'general'); - $caps['unfiltered_html'] = array('core','general'); - if ( $multisite ) { - $caps['unfiltered_html'] = array('deprecated'); - } - $caps['edit_posts'] = array('core', 'posts'); - $caps['edit_others_posts'] = array('core', 'posts'); - $caps['edit_published_posts'] = array('core', 'posts'); - $caps['publish_posts'] = array('core', 'posts'); - $caps['edit_pages'] = array('core', 'pages'); - $caps['read'] = array('core', 'general'); - $caps['level_10'] = array('core', 'deprecated'); - $caps['level_9'] = array('core', 'deprecated'); - $caps['level_8'] = array('core', 'deprecated'); - $caps['level_7'] = array('core', 'deprecated'); - $caps['level_6'] = array('core', 'deprecated'); - $caps['level_5'] = array('core', 'deprecated'); - $caps['level_4'] = array('core', 'deprecated'); - $caps['level_3'] = array('core', 'deprecated'); - $caps['level_2'] = array('core', 'deprecated'); - $caps['level_1'] = array('core', 'deprecated'); - $caps['level_0'] = array('core', 'deprecated'); - $caps['edit_others_pages'] = array('core', 'pages'); - $caps['edit_published_pages'] = array('core', 'pages'); - $caps['publish_pages'] = array('core', 'pages'); - $caps['delete_pages'] = array('core', 'pages'); - $caps['delete_others_pages'] = array('core', 'pages'); - $caps['delete_published_pages'] = array('core', 'pages'); - $caps['delete_posts'] = array('core', 'posts'); - $caps['delete_others_posts'] = array('core', 'posts'); - $caps['delete_published_posts'] = array('core', 'posts'); - $caps['delete_private_posts'] = array('core', 'posts'); - $caps['edit_private_posts'] = array('core', 'posts'); - $caps['read_private_posts'] = array('core', 'posts'); - $caps['delete_private_pages'] = array('core', 'pages'); - $caps['edit_private_pages'] = array('core', 'pages'); - $caps['read_private_pages'] = array('core', 'pages'); - $caps['unfiltered_upload'] = array('core', 'general'); - $caps['edit_dashboard'] = array('core', 'general'); - $caps['update_plugins'] = array('core', 'plugins'); - $caps['delete_plugins'] = array('core', 'plugins'); - $caps['install_plugins'] = array('core', 'plugins'); - $caps['update_themes'] = array('core', 'themes'); - $caps['install_themes'] = array('core', 'themes'); - $caps['update_core'] = array('core', 'general'); - $caps['list_users'] = array('core', 'users'); - $caps['remove_users'] = array('core', 'users'); - - if ( version_compare( $wp_version, '4.4', '<') ) { - $caps['add_users'] = array('core', 'users'); // removed from WP v. 4.4. - } - - $caps['promote_users'] = array('core', 'users'); - $caps['edit_theme_options'] = array('core', 'themes'); - $caps['delete_themes'] = array('core', 'themes'); - $caps['export'] = array('core', 'general'); - $caps['delete_users'] = array('core', 'users'); - $caps['create_users'] = array('core', 'users'); - if ( $multisite ) { - $caps['create_sites'] = array('core', 'multisite', 'general'); - $caps['delete_sites'] = array('core', 'multisite', 'general'); - $caps['manage_network'] = array('core', 'multisite', 'general'); - $caps['manage_sites'] = array('core', 'multisite', 'general'); - $caps['manage_network_users'] = array('core', 'multisite', 'users'); - $caps['manage_network_plugins'] = array('core', 'multisite', 'plugins'); - $caps['manage_network_themes'] = array('core', 'multisite', 'themes'); - $caps['manage_network_options'] = array('core', 'multisite', 'general'); - $caps['upgrade_network'] = array('core', 'multisite', 'general'); - } - - $caps['install_languages'] = array('core', 'general'); - $caps['resume_plugins'] = array('core', 'plugins'); - $caps['resume_themes'] = array('core', 'themes'); - $caps['view_site_health_checks'] = array('core', 'general'); - - - $caps = apply_filters('ure_built_in_wp_caps', $caps ); - - $this->built_in_wp_caps = $caps; - - return $this->built_in_wp_caps; - } - // end of _get_built_in_wp_caps() - - - public function get_built_in_wp_caps() { - - return $this->built_in_wp_caps; - } - // end of get_built_in_wp_caps() - - - private function get_post_types_without_caps() { - - $pt_without_caps = array(); - $wc_pts = URE_Woocommerce_Capabilities::get_post_types_without_caps(); - - $pt_without_caps = ure_array_merge( $pt_without_caps, $wc_pts ); - - return $pt_without_caps; - } - // end of get_post_types_without_caps() - - - /** - * Get capabilities registered with custom post type - * - * @param object $post_type - * @param array $post_edit_caps - */ - private function get_registered_cpt_caps( $post_type, $post_edit_caps ) { - - foreach ( $post_edit_caps as $capability ) { - if ( isset( $post_type->cap->$capability ) ) { - $cap = $post_type->cap->$capability; - } else { - continue; - } - if ( !isset( $this->cpt_caps[$cap] ) ) { - $this->cpt_caps[$cap] = array(); - } else if ( in_array( $post_type->name, $this->cpt_caps[$cap] ) ) { - continue; - } - if ( !isset($this->built_in_wp_caps[$cap]) && - !in_array( 'custom', $this->cpt_caps[$cap] ) ) { - $this->cpt_caps[$cap][] = 'custom'; - } - if ( !in_array( 'custom_post_types', $this->cpt_caps[$cap] ) ) { - $this->cpt_caps[$cap][] = 'custom_post_types'; - } - $this->cpt_caps[$cap][] = $post_type->name; - } - - } - // end of get_registered_cpt_caps() - - - private function add_group_to_edit_post_cap( $post_type, $post_edit_caps ) { - - foreach( $post_edit_caps as $cap_id ) { - $this->built_in_wp_caps[$cap_id][] = $post_type->name; - if ( !in_array('custom_post_types', $this->built_in_wp_caps[$cap_id] ) ) { - $this->built_in_wp_caps[$cap_id][] = 'custom_post_types'; - } - } - - } - // end of add_group_to_edit_post_cap() - - - private function get_custom_post_type_caps( $post_type, $post_edit_caps ) { - - $pt_without_caps = $this->get_post_types_without_caps(); - if ( in_array($post_type->name, $pt_without_caps ) ) { - return; - } - - // take into account custom post types, which uses built-in post or page capabilities - if ( in_array( $post_type->capability_type, array('post', 'page') ) ) { - $this->add_group_to_edit_post_cap( $post_type, $post_edit_caps ); - return; - } - - $this->get_registered_cpt_caps( $post_type, $post_edit_caps ); - } - // end of get_custom_post_type_caps() - - - private function _get_all_custom_post_types_caps() { - - $post_edit_caps = $this->lib->get_edit_post_capabilities(); - $post_types = get_post_types( array(), 'objects' ); - $_post_types = $this->lib->_get_post_types(); - $built_in_pt = array('post', 'page'); - if ( $post_types['attachment']->cap->edit_posts=='edit_posts') { - $built_in_pt[] = 'attachment'; - } - $this->cpt_caps = array(); - foreach( $post_types as $post_type ) { - if ( !isset( $_post_types[$post_type->name] ) ) { - continue; - } - if ( in_array( $post_type->name, $built_in_pt ) ) { - continue; - } - if ( !isset( $post_type->cap ) ) { - continue; - } - $this->get_custom_post_type_caps( $post_type, $post_edit_caps ); - } - - return $this->cpt_caps; - } - // end of _get_all_custom_post_types_capabilities() - - - private function get_groups_for_custom_cap( $cap_id ) { - - $ure_caps = URE_Own_Capabilities::get_caps_groups(); - if ( isset( $ure_caps[$cap_id] ) ) { - $groups1 = $ure_caps[$cap_id]; - } - - if ( empty( $groups1 ) ) { - $wc_caps = URE_Woocommerce_Capabilities::get_caps_groups(); - if ( isset($wc_caps[$cap_id] ) ) { - $groups1 = $wc_caps[$cap_id]; - } - } - - if ( isset( $this->cpt_caps[$cap_id] ) ) { - $groups2 = $this->cpt_caps[$cap_id]; - } - - $groups = array('custom'); - if ( !empty( $groups1 ) ) { - $groups = ure_array_merge( $groups, $groups1 ); - } - if ( !empty( $groups2 ) ) { - $groups = ure_array_merge( $groups, $groups2 ); - } - - return $groups; - } - // end of get_groups_for_custom_cap() - - - public function get_cap_groups( $cap_id, $built_in_wp_caps=null ) { - - if ( isset( $this->built_in_wp_caps[$cap_id] ) ) { - $groups = $built_in_wp_caps[$cap_id]; - } else { - $groups = $this->get_groups_for_custom_cap( $cap_id ); - } - $groups = apply_filters('ure_custom_capability_groups', $groups, $cap_id ); - $groups[] = 'all'; // Every capability belongs to the 'all' group - $groups = array_unique( $groups ); - - foreach( $groups as $key=>$value ) { - $groups[$key] = 'ure-'. $value; - } - - return $groups; - } - // end of get_cap_groups() - - - /** - * Prevent cloning of the instance of the *Singleton* instance. - * - * @return void - */ - public function __clone() { - throw new \Exception('Do not clone a singleton instance.'); - } - // end of __clone() - - /** - * Prevent unserializing of the *Singleton* instance. - * - * @return void - */ - public function __wakeup() { - throw new \Exception('Do not unserialize a singleton instance.'); - } - // end of __wakeup() - -} -// end of class URE_Capabilities_Groups_Manager \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/capabilities.php b/wp/wp-content/plugins/user-role-editor/includes/classes/capabilities.php deleted file mode 100644 index ef08286c..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/capabilities.php +++ /dev/null @@ -1,461 +0,0 @@ - - * @copyright Copyright (c) 2010 - 2021, Vladimir Garagulia - **/ -class URE_Capabilities { - - private static $instance = null; - private $lib = null; - private $built_in_wp_caps = null; - - - public static function get_instance() { - - if ( self::$instance === null ) { - // new static() will work too - self::$instance = new URE_Capabilities(); - } - - return self::$instance; - } - // end of get_instance() - - - private function __construct() { - - $this->lib = URE_Lib::get_instance(); - $this->built_in_wp_caps = $this->lib->get_built_in_wp_caps(); - - } - // end of __construct() - - - protected function convert_cap_to_readable( $cap_name ) { - - $cap_name = str_replace('_', ' ', $cap_name); - $cap_name = ucfirst($cap_name); - - return $cap_name; - } - // convert_cap_to_readable - - - protected function add_capability_to_full_caps_list( $cap_id, &$full_list ) { - - if ( isset( $full_list[$cap_id] ) ) { // if capability was added already - return; - } - - $cap = array(); - $cap['inner'] = $cap_id; - $cap['human'] = esc_html__( $this->convert_cap_to_readable( $cap_id ) , 'user-role-editor' ); - if ( isset( $this->built_in_wp_caps[$cap_id] ) ) { - $cap['wp_core'] = true; - } else { - $cap['wp_core'] = false; - } - - $full_list[$cap_id] = $cap; - } - // end of add_capability_to_full_caps_list() - - - /** - * Add capabilities from user roles save at WordPress database - * - */ - protected function add_roles_caps( &$full_list ) { - - $roles = $this->lib->get_user_roles(); - foreach ( $roles as $role ) { - // validate if capabilities is an array - if ( !isset( $role['capabilities'] ) || !is_array( $role['capabilities'] ) ) { - continue; - } - foreach ( array_keys( $role['capabilities'] ) as $cap ) { - $this->add_capability_to_full_caps_list( $cap, $full_list ); - } - } - - } - // end of add_roles_caps() - - - /** - * Add Gravity Forms plugin capabilities, if available - * - */ - protected function add_gravity_forms_caps( &$full_list ) { - - if ( !class_exists( 'GFCommon' ) ) { - return; - } - - $gf_caps = GFCommon::all_caps(); - foreach ( $gf_caps as $gf_cap ) { - $this->add_capability_to_full_caps_list( $gf_cap, $full_list ); - } - - } - // end of add_gravity_forms_caps() - - - /** - * Add bbPress plugin user capabilities (if available) - */ - protected function add_bbpress_caps( &$full_list ) { - - $bbpress = $this->lib->get_bbpress(); - if ( !$bbpress->is_active() ) { - return; - } - - $caps = $bbpress->get_caps(); - foreach ( $caps as $cap ) { - $this->add_capability_to_full_caps_list( $cap, $full_list ); - } - } - // end of add_bbpress_caps() - - - /** - * Provide compatibility with plugins and themes which define their custom user capabilities using - * 'members_get_capabilities' filter from Justin Tadlock Members plugin - * https://wordpress.org/plugins/members/ - * - */ - protected function add_members_caps( &$full_list ) { - - $custom_caps = array(); - $custom_caps = apply_filters( 'members_get_capabilities', $custom_caps ); - foreach ( $custom_caps as $cap ) { - $this->add_capability_to_full_caps_list( $cap, $full_list ); - } - - } - // end of add_members_caps() - - - /** - * Add capabilities assigned directly to user, and not included into any role - * - */ - protected function add_user_caps( &$full_list ) { - - $editor = URE_Editor::get_instance(); - $user = $editor->get('user_to_edit'); - $roles = $editor->get('roles'); - foreach( array_keys( $user->caps ) as $cap ) { - if ( !isset( $roles[$cap] ) ) { // it is the user capability, not role - $this->add_capability_to_full_caps_list( $cap, $full_list ); - } - } - - } - // end of add_user_caps() - - - /** - * Add built-in WordPress caps in case some of them were not included to the roles for some reason - * - */ - protected function add_wordpress_caps( &$full_list ) { - - foreach ( array_keys( $this->built_in_wp_caps ) as $cap ) { - $this->add_capability_to_full_caps_list( $cap, $full_list ); - } - } - // end of add_wordpress_caps() - - - protected function add_create_cap_to_admin( $post_type_name ) { - global $wp_roles; - - $post_type = get_post_type_object( $post_type_name ); - if ( $post_type->cap->create_posts!=='edit_'. $post_type->name .'s' ) { // 'create' capability is active - if ( !isset( $wp_roles->role_objects['administrator']->capabilities[$post_type->cap->create_posts] ) ) { - $wp_roles->role_objects['administrator']->add_cap( $post_type->cap->create_posts, true ); - } - } - - } - // end of add_create_caps_to_admin() - - - public static function add_cap_to_roles( $roles, $cap ) { - - if ( !is_array( $roles ) || count( $roles )==0 ) { - return; - } - - $wp_roles = wp_roles(); - foreach( $roles as $role ) { - if ( isset( $wp_roles->role_objects[$role] ) && - !isset( $wp_roles->role_objects[$role]->capabilities[$cap] ) ) { - $wp_roles->role_objects[$role]->add_cap( $cap, true ); - } - } - - } - // end of add_cap_to_roles() - - - protected function add_custom_post_type_caps( &$full_list ) { - - $multisite = $this->lib->get( 'multisite' ); - // admin should be capable to edit any posts - $cpt_editor_roles0 = !$multisite ? array('administrator') : array(); - $capabilities = $this->lib->get_edit_post_capabilities(); - $post_types = get_post_types( array(), 'objects' ); - $_post_types = $this->lib->_get_post_types(); - // do not forget attachment post type as it may use the own capabilities set - $attachment_post_type = get_post_type_object( 'attachment' ); - if ( $attachment_post_type->cap->edit_posts!=='edit_posts' ) { - $post_types['attachment'] = $attachment_post_type; - } - - foreach( $post_types as $post_type ) { - if ( !isset( $_post_types[$post_type->name] ) ) { - continue; - } - if ( !isset($post_type->cap) ) { - continue; - } - $cpt_editor_roles = apply_filters( 'ure_cpt_editor_roles', $cpt_editor_roles0, $post_type->name ); - foreach( $capabilities as $capability ) { - if ( !isset( $post_type->cap->$capability ) ) { - continue; - } - $cap_to_check = $post_type->cap->$capability; - $this->add_capability_to_full_caps_list( $cap_to_check, $full_list ); - self::add_cap_to_roles( $cpt_editor_roles, $cap_to_check ); - } - } - - $wp_roles = wp_roles(); - if ( !$multisite && isset( $wp_roles->role_objects['administrator'] ) ) { - // admin should be capable to create posts and pages - foreach( array( 'post', 'page' ) as $post_type_name ) { - $this->add_create_cap_to_admin( $post_type_name ); - } - } - - } - // end of add_custom_post_type_caps() - - - protected function add_custom_taxonomies_caps( &$full_list ) { - - $taxonomies = $this->lib->get_custom_taxonomies( 'objects' ); - if ( empty( $taxonomies ) ) { - return; - } - - $multisite = $this->lib->get( 'multisite' ); - // admin should be capable to edit any taxonomy - $cpt_editor_roles0 = !$multisite ? array('administrator') : array(); - $caps_to_check = array('manage_terms', 'edit_terms', 'delete_terms', 'assign_terms'); - foreach( $taxonomies as $taxonomy ) { - $cpt_editor_roles = apply_filters( 'ure_cpt_editor_roles', $cpt_editor_roles0, $taxonomy->name ); - foreach( $caps_to_check as $capability ) { - $cap_to_check = $taxonomy->cap->$capability; - $this->add_capability_to_full_caps_list( $cap_to_check, $full_list ); - self::add_cap_to_roles( $cpt_editor_roles, $cap_to_check ); - } - } - - } - // end of add_custom_taxonomies_caps() - - - /** - * Add capabilities for URE permissions system in case some were excluded from Administrator role - * - */ - protected function add_ure_caps( &$full_list ) { - - $key_cap = URE_Own_Capabilities::get_key_capability(); - if ( !current_user_can( $key_cap ) ) { - return; - } - $ure_caps = URE_Own_Capabilities::get_caps(); - foreach(array_keys($ure_caps) as $cap) { - $this->add_capability_to_full_caps_list( $cap, $full_list ); - } - - } - // end of add_ure_caps() - - - // Under the single site WordPress installation administrator role should have all existing capabilities included - protected function grant_all_caps_to_admin( $full_list ) { - - $multisite = $this->lib->get( 'multisite' ); - if ( $multisite ) { - // There is a superadmin user under WP multisite, so single site administrator role may do not have full list of capabilities. - return; - } - - $wp_roles = wp_roles(); - if ( !isset( $wp_roles->role_objects['administrator'] ) ) { - return; - } - - // Use this filter as the last chance to stop this - $grant = apply_filters('ure_grant_all_caps_to_admin', true ); - if ( empty( $grant) ) { - return; - } - - $admin_role = $wp_roles->role_objects['administrator']; - $updated = false; - foreach( $full_list as $capability ) { - $cap = $capability['inner']; - if ( !$admin_role->has_cap( $cap ) ) { - $admin_role->add_cap( $cap ); - $updated = true; - } - } - if ( $updated ) { // Flush the changes to the database - $use_db = $wp_roles->use_db; - $wp_roles->use_db = true; - $admin_role->add_cap('read'); // administrator always should can 'read' - $wp_roles->use_db = $use_db; - } - } - // end of grant_all_caps_to_admin() - - - public function init_full_list( $ure_object ) { - - $full_list = array(); - $this->add_roles_caps( $full_list ); - $this->add_gravity_forms_caps( $full_list ); - $this->add_bbpress_caps( $full_list ); - $this->add_members_caps( $full_list ); - if ($ure_object=='user') { - $this->add_user_caps( $full_list ); - } - $this->add_wordpress_caps( $full_list ); - $this->add_custom_post_type_caps( $full_list ); - $this->add_custom_taxonomies_caps( $full_list ); - $this->add_ure_caps( $full_list ); - asort( $full_list ); - $full_list = apply_filters('ure_full_capabilites', $full_list ); - $this->grant_all_caps_to_admin( $full_list ); - - return $full_list; - } - // end of init_full_list(); - - - /** - * Build full capabilities list from all roles - */ - private function get_full_caps_list_from_roles() { - $wp_roles = wp_roles(); - // build full capabilities list from all roles - $full_caps_list = array(); - foreach ( $wp_roles->roles as $role ) { - // validate if capabilities is an array - if ( isset( $role['capabilities'] ) && is_array( $role['capabilities'] ) ) { - foreach ( $role['capabilities'] as $capability => $value ) { - if ( !isset( $full_caps_list[$capability] ) ) { - $full_caps_list[$capability] = true; - } - } - } - } - - return $full_caps_list; - } - // end of get_full_caps_list_from_roles() - - - /** - * Returns array of WPBakery Visual Composer plugin capabilities - * extracted by 'vc_access_rules_' prefix - */ - protected function get_visual_composer_caps($full_caps_list) { - $caps = array(); - foreach( array_keys( $full_caps_list ) as $cap ) { - if ( strpos( $cap, 'vc_access_rules_')!==false ) { - $caps[$cap] = 1; - } - } - - return $caps; - } - // end of get_visual_composer_caps() - - - /** - * return the array of unused user capabilities - * - * @global WP_Roles $wp_roles - * @return array - */ - public function get_caps_to_remove() { - - $wp_roles = wp_roles(); - $full_caps_list = $this->get_full_caps_list_from_roles(); - $caps_to_exclude = $this->built_in_wp_caps; - $ure_caps = URE_Own_Capabilities::get_caps(); - $visual_composer_caps = $this->get_visual_composer_caps($full_caps_list); - $caps_to_exclude = ure_array_merge($caps_to_exclude, $ure_caps, $visual_composer_caps); - - $caps_to_remove = array(); - $caps = array_keys( $full_caps_list ); - foreach ( $caps as $cap ) { - if ( isset( $caps_to_exclude[$cap] ) ) { // do not touch built-in WP caps, URE own caps and Visual Composer caps - continue; - } - - // check roles - $cap_in_use = false; - foreach ( $wp_roles->role_objects as $wp_role ) { - if ( $wp_role->name === 'administrator' ) { - continue; - } - if ( $wp_role->has_cap( $cap ) ) { - $cap_in_use = true; - break; - } - } - if ( !$cap_in_use ) { - $caps_to_remove[$cap] = 1; - } - } // foreach(...) - - return $caps_to_remove; - } - // end of get_caps_to_remove() - - - /** - * Prevent cloning of the instance of the *Singleton* instance. - * - * @return void - */ - public function __clone() { - throw new \Exception('Do not clone a singleton instance.'); - } - // end of __clone() - - /** - * Prevent unserializing of the *Singleton* instance. - * - * @return void - */ - public function __wakeup() { - throw new \Exception('Do not unserialize a singleton instance.'); - } - // end of __wakeup() - -} -// end of URE_Capabilities class diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/capability.php b/wp/wp-content/plugins/user-role-editor/includes/classes/capability.php deleted file mode 100644 index 3f8390f0..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/capability.php +++ /dev/null @@ -1,240 +0,0 @@ - - * @copyright Copyright (c) 2010 - 2021, Vladimir Garagulya - **/ - -class URE_Capability { - - public static function escape( $cap_id ) { - - $search = array(' ', '/', '|', '{', '}', '$'); - $replace = array('_', '_', '_', '_', '_', '_'); - - $cap_id_esc = str_replace( $search, $replace, $cap_id ); - - return $cap_id_esc; - } - // end escape() - - - // Sanitize user input for security - // do not allow to use internally used capabilities - public static function validate( $cap_id_raw ) { - $match = array(); - $found = preg_match('/[A-Za-z0-9_\-]*/', $cap_id_raw, $match ); - if ( !$found || ($found && ( $match[0]!=$cap_id_raw ) ) ) { // some non-alphanumeric charactes found! - $data = array( - 'result'=>false, - 'message'=>esc_html__('Error: Capability name must contain latin characters and digits only!', 'user-role-editor'), - 'cap_id'=>'' - ); - return $data; - } - - $cap_id = strtolower( $match[0] ); - if ( $cap_id=='do_not_allow' ) { - $data = array( - 'result'=>false, - 'message'=>esc_html__('Error: this capability is used internally by WordPress', 'user-role-editor'), - 'cap_id'=>'do_not_allow' - ); - return $data; - } - if ( $cap_id=='administrator' ) { - $data = array( - 'result'=>false, - 'message'=>esc_html__('Error: this word is used by WordPress as a role ID', 'user-role-editor'), - 'cap_id'=>'administrator' - ); - return $data; - } - - $data = array( - 'result'=>true, - 'message'=>'Success', - 'cap_id'=>$cap_id - ); - - return $data; - } - // end of validate() - - - /** - * Add new user capability - * - * @global WP_Roles $wp_roles - * @return string - */ - public static function add( $ure_object ) { - global $wp_roles; - - $response = array( - 'result'=>'error', - 'capability_id'=>'', - 'html'=>'', - 'message'=>'' - ); - if ( !current_user_can( 'ure_create_capabilities' ) ) { - $response['message'] = esc_html__( 'Insufficient permissions to work with User Role Editor', 'user-role-editor' ); - return $response; - } - - $mess = ''; - if ( !isset( $_POST['capability_id'] ) || empty( $_POST['capability_id'] ) ) { - $response['message'] = esc_html__( 'Wrong Request', 'user-role-editor' ); - return $response; - } - - $data = self::validate( $_POST['capability_id'] ); - if ( !$data['result'] ) { - $response['message'] = $data['message']; - return $response; - } - - $cap_id = $data['cap_id']; - $lib = URE_Lib::get_instance(); - $full_capabilities = $lib->init_full_capabilities( $ure_object ); - if ( !isset( $full_capabilities[$cap_id] ) ) { - $admin_role = $lib->get_admin_role(); - $use_db = $wp_roles->use_db; - $wp_roles->use_db = true; - $wp_roles->add_cap( $admin_role, $cap_id ); - $wp_roles->use_db = $use_db; - $response['result'] = 'success'; - $response['message'] = sprintf( esc_html__( 'Capability %s was added successfully', 'user-role-editor' ), $cap_id ); - } else { - $response['message'] = sprintf( esc_html__( 'Capability %s exists already', 'user-role-editor' ), $cap_id ); - } - - return $response; - } - // end of add() - - - /** - * Extract capabilities selected for deletion from the $_POST global - * - * @return array - */ - private static function get_caps_for_deletion_from_post( $caps_allowed_to_remove ) { - - if ( isset( $_POST['values'] ) ) { - $input_buff = $_POST['values']; - } else { - $input_buff = $_POST; - } - - $caps = array(); - foreach( $input_buff as $key=>$value ) { - if ( substr( $key, 0, 3 )!=='rm_' ) { - continue; - } - if ( !isset( $caps_allowed_to_remove[$value]) ) { - continue; - } - $caps[] = $value; - } - - return $caps; - } - // end of get_caps_for_deletion_from_post() - - - private static function revoke_caps_from_user( $user_id, $caps ) { - - $user = get_user_to_edit( $user_id ); - foreach( $caps as $cap_id ) { - if ( !isset( $user->caps[$cap_id] ) ) { - continue; - } - // Prevent sudden revoke role 'administrator' from a user during 'administrator' capability deletion. - if ( $cap_id=='administrator') { - continue; - } - $user->remove_cap( $cap_id ); - } - } - // end of revoke_caps_from_user() - - - private static function revoke_caps_from_role( $wp_role, $caps ) { - - foreach( $caps as $cap_id ) { - if ( $wp_role->has_cap( $cap_id ) ) { - $wp_role->remove_cap( $cap_id ); - } - } - - } - // end of revoke_caps_from_role() - - - private static function revoke_caps( $caps ) { - global $wpdb, $wp_roles; - - // remove caps from users - $users_ids = $wpdb->get_col("SELECT $wpdb->users.ID FROM $wpdb->users"); - foreach ( $users_ids as $user_id ) { - self::revoke_caps_from_user( $user_id, $caps ); - } - - // remove caps from roles - foreach ( $wp_roles->role_objects as $wp_role ) { - self::revoke_caps_from_role( $wp_role, $caps ); - } - } - // end of revoke_caps() - - - /** - * Delete capability - * - * @global WP_Roles $wp_roles - * @return string - information message - */ - public static function delete() { - - if ( !current_user_can( 'ure_delete_capabilities' ) ) { - return esc_html__( 'Insufficient permissions to work with User Role Editor','user-role-editor' ); - } - - $capabilities = URE_Capabilities::get_instance(); - $mess = ''; - $caps_allowed_to_remove = $capabilities->get_caps_to_remove(); - if ( !is_array( $caps_allowed_to_remove ) || count( $caps_allowed_to_remove )==0 ) { - return esc_html__( 'There are no capabilities available for deletion!', 'user-role-editor' ); - } - - $caps = self::get_caps_for_deletion_from_post( $caps_allowed_to_remove ); - if ( empty( $caps ) ) { - return esc_html__( 'There are no capabilities available for deletion!', 'user-role-editor' ); - } - - self::revoke_caps( $caps ); - - if ( count( $caps )==1 ) { - $mess = sprintf( esc_html__( 'Capability %s was removed successfully', 'user-role-editor' ), $caps[0] ); - } else { - $lib = URE_Lib::get_instance(); - $short_list_str = $lib->get_short_list_str( $caps ); - $mess = count( $caps ) .' '. esc_html__( 'capabilities were removed successfully', 'user-role-editor' ) .': '. - $short_list_str; - } - - // Escape every capability ID to remove from the HTML markup related div by ID - $esc_caps = array(); - foreach( $caps as $key=>$cap ) { - $esc_caps[$key] = self::escape( $cap ); - } - return array('message'=>$mess, 'deleted_caps'=>$esc_caps); - } - // end of delete() - -} -// end of class URE_Capability diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/editor.php b/wp/wp-content/plugins/user-role-editor/includes/classes/editor.php deleted file mode 100644 index 403ed24b..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/editor.php +++ /dev/null @@ -1,1646 +0,0 @@ - - * @copyright Copyright (c) 2010 - 2021, Vladimir Garagulia - **/ -class URE_Editor { - - private static $instance = null; - - protected $lib = null; - - protected $role_additional_options = null; - protected $apply_to_all = 0; - protected $capabilities_to_save = null; - protected $caps_columns_quant = 1; - protected $caps_readable = false; - protected $current_role = ''; - protected $current_role_name = ''; - protected $full_capabilities = false; - protected $notification = ''; // notification message to show on page - protected $roles = null; - protected $show_deprecated_caps = false; - protected $ure_object = 'role'; // what to process, 'role' or 'user' - protected $user_to_edit = null; - protected $wp_default_role = ''; - - - public static function get_instance() { - - if (self::$instance === null) { - // new static() will work too - self::$instance = new URE_Editor(); - } - - return self::$instance; - } - // end of get_instance() - - - private function __construct() { - - $this->lib = URE_Lib::get_instance(); - } - // end of __construct() - - - public function get($property_name) { - - if (!property_exists($this, $property_name)) { - syslog(LOG_ERR, 'URE_Editor class does not have such property '. $property_name); - return null; - } - - return $this->$property_name; - } - // end of get_property() - - - public function get_edit_user_caps_mode() { - - $multisite = $this->lib->get('multisite'); - if ($multisite && $this->lib->is_super_admin()) { - return 1; - } - - $edit_user_caps = $this->lib->get_option('edit_user_caps', 1); - - return $edit_user_caps; - } - // end of get_edit_user_caps_mode() - - - - // Validate information about user we intend to edit - protected function check_user_to_edit() { - - if ( $this->ure_object !=='user' ) { - return true; - } - - if ( isset( $_REQUEST['user_id'] ) ) { - $user_id = filter_var( $_REQUEST['user_id'], FILTER_VALIDATE_INT ); - } elseif ( isset( $_POST['values']['user_id'] ) ) { - $user_id = filter_var( $_POST['values']['user_id'], FILTER_VALIDATE_INT ); - } else { - return false; // user_id value is missed - } - if ( empty( $user_id ) ) { - return false; - } - - $this->user_to_edit = get_user_to_edit( $user_id ); - if ( empty( $this->user_to_edit ) ) { - return false; - } - - return true; - } - // end of check_user_to_edit() - - - protected function get_caps_columns_quant() { - - if ( isset( $_POST['caps_columns_quant'] ) && in_array( $_POST['caps_columns_quant'], array(1,2,3) ) ) { - $value = (int) filter_var( $_POST['caps_columns_quant'], FILTER_VALIDATE_INT ); - set_site_transient( 'ure_caps_columns_quant', $value, URE_Lib::TRANSIENT_EXPIRATION ); - } else { - $value = get_site_transient( 'ure_caps_columns_quant' ); - if ( $value===false ) { - $value = $this->lib->get_option( 'caps_columns_quant', 1 ); - } - } - - return $value; - } - // end of get_caps_columns_quant() - - - protected function _init0() { - // could be sent as via POST, as via GET - if ( isset( $_REQUEST['object'] ) ) { - $this->ure_object = $_REQUEST['object']; - } elseif ( isset( $_POST['values']['object'] ) ) { // AJAX POST - $this->ure_object = $_POST['values']['object']; - } else { - $this->ure_object = 'role'; - } - - if ( $this->ure_object=='user') { - if ( !$this->check_user_to_edit() ) { - return false; - } - } - - $this->apply_to_all = isset( $_POST['values']['ure_apply_to_all']) ? true : false; - if ( empty( $this->apply_to_all ) && isset( $_POST['ure_apply_to_all'] ) ) { - $this->apply_to_all = true; - } - - return true; - } - // end of _init0() - - - protected function init0() { - - if ( !$this->_init0() ) { - return false; - } - - $this->caps_readable = get_site_transient( 'ure_caps_readable' ); - if ( false === $this->caps_readable ) { - $this->caps_readable = $this->lib->get_option( 'ure_caps_readable' ); - set_site_transient( 'ure_caps_readable', $this->caps_readable, URE_Lib::TRANSIENT_EXPIRATION ); - } - $this->show_deprecated_caps = get_site_transient( 'ure_show_deprecated_caps' ); - if ( false === $this->show_deprecated_caps ) { - $this->show_deprecated_caps = $this->lib->get_option( 'ure_show_deprecated_caps' ); - set_site_transient( 'ure_show_deprecated_caps', $this->show_deprecated_caps, URE_Lib::TRANSIENT_EXPIRATION ); - } - - $this->wp_default_role = get_option( 'default_role' ); - $this->caps_columns_quant = $this->get_caps_columns_quant(); - - return true; - } - // end of init0() - - - protected function valid_nonce() { - - if ( empty( $_POST['ure_nonce'] ) || !wp_verify_nonce( $_POST['ure_nonce'], 'user-role-editor' ) ) { - echo '

Wrong or older request (invalid nonce value). Action prohibited.

'; - return false; - } - - return true; - } - // end of check_nonce() - - - protected function set_caps_readable() { - - if ($this->caps_readable) { - $this->caps_readable = 0; - } else { - $this->caps_readable = 1; - } - set_site_transient( 'ure_caps_readable', $this->caps_readable, URE_Lib::TRANSIENT_EXPIRATION ); - - } - // end of caps_readable() - - - protected function set_show_deprecated_caps() { - if ($this->show_deprecated_caps) { - $this->show_deprecated_caps = 0; - } else { - $this->show_deprecated_caps = 1; - } - set_site_transient( 'ure_show_deprecated_caps', $this->show_deprecated_caps, URE_Lib::TRANSIENT_EXPIRATION ); - } - // end of set_show_deprecated_caps() - - - private function get_role_id() { - - if ( isset( $_POST['values']['user_role'] ) ) { - $role_id = $_POST['values']['user_role']; - } elseif ( isset( $_POST['user_role'] ) ) { - $role_id = $_POST['user_role']; - } else { - $role_id = false; - } - - return $role_id; - - } - // end of get_role_id() - - - public function init_current_role_name() { - - $role_id = $this->get_role_id(); - $this->current_role = ''; - $this->current_role_name = ''; - if ( empty( $role_id ) ) { - $mess = esc_html__('Error: ', 'user-role-editor') . esc_html__('Wrong request!', 'user-role-editor'); - } else if ( !isset( $this->roles[$role_id] ) ) { - $mess = esc_html__('Error: ', 'user-role-editor') . esc_html__('Role', 'user-role-editor') . ' ' . esc_html( $role_id ) . ' ' . - esc_html__('does not exist', 'user-role-editor'); - } else { - $this->current_role = $role_id; - $roles = $this->lib->get_user_roles(); - $this->current_role_name = $roles[$this->current_role]['name']; - $mess = ''; - } - - return $mess; - } - // end of init_current_role_name() - - - // Add existing WPBakery Visial Composer () plugin capabilities from this role to the list of capabilities for save with this role update - - // Visual Composer capabilities are excluded from a role update as they may store not boolean values. - protected function restore_visual_composer_caps() { - - if ( !isset( $this->roles[$this->current_role] ) || - !is_array( $this->roles[$this->current_role]['capabilities'] ) ) { - return false; - } - - foreach($this->roles[$this->current_role]['capabilities'] as $cap=>$value) { - if (strpos($cap, 'vc_access_rules_')!==false) { - $this->capabilities_to_save[$cap] = $value; - } - } - - return true; - } - // end of restore_visual_composer_caps() - - - /** - * prepare capabilities from user input to save at the database - */ - protected function prepare_capabilities_to_save() { - - $this->capabilities_to_save = array(); - if (empty($this->full_capabilities)) { - return; // There is no valid initialization - } - - foreach ( $this->full_capabilities as $cap ) { - $cap_id_esc = URE_Capability::escape( $cap['inner'] ); - if ( isset( $_POST['values'][$cap_id_esc] ) || isset( $_POST[$cap_id_esc] ) ) { - $this->capabilities_to_save[ $cap['inner'] ] = true; - } - } - - $this->restore_visual_composer_caps(); - } - // end of prepare_capabilities_to_save() - - - /** - * Make full synchronization of roles for all sites with roles from the main site directly updating database records - * - * @return boolean - */ - protected function is_full_network_synch() { - - /* is_network_admin() returns wrong result for the AJAX calls from the network admin - * so have to use this way - */ - $network_admin = $this->lib->get_request_var('network_admin', 'post', 'int'); - if ( $network_admin==1 ) { // for Pro version only - $result = true; - } else { - $result = defined('URE_MULTISITE_DIRECT_UPDATE') && URE_MULTISITE_DIRECT_UPDATE == 1; - } - - return $result; - } - // end of is_full_network_synch() - - - protected function last_check_before_update() { - - if ( empty($this->roles ) || !is_array( $this->roles ) || count( $this->roles )===0 ) { - // Nothing to save - something goes wrong - stop execution... - return false; - } - - $key_capability = URE_Own_Capabilities::get_key_capability(); - if ( current_user_can( $key_capability ) ) { - // current user is an URE admin - return true; - } - - if ( !current_user_can( 'ure_edit_roles' ) ) { - // Not enough permissions - return false; - } - - $current_user = wp_get_current_user(); - if ( in_array( $this->current_role, $current_user->roles ) ) { - // Do not allow to non-admin user without full access to URE update his own role - return false; - } - - return true; - } - // end of last_check_before_update() - - - /** - * Return true if $capability is included to the list of capabilities allowed for the single site administrator - * @param string $capability - capability ID - * @param boolean $ignore_super_admin - if - * @return boolean - */ - public function block_cap_for_single_admin($capability, $ignore_super_admin=false) { - - if (!$this->lib->is_pro()) { - // this functionality is for the Pro version only. - return false; - } - $multisite = $this->lib->get('multisite'); - if ( !$multisite ) { // work for multisite only - return false; - } - if ( !$ignore_super_admin && $this->lib->is_super_admin() ) { - // Do not block superadmin - return false; - } - $caps_access_restrict_for_simple_admin = $this->lib->get_option( 'caps_access_restrict_for_simple_admin', 0 ); - if ( !$caps_access_restrict_for_simple_admin ) { - return false; - } - - $allowed_caps = $this->lib->get_option( 'caps_allowed_for_single_admin', array() ); - if (in_array( $capability, $allowed_caps ) ) { - $block_this_cap = false; - } else { - $block_this_cap = true; - } - - return $block_this_cap; - } - // end of block_cap_for_single_admin() - - - /** - * Returns array without capabilities blocked for single site administrators - * @param array $capabilities - * @return array - */ - protected function remove_caps_not_allowed_for_single_admin( $capabilities ) { - if (!$this->lib->is_pro()) { - // this functionality is for the Pro version only. - return $capabilities; - } - - foreach( array_keys( $capabilities ) as $cap ) { - if ( $this->block_cap_for_single_admin( $cap ) ) { - unset( $capabilities[$cap] ); - } - } - - return $capabilities; - } - // end of remove_caps_not_allowed_for_single_admin() - - - protected function role_contains_caps_not_allowed_for_simple_admin( $role_id ) { - - $result = false; - if (!$this->lib->is_pro()) { - // this functionality is for the Pro version only. - return $result; - } - - if ( !isset( $this->roles[$role_id]) ) { - return false; - } - - $role = $this->roles[$role_id]; - if ( !is_array( $role['capabilities'] ) ) { - return false; - } - foreach ( array_keys( $role['capabilities'] ) as $cap ) { - if ( $this->block_cap_for_single_admin( $cap ) ) { - $result = true; - break; - } - } - - return $result; - } - // end of role_contains_caps_not_allowed_for_simple_admin() - - - // Save Roles to database - protected function save_roles() { - global $wpdb; - - if ( !$this->last_check_before_update() ) { - return false; - } - - if ( !isset($this->roles[$this->current_role]) ) { - return false; - } - - $this->capabilities_to_save = $this->remove_caps_not_allowed_for_single_admin( $this->capabilities_to_save ); - $this->roles[$this->current_role]['name'] = $this->current_role_name; - $this->roles[$this->current_role]['capabilities'] = $this->capabilities_to_save; - $option_name = $wpdb->prefix . 'user_roles'; - - update_option($option_name, $this->roles); - - // save additional options for the current role - if (empty($this->role_additional_options)) { - $this->role_additional_options = URE_Role_Additional_Options::get_instance($this->lib); - } - $this->role_additional_options->save($this->current_role); - - return true; - } - // end of save_roles() - - - protected function leave_roles_for_blog( $blog_id, $leave_roles ) { - global $wpdb; - - $prefix = $wpdb->get_blog_prefix( $blog_id ); - $options_table_name = $prefix . 'options'; - $option_name = $prefix . 'user_roles'; - - $query = "SELECT option_value - FROM {$options_table_name} - WHERE option_name='$option_name' - LIMIT 1"; - $value = $wpdb->get_var( $query ); - if ( empty( $value ) ) { - return $this->roles; - } - $blog_roles = unserialize( $value ); - - $roles = $this->roles; - foreach( $leave_roles as $role_id ) { - $roles[$role_id] = $blog_roles[$role_id]; - } - $serialized_roles = serialize( $roles ); - - return $serialized_roles; - } - // end of leave_roles_for_blog() - - - /** - * Update roles for all network using direct database access - quicker in several times - * Execution speed is critical for large multi-site networks. - * @global wpdb $wpdb - * @return boolean - */ - protected function direct_network_roles_update() { - global $wpdb; - - $multisite = $this->lib->get( 'multisite' ); - if (!$multisite) { - return false; - } - - if ( !$this->last_check_before_update() ) { - return false; - } - - if ( !empty( $this->current_role ) ) { - $this->roles[$this->current_role]['name'] = $this->current_role_name; - $this->roles[$this->current_role]['capabilities'] = $this->capabilities_to_save; - } - - $serialized_roles = serialize( $this->roles ); - $blog_ids = $this->lib->get_blog_ids(); - /* - * Roles to leave unchanged during network update which overwrites all roles by default - * $leave_roles = array( blog_id => array('role_id1', 'role_id2', ... ); - */ - $leave_roles = apply_filters('ure_network_update_leave_roles', array(), 10, 1 ); - if ( empty( $leave_roles ) || !is_array( $leave_roles ) ) { - $leave_roles = array(); - } - foreach ( $blog_ids as $blog_id ) { - $prefix = $wpdb->get_blog_prefix( $blog_id ); - $options_table_name = $prefix . 'options'; - $option_name = $prefix . 'user_roles'; - if ( !isset( $leave_roles[$blog_id] ) ) { - // overwrites all roles - $roles = $serialized_roles; - } else { - // overwrite except roles you have to leave untouched for this blog - $roles = $this->leave_roles_for_blog( $blog_id, $leave_roles[$blog_id] ); - } - $query = "UPDATE {$options_table_name} - SET option_value='$roles' - WHERE option_name='$option_name' - LIMIT 1"; - $wpdb->query( $query ); - if ( $wpdb->last_error ) { - return false; - } - // @TODO: save role additional options - - } - - do_action( 'ure_direct_network_roles_update' ); - - return true; - } - // end of direct_network_roles_update() - - - protected function wp_api_network_roles_update() { - global $wpdb; - - $old_blog = $wpdb->blogid; - $blog_ids = $this->lib->get_blog_ids(); - if (empty( $blog_ids ) ) { - return false; - } - - $result = true; - foreach ( $blog_ids as $blog_id ) { - switch_to_blog( $blog_id ); - $this->roles = $this->lib->get_user_roles(); - if ( !isset( $this->roles[$this->current_role] ) ) { // add new role to this blog - $this->roles[$this->current_role] = array('name' => $this->current_role_name, 'capabilities' => array('read' => true)); - } - if ( !$this->save_roles() ) { - $result = false; - break; - } - } - $this->lib->restore_after_blog_switching( $old_blog ); - $this->roles = $this->lib->get_user_roles(); - - return $result; - } - // end of wp_api_network_roles_update() - - - /** - * Update role for all network using WordPress API - * - * @return boolean - */ - protected function multisite_update_roles() { - - $multisite = $this->lib->get('multisite'); - if (!$multisite) { - return false; - } - - $debug = $this->lib->get('debug'); - if ( $debug ) { - $time_shot = microtime(); - } - - if ( $this->is_full_network_synch() ) { - $result = $this->direct_network_roles_update(); - } else { - $result = $this->wp_api_network_roles_update(); - } - - // Use this action to hook a code to execute after roles were updated at all subsites of the multisite network - do_action('ure_after_network_roles_update'); - - if ($debug) { - echo '
Roles updated for ' . ( microtime() - $time_shot ) . ' milliseconds
'; - } - - return $result; - } - // end of multisite_update_roles() - - - /** - * Process user request on update roles - * - * @global WP_Roles $wp_roles - * @return boolean - */ - protected function update_roles() { - global $wp_roles; - - $multisite = $this->lib->get( 'multisite' ); - if ( $multisite && $this->lib->is_super_admin() && $this->apply_to_all ) { - // update Role for all blogs/sites in the network (permitted to superadmin only) - if (!$this->multisite_update_roles()) { - return false; - } - } else { - if (!$this->save_roles()) { - return false; - } - } - - // refresh global $wp_roles - $wp_roles = new WP_Roles(); - - return true; - } - // end of update_roles() - - - /** - * if existing user was not added to the current blog - add him - * @global type $blog_id - * @param type $user - * @return bool - */ - protected function check_blog_user( $user ) { - global $blog_id; - - $result = true; - if ( is_network_admin() ) { - if (!array_key_exists( $blog_id, get_blogs_of_user( $user->ID ) ) ) { - $result = add_existing_user_to_blog( array( 'user_id' => $user->ID, 'role' => 'subscriber' ) ); - } - } - - return $result; - } - // end of check_blog_user() - - - private function get_user_primary_role( $user ) { - - $role = ( is_array( $user->roles ) && count( $user->roles )>0 ) ? $user->roles[0] : ''; - - return $role; - } - - - private function get_new_primary_role( $user ) { - $wp_roles = wp_roles(); - - $select_primary_role = apply_filters( 'ure_users_select_primary_role', true ); - if ( $select_primary_role || $this->lib->is_super_admin()) { - $role = isset( $_POST['values']['primary_role'] ) ? URE_Base_Lib::filter_string_var( $_POST['values']['primary_role'] ) : false; - if ( empty( $role ) || !isset( $wp_roles->roles[$role] ) ) { - $role = ''; - } - } else { - $role = $this->get_user_primary_role( $user ); - } - - return $role; - } - // end of get_new_primary_role() - - - private function get_bbpress_role( $user ) { - - $bbpress = $this->lib->get_bbpress(); - if ( $bbpress->is_active() ) { - $role = bbp_get_user_role( $user->ID ); - } else { - $role = ''; - } - - return $role; - } - // end of get_bbpress_role() - - /** - * Add other roles to roles array for this user, extracting selected values from the POST - * - * @param array $roles - */ - private function add_other_roles( $roles ) { - - $wp_roles = wp_roles(); - - $post_values = isset( $_POST['values'] ) && is_array( $_POST['values'] ) ? $_POST['values'] : array(); - foreach ( $post_values as $key => $value ) { - $result = preg_match( '/^wp_role_(.+)/', $key, $match ); - if ( $result !== 1 ) { - continue; - } - $role = $match[1]; - if ( !isset( $wp_roles->roles[$role] ) ) { - // Skip role if it does not exist - continue; - } - if ( !in_array( $role, $roles ) ) { - $roles[] = $role; - } - } - - return $roles; - } - // end of add_other_roles() - - - /** - * Provide a valid placement of a primary role - 1st element of roles array - * - * @param WP_User $user - * @param array $new_roles - */ - private function set_primary_role( $user, $new_primary_role ) { - - - if ( count( $user->roles )<=1 ) { - // User does not have roles at all or has only single one - return; - } - - $current_primary_role = reset( $user->roles ); - if ( $current_primary_role === $new_primary_role ) { - // Current primary role is equal to a new one - nothing was changed - return; - } - - // remove primary role from user capabilities array - unset( $user->caps[$new_primary_role] ); - // insert new primary role as the 1st elemnt of user capabilities array - $user->caps = array($new_primary_role=>true) + $user->caps; - - // update user permissions ar WordPress internal data structures - exactly the same way as WordPress itself does at WP_User::add_role() - update_user_meta( $user->ID, $user->cap_key, $user->caps ); - $user->get_role_caps(); - $user->update_user_level_from_caps(); - - } - // end of set_primary_role() - - - private function update_user_roles( $user, $new_roles ) { - - foreach( $user->roles as $role ) { - if ( !in_array( $role, $new_roles ) ) { - $user->remove_role( $role ); - } - } - - foreach( $new_roles as $role ) { - if ( !in_array( $role, $user->roles ) ) { - $user->add_role( $role ); - } - } - - if ( !empty( $new_roles ) ) { - $this->set_primary_role( $user, $new_roles[0] ); - } - - } - // end of update_user_roles() - - /** - * Remove from user directly granted capabilities - * - * @param WP_User $user - */ - private function remove_user_capabilities( $user, $caps_to_save ) { - - if ( empty( $user->caps ) ) { - return; - } - - $roles = wp_roles()->roles; - $roles_id = array_keys( $roles ); - $caps = array_keys( $user->caps ); - foreach( $caps as $cap ) { - if ( in_array( $cap, $roles_id ) ) { - // It's a role ID, skip it - continue; - } - if ( !in_array( $cap, $caps_to_save ) ) { - $user->remove_cap( $cap ); - } - } - - } - // end of remove_user_capabilities() - - - /** - * Update individual capabilities of the user - * - * @param WP_User $user - */ - private function update_user_capabilities( $user ) { - // $edit_user_caps = $this->get_edit_user_caps_mode(); - - $caps_to_save = array_keys( $this->capabilities_to_save ); - $this->remove_user_capabilities( $user, $caps_to_save ); - $user_caps = array_keys( $user->caps ); - - // process new added capabilities - foreach ($caps_to_save as $cap ) { - if ( !in_array( $cap, $user_caps ) ) { - $user->add_cap( $cap ); - } - } - - } - // end of update_user_capabilities() - - - /** - * Update user roles and capabilities - * - * @global WP_Roles $wp_roles - * @param WP_User $user - * @return boolean - */ - protected function update_user( $user ) { - - if ( !is_a( $user, 'WP_User') ) { - return false; - } - - do_action( 'ure_before_user_permissions_update', $user->ID ); - - $multisite = $this->lib->get('multisite'); - if ($multisite) { - if ( !$this->check_blog_user( $user ) ) { - return false; - } - } - - $new_primary_role = $this->get_new_primary_role( $user ); - $bbp_role = $this->get_bbpress_role( $user ); - // Build new roles array for the user - $new_roles = array(); - - // restore primary role - if ( !empty( $new_primary_role ) ) { - $new_roles[] = $new_primary_role; - } - - // restore bbPress user role if user had one - if ( !empty( $bbp_role ) ) { - $new_roles[] = $bbp_role; - } - - $new_roles = $this->add_other_roles( $new_roles ); - $this->update_user_roles( $user, $new_roles ); - $this->update_user_capabilities( $user ); - - do_action('ure_user_permissions_update', $user->ID, $user); // In order other plugins may hook to the user permissions update - - return true; - } - // end of update_user() - - - /** - * Save changes to the roles or user - * @param string $mess - notification message to the user - * @return string - notification message to the user - */ - protected function permissions_object_update( $mess ) { - - if ( !empty( $mess ) ) { - $mess .= '
'; - } - - if ( $this->ure_object === 'role' ) { // save role changes to database - if ($this->update_roles()) { - if (!$this->apply_to_all) { - $mess = esc_html__('Role is updated successfully', 'user-role-editor'); - } else { - $mess = esc_html__('Roles are updated for all network', 'user-role-editor'); - } - } else { - $mess = esc_html__('Error occurred during role(s) update', 'user-role-editor'); - } - } else { - if ($this->update_user($this->user_to_edit)) { - $mess = esc_html__('User capabilities are updated successfully', 'user-role-editor'); - } else { - $mess = esc_html__('Error occurred during user update', 'user-role-editor'); - } - } - - return $mess; - } - // end of permissions_object_update() - - - /** - * Return WordPress user roles to its initial state, just like after installation - * @global WP_Roles $wp_roles - */ - protected function wp_roles_reinit() { - global $wp_roles, $wp_user_roles; - - $wp_user_roles = null; - $wp_roles->roles = array(); - $wp_roles->role_objects = array(); - $wp_roles->role_names = array(); - $wp_roles->use_db = true; - - require_once(ABSPATH . '/wp-admin/includes/schema.php'); - populate_roles(); - $wp_roles = new WP_Roles(); - - $this->roles = $this->lib->get_user_roles(); - - } - // end of wp_roles_reinit() - - /** - * Reset user roles to WordPress default roles - */ - public function reset_user_roles() { - - if (!current_user_can('ure_reset_roles')) { - esc_html_e('Insufficient permissions to work with User Role Editor','user-role-editor'); - $debug = ( defined('WP_PHP_UNIT_TEST') && WP_PHP_UNIT_TEST==true ); - if ( !$debug ) { - die; - } else { - return false; - } - } - - $this->wp_roles_reinit(); - URE_Own_Capabilities::init_caps(); - - $multisite = $this->lib->get('multisite'); - if ( !$multisite ) { - return true; - } - - $this->apply_to_all = $this->lib->get_request_var('ure_apply_to_all', 'post', 'checkbox'); - if ($this->apply_to_all) { - $this->current_role = ''; - $this->direct_network_roles_update(); - } - - return true; - } - // end of reset_user_roles() - - - protected function get_role_id_from_post() { - - $result = array('role_id'=>'', 'message'=>''); - $role_id = $this->lib->get_request_var('user_role_id', 'post' ); - if ( empty( $role_id ) ) { - $result['message'] = esc_html__('Error: Role ID is empty!', 'user-role-editor' ); - return $result; - } - // $role_id = utf8_decode( $role_id ); // DEPRECATED as of PHP 8.2.0. - $role_id = mb_convert_encoding( $role_id, 'ISO-8859-1', 'UTF-8'); - // sanitize user input for security - $match = array(); - $valid_name = preg_match( '/[A-Za-z0-9_\-]*/', $role_id, $match ); - if ( !$valid_name || ( $valid_name && ( $match[0] !== $role_id ) ) ) { - // Some non-alphanumeric charactes found! - $result['message'] = esc_html__( 'Error: Role ID must contain latin characters, digits, hyphens or underscore only!', 'user-role-editor' ); - return $result; - } - $numeric_name = preg_match( '/[0-9]*/', $role_id, $match ); - if ( $numeric_name && ( $match[0] === $role_id ) ) { - // Numeric name discovered - $result['message'] = esc_html__( 'Error: WordPress does not support numeric Role name (ID). Add latin characters to it.', 'user-role-editor' ); - return $result; - } - - $result['role_id'] = strtolower( $role_id ); - - return $result; - } - // end of get_role_id_from_post() - - - /** - * Process new role creation request - * - * @return array - operation result data - * - */ - public function add_new_role() { - - $response = array('result'=>'error', 'role_id'=>'', 'role_name'=>'', 'message'=>''); - if ( !current_user_can( 'ure_create_roles' ) ) { - $response['message'] = esc_html__( 'Insufficient permissions to work with User Role Editor','user-role-editor' ); - return $response; - } - - $result = $this->get_role_id_from_post(); - if ( !empty( $result['message'] ) ) { - $response['message'] = $result['message']; - return $response; - } - - $role_id = $result['role_id']; - $wp_roles = wp_roles(); - if ( isset( $wp_roles->roles[$role_id] ) ) { - $response['message'] = sprintf( 'Error! ' . esc_html__( 'Role %s exists already', 'user-role-editor' ), $role_id ); - return $response; - } - - $role_name = $this->lib->get_request_var( 'user_role_name', 'post' ); - if ( empty( $role_name ) ) { - $role_name = $role_id; // as user role name is empty, use user role ID instead as a default value - } - $this->current_role = $role_id; - $role_copy_from = $this->lib->get_request_var( 'user_role_copy_from', 'post' ); - if ( !empty( $role_copy_from ) && $role_copy_from!=='none' && $wp_roles->is_role( $role_copy_from ) ) { - $role = $wp_roles->get_role($role_copy_from); - $capabilities = $this->remove_caps_not_allowed_for_single_admin( $role->capabilities ); - } else { - $capabilities = array('read' => true, 'level_0' => true); // Use subscriber role permissions as a default value - } - // add new role to the roles array - $result = add_role( $role_id, $role_name, $capabilities ); - if ( !isset( $result ) || empty( $result ) ) { - $response['message'] = 'Error! ' . esc_html__('Error is encountered during new role create operation', 'user-role-editor' ); - return $response; - } - - $response['result'] = 'success'; - $response['role_id'] = $role_id; - $response['role_name'] = $role_name; - $response['message'] = sprintf(esc_html__('Role %s is created successfully', 'user-role-editor'), $role_name ); - - - return $response; - } - // end of add_new_role() - - - public function update_role() { - - $response = array('result'=>'error', 'role_id'=>'', 'role_name'=>'', 'message'=>''); - if ( !current_user_can( 'ure_edit_roles' ) ) { - $response['message'] = esc_html__( 'Insufficient permissions to work with User Role Editor','user-role-editor' ); - return $response; - } - - $this->_init0(); - if ( $this->ure_object==='role') { - $result = $this->get_role_id_from_post(); - if ( !empty( $result['message'] ) ) { - $response['message'] = $result['message']; - return $response; - } - } - - $this->roles = $this->lib->get_user_roles(); - $this->full_capabilities = $this->lib->init_full_capabilities( $this->ure_object ); - if ( isset( $_POST['values']['user_role'] ) ) { - $this->notification = $this->init_current_role_name(); - } - $this->prepare_capabilities_to_save(); - $this->notification = $this->permissions_object_update( $this->notification ); - - $response['result'] = 'success'; - if ( $this->ure_object==='role') { - $response['role_id'] = $result['role_id']; - $response['role_name'] = $this->current_role_name; - } - $response['message'] = $this->notification; - - return $response; - } - // end of update_role() - - - public function update_network() { - - $this->init0(); - $this->roles = $this->lib->get_user_roles(); - $this->full_capabilities = $this->lib->init_full_capabilities( $this->ure_object ); - if ( isset( $_POST['user_role'] ) ) { - $this->notification = $this->init_current_role_name(); - } - $this->prepare_capabilities_to_save(); - $this->notification = $this->permissions_object_update( $this->notification ); - - } - // end of update_network() - - - /** - * process rename role request - * - * @global WP_Roles $wp_roles - * - * @return string - message about operation result - * - */ - public function rename_role() { - global $wp_roles; - - $response = array('result'=>'error', 'message'=>'', 'role_id'=>'', 'role_name'=>''); - if ( !current_user_can( 'ure_edit_roles' ) ) { - $response['message'] = esc_html__( 'Insufficient permissions to work with User Role Editor','user-role-editor' ); - return $response; - } - - $result = $this->get_role_id_from_post(); - if ( !empty( $result['message'] ) ) { - $response['message'] = $result['message']; - return $response; - } - - $new_role_name = $this->lib->get_request_var('user_role_name', 'post' ); - if ( empty( $new_role_name ) ) { - $response['message'] = esc_html__( 'Error: Empty role display name is not allowed.', 'user-role-editor' ); - return $response; - } - - $role_id = $result['role_id']; - $wp_roles = wp_roles(); - if ( !isset( $wp_roles->roles[$role_id] ) ) { - $response['message'] = sprintf('Error! ' . esc_html__('Role %s does not exists', 'user-role-editor'), $role_id); - return $response; - } - - $new_role_name = sanitize_text_field( $new_role_name ); - $this->current_role = $role_id; - $this->current_role_name = $new_role_name; - - $old_role_name = $wp_roles->roles[$role_id]['name']; - $wp_roles->roles[$role_id]['name'] = $new_role_name; - update_option( $wp_roles->role_key, $wp_roles->roles ); - - $response['result'] = 'success'; - $response['message'] = sprintf( esc_html__('Role %s is renamed to %s successfully', 'user-role-editor'), $old_role_name, $new_role_name ); - $response['role_id'] = $role_id; - $response['role_name'] = $new_role_name; - - return $response; - } - // end of rename_role() - - - protected function get_wp_built_in_roles() { - - $result = array('subscriber', 'contributor', 'author', 'editor', 'administrator'); - - return $result; - } - // end of get_wp_built_in_roles() - - /** - * return array with roles which we could delete, e.g self-created and not used with any blog user - * - * @return array - */ - public function get_roles_can_delete() { - - $default_role = get_option( 'default_role' ); - $wp_built_in_roles = $this->get_wp_built_in_roles(); - $roles_can_delete = array(); - $users = count_users(); - $roles = $this->lib->get_user_roles(); - foreach ($roles as $key => $role) { - $can_delete = true; - // check if it is default role for new users - if ( $key === $default_role ) { - $can_delete = false; - continue; - } - // Do not allow to delete WordPress built-in role - if ( in_array( $key, $wp_built_in_roles ) ) { - continue; - } - // check if role has capabilities prohibited for the single site administrator - if ( $this->role_contains_caps_not_allowed_for_simple_admin( $key ) ) { - continue; - } - if ( !isset( $users['avail_roles'][$key] ) ) { - $roles_can_delete[$key] = $role['name'] . ' (' . $key . ')'; - } - } - - return $roles_can_delete; - } - // end of get_roles_can_delete() - - - /** - * Deletes user role from the WP database - */ - protected function delete_wp_roles( $roles_to_del ) { - global $wp_roles; - - $result = array('result'=>false, 'deleted_roles'=>array(), 'message'=>''); - $roles_can_delete = $this->get_roles_can_delete(); - $wp_roles = wp_roles(); - foreach($roles_to_del as $role_id) { - if ( !isset( $wp_roles->roles[$role_id] ) ) { - $result['message'] = esc_html__('Role does not exist','user-role-editor') .' - '. $role_id; - return $result; - } - if ( !isset( $roles_can_delete[$role_id]) ) { - $result['message'] = esc_html__( 'You can not delete role', 'user-role-editor' ) .' - '.$role_id; - return $result; - } - - unset( $wp_roles->role_objects[$role_id] ); - unset( $wp_roles->role_names[$role_id] ); - unset( $wp_roles->roles[$role_id] ); - $result['deleted_roles'][] = $role_id; - $result['result'] = true; - } // foreach() - if ( $result['result'] ) { - update_option( $wp_roles->role_key, $wp_roles->roles ); - } - - return $result; - } - // end of delete_wp_roles() - - - protected function delete_all_unused_roles() { - - $roles_to_del = array_keys( $this->get_roles_can_delete() ); - if ( empty( $roles_to_del ) || !is_array( $roles_to_del ) ) { - $result = array( - 'result'=>false, - 'deleted_roles'=>array(), - 'message'=>esc_html__( 'There are no roles for deletion','user-role-editor' )); - return $result; - } - - $result = $this->delete_wp_roles( $roles_to_del ); - - return $result; - } - // end of delete_all_unused_roles() - - - /** - * Process user request for user role deletion - * @return string - */ - public function delete_role() { - - $response = array('result'=>'error', 'message'=>'', 'deleted_roles'=>array()); - if ( !current_user_can('ure_delete_roles') ) { - $response['message'] = esc_html__('Insufficient permissions to work with User Role Editor','user-role-editor'); - return $response; - } - - $role_id = $this->lib->get_request_var( 'user_role_id', 'post'); - if ( $role_id==-1 ) { // delete all unused roles - $result = $this->delete_all_unused_roles(); - } else { - if ( empty( $role_id ) ) { - $response['message'] = esc_html__( 'Wrong role ID','user-role-editor'); - return $response; - } - $result = $this->delete_wp_roles( array( $role_id ) ); - } - if ( $result['result']===true ) { - $response['result'] = 'success'; - $response['deleted_roles'] = $result['deleted_roles']; - if ( $role_id==-1 ) { - $response['message'] = esc_html__( 'Unused roles are deleted successfully', 'user-role-editor' ); - } else { - $response['message'] = sprintf( esc_html__( 'Role %s is deleted successfully', 'user-role-editor' ), $role_id ); - } - } else { - $response['message'] = $result['message']; - } - if ( isset( $_POST['user_role_id'] ) ) { - unset( $_POST['user_role_id'] ); - } - - return $response; - } - // end of delete_role() - - - /** - * Change default WordPress role - * This method is only for a single site of WordPress multisite installation. - * @return string - */ - protected function change_default_role() { - - if ( !current_user_can('ure_delete_roles') ) { - $mess = esc_html__('Insufficient permissions to work with User Role Editor','user-role-editor'); - return $mess; - } - - $multisite = $this->lib->get('multisite'); - if ( !$multisite || is_network_admin() ) { - $mess = esc_html__('This method is only for a single site of WordPress multisite installation.', 'user-role-editor'); - return $mess; - } - if ( empty( $_POST['user_role_id'] ) ) { - $mess = esc_html__('Wrong request. Default role can not be empty', 'user-role-editor'); - return $mess; - } - - $mess = ''; - $wp_roles = wp_roles(); - $role_id = $this->lib->get_request_var('user_role_id', 'post'); - unset( $_POST['user_role_id'] ); - if ( isset( $wp_roles->role_objects[$role_id] ) && $role_id !== 'administrator' ) { - update_option( 'default_role', $role_id ); - $this->wp_default_role = get_option( 'default_role' ); - if ($this->wp_default_role===$role_id) { - $mess = sprintf(esc_html__('Default role for new users is set to %s successfully', 'user-role-editor'), $wp_roles->role_names[$role_id]); - } else { - $mess = 'Error! ' . esc_html__('Error encountered during default role change operation', 'user-role-editor'); - } - } elseif ($role_id === 'administrator') { - $mess = 'Error! ' . esc_html__('Can not set Administrator role as a default one', 'user-role-editor'); - } else { - $mess = 'Error! ' . esc_html__('This role does not exist - ', 'user-role-editor') . esc_html($role_id); - } - - - return $mess; - } - // end of change_default_role() - - - /** - * Process user request - */ - protected function process_user_request() { - - $this->notification = ''; - if ( !isset( $_POST['action'] ) ) { - return false; - } - if ( !$this->valid_nonce() ) { - if ( defined('WP_DEBUG') && WP_DEBUG ) { - return false; - } else { - exit; - } - } - - $action = $this->lib->get_request_var('action', 'post'); - switch ( $action ) { - case 'reset': { - $this->reset_user_roles(); - exit; - } - case 'change-default-role': { - $this->notification = $this->change_default_role(); - break; - } - case 'caps-readable': { - $this->set_caps_readable(); - break; - } - case 'show-deprecated-caps': { - $this->set_show_deprecated_caps(); - break; - } - case 'roles_restore_note': { - $this->notification = esc_html__( 'User Roles are restored to WordPress default values. ', 'user-role-editor' ); - break; - } - default: { - do_action( 'ure_process_user_request' ); - } - } // switch ( $action ) .... - - return true; - } - // end of process_user_request() - - - public function init1() { - - $this->roles = $this->lib->get_user_roles(); - $this->full_capabilities = $this->lib->init_full_capabilities( $this->ure_object ); - if ( empty( $this->role_additional_options ) ) { - $this->role_additional_options = URE_Role_Additional_Options::get_instance( $this->lib ); - } - - } - // end of editor_init1() - - - /** - * Return id of role last in the list of sorted roles - * - */ - protected function get_last_role_id() { - - // get the key of the last element in roles array - $keys = array_keys( $this->roles ); - asort( $keys ); - $last_role_id = array_pop( $keys ); - - return $last_role_id; - } - // end of get_last_role_id() - - - protected function set_current_role() { - - if (!isset($this->current_role) || !$this->current_role) { - if (isset($_REQUEST['user_role']) && $_REQUEST['user_role'] && isset($this->roles[$_REQUEST['user_role']])) { - $this->current_role = $_REQUEST['user_role']; - } else { - $this->current_role = $this->get_last_role_id(); - } - $roles = $this->lib->get_user_roles(); - $this->current_role_name = $roles[$this->current_role]['name']; - } - - } - // end of set_current_role() - - - // returns true if editing user has $capability assigned through the roles or directly - // returns true if editing user has role with name equal $capability - public function user_can($capability) { - - if (isset($this->user_to_edit->caps[$capability])) { - return true; - } - foreach ($this->user_to_edit->roles as $role) { - if ($role===$capability) { - return true; - } - if (!empty($this->roles[$role]['capabilities'][$capability])) { - return true; - } - } - - return false; - } - // end of user_can() - - - protected function show_editor() { - - $this->lib->show_message( $this->notification ); - if ( $this->ure_object == 'user' ) { - $view = new URE_User_View(); - } else { - $this->set_current_role(); - $view = new URE_Role_View(); - $view->role_edit_prepare_html(); - } - ?> -
-

-
-
-
-
- display(); - wp_nonce_field( 'user-role-editor', 'ure_nonce' ); - ?> - -
-
-lib->is_pro() ) { - $view->advertise_pro(); - } -?> -
-lib->is_pro()) { - $view->advertise_commercials(); - } - */ - $view->display_edit_dialogs(); - do_action( 'ure_dialogs_html' ); - URE_Role_View::output_confirmation_dialog(); -?> -
-
- init0()) { - $message = esc_html__( 'Error: wrong request', 'user-role-editor' ); - $this->lib->show_message( $message ); - return false; - } - - $this->process_user_request(); - $this->init1(); - $this->show_editor(); - - return true; - } - // end of show() - - - public function set_notification($value) { - - $this->notification = $value; - - } - // end of set_notification() - - - /** - * Not really used in the plugin - just storage for the translation strings - */ - protected function translation_data() { -// for the translation purpose - if (false) { -// Standard WordPress roles - __('Editor', 'user-role-editor'); - __('Author', 'user-role-editor'); - __('Contributor', 'user-role-editor'); - __('Subscriber', 'user-role-editor'); -// Standard WordPress capabilities - __('Switch themes', 'user-role-editor'); - __('Edit themes', 'user-role-editor'); - __('Activate plugins', 'user-role-editor'); - __('Edit plugins', 'user-role-editor'); - __('Edit users', 'user-role-editor'); - __('Edit files', 'user-role-editor'); - __('Manage options', 'user-role-editor'); - __('Moderate comments', 'user-role-editor'); - __('Manage categories', 'user-role-editor'); - __('Manage links', 'user-role-editor'); - __('Upload files', 'user-role-editor'); - __('Import', 'user-role-editor'); - __('Unfiltered html', 'user-role-editor'); - __('Edit posts', 'user-role-editor'); - __('Edit others posts', 'user-role-editor'); - __('Edit published posts', 'user-role-editor'); - __('Publish posts', 'user-role-editor'); - __('Edit pages', 'user-role-editor'); - __('Read', 'user-role-editor'); - __('Level 10', 'user-role-editor'); - __('Level 9', 'user-role-editor'); - __('Level 8', 'user-role-editor'); - __('Level 7', 'user-role-editor'); - __('Level 6', 'user-role-editor'); - __('Level 5', 'user-role-editor'); - __('Level 4', 'user-role-editor'); - __('Level 3', 'user-role-editor'); - __('Level 2', 'user-role-editor'); - __('Level 1', 'user-role-editor'); - __('Level 0', 'user-role-editor'); - __('Edit others pages', 'user-role-editor'); - __('Edit published pages', 'user-role-editor'); - __('Publish pages', 'user-role-editor'); - __('Delete pages', 'user-role-editor'); - __('Delete others pages', 'user-role-editor'); - __('Delete published pages', 'user-role-editor'); - __('Delete posts', 'user-role-editor'); - __('Delete others posts', 'user-role-editor'); - __('Delete published posts', 'user-role-editor'); - __('Delete private posts', 'user-role-editor'); - __('Edit private posts', 'user-role-editor'); - __('Read private posts', 'user-role-editor'); - __('Delete private pages', 'user-role-editor'); - __('Edit private pages', 'user-role-editor'); - __('Read private pages', 'user-role-editor'); - __('Delete users', 'user-role-editor'); - __('Create users', 'user-role-editor'); - __('Unfiltered upload', 'user-role-editor'); - __('Edit dashboard', 'user-role-editor'); - __('Update plugins', 'user-role-editor'); - __('Delete plugins', 'user-role-editor'); - __('Install plugins', 'user-role-editor'); - __('Update themes', 'user-role-editor'); - __('Install themes', 'user-role-editor'); - __('Update core', 'user-role-editor'); - __('List users', 'user-role-editor'); - __('Remove users', 'user-role-editor'); - __('Add users', 'user-role-editor'); - __('Promote users', 'user-role-editor'); - __('Edit theme options', 'user-role-editor'); - __('Delete themes', 'user-role-editor'); - __('Export', 'user-role-editor'); - } - } - // end of translation_data() - - - - /** - * Prevent cloning of the instance of the *Singleton* instance. - * - * @return void - */ - public function __clone() { - throw new \Exception('Do not clone a singleton instance.'); - } - // end of __clone() - - /** - * Prevent unserializing of the *Singleton* instance. - * - * @return void - */ - public function __wakeup() { - throw new \Exception('Do not unserialize a singleton instance.'); - } - // end of __wakeup() - -} -// end of URE_Editor class diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/grant-roles.php b/wp/wp-content/plugins/user-role-editor/includes/classes/grant-roles.php deleted file mode 100644 index de6aac2a..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/grant-roles.php +++ /dev/null @@ -1,495 +0,0 @@ -lib = URE_Lib::get_instance(); - - add_action( 'load-users.php', array( $this, 'load' ) ); - - } - // end of __construct() - - - public function load() { - - add_action('restrict_manage_users', array($this, 'show_roles_manage_html') ); - add_action('admin_head', array(User_Role_Editor::get_instance(), 'add_css_to_users_page') ); - add_action('admin_enqueue_scripts', array($this, 'load_js') ); - - $this->update_roles(); - - } - // end of load() - - - private static function validate_users($users) { - - if (!is_array($users)) { - return false; - } - - foreach ($users as $user_id) { - if (!is_numeric($user_id)) { - return false; - } - if ( !current_user_can( 'promote_user', $user_id ) ) { - return false; - } - - if ( is_multisite() && !is_user_member_of_blog( $user_id ) ) { - return false; - } - - } - - return true; - } - // end of validate_users() - - - private function add_role( $users ) { - - if ( !empty( $_REQUEST['ure_add_role'] ) ) { - $role = $_REQUEST['ure_add_role']; - } else { - $role = $_REQUEST['ure_add_role_2']; - } - - if ( !self::validate_roles( array($role=>$role) ) ) { - return; - } - - $done = false; - foreach( $users as $user_id ) { - $user = get_user_by( 'id', $user_id ); - if (empty( $user ) ) { - continue; - } - if ( empty($user->roles) || !in_array( $role, $user->roles ) ) { - $user->add_role( $role ); - $done = true; - } - } - - if ( $done ) { - // Redirect to the users screen. - if ( wp_redirect( add_query_arg( 'update', 'promote', 'users.php' ) ) ) { - exit; - } - } - } - // end of add_role() - - - private function is_try_remove_admin_from_himself( $user_id, $role) { - - $result = false; - - $current_user = wp_get_current_user(); - $wp_roles = wp_roles(); - $role_caps = array_keys( $wp_roles->roles[$role]['capabilities'] ); - $is_current_user = ( $user_id == $current_user->ID ); - $role_can_promote = in_array('promote_users', $role_caps); - $can_manage_network = is_multisite() && current_user_can( 'manage_network_users' ); - - // If the removed role has the `promote_users` cap and user is removing it from himself - if ( $is_current_user && $role_can_promote && !$can_manage_network ) { - $result = true; - - // Loop through the current user's roles. - foreach ($current_user->roles as $_role) { - $_role_caps = array_keys( $wp_roles->roles[$_role]['capabilities'] ); - // If the current user has another role that can promote users, it's safe to remove the role. Else, the current user should to keep this role. - if ( ($role!==$_role) && in_array( 'promote_users', $_role_caps ) ) { - $result = false; - break; - } - } - - } - - return $result; - } - - - private function revoke_role( $users ) { - - if ( !empty( $_REQUEST['ure_revoke_role'] ) ) { - $role = $_REQUEST['ure_revoke_role']; - } else { - $role = $_REQUEST['ure_revoke_role_2']; - } - - if ( !self::validate_roles( array($role=>$role) ) ) { - return; - } - - $done = false; - foreach( $users as $user_id ) { - $user = get_user_by( 'id', $user_id ); - if (empty( $user ) ) { - continue; - } - if ($this->is_try_remove_admin_from_himself( $user_id, $role ) ) { - continue; - } - if ( is_array($user->roles) && in_array( $role, $user->roles ) ) { - $user->remove_role( $role ); - $done = true; - } - } - if ( $done ) { - if ( wp_redirect( add_query_arg( 'update', 'promote', 'users.php' ) ) ) { - exit; - } - } - } - // end of revoke_role() - - - private function update_roles() { - - if ( empty( $_REQUEST['users'] ) ) { - return; - } - - if ( !current_user_can('promote_users') ) { - return; - } - $users = (array) $_REQUEST['users']; - if ( !self::validate_users( $users ) ) { - return; - } - - if ( ( !empty( $_REQUEST['ure_add_role'] ) && !empty( $_REQUEST['ure_add_role_submit']) ) || - ( !empty( $_REQUEST['ure_add_role_2'] ) && !empty( $_REQUEST['ure_add_role_submit_2'] ) ) ) { - $this->add_role( $users ); - } else if ( ( !empty( $_REQUEST['ure_revoke_role'] ) && !empty( $_REQUEST['ure_revoke_role_submit'] ) ) || - ( !empty( $_REQUEST['ure_revoke_role_2'] ) && !empty( $_REQUEST['ure_revoke_role_submit_2'] ) ) ) { - $this->revoke_role( $users ); - } - } - // end of update_roles() - - - private static function validate_roles($roles) { - - if (!is_array($roles)) { - return false; - } - - $lib = URE_Lib::get_instance(); - $editable_roles = $lib->get_all_editable_roles(); - $valid_roles = array_keys($editable_roles); - foreach($roles as $role) { - if (!in_array($role, $valid_roles)) { - return false; - } - } - - return true; - } - // end of validate_roles() - - - private static function grant_primary_role_to_user($user_id, $role) { - - $user = get_user_by('id', $user_id); - if (empty($user)) { - return; - } - - if ($role===self::NO_ROLE_FOR_THIS_SITE) { - $role = ''; - } - $old_roles = $user->roles; // Save currently granted roles to restore from them the bbPress roles later if there are any... - $user->set_role($role); - - $lib = URE_Lib::get_instance(); - $bbpress = $lib->get('bbpress'); - if (empty($bbpress)) { - return; - } - - $bbp_roles = $bbpress->extract_bbp_roles($old_roles); - if (count($bbp_roles)>0) { // restore bbPress roles - foreach($bbp_roles as $role) { - $user->add_role($role); - } - } - - } - // end of grant_primary_role_to_user() - - - private static function grant_other_roles_to_user($user_id, $roles) { - - $user = get_user_by('id', $user_id); - if (empty($user)) { - return; - } - - $roles_list = array_values( $user->roles ); - $primary_role = array_shift( $roles_list ); // Get the 1st element from the roles array - $lib = URE_Lib::get_instance(); - $bbpress = $lib->get( 'bbpress' ); - if ( empty( $bbpress ) ) { - $bbp_roles = array(); - } else { - $bbp_roles = $bbpress->extract_bbp_roles( $user->roles ); - } - $user->remove_all_caps(); - $roles2 = ure_array_merge( array( $primary_role ), $bbp_roles, $roles ); - foreach( $roles2 as $role ) { - $user->add_role( $role ); - } - - } - // end of grant_other_roles_to_user() - - - /** - * Decide if primary role should be granted or left as it is - * - * @param string $primary_role - * @return boolean - */ - private static function is_select_primary_role($primary_role) { - - if (empty($primary_role)) { - return false; // Primary role was not selected by user, leave an older one - } - - $lib = URE_Lib::get_instance(); - if ($lib->is_super_admin()) { - $select_primary_role = true; - } else { - $select_primary_role = apply_filters('ure_users_select_primary_role', true); - } - - return $select_primary_role; - } - // end of is_select_primary_role() - - - public static function grant_roles() { - - if ( !current_user_can('promote_users') ) { - $answer = array('result'=>'error', 'message'=>esc_html__('Not enough permissions', 'user-role-editor')); - return $answer; - } - - $users = $_POST['users']; - if (!self::validate_users($users)) { - $answer = array('result'=>'error', 'message'=>esc_html__('Can not edit user or invalid data at the users list', 'user-role-editor')); - return $answer; - } - -// Primary role - $primary_role = $_POST['primary_role']; - if (!empty($primary_role) && ($primary_role!==self::NO_ROLE_FOR_THIS_SITE) && - !self::validate_roles(array($primary_role=>$primary_role))) { - $answer = array('result'=>'error', 'message'=>esc_html__('Invalid primary role', 'user-role-editor')); - return $answer; - } - - if (self::is_select_primary_role($primary_role)) { - foreach ($users as $user_id) { - self::grant_primary_role_to_user($user_id, $primary_role); - } - } - -// Other roles - $other_roles = isset($_POST['other_roles']) ? $_POST['other_roles'] : null; - if (!empty($other_roles) && !self::validate_roles($other_roles)) { - $answer = array('result'=>'error', 'message'=>esc_html__('Invalid data at the other roles list', 'user-role-editor')); - return $answer; - } - - if (!empty($other_roles)) { - foreach($users as $user_id) { - self::grant_other_roles_to_user($user_id, $other_roles); - } - } - $answer = array('result'=>'success', 'message'=>esc_html__('Roles were granted to users successfully', 'user-role-editor')); - - return $answer; - } - // end of grant_roles() - - - public static function get_user_roles() { - - if ( !current_user_can( 'promote_users' ) ) { - $answer = array('result'=>'error', 'message'=>esc_html__('Not enough permissions', 'user-role-editor')); - return $answer; - } - - $lib = URE_Lib::get_instance(); - $user_id = (int) $lib->get_request_var('user_id', 'post', 'int'); - if (empty($user_id)) { - $answer = array('result'=>'error', 'message'=>esc_html__('Wrong request, valid user ID was missed', 'user-role-editor')); - return $answer; - } - - $user = get_user_by('id', $user_id); - if (empty($user)) { - $answer = array('result'=>'error', 'message'=>esc_html__('Requested user does not exist', 'user-role-editor')); - return $answer; - } - - $other_roles = array_values($user->roles); - $primary_role = array_shift($other_roles); - - $answer = array('result'=>'success', 'primary_role'=>$primary_role, 'other_roles'=>$other_roles, 'message'=>'User roles were sent'); - - return $answer; - } - // end of get_user_roles() - - - - private function select_primary_role_html() { - - $select_primary_role = apply_filters('ure_users_select_primary_role', true); - if (!$select_primary_role && !$this->lib->is_super_admin()) { - return; - } -?> - - - - -
- -
- - -
-lib->show_admin_role_allowed(); - $roles = $this->lib->get_all_editable_roles(); - foreach ($roles as $role_id => $role) { - if (!$show_admin_role && $role_id=='administrator') { - continue; - } - echo '
'. PHP_EOL; - } -?> -
-0) ? '_2': ''; - $roles_options_list = self::get_roles_options_list(); -?> -    - -    - - - -    - - - - - - -
-
-select_primary_role_html(); - $this->select_other_roles_html(); -?> -
-
- wp_create_nonce('user-role-editor'), - 'dialog_title'=> esc_html__('Grant roles to selected users', 'user-role-editor'), - 'select_users_first' => esc_html__('Select users to which you wish to grant roles!', 'user-role-editor'), - 'select_roles_first' => esc_html__('Select role(s) which you wish to grant!', 'user-role-editor'), - 'show_wp_change_role' => $show_wp_change_role ? 1: 0 - )); - } - // end of load_js() - -} -// end of URE_Grant_Roles class diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/known-js-css-compatibility-issues.php b/wp/wp-content/plugins/user-role-editor/includes/classes/known-js-css-compatibility-issues.php deleted file mode 100644 index cd81fa3d..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/known-js-css-compatibility-issues.php +++ /dev/null @@ -1,89 +0,0 @@ -registered['admin-page-css'])) { - wp_deregister_style('admin-page-css'); - } - } - // end of unload_conflict_plugins_css() - - - -} -// end of URE_Fix_Known_JS_CSS_Compatibility_Issues \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/lib.php b/wp/wp-content/plugins/user-role-editor/includes/classes/lib.php deleted file mode 100644 index d711d59f..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/lib.php +++ /dev/null @@ -1,590 +0,0 @@ -debug = defined('URE_DEBUG') && (URE_DEBUG==1 || URE_DEBUG==true); - $this->get_bbpress(); - $this->upgrade(); - - } - // end of __construct() - - - public function get_bbpress() { - - if ($this->bbpress===null) { - $this->bbpress = new URE_bbPress(); - } - - return $this->bbpress; - - } - // end of get_bbpress() - - - public static function get_instance($options_id = '') { - - if (self::$instance === null) { - if (empty($options_id)) { - throw new Exception('URE_Lib::get_instance() - Error: plugin options ID string is required'); - } - // new static() will work too - self::$instance = new URE_Lib($options_id); - } - - return self::$instance; - } - // end of get_instance() - - - protected function upgrade() { - - if (!is_admin()) { - return; - } - - $ure_version = $this->get_option('ure_version', '0'); - if (version_compare( $ure_version, URE_VERSION, '<' ) ) { - // put version upgrade stuff here - - $this->put_option('ure_version', URE_VERSION, true); - } - - } - // end of upgrade() - - - /** - * Is this the Pro version? - * @return boolean - */ - public function is_pro() { - - return false; - } - // end of is_pro() - - - public function set_raised_permissions($value) { - - $this->raised_permissions = !empty($value) ? true : false; - - } - // end of set_raised_permissions() - - - /** - * get options for User Role Editor plugin - * User Role Editor stores its options at the main blog/site only and applies them to the all network - * - */ - protected function init_options($options_id) { - global $wpdb; - - if ($this->multisite) { - if ( ! function_exists( 'is_plugin_active_for_network' ) ) { // Be sure the function is defined before trying to use it - require_once( ABSPATH . '/wp-admin/includes/plugin.php' ); - } - $this->active_for_network = is_plugin_active_for_network(URE_PLUGIN_BASE_NAME); - } - $current_blog = $wpdb->blogid; - if ($this->multisite && $current_blog!=$this->main_blog_id) { - if ($this->active_for_network) { // plugin is active for whole network, so get URE options from the main blog - switch_to_blog($this->main_blog_id); - } - } - - $this->options_id = $options_id; - $this->options = get_option($options_id); - - if ($this->multisite && $current_blog!=$this->main_blog_id) { - if ($this->active_for_network) { // plugin is active for whole network, so return back to the current blog - restore_current_blog(); - } - } - - } - // end of init_options() - - - /** - * saves options array into WordPress database wp_options table - */ - public function flush_options() { - global $wpdb; - - $current_blog = $wpdb->blogid; - if ($this->multisite && $current_blog!==$this->main_blog_id) { - if ($this->active_for_network) { // plugin is active for whole network, so get URE options from the main blog - switch_to_blog($this->main_blog_id); // in order to save URE options to the main blog - } - } - - update_option($this->options_id, $this->options); - - if ($this->multisite && $current_blog!==$this->main_blog_id) { - if ($this->active_for_network) { // plugin is active for whole network, so return back to the current blog - restore_current_blog(); - } - } - - } - // end of flush_options() - - - public function get_main_blog_id() { - - return $this->main_blog_id; - - } - - - /** - * Checks if user is allowed to use User Role Editor - * - * @param int $user_id - * @return boolean true - */ - public function user_is_admin($user_id = false) { - - if (empty($user_id)) { - $user_id = get_current_user_id(); - } - if ( $this->is_super_admin( $user_id ) ) { - return true; - } - - $ure_key_capability = URE_Own_Capabilities::get_key_capability(); - $user = get_userdata( $user_id ); - $result = !empty( $user->allcaps[ $ure_key_capability ] ); - - return $result; - } - // end of user_is_admin() - - - /** - * return array with WordPress user roles - * - * @global WP_Roles $wp_roles - * @global type $wp_user_roles - * @return array - */ - public function get_user_roles() { - - $bbpress = $this->get_bbpress(); - if ($bbpress->is_active()) { // bbPress plugin is active - $roles = $bbpress->get_roles(); - } else { - $wp_roles = wp_roles(); - $roles = $wp_roles->roles; - } - - return $roles; - } - // end of get_user_roles() - - - /** - * Respect 'editable_roles' filter, when needed - * @return array - */ - public function get_editable_user_roles( $roles = array() ) { - - if ( empty( $roles ) ) { - $roles = $this->get_user_roles(); - } - $bbpress = $this->get_bbpress(); - if ($bbpress->is_active()) { - remove_filter('editable_roles', 'bbp_filter_blog_editable_roles'); - } - $roles = apply_filters('editable_roles', $roles ); - if ( $bbpress->is_active() ) { - add_filter('editable_roles', 'bbp_filter_blog_editable_roles'); - } - - return $roles; - } - // end of get_editable_user_roles() - - - /** - * return array of built-in WP capabilities (WP 3.1 wp-admin/includes/schema.php) - * - * @return array - */ - public function get_built_in_wp_caps() { - - $caps_groups = URE_Capabilities_Groups_Manager::get_instance(); - $caps = $caps_groups->get_built_in_wp_caps(); - - return $caps; - } - // end of get_built_in_wp_caps() - - - /** - * Return all available post types except non-public WordPress built-in post types - * - * @return array - */ - public function _get_post_types() { - - $all_post_types = get_post_types(); - $internal_post_types = get_post_types(array('public'=>false, '_builtin'=>true)); - $post_types = array_diff($all_post_types, $internal_post_types); - - return $post_types; - } - // end of _get_post_types() - - - public function get_edit_post_capabilities() { - $capabilities = array( - 'create_posts', - 'edit_posts', - 'edit_published_posts', - 'edit_others_posts', - 'edit_private_posts', - 'publish_posts', - 'read_private_posts', - 'delete_posts', - 'delete_private_posts', - 'delete_published_posts', - 'delete_others_posts' - ); - - return $capabilities; - } - // end of get_edit_post_capabilities(); - - - public function init_full_capabilities( $ure_object ) { - - $capabilities = URE_Capabilities::get_instance(); - $full_list = $capabilities->init_full_list( $ure_object ); - - return $full_list; - } - // end of init_full_capabilities() - - - public function restore_after_blog_switching($blog_id = 0) { - - if (!empty($blog_id)) { - switch_to_blog($blog_id); - } - // cleanup blog switching data - $GLOBALS['_wp_switched_stack'] = array(); - $GLOBALS['switched'] = ! empty( $GLOBALS['_wp_switched_stack'] ); - } - // end of restore_after_blog_switching() - - - /** - * Returns administrator role ID - * - * @return string - */ - public function get_admin_role() { - - $roles = $this->get_user_roles(); - if (isset($roles['administrator'])) { - $admin_role_id = 'administrator'; - } else { - // go through all roles and select one with max quant of capabilities included - $max_caps = -1; - $admin_role_id = ''; - foreach(array_keys($roles) as $role_id) { - $caps = count($roles[$role_id]['capabilities']); - if ($caps>$max_caps) { - $max_caps = $caps; - $admin_role_id = $role_id; - } - } - } - - return $admin_role_id; - } - // end get_admin_role() - - - /** - * Returns text presentation of user roles - * - * @param type $roles user roles list - * @return string - */ - public function roles_text($roles) { - global $wp_roles; - - if (is_array($roles) && count($roles) > 0) { - $role_names = array(); - foreach ($roles as $role) { - if (isset($wp_roles->roles[$role])) { - $role_names[] = $wp_roles->roles[$role]['name']; - } else { - $role_names[] = $role; - } - } - $output = implode(', ', $role_names); - } else { - $output = ''; - } - - return $output; - } - // end of roles_text() - - - public function about() { - if ($this->is_pro()) { - return; - } - -?> -

User Role Editor

- -

-
-
-
-
-
- -
-
- - - - -
-
-*/ -?> - -get_option('show_admin_role', 0); - $show_admin_role = ((defined('URE_SHOW_ADMIN_ROLE') && URE_SHOW_ADMIN_ROLE==1) || $show_admin_role==1) && $this->user_is_admin(); - - return $show_admin_role; - } - // end of show_admin_role() - - - /** - * Returns true if user has a real super administrator permissions - * It takes into account $this->raised_permissions value, in order do not count a user with temporally raised permissions - * of a real superadmin under WP Multisite - * For WP Singlesite superadmin is a user with 'administrator' role only in opposite the WordPress's is_super_admin(), - * which counts as superadmin any user with 'delete_users' capability - * - * @param int $user_id - * @return boolean - */ - public function is_super_admin( $user_id = false ) { - - if (empty($user_id)) { - $user = wp_get_current_user(); - $user_id = $user->ID; - } else { - $user = get_userdata($user_id); - } - if (!$user || !$user->exists()) { - return false; - } - - if ( $this->multisite && !$this->raised_permissions && is_super_admin( $user_id ) ) { - return true; - } - - if (!$this->multisite && $this->user_has_role( $user, 'administrator' ) ) { - return true; - } - - return false; - } - // end of is_super_admin() - - - public function user_has_role( $user, $role) { - - if (empty($user)) { - return false; - } - - if (!is_a($user, 'WP_User')) { - return false; - } - - if (empty($user->roles)) { - return false; - } - - if (!in_array( $role, $user->roles ) ) { - return false; - } - - return true; - } - // end of user_has_role() - - - // Returns true for any capability if user is a real superadmin under WordPress Multisite - // Returns true if user has $capability assigned through the roles or directly - // Returns true if user has role with name equal $cap - public function user_has_capability($user, $cap) { - global $wp_roles; - - if (!is_object($user) || !is_a( $user, 'WP_User') || empty($user->ID)) { - return false; - } - - // Do not replace with $this->is_super_admin() to exclude recursion - if ($this->multisite && !$this->raised_permissions && is_super_admin($user->ID)) { - return true; - } - - if (isset($user->caps[$cap])) { - return true; - } - foreach ($user->roles as $role) { - if ($role === $cap) { - return true; - } - if (!empty($wp_roles->roles[$role]['capabilities'][$cap])) { - return true; - } - } - - return false; - } - // end of user_has_capability() - - - // create assign_role object - public function get_assign_role() { - - $assign_role = new URE_Assign_Role(); - - return $assign_role; - } - // end of get_assign_role() - - - /** - * Compare if current URL path is equal to the required one - * if $path is empty, then just check if URL leads to wp-admin - * @param string $path - * @return boolean - */ - public function is_right_admin_path( $path='' ) { - $result = true; - $admin_url = admin_url( $path ); - $parsed = wp_parse_url( $admin_url ); - $full_path = $parsed['path']; - if ( stripos( $_SERVER['REQUEST_URI'], $full_path )===false ) { - $result = false; - } - - return $result; - } - // end of is_right_admin_path() - - - public function is_wp_built_in_role( $role ) { - - $wp_built_in_roles = array( - 'administrator', - 'editor', - 'author', - 'contributor', - 'subscriber'); - - $result = in_array( $role, $wp_built_in_roles ); - - return $result; - } - // end of is_wp_built_in_role() - - - /* - * It's overriden in Pro version to add bbPress roles - */ - public function get_all_editable_roles() { - - $roles = get_editable_roles(); // WordPress roles - if ( has_filter( 'editable_roles', array( User_Role_Editor::get_instance(), 'sort_wp_roles_list') ) ) { - // to show roles in the accending order - $roles = array_reverse( $roles ); - } - - return $roles; - } - // end of get_all_roles() - - /* - * Wrapper to get_taxonomies() to get the custom taxonomies list - */ - public function get_custom_taxonomies( $output='names' ) { - $args = array( - 'show_ui'=>true, - 'public'=>true, - '_builtin'=>false - ); - $taxonomies = get_taxonomies( $args, $output ); - - return $taxonomies; - } - // end of get_custom_taxonomies() - -} -// end of URE_Lib class diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/own-capabilities.php b/wp/wp-content/plugins/user-role-editor/includes/classes/own-capabilities.php deleted file mode 100644 index da88f604..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/own-capabilities.php +++ /dev/null @@ -1,160 +0,0 @@ - - * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya - **/ -class URE_Own_Capabilities { - const URE_SETTINGS_CAP_TR = 'ure_settings_cap'; - - - public static function get_caps() { - - $lib = URE_Lib::get_instance(); - - $ure_caps = array( - 'ure_edit_roles' => 1, - 'ure_create_roles' => 1, - 'ure_delete_roles' => 1, - 'ure_create_capabilities' => 1, - 'ure_delete_capabilities' => 1, - 'ure_manage_options' => 1, - 'ure_reset_roles' => 1 - ); - - if ($lib->is_pro()) { - $ure_caps['ure_export_roles'] = 1; - $ure_caps['ure_import_roles'] = 1; - $ure_caps['ure_admin_menu_access'] = 1; - $ure_caps['ure_widgets_access'] = 1; - $ure_caps['ure_widgets_show_access'] = 1; - $ure_caps['ure_meta_boxes_access'] = 1; - $ure_caps['ure_other_roles_access'] = 1; - $ure_caps['ure_edit_posts_access'] = 1; - $ure_caps['ure_edit_gravityforms_access'] = 1; - $ure_caps['ure_plugins_activation_access'] = 1; - $ure_caps['ure_view_posts_access'] = 1; - $ure_caps['ure_front_end_menu_access'] = 1; - $ure_caps['ure_nav_menus_access'] = 1; - $multisite = $lib->get('multisite'); - if ($multisite) { - $ure_caps['ure_themes_access'] = 1; - } - } - - return $ure_caps; - } - // end of get_caps() - - - /** - * return key capability to have access to User Role Editor Plugin - */ - public static function get_key_capability() { - - $lib = URE_Lib::get_instance(); - $key_cap = $lib->get('key_capability'); - - if (!empty($key_cap)) { - return $key_cap; - } - - $multisite = $lib->get('multisite'); - if ( !$multisite ) { - $key_cap = URE_KEY_CAPABILITY; - } else { - $enable_simple_admin_for_multisite = $lib->get_option('enable_simple_admin_for_multisite', 0); - if ( ( defined('URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE') && URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE == 1 ) || - $enable_simple_admin_for_multisite ) { - $key_cap = URE_KEY_CAPABILITY; - } else { - $key_cap = 'manage_network_plugins'; - } - } - $lib->set('key_capability', $key_cap); - - return $key_cap; - } - // end of get_key_capability() - - - /** - * Return user capability for the User Role Editor Settings page - * - * @return string - */ - public static function get_settings_capability() { - - $lib = URE_Lib::get_instance(); - $settings_cap = $lib->get('settings_capability'); - if ( !empty( $settings_cap ) ) { - return $settings_cap; - } - - $multisite = $lib->get('multisite'); - if (!$multisite) { - $settings_cap = 'ure_manage_options'; - } else { - $enable_simple_admin_for_multisite = $lib->get_option('enable_simple_admin_for_multisite', 0); - if ( ( defined('URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE' ) && URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE == 1 ) || - $enable_simple_admin_for_multisite ) { - $settings_cap = 'ure_manage_options'; - } else { - $settings_cap = self::get_key_capability(); - } - } - $lib->set('settings_capability', $settings_cap ); - - return $settings_cap; - } - // end of get_settings_capability() - - - public static function init_caps() { - - $wp_roles = wp_roles(); - if ( !isset( $wp_roles->roles['administrator'] ) ) { - return; - } - - $lib = URE_Lib::get_instance(); - $multisite = $lib->get('multisite'); - // Do not turn on URE caps for local administrator by default under multisite, as there is a superadmin. - $turn_on = !$multisite; - - $old_use_db = $wp_roles->use_db; - $wp_roles->use_db = true; - $administrator = $wp_roles->role_objects['administrator']; - $ure_caps = self::get_caps(); - foreach( array_keys( $ure_caps ) as $cap ) { - if ( !$administrator->has_cap( $cap ) ) { - $administrator->add_cap( $cap, $turn_on ); - } - } - $wp_roles->use_db = $old_use_db; - } - // end of init_caps() - - - /** - * Return list of URE capabilities with data about groups they were included - * - * @return array - */ - public static function get_caps_groups() { - - $ure_caps = self::get_caps(); - $caps = array(); - foreach( array_keys( $ure_caps ) as $ure_cap ) { - $caps[$ure_cap] = array('custom', 'user_role_editor'); - } - - return $caps; - } - // end of get_caps_groups() - -} -// end of URE_Capabilities class \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/protect-admin.php b/wp/wp-content/plugins/user-role-editor/includes/classes/protect-admin.php deleted file mode 100644 index f00d33e7..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/protect-admin.php +++ /dev/null @@ -1,243 +0,0 @@ -lib = URE_Lib::get_instance(); - $this->user_to_check = array(); - - // Exclude administrator role from edit list. - add_filter('editable_roles', array($this, 'exclude_admin_role')); - if (in_array($pagenow, array('users.php', 'user-edit.php'))) { - // prohibit any actions with user who has Administrator role - add_filter('user_has_cap', array($this, 'not_edit_admin'), 10, 3); - } - // exclude users with 'Administrator' role from users list - add_action('pre_user_query', array($this, 'exclude_administrators')); - // do not show 'Administrator (s)' view above users list - add_filter('views_users', array($this, 'exclude_admins_view')); - } - // end of __construct() - - - // apply protection to the user edit pages only - protected function is_protection_applicable() { - global $pagenow; - - $result = false; - $pages_to_block = array('profile.php', 'users.php', 'user-new.php', 'user-edit.php'); - if (in_array($pagenow, $pages_to_block)) { - $result = true; - } - - return $result; - } - // end of is_protection_applicable() - - - /** - * exclude administrator role from the roles list - * - * @param string $roles - * @return array - */ - public function exclude_admin_role( $roles ) { - - if ( $this->is_protection_applicable() && isset( $roles['administrator'] ) ) { - unset( $roles['administrator'] ); - } - - return $roles; - } - // end of exclude_admin_role() - - - /** - * Check if user has "Administrator" role assigned - * - * @global wpdb $wpdb - * @param int $user_id - * @return boolean returns true is user has Role "Administrator" - */ - private function has_administrator_role($user_id) { - global $wpdb; - - if (empty($user_id) || !is_numeric($user_id)) { - return false; - } - - $meta_key = $wpdb->prefix .'capabilities'; - $query = $wpdb->prepare( - "SELECT count(*) - FROM {$wpdb->usermeta} - WHERE user_id=%d AND meta_key=%s AND meta_value LIKE %s", - array($user_id, $meta_key, '%"administrator"%') ); - $has_admin_role = $wpdb->get_var( $query ); - if ($has_admin_role > 0) { - $result = true; - } else { - $result = false; - } - // cache checking result for the future use - $this->user_to_check[$user_id] = $result; - - return $result; - } - - // end of has_administrator_role() - - - /** - * We have two vulnerable queries with user id at admin interface, which should be processed - * 1st: http://blogdomain.com/wp-admin/user-edit.php?user_id=ID&wp_http_referer=%2Fwp-admin%2Fusers.php - * 2nd: http://blogdomain.com/wp-admin/users.php?action=delete&user=ID&_wpnonce=ab34225a78 - * If put Administrator user ID into such request, user with lower capabilities (if he has 'edit_users') - * can edit, delete admin record - * This function removes 'edit_users' or 'delete_users' or 'remove_users' capability from current user capabilities, - * if request sent against a user with 'administrator' role - * - * @param array $allcaps - * @param type $caps - * @param string $name - * @return array - */ - public function not_edit_admin($allcaps, $caps, $name) { - - if (is_array($caps) & count($caps)>0) { - // 1st element of this array not always has index 0. Use workaround to extract it. - $caps_v = array_values($caps); - $cap = $caps_v[0]; - } else { - $cap = $caps; - } - $checked_caps = array('edit_users', 'delete_users', 'remove_users'); - if (!in_array($cap, $checked_caps)) { - return $allcaps; - } - - $user_keys = array('user_id', 'user'); - foreach ($user_keys as $user_key) { - $access_deny = false; - $user_id = (int) $this->lib->get_request_var($user_key, 'get', 'int'); - if (empty($user_id)) { // check the next key - continue; - } - if ($user_id == 1) { // built-in WordPress Admin - $access_deny = true; - } else { - if (!isset($this->user_to_check[$user_id])) { - // check if user_id has Administrator role - $access_deny = $this->has_administrator_role($user_id); - } else { - // user_id was checked already, get result from cash - $access_deny = $this->user_to_check[$user_id]; - } - } - if ($access_deny && isset($allcaps[$cap])) { - unset($allcaps[$cap]); - - } - break; - } - - return $allcaps; - } - // end of not_edit_admin() - - - /** - * add where criteria to exclude users with 'Administrator' role from users list - * - * @global wpdb $wpdb - * @param type $user_query - */ - public function exclude_administrators($user_query) { - global $wpdb; - - if (!$this->is_protection_applicable()) { // block the user edit stuff only - return; - } - - // get user_id of users with 'Administrator' role - $current_user_id = get_current_user_id(); - $meta_key = $wpdb->prefix . 'capabilities'; - $query = $wpdb->prepare( - "SELECT user_id - FROM {$wpdb->usermeta} - WHERE user_id!=%d AND meta_key=%s AND meta_value like %s", - array($current_user_id, $meta_key, '%"administrator"%')); - $ids_arr = $wpdb->get_col( $query ); - if (is_array($ids_arr) && count($ids_arr) > 0) { - $ids = implode(',', $ids_arr); - $user_query->query_where .= " AND ( $wpdb->users.ID NOT IN ( $ids ) )"; - } - } - // end of exclude_administrators() - - - private function extract_view_quantity($text) { - $match = array(); - $result = preg_match('#\((.*?)\)#', $text, $match); - if ($result) { - $quantity = $match[1]; - } else { - $quantity = 0; - } - - return $quantity; - } - // end of extract_view_quantity() - - - private function extract_int($str_val) { - $str_val1 = str_replace(',', '', $str_val); // remove ',' from numbers like '2,015' - $int_val = (int) preg_replace('/[^\-\d]*(\-?\d*).*/','$1', $str_val1); // extract numeric value strings like from '2015 bla-bla' - - return $int_val; - } - // end of extract_int() - - - /* - * Exclude view of users with Administrator role - * - */ - public function exclude_admins_view($views) { - - if (!isset($views['administrator'])) { - return $views; - } - - if (isset($views['all'])) { - // Decrease quant of all users for a quant of hidden admins - $admins_orig_s = $this->extract_view_quantity($views['administrator']); - $admins_int = $this->extract_int($admins_orig_s); - $all_orig_s = $this->extract_view_quantity($views['all']); - $all_orig_int = $this->extract_int($all_orig_s); - $all_new_int = $all_orig_int - $admins_int; - $all_new_s = number_format_i18n($all_new_int); - $views['all'] = str_replace($all_orig_s, $all_new_s, $views['all']); - } - - unset($views['administrator']); - - return $views; - } - // end of exclude_admins_view() - -} -// end of URE_Protect_Admin class diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/role-additional-options.php b/wp/wp-content/plugins/user-role-editor/includes/classes/role-additional-options.php deleted file mode 100644 index 8658b26b..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/role-additional-options.php +++ /dev/null @@ -1,144 +0,0 @@ -lib = $lib; - $this->init(); - } - // end of __construct() - - - public static function get_instance($lib) { - - if (self::$instance===null) { - self::$instance = new URE_Role_Additional_Options($lib); - } - - return self::$instance; - } - // end of get_instance() - - - public static function create_item($id, $label, $hook, $routine) { - $item = new stdClass(); - $item->id = $id; - $item->label = $label; - $item->hook = $hook; - $item->routine = $routine; - - return $item; - } - // end of create_item() - - - public static function get_active_items() { - - $data = get_option(self::STORAGE_ID, array()); - - return $data; - } - - - private function init() { - - $this->items = array(); - $item = self::create_item('hide_admin_bar', esc_html__('Hide admin bar', 'user-role-editor'), 'init', 'ure_hide_admin_bar'); - $this->items[$item->id] = $item; - - // Allow other developers to modify the list of role's additonal options - $this->items = apply_filters('ure_role_additional_options', $this->items); - - $this->active_items = self::get_active_items(); - } - // end of init() - - - public function set_active_items_hooks() { - - $current_user = wp_get_current_user(); - foreach($current_user->roles as $role) { - if (!isset($this->active_items[$role])) { - continue; - } - foreach(array_keys($this->active_items[$role]) as $item_id) { - if (isset($this->items[$item_id])) { - add_action($this->items[$item_id]->hook, $this->items[$item_id]->routine, 99); - } - } - } - - } - // end of set_active_items_hooks() - - - public function save($current_role) { - - $wp_roles = wp_roles(); - $this->active_items = self::get_active_items(); - - // remove non-existing roles - foreach(array_keys($this->active_items) as $role_id) { - if (!isset($wp_roles->roles[$role_id])) { - unset($this->active_items[$role_id]); - } - } - - // Save additonal options section for the current role - $this->active_items[$current_role] = array(); - foreach( $this->items as $item ) { - if ( isset( $_POST['values'][$item->id] ) ) { - $this->active_items[$current_role][$item->id] = 1; - } - } - - update_option( self::STORAGE_ID, $this->active_items ); - - } - // end of save() - - - public function show($current_role) { - -?> - -
- : - - - - - -
- -items as $item) { - $checked = (isset($this->active_items[$current_role]) && - isset($this->active_items[$current_role][$item->id])) ? 'checked="checked"' : ''; - if (!$first_time) { -?> -
- - > - - -
- - * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya - **/ -class URE_Role_View extends URE_View { - - public $role_default_html = ''; - private $role_to_copy_html = ''; - private $role_select_html = ''; - private $role_delete_html = ''; - private $caps_to_remove = null; - - - - public function __construct() { - - parent::__construct(); - - $capabilities = URE_Capabilities::get_instance(); - $this->caps_to_remove = $capabilities->get_caps_to_remove(); - - } - // end of __construct() - - - public function role_default_prepare_html($select_width=200) { - - $roles = $this->lib->get_editable_user_roles(); - $caps_access_restrict_for_simple_admin = $this->lib->get_option('caps_access_restrict_for_simple_admin', 0); - $show_admin_role = $this->lib->show_admin_role_allowed(); - if ($select_width>0) { - $select_style = 'style="width: '. $select_width .'px"'; - } else { - $select_style = ''; - } - $wp_default_role = get_option( 'default_role' ); - $this->role_default_html = ''; - - } - // end of role_default_prepare_html() - - - private function role_select_copy_prepare_html( $select_width=200 ) { - - $current_user = wp_get_current_user(); - $key_capability = URE_Own_Capabilities::get_key_capability(); - $user_is_ure_admin = current_user_can( $key_capability ); - $role_to_skip = ( $user_is_ure_admin ) ? '' : $current_user->roles[0]; - - $caps_access_restrict_for_simple_admin = $this->lib->get_option( 'caps_access_restrict_for_simple_admin', 0 ); - $show_admin_role = $this->lib->show_admin_role_allowed(); - $this->role_to_copy_html = ''; - $current_role = $this->editor->get( 'current_role' ); - $all_roles = $this->editor->get( 'roles' ); - $roles = $this->lib->get_editable_user_roles( $all_roles ); - foreach ($roles as $key => $value) { - if ( $key===$role_to_skip ) { // skip role of current user if he does not have full access to URE - continue; - } - $selected1 = selected( $key, $current_role, false ); - $disabled = ( $key==='administrator' && $caps_access_restrict_for_simple_admin && !$this->lib->is_super_admin()) ? 'disabled' : ''; - if ( $show_admin_role || $key != 'administrator' ) { - $role_name = $value['name'] .' (' . $key . ')'; - $this->role_select_html .= ''; - $this->role_to_copy_html .= ''; - } - } - $this->role_select_html .= ''; - $this->role_to_copy_html .= ''; - } - // end of role_select_copy_prepare_html() - - - private function role_delete_prepare_html() { - - $roles_can_delete = $this->editor->get_roles_can_delete(); - if ( is_array( $roles_can_delete ) && count( $roles_can_delete ) > 0) { - ksort( $roles_can_delete ); - $this->role_delete_html = ''; - } else { - $this->role_delete_html = ''; - } - - } - // end of role_delete_prepare_html() - - - /** - * Build HTML for select drop-down list from capabilities we can remove - * - * @return string - **/ - public static function caps_to_remove_html() { - global $wp_roles; - - $capabilities = URE_Capabilities::get_instance(); - $caps_to_remove = $capabilities->get_caps_to_remove(); - if ( empty( $caps_to_remove ) || !is_array( $caps_to_remove ) && count( $caps_to_remove )===0 ) { - return ''; - } - - $caps = array_keys($caps_to_remove); - asort($caps); - $network_admin = filter_input(INPUT_POST, 'network_admin', FILTER_SANITIZE_NUMBER_INT); - $current_role = isset( $_POST['current_role'] ) ? URE_Base_Lib::filter_string_var( $_POST['current_role'] ) : ''; - if (!isset($wp_roles->roles[$current_role])) { - $current_role = ''; - } - ob_start(); -?> -
- - - - - - - - - - - -
- -
- - - -
- - - -
-role_select_copy_prepare_html( $select_width ); - $multisite = $this->lib->get( 'multisite' ); - if ( $multisite && !is_network_admin() ) { - $this->role_default_prepare_html( $select_width ); - } - $this->role_delete_prepare_html(); - - } - // end of role_edit_prepare_html() - - - public function display_edit_dialogs() { - $multisite = $this->lib->get('multisite'); - $current_role = $this->editor->get('current_role'); - $current_role_name = $this->editor->get('current_role_name'); -?> - - - -
-
-
-
-
-
-
-
role_to_copy_html; ?>
-
-
- -
-
-
-
-
-
-
-
- -
-
-
-
role_delete_html; ?>
-
-
- - -
-
- role_default_html; ?> -
-
- - -
-
-
-
-
- -
-
-
-
-
-
- -current_role - * @param boolean $role_delete - * @param boolean $capability_remove - */ - public function toolbar() { - $caps_access_restrict_for_simple_admin = $this->lib->get_option('caps_access_restrict_for_simple_admin', 0); - if ($caps_access_restrict_for_simple_admin) { - $add_del_role_for_simple_admin = $this->lib->get_option('add_del_role_for_simple_admin', 1); - } else { - $add_del_role_for_simple_admin = 1; - } - $super_admin = $this->lib->is_super_admin(); - $multisite = $this->lib->get('multisite'); - -?> -
-
- - -
- -
- - - - - - -role_delete_html) && current_user_can('ure_delete_roles')) { -?> - -caps_to_remove) && is_array($this->caps_to_remove) && count($this->caps_to_remove)>0 && - current_user_can('ure_delete_capabilities')) { -?> - - -
- -
- -
- -
- -
-lib->get('multisite'); - $active_for_network = $this->lib->get('active_for_network'); -?> -
-editor->get('caps_readable'); - if ($caps_readable) { - $checked = 'checked="checked"'; - } else { - $checked = ''; - } - $caps_access_restrict_for_simple_admin = $this->lib->get_option('caps_access_restrict_for_simple_admin', 0); - if ($this->lib->is_super_admin() || !$multisite || !$this->lib->is_pro() || !$caps_access_restrict_for_simple_admin) { -?> - onclick="ure_main.turn_caps_readable();"/> -    -editor->get('show_deprecated_caps'); - if ($show_deprecated_caps) { - $checked = 'checked="checked"'; - } else { - $checked = ''; - } -?> - onclick="ure_turn_deprecated_caps(0);"/> - -lib->is_super_admin()) { - $hint = esc_html__('If checked, then apply action to ALL sites of this Network'); - $apply_to_all = $this->editor->get('apply_to_all'); - if ($apply_to_all) { - $checked = 'checked="checked"'; - $fontColor = 'color:#FF0000;'; - } else { - $checked = ''; - $fontColor = ''; - } -?> -
- title="" onclick="ure_main.apply_to_all_on_click(this)"/> - -
- -
-
- -
-
- role_select_html; ?> -
-
-display_options(); - $this->display_caps(); - $ao = $this->editor->get('role_additional_options'); - $current_role = $this->editor->get('current_role'); - $ao->show($current_role); -?> - -
-
-'. esc_html__('User Role Editor Options page help', 'user-role-editor') .' -

-

    -
  • ' . esc_html__('Show Administrator role at User Role Editor', 'user-role-editor').' - ' . - esc_html__('turn this option on in order to make the "Administrator" role available at the User Role Editor ' - . 'roles selection drop-down list. It is hidden by default for security reasons.','user-role-editor') . '
  • -
  • ' . esc_html__('Show capabilities in the human readable form','user-role-editor').' - ' . - esc_html__('automatically converts capability names from the technical form for internal use like ' - . '"edit_others_posts" to more user friendly form, e.g. "Edit others posts".','user-role-editor') . '
  • -
  • ' . esc_html__('Show deprecated capabilities','user-role-editor').' - '. - esc_html__('Capabilities like "level_0", "level_1" are deprecated and are not used by WordPress. ' - . 'They are left at the user roles for the compatibility purpose with old themes and plugins code. ' - . 'Turning on this option will show those deprecated capabilities.', 'user-role-editor') . '
  • -
  • ' . esc_html__('Confirm role update','user-role-editor').' - ' . - esc_html__('Show confirmation dialog before save changes made to a current role.') . '
  • -
  • ' . esc_html__('Edit user capabilities','user-role-editor').' - '. - esc_html__('If turned off - capabilities section of selected user is shown in readonly mode. ' - . 'Administrator can not assign capabilities to the user directly. ' - . 'He should do it using roles only.', 'user-role-editor') . '
  • '; - - $text = apply_filters('ure_get_settings_general_tab_help', $text); - $text .=' -
-

'; - - return $text; - } - // end of get_general_tab() - - - protected function get_additional_modules_tab() { - $text = '

'. esc_html__('User Role Editor Options page help', 'user-role-editor') .'

-

-

    '; - if (!is_multisite()) { - $text .= '
  • ' . esc_html__('Count users without role', 'user-role-editor').' - ' . - esc_html__('Show at the "Users" page a quant of users without role. Module allows to assign all of them '. - 'an empty role "No rights", in order to look on the users list with role "No rights" at the separate tab then.','user-role-editor') . '
  • '; - } - $text = apply_filters('ure_get_settings_additional_modules_tab_help', $text); - $text .=' -
-

'; - - return $text; - } - // end of get_additional_modules_tab() - - - protected function get_default_roles_tab() { - $text = '

'. esc_html__('User Role Editor Options page help', 'user-role-editor') .'

-

-

    -
  • ' . esc_html__('Other default roles for new registered user', 'user-role-editor').' - ' . - esc_html__('select roles below to assign them to the new user automatically as an addition to the primary role. '. - 'Note for multisite environment: take into account that other default roles should exist at the site, '. - 'in order to be assigned to the new registered users.','user-role-editor') . '
  • '; - - $text = apply_filters('ure_get_settings_default_roles_tab_help', $text); - $text .=' -
-

'; - - return $text; - } - // end of get_default_roles_tab() - - - protected function get_multisite_tab() { - $text = '

'. esc_html__( 'User Role Editor Options page help', 'user-role-editor' ) .'

-

-

    -
  • ' . esc_html__( 'Allow non super-administrators to create, edit and delete users', 'user-role-editor' ).' - '. - esc_html__( 'Super administrator only may create, edit and delete users under WordPress multi-site by default. '. - 'Turn this option on in order to remove this limitation.','user-role-editor' ) .'
  • '; - - $text = apply_filters('ure_get_settings_multisite_tab_help', $text); - $text .=' -
-

'; - - return $text; - } - // end of get_multisite_tab() - - - public function get_settings_help($tab_name) { - switch ($tab_name) { - case 'general':{ - $text = $this->get_general_tab(); - break; - } - case 'additional_modules':{ - $text = $this->get_additional_modules_tab(); - break; - } - case 'default_roles':{ - $text = $this->get_default_roles_tab(); - break; - } - case 'multisite':{ - $text = $this->get_multisite_tab(); - break; - } - default: - } - - return $text; - } - // end of get_settings_help() - -} -// end of URE_Screen_Help diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/settings.php b/wp/wp-content/plugins/user-role-editor/includes/classes/settings.php deleted file mode 100644 index edf5e67f..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/settings.php +++ /dev/null @@ -1,270 +0,0 @@ -get_request_var('show_admin_role', 'post', 'checkbox'); - } - $lib->put_option('show_admin_role', $show_admin_role); - - $caps_readable = $lib->get_request_var('caps_readable', 'post', 'checkbox'); - $lib->put_option('ure_caps_readable', $caps_readable); - - $show_deprecated_caps = $lib->get_request_var('show_deprecated_caps', 'post', 'checkbox'); - $lib->put_option('ure_show_deprecated_caps', $show_deprecated_caps); - - $confirm_role_update = $lib->get_request_var('confirm_role_update', 'post', 'checkbox'); - $lib->put_option('ure_confirm_role_update', $confirm_role_update); - - $edit_user_caps = $lib->get_request_var('edit_user_caps', 'post', 'checkbox'); - $lib->put_option('edit_user_caps', $edit_user_caps); - - $caps_columns_quant = (int) $lib->get_request_var('caps_columns_quant', 'post', 'int'); - $lib->put_option('caps_columns_quant', $caps_columns_quant); - - do_action('ure_settings_update1'); - - $lib->flush_options(); - $lib->show_message(esc_html__('User Role Editor options are updated', 'user-role-editor')); - - } - // end of update_general_options() - - - /** - * Update Additional Modules Options tab - */ - protected static function update_addons_options() { - - $lib = URE_Lib::get_instance(); - $multisite = $lib->get('multisite'); - if (!$multisite) { - $count_users_without_role = $lib->get_request_var('count_users_without_role', 'post', 'checkbox'); - $lib->put_option('count_users_without_role', $count_users_without_role); - } - do_action('ure_settings_update2'); - - $lib->flush_options(); - $lib->show_message(esc_html__('User Role Editor options are updated', 'user-role-editor')); - } - // end of update_addons_options() - - - protected static function update_default_roles() { - global $wp_roles; - - $lib = URE_Lib::get_instance(); - - // Primary default role - $primary_default_role = $lib->get_request_var('default_user_role', 'post'); - if (!empty($primary_default_role) && isset($wp_roles->role_objects[$primary_default_role]) && $primary_default_role !== 'administrator') { - update_option('default_role', $primary_default_role); - } - - // Other default roles - $other_default_roles = array(); - foreach($_POST as $key=>$value) { - $prefix = substr($key, 0, 8); - if ($prefix!=='wp_role_') { - continue; - } - $role_id = substr($key, 8); - if ($role_id!=='administrator' && isset($wp_roles->role_objects[$role_id])) { - $other_default_roles[] = $role_id; - } - } // foreach() - $lib->put_option('other_default_roles', $other_default_roles, true); - - $lib->show_message(esc_html__('Default Roles are updated', 'user-role-editor')); - } - // end of update_default_roles() - - - protected static function update_multisite_options() { - - $lib = URE_Lib::get_instance(); - - $multisite = $lib->get('multisite'); - if (!$multisite) { - return; - } - - $allow_edit_users_to_not_super_admin = $lib->get_request_var('allow_edit_users_to_not_super_admin', 'post', 'checkbox'); - $lib->put_option('allow_edit_users_to_not_super_admin', $allow_edit_users_to_not_super_admin); - - do_action('ure_settings_ms_update'); - - $lib->flush_options(); - $lib->show_message(esc_html__('User Role Editor options are updated', 'user-role-editor')); - - } - // end of update_multisite_options() - - - protected static function tools_exec() { - - $lib = URE_Lib::get_instance(); - $roles_reset = $lib->get_request_var( 'ure_reset_roles_exec', 'post', 'int'); - if ( $roles_reset==1 ) { - URE_Tools::reset_roles(); - } else { - do_action( 'ure_settings_tools_exec' ); - } - - } - //end of tools_exec() - - - private static function controller() { - - $action = self::get_action(); - switch ($action) { - case 'ure_settings_update': - self::update_general_options(); - break; - case 'ure_addons_settings_update': - self::update_addons_options(); - break; - case 'ure_settings_ms_update': - self::update_multisite_options(); - break; - case 'ure_default_roles_update': - self::update_default_roles(); - break; - case 'ure_settings_tools_exec': - self::tools_exec(); - break; - case 'show': - default: - ; - } // switch() - - } - // end of controller() - - - public static function show_other_default_roles() { - - $lib = URE_Lib::get_instance(); - $other_default_roles = $lib->get_option('other_default_roles', array()); - $roles = $lib->get_editable_user_roles(); - $wp_default_role = get_option('default_role'); - foreach ($roles as $role_id => $role) { - if ( $role_id=='administrator' || $role_id==$wp_default_role ) { - continue; - } - if ( in_array( $role_id, $other_default_roles ) ) { - $checked = 'checked="checked"'; - } else { - $checked = ''; - } - echo '
'; - } - - } - // end of show_other_default_roles() - - - - public static function get_settings_link() { - - $lib = URE_Lib::get_instance(); - $multisite = $lib->get('multisite'); - - if ($multisite && is_network_admin()) { - $link = 'settings.php'; - } else { - $link = 'options-general.php'; - } - - return $link; - - } - // end of get_settings_link(); - - - - public static function show() { - - $lib = URE_Lib::get_instance(); - self::controller(); - - if (defined('URE_SHOW_ADMIN_ROLE') && (URE_SHOW_ADMIN_ROLE == 1)) { - $show_admin_role = 1; - } else { - $show_admin_role = $lib->get_option('show_admin_role', 0); - } - $caps_readable = $lib->get_option('ure_caps_readable', 0); - $show_deprecated_caps = $lib->get_option('ure_show_deprecated_caps', 0); - $confirm_role_update = $lib->get_option('ure_confirm_role_update', 1); - $edit_user_caps = $lib->get_option('edit_user_caps', 1); - $caps_columns_quant = $lib->get_option('caps_columns_quant', 1); - $multisite = $lib->get('multisite'); - if ($multisite) { - $allow_edit_users_to_not_super_admin = $lib->get_option('allow_edit_users_to_not_super_admin', 0); - } else { - $count_users_without_role = $lib->get_option('count_users_without_role', 0); - } - - $view = new URE_Role_View(); - $view->role_default_prepare_html(0); - - $ure_tab_idx = (int) $lib->get_request_var('ure_tab_idx', 'post', 'int'); - - do_action('ure_settings_load'); - - $link = self::get_settings_link(); - $active_for_network = $lib->get('active_for_network'); - $license_key_only = $multisite && is_network_admin() && !$active_for_network; - - - require_once(URE_PLUGIN_DIR . 'includes/settings-template.php'); - } - // end of show() - -} -// end of URE_Settings class \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/task-queue.php b/wp/wp-content/plugins/user-role-editor/includes/classes/task-queue.php deleted file mode 100644 index 8c5edc82..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/task-queue.php +++ /dev/null @@ -1,148 +0,0 @@ -init(); - - } - // end of __construct() - - - private function init() { - - $this->queue = get_option(self::OPTION_NAME, array()); - - } - // end of init() - - - public function reinit() { - - $this->init(); - - } - // end of reinit() - - - /** - * - * @param string $task_id - * @param array $args=array('action'=>'action_name', 'routine'=>'routine_name', 'priority'=>99) - */ - public function add($task_id, $args=array()) { - - $this->queue[$task_id] = $args; - update_option(self::OPTION_NAME, $this->queue); - - } - // end of add_task() - - - public function remove($task_id) { - - if (isset($this->queue[$task_id])) { - unset($this->queue[$task_id]); - update_option(self::OPTION_NAME, $this->queue); - } - } - // end of remove_task() - - - /** - * Returns true in case a queue is empty - * - * @return boolean - */ - public function is_empty() { - - return count($this->queue)==0; - } - // end of is_empty() - - - /** - * Consumers should add there tasks with add_method and add 'ure_fulfil_task' action routine to work on it. - * Do not forget remove task after it was fulfilled. - * - * @return void - */ - - public function process() { - - if ($this->is_empty()) { - return; - } - - foreach($this->queue as $task_id=>$task) { - if ($task_id=='on_activation') { - do_action('ure_on_activation'); - $this->remove('on_activation'); // remove this task after execution if it was defined - } elseif (!empty($task['action'])) { - $priority = empty($task['priority']) ? 10: $task['priority']; - add_action($task['action'], $task['routine'], $priority); - } else { - add_action('init', $task['routine']); - } - } - } - // end of process(); - - /** - * Prevent cloning of the instance of the *Singleton* instance. - * - * @return void - */ - public function __clone() { - throw new \Exception('Do not clone a singleton instance.'); - } - // end of __clone() - - /** - * Prevent unserializing of the *Singleton* instance. - * - * @return void - */ - public function __wakeup() { - throw new \Exception('Do not unserialize a singleton instance.'); - } - // end of __wakeup() - -} -// end of class URE_On_Activation \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/tools.php b/wp/wp-content/plugins/user-role-editor/includes/classes/tools.php deleted file mode 100644 index b7a2b6d2..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/tools.php +++ /dev/null @@ -1,82 +0,0 @@ -get('multisite'); - $link = URE_Settings::get_settings_link(); - - if (!$multisite || (is_main_site( get_current_blog_id() ) || ( is_network_admin() && $lib->is_super_admin() ) ) ) { - if ( current_user_can( 'ure_reset_roles' ) ) { -?> - -
-
-

Reset User Roles

-   -'; - esc_html_e('If any plugins (such as WooCommerce, S2Member and many others) have changed user roles and capabilities during installation, those changes will be LOST!', 'user-role-editor'); echo '
'; - esc_html_e('For more information on how to undo undesired changes and restore plugins capabilities in case you lost them by mistake go to: ', 'user-role-editor'); - echo 'http://role-editor.com/how-to-restore-deleted-wordpress-user-roles/'; - - if ( $multisite ) { -?> -

- - - () - -

- - <- -

- - - - - -
-
- -reset_user_roles() ) { - return; - } - - $lib = URE_Lib::get_instance(); - $lib->put_option( 'other_default_roles', array(), true ); - $lib->show_message( esc_html__('Tools: Reset: User Roles were initialized', 'user-role-editor') ); - - } - // end of reset_roles() - - - public static function show( $tab_idx ) { - - do_action( 'ure_settings_tools_show', $tab_idx ); - - // Placed here, after all tools which may be added above, as a very rare needed functionality - self::show_reset_roles( $tab_idx ); - - } - // end of show() - - -} -// end of URE_Tools \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/uninstall.php b/wp/wp-content/plugins/user-role-editor/includes/classes/uninstall.php deleted file mode 100644 index 56dcc0a1..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/uninstall.php +++ /dev/null @@ -1,95 +0,0 @@ -lib = URE_Lib::get_instance(); - $this->init_options_list(); - $this->own_caps = array_keys( URE_Own_Capabilities::get_caps() ); - - } - // end of __construct() - - - protected function init_options_list() { - - $this->options = array(); - $this->options[] = 'ure_caps_readable'; - $this->options[] = 'ure_show_deprecated_caps'; - $this->options[] = 'ure_hide_pro_banner'; - $this->options[] = 'ure_role_additional_options_values'; - $this->options[] = 'ure_task_queue'; - $this->options[] = 'user_role_editor'; - - } - // end fo init_options_list() - - - private function delete_options() { - global $wpdb; - - $backup_option_name = $wpdb->prefix . 'backup_user_roles'; - delete_option( $backup_option_name ); - foreach ( $this->options as $option_name ) { - delete_option( $option_name ); - } - - } - // end of delete_options() - - - private function delete_caps() { - - - $wp_roles = wp_roles(); - if ( $wp_roles->use_db ) { - $wp_roles->use_db = false; // minimize database update requests - $use_db = true; - } else { - $use_db = false; - } - - foreach( $wp_roles->roles as $role_id=>$role ) { - foreach( $this->own_caps as $cap ) { - if ( isset( $role['capabilities'][ $cap ]) ) { - $wp_roles->remove_cap( $role_id, $cap ); - } - } - } - - if ( $use_db ) { // save changes to the database - $wp_roles->add_cap( 'subscriber', 'dummy_cap' ); - $wp_roles->use_db = true; // restore original value - $wp_roles->remove_cap( 'subscriber', 'dummy_cap' ); - } - - } - // end of delete_caps() - - - public function act() { - global $wpdb; - - if ( !is_multisite() ) { - $this->delete_options(); - $this->delete_caps(); - } else { - $old_blog = $wpdb->blogid; - $blog_ids = $this->lib->get_blog_ids(); - foreach ( $blog_ids as $blog_id ) { - switch_to_blog( $blog_id ); - $this->delete_options(); - $this->delete_caps(); - } - $this->lib->restore_after_blog_switching( $old_blog ); - } - } - // end of act() - -} -// end of class URE_Uninstall diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/user-other-roles.php b/wp/wp-content/plugins/user-role-editor/includes/classes/user-other-roles.php deleted file mode 100644 index 5b3215a7..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/user-other-roles.php +++ /dev/null @@ -1,416 +0,0 @@ -lib = URE_Lib::get_instance(); - $this->set_hooks(); - - } - // end of $lib - - - public function set_hooks() { - - add_filter( 'additional_capabilities_display', array($this, 'additional_capabilities_display'), 10, 1); - add_action( 'admin_print_styles-user-edit.php', array($this, 'load_css') ); - add_action( 'admin_print_styles-user-new.php', array($this, 'load_css') ); - add_action( 'admin_enqueue_scripts', array($this, 'load_js' ) ); - add_action( 'edit_user_profile', array($this, 'edit_user_profile_html'), 10, 1 ); - add_action( 'user_new_form', array($this, 'user_new_form'), 10, 1 ); - add_action( 'profile_update', array($this, 'update'), 10 ); - - $multisite = $this->lib->get('multisite'); - if ($multisite) { - add_action( 'wpmu_activate_user', array($this, 'add_other_roles'), 10, 1 ); - add_action( 'added_existing_user', array($this, 'add_other_roles'), 10, 1); - } - add_action( 'user_register', array($this, 'add_other_roles'), 10, 1 ); - - } - // end of set_hooks() - - - public function additional_capabilities_display( $display ) { - - $show = apply_filters('ure_show_additional_capabilities_section', true); - if ( empty( $show ) ) { - return $display; - } - - - if ( !current_user_can('promote_users') ) { - return $display; // No permissions to promote users - } - - $display = false; - - return $display; - - } - // end of additional_capabilities_display() - - - /* - * Load CSS for the user profile edit page - */ - public function load_css() { - - $show = apply_filters('ure_show_additional_capabilities_section', true ); - if ( empty( $show ) ) { - return; - } - - if ( !current_user_can('promote_users') ) { - return; // No permissions to promote users - } - - if ( defined('WP_DEBUG') && !empty( WP_DEBUG ) ) { - $file_name = 'multiple-select.css'; - } else { - $file_name = 'multiple-select.min.css'; - } - - wp_enqueue_style('wp-jquery-ui-dialog'); - wp_enqueue_style('ure-jquery-multiple-select', plugins_url('/css/'. $file_name, URE_PLUGIN_FULL_PATH ), array(), false, 'screen'); - - } - // end of load_css() - - - public function load_js($hook_suffix) { - - if ( !in_array( $hook_suffix, array('user-edit.php', 'user-new.php') ) ) { - return; - } - - $show = apply_filters('ure_show_additional_capabilities_section', true ); - if ( empty( $show ) ) { - return; - } - - if ( !current_user_can('promote_users') ) { - return; // No permissions to promote users - } - - if ( defined('WP_DEBUG') && !empty( WP_DEBUG ) ) { - $ms_file_name = 'multiple-select.js'; - } else { - $ms_file_name = 'multiple-select.min.js'; - } - - $select_primary_role = apply_filters('ure_users_select_primary_role', true); - - wp_enqueue_script('jquery-ui-dialog', '', array('jquery-ui-core', 'jquery-ui-button', 'jquery'), false, true ); - wp_register_script('ure-jquery-multiple-select', plugins_url('/js/'. $ms_file_name, URE_PLUGIN_FULL_PATH ), array(), URE_VERSION, true ); - wp_enqueue_script('ure-jquery-multiple-select'); - wp_register_script('ure-user-profile-other-roles', plugins_url('/js/user-profile-other-roles.js', URE_PLUGIN_FULL_PATH ), array(), URE_VERSION, true ); - wp_enqueue_script('ure-user-profile-other-roles'); - wp_localize_script('ure-user-profile-other-roles', 'ure_data_user_profile_other_roles', array( - 'wp_nonce' => wp_create_nonce('user-role-editor'), - 'other_roles' => esc_html__('Other Roles', 'user-role-editor'), - 'select_roles' => esc_html__('Select additional roles for this user', 'user-role-editor'), - 'select_primary_role' => ($select_primary_role || $this->lib->is_super_admin()) ? 1: 0 - )); - } - // end of load_js() - - - /** - * Returns list of user roles, except 1st one, and bbPress assigned as they are shown by WordPress and bbPress themselves. - * - * @param type $user WP_User from wp-includes/capabilities.php - * @return array - */ - public function get_roles_array( $user ) { - - if ( !is_array( $user->roles ) || count( $user->roles )<=1 ) { - return array(); - } - - // get bbPress assigned user role - if ( function_exists( 'bbp_filter_blog_editable_roles' ) ) { - $bb_press_role = bbp_get_user_role( $user->ID ); - } else { - $bb_press_role = ''; - } - - $roles = array(); - foreach ( $user->roles as $role) { - if (!empty($bb_press_role) && $bb_press_role === $role) { - // exclude bbPress assigned role - continue; - } - $roles[] = $role; - } - array_shift( $roles ); // exclude primary role which is shown by WordPress itself - - return $roles; - } - // end of get_roles_array() - - - private function roles_select_html($user, $context) { - global $wp_roles; - - $user_roles = $user->roles; - $primary_role = array_shift($user_roles); - $roles = apply_filters('editable_roles', $wp_roles->roles); // exclude restricted roles if any - $roles = array_reverse( $roles ); - if (isset($roles[$primary_role])) { // exclude role assigned to the user as a primary role - unset($roles[$primary_role]); - } - $button_number = (self::$counter>0) ? '_2': ''; - - echo '
'."\n"; - - if ($context=='add-new-user' || $context=='add-existing-user') { - // Get other default roles - $other_roles = $this->lib->get_option('other_default_roles', array()); - } else { - $other_roles = $this->get_roles_array($user); - } - if (is_array($other_roles) && count($other_roles) > 0) { - $other_roles_str = implode(',', $other_roles); - } else { - $other_roles_str = ''; - } - echo ''; - - - $output = $this->lib->roles_text($other_roles); - echo ''. $output .''; - - self::$counter++; - } - // end of roles_select() - - - /** - * Returns comma separated string of capabilities directly (not through the roles) assigned to the user - * - * @global WP_Roles $wp_roles - * @param object $user - * @return string - */ - private function get_user_caps_str( $user ) { - global $wp_roles; - - $output = ''; - foreach ($user->caps as $cap => $value) { - if (!$wp_roles->is_role($cap)) { - if ('' != $output) { - $output .= ', '; - } - $output .= $value ? $cap : sprintf(__('Denied: %s'), $cap); - } - } - - return $output; - } - // end of get_user_caps_str() - - - private function user_profile_capabilities($user) { - - $current_user_id = get_current_user_id(); - $user_caps = $this->get_user_caps_str( $user ); -?> - - - - - -'; - if ($this->lib->user_is_admin( $current_user_id ) ) { - echo 'ID}", "ure_user_{$user->ID}") . '">' . - esc_html__('Edit', 'user-role-editor') . ''; - } -?> - - - - - - - - -user_profile_capabilities($user); - } -?> -
-roles_select_html($user, $context); -?> -
- is_user_profile_extention_allowed()) { - return; - } - - $show = apply_filters('ure_show_additional_capabilities_section', true); - if (empty($show)) { - return; - } - - if ( !current_user_can('promote_users') ) { - return; // No permissions to promote users - } - -?> -

-display($user, 'user-edit'); - } - // end of edit_user_profile_html() - - - public function user_new_form( $context ) { - $show = apply_filters('ure_show_additional_capabilities_section', true); - if (empty($show)) { - return; - } - - if ( !current_user_can('promote_users') ) { - return; // No permissions to promote users - } - - $user = new WP_User(); - $this->display( $user, $context ); - - } - // end of user_new_form() - - - /* - * Save additional user roles when user profile is updated, as WordPress itself doesn't know about them - * Returns different numbers for automatic testing purpose - */ - public function update( $user_id ) { - - if ( !current_user_can('promote_users') ) { - return -1; // No permissions to promote users - } - if ( !current_user_can('edit_user', $user_id) ) { - return -1; // No permissions to edit this user - } - if ( !isset( $_POST['ure_other_roles'] ) ) { - return 3; // Add default other roles, there is no related data at the POST - } - if ( empty( $_POST['ure_other_roles'] ) ) { - return 1; // There is no need in processing of other roles. User did not select them - } - - $user = get_userdata( $user_id ); - $data = explode(',', str_replace(' ', '', $_POST['ure_other_roles'] ) ); - $editable_roles = get_editable_roles(); - $ure_other_roles = array(); - foreach( $data as $role_id ) { - if ( empty( $role_id ) ) { - continue; - } - if ( !isset( $editable_roles[ $role_id ] ) ) { - return -2; // If the role isn't editable by the current user, stop processing - no permission to assign this role. - } - if ( is_array( $user->roles ) && !in_array( $role_id, $user->roles ) ) { - $ure_other_roles[] = $role_id; - } - } - foreach( $ure_other_roles as $role ) { - $user->add_role( $role ); - } - - return 2; - } - // end of update() - - - public function add_default_other_roles( $user_id ) { - - if ( empty( $user_id ) ) { - return false; - } - $user = get_user_by('id', $user_id ); - if ( empty( $user->ID ) ) { - return true; - } - - // Get default roles if any - $other_default_roles = $this->lib->get_option('other_default_roles', array() ); - if ( count( $other_default_roles ) == 0 ) { - return true; - } - foreach ( $other_default_roles as $role ) { - if ( !isset( $user->caps[$role] ) ) { - $user->add_role( $role ); - } - } - } - // end of add_default_other_roles() - - - public function add_other_roles( $user_id ) { - - if ( empty( $user_id ) ) { - return false; - } - - $result = $this->update( $user_id ); - if ( $result==3 ) { // Other roles were not selected manually - $this->add_default_other_roles( $user_id ); - } - - } - // end of add_other_roles() - - -} -// end of URE_User_Other_Roles class diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/user-role-editor.php b/wp/wp-content/plugins/user-role-editor/includes/classes/user-role-editor.php deleted file mode 100644 index a6bd42a8..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/user-role-editor.php +++ /dev/null @@ -1,987 +0,0 @@ -lib)) { - $this->lib = URE_Lib::get_instance('user_role_editor'); - } - - $this->user_other_roles = new URE_User_Other_Roles(); - - if ($this->lib->is_pro()) { - $this->main_page_hook_suffix = 'users_page_users-user-role-editor-pro'; - $this->settings_hook_suffix = 'settings_page_settings-user-role-editor-pro'; - } else { - $this->main_page_hook_suffix = 'users_page_users-user-role-editor'; - $this->settings_hook_suffix = 'settings_page_settings-user-role-editor'; - } - $this->ure_hook_suffixes = array($this->settings_hook_suffix, $this->main_page_hook_suffix); - - // Activation action - register_activation_hook( URE_PLUGIN_FULL_PATH, array($this, 'setup') ); - - // Deactivation action - register_deactivation_hook( URE_PLUGIN_FULL_PATH, array($this, 'cleanup') ); - - // Who can use this plugin - $this->key_capability = URE_Own_Capabilities::get_key_capability(); - - // Process URE's internal tasks queue - $task_queue = URE_Task_Queue::get_instance(); - $task_queue->process(); - - $this->set_hooks(); - - } - // end of __construct() - - - private function set_hooks() { - $multisite = $this->lib->get('multisite'); - if ($multisite) { - // new blog may be registered not at admin back-end only but automatically after new user registration, e.g. - // Gravity Forms User Registration Addon does - add_action( 'wp_initialize_site', array($this, 'duplicate_roles_for_new_blog'), 99, 1); - } - - // setup additional options hooks for the roles - add_action('init', array($this, 'set_role_additional_options_hooks'), 9); - - if (!is_admin()) { - return; - } - - add_action( 'admin_init', array($this, 'plugin_init'), 1 ); - - // Add the translation function after the plugins loaded hook. - add_action('plugins_loaded', array($this, 'load_translation')); - - // add own submenu - add_action('admin_menu', array($this, 'plugin_menu')); - - if ( $multisite ) { - // add own submenu - add_action( 'network_admin_menu', array($this, 'network_plugin_menu') ); - } - - - // add a Settings link in the installed plugins page - add_filter('plugin_action_links_'. URE_PLUGIN_BASE_NAME, array($this, 'plugin_action_links'), 10, 1); - add_filter('plugin_row_meta', array($this, 'plugin_row_meta'), 10, 2); - } - // end of set_hooks() - - - /** - * True - if it's an instance of Pro version, false - for free version - * @return boolean - */ - public function is_pro() { - - return $this->lib->is_pro(); - } - // end of is_pro() - - - public function load_users_page() { - - add_action('restrict_manage_users', array($this, 'show_move_users_from_no_role_button')); - add_action('admin_head', array($this, 'add_css_to_users_page')); - add_action('admin_footer', array($this, 'add_js_to_users_page')); - - } - // end of load_users_page() - - - /** - * Plugin initialization - * - */ - public function plugin_init() { - - global $pagenow; - - $user_id = get_current_user_id(); - $supress_protection = apply_filters('ure_supress_administrators_protection', false); - // these filters and actions should prevent editing users with administrator role - // by other users with 'edit_users' capability - if (!$supress_protection && !$this->lib->user_is_admin($user_id)) { - new URE_Protect_Admin(); - } - - add_action('admin_enqueue_scripts', array($this, 'admin_load_js')); - add_action('user_row_actions', array($this, 'user_row'), 10, 2); - add_filter('all_plugins', array($this, 'exclude_from_plugins_list')); - - $multisite = $this->lib->get('multisite'); - if ($multisite) { - $allow_edit_users_to_not_super_admin = $this->lib->get_option('allow_edit_users_to_not_super_admin', 0); - if ($allow_edit_users_to_not_super_admin) { - // Make this as late as possible, to overwrite settings made by other plugins, like WooCommerce - add_filter('map_meta_cap', array($this, 'restore_users_edit_caps'), 99, 4); - remove_all_filters('enable_edit_any_user_configuration'); - add_filter('enable_edit_any_user_configuration', '__return_true'); - // make this as early as you can, to not provide superadmin privilege when it's not needed - add_action('admin_head', array($this, 'edit_user_permission_check'), 1); - if ($pagenow == 'user-new.php') { - add_filter('site_option_site_admins', array($this, 'allow_add_user_as_superadmin')); - } - } - - if ( $pagenow=='site-users.php' ) { - // Try to execute before any other function linked to this filter - add_filter('editable_roles', array($this, 'fix_network_admin_roles_dropdown'), 9 ); - } - - } else { - $count_users_without_role = $this->lib->get_option('count_users_without_role', 0); - if ($count_users_without_role) { - add_action( 'load-users.php', array($this, 'load_users_page') ); - } - } - - $bulk_grant_roles = apply_filters('ure_bulk_grant_roles', true); - if ($bulk_grant_roles) { - new URE_Grant_Roles(); - } - - add_action('wp_ajax_ure_ajax', array($this, 'ure_ajax')); - - add_action('editable_roles', array( $this, 'translate_custom_roles' ), 10, 1 ); - - // Input parameter $roles_sorting_order = false by default - // Acceptable values: - // true - sort by role ID (for backward compatibility), - // 'id' - sort roles by role ID, - // 'name' - sort roles by role name. - $roles_sorting_order = apply_filters( 'ure_sort_wp_roles_list', false); - if ( !empty( $roles_sorting_order ) ) { - $this->lib->set('roles_sorting_order', $roles_sorting_order ); - add_filter('editable_roles', array( $this, 'sort_wp_roles_list' ), 11, 1 ); - } - } - // end of plugin_init() - - - /** - * Allow non-superadmin user to add/create users to the site as superadmin does. - * Include current user to the list of superadmins - for the user-new.php page only, and - * if user really can create_users and promote_users - * @global string $pagenow - * @param array $site_admins - * @return array - */ - public function allow_add_user_as_superadmin($site_admins) { - global $pagenow; - - $this->lib->set_raised_permissions(false); - - if ($pagenow!=='user-new.php') { - return $site_admins; - } - - // Check if current user really can create and promote users - remove_filter('site_option_site_admins', array($this, 'allow_add_user_as_superadmin')); - $can_add_user = current_user_can('create_users') && current_user_can('promote_users'); - add_filter('site_option_site_admins', array($this, 'allow_add_user_as_superadmin')); - - if (!$can_add_user) { - return $site_admins; // no help in this case - } - - $current_user = wp_get_current_user(); - if (!in_array($current_user->user_login, $site_admins)) { - $this->lib->set_raised_permissions(true); - $site_admins[] = $current_user->user_login; - } - - return $site_admins; - } - // end of allow_add_user_as_superadmin() - - - public function show_move_users_from_no_role_button() { - - if ( !current_user_can( 'promote_users' ) ) { - return; - } - - $assign_role = $this->lib->get_assign_role(); - $assign_role->show_html(); - - } - // end of move_users_from_no_role() - - - public function add_css_to_users_page() { - - wp_enqueue_style( 'wp-jquery-ui-dialog' ); - wp_enqueue_style( 'ure-admin', URE_PLUGIN_URL . 'css/ure-admin.css', array(), URE_VERSION, 'screen' ); - - } - // end of add_css_to_users_page() - - - public function add_js_to_users_page() { - - wp_enqueue_script('jquery-ui-dialog', '', array('jquery-ui-core','jquery-ui-button', 'jquery'), false, true ); - wp_register_script( 'ure-users', plugins_url( '/js/users.js', URE_PLUGIN_FULL_PATH ), array(), URE_VERSION, true ); - wp_enqueue_script ( 'ure-users' ); - wp_localize_script( 'ure-users', 'ure_users_data', array( - 'wp_nonce' => wp_create_nonce('user-role-editor'), - 'move_from_no_role_title' => esc_html__('Change role for users without role', 'user-role-editor'), - 'to' => esc_html__('To:', 'user-role-editor'), - 'no_rights_caption' => esc_html__('No rights', 'user-role-editor'), - 'provide_new_role_caption' => esc_html__('Provide new role', 'user-role-editor') - )); - - } - // end of add_js_to_users_page() - - - /** - * restore edit_users, delete_users, create_users capabilities for non-superadmin users under multisite - * (code is provided by http://wordpress.org/support/profile/sjobidoo) - * - * @param type $caps - * @param type $cap - * @param type $user_id - * @param type $args - * @return type - */ - public function restore_users_edit_caps($caps, $cap, $user_id, $args) { - - foreach ($caps as $key => $capability) { - - if ($capability != 'do_not_allow') - continue; - - switch ($cap) { - case 'edit_user': - case 'edit_users': - $caps[$key] = 'edit_users'; - break; - case 'delete_user': - case 'delete_users': - $caps[$key] = 'delete_users'; - break; - case 'create_users': - $caps[$key] = $cap; - break; - } - } - - return $caps; - } - // end of restore_user_edit_caps() - - - /** - * Checks that both the editing user and the user being edited are - * members of the blog and prevents the super admin being edited. - * (code is provided by http://wordpress.org/support/profile/sjobidoo) - * - */ - public function edit_user_permission_check() { - global $profileuser; - - $current_user_id = get_current_user_id(); - if ($current_user_id===0) { - return; - } - if ($this->lib->is_super_admin()) { // Superadmin may do all - return; - } - - $screen = get_current_screen(); - if (empty($screen)) { - return; - } - - if ($screen->base !== 'user-edit' && $screen->base !== 'user-edit-network') { - return; - } - - if ( !isset( $profileuser->ID ) ) { - return; - } - - $current_blog_id = get_current_blog_id(); - // editing a user profile: it's correct to call is_super_admin() directly here, as permissions are raised for the $current_user only - if ( !$this->lib->is_super_admin( $current_user_id ) && is_super_admin( $profileuser->ID ) ) { // trying to edit a superadmin while himself is less than a superadmin - wp_die( esc_html__('You do not have permission to edit this user.', 'user-role-editor') ); - } elseif ( !( is_user_member_of_blog( $profileuser->ID, $current_blog_id ) && is_user_member_of_blog( $current_user_id, $current_blog_id ) ) ) { // editing user and edited user aren't members of the same blog - wp_die( esc_html__('You do not have permission to edit this user.', 'user-role-editor') ); - } - - } - // end of edit_user_permission_check() - - - /** - * Add/hide edit actions for every user row at the users list - * - * @global type $pagenow - * @param string $actions - * @param type $user - * @return string - */ - public function user_row($actions, $user) { - global $pagenow; - - if ($pagenow!=='users.php') { - return $actions; - } - - $current_user = wp_get_current_user(); - if ($current_user->has_cap($this->key_capability)) { - $actions['capabilities'] = 'ID}", "ure_user_{$user->ID}") . - '">' . esc_html__('Capabilities', 'user-role-editor') . ''; - } - - return $actions; - } - - // end of user_row() - - - /** - * Every time when new blog is created - duplicate for it the roles from the main blog - * @global wpdb $wpdb - * @global WP_Roles $wp_roles - * @param WP_Site $site - * @param int $user_id - * - */ - public function duplicate_roles_for_new_blog( $site ) { - global $wpdb, $wp_roles; - - // get Id of 1st (main) blog - $main_blog_id = $this->lib->get_main_blog_id(); - if ( empty( $main_blog_id ) ) { - return; - } - $current_blog = $wpdb->blogid; - if ( $current_blog!=$main_blog_id ) { - switch_to_blog( $main_blog_id ); - } - $main_roles = new WP_Roles(); // Get roles from primary blog - $default_role = get_option( 'default_role' ); // get default role from primary blog - $addons_data = apply_filters( 'ure_get_addons_data_for_new_blog', array() ); // Load addons data to replicate later for the new site - for internal use in a Pro version - - $blog_id = $site->blog_id; - switch_to_blog( $blog_id ); // switch to the new created blog - $main_roles->use_db = false; // do not touch DB - $main_roles->add_cap( 'administrator', 'dummy_123456' ); // just to save current roles into new blog - $main_roles->role_key = $wp_roles->role_key; - $main_roles->use_db = true; // save roles into new blog DB - $main_roles->remove_cap( 'administrator', 'dummy_123456' ); // remove unneeded dummy capability - update_option( 'default_role', $default_role ); // set default role for new blog as it set for primary one - if ( !empty($addons_data) ) { - do_action('ure_set_addons_data_for_new_blog', $blog_id, $addons_data); // save addons data from the main site/blog to the new site/blog - for internal use in a Pro version - } - - switch_to_blog( $current_blog ); // return to blog where we were at the begin - } - // end of duplicate_roles_for_new_blog() - - - /** - * Filter out URE plugin from not admin users to prevent its not authorized deactivation - * @param type array $plugins plugins list - * @return type array $plugins updated plugins list - */ - public function exclude_from_plugins_list($plugins) { - $multisite = $this->lib->get('multisite'); - // if multi-site, then allow plugin activation for network superadmins and, if that's specially defined, - for single site administrators too - if ($multisite) { - if ($this->lib->is_super_admin() || $this->lib->user_is_admin()) { - return $plugins; - } - } else { -// is_super_admin() defines superadmin for not multisite as user who can 'delete_users' which I don't like. -// So let's check if user has 'administrator' role better. - if (current_user_can('administrator') || $this->lib->user_is_admin()) { - return $plugins; - } - } - - // exclude URE from plugins list - $key = basename(URE_PLUGIN_DIR) . '/' . URE_PLUGIN_FILE; - unset($plugins[$key]); - - return $plugins; - } - // end of exclude_from_plugins_list() - - - /** - * Load plugin translation files - linked to the 'plugins_loaded' action - * - */ - function load_translation() { - - load_plugin_textdomain('user-role-editor', false, dirname( plugin_basename( URE_PLUGIN_FULL_PATH ) ) .'/lang'); - - if ( function_exists('pll_register_string') ) { - // Integration with PolyLang plugin (https://wordpress.org/plugins/polylang/) - $all_roles = wp_roles()->roles; - foreach( $all_roles as $role_id=>$role ) { - if ( !$this->lib->is_wp_built_in_role( $role_id ) ) { - pll_register_string( $role_id, $role['name'], 'user-role-editor' ); - } - } - } - - } - // end of ure_load_translation() - - - /** - * Modify plugin action links - * - * @param array $links - * @return array - */ - public function plugin_action_links($links) { - $single_site_settings_link = '' . esc_html__('Settings', 'user-role-editor') .''; - $multisite = $this->lib->get('multisite'); - if (!$multisite ) { - $settings_link = $single_site_settings_link; - } else { - $ure = basename(URE_PLUGIN_DIR) . '/' . URE_PLUGIN_FILE; - $active_for_network = is_plugin_active_for_network($ure); - if (!$active_for_network) { - $settings_link = $single_site_settings_link; - } else { - if (!current_user_can('manage_network_plugins')) { - return $links; - } - $settings_link = ''. esc_html__('Settings', 'user-role-editor') .''; - } - } - array_unshift($links, $settings_link); - - return $links; - } - // end of plugin_action_links() - - - public function plugin_row_meta($links, $file) { - - if ($file == plugin_basename(dirname(URE_PLUGIN_FULL_PATH) .'/'.URE_PLUGIN_FILE)) { - $links[] = '' . esc_html__('Changelog', 'user-role-editor') . ''; - } - - return $links; - } - - // end of plugin_row_meta - - - public function settings_screen_configure() { - $multisite = $this->lib->get('multisite'); - $settings_page_hook = $this->settings_page_hook; - if ($multisite) { - $settings_page_hook .= '-network'; - } - $screen = get_current_screen(); - // Check if current screen is URE's settings page - if ($screen->id != $settings_page_hook) { - return; - } - $screen_help = new Ure_Screen_Help(); - $screen->add_help_tab( array( - 'id' => 'general', - 'title' => esc_html__('General', 'user-role-editor'), - 'content' => $screen_help->get_settings_help('general') - )); - if ($this->lib->is_pro() || !$multisite) { - $screen->add_help_tab( array( - 'id' => 'additional_modules', - 'title' => esc_html__('Additional Modules', 'user-role-editor'), - 'content' => $screen_help->get_settings_help('additional_modules') - )); - } - $screen->add_help_tab( array( - 'id' => 'default_roles', - 'title' => esc_html__('Default Roles', 'user-role-editor'), - 'content' => $screen_help->get_settings_help('default_roles') - )); - if ($multisite) { - $screen->add_help_tab( array( - 'id' => 'multisite', - 'title' => esc_html__('Multisite', 'user-role-editor'), - 'content' => $screen_help->get_settings_help('multisite') - )); - } - } - // end of settings_screen_configure() - - - public function plugin_menu() { - - if (function_exists('add_submenu_page')) { - $ure_page = add_submenu_page( - 'users.php', - esc_html__('User Role Editor', 'user-role-editor'), - esc_html__('User Role Editor', 'user-role-editor'), - 'ure_edit_roles', - 'users-' . URE_PLUGIN_FILE, - array($this, 'edit_roles')); - add_action("admin_print_styles-$ure_page", array($this, 'admin_css_action')); - } - - $multisite = $this->lib->get('multisite'); - $active_for_network = $this->lib->get('active_for_network'); - if ( !$multisite || ($multisite && !$active_for_network) ) { - $settings_capability = URE_Own_Capabilities::get_settings_capability(); - $this->settings_page_hook = add_options_page( - esc_html__('User Role Editor', 'user-role-editor'), - esc_html__('User Role Editor', 'user-role-editor'), - $settings_capability, - 'settings-' . URE_PLUGIN_FILE, - array($this, 'settings')); - add_action( 'load-'.$this->settings_page_hook, array($this,'settings_screen_configure') ); - add_action("admin_print_styles-{$this->settings_page_hook}", array($this, 'settings_css_action')); - } - } - // end of plugin_menu() - - - public function network_plugin_menu() { - if (is_multisite()) { - $this->settings_page_hook = add_submenu_page( - 'settings.php', - esc_html__('User Role Editor', 'user-role-editor'), - esc_html__('User Role Editor', 'user-role-editor'), - $this->key_capability, - 'settings-' . URE_PLUGIN_FILE, - array(&$this, 'settings')); - add_action( 'load-'.$this->settings_page_hook, array($this,'settings_screen_configure') ); - add_action("admin_print_styles-{$this->settings_page_hook}", array($this, 'settings_css_action')); - } - - } - - // end of network_plugin_menu() - - - public function settings() { - $settings_capability = URE_Own_Capabilities::get_settings_capability(); - if (!current_user_can($settings_capability)) { - wp_die(esc_html__( 'You do not have sufficient permissions to manage options for User Role Editor.', 'user-role-editor' )); - } - - URE_Settings::show(); - - } - // end of settings() - - - public function admin_css_action() { - - wp_enqueue_style('wp-jquery-ui-selectable'); - wp_enqueue_style('ure-jquery-ui-general', URE_PLUGIN_URL . 'css/jquery-ui.min.css', array(), URE_VERSION, 'screen'); - wp_enqueue_style('ure-admin', URE_PLUGIN_URL . 'css/ure-admin.css', array(), URE_VERSION, 'screen'); - } - // end of admin_css_action() - - - public function settings_css_action() { - - - wp_enqueue_style('ure-jquery-ui-tabs', URE_PLUGIN_URL . 'css/jquery-ui.min.css', array(), URE_VERSION, 'screen'); - wp_enqueue_style('ure-admin', URE_PLUGIN_URL . 'css/ure-admin.css', array(), URE_VERSION, 'screen'); - - } - // end of admin_css_action() - - - - // call roles editor page - public function edit_roles() { - - if (!current_user_can('ure_edit_roles')) { - wp_die(esc_html__('Insufficient permissions to work with User Role Editor', 'user-role-editor')); - } - - $editor = URE_Editor::get_instance(); - $editor->show(); - } - // end of edit_roles() - - - /** - * Create backup record for the WordPress user roles - * Run once on URE activation - * - * @global wpdb $wpdb - * @global WP_Roles $wp_roles - * @return type - */ - protected function backup_wp_roles() { - global $wpdb; - - $site_id = get_current_blog_id(); - $backup_roles_key = $wpdb->get_blog_prefix($site_id) .'backup_user_roles'; - // check if backup user roles record exists already - $result = get_option($backup_roles_key, false); - if (!empty($result)) { - return; - } - - $wp_roles = wp_roles(); - update_option($backup_roles_key, $wp_roles->roles, false); - - } - // end of backup_wp_roles() - - /** - * execute on plugin activation - */ - function setup() { - - $this->backup_wp_roles(); - URE_Own_Capabilities::init_caps(); - - $task_queue = URE_Task_Queue::get_instance(); - $task_queue->add('on_activation'); - - } - // end of setup() - - - protected function get_ure_page_url() { - - $page_url = admin_url() . URE_PARENT . '?page=users-' . URE_PLUGIN_FILE; - $object = $this->lib->get_request_var('object', 'get'); - $user_id = (int) $this->lib->get_request_var('user_id', 'get', 'int'); - if ($object=='user' && $user_id>0) { - $page_url .= '&object=user&user_id='. $user_id; - } - - return $page_url; - } - // end of get_ure_page_url() - - - protected function load_main_page_js() { - - $confirm_role_update = $this->lib->get_option('ure_confirm_role_update', 1); - $page_url = $this->get_ure_page_url(); - - $multisite = $this->lib->get('multisite'); - if ( !( $multisite && $this->lib->is_super_admin() ) ) { - $do_not_revoke_from_admin = true; - } else { - // do not limit SuperAdmin for multi-site - $do_not_revoke_from_admin = false; - } - - wp_enqueue_script('jquery-ui-dialog', '', array('jquery-ui-core', 'jquery-ui-button', 'jquery'), false, true ); - wp_enqueue_script('jquery-ui-selectable', '', array('jquery-ui-core', 'jquery'), false, true ); - wp_enqueue_script('notifyjs', plugins_url('/js/notify.min.js', URE_PLUGIN_FULL_PATH ), array(), URE_VERSION, true ); - - wp_register_script('ure', plugins_url('/js/ure.js', URE_PLUGIN_FULL_PATH ), array(), URE_VERSION, true ); - wp_enqueue_script('ure'); - wp_localize_script('ure', 'ure_data', array( - 'wp_nonce' => wp_create_nonce('user-role-editor'), - 'network_admin' => is_network_admin() ? 1 : 0, - 'page_url' => $page_url, - 'is_multisite' => is_multisite() ? 1 : 0, - 'do_not_revoke_from_admin' => $do_not_revoke_from_admin ? 1 : 0, - 'confirm_role_update' => $confirm_role_update ? 1 : 0, - 'confirm_title' => esc_html__('Confirm', 'user-role-editor'), - 'yes_label' => esc_html__('Yes', 'user-role-editor'), - 'no_label' => esc_html__('No', 'user-role-editor'), - 'update' => esc_html__('Update', 'user-role-editor'), - 'confirm_submit' => esc_html__('Please confirm permissions update', 'user-role-editor'), - 'add_new_role_title' => esc_html__('Add New Role', 'user-role-editor'), - 'rename_role_title' => esc_html__('Rename Role', 'user-role-editor'), - 'role_name_required' => esc_html__(' Role name (ID) can not be empty!', 'user-role-editor'), - 'role_name_valid_chars' => esc_html__(' Role name (ID) must contain latin characters, digits, hyphens or underscore only!', 'user-role-editor'), - 'numeric_role_name_prohibited' => esc_html__(' WordPress does not support numeric Role name (ID). Add latin characters to it.', 'user-role-editor'), - 'add_role' => esc_html__('Add Role', 'user-role-editor'), - 'rename_role' => esc_html__('Rename Role', 'user-role-editor'), - 'delete_role' => esc_html__('Delete Role', 'user-role-editor'), - 'cancel' => esc_html__('Cancel', 'user-role-editor'), - 'add_capability' => esc_html__('Add Capability', 'user-role-editor'), - 'delete_capability' => esc_html__('Delete Capability', 'user-role-editor'), - 'default_role' => esc_html__('Default Role', 'user-role-editor'), - 'set_new_default_role' => esc_html__('Set New Default Role', 'user-role-editor'), - 'delete_capability' => esc_html__('Delete Capability', 'user-role-editor'), - 'delete_capability_warning' => esc_html__('Warning! Be careful - removing critical capability could crash some plugin or other custom code', 'user-role-editor'), - 'capability_name_required' => esc_html__(' Capability name (ID) can not be empty!', 'user-role-editor'), - 'capability_name_valid_chars' => esc_html__(' Capability name (ID) must contain latin characters, digits, hyphens or underscore only!', 'user-role-editor'), - )); - - // load additional JS stuff for Pro version, if exists - do_action('ure_load_js'); - - } - // end of load_main_page_js() - - - protected function load_settings_js() { - - $page_url = $this->get_ure_page_url(); - - wp_enqueue_script('jquery-ui-tabs', '', array('jquery-ui-core', 'jquery'), false, true ); - wp_enqueue_script('jquery-ui-dialog', '', array('jquery-ui-core', 'jquery'), false, true ); - wp_enqueue_script('jquery-ui-button', '', array('jquery-ui-core', 'jquery'), false, true ); - wp_register_script('ure-settings', plugins_url('/js/settings.js', URE_PLUGIN_FULL_PATH ), array(), URE_VERSION, true ); - wp_enqueue_script('ure-settings'); - - wp_localize_script('ure-settings', 'ure_data', array( - 'wp_nonce' => wp_create_nonce('user-role-editor'), - 'network_admin' => is_network_admin() ? 1 : 0, - 'page_url' => $page_url, - 'is_multisite' => is_multisite() ? 1 : 0, - 'confirm_title' => esc_html__('Confirm', 'user-role-editor'), - 'yes_label' => esc_html__('Yes', 'user-role-editor'), - 'no_label' => esc_html__('No', 'user-role-editor'), - 'reset' => esc_html__('Reset', 'user-role-editor'), - 'reset_warning' => ''. esc_html__('DANGER!', 'user-role-editor') .''. - esc_html__(' Resetting will restore default user roles and capabilities from WordPress core.', 'user-role-editor') .'

'. - esc_html__('If any plugins (such as WooCommerce, S2Member and many others) have changed user roles and capabilities during installation, all those changes will be LOST!', 'user-role-editor') .'
'. - esc_html__('For more information on how to undo undesired changes and restore plugin capabilities go to', 'user-role-editor') .'
'. - 'http://role-editor.com/how-to-restore-deleted-wordpress-user-roles/' .'

'. - esc_html__('Continue?', 'user-role-editor'), - 'reset_roles_secure_text' => URE_Tools::RESET_ROLES_SECURE_TEXT - )); - - do_action('ure_load_js_settings'); - - } - // end of load_settings_js() - - - /** - * Load plugin javascript stuff - * - * @param string $hook_suffix - */ - public function admin_load_js($hook_suffix) { - - URE_Known_JS_CSS_Compatibility_Issues::fix($hook_suffix, $this->ure_hook_suffixes); - - if ($hook_suffix==$this->main_page_hook_suffix) { - $this->load_main_page_js(); - } elseif($hook_suffix==$this->settings_hook_suffix) { - $this->load_settings_js(); - } - - } - // end of admin_load_js() - - - public function ure_ajax() { - - $ajax_processor = new URE_Ajax_Processor(); - $ajax_processor->dispatch(); - - } - // end of ure_ajax() - - - public function set_role_additional_options_hooks() { - - $role_additional_options = URE_Role_Additional_Options::get_instance($this->lib); - $role_additional_options->set_active_items_hooks(); - - } - // end of set_role_additional_options_hooks() - - - private function sort_roles_by_name( $roles ) { - - $role_names = array(); - foreach( $roles as $role_id=>$role ) { - $role_names[$role_id] = $role['name']; - } - asort( $role_names ); - - $roles1 = array(); - foreach( $role_names as $role_id=>$role_name ) { - $roles1[$role_id] = $roles[$role_id]; - } - - return $roles1; - } - // end of sort_roles_by_name() - - - /** - * Sort roles array alphabetically - * @param array $roles - * @return array - */ - public function sort_wp_roles_list( $roles ) { - - $roles_sorting_order = $this->lib->get('roles_sorting_order'); - if ( $roles_sorting_order==='id' || $roles_sorting_order===true ) { - // sort by role ID - ksort( $roles ); - return $roles; - } else if ( $roles_sorting_order==='name') { - // sort by role name - $roles1 = $this->sort_roles_by_name( $roles ); - return $roles1; - } else { - // change nothing - return $roles; - } - // wp-admin/includes/template.php: wp_dropdown_roles() showed roles returned by get_editable_roles() in reversed order, #932: - // $editable_roles = array_reverse( get_editable_roles() ); - // so we may need to reverse them 1st, in order they will be reversed back to the ascending order - //$roles = array_reverse( $roles ); - - return $roles; - } - // end of sort_wp_roles_list() - - - /** Currently WordPress (tested up to version 5.9.3) shows "Change role to..." drop-down list at Network admin->Sites->selected site->Users with roles filled from the main site, - /* but should use roles list from the selected site. This function replaces roles list with roles from the selected site and - * excludes error messsage "Sorry, you are not allowed to give users that role.", when you try to grant to a user a role which does not exist at the selected site. - * - * @param array $roles - * @return array - */ - public function fix_network_admin_roles_dropdown( $roles ) { - - // get selected site ID - $selected_blog_id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0; - if ( !$selected_blog_id ) { - return $roles; - } - - $current_blog_id = get_current_blog_id(); - if ( $current_blog_id!==$selected_blog_id ) { - switch_to_blog( $selected_blog_id ); - } - - remove_filter( 'editable_roles', array($this, 'fix_network_admin_roles_dropdown'), 9 ); - $roles1 = get_editable_roles(); - add_filter( 'editable_roles', array($this, 'fix_network_admin_roles_dropdown'), 9 ); - - if ( $current_blog_id!==$selected_blog_id ) { - restore_current_blog(); - } - - return $roles1; - } - // end of fix_network_admin_roles_dropdown() - - - /* - * Translate user role names, inluding custom roles added by user - * - */ - function translate_custom_roles( $roles ) { - - foreach ($roles as $key => $value) { - $translated_name = esc_html__( $value['name'], 'user-role-editor' ); // get translation from URE language file, if exists - if ( $translated_name === $value['name'] ) { - if ( $this->lib->is_wp_built_in_role( $key ) ) { - // get WordPress internal translation - $translated_name = translate_user_role( $translated_name ); - } elseif ( function_exists('pll_register_string') ) { - // Integration with PolyLang plugin (https://wordpress.org/plugins/polylang/) - $translated_name = pll__( $translated_name ); - } - } - $roles[$key]['name'] = $translated_name; - } - - $roles = apply_filters('ure_editable_roles', $roles ); - - return $roles; - } - // end of translate_custom_roles() - - - // execute on plugin deactivation - public function cleanup() { - - } - // end of cleanup() - - - // excute on plugin uninstall via WordPress->Plugins->Delete - public static function uninstall() { - - $uninstall = new URE_Uninstall; - $uninstall->act(); - - } - // end of uninstall() - -} -// end of User_Role_Editor diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/user-view.php b/wp/wp-content/plugins/user-role-editor/includes/classes/user-view.php deleted file mode 100644 index a59cc736..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/user-view.php +++ /dev/null @@ -1,210 +0,0 @@ - - * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya - **/ -class URE_User_View extends URE_View { - - private $user_to_edit = null; - - - public function __construct() { - - parent::__construct(); - $this->user_to_edit = $this->editor->get('user_to_edit'); - - } - // end of __construct() - - - public function display_edit_dialogs() { - - } - // end of display_edit_dialogs() - - - /** - * output HTML code to create URE toolbar - * - * @param boolean $role_delete - * @param boolean $capability_remove - */ - public function toolbar() { -?> -
-
- - -
- -
- user_to_edit->ID}", "ure_user_{$this->user_to_edit->ID}") . '" >'; - $anchor_end = ''; - if (class_exists('user_switching') && current_user_can('switch_to_user', $this->user_to_edit->ID)) { - $switch_to_user_link = user_switching::switch_to_url($this->user_to_edit); - $switch_to_user = '' . esc_html__('Switch To', 'user-switching') . ''; - } - } else { - $anchor_start = ''; - $anchor_end = ''; - } - $user_info = ' ' . $anchor_start . $this->user_to_edit->user_login; - if ($this->user_to_edit->display_name !== $this->user_to_edit->user_login) { - $user_info .= ' (' . $this->user_to_edit->display_name . ')'; - } - $user_info .= $anchor_end . ''; - if (is_multisite() && $this->lib->is_super_admin($this->user_to_edit->ID)) { - $user_info .= ' ' . esc_html__('Network Super Admin', 'user-role-editor') . ''; - } - - if (!empty($switch_to_user)) { - $user_info .= '    ' . $switch_to_user; - } - - return $user_info; - } - // end of get_user_info() - - - public function show_primary_role_dropdown_list($user_roles) { -?> - -lib->show_admin_role_allowed(); - $values = array_values($this->user_to_edit->roles); - $primary_role = array_shift($values); // get 1st element from roles array - $roles = $this->editor->get('roles'); - foreach ($roles as $role_id => $role) { - if (($show_admin_role || $role_id != 'administrator') && ($role_id !== $primary_role)) { - if ($this->editor->user_can($role_id)) { - $checked = 'checked="checked"'; - } else { - $checked = ''; - } - echo '
'; - } - } - } - // end of show_secondary_roles() - - - public function display() { - - $caps_readable = $this->editor->get('caps_readable'); - $show_deprecated_caps = $this->editor->get('show_deprecated_caps'); - $edit_user_caps_mode = $this->editor->get_edit_user_caps_mode(); - $caps_access_restrict_for_simple_admin = $this->lib->get_option('caps_access_restrict_for_simple_admin', 0); - $user_info = $this->get_user_info(); - $select_primary_role = apply_filters('ure_users_select_primary_role', true); -?> - -
-
- -
-
- - - - - - - - - -
  - lib->is_super_admin() || !is_multisite() || !class_exists('User_Role_Editor_Pro') || !$caps_access_restrict_for_simple_admin) { - if ($caps_readable) { - $checked = 'checked="checked"'; - } else { - $checked = ''; - } -?> - onclick="ure_main.turn_caps_readable();" /> -     - - onclick="ure_turn_deprecated_caps(user_to_edit->ID; ?>);"/> - - -
-lib->is_super_admin()) { -?> -
-show_primary_role_dropdown_list($this->user_to_edit->roles); - } - if (function_exists('bbp_filter_blog_editable_roles') ) { // bbPress plugin is active -?> -
-user_to_edit->ID); - if (!empty($bbp_user_role)) { - echo $dynamic_roles[$bbp_user_role]['name']; - } - } -?> -
-show_secondary_roles(); -?> -
- display_caps(false, $edit_user_caps_mode ); ?> -
- - -
-
- - * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya - **/ -class URE_View { - - protected $lib = null; - protected $editor = null; - - - public function __construct() { - - $this->lib = URE_Lib::get_instance(); - $this->editor = URE_Editor::get_instance(); - - } - // end of __construct() - - public function display() {} - - public function toolbar() {} - - /** - * display opening part of the HTML box with title and CSS style - * - * @param string $title - * @param string $style - */ - public function display_box_start($title, $style = '') { - ?> -
-

-
- -
-
- get_groups_tree(); - $output = '
    '. PHP_EOL; - foreach($groups_list as $group_id=>$group) { - if ($group_id=='all') { - $spacer = ''; - $subgroup = ''; - } else { - $spacer = 'style="padding-left: '. 15*$group['level'] .'px"'; - $subgroup = '- '; - } - $output .= '
  • ' . - $subgroup . $group['caption'] .'
  • '. PHP_EOL; - } - $output .= '
'. PHP_EOL; - - echo $output; - } - // end of show_caps_groups() - - - private function deprecated_show_and_color($cap_id, $builtin_wp_caps, &$label_style, &$hidden_class) { - - if ( isset( $builtin_wp_caps[$cap_id] ) && - is_array( $builtin_wp_caps[$cap_id] ) && - in_array('deprecated', $builtin_wp_caps[$cap_id] ) ) { - $show_deprecated_caps = $this->editor->get('show_deprecated_caps'); - if (!$show_deprecated_caps) { - $hidden_class = 'hidden'; - } - $label_style = 'style="color:#BBBBBB;"'; - } - } - // end of deprecated_show_and_color() - - - private function blocked_for_single_admin_style($cap_id, &$label_style) { - - $blocked = false; - $multisite = $this->lib->get('multisite'); - if ($multisite && $this->editor->block_cap_for_single_admin($cap_id, true)) { - if ($this->lib->is_super_admin()) { - if (!is_network_admin()) { - $label_style = 'style="color: red;"'; - } - } else { - $blocked = true; - } - } - - return $blocked; - } - // end of blocked_for_single_admin_style() - - - // Get full capabilities list and exclude Visual Composer capabilities from it - // Do not take VC capabilities into account as VC stores not boolean values with them - protected function get_full_capabilities() { - $full_caps = $this->editor->get('full_capabilities'); - foreach($full_caps as $key=>$capability) { - if (strpos($key, 'vc_access_rules_')!==false) { - unset($full_caps[$key]); - } - } - - return $full_caps; - } - // end of get_full_capabilities() - - - /* - * Output HTML-code for capabilities list - * Used build output for response to AJAX request - * @param boolean $for_role - if true, it is role capabilities list, else - user specific capabilities list - * @param boolean $edit_mode - if false, capabilities checkboxes are shown as disable - readonly mode - */ - public function _show_capabilities( $for_role = true, $edit_mode=true ) { - $onclick_for_admin = ''; - $multisite = $this->lib->get( 'multisite' ); - $current_role = $this->editor->get( 'current_role' ); - $user_to_edit = $this->editor->get( 'user_to_edit' ); - $roles = $this->editor->get( 'roles' ); - $full_capabilities = $this->get_full_capabilities(); - $built_in_wp_caps = $this->lib->get_built_in_wp_caps(); - $caps_readable = $this->editor->get( 'caps_readable' ); - $caps_groups_manager = URE_Capabilities_Groups_Manager::get_instance(); - - $key_capability = URE_Own_Capabilities::get_key_capability(); - $user_is_ure_admin = current_user_can( $key_capability ); - $ure_caps = URE_Own_Capabilities::get_caps(); - - $output = ''; - - foreach ($full_capabilities as $capability) { - $cap_id = $capability['inner']; - if (!$user_is_ure_admin) { - if (isset($ure_caps[$cap_id]) || - ($multisite && $cap_id=='manage_network_plugins')) { - // exclude URE caps if user does not have full access to URE - continue; - } - } - $label_style = ''; - $hidden_class = ''; - - $this->deprecated_show_and_color($cap_id, $built_in_wp_caps, $label_style, $hidden_class); - $blocked = $this->blocked_for_single_admin_style($cap_id, $label_style); - $classes = array('ure-cap-div'); - if ($blocked) { - $classes[] = 'blocked'; - $hidden_class = 'hidden'; - } - if ($hidden_class) { - $classes[] = $hidden_class; - } - - $cap_groups = $caps_groups_manager->get_cap_groups($cap_id, $built_in_wp_caps); - $classes = ure_array_merge( $classes, $cap_groups ); - - $checked = ''; - $disabled = ''; - if ($for_role) { - if (isset($roles[$current_role]['capabilities'][$cap_id]) && - !empty($roles[$current_role]['capabilities'][$cap_id])) { - $checked = 'checked="checked"'; - } - } else { - if (empty($edit_mode)) { - $disabled = 'disabled="disabled"'; - } else { - $disabled = ''; - } - if ($this->editor->user_can($cap_id)) { - $checked = 'checked="checked"'; - if (!isset($user_to_edit->caps[$cap_id])) { - $disabled = 'disabled="disabled"'; - } - } - } - $class = 'class="' . implode(' ', $classes) .'"'; - - $cap_id_esc = URE_Capability::escape($cap_id); - $cap_html = '
'; - - if ($caps_readable) { - $cap_ind = 'human'; - $cap_ind_alt = 'inner'; - } else { - $cap_ind = 'inner'; - $cap_ind_alt = 'human'; - } - $cap_html .= '
'; - - $output .= $cap_html; - } - - return $output; - } - // end of _show_capabilities() - - - /** - * Output HTML-code for capabilities list - * Used to built full page output for usual HTTP request - * @param boolean $for_role - if true, it is role capabilities list, else - user specific capabilities list - * @param boolean $edit_mode - if false, capabilities checkboxes are shown as disable - readonly mode - */ - public function show_capabilities( $for_role = true, $edit_mode=true ) { - - $output = '
' - . '
'; - $output .= $this->_show_capabilities( $for_role, $edit_mode ); - $output .= '
' ; - - echo $output; - } - // end of show_capabilities() - - - // content of User Role Editor Pro advertisement slot - for direct call - public function advertise_pro() { - ?> - - advert = new URE_Advertisement(); - $this->advert->display(); - - } - // end of advertisement() - - - public static function output_confirmation_dialog() { - ?> -
-
-
- - -lib->get('multisite'); - $current_role = $this->editor->get('current_role'); - $show = true; - if ($multisite) { - if ($current_role=='administrator' && !$this->lib->is_super_admin()) { - $show = false; - } - } elseif ($current_role=='administrator') { - $show = false; - } - - return $show; - } - // end of show_select_all() - - - public function display_caps($for_role = true, $edit_mode=true) { - - $caps_columns_quant = $this->editor->get('caps_columns_quant'); - -?> - - - - - - - - - - - -
(/) -
-show_select_all()) { -?> -
- -
- -
-   -     - -   -
-
- - -
-
-
 
- show_caps_groups(); ?> - - show_capabilities($for_role, $edit_mode); ?> - - toolbar(); ?> -
- - * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya - **/ -class URE_Woocommerce_Capabilities { - - public static $post_types = array('product', 'shop_order', 'shop_coupon', 'shop_webhook', 'product_variation', 'shop_order_refund'); - private static $capability_types = array('product', 'shop_order', 'shop_coupon', 'shop_webhook'); - - - public static function add_group_to_caps(&$caps, $post_type, $group) { - - $post_types = $post_type .'s'; - $caps['edit_'. $post_types][] = $group; - $caps['edit_others_'. $post_types][] = $group; - $caps['publish_'. $post_types][] = $group; - $caps['read_private_'. $post_types][] = $group; - $caps['delete_'. $post_types][] = $group; - $caps['delete_private_'. $post_types][] = $group; - $caps['delete_published_'. $post_types][] = $group; - $caps['delete_others_'. $post_types][] = $group; - $caps['edit_private_'. $post_types][] = $group; - $caps['edit_published_'. $post_types][] = $group; - - } - // end of add_group_to_caps() - - - private static function add_base_caps(&$caps, $group, $subgroup, $cap_type) { - - $cap_types = $cap_type .'s'; - $caps['edit_'. $cap_type] = array('custom', 'custom_post_types', $group, $subgroup, $cap_type); - $caps['read_'. $cap_type] = array('custom', 'custom_post_types', $group, $subgroup, $cap_type); - $caps['delete_'. $cap_type] = array('custom', $group, $subgroup, $cap_type); - $caps['edit_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['edit_others_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['publish_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['read_private_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['delete_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['delete_private_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['delete_published_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['delete_others_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['edit_private_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['edit_published_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - - } - // end of add_base_caps() - - - /** - * Returns full list of WooCommerce plugin user capabilities - */ - public static function get_caps_groups() { - - $caps = array( - 'manage_woocommerce'=>array('custom', 'woocommerce', 'woocommerce_core'), - 'view_woocommerce_reports'=>array('custom', 'woocommerce', 'woocommerce_core'), - 'view_admin_dashboard'=>array('custom', 'woocommerce', 'woocommerce_core') - ); - - // code was built on the base of woocommerce/includes/class-wc-install.php method WC_Install::get_core_capabilities() - $group = 'woocommerce'; - foreach (self::$capability_types as $cap_type) { - $subgroup = $group .'_'. $cap_type; - self::add_base_caps($caps, $group, $subgroup, $cap_type); - $caps['manage_'. $cap_type .'_terms'] = array('custom', $group, $subgroup, $cap_type); - $caps['edit_'. $cap_type .'_terms'] = array('custom', $group, $subgroup, $cap_type); - $caps['delete_'. $cap_type .'_terms'] = array('custom', $group, $subgroup, $cap_type); - $caps['assign_'. $cap_type .'_terms'] = array('custom', $group, $subgroup, $cap_type); - } - - $pto1 = get_post_type_object('product_variation'); - if (empty($pto1) || $pto1->capability_type === 'product') { // default, not redefined by some plugin - // add capabilities group for the product_variation custom post type - self::add_group_to_caps($caps, 'product', 'woocommerce_product_variation'); - self::add_group_to_caps($caps, 'product', 'product_variation'); - } else { - $cap_type = 'product_variation'; - $subgroup = $group .'_'. $cap_type; - self::add_base_caps($caps, $group, $subgroup, $cap_type); - } - $pto2 = get_post_type_object('shop_order_refund'); - if (empty($pto2) || $pto2->capability_type === 'shop_order') { // default, not redefined by some plugin - // add capabilities group for the shop_order_refund custom post type - self::add_group_to_caps($caps, 'shop_order', 'woocommerce_shop_order_refund'); - self::add_group_to_caps($caps, 'shop_order', 'shop_order_refund'); - } else { - $cap_type = 'shop_order_variant'; - $subgroup = $group .'_'. $cap_type; - self::add_base_caps($caps, $group, $subgroup, $cap_type); - } - - return $caps; - } - // end of get() - - - /** - * This custom post types use capabilities from the other custom post types - * So we should define capabilities set for them manually - * @return array() - */ - public static function get_post_types_without_caps() { - - $pt_without_caps = array(); - $pto1 = get_post_type_object('product_variation'); - if (!empty($pto1) && $pto1->capability_type === 'product') { - $pt_without_caps[] = $pto1->name; - } - $pto2 = get_post_type_object('shop_order_refund'); - if (!empty($pto2) && $pto2->capability_type === 'shop_order') { - $pt_without_caps[] = $pto2->name; - } - - return $pt_without_caps; - } - // end of get_post_types_without_caps() - -} -// end of URE_Woocommerce_Capabilities class \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/define-constants.php b/wp/wp-content/plugins/user-role-editor/includes/define-constants.php deleted file mode 100644 index 57eda304..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/define-constants.php +++ /dev/null @@ -1,14 +0,0 @@ -is_pro() ) { - return false; - } - - $result = $GLOBALS['user_role_editor']->get_post_view_access_users( $post_id ); - - return $result; - } - // end of ure_get_post_view_users() - -} - - -if ( ! function_exists( 'ure_hide_admin_bar' ) ) { - function ure_hide_admin_bar() { - - show_admin_bar(false); - - } - // end of hide_admin_bar() -} - - -if ( ! function_exists( 'wp_roles' ) ) { - /** - * Included for back compatibility with WP 4.0+ - * Retrieves the global WP_Roles instance and instantiates it if necessary. - * - * @since 4.3.0 - * - * @global WP_Roles $wp_roles WP_Roles global instance. - * - * @return WP_Roles WP_Roles global instance if not already instantiated. - */ - function wp_roles() { - global $wp_roles; - - if (!isset($wp_roles)) { - $wp_roles = new WP_Roles(); - } - return $wp_roles; - } - -} - - -if ( ! function_exists( 'ure_array_merge' ) ) { - /** - * Wrapper for PHP array_merge() function - for 2 input parameters only - * Excludes PHP Fatal error: Uncaught TypeError: array_merge(): Argument #2 must be of type array - * Checks that parameters are not null and not empty before a real call of array_merge() - */ - function ure_array_merge( ...$args ) { - - $result = array(); - foreach( $args as $value ) { - if ( $value===null ) { - continue; - } - if ( !is_array( $value ) ) { - continue; - } - if ( empty( $value ) ) { - continue; - } - - $result = array_merge( $result, $value ); - } - - return $result; - } -} \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/settings-template.php b/wp/wp-content/plugins/user-role-editor/includes/settings-template.php deleted file mode 100644 index eeb7ef16..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/settings-template.php +++ /dev/null @@ -1,260 +0,0 @@ - -
- -

-
-

- - -
- - - diff --git a/wp/wp-content/plugins/user-role-editor/index.php b/wp/wp-content/plugins/user-role-editor/index.php deleted file mode 100644 index 62200328..00000000 --- a/wp/wp-content/plugins/user-role-editor/index.php +++ /dev/null @@ -1,2 +0,0 @@ - 0 ? floor : ceil)(argument); - }; - - var min = Math.min; - - // `ToLength` abstract operation - // https://tc39.github.io/ecma262/#sec-tolength - var toLength = function (argument) { - return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 - }; - - var max = Math.max; - var min$1 = Math.min; - - // Helper for a popular repeating case of the spec: - // Let integer be ? ToInteger(index). - // If integer < 0, let result be max((length + integer), 0); else let result be min(length, length). - var toAbsoluteIndex = function (index, length) { - var integer = toInteger(index); - return integer < 0 ? max(integer + length, 0) : min$1(integer, length); - }; - - // `Array.prototype.{ indexOf, includes }` methods implementation - var createMethod = function (IS_INCLUDES) { - return function ($this, el, fromIndex) { - var O = toIndexedObject($this); - var length = toLength(O.length); - var index = toAbsoluteIndex(fromIndex, length); - var value; - // Array#includes uses SameValueZero equality algorithm - // eslint-disable-next-line no-self-compare - if (IS_INCLUDES && el != el) while (length > index) { - value = O[index++]; - // eslint-disable-next-line no-self-compare - if (value != value) return true; - // Array#indexOf ignores holes, Array#includes - not - } else for (;length > index; index++) { - if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; - }; - - var arrayIncludes = { - // `Array.prototype.includes` method - // https://tc39.github.io/ecma262/#sec-array.prototype.includes - includes: createMethod(true), - // `Array.prototype.indexOf` method - // https://tc39.github.io/ecma262/#sec-array.prototype.indexof - indexOf: createMethod(false) - }; - - var indexOf = arrayIncludes.indexOf; - - - var objectKeysInternal = function (object, names) { - var O = toIndexedObject(object); - var i = 0; - var result = []; - var key; - for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while (names.length > i) if (has(O, key = names[i++])) { - ~indexOf(result, key) || result.push(key); - } - return result; - }; - - // IE8- don't enum bug keys - var enumBugKeys = [ - 'constructor', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'toLocaleString', - 'toString', - 'valueOf' - ]; - - var hiddenKeys$1 = enumBugKeys.concat('length', 'prototype'); - - // `Object.getOwnPropertyNames` method - // https://tc39.github.io/ecma262/#sec-object.getownpropertynames - var f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { - return objectKeysInternal(O, hiddenKeys$1); - }; - - var objectGetOwnPropertyNames = { - f: f$3 - }; - - var f$4 = Object.getOwnPropertySymbols; - - var objectGetOwnPropertySymbols = { - f: f$4 - }; - - // all object keys, includes non-enumerable and symbols - var ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { - var keys = objectGetOwnPropertyNames.f(anObject(it)); - var getOwnPropertySymbols = objectGetOwnPropertySymbols.f; - return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys; - }; - - var copyConstructorProperties = function (target, source) { - var keys = ownKeys(source); - var defineProperty = objectDefineProperty.f; - var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f; - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key)); - } - }; - - var replacement = /#|\.prototype\./; - - var isForced = function (feature, detection) { - var value = data[normalize(feature)]; - return value == POLYFILL ? true - : value == NATIVE ? false - : typeof detection == 'function' ? fails(detection) - : !!detection; - }; - - var normalize = isForced.normalize = function (string) { - return String(string).replace(replacement, '.').toLowerCase(); - }; - - var data = isForced.data = {}; - var NATIVE = isForced.NATIVE = 'N'; - var POLYFILL = isForced.POLYFILL = 'P'; - - var isForced_1 = isForced; - - var getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f; - - - - - - - /* - options.target - name of the target object - options.global - target is the global object - options.stat - export as static methods of target - options.proto - export as prototype methods of target - options.real - real prototype method for the `pure` version - options.forced - export even if the native feature is available - options.bind - bind methods to the target, required for the `pure` version - options.wrap - wrap constructors to preventing global pollution, required for the `pure` version - options.unsafe - use the simple assignment of property instead of delete + defineProperty - options.sham - add a flag to not completely full polyfills - options.enumerable - export as enumerable property - options.noTargetGet - prevent calling a getter on target - */ - var _export = function (options, source) { - var TARGET = options.target; - var GLOBAL = options.global; - var STATIC = options.stat; - var FORCED, target, key, targetProperty, sourceProperty, descriptor; - if (GLOBAL) { - target = global_1; - } else if (STATIC) { - target = global_1[TARGET] || setGlobal(TARGET, {}); - } else { - target = (global_1[TARGET] || {}).prototype; - } - if (target) for (key in source) { - sourceProperty = source[key]; - if (options.noTargetGet) { - descriptor = getOwnPropertyDescriptor$1(target, key); - targetProperty = descriptor && descriptor.value; - } else targetProperty = target[key]; - FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); - // contained in target - if (!FORCED && targetProperty !== undefined) { - if (typeof sourceProperty === typeof targetProperty) continue; - copyConstructorProperties(sourceProperty, targetProperty); - } - // add a flag to not completely full polyfills - if (options.sham || (targetProperty && targetProperty.sham)) { - hide(sourceProperty, 'sham', true); - } - // extend global - redefine(target, key, sourceProperty, options); - } - }; - - var nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () { - // Chrome 38 Symbol has incorrect toString conversion - // eslint-disable-next-line no-undef - return !String(Symbol()); - }); - - var Symbol$1 = global_1.Symbol; - var store$1 = shared('wks'); - - var wellKnownSymbol = function (name) { - return store$1[name] || (store$1[name] = nativeSymbol && Symbol$1[name] - || (nativeSymbol ? Symbol$1 : uid)('Symbol.' + name)); - }; - - // `Object.keys` method - // https://tc39.github.io/ecma262/#sec-object.keys - var objectKeys = Object.keys || function keys(O) { - return objectKeysInternal(O, enumBugKeys); - }; - - // `Object.defineProperties` method - // https://tc39.github.io/ecma262/#sec-object.defineproperties - var objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) { - anObject(O); - var keys = objectKeys(Properties); - var length = keys.length; - var index = 0; - var key; - while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]); - return O; - }; - - var html = getBuiltIn('document', 'documentElement'); - - var IE_PROTO = sharedKey('IE_PROTO'); - - var PROTOTYPE = 'prototype'; - var Empty = function () { /* empty */ }; - - // Create object with fake `null` prototype: use iframe Object with cleared prototype - var createDict = function () { - // Thrash, waste and sodomy: IE GC bug - var iframe = documentCreateElement('iframe'); - var length = enumBugKeys.length; - var lt = '<'; - var script = 'script'; - var gt = '>'; - var js = 'java' + script + ':'; - var iframeDocument; - iframe.style.display = 'none'; - html.appendChild(iframe); - iframe.src = String(js); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt); - iframeDocument.close(); - createDict = iframeDocument.F; - while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]]; - return createDict(); - }; - - // `Object.create` method - // https://tc39.github.io/ecma262/#sec-object.create - var objectCreate = Object.create || function create(O, Properties) { - var result; - if (O !== null) { - Empty[PROTOTYPE] = anObject(O); - result = new Empty(); - Empty[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = createDict(); - return Properties === undefined ? result : objectDefineProperties(result, Properties); - }; - - hiddenKeys[IE_PROTO] = true; - - var UNSCOPABLES = wellKnownSymbol('unscopables'); - var ArrayPrototype = Array.prototype; - - // Array.prototype[@@unscopables] - // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables - if (ArrayPrototype[UNSCOPABLES] == undefined) { - hide(ArrayPrototype, UNSCOPABLES, objectCreate(null)); - } - - // add a key to Array.prototype[@@unscopables] - var addToUnscopables = function (key) { - ArrayPrototype[UNSCOPABLES][key] = true; - }; - - var $includes = arrayIncludes.includes; - - - // `Array.prototype.includes` method - // https://tc39.github.io/ecma262/#sec-array.prototype.includes - _export({ target: 'Array', proto: true }, { - includes: function includes(el /* , fromIndex = 0 */) { - return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); - } - }); - - // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables - addToUnscopables('includes'); - - // `ToObject` abstract operation - // https://tc39.github.io/ecma262/#sec-toobject - var toObject = function (argument) { - return Object(requireObjectCoercible(argument)); - }; - - var nativeAssign = Object.assign; - - // `Object.assign` method - // https://tc39.github.io/ecma262/#sec-object.assign - // should work with symbols and should have deterministic property order (V8 bug) - var objectAssign = !nativeAssign || fails(function () { - var A = {}; - var B = {}; - // eslint-disable-next-line no-undef - var symbol = Symbol(); - var alphabet = 'abcdefghijklmnopqrst'; - A[symbol] = 7; - alphabet.split('').forEach(function (chr) { B[chr] = chr; }); - return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet; - }) ? function assign(target, source) { // eslint-disable-line no-unused-vars - var T = toObject(target); - var argumentsLength = arguments.length; - var index = 1; - var getOwnPropertySymbols = objectGetOwnPropertySymbols.f; - var propertyIsEnumerable = objectPropertyIsEnumerable.f; - while (argumentsLength > index) { - var S = indexedObject(arguments[index++]); - var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S); - var length = keys.length; - var j = 0; - var key; - while (length > j) { - key = keys[j++]; - if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key]; - } - } return T; - } : nativeAssign; - - // `Object.assign` method - // https://tc39.github.io/ecma262/#sec-object.assign - _export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, { - assign: objectAssign - }); - - var MATCH = wellKnownSymbol('match'); - - // `IsRegExp` abstract operation - // https://tc39.github.io/ecma262/#sec-isregexp - var isRegexp = function (it) { - var isRegExp; - return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp'); - }; - - var notARegexp = function (it) { - if (isRegexp(it)) { - throw TypeError("The method doesn't accept regular expressions"); - } return it; - }; - - var MATCH$1 = wellKnownSymbol('match'); - - var correctIsRegexpLogic = function (METHOD_NAME) { - var regexp = /./; - try { - '/./'[METHOD_NAME](regexp); - } catch (e) { - try { - regexp[MATCH$1] = false; - return '/./'[METHOD_NAME](regexp); - } catch (f) { /* empty */ } - } return false; - }; - - // `String.prototype.includes` method - // https://tc39.github.io/ecma262/#sec-string.prototype.includes - _export({ target: 'String', proto: true, forced: !correctIsRegexpLogic('includes') }, { - includes: function includes(searchString /* , position = 0 */) { - return !!~String(requireObjectCoercible(this)) - .indexOf(notARegexp(searchString), arguments.length > 1 ? arguments[1] : undefined); - } - }); - - // a string of all valid unicode whitespaces - // eslint-disable-next-line max-len - var whitespaces = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; - - var whitespace = '[' + whitespaces + ']'; - var ltrim = RegExp('^' + whitespace + whitespace + '*'); - var rtrim = RegExp(whitespace + whitespace + '*$'); - - // `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation - var createMethod$1 = function (TYPE) { - return function ($this) { - var string = String(requireObjectCoercible($this)); - if (TYPE & 1) string = string.replace(ltrim, ''); - if (TYPE & 2) string = string.replace(rtrim, ''); - return string; - }; - }; - - var stringTrim = { - // `String.prototype.{ trimLeft, trimStart }` methods - // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart - start: createMethod$1(1), - // `String.prototype.{ trimRight, trimEnd }` methods - // https://tc39.github.io/ecma262/#sec-string.prototype.trimend - end: createMethod$1(2), - // `String.prototype.trim` method - // https://tc39.github.io/ecma262/#sec-string.prototype.trim - trim: createMethod$1(3) - }; - - var non = '\u200B\u0085\u180E'; - - // check that a method works with the correct list - // of whitespaces and has a correct name - var forcedStringTrimMethod = function (METHOD_NAME) { - return fails(function () { - return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME; - }); - }; - - var $trim = stringTrim.trim; - - - // `String.prototype.trim` method - // https://tc39.github.io/ecma262/#sec-string.prototype.trim - _export({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, { - trim: function trim() { - return $trim(this); - } - }); - - var VERSION = '1.5.2'; - var BLOCK_ROWS = 50; - var CLUSTER_BLOCKS = 4; - var DEFAULTS = { - name: '', - placeholder: '', - data: undefined, - locale: undefined, - selectAll: true, - single: undefined, - singleRadio: false, - multiple: false, - hideOptgroupCheckboxes: false, - multipleWidth: 80, - width: undefined, - dropWidth: undefined, - maxHeight: 250, - maxHeightUnit: 'px', - position: 'bottom', - displayValues: false, - displayTitle: false, - displayDelimiter: ', ', - minimumCountSelected: 3, - ellipsis: false, - isOpen: false, - keepOpen: false, - openOnHover: false, - container: null, - filter: false, - filterGroup: false, - filterPlaceholder: '', - filterAcceptOnEnter: false, - filterByDataLength: undefined, - customFilter: function customFilter(label, text) { - // originalLabel, originalText - return label.includes(text); - }, - showClear: false, - animate: undefined, - styler: function styler() { - return false; - }, - textTemplate: function textTemplate($elm) { - return $elm[0].innerHTML.trim(); - }, - labelTemplate: function labelTemplate($elm) { - return $elm[0].getAttribute('label'); - }, - onOpen: function onOpen() { - return false; - }, - onClose: function onClose() { - return false; - }, - onCheckAll: function onCheckAll() { - return false; - }, - onUncheckAll: function onUncheckAll() { - return false; - }, - onFocus: function onFocus() { - return false; - }, - onBlur: function onBlur() { - return false; - }, - onOptgroupClick: function onOptgroupClick() { - return false; - }, - onClick: function onClick() { - return false; - }, - onFilter: function onFilter() { - return false; - }, - onClear: function onClear() { - return false; - }, - onAfterCreate: function onAfterCreate() { - return false; - } - }; - var EN = { - formatSelectAll: function formatSelectAll() { - return '[Select all]'; - }, - formatAllSelected: function formatAllSelected() { - return 'All selected'; - }, - formatCountSelected: function formatCountSelected(count, total) { - return count + ' of ' + total + ' selected'; - }, - formatNoMatchesFound: function formatNoMatchesFound() { - return 'No matches found'; - } - }; - var METHODS = ['getOptions', 'refreshOptions', 'getSelects', 'setSelects', 'enable', 'disable', 'open', 'close', 'check', 'uncheck', 'checkAll', 'uncheckAll', 'checkInvert', 'focus', 'blur', 'refresh', 'destroy']; - Object.assign(DEFAULTS, EN); - var Constants = { - VERSION: VERSION, - BLOCK_ROWS: BLOCK_ROWS, - CLUSTER_BLOCKS: CLUSTER_BLOCKS, - DEFAULTS: DEFAULTS, - METHODS: METHODS, - LOCALES: { - en: EN, - 'en-US': EN - } - }; - - // `IsArray` abstract operation - // https://tc39.github.io/ecma262/#sec-isarray - var isArray = Array.isArray || function isArray(arg) { - return classofRaw(arg) == 'Array'; - }; - - var nativeGetOwnPropertyNames = objectGetOwnPropertyNames.f; - - var toString$1 = {}.toString; - - var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames - ? Object.getOwnPropertyNames(window) : []; - - var getWindowNames = function (it) { - try { - return nativeGetOwnPropertyNames(it); - } catch (error) { - return windowNames.slice(); - } - }; - - // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window - var f$5 = function getOwnPropertyNames(it) { - return windowNames && toString$1.call(it) == '[object Window]' - ? getWindowNames(it) - : nativeGetOwnPropertyNames(toIndexedObject(it)); - }; - - var objectGetOwnPropertyNamesExternal = { - f: f$5 - }; - - var f$6 = wellKnownSymbol; - - var wrappedWellKnownSymbol = { - f: f$6 - }; - - var defineProperty = objectDefineProperty.f; - - var defineWellKnownSymbol = function (NAME) { - var Symbol = path.Symbol || (path.Symbol = {}); - if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, { - value: wrappedWellKnownSymbol.f(NAME) - }); - }; - - var defineProperty$1 = objectDefineProperty.f; - - - - var TO_STRING_TAG = wellKnownSymbol('toStringTag'); - - var setToStringTag = function (it, TAG, STATIC) { - if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) { - defineProperty$1(it, TO_STRING_TAG, { configurable: true, value: TAG }); - } - }; - - var aFunction$1 = function (it) { - if (typeof it != 'function') { - throw TypeError(String(it) + ' is not a function'); - } return it; - }; - - // optional / simple context binding - var bindContext = function (fn, that, length) { - aFunction$1(fn); - if (that === undefined) return fn; - switch (length) { - case 0: return function () { - return fn.call(that); - }; - case 1: return function (a) { - return fn.call(that, a); - }; - case 2: return function (a, b) { - return fn.call(that, a, b); - }; - case 3: return function (a, b, c) { - return fn.call(that, a, b, c); - }; - } - return function (/* ...args */) { - return fn.apply(that, arguments); - }; - }; - - var SPECIES = wellKnownSymbol('species'); - - // `ArraySpeciesCreate` abstract operation - // https://tc39.github.io/ecma262/#sec-arrayspeciescreate - var arraySpeciesCreate = function (originalArray, length) { - var C; - if (isArray(originalArray)) { - C = originalArray.constructor; - // cross-realm fallback - if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; - else if (isObject(C)) { - C = C[SPECIES]; - if (C === null) C = undefined; - } - } return new (C === undefined ? Array : C)(length === 0 ? 0 : length); - }; - - var push = [].push; - - // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation - var createMethod$2 = function (TYPE) { - var IS_MAP = TYPE == 1; - var IS_FILTER = TYPE == 2; - var IS_SOME = TYPE == 3; - var IS_EVERY = TYPE == 4; - var IS_FIND_INDEX = TYPE == 6; - var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; - return function ($this, callbackfn, that, specificCreate) { - var O = toObject($this); - var self = indexedObject(O); - var boundFunction = bindContext(callbackfn, that, 3); - var length = toLength(self.length); - var index = 0; - var create = specificCreate || arraySpeciesCreate; - var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; - var value, result; - for (;length > index; index++) if (NO_HOLES || index in self) { - value = self[index]; - result = boundFunction(value, index, O); - if (TYPE) { - if (IS_MAP) target[index] = result; // map - else if (result) switch (TYPE) { - case 3: return true; // some - case 5: return value; // find - case 6: return index; // findIndex - case 2: push.call(target, value); // filter - } else if (IS_EVERY) return false; // every - } - } - return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; - }; - }; - - var arrayIteration = { - // `Array.prototype.forEach` method - // https://tc39.github.io/ecma262/#sec-array.prototype.foreach - forEach: createMethod$2(0), - // `Array.prototype.map` method - // https://tc39.github.io/ecma262/#sec-array.prototype.map - map: createMethod$2(1), - // `Array.prototype.filter` method - // https://tc39.github.io/ecma262/#sec-array.prototype.filter - filter: createMethod$2(2), - // `Array.prototype.some` method - // https://tc39.github.io/ecma262/#sec-array.prototype.some - some: createMethod$2(3), - // `Array.prototype.every` method - // https://tc39.github.io/ecma262/#sec-array.prototype.every - every: createMethod$2(4), - // `Array.prototype.find` method - // https://tc39.github.io/ecma262/#sec-array.prototype.find - find: createMethod$2(5), - // `Array.prototype.findIndex` method - // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex - findIndex: createMethod$2(6) - }; - - var $forEach = arrayIteration.forEach; - - var HIDDEN = sharedKey('hidden'); - var SYMBOL = 'Symbol'; - var PROTOTYPE$1 = 'prototype'; - var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); - var setInternalState = internalState.set; - var getInternalState = internalState.getterFor(SYMBOL); - var ObjectPrototype = Object[PROTOTYPE$1]; - var $Symbol = global_1.Symbol; - var JSON = global_1.JSON; - var nativeJSONStringify = JSON && JSON.stringify; - var nativeGetOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f; - var nativeDefineProperty$1 = objectDefineProperty.f; - var nativeGetOwnPropertyNames$1 = objectGetOwnPropertyNamesExternal.f; - var nativePropertyIsEnumerable$1 = objectPropertyIsEnumerable.f; - var AllSymbols = shared('symbols'); - var ObjectPrototypeSymbols = shared('op-symbols'); - var StringToSymbolRegistry = shared('string-to-symbol-registry'); - var SymbolToStringRegistry = shared('symbol-to-string-registry'); - var WellKnownSymbolsStore = shared('wks'); - var QObject = global_1.QObject; - // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 - var USE_SETTER = !QObject || !QObject[PROTOTYPE$1] || !QObject[PROTOTYPE$1].findChild; - - // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 - var setSymbolDescriptor = descriptors && fails(function () { - return objectCreate(nativeDefineProperty$1({}, 'a', { - get: function () { return nativeDefineProperty$1(this, 'a', { value: 7 }).a; } - })).a != 7; - }) ? function (O, P, Attributes) { - var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$1(ObjectPrototype, P); - if (ObjectPrototypeDescriptor) delete ObjectPrototype[P]; - nativeDefineProperty$1(O, P, Attributes); - if (ObjectPrototypeDescriptor && O !== ObjectPrototype) { - nativeDefineProperty$1(ObjectPrototype, P, ObjectPrototypeDescriptor); - } - } : nativeDefineProperty$1; - - var wrap = function (tag, description) { - var symbol = AllSymbols[tag] = objectCreate($Symbol[PROTOTYPE$1]); - setInternalState(symbol, { - type: SYMBOL, - tag: tag, - description: description - }); - if (!descriptors) symbol.description = description; - return symbol; - }; - - var isSymbol = nativeSymbol && typeof $Symbol.iterator == 'symbol' ? function (it) { - return typeof it == 'symbol'; - } : function (it) { - return Object(it) instanceof $Symbol; - }; - - var $defineProperty = function defineProperty(O, P, Attributes) { - if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes); - anObject(O); - var key = toPrimitive(P, true); - anObject(Attributes); - if (has(AllSymbols, key)) { - if (!Attributes.enumerable) { - if (!has(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor(1, {})); - O[HIDDEN][key] = true; - } else { - if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false; - Attributes = objectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) }); - } return setSymbolDescriptor(O, key, Attributes); - } return nativeDefineProperty$1(O, key, Attributes); - }; - - var $defineProperties = function defineProperties(O, Properties) { - anObject(O); - var properties = toIndexedObject(Properties); - var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties)); - $forEach(keys, function (key) { - if (!descriptors || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]); - }); - return O; - }; - - var $create = function create(O, Properties) { - return Properties === undefined ? objectCreate(O) : $defineProperties(objectCreate(O), Properties); - }; - - var $propertyIsEnumerable = function propertyIsEnumerable(V) { - var P = toPrimitive(V, true); - var enumerable = nativePropertyIsEnumerable$1.call(this, P); - if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false; - return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true; - }; - - var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) { - var it = toIndexedObject(O); - var key = toPrimitive(P, true); - if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return; - var descriptor = nativeGetOwnPropertyDescriptor$1(it, key); - if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) { - descriptor.enumerable = true; - } - return descriptor; - }; - - var $getOwnPropertyNames = function getOwnPropertyNames(O) { - var names = nativeGetOwnPropertyNames$1(toIndexedObject(O)); - var result = []; - $forEach(names, function (key) { - if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key); - }); - return result; - }; - - var $getOwnPropertySymbols = function getOwnPropertySymbols(O) { - var IS_OBJECT_PROTOTYPE = O === ObjectPrototype; - var names = nativeGetOwnPropertyNames$1(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O)); - var result = []; - $forEach(names, function (key) { - if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) { - result.push(AllSymbols[key]); - } - }); - return result; - }; - - // `Symbol` constructor - // https://tc39.github.io/ecma262/#sec-symbol-constructor - if (!nativeSymbol) { - $Symbol = function Symbol() { - if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor'); - var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]); - var tag = uid(description); - var setter = function (value) { - if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value); - if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; - setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value)); - }; - if (descriptors && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter }); - return wrap(tag, description); - }; - - redefine($Symbol[PROTOTYPE$1], 'toString', function toString() { - return getInternalState(this).tag; - }); - - objectPropertyIsEnumerable.f = $propertyIsEnumerable; - objectDefineProperty.f = $defineProperty; - objectGetOwnPropertyDescriptor.f = $getOwnPropertyDescriptor; - objectGetOwnPropertyNames.f = objectGetOwnPropertyNamesExternal.f = $getOwnPropertyNames; - objectGetOwnPropertySymbols.f = $getOwnPropertySymbols; - - if (descriptors) { - // https://github.com/tc39/proposal-Symbol-description - nativeDefineProperty$1($Symbol[PROTOTYPE$1], 'description', { - configurable: true, - get: function description() { - return getInternalState(this).description; - } - }); - { - redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true }); - } - } - - wrappedWellKnownSymbol.f = function (name) { - return wrap(wellKnownSymbol(name), name); - }; - } - - _export({ global: true, wrap: true, forced: !nativeSymbol, sham: !nativeSymbol }, { - Symbol: $Symbol - }); - - $forEach(objectKeys(WellKnownSymbolsStore), function (name) { - defineWellKnownSymbol(name); - }); - - _export({ target: SYMBOL, stat: true, forced: !nativeSymbol }, { - // `Symbol.for` method - // https://tc39.github.io/ecma262/#sec-symbol.for - 'for': function (key) { - var string = String(key); - if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string]; - var symbol = $Symbol(string); - StringToSymbolRegistry[string] = symbol; - SymbolToStringRegistry[symbol] = string; - return symbol; - }, - // `Symbol.keyFor` method - // https://tc39.github.io/ecma262/#sec-symbol.keyfor - keyFor: function keyFor(sym) { - if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol'); - if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym]; - }, - useSetter: function () { USE_SETTER = true; }, - useSimple: function () { USE_SETTER = false; } - }); - - _export({ target: 'Object', stat: true, forced: !nativeSymbol, sham: !descriptors }, { - // `Object.create` method - // https://tc39.github.io/ecma262/#sec-object.create - create: $create, - // `Object.defineProperty` method - // https://tc39.github.io/ecma262/#sec-object.defineproperty - defineProperty: $defineProperty, - // `Object.defineProperties` method - // https://tc39.github.io/ecma262/#sec-object.defineproperties - defineProperties: $defineProperties, - // `Object.getOwnPropertyDescriptor` method - // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors - getOwnPropertyDescriptor: $getOwnPropertyDescriptor - }); - - _export({ target: 'Object', stat: true, forced: !nativeSymbol }, { - // `Object.getOwnPropertyNames` method - // https://tc39.github.io/ecma262/#sec-object.getownpropertynames - getOwnPropertyNames: $getOwnPropertyNames, - // `Object.getOwnPropertySymbols` method - // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols - getOwnPropertySymbols: $getOwnPropertySymbols - }); - - // Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives - // https://bugs.chromium.org/p/v8/issues/detail?id=3443 - _export({ target: 'Object', stat: true, forced: fails(function () { objectGetOwnPropertySymbols.f(1); }) }, { - getOwnPropertySymbols: function getOwnPropertySymbols(it) { - return objectGetOwnPropertySymbols.f(toObject(it)); - } - }); - - // `JSON.stringify` method behavior with symbols - // https://tc39.github.io/ecma262/#sec-json.stringify - JSON && _export({ target: 'JSON', stat: true, forced: !nativeSymbol || fails(function () { - var symbol = $Symbol(); - // MS Edge converts symbol values to JSON as {} - return nativeJSONStringify([symbol]) != '[null]' - // WebKit converts symbol values to JSON as null - || nativeJSONStringify({ a: symbol }) != '{}' - // V8 throws on boxed symbols - || nativeJSONStringify(Object(symbol)) != '{}'; - }) }, { - stringify: function stringify(it) { - var args = [it]; - var index = 1; - var replacer, $replacer; - while (arguments.length > index) args.push(arguments[index++]); - $replacer = replacer = args[1]; - if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined - if (!isArray(replacer)) replacer = function (key, value) { - if (typeof $replacer == 'function') value = $replacer.call(this, key, value); - if (!isSymbol(value)) return value; - }; - args[1] = replacer; - return nativeJSONStringify.apply(JSON, args); - } - }); - - // `Symbol.prototype[@@toPrimitive]` method - // https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive - if (!$Symbol[PROTOTYPE$1][TO_PRIMITIVE]) hide($Symbol[PROTOTYPE$1], TO_PRIMITIVE, $Symbol[PROTOTYPE$1].valueOf); - // `Symbol.prototype[@@toStringTag]` property - // https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag - setToStringTag($Symbol, SYMBOL); - - hiddenKeys[HIDDEN] = true; - - var defineProperty$2 = objectDefineProperty.f; - - - var NativeSymbol = global_1.Symbol; - - if (descriptors && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) || - // Safari 12 bug - NativeSymbol().description !== undefined - )) { - var EmptyStringDescriptionStore = {}; - // wrap Symbol constructor for correct work with undefined description - var SymbolWrapper = function Symbol() { - var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]); - var result = this instanceof SymbolWrapper - ? new NativeSymbol(description) - // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)' - : description === undefined ? NativeSymbol() : NativeSymbol(description); - if (description === '') EmptyStringDescriptionStore[result] = true; - return result; - }; - copyConstructorProperties(SymbolWrapper, NativeSymbol); - var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype; - symbolPrototype.constructor = SymbolWrapper; - - var symbolToString = symbolPrototype.toString; - var native = String(NativeSymbol('test')) == 'Symbol(test)'; - var regexp = /^Symbol\((.*)\)[^)]+$/; - defineProperty$2(symbolPrototype, 'description', { - configurable: true, - get: function description() { - var symbol = isObject(this) ? this.valueOf() : this; - var string = symbolToString.call(symbol); - if (has(EmptyStringDescriptionStore, symbol)) return ''; - var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1'); - return desc === '' ? undefined : desc; - } - }); - - _export({ global: true, forced: true }, { - Symbol: SymbolWrapper - }); - } - - // `Symbol.iterator` well-known symbol - // https://tc39.github.io/ecma262/#sec-symbol.iterator - defineWellKnownSymbol('iterator'); - - var createProperty = function (object, key, value) { - var propertyKey = toPrimitive(key); - if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value)); - else object[propertyKey] = value; - }; - - var SPECIES$1 = wellKnownSymbol('species'); - - var arrayMethodHasSpeciesSupport = function (METHOD_NAME) { - return !fails(function () { - var array = []; - var constructor = array.constructor = {}; - constructor[SPECIES$1] = function () { - return { foo: 1 }; - }; - return array[METHOD_NAME](Boolean).foo !== 1; - }); - }; - - var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable'); - var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; - var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded'; - - var IS_CONCAT_SPREADABLE_SUPPORT = !fails(function () { - var array = []; - array[IS_CONCAT_SPREADABLE] = false; - return array.concat()[0] !== array; - }); - - var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat'); - - var isConcatSpreadable = function (O) { - if (!isObject(O)) return false; - var spreadable = O[IS_CONCAT_SPREADABLE]; - return spreadable !== undefined ? !!spreadable : isArray(O); - }; - - var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT; - - // `Array.prototype.concat` method - // https://tc39.github.io/ecma262/#sec-array.prototype.concat - // with adding support of @@isConcatSpreadable and @@species - _export({ target: 'Array', proto: true, forced: FORCED }, { - concat: function concat(arg) { // eslint-disable-line no-unused-vars - var O = toObject(this); - var A = arraySpeciesCreate(O, 0); - var n = 0; - var i, k, length, len, E; - for (i = -1, length = arguments.length; i < length; i++) { - E = i === -1 ? O : arguments[i]; - if (isConcatSpreadable(E)) { - len = toLength(E.length); - if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED); - for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]); - } else { - if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED); - createProperty(A, n++, E); - } - } - A.length = n; - return A; - } - }); - - var $filter = arrayIteration.filter; - - - // `Array.prototype.filter` method - // https://tc39.github.io/ecma262/#sec-array.prototype.filter - // with adding support of @@species - _export({ target: 'Array', proto: true, forced: !arrayMethodHasSpeciesSupport('filter') }, { - filter: function filter(callbackfn /* , thisArg */) { - return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); - } - }); - - var $find = arrayIteration.find; - - - var FIND = 'find'; - var SKIPS_HOLES = true; - - // Shouldn't skip holes - if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; }); - - // `Array.prototype.find` method - // https://tc39.github.io/ecma262/#sec-array.prototype.find - _export({ target: 'Array', proto: true, forced: SKIPS_HOLES }, { - find: function find(callbackfn /* , that = undefined */) { - return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); - } - }); - - // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables - addToUnscopables(FIND); - - var correctPrototypeGetter = !fails(function () { - function F() { /* empty */ } - F.prototype.constructor = null; - return Object.getPrototypeOf(new F()) !== F.prototype; - }); - - var IE_PROTO$1 = sharedKey('IE_PROTO'); - var ObjectPrototype$1 = Object.prototype; - - // `Object.getPrototypeOf` method - // https://tc39.github.io/ecma262/#sec-object.getprototypeof - var objectGetPrototypeOf = correctPrototypeGetter ? Object.getPrototypeOf : function (O) { - O = toObject(O); - if (has(O, IE_PROTO$1)) return O[IE_PROTO$1]; - if (typeof O.constructor == 'function' && O instanceof O.constructor) { - return O.constructor.prototype; - } return O instanceof Object ? ObjectPrototype$1 : null; - }; - - var ITERATOR = wellKnownSymbol('iterator'); - var BUGGY_SAFARI_ITERATORS = false; - - var returnThis = function () { return this; }; - - // `%IteratorPrototype%` object - // https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object - var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; - - if ([].keys) { - arrayIterator = [].keys(); - // Safari 8 has buggy iterators w/o `next` - if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; - else { - PrototypeOfArrayIteratorPrototype = objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator)); - if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; - } - } - - if (IteratorPrototype == undefined) IteratorPrototype = {}; - - // 25.1.2.1.1 %IteratorPrototype%[@@iterator]() - if ( !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis); - - var iteratorsCore = { - IteratorPrototype: IteratorPrototype, - BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS - }; - - var IteratorPrototype$1 = iteratorsCore.IteratorPrototype; - - var createIteratorConstructor = function (IteratorConstructor, NAME, next) { - var TO_STRING_TAG = NAME + ' Iterator'; - IteratorConstructor.prototype = objectCreate(IteratorPrototype$1, { next: createPropertyDescriptor(1, next) }); - setToStringTag(IteratorConstructor, TO_STRING_TAG, false); - return IteratorConstructor; - }; - - var aPossiblePrototype = function (it) { - if (!isObject(it) && it !== null) { - throw TypeError("Can't set " + String(it) + ' as a prototype'); - } return it; - }; - - // `Object.setPrototypeOf` method - // https://tc39.github.io/ecma262/#sec-object.setprototypeof - // Works with __proto__ only. Old v8 can't work with null proto objects. - /* eslint-disable no-proto */ - var objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () { - var CORRECT_SETTER = false; - var test = {}; - var setter; - try { - setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set; - setter.call(test, []); - CORRECT_SETTER = test instanceof Array; - } catch (error) { /* empty */ } - return function setPrototypeOf(O, proto) { - anObject(O); - aPossiblePrototype(proto); - if (CORRECT_SETTER) setter.call(O, proto); - else O.__proto__ = proto; - return O; - }; - }() : undefined); - - var IteratorPrototype$2 = iteratorsCore.IteratorPrototype; - var BUGGY_SAFARI_ITERATORS$1 = iteratorsCore.BUGGY_SAFARI_ITERATORS; - var ITERATOR$1 = wellKnownSymbol('iterator'); - var KEYS = 'keys'; - var VALUES = 'values'; - var ENTRIES = 'entries'; - - var returnThis$1 = function () { return this; }; - - var defineIterator = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { - createIteratorConstructor(IteratorConstructor, NAME, next); - - var getIterationMethod = function (KIND) { - if (KIND === DEFAULT && defaultIterator) return defaultIterator; - if (!BUGGY_SAFARI_ITERATORS$1 && KIND in IterablePrototype) return IterablePrototype[KIND]; - switch (KIND) { - case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; - case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; - case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; - } return function () { return new IteratorConstructor(this); }; - }; - - var TO_STRING_TAG = NAME + ' Iterator'; - var INCORRECT_VALUES_NAME = false; - var IterablePrototype = Iterable.prototype; - var nativeIterator = IterablePrototype[ITERATOR$1] - || IterablePrototype['@@iterator'] - || DEFAULT && IterablePrototype[DEFAULT]; - var defaultIterator = !BUGGY_SAFARI_ITERATORS$1 && nativeIterator || getIterationMethod(DEFAULT); - var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; - var CurrentIteratorPrototype, methods, KEY; - - // fix native - if (anyNativeIterator) { - CurrentIteratorPrototype = objectGetPrototypeOf(anyNativeIterator.call(new Iterable())); - if (IteratorPrototype$2 !== Object.prototype && CurrentIteratorPrototype.next) { - if ( objectGetPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype$2) { - if (objectSetPrototypeOf) { - objectSetPrototypeOf(CurrentIteratorPrototype, IteratorPrototype$2); - } else if (typeof CurrentIteratorPrototype[ITERATOR$1] != 'function') { - hide(CurrentIteratorPrototype, ITERATOR$1, returnThis$1); - } - } - // Set @@toStringTag to native iterators - setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true); - } - } - - // fix Array#{values, @@iterator}.name in V8 / FF - if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { - INCORRECT_VALUES_NAME = true; - defaultIterator = function values() { return nativeIterator.call(this); }; - } - - // define iterator - if ( IterablePrototype[ITERATOR$1] !== defaultIterator) { - hide(IterablePrototype, ITERATOR$1, defaultIterator); - } - - // export additional methods - if (DEFAULT) { - methods = { - values: getIterationMethod(VALUES), - keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), - entries: getIterationMethod(ENTRIES) - }; - if (FORCED) for (KEY in methods) { - if (BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { - redefine(IterablePrototype, KEY, methods[KEY]); - } - } else _export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME }, methods); - } - - return methods; - }; - - var ARRAY_ITERATOR = 'Array Iterator'; - var setInternalState$1 = internalState.set; - var getInternalState$1 = internalState.getterFor(ARRAY_ITERATOR); - - // `Array.prototype.entries` method - // https://tc39.github.io/ecma262/#sec-array.prototype.entries - // `Array.prototype.keys` method - // https://tc39.github.io/ecma262/#sec-array.prototype.keys - // `Array.prototype.values` method - // https://tc39.github.io/ecma262/#sec-array.prototype.values - // `Array.prototype[@@iterator]` method - // https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator - // `CreateArrayIterator` internal method - // https://tc39.github.io/ecma262/#sec-createarrayiterator - var es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind) { - setInternalState$1(this, { - type: ARRAY_ITERATOR, - target: toIndexedObject(iterated), // target - index: 0, // next index - kind: kind // kind - }); - // `%ArrayIteratorPrototype%.next` method - // https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next - }, function () { - var state = getInternalState$1(this); - var target = state.target; - var kind = state.kind; - var index = state.index++; - if (!target || index >= target.length) { - state.target = undefined; - return { value: undefined, done: true }; - } - if (kind == 'keys') return { value: index, done: false }; - if (kind == 'values') return { value: target[index], done: false }; - return { value: [index, target[index]], done: false }; - }, 'values'); - - // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables - addToUnscopables('keys'); - addToUnscopables('values'); - addToUnscopables('entries'); - - var sloppyArrayMethod = function (METHOD_NAME, argument) { - var method = [][METHOD_NAME]; - return !method || !fails(function () { - // eslint-disable-next-line no-useless-call,no-throw-literal - method.call(null, argument || function () { throw 1; }, 1); - }); - }; - - var nativeJoin = [].join; - - var ES3_STRINGS = indexedObject != Object; - var SLOPPY_METHOD = sloppyArrayMethod('join', ','); - - // `Array.prototype.join` method - // https://tc39.github.io/ecma262/#sec-array.prototype.join - _export({ target: 'Array', proto: true, forced: ES3_STRINGS || SLOPPY_METHOD }, { - join: function join(separator) { - return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator); - } - }); - - var $map = arrayIteration.map; - - - // `Array.prototype.map` method - // https://tc39.github.io/ecma262/#sec-array.prototype.map - // with adding support of @@species - _export({ target: 'Array', proto: true, forced: !arrayMethodHasSpeciesSupport('map') }, { - map: function map(callbackfn /* , thisArg */) { - return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); - } - }); - - var SPECIES$2 = wellKnownSymbol('species'); - var nativeSlice = [].slice; - var max$1 = Math.max; - - // `Array.prototype.slice` method - // https://tc39.github.io/ecma262/#sec-array.prototype.slice - // fallback for not array-like ES3 strings and DOM objects - _export({ target: 'Array', proto: true, forced: !arrayMethodHasSpeciesSupport('slice') }, { - slice: function slice(start, end) { - var O = toIndexedObject(this); - var length = toLength(O.length); - var k = toAbsoluteIndex(start, length); - var fin = toAbsoluteIndex(end === undefined ? length : end, length); - // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible - var Constructor, result, n; - if (isArray(O)) { - Constructor = O.constructor; - // cross-realm fallback - if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) { - Constructor = undefined; - } else if (isObject(Constructor)) { - Constructor = Constructor[SPECIES$2]; - if (Constructor === null) Constructor = undefined; - } - if (Constructor === Array || Constructor === undefined) { - return nativeSlice.call(O, k, fin); - } - } - result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0)); - for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]); - result.length = n; - return result; - } - }); - - var defineProperty$3 = objectDefineProperty.f; - - var FunctionPrototype = Function.prototype; - var FunctionPrototypeToString = FunctionPrototype.toString; - var nameRE = /^\s*function ([^ (]*)/; - var NAME = 'name'; - - // Function instances `.name` property - // https://tc39.github.io/ecma262/#sec-function-instances-name - if (descriptors && !(NAME in FunctionPrototype)) { - defineProperty$3(FunctionPrototype, NAME, { - configurable: true, - get: function () { - try { - return FunctionPrototypeToString.call(this).match(nameRE)[1]; - } catch (error) { - return ''; - } - } - }); - } - - var propertyIsEnumerable = objectPropertyIsEnumerable.f; - - // `Object.{ entries, values }` methods implementation - var createMethod$3 = function (TO_ENTRIES) { - return function (it) { - var O = toIndexedObject(it); - var keys = objectKeys(O); - var length = keys.length; - var i = 0; - var result = []; - var key; - while (length > i) { - key = keys[i++]; - if (!descriptors || propertyIsEnumerable.call(O, key)) { - result.push(TO_ENTRIES ? [key, O[key]] : O[key]); - } - } - return result; - }; - }; - - var objectToArray = { - // `Object.entries` method - // https://tc39.github.io/ecma262/#sec-object.entries - entries: createMethod$3(true), - // `Object.values` method - // https://tc39.github.io/ecma262/#sec-object.values - values: createMethod$3(false) - }; - - var $entries = objectToArray.entries; - - // `Object.entries` method - // https://tc39.github.io/ecma262/#sec-object.entries - _export({ target: 'Object', stat: true }, { - entries: function entries(O) { - return $entries(O); - } - }); - - var FAILS_ON_PRIMITIVES = fails(function () { objectKeys(1); }); - - // `Object.keys` method - // https://tc39.github.io/ecma262/#sec-object.keys - _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, { - keys: function keys(it) { - return objectKeys(toObject(it)); - } - }); - - var TO_STRING_TAG$1 = wellKnownSymbol('toStringTag'); - // ES3 wrong here - var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; - - // fallback for IE11 Script Access Denied error - var tryGet = function (it, key) { - try { - return it[key]; - } catch (error) { /* empty */ } - }; - - // getting tag from ES6+ `Object.prototype.toString` - var classof = function (it) { - var O, tag, result; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG$1)) == 'string' ? tag - // builtinTag case - : CORRECT_ARGUMENTS ? classofRaw(O) - // ES3 arguments fallback - : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result; - }; - - var TO_STRING_TAG$2 = wellKnownSymbol('toStringTag'); - var test = {}; - - test[TO_STRING_TAG$2] = 'z'; - - // `Object.prototype.toString` method implementation - // https://tc39.github.io/ecma262/#sec-object.prototype.tostring - var objectToString = String(test) !== '[object z]' ? function toString() { - return '[object ' + classof(this) + ']'; - } : test.toString; - - var ObjectPrototype$2 = Object.prototype; - - // `Object.prototype.toString` method - // https://tc39.github.io/ecma262/#sec-object.prototype.tostring - if (objectToString !== ObjectPrototype$2.toString) { - redefine(ObjectPrototype$2, 'toString', objectToString, { unsafe: true }); - } - - // `String.prototype.{ codePointAt, at }` methods implementation - var createMethod$4 = function (CONVERT_TO_STRING) { - return function ($this, pos) { - var S = String(requireObjectCoercible($this)); - var position = toInteger(pos); - var size = S.length; - var first, second; - if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; - first = S.charCodeAt(position); - return first < 0xD800 || first > 0xDBFF || position + 1 === size - || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF - ? CONVERT_TO_STRING ? S.charAt(position) : first - : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; - }; - }; - - var stringMultibyte = { - // `String.prototype.codePointAt` method - // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat - codeAt: createMethod$4(false), - // `String.prototype.at` method - // https://github.com/mathiasbynens/String.prototype.at - charAt: createMethod$4(true) - }; - - var charAt = stringMultibyte.charAt; - - - - var STRING_ITERATOR = 'String Iterator'; - var setInternalState$2 = internalState.set; - var getInternalState$2 = internalState.getterFor(STRING_ITERATOR); - - // `String.prototype[@@iterator]` method - // https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator - defineIterator(String, 'String', function (iterated) { - setInternalState$2(this, { - type: STRING_ITERATOR, - string: String(iterated), - index: 0 - }); - // `%StringIteratorPrototype%.next` method - // https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next - }, function next() { - var state = getInternalState$2(this); - var string = state.string; - var index = state.index; - var point; - if (index >= string.length) return { value: undefined, done: true }; - point = charAt(string, index); - state.index += point.length; - return { value: point, done: false }; - }); - - // `RegExp.prototype.flags` getter implementation - // https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags - var regexpFlags = function () { - var that = anObject(this); - var result = ''; - if (that.global) result += 'g'; - if (that.ignoreCase) result += 'i'; - if (that.multiline) result += 'm'; - if (that.dotAll) result += 's'; - if (that.unicode) result += 'u'; - if (that.sticky) result += 'y'; - return result; - }; - - var nativeExec = RegExp.prototype.exec; - // This always refers to the native implementation, because the - // String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, - // which loads this file before patching the method. - var nativeReplace = String.prototype.replace; - - var patchedExec = nativeExec; - - var UPDATES_LAST_INDEX_WRONG = (function () { - var re1 = /a/; - var re2 = /b*/g; - nativeExec.call(re1, 'a'); - nativeExec.call(re2, 'a'); - return re1.lastIndex !== 0 || re2.lastIndex !== 0; - })(); - - // nonparticipating capturing group, copied from es5-shim's String#split patch. - var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; - - var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED; - - if (PATCH) { - patchedExec = function exec(str) { - var re = this; - var lastIndex, reCopy, match, i; - - if (NPCG_INCLUDED) { - reCopy = new RegExp('^' + re.source + '$(?!\\s)', regexpFlags.call(re)); - } - if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex; - - match = nativeExec.call(re, str); - - if (UPDATES_LAST_INDEX_WRONG && match) { - re.lastIndex = re.global ? match.index + match[0].length : lastIndex; - } - if (NPCG_INCLUDED && match && match.length > 1) { - // Fix browsers whose `exec` methods don't consistently return `undefined` - // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ - nativeReplace.call(match[0], reCopy, function () { - for (i = 1; i < arguments.length - 2; i++) { - if (arguments[i] === undefined) match[i] = undefined; - } - }); - } - - return match; - }; - } - - var regexpExec = patchedExec; - - var SPECIES$3 = wellKnownSymbol('species'); - - var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () { - // #replace needs built-in support for named groups. - // #match works fine because it just return the exec results, even if it has - // a "grops" property. - var re = /./; - re.exec = function () { - var result = []; - result.groups = { a: '7' }; - return result; - }; - return ''.replace(re, '$') !== '7'; - }); - - // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec - // Weex JS has frozen built-in prototypes, so use try / catch wrapper - var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () { - var re = /(?:)/; - var originalExec = re.exec; - re.exec = function () { return originalExec.apply(this, arguments); }; - var result = 'ab'.split(re); - return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b'; - }); - - var fixRegexpWellKnownSymbolLogic = function (KEY, length, exec, sham) { - var SYMBOL = wellKnownSymbol(KEY); - - var DELEGATES_TO_SYMBOL = !fails(function () { - // String methods call symbol-named RegEp methods - var O = {}; - O[SYMBOL] = function () { return 7; }; - return ''[KEY](O) != 7; - }); - - var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () { - // Symbol-named RegExp methods call .exec - var execCalled = false; - var re = /a/; - re.exec = function () { execCalled = true; return null; }; - - if (KEY === 'split') { - // RegExp[@@split] doesn't call the regex's exec method, but first creates - // a new one. We need to return the patched regex when creating the new one. - re.constructor = {}; - re.constructor[SPECIES$3] = function () { return re; }; - } - - re[SYMBOL](''); - return !execCalled; - }); - - if ( - !DELEGATES_TO_SYMBOL || - !DELEGATES_TO_EXEC || - (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) || - (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) - ) { - var nativeRegExpMethod = /./[SYMBOL]; - var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) { - if (regexp.exec === regexpExec) { - if (DELEGATES_TO_SYMBOL && !forceStringMethod) { - // The native String method already delegates to @@method (this - // polyfilled function), leasing to infinite recursion. - // We avoid it by directly calling the native @@method method. - return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) }; - } - return { done: true, value: nativeMethod.call(str, regexp, arg2) }; - } - return { done: false }; - }); - var stringMethod = methods[0]; - var regexMethod = methods[1]; - - redefine(String.prototype, KEY, stringMethod); - redefine(RegExp.prototype, SYMBOL, length == 2 - // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) - // 21.2.5.11 RegExp.prototype[@@split](string, limit) - ? function (string, arg) { return regexMethod.call(string, this, arg); } - // 21.2.5.6 RegExp.prototype[@@match](string) - // 21.2.5.9 RegExp.prototype[@@search](string) - : function (string) { return regexMethod.call(string, this); } - ); - if (sham) hide(RegExp.prototype[SYMBOL], 'sham', true); - } - }; - - var SPECIES$4 = wellKnownSymbol('species'); - - // `SpeciesConstructor` abstract operation - // https://tc39.github.io/ecma262/#sec-speciesconstructor - var speciesConstructor = function (O, defaultConstructor) { - var C = anObject(O).constructor; - var S; - return C === undefined || (S = anObject(C)[SPECIES$4]) == undefined ? defaultConstructor : aFunction$1(S); - }; - - var charAt$1 = stringMultibyte.charAt; - - // `AdvanceStringIndex` abstract operation - // https://tc39.github.io/ecma262/#sec-advancestringindex - var advanceStringIndex = function (S, index, unicode) { - return index + (unicode ? charAt$1(S, index).length : 1); - }; - - // `RegExpExec` abstract operation - // https://tc39.github.io/ecma262/#sec-regexpexec - var regexpExecAbstract = function (R, S) { - var exec = R.exec; - if (typeof exec === 'function') { - var result = exec.call(R, S); - if (typeof result !== 'object') { - throw TypeError('RegExp exec method returned something other than an Object or null'); - } - return result; - } - - if (classofRaw(R) !== 'RegExp') { - throw TypeError('RegExp#exec called on incompatible receiver'); - } - - return regexpExec.call(R, S); - }; - - var arrayPush = [].push; - var min$2 = Math.min; - var MAX_UINT32 = 0xFFFFFFFF; - - // babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError - var SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); }); - - // @@split logic - fixRegexpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) { - var internalSplit; - if ( - 'abbc'.split(/(b)*/)[1] == 'c' || - 'test'.split(/(?:)/, -1).length != 4 || - 'ab'.split(/(?:ab)*/).length != 2 || - '.'.split(/(.?)(.?)/).length != 4 || - '.'.split(/()()/).length > 1 || - ''.split(/.?/).length - ) { - // based on es5-shim implementation, need to rework it - internalSplit = function (separator, limit) { - var string = String(requireObjectCoercible(this)); - var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; - if (lim === 0) return []; - if (separator === undefined) return [string]; - // If `separator` is not a regex, use native split - if (!isRegexp(separator)) { - return nativeSplit.call(string, separator, lim); - } - var output = []; - var flags = (separator.ignoreCase ? 'i' : '') + - (separator.multiline ? 'm' : '') + - (separator.unicode ? 'u' : '') + - (separator.sticky ? 'y' : ''); - var lastLastIndex = 0; - // Make `global` and avoid `lastIndex` issues by working with a copy - var separatorCopy = new RegExp(separator.source, flags + 'g'); - var match, lastIndex, lastLength; - while (match = regexpExec.call(separatorCopy, string)) { - lastIndex = separatorCopy.lastIndex; - if (lastIndex > lastLastIndex) { - output.push(string.slice(lastLastIndex, match.index)); - if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1)); - lastLength = match[0].length; - lastLastIndex = lastIndex; - if (output.length >= lim) break; - } - if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop - } - if (lastLastIndex === string.length) { - if (lastLength || !separatorCopy.test('')) output.push(''); - } else output.push(string.slice(lastLastIndex)); - return output.length > lim ? output.slice(0, lim) : output; - }; - // Chakra, V8 - } else if ('0'.split(undefined, 0).length) { - internalSplit = function (separator, limit) { - return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit); - }; - } else internalSplit = nativeSplit; - - return [ - // `String.prototype.split` method - // https://tc39.github.io/ecma262/#sec-string.prototype.split - function split(separator, limit) { - var O = requireObjectCoercible(this); - var splitter = separator == undefined ? undefined : separator[SPLIT]; - return splitter !== undefined - ? splitter.call(separator, O, limit) - : internalSplit.call(String(O), separator, limit); - }, - // `RegExp.prototype[@@split]` method - // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split - // - // NOTE: This cannot be properly polyfilled in engines that don't support - // the 'y' flag. - function (regexp, limit) { - var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit); - if (res.done) return res.value; - - var rx = anObject(regexp); - var S = String(this); - var C = speciesConstructor(rx, RegExp); - - var unicodeMatching = rx.unicode; - var flags = (rx.ignoreCase ? 'i' : '') + - (rx.multiline ? 'm' : '') + - (rx.unicode ? 'u' : '') + - (SUPPORTS_Y ? 'y' : 'g'); - - // ^(? + rx + ) is needed, in combination with some S slicing, to - // simulate the 'y' flag. - var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags); - var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; - if (lim === 0) return []; - if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : []; - var p = 0; - var q = 0; - var A = []; - while (q < S.length) { - splitter.lastIndex = SUPPORTS_Y ? q : 0; - var z = regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q)); - var e; - if ( - z === null || - (e = min$2(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p - ) { - q = advanceStringIndex(S, q, unicodeMatching); - } else { - A.push(S.slice(p, q)); - if (A.length === lim) return A; - for (var i = 1; i <= z.length - 1; i++) { - A.push(z[i]); - if (A.length === lim) return A; - } - q = p = e; - } - } - A.push(S.slice(p)); - return A; - } - ]; - }, !SUPPORTS_Y); - - // iterable DOM collections - // flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods - var domIterables = { - CSSRuleList: 0, - CSSStyleDeclaration: 0, - CSSValueList: 0, - ClientRectList: 0, - DOMRectList: 0, - DOMStringList: 0, - DOMTokenList: 1, - DataTransferItemList: 0, - FileList: 0, - HTMLAllCollection: 0, - HTMLCollection: 0, - HTMLFormElement: 0, - HTMLSelectElement: 0, - MediaList: 0, - MimeTypeArray: 0, - NamedNodeMap: 0, - NodeList: 1, - PaintRequestList: 0, - Plugin: 0, - PluginArray: 0, - SVGLengthList: 0, - SVGNumberList: 0, - SVGPathSegList: 0, - SVGPointList: 0, - SVGStringList: 0, - SVGTransformList: 0, - SourceBufferList: 0, - StyleSheetList: 0, - TextTrackCueList: 0, - TextTrackList: 0, - TouchList: 0 - }; - - var $forEach$1 = arrayIteration.forEach; - - - // `Array.prototype.forEach` method implementation - // https://tc39.github.io/ecma262/#sec-array.prototype.foreach - var arrayForEach = sloppyArrayMethod('forEach') ? function forEach(callbackfn /* , thisArg */) { - return $forEach$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); - } : [].forEach; - - for (var COLLECTION_NAME in domIterables) { - var Collection = global_1[COLLECTION_NAME]; - var CollectionPrototype = Collection && Collection.prototype; - // some Chrome versions have non-configurable methods on DOMTokenList - if (CollectionPrototype && CollectionPrototype.forEach !== arrayForEach) try { - hide(CollectionPrototype, 'forEach', arrayForEach); - } catch (error) { - CollectionPrototype.forEach = arrayForEach; - } - } - - var ITERATOR$2 = wellKnownSymbol('iterator'); - var TO_STRING_TAG$3 = wellKnownSymbol('toStringTag'); - var ArrayValues = es_array_iterator.values; - - for (var COLLECTION_NAME$1 in domIterables) { - var Collection$1 = global_1[COLLECTION_NAME$1]; - var CollectionPrototype$1 = Collection$1 && Collection$1.prototype; - if (CollectionPrototype$1) { - // some Chrome versions have non-configurable methods on DOMTokenList - if (CollectionPrototype$1[ITERATOR$2] !== ArrayValues) try { - hide(CollectionPrototype$1, ITERATOR$2, ArrayValues); - } catch (error) { - CollectionPrototype$1[ITERATOR$2] = ArrayValues; - } - if (!CollectionPrototype$1[TO_STRING_TAG$3]) hide(CollectionPrototype$1, TO_STRING_TAG$3, COLLECTION_NAME$1); - if (domIterables[COLLECTION_NAME$1]) for (var METHOD_NAME in es_array_iterator) { - // some Chrome versions have non-configurable methods on DOMTokenList - if (CollectionPrototype$1[METHOD_NAME] !== es_array_iterator[METHOD_NAME]) try { - hide(CollectionPrototype$1, METHOD_NAME, es_array_iterator[METHOD_NAME]); - } catch (error) { - CollectionPrototype$1[METHOD_NAME] = es_array_iterator[METHOD_NAME]; - } - } - } - } - - var VirtualScroll = - /*#__PURE__*/ - function () { - function VirtualScroll(options) { - var _this = this; - - _classCallCheck(this, VirtualScroll); - - this.rows = options.rows; - this.scrollEl = options.scrollEl; - this.contentEl = options.contentEl; - this.callback = options.callback; - this.cache = {}; - this.scrollTop = this.scrollEl.scrollTop; - this.initDOM(this.rows); - this.scrollEl.scrollTop = this.scrollTop; - this.lastCluster = 0; - - var onScroll = function onScroll() { - if (_this.lastCluster !== (_this.lastCluster = _this.getNum())) { - _this.initDOM(_this.rows); - - _this.callback(); - } - }; - - this.scrollEl.addEventListener('scroll', onScroll, false); - - this.destroy = function () { - _this.contentEl.innerHtml = ''; - - _this.scrollEl.removeEventListener('scroll', onScroll, false); - }; - } - - _createClass(VirtualScroll, [{ - key: "initDOM", - value: function initDOM(rows) { - if (typeof this.clusterHeight === 'undefined') { - this.cache.scrollTop = this.scrollEl.scrollTop; - this.cache.data = this.contentEl.innerHTML = rows[0] + rows[0] + rows[0]; - this.getRowsHeight(rows); - } - - var data = this.initData(rows, this.getNum()); - var thisRows = data.rows.join(''); - var dataChanged = this.checkChanges('data', thisRows); - var topOffsetChanged = this.checkChanges('top', data.topOffset); - var bottomOffsetChanged = this.checkChanges('bottom', data.bottomOffset); - var html = []; - - if (dataChanged && topOffsetChanged) { - if (data.topOffset) { - html.push(this.getExtra('top', data.topOffset)); - } - - html.push(thisRows); - - if (data.bottomOffset) { - html.push(this.getExtra('bottom', data.bottomOffset)); - } - - this.contentEl.innerHTML = html.join(''); - } else if (bottomOffsetChanged) { - this.contentEl.lastChild.style.height = "".concat(data.bottomOffset, "px"); - } - } - }, { - key: "getRowsHeight", - value: function getRowsHeight() { - if (typeof this.itemHeight === 'undefined') { - var nodes = this.contentEl.children; - var node = nodes[Math.floor(nodes.length / 2)]; - this.itemHeight = node.offsetHeight; - } - - this.blockHeight = this.itemHeight * Constants.BLOCK_ROWS; - this.clusterRows = Constants.BLOCK_ROWS * Constants.CLUSTER_BLOCKS; - this.clusterHeight = this.blockHeight * Constants.CLUSTER_BLOCKS; - } - }, { - key: "getNum", - value: function getNum() { - this.scrollTop = this.scrollEl.scrollTop; - return Math.floor(this.scrollTop / (this.clusterHeight - this.blockHeight)) || 0; - } - }, { - key: "initData", - value: function initData(rows, num) { - if (rows.length < Constants.BLOCK_ROWS) { - return { - topOffset: 0, - bottomOffset: 0, - rowsAbove: 0, - rows: rows - }; - } - - var start = Math.max((this.clusterRows - Constants.BLOCK_ROWS) * num, 0); - var end = start + this.clusterRows; - var topOffset = Math.max(start * this.itemHeight, 0); - var bottomOffset = Math.max((rows.length - end) * this.itemHeight, 0); - var thisRows = []; - var rowsAbove = start; - - if (topOffset < 1) { - rowsAbove++; - } - - for (var i = start; i < end; i++) { - rows[i] && thisRows.push(rows[i]); - } - - this.dataStart = start; - this.dataEnd = end; - return { - topOffset: topOffset, - bottomOffset: bottomOffset, - rowsAbove: rowsAbove, - rows: thisRows - }; - } - }, { - key: "checkChanges", - value: function checkChanges(type, value) { - var changed = value !== this.cache[type]; - this.cache[type] = value; - return changed; - } - }, { - key: "getExtra", - value: function getExtra(className, height) { - var tag = document.createElement('li'); - tag.className = "virtual-scroll-".concat(className); - - if (height) { - tag.style.height = "".concat(height, "px"); - } - - return tag.outerHTML; - } - }]); - - return VirtualScroll; - }(); - - var max$2 = Math.max; - var min$3 = Math.min; - var floor$1 = Math.floor; - var SUBSTITUTION_SYMBOLS = /\$([$&'`]|\d\d?|<[^>]*>)/g; - var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&'`]|\d\d?)/g; - - var maybeToString = function (it) { - return it === undefined ? it : String(it); - }; - - // @@replace logic - fixRegexpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative) { - return [ - // `String.prototype.replace` method - // https://tc39.github.io/ecma262/#sec-string.prototype.replace - function replace(searchValue, replaceValue) { - var O = requireObjectCoercible(this); - var replacer = searchValue == undefined ? undefined : searchValue[REPLACE]; - return replacer !== undefined - ? replacer.call(searchValue, O, replaceValue) - : nativeReplace.call(String(O), searchValue, replaceValue); - }, - // `RegExp.prototype[@@replace]` method - // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace - function (regexp, replaceValue) { - var res = maybeCallNative(nativeReplace, regexp, this, replaceValue); - if (res.done) return res.value; - - var rx = anObject(regexp); - var S = String(this); - - var functionalReplace = typeof replaceValue === 'function'; - if (!functionalReplace) replaceValue = String(replaceValue); - - var global = rx.global; - if (global) { - var fullUnicode = rx.unicode; - rx.lastIndex = 0; - } - var results = []; - while (true) { - var result = regexpExecAbstract(rx, S); - if (result === null) break; - - results.push(result); - if (!global) break; - - var matchStr = String(result[0]); - if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); - } - - var accumulatedResult = ''; - var nextSourcePosition = 0; - for (var i = 0; i < results.length; i++) { - result = results[i]; - - var matched = String(result[0]); - var position = max$2(min$3(toInteger(result.index), S.length), 0); - var captures = []; - // NOTE: This is equivalent to - // captures = result.slice(1).map(maybeToString) - // but for some reason `nativeSlice.call(result, 1, result.length)` (called in - // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and - // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. - for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j])); - var namedCaptures = result.groups; - if (functionalReplace) { - var replacerArgs = [matched].concat(captures, position, S); - if (namedCaptures !== undefined) replacerArgs.push(namedCaptures); - var replacement = String(replaceValue.apply(undefined, replacerArgs)); - } else { - replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); - } - if (position >= nextSourcePosition) { - accumulatedResult += S.slice(nextSourcePosition, position) + replacement; - nextSourcePosition = position + matched.length; - } - } - return accumulatedResult + S.slice(nextSourcePosition); - } - ]; - - // https://tc39.github.io/ecma262/#sec-getsubstitution - function getSubstitution(matched, str, position, captures, namedCaptures, replacement) { - var tailPos = position + matched.length; - var m = captures.length; - var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; - if (namedCaptures !== undefined) { - namedCaptures = toObject(namedCaptures); - symbols = SUBSTITUTION_SYMBOLS; - } - return nativeReplace.call(replacement, symbols, function (match, ch) { - var capture; - switch (ch.charAt(0)) { - case '$': return '$'; - case '&': return matched; - case '`': return str.slice(0, position); - case "'": return str.slice(tailPos); - case '<': - capture = namedCaptures[ch.slice(1, -1)]; - break; - default: // \d\d? - var n = +ch; - if (n === 0) return match; - if (n > m) { - var f = floor$1(n / 10); - if (f === 0) return match; - if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1); - return match; - } - capture = captures[n - 1]; - } - return capture === undefined ? '' : capture; - }); - } - }); - - var compareObjects = function compareObjects(objectA, objectB, compareLength) { - var aKeys = Object.keys(objectA); - var bKeys = Object.keys(objectB); - - if (compareLength && aKeys.length !== bKeys.length) { - return false; - } - - for (var _i = 0, _aKeys = aKeys; _i < _aKeys.length; _i++) { - var key = _aKeys[_i]; - - if (bKeys.includes(key) && objectA[key] !== objectB[key]) { - return false; - } - } - - return true; - }; - - var removeDiacritics = function removeDiacritics(str) { - if (str.normalize) { - return str.normalize('NFD').replace(/[\u0300-\u036F]/g, ''); - } - - var defaultDiacriticsRemovalMap = [{ - 'base': 'A', - 'letters': /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g - }, { - 'base': 'AA', - 'letters': /[\uA732]/g - }, { - 'base': 'AE', - 'letters': /[\u00C6\u01FC\u01E2]/g - }, { - 'base': 'AO', - 'letters': /[\uA734]/g - }, { - 'base': 'AU', - 'letters': /[\uA736]/g - }, { - 'base': 'AV', - 'letters': /[\uA738\uA73A]/g - }, { - 'base': 'AY', - 'letters': /[\uA73C]/g - }, { - 'base': 'B', - 'letters': /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g - }, { - 'base': 'C', - 'letters': /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g - }, { - 'base': 'D', - 'letters': /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g - }, { - 'base': 'DZ', - 'letters': /[\u01F1\u01C4]/g - }, { - 'base': 'Dz', - 'letters': /[\u01F2\u01C5]/g - }, { - 'base': 'E', - 'letters': /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g - }, { - 'base': 'F', - 'letters': /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g - }, { - 'base': 'G', - 'letters': /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g - }, { - 'base': 'H', - 'letters': /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g - }, { - 'base': 'I', - 'letters': /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g - }, { - 'base': 'J', - 'letters': /[\u004A\u24BF\uFF2A\u0134\u0248]/g - }, { - 'base': 'K', - 'letters': /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g - }, { - 'base': 'L', - 'letters': /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g - }, { - 'base': 'LJ', - 'letters': /[\u01C7]/g - }, { - 'base': 'Lj', - 'letters': /[\u01C8]/g - }, { - 'base': 'M', - 'letters': /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g - }, { - 'base': 'N', - 'letters': /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g - }, { - 'base': 'NJ', - 'letters': /[\u01CA]/g - }, { - 'base': 'Nj', - 'letters': /[\u01CB]/g - }, { - 'base': 'O', - 'letters': /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g - }, { - 'base': 'OI', - 'letters': /[\u01A2]/g - }, { - 'base': 'OO', - 'letters': /[\uA74E]/g - }, { - 'base': 'OU', - 'letters': /[\u0222]/g - }, { - 'base': 'P', - 'letters': /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g - }, { - 'base': 'Q', - 'letters': /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g - }, { - 'base': 'R', - 'letters': /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g - }, { - 'base': 'S', - 'letters': /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g - }, { - 'base': 'T', - 'letters': /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g - }, { - 'base': 'TZ', - 'letters': /[\uA728]/g - }, { - 'base': 'U', - 'letters': /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g - }, { - 'base': 'V', - 'letters': /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g - }, { - 'base': 'VY', - 'letters': /[\uA760]/g - }, { - 'base': 'W', - 'letters': /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g - }, { - 'base': 'X', - 'letters': /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g - }, { - 'base': 'Y', - 'letters': /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g - }, { - 'base': 'Z', - 'letters': /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g - }, { - 'base': 'a', - 'letters': /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g - }, { - 'base': 'aa', - 'letters': /[\uA733]/g - }, { - 'base': 'ae', - 'letters': /[\u00E6\u01FD\u01E3]/g - }, { - 'base': 'ao', - 'letters': /[\uA735]/g - }, { - 'base': 'au', - 'letters': /[\uA737]/g - }, { - 'base': 'av', - 'letters': /[\uA739\uA73B]/g - }, { - 'base': 'ay', - 'letters': /[\uA73D]/g - }, { - 'base': 'b', - 'letters': /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g - }, { - 'base': 'c', - 'letters': /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g - }, { - 'base': 'd', - 'letters': /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g - }, { - 'base': 'dz', - 'letters': /[\u01F3\u01C6]/g - }, { - 'base': 'e', - 'letters': /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g - }, { - 'base': 'f', - 'letters': /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g - }, { - 'base': 'g', - 'letters': /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g - }, { - 'base': 'h', - 'letters': /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g - }, { - 'base': 'hv', - 'letters': /[\u0195]/g - }, { - 'base': 'i', - 'letters': /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g - }, { - 'base': 'j', - 'letters': /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g - }, { - 'base': 'k', - 'letters': /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g - }, { - 'base': 'l', - 'letters': /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g - }, { - 'base': 'lj', - 'letters': /[\u01C9]/g - }, { - 'base': 'm', - 'letters': /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g - }, { - 'base': 'n', - 'letters': /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g - }, { - 'base': 'nj', - 'letters': /[\u01CC]/g - }, { - 'base': 'o', - 'letters': /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g - }, { - 'base': 'oi', - 'letters': /[\u01A3]/g - }, { - 'base': 'ou', - 'letters': /[\u0223]/g - }, { - 'base': 'oo', - 'letters': /[\uA74F]/g - }, { - 'base': 'p', - 'letters': /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g - }, { - 'base': 'q', - 'letters': /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g - }, { - 'base': 'r', - 'letters': /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g - }, { - 'base': 's', - 'letters': /[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g - }, { - 'base': 't', - 'letters': /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g - }, { - 'base': 'tz', - 'letters': /[\uA729]/g - }, { - 'base': 'u', - 'letters': /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g - }, { - 'base': 'v', - 'letters': /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g - }, { - 'base': 'vy', - 'letters': /[\uA761]/g - }, { - 'base': 'w', - 'letters': /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g - }, { - 'base': 'x', - 'letters': /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g - }, { - 'base': 'y', - 'letters': /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g - }, { - 'base': 'z', - 'letters': /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g - }]; - return defaultDiacriticsRemovalMap.reduce(function (string, _ref) { - var letters = _ref.letters, - base = _ref.base; - return string.replace(letters, base); - }, str); - }; - - var setDataKeys = function setDataKeys(data) { - var total = 0; - data.forEach(function (row, i) { - if (row.type === 'optgroup') { - row._key = "group_".concat(i); - row.visible = typeof row.visible === 'undefined' ? true : row.visible; - row.children.forEach(function (child, j) { - child._key = "option_".concat(i, "_").concat(j); - child.visible = typeof child.visible === 'undefined' ? true : child.visible; - }); - total += row.children.length; - } else { - row._key = "option_".concat(i); - row.visible = typeof row.visible === 'undefined' ? true : row.visible; - total += 1; - } - }); - return total; - }; - - var findByParam = function findByParam(data, param, value) { - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var row = _step.value; - - if (row[param] === value || row[param] === +row[param] + '' && +row[param] === value) { - return row; - } - - if (row.type === 'optgroup') { - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = row.children[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var child = _step2.value; - - if (child[param] === value || child[param] === +child[param] + '' && +child[param] === value) { - return child; - } - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2.return != null) { - _iterator2.return(); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - }; - - var removeUndefined = function removeUndefined(obj) { - Object.keys(obj).forEach(function (key) { - return obj[key] === undefined ? delete obj[key] : ''; - }); - return obj; - }; - - var getDocumentClickEvent = function getDocumentClickEvent() { - var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - id = id || "".concat(+new Date()).concat(~~(Math.random() * 1000000)); - return "click.multiple-select-".concat(id); - }; - - var MultipleSelect = - /*#__PURE__*/ - function () { - function MultipleSelect($el, options) { - _classCallCheck(this, MultipleSelect); - - this.$el = $el; - this.options = $.extend({}, Constants.DEFAULTS, options); - } - - _createClass(MultipleSelect, [{ - key: "init", - value: function init() { - this.initLocale(); - this.initContainer(); - this.initData(); - this.initSelected(true); - this.initFilter(); - this.initDrop(); - this.initView(); - this.options.onAfterCreate(); - } - }, { - key: "initLocale", - value: function initLocale() { - if (this.options.locale) { - var locales = $.fn.multipleSelect.locales; - var parts = this.options.locale.split(/-|_/); - parts[0] = parts[0].toLowerCase(); - - if (parts[1]) { - parts[1] = parts[1].toUpperCase(); - } - - if (locales[this.options.locale]) { - $.extend(this.options, locales[this.options.locale]); - } else if (locales[parts.join('-')]) { - $.extend(this.options, locales[parts.join('-')]); - } else if (locales[parts[0]]) { - $.extend(this.options, locales[parts[0]]); - } - } - } - }, { - key: "initContainer", - value: function initContainer() { - var _this = this; - - var el = this.$el[0]; - var name = el.getAttribute('name') || this.options.name || ''; // hide select element - - this.$el.hide(); // label element - - this.$label = this.$el.closest('label'); - - if (!this.$label.length && this.$el.attr('id')) { - this.$label = $("label[for=\"".concat(this.$el.attr('id'), "\"]")); - } - - if (this.$label.find('>input').length) { - this.$label = null; - } // single or multiple - - - if (typeof this.options.single === 'undefined') { - this.options.single = el.getAttribute('multiple') === null; - } // restore class and title from select element - - - this.$parent = $("\n
\n ")); // add placeholder to choice button - - this.options.placeholder = this.options.placeholder || el.getAttribute('placeholder') || ''; - this.tabIndex = el.getAttribute('tabindex'); - var tabIndex = ''; - - if (this.tabIndex !== null) { - this.$el.attr('tabindex', -1); - tabIndex = this.tabIndex && "tabindex=\"".concat(this.tabIndex, "\""); - } - - this.$choice = $("\n \n ")); // default position is bottom - - this.$drop = $("
")); - this.$close = this.$choice.find('.icon-close'); - - if (this.options.dropWidth) { - this.$drop.css('width', this.options.dropWidth); - } - - this.$el.after(this.$parent); - this.$parent.append(this.$choice); - this.$parent.append(this.$drop); - - if (el.disabled) { - this.$choice.addClass('disabled'); - } - - this.selectAllName = "data-name=\"selectAll".concat(name, "\""); - this.selectGroupName = "data-name=\"selectGroup".concat(name, "\""); - this.selectItemName = "data-name=\"selectItem".concat(name, "\""); - - if (!this.options.keepOpen) { - var clickEvent = getDocumentClickEvent(this.$el.attr('id')); - $(document).off(clickEvent).on(clickEvent, function (e) { - if ($(e.target)[0] === _this.$choice[0] || $(e.target).parents('.ms-choice')[0] === _this.$choice[0]) { - return; - } - - if (($(e.target)[0] === _this.$drop[0] || $(e.target).parents('.ms-drop')[0] !== _this.$drop[0] && e.target !== el) && _this.options.isOpen) { - _this.close(); - } - }); - } - } - }, { - key: "initData", - value: function initData() { - var _this2 = this; - - var data = []; - - if (this.options.data) { - if (Array.isArray(this.options.data)) { - this.data = this.options.data.map(function (it) { - if (typeof it === 'string' || typeof it === 'number') { - return { - text: it, - value: it - }; - } - - return it; - }); - } else if (_typeof(this.options.data) === 'object') { - for (var _i = 0, _Object$entries = Object.entries(this.options.data); _i < _Object$entries.length; _i++) { - var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2), - value = _Object$entries$_i[0], - text = _Object$entries$_i[1]; - - data.push({ - value: value, - text: text - }); - } - - this.data = data; - } - } else { - $.each(this.$el.children(), function (i, elm) { - var row = _this2.initRow(i, elm); - - if (row) { - data.push(_this2.initRow(i, elm)); - } - }); - this.options.data = data; - this.data = data; - this.fromHtml = true; - } - - this.dataTotal = setDataKeys(this.data); - } - }, { - key: "initRow", - value: function initRow(i, elm, groupDisabled) { - var _this3 = this; - - var row = {}; - var $elm = $(elm); - - if ($elm.is('option')) { - row.type = 'option'; - row.text = this.options.textTemplate($elm); - row.value = elm.value; - row.visible = true; - row.selected = !!elm.selected; - row.disabled = groupDisabled || elm.disabled; - row.classes = elm.getAttribute('class') || ''; - row.title = elm.getAttribute('title') || ''; - - if ($elm.data('value')) { - row._value = $elm.data('value'); // value for object - } - - if (Object.keys($elm.data()).length) { - row._data = $elm.data(); - } - - return row; - } - - if ($elm.is('optgroup')) { - row.type = 'optgroup'; - row.label = this.options.labelTemplate($elm); - row.visible = true; - row.selected = !!elm.selected; - row.disabled = elm.disabled; - row.children = []; - - if (Object.keys($elm.data()).length) { - row._data = $elm.data(); - } - - $.each($elm.children(), function (j, elem) { - row.children.push(_this3.initRow(j, elem, row.disabled)); - }); - return row; - } - - return null; - } - }, { - key: "initSelected", - value: function initSelected(ignoreTrigger) { - var selectedTotal = 0; - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = this.data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var row = _step.value; - - if (row.type === 'optgroup') { - var selectedCount = row.children.filter(function (child) { - return child.selected && !child.disabled && child.visible; - }).length; - row.selected = selectedCount && selectedCount === row.children.filter(function (child) { - return !child.disabled && child.visible; - }).length; - selectedTotal += selectedCount; - } else { - selectedTotal += row.selected && !row.disabled && row.visible ? 1 : 0; - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - this.allSelected = this.data.filter(function (row) { - return row.selected && !row.disabled && row.visible; - }).length === this.data.filter(function (row) { - return !row.disabled && row.visible; - }).length; - - if (!ignoreTrigger) { - if (this.allSelected) { - this.options.onCheckAll(); - } else if (selectedTotal === 0) { - this.options.onUncheckAll(); - } - } - } - }, { - key: "initFilter", - value: function initFilter() { - this.filterText = ''; - - if (this.options.filter || !this.options.filterByDataLength) { - return; - } - - var length = 0; - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = this.data[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var option = _step2.value; - - if (option.type === 'optgroup') { - length += option.children.length; - } else { - length += 1; - } - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2.return != null) { - _iterator2.return(); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - - this.options.filter = length > this.options.filterByDataLength; - } - }, { - key: "initDrop", - value: function initDrop() { - var _this4 = this; - - this.initList(); - this.update(true); - - if (this.options.isOpen) { - setTimeout(function () { - _this4.open(); - }, 50); - } - - if (this.options.openOnHover) { - this.$parent.hover(function () { - _this4.open(); - }, function () { - _this4.close(); - }); - } - } - }, { - key: "initList", - value: function initList() { - var html = []; - - if (this.options.filter) { - html.push("\n
\n \n
\n ")); - } - - html.push('
    '); - this.$drop.html(html.join('')); - this.$ul = this.$drop.find('>ul'); - this.initListItems(); - } - }, { - key: "initListItems", - value: function initListItems() { - var _this5 = this; - - var rows = this.getListRows(); - var offset = 0; - - if (this.options.selectAll && !this.options.single) { - offset = -1; - } - - if (rows.length > Constants.BLOCK_ROWS * Constants.CLUSTER_BLOCKS) { - if (this.virtualScroll) { - this.virtualScroll.destroy(); - } - - var dropVisible = this.$drop.is(':visible'); - - if (!dropVisible) { - this.$drop.css('left', -10000).show(); - } - - var updateDataOffset = function updateDataOffset() { - _this5.updateDataStart = _this5.virtualScroll.dataStart + offset; - _this5.updateDataEnd = _this5.virtualScroll.dataEnd + offset; - - if (_this5.updateDataStart < 0) { - _this5.updateDataStart = 0; - } - - if (_this5.updateDataEnd > _this5.data.length) { - _this5.updateDataEnd = _this5.data.length; - } - }; - - this.virtualScroll = new VirtualScroll({ - rows: rows, - scrollEl: this.$ul[0], - contentEl: this.$ul[0], - callback: function callback() { - updateDataOffset(); - - _this5.events(); - } - }); - updateDataOffset(); - - if (!dropVisible) { - this.$drop.css('left', 0).hide(); - } - } else { - this.$ul.html(rows.join('')); - this.updateDataStart = 0; - this.updateDataEnd = this.updateData.length; - this.virtualScroll = null; - } - - this.events(); - } - }, { - key: "getListRows", - value: function getListRows() { - var _this6 = this; - - var rows = []; - - if (this.options.selectAll && !this.options.single) { - rows.push("\n
  • \n \n
  • \n ")); - } - - this.updateData = []; - this.data.forEach(function (row) { - rows.push.apply(rows, _toConsumableArray(_this6.initListItem(row))); - }); - rows.push("
  • ".concat(this.options.formatNoMatchesFound(), "
  • ")); - return rows; - } - }, { - key: "initListItem", - value: function initListItem(row) { - var _this7 = this; - - var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - var title = row.title ? "title=\"".concat(row.title, "\"") : ''; - var multiple = this.options.multiple ? 'multiple' : ''; - var type = this.options.single ? 'radio' : 'checkbox'; - var classes = ''; - - if (!row.visible) { - return []; - } - - this.updateData.push(row); - - if (this.options.single && !this.options.singleRadio) { - classes = 'hide-radio '; - } - - if (row.selected) { - classes += 'selected '; - } - - if (row.type === 'optgroup') { - var _customStyle = this.options.styler(row); - - var _style = _customStyle ? "style=\"".concat(_customStyle, "\"") : ''; - - var html = []; - var group = this.options.hideOptgroupCheckboxes || this.options.single ? "") : ""); - - if (!classes.includes('hide-radio') && (this.options.hideOptgroupCheckboxes || this.options.single)) { - classes += 'hide-radio '; - } - - html.push("\n
  • \n \n
  • \n ")); - row.children.forEach(function (child) { - html.push.apply(html, _toConsumableArray(_this7.initListItem(child, 1))); - }); - return html; - } - - var customStyle = this.options.styler(row); - var style = customStyle ? "style=\"".concat(customStyle, "\"") : ''; - classes += row.classes || ''; - - if (level && this.options.single) { - classes += "option-level-".concat(level, " "); - } - - return ["\n
  • \n \n
  • \n ")]; - } - }, { - key: "events", - value: function events() { - var _this8 = this; - - this.$searchInput = this.$drop.find('.ms-search input'); - this.$selectAll = this.$drop.find("input[".concat(this.selectAllName, "]")); - this.$selectGroups = this.$drop.find("input[".concat(this.selectGroupName, "],span[").concat(this.selectGroupName, "]")); - this.$selectItems = this.$drop.find("input[".concat(this.selectItemName, "]:enabled")); - this.$disableItems = this.$drop.find("input[".concat(this.selectItemName, "]:disabled")); - this.$noResults = this.$drop.find('.ms-no-results'); - - var toggleOpen = function toggleOpen(e) { - e.preventDefault(); - - if ($(e.target).hasClass('icon-close')) { - return; - } - - _this8[_this8.options.isOpen ? 'close' : 'open'](); - }; - - if (this.$label && this.$label.length) { - this.$label.off('click').on('click', function (e) { - if (e.target.nodeName.toLowerCase() !== 'label') { - return; - } - - toggleOpen(e); - - if (!_this8.options.filter || !_this8.options.isOpen) { - _this8.focus(); - } - - e.stopPropagation(); // Causes lost focus otherwise - }); - } - - this.$choice.off('click').on('click', toggleOpen).off('focus').on('focus', this.options.onFocus).off('blur').on('blur', this.options.onBlur); - this.$parent.off('keydown').on('keydown', function (e) { - // esc key - if (e.which === 27 && !_this8.options.keepOpen) { - _this8.close(); - - _this8.$choice.focus(); - } - }); - this.$close.off('click').on('click', function (e) { - e.preventDefault(); - - _this8._checkAll(false, true); - - _this8.initSelected(false); - - _this8.updateSelected(); - - _this8.update(); - - _this8.options.onClear(); - }); - this.$searchInput.off('keydown').on('keydown', function (e) { - // Ensure shift-tab causes lost focus from filter as with clicking away - if (e.keyCode === 9 && e.shiftKey) { - _this8.close(); - } - }).off('keyup').on('keyup', function (e) { - // enter or space - // Avoid selecting/deselecting if no choices made - if (_this8.options.filterAcceptOnEnter && [13, 32].includes(e.which) && _this8.$searchInput.val()) { - if (_this8.options.single) { - var $items = _this8.$selectItems.closest('li').filter(':visible'); - - if ($items.length) { - _this8.setSelects([$items.first().find("input[".concat(_this8.selectItemName, "]")).val()]); - } - } else { - _this8.$selectAll.click(); - } - - _this8.close(); - - _this8.focus(); - - return; - } - - _this8.filter(); - }); - this.$selectAll.off('click').on('click', function (e) { - _this8._checkAll($(e.currentTarget).prop('checked')); - }); - this.$selectGroups.off('click').on('click', function (e) { - var $this = $(e.currentTarget); - var checked = $this.prop('checked'); - var group = findByParam(_this8.data, '_key', $this.data('key')); - - _this8._checkGroup(group, checked); - - _this8.options.onOptgroupClick(removeUndefined({ - label: group.label, - selected: group.selected, - data: group._data, - children: group.children.map(function (child) { - return removeUndefined({ - text: child.text, - value: child.value, - selected: child.selected, - disabled: child.disabled, - data: child._data - }); - }) - })); - }); - this.$selectItems.off('click').on('click', function (e) { - var $this = $(e.currentTarget); - var checked = $this.prop('checked'); - var option = findByParam(_this8.data, '_key', $this.data('key')); - - _this8._check(option, checked); - - _this8.options.onClick(removeUndefined({ - text: option.text, - value: option.value, - selected: option.selected, - data: option._data - })); - - if (_this8.options.single && _this8.options.isOpen && !_this8.options.keepOpen) { - _this8.close(); - } - }); - } - }, { - key: "initView", - value: function initView() { - var computedWidth; - - if (window.getComputedStyle) { - computedWidth = window.getComputedStyle(this.$el[0]).width; - - if (computedWidth === 'auto') { - computedWidth = this.$drop.outerWidth() + 20; - } - } else { - computedWidth = this.$el.outerWidth() + 20; - } - - this.$parent.css('width', this.options.width || computedWidth); - this.$el.show().addClass('ms-offscreen'); - } - }, { - key: "open", - value: function open() { - if (this.$choice.hasClass('disabled')) { - return; - } - - this.options.isOpen = true; - this.$choice.find('>div').addClass('open'); - this.$drop[this.animateMethod('show')](); // fix filter bug: no results show - - this.$selectAll.parent().show(); - this.$noResults.hide(); // Fix #77: 'All selected' when no options - - if (!this.data.length) { - this.$selectAll.parent().hide(); - this.$noResults.show(); - } - - if (this.options.container) { - var offset = this.$drop.offset(); - this.$drop.appendTo($(this.options.container)); - this.$drop.offset({ - top: offset.top, - left: offset.left - }).css('min-width', 'auto').outerWidth(this.$parent.outerWidth()); - } - - var maxHeight = this.options.maxHeight; - - if (this.options.maxHeightUnit === 'row') { - maxHeight = this.$drop.find('>ul>li').first().outerHeight() * this.options.maxHeight; - } - - this.$drop.find('>ul').css('max-height', "".concat(maxHeight, "px")); - this.$drop.find('.multiple').css('width', "".concat(this.options.multipleWidth, "px")); - - if (this.data.length && this.options.filter) { - this.$searchInput.val(''); - this.$searchInput.focus(); - this.filter(true); - } - - this.options.onOpen(); - } - }, { - key: "close", - value: function close() { - this.options.isOpen = false; - this.$choice.find('>div').removeClass('open'); - this.$drop[this.animateMethod('hide')](); - - if (this.options.container) { - this.$parent.append(this.$drop); - this.$drop.css({ - 'top': 'auto', - 'left': 'auto' - }); - } - - this.options.onClose(); - } - }, { - key: "animateMethod", - value: function animateMethod(method) { - var methods = { - show: { - fade: 'fadeIn', - slide: 'slideDown' - }, - hide: { - fade: 'fadeOut', - slide: 'slideUp' - } - }; - return methods[method][this.options.animate] || method; - } - }, { - key: "update", - value: function update(ignoreTrigger) { - var valueSelects = this.getSelects(); - var textSelects = this.getSelects('text'); - - if (this.options.displayValues) { - textSelects = valueSelects; - } - - var $span = this.$choice.find('>span'); - var sl = valueSelects.length; - var html = ''; - - if (sl === 0) { - $span.addClass('placeholder').html(this.options.placeholder); - } else if (sl < this.options.minimumCountSelected) { - html = textSelects.join(this.options.displayDelimiter); - } else if (this.options.formatAllSelected() && sl === this.dataTotal) { - html = this.options.formatAllSelected(); - } else if (this.options.ellipsis && sl > this.options.minimumCountSelected) { - html = "".concat(textSelects.slice(0, this.options.minimumCountSelected).join(this.options.displayDelimiter), "..."); - } else if (this.options.formatCountSelected() && sl > this.options.minimumCountSelected) { - html = this.options.formatCountSelected(sl, this.dataTotal); - } else { - html = textSelects.join(this.options.displayDelimiter); - } - - if (html) { - $span.removeClass('placeholder').html(html); - } - - if (this.options.displayTitle) { - $span.prop('title', this.getSelects('text')); - } // set selects to select - - - this.$el.val(this.getSelects()); // trigger - - - No. of Heatmap Clicks - - - - Code (default: Asynchronous) - - - /> Asynchronous    - - /> Synchronous -  
    [Help] - - - - > - Settings Timeout - ms (default: 2000) - - - > - Library Timeout - ms (default: 2500) - - - > - Use Existing jQuery - - />Yes - - - Skip Deferred Execution - - />Yes - - - - -

    -

    Your Account ID (a number) can be found in Settings area (top-right) after you login into your VWO account.

    - '; -} - -/** - * Displays a warning message if VWO settings are not configured. - * This function checks if the user is an admin and if the VWO ID option is set. If the user is not an admin or - * the VWO ID option is not set, it displays a warning message. - * - * @throws Exception Description of exception. - * @return void - */ -function vwo_clhf_warn_nosettings() { - if ( ! is_admin() ) { - return; - } - - $clhf_option = get_option( 'vwo_id' ); - if ( ! $clhf_option || $clhf_option < 1 ) { - echo "

    VWO is almost ready. You must enter your Account ID for it to work.

    "; - } -} - - -add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), 'vwo_clhf_add_plugin_page_settings_link' ); - -/** - * Function to add Settings Links on Plugin page - * - * @param array $links Array of links. - * @return array - */ -function vwo_clhf_add_plugin_page_settings_link( $links ) { - $links[] = '' . __( 'Settings' ) . ''; - return $links; -} - -/** - * Disables VWO in Divi Builder. - * - * @throws Exception Description of exception. - * @return void - */ -function disable_vwo_in_divi_builder() { - if ( has_action( 'wp_head', 'vwo_clhf_headercode' ) && function_exists( 'et_core_is_fb_enabled' ) && et_core_is_fb_enabled() ) { - remove_action( 'wp_head', 'vwo_clhf_headercode', 1 ); - } -} - -add_action( 'wp_head', 'disable_vwo_in_divi_builder', 0 ); - -?> \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-google-analytics-integration/assets/js/build/main.asset.php b/wp/wp-content/plugins/woocommerce-google-analytics-integration/assets/js/build/main.asset.php deleted file mode 100644 index 8a1f1b35..00000000 --- a/wp/wp-content/plugins/woocommerce-google-analytics-integration/assets/js/build/main.asset.php +++ /dev/null @@ -1 +0,0 @@ - array('wp-hooks', 'wp-i18n'), 'version' => 'b70e9845eca29be496f0'); diff --git a/wp/wp-content/plugins/woocommerce-google-analytics-integration/assets/js/build/main.js b/wp/wp-content/plugins/woocommerce-google-analytics-integration/assets/js/build/main.js deleted file mode 100644 index e282b0c1..00000000 --- a/wp/wp-content/plugins/woocommerce-google-analytics-integration/assets/js/build/main.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var t={d:(e,o)=>{for(var c in o)t.o(o,c)&&!t.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:o[c]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{add_to_cart:()=>w,begin_checkout:()=>f,purchase:()=>h,remove_from_cart:()=>g,search:()=>v,select_content:()=>y,view_item:()=>b,view_item_list:()=>m});const o=window.wp.i18n,c=window.wp.hooks,n=(t,e)=>{var o;const c={};t.variation&&(c.item_variant=t.variation);const n={item_id:d(t),item_name:t.name,...u(t),quantity:null!==(o=t.quantity)&&void 0!==o?o:e,price:i(t.prices.price,t.prices.currency_minor_unit),...c};return t?.price_after_coupon_discount({item_id:d(t),item_name:t.name,item_list_name:e,...u(t),price:i(t.prices.price,t.prices.currency_minor_unit)}),i=(t,e=2)=>parseInt(t,10)/10**e,a=(t,e,o)=>{(0,c.removeAction)(t,e),(0,c.addAction)(t,e,o)},d=t=>{const e=t.extensions?.woocommerce_google_analytics_integration?.identifier;return void 0!==e?e:"product_sku"===window.ga4w?.settings?.identifier?t.sku?t.sku:"#"+t.id:t.id},s=t=>t.coupons[0]?.code?{coupon:t.coupons[0]?.code}:{},u=t=>"categories"in t&&t.categories.length?_(t.categories):{},_=t=>Object.fromEntries(t.slice(0,5).map(((t,e)=>[p(e),t.name]))),p=t=>"item_category"+(t>0?t+1:""),l=(t,e,o)=>{var c;return null!==(c=e?.find((({id:e})=>e===t)))&&void 0!==c?c:o?.items?.find((({id:e})=>e===t))},m=({products:t,listName:e=(0,o.__)("Product List","woocommerce-google-analytics-integration")})=>0!==t.length&&{item_list_id:"engagement",item_list_name:(0,o.__)("Viewing products","woocommerce-google-analytics-integration"),items:t.map(((t,o)=>({...r(t,e),index:o+1})))},w=({product:t,quantity:e=1})=>({items:t?[n(t,e)]:[]}),g=({product:t,quantity:e=1})=>({items:t?[n(t,e)]:[]}),f=({storeCart:t})=>({currency:t.totals.currency_code,value:i(t.totals.total_price,t.totals.currency_minor_unit),...s(t),items:t.items.map(n)}),y=({product:t})=>!!t&&{content_type:"product",content_id:d(t)},v=({searchTerm:t})=>({search_term:t}),b=({product:t,listName:e=(0,o.__)("Product List","woocommerce-google-analytics-integration")})=>!!t&&{items:[r(t,e)]},h=({order:t})=>void 0!==t&&{transaction_id:t.id,affiliation:t.affiliation,currency:t.totals.currency_code,value:i(t.totals.total_price,t.totals.currency_minor_unit),tax:i(t.totals.tax_total,t.totals.currency_minor_unit),shipping:i(t.totals.shipping_total,t.totals.currency_minor_unit),items:t.items.map(n)},k="woocommerce-google-analytics",A="experimental__woocommerce_blocks";(0,c.removeAction)(`${A}-checkout-submit`,k),(0,c.removeAction)(`${A}-checkout-set-email-address`,k),(0,c.removeAction)(`${A}-checkout-set-phone-number`,k),(0,c.removeAction)(`${A}-checkout-set-billing-address`,k),(0,c.removeAction)(`${A}-cart-set-item-quantity`,k),(0,c.removeAction)(`${A}-product-search`,k),(0,c.removeAction)(`${A}-store-notice-create`,k);const E={statistics:["analytics_storage"],marketing:["ad_storage","ad_user_data","ad_personalization"]};function $(){(({tracker_function_name:t})=>{if("function"==typeof wp_has_consent){void 0===window.wp_consent_type&&(window.wp_consent_type="optin");const e={};for(const[t,o]of Object.entries(E))if(""!==consent_api_get_cookie(window.consent_api.cookie_prefix+"_"+t)){const c=wp_has_consent(t)?"granted":"denied";o.forEach((t=>{e[t]=c}))}Object.keys(e).length>0&&window[t]("consent","update",e)}})(window.ga4w.settings),(({tracker_function_name:t})=>{document.addEventListener("wp_listen_for_consent_change",(e=>{const o={},c=E[Object.keys(e.detail)[0]],n="allow"===Object.values(e.detail)[0]?"granted":"denied";void 0!==c&&(c.forEach((t=>{o[t]=n})),Object.keys(o).length>0&&window[t]("consent","update",o))}))})(window.ga4w.settings);const t=function({events:t,tracker_function_name:o}){return function(c){const n=e[c];if("function"!=typeof n)throw new Error(`Event ${c} is not supported.`);return function(e){const r=n(e);t.includes(c)&&r&&window[o]("event",c,r)}}}(window.ga4w.settings);!function(t,{events:e,cart:o,products:c,product:n,added_to_cart:r,order:i}){Object.values(null!=e?e:{}).forEach((e=>{"add_to_cart"===e?t(e)({product:r}):t(e)({storeCart:o,products:c,product:n,order:i})})),document.body.onadded_to_cart=(e,r,i,a)=>{const d=parseInt(a[0].dataset.product_id||a[0].value),s=n?.id===d?n:l(parseInt(d),c,o);s&&t("add_to_cart")({product:s})};const a=()=>{document.querySelectorAll(".woocommerce-cart-form .woocommerce-cart-form__cart-item .remove[data-product_id]").forEach((t=>t.addEventListener("click",d)))};function d(e){t("remove_from_cart")({product:l(parseInt(e.target.dataset.product_id),c,o)})}a();const s=document.body.onupdated_wc_div;document.body.onupdated_wc_div=(...t)=>{"function"==typeof s&&s(...t),a()};const u=document.body.onremoved_from_cart;document.body.onremoved_from_cart=(...t)=>{"function"==typeof u&&u(...t),d({target:t[3][0]})},document.querySelectorAll(".products .product:not(.wp-block-post)")?.forEach((e=>{const n=e.querySelector("a[data-product_id]")?.getAttribute("data-product_id");n&&e.addEventListener("click",(e=>{const r=e.target.closest(".woocommerce-loop-product__link"),i=e.target.classList.contains("button")&&e.target.hasAttribute("data-product_id"),a=e.target.classList.contains("add_to_cart_button")&&!e.target.classList.contains("product_type_variable");(r||i&&!a)&&t("select_content")({product:l(parseInt(n),c,o)})}))})),document.querySelectorAll(".products-block-post-template .product, .wc-block-product-template .product")?.forEach((e=>{const n=e.querySelector("[data-product_id]")?.getAttribute("data-product_id");n&&e.addEventListener("click",(e=>{const r=e.target,i=r.closest(".wc-block-components-product-image a"),a=r.closest(".wp-block-post-title a"),d=r.closest(".wc-block-components-product-button [data-product_id]");d&&d.classList.contains("add_to_cart_button")&&!d.classList.contains("product_type_variable")?t("add_to_cart")({product:l(parseInt(n),c,o)}):(i||d||a)&&t("select_content")({product:l(parseInt(n),c,o)})}))}))}(t,window.ga4w.data),(t=>{a(`${A}-product-render`,k,t("view_item")),a(`${A}-cart-remove-item`,k,t("remove_from_cart")),a(`${A}-checkout-render-checkout-form`,k,t("begin_checkout")),a(`${A}-cart-add-item`,k,(({product:e})=>{t("add_to_cart")({product:e})})),a(`${A}-product-list-render`,k,t("view_item_list")),a(`${A}-product-view-link`,k,t("select_content"))})(t)}function L(){window.ga4w||console.warn("Google Analytics for WooCommerce: Configuration and tracking data not found after the page was fully loaded. Make sure the `woocommerce-google-analytics-integration-data` script gets eventually loaded.")}window.ga4w?$():(document.addEventListener("ga4w:ready",$),"complete"===document.readyState?L():window.addEventListener("load",L))})(); \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-google-analytics-integration/changelog.txt b/wp/wp-content/plugins/woocommerce-google-analytics-integration/changelog.txt deleted file mode 100644 index 5b5bfd44..00000000 --- a/wp/wp-content/plugins/woocommerce-google-analytics-integration/changelog.txt +++ /dev/null @@ -1,372 +0,0 @@ -*** Changelog *** - -= 2.1.1 - 2024-06-12 = -* Tweak - Confirm WC_Cart is available before formatting cart data. -* Tweak - WC 9.0 compatibility. - -= 2.1.0 - 2024-06-05 = -* Add - Integration with the WP Consent API plugin. -* Fix - Add E2E tests for denying via WP Consent API. -* Tweak - Document WP Consent API support. - -= 2.0.7 - 2024-05-14 = -* Dev - Add a manual workflow run for PHP unit tests. -* Fix - Apply discounts to the ecommerce event if available. -* Fix - Incorrect quantity value when adding product to the cart that exists in the cart. -* Tweak - WC 8.9 compatibility. - -= 2.0.6 - 2024-04-09 = -* Tweak - WC 8.8 compatibility. - -= 2.0.5 - 2024-04-04 = -* Tweak - Register `woocommerce-google-analytics-integration` script earlier, so other extensions can plug in. -* Update - Separate the site tag from the event tracking file and delay execution until DOMContentLoaded. - -= 2.0.4 - 2024-03-26 = -* Dev - Add QIT workflow. -* Dev - E2E tests for the All Products block. -* Dev - Remove unused functions from code. -* Fix - Warning after plugin install using wp-cli. -* Tweak - Add WP 6.5 Require plugins header. - -= 2.0.3 - 2024-03-13 = -* Tweak - WC 8.7 compatibility. -* Tweak - WP 6.5 compatibility. - -= 2.0.2 - 2024-03-12 = -* Dev - Add E2E testing to track events across all page types. -* Fix - Add to cart & select content events for All Products Block. -* Fix - Get correct variation data when formatting product. -* Fix - Handle AJAX add to cart for simple products. -* Fix - Purchase price format. -* Fix - Track purchase transaction ID. -* Fix - Typo with undefined variable. - -= 2.0.1 - 2024-03-07 = -* Fix - Adding variable product attributes. -* Fix - Resolve Google Analytics not loading if gtag already exists on the window object. -* Tweak - Update Contributors list. -* Tweak - Update assets and readme for 2.0. - -= 2.0.0 - 2024-03-05 = -* Add - Basic consent mode support. -* Add - Setting to specify the structure of the product identifier. -* Add - Update notice for merchants using a Universal Analytics Property ID. -* Dev - Remove options remapping, use settings directly. -* Fix - Prevent tracking orders multiple times and additional fixes. -* Remove - Universal Analytics code. -* Remove - Universal Analytics integration. -* Simplify tracker event handler API. -* Update - Add shared tracking functionality for WooCommerce Blocks and classic pages. -* Update - Extension branding to Google Analytics for WooCommerce. -* Update - Tracking for GA4 when using Blocks. - -= 1.8.14 - 2024-02-07 = -* Tweak - Declare feature compatibility for the new product editor (also called product block editor). -* Tweak - WC 8.6 compatibility. - -= 1.8.13 - 2024-01-09 = -* Dev - Upgrade all NPM dev dependencies. -* Dev - Upgrade to Node.js 18. -* Tweak - WC 8.5 compatibility. - -= 1.8.12 - 2023-12-28 = -* Fix - Avoid JavaScript exceptions when sending checkout event tracking due to incompatible data structure. -* Fix - Correct misplaced each product index value as its quantity when sending checkout event tracking. - -= 1.8.11 - 2023-12-18 = -* Dev - Prevent DB warnings in unit tests. -* Tweak - WC 8.4 compatibility. - -= 1.8.10 - 2023-11-28 = -* Dev - Update phpunit polyfills to 1.1 for WP 6.4. -* Fix - Add semicolon after `gtag` calls. -* Fix - Prevent firing up the add_to_cart event when clicking in product image. -* Tweak - Test environment setup to resolve notice. - -= 1.8.9 - 2023-11-07 = -* Tweak - WC 8.3 compatibility. -* Tweak - WP 6.4 compatibility. -* Update - Use new Woo.com domain. -* Update - WordPressCS to version 3.0. - -= 1.8.8 - 2023-10-24 = -* Tweak - Declare cart_checkout_blocks feature compatibility. - -= 1.8.7 - 2023-10-10 = -* Fix - JS syntax error on pages with cart and mini-cart rendered, which was causing purchases and cart removals not to be tracked. - -= 1.8.6 - 2023-10-03 = -* Add - Privacy policy guide section. -* Dev - Enable since tag replacement. -* Fix - Track select_content instead of add_to_cart for variations. -* Tweak - Add documentation link with UTM parameters. -* Tweak - Tracking for Products ( Add To Cart and Impression) when using Products (Beta) Block. -* Tweak - WC 8.2 compatibility. - -= 1.8.5 - 2023-09-14 = -* Dev - Add Workflow for generation Hooks documentation. -* Dev - Fetch WooCommerce and WordPress versions for our tests. -* Fix - Add To Cart and Impression events when using Blocks. -* Fix - Compat - Add PHP 8.2 support. -* Tweak - WC 8.1.0 compatibility. - -= 1.8.4 - 2023-08-08 = -* Dev - Add release preparation GH workflow. -* Fix - Add async attribute in `google-tag-manager` script. -* Tweak - WC 8.0 compatibility. -* Tweak - WP 6.3 compatibility. - -= 1.8.3 - 2023-07-11 = -* Dev - Set engines for the repository. -* Fix - Record consecutive cart removals. -* Tweak - WC 7.9 compatibility. - -= 1.8.2 - 2023-06-13 = -* Tweak - WC 7.8 compatibility. - -= 1.8.1 - 2023-05-09 = -* Fix - Fatal error when running with Elementor. -* Tweak - WC 7.7 compatibility. - -= 1.8.0 - 2023-05-02 = -* Add - Create WordPress Hook Actions for Google Analytics. -* Add - Implement tracking with Actions Hooks. -* Dev - Implement JS Build (ES6) and JS Lint. -* Dev - Implement Javascript Building. - -= 1.7.1 - 2023-04-12 = -* Fix - Bug with tracking enhanced ecommerce. - -= 1.7.0 - 2023-03-28 = -* Dev - Load scripts via `wp_register_scripts` and `wp_eneuque_js`. -* Fix - Avoid duplication of Google Tag Manager script. -* Tweak - WC 7.6 compatibility. -* Tweak - WP 6.2 compatibility. - -= 1.6.2 - 2023-03-07 = -* Tweak - WC 7.5 compatibility. -* Tweak - WP 6.2 compatibility. - -= 1.6.1 - 2023-02-15 = -* Tweak - WC 7.4 compatibility. - -= 1.6.0 - 2023-01-31 = -* Add - Common function for event code. -* Fix - Add PHP unit tests. -* Fix - Feature/consistency across gtag implementation. -* Fix - Fix inconsistencies across item data in events. -* Fix - Fix usage of tracker_var() in load_analytics(). - -= 1.5.19 - 2023-01-11 = -* Fix - undefined WC constant. -* Tweak - WC 7.3 compatibility. - -= 1.5.18 - 2022-12-14 = -* Add - .nvmrc file. -* Tweak - WC 7.2 compatibility. - -= 1.5.17 - 2022-11-09 = -* Add - New Google Analytics task in WC. - -= 1.5.16 - 2022-11-03 = -* Add - Declare compatibility for High Performance Order Storage. -* Tweak - WC 7.1 compatibility. -* Tweak - WP 6.1 compatibility. - -= 1.5.15 - 2022-10-04 = -* Add - Support for a Google Tag ID. -* Tweak - WC 7.0 compatibility. - -= 1.5.14 - 2022-09-02 = -* Dev - Add branch-labels GH workflow. -* Dev - GH release config and the new PR template. -* Tweak - WC 6.9 compatibility. - -= 1.5.13 - 2022-08-03 = -* Fix - Custom Order table compatibility. - -= 1.5.12 - 2022-07-27 = -* Tweak - WC 6.8 compatibility. - -= 1.5.11 - 2022-07-06 = -* Tweak - WC 6.7 compatibility. - -= 1.5.10 - 2022-06-07 = -* Tweak - WC 6.6 compatibility. - -= 1.5.9 - 2022-05-10 = -* Tweak - WC 6.5 compatibility. -* Tweak - WordPress 6.0 compatibility. - -= 1.5.8 - 2022-02-02 = -* Add - Support for Google Analytics cross domain tracking features. - -= 1.5.7 - 2022-01-13 = -* Fix - Activation error when WC was disabled. -* Tweak - WC 6.1 compatibility. - -= 1.5.6 - 2021-12-29 = -* Fix - Confirm order key before displaying transaction tracking code. - -= 1.5.5 - 2021-12-09 = -* Tweak - WC 6.0 compatibility. -* Tweak - WP 5.9 compatibility. - -= 1.5.4 - 2021-11-10 = -* Fix - Remove the slow order counting query from admin init. -* Tweak - WC 5.9 compatibility. - -= 1.5.3 - 2021-09-15 = -* Tweak - Avoid unnecessary completed orders queries. -* Tweak - WC 5.7 compatibility. -* Tweak - WP 5.8 compatibility. - -= 1.5.2 - 2021-07-30 = -* Fix - Change utm_source and utm_medium in upsell notice link. -* Fix - add product links to readme. - -= 1.5.1 - 2021-02-03 = -* Tweak - WC 5.0 compatibility. - -= 1.5.0 - 2020-12-17 = -* Add - Option to use Global Site Tag and the gtag.js library (for Universal Analytics or Google Analytics 4). -* Add - Several new values added to the Tracker data. -* Add - Developer ID for gtag.js and analytics.js. -* Tweak - Bump minimum-supported WooCommerce version to 3.2. -* Tweak - Remove deprecated jQuery .click(). -* Fix - Settings link in plugins table row points directly to plugin settings. -* Fix - Issue with multiple consecutive "Remove from Cart" events sent from the mini cart. - -= 1.4.25 - 2020-11-25 = -* Tweak - WC 4.7 compatibility. -* Tweak - WordPress 5.6 compatibility. - -= 1.4.24 - 2020-10-12 = -* Tweak - WC 4.5 compatibility. - -= 1.4.23 - 2020-08-19 = -* Fix - Prevent transaction from being tracked a second time when page is reloaded locally or from cache. -* Tweak - WordPress 5.5 compatibility. - -= 1.4.22 - 2020-06-05 = -* Tweak - WC 4.2 compatibility. - -= 1.4.21 - 2020-05-04 = -* Tweak - WC 4.1 compatibility. - -= 1.4.20 - 2020-03-29 = -* Fix - Change wc_goole_analytics_send_pageview fiter name to wc_google_analytics_send_pageview. - -= 1.4.19 - 2020-03-09 = -* Tweak - WordPress 5.4 compatibility. - -= 1.4.18 - 2020-03-04 = -* Tweak - Use code sniff version. -* Tweak - WC 4.0 compatibility. - -= 1.4.17 - 2020-01-13 = -* Tweak - Update constant VERSION in plugin file - -= 1.4.16 - 2020-01-13 = -* Tweak - WC 3.9 compatibility. - -= 1.4.15 - 2019-11-04 = -* Tweak - WC 3.8 compatibility. - -= 1.4.14 - 2019-09-04 = -* Fix - Google Analytics JS URL missing quotes. - -= 1.4.13 - 2019-09-03 = -* Tweak - Make Google Analytics JS script URL filterable. - -= 1.4.12 - 2019-08-13 = -* Tweak - WC 3.7 compatibility. - -= 1.4.11 - 2019-08-02 = -* Add - Filter to bypass "send pageview" for users whom want to use separate standard GA. `wc_goole_analytics_send_pageview`. -* Fix - Revert last release due to it causing ecommerce tracking to be disabled when standard tracking is disabled. - -= 1.4.10 - 2019-07-10 = -* Fix - Ensure universal analytics pageview doesn’t occur if standard tracking is disabled. - -= 1.4.9 - 2019-04-16 = -* Tweak - WC 3.6 compatibility. - -= 1.4.8 - 2019-03-04 = -* Fix - Event for deleting from cart not sent after a cart update. - -= 1.4.7 - 11/19/2018 = -* Tweak - WP 5.0 compatibility. - -= 1.4.6 - 11/06/2018 = -* Fix - Check for active WooCommerce plugin. - -= 1.4.5 - 10/16/2018 = -* Tweak - Mention Google Analytics Pro in certain cases. -* Tweak - WC 3.5 compatibility. - -= 1.4.4 - 03/20/2018 = -* Fix - WC30 compatibility error when using deprecated get_product_from_item method. -* Fix - Check object before using methods to prevent errors. -* Fix - Variations not reporting category in cart tracking. -* Add - Filter woocommerce_ga_disable_tracking added to disable tracking. -* Tweak - Rebuilt languages pot file. - -= 1.4.3 - 06/15/2018 = -* Fix - WC 3.x notice by using proper variation data. -* Add - Option to track 404 (Not found) errors. - -= 1.4.2 - 09/05/2017 = -* Fix - Missing Google Analytics ID. - -= 1.4.1 - 01/05/2017 = - -* Add - Filters for GA snippet (woocommerce_ga_snippet_head, woocommerce_ga_snippet_create, woocommerce_ga_snippet_require, woocommerce_ga_snippet_output) -* Add - Option to toggle on/off Enhanced Link Attribution -* Fix - JavaScript break by wrapping it in quotes -* Fix - Use ID and SKU data in a consistent way so that all products are correctly tracked. -* Fix - Updates for WooCommerce 3.0 compatibility. -* Add - Settings link to the plugin in the Plugins screen -* Fix - Fatal error on shortcode usage for empty product - -= 1.4.0 - 20/11/2015 = - -* Feature - Support for enhanced eCommerce (tracking full store process from view to order) -* Tweak - Setting up the plugin is now clearer with some helpful links and clearer language -* Tweak - New filter on the ga global variable -* Refactor - JavaScript generation functions have been moved to their own class - -= 1.3.0 - 12/11/2014 = - -* Feature - Added the transaction currency in the tracking code -* Feature - Add data privacy option that are mandatory in some countries -* Tweak - Moved the tracking code to the head of the page -* Tweak - Remove the "SKU" prefix to the sku for addItem -* Refactor - Integration class reformulated - -= 1.2.2 - 15/10/2014 = - -* Feature - Adding option to anonymize IP addresses -* Feature - Adding gaOptOut function to be called from any page for OptOut - -= 1.2.1 - 17/09/2014 = - -* Tweak - Adding utmnooverride to return url for Google Adwords - -= 1.2.0 - 28/07/2014 = - -* Feature - Adding display advertising parameter to Universal Analytics -* Fix - Using get_total_shipping() instead of get_shipping -* Fix - Using wc_enqueue_js() instead of $woocommerce->add_inline_js( -* Tweak - Updating plugin FAQ -* Tweak - Adding parenthesis for clarity - -= 1.1 - 29/05/2014 = - -* Added option to enable Display Advertising -* Added compatibility support for WooCommerce 2.1 beta releases - -= 1.0 - 22/11/2013 = - -* Initial release diff --git a/wp/wp-content/plugins/woocommerce-google-analytics-integration/includes/class-wc-abstract-google-analytics-js.php b/wp/wp-content/plugins/woocommerce-google-analytics-integration/includes/class-wc-abstract-google-analytics-js.php deleted file mode 100644 index 2c4fac5f..00000000 --- a/wp/wp-content/plugins/woocommerce-google-analytics-integration/includes/class-wc-abstract-google-analytics-js.php +++ /dev/null @@ -1,394 +0,0 @@ -attach_event_data(); - - if ( did_action( 'woocommerce_blocks_loaded' ) ) { - woocommerce_store_api_register_endpoint_data( - array( - 'endpoint' => ProductSchema::IDENTIFIER, - 'namespace' => 'woocommerce_google_analytics_integration', - 'data_callback' => array( $this, 'data_callback' ), - 'schema_callback' => array( $this, 'schema_callback' ), - 'schema_type' => ARRAY_A, - ) - ); - - woocommerce_store_api_register_endpoint_data( - array( - 'endpoint' => CartItemSchema::IDENTIFIER, - 'namespace' => 'woocommerce_google_analytics_integration', - 'data_callback' => array( $this, 'data_callback' ), - 'schema_callback' => array( $this, 'schema_callback' ), - 'schema_type' => ARRAY_A, - ) - ); - } - } - - /** - * Hook into various parts of WooCommerce and set the relevant - * script data that the frontend tracking script will use. - * - * @return void - */ - public function attach_event_data(): void { - add_action( - 'wp_head', - function () { - $this->set_script_data( 'cart', $this->get_formatted_cart() ); - } - ); - - add_action( - 'woocommerce_before_single_product', - function () { - global $product; - $this->set_script_data( 'product', $this->get_formatted_product( $product ) ); - } - ); - - add_action( - 'woocommerce_add_to_cart', - function ( $cart_item_key, $product_id, $quantity, $variation_id, $variation ) { - $this->set_script_data( 'added_to_cart', $this->get_formatted_product( wc_get_product( $product_id ), $variation_id, $variation, $quantity ) ); - }, - 10, - 5 - ); - - add_filter( - 'woocommerce_loop_add_to_cart_link', - function ( $button, $product ) { - $this->append_script_data( 'products', $this->get_formatted_product( $product ) ); - return $button; - }, - 10, - 2 - ); - - add_action( - 'woocommerce_thankyou', - function ( $order_id ) { - if ( 'yes' === self::get( 'ga_ecommerce_tracking_enabled' ) ) { - $order = wc_get_order( $order_id ); - if ( $order && $order->get_meta( '_ga_tracked' ) !== '1' ) { - // Check order key. - // phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized - $order_key = empty( $_GET['key'] ) ? '' : wc_clean( wp_unslash( $_GET['key'] ) ); - if ( $order->key_is_valid( $order_key ) ) { - // Mark the order as tracked. - $order->update_meta_data( '_ga_tracked', 1 ); - $order->save(); - - $this->set_script_data( 'order', $this->get_formatted_order( $order ) ); - } - } - } - } - ); - } - - /** - * Return one of our settings - * - * @param string $setting Key/name for the setting. - * - * @return string|null Value of the setting or null if not found - */ - protected static function get( $setting ): ?string { - return self::$settings[ $setting ] ?? null; - } - - /** - * Generic GA snippet for opt out - */ - public static function load_opt_out(): void { - $code = " - var gaProperty = '" . esc_js( self::get( 'ga_id' ) ) . "'; - var disableStr = 'ga-disable-' + gaProperty; - if ( document.cookie.indexOf( disableStr + '=true' ) > -1 ) { - window[disableStr] = true; - } - function gaOptout() { - document.cookie = disableStr + '=true; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/'; - window[disableStr] = true; - }"; - - wp_register_script( 'google-analytics-opt-out', '', array(), null, false ); - wp_add_inline_script( 'google-analytics-opt-out', $code ); - wp_enqueue_script( 'google-analytics-opt-out' ); - } - - /** - * Get item identifier from product data - * - * @param WC_Product $product WC_Product Object. - * - * @return string - */ - public static function get_product_identifier( WC_Product $product ): string { - $identifier = $product->is_type( 'variation' ) ? $product->get_parent_id() : $product->get_id(); - - if ( 'product_sku' === self::get( 'ga_product_identifier' ) ) { - if ( ! empty( $product->get_sku() ) ) { - $identifier = $product->get_sku(); - } else { - $identifier = '#' . ( $product->is_type( 'variation' ) ? $product->get_parent_id() : $product->get_id() ); - } - } - - return apply_filters( 'woocommerce_ga_product_identifier', $identifier, $product ); - } - - /** - * Returns an array of cart data in the required format - * - * @return array - */ - public function get_formatted_cart(): array { - $cart = WC()->cart; - - if ( is_null( $cart ) ) { - return array(); - } - - return array( - 'items' => array_map( - function ( $item ) { - return array_merge( - $this->get_formatted_product( $item['data'] ), - array( - 'quantity' => $item['quantity'], - 'prices' => array( - 'price' => $this->get_formatted_price( $item['line_total'] ), - 'currency_minor_unit' => wc_get_price_decimals(), - ), - ) - ); - }, - array_values( $cart->get_cart() ) - ), - 'coupons' => $cart->get_coupons(), - 'totals' => array( - 'currency_code' => get_woocommerce_currency(), - 'total_price' => $this->get_formatted_price( $cart->get_total( 'edit' ) ), - 'currency_minor_unit' => wc_get_price_decimals(), - ), - ); - } - - /** - * Returns an array of product data in the required format - * - * @param WC_Product $product The product to format. - * @param int $variation_id Variation product ID. - * @param array|bool $variation An array containing product variation attributes to include in the product data. - * For the "variation" type products, we'll use product->get_attributes. - * @param bool|int $quantity Quantity to include in the formatted product object - * - * @return array - */ - public function get_formatted_product( WC_Product $product, $variation_id = 0, $variation = false, $quantity = false ): array { - $product_id = $product->is_type( 'variation' ) ? $product->get_parent_id() : $product->get_id(); - $price = $product->get_price(); - - // Get product price from chosen variation if set. - if ( $variation_id ) { - $variation_product = wc_get_product( $variation_id ); - if ( $variation_product ) { - $price = $variation_product->get_price(); - } - } - - $formatted = array( - 'id' => $product_id, - 'name' => $product->get_title(), - 'categories' => array_map( - fn( $category ) => array( 'name' => $category->name ), - wc_get_product_terms( $product_id, 'product_cat', array( 'number' => 5 ) ) - ), - 'prices' => array( - 'price' => $this->get_formatted_price( $price ), - 'currency_minor_unit' => wc_get_price_decimals(), - ), - 'extensions' => array( - 'woocommerce_google_analytics_integration' => array( - 'identifier' => $this->get_product_identifier( $product ), - ), - ), - ); - - if ( $quantity ) { - $formatted['quantity'] = (int) $quantity; - } - - if ( $product->is_type( 'variation' ) ) { - $variation = $product->get_attributes(); - } - - if ( is_array( $variation ) ) { - $formatted['variation'] = implode( - ', ', - array_map( - function ( $attribute, $value ) { - return sprintf( - '%s: %s', - str_replace( 'attribute_', '', $attribute ), - $value - ); - }, - array_keys( $variation ), - array_values( $variation ) - ) - ); - } - - return $formatted; - } - - /** - * Returns an array of order data in the required format - * - * @param WC_Abstract_Order $order An instance of the WooCommerce Order object. - * - * @return array - */ - public function get_formatted_order( $order ): array { - return array( - 'id' => $order->get_id(), - 'affiliation' => get_bloginfo( 'name' ), - 'totals' => array( - 'currency_code' => $order->get_currency(), - 'currency_minor_unit' => wc_get_price_decimals(), - 'tax_total' => $this->get_formatted_price( $order->get_total_tax() ), - 'shipping_total' => $this->get_formatted_price( $order->get_total_shipping() ), - 'total_price' => $this->get_formatted_price( $order->get_total() ), - ), - 'items' => array_map( - function ( $item ) { - return array_merge( - $this->get_formatted_product( $item->get_product() ), - array( - 'quantity' => $item->get_quantity(), - // The method get_total() will return the price after coupon discounts. - // https://github.com/woocommerce/woocommerce/blob/54eba223b8dec015c91a13423f9eced09e96f399/plugins/woocommerce/includes/class-wc-order-item-product.php#L308-L310 - 'price_after_coupon_discount' => $this->get_formatted_price( $item->get_total() ), - ) - ); - }, - array_values( $order->get_items() ), - ), - ); - } - - /** - * Formats a price the same way WooCommerce Blocks does - * - * @param mixed $value The price value for format - * - * @return int - */ - public function get_formatted_price( $value ): int { - return intval( - round( - ( (float) wc_format_decimal( $value ) ) * ( 10 ** absint( wc_get_price_decimals() ) ), - 0 - ) - ); - } - - /** - * Add product identifier to StoreAPI - * - * @param WC_Product|array $product Either an instance of WC_Product or a cart item array depending on the endpoint - * - * @return array - */ - public function data_callback( $product ): array { - $product = is_a( $product, 'WC_Product' ) ? $product : $product['data']; - - return array( - 'identifier' => (string) $this->get_product_identifier( $product ), - ); - } - - /** - * Schema for the extended StoreAPI data - * - * @return array - */ - public function schema_callback(): array { - return array( - 'identifier' => array( - 'description' => __( 'The formatted product identifier to use in Google Analytics events.', 'woocommerce-google-analytics-integration' ), - 'type' => 'string', - 'readonly' => true, - ), - ); - } - - /** - * Returns the tracker variable this integration should use - * - * @return string - */ - abstract public static function tracker_function_name(): string; - - /** - * Add an event to the script data - * - * @param string $type The type of event this data is related to. - * @param string|array $data The event data to add. - * - * @return void - */ - abstract public function set_script_data( string $type, $data ): void; - - /** - * Append data to an existing script data array - * - * @param string $type The type of event this data is related to. - * @param string|array $data The event data to add. - * - * @return void - */ - abstract public function append_script_data( string $type, $data ): void; - - /** - * Get the class instance - * - * @param array $settings Settings - * @return WC_Abstract_Google_Analytics_JS - */ - abstract public static function get_instance( $settings = array() ): WC_Abstract_Google_Analytics_JS; -} diff --git a/wp/wp-content/plugins/woocommerce-google-analytics-integration/includes/class-wc-google-analytics-task.php b/wp/wp-content/plugins/woocommerce-google-analytics-integration/includes/class-wc-google-analytics-task.php deleted file mode 100644 index 128430b0..00000000 --- a/wp/wp-content/plugins/woocommerce-google-analytics-integration/includes/class-wc-google-analytics-task.php +++ /dev/null @@ -1,70 +0,0 @@ -get_settings_url(); - } - - /** - * Check if the task is complete. - * - * @return bool - */ - public function is_complete() { - return WC_Google_Analytics_Integration::get_integration()->is_setup_complete(); - } -} diff --git a/wp/wp-content/plugins/woocommerce-google-analytics-integration/includes/class-wc-google-analytics.php b/wp/wp-content/plugins/woocommerce-google-analytics-integration/includes/class-wc-google-analytics.php deleted file mode 100644 index 59c9d141..00000000 --- a/wp/wp-content/plugins/woocommerce-google-analytics-integration/includes/class-wc-google-analytics.php +++ /dev/null @@ -1,318 +0,0 @@ -settings ); - } - - /** - * Constructor - * Init and hook in the integration. - */ - public function __construct() { - $this->id = 'google_analytics'; - $this->method_title = __( 'Google Analytics', 'woocommerce-google-analytics-integration' ); - $this->method_description = __( 'Google Analytics is a free service offered by Google that generates detailed statistics about the visitors to a website.', 'woocommerce-google-analytics-integration' ); - - // Load the settings - $this->init_form_fields(); - $this->init_settings(); - - add_action( 'admin_notices', array( $this, 'universal_analytics_upgrade_notice' ) ); - - include_once 'class-wc-abstract-google-analytics-js.php'; - include_once 'class-wc-google-gtag-js.php'; - - if ( ! $this->disable_tracking( 'all' ) ) { - $this->get_tracking_instance(); - } - - // Display a task on "Things to do next section" - add_action( 'init', array( $this, 'add_wc_setup_task' ), 20 ); - // Admin Options - add_filter( 'woocommerce_tracker_data', array( $this, 'track_settings' ) ); - add_action( 'woocommerce_update_options_integration_google_analytics', array( $this, 'process_admin_options' ) ); - add_action( 'woocommerce_update_options_integration_google_analytics', array( $this, 'show_options_info' ) ); - add_action( 'admin_init', array( $this, 'privacy_policy' ) ); - - // utm_nooverride parameter for Google AdWords - add_filter( 'woocommerce_get_return_url', array( $this, 'utm_nooverride' ) ); - - // Mark extension as compatible with WP Consent API - add_filter( 'wp_consent_api_registered_' . plugin_basename( __FILE__ ), '__return_true' ); - - // Dequeue the WooCommerce Blocks Google Analytics integration, - // not to let it register its `gtag` function so that we could provide a more detailed configuration. - add_action( - 'wp_enqueue_scripts', - function () { - wp_dequeue_script( 'wc-blocks-google-analytics' ); - } - ); - } - - /** - * Conditionally display an error notice to the merchant if the stored property ID starts with "UA" - * - * @return void - */ - public function universal_analytics_upgrade_notice() { - if ( 'ua' === substr( strtolower( $this->get_option( 'ga_id' ) ), 0, 2 ) ) { - printf( - '

    %2$s

    ', - 'notice notice-error', - sprintf( - /* translators: 1) URL for Google documentation on upgrading from UA to GA4 2) URL to WooCommerce Google Analytics settings page */ - esc_html__( 'Your website is configured to use Universal Analytics which Google retired in July of 2023. Update your account using the %1$ssetup assistant%2$s and then update your %3$sWooCommerce settings%4$s.', 'woocommerce-google-analytics-integration' ), - '', - '', - '', - '' - ) - ); - } - } - - /** - * Tells WooCommerce which settings to display under the "integration" tab - */ - public function init_form_fields() { - $this->form_fields = array( - 'ga_product_identifier' => array( - 'title' => __( 'Product Identification', 'woocommerce-google-analytics-integration' ), - 'description' => __( 'Specify how your products will be identified to Google Analytics. Changing this setting may cause issues with historical data if a product was previously identified using a different structure.', 'woocommerce-google-analytics-integration' ), - 'type' => 'select', - 'options' => array( - 'product_id' => __( 'Product ID', 'woocommerce-google-analytics-integration' ), - 'product_sku' => __( 'Product SKU with prefixed (#) ID as fallback', 'woocommerce-google-analytics-integration' ), - ), - // If the option is not set then the product SKU is used as default for existing installations - 'default' => 'product_sku', - ), - 'ga_id' => array( - 'title' => __( 'Google Analytics Tracking ID', 'woocommerce-google-analytics-integration' ), - 'description' => __( 'Log into your Google Analytics account to find your ID. e.g. GT-XXXXX or G-XXXXX', 'woocommerce-google-analytics-integration' ), - 'type' => 'text', - 'placeholder' => 'GT-XXXXX', - 'default' => get_option( 'woocommerce_ga_id' ), // Backwards compat - ), - 'ga_support_display_advertising' => array( - 'label' => __( '"Display Advertising" Support', 'woocommerce-google-analytics-integration' ), - /* translators: Read more link */ - 'description' => sprintf( __( 'Set the Google Analytics code to support Display Advertising. %1$sRead more about Display Advertising%2$s.', 'woocommerce-google-analytics-integration' ), '', '' ), - 'type' => 'checkbox', - 'checkboxgroup' => '', - 'default' => get_option( 'woocommerce_ga_support_display_advertising' ) ? get_option( 'woocommerce_ga_support_display_advertising' ) : 'yes', // Backwards compat - ), - 'ga_404_tracking_enabled' => array( - 'label' => __( 'Track 404 (Not found) Errors', 'woocommerce-google-analytics-integration' ), - /* translators: Read more link */ - 'description' => sprintf( __( 'Enable this to find broken or dead links. An "Event" with category "Error" and action "404 Not Found" will be created in Google Analytics for each incoming pageview to a non-existing page. By setting up a "Custom Goal" for these events within Google Analytics you can find out where broken links originated from (the referrer). %1$sRead how to set up a goal%2$s.', 'woocommerce-google-analytics-integration' ), '', '' ), - 'type' => 'checkbox', - 'checkboxgroup' => '', - 'default' => 'yes', - ), - 'ga_linker_allow_incoming_enabled' => array( - 'label' => __( 'Accept Incoming Linker Parameters', 'woocommerce-google-analytics-integration' ), - 'description' => __( 'Enabling this option will allow incoming linker parameters from other websites.', 'woocommerce-google-analytics-integration' ), - 'type' => 'checkbox', - 'checkboxgroup' => '', - 'default' => 'no', - ), - 'ga_ecommerce_tracking_enabled' => array( - 'title' => __( 'Event Tracking', 'woocommerce-google-analytics-integration' ), - 'label' => __( 'Purchase Transactions', 'woocommerce-google-analytics-integration' ), - 'description' => __( 'This requires a payment gateway that redirects to the thank you/order received page after payment. Orders paid with gateways which do not do this will not be tracked.', 'woocommerce-google-analytics-integration' ), - 'type' => 'checkbox', - 'checkboxgroup' => 'start', - 'default' => get_option( 'woocommerce_ga_ecommerce_tracking_enabled' ) ? get_option( 'woocommerce_ga_ecommerce_tracking_enabled' ) : 'yes', // Backwards compat - ), - 'ga_event_tracking_enabled' => array( - 'label' => __( 'Add to Cart Events', 'woocommerce-google-analytics-integration' ), - 'type' => 'checkbox', - 'checkboxgroup' => '', - 'default' => 'yes', - ), - 'ga_enhanced_remove_from_cart_enabled' => array( - 'label' => __( 'Remove from Cart Events', 'woocommerce-google-analytics-integration' ), - 'type' => 'checkbox', - 'checkboxgroup' => '', - 'default' => 'yes', - ), - - 'ga_enhanced_product_impression_enabled' => array( - 'label' => __( 'Product Impressions from Listing Pages', 'woocommerce-google-analytics-integration' ), - 'type' => 'checkbox', - 'checkboxgroup' => '', - 'default' => 'yes', - ), - - 'ga_enhanced_product_click_enabled' => array( - 'label' => __( 'Product Clicks from Listing Pages', 'woocommerce-google-analytics-integration' ), - 'type' => 'checkbox', - 'checkboxgroup' => '', - 'default' => 'yes', - ), - - 'ga_enhanced_product_detail_view_enabled' => array( - 'label' => __( 'Product Detail Views', 'woocommerce-google-analytics-integration' ), - 'type' => 'checkbox', - 'checkboxgroup' => '', - 'default' => 'yes', - ), - - 'ga_enhanced_checkout_process_enabled' => array( - 'label' => __( 'Checkout Process Initiated', 'woocommerce-google-analytics-integration' ), - 'type' => 'checkbox', - 'checkboxgroup' => '', - 'default' => 'yes', - ), - 'ga_linker_cross_domains' => array( - 'title' => __( 'Cross Domain Tracking', 'woocommerce-google-analytics-integration' ), - /* translators: Read more link */ - 'description' => sprintf( __( 'Add a comma separated list of domains for automatic linking. %1$sRead more about Cross Domain Measurement%2$s', 'woocommerce-google-analytics-integration' ), '', '' ), - 'type' => 'text', - 'placeholder' => 'example.com, example.net', - 'default' => '', - ), - ); - } - - /** - * Shows some additional help text after saving the Google Analytics settings - */ - public function show_options_info() { - $this->method_description .= "

    " . __( 'Please allow Google Analytics 24 hours to start displaying results.', 'woocommerce-google-analytics-integration' ) . '

    '; - - // phpcs:disable WordPress.Security.NonceVerification.Recommended - if ( isset( $_REQUEST['woocommerce_google_analytics_ga_ecommerce_tracking_enabled'] ) && true === (bool) $_REQUEST['woocommerce_google_analytics_ga_ecommerce_tracking_enabled'] ) { - $this->method_description .= "

    " . __( 'Please note, for transaction tracking to work properly, you will need to use a payment gateway that redirects the customer back to a WooCommerce order received/thank you page.', 'woocommerce-google-analytics-integration' ) . '

    '; - } - } - - /** - * Hooks into woocommerce_tracker_data and tracks some of the analytic settings (just enabled|disabled status) - * only if you have opted into WooCommerce tracking - * https://woo.com/usage-tracking/ - * - * @param array $data Current WC tracker data. - * @return array Updated WC Tracker data. - */ - public function track_settings( $data ) { - $settings = $this->settings; - $data['wc-google-analytics'] = array( - 'support_display_advertising' => $settings['ga_support_display_advertising'], - 'ga_404_tracking_enabled' => $settings['ga_404_tracking_enabled'], - 'ecommerce_tracking_enabled' => $settings['ga_ecommerce_tracking_enabled'], - 'event_tracking_enabled' => $settings['ga_event_tracking_enabled'], - 'plugin_version' => WC_GOOGLE_ANALYTICS_INTEGRATION_VERSION, - 'linker_allow_incoming_enabled' => empty( $settings['ga_linker_allow_incoming_enabled'] ) ? 'no' : 'yes', - 'linker_cross_domains' => $settings['ga_linker_cross_domains'], - ); - - // ID prefix, blank, or X for unknown - $prefix = strstr( strtoupper( $settings['ga_id'] ), '-', true ); - if ( in_array( $prefix, array( 'UA', 'G', 'GT' ), true ) || empty( $prefix ) ) { - $data['wc-google-analytics']['ga_id'] = $prefix; - } else { - $data['wc-google-analytics']['ga_id'] = 'X'; - } - - return $data; - } - - /** - * Add suggested privacy policy content - * - * @return void - */ - public function privacy_policy() { - $policy_text = sprintf( - /* translators: 1) HTML anchor open tag 2) HTML anchor closing tag */ - esc_html__( 'By using this extension, you may be storing personal data or sharing data with an external service. %1$sLearn more about what data is collected by Google and what you may want to include in your privacy policy%2$s.', 'woocommerce-google-analytics-integration' ), - '', - '' - ); - - // As the extension doesn't offer suggested privacy policy text, the button to copy it is hidden. - $content = ' -

    ' . $policy_text . '

    - '; - - wp_add_privacy_policy_content( 'Google Analytics for WooCommerce', wpautop( $content, false ) ); - } - - /** - * Check if tracking is disabled - * - * @param string $type The setting to check - * @return bool True if tracking for a certain setting is disabled - */ - private function disable_tracking( $type ) { - return is_admin() || current_user_can( 'manage_options' ) || empty( $this->settings['ga_id'] ) || 'no' === $type || apply_filters( 'woocommerce_ga_disable_tracking', false, $type ); - } - - /** - * Add the utm_nooverride parameter to any return urls. This makes sure Google Adwords doesn't mistake the offsite gateway as the referrer. - * - * @param string $return_url WooCommerce Return URL - * @return string URL - */ - public function utm_nooverride( $return_url ) { - // We don't know if the URL already has the parameter so we should remove it just in case - $return_url = remove_query_arg( 'utm_nooverride', $return_url ); - - // Now add the utm_nooverride query arg to the URL - $return_url = add_query_arg( 'utm_nooverride', '1', $return_url ); - - return esc_url( $return_url, null, 'db' ); - } - - /** - * Check if the Google Analytics Tracking ID has been set up. - * - * @since 1.5.17 - * - * @return bool Whether the Google Analytics setup is completed. - */ - public function is_setup_complete() { - return (bool) $this->get_option( 'ga_id' ); - } - - - /** - * Adds the setup task to the Tasklists. - * - * @since 1.5.17 - */ - public function add_wc_setup_task() { - require_once 'class-wc-google-analytics-task.php'; - - TaskLists::add_task( - 'extended', - new WC_Google_Analytics_Task( - TaskLists::get_list( 'extended' ) - ) - ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-google-analytics-integration/includes/class-wc-google-gtag-js.php b/wp/wp-content/plugins/woocommerce-google-analytics-integration/includes/class-wc-google-gtag-js.php deleted file mode 100644 index dbb52028..00000000 --- a/wp/wp-content/plugins/woocommerce-google-analytics-integration/includes/class-wc-google-gtag-js.php +++ /dev/null @@ -1,378 +0,0 @@ - array( - 'begin_checkout' => 'woocommerce_before_checkout_form', - 'purchase' => 'woocommerce_thankyou', - 'add_to_cart' => 'woocommerce_add_to_cart', - 'remove_from_cart' => 'woocommerce_cart_item_removed', - 'view_item' => 'woocommerce_after_single_product', - ), - 'filters' => array( - 'view_item_list' => 'woocommerce_loop_add_to_cart_link', - ), - ); - - /** - * Constructor - * Takes our settings from the parent class so we can later use them in the JS snippets - * - * @param array $settings Settings - */ - public function __construct( $settings = array() ) { - parent::__construct(); - self::$settings = $settings; - - $this->map_hooks(); - - $this->register_scripts(); - // Setup frontend scripts - add_action( 'wp_enqueue_scripts', array( $this, 'enquque_tracker' ), 5 ); - add_action( 'wp_footer', array( $this, 'inline_script_data' ) ); - } - - /** - * Register manager and tracker scripts. - * Call early so other extensions could add inline date to it. - * - * @return void - */ - private function register_scripts(): void { - wp_register_script( - 'google-tag-manager', - 'https://www.googletagmanager.com/gtag/js?id=' . self::get( 'ga_id' ), - array(), - null, - array( - 'strategy' => 'async', - ) - ); - - wp_register_script( - $this->gtag_script_handle, - '', - array(), - null, - array( - 'in_footer' => false, - ) - ); - - wp_add_inline_script( - $this->gtag_script_handle, - apply_filters( - 'woocommerce_gtag_snippet', - sprintf( - '/* Google Analytics for WooCommerce (gtag.js) */ - window.dataLayer = window.dataLayer || []; - function %2$s(){dataLayer.push(arguments);} - // Set up default consent state. - for ( const mode of %4$s || [] ) { - %2$s( "consent", "default", { "wait_for_update": 500, ...mode } ); - } - %2$s("js", new Date()); - %2$s("set", "developer_id.%3$s", true); - %2$s("config", "%1$s", %5$s);', - esc_js( $this->get( 'ga_id' ) ), - esc_js( $this->tracker_function_name() ), - esc_js( static::DEVELOPER_ID ), - json_encode( $this->get_consent_modes() ), - json_encode( $this->get_site_tag_config() ) - ) - ) - ); - - wp_enqueue_script( $this->gtag_script_handle ); - - wp_register_script( - $this->script_handle, - Plugin::get_instance()->get_js_asset_url( 'main.js' ), - array( - ...Plugin::get_instance()->get_js_asset_dependencies( 'main' ), - 'google-tag-manager', - ), - Plugin::get_instance()->get_js_asset_version( 'main' ), - true - ); - } - - /** - * Enqueue tracker scripts and its inline config. - * We need to execute tracker.js w/ `gtag` configuration before any trackable action may happen. - * - * @return void - */ - public function enquque_tracker(): void { - wp_enqueue_script( 'google-tag-manager' ); - // tracker.js needs to be executed ASAP, the remaining bits for main.js could be deffered, - // but to reduce the traffic, we ship it all together. - wp_enqueue_script( $this->script_handle ); - } - - /** - * Add all event data via an inline script in the footer to ensure all the data is collected in time. - * - * @return void - */ - public function inline_script_data(): void { - wp_register_script( - $this->data_script_handle, - '', - array( $this->script_handle ), - null, - array( - 'in_footer' => true, - ) - ); - - wp_add_inline_script( - $this->data_script_handle, - sprintf( - 'window.ga4w = { data: %1$s, settings: %2$s }; document.dispatchEvent(new Event("ga4w:ready"));', - $this->get_script_data(), - wp_json_encode( - array( - 'tracker_function_name' => $this->tracker_function_name(), - 'events' => $this->get_enabled_events(), - 'identifier' => $this->get( 'ga_product_identifier' ), - ), - ), - ) - ); - - wp_enqueue_script( $this->data_script_handle ); - } - - /** - * Hook into WooCommerce and add corresponding Blocks Actions to our event data - * - * @return void - */ - public function map_hooks(): void { - array_walk( - $this->mappings['actions'], - function ( $hook, $gtag_event ) { - add_action( - $hook, - function () use ( $gtag_event ) { - $this->append_event( $gtag_event ); - } - ); - } - ); - - array_walk( - $this->mappings['filters'], - function ( $hook, $gtag_event ) { - add_action( - $hook, - function ( $filtered_value ) use ( $gtag_event ) { - $this->append_event( $gtag_event ); - return $filtered_value; - } - ); - } - ); - } - - /** - * Appends a specific event, if it's not included yet. - * - * @param string $gtag_event - * @return void - */ - private function append_event( string $gtag_event ) { - if ( ! in_array( $gtag_event, $this->script_data['events'] ?? [], true ) ) { - $this->append_script_data( 'events', $gtag_event ); - } - } - - /** - * Set script data for a specific event - * - * @param string $type The type of event this data is related to. - * @param string|array $data The event data to add. - * - * @return void - */ - public function set_script_data( string $type, $data ): void { - $this->script_data[ $type ] = $data; - } - - /** - * Append data to an existing script data array - * - * @param string $type The type of event this data is related to. - * @param string|array $data The event data to add. - * - * @return void - */ - public function append_script_data( string $type, $data ): void { - if ( ! isset( $this->script_data[ $type ] ) ) { - $this->script_data[ $type ] = array(); - } - $this->script_data[ $type ][] = $data; - } - - /** - * Return a JSON encoded string of all script data for the current page load - * - * @return string - */ - public function get_script_data(): string { - return wp_json_encode( $this->script_data ); - } - - /** - * Returns the tracker variable this integration should use - * - * @return string - */ - public static function tracker_function_name(): string { - return apply_filters( 'woocommerce_gtag_tracker_variable', 'gtag' ); - } - - /** - * Return Google Analytics configuration, for JS to read. - * - * @return array - */ - public function get_site_tag_config(): array { - return apply_filters( - 'woocommerce_ga_gtag_config', - array( - 'track_404' => 'yes' === $this->get( 'ga_404_tracking_enabled' ), - 'allow_google_signals' => 'yes' === $this->get( 'ga_support_display_advertising' ), - 'logged_in' => is_user_logged_in(), - 'linker' => array( - 'domains' => ! empty( $this->get( 'ga_linker_cross_domains' ) ) ? array_map( 'esc_js', explode( ',', $this->get( 'ga_linker_cross_domains' ) ) ) : array(), - 'allow_incoming' => 'yes' === $this->get( 'ga_linker_allow_incoming_enabled' ), - ), - 'custom_map' => array( - 'dimension1' => 'logged_in', - ), - ), - ); - } - - /** - * Get an array containing the names of all enabled events - * - * @return array - */ - public static function get_enabled_events(): array { - $events = array(); - $settings = array( - 'purchase' => 'ga_ecommerce_tracking_enabled', - 'add_to_cart' => 'ga_event_tracking_enabled', - 'remove_from_cart' => 'ga_enhanced_remove_from_cart_enabled', - 'view_item_list' => 'ga_enhanced_product_impression_enabled', - 'select_content' => 'ga_enhanced_product_click_enabled', - 'view_item' => 'ga_enhanced_product_detail_view_enabled', - 'begin_checkout' => 'ga_enhanced_checkout_process_enabled', - ); - - foreach ( $settings as $event => $setting_name ) { - if ( 'yes' === self::get( $setting_name ) ) { - $events[] = $event; - } - } - - return $events; - } - - /** - * Get the default state configuration of consent mode. - */ - protected static function get_consent_modes(): array { - $consent_modes = array( - array( - 'analytics_storage' => 'denied', - 'ad_storage' => 'denied', - 'ad_user_data' => 'denied', - 'ad_personalization' => 'denied', - 'region' => array( - 'AT', - 'BE', - 'BG', - 'HR', - 'CY', - 'CZ', - 'DK', - 'EE', - 'FI', - 'FR', - 'DE', - 'GR', - 'HU', - 'IS', - 'IE', - 'IT', - 'LV', - 'LI', - 'LT', - 'LU', - 'MT', - 'NL', - 'NO', - 'PL', - 'PT', - 'RO', - 'SK', - 'SI', - 'ES', - 'SE', - 'GB', - 'CH', - ), - ), - ); - - /** - * Filters the default gtag consent mode configuration. - * - * @param array $consent_modes Array of default state configuration of consent mode. - */ - return apply_filters( 'woocommerce_ga_gtag_consent_modes', $consent_modes ); - } - - /** - * Get the class instance - * - * @param array $settings Settings - * @return WC_Abstract_Google_Analytics_JS - */ - public static function get_instance( $settings = array() ): WC_Abstract_Google_Analytics_JS { - if ( null === self::$instance ) { - self::$instance = new self( $settings ); - } - - return self::$instance; - } -} diff --git a/wp/wp-content/plugins/woocommerce-google-analytics-integration/readme.txt b/wp/wp-content/plugins/woocommerce-google-analytics-integration/readme.txt deleted file mode 100644 index 0a3496b5..00000000 --- a/wp/wp-content/plugins/woocommerce-google-analytics-integration/readme.txt +++ /dev/null @@ -1,66 +0,0 @@ -=== Google Analytics for WooCommerce === -Contributors: woocommerce, automattic, claudiosanches, bor0, royho, laurendavissmith001, cshultz88, mmjones, tomalec -Tags: woocommerce, google analytics -Requires at least: 6.2 -Tested up to: 6.5 -Stable tag: 2.1.1 -License: GPLv3 -License URI: https://www.gnu.org/licenses/gpl-3.0.html - -Provides integration between Google Analytics and WooCommerce. - -== Description == - -This plugin provides the integration between Google Analytics and the WooCommerce plugin. You can link a referral to a purchase and add transaction information to your Google Analytics data. It supports Global Site Tag (GA4) and eCommerce event tracking. - -Please visit the [documentation page for additional information](https://woo.com/document/google-analytics-integration/). - -Contributions are welcome via the [GitHub repository](https://github.com/woocommerce/woocommerce-google-analytics-integration). - -== Installation == - -1. Download the plugin file to your computer and unzip it -2. Using an FTP program, or your hosting control panel, upload the unzipped plugin folder to your WordPress installation’s wp-content/plugins/ directory. -3. Activate the plugin from the Plugins menu within the WordPress admin. -4. Don't forget to enable e-commerce tracking in your Google Analytics account: [https://support.google.com/analytics/answer/1009612?hl=en](https://support.google.com/analytics/answer/1009612?hl=en) - -Or use the automatic installation wizard through your admin panel, just search for this plugin's name. - -== Frequently Asked Questions == - -= Where can I find the setting for this plugin? = - -This plugin will add the settings to the Integration tab, found in the WooCommerce → Settings menu. - -= I don't see the code on my site. Where is it? = - -We purposefully don't track admin visits to the site. Log out of the site (or open a Google Chrome Incognito window) and check if the code is there for non-admins. - -Also please make sure to enter your Google Analytics ID under WooCommerce → Settings → Integrations. - -= My code is there. Why is it still not tracking sales? = - -Duplicate Google Analytics code causes a conflict in tracking. Remove any other Google Analytics plugins or code from your site to avoid duplication and conflicts in tracking. - -== Screenshots == - -1. Google Analytics Integration Settings. - -== Changelog == - -= 2.1.1 - 2024-06-12 = -* Tweak - Confirm WC_Cart is available before formatting cart data. -* Tweak - WC 9.0 compatibility. - -= 2.1.0 - 2024-06-05 = -* Add - Integration with the WP Consent API plugin. -* Fix - Add E2E tests for denying via WP Consent API. -* Tweak - Document WP Consent API support. - -= 2.0.7 - 2024-05-14 = -* Dev - Add a manual workflow run for PHP unit tests. -* Fix - Apply discounts to the ecommerce event if available. -* Fix - Incorrect quantity value when adding product to the cart that exists in the cart. -* Tweak - WC 8.9 compatibility. - -[See changelog for all versions](https://raw.githubusercontent.com/woocommerce/woocommerce-google-analytics-integration/trunk/changelog.txt). diff --git a/wp/wp-content/plugins/woocommerce-google-analytics-integration/woocommerce-google-analytics-integration.php b/wp/wp-content/plugins/woocommerce-google-analytics-integration/woocommerce-google-analytics-integration.php deleted file mode 100644 index 407867b0..00000000 --- a/wp/wp-content/plugins/woocommerce-google-analytics-integration/woocommerce-google-analytics-integration.php +++ /dev/null @@ -1,321 +0,0 @@ -maybe_show_ga_pro_notices(); - WC_Google_Analytics_Integration::get_instance()->maybe_set_defaults(); - } - ); - - // HPOS compatibility declaration. - add_action( - 'before_woocommerce_init', - function () { - if ( class_exists( FeaturesUtil::class ) ) { - FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__ ); - FeaturesUtil::declare_compatibility( 'cart_checkout_blocks', __FILE__ ); - FeaturesUtil::declare_compatibility( 'product_block_editor', __FILE__ ); - } - } - ); - - /** - * Google Analytics for WooCommerce main class. - */ - class WC_Google_Analytics_Integration { - - /** @var WC_Google_Analytics_Integration $instance Instance of this class. */ - protected static $instance = null; - - /** - * Initialize the plugin. - */ - public function __construct() { - if ( ! class_exists( 'WooCommerce' ) ) { - add_action( 'admin_notices', [ $this, 'woocommerce_missing_notice' ] ); - return; - } - - // Load plugin text domain - add_action( 'init', array( $this, 'load_plugin_textdomain' ) ); - - // Track completed orders and determine whether the GA Pro notice should be displayed. - add_action( 'woocommerce_order_status_completed', array( $this, 'maybe_show_ga_pro_notices' ) ); - - // Checks which WooCommerce is installed. - if ( class_exists( 'WC_Integration' ) && defined( 'WOOCOMMERCE_VERSION' ) && version_compare( WOOCOMMERCE_VERSION, WC_GOOGLE_ANALYTICS_INTEGRATION_MIN_WC_VER, '>=' ) ) { - include_once 'includes/class-wc-google-analytics.php'; - - // Register the integration. - add_filter( 'woocommerce_integrations', array( $this, 'add_integration' ) ); - } else { - add_action( 'admin_notices', array( $this, 'woocommerce_missing_notice' ) ); - } - - add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), array( $this, 'plugin_links' ) ); - } - - /** - * Gets the settings page URL. - * - * @since 1.5.17 - * - * @return string Settings URL - */ - public function get_settings_url() { - return add_query_arg( - array( - 'page' => 'wc-settings', - 'tab' => 'integration', - 'section' => 'google_analytics', - ), - admin_url( 'admin.php' ) - ); - } - - /** - * Add links on the plugins page (Settings & Support) - * - * @param array $links Default links - * @return array Default + added links - */ - public function plugin_links( $links ) { - $settings_url = $this->get_settings_url(); - $support_url = 'https://wordpress.org/support/plugin/woocommerce-google-analytics-integration'; - $docs_url = 'https://woo.com/document/google-analytics-integration/?utm_source=wordpress&utm_medium=all-plugins-page&utm_campaign=doc-link&utm_content=woocommerce-google-analytics-integration'; - - $plugin_links = array( - '' . esc_html__( 'Settings', 'woocommerce-google-analytics-integration' ) . '', - '' . esc_html__( 'Support', 'woocommerce-google-analytics-integration' ) . '', - '' . esc_html__( 'Documentation', 'woocommerce-google-analytics-integration' ) . '', - ); - - return array_merge( $plugin_links, $links ); - } - - /** - * Return an instance of this class. - * - * @return WC_Google_Analytics_Integration A single instance of this class. - */ - public static function get_instance() { - // If the single instance hasn't been set, set it now. - if ( null === self::$instance ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Load the plugin text domain for translation. - */ - public function load_plugin_textdomain() { - $locale = apply_filters( 'plugin_locale', get_locale(), 'woocommerce-google-analytics-integration' ); - - load_textdomain( 'woocommerce-google-analytics-integration', trailingslashit( WP_LANG_DIR ) . 'woocommerce-google-analytics-integration/woocommerce-google-analytics-integration-' . $locale . '.mo' ); - load_plugin_textdomain( 'woocommerce-google-analytics-integration', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); - } - - /** - * WooCommerce fallback notice. - */ - public function woocommerce_missing_notice() { - if ( defined( 'WOOCOMMERCE_VERSION' ) ) { - /* translators: 1 is the required component, 2 the Woocommerce version */ - $error = sprintf( __( 'Google Analytics for WooCommerce requires WooCommerce version %1$s or higher. You are using version %2$s', 'woocommerce-google-analytics-integration' ), WC_GOOGLE_ANALYTICS_INTEGRATION_MIN_WC_VER, WOOCOMMERCE_VERSION ); - } else { - /* translators: 1 is the required component */ - $error = sprintf( __( 'Google Analytics for WooCommerce requires WooCommerce version %1$s or higher.', 'woocommerce-google-analytics-integration' ), WC_GOOGLE_ANALYTICS_INTEGRATION_MIN_WC_VER ); - } - - echo '

    ' . wp_kses_post( $error ) . '

    '; - } - - /** - * Add a new integration to WooCommerce. - * - * @param array $integrations WooCommerce integrations. - * @return array Google Analytics for WooCommerce added. - */ - public function add_integration( $integrations ) { - $integrations[] = 'WC_Google_Analytics'; - - return $integrations; - } - - /** - * Get Google Analytics Integration - * - * @since 1.5.17 - * - * @return WC_Google_Analytics The Google Analytics integration. - */ - public static function get_integration() { - return \WooCommerce::instance()->integrations->get_integration( 'google_analytics' ); - } - - - /** - * Logic for Google Analytics Pro notices. - */ - public function maybe_show_ga_pro_notices() { - // Notice was already shown - if ( ! class_exists( 'WooCommerce' ) || get_option( 'woocommerce_google_analytics_pro_notice_shown', false ) ) { - return; - } - - $completed_orders = wc_orders_count( 'completed' ); - - // Only show the notice if there are 10 <= completed orders <= 100. - if ( $completed_orders < 10 || $completed_orders > 100 ) { - update_option( 'woocommerce_google_analytics_pro_notice_shown', true ); - - return; - } - - $notice_html = '' . esc_html__( 'Get detailed insights into your sales with Google Analytics Pro', 'woocommerce-google-analytics-integration' ) . '

    '; - - /* translators: 1: href link to GA pro */ - $notice_html .= sprintf( __( 'Add advanced tracking for your sales funnel, coupons and more. [Learn more >]', 'woocommerce-google-analytics-integration' ), 'https://woo.com/products/woocommerce-google-analytics-pro/?utm_source=woocommerce-google-analytics-integration&utm_medium=product&utm_campaign=google%20analytics%20free%20to%20pro%20extension%20upsell' ); - - WC_Admin_Notices::add_custom_notice( 'woocommerce_google_analytics_pro_notice', $notice_html ); - update_option( 'woocommerce_google_analytics_pro_notice_shown', true ); - } - - /** - * Set default options during activation if no settings exist - * - * @since 2.0.0 - * - * @return void - */ - public function maybe_set_defaults() { - $settings_key = 'woocommerce_google_analytics_settings'; - - if ( false === get_option( $settings_key, false ) ) { - update_option( - $settings_key, - array( - 'ga_product_identifier' => 'product_id', - ) - ); - } - } - - /** - * Get the path to something in the plugin dir. - * - * @param string $end End of the path. - * @return string - */ - public function path( $end = '' ) { - return untrailingslashit( __DIR__ ) . $end; - } - - /** - * Get the URL to something in the plugin dir. - * - * @param string $end End of the URL. - * - * @return string - */ - public function url( $end = '' ) { - return untrailingslashit( plugin_dir_url( plugin_basename( __FILE__ ) ) ) . $end; - } - - /** - * Get the URL to something in the plugin JS assets build dir. - * - * @param string $end End of the URL. - * - * @return string - */ - public function get_js_asset_url( $end = '' ) { - return $this->url( '/assets/js/build/' . $end ); - } - - /** - * Get the path to something in the plugin JS assets build dir. - * - * @param string $end End of the path. - * @return string - */ - public function get_js_asset_path( $end = '' ) { - return $this->path( '/assets/js/build/' . $end ); - } - - /** - * Gets the asset.php generated file for an asset name. - * - * @param string $asset_name The name of the asset to get the file from. - * @return array The asset file. Or an empty array if the file doesn't exist. - */ - public function get_js_asset_file( $asset_name ) { - try { - // Exclusion reason: No reaching any user input - // nosemgrep audit.php.lang.security.file.inclusion-arg - return require $this->get_js_asset_path( $asset_name . '.asset.php' ); - } catch ( Exception $e ) { - return []; - } - } - - /** - * Gets the dependencies for an assets based on its asset.php generated file. - * - * @param string $asset_name The name of the asset to get the dependencies from. - * @param array $extra_dependencies Array containing extra dependencies to include in the dependency array. - * - * @return array The dependencies array. Empty array if no dependencies. - */ - public function get_js_asset_dependencies( $asset_name, $extra_dependencies = array() ) { - $script_assets = $this->get_js_asset_file( $asset_name ); - $dependencies = $script_assets['dependencies'] ?? []; - return array_unique( array_merge( $dependencies, $extra_dependencies ) ); - } - - /** - * Gets the version for an assets based on its asset.php generated file. - * - * @param string $asset_name The name of the asset to get the version from. - * @return string|false The version. False in case no version is found. - */ - public function get_js_asset_version( $asset_name ) { - $script_assets = $this->get_js_asset_file( $asset_name ); - return $script_assets['version'] ?? false; - } - } - - add_action( 'plugins_loaded', array( 'WC_Google_Analytics_Integration', 'get_instance' ), 0 ); - -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/MIT-license-jquery-ui-timepicker-addon.txt b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/MIT-license-jquery-ui-timepicker-addon.txt deleted file mode 100644 index 957a11c7..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/MIT-license-jquery-ui-timepicker-addon.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2013 Trent Richardson - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/cbl-admin.css b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/cbl-admin.css deleted file mode 100644 index 3e320e00..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/cbl-admin.css +++ /dev/null @@ -1,427 +0,0 @@ -/* Coupons By Location styles */ -span.search label{ - font-size: 1em !important; - float:left !important; -} - -label.billing{ - width: 75px !important; - margin-left: 1px !important; -} - -label.shipping{ - margin-left: 0px !important; -} - -.chosen-container-multi .chosen-choices .search-field input{ - height: 21px !important; -} - -/*============================== -CHOSEN CSS - Added from woo 2.6 -================================*/ - -.chosen-container { - position: relative; - display: inline-block; - vertical-align: middle; - font-size: 13px; - zoom: 1; - user-select: none -} -.chosen-container .chosen-drop { - position: absolute; - top: 100%; - left: -9999px; - z-index: 1010; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - border: 1px solid #aaa; - border-top: 0; - background: #fff; - box-shadow: 0 4px 5px rgba(0, 0, 0, .15) -} -.chosen-container.chosen-with-drop .chosen-drop { - left: 0 -} -.chosen-container a { - cursor: pointer -} -.chosen-container-single .chosen-single { - position: relative; - display: block; - overflow: hidden; - padding: 0 0 0 8px; - height: 26px; - border: 1px solid #aaa; - border-radius: 5px; - background-color: #fff; - background: -webkit-gradient(linear, 50% 0, 50% 100%, color-stop(20%, #fff), color-stop(50%, #f6f6f6), color-stop(52%, #eee), color-stop(100%, #f4f4f4)); - background: -webkit-linear-gradient(top, #fff 20%, #f6f6f6 50%, #eee 52%, #f4f4f4 100%); - background: -moz-linear-gradient(top, #fff 20%, #f6f6f6 50%, #eee 52%, #f4f4f4 100%); - background: -o-linear-gradient(top, #fff 20%, #f6f6f6 50%, #eee 52%, #f4f4f4 100%); - background: linear-gradient(top, #fff 20%, #f6f6f6 50%, #eee 52%, #f4f4f4 100%); - background-clip: padding-box; - box-shadow: 0 0 3px #fff inset, 0 1px 1px rgba(0, 0, 0, .1); - color: #444; - text-decoration: none; - white-space: nowrap; - line-height: 26px -} -.chosen-container-single .chosen-default { - color: #999 -} -.chosen-container-single .chosen-single span { - display: block; - overflow: hidden; - margin-right: 26px; - text-overflow: ellipsis; - white-space: nowrap -} -.chosen-container-single .chosen-single-with-deselect span { - margin-right: 38px -} -.chosen-container-single .chosen-single abbr { - position: absolute; - top: 6px; - right: 26px; - display: block; - width: 12px; - height: 12px; - background: url(../images/chosen-sprite.png) -42px 1px no-repeat; - font-size: 1px -} -.chosen-container-single .chosen-single abbr:hover, -.chosen-container-single.chosen-disabled .chosen-single abbr:hover { - background-position: -42px -10px -} -.chosen-container-single .chosen-single div { - position: absolute; - top: 0; - right: 0; - display: block; - width: 18px; - height: 100% -} -.chosen-container-single .chosen-single div b { - display: block; - width: 100%; - height: 100%; - background: url(../images/chosen-sprite.png) 0 2px no-repeat -} -.chosen-container-single .chosen-search { - position: relative; - z-index: 1010; - margin: 0; - padding: 3px 4px; - white-space: nowrap -} -.chosen-container-single .chosen-search input[type=text] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin: 1px 0; - padding: 4px 20px 4px 5px; - width: 100%; - height: auto; - outline: 0; - border: 1px solid #aaa; - background: url(../images/chosen-sprite.png) 100% -20px no-repeat #fff; - background: url(../images/chosen-sprite.png) 100% -20px no-repeat, -webkit-gradient(linear, 50% 0, 50% 100%, color-stop(1%, #eee), color-stop(15%, #fff)); - background: url(../images/chosen-sprite.png) 100% -20px no-repeat, -webkit-linear-gradient(#eee 1%, #fff 15%); - background: url(../images/chosen-sprite.png) 100% -20px no-repeat, -moz-linear-gradient(#eee 1%, #fff 15%); - background: url(../images/chosen-sprite.png) 100% -20px no-repeat, -o-linear-gradient(#eee 1%, #fff 15%); - background: url(../images/chosen-sprite.png) 100% -20px no-repeat, linear-gradient(#eee 1%, #fff 15%); - font-size: 1em; - font-family: sans-serif; - line-height: normal; - border-radius: 0 -} -.chosen-container-single .chosen-drop { - margin-top: -1px; - border-radius: 0 0 4px 4px; - background-clip: padding-box -} -.chosen-container-single.chosen-container-single-nosearch .chosen-search { - position: absolute; - left: -9999px -} -.chosen-container .chosen-results { - position: relative; - overflow-x: hidden; - overflow-y: auto; - margin: 0 4px 4px 0; - padding: 0 0 0 4px; - max-height: 240px; - -webkit-overflow-scrolling: touch -} -.chosen-container .chosen-results li { - display: none; - margin: 0; - padding: 5px 6px; - list-style: none; - line-height: 15px -} -.chosen-container .chosen-results li.active-result { - display: list-item; - cursor: pointer -} -.chosen-container .chosen-results li.disabled-result { - display: list-item; - color: #ccc; - cursor: default -} -.chosen-container .chosen-results li.highlighted { - background-color: #3875d7; - background-image: -webkit-gradient(linear, 50% 0, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc)); - background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%); - background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%); - background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%); - background-image: linear-gradient(#3875d7 20%, #2a62bc 90%); - color: #fff -} -.chosen-container .chosen-results li.no-results { - display: list-item; - background: #f4f4f4 -} -.chosen-container .chosen-results li.group-result { - display: list-item; - font-weight: 700; - cursor: default -} -.chosen-container .chosen-results li.group-option { - padding-left: 15px -} -.chosen-container .chosen-results li em { - font-style: normal; - text-decoration: underline -} -.chosen-container-multi .chosen-choices { - position: relative; - overflow: hidden; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - width: 100%; - height: auto!important; - height: 1%; - border: 1px solid #aaa; - background-color: #fff; - background-image: -webkit-gradient(linear, 50% 0, 50% 100%, color-stop(1%, #eee), color-stop(15%, #fff)); - background-image: -webkit-linear-gradient(#eee 1%, #fff 15%); - background-image: -moz-linear-gradient(#eee 1%, #fff 15%); - background-image: -o-linear-gradient(#eee 1%, #fff 15%); - background-image: linear-gradient(#eee 1%, #fff 15%); - cursor: text -} -.chosen-container-multi .chosen-choices li { - float: left; - list-style: none -} -.chosen-container-multi .chosen-choices li.search-field { - margin: 0; - padding: 0; - white-space: nowrap -} -.chosen-container-multi .chosen-choices li.search-field input[type=text] { - margin: 1px 0; - padding: 5px; - height: 15px; - outline: 0; - border: 0!important; - background: 0 0!important; - box-shadow: none; - color: #666; - font-size: 100%; - font-family: sans-serif; - line-height: normal; - border-radius: 0 -} -.chosen-container-multi .chosen-choices li.search-field .default { - color: #999 -} -.chosen-container-multi .chosen-choices li.search-choice { - position: relative; - margin: 3px 0 3px 5px; - padding: 3px 20px 3px 5px; - border: 1px solid #aaa; - border-radius: 3px; - background-color: #e4e4e4; - background-image: -webkit-gradient(linear, 50% 0, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee)); - background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); - background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); - background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); - background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); - background-clip: padding-box; - box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, .05); - color: #333; - line-height: 13px; - cursor: default -} -.chosen-container-multi .chosen-choices li.search-choice .search-choice-close { - position: absolute; - top: 4px; - right: 3px; - display: block; - width: 12px; - height: 12px; - background: url(../images/chosen-sprite.png) -42px 1px no-repeat; - font-size: 1px -} -.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover { - background-position: -42px -10px -} -.chosen-container-multi .chosen-choices li.search-choice-disabled { - padding-right: 5px; - border: 1px solid #ccc; - background-color: #e4e4e4; - background-image: -webkit-gradient(linear, 50% 0, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee)); - background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); - background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); - background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); - background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); - color: #666 -} -.chosen-container-multi .chosen-choices li.search-choice-focus { - background: #d4d4d4 -} -.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close { - background-position: -42px -10px -} -.chosen-container-multi .chosen-results { - margin: 0; - padding: 0 -} -.chosen-container-multi .chosen-drop .result-selected { - display: list-item; - color: #ccc; - cursor: default -} -.chosen-container-active .chosen-single { - border: 1px solid #5897fb; - box-shadow: 0 0 5px rgba(0, 0, 0, .3) -} -.chosen-container-active.chosen-with-drop .chosen-single { - border: 1px solid #aaa; - -moz-border-radius-bottomright: 0; - border-bottom-right-radius: 0; - -moz-border-radius-bottomleft: 0; - border-bottom-left-radius: 0; - background-image: -webkit-gradient(linear, 50% 0, 50% 100%, color-stop(20%, #eee), color-stop(80%, #fff)); - background-image: -webkit-linear-gradient(#eee 20%, #fff 80%); - background-image: -moz-linear-gradient(#eee 20%, #fff 80%); - background-image: -o-linear-gradient(#eee 20%, #fff 80%); - background-image: linear-gradient(#eee 20%, #fff 80%); - box-shadow: 0 1px 0 #fff inset -} -.chosen-container-active.chosen-with-drop .chosen-single div { - border-left: none; - background: 0 0 -} -.chosen-container-active.chosen-with-drop .chosen-single div b { - background-position: -18px 2px -} -.chosen-container-active .chosen-choices { - border: 1px solid #5897fb; - box-shadow: 0 0 5px rgba(0, 0, 0, .3) -} -.chosen-container-active .chosen-choices li.search-field input[type=text] { - color: #111!important -} -.chosen-disabled { - opacity: .5!important; - cursor: default -} -.chosen-disabled .chosen-choices .search-choice .search-choice-close, -.chosen-disabled .chosen-single { - cursor: default -} -.chosen-rtl { - text-align: right -} -.chosen-rtl .chosen-single { - overflow: visible; - padding: 0 8px 0 0 -} -.chosen-rtl .chosen-single span { - margin-right: 0; - margin-left: 26px; - direction: rtl -} -.chosen-rtl .chosen-single-with-deselect span { - margin-left: 38px -} -.chosen-rtl .chosen-single div { - right: auto; - left: 3px -} -.chosen-rtl .chosen-single abbr { - right: auto; - left: 26px -} -.chosen-rtl .chosen-choices li { - float: right -} -.chosen-rtl .chosen-choices li.search-field input[type=text] { - direction: rtl -} -.chosen-rtl .chosen-choices li.search-choice { - margin: 3px 5px 3px 0; - padding: 3px 5px 3px 19px -} -.chosen-rtl .chosen-choices li.search-choice .search-choice-close { - right: auto; - left: 4px -} -.chosen-rtl .chosen-drop, -.chosen-rtl.chosen-container-single-nosearch .chosen-search { - left: 9999px -} -.chosen-rtl.chosen-container-single .chosen-results { - margin: 0 0 4px 4px; - padding: 0 4px 0 0 -} -.chosen-rtl .chosen-results li.group-option { - padding-right: 15px; - padding-left: 0 -} -.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div { - border-right: none -} -.chosen-rtl .chosen-search input[type=text] { - padding: 4px 5px 4px 20px; - background: url(../images/chosen-sprite.png) -30px -20px no-repeat #fff; - background: url(../images/chosen-sprite.png) -30px -20px no-repeat, -webkit-gradient(linear, 50% 0, 50% 100%, color-stop(1%, #eee), color-stop(15%, #fff)); - background: url(../images/chosen-sprite.png) -30px -20px no-repeat, -webkit-linear-gradient(#eee 1%, #fff 15%); - background: url(../images/chosen-sprite.png) -30px -20px no-repeat, -moz-linear-gradient(#eee 1%, #fff 15%); - background: url(../images/chosen-sprite.png) -30px -20px no-repeat, -o-linear-gradient(#eee 1%, #fff 15%); - background: url(../images/chosen-sprite.png) -30px -20px no-repeat, linear-gradient(#eee 1%, #fff 15%); - direction: rtl -} -.chosen-rtl.chosen-container-single .chosen-single div b { - background-position: 6px 2px -} -.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b { - background-position: -12px 2px -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), -only screen and (min-resolution: 144dpi) { - .chosen-container .chosen-results-scroll-down span, - .chosen-container .chosen-results-scroll-up span, - .chosen-container-multi .chosen-choices .search-choice .search-choice-close, - .chosen-container-single .chosen-search input[type=text], - .chosen-container-single .chosen-single abbr, - .chosen-container-single .chosen-single div b, - .chosen-rtl .chosen-search input[type=text] { - background-image: url(../images/chosen-sprite@2x.png)!important; - background-size: 52px 37px!important; - background-repeat: no-repeat!important - } -} -#cc_list_chosen .search-field input { - width: 100% !important; -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/cbl-admin.min.css b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/cbl-admin.min.css deleted file mode 100644 index ae867f4f..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/cbl-admin.min.css +++ /dev/null @@ -1,2 +0,0 @@ -/* phpcs:ignoreFile */ -span.search label{font-size:1em !important;float:left !important}label.billing{width:75px !important;margin-left:1px !important}label.shipping{margin-left:0 !important}.chosen-container-multi .chosen-choices .search-field input{height:21px !important}.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;zoom:1;user-select:none}.chosen-container .chosen-drop{position:absolute;top:100%;left:-9999px;z-index:1010;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15)}.chosen-container.chosen-with-drop .chosen-drop{left:0}.chosen-container a{cursor:pointer}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:26px;border:1px solid #aaa;border-radius:5px;background-color:#fff;background:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#fff),color-stop(50%,#f6f6f6),color-stop(52%,#eee),color-stop(100%,#f4f4f4));background:-webkit-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-moz-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-o-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:26px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;background:url(../images/chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-single .chosen-single abbr:hover,.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%;background:url(../images/chosen-sprite.png) 0 2px no-repeat}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;background:url(../images/chosen-sprite.png) 100% -20px no-repeat #fff;background:url(../images/chosen-sprite.png) 100% -20px no-repeat,-webkit-gradient(linear,50% 0,50% 100%,color-stop(1%,#eee),color-stop(15%,#fff));background:url(../images/chosen-sprite.png) 100% -20px no-repeat,-webkit-linear-gradient(#eee 1%,#fff 15%);background:url(../images/chosen-sprite.png) 100% -20px no-repeat,-moz-linear-gradient(#eee 1%,#fff 15%);background:url(../images/chosen-sprite.png) 100% -20px no-repeat,-o-linear-gradient(#eee 1%,#fff 15%);background:url(../images/chosen-sprite.png) 100% -20px no-repeat,linear-gradient(#eee 1%,#fff 15%);font-size:1em;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-single .chosen-drop{margin-top:-1px;border-radius:0 0 4px 4px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#3875d7;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#3875d7),color-stop(90%,#2a62bc));background-image:-webkit-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-moz-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-o-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:linear-gradient(#3875d7 20%,#2a62bc 90%);color:#fff}.chosen-container .chosen-results li.no-results{display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;width:100%;height:auto !important;height:1%;border:1px solid #aaa;background-color:#fff;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(1%,#eee),color-stop(15%,#fff));background-image:-webkit-linear-gradient(#eee 1%,#fff 15%);background-image:-moz-linear-gradient(#eee 1%,#fff 15%);background-image:-o-linear-gradient(#eee 1%,#fff 15%);background-image:linear-gradient(#eee 1%,#fff 15%);cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:5px;height:15px;outline:0;border:0 !important;background:0 0 !important;box-shadow:none;color:#666;font-size:100%;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-multi .chosen-choices li.search-field .default{color:#999}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 0 3px 5px;padding:3px 20px 3px 5px;border:1px solid #aaa;border-radius:3px;background-color:#e4e4e4;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-clip:padding-box;box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);color:#333;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:3px;display:block;width:12px;height:12px;background:url(../images/chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{background-position:-42px -10px}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #aaa;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#eee),color-stop(80%,#fff));background-image:-webkit-linear-gradient(#eee 20%,#fff 80%);background-image:-moz-linear-gradient(#eee 20%,#fff 80%);background-image:-o-linear-gradient(#eee 20%,#fff 80%);background-image:linear-gradient(#eee 20%,#fff 80%);box-shadow:0 1px 0 #fff inset}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:0;background:0}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#111 !important}.chosen-disabled{opacity:.5 !important;cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close,.chosen-disabled .chosen-single{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl .chosen-drop,.chosen-rtl.chosen-container-single-nosearch .chosen-search{left:9999px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:0}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;background:url(../images/chosen-sprite.png) -30px -20px no-repeat #fff;background:url(../images/chosen-sprite.png) -30px -20px no-repeat,-webkit-gradient(linear,50% 0,50% 100%,color-stop(1%,#eee),color-stop(15%,#fff));background:url(../images/chosen-sprite.png) -30px -20px no-repeat,-webkit-linear-gradient(#eee 1%,#fff 15%);background:url(../images/chosen-sprite.png) -30px -20px no-repeat,-moz-linear-gradient(#eee 1%,#fff 15%);background:url(../images/chosen-sprite.png) -30px -20px no-repeat,-o-linear-gradient(#eee 1%,#fff 15%);background:url(../images/chosen-sprite.png) -30px -20px no-repeat,linear-gradient(#eee 1%,#fff 15%);direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-resolution:144dpi){.chosen-container .chosen-results-scroll-down span,.chosen-container .chosen-results-scroll-up span,.chosen-container-multi .chosen-choices .search-choice .search-choice-close,.chosen-container-single .chosen-search input[type=text],.chosen-container-single .chosen-single abbr,.chosen-container-single .chosen-single div b,.chosen-rtl .chosen-search input[type=text]{background-image:url(../images/chosen-sprite@2x.png) !important;background-size:52px 37px !important;background-repeat:no-repeat !important}}#cc_list_chosen .search-field input{width:100% !important} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/jquery-ui-timepicker-addon.css b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/jquery-ui-timepicker-addon.css deleted file mode 100644 index 7c62ee84..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/jquery-ui-timepicker-addon.css +++ /dev/null @@ -1,30 +0,0 @@ -.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } -.ui-timepicker-div dl { text-align: left; } -.ui-timepicker-div dl dt { float: left; clear:left; padding: 0 0 0 5px; } -.ui-timepicker-div dl dd { margin: 0 10px 10px 40%; } -.ui-timepicker-div td { font-size: 90%; } -.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } -.ui-timepicker-div .ui_tpicker_unit_hide{ display: none; } - -.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input { background: none; color: inherit; border: none; outline: none; border-bottom: solid 1px #555; width: 95%; } -.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input:focus { border-bottom-color: #aaa; } - -.ui-timepicker-rtl{ direction: rtl; } -.ui-timepicker-rtl dl { text-align: right; padding: 0 5px 0 0; } -.ui-timepicker-rtl dl dt{ float: right; clear: right; } -.ui-timepicker-rtl dl dd { margin: 0 40% 10px 10px; } - -/* Shortened version style */ -.ui-timepicker-div.ui-timepicker-oneLine { padding-right: 2px; } -.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time, -.ui-timepicker-div.ui-timepicker-oneLine dt { display: none; } -.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label { display: block; padding-top: 2px; } -.ui-timepicker-div.ui-timepicker-oneLine dl { text-align: right; } -.ui-timepicker-div.ui-timepicker-oneLine dl dd, -.ui-timepicker-div.ui-timepicker-oneLine dl dd > div { display:inline-block; margin:0; } -.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_minute:before, -.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before { content:':'; display:inline-block; } -.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before, -.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before { content:'.'; display:inline-block; } -.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide, -.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{ display: none; } diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/jquery-ui-timepicker-addon.min.css b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/jquery-ui-timepicker-addon.min.css deleted file mode 100644 index bd5f9c00..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/jquery-ui-timepicker-addon.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/* phpcs:ignoreFile */ -/*! jQuery Timepicker Addon - v1.6.3 - 2016-04-20 -* http://trentrichardson.com/examples/timepicker -* Copyright (c) 2016 Trent Richardson; Licensed MIT */ - -.ui-timepicker-div .ui-widget-header{margin-bottom:8px}.ui-timepicker-div dl{text-align:left}.ui-timepicker-div dl dt{float:left;clear:left;padding:0 0 0 5px}.ui-timepicker-div dl dd{margin:0 10px 10px 40%}.ui-timepicker-div td{font-size:90%}.ui-tpicker-grid-label{background:0 0;border:0;margin:0;padding:0}.ui-timepicker-div .ui_tpicker_unit_hide{display:none}.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input{background:0 0;color:inherit;border:0;outline:0;border-bottom:solid 1px #555;width:95%}.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input:focus{border-bottom-color:#aaa}.ui-timepicker-rtl{direction:rtl}.ui-timepicker-rtl dl{text-align:right;padding:0 5px 0 0}.ui-timepicker-rtl dl dt{float:right;clear:right}.ui-timepicker-rtl dl dd{margin:0 40% 10px 10px}.ui-timepicker-div.ui-timepicker-oneLine{padding-right:2px}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time,.ui-timepicker-div.ui-timepicker-oneLine dt{display:none}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label{display:block;padding-top:2px}.ui-timepicker-div.ui-timepicker-oneLine dl{text-align:right}.ui-timepicker-div.ui-timepicker-oneLine dl dd,.ui-timepicker-div.ui-timepicker-oneLine dl dd>div{display:inline-block;margin:0}.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_minute:before,.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before{content:':';display:inline-block}.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before,.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before{content:'.';display:inline-block}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide,.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{display:none} \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupon-designs.css b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupon-designs.css deleted file mode 100644 index e6a40451..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupon-designs.css +++ /dev/null @@ -1,2 +0,0 @@ -/* phpcs:ignoreFile */ -#sc-cc html{line-height:1.15;-webkit-text-size-adjust:100%}#sc-cc body{margin:0}#sc-cc a{background-color:transparent}#sc-cc b{font-weight:bolder}#sc-cc sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;top:-.5em}#sc-cc img{border-style:none}#sc-cc button,#sc-cc input{font-family:inherit;font-size:100%;line-height:1.15;margin:0;overflow:visible}#sc-cc button{text-transform:none}#sc-cc [type=button],#sc-cc button{-webkit-appearance:button}#sc-cc [type=button]::-moz-focus-inner,#sc-cc button::-moz-focus-inner{border-style:none;padding:0}#sc-cc [type=button]:-moz-focusring,#sc-cc button:-moz-focusring{outline:1px dotted ButtonText}#sc-cc [hidden]{display:none}#sc-cc h2{margin:0}#sc-cc button{background-color:transparent;background-image:none}#sc-cc button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}#sc-cc html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}#sc-cc *,#sc-cc :after,#sc-cc :before{box-sizing:border-box;border:0 solid #d2d6dc}#sc-cc img{border-style:solid}#sc-cc input::-moz-placeholder{color:#a0aec0}#sc-cc input:-ms-input-placeholder{color:#a0aec0}#sc-cc input::placeholder{color:#a0aec0}#sc-cc button{cursor:pointer}#sc-cc h2{font-size:inherit;font-weight:inherit}#sc-cc a{color:inherit;text-decoration:inherit}#sc-cc button,#sc-cc input{padding:0;line-height:inherit;color:inherit}#sc-cc img,#sc-cc svg{display:block;vertical-align:middle}#sc-cc img{max-width:100%;height:auto}#sc-cc .space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px*(1 - var(--space-y-reverse)));margin-bottom:calc(0px*var(--space-y-reverse))}#sc-cc .space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.25rem*var(--space-y-reverse))}#sc-cc .space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0.25rem*var(--space-x-reverse));margin-left:calc(0.25rem*(1 - var(--space-x-reverse)))}#sc-cc .space-y-0\.5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.125rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.125rem*var(--space-y-reverse))}#sc-cc .bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}#sc-cc .border-transparent{border-color:transparent}#sc-cc .hover\:border-gray-600:hover{--border-opacity:1;border-color:#4b5563;border-color:rgba(75,85,99,var(--border-opacity))}#sc-cc .hover\:border-gray-700:hover{--border-opacity:1;border-color:#374151;border-color:rgba(55,65,81,var(--border-opacity))}#sc-cc .rounded-sm{border-radius:.125rem}#sc-cc .rounded{border-radius:.25rem}#sc-cc .rounded-md{border-radius:.375rem}#sc-cc .rounded-full{border-radius:9999px}#sc-cc .border-dashed{border-style:dashed}#sc-cc .border-dotted{border-style:dotted}#sc-cc .hover\:border-solid:hover{border-style:solid}#sc-cc .hover\:border-dashed:hover{border-style:dashed}#sc-cc .border-2{border-width:2px}#sc-cc .border{border-width:1px}#sc-cc .border-t{border-top-width:1px}#sc-cc .border-b{border-bottom-width:1px}#sc-cc .border-l{border-left-width:1px}#sc-cc .cursor-pointer{cursor:pointer}#sc-cc .inline-block{display:inline-block}#sc-cc .flex{display:flex}#sc-cc .inline-flex{display:inline-flex}#sc-cc .hidden{display:none}#sc-cc .flex-row-reverse{flex-direction:row-reverse}#sc-cc .flex-col{flex-direction:column}#sc-cc .items-start{align-items:flex-start}#sc-cc .items-center{align-items:center}#sc-cc .justify-between{justify-content:space-between}#sc-cc .flex-1{flex:1 1 0%}#sc-cc .flex-shrink-0{flex-shrink:0}#sc-cc .float-right{float:right}#sc-cc .font-mono{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}#sc-cc .font-semibold{font-weight:600}#sc-cc .font-bold{font-weight:700}#sc-cc .h-5{height:1.25rem}#sc-cc .h-6{height:1.5rem}#sc-cc .h-7{height:1.75rem}#sc-cc .h-8{height:2rem}#sc-cc .h-9{height:2.25rem}#sc-cc .h-15{height:3.75rem}#sc-cc .h-24{height:6rem}#sc-cc .h-full{height:100%}#sc-cc .text-xs{font-size:.75rem}#sc-cc .text-sm{font-size:.875rem}#sc-cc .text-base{font-size:1rem}#sc-cc .text-lg{font-size:1.125rem}#sc-cc .text-xl{font-size:1.25rem}#sc-cc .text-4xl{font-size:2.25rem}#sc-cc .leading-4{line-height:1rem}#sc-cc .leading-6{line-height:1.5rem}#sc-cc .leading-none{line-height:1}#sc-cc .leading-tight{line-height:1.25}#sc-cc .m-1{margin:.25rem}#sc-cc .mx-1{margin-left:.25rem;margin-right:.25rem}#sc-cc .mx-2{margin-left:.5rem;margin-right:.5rem}#sc-cc .my-5{margin-top:1.25rem;margin-bottom:1.25rem}#sc-cc .mx-auto{margin-left:auto;margin-right:auto}#sc-cc .mx-1\/12{margin-left:8.333333%;margin-right:8.333333%}#sc-cc .mt-0{margin-top:0}#sc-cc .mt-1{margin-top:.25rem}#sc-cc .mr-1{margin-right:.25rem}#sc-cc .mb-1{margin-bottom:.25rem}#sc-cc .ml-1{margin-left:.25rem}#sc-cc .mr-2{margin-right:.5rem}#sc-cc .mb-2{margin-bottom:.5rem}#sc-cc .ml-2{margin-left:.5rem}#sc-cc .mr-3{margin-right:.75rem}#sc-cc .ml-3{margin-left:.75rem}#sc-cc .mb-4{margin-bottom:1rem}#sc-cc .mt-0\.5{margin-top:.125rem}#sc-cc .mb-1\.5{margin-bottom:.375rem}#sc-cc .-mt-1{margin-top:-.25rem}#sc-cc .-mb-1{margin-bottom:-.25rem}#sc-cc .-mt-0\.5{margin-top:-.125rem}#sc-cc .-mb-1\.5{margin-bottom:-.375rem}#sc-cc .max-w-xs{max-width:20rem}#sc-cc .max-w-sm{max-width:24rem}#sc-cc .max-w-7xl{max-width:80rem}#sc-cc .object-cover{-o-object-fit:cover;object-fit:cover}#sc-cc .overflow-hidden{overflow:hidden}#sc-cc .p-0{padding:0}#sc-cc .p-1{padding:.25rem}#sc-cc .p-2{padding:.5rem}#sc-cc .p-8{padding:2rem}#sc-cc .p-0\.5{padding:.125rem}#sc-cc .py-0{padding-top:0;padding-bottom:0}#sc-cc .py-1{padding-top:.25rem;padding-bottom:.25rem}#sc-cc .px-1{padding-left:.25rem;padding-right:.25rem}#sc-cc .px-2{padding-left:.5rem;padding-right:.5rem}#sc-cc .py-0\.5{padding-top:.125rem;padding-bottom:.125rem}#sc-cc .pt-0{padding-top:0}#sc-cc .pb-0{padding-bottom:0}#sc-cc .pt-1{padding-top:.25rem}#sc-cc .pl-2{padding-left:.5rem}#sc-cc .pt-4{padding-top:1rem}#sc-cc .pt-0\.5{padding-top:.125rem}#sc-cc .pb-0\.5{padding-bottom:.125rem}#sc-cc .pl-2\.5{padding-left:.625rem}#sc-cc .absolute{position:absolute}#sc-cc .relative{position:relative}#sc-cc .right-0{right:0}#sc-cc .bottom-0{bottom:0}#sc-cc .top-2{top:.5rem}#sc-cc .left-14{left:3.5rem}#sc-cc .hover\:shadow:hover,#sc-cc .shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}#sc-cc .text-center{text-align:center}#sc-cc .text-gray-600{--text-opacity:1;color:#4b5563;color:rgba(75,85,99,var(--text-opacity))}#sc-cc .text-gray-800{--text-opacity:1;color:#252f3f;color:rgba(37,47,63,var(--text-opacity))}#sc-cc .text-blue-600{--text-opacity:1;color:#1c64f2;color:rgba(28,100,242,var(--text-opacity))}#sc-cc .uppercase{text-transform:uppercase}#sc-cc .underline{text-decoration:underline}#sc-cc .whitespace-no-wrap{white-space:nowrap}#sc-cc .w-5{width:1.25rem}#sc-cc .w-6{width:1.5rem}#sc-cc .w-8{width:2rem}#sc-cc .w-9{width:2.25rem}#sc-cc .w-15{width:3.75rem}#sc-cc .w-16{width:4rem}#sc-cc .w-24{width:6rem}#sc-cc .w-full{width:100%}#sc-cc .z-10{z-index:10}#sc-cc .gap-1{grid-gap:.25rem;gap:.25rem}#sc-cc .gap-2{grid-gap:.5rem;gap:.5rem}#sc-cc .gap-3{grid-gap:.75rem;gap:.75rem}#sc-cc .transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}#sc-cc .hover\:scale-105:hover{--transform-scale-x:1.05;--transform-scale-y:1.05}#sc-cc .-rotate-90{--transform-rotate:-90deg}#sc-cc .hover\:-translate-y-1:hover{--transform-translate-y:-0.25rem}#sc-cc .transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}#sc-cc .ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}#sc-cc .duration-100{transition-duration:.1s}@-webkit-keyframes spin{to{transform:rotate(1turn)}}@keyframes spin{to{transform:rotate(1turn)}}@-webkit-keyframes ping{75%,to{transform:scale(2);opacity:0}}@keyframes ping{75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}#sc-cc{line-height:1.15;-webkit-text-size-adjust:100%;margin:0}#sc-cc .sc-coupons-list{display:flex;flex-wrap:wrap;align-items:center;grid-gap:1rem;gap:1rem}@media (min-width:768px){#sc-cc .sc-coupons-list{grid-gap:2rem;gap:2rem}}#sc-cc .sc-coupon{position:relative;overflow:hidden;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;cursor:pointer;min-width:160px;max-width:300px}@media print{#sc-cc .wc-sc-print-coupons-wrapper{display:table}#sc-cc .sc-coupon{display:inline-block;page-break-inside:avoid;margin:.8rem 1rem;border:1px solid #ccc !important}} \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupon.css b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupon.css deleted file mode 100644 index 5895a4ec..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupon.css +++ /dev/null @@ -1,437 +0,0 @@ -/* Smart Coupons Style */ -.coupon-container { - line-height: 1.4em; - position: relative; - display: inline-table; - margin: 2px; - padding: .55em; - cursor: pointer; - text-align: center; - box-shadow: 0 0 5px #e0e0e0; -} - -.coupon-container.previews { - cursor: inherit; -} - -.coupon-content { - padding: .2em 1.2em; -} - -.coupon-content .code { - font-family: monospace; - font-size: 1.2em; - font-weight: 700; -} - -.coupon-content .coupon-expire, -.coupon-content .discount-info { - font-family: Helvetica, Arial, sans-serif; - font-size: 1em; -} -.coupon-content .discount-description { - font: .7em/1 Helvetica, Arial, sans-serif; - display: inline-block; - margin: 10px inherit; -} - -.wc-sc-coupon-style-preview .coupon-container { - display: inline-block; -} - -span.wc-sc-coupon-preview-container { - position: absolute; - display: inline-block; - margin: 0 0 0 1em; - font-size: initial; -} - -.wc_sc_custom_design_css_doc_div { - margin: 15px 0; -} - -/*Shortcode fields*/ -#coupon-selector #coupon-option label span { - display: inline-block; - width: 100px; -} -#coupon-selector #coupon-option label select { - width: 175px; - margin-bottom: 6px; - margin-left: -.2em; -} -div#sc_shortcode_update { - float: right; - - margin-top: -5px; -} -form#sc_coupons_attributes { - padding: 0 1em 1em; -} -div#coupon-selector { - float: left; - padding: 1em 1em 1em 0; - border-right: 1px solid #e6e6e6; -} -.coupon-preview { - float: left; - width: 175px; - padding: 1em 0 1em 1em; -} -.preview-heading { - font-size: 15px; - padding-bottom: 10px; - text-align: center; -} -#search-panel { - overflow-x: hidden; - width: 275px; - min-height: 80px; - max-height: 110px; - margin: 5px 0; - color: #333; - border: 1px solid #d4d4d4; - background-color: #fff; -} -#coupon-option #search-panel #search-results span { - width: 100%; - margin-left: 10px; -} -#search-results ul { - margin: 5px -2px; -} -#search-results ul li { - font-size: 12px; - margin-bottom: -1px; - padding: 3px 15px; - cursor: pointer; - border: 1px solid #f2f2f2; -} -#search-results ul li:hover { - color: #000; - background-color: #eaf2fa; -} -#coupon-option #search-panel #search-results ul li span { - width: 0; - color: #f00; -} -#sc_coupons_attributes .submitbox { - clear: both; -} -#default-text { - font-style: italic; - margin-bottom: -5px; - padding: 2px; - text-align: center; - background-color: #f2f2f2; -} - -/* Gift Cerificate form */ -input.gift_receiver_email, input.gift_sending_date_time { - min-width: 100%; - margin: 1% 0; -} -div#gift-certificate-receiver-form thead th { - text-align: center; -} -input#deliver_on_date { - text-align: center; -} -.email_sending_date_time_wrapper:not(.show), -.wc_sc_schedule_gift_sending_wrapper:not(.show) { - display: none; -} - -.wc_sc_schedule_gift_sending_wrapper.show { - margin-left: 2em; -} - -/* Coupon generation form */ -form#generate_coupons p.form-field input[type=text] { - width: 30%; -} -form#generate_coupons p.form-field input[type=number] { - width: 15%; -} -form#generate_coupons p.form-field input[name="wc_sc_max_discount"] { - width: 30%; -} -div.gift-certificate-receiver-detail-form, -div#gift-certificate-receiver-form-multi { - display: none; -} -a#single_multi { - float: right; -} - -.sc_info_box { - overflow: hidden; - margin-bottom: 2em !important; - padding: .5em 1em 0 !important; - background-color: #f7f6f7; -} -tr.wc_sc_custom_design_css_wrapper .CodeMirror + span.wc-sc-coupon-preview-container { - top: 15px; -} - -tr.wc_sc_custom_design_css_wrapper td.forminp.forminp-textarea { - position: relative; -} - -tr.wc_sc_custom_design_css_wrapper .CodeMirror { - width: 100%; - max-width: 400px; - height: 200px; -} - -.sc-coupons-list details > summary { - list-style: none; -} - -.sc-coupons-list details > summary::marker, /* Latest Chrome, Edge, Firefox */ -.sc-coupons-list details > summary::-webkit-details-marker /* Safari */ { - display: none; -} - -@media (min-width: 768px) { - .sc_info_box { - float: unset !important; - width: unset !important; - margin-right: unset !important; - padding: .5em 1em 0 !important; - } - - .page-template-template-fullwidth-php .sc_info_box { - float: unset !important; - width: unset !important; - margin-right: unset !important; - margin-left: unset !important; - padding: .5em 1em 0 !important; - } - - /* Fix for positioning 'Sell store credit at less price?' settings' tooltip */ - label[for="smart_coupons_sell_store_credit_at_less_price"] span.woocommerce-help-tip, - label[for="smart_coupons_schedule_store_credit"] span.woocommerce-help-tip { - float: left; - margin: 1px 4px 1px -1.7em !important; - } - - tr.wc_sc_custom_design_css_wrapper .CodeMirror + span.wc-sc-coupon-preview-container { - left: 415px; - } -} - -textarea.gift_receiver_message { - width: 100%; -} - -.form_table { - width: 97%; - padding: 20px 10px; - - border-top: 2px; - border-top-style: solid; - border-top-color: #dbdbdb; -} -.message_row { - width: 100%; -} -.sc_message { - width: 100%; -} -.email_amount { - width: 100%; -} -.gift-certificate-show-form p { - margin: 0; -} -.gift-certificate-show-form lable { - display: inline; -} -.gift-certificate-show-form input[type=radio] { - margin-left: 1em; -} -.show_hide_list { - padding-left: 0; - margin-left: 25px; -} -.single_multi_list { - display: none; -} -div.mce-smart-coupon-shortcode { - cursor: pointer; -} -div.mce-smart-coupon-shortcode i:before { - font-family: 'WooCommerce'; - - content: '\e600'; -} -div[aria-describedby='sc_coupons_attributes'] { - z-index: 1000; -} -.wc_sc_total_available_store_credit { - padding: 1em 0; - - text-align: right; -} -.wc_sc_total_available_store_credit .amount { - font-size: 1.5em; - font-weight: bold; -} -div#invalid_coupons_list div#all_coupon_container .coupon-container { - cursor: initial !important; - - opacity: .5; -} -div#invalid_coupons_list div#all_coupon_container .coupon-container .coupon-content .coupon-expire { - display: none; -} -.variation-sc_called_credit { - display: none; -} - -/* Bulk Generate tab - Coupon Description */ -.sc_bulk_description textarea#woocommerce-coupon-description { - width: 90%; - margin-left: 0.5em; -} - -#call_for_credit { - position: relative; -} - -input#credit_called { - position: absolute; - top: 50%; - transform: translateY(-50%); -} - -.wc-sc-call-for-credit-container .wc-sc-label, -.wc-sc-call-for-credit-container .wc-sc-input { - width: 48%; - float: left; -} - -.wc-sc-call-for-credit-container .wc-sc-row { - position: relative; - margin-top: 1em; -} - -.wc-sc-call-for-credit-container .wc-sc-row:after { - content: ""; - display: table; - clear: both; -} - -.wc-sc-description { - display: inline-block; -} - -#sc-cc input { - border: 1px solid #7e8993; -} - -#sc-cc .sc-truncate { - overflow: hidden; - text-overflow: ellipsis; - height: 2rem; -} - -.forminp-wc_sc_radio_with_html { - border-collapse: initial; -} - -.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design li { - padding: 10px 10px 5px 5px; -} - -.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design li input, -.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design_colors li input { - vertical-align: top; -} - -.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design_colors.custom li input[type="color"] { - opacity: 0; - display: block; - width: 32px; - height: 20px; - border: none; - cursor: pointer; -} - -.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design_colors li span { - display: inline-block; - width: 32px; - height: 20px; - vertical-align: middle; -} - -.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design, -.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design_colors { - margin-top: unset; -} - -.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design li, -.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design_colors li { - cursor: pointer; -} - -.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design_colors li { - display: inline-block; - width: 150px; - padding: 5px; -} - -.forminp-wc_sc_radio_with_html ul li:hover, -.forminp-wc_sc_radio_with_html ul li.selected { - background: #ddd; -} - -.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design { - align-items: unset !important; -} - -@media screen and (max-width: 767px) { - .wc-sc-description { - margin-left: 0; - } - tr.wc_sc_custom_design_css_wrapper .CodeMirror + span.wc-sc-coupon-preview-container { - position: static; - margin-top: 15px; - } -} -@media screen and (min-width: 768px) and (max-width: 799px) { - .wc-sc-description { - margin-left: 5%; - } -} -@media screen and (min-width: 800px) and (max-width: 1023px) { - .wc-sc-description { - margin-left: 7%; - } -} -@media screen and (min-width: 1024px) and (max-width: 1199px) { - .wc-sc-description { - margin-left: 11%; - } -} -@media screen and (min-width: 1200px) and (max-width: 1279px) { - .wc-sc-description { - margin-left: 14%; - } -} -@media screen and (min-width: 1280px) and (max-width: 1365px) { - .wc-sc-description { - margin-left: 15%; - } -} -@media screen and (min-width: 1366px) and (max-width: 1599px) { - .wc-sc-description { - margin-left: 16%; - } -} -@media screen and (min-width: 1600px) { - .wc-sc-description { - margin-left: 20%; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupon.min.css b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupon.min.css deleted file mode 100644 index 05035d13..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupon.min.css +++ /dev/null @@ -1,2 +0,0 @@ -/* phpcs:ignoreFile */ -.coupon-container{line-height:1.4em;position:relative;display:inline-table;margin:2px;padding:.55em;cursor:pointer;text-align:center;box-shadow:0 0 5px #e0e0e0}.coupon-container.previews{cursor:inherit}.coupon-content{padding:.2em 1.2em}.coupon-content .code{font-family:monospace;font-size:1.2em;font-weight:700}.coupon-content .coupon-expire,.coupon-content .discount-info{font-family:Helvetica,Arial,sans-serif;font-size:1em}.coupon-content .discount-description{font:.7em/1 Helvetica,Arial,sans-serif;display:inline-block;margin:10px inherit}.wc-sc-coupon-style-preview .coupon-container{display:inline-block}span.wc-sc-coupon-preview-container{position:absolute;display:inline-block;margin:0 0 0 1em;font-size:initial}.wc_sc_custom_design_css_doc_div{margin:15px 0}#coupon-selector #coupon-option label span{display:inline-block;width:100px}#coupon-selector #coupon-option label select{width:175px;margin-bottom:6px;margin-left:-.2em}div#sc_shortcode_update{float:right;margin-top:-5px}form#sc_coupons_attributes{padding:0 1em 1em}div#coupon-selector{float:left;padding:1em 1em 1em 0;border-right:1px solid #e6e6e6}.coupon-preview{float:left;width:175px;padding:1em 0 1em 1em}.preview-heading{font-size:15px;padding-bottom:10px;text-align:center}#search-panel{overflow-x:hidden;width:275px;min-height:80px;max-height:110px;margin:5px 0;color:#333;border:1px solid #d4d4d4;background-color:#fff}#coupon-option #search-panel #search-results span{width:100%;margin-left:10px}#search-results ul{margin:5px -2px}#search-results ul li{font-size:12px;margin-bottom:-1px;padding:3px 15px;cursor:pointer;border:1px solid #f2f2f2}#search-results ul li:hover{color:#000;background-color:#eaf2fa}#coupon-option #search-panel #search-results ul li span{width:0;color:red}#sc_coupons_attributes .submitbox{clear:both}#default-text{font-style:italic;margin-bottom:-5px;padding:2px;text-align:center;background-color:#f2f2f2}input.gift_receiver_email,input.gift_sending_date_time{min-width:100%;margin:1% 0}div#gift-certificate-receiver-form thead th{text-align:center}input#deliver_on_date{text-align:center}.email_sending_date_time_wrapper:not(.show),.wc_sc_schedule_gift_sending_wrapper:not(.show){display:none}.wc_sc_schedule_gift_sending_wrapper.show{margin-left:2em}form#generate_coupons p.form-field input[type=text]{width:30%}form#generate_coupons p.form-field input[type=number]{width:15%}form#generate_coupons p.form-field input[name=wc_sc_max_discount]{width:30%}div.gift-certificate-receiver-detail-form,div#gift-certificate-receiver-form-multi{display:none}a#single_multi{float:right}.sc_info_box{overflow:hidden;margin-bottom:2em!important;padding:.5em 1em 0!important;background-color:#f7f6f7}tr.wc_sc_custom_design_css_wrapper .CodeMirror+span.wc-sc-coupon-preview-container{top:15px}tr.wc_sc_custom_design_css_wrapper td.forminp.forminp-textarea{position:relative}tr.wc_sc_custom_design_css_wrapper .CodeMirror{width:100%;max-width:400px;height:200px}.sc-coupons-list details>summary{list-style:none}.sc-coupons-list details>summary::marker,.sc-coupons-list details>summary::-webkit-details-marker{display:none}@media(min-width:768px){.sc_info_box{float:unset!important;width:unset!important;margin-right:unset!important;padding:.5em 1em 0!important}.page-template-template-fullwidth-php .sc_info_box{float:unset!important;width:unset!important;margin-right:unset!important;margin-left:unset!important;padding:.5em 1em 0!important}label[for=smart_coupons_sell_store_credit_at_less_price] span.woocommerce-help-tip,label[for=smart_coupons_schedule_store_credit] span.woocommerce-help-tip{float:left;margin:1px 4px 1px -1.7em!important}tr.wc_sc_custom_design_css_wrapper .CodeMirror+span.wc-sc-coupon-preview-container{left:415px}}textarea.gift_receiver_message{width:100%}.form_table{width:97%;padding:20px 10px;border-top:2px;border-top-style:solid;border-top-color:#dbdbdb}.message_row{width:100%}.sc_message{width:100%}.email_amount{width:100%}.gift-certificate-show-form p{margin:0}.gift-certificate-show-form lable{display:inline}.gift-certificate-show-form input[type=radio]{margin-left:1em}.show_hide_list{padding-left:0;margin-left:25px}.single_multi_list{display:none}div.mce-smart-coupon-shortcode{cursor:pointer}div.mce-smart-coupon-shortcode i:before{font-family:woocommerce;content:'\e600'}div[aria-describedby=sc_coupons_attributes]{z-index:1000}.wc_sc_total_available_store_credit{padding:1em 0;text-align:right}.wc_sc_total_available_store_credit .amount{font-size:1.5em;font-weight:700}div#invalid_coupons_list div#all_coupon_container .coupon-container{cursor:initial!important;opacity:.5}div#invalid_coupons_list div#all_coupon_container .coupon-container .coupon-content .coupon-expire{display:none}.variation-sc_called_credit{display:none}.sc_bulk_description textarea#woocommerce-coupon-description{width:90%;margin-left:.5em}#call_for_credit{position:relative}input#credit_called{position:absolute;top:50%;transform:translateY(-50%)}.wc-sc-call-for-credit-container .wc-sc-label,.wc-sc-call-for-credit-container .wc-sc-input{width:48%;float:left}.wc-sc-call-for-credit-container .wc-sc-row{position:relative;margin-top:1em}.wc-sc-call-for-credit-container .wc-sc-row:after{content:"";display:table;clear:both}.wc-sc-description{display:inline-block}#sc-cc input{border:1px solid #7e8993}#sc-cc .sc-truncate{overflow:hidden;text-overflow:ellipsis;height:2rem}.forminp-wc_sc_radio_with_html{border-collapse:initial}.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design li{padding:10px 10px 5px 5px}.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design li input,.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design_colors li input{vertical-align:top}.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design_colors.custom li input[type=color]{opacity:0;display:block;width:32px;height:20px;border:0;cursor:pointer}.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design_colors li span{display:inline-block;width:32px;height:20px;vertical-align:middle}.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design,.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design_colors{margin-top:unset}.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design li,.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design_colors li{cursor:pointer}.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design_colors li{display:inline-block;width:150px;padding:5px}.forminp-wc_sc_radio_with_html ul li:hover,.forminp-wc_sc_radio_with_html ul li.selected{background:#ddd}.forminp-wc_sc_radio_with_html .wc_sc_setting_coupon_design{align-items:unset!important}@media screen and (max-width:767px){.wc-sc-description{margin-left:0}tr.wc_sc_custom_design_css_wrapper .CodeMirror+span.wc-sc-coupon-preview-container{position:static;margin-top:15px}}@media screen and (min-width:768px) and (max-width:799px){.wc-sc-description{margin-left:5%}}@media screen and (min-width:800px) and (max-width:1023px){.wc-sc-description{margin-left:7%}}@media screen and (min-width:1024px) and (max-width:1199px){.wc-sc-description{margin-left:11%}}@media screen and (min-width:1200px) and (max-width:1279px){.wc-sc-description{margin-left:14%}}@media screen and (min-width:1280px) and (max-width:1365px){.wc-sc-description{margin-left:15%}}@media screen and (min-width:1366px) and (max-width:1599px){.wc-sc-description{margin-left:16%}}@media screen and (min-width:1600px){.wc-sc-description{margin-left:20%}} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupons-admin.css b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupons-admin.css deleted file mode 100644 index 776eaaef..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupons-admin.css +++ /dev/null @@ -1,42 +0,0 @@ -/* Smart Coupons Admin CSS */ -.smart-coupons-field, -#sc-share-link, -#sc_coupon_categorydiv, -#sc_coupon_categorydiv ul.category-tabs li.tabs, -#sc_coupon_categorydiv ul.add-menu-item-tabs li.tabs, -#sc_coupon_categorydiv .wp-tab-active, -#sc_coupon_categorydiv div.tabs-panel, -button#export_coupons, -a#wc_sc_print_coupons, -a#sc-manage-category, -#wc-sc-copy-coupon-code { - background-color: #f0fff0; -} -button#export_coupons > span.dashicons, -a#wc_sc_print_coupons > span.dashicons, -a#sc-manage-category > span.dashicons { - transform: translateX(-15%) translateY(15%); -} -div#smart_coupons_tabs h2 { - margin-bottom: 10px; -} -div#smart_coupons_tabs h2 .sc-quick-links { - text-align: right; - font-size: 0.8em; -} -.coupon_title_prefix_suffix_field input { - height: 2em; -} -li.wc_sc_actions_tab a::before { - font-family: WooCommerce !important; - content: '\e01c' !important; -} -div.sc-manage-category { - margin: 10px 0; -} -div.sc-manage-category a { - font-weight: 600; -} -div.smart_coupons_product_options_variable { - display: flow-root; -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupons-admin.min.css b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupons-admin.min.css deleted file mode 100644 index 7d08d344..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/smart-coupons-admin.min.css +++ /dev/null @@ -1,2 +0,0 @@ -/* phpcs:ignoreFile */ -.smart-coupons-field,#sc-share-link,#sc_coupon_categorydiv,#sc_coupon_categorydiv ul.category-tabs li.tabs,#sc_coupon_categorydiv ul.add-menu-item-tabs li.tabs,#sc_coupon_categorydiv .wp-tab-active,#sc_coupon_categorydiv div.tabs-panel,button#export_coupons,a#wc_sc_print_coupons,a#sc-manage-category,#wc-sc-copy-coupon-code{background-color:#f0fff0}button#export_coupons>span.dashicons,a#wc_sc_print_coupons>span.dashicons,a#sc-manage-category>span.dashicons{transform:translateX(-15%) translateY(15%)}div#smart_coupons_tabs h2{margin-bottom:10px}div#smart_coupons_tabs h2 .sc-quick-links{text-align:right;font-size:.8em}.coupon_title_prefix_suffix_field input{height:2em}li.wc_sc_actions_tab a::before{font-family:WooCommerce!important;content:'\e01c'!important}div.sc-manage-category{margin:10px 0}div.sc-manage-category a{font-weight:600}div.smart_coupons_product_options_variable{display:flow-root} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/wc-sc-style-email-coupon.css b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/wc-sc-style-email-coupon.css deleted file mode 100644 index e25a73ff..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/wc-sc-style-email-coupon.css +++ /dev/null @@ -1,22 +0,0 @@ -/* Coupon style for email-coupon */ -.coupon-container.email-coupon .coupon-content { - border: 1px solid !important; - border-style: dashed !important; -} - -.coupon-container.email-coupon { - transition-duration: .3s !important; - transition-property: border-radius !important; - -webkit-transform: perspective(1px) translateZ(0) !important; - transform: perspective(1px) translateZ(0) !important; - - border-radius: .8em !important; - box-shadow: 0 0 1px rgba(0, 0, 0, 0) !important; - display: table; - margin: 0 auto; -} -.coupon-container.email-coupon:hover, -.coupon-container.email-coupon:focus, -.coupon-container.email-coupon:active { - border-radius: 0 !important; -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/wc-sc-style-email-coupon.min.css b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/wc-sc-style-email-coupon.min.css deleted file mode 100644 index 6225290b..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/css/wc-sc-style-email-coupon.min.css +++ /dev/null @@ -1,2 +0,0 @@ -/* phpcs:ignoreFile */ -.coupon-container.email-coupon .coupon-content{border:1px solid !important;border-style:dashed !important}.coupon-container.email-coupon{transition-duration:.3s !important;transition-property:border-radius !important;-webkit-transform:perspective(1px) translateZ(0) !important;transform:perspective(1px) translateZ(0) !important;border-radius:.8em !important;box-shadow:0 0 1px rgba(0,0,0,0) !important;display:table;margin:0 auto}.coupon-container.email-coupon:hover,.coupon-container.email-coupon:focus,.coupon-container.email-coupon:active{border-radius:0 !important} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/cart-discount-alt.svg b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/cart-discount-alt.svg deleted file mode 100644 index 855aaea9..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/cart-discount-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/cart-discount.svg b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/cart-discount.svg deleted file mode 100644 index 5c5a7f3b..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/cart-discount.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/chosen-sprite.png b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/chosen-sprite.png deleted file mode 100644 index 4cb687bc..00000000 Binary files a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/chosen-sprite.png and /dev/null differ diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/chosen-sprite@2x.png b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/chosen-sprite@2x.png deleted file mode 100644 index bd61d963..00000000 Binary files a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/chosen-sprite@2x.png and /dev/null differ diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/delivery-motorcyle.svg b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/delivery-motorcyle.svg deleted file mode 100644 index 71c708a3..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/delivery-motorcyle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/discount-coupon.svg b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/discount-coupon.svg deleted file mode 100644 index 4f0bc603..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/discount-coupon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/gift-card-alt.svg b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/gift-card-alt.svg deleted file mode 100644 index f384551f..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/gift-card-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/gift-voucher-credit-alt.svg b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/gift-voucher-credit-alt.svg deleted file mode 100644 index 5c41b027..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/gift-voucher-credit-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/giftbox-color.svg b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/giftbox-color.svg deleted file mode 100644 index a2399f8e..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/giftbox-color.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/megaphone-announce-color-alt.svg b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/megaphone-announce-color-alt.svg deleted file mode 100644 index 735f8904..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/megaphone-announce-color-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/product-discount-alt.svg b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/product-discount-alt.svg deleted file mode 100644 index 08803cbc..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/product-discount-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/product-package-box.svg b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/product-package-box.svg deleted file mode 100644 index 349b69dd..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/product-package-box.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/sale-splash-tag.svg b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/sale-splash-tag.svg deleted file mode 100644 index ea25989f..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/sale-splash-tag.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/subs-calendar-discount.svg b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/subs-calendar-discount.svg deleted file mode 100644 index 3a3a8d6a..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/subs-calendar-discount.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/subs-discount-voucher.svg b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/subs-discount-voucher.svg deleted file mode 100644 index dd9d927e..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/images/subs-discount-voucher.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/js/chosen.jquery.js b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/js/chosen.jquery.js deleted file mode 100644 index 884a041e..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/js/chosen.jquery.js +++ /dev/null @@ -1,1236 +0,0 @@ -/* phpcs:ignoreFile */ -/*! -Chosen, a Select Box Enhancer for jQuery and Prototype -by Patrick Filler for Harvest, http://getharvest.com - -Version 1.1.0 -Full source at https://github.com/harvesthq/chosen -Copyright (c) 2011 Harvest http://getharvest.com - -MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md -This file is generated by `grunt build`, do not edit it by hand. -*/ - -(function() { - var $, AbstractChosen, Chosen, SelectParser, _ref, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - SelectParser = (function() { - function SelectParser() { - this.options_index = 0; - this.parsed = []; - } - - SelectParser.prototype.add_node = function(child) { - if (child.nodeName.toUpperCase() === "OPTGROUP") { - return this.add_group(child); - } else { - return this.add_option(child); - } - }; - - SelectParser.prototype.add_group = function(group) { - var group_position, option, _i, _len, _ref, _results; - group_position = this.parsed.length; - this.parsed.push({ - array_index: group_position, - group: true, - label: this.escapeExpression(group.label), - children: 0, - disabled: group.disabled - }); - _ref = group.childNodes; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - option = _ref[_i]; - _results.push(this.add_option(option, group_position, group.disabled)); - } - return _results; - }; - - SelectParser.prototype.add_option = function(option, group_position, group_disabled) { - if (option.nodeName.toUpperCase() === "OPTION") { - if (option.text !== "") { - if (group_position != null) { - this.parsed[group_position].children += 1; - } - this.parsed.push({ - array_index: this.parsed.length, - options_index: this.options_index, - value: option.value, - text: option.text, - html: option.innerHTML, - selected: option.selected, - disabled: group_disabled === true ? group_disabled : option.disabled, - group_array_index: group_position, - classes: option.className, - style: option.style.cssText - }); - } else { - this.parsed.push({ - array_index: this.parsed.length, - options_index: this.options_index, - empty: true - }); - } - return this.options_index += 1; - } - }; - - SelectParser.prototype.escapeExpression = function(text) { - var map, unsafe_chars; - if ((text == null) || text === false) { - return ""; - } - if (!/[\&\<\>\"\'\`]/.test(text)) { - return text; - } - map = { - "<": "<", - ">": ">", - '"': """, - "'": "'", - "`": "`" - }; - unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g; - return text.replace(unsafe_chars, function(chr) { - return map[chr] || "&"; - }); - }; - - return SelectParser; - - })(); - - SelectParser.select_to_array = function(select) { - var child, parser, _i, _len, _ref; - parser = new SelectParser(); - _ref = select.childNodes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - parser.add_node(child); - } - return parser.parsed; - }; - - AbstractChosen = (function() { - function AbstractChosen(form_field, options) { - this.form_field = form_field; - this.options = options != null ? options : {}; - if (!AbstractChosen.browser_is_supported()) { - return; - } - this.is_multiple = this.form_field.multiple; - this.set_default_text(); - this.set_default_values(); - this.setup(); - this.set_up_html(); - this.register_observers(); - } - - AbstractChosen.prototype.set_default_values = function() { - var _this = this; - this.click_test_action = function(evt) { - return _this.test_active_click(evt); - }; - this.activate_action = function(evt) { - return _this.activate_field(evt); - }; - this.active_field = false; - this.mouse_on_container = false; - this.results_showing = false; - this.result_highlighted = null; - this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false; - this.disable_search_threshold = this.options.disable_search_threshold || 0; - this.disable_search = this.options.disable_search || false; - this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true; - this.group_search = this.options.group_search != null ? this.options.group_search : true; - this.search_contains = this.options.search_contains || false; - this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true; - this.max_selected_options = this.options.max_selected_options || Infinity; - this.inherit_select_classes = this.options.inherit_select_classes || false; - this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true; - return this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true; - }; - - AbstractChosen.prototype.set_default_text = function() { - if (this.form_field.getAttribute("data-placeholder")) { - this.default_text = this.form_field.getAttribute("data-placeholder"); - } else if (this.is_multiple) { - this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text; - } else { - this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text; - } - return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text; - }; - - AbstractChosen.prototype.mouse_enter = function() { - return this.mouse_on_container = true; - }; - - AbstractChosen.prototype.mouse_leave = function() { - return this.mouse_on_container = false; - }; - - AbstractChosen.prototype.input_focus = function(evt) { - var _this = this; - if (this.is_multiple) { - if (!this.active_field) { - return setTimeout((function() { - return _this.container_mousedown(); - }), 50); - } - } else { - if (!this.active_field) { - return this.activate_field(); - } - } - }; - - AbstractChosen.prototype.input_blur = function(evt) { - var _this = this; - if (!this.mouse_on_container) { - this.active_field = false; - return setTimeout((function() { - return _this.blur_test(); - }), 100); - } - }; - - AbstractChosen.prototype.results_option_build = function(options) { - var content, data, _i, _len, _ref; - content = ''; - _ref = this.results_data; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - data = _ref[_i]; - if (data.group) { - content += this.result_add_group(data); - } else { - content += this.result_add_option(data); - } - if (options != null ? options.first : void 0) { - if (data.selected && this.is_multiple) { - this.choice_build(data); - } else if (data.selected && !this.is_multiple) { - this.single_set_selected_text(data.text); - } - } - } - return content; - }; - - AbstractChosen.prototype.result_add_option = function(option) { - var classes, option_el; - if (!option.search_match) { - return ''; - } - if (!this.include_option_in_results(option)) { - return ''; - } - classes = []; - if (!option.disabled && !(option.selected && this.is_multiple)) { - classes.push("active-result"); - } - if (option.disabled && !(option.selected && this.is_multiple)) { - classes.push("disabled-result"); - } - if (option.selected) { - classes.push("result-selected"); - } - if (option.group_array_index != null) { - classes.push("group-option"); - } - if (option.classes !== "") { - classes.push(option.classes); - } - option_el = document.createElement("li"); - option_el.className = classes.join(" "); - option_el.style.cssText = option.style; - option_el.setAttribute("data-option-array-index", option.array_index); - option_el.innerHTML = option.search_text; - return this.outerHTML(option_el); - }; - - AbstractChosen.prototype.result_add_group = function(group) { - var group_el; - if (!(group.search_match || group.group_match)) { - return ''; - } - if (!(group.active_options > 0)) { - return ''; - } - group_el = document.createElement("li"); - group_el.className = "group-result"; - group_el.innerHTML = group.search_text; - return this.outerHTML(group_el); - }; - - AbstractChosen.prototype.results_update_field = function() { - this.set_default_text(); - if (!this.is_multiple) { - this.results_reset_cleanup(); - } - this.result_clear_highlight(); - this.results_build(); - if (this.results_showing) { - return this.winnow_results(); - } - }; - - AbstractChosen.prototype.reset_single_select_options = function() { - var result, _i, _len, _ref, _results; - _ref = this.results_data; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - result = _ref[_i]; - if (result.selected) { - _results.push(result.selected = false); - } else { - _results.push(void 0); - } - } - return _results; - }; - - AbstractChosen.prototype.results_toggle = function() { - if (this.results_showing) { - return this.results_hide(); - } else { - return this.results_show(); - } - }; - - AbstractChosen.prototype.results_search = function(evt) { - if (this.results_showing) { - return this.winnow_results(); - } else { - return this.results_show(); - } - }; - - AbstractChosen.prototype.winnow_results = function() { - var escapedSearchText, option, regex, regexAnchor, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref; - this.no_results_clear(); - results = 0; - searchText = this.get_search_text(); - escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); - regexAnchor = this.search_contains ? "" : "^"; - regex = new RegExp(regexAnchor + escapedSearchText, 'i'); - zregex = new RegExp(escapedSearchText, 'i'); - _ref = this.results_data; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - option = _ref[_i]; - option.search_match = false; - results_group = null; - if (this.include_option_in_results(option)) { - if (option.group) { - option.group_match = false; - option.active_options = 0; - } - if ((option.group_array_index != null) && this.results_data[option.group_array_index]) { - results_group = this.results_data[option.group_array_index]; - if (results_group.active_options === 0 && results_group.search_match) { - results += 1; - } - results_group.active_options += 1; - } - if (!(option.group && !this.group_search)) { - option.search_text = option.group ? option.label : option.html; - option.search_match = this.search_string_match(option.search_text, regex); - if (option.search_match && !option.group) { - results += 1; - } - if (option.search_match) { - if (searchText.length) { - startpos = option.search_text.search(zregex); - text = option.search_text.substr(0, startpos + searchText.length) + '' + option.search_text.substr(startpos + searchText.length); - option.search_text = text.substr(0, startpos) + '' + text.substr(startpos); - } - if (results_group != null) { - results_group.group_match = true; - } - } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) { - option.search_match = true; - } - } - } - } - this.result_clear_highlight(); - if (results < 1 && searchText.length) { - this.update_results_content(""); - return this.no_results(searchText); - } else { - this.update_results_content(this.results_option_build()); - return this.winnow_results_set_highlight(); - } - }; - - AbstractChosen.prototype.search_string_match = function(search_string, regex) { - var part, parts, _i, _len; - if (regex.test(search_string)) { - return true; - } else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) { - parts = search_string.replace(/\[|\]/g, "").split(" "); - if (parts.length) { - for (_i = 0, _len = parts.length; _i < _len; _i++) { - part = parts[_i]; - if (regex.test(part)) { - return true; - } - } - } - } - }; - - AbstractChosen.prototype.choices_count = function() { - var option, _i, _len, _ref; - if (this.selected_option_count != null) { - return this.selected_option_count; - } - this.selected_option_count = 0; - _ref = this.form_field.options; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - option = _ref[_i]; - if (option.selected) { - this.selected_option_count += 1; - } - } - return this.selected_option_count; - }; - - AbstractChosen.prototype.choices_click = function(evt) { - evt.preventDefault(); - if (!(this.results_showing || this.is_disabled)) { - return this.results_show(); - } - }; - - AbstractChosen.prototype.keyup_checker = function(evt) { - var stroke, _ref; - stroke = (_ref = evt.which) != null ? _ref : evt.keyCode; - this.search_field_scale(); - switch (stroke) { - case 8: - if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) { - return this.keydown_backstroke(); - } else if (!this.pending_backstroke) { - this.result_clear_highlight(); - return this.results_search(); - } - break; - case 13: - evt.preventDefault(); - if( this.result_highlight ){ - if (this.results_showing) { - return this.result_select(evt); - } - }else{ - if( jQuery(this.form_field).hasClass('sa_cbl_add_location') ) { - var element = this; - var form_field = jQuery(element.form_field); - var entered = jQuery(evt.target).val(); - if ( entered.indexOf( "|" ) > 0 ) { - var splitted = entered.split("|"); - var len = 0 - splitted.length; - var joined = splitted.join("'); - form_field.trigger('chosen:updated'); - jQuery.each(element.search_results.find('li.active-result').slice(len), function(index, value){ - element.result_highlight = jQuery(this); - element.result_select(evt) - }); - } else { - form_field.append(''); - form_field.trigger('chosen:updated'); - element.result_highlight = element.search_results.find('li.active-result').last(); - element.result_select(evt); - } - } - } - break; - case 27: - if (this.results_showing) { - this.results_hide(); - } - return true; - case 9: - case 38: - case 40: - case 16: - case 91: - case 17: - break; - default: - return this.results_search(); - } - }; - - AbstractChosen.prototype.clipboard_event_checker = function(evt) { - var _this = this; - return setTimeout((function() { - return _this.results_search(); - }), 50); - }; - - AbstractChosen.prototype.container_width = function() { - if (this.options.width != null) { - return this.options.width; - } else { - return "" + this.form_field.offsetWidth + "px"; - } - }; - - AbstractChosen.prototype.include_option_in_results = function(option) { - if (this.is_multiple && (!this.display_selected_options && option.selected)) { - return false; - } - if (!this.display_disabled_options && option.disabled) { - return false; - } - if (option.empty) { - return false; - } - return true; - }; - - AbstractChosen.prototype.search_results_touchstart = function(evt) { - this.touch_started = true; - return this.search_results_mouseover(evt); - }; - - AbstractChosen.prototype.search_results_touchmove = function(evt) { - this.touch_started = false; - return this.search_results_mouseout(evt); - }; - - AbstractChosen.prototype.search_results_touchend = function(evt) { - if (this.touch_started) { - return this.search_results_mouseup(evt); - } - }; - - AbstractChosen.prototype.outerHTML = function(element) { - var tmp; - if (element.outerHTML) { - return element.outerHTML; - } - tmp = document.createElement("div"); - tmp.appendChild(element); - return tmp.innerHTML; - }; - - AbstractChosen.browser_is_supported = function() { - if (window.navigator.appName === "Microsoft Internet Explorer") { - return document.documentMode >= 8; - } - if (/iP(od|hone)/i.test(window.navigator.userAgent)) { - return false; - } - if (/Android/i.test(window.navigator.userAgent)) { - if (/Mobile/i.test(window.navigator.userAgent)) { - return false; - } - } - return true; - }; - - AbstractChosen.default_multiple_text = "Select Some Options"; - - AbstractChosen.default_single_text = "Select an Option"; - - AbstractChosen.default_no_result_text = "No results match"; - - return AbstractChosen; - - })(); - - $ = jQuery; - - $.fn.extend({ - chosen: function(options) { - if (!AbstractChosen.browser_is_supported()) { - return this; - } - return this.each(function(input_field) { - var $this, chosen; - $this = $(this); - chosen = $this.data('chosen'); - if (options === 'destroy' && chosen) { - chosen.destroy(); - } else if (!chosen) { - $this.data('chosen', new Chosen(this, options)); - } - }); - } - }); - - Chosen = (function(_super) { - __extends(Chosen, _super); - - function Chosen() { - _ref = Chosen.__super__.constructor.apply(this, arguments); - return _ref; - } - - Chosen.prototype.setup = function() { - this.form_field_jq = $(this.form_field); - this.current_selectedIndex = this.form_field.selectedIndex; - return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl"); - }; - - Chosen.prototype.set_up_html = function() { - var container_classes, container_props; - container_classes = ["chosen-container"]; - container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single")); - if (this.inherit_select_classes && this.form_field.className) { - container_classes.push(this.form_field.className); - } - if (this.is_rtl) { - container_classes.push("chosen-rtl"); - } - container_props = { - 'class': container_classes.join(' '), - 'style': "width: " + (this.container_width()) + ";", - 'title': this.form_field.title - }; - if (this.form_field.id.length) { - container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen"; - } - this.container = $("
    ", container_props); - if (this.is_multiple) { - this.container.html('
      '); - } else { - this.container.html('' + this.default_text + '
        '); - } - this.form_field_jq.hide().after(this.container); - this.dropdown = this.container.find('div.chosen-drop').first(); - this.search_field = this.container.find('input').first(); - this.search_results = this.container.find('ul.chosen-results').first(); - this.search_field_scale(); - this.search_no_results = this.container.find('li.no-results').first(); - if (this.is_multiple) { - this.search_choices = this.container.find('ul.chosen-choices').first(); - this.search_container = this.container.find('li.search-field').first(); - } else { - this.search_container = this.container.find('div.chosen-search').first(); - this.selected_item = this.container.find('.chosen-single').first(); - } - this.results_build(); - this.set_tab_index(); - this.set_label_behavior(); - return this.form_field_jq.trigger("chosen:ready", { - chosen: this - }); - }; - - Chosen.prototype.register_observers = function() { - var _this = this; - this.container.bind('mousedown.chosen', function(evt) { - _this.container_mousedown(evt); - }); - this.container.bind('mouseup.chosen', function(evt) { - _this.container_mouseup(evt); - }); - this.container.bind('mouseenter.chosen', function(evt) { - _this.mouse_enter(evt); - }); - this.container.bind('mouseleave.chosen', function(evt) { - _this.mouse_leave(evt); - }); - this.search_results.bind('mouseup.chosen', function(evt) { - _this.search_results_mouseup(evt); - }); - this.search_results.bind('mouseover.chosen', function(evt) { - _this.search_results_mouseover(evt); - }); - this.search_results.bind('mouseout.chosen', function(evt) { - _this.search_results_mouseout(evt); - }); - this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) { - _this.search_results_mousewheel(evt); - }); - this.search_results.bind('touchstart.chosen', function(evt) { - _this.search_results_touchstart(evt); - }); - this.search_results.bind('touchmove.chosen', function(evt) { - _this.search_results_touchmove(evt); - }); - this.search_results.bind('touchend.chosen', function(evt) { - _this.search_results_touchend(evt); - }); - this.form_field_jq.bind("chosen:updated.chosen", function(evt) { - _this.results_update_field(evt); - }); - this.form_field_jq.bind("chosen:activate.chosen", function(evt) { - _this.activate_field(evt); - }); - this.form_field_jq.bind("chosen:open.chosen", function(evt) { - _this.container_mousedown(evt); - }); - this.form_field_jq.bind("chosen:close.chosen", function(evt) { - _this.input_blur(evt); - }); - this.search_field.bind('blur.chosen', function(evt) { - _this.input_blur(evt); - }); - this.search_field.bind('keyup.chosen', function(evt) { - _this.keyup_checker(evt); - }); - this.search_field.bind('keydown.chosen', function(evt) { - _this.keydown_checker(evt); - }); - this.search_field.bind('focus.chosen', function(evt) { - _this.input_focus(evt); - }); - this.search_field.bind('cut.chosen', function(evt) { - _this.clipboard_event_checker(evt); - }); - this.search_field.bind('paste.chosen', function(evt) { - _this.clipboard_event_checker(evt); - }); - if (this.is_multiple) { - return this.search_choices.bind('click.chosen', function(evt) { - _this.choices_click(evt); - }); - } else { - return this.container.bind('click.chosen', function(evt) { - evt.preventDefault(); - }); - } - }; - - Chosen.prototype.destroy = function() { - $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action); - if (this.search_field[0].tabIndex) { - this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex; - } - this.container.remove(); - this.form_field_jq.removeData('chosen'); - return this.form_field_jq.show(); - }; - - Chosen.prototype.search_field_disabled = function() { - this.is_disabled = this.form_field_jq[0].disabled; - if (this.is_disabled) { - this.container.addClass('chosen-disabled'); - this.search_field[0].disabled = true; - if (!this.is_multiple) { - this.selected_item.unbind("focus.chosen", this.activate_action); - } - return this.close_field(); - } else { - this.container.removeClass('chosen-disabled'); - this.search_field[0].disabled = false; - if (!this.is_multiple) { - return this.selected_item.bind("focus.chosen", this.activate_action); - } - } - }; - - Chosen.prototype.container_mousedown = function(evt) { - if (!this.is_disabled) { - if (evt && evt.type === "mousedown" && !this.results_showing) { - evt.preventDefault(); - } - if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) { - if (!this.active_field) { - if (this.is_multiple) { - this.search_field.val(""); - } - $(this.container[0].ownerDocument).bind('click.chosen', this.click_test_action); - this.results_show(); - } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) { - evt.preventDefault(); - this.results_toggle(); - } - return this.activate_field(); - } - } - }; - - Chosen.prototype.container_mouseup = function(evt) { - if (evt.target.nodeName === "ABBR" && !this.is_disabled) { - return this.results_reset(evt); - } - }; - - Chosen.prototype.search_results_mousewheel = function(evt) { - var delta; - if (evt.originalEvent) { - delta = -evt.originalEvent.wheelDelta || evt.originalEvent.detail; - } - if (delta != null) { - evt.preventDefault(); - if (evt.type === 'DOMMouseScroll') { - delta = delta * 40; - } - return this.search_results.scrollTop(delta + this.search_results.scrollTop()); - } - }; - - Chosen.prototype.blur_test = function(evt) { - if (!this.active_field && this.container.hasClass("chosen-container-active")) { - return this.close_field(); - } - }; - - Chosen.prototype.close_field = function() { - $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action); - this.active_field = false; - this.results_hide(); - this.container.removeClass("chosen-container-active"); - this.clear_backstroke(); - this.show_search_field_default(); - return this.search_field_scale(); - }; - - Chosen.prototype.activate_field = function() { - this.container.addClass("chosen-container-active"); - this.active_field = true; - this.search_field.val(this.search_field.val()); - return this.search_field.focus(); - }; - - Chosen.prototype.test_active_click = function(evt) { - var active_container; - active_container = $(evt.target).closest('.chosen-container'); - if (active_container.length && this.container[0] === active_container[0]) { - return this.active_field = true; - } else { - return this.close_field(); - } - }; - - Chosen.prototype.results_build = function() { - this.parsing = true; - this.selected_option_count = null; - this.results_data = SelectParser.select_to_array(this.form_field); - if (this.is_multiple) { - this.search_choices.find("li.search-choice").remove(); - } else if (!this.is_multiple) { - this.single_set_selected_text(); - if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) { - this.search_field[0].readOnly = true; - this.container.addClass("chosen-container-single-nosearch"); - } else { - this.search_field[0].readOnly = false; - this.container.removeClass("chosen-container-single-nosearch"); - } - } - this.update_results_content(this.results_option_build({ - first: true - })); - this.search_field_disabled(); - this.show_search_field_default(); - this.search_field_scale(); - return this.parsing = false; - }; - - Chosen.prototype.result_do_highlight = function(el) { - var high_bottom, high_top, maxHeight, visible_bottom, visible_top; - if (el.length) { - this.result_clear_highlight(); - this.result_highlight = el; - this.result_highlight.addClass("highlighted"); - maxHeight = parseInt(this.search_results.css("maxHeight"), 10); - visible_top = this.search_results.scrollTop(); - visible_bottom = maxHeight + visible_top; - high_top = this.result_highlight.position().top + this.search_results.scrollTop(); - high_bottom = high_top + this.result_highlight.outerHeight(); - if (high_bottom >= visible_bottom) { - return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0); - } else if (high_top < visible_top) { - return this.search_results.scrollTop(high_top); - } - } - }; - - Chosen.prototype.result_clear_highlight = function() { - if (this.result_highlight) { - this.result_highlight.removeClass("highlighted"); - } - return this.result_highlight = null; - }; - - Chosen.prototype.results_show = function() { - if (this.is_multiple && this.max_selected_options <= this.choices_count()) { - this.form_field_jq.trigger("chosen:maxselected", { - chosen: this - }); - return false; - } - this.container.addClass("chosen-with-drop"); - this.results_showing = true; - this.search_field.focus(); - this.search_field.val(this.search_field.val()); - this.winnow_results(); - return this.form_field_jq.trigger("chosen:showing_dropdown", { - chosen: this - }); - }; - - Chosen.prototype.update_results_content = function(content) { - return this.search_results.html(content); - }; - - Chosen.prototype.results_hide = function() { - if (this.results_showing) { - this.result_clear_highlight(); - this.container.removeClass("chosen-with-drop"); - this.form_field_jq.trigger("chosen:hiding_dropdown", { - chosen: this - }); - } - return this.results_showing = false; - }; - - Chosen.prototype.set_tab_index = function(el) { - var ti; - if (this.form_field.tabIndex) { - ti = this.form_field.tabIndex; - this.form_field.tabIndex = -1; - return this.search_field[0].tabIndex = ti; - } - }; - - Chosen.prototype.set_label_behavior = function() { - var _this = this; - this.form_field_label = this.form_field_jq.parents("label"); - if (!this.form_field_label.length && this.form_field.id.length) { - this.form_field_label = $("label[for='" + this.form_field.id + "']"); - } - if (this.form_field_label.length > 0) { - return this.form_field_label.bind('click.chosen', function(evt) { - if (_this.is_multiple) { - return _this.container_mousedown(evt); - } else { - return _this.activate_field(); - } - }); - } - }; - - Chosen.prototype.show_search_field_default = function() { - if (this.is_multiple && this.choices_count() < 1 && !this.active_field) { - this.search_field.val(this.default_text); - return this.search_field.addClass("default"); - } else { - this.search_field.val(""); - return this.search_field.removeClass("default"); - } - }; - - Chosen.prototype.search_results_mouseup = function(evt) { - var target; - target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); - if (target.length) { - this.result_highlight = target; - this.result_select(evt); - return this.search_field.focus(); - } - }; - - Chosen.prototype.search_results_mouseover = function(evt) { - var target; - target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); - if (target) { - return this.result_do_highlight(target); - } - }; - - Chosen.prototype.search_results_mouseout = function(evt) { - if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) { - return this.result_clear_highlight(); - } - }; - - Chosen.prototype.choice_build = function(item) { - var choice, close_link, - _this = this; - choice = $('
      • ', { - "class": "search-choice" - }).html("" + item.html + ""); - if (item.disabled) { - choice.addClass('search-choice-disabled'); - } else { - close_link = $('', { - "class": 'search-choice-close', - 'data-option-array-index': item.array_index - }); - close_link.bind('click.chosen', function(evt) { - return _this.choice_destroy_link_click(evt); - }); - choice.append(close_link); - } - return this.search_container.before(choice); - }; - - Chosen.prototype.choice_destroy_link_click = function(evt) { - evt.preventDefault(); - evt.stopPropagation(); - if (!this.is_disabled) { - return this.choice_destroy($(evt.target)); - } - }; - - Chosen.prototype.choice_destroy = function(link) { - if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) { - this.show_search_field_default(); - if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) { - this.results_hide(); - } - link.parents('li').first().remove(); - return this.search_field_scale(); - } - }; - - Chosen.prototype.results_reset = function() { - this.reset_single_select_options(); - this.form_field.options[0].selected = true; - this.single_set_selected_text(); - this.show_search_field_default(); - this.results_reset_cleanup(); - this.form_field_jq.trigger("change"); - if (this.active_field) { - return this.results_hide(); - } - }; - - Chosen.prototype.results_reset_cleanup = function() { - this.current_selectedIndex = this.form_field.selectedIndex; - return this.selected_item.find("abbr").remove(); - }; - - Chosen.prototype.result_select = function(evt) { - var high, item; - if (this.result_highlight) { - high = this.result_highlight; - this.result_clear_highlight(); - if (this.is_multiple && this.max_selected_options <= this.choices_count()) { - this.form_field_jq.trigger("chosen:maxselected", { - chosen: this - }); - return false; - } - if (this.is_multiple) { - high.removeClass("active-result"); - } else { - this.reset_single_select_options(); - } - item = this.results_data[high[0].getAttribute("data-option-array-index")]; - item.selected = true; - this.form_field.options[item.options_index].selected = true; - this.selected_option_count = null; - if (this.is_multiple) { - this.choice_build(item); - } else { - this.single_set_selected_text(item.text); - } - if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) { - this.results_hide(); - } - this.search_field.val(""); - if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) { - this.form_field_jq.trigger("change", { - 'selected': this.form_field.options[item.options_index].value - }); - } - this.current_selectedIndex = this.form_field.selectedIndex; - return this.search_field_scale(); - } - }; - - Chosen.prototype.single_set_selected_text = function(text) { - if (text == null) { - text = this.default_text; - } - if (text === this.default_text) { - this.selected_item.addClass("chosen-default"); - } else { - this.single_deselect_control_build(); - this.selected_item.removeClass("chosen-default"); - } - return this.selected_item.find("span").text(text); - }; - - Chosen.prototype.result_deselect = function(pos) { - var result_data; - result_data = this.results_data[pos]; - if (!this.form_field.options[result_data.options_index].disabled) { - result_data.selected = false; - this.form_field.options[result_data.options_index].selected = false; - this.selected_option_count = null; - this.result_clear_highlight(); - if (this.results_showing) { - this.winnow_results(); - } - this.form_field_jq.trigger("change", { - deselected: this.form_field.options[result_data.options_index].value - }); - this.search_field_scale(); - return true; - } else { - return false; - } - }; - - Chosen.prototype.single_deselect_control_build = function() { - if (!this.allow_single_deselect) { - return; - } - if (!this.selected_item.find("abbr").length) { - this.selected_item.find("span").first().after(""); - } - return this.selected_item.addClass("chosen-single-with-deselect"); - }; - - Chosen.prototype.get_search_text = function() { - if (this.search_field.val() === this.default_text) { - return ""; - } else { - return $('
        ').text($.trim(this.search_field.val())).html(); - } - }; - - Chosen.prototype.winnow_results_set_highlight = function() { - var do_high, selected_results; - selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : []; - do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first(); - if (do_high != null) { - return this.result_do_highlight(do_high); - } - }; - - Chosen.prototype.no_results = function(terms) { - var no_results_html; - no_results_html = $('
      • ' + this.results_none_found + ' ""
      • '); - no_results_html.find("span").first().html(terms); - this.search_results.append(no_results_html); - return this.form_field_jq.trigger("chosen:no_results", { - chosen: this - }); - }; - - Chosen.prototype.no_results_clear = function() { - return this.search_results.find(".no-results").remove(); - }; - - Chosen.prototype.keydown_arrow = function() { - var next_sib; - if (this.results_showing && this.result_highlight) { - next_sib = this.result_highlight.nextAll("li.active-result").first(); - if (next_sib) { - return this.result_do_highlight(next_sib); - } - } else { - return this.results_show(); - } - }; - - Chosen.prototype.keyup_arrow = function() { - var prev_sibs; - if (!this.results_showing && !this.is_multiple) { - return this.results_show(); - } else if (this.result_highlight) { - prev_sibs = this.result_highlight.prevAll("li.active-result"); - if (prev_sibs.length) { - return this.result_do_highlight(prev_sibs.first()); - } else { - if (this.choices_count() > 0) { - this.results_hide(); - } - return this.result_clear_highlight(); - } - } - }; - - Chosen.prototype.keydown_backstroke = function() { - var next_available_destroy; - if (this.pending_backstroke) { - this.choice_destroy(this.pending_backstroke.find("a").first()); - return this.clear_backstroke(); - } else { - next_available_destroy = this.search_container.siblings("li.search-choice").last(); - if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) { - this.pending_backstroke = next_available_destroy; - if (this.single_backstroke_delete) { - return this.keydown_backstroke(); - } else { - return this.pending_backstroke.addClass("search-choice-focus"); - } - } - } - }; - - Chosen.prototype.clear_backstroke = function() { - if (this.pending_backstroke) { - this.pending_backstroke.removeClass("search-choice-focus"); - } - return this.pending_backstroke = null; - }; - - Chosen.prototype.keydown_checker = function(evt) { - var stroke, _ref1; - stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode; - this.search_field_scale(); - if (stroke !== 8 && this.pending_backstroke) { - this.clear_backstroke(); - } - switch (stroke) { - case 8: - this.backstroke_length = this.search_field.val().length; - break; - case 9: - if (this.results_showing && !this.is_multiple) { - this.result_select(evt); - } - this.mouse_on_container = false; - break; - case 13: - evt.preventDefault(); - break; - case 38: - evt.preventDefault(); - this.keyup_arrow(); - break; - case 40: - evt.preventDefault(); - this.keydown_arrow(); - break; - } - }; - - Chosen.prototype.search_field_scale = function() { - var div, f_width, h, style, style_block, styles, w, _i, _len; - if (this.is_multiple) { - h = 0; - w = 0; - style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"; - styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing']; - for (_i = 0, _len = styles.length; _i < _len; _i++) { - style = styles[_i]; - style_block += style + ":" + this.search_field.css(style) + ";"; - } - div = $('
        ', { - 'style': style_block - }); - div.text(this.search_field.val()); - $('body').append(div); - w = div.width() + 25; - div.remove(); - f_width = this.container.outerWidth(); - if (w > f_width - 10) { - w = f_width - 10; - } - return this.search_field.css({ - 'width': w + 'px' - }); - } - }; - - return Chosen; - - })(AbstractChosen); - -}).call(this); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/js/chosen.jquery.min.js b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/js/chosen.jquery.min.js deleted file mode 100644 index 4ef6c6d9..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/js/chosen.jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/* phpcs:ignoreFile */ -(function(){var t,e,s,i,r,o={}.hasOwnProperty,n=function(t,e){function s(){this.constructor=t}for(var i in e)o.call(e,i)&&(t[i]=e[i]);return s.prototype=e.prototype,t.prototype=new s,t.__super__=e.prototype,t};i=function(){function t(){this.options_index=0,this.parsed=[]}return t.prototype.add_node=function(t){return"OPTGROUP"===t.nodeName.toUpperCase()?this.add_group(t):this.add_option(t)},t.prototype.add_group=function(t){var e,s,i,r,o,n;for(e=this.parsed.length,this.parsed.push({array_index:e,group:!0,label:this.escapeExpression(t.label),children:0,disabled:t.disabled}),o=t.childNodes,n=[],i=0,r=o.length;i\"\'\`]/.test(t)?(e={"<":"<",">":">",'"':""","'":"'","`":"`"},s=/&(?!\w+;)|[\<\>\"\'\`]/g,t.replace(s,function(t){return e[t]||"&"})):t},t}(),i.select_to_array=function(t){var e,s,r,o,n;for(s=new i,n=t.childNodes,r=0,o=n.length;r0?(e=document.createElement("li"),e.className="group-result",e.innerHTML=t.search_text,this.outerHTML(e)):""},t.prototype.results_update_field=function(){if(this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.results_build(),this.results_showing)return this.winnow_results()},t.prototype.reset_single_select_options=function(){var t,e,s,i,r;for(i=this.results_data,r=[],e=0,s=i.length;e"+e.search_text.substr(h+n.length),e.search_text=l.substr(0,h)+""+l.substr(h)),null!=o&&(o.group_match=!0)):null!=e.group_array_index&&this.results_data[e.group_array_index].search_match&&(e.search_match=!0)));return this.result_clear_highlight(),r<1&&n.length?(this.update_results_content(""),this.no_results(n)):(this.update_results_content(this.results_option_build()),this.winnow_results_set_highlight())},t.prototype.search_string_match=function(t,e){var s,i,r,o;if(e.test(t))return!0;if(this.enable_split_word_search&&(t.indexOf(" ")>=0||0===t.indexOf("["))&&(i=t.replace(/\[|\]/g,"").split(" "),i.length))for(r=0,o=i.length;r0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:if(t.preventDefault(),this.result_highlight){if(this.results_showing)return this.result_select(t)}else if(jQuery(this.form_field).hasClass("sa_cbl_add_location")){var i=this,r=jQuery(i.form_field),o=jQuery(t.target).val();if(o.indexOf("|")>0){var n=o.split("|"),h=0-n.length,l=n.join(""),r.trigger("chosen:updated"),jQuery.each(i.search_results.find("li.active-result").slice(h),function(e,s){i.result_highlight=jQuery(this),i.result_select(t)})}else r.append(""),r.trigger("chosen:updated"),i.result_highlight=i.search_results.find("li.active-result").last(),i.result_select(t)}break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},t.prototype.clipboard_event_checker=function(t){var e=this;return setTimeout(function(){return e.results_search()},50)},t.prototype.container_width=function(){return null!=this.options.width?this.options.width:""+this.form_field.offsetWidth+"px"},t.prototype.include_option_in_results=function(t){return!(this.is_multiple&&!this.display_selected_options&&t.selected)&&(!(!this.display_disabled_options&&t.disabled)&&!t.empty)},t.prototype.search_results_touchstart=function(t){return this.touch_started=!0,this.search_results_mouseover(t)},t.prototype.search_results_touchmove=function(t){return this.touch_started=!1,this.search_results_mouseout(t)},t.prototype.search_results_touchend=function(t){if(this.touch_started)return this.search_results_mouseup(t)},t.prototype.outerHTML=function(t){var e;return t.outerHTML?t.outerHTML:(e=document.createElement("div"),e.appendChild(t),e.innerHTML)},t.browser_is_supported=function(){return"Microsoft Internet Explorer"===window.navigator.appName?document.documentMode>=8:!/iP(od|hone)/i.test(window.navigator.userAgent)&&(!/Android/i.test(window.navigator.userAgent)||!/Mobile/i.test(window.navigator.userAgent))},t.default_multiple_text="Select Some Options",t.default_single_text="Select an Option",t.default_no_result_text="No results match",t}(),t=jQuery,t.fn.extend({chosen:function(i){return e.browser_is_supported()?this.each(function(e){var r,o;r=t(this),o=r.data("chosen"),"destroy"===i&&o?o.destroy():o||r.data("chosen",new s(this,i))}):this}}),s=function(e){function s(){return r=s.__super__.constructor.apply(this,arguments)}return n(s,e),s.prototype.setup=function(){return this.form_field_jq=t(this.form_field),this.current_selectedIndex=this.form_field.selectedIndex,this.is_rtl=this.form_field_jq.hasClass("chosen-rtl")},s.prototype.set_up_html=function(){var e,s;return e=["chosen-container"],e.push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&e.push(this.form_field.className),this.is_rtl&&e.push("chosen-rtl"),s={class:e.join(" "),style:"width: "+this.container_width()+";",title:this.form_field.title},this.form_field.id.length&&(s.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=t("
        ",s),this.is_multiple?this.container.html('
          '):this.container.html('
          '+this.default_text+'
            '),this.form_field_jq.hide().after(this.container),this.dropdown=this.container.find("div.chosen-drop").first(),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chosen-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chosen-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chosen-search").first(),this.selected_item=this.container.find(".chosen-single").first()),this.results_build(),this.set_tab_index(),this.set_label_behavior(),this.form_field_jq.trigger("chosen:ready",{chosen:this})},s.prototype.register_observers=function(){var t=this;return this.container.bind("mousedown.chosen",function(e){t.container_mousedown(e)}),this.container.bind("mouseup.chosen",function(e){t.container_mouseup(e)}),this.container.bind("mouseenter.chosen",function(e){t.mouse_enter(e)}),this.container.bind("mouseleave.chosen",function(e){t.mouse_leave(e)}),this.search_results.bind("mouseup.chosen",function(e){t.search_results_mouseup(e)}),this.search_results.bind("mouseover.chosen",function(e){t.search_results_mouseover(e)}),this.search_results.bind("mouseout.chosen",function(e){t.search_results_mouseout(e)}),this.search_results.bind("mousewheel.chosen DOMMouseScroll.chosen",function(e){t.search_results_mousewheel(e)}),this.search_results.bind("touchstart.chosen",function(e){t.search_results_touchstart(e)}),this.search_results.bind("touchmove.chosen",function(e){t.search_results_touchmove(e)}),this.search_results.bind("touchend.chosen",function(e){t.search_results_touchend(e)}),this.form_field_jq.bind("chosen:updated.chosen",function(e){t.results_update_field(e)}),this.form_field_jq.bind("chosen:activate.chosen",function(e){t.activate_field(e)}),this.form_field_jq.bind("chosen:open.chosen",function(e){t.container_mousedown(e)}),this.form_field_jq.bind("chosen:close.chosen",function(e){t.input_blur(e)}),this.search_field.bind("blur.chosen",function(e){t.input_blur(e)}),this.search_field.bind("keyup.chosen",function(e){t.keyup_checker(e)}),this.search_field.bind("keydown.chosen",function(e){t.keydown_checker(e)}),this.search_field.bind("focus.chosen",function(e){t.input_focus(e)}),this.search_field.bind("cut.chosen",function(e){t.clipboard_event_checker(e)}),this.search_field.bind("paste.chosen",function(e){t.clipboard_event_checker(e)}),this.is_multiple?this.search_choices.bind("click.chosen",function(e){t.choices_click(e)}):this.container.bind("click.chosen",function(t){t.preventDefault()})},s.prototype.destroy=function(){return t(this.container[0].ownerDocument).unbind("click.chosen",this.click_test_action),this.search_field[0].tabIndex&&(this.form_field_jq[0].tabIndex=this.search_field[0].tabIndex),this.container.remove(),this.form_field_jq.removeData("chosen"),this.form_field_jq.show()},s.prototype.search_field_disabled=function(){return this.is_disabled=this.form_field_jq[0].disabled,this.is_disabled?(this.container.addClass("chosen-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus.chosen",this.activate_action),this.close_field()):(this.container.removeClass("chosen-disabled"),this.search_field[0].disabled=!1,this.is_multiple?void 0:this.selected_item.bind("focus.chosen",this.activate_action))},s.prototype.container_mousedown=function(e){if(!this.is_disabled&&(e&&"mousedown"===e.type&&!this.results_showing&&e.preventDefault(),null==e||!t(e.target).hasClass("search-choice-close")))return this.active_field?this.is_multiple||!e||t(e.target)[0]!==this.selected_item[0]&&!t(e.target).parents("a.chosen-single").length||(e.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),t(this.container[0].ownerDocument).bind("click.chosen",this.click_test_action),this.results_show()),this.activate_field()},s.prototype.container_mouseup=function(t){if("ABBR"===t.target.nodeName&&!this.is_disabled)return this.results_reset(t)},s.prototype.search_results_mousewheel=function(t){var e;if(t.originalEvent&&(e=-t.originalEvent.wheelDelta||t.originalEvent.detail),null!=e)return t.preventDefault(),"DOMMouseScroll"===t.type&&(e*=40),this.search_results.scrollTop(e+this.search_results.scrollTop())},s.prototype.blur_test=function(t){if(!this.active_field&&this.container.hasClass("chosen-container-active"))return this.close_field()},s.prototype.close_field=function(){return t(this.container[0].ownerDocument).unbind("click.chosen",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chosen-container-active"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},s.prototype.activate_field=function(){return this.container.addClass("chosen-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},s.prototype.test_active_click=function(e){var s;return s=t(e.target).closest(".chosen-container"),s.length&&this.container[0]===s[0]?this.active_field=!0:this.close_field()},s.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=i.select_to_array(this.form_field),this.is_multiple?this.search_choices.find("li.search-choice").remove():this.is_multiple||(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?(this.search_field[0].readOnly=!0,this.container.addClass("chosen-container-single-nosearch")):(this.search_field[0].readOnly=!1,this.container.removeClass("chosen-container-single-nosearch"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},s.prototype.result_do_highlight=function(t){var e,s,i,r,o;if(t.length){if(this.result_clear_highlight(),this.result_highlight=t,this.result_highlight.addClass("highlighted"),i=parseInt(this.search_results.css("maxHeight"),10),o=this.search_results.scrollTop(),r=i+o,s=this.result_highlight.position().top+this.search_results.scrollTop(),e=s+this.result_highlight.outerHeight(),e>=r)return this.search_results.scrollTop(e-i>0?e-i:0);if(s0)return this.form_field_label.bind("click.chosen",function(t){return e.is_multiple?e.container_mousedown(t):e.activate_field()})},s.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass("default")):(this.search_field.val(""),this.search_field.removeClass("default"))},s.prototype.search_results_mouseup=function(e){var s;if(s=t(e.target).hasClass("active-result")?t(e.target):t(e.target).parents(".active-result").first(),s.length)return this.result_highlight=s,this.result_select(e),this.search_field.focus()},s.prototype.search_results_mouseover=function(e){var s;if(s=t(e.target).hasClass("active-result")?t(e.target):t(e.target).parents(".active-result").first())return this.result_do_highlight(s)},s.prototype.search_results_mouseout=function(e){if(t(e.target).hasClass("active-result")||t(e.target).parents(".active-result").first())return this.result_clear_highlight()},s.prototype.choice_build=function(e){var s,i,r=this;return s=t("
          • ",{class:"search-choice"}).html(""+e.html+""),e.disabled?s.addClass("search-choice-disabled"):(i=t("",{class:"search-choice-close","data-option-array-index":e.array_index}),i.bind("click.chosen",function(t){return r.choice_destroy_link_click(t)}),s.append(i)),this.search_container.before(s)},s.prototype.choice_destroy_link_click=function(e){if(e.preventDefault(),e.stopPropagation(),!this.is_disabled)return this.choice_destroy(t(e.target))},s.prototype.choice_destroy=function(t){if(this.result_deselect(t[0].getAttribute("data-option-array-index")))return this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.search_field.val().length<1&&this.results_hide(),t.parents("li").first().remove(),this.search_field_scale()},s.prototype.results_reset=function(){if(this.reset_single_select_options(),this.form_field.options[0].selected=!0,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),this.form_field_jq.trigger("change"),this.active_field)return this.results_hide()},s.prototype.results_reset_cleanup=function(){return this.current_selectedIndex=this.form_field.selectedIndex,this.selected_item.find("abbr").remove()},s.prototype.result_select=function(t){var e,s;if(this.result_highlight)return e=this.result_highlight,this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.is_multiple?e.removeClass("active-result"):this.reset_single_select_options(),s=this.results_data[e[0].getAttribute("data-option-array-index")],s.selected=!0,this.form_field.options[s.options_index].selected=!0,this.selected_option_count=null,this.is_multiple?this.choice_build(s):this.single_set_selected_text(s.text),(t.metaKey||t.ctrlKey)&&this.is_multiple||this.results_hide(),this.search_field.val(""),(this.is_multiple||this.form_field.selectedIndex!==this.current_selectedIndex)&&this.form_field_jq.trigger("change",{selected:this.form_field.options[s.options_index].value}),this.current_selectedIndex=this.form_field.selectedIndex,this.search_field_scale())},s.prototype.single_set_selected_text=function(t){return null==t&&(t=this.default_text),t===this.default_text?this.selected_item.addClass("chosen-default"):(this.single_deselect_control_build(),this.selected_item.removeClass("chosen-default")),this.selected_item.find("span").text(t)},s.prototype.result_deselect=function(t){var e;return e=this.results_data[t],!this.form_field.options[e.options_index].disabled&&(e.selected=!1,this.form_field.options[e.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),this.form_field_jq.trigger("change",{deselected:this.form_field.options[e.options_index].value}),this.search_field_scale(),!0)},s.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect)return this.selected_item.find("abbr").length||this.selected_item.find("span").first().after(''),this.selected_item.addClass("chosen-single-with-deselect")},s.prototype.get_search_text=function(){return this.search_field.val()===this.default_text?"":t("
            ").text(t.trim(this.search_field.val())).html()},s.prototype.winnow_results_set_highlight=function(){var t,e;if(e=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),t=e.length?e.first():this.search_results.find(".active-result").first(),null!=t)return this.result_do_highlight(t)},s.prototype.no_results=function(e){var s;return s=t('
          • '+this.results_none_found+' ""
          • '),s.find("span").first().html(e),this.search_results.append(s),this.form_field_jq.trigger("chosen:no_results",{chosen:this})},s.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},s.prototype.keydown_arrow=function(){var t;return this.results_showing&&this.result_highlight?(t=this.result_highlight.nextAll("li.active-result").first())?this.result_do_highlight(t):void 0:this.results_show()},s.prototype.keyup_arrow=function(){var t;return this.results_showing||this.is_multiple?this.result_highlight?(t=this.result_highlight.prevAll("li.active-result"),t.length?this.result_do_highlight(t.first()):(this.choices_count()>0&&this.results_hide(),this.result_clear_highlight())):void 0:this.results_show()},s.prototype.keydown_backstroke=function(){var t;return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(t=this.search_container.siblings("li.search-choice").last(),t.length&&!t.hasClass("search-choice-disabled")?(this.pending_backstroke=t,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")):void 0)},s.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},s.prototype.keydown_checker=function(t){var e,s;switch(e=null!=(s=t.which)?s:t.keyCode,this.search_field_scale(),8!==e&&this.pending_backstroke&&this.clear_backstroke(),e){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(t),this.mouse_on_container=!1;break;case 13:t.preventDefault();break;case 38:t.preventDefault(),this.keyup_arrow();break;case 40:t.preventDefault(),this.keydown_arrow()}},s.prototype.search_field_scale=function(){var e,s,i,r,o,n,h,l,c;if(this.is_multiple){for(i=0,h=0,o="position:absolute; left: -1000px; top: -1000px; display:none;",n=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"],l=0,c=n.length;l",{style:o}),e.text(this.search_field.val()),t("body").append(e),h=e.width()+25,e.remove(),s=this.container.outerWidth(),h>s-10&&(h=s-10),this.search_field.css({width:h+"px"})}},s}(e)}).call(this); \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/js/jquery-ui-timepicker-addon.js b/wp/wp-content/plugins/woocommerce-smart-coupons/assets/js/jquery-ui-timepicker-addon.js deleted file mode 100644 index 7d13bade..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/assets/js/jquery-ui-timepicker-addon.js +++ /dev/null @@ -1,2355 +0,0 @@ -// phpcs:ignoreFile -/*! jQuery Timepicker Addon - v1.6.3 - 2016-04-20 -* http://trentrichardson.com/examples/timepicker -* Copyright (c) 2016 Trent Richardson; Licensed MIT */ -(function (factory) { - if (typeof define === 'function' && define.amd) { - define( ['jquery', 'jquery-ui'], factory ); - } else { - factory( jQuery ); - } -}(function ($) { - - /* - * Lets not redefine timepicker, Prevent "Uncaught RangeError: Maximum call stack size exceeded" - */ - $.ui.timepicker = $.ui.timepicker || {}; - if ($.ui.timepicker.version) { - return; - } - - /* - * Extend jQueryUI, get it started with our version number - */ - $.extend( - $.ui, { - timepicker: { - version: "1.6.3" - } - } - ); - - /* - * Timepicker manager. - * Use the singleton instance of this class, $.timepicker, to interact with the time picker. - * Settings for (groups of) time pickers are maintained in an instance object, - * allowing multiple different settings on the same page. - */ - var Timepicker = function () { - this.regional = []; // Available regional settings, indexed by language code - this.regional[''] = { // Default regional settings - currentText: 'Now', - closeText: 'Done', - amNames: ['AM', 'A'], - pmNames: ['PM', 'P'], - timeFormat: 'HH:mm', - timeSuffix: '', - timeOnlyTitle: 'Choose Time', - timeText: 'Time', - hourText: 'Hour', - minuteText: 'Minute', - secondText: 'Second', - millisecText: 'Millisecond', - microsecText: 'Microsecond', - timezoneText: 'Time Zone', - isRTL: false - }; - this._defaults = { // Global defaults for all the datetime picker instances - showButtonPanel: true, - timeOnly: false, - timeOnlyShowDate: false, - showHour: null, - showMinute: null, - showSecond: null, - showMillisec: null, - showMicrosec: null, - showTimezone: null, - showTime: true, - stepHour: 1, - stepMinute: 1, - stepSecond: 1, - stepMillisec: 1, - stepMicrosec: 1, - hour: 0, - minute: 0, - second: 0, - millisec: 0, - microsec: 0, - timezone: null, - hourMin: 0, - minuteMin: 0, - secondMin: 0, - millisecMin: 0, - microsecMin: 0, - hourMax: 23, - minuteMax: 59, - secondMax: 59, - millisecMax: 999, - microsecMax: 999, - minDateTime: null, - maxDateTime: null, - maxTime: null, - minTime: null, - onSelect: null, - hourGrid: 0, - minuteGrid: 0, - secondGrid: 0, - millisecGrid: 0, - microsecGrid: 0, - alwaysSetTime: true, - separator: ' ', - altFieldTimeOnly: true, - altTimeFormat: null, - altSeparator: null, - altTimeSuffix: null, - altRedirectFocus: true, - pickerTimeFormat: null, - pickerTimeSuffix: null, - showTimepicker: true, - timezoneList: null, - addSliderAccess: false, - sliderAccessArgs: null, - controlType: 'slider', - oneLine: false, - defaultValue: null, - parse: 'strict', - afterInject: null - }; - $.extend( this._defaults, this.regional[''] ); - }; - - $.extend( - Timepicker.prototype, { - $input: null, - $altInput: null, - $timeObj: null, - inst: null, - hour_slider: null, - minute_slider: null, - second_slider: null, - millisec_slider: null, - microsec_slider: null, - timezone_select: null, - maxTime: null, - minTime: null, - hour: 0, - minute: 0, - second: 0, - millisec: 0, - microsec: 0, - timezone: null, - hourMinOriginal: null, - minuteMinOriginal: null, - secondMinOriginal: null, - millisecMinOriginal: null, - microsecMinOriginal: null, - hourMaxOriginal: null, - minuteMaxOriginal: null, - secondMaxOriginal: null, - millisecMaxOriginal: null, - microsecMaxOriginal: null, - ampm: '', - formattedDate: '', - formattedTime: '', - formattedDateTime: '', - timezoneList: null, - units: ['hour', 'minute', 'second', 'millisec', 'microsec'], - support: {}, - control: null, - - /* - * Override the default settings for all instances of the time picker. - * @param {Object} settings object - the new settings to use as defaults (anonymous object) - * @return {Object} the manager object - */ - setDefaults: function (settings) { - extendRemove( this._defaults, settings || {} ); - return this; - }, - - /* - * Create a new Timepicker instance - */ - _newInst: function ($input, opts) { - var tp_inst = new Timepicker(), - inlineSettings = {}, - fns = {}, - overrides, i; - - for (var attrName in this._defaults) { - if (this._defaults.hasOwnProperty( attrName )) { - var attrValue = $input.attr( 'time:' + attrName ); - if (attrValue) { - try { - inlineSettings[attrName] = eval( attrValue ); - } catch (err) { - inlineSettings[attrName] = attrValue; - } - } - } - } - - overrides = { - beforeShow: function (input, dp_inst) { - if ($.isFunction( tp_inst._defaults.evnts.beforeShow )) { - return tp_inst._defaults.evnts.beforeShow.call( $input[0], input, dp_inst, tp_inst ); - } - }, - onChangeMonthYear: function (year, month, dp_inst) { - // Update the time as well : this prevents the time from disappearing from the $input field. - // tp_inst._updateDateTime(dp_inst); - if ($.isFunction( tp_inst._defaults.evnts.onChangeMonthYear )) { - tp_inst._defaults.evnts.onChangeMonthYear.call( $input[0], year, month, dp_inst, tp_inst ); - } - }, - onClose: function (dateText, dp_inst) { - if (tp_inst.timeDefined === true && $input.val() !== '') { - tp_inst._updateDateTime( dp_inst ); - } - if ($.isFunction( tp_inst._defaults.evnts.onClose )) { - tp_inst._defaults.evnts.onClose.call( $input[0], dateText, dp_inst, tp_inst ); - } - } - }; - for (i in overrides) { - if (overrides.hasOwnProperty( i )) { - fns[i] = opts[i] || this._defaults[i] || null; - } - } - - tp_inst._defaults = $.extend( - {}, this._defaults, inlineSettings, opts, overrides, { - evnts: fns, - timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker'); - } - ); - tp_inst.amNames = $.map( - tp_inst._defaults.amNames, function (val) { - return val.toUpperCase(); - } - ); - tp_inst.pmNames = $.map( - tp_inst._defaults.pmNames, function (val) { - return val.toUpperCase(); - } - ); - - // detect which units are supported - tp_inst.support = detectSupport( - tp_inst._defaults.timeFormat + - (tp_inst._defaults.pickerTimeFormat ? tp_inst._defaults.pickerTimeFormat : '') + - (tp_inst._defaults.altTimeFormat ? tp_inst._defaults.altTimeFormat : '') - ); - - // controlType is string - key to our this._controls - if (typeof(tp_inst._defaults.controlType) === 'string') { - if (tp_inst._defaults.controlType === 'slider' && typeof($.ui.slider) === 'undefined') { - tp_inst._defaults.controlType = 'select'; - } - tp_inst.control = tp_inst._controls[tp_inst._defaults.controlType]; - } - // controlType is an object and must implement create, options, value methods - else { - tp_inst.control = tp_inst._defaults.controlType; - } - - // prep the timezone options - var timezoneList = [-720, -660, -600, -570, -540, -480, -420, -360, -300, -270, -240, -210, -180, -120, -60, - 0, 60, 120, 180, 210, 240, 270, 300, 330, 345, 360, 390, 420, 480, 525, 540, 570, 600, 630, 660, 690, 720, 765, 780, 840]; - if (tp_inst._defaults.timezoneList !== null) { - timezoneList = tp_inst._defaults.timezoneList; - } - var tzl = timezoneList.length, tzi = 0, tzv = null; - if (tzl > 0 && typeof timezoneList[0] !== 'object') { - for (; tzi < tzl; tzi++) { - tzv = timezoneList[tzi]; - timezoneList[tzi] = { value: tzv, label: $.timepicker.timezoneOffsetString( tzv, tp_inst.support.iso8601 ) }; - } - } - tp_inst._defaults.timezoneList = timezoneList; - - // set the default units - tp_inst.timezone = tp_inst._defaults.timezone !== null ? $.timepicker.timezoneOffsetNumber( tp_inst._defaults.timezone ) : - ((new Date()).getTimezoneOffset() * -1); - tp_inst.hour = tp_inst._defaults.hour < tp_inst._defaults.hourMin ? tp_inst._defaults.hourMin : - tp_inst._defaults.hour > tp_inst._defaults.hourMax ? tp_inst._defaults.hourMax : tp_inst._defaults.hour; - tp_inst.minute = tp_inst._defaults.minute < tp_inst._defaults.minuteMin ? tp_inst._defaults.minuteMin : - tp_inst._defaults.minute > tp_inst._defaults.minuteMax ? tp_inst._defaults.minuteMax : tp_inst._defaults.minute; - tp_inst.second = tp_inst._defaults.second < tp_inst._defaults.secondMin ? tp_inst._defaults.secondMin : - tp_inst._defaults.second > tp_inst._defaults.secondMax ? tp_inst._defaults.secondMax : tp_inst._defaults.second; - tp_inst.millisec = tp_inst._defaults.millisec < tp_inst._defaults.millisecMin ? tp_inst._defaults.millisecMin : - tp_inst._defaults.millisec > tp_inst._defaults.millisecMax ? tp_inst._defaults.millisecMax : tp_inst._defaults.millisec; - tp_inst.microsec = tp_inst._defaults.microsec < tp_inst._defaults.microsecMin ? tp_inst._defaults.microsecMin : - tp_inst._defaults.microsec > tp_inst._defaults.microsecMax ? tp_inst._defaults.microsecMax : tp_inst._defaults.microsec; - tp_inst.ampm = ''; - tp_inst.$input = $input; - - if (tp_inst._defaults.altField) { - tp_inst.$altInput = $( tp_inst._defaults.altField ); - if (tp_inst._defaults.altRedirectFocus === true) { - tp_inst.$altInput.css( - { - cursor: 'pointer' - } - ).focus( - function () { - $input.trigger( "focus" ); - } - ); - } - } - - if (tp_inst._defaults.minDate === 0 || tp_inst._defaults.minDateTime === 0) { - tp_inst._defaults.minDate = new Date(); - } - if (tp_inst._defaults.maxDate === 0 || tp_inst._defaults.maxDateTime === 0) { - tp_inst._defaults.maxDate = new Date(); - } - - // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime.. - if (tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) { - tp_inst._defaults.minDateTime = new Date( tp_inst._defaults.minDate.getTime() ); - } - if (tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) { - tp_inst._defaults.minDate = new Date( tp_inst._defaults.minDateTime.getTime() ); - } - if (tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) { - tp_inst._defaults.maxDateTime = new Date( tp_inst._defaults.maxDate.getTime() ); - } - if (tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) { - tp_inst._defaults.maxDate = new Date( tp_inst._defaults.maxDateTime.getTime() ); - } - tp_inst.$input.bind( - 'focus', function () { - tp_inst._onFocus(); - } - ); - - return tp_inst; - }, - - /* - * add our sliders to the calendar - */ - _addTimePicker: function (dp_inst) { - var currDT = $.trim( (this.$altInput && this._defaults.altFieldTimeOnly) ? this.$input.val() + ' ' + this.$altInput.val() : this.$input.val() ); - - this.timeDefined = this._parseTime( currDT ); - this._limitMinMaxDateTime( dp_inst, false ); - this._injectTimePicker(); - this._afterInject(); - }, - - /* - * parse the time string from input value or _setTime - */ - _parseTime: function (timeString, withDate) { - if ( ! this.inst) { - this.inst = $.datepicker._getInst( this.$input[0] ); - } - - if (withDate || ! this._defaults.timeOnly) { - var dp_dateFormat = $.datepicker._get( this.inst, 'dateFormat' ); - try { - var parseRes = parseDateTimeInternal( dp_dateFormat, this._defaults.timeFormat, timeString, $.datepicker._getFormatConfig( this.inst ), this._defaults ); - if ( ! parseRes.timeObj) { - return false; - } - $.extend( this, parseRes.timeObj ); - } catch (err) { - $.timepicker.log( - "Error parsing the date/time string: " + err + - "\ndate/time string = " + timeString + - "\ntimeFormat = " + this._defaults.timeFormat + - "\ndateFormat = " + dp_dateFormat - ); - return false; - } - return true; - } else { - var timeObj = $.datepicker.parseTime( this._defaults.timeFormat, timeString, this._defaults ); - if ( ! timeObj) { - return false; - } - $.extend( this, timeObj ); - return true; - } - }, - - /* - * Handle callback option after injecting timepicker - */ - _afterInject: function() { - var o = this.inst.settings; - if ($.isFunction( o.afterInject )) { - o.afterInject.call( this ); - } - }, - - /* - * generate and inject html for timepicker into ui datepicker - */ - _injectTimePicker: function () { - var $dp = this.inst.dpDiv, - o = this.inst.settings, - tp_inst = this, - litem = '', - uitem = '', - show = null, - max = {}, - gridSize = {}, - size = null, - i = 0, - l = 0; - - // Prevent displaying twice - if ($dp.find( "div.ui-timepicker-div" ).length === 0 && o.showTimepicker) { - var noDisplay = ' ui_tpicker_unit_hide', - html = '
            ' + '
            ' + o.timeText + '
            ' + - '
            '; - - // Create the markup - for (i = 0, l = this.units.length; i < l; i++) { - litem = this.units[i]; - uitem = litem.substr( 0, 1 ).toUpperCase() + litem.substr( 1 ); - show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem]; - - // Added by Peter Medeiros: - // - Figure out what the hour/minute/second max should be based on the step values. - // - Example: if stepMinute is 15, then minMax is 45. - max[litem] = parseInt( (o[litem + 'Max'] - ((o[litem + 'Max'] - o[litem + 'Min']) % o['step' + uitem])), 10 ); - gridSize[litem] = 0; - - html += '
            ' + o[litem + 'Text'] + '
            ' + - '
            '; - - if (show && o[litem + 'Grid'] > 0) { - html += '
            '; - - if (litem === 'hour') { - for (var h = o[litem + 'Min']; h <= max[litem]; h += parseInt( o[litem + 'Grid'], 10 )) { - gridSize[litem]++; - var tmph = $.datepicker.formatTime( this.support.ampm ? 'hht' : 'HH', {hour : h}, o ); - html += ''; - } - } else { - for (var m = o[litem + 'Min']; m <= max[litem]; m += parseInt( o[litem + 'Grid'], 10 )) { - gridSize[litem]++; - html += ''; - } - } - - html += '
            ' + tmph + '' + ((m < 10) ? '0' : '') + m + '
            '; - } - html += '
            '; - } - - // Timezone - var showTz = o.showTimezone !== null ? o.showTimezone : this.support.timezone; - html += '
            ' + o.timezoneText + '
            '; - html += '
            '; - - // Create the elements from string - html += '
            '; - var $tp = $( html ); - - // if we only want time picker... - if (o.timeOnly === true) { - $tp.prepend( '
            ' + '
            ' + o.timeOnlyTitle + '
            ' + '
            ' ); - $dp.find( '.ui-datepicker-header, .ui-datepicker-calendar' ).hide(); - } - - // add sliders, adjust grids, add events - for (i = 0, l = tp_inst.units.length; i < l; i++) { - litem = tp_inst.units[i]; - uitem = litem.substr( 0, 1 ).toUpperCase() + litem.substr( 1 ); - show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem]; - - // add the slider - tp_inst[litem + '_slider'] = tp_inst.control.create( tp_inst, $tp.find( '.ui_tpicker_' + litem + '_slider' ), litem, tp_inst[litem], o[litem + 'Min'], max[litem], o['step' + uitem] ); - - // adjust the grid and add click event - if (show && o[litem + 'Grid'] > 0) { - size = 100 * gridSize[litem] * o[litem + 'Grid'] / (max[litem] - o[litem + 'Min']); - $tp.find( '.ui_tpicker_' + litem + ' table' ).css( - { - width: size + "%", - marginLeft: o.isRTL ? '0' : ((size / (-2 * gridSize[litem])) + "%"), - marginRight: o.isRTL ? ((size / (-2 * gridSize[litem])) + "%") : '0', - borderCollapse: 'collapse' - } - ).find( "td" ).click( - function (e) { - var $t = $( this ), - h = $t.html(), - n = parseInt( h.replace( /[^0-9]/g ), 10 ), - ap = h.replace( /[^apm]/ig ), - f = $t.data( 'for' ); // loses scope, so we use data-for - - if (f === 'hour') { - if (ap.indexOf( 'p' ) !== -1 && n < 12) { - n += 12; - } else { - if (ap.indexOf( 'a' ) !== -1 && n === 12) { - n = 0; - } - } - } - - tp_inst.control.value( tp_inst, tp_inst[f + '_slider'], litem, n ); - - tp_inst._onTimeChange(); - tp_inst._onSelectHandler(); - } - ).css( - { - cursor: 'pointer', - width: (100 / gridSize[litem]) + '%', - textAlign: 'center', - overflow: 'hidden' - } - ); - } // end if grid > 0 - } // end for loop - - // Add timezone options - this.timezone_select = $tp.find( '.ui_tpicker_timezone' ).append( '' ).find( "select" ); - $.fn.append.apply( - this.timezone_select, - $.map( - o.timezoneList, function (val, idx) { - return $( "
            ' . __( 'Copy', 'woocommerce-smart-coupons' ) . ''; - - $actions['share-link'] = '' . __( 'Get shareable link', 'woocommerce-smart-coupons' ) . ''; - - if ( function_exists( 'duplicate_post_plugin_activation' ) ) { - return $actions; - } else { - $actions['duplicate'] = '' . __( 'Duplicate', 'woocommerce-smart-coupons' ) . ''; - } - - return $actions; - } - - /** - * Function to insert post meta values for duplicate coupon - * - * @param int $id ID of parent coupon. - * @param int $new_id ID of duplicated coupon. - */ - public function woocommerce_duplicate_coupon_post_meta( $id, $new_id ) { - global $wpdb; - - $meta_keys = array( 'expiry_date', 'usage_count', '_used_by', 'date_expires' ); - - $how_many = count( $meta_keys ); - $placeholders = array_fill( 0, $how_many, '%s' ); - - $post_meta_infos = $wpdb->get_results( $wpdb->prepare( "SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=%d AND meta_key NOT IN ( " . implode( ',', $placeholders ) . ' )', array_merge( array( $id ), $meta_keys ) ) ); // phpcs:ignore - - if ( 0 !== count( $post_meta_infos ) ) { - $sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) "; - foreach ( $post_meta_infos as $meta_info ) { - $meta_key = $meta_info->meta_key; - $meta_value = $meta_info->meta_value; - $sql_query_sel[] = $wpdb->prepare( 'SELECT %d, %s, %s', $new_id, $meta_key, $meta_value ); - } - $sql_query .= implode( ' UNION ALL ', $sql_query_sel ); - $wpdb->query( $sql_query ); // phpcs:ignore - } - } - - /** - * Function to duplicate post taxonomies for the duplicate coupon - * - * @param int $id ID of parent coupon. - * @param int $new_id ID of duplicated coupon. - * @param string $post_type Post type being duplicated. - */ - public function woocommerce_duplicate_coupon_post_taxonomies( $id, $new_id, $post_type ) { - global $wpdb; - $taxonomies = get_object_taxonomies( $post_type ); - - foreach ( $taxonomies as $taxonomy ) { - $post_terms = wp_get_object_terms( $id, $taxonomy ); - $post_terms_count = count( $post_terms ); - - for ( $i = 0; $i < $post_terms_count; $i++ ) { - wp_set_object_terms( $new_id, $post_terms[ $i ]->slug, $taxonomy, true ); - } - } - } - - /** - * Function to create duplicate coupon and copy all properties of the coupon to duplicate coupon - * - * @param WP_Post $post Post object. - * @param int $parent Post parent ID. - * @param string $post_status Post status. - * @return int $new_post_id - */ - public function woocommerce_create_duplicate_from_coupon( $post, $parent = 0, $post_status = '' ) { - global $wpdb; - - $new_post_author = wp_get_current_user(); - $new_post_date = current_time( 'mysql' ); - $new_post_date_gmt = get_gmt_from_date( $new_post_date ); - - if ( $parent > 0 ) { - $post_parent = $parent; - $post_status = $post_status ? $post_status : 'publish'; - $suffix = ''; - } else { - $post_parent = $post->post_parent; - $post_status = $post_status ? $post_status : 'draft'; - $suffix = __( '(Copy)', 'woocommerce-smart-coupons' ); - } - - $new_post_type = $post->post_type; - $post_content = str_replace( "'", "''", $post->post_content ); - $post_content_filtered = str_replace( "'", "''", $post->post_content_filtered ); - $post_excerpt = str_replace( "'", "''", $post->post_excerpt ); - $post_title = strtolower( str_replace( "'", "''", $post->post_title ) . $suffix ); - $post_name = str_replace( "'", "''", $post->post_name ); - $comment_status = str_replace( "'", "''", $post->comment_status ); - $ping_status = str_replace( "'", "''", $post->ping_status ); - - $wpdb->insert( - $wpdb->posts, - array( - 'post_author' => $new_post_author->ID, - 'post_date' => $new_post_date, - 'post_date_gmt' => $new_post_date_gmt, - 'post_content' => $post_content, - 'post_content_filtered' => $post_content_filtered, - 'post_title' => $post_title, - 'post_excerpt' => $post_excerpt, - 'post_status' => $post_status, - 'post_type' => $new_post_type, - 'comment_status' => $comment_status, - 'ping_status' => $ping_status, - 'post_password' => $post->post_password, - 'to_ping' => $post->to_ping, - 'pinged' => $post->pinged, - 'post_modified' => $new_post_date, - 'post_modified_gmt' => $new_post_date_gmt, - 'post_parent' => 0, // No need to link it with any other coupon. - 'menu_order' => $post->menu_order, - 'post_mime_type' => $post->post_mime_type, - ) - ); // WPCS: db call ok. - - $new_post_id = $wpdb->insert_id; - - $this->woocommerce_duplicate_coupon_post_taxonomies( $post->ID, $new_post_id, $post->post_type ); - - $this->woocommerce_duplicate_coupon_post_meta( $post->ID, $new_post_id ); - - return $new_post_id; - } - - /** - * Function to return post id of the duplicate coupon to be created - * - * @param int $id ID of the coupon to duplicate. - * @return object $post Duplicated post object. - */ - public function woocommerce_get_coupon_to_duplicate( $id ) { - global $wpdb; - $post = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID=%d", $id ) ); // WPCS: cache ok, db call ok. - if ( isset( $post->post_type ) && 'revision' === $post->post_type ) { - $id = $post->post_parent; - $post = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID=%d", $id ) ); // WPCS: cache ok, db call ok. - } - return $post[0]; - } - - /** - * Function to validate condition and create duplicate coupon - */ - public function woocommerce_duplicate_coupon() { - if ( empty( $_REQUEST['post'] ) || ( isset( $_REQUEST['action'] ) && 'duplicate_post_save_as_new_page' === $_REQUEST['action'] ) ) { // phpcs:ignore - wp_die( esc_html__( 'No coupon to duplicate has been supplied!', 'woocommerce-smart-coupons' ) ); - } - - // Get the original page. - $id = absint( $_REQUEST['post'] ); // WPCS: input var ok. - - check_admin_referer( 'woocommerce-duplicate-coupon_' . $id ); - - $post = $this->woocommerce_get_coupon_to_duplicate( $id ); - - if ( isset( $post ) && null !== $post ) { - $new_id = $this->woocommerce_create_duplicate_from_coupon( $post ); - - // If you have written a plugin which uses non-WP database tables to save - // information about a page you can hook this action to dupe that data. - do_action( 'woocommerce_duplicate_coupon', $new_id, $post ); - - // Redirect to the edit screen for the new draft page. - wp_safe_redirect( admin_url( 'post.php?action=edit&post=' . $new_id ) ); - exit; - } else { - /* translators: %d: Post ID */ - wp_die( sprintf( esc_html__( 'Coupon creation failed, could not find original coupon: %d', 'woocommerce-smart-coupons' ), esc_html( $id ) ) ); - } - } - - /** - * Function to call function to create duplicate coupon - */ - public function woocommerce_duplicate_coupon_action() { - $coupon_id = ( ! empty( $_REQUEST['post'] ) ) ? absint( $_REQUEST['post'] ) : 0; - - check_admin_referer( 'woocommerce-duplicate-coupon_' . $coupon_id ); - - $action = ( ! empty( $_REQUEST['action'] ) ) ? wc_clean( wp_unslash( $_REQUEST['action'] ) ) : ''; // phpcs:ignore - - if ( 'duplicate_coupon' !== $action ) { - return; - } - - if ( $this->is_wc_gte_30() ) { - $coupon = new WC_Coupon( $coupon_id ); - - if ( false === $coupon ) { - /* translators: %s: coupon id */ - wp_die( sprintf( esc_html__( 'Coupon creation failed, could not find original coupon: %s', 'woocommerce-smart-coupons' ), esc_html( $coupon_id ) ) ); - } - - $duplicate = $this->coupon_duplicate( $coupon ); - - // Hook rename to match other woocommerce_coupon_* hooks, and to move away from depending on a response from the wp_posts table. - do_action( 'wc_sc_duplicate_coupon', $duplicate, $coupon ); - - // Redirect to the edit screen for the new draft page. - wp_safe_redirect( admin_url( 'post.php?action=edit&post=' . $duplicate->get_id() ) ); - exit; - } else { - $this->woocommerce_duplicate_coupon(); - } - } - - /** - * Duplicate coupon - * - * @param WC_Coupon $coupon The coupon object to duplicate. - * @return WC_Coupon $duplicate The duplicated coupon. - */ - public function coupon_duplicate( $coupon = null ) { - /** - * Filter to allow us to exclude meta keys from coupon duplication.. - * - * @param array $exclude_meta The keys to exclude from the duplicate. - * @param array $existing_meta_keys The meta keys that the coupon already has. - * @since 7.2.0 - */ - $meta_to_exclude = array_filter( - apply_filters( - 'wc_sc_duplicate_coupon_exclude_meta', - array(), - array_map( - function ( $meta ) { - return $meta->key; - }, - $coupon->get_meta_data() - ) - ) - ); - - $duplicate = clone $coupon; - $duplicate->set_id( 0 ); - /* translators: %s contains the code of the original coupon. */ - $duplicate->set_code( sprintf( '%s-copy', $duplicate->get_code() ) ); - $duplicate->set_status( 'draft' ); - $duplicate->set_date_created( null ); - $duplicate->set_usage_count( 0 ); - $duplicate->set_used_by( array() ); - $duplicate->set_date_expires( null ); - - foreach ( $meta_to_exclude as $meta_key ) { - $duplicate->delete_meta_data( $meta_key ); - } - - /** - * This action can be used to modify the object further before it is created - it will be passed by reference. - * - * @since 3.0 - */ - do_action( 'wc_sc_coupon_duplicate_before_save', $duplicate, $coupon ); - - // Save parent coupon. - $duplicate_id = $duplicate->save(); - - $duplicate = new WC_Coupon( $duplicate_id ); - - $this->woocommerce_duplicate_coupon_post_taxonomies( $coupon->get_id(), $duplicate_id, 'shop_coupon' ); - - if ( ! empty( $duplicate_id ) && 'draft' !== $duplicate->get_status() ) { - $args = array( - 'ID' => $duplicate_id, - 'post_status' => 'draft', - ); - wp_update_post( $args ); // Because $coupon->set_status( 'draft' ) not working. - } - - return new WC_Coupon( $duplicate_id ); - } - - /** - * Function to copy and share coupon via jQuery. - */ - public function add_post_row_script() { - $screen = get_current_screen(); - if ( 'edit-shop_coupon' === $screen->id ) { - ?> - - '' . esc_html__( 'Settings', 'woocommerce-smart-coupons' ) . '', - 'faqs' => '' . esc_html__( 'FAQ\'s', 'woocommerce-smart-coupons' ) . '', - 'docs' => '' . __( 'Docs', 'woocommerce-smart-coupons' ) . '', - 'support' => '' . __( 'Support', 'woocommerce-smart-coupons' ) . '', - 'review' => '' . __( 'Review', 'woocommerce-smart-coupons' ) . '', - ); - - return array_merge( $action_links, $links ); - } - - /** - * Handle Smart Coupons review notice action - */ - public function wc_sc_review_notice_action() { - - check_ajax_referer( 'wc-sc-review-notice-action', 'security' ); - - $post_do = ( ! empty( $_POST['do'] ) ) ? wc_clean( wp_unslash( $_POST['do'] ) ) : ''; // phpcs:ignore - - $option = strtotime( '+1 month' ); - if ( 'remove' === $post_do ) { - $option = 'no'; - } - - update_option( 'wc_sc_is_show_review_notice', $option, 'no' ); - - wp_send_json( array( 'success' => 'yes' ) ); - - } - - /** - * Handle Smart Coupons version 4.0.0 notice action - */ - public function wc_sc_40_notice_action() { - - check_ajax_referer( 'wc-sc-40-notice-action', 'security' ); - - update_option( 'wc_sc_is_show_40_notice', 'no', 'no' ); - - wp_send_json( array( 'success' => 'yes' ) ); - - } - - /** - * Show plugin review notice - */ - public function show_plugin_notice() { - - global $pagenow, $post; - - $valid_post_types = array( 'shop_coupon', 'shop_order', 'product' ); - $valid_pagenow = array( 'edit.php', 'post.php', 'plugins.php' ); - $is_show_review_notice = get_option( 'wc_sc_is_show_review_notice' ); - $is_coupon_enabled = get_option( 'woocommerce_enable_coupons' ); - $get_post_type = ( ! empty( $post->post_type ) ) ? $post->post_type : ''; - $get_page = ( ! empty( $_GET['page'] ) ) ? wc_clean( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore - $get_tab = ( ! empty( $_GET['tab'] ) ) ? wc_clean( wp_unslash( $_GET['tab'] ) ) : ''; // phpcs:ignore - $design = get_option( 'wc_sc_setting_coupon_design', 'basic' ); - - $is_page = ( in_array( $pagenow, $valid_pagenow, true ) || in_array( $get_post_type, $valid_post_types, true ) || ( 'admin.php' === $pagenow && ( 'wc-smart-coupons' === $get_page || 'wc-smart-coupons' === $get_tab ) ) ); - - if ( $is_page && 'yes' !== $is_coupon_enabled ) { - ?> -
            -

            - ' . esc_html__( 'Important', 'woocommerce-smart-coupons' ) . ': ' . esc_html__( 'Setting "Enable the use of coupon codes" is disabled.', 'woocommerce-smart-coupons' ) . ' ' . sprintf( - '%s', - esc_url( - add_query_arg( - array( - 'page' => 'wc-settings', - 'tab' => 'general', - ), - admin_url( 'admin.php' ) - ) - ), - esc_html__( 'Enable', 'woocommerce-smart-coupons' ) - ) . ' ' . esc_html__( 'it to use', 'woocommerce-smart-coupons' ) . ' ' . esc_html__( 'WooCommerce Smart Coupons', 'woocommerce-smart-coupons' ) . ' ' . esc_html__( 'features.', 'woocommerce-smart-coupons' ); - ?> -

            -
            - = absint( $is_show_review_notice ) ) { - if ( ! wp_script_is( 'jquery' ) ) { - wp_enqueue_script( 'jquery' ); - } - ?> - - -
            -
            -
            - -
            -

            - ' . esc_html__( 'WooCommerce Smart Coupons', 'woocommerce-smart-coupons' ) . ' ' . esc_html__( 'so far?', 'woocommerce-smart-coupons' ) . '
            ' . esc_html__( 'Please consider', 'woocommerce-smart-coupons' ) . ' ' . esc_html__( 'leaving a review', 'woocommerce-smart-coupons' ) . ' ' . esc_html__( '! If things aren\'t going quite as expected, we\'re happy to help -- please reach out to', 'woocommerce-smart-coupons' ) . ' ' . esc_html__( 'our support team', 'woocommerce-smart-coupons' ) . '.'; ?> -

            -
            - -
            -

            - ' . esc_html__( 'WooCommerce Smart Coupons', 'woocommerce-smart-coupons' ) . '', - '' . esc_html__( - 'Smart Coupons settings', - 'woocommerce-smart-coupons' - ) . '' - ); - ?> -

            -
            - post_type ) ) ? $post->post_type : ''; - $get_page = ( ! empty( $_GET['page'] ) ) ? wc_clean( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore - $get_tab = ( ! empty( $_GET['tab'] ) ) ? wc_clean( wp_unslash( $_GET['tab'] ) ) : ''; // phpcs:ignore - $sc_pages = array( 'wc-smart-coupons', 'sc-about', 'sc-faqs' ); - - if ( in_array( $get_page, $sc_pages, true ) || 'shop_coupon' === $get_post_type || 'wc-smart-coupons' === $get_tab ) { - ?> - - 5-star rating here' ) ); - } - } - - return $sc_rating_text; - - } - - /** - * Function to 'Connect your store' notice on Smart Coupons pages in admin - * - * @param string $sc_text Text in footer (right). - * @return string $sc_text - */ - public function wc_sc_update_footer_text( $sc_text ) { - - global $post, $pagenow; - - if ( ! empty( $pagenow ) ) { - $get_post_type = ( ! empty( $post->post_type ) ) ? $post->post_type : ''; - $get_page = ( ! empty( $_GET['page'] ) ) ? wc_clean( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore - $get_tab = ( ! empty( $_GET['tab'] ) ) ? wc_clean( wp_unslash( $_GET['tab'] ) ) : ''; // phpcs:ignore - $sc_pages = array( 'wc-smart-coupons', 'sc-about', 'sc-faqs' ); - - if ( in_array( $get_page, $sc_pages, true ) || 'shop_coupon' === $get_post_type || 'wc-smart-coupons' === $get_tab ) { - /* translators: %s: link to submit idea for Smart Coupons on WooCommerce idea board */ - $sc_text = sprintf( __( 'Have a feature request? Submit it %s.', 'woocommerce-smart-coupons' ), '' . __( 'here', 'woocommerce-smart-coupons' ) . '' ); - } - } - - return $sc_text; - - } - - /** - * Function to 'Connect your store' notice on Smart Coupons pages in admin - * - * @param array $screen_ids List of existing screen ids. - * @return array $screen_ids - */ - public function add_wc_connect_store_notice_on_sc_pages( $screen_ids ) { - - array_push( $screen_ids, 'woocommerce_page_wc-smart-coupons' ); - - return $screen_ids; - } - - /** - * Function to render admin notice - * - * @param string $type Notice type. - * @param string $title Notice title. - * @param string $message Notice message. - * @param string $action Notice actions. - * @param bool $dismissible Notice dismissible. - * @return void. - */ - public function show_notice( $type = 'info', $title = '', $message = '', $action = '', $dismissible = false ) { - $css_classes = array( - 'notice', - 'notice-' . $type, - ); - if ( true === $dismissible ) { - $css_classes[] = 'is-dismissible'; - } - ?> -
            - %s

            ', esc_html( $title ) ); - } - if ( ! empty( $message ) ) { - printf( '

            %s

            ', esc_html( $message ) ); - } - if ( ! empty( $action ) ) { - printf( '

            %s

            ', wp_kses_post( $action ) ); - } - ?> -
            - get_status( '4.28.0' ); - if ( 'pending' === $update_status ) { - // Notice for pending update. - $this->db_update_pending_notice(); - } elseif ( 'processing' === $update_status ) { - // Notice for processing update. - $this->db_update_processing_notice(); - } elseif ( 'completed' === $update_status ) { - // Notice for completed update. - $this->db_update_completed_notice(); - $wcsc_db->set_status( '4.28.0', 'done' ); - } - } - - /** - * Function to show pending database update notice - */ - public function db_update_pending_notice() { - global $woocommerce_smart_coupon; - - $plugin_version = $woocommerce_smart_coupon->get_smart_coupons_version(); - /* translators: %s: Plugin name */ - $title = sprintf( __( '%s database update required', 'woocommerce-smart-coupons' ), 'WooCommerce Smart Coupons' ); - $message = __( 'The database update process runs in the background and may take a little while, so please be patient.', 'woocommerce-smart-coupons' ); - $update_url = wp_nonce_url( - add_query_arg( - array( - 'page' => 'wc-settings', - 'tab' => 'wc-smart-coupons', - 'wc_sc_update' => '4.28.0', - ), - admin_url( 'admin.php' ) - ), - 'wc_sc_db_process', - 'wc_sc_db_update_nonce' - ); - $action_button = sprintf( '%2$s', esc_url( $update_url ), __( 'Update database', 'woocommerce-smart-coupons' ) ); - - $this->show_notice( 'warning', $title, $message, $action_button ); - } - - /** - * Function to show database update processing notice. - */ - public function db_update_processing_notice() { - if ( 'woocommerce_page_wc-status' === $this->get_current_screen_id() && isset( $_GET['tab'] ) && 'action-scheduler' === wc_clean( wp_unslash( $_GET['tab'] ) ) ) { // phpcs:ignore - return; - } - - $actions_url = add_query_arg( - array( - 'page' => 'wc-status', - 'tab' => 'action-scheduler', - 's' => 'move_applied_coupon_options_to_transient', - 'status' => 'pending', - ), - admin_url( 'admin.php' ) - ); - $cron_disabled = defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON; - /* translators: %s: Plugin name */ - $message = sprintf( __( '%s is updating the database in the background. The database update process may take a little while, so please be patient.', 'woocommerce-smart-coupons' ), 'WooCommerce Smart Coupons' ); - if ( true === $cron_disabled ) { - $message .= '
            ' . __( 'Note: WP CRON has been disabled on your install which may prevent this update from completing.', 'woocommerce-smart-coupons' ); - } - $action_button = sprintf( '%2$s', esc_url( $actions_url ), __( 'View status', 'woocommerce-smart-coupons' ) ); - $this->show_notice( 'info', '', $message, $action_button ); - } - - /** - * Function to show database update completed notice. - */ - public function db_update_completed_notice() { - /* translators: %s: Plugin name */ - $message = sprintf( __( '%s database update completed. Thank you for updating to the latest version!', 'woocommerce-smart-coupons' ), 'WooCommerce Smart Coupons' ); - $this->show_notice( 'success', '', $message, '', true ); - } - - /** - * Function to get current screen id. - * - * @return string. - */ - public function get_current_screen_id() { - $screen = get_current_screen(); - return $screen ? $screen->id : ''; - } - - } - -} - -WC_SC_Admin_Notifications::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-admin-pages.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-admin-pages.php deleted file mode 100644 index 5c76c0e4..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-admin-pages.php +++ /dev/null @@ -1,1609 +0,0 @@ - - - registered['jquery-ui-core']->ver ) ? $wp_scripts->registered['jquery-ui-core']->ver : '1.9.2'; - - $locale = localeconv(); - $decimal = isset( $locale['decimal_point'] ) ? $locale['decimal_point'] : '.'; - - wp_enqueue_style( 'woocommerce_admin_menu_styles', WC()->plugin_url() . '/assets/css/menu.css', array(), WC()->version ); - wp_enqueue_style( 'woocommerce_admin_styles', WC()->plugin_url() . '/assets/css/admin.css', array(), WC()->version ); - if ( ! wp_style_is( 'jquery-ui-style', 'registered' ) ) { - wp_register_style( 'jquery-ui-style', WC()->plugin_url() . '/assets/css/jquery-ui/jquery-ui' . $suffix . '.css', array(), WC()->version ); - } - if ( ! wp_style_is( 'jquery-ui-style' ) ) { - wp_enqueue_style( 'jquery-ui-style' ); - } - - $woocommerce_admin_params = array( - /* translators: Decimal point */ - 'i18n_decimal_error' => sprintf( __( 'Please enter in decimal (%s) format without thousand separators.', 'woocommerce-smart-coupons' ), $decimal ), - /* translators: Decimal point */ - 'i18n_mon_decimal_error' => sprintf( __( 'Please enter in monetary decimal (%s) format without thousand separators and currency symbols.', 'woocommerce-smart-coupons' ), wc_get_price_decimal_separator() ), - 'i18n_country_iso_error' => __( 'Please enter in country code with two capital letters.', 'woocommerce-smart-coupons' ), - 'i18_sale_less_than_regular_error' => __( 'Please enter in a value less than the regular price.', 'woocommerce-smart-coupons' ), - 'decimal_point' => $decimal, - 'mon_decimal_point' => wc_get_price_decimal_separator(), - 'strings' => array( - 'import_products' => __( 'Import', 'woocommerce-smart-coupons' ), - 'export_products' => __( 'Export', 'woocommerce-smart-coupons' ), - ), - 'urls' => array( - 'import_products' => esc_url_raw( admin_url( 'edit.php?post_type=product&page=product_importer' ) ), - 'export_products' => esc_url_raw( admin_url( 'edit.php?post_type=product&page=product_exporter' ) ), - ), - ); - - $woocommerce_admin_meta_boxes_params = array( - 'remove_item_notice' => __( 'Are you sure you want to remove the selected items? If you have previously reduced this item\'s stock, or this order was submitted by a customer, you will need to manually restore the item\'s stock.', 'woocommerce-smart-coupons' ), - 'i18n_select_items' => __( 'Please select some items.', 'woocommerce-smart-coupons' ), - 'i18n_do_refund' => __( 'Are you sure you wish to process this refund? This action cannot be undone.', 'woocommerce-smart-coupons' ), - 'i18n_delete_refund' => __( 'Are you sure you wish to delete this refund? This action cannot be undone.', 'woocommerce-smart-coupons' ), - 'i18n_delete_tax' => __( 'Are you sure you wish to delete this tax column? This action cannot be undone.', 'woocommerce-smart-coupons' ), - 'remove_item_meta' => __( 'Remove this item meta?', 'woocommerce-smart-coupons' ), - 'remove_attribute' => __( 'Remove this attribute?', 'woocommerce-smart-coupons' ), - 'name_label' => __( 'Name', 'woocommerce-smart-coupons' ), - 'remove_label' => __( 'Remove', 'woocommerce-smart-coupons' ), - 'click_to_toggle' => __( 'Click to toggle', 'woocommerce-smart-coupons' ), - 'values_label' => __( 'Value(s)', 'woocommerce-smart-coupons' ), - 'text_attribute_tip' => __( 'Enter some text, or some attributes by pipe (|) separating values.', 'woocommerce-smart-coupons' ), - 'visible_label' => __( 'Visible on the product page', 'woocommerce-smart-coupons' ), - 'used_for_variations_label' => __( 'Used for variations', 'woocommerce-smart-coupons' ), - 'new_attribute_prompt' => __( 'Enter a name for the new attribute term:', 'woocommerce-smart-coupons' ), - 'calc_totals' => __( 'Calculate totals based on order items, discounts, and shipping?', 'woocommerce-smart-coupons' ), - 'calc_line_taxes' => __( 'Calculate line taxes? This will calculate taxes based on the customers country. If no billing/shipping is set it will use the store base country.', 'woocommerce-smart-coupons' ), - 'copy_billing' => __( 'Copy billing information to shipping information? This will remove any currently entered shipping information.', 'woocommerce-smart-coupons' ), - 'load_billing' => __( 'Load the customer\'s billing information? This will remove any currently entered billing information.', 'woocommerce-smart-coupons' ), - 'load_shipping' => __( 'Load the customer\'s shipping information? This will remove any currently entered shipping information.', 'woocommerce-smart-coupons' ), - 'featured_label' => __( 'Featured', 'woocommerce-smart-coupons' ), - 'prices_include_tax' => esc_attr( get_option( 'woocommerce_prices_include_tax' ) ), - 'round_at_subtotal' => esc_attr( get_option( 'woocommerce_tax_round_at_subtotal' ) ), - 'no_customer_selected' => __( 'No customer selected', 'woocommerce-smart-coupons' ), - 'plugin_url' => WC()->plugin_url(), - 'ajax_url' => admin_url( 'admin-ajax.php' ), - 'order_item_nonce' => wp_create_nonce( 'order-item' ), - 'add_attribute_nonce' => wp_create_nonce( 'add-attribute' ), - 'save_attributes_nonce' => wp_create_nonce( 'save-attributes' ), - 'calc_totals_nonce' => wp_create_nonce( 'calc-totals' ), - 'get_customer_details_nonce' => wp_create_nonce( 'get-customer-details' ), - 'search_products_nonce' => wp_create_nonce( 'search-products' ), - 'grant_access_nonce' => wp_create_nonce( 'grant-access' ), - 'revoke_access_nonce' => wp_create_nonce( 'revoke-access' ), - 'add_order_note_nonce' => wp_create_nonce( 'add-order-note' ), - 'delete_order_note_nonce' => wp_create_nonce( 'delete-order-note' ), - 'calendar_image' => WC()->plugin_url() . '/assets/images/calendar.png', - 'post_id' => '', - 'base_country' => WC()->countries->get_base_country(), - 'currency_format_num_decimals' => wc_get_price_decimals(), - 'currency_format_symbol' => get_woocommerce_currency_symbol(), - 'currency_format_decimal_sep' => esc_attr( wc_get_price_decimal_separator() ), - 'currency_format_thousand_sep' => esc_attr( wc_get_price_thousand_separator() ), - 'currency_format' => esc_attr( str_replace( array( '%1$s', '%2$s' ), array( '%s', '%v' ), get_woocommerce_price_format() ) ), // For accounting JS. - 'rounding_precision' => WC_ROUNDING_PRECISION, - 'tax_rounding_mode' => WC_TAX_ROUNDING_MODE, - 'product_types' => array_map( - 'sanitize_title', - get_terms( - 'product_type', - array( - 'hide_empty' => false, - 'fields' => 'names', - ) - ) - ), - 'i18n_download_permission_fail' => __( 'Could not grant access - the user may already have permission for this file or billing email is not set. Ensure the billing email is set, and the order has been saved.', 'woocommerce-smart-coupons' ), - 'i18n_permission_revoke' => __( 'Are you sure you want to revoke access to this download?', 'woocommerce-smart-coupons' ), - 'i18n_tax_rate_already_exists' => __( 'You cannot add the same tax rate twice!', 'woocommerce-smart-coupons' ), - 'i18n_product_type_alert' => __( 'Your product has variations! Before changing the product type, it is a good idea to delete the variations to avoid errors in the stock reports.', 'woocommerce-smart-coupons' ), - ); - - if ( ! wp_script_is( 'wc-admin-coupon-meta-boxes' ) ) { - wp_enqueue_script( 'wc-admin-coupon-meta-boxes', WC()->plugin_url() . '/assets/js/admin/meta-boxes-coupon' . $suffix . '.js', array( 'woocommerce_admin', 'wc-enhanced-select', 'wc-admin-meta-boxes' ), WC()->version, false ); - } - wp_localize_script( - 'wc-admin-coupon-meta-boxes', - 'woocommerce_admin_meta_boxes_coupon', - array( - 'generate_button_text' => esc_html__( 'Generate coupon code', 'woocommerce-smart-coupons' ), - 'characters' => apply_filters( 'woocommerce_coupon_code_generator_characters', 'ABCDEFGHJKMNPQRSTUVWXYZ23456789' ), - 'char_length' => apply_filters( 'woocommerce_coupon_code_generator_character_length', 8 ), - 'prefix' => apply_filters( 'woocommerce_coupon_code_generator_prefix', '' ), - 'suffix' => apply_filters( 'woocommerce_coupon_code_generator_suffix', '' ), - ) - ); - wp_localize_script( 'wc-admin-meta-boxes', 'woocommerce_admin_meta_boxes', $woocommerce_admin_meta_boxes_params ); - - if ( ! wp_script_is( 'woocommerce_admin' ) ) { - wp_enqueue_script( 'woocommerce_admin', WC()->plugin_url() . '/assets/js/admin/woocommerce_admin' . $suffix . '.js', array( 'jquery', 'jquery-blockui', 'jquery-ui-sortable', 'jquery-ui-widget', 'jquery-ui-core', 'jquery-tiptip' ), WC()->version, false ); - } - wp_localize_script( 'woocommerce_admin', 'woocommerce_admin', $woocommerce_admin_params ); - - } - - /** - * Function to show import message - */ - public function woocommerce_show_import_message() { - global $pagenow, $typenow; - - $get_show_import_message = ( ! empty( $_GET['show_import_message'] ) ) ? wc_clean( wp_unslash( $_GET['show_import_message'] ) ) : ''; // phpcs:ignore - $get_imported = ( ! empty( $_GET['imported'] ) ) ? wc_clean( wp_unslash( $_GET['imported'] ) ) : 0; // phpcs:ignore - $get_skipped = ( ! empty( $_GET['skipped'] ) ) ? wc_clean( wp_unslash( $_GET['skipped'] ) ) : 0; // phpcs:ignore - - if ( empty( $get_show_import_message ) ) { - return; - } - - if ( 'true' === $get_show_import_message ) { - if ( 'edit.php' === $pagenow && 'shop_coupon' === $typenow ) { - - $imported = $get_imported; - $skipped = $get_skipped; - - echo '

            ' . esc_html__( 'Import complete - imported', 'woocommerce-smart-coupons' ) . ' ' . esc_html( $imported ) . ', ' . esc_html__( 'skipped', 'woocommerce-smart-coupons' ) . ' ' . esc_html( $skipped ) . '

            '; - } - } - } - - /** - * Function to include script in admin footer - */ - public function smart_coupons_script_in_footer() { - - global $pagenow; - if ( empty( $pagenow ) ) { - return; - } - - $get_page = ( ! empty( $_GET['page'] ) ) ? wc_clean( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore - $post_type = ( ! empty( $_GET['post_type'] ) ) ? wc_clean( wp_unslash( $_GET['post_type'] ) ) : ''; // phpcs:ignore - - if ( in_array( $get_page, array( 'wc-smart-coupons', 'sc-about', 'sc-faqs' ), true ) || 'shop_coupon' === $post_type ) { - ?> - - coupons
            to your store via a csv file.', 'woocommerce-smart-coupons' ), array( $this, 'coupon_importer' ) ); - } - - if ( 'sent_gift_certificate' === $get_action && 'wc-smart-coupons' === $get_page ) { - $email = $post_smart_coupon_email; - $amount = $post_smart_coupon_amount; - $message = $post_smart_coupon_message; - $this->send_gift_certificate( $email, $amount, $message ); - } - } - - /** - * Function to process & send gift certificate - * - * @param string $email Comma separated email address. - * @param float $amount Coupon amount. - * @param string $message Optional. - */ - public function send_gift_certificate( $email, $amount, $message = '' ) { - - $emails = explode( ',', $email ); - $location = add_query_arg( - array( - 'page' => 'wc-smart-coupons', - 'tab' => 'send-smart-coupons', - ), - admin_url( 'admin.php' ) - ); - $validation_error = ''; - - // Check for valid amount. - if ( ! $amount || ! is_numeric( $amount ) ) { - $validation_error = 'amount_error'; - } - - if ( empty( $validation_error ) ) { - foreach ( $emails as $email ) { - $email = sanitize_email( $email ); - // Check for valid email address. - if ( ( ! $email || ! is_email( $email ) ) ) { - $validation_error = 'email_error'; - break; - } - } - } - - // Proceed to bulk generate if there isn't any validation error. - if ( empty( $validation_error ) ) { - - // Set required $_POST data for bulk generate. - $_POST['no_of_coupons_to_generate'] = count( $emails ); - $_POST['discount_type'] = 'smart_coupon'; - $_POST['smart_coupons_generate_action'] = 'send_store_credit'; - - // includes. - require 'class-wc-sc-coupon-import.php'; - require 'class-wc-sc-coupon-parser.php'; - - $coupon_importer = WC_SC_Coupon_Import::get_instance(); - $action_processed = $coupon_importer->process_bulk_generate_action(); - - if ( false === $action_processed ) { - $location = add_query_arg( - array( - 'process_error' => 'yes', - ), - $location - ); - } - } elseif ( 'amount_error' === $validation_error ) { - $location = add_query_arg( - array( - 'amount_error' => 'yes', - ), - $location - ); - } elseif ( 'email_error' === $validation_error ) { - $location = add_query_arg( - array( - 'email_error' => 'yes', - ), - $location - ); - } - - if ( ! empty( $location ) ) { - wp_safe_redirect( $location ); - exit; - } - } - - /** - * Funtion to perform importing of coupon from csv file - */ - public function coupon_importer() { - - if ( defined( 'WP_LOAD_IMPORTERS' ) ) { - wp_safe_redirect( - add_query_arg( - array( - 'page' => 'wc-smart-coupons', - 'tab' => 'import-smart-coupons', - ), - admin_url( 'admin.php' ) - ) - ); - exit; - } - - // Load Importer API. - require_once ABSPATH . 'wp-admin/includes/import.php'; - - if ( ! class_exists( 'WP_Importer' ) ) { - - $class_wp_importer = ABSPATH . 'wp-admin/includes/class-wp-importer.php'; - - if ( file_exists( $class_wp_importer ) ) { - require $class_wp_importer; - } - } - - // includes. - require 'class-wc-sc-coupon-import.php'; - require 'class-wc-sc-coupon-parser.php'; - - $wc_csv_coupon_import = new WC_SC_Coupon_Import(); - - $wc_csv_coupon_import->dispatch(); - - } - - /** - * Function to add submenu page for Coupon CSV Import - */ - public function woocommerce_coupon_admin_menu() { - if ( $this->is_wc_gte_44() ) { - add_submenu_page( 'woocommerce-marketing', __( 'Smart Coupon', 'woocommerce-smart-coupons' ), __( 'Smart Coupon', 'woocommerce-smart-coupons' ), 'manage_woocommerce', 'wc-smart-coupons', array( $this, 'admin_page' ) ); - } else { - add_submenu_page( 'woocommerce', __( 'Smart Coupon', 'woocommerce-smart-coupons' ), __( 'Smart Coupon', 'woocommerce-smart-coupons' ), 'manage_woocommerce', 'wc-smart-coupons', array( $this, 'admin_page' ) ); - } - } - - /** - * Function to remove submenu link for Smart Coupons - */ - public function woocommerce_coupon_admin_head() { - if ( $this->is_wc_gte_44() ) { - remove_submenu_page( 'woocommerce-marketing', 'wc-smart-coupons' ); - } else { - remove_submenu_page( 'woocommerce', 'wc-smart-coupons' ); - } - } - - /** - * Funtion to show content on the Coupon CSV Importer page - */ - public function admin_page() { - global $store_credit_label; - - $tab = ( ! empty( $_GET['tab'] ) ? ( $_GET['tab'] == 'send-smart-coupons' ? 'send-smart-coupons' : 'import-smart-coupons' ) : 'generate_bulk_coupons' ); // phpcs:ignore - - ?> - -
            -

            - - -

            -
            - -
            - admin_send_certificate(); - break; - case 'import-smart-coupons': - $this->admin_import_page(); - break; - default: - $this->admin_generate_bulk_coupons_and_export(); - break; - } - ?> - -
            - dispatch(); - - } - - /** - * Send Gift Certificate page content - */ - public function admin_send_certificate() { - global $store_credit_label; - - $get_sent = ( ! empty( $_GET['sent'] ) ) ? wc_clean( wp_unslash( $_GET['sent'] ) ) : ''; // phpcs:ignore - $get_email_error = ( ! empty( $_GET['email_error'] ) ) ? wc_clean( wp_unslash( $_GET['email_error'] ) ) : ''; // phpcs:ignore - $get_amount_error = ( ! empty( $_GET['amount_error'] ) ) ? wc_clean( wp_unslash( $_GET['amount_error'] ) ) : ''; // phpcs:ignore - $get_process_error = ( ! empty( $_GET['process_error'] ) ) ? wc_clean( wp_unslash( $_GET['process_error'] ) ) : ''; // phpcs:ignore - - if ( 'yes' === $get_sent ) { - /* translators: %s: singular name for store credit */ - $ack_message = ! empty( $store_credit_label['singular'] ) ? sprintf( esc_html__( '%s sent successfully.', 'woocommerce-smart-coupons' ), esc_html( ucfirst( $store_credit_label['singular'] ) ) ) : esc_html__( 'Store Credit / Gift Certificate sent successfully.', 'woocommerce-smart-coupons' ); - echo '

            ' . esc_html( $ack_message ) . '

            '; - } elseif ( 'yes' === $get_process_error ) { - /* translators: %s: singular name for store credit */ - $error_message = ! empty( $store_credit_label['singular'] ) ? sprintf( esc_html__( 'There has been an error in sending %s.', 'woocommerce-smart-coupons' ), esc_html( ucfirst( $store_credit_label['singular'] ) ) ) : esc_html__( 'There has been an error in sending Store Credit / Gift Certificate.', 'woocommerce-smart-coupons' ); - $error_message = $error_message . ' ' . esc_html__( 'Please try again later.', 'woocommerce-smart-coupons' ); - echo '

            ' . esc_html( $error_message ) . '

            '; - } - - if ( ! wp_script_is( 'jquery' ) ) { - wp_enqueue_script( 'jquery' ); - } - - $message = ''; - $editor_args = array( - 'textarea_name' => 'smart_coupon_message', - 'textarea_rows' => 10, - 'editor_class' => 'wp-editor-message', - 'media_buttons' => true, - 'tinymce' => true, - ); - $editor_id = 'edit_smart_coupon_message'; - - ?> - - - get_preview_email_js( $editor_id ); - ?> -

            - 'wc-smart-coupons', - 'tab' => 'import-smart-coupons', - 'step' => '2', - ), - admin_url( 'admin.php' ) - ); - ?> -

            - -
            - -
            - - - - - - - - - - - - - - - - - - - - - - - -
            - - - - -

            ' . esc_html__( 'Invalid email address.', 'woocommerce-smart-coupons' ) . '

            '; - } - ?> - -
            - - - ' . esc_html( get_woocommerce_currency_symbol() ) . '', '  ' ); // phpcs:ignore - ?> - -

            ' . esc_html__( 'Invalid amount.', 'woocommerce-smart-coupons' ) . '

            '; - } - ?> -
            - - - - -
            - - - -
            - -

            - - get_sample_coupon_code(); - if ( ! empty( $coupon_code ) ) { - ?> - - -

            -
            -
            - get_preview_email_html( $coupon_code ); - } - } - - /** - * Function to get sample coupon code - */ - public function get_sample_coupon_code() { - global $wpdb; - $coupon_code = wp_cache_get( 'wc_sc_any_coupon_code', 'woocommerce_smart_coupons' ); - if ( false === $coupon_code ) { - $coupon_code = $wpdb->get_var( // phpcs:ignore - $wpdb->prepare( - "SELECT post_title - FROM $wpdb->posts AS p - LEFT JOIN $wpdb->postmeta AS pm - ON (p.ID = pm.post_id) - WHERE post_status = %s - AND post_type = %s - AND ( pm.meta_key = %s AND pm.meta_value = %s ) - LIMIT 1", - 'publish', - 'shop_coupon', - 'discount_type', - 'smart_coupon' - ) - ); - wp_cache_set( 'wc_sc_any_coupon_code', $coupon_code, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_any_coupon_code' ); - } - return $coupon_code; - } - - /** - * Function to get preview html for Coupon Emails - * - * @param string $coupon_code Coupon code. - */ - public function get_preview_email_html( $coupon_code = '' ) { - ?> - - is_callable( $coupon, 'save' ) ) ? $coupon->save() : 0; - if ( ! empty( $reference_post_id ) ) { - $args = array( - 'ID' => $reference_post_id, - 'post_status' => 'auto-draft', - ); - wp_update_post( $args ); // Because $coupon->set_status( 'draft' ) not working. - update_option( 'empty_reference_smart_coupons', $reference_post_id, 'no' ); - } - } else { - $reference_post_id = $empty_reference_coupon; - } - - $post = get_post( $reference_post_id ); // phpcs:ignore - - if ( empty( $post ) ) { - $coupon = new WC_Coupon(); - $reference_post_id = ( $this->is_callable( $coupon, 'save' ) ) ? $coupon->save() : 0; - if ( ! empty( $reference_post_id ) ) { - $args = array( - 'ID' => $reference_post_id, - 'post_status' => 'auto-draft', - ); - wp_update_post( $args ); // Because $coupon->set_status( 'auto-draft' ) not working. - update_option( 'empty_reference_smart_coupons', $reference_post_id, 'no' ); - } - $post = get_post( $reference_post_id ); // phpcs:ignore - } - - if ( ! class_exists( 'WC_Meta_Box_Coupon_Data' ) ) { - require_once WC()->plugin_path() . '/includes/admin/meta-boxes/class-wc-meta-box-coupon-data.php'; - } - if ( ! class_exists( 'WC_Admin_Post_Types' ) ) { - require_once WC()->plugin_path() . '/includes/admin/class-wc-admin-post-types.php'; - } - $admin_post_types = new WC_Admin_Post_Types(); - - $is_post_generate_and_import = ( isset( $_POST['generate_and_import'] ) ) ? true : false; // phpcs:ignore - $post_smart_coupons_generate_action = ( ! empty( $_POST['smart_coupons_generate_action'] ) ) ? wc_clean( wp_unslash( $_POST['smart_coupons_generate_action'] ) ) : ''; // phpcs:ignore - - $message = ''; - $editor_args = array( - 'textarea_name' => 'smart_coupon_message', - 'textarea_rows' => 7, - 'editor_class' => 'wp-editor-message', - 'media_buttons' => true, - 'tinymce' => true, - ); - $editor_id = 'edit_smart_coupon_message'; - ?> - - -
            -

            -
            - -

            - - - 'wc-smart-coupons', - 'tab' => 'import-smart-coupons', - 'step' => '2', - ), - admin_url( 'admin.php' ) - ); - ?> -
            - -
            -
            -

            -
            -
            -
            - -

            - - -

            - -

            - -   - -

            - -

            - -   - - 'wc-smart-coupons', - 'tab' => 'import-smart-coupons', - ), - admin_url( 'admin.php' ) - ); - ?> - - ' . esc_html__( 'import', 'woocommerce-smart-coupons' ) . ' ' . esc_html__( 'later', 'woocommerce-smart-coupons' ) . ')'; - ?> - -

            - -

            - -   - - - -
            - -

            -
            -
            -
            -
            - - get_preview_email_js( $editor_id ); - ?> -
            -

            - - ', '' ); - ?> - -

            -
            - edit_form_after_title( $post ); ?> -
            -
            -
            -
            -
            -

            - - - -

            -
            - -
            -
            -
            -
            -
            -

            -
            -
            -
            - -
            - - 'sc_coupon_category' ); - $tax_name = esc_attr( $args['taxonomy'] ); - $taxonomy = get_taxonomy( $args['taxonomy'] ); - ?> -
            - - - - -
            -
              - ID, - array( - 'taxonomy' => $tax_name, - 'popular_cats' => $popular_ids, - ) - ); - ?> -
            -
            -
            -
            -
            -
            -
            -
            - -
            - -

            - -
            -
            -
            - - - query_vars['s'] ) ) { - return; - } - if ( 'shop_coupon' !== $wp->query_vars['post_type'] ) { - return; - } - - $e = substr( $wp->query_vars['s'], 0, 5 ); - - if ( 'email:' === strtolower( substr( $wp->query_vars['s'], 0, 6 ) ) ) { - - $email = trim( substr( $wp->query_vars['s'], 6 ) ); - - if ( ! $email ) { - return; - } - - $post_ids = wp_cache_get( 'wc_sc_get_coupon_ids_by_email_' . sanitize_key( $email ), 'woocommerce_smart_coupons' ); - - if ( false === $post_ids ) { - $post_ids = $wpdb->get_col( - $wpdb->prepare( - "SELECT pm.post_id - FROM {$wpdb->postmeta} AS pm - LEFT JOIN {$wpdb->posts} AS p - ON (p.ID = pm.post_id AND p.post_type = 'shop_coupon') - WHERE pm.meta_key = 'customer_email' - AND pm.meta_value LIKE %s", - '%' . $wpdb->esc_like( $email ) . '%' - ) - ); // WPCS: db call ok. - wp_cache_set( 'wc_sc_get_coupon_ids_by_email_' . sanitize_key( $email ), $post_ids, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_get_coupon_ids_by_email_' . sanitize_key( $email ) ); - } - - if ( empty( $post_ids ) ) { - return; - } - - unset( $wp->query_vars['s'] ); - - $wp->query_vars['post__in'] = $post_ids; - - $wp->query_vars['email'] = $email; - } - - } - - /** - * Function to show label of the search result on coupon - * - * @param mixed $query Query. - * @return mixed $query - */ - public function filter_coupons_using_meta_label( $query ) { - global $pagenow, $typenow, $wp; - - if ( 'edit.php' !== $pagenow ) { - return $query; - } - if ( 'shop_coupon' !== $typenow ) { - return $query; - } - - $s = get_query_var( 's' ); - if ( ! empty( $s ) ) { - return $query; - } - - $email = get_query_var( 'email' ); - - if ( ! empty( $email ) ) { - - $post_type = get_post_type_object( $wp->query_vars['post_type'] ); - /* translators: 1: Singular name for post type 2: Email */ - return sprintf( __( '[%1$s restricted with email: %2$s]', 'woocommerce-smart-coupons' ), $post_type->labels->name, $email ); - } - - return $query; - } - - /** - * WooCommerce Navigation Is Connected Page - * - * @param boolean $is_connected_page Is connected page. - * @param string $current_page The current page. - * @return boolean - */ - public function woocommerce_navigation_is_connected_page( $is_connected_page = false, $current_page = '' ) { - $get_page = ( ! empty( $_GET['page'] ) ) ? wc_clean( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore - if ( empty( $is_connected_page ) && 'wc-smart-coupons' === $get_page ) { - return true; - } - return $is_connected_page; - } - - /** - * WooCommerce Navigation Is Connected Page - * - * @param boolean $breadcrumbs The breadcrumbs. - * @param string $current_page The current page. - * @return boolean - */ - public function woocommerce_navigation_breadcrumbs( $breadcrumbs = array(), $current_page = '' ) { - global $store_credit_label; - $get_page = ( ! empty( $_GET['page'] ) ) ? wc_clean( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore - if ( 'wc-smart-coupons' === $get_page ) { - $breadcrumbs = $this->get_default_breadcrumbs(); - $get_tab = ( ! empty( $_GET['tab'] ) ) ? wc_clean( wp_unslash( $_GET['tab'] ) ) : ''; // phpcs:ignore - switch ( $get_tab ) { - case 'import-smart-coupons': - $breadcrumbs[] = __( 'Import Coupons', 'woocommerce-smart-coupons' ); - break; - case 'send-smart-coupons': - /* translators: Store Credit label */ - $breadcrumbs[] = sprintf( __( 'Send %s', 'woocommerce-smart-coupons' ), ( ( ! empty( $store_credit_label['singular'] ) ) ? ucwords( $store_credit_label['singular'] ) : __( 'Store Credit', 'woocommerce-smart-coupons' ) ) ); - break; - default: - $breadcrumbs[] = __( 'Bulk Generate', 'woocommerce-smart-coupons' ); - break; - } - } - return $breadcrumbs; - } - - /** - * Default breadcrums - * - * @return array - */ - public function get_default_breadcrumbs() { - $breadcrumbs = array(); - $breadcrumbs[] = array( - 'admin.php?page=wc-admin', - __( 'WooCommerce', 'woocommerce-smart-coupons' ), - ); - if ( $this->is_wc_gte_44() ) { // To make sure that the WooCommerce is 4.4 or greater. - $breadcrumbs[] = array( - 'admin.php?page=wc-admin&path=/marketing', - __( 'Marketing', 'woocommerce-smart-coupons' ), - ); - } - $breadcrumbs[] = array( - 'edit.php?post_type=shop_coupon', - __( 'Coupons', 'woocommerce-smart-coupons' ), - ); - return $breadcrumbs; - } - - /** - * Function to add a column to display original amount for store credit to coupons list - * - * @param array $columns The columns. - * @return array - */ - public function add_original_amount_column( $columns = array() ) { - if ( ! array_key_exists( 'wc_sc_original_amount', $columns ) ) { - $columns['wc_sc_original_amount'] = __( 'Original amount', 'woocommerce-smart-coupons' ); - } - return $columns; - } - - /** - * Function to add value to the column to display original amount - * - * @param string $column The column id. - * @param integer $post_id The post id. - */ - public function add_original_amount_column_value( $column = '', $post_id = 0 ) { - if ( 'wc_sc_original_amount' === $column ) { - $column_value = $this->get_post_meta( $post_id, $column, true ); - if ( ! empty( $column_value ) ) { - echo esc_html( $column_value ); - } else { - echo esc_html( '' ); - } - } - } - - } - -} - -WC_SC_Admin_Pages::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-admin-welcome.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-admin-welcome.php deleted file mode 100644 index a78d340b..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-admin-welcome.php +++ /dev/null @@ -1,504 +0,0 @@ -is_wc_gte_44() ) ? 'woocommerce-marketing' : 'woocommerce'; - - switch ( $get_page ) { - case 'sc-about': - add_submenu_page( $parent_slug, $welcome_page_title, $welcome_page_name, 'manage_options', 'sc-about', array( $this, 'about_screen' ) ); - break; - case 'sc-faqs': - add_submenu_page( $parent_slug, $welcome_page_title, $welcome_page_name, 'manage_options', 'sc-faqs', array( $this, 'faqs_screen' ) ); - break; - } - } - - /** - * Add styles just for this page, and remove dashboard page links. - */ - public function admin_head() { - $parent_slug = ( $this->is_wc_gte_44() ) ? 'woocommerce-marketing' : 'woocommerce'; - - remove_submenu_page( $parent_slug, 'sc-about' ); - remove_submenu_page( $parent_slug, 'sc-faqs' ); - - $get_page = ( ! empty( $_GET['page'] ) ) ? wc_clean( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore - - if ( ! empty( $get_page ) && ( 'sc-faqs' === $get_page || 'sc-about' === $get_page ) ) { - ?> - - -

            - -

            - -
            -
            - -
            - -
            -

            - 'wc-settings', - 'tab' => 'wc-smart-coupons', - ), - admin_url( 'admin.php' ) - ); - ?> - - -

            -
            -
            - - - - - - -
            - - intro(); ?> - -
            -
            -
            -

            -

            - - -

            -
            -
            -

            -
              -
            • -
            • -
            • -
            • -
            -

            - -

            -
            -
            -

            -

            - ' . esc_html__( 'WooCommerce Subscriptions', 'woocommerce-smart-coupons' ) . '' ); - ?> -

            -
            -
            -

            -
            -
            -

            -

            - ' . esc_html__( 'any amount', 'woocommerce-smart-coupons' ) . '', '' . esc_html__( 'variable but fixed amount', 'woocommerce-smart-coupons' ) . '.' ); - ?> -

            -
            -
            -

            -

            - ' . esc_html__( 'See how', 'woocommerce-smart-coupons' ) . '.'; ?> -

            -
            -
            -

            -

            - ' . esc_html__( 'See how', 'woocommerce-smart-coupons' ) . '.'; ?> -

            -
            -
            -
            -
            -

            -

            - ' . esc_html__( 'See how', 'woocommerce-smart-coupons' ) . '.'; ?> -

            -
            -
            -

            -

            - -

            -
            -
            -

            -

            - -

            -
            -
            -
            -
            - - - - -
            - - intro(); ?> - -

            - - esc_html__( 'When trying to add coupon/Smart Coupon, I get "Invalid post type" message.', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'Make sure use of coupon is enabled in your store. You can find this setting', 'woocommerce-smart-coupons' ) . ' ' . __( 'here', 'woocommerce-smart-coupons' ) . '.', - ), - array( - 'que' => esc_html__( 'Smart Coupon\'s fields are broken?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'Make sure you are using the ', 'woocommerce-smart-coupons' ) . '' . __( 'latest version of Smart Coupons', 'woocommerce-smart-coupons' ) . '' . esc_html__( '. If still the issue persist, temporarily de-activate all plugins except WooCommerce & Smart Coupons. Re-check the issue, if the issue still persists, contact us (from the link at the end of this page). If the issue goes away, re-activate other plugins one-by-one & re-checking the fields, to find out which plugin is conflicting.', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( 'How to translate texts from Smart Coupons?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'Simplest method is by installing', 'woocommerce-smart-coupons' ) . ' ' . esc_html__( 'Loco Translate', 'woocommerce-smart-coupons' ) . ' ' . esc_html__( 'plugin and then following steps listed ', 'woocommerce-smart-coupons' ) . ' ' . __( 'here', 'woocommerce-smart-coupons' ) . '.', - ), - array( - 'que' => esc_html__( 'How to change texts of the emails sent from Smart Coupons?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'You can do this by overriding the email template.', 'woocommerce-smart-coupons' ) . ' ' . esc_html__( 'How to override email template', 'woocommerce-smart-coupons' ) . '.', - ), - array( - 'que' => esc_html__( 'Can coupon code have any spaces in the name? / My Store Credit/Gift Certificate is not working (not generating new coupon code).', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'No. Coupon code should not have any spaces in the name, Eg, Coupon code should be “gift-certificate” & not “gift certificate”.', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( 'What\'s the URL to a coupon, so it\'s automatically inserted when visiting?', 'woocommerce-smart-coupons' ), - /* translators: Documentation link for 'How to Apply Single or Multiple Coupons on Click of a Link' */ - 'ans' => esc_html__( 'URL of coupon should be like this:', 'woocommerce-smart-coupons' ) . ' https://www.mysite.com/?coupon-code=discount5&sc-page=shop ' . esc_html__( '. Replace www.mysite.com with your own site URL and replace discount5 with the your coupon code.', 'woocommerce-smart-coupons' ) . ' ' . sprintf( esc_html__( 'For more details you can refer to this article: %s', 'woocommerce-smart-coupons' ), '' . esc_html__( 'How to Apply Single or Multiple Coupons on Click of a Link', 'woocommerce-smart-coupons' ) . '' ), - ), - array( - 'que' => esc_html__( 'Do not want to tie store credit to be used by only one customer? / Can a customer send a gift certificate to themselves to pass on to someone else?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'Edit the main coupon which is entered in "Coupons" field of the product edit page, then go to "Usage Restrictions" > "Disable Email Restriction" and disable this setting and save the coupon.', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( 'Getting \'Page Not Found Error\' when accessing Coupons tab from My Account Page?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'Go to WordPress -> Settings -> Permalinks and click on Save Settings once.', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( 'Is there any reference file for creating an import file for coupons?', 'woocommerce-smart-coupons' ), - /* translators: 1. File name 2. File download link */ - 'ans' => sprintf( esc_html__( 'There is one file which is located inside the plugin. You can download the %1$s file from %2$s.', 'woocommerce-smart-coupons' ), 'sample.csv', '' . esc_html__( 'here', 'woocommerce-smart-coupons' ) . '' ) . ' ' . esc_html__( 'If you want to import coupon through file, the file should be like', 'woocommerce-smart-coupons' ) . ' sample.csv', - ), - array( - 'que' => esc_html__( 'Available coupons are not visible on Cart, Checkout & My Account page?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'Smart Coupons uses hooks of Cart, Checkout & My Account page to display available coupons. If your theme is not using those hooks in cart, checkout & my-account template, coupons will not be displayed.', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( 'How can I resend gift card coupon bought by customers?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'You can resend them from order admin edit page.', 'woocommerce-smart-coupons' ) . ' ' . __( 'See how', 'woocommerce-smart-coupons' ) . '.', - ), - array( - 'que' => esc_html__( 'Uncheck "Auto-generate" option in Store Credit is not saving? Is it always checked?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'Store Credit\'s default behavior is auto-generate because, when using a store credit, it\'s balance keeps reducing. Therefore it should be uniquely created for every user automatically.', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( 'Smart Coupons is not sending emails.', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'Smart Coupons sends email only after order completion. So make sure that order complete email is enabled and sending. If enabled, then make sure all settings of coupons, products are in place. Also check by switching your theme.', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( '"Store Credit Receiver detail" form not appearing on checkout page?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'This form is displayed using a hook which is available in My Account template. Make sure your theme\'s my-account template contains all hooks required for that template. Update your theme if it is not updated.', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( 'Does Smart Coupons allow printing of coupon as Gift Card?', 'woocommerce-smart-coupons' ), - /* translators: Documentation link for 'How to Print Coupons' */ - 'ans' => sprintf( esc_html__( 'Yes, Smart Coupons does provide a feature for printing coupons. For more details, check this article: %s', 'woocommerce-smart-coupons' ), '' . esc_html__( 'How to Print Coupons', 'woocommerce-smart-coupons' ) . '' ), - ), - array( - 'que' => esc_html__( 'Is it possible to have a coupon for each variation of the variable product?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'From version 4.11.0, you can add/link coupons to product variations as well. This feature is not available in a version lower than 4.11.0.', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( 'Is Smart Coupons compatible with WooCommerce Subscriptions?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'Yes, Smart Coupons does work with WooCommerce Subscriptions.', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( 'Which features of Smart Coupons work with Subscriptions?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'Give away a discount or credit on signing up a subscription, give away recurring discount or credits, apply credit during sign up, automatic payment for renewals from credit (Note: When using PayPal Standard Gateway, store credit can be applied only during sign up. Automatic payment for renewals by credit will not work for PayPal Standard Gateway).', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( 'How does automatic payment by store credit work with Subscriptions?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'Customers can apply store credit on a subscription during purchase of subscription. If the same store credit has sufficient balance, it\'ll keep applying it to renewals till the remainder in store credit is higher than renewal price. Customers will be able to apply store credit only during signup. They will not get an option to apply store credit in renewals. But if the store credit will not have sufficient balance to pay for the renewals, then the order will go into pending mode. Now when the customer will go to pay for this renewal order, they\'ll get an option to apply store credit again. To activate the subscription again, the customer will have to pay for the renewals. When the customer is paying for the renewals from their account, then in that process they can use the same store credit which didn\'t have the sufficient balance, again & pay for the remaining amount.', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( 'Is it possible to partially pay for a subscription with store credit and the remainder by another method?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'No, this is possible only in those cases where subscription amount is more than store credit\'s balance. If store credit\'s balance is more than subscription\'s total then your bank account or credit card will not be charged.', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( 'Is Smart Coupons WPML compatible?', 'woocommerce-smart-coupons' ), - 'ans' => esc_html__( 'Not yet, but this is being worked on. You will find this in later versions.', 'woocommerce-smart-coupons' ), - ), - array( - 'que' => esc_html__( 'I\'m using WPML & WPML provides support for multi-currency, but Smart Coupons only changes currency symbol & the price value remains same. Can Smart Coupons change the currency symbol and the price value associated with it?', 'woocommerce-smart-coupons' ), - /* translators: Link for the plugin 'Aelia Currency Switcher for WooCommerce' */ - 'ans' => sprintf( esc_html__( 'Currently, Smart Coupons is compatible with %s. But it is not compatible with any other multi-currency plugin or with WPML.', 'woocommerce-smart-coupons' ), '' . esc_html__( 'Aelia Currency Switcher for WooCommerce', 'woocommerce-smart-coupons' ) . '' ), - ), - ); - - $faqs = array_chunk( $faqs, 2 ); - $right_faq_numbering = 1; - $left_faq_numbering = 0; - echo '
            '; - foreach ( $faqs as $fqs ) { - echo '
            '; - foreach ( $fqs as $index => $faq ) { - echo ''; - echo '

            ' . ( ( 1 === absint( $index ) ) ? $right_faq_numbering : ( $left_faq_numbering + 1 ) ) . '. ' . $faq['que'] . '

            '; // phpcs:ignore - echo '

            ' . $faq['ans'] . '

            '; // phpcs:ignore - echo '
            '; - $right_faq_numbering++; - $left_faq_numbering++; - } - echo '
            '; - } - echo '
            '; - ?> - -
            -

            - ' . esc_html__( 'submit a ticket', 'woocommerce-smart-coupons' ) . '' ); // phpcs:ignore - ?> -

            -
            -
            - $post_types, - 'post_status' => 'publish', - 'posts_per_page' => -1, - 's' => $term, - 'fields' => 'all', - ); - - $posts = wp_cache_get( 'wc_sc_search_coupon_by_code_' . sanitize_title( $term ), 'woocommerce_smart_coupons' ); - - if ( false === $posts ) { - $posts = $wpdb->get_results( // phpcs:ignore - $wpdb->prepare( - "SELECT * FROM {$wpdb->prefix}posts - WHERE post_type = %s - AND post_title LIKE %s - AND post_status = %s", - 'shop_coupon', - $wpdb->esc_like( $term ) . '%', - 'publish' - ) - ); - wp_cache_set( 'wc_sc_search_coupon_by_code_' . sanitize_title( $term ), $posts, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_search_coupon_by_code_' . sanitize_title( $term ) ); - } - - $found_products = array(); - - $all_discount_types = wc_get_coupon_types(); - - if ( $posts ) { - foreach ( $posts as $post ) { - - $discount_type = $this->get_post_meta( $post->ID, 'discount_type', true ); - - if ( ! empty( $all_discount_types[ $discount_type ] ) ) { - $discount_type = ' (' . __( 'Type', 'woocommerce-smart-coupons' ) . ': ' . $all_discount_types[ $discount_type ] . ')'; - $found_products[ $post->post_title ] = $post->post_title . $discount_type; - } - } - } - - wp_send_json( $found_products ); - - } - - /** - * Function to search storewide coupons - * - * @param string $x Search term. - * @param array $post_types Post types. - */ - public function sc_json_search_storewide_coupons( $x = '', $post_types = array( 'shop_coupon' ) ) { - global $wpdb; - - check_ajax_referer( 'search-coupons', 'security' ); - - $term = (string) wc_clean( wp_unslash( $_GET['term'] ) ); // phpcs:ignore - - if ( empty( $term ) ) { - die(); - } - - $found_coupons = array(); - $coupon_posts = array(); - - $posts = wp_cache_get( 'wc_sc_search_storewide_coupon_by_code_' . sanitize_title( $term ), 'woocommerce_smart_coupons' ); - - if ( false === $posts ) { - $posts = $wpdb->get_results( // phpcs:ignore - $wpdb->prepare( - "SELECT p.ID, - p.post_title, - pm.meta_key, - pm.meta_value - FROM {$wpdb->posts} AS p - JOIN {$wpdb->postmeta} AS pm - ON (p.ID = pm.post_id AND pm.meta_key IN (%s,%s,%s,%s,%s,%s)) - WHERE p.post_type = %s - AND p.post_title LIKE %s - AND p.post_status = %s", - 'discount_type', - 'coupon_amount', - 'date_expires', - 'auto_generate_coupon', - 'customer_email', - 'wc_sc_expiry_time', - 'shop_coupon', - $wpdb->esc_like( $term ) . '%', - 'publish' - ), - ARRAY_A - ); - wp_cache_set( 'wc_sc_search_storewide_coupon_by_code_' . sanitize_title( $term ), $posts, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_search_storewide_coupon_by_code_' . sanitize_title( $term ) ); - } - - if ( ! empty( $posts ) ) { - foreach ( $posts as $post ) { - $post_id = ( ! empty( $post['ID'] ) ) ? absint( $post['ID'] ) : 0; - $post_title = ( ! empty( $post['post_title'] ) ) ? $post['post_title'] : ''; - if ( empty( $post_id ) || empty( $post_title ) ) { - continue; - } - if ( empty( $coupon_posts[ $post_id ] ) || ! is_array( $coupon_posts[ $post_id ] ) ) { - $coupon_posts[ $post_id ] = array(); - } - $coupon_posts[ $post_id ]['post_id'] = $post_id; - $coupon_posts[ $post_id ]['post_title'] = $post_title; - switch ( $post['meta_key'] ) { - case 'discount_type': - case 'coupon_amount': - case 'date_expires': - case 'auto_generate_coupon': - case 'wc_sc_expiry_time': - $coupon_posts[ $post_id ][ $post['meta_key'] ] = $post['meta_value']; // phpcs:ignore - break; - case 'customer_email': - $coupon_posts[ $post_id ][ $post['meta_key'] ] = maybe_unserialize( $post['meta_value'] ); // phpcs:ignore - break; - } - } - } - - $all_discount_types = wc_get_coupon_types(); - - if ( ! empty( $coupon_posts ) ) { - foreach ( $coupon_posts as $post_id => $coupon_post ) { - $discount_type = ( ! empty( $coupon_post['discount_type'] ) ) ? $coupon_post['discount_type'] : ''; - $coupon_amount = ( ! empty( $coupon_post['coupon_amount'] ) ) ? $coupon_post['coupon_amount'] : 0; - $date_expires = ( ! empty( $coupon_post['date_expires'] ) ) ? absint( $coupon_post['date_expires'] ) : 0; - $wc_sc_expiry_time = ( ! empty( $coupon_post['wc_sc_expiry_time'] ) ) ? absint( $coupon_post['wc_sc_expiry_time'] ) : 0; - $auto_generate_coupon = ( ! empty( $coupon_post['auto_generate_coupon'] ) ) ? $coupon_post['auto_generate_coupon'] : ''; - $customer_email = ( ! empty( $coupon_post['customer_email'] ) ) ? $coupon_post['customer_email'] : array(); - - if ( empty( $discount_type ) || 'smart_coupon' === $discount_type ) { - continue; - } - if ( empty( $coupon_amount ) ) { - continue; - } - if ( ! empty( $date_expires ) ) { - $date_expires += $wc_sc_expiry_time; - if ( time() >= $date_expires ) { - continue; - } - } - if ( 'yes' === $auto_generate_coupon ) { - continue; - } - if ( ! empty( $customer_email ) ) { - continue; - } - - if ( ! empty( $all_discount_types[ $discount_type ] ) ) { - /* translators: 1. The coupon code, 2. The discount type */ - $found_coupons[ $coupon_post['post_title'] ] = sprintf( __( '%1$s (Type: %2$s)', 'woocommerce-smart-coupons' ), $coupon_post['post_title'], $all_discount_types[ $discount_type ] ); - } - } - - $found_coupons = apply_filters( - 'wc_sc_json_search_storewide_coupons', - $found_coupons, - array( - 'source' => $this, - 'search_text' => $term, - 'posts' => $posts, - 'coupon_posts' => $coupon_posts, - ) - ); - } - - wp_send_json( $found_coupons ); - - } - - /** - * JSON Search coupon via ajax - * - * @param string $x Search text. - * @param array $post_types Post types. - */ - public function smart_coupons_json_search( $x = '', $post_types = array( 'shop_coupon' ) ) { - global $wpdb, $store_credit_label; - - check_ajax_referer( 'search-coupons', 'security' ); - - $term = (string) wc_clean( wp_unslash( $_GET['term'] ) ); // phpcs:ignore - - if ( empty( $term ) ) { - die(); - } - - $posts = wp_cache_get( 'wc_sc_shortcode_search_coupon_by_code_' . sanitize_title( $term ), 'woocommerce_smart_coupons' ); - - if ( false === $posts ) { - $posts = $wpdb->get_results( // phpcs:ignore - $wpdb->prepare( - "SELECT * - FROM {$wpdb->prefix}posts - WHERE post_type = %s - AND post_title LIKE %s - AND post_status = %s", - 'shop_coupon', - $wpdb->esc_like( $term ) . '%', - 'publish' - ) - ); - wp_cache_set( 'wc_sc_shortcode_search_coupon_by_code_' . sanitize_title( $term ), $posts, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_shortcode_search_coupon_by_code_' . sanitize_title( $term ) ); - } - - $found_products = array(); - - $all_discount_types = wc_get_coupon_types(); - - if ( $posts ) { - - foreach ( $posts as $post ) { - - $discount_type = $this->get_post_meta( $post->ID, 'discount_type', true ); - if ( ! empty( $all_discount_types[ $discount_type ] ) ) { - - $coupon = new WC_Coupon( $post->post_title ); - - if ( $this->is_wc_gte_30() ) { - $discount_type = $coupon->get_discount_type(); - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - - $coupon_amount = $this->get_amount( $coupon ); - - switch ( $discount_type ) { - - case 'smart_coupon': - $coupon_type = ! empty( $store_credit_label['singular'] ) ? ucwords( $store_credit_label['singular'] ) : __( 'Store Credit', 'woocommerce-smart-coupons' ); - $coupon_amount = wc_price( $coupon_amount ); - break; - - case 'fixed_cart': - $coupon_type = __( 'Cart Discount', 'woocommerce-smart-coupons' ); - $coupon_amount = wc_price( $coupon_amount ); - break; - - case 'fixed_product': - $coupon_type = __( 'Product Discount', 'woocommerce-smart-coupons' ); - $coupon_amount = wc_price( $coupon_amount ); - break; - - case 'percent_product': - $coupon_type = __( 'Product Discount', 'woocommerce-smart-coupons' ); - $coupon_amount = $coupon_amount . '%'; - break; - - case 'percent': - $coupon_type = ( $this->is_wc_gte_30() ) ? __( 'Discount', 'woocommerce-smart-coupons' ) : __( 'Cart Discount', 'woocommerce-smart-coupons' ); - $coupon_amount = $coupon_amount . '%'; - $max_discount = $this->get_post_meta( $post->ID, 'wc_sc_max_discount', true ); - if ( ! empty( $max_discount ) && is_numeric( $max_discount ) ) { - /* translators: %s: Maximum coupon discount amount */ - $coupon_type .= ' ' . sprintf( __( 'upto %s', 'woocommerce-smart-coupons' ), wc_price( $max_discount ) ); - } - break; - - default: - $default_coupon_type = ( ! empty( $all_discount_types[ $discount_type ] ) ) ? $all_discount_types[ $discount_type ] : ucwords( str_replace( array( '_', '-' ), ' ', $discount_type ) ); - $coupon_type = apply_filters( 'wc_sc_coupon_type', $default_coupon_type, $coupon, $all_discount_types ); - $coupon_amount = apply_filters( 'wc_sc_coupon_amount', $coupon_amount, $coupon ); - break; - - } - - $discount_type = ' ( ' . $coupon_amount . ' ' . $coupon_type . ' )'; - $discount_type = wp_strip_all_tags( $discount_type ); - - $found_products[ $post->post_title ] = $post->post_title . ' ' . $discount_type; - } - } - } - - if ( ! empty( $found_products ) ) { - echo wp_json_encode( $found_products ); - } - - die(); - } - - /** - * Function to Hide Notice Delete After Usage - */ - public function hide_notice_delete_after_usage() { - - check_ajax_referer( 'hide-smart-coupons-notice', 'security' ); - - $current_user_id = get_current_user_id(); - update_user_meta( $current_user_id, 'hide_delete_credit_after_usage_notice', 'yes' ); - - wp_send_json( array( 'message' => 'success' ) ); - - } - - } - -} - -WC_SC_Ajax::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-apply-before-tax.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-apply-before-tax.php deleted file mode 100644 index 4e13e190..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-apply-before-tax.php +++ /dev/null @@ -1,634 +0,0 @@ -get_id(); - if ( empty( $order_id ) ) { - return; - } - $coupons = $order->get_items( 'coupon' ); - $order_items = $order->get_items( 'line_item' ); - - if ( empty( $order_items ) && empty( $coupons ) ) { - return; - } - - foreach ( $coupons as $item_id => $item ) { - - $coupon_code = ( is_object( $item ) && is_callable( array( $item, 'get_name' ) ) ) ? $item->get_name() : $item['name']; - - if ( empty( $coupon_code ) ) { - continue; - } - - $coupon = new WC_Coupon( $coupon_code ); - $discount_type = $coupon->get_discount_type(); - - if ( 'smart_coupon' === $discount_type ) { - $sc_include_tax = $this->is_store_credit_include_tax(); - $smart_coupons_contribution = $this->get_post_meta( $order_id, 'smart_coupons_contribution', true, true ); - $smart_coupons_contribution = ( ! empty( $smart_coupons_contribution ) ) ? $smart_coupons_contribution : array(); - - $discount_amount = ( is_object( $item ) && is_callable( array( $item, 'get_discount' ) ) ) ? $item->get_discount() : $this->get_order_item_meta( $item_id, 'discount_amount', true, true ); - $discount_amount_tax = ( is_object( $item ) && is_callable( array( $item, 'get_discount_tax' ) ) ) ? $item->get_discount_tax() : $this->get_order_item_meta( $item_id, 'discount_amount_tax', true, true ); - - if ( is_array( $smart_coupons_contribution ) && count( $smart_coupons_contribution ) > 0 && array_key_exists( $coupon_code, $smart_coupons_contribution ) ) { - // If store credit discount is inclusive of tax then remove discount given tax from Smart Coupons' contribution. - if ( 'yes' === $sc_include_tax && ! empty( $discount_amount_tax ) ) { - $new_discount = $smart_coupons_contribution[ $coupon_code ] - $discount_amount_tax; - } else { - $new_discount = $smart_coupons_contribution[ $coupon_code ]; - } - if ( is_object( $item ) && is_callable( array( $item, 'set_discount' ) ) ) { - $item->set_discount( $new_discount ); - } else { - $item['discount_amount'] = $new_discount; - } - } elseif ( ! empty( $discount_amount ) ) { - if ( is_object( $item ) && is_callable( array( $item, 'set_discount' ) ) ) { - $item->set_discount( $discount_amount ); - } else { - $item['discount_amount'] = $discount_amount; - } - // If discount includes tax then Smart Coupons contribution is sum of discount on product price and discount on tax. - if ( 'yes' === $sc_include_tax && ! empty( $discount_amount_tax ) ) { - $smart_coupons_contribution[ $coupon_code ] = $discount_amount + $discount_amount_tax; - } else { - $smart_coupons_contribution[ $coupon_code ] = $discount_amount; - } - } else { - $coupon_amount = $this->get_amount( $coupon, true, $order ); - $coupon_product_ids = $coupon->get_product_ids(); - $coupon_category_ids = $coupon->get_product_categories(); - - $subtotal = 0; - $items_to_apply_credit = array(); - - if ( count( $coupon_product_ids ) > 0 || count( $coupon_category_ids ) > 0 ) { - foreach ( $order_items as $order_item_id => $order_item ) { - - $product_category_ids = wc_get_product_cat_ids( $order_item['product_id'] ); - - if ( count( $coupon_product_ids ) > 0 && count( $coupon_category_ids ) > 0 ) { - if ( ( in_array( $order_item['product_id'], $coupon_product_ids, true ) || in_array( $order_item['variation_id'], $coupon_product_ids, true ) ) && count( array_intersect( $product_category_ids, $coupon_category_ids ) ) > 0 ) { - $items_to_apply_credit[] = $order_item_id; - } - } else { - if ( in_array( $order_item['product_id'], $coupon_product_ids, true ) || in_array( $order_item['variation_id'], $coupon_product_ids, true ) || count( array_intersect( $product_category_ids, $coupon_category_ids ) ) > 0 ) { - $items_to_apply_credit[] = $order_item_id; - } - } - } - } else { - $items_to_apply_credit = array_keys( $order_items ); - } - - $subtotal = array_sum( array_map( array( $this, 'sc_get_order_subtotal' ), $items_to_apply_credit ) ); - - if ( $subtotal <= 0 ) { - continue; - } - - $store_credit_used = 0; - - foreach ( $items_to_apply_credit as $order_item_id ) { - $order_item = $order_items[ $order_item_id ]; - $discounting_amount = $order_item->get_total(); - // If discount include tax then add item tax to discounting amount to allow discount calculation on tax also. - if ( 'yes' === $sc_include_tax ) { - $item_tax = ( is_callable( array( $order, 'get_line_tax' ) ) ) ? $order->get_line_tax( $order_item ) : 0; - $discounting_amount += $item_tax; - } - $quantity = $order_item->get_quantity(); - $discount = $this->sc_get_discounted_price( $discounting_amount, $quantity, $subtotal, $coupon_amount ); - $discount *= $quantity; - $order_item->set_total( $discounting_amount - $discount ); - - $store_credit_used += $discount; - } - - if ( is_object( $item ) && is_callable( array( $item, 'set_discount' ) ) ) { - $item->set_discount( $store_credit_used ); - } else { - $item['discount_amount'] = $store_credit_used; - } - - $smart_coupons_contribution[ $coupon_code ] = $store_credit_used; - - $this->update_post_meta( $order_id, 'smart_coupons_contribution', $smart_coupons_contribution, true ); - } - - $order->sc_total_credit_used = $smart_coupons_contribution; - } - } - } - } - - /** - * Function to calculate subtotal of items in order which is necessary for applying store credit before tax calculation - * - * @param int $order_item_id Item ID. - * @return float $subtotal - */ - private function sc_get_order_subtotal( $order_item_id ) { - $order_item = WC_Order_Factory::get_order_item( $order_item_id ); - $subtotal = $order_item->get_total(); - - $prices_include_tax = wc_prices_include_tax(); - // Get global setting for whether store credit discount is inclusive of tax or not. - $sc_include_tax = get_option( 'woocommerce_smart_coupon_include_tax', 'no' ); - - // If prices are inclusive of tax and discount amount is also inclusive of tax then add item tax in subtotal to handle discount calculation correctly. - if ( true === $prices_include_tax && 'yes' === $sc_include_tax ) { - $subtotal += $order_item->get_total_tax(); - } - - return $subtotal; - } - - /** - * Function to update_discount_total for an order - * - * @param WC_Order $order Order object. - * @param float $total_credit_used Total store credit used. - */ - public function update_discount_total( $order = '', $total_credit_used = 0 ) { - if ( $order instanceof WC_Order ) { - $discount_total = $order->get_discount_total(); - $sc_credit_used = min( $discount_total, $total_credit_used ); - $order->set_discount_total( $discount_total - $sc_credit_used ); - } - } - - /** - * Function to set discount total for orders that are created manually - * - * @param bool $and_taxes Calc taxes if true. - * @param WC_Order $order Order object. - */ - public function order_set_discount_total( $and_taxes, $order ) { - if ( isset( $order->sc_total_credit_used ) && is_array( $order->sc_total_credit_used ) && count( $order->sc_total_credit_used ) > 0 ) { - $total_credit_used = array_sum( $order->sc_total_credit_used ); - $this->update_discount_total( $order, $total_credit_used ); - - $pending_statuses = $this->get_pending_statuses(); - - if ( ! empty( $_POST['action'] ) && 'woocommerce_add_coupon_discount' === wp_unslash( $_POST['action'] ) && $order->has_status( $pending_statuses ) && did_action( 'sc_after_order_calculate_discount_amount' ) <= 0 ) { // phpcs:ignore - do_action( 'sc_after_order_calculate_discount_amount', $order->get_id() ); - } - } - } - - /** - * Function to set discount total for a new order - * - * @param WC_Order $order Order object. - */ - public function cart_set_discount_total( $order ) { - if ( isset( WC()->cart->smart_coupon_credit_used ) && is_array( WC()->cart->smart_coupon_credit_used ) && count( WC()->cart->smart_coupon_credit_used ) > 0 ) { - $total_credit_used = array_sum( WC()->cart->smart_coupon_credit_used ); - $this->update_discount_total( $order, $total_credit_used ); - } - } - - /** - * Function to apply store credit before tax calculation for cart items - */ - public function cart_calculate_discount_amount() { - $cart = ( isset( WC()->cart ) ) ? WC()->cart : ''; - - if ( $cart instanceof WC_Cart ) { - $cart_contents = WC()->cart->get_cart(); - $coupons = $cart->get_coupons(); - - if ( ! empty( $coupons ) ) { - $items_to_apply_credit = array(); - - foreach ( $coupons as $coupon_code => $coupon ) { - $discount_type = $coupon->get_discount_type(); - - if ( 'smart_coupon' === $discount_type ) { - $coupon_product_ids = $coupon->get_product_ids(); - $coupon_category_ids = $coupon->get_product_categories(); - - if ( count( $coupon_product_ids ) > 0 || count( $coupon_category_ids ) > 0 ) { - - foreach ( $cart_contents as $cart_item_key => $cart_item ) { - $product_category_ids = wc_get_product_cat_ids( $cart_item['product_id'] ); - - if ( count( $coupon_product_ids ) > 0 && count( $coupon_category_ids ) > 0 ) { - if ( ( in_array( $cart_item['product_id'], $coupon_product_ids, true ) || in_array( $cart_item['variation_id'], $coupon_product_ids, true ) ) && count( array_intersect( $product_category_ids, $coupon_category_ids ) ) > 0 ) { - $items_to_apply_credit[ $coupon_code ][] = $cart_item_key; - } - } else { - if ( in_array( $cart_item['product_id'], $coupon_product_ids, true ) || in_array( $cart_item['variation_id'], $coupon_product_ids, true ) || count( array_intersect( $product_category_ids, $coupon_category_ids ) ) > 0 ) { - $items_to_apply_credit[ $coupon_code ][] = $cart_item_key; - } - } - } - } else { - $items_to_apply_credit[ $coupon_code ] = array_keys( $cart_contents ); - } - } - } - - if ( ! empty( $items_to_apply_credit ) ) { - WC()->cart->sc_items_to_apply_credit = $items_to_apply_credit; - } - } - } - - } - - /** - * Get discount amount for a cart item. - * - * @param float $discount Amount this coupon has discounted. - * @param float $discounting_amount Amount the coupon is being applied to. - * @param array|null $cart_item Cart item being discounted if applicable. - * @param bool $single True if discounting a single qty item, false if its the line. - * @param WC_Coupon $coupon Coupon object. - * @return float $discount - */ - public function cart_return_discount_amount( $discount, $discounting_amount, $cart_item, $single, $coupon ) { - - if ( ! is_object( $coupon ) || ! is_a( $coupon, 'WC_Coupon' ) ) { - return $discount; - } - - $discount_type = is_callable( array( $coupon, 'get_discount_type' ) ) ? $coupon->get_discount_type() : ''; - if ( 'smart_coupon' !== $discount_type ) { - return $discount; - } - - $coupon_code = is_callable( array( $coupon, 'get_code' ) ) ? $coupon->get_code() : ''; - - if ( is_object( $cart_item ) && is_a( $cart_item, 'WC_Order_Item_Product' ) ) { - return $this->calculate_discount_amount_for_rest_api( $discount, $discounting_amount, $cart_item, $single, $coupon ); - } - - $coupon_amount = $this->get_amount( $coupon, true ); - - $product = isset( $cart_item['data'] ) ? $cart_item['data'] : array(); - $quantity = $cart_item['quantity']; - - // Compatibility for WC version < 3.2.0. - if ( ! isset( $cart_item['key'] ) ) { - $product_id = ( ! empty( $cart_item['variation_id'] ) ) ? $cart_item['variation_id'] : $cart_item['product_id']; - - foreach ( WC()->cart->cart_contents as $key => $cart_data ) { - $cart_data_product_id = ( ! empty( $cart_data['variation_id'] ) ) ? $cart_data['variation_id'] : $cart_data['product_id']; - - if ( $product_id === $cart_data_product_id ) { - $cart_item['key'] = $key; - } - } - } - - $prices_include_tax = ( 'incl' === get_option( 'woocommerce_tax_display_cart' ) ) ? true : false; - if ( true === $prices_include_tax ) { - $sc_include_tax = get_option( 'woocommerce_smart_coupon_include_tax', 'no' ); - if ( 'no' === $sc_include_tax ) { - $discounting_amount = $cart_item['line_subtotal'] / $quantity; - } - } - - $items_to_apply_credit = isset( WC()->cart->sc_items_to_apply_credit ) ? WC()->cart->sc_items_to_apply_credit : array(); - - if ( ! empty( $items_to_apply_credit ) && is_array( $items_to_apply_credit ) && array_key_exists( $coupon_code, $items_to_apply_credit ) && in_array( $cart_item['key'], $items_to_apply_credit[ $coupon_code ], true ) ) { - - $credit_left = isset( $this->sc_credit_left[ $coupon_code ] ) ? $this->sc_credit_left[ $coupon_code ] : $coupon_amount; - $total_discounting_amount = $discounting_amount * $quantity; - if ( isset( $this->remaining_total_to_apply_credit[ $cart_item['key'] ] ) ) { - $total_discounting_amount = wc_remove_number_precision( $this->remaining_total_to_apply_credit[ $cart_item['key'] ] ); - } - $applied_discount = min( $total_discounting_amount, $credit_left ); - - $this->sc_credit_left[ $coupon_code ] = ( $total_discounting_amount < $credit_left ) ? $credit_left - $total_discounting_amount : 0; - - $discount = $applied_discount / $quantity; - } - - return $discount; - } - - /** - * Calculate discount amount for REST API. - * - * @param float $discount Amount this coupon has discounted. - * @param float $discounting_amount Amount the coupon is being applied to. - * @param WC_Order_Item_Product $cart_item Object. - * @param bool $single True if discounting a single qty item, false if its the line. - * @param WC_Coupon $coupon Object. - * @return float|int|mixed - */ - public function calculate_discount_amount_for_rest_api( $discount = 0, $discounting_amount = 0, $cart_item = object, $single = false, $coupon = object ) { - - if ( ! is_object( $coupon ) || ! is_a( $coupon, 'WC_Coupon' ) ) { - return $discount; - } - - if ( ! is_object( $cart_item ) || ! is_a( $cart_item, 'WC_Order_Item_Product' ) ) { - return $discount; - } - - $product_id = ( is_callable( array( $cart_item, 'get_product_id' ) ) ) ? $cart_item->get_product_id() : 0; - $variation_id = ( is_callable( array( $cart_item, 'get_variation_id' ) ) ) ? $cart_item->get_variation_id() : 0; - $quantity = ( is_callable( array( $cart_item, 'get_quantity' ) ) ) ? $cart_item->get_quantity() : 1; - $item_id = ( is_callable( array( $cart_item, 'get_id' ) ) ) ? $cart_item->get_id() : 0; - $product_subtotal = ( is_callable( array( $cart_item, 'get_subtotal' ) ) ) ? $cart_item->get_subtotal() : 0; - $product_subtotal_tax = ( is_callable( array( $cart_item, 'get_subtotal_tax' ) ) ) ? $cart_item->get_subtotal_tax() : 0; - $order = ( is_callable( array( $cart_item, 'get_order' ) ) ) ? $cart_item->get_order() : null; - $coupon_code = ( is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - $discount_type = ( is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - - if ( 'smart_coupon' !== $discount_type ) { - return $discount; - } - - $coupon_amount = $this->get_amount( $coupon, true, $order ); - - if ( ! empty( $this->sc_api_credit_left[ $item_id ][ $variation_id ] ) ) { - return $this->sc_api_credit_left[ $item_id ][ $variation_id ] / $quantity; - } elseif ( ! empty( $this->sc_api_credit_left[ $item_id ][ $product_id ] ) ) { - return $this->sc_api_credit_left[ $item_id ][ $product_id ] / $quantity; - } - if ( isset( $this->sc_api_credit_left[ $coupon_code ] ) && empty( $this->sc_api_credit_left[ $coupon_code ] ) ) { - return $discount; - } - - $prices_include_tax = ( 'yes' === get_option( 'woocommerce_prices_include_tax' ) ) ? true : false; - if ( true === $prices_include_tax ) { - $sc_include_tax = get_option( 'woocommerce_smart_coupon_include_tax', 'no' ); - if ( 'no' === $sc_include_tax ) { - $discounting_amount = $product_subtotal / $quantity; - } - } - - $credit_left = ( ! empty( $this->sc_api_credit_left ) && isset( $this->sc_api_credit_left[ $coupon_code ] ) ) ? $this->sc_api_credit_left[ $coupon_code ] : $coupon_amount; - - if ( $credit_left > 0 ) { - - $discount = $discounting_amount * $quantity; - - if ( $credit_left >= $discount ) { - $credit_left = $credit_left - $discount; - $this->sc_api_credit_left[ $coupon_code ] = $credit_left; - } else { - $discount = $credit_left; - $this->sc_api_credit_left[ $coupon_code ] = 0; - } - } - - if ( ! empty( $variation_id ) ) { - $this->sc_api_credit_left[ $item_id ][ $variation_id ] = $discount; - } else { - $this->sc_api_credit_left[ $item_id ][ $product_id ] = $discount; - } - return $discount; - - } - - - /** - * Discount details for store credit - * - * @param array $discounts The discount details. - * @param WC_Coupon $coupon The coupon object. - * @return array - */ - public function store_credit_discounts_array( $discounts = array(), $coupon = null ) { - $cart = ( isset( WC()->cart ) ) ? WC()->cart : ''; - if ( $cart instanceof WC_Cart ) { - $cart_contents = ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'get_cart' ) ) ) ? WC()->cart->get_cart() : array(); - if ( ! empty( $cart_contents ) ) { - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - if ( 'smart_coupon' === $discount_type ) { - $prices_include_tax = ( 'incl' === get_option( 'woocommerce_tax_display_cart' ) ) ? true : false; - if ( true === $prices_include_tax ) { - $sc_include_tax = get_option( 'woocommerce_smart_coupon_include_tax', 'no' ); - if ( 'no' === $sc_include_tax ) { - if ( ! empty( $discounts ) ) { - foreach ( $discounts as $item_key => $discount ) { - $line_subtotal = wc_round_discount( wc_add_number_precision( $cart_contents[ $item_key ]['line_subtotal'] ), 0 ); - $line_subtotal = ( isset( $this->remaining_total_to_apply_credit[ $item_key ] ) ) ? min( $this->remaining_total_to_apply_credit[ $item_key ], $line_subtotal ) : $line_subtotal; - $discount = min( $discount, $line_subtotal ); - $discounts [ $item_key ] = $discount; - $this->remaining_total_to_apply_credit[ $item_key ] = $line_subtotal - $discount; - } - } - } - } - } - } - } - return $discounts; - } - - /** - * Set smart coupon credit used - */ - public function cart_set_total_credit_used() { - - $coupon_discount_totals = ( is_callable( array( 'WC_Cart', 'get_coupon_discount_totals' ) ) ) ? WC()->cart->get_coupon_discount_totals() : WC()->cart->coupon_discount_amounts; - $coupon_discount_tax_totals = ( is_callable( array( 'WC_Cart', 'get_coupon_discount_tax_totals' ) ) ) ? WC()->cart->get_coupon_discount_tax_totals() : WC()->cart->coupon_discount_tax_amounts; - $sc_total_credit_used = array(); - - if ( ! empty( $coupon_discount_totals ) && is_array( $coupon_discount_totals ) && count( $coupon_discount_totals ) > 0 ) { - foreach ( $coupon_discount_totals as $coupon_code => $total ) { - $coupon = new WC_Coupon( $coupon_code ); - $discount_type = $coupon->get_discount_type(); - - if ( 'smart_coupon' === $discount_type ) { - $sc_total_credit_used[ $coupon_code ] = $total; - - if ( ! empty( $coupon_discount_tax_totals[ $coupon_code ] ) ) { - $sc_include_tax = $this->is_store_credit_include_tax(); - if ( 'yes' === $sc_include_tax ) { - $sc_total_credit_used[ $coupon_code ] += $coupon_discount_tax_totals[ $coupon_code ]; - } else { - $prices_include_tax = ( 'incl' === get_option( 'woocommerce_tax_display_cart' ) ) ? true : false; - if ( true === $prices_include_tax ) { - $apply_before_tax = get_option( 'woocommerce_smart_coupon_apply_before_tax', 'no' ); - if ( 'yes' === $apply_before_tax ) { - $_sc_include_tax = get_option( 'woocommerce_smart_coupon_include_tax', 'no' ); - if ( 'no' === $_sc_include_tax ) { - $sc_total_credit_used[ $coupon_code ] += $coupon_discount_tax_totals[ $coupon_code ]; - } - } - } - } - } - } - } - } - - if ( ! empty( $sc_total_credit_used ) ) { - WC()->cart->smart_coupon_credit_used = $sc_total_credit_used; - } - } - - /** - * Function to calculate discount amount for an item - * - * @param float $discounting_amount Amount the coupon is being applied to. - * @param int $quantity Item quantity. - * @param float $subtotal Cart/Order subtotal. - * @param float $coupon_amount Coupon amount. - * @return float $discount - */ - public function sc_get_discounted_price( $discounting_amount = 0, $quantity = 1, $subtotal = 0, $coupon_amount = 0 ) { - $discount = 0; - $discounting_amount = $discounting_amount / $quantity; - $discount_percent = ( $discounting_amount * $quantity ) / $subtotal; - - $discount = ( $coupon_amount * $discount_percent ) / $quantity; - $discount = min( $discount, $discounting_amount ); - - return $discount; - } - - /** - * Function to add cart item key for MNM child items. - * This was need because MNM child items didn't had cart item key inside $cart_item_data array and the - * function WC_SC_Apply_Before_Tax::cart_return_discount_amount() uses cart item key to set discount amount. - * - * @param array $cart_item_data Cart item data. - * @param string $cart_item_key Cart item key. - * @return float $cart_item_data - */ - public function sc_mnm_compat( $cart_item_data, $cart_item_key ) { - if ( ! empty( $cart_item_data['mnm_container'] ) ) { - $cart_item_data['key'] = $cart_item_key; - } - - return $cart_item_data; - } - - /** - * Reset credit left to the defaults. - */ - public function cart_reset_credit_left() { - $this->sc_credit_left = array(); - $this->sc_api_credit_left = array(); - $this->remaining_total_to_apply_credit = array(); - } - } -} - -WC_SC_Apply_Before_Tax::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-auto-apply-coupon.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-auto-apply-coupon.php deleted file mode 100644 index 921d491a..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-auto-apply-coupon.php +++ /dev/null @@ -1,562 +0,0 @@ - - -
            - 'wc_sc_auto_apply_coupon', - 'label' => __( 'Auto apply?', 'woocommerce-smart-coupons' ), - 'description' => __( 'When checked, this coupon will be applied automatically, if it is valid. If enabled in more than 5 coupons, only 5 coupons will be applied automatically, rest will be ignored.', 'woocommerce-smart-coupons' ), - ) - ); - ?> -
            - is_callable( $coupon, 'update_meta_data' ) && $this->is_callable( $coupon, 'save' ); - - // Get list of ids of coupons to auto apply. - $auto_apply_coupon_ids = get_option( 'wc_sc_auto_apply_coupon_ids', array() ); - $auto_apply_coupon_ids = array_map( 'absint', $auto_apply_coupon_ids ); - $post_id = absint( $post_id ); - if ( isset( $_POST['wc_sc_auto_apply_coupon'] ) && isset( $_POST['discount_type'] ) && 'smart_coupon' !== wc_clean( wp_unslash( $_POST['discount_type'] ) ) ) { // phpcs:ignore - $auto_apply_coupon = wc_clean( wp_unslash( $_POST['wc_sc_auto_apply_coupon'] ) ); // phpcs:ignore - if ( true === $is_callable_coupon_update_meta ) { - $coupon->update_meta_data( 'wc_sc_auto_apply_coupon', $auto_apply_coupon ); - $coupon->save(); - } else { - $this->update_post_meta( $post_id, 'wc_sc_auto_apply_coupon', $auto_apply_coupon ); - } - // Add coupon id to auto apply coupon list if haven't added already. - if ( is_array( $auto_apply_coupon_ids ) && ! in_array( $post_id, $auto_apply_coupon_ids, true ) ) { - $auto_apply_coupon_ids[] = $post_id; - } - } else { - if ( true === $is_callable_coupon_update_meta ) { - $coupon->update_meta_data( 'wc_sc_auto_apply_coupon', 'no' ); - $coupon->save(); - } else { - $this->update_post_meta( $post_id, 'wc_sc_auto_apply_coupon', 'no' ); - } - // Remove coupon id from auto apply coupon list if auto apply is disabled. - if ( is_array( $auto_apply_coupon_ids ) && in_array( $post_id, $auto_apply_coupon_ids, true ) ) { - $auto_apply_coupon_ids = array_diff( $auto_apply_coupon_ids, array( $post_id ) ); - } - } - update_option( 'wc_sc_auto_apply_coupon_ids', $auto_apply_coupon_ids, 'no' ); - } - - /** - * Add meta in export headers - * - * @param array $headers Existing headers. - * @return array - */ - public function export_headers( $headers = array() ) { - - $headers['wc_sc_auto_apply_coupon'] = __( 'Auto apply?', 'woocommerce-smart-coupons' ); - - return $headers; - } - - /** - * Post meta defaults for auto apply coupon meta - * - * @param array $defaults Existing postmeta defaults. - * @return array $defaults Modified postmeta defaults - */ - public function postmeta_defaults( $defaults = array() ) { - - $defaults['wc_sc_auto_apply_coupon'] = ''; - - return $defaults; - } - - /** - * Add auto apply coupon's meta with value in coupon meta - * - * @param array $data The row data. - * @param array $post The POST values. - * @return array $data Modified row data - */ - public function generate_coupon_meta( $data = array(), $post = array() ) { - - if ( isset( $post['discount_type'] ) && 'smart_coupon' !== $post['discount_type'] ) { - $data['wc_sc_auto_apply_coupon'] = ( isset( $post['wc_sc_auto_apply_coupon'] ) ) ? $post['wc_sc_auto_apply_coupon'] : ''; - } - - return $data; - } - - /** - * Process coupon meta value for import - * - * @param mixed $meta_value The meta value. - * @param array $args Additional Arguments. - * @return mixed $meta_value - */ - public function process_coupon_meta_value_for_import( $meta_value = null, $args = array() ) { - - $discount_type = isset( $args['discount_type'] ) ? $args['discount_type'] : ''; - if ( 'smart_coupon' !== $discount_type && ! empty( $args['meta_key'] ) && 'wc_sc_auto_apply_coupon' === $args['meta_key'] ) { - $auto_apply_coupon = $meta_value; - if ( 'yes' === $auto_apply_coupon ) { - $auto_apply_coupon_ids = get_option( 'wc_sc_auto_apply_coupon_ids', array() ); - $auto_apply_coupon_ids = array_map( 'absint', $auto_apply_coupon_ids ); - $coupon_id = ( isset( $args['post']['post_id'] ) ) ? absint( $args['post']['post_id'] ) : 0; - if ( ! empty( $coupon_id ) && ! in_array( $coupon_id, $auto_apply_coupon_ids, true ) ) { - $auto_apply_coupon_ids[] = $coupon_id; - update_option( 'wc_sc_auto_apply_coupon_ids', $auto_apply_coupon_ids, 'no' ); - } - } - } - - return $meta_value; - } - - /** - * Make meta data of auto apply coupon meta protected - * - * @param bool $protected Is protected. - * @param string $meta_key The meta key. - * @param string $meta_type The meta type. - * @return bool $protected - */ - public function make_action_meta_protected( $protected = false, $meta_key = '', $meta_type = '' ) { - - if ( 'wc_sc_auto_apply_coupon' === $meta_key ) { - return true; - } - - return $protected; - } - - /** - * Get auto applied coupons - * - * @since 4.27.0 - * @return array - */ - public function get_auto_applied_coupons() { - $coupons = ( is_object( WC()->session ) && is_callable( array( WC()->session, 'get' ) ) ) ? WC()->session->get( 'wc_sc_auto_applied_coupons' ) : array(); - return apply_filters( 'wc_sc_' . __FUNCTION__, ( ! empty( $coupons ) && is_array( $coupons ) ? $coupons : array() ), array( 'source' => $this ) ); - } - - /** - * Add auto applied coupon to WC session - * - * @since 4.27.0 - * @param string $coupon_code Coupon Code. - */ - public function set_auto_applied_coupon( $coupon_code = '' ) { - if ( ! empty( $coupon_code ) ) { - $coupons = $this->get_auto_applied_coupons(); - // Check if auto applied coupons are not empty. - if ( ! empty( $coupons ) && is_array( $coupons ) ) { - $coupons[] = $coupon_code; - } else { - $coupons = array( $coupon_code ); - } - if ( is_object( WC()->session ) && is_callable( array( WC()->session, 'set' ) ) ) { - WC()->session->set( 'wc_sc_auto_applied_coupons', $coupons ); - } - } - } - - /** - * Remove an auto applied coupon from WC session - * - * @since 4.31.0 - * @param string $coupon_code Coupon Code. - */ - public function unset_auto_applied_coupon( $coupon_code = '' ) { - if ( ! empty( $coupon_code ) ) { - $update = false; - $coupons = $this->get_auto_applied_coupons(); - // Check if auto applied coupons are not empty. - if ( ! empty( $coupons ) && in_array( $coupon_code, $coupons, true ) ) { - $coupons = array_diff( $coupons, array( $coupon_code ) ); - $update = true; - } - if ( true === $update && is_object( WC()->session ) && is_callable( array( WC()->session, 'set' ) ) ) { - $coupons = array_values( array_filter( $coupons ) ); - WC()->session->set( 'wc_sc_auto_applied_coupons', $coupons ); - } - } - } - - /** - * Reset cart session data. - * - * @since 4.27.0 - */ - public function reset_auto_applied_coupons_session() { - if ( is_object( WC()->session ) && is_callable( array( WC()->session, 'set' ) ) ) { - WC()->session->set( 'wc_sc_auto_applied_coupons', null ); - } - } - - /** - * Runs after a coupon is removed - * - * @since 4.31.0 - * @param string $coupon_code The coupon code. - * @return void - */ - public function wc_sc_removed_coupon( $coupon_code = '' ) { - $backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - if ( ! empty( $coupon_code ) && ! empty( $backtrace ) ) { - foreach ( $backtrace as $trace ) { - if ( ! empty( $trace['function'] ) && 'check_cart_coupons' === $trace['function'] && ! empty( $trace['class'] ) && 'WC_Cart' === $trace['class'] ) { // This condition will make sure that the coupon is removed automatically. - $this->unset_auto_applied_coupon( $coupon_code ); - } - } - } - } - - /** - * Check if auto apply coupon allowed in the cart - * - * @since 4.27.0 - * @return bool. - */ - public function is_allow_auto_apply_coupons() { - $auto_applied_coupons = $this->get_auto_applied_coupons(); - $auto_applied_coupons_count = ! empty( $auto_applied_coupons ) && is_array( $auto_applied_coupons ) ? count( $auto_applied_coupons ) : 0; - $max_auto_apply_coupons_limit = apply_filters( 'wc_sc_max_auto_apply_coupons_limit', get_option( 'wc_sc_max_auto_apply_coupons_limit', 5 ), array( 'source' => $this ) ); - - return apply_filters( - 'wc_sc_' . __FUNCTION__, - $auto_applied_coupons_count < $max_auto_apply_coupons_limit, - array( - 'source' => $this, - 'auto_applied_coupons' => $auto_applied_coupons, - ) - ); - } - - /** - * Check if the auto apply removable - * - * @since 4.27.0 - * @param string $coupon_code Coupon Code. - * @return bool. - */ - public function is_auto_apply_coupon_removable( $coupon_code = '' ) { - - return apply_filters( - 'wc_sc_' . __FUNCTION__, - get_option( 'wc_sc_auto_apply_coupon_removable', 'yes' ), - array( - 'source' => $this, - 'coupon_code' => $coupon_code, - ) - ); - } - - /** - * Check if the coupon is applied through auto apply - * - * @since 4.27.0 - * @param string $coupon_code Coupon Code. - * @return bool. - */ - public function is_coupon_applied_by_auto_apply( $coupon_code = '' ) { - if ( ! empty( $coupon_code ) ) { - $applied_coupons = $this->get_auto_applied_coupons(); - if ( ! empty( $applied_coupons ) && is_array( $applied_coupons ) && in_array( $coupon_code, $applied_coupons, true ) ) { - return true; - } - } - return false; - } - - /** - * Check if coupon is applicable for auto apply - * - * @since 4.26.0 - * @param WC_Coupon $coupon WooCommerce coupon object. - * @return bool - */ - public function is_coupon_valid_for_auto_apply( $coupon = null ) { - - $valid = false; - if ( is_object( $coupon ) && $coupon instanceof WC_Coupon ) { - - if ( $this->is_wc_gte_30() ) { - $coupon_code = is_callable( array( $coupon, 'get_code' ) ) ? $coupon->get_code() : ''; - $discount_type = is_callable( array( $coupon, 'get_discount_type' ) ) ? $coupon->get_discount_type() : ''; - $is_auto_generate_coupon = is_callable( array( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'auto_generate_coupon' ) : 'no'; - $is_disable_email_restrict = is_callable( array( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'sc_disable_email_restriction' ) : 'no'; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - $discount_type = get_post_meta( $coupon_id, 'discount_type', true ); - $is_auto_generate_coupon = get_post_meta( $coupon_id, 'auto_generate_coupon', true ); - $is_disable_email_restrict = get_post_meta( $coupon_id, 'sc_disable_email_restriction', true ); - } - - $is_removable = $this->is_auto_apply_coupon_removable( $coupon_code ); - $is_auto_applied = $this->is_coupon_applied_by_auto_apply( $coupon_code ); - - /** - * Validate coupon for auto apply if - * - * Discount type is not smart_coupon. - * Auto generate is not enabled. - * Coupon should not be auto applied OR auto applied coupon should not be removable. - * Coupon code is valid. - */ - $valid = 'smart_coupon' !== $discount_type - && 'yes' !== $is_auto_generate_coupon - && ( ! $is_auto_applied || 'yes' !== $is_removable ) - && $coupon->is_valid(); - } - - return apply_filters( - 'wc_sc_' . __FUNCTION__, - $valid, - array( - 'coupon_obj' => $coupon, - 'source' => $this, - ) - ); - } - - /** - * Function to apply coupons automatically. - * - * TODO: IF we need another variable for removed coupons; - * There will be 2 session variables: wc_sc_auto_applied_coupons and wc_sc_removed_auto_applied_coupons. - * Whenever a coupon will be auto-applied, it'll be stored in wc_sc_auto_applied_coupons. - * Whenever a coupon will be removed, it'll be moved from wc_sc_auto_applied_coupons to wc_sc_removed_auto_applied_coupons. - * And before applying an auto-apply coupon, it'll be made sure that the coupon doesn't exist in wc_sc_removed_auto_applied_coupons - * And sum of counts of both session variable will be considered before auto applying coupons. It will be made sure that the sum of counts in not exceeding option `wc_sc_max_auto_apply_coupons_limit` - * Reference: issues/234#note_27085 - */ - public function auto_apply_coupons() { - $cart = ( is_object( WC() ) && isset( WC()->cart ) ) ? WC()->cart : null; - if ( is_object( $cart ) && is_callable( array( $cart, 'is_empty' ) ) && ! $cart->is_empty() && $this->is_allow_auto_apply_coupons() ) { - global $wpdb; - $user_role = ''; - $email = ''; - if ( ! is_admin() ) { - $current_user = wp_get_current_user(); - if ( ! empty( $current_user->ID ) ) { - $user_role = ( ! empty( $current_user->roles[0] ) ) ? $current_user->roles[0] : ''; - $email = get_user_meta( $current_user->ID, 'billing_email', true ); - $email = ( ! empty( $email ) ) ? $email : $current_user->user_email; - } - } - $query = $wpdb->prepare( - "SELECT DISTINCT p.ID - FROM {$wpdb->posts} AS p - JOIN {$wpdb->postmeta} AS pm1 - ON (p.ID = pm1.post_id - AND p.post_type = %s - AND p.post_status = %s - AND pm1.meta_key = %s - AND pm1.meta_value = %s) - JOIN {$wpdb->postmeta} AS pm2 - ON (p.ID = pm2.post_id - AND pm2.meta_key IN ('wc_sc_user_role_ids', 'customer_email') - AND (pm2.meta_value = '' - OR pm2.meta_value = 'a:0:{}'", - 'shop_coupon', - 'publish', - 'wc_sc_auto_apply_coupon', - 'yes' - ); - if ( ! empty( $user_role ) ) { - $query .= $wpdb->prepare( - ' OR pm2.meta_value LIKE %s', - '%' . $wpdb->esc_like( $user_role ) . '%' - ); - } - if ( ! empty( $email ) ) { - $query .= $wpdb->prepare( - ' OR pm2.meta_value LIKE %s', - '%' . $wpdb->esc_like( $email ) . '%' - ); - } - $query .= '))'; - $auto_apply_coupon_ids = $wpdb->get_col( $query ); // phpcs:ignore - $auto_apply_coupon_ids = array_filter( array_map( 'absint', $auto_apply_coupon_ids ) ); - if ( ! empty( $auto_apply_coupon_ids ) && is_array( $auto_apply_coupon_ids ) ) { - $valid_coupon_counter = 0; - $max_auto_apply_coupons_limit = apply_filters( 'wc_sc_max_auto_apply_coupons_limit', get_option( 'wc_sc_max_auto_apply_coupons_limit', 5 ), array( 'source' => $this ) ); - foreach ( $auto_apply_coupon_ids as $apply_coupon_id ) { - // Process only five coupons. - if ( absint( $max_auto_apply_coupons_limit ) === $valid_coupon_counter ) { - break; - } - $coupon = new WC_Coupon( absint( $apply_coupon_id ) ); - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - $coupon_code = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - // Check if it is a valid coupon object. - if ( $apply_coupon_id === $coupon_id && ! empty( $coupon_code ) && $this->is_coupon_valid_for_auto_apply( $coupon ) ) { - $cart_total = ( $this->is_wc_greater_than( '3.1.2' ) ) ? $cart->get_cart_contents_total() : $cart->cart_contents_total; - $is_auto_apply = apply_filters( - 'wc_sc_is_auto_apply', - ( $cart_total > 0 ), - array( - 'source' => $this, - 'cart_obj' => $cart, - 'coupon_obj' => $coupon, - 'cart_total' => $cart_total, - ) - ); - // Check if cart still requires a coupon discount and does not have coupon already applied. - if ( true === $is_auto_apply && ! $cart->has_discount( $coupon_code ) ) { - $cart->add_discount( $coupon_code ); - $this->set_auto_applied_coupon( $coupon_code ); - } - $valid_coupon_counter++; - } // End if to check valid coupon. - } - } - } - } - - } - -} - -WC_SC_Auto_Apply_Coupon::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-background-coupon-importer.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-background-coupon-importer.php deleted file mode 100644 index 35b84e81..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-background-coupon-importer.php +++ /dev/null @@ -1,1244 +0,0 @@ -plugin_data = WC_Smart_Coupons::get_smart_coupons_plugin_data(); - - // Uses unique prefix per blog so each blog has separate queue. - $this->prefix = 'wp_' . get_current_blog_id(); - $this->identifier = 'wc_sc_coupon_importer'; - - add_action( 'admin_notices', array( $this, 'coupon_background_notice' ) ); - add_action( 'admin_footer', array( $this, 'styles_and_scripts' ) ); - add_action( 'wp_ajax_wc_sc_coupon_background_progress', array( $this, 'ajax_coupon_background_progress' ) ); - add_action( 'wp_ajax_wc_sc_stop_coupon_background_process', array( $this, 'ajax_stop_coupon_background_process' ) ); - add_action( 'wp_ajax_wc_sc_download_csv', array( $this, 'ajax_download_csv' ) ); - add_action( 'woo_sc_generate_coupon_csv', array( $this, 'woo_sc_generate_coupon_csv' ) ); - add_action( 'woo_sc_import_coupons_from_csv', array( $this, 'woo_sc_import_coupons_from_csv' ) ); - add_action( 'woocommerce_smart_coupons_send_combined_coupon_email', array( $this, 'send_scheduled_combined_email' ) ); - add_action( 'action_scheduler_failed_action', array( $this, 'restart_failed_action' ) ); - - add_filter( 'heartbeat_send', array( $this, 'check_coupon_background_progress' ), 10, 2 ); - add_filter( 'cron_schedules', array( $this, 'modify_action_scheduler_default_interval' ), 1000 ); // phpcs:ignore - - } - - /** - * Get single instance of WC_SC_Background_Coupon_Importer - * - * @return WC_SC_Background_Coupon_Importer Singleton object of WC_SC_Background_Coupon_Importer - */ - public static function get_instance() { - // Check if instance is already exists. - if ( is_null( self::$instance ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Handle call to functions which is not available in this class - * - * @param string $function_name The function name. - * @param array $arguments Array of arguments passed while calling $function_name. - * @return result of function call - */ - public function __call( $function_name, $arguments = array() ) { - - global $woocommerce_smart_coupon; - - if ( ! is_callable( array( $woocommerce_smart_coupon, $function_name ) ) ) { - return; - } - - if ( ! empty( $arguments ) ) { - return call_user_func_array( array( $woocommerce_smart_coupon, $function_name ), $arguments ); - } else { - return call_user_func( array( $woocommerce_smart_coupon, $function_name ) ); - } - - } - - /** - * Get Identifier - * - * @return string The Identifier - */ - public function get_identifier() { - return $this->identifier; - } - - /** - * Memory exceeded - * - * Ensures the batch process never exceeds 90% - * of the maximum WordPress memory. - * - * @return bool - */ - protected function memory_exceeded() { - $memory_limit = $this->get_memory_limit() * 0.9; // 90% of max memory - $current_memory = memory_get_usage( true ); - - if ( $current_memory >= $memory_limit ) { - return true; - } - - return false; - } - - /** - * Get memory limit. - * - * @return int - */ - protected function get_memory_limit() { - if ( function_exists( 'ini_get' ) ) { - $memory_limit = ini_get( 'memory_limit' ); - } else { - // Sensible default. - $memory_limit = '128M'; - } - - if ( ! $memory_limit || -1 === intval( $memory_limit ) ) { - // Unlimited, set to 32GB. - $memory_limit = '32G'; - } - - return wp_convert_hr_to_bytes( $memory_limit ); - } - - /** - * Time exceeded. - * - * Ensures the batch never exceeds a sensible time limit. - * A timeout limit of 30s is common on shared hosting. - * - * @param string $start_time start timestamp. - * @return bool - */ - protected function time_exceeded( $start_time = '' ) { - - if ( ! empty( $start_time ) ) { - $this->start_time = $start_time; - } - - $finish = $this->start_time + apply_filters( $this->identifier . '_default_time_limit', 20 ); // 20 seconds - $return = false; - - if ( time() >= $finish ) { - $return = true; - } - - return apply_filters( $this->identifier . '_time_exceeded', $return ); - } - - /** - * Get list of scheduled acctions of this plugin - * - * Note: wc_sc_send_scheduled_coupon_email is not included because it's not used in bulk generate/import process - * - * @return array - */ - public function get_scheduled_action_hooks() { - $hooks = array( - 'woo_sc_generate_coupon_csv', - 'woo_sc_import_coupons_from_csv', - 'woocommerce_smart_coupons_send_combined_coupon_email', - ); - return $hooks; - } - - /** - * Get scheduled actions by this plugin - * - * @return array - */ - public function get_scheduled_actions() { - - $found_actions = array(); - - if ( ! function_exists( 'as_get_scheduled_actions' ) ) { - return $found_actions; - } - - $hooks = $this->get_scheduled_action_hooks(); - - if ( ! empty( $hooks ) ) { - foreach ( $hooks as $hook ) { - $args = array( - 'hook' => $hook, - ); - $found = as_get_scheduled_actions( $args, ARRAY_A ); - if ( ! empty( $found ) ) { - $found_actions[ $hook ] = $found; - } - } - } - - return $found_actions; - - } - - /** - * Stop all scheduled actions by this plugin - */ - public function stop_scheduled_actions() { - if ( function_exists( 'as_unschedule_action' ) ) { - $hooks = $this->get_scheduled_action_hooks(); - if ( ! empty( $hooks ) ) { - foreach ( $hooks as $hook ) { - as_unschedule_action( $hook ); - } - } - } - $this->clean_scheduled_action_data(); - } - - /** - * Clean scheduled action data - */ - public function clean_scheduled_action_data() { - delete_option( 'woo_sc_generate_coupon_posted_data' ); - delete_option( 'start_time_woo_sc' ); - delete_option( 'current_time_woo_sc' ); - delete_option( 'all_tasks_count_woo_sc' ); - delete_option( 'remaining_tasks_count_woo_sc' ); - delete_option( 'bulk_coupon_action_woo_sc' ); - } - - /** - * Display notice if a background process is already running - */ - public function coupon_background_notice() { - global $pagenow, $post, $store_credit_label; - - if ( ! is_admin() ) { - return; - } - - $page = ( ! empty( $_GET['page'] ) ) ? wc_clean( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore - $tab = ( ! empty( $_GET['tab'] ) ? ( 'send-smart-coupons' === $_GET['tab'] ? 'send-smart-coupons' : 'import-smart-coupons' ) : 'generate_bulk_coupons' ); // phpcs:ignore - - if ( ( ! empty( $post->post_type ) && 'shop_coupon' !== $post->post_type ) || ! in_array( $tab, array( 'generate_bulk_coupons', 'import-smart-coupons', 'send-smart-coupons' ), true ) ) { - return; - } - - if ( ! wp_script_is( 'jquery' ) ) { - wp_enqueue_script( 'jquery' ); - } - if ( ! wp_script_is( 'heartbeat' ) ) { - wp_enqueue_script( 'heartbeat' ); - } - - $upload_dir = wp_get_upload_dir(); - $upload_path = $upload_dir['basedir'] . '/woocommerce_uploads'; - - if ( 'wc-smart-coupons' === $page && 'generate_bulk_coupons' === $tab && ! empty( $upload_dir['error'] ) ) { - if ( ! wp_script_is( 'jquery-tiptip', 'registered' ) ) { - $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; - wp_register_script( 'jquery-tiptip', WC()->plugin_url() . '/assets/js/jquery-tiptip/jquery.tipTip' . $suffix . '.js', array( 'jquery' ), WC()->version, true ); - } - - if ( ! wp_script_is( 'jquery-tiptip' ) ) { - wp_enqueue_script( 'jquery-tiptip' ); - } - ?> -
            -

            -   - - ' . esc_html__( 'Important', 'woocommerce-smart-coupons' ) . '', '' . esc_html( $upload_path ) . '' ); ?> -

            -
            - - is_process_running() ) { - $bulk_action = get_option( 'bulk_coupon_action_woo_sc' ); - - switch ( $bulk_action ) { - - case 'import_email': - case 'import': - $bulk_text = __( 'imported', 'woocommerce-smart-coupons' ); - $bulk_process = __( 'import', 'woocommerce-smart-coupons' ); - break; - - case 'generate_email': - case 'send_store_credit': - $bulk_text = __( 'generated & sent', 'woocommerce-smart-coupons' ); - $bulk_process = __( 'generate', 'woocommerce-smart-coupons' ); - break; - case 'generate': - default: - $bulk_text = __( 'generated', 'woocommerce-smart-coupons' ); - $bulk_process = __( 'generate', 'woocommerce-smart-coupons' ); - break; - - } - $scheduled_actions = $this->get_scheduled_actions(); - ?> -
            - clean_scheduled_action_data(); - ?> -

            - ' . esc_html( $this->plugin_data['Name'] ) . ' ' . esc_html__( 'Error', 'woocommerce-smart-coupons' ) . '', esc_html( $bulk_process ) ); - ?> -

            - -

            - ' . esc_html__( 'Important', 'woocommerce-smart-coupons' ) . ': ' . sprintf( esc_html__( '%s are being', 'woocommerce-smart-coupons' ), esc_html( $coupon_text ) ); - echo ' ' . esc_html( $bulk_text ) . ' '; - echo esc_html__( 'in the background. You will be notified when it is completed.', 'woocommerce-smart-coupons' ) . ' '; - ?> - -

            -

            - -

            - -
            - - -
            -

            - :  - - -

            - -

            - ' . esc_html__( 'here', 'woocommerce-smart-coupons' ) . '.'; - ?> -

            - -
            - - - calculate_coupon_background_progress(); - - if ( isset( $progress['percent_completion'] ) ) { - $response['percent_completion'] = $progress['percent_completion']; - if ( floatval( 100 ) === floatval( $progress['percent_completion'] ) ) { - $this->stop_scheduled_actions(); - } - } - - $coupon_posted_data = get_option( 'woo_sc_generate_coupon_posted_data', false ); - - if ( $coupon_posted_data ) { - - $coupon_action = $coupon_posted_data['smart_coupons_generate_action']; - $response['coupon_action'] = $coupon_action; - $action_stage = $coupon_posted_data['action_stage']; - $response['action_stage'] = $action_stage; - $action_data = get_option( 'woo_sc_action_data', false ); - $response['action_data'] = $action_data; - - } - - wp_send_json( $response ); - } - - /** - * Stop coupoon background process via AJAX - */ - public function ajax_stop_coupon_background_process() { - - check_ajax_referer( 'wc-sc-stop-coupon-background-process', 'security' ); - - $this->stop_scheduled_actions(); - - wp_send_json_success(); - } - - /** - * Get coupon background progress via ajax - */ - public function ajax_download_csv() { - - check_ajax_referer( 'wc_sc_download_csv', 'download_nonce' ); - - $woo_sc_action_data = get_option( 'woo_sc_action_data', false ); - - if ( $woo_sc_action_data ) { - WP_Filesystem(); - - global $wp_filesystem; - - $file_path = $woo_sc_action_data['data']['generated_file_path']; - $csv_file_path = ''; - $file_name = basename( $file_path ); - $dirname = dirname( $file_path ); - $mime_type = 'text/x-csv'; - $upload_dir = wp_get_upload_dir(); - $upload_dir_path = $upload_dir['basedir'] . '/woocommerce_uploads'; - - if ( class_exists( 'ZipArchive' ) ) { - $zip = new ZipArchive(); - $zip_name = $file_name . '.zip'; - $zip_path = $dirname . '/' . $zip_name; - $mime_type = 'application/zip'; - if ( $zip->open( $zip_path, ZIPARCHIVE::CREATE ) ) { - $zip->addFile( $file_path, $file_name ); - $zip->close(); - $file_name = $zip_name; - $csv_file_path = $file_path; - $file_path = $zip_path; - } else { - echo esc_html__( 'Failed to create export file.', 'woocommerce-smart-coupons' ); - exit(); - } - } - if ( file_exists( $file_path ) && is_readable( $file_path ) ) { - - nocache_headers(); - header( 'X-Robots-Tag: noindex, nofollow', true ); - header( 'Content-Type: ' . $mime_type . '; charset=UTF-8' ); - header( 'Content-Description: File Transfer' ); - header( 'Content-Transfer-Encoding: binary' ); - header( 'Content-Disposition: attachment; filename="' . sanitize_file_name( $file_name ) . '";' ); - readfile( $file_path ); // phpcs:ignore - if ( ! empty( $upload_dir_path ) && false !== strpos( $file_path, $upload_dir_path ) ) { - unlink( $file_path ); // phpcs:ignore - } - } else { - echo esc_html__( 'Failed to create export file.', 'woocommerce-smart-coupons' ); - exit(); - } - - if ( file_exists( $csv_file_path ) ) { - if ( ! empty( $upload_dir_path ) && false !== strpos( $csv_file_path, $upload_dir_path ) ) { - unlink( $csv_file_path ); // phpcs:ignore - } - } - - delete_option( 'woo_sc_action_data' ); - delete_option( 'wc_sc_background_coupon_process_result' ); - exit(); - - } - } - - /** - * Push coupon background progress in heartbeat response - * - * @param array $response The response. - * @param string $screen_id The screen id. - * @return array $response - */ - public function check_coupon_background_progress( $response = array(), $screen_id = '' ) { - - if ( 'yes' === $this->is_process_running() ) { - $progress = $this->calculate_coupon_background_progress(); - - if ( ! empty( $progress['percent_completion'] ) ) { - $response['percent_completion'] = $progress['percent_completion']; - } - - $coupon_posted_data = get_option( 'woo_sc_generate_coupon_posted_data', false ); - - if ( $coupon_posted_data ) { - - $coupon_action = $coupon_posted_data['smart_coupons_generate_action']; - $response['coupon_action'] = $coupon_action; - $action_stage = $coupon_posted_data['action_stage']; - $response['action_stage'] = $action_stage; - - } - - $action_data = get_option( 'woo_sc_action_data', false ); - - $response['action_data'] = $action_data; - } - - return $response; - } - - /** - * Checks if background process is running - * - * @return string $is_process_running - */ - public function is_process_running() { - - // Return process status if it has already been saved. - if ( ! empty( $this->is_process_running ) ) { - return $this->is_process_running; - } - - $bulk_action = get_option( 'bulk_coupon_action_woo_sc', false ); - $this->is_process_running = ( ! empty( $bulk_action ) ) ? 'yes' : 'no'; - - return $this->is_process_running; - } - - /** - * Function to send combined emails when receiver is the same. - * - * @param array $action_args Action arguments. - */ - public function send_scheduled_combined_email( $action_args = array() ) { - - $posted_data = get_option( 'woo_sc_generate_coupon_posted_data', true ); - - if ( true === $posted_data ) { - return; - } - - if ( empty( $action_args['receiver_email'] ) || empty( $action_args['coupon_ids'] ) || ! is_array( $action_args['coupon_ids'] ) ) { - return; - } - - $receiver_email = $action_args['receiver_email']; - $coupon_ids = $action_args['coupon_ids']; - $receiver_details = array(); - $message = ''; - - if ( ! empty( $posted_data ) && is_array( $posted_data ) ) { - $message = ( ! empty( $posted_data['smart_coupon_message'] ) ) ? $posted_data['smart_coupon_message'] : ''; - } - - foreach ( $coupon_ids as $coupon_id ) { - $coupon = new WC_Coupon( $coupon_id ); - if ( is_a( $coupon, 'WC_Coupon' ) ) { - if ( $this->is_wc_gte_30() ) { - $coupon_code = $coupon->get_code(); - } else { - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - $receiver_details[] = array( - 'code' => $coupon_code, - 'message' => $message, - ); - } - } - - if ( ! empty( $receiver_details ) ) { - $this->send_combined_coupon_email( $receiver_email, $receiver_details ); - } - } - - /** - * Calculate progress of background coupon process - * - * @return array $progress - */ - public function calculate_coupon_background_progress() { - $progress = array(); - - $start_time = get_option( 'start_time_woo_sc', false ); - $current_time = get_option( 'current_time_woo_sc', false ); - $all_tasks_count = get_option( 'all_tasks_count_woo_sc', false ); - $remaining_tasks_count = get_option( 'remaining_tasks_count_woo_sc', false ); - - $percent_completion = floatval( 0 ); - if ( false !== $all_tasks_count && false !== $remaining_tasks_count ) { - $percent_completion = ( ( intval( $all_tasks_count ) - intval( $remaining_tasks_count ) ) * 100 ) / intval( $all_tasks_count ); - $progress['percent_completion'] = floatval( $percent_completion ); - } - - if ( $percent_completion > 0 && false !== $start_time && false !== $current_time ) { - $time_taken_in_seconds = $current_time - $start_time; - $time_remaining_in_seconds = ( $time_taken_in_seconds / $percent_completion ) * ( 100 - $percent_completion ); - $progress['remaining_seconds'] = ceil( $time_remaining_in_seconds ); - } - - return $progress; - } - - /** - * Generate Coupons' CSV from saved coupon's data - */ - public function woo_sc_generate_coupon_csv() { - - $posted_data = get_option( 'woo_sc_generate_coupon_posted_data', true ); - - if ( true === $posted_data ) { - return; - } - - $no_of_coupons_to_generate = absint( $posted_data['no_of_coupons_to_generate'] ); - - $woocommerce_smart_coupon = WC_Smart_Coupons::get_instance(); - - $coupon_column_headers = $this->get_coupon_column_headers(); - $coupon_posts_headers = $coupon_column_headers['posts_headers']; - $coupon_postmeta_headers = $coupon_column_headers['postmeta_headers']; - $coupon_term_headers = $coupon_column_headers['term_headers']; - - $column_headers = array_merge( $coupon_posts_headers, $coupon_postmeta_headers, $coupon_term_headers ); - - $batch_start_time = time(); - $start_time = get_option( 'start_time_woo_sc', false ); - if ( false === $start_time ) { - update_option( 'start_time_woo_sc', $batch_start_time, 'no' ); - } - - $all_tasks_count = get_option( 'all_tasks_count_woo_sc', false ); - - if ( false === $all_tasks_count ) { - update_option( 'all_tasks_count_woo_sc', $posted_data['total_coupons_to_generate'], 'no' ); - } - - if ( isset( $posted_data['export_file'] ) && is_array( $posted_data['export_file'] ) ) { - $export_file = $posted_data['export_file']; - $csv_folder = $export_file['wp_upload_dir']; - $filename = str_replace( array( '\'', '"', ',', ';', '<', '>', '/', ':' ), '', $export_file['file_name'] ); - $csvfilename = $csv_folder . $filename; - $csv_file_handler = fopen( $csvfilename, 'a' ); // phpcs:ignore - $smart_coupon_email = array(); - $customer_emails = $posted_data['customer_email'] = empty( $posted_data['customer_email'] ) ? $posted_data['smart_coupon_email'] : $posted_data['customer_email'];// phpcs:ignore - if ( ! empty( $customer_emails ) ) { - $smart_coupon_email = explode( ',', $customer_emails ); - } - // Proceed only if file has opened in append mode. - if ( false !== $csv_file_handler ) { - for ( $no_of_coupons_created = 1; $no_of_coupons_created <= $no_of_coupons_to_generate; $no_of_coupons_created++ ) { - $posted_data['no_of_coupons_to_generate'] = 1; - $coupon_data = $woocommerce_smart_coupon->generate_coupons_code( $posted_data, '', '' ); - - $file_data = $woocommerce_smart_coupon->get_coupon_csv_data( $column_headers, $coupon_data ); // phpcs:ignore - if ( $file_data ) { - - fwrite( $csv_file_handler, $file_data ); // phpcs:ignore - $no_of_remaining_coupons = $no_of_coupons_to_generate - $no_of_coupons_created; - - update_option( 'current_time_woo_sc', time(), 'no' ); - update_option( 'remaining_tasks_count_woo_sc', $no_of_remaining_coupons, 'no' ); - - if ( ! empty( $posted_data['customer_email'] ) && count( $smart_coupon_email ) > 1 ) { - $posted_data['customer_email'] = ''; - if ( ! empty( $customer_emails ) ) { - $sc_emails = explode( ',', $customer_emails ); - array_shift( $sc_emails ); // Remove first email so that it does not included in next run. - $customer_emails = $posted_data['customer_email'] = ! empty( $sc_emails ) ? implode( ',', $sc_emails ) : '';// phpcs:ignore - } - } - - // If csv generation is complete. - if ( 0 === $no_of_remaining_coupons ) { - // If user opted for add_to_store option then create another scheduler to generate actual coupons. - if ( in_array( $posted_data['smart_coupons_generate_action'], array( 'add_to_store', 'woo_sc_is_email_imported_coupons', 'send_store_credit' ), true ) ) { - - delete_option( 'start_time_woo_sc' ); - delete_option( 'current_time_woo_sc' ); - - $posted_data['no_of_coupons_to_generate'] = $posted_data['total_coupons_to_generate']; - $posted_data['action_stage'] = 1; - update_option( 'woo_sc_generate_coupon_posted_data', $posted_data, 'no' ); - - do_action( 'woo_sc_import_coupons_from_csv' ); - } else { - - $bulk_coupon_action = get_option( 'bulk_coupon_action_woo_sc' ); - $all_tasks_count = get_option( 'all_tasks_count_woo_sc' ); - $remaining_tasks_count = get_option( 'remaining_tasks_count_woo_sc' ); - $success_count = $all_tasks_count - $remaining_tasks_count; - - $coupon_background_process_result = array( - 'action' => $bulk_coupon_action, - 'successful' => $success_count, - ); - - delete_option( 'bulk_coupon_action_woo_sc' ); - update_option( 'wc_sc_background_coupon_process_result', $coupon_background_process_result, 'no' ); - - $action_data = array( - 'name' => 'download_csv', - 'data' => array( - 'generated_file_path' => $csvfilename, - ), - ); - update_option( 'woo_sc_action_data', $action_data, 'no' ); - } - } elseif ( $this->time_exceeded( $batch_start_time ) || $this->memory_exceeded() ) { - $posted_data['no_of_coupons_to_generate'] = $no_of_remaining_coupons; - update_option( 'woo_sc_generate_coupon_posted_data', $posted_data, 'no' ); - if ( function_exists( 'as_schedule_single_action' ) ) { - as_schedule_single_action( time(), 'woo_sc_generate_coupon_csv' ); - } - break; - } - } - } - fclose( $csv_file_handler ); // phpcs:ignore - } - } - - } - - /** - * Generate Coupons from generated/imported csv file - */ - public function woo_sc_import_coupons_from_csv() { - - $posted_data = get_option( 'woo_sc_generate_coupon_posted_data', true ); - - if ( true === $posted_data ) { - return; - } - - $is_send_email = $this->is_email_template_enabled(); - $combine_emails = $this->is_email_template_enabled( 'combine' ); - $is_email_imported_coupons = get_option( 'woo_sc_is_email_imported_coupons' ); - $no_of_coupons_to_generate = $posted_data['no_of_coupons_to_generate']; - - require 'class-wc-sc-coupon-import.php'; - require 'class-wc-sc-coupon-parser.php'; - - $wc_csv_coupon_import = new WC_SC_Coupon_Import(); - $wc_csv_coupon_import->parser = new WC_SC_Coupon_Parser( 'shop_coupon' ); - $woocommerce_smart_coupon = WC_Smart_Coupons::get_instance(); - - $upload_dir = wp_get_upload_dir(); - $upload_dir_path = $upload_dir['basedir'] . '/woocommerce_uploads'; - - if ( isset( $posted_data['export_file'] ) && is_array( $posted_data['export_file'] ) ) { - - $export_file = $posted_data['export_file']; - $csv_folder = $export_file['wp_upload_dir']; - $filename = str_replace( array( '\'', '"', ',', ';', '<', '>', '/', ':' ), '', $export_file['file_name'] ); - $csvfilename = $csv_folder . $filename; - $file_position = isset( $posted_data['file_position'] ) && is_numeric( $posted_data['file_position'] ) ? $posted_data['file_position'] : 0; - - // Set locale. - $encoding = $this->mb_detect_encoding( $csvfilename, 'UTF-8, ISO-8859-1', true ); - if ( $encoding ) { - setlocale( LC_ALL, 'en_US.' . $encoding ); - } - ini_set( 'auto_detect_line_endings', true ); // phpcs:ignore - $csv_file_handler = fopen( $csvfilename, 'r' ); // phpcs:ignore - if ( false !== $csv_file_handler ) { - $csv_header = fgetcsv( $csv_file_handler, 0 ); - $counter = 0; - - $batch_start_time = time(); - $start_time = get_option( 'start_time_woo_sc', false ); - if ( false === $start_time ) { - update_option( 'start_time_woo_sc', $batch_start_time, 'no' ); - } - - $reading_completed = false; - $no_of_remaining_coupons = -1; - $combined_receiver_details = array(); - for ( $no_of_coupons_created = 1; $no_of_coupons_created <= $no_of_coupons_to_generate; $no_of_coupons_created++ ) { - - $result = $wc_csv_coupon_import->parser->parse_data_by_row( $csv_file_handler, $csv_header, $file_position, $encoding ); - $file_position = $result['file_position']; - $parsed_csv_data = $result['parsed_csv_data']; - $reading_completed = $result['reading_completed']; - if ( ! $reading_completed ) { - $coupon = $wc_csv_coupon_import->parser->parse_coupon( $parsed_csv_data ); - $coupon_parsed_data = array( - 'filter' => array( - 'class' => 'WC_SC_Coupon_Import', - 'function' => 'process_coupon', - ), - 'args' => array( $coupon ), - ); - - $coupon_id = $this->create_coupon( $coupon_parsed_data ); - - if ( ! empty( $parsed_csv_data['customer_email'] ) && 'yes' === $is_send_email && 'yes' === $combine_emails && 'yes' === $is_email_imported_coupons ) { - $receiver_emails = explode( ',', $parsed_csv_data['customer_email'] ); - foreach ( $receiver_emails as $receiver_email ) { - if ( ! isset( $combined_receiver_details[ $receiver_email ] ) || ! is_array( $combined_receiver_details[ $receiver_email ] ) ) { - $combined_receiver_details[ $receiver_email ] = array(); - } - $combined_receiver_details[ $receiver_email ][] = array( - 'code' => $parsed_csv_data['post_title'], - ); - } - } - $counter++; - } - - $no_of_remaining_coupons = $no_of_coupons_to_generate - $no_of_coupons_created; - update_option( 'current_time_woo_sc', time(), 'no' ); - update_option( 'remaining_tasks_count_woo_sc', $no_of_remaining_coupons, 'no' ); - - if ( 0 === $no_of_remaining_coupons ) { - - $bulk_coupon_action = get_option( 'bulk_coupon_action_woo_sc' ); - $all_tasks_count = get_option( 'all_tasks_count_woo_sc' ); - $remaining_tasks_count = get_option( 'remaining_tasks_count_woo_sc' ); - $success_count = $all_tasks_count - $remaining_tasks_count; - - $coupon_background_process_result = array( - 'action' => $bulk_coupon_action, - 'successful' => $success_count, - ); - - fclose( $csv_file_handler ); // phpcs:ignore - if ( ! empty( $upload_dir_path ) && false !== strpos( $csvfilename, $upload_dir_path ) ) { - unlink( $csvfilename ); // phpcs:ignore - } - update_option( 'woo_sc_is_email_imported_coupons', 'no', 'no' ); - delete_option( 'bulk_coupon_action_woo_sc' ); - - update_option( 'wc_sc_background_coupon_process_result', $coupon_background_process_result, 'no' ); - break; - } - $posted_data['no_of_coupons_to_generate'] = $no_of_remaining_coupons; - if ( $this->time_exceeded( $batch_start_time ) || $this->memory_exceeded() ) { - fclose( $csv_file_handler ); // phpcs:ignore - $posted_data['file_position'] = $file_position; - update_option( 'woo_sc_generate_coupon_posted_data', $posted_data, 'no' ); - if ( function_exists( 'as_schedule_single_action' ) ) { - as_schedule_single_action( time(), 'woo_sc_import_coupons_from_csv' ); - } - break; - } - } - if ( ! empty( $combined_receiver_details ) && is_array( $combined_receiver_details ) ) { - - foreach ( $combined_receiver_details as $receiver_email => $coupon_codes ) { - $coupon_ids = array(); - foreach ( $coupon_codes as $coupon_data ) { - $coupon_code = $coupon_data['code']; - $coupon = new WC_Coupon( $coupon_code ); - if ( is_a( $coupon, 'WC_Coupon' ) ) { - if ( $this->is_wc_gte_30() ) { - $coupon_id = $coupon->get_id(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - } - $coupon_ids[] = $coupon_id; - } - } - if ( ! empty( $receiver_email ) && ! empty( $coupon_ids ) ) { - $action_args = array( - 'args' => array( - 'receiver_email' => $receiver_email, - 'coupon_ids' => $coupon_ids, - ), - ); - if ( function_exists( 'as_schedule_single_action' ) ) { - as_schedule_single_action( time(), 'woocommerce_smart_coupons_send_combined_coupon_email', $action_args ); - } - } - } - } - } - } - } - - /** - * Create coupon from parsed coupon data - * - * @param array $parsed_data parsed coupon data. - */ - public function create_coupon( $parsed_data ) { - - $coupon_id = 0; - if ( isset( $parsed_data['filter'], $parsed_data['args'] ) ) { - try { - if ( empty( $this->global_coupons_new ) && ! is_array( $this->global_coupons_new ) ) { - $this->global_coupons_new = array(); - } - if ( ! class_exists( $parsed_data['filter']['class'] ) ) { - include_once 'class-' . strtolower( str_replace( '_', '-', $parsed_data['filter']['class'] ) ) . '.php'; - } - $object = $parsed_data['filter']['class']::get_instance(); - $coupon_id = call_user_func_array( array( $object, $parsed_data['filter']['function'] ), $parsed_data['args'] ); - } catch ( Exception $e ) { - if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { - error_log( 'Error: ' . $e->getMessage() . ' ' . __FILE__ . ' ' . __LINE__ ); // phpcs:ignore - } - } - } - return $coupon_id; - } - - /** - * Restart scheduler after one minute if it fails - * - * @param array $action_id id of failed action. - */ - public function restart_failed_action( $action_id = 0 ) { - - if ( empty( $action_id ) || ! class_exists( 'ActionScheduler' ) || ! is_callable( array( 'ActionScheduler', 'store' ) ) || ! function_exists( 'as_schedule_single_action' ) ) { - return; - } - - $action = ActionScheduler::store()->fetch_action( $action_id ); - $action_hook = $action->get_hook(); - - $hooks = $this->get_scheduled_action_hooks(); - if ( in_array( $action_hook, $hooks, true ) ) { - $posted_data = get_option( 'woo_sc_generate_coupon_posted_data', true ); - if ( true === $posted_data ) { - return; - } - } - - if ( in_array( $action_hook, array( 'woo_sc_generate_coupon_csv', 'woo_sc_import_coupons_from_csv' ), true ) ) { - as_schedule_single_action( time() + MINUTE_IN_SECONDS, $action_hook ); - } elseif ( in_array( $action_hook, array( 'wc_sc_send_scheduled_coupon_email', 'woocommerce_smart_coupons_send_combined_coupon_email' ), true ) ) { - $action_args = $action->get_args(); - as_schedule_single_action( time() + MINUTE_IN_SECONDS, $action_hook, $action_args ); - } - } - - /** - * Function to modify action scheduler's default interval between two consecutive scheduler when smart coupon process running - * - * @param array $schedules schedules with interval and display. - * @return array $schedules - */ - public function modify_action_scheduler_default_interval( $schedules = array() ) { - - if ( 'yes' === $this->is_process_running() ) { - - $schedules['every_minute'] = array( - 'interval' => 5, - 'display' => __( 'Every 5 Seconds', 'woocommerce-smart-coupons' ), - ); - } - - return $schedules; - - } - - } - -} - -WC_SC_Background_Coupon_Importer::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-background-upgrade.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-background-upgrade.php deleted file mode 100644 index ae72e444..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-background-upgrade.php +++ /dev/null @@ -1,433 +0,0 @@ -action = 'wc_db_upgrade'; - add_action( 'plugins_loaded', array( $this, 'init' ) ); - add_action( 'init', array( $this, 'process_handler' ) ); - add_action( 'init', array( $this, 'clear_all_process' ) ); - add_action( 'action_scheduler_failed_action', array( $this, 'restart_failed_action' ) ); - } - - /** - * Init - */ - public function init() { - global $woocommerce_smart_coupon; - // Get list of db updates. - $updates = $this->get_updates(); - if ( ! empty( $updates ) ) { - foreach ( $updates as $update ) { - // Break if version is empty. - if ( empty( $update['version'] ) ) { - break; - } - - $version = $update['version']; - $update_status = $this->get_status( $version ); - if ( version_compare( $woocommerce_smart_coupon->get_smart_coupons_version(), $version, '>=' ) && ( false === $update_status ) ) { - // Set db update status to pending. - $this->set_status( $version, 'pending' ); - } - $handler = isset( $update['cron_handler'] ) ? $update['cron_handler'] : ''; - $this->register_scheduler( $handler ); - } - } - } - - /** - * Process handler - */ - public function process_handler() { - if ( ! isset( $_GET['wc_sc_update'] ) || ! isset( $_GET['wc_sc_db_update_nonce'] ) ) { - return; - } - - if ( ! wp_verify_nonce( wc_clean( wp_unslash( $_GET['wc_sc_db_update_nonce'] ) ), 'wc_sc_db_process' ) ) { // phpcs:ignore - return; - } - - $this->handle_all( wc_clean( wp_unslash( $_GET['wc_sc_update'] ) ) ); // phpcs:ignore - } - - /** - * Get list of db updates. - */ - public function get_updates() { - return array( - array( - 'version' => '4.28.0', // Minimum plugin version to do the action. - 'get_row_handler' => array( __CLASS__, 'get_applied_coupon_profile_options' ), // get data. - 'cron_handler' => 'wcsc_move_applied_coupon_options_to_transient', // define crone handler which should be in this class. - ), - ); - } - - /** - * Register action schedulers for db update. - * - * @param string $handler Handler name. - */ - public function register_scheduler( $handler = '' ) { - if ( ! empty( $handler ) && is_callable( array( $this, $handler ) ) ) { - add_action( $handler, array( $this, $handler ) ); - } - } - - /** - * Handle all updates. - * - * @param string $current_version Plugin version. - */ - protected function handle_all( $current_version = '0' ) { - if ( empty( $current_version ) ) { - return; - } - do_action( 'wc_sc_start_background_update', $current_version ); - $updates = $this->get_updates(); - if ( is_array( $updates ) && ! empty( $updates ) ) { - foreach ( $updates as $update ) { - // Compare version for db updates. - if ( ! empty( $update['version'] ) && version_compare( $current_version, $update['version'], '>=' ) ) { - $cron_handler = isset( $update['cron_handler'] ) ? $update['cron_handler'] : ''; - if ( ! empty( $cron_handler ) && is_callable( array( $this, $cron_handler ) ) ) { - $row_handler = isset( $update['get_row_handler'] ) ? $update['get_row_handler'] : ''; - $this->process( $update['version'], $cron_handler, $row_handler ); - } - } - } - } - } - - /** - * Handle the process. - * - * @param string $version Version number. - * @param string $cron_handler Cron handler action name. - * @param string $row_handler Fetch data handler name. - */ - private function process( $version = '', $cron_handler = '', $row_handler = '' ) { - $rows = ! empty( $row_handler ) && is_callable( $row_handler ) ? call_user_func( $row_handler ) : ''; - if ( ! empty( $rows ) && is_array( $rows ) ) { - // Start the process if the status is pending. - if ( 'pending' === $this->get_status( $version ) ) { - if ( function_exists( 'as_enqueue_async_action' ) ) { - $this->set_status( $version, 'processing' ); - as_enqueue_async_action( $cron_handler ); - } - } - } else { - // Set status to `completed` if the data is empty. - $this->set_status( $version, 'completed' ); - } - } - - /** - * Clear all update process. - */ - public function clear_all_process() { - $updates = $this->get_updates(); - foreach ( $updates as $update ) { - $version = isset( $update['version'] ) ? $update['version'] : ''; - $row_handler = isset( $update['get_row_handler'] ) ? $update['get_row_handler'] : ''; - $status = $this->get_status( $version ); - if ( false === $status || 'done' === $status ) { - return; - } - $rows = ! empty( $row_handler ) && is_callable( $row_handler ) ? call_user_func( $row_handler ) : ''; - if ( 'processing' === $status && empty( $rows ) ) { - do_action( 'wc_sc_background_update_completed', $version ); - $this->set_status( $version, 'completed' ); - } - } - } - - /** - * Callback Method for move options to transient. - * - * @return void - */ - public function wcsc_move_applied_coupon_options_to_transient() { - $options = $this->get_applied_coupon_profile_options(); - // Check if coupons are not empty. - if ( ! empty( $options ) && is_array( $options ) ) { - - $start_time = time(); - $loop = 1; - foreach ( $options as $option ) { - // disable auto apply. - $this->move_option_to_transient( $option ); - - if ( $this->loop_exceeded( $loop ) || $this->time_exceeded( $start_time ) || $this->memory_exceeded() ) { - // Update auto apply coupon id list. - if ( function_exists( 'as_enqueue_async_action' ) ) { - as_enqueue_async_action( __FUNCTION__ ); - } - break; - } - $loop++; - } - } - } - - /** - * Restart scheduler after one minute if it fails - * - * @param array $action_id id of failed action. - */ - public function restart_failed_action( $action_id = 0 ) { - - if ( empty( $action_id ) || ! class_exists( 'ActionScheduler' ) || ! is_callable( array( 'ActionScheduler', 'store' ) ) || ! function_exists( 'as_enqueue_async_action' ) ) { - return; - } - - $action = ActionScheduler::store()->fetch_action( $action_id ); - $action_hook = $action->get_hook(); - - $updates = $this->get_updates(); - if ( ! empty( $updates ) ) { - foreach ( $updates as $update ) { - if ( ! empty( $update['version'] ) && ! empty( $update['cron_handler'] ) ) { - if ( $action_hook === $update['cron_handler'] ) { - $this->set_status( $update['version'], 'processing' ); - as_enqueue_async_action( $update['cron_handler'] ); - } - } - } - } - } - - /** - * Method to update the status of db upgrade. - * - * @param string $version wcsc db version. - * @param string $status status. - * - * @return bool. - */ - public function set_status( $version = '', $status = '' ) { - if ( ! empty( $version ) && ! empty( $status ) ) { - $db_status = get_option( 'sc_wc_db_update_status', array() ); - $db_status[ $version ] = $status; - return update_option( 'sc_wc_db_update_status', $db_status, 'no' ); - } - return false; - } - - /** - * Method to get the status of db upgrade. - * - * @param string $version wcsc db version. - * - * @return bool. - */ - public function get_status( $version = '' ) { - if ( ! empty( $version ) ) { - $db_status = get_option( 'sc_wc_db_update_status', array() ); - return ( ! empty( $db_status ) && isset( $db_status[ $version ] ) ) ? $db_status[ $version ] : false; - } - return false; - } - - /** - * Loop exceeded - * - * Ensures the batch process never exceeds to handle the given limit of row. - * - * @param int $loop Number of loop done. - * @return bool - */ - public function loop_exceeded( $loop = 0 ) { - return $loop > apply_filters( $this->action . '_default_row_limit', $this->row_limit ); - } - - /** - * Memory exceeded - * - * Ensures the batch process never exceeds 90% - * of the maximum WordPress memory. - * - * @return bool - */ - protected function memory_exceeded() { - $memory_limit = $this->get_memory_limit() * 0.9; // 90% of max memory - $current_memory = memory_get_usage( true ); - - if ( $current_memory >= $memory_limit ) { - return true; - } - - return false; - } - - /** - * Get memory limit. - * - * @return int - */ - protected function get_memory_limit() { - if ( function_exists( 'ini_get' ) ) { - $memory_limit = ini_get( 'memory_limit' ); - } else { - // Sensible default. - $memory_limit = '128M'; - } - - if ( ! $memory_limit || -1 === intval( $memory_limit ) ) { - // Unlimited, set to 32GB. - $memory_limit = '32G'; - } - - return wp_convert_hr_to_bytes( $memory_limit ); - } - - /** - * Time exceeded. - * - * Ensures the batch never exceeds a sensible time limit. - * A timeout limit of 30s is common on shared hosting. - * - * @param string $start_time start timestamp. - * @return bool - */ - protected function time_exceeded( $start_time = '' ) { - - $finish = $start_time + apply_filters( $this->action . '_default_time_limit', 20 ); // 20 seconds - $return = false; - - if ( time() >= $finish ) { - $return = true; - } - - return apply_filters( $this->action . '_time_exceeded', $return ); - } - - /** - * Get `applied_coupon_profile` options names and values - * - * @return array - */ - public function get_applied_coupon_profile_options() { - global $wpdb; - $option_name = 'sc_applied_coupon_profile_%'; - $options = $wpdb->get_results( // @codingStandardsIgnoreLine - $wpdb->prepare( - "SELECT option_name, option_value - FROM $wpdb->options - WHERE option_name LIKE %s", - $option_name - ), - ARRAY_A - ); - return $options; - } - - /** - * Method to transfer single options to transient. - * - * @param array $option Array of option name and value. - * @return void - */ - protected function move_option_to_transient( $option = array() ) { - if ( isset( $option['option_name'] ) && isset( $option['option_value'] ) ) { - - // Add new transient with option name. - $move = set_transient( - $option['option_name'], - maybe_unserialize( $option['option_value'] ), - apply_filters( 'wc_sc_applied_coupon_by_url_expire_time', MONTH_IN_SECONDS ) - ); - - if ( true === $move ) { - // Delete the option if option is successfully moved. - delete_option( $option['option_name'] ); - } - } - } - - } // End class -} // End class exists check - -WC_SC_Background_Upgrade::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-actions.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-actions.php deleted file mode 100644 index 5c2449d5..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-actions.php +++ /dev/null @@ -1,773 +0,0 @@ -is_wc_gte_30() ) { - $actions = $coupon->get_meta( 'wc_sc_add_product_details' ); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $actions = get_post_meta( $coupon_id, 'wc_sc_add_product_details', true ); - } - - return apply_filters( 'wc_sc_coupon_actions', $actions, array( 'coupon_code' => $coupon_code ) ); - - } - - return array(); - - } - - /** - * Modify cart item data - * - * @param array $cart_item_data The cart item data. - * @param integer $product_id The product id. - * @param integer $variation_id The variation id. - * @param integer $quantity The quantity of product. - * @return array $cart_item_data - */ - public function modify_cart_item_data( $cart_item_data = array(), $product_id = 0, $variation_id = 0, $quantity = 0 ) { - - if ( empty( $cart_item_data ) || empty( $product_id ) || empty( $quantity ) ) { - return $cart_item_data; - } - - if ( ! empty( $cart_item_data['wc_sc_product_source'] ) ) { - $coupon_code = $cart_item_data['wc_sc_product_source']; - $coupon_actions = $this->get_coupon_actions( $coupon_code ); - if ( ! empty( $coupon_actions ) ) { - foreach ( $coupon_actions as $product_data ) { - if ( ! empty( $product_data['product_id'] ) && in_array( absint( $product_data['product_id'] ), array_map( 'absint', array( $product_id, $variation_id ) ), true ) ) { - $discount_amount = ( '' !== $product_data['discount_amount'] ) ? $product_data['discount_amount'] : ''; - if ( '' !== $discount_amount ) { - if ( ! empty( $variation_id ) ) { - $product = wc_get_product( $variation_id ); - } else { - $product = wc_get_product( $product_id ); - } - $product_price = $product->get_price(); - $regular_price = $product->get_regular_price(); - $discount_type = ( ! empty( $product_data['discount_type'] ) ) ? $product_data['discount_type'] : 'percent'; - switch ( $discount_type ) { - case 'flat': - $discount = $this->convert_price( $discount_amount ); - break; - - case 'percent': - $discount = ( $product_price * $discount_amount ) / 100; - break; - } - $discount = wc_cart_round_discount( min( $product_price, $discount ), 2 ); - $discounted_price = $product_price - $discount; - $cart_item_data['data']->set_price( $discounted_price ); - $cart_item_data['data']->set_regular_price( $regular_price ); - $cart_item_data['data']->set_sale_price( $discounted_price ); - } - break; - } - } - } - } - - return $cart_item_data; - } - - /** - * Modify cart item in WC_Cart::add_to_cart() - * - * @param array $cart_item_data The cart item data as passed by filter 'woocommerce_add_cart_item'. - * @param string $cart_item_key The cart item key. - * @return array $cart_item_data - */ - public function modify_cart_item_data_in_add_to_cart( $cart_item_data = array(), $cart_item_key = '' ) { - if ( ! empty( $cart_item_data['wc_sc_product_source'] ) ) { - $cart_item_data = $this->modify_cart_item_data( $cart_item_data, $cart_item_data['product_id'], $cart_item_data['variation_id'], $cart_item_data['quantity'] ); - } - - return $cart_item_data; - } - - /** - * Modify cart item in session - * - * @param array $session_data The session data. - * @param array $values The cart item. - * @param string $key The cart item key. - * @return array $session_data - */ - public function modify_cart_item_in_session( $session_data = array(), $values = array(), $key = '' ) { - - if ( ! empty( $values['wc_sc_product_source'] ) ) { - $session_data['wc_sc_product_source'] = $values['wc_sc_product_source']; - $qty = ( ! empty( $session_data['quantity'] ) ) ? absint( $session_data['quantity'] ) : ( ( ! empty( $values['quantity'] ) ) ? absint( $values['quantity'] ) : 1 ); - $session_data = $this->modify_cart_item_data( $session_data, $session_data['product_id'], $session_data['variation_id'], $qty ); - } - - return $session_data; - } - - /** - * Modify cart item quantity - * - * @param string $product_quantity The product quantity. - * @param string $cart_item_key The cart item key. - * @param array $cart_item The cart item. - * @return string $product_quantity - */ - public function modify_cart_item_quantity( $product_quantity = '', $cart_item_key = '', $cart_item = array() ) { - - if ( ! empty( $cart_item['wc_sc_product_source'] ) ) { - $product_quantity = sprintf( '%s ', $cart_item['quantity'], $cart_item_key, $cart_item['quantity'] ); - } - - return $product_quantity; - } - - /** - * Modify cart item price - * - * @param string $product_price The product price. - * @param array $cart_item The cart item. - * @param string $cart_item_key The cart item key. - * @return string $product_price - */ - public function modify_cart_item_price( $product_price = '', $cart_item = array(), $cart_item_key = '' ) { - - if ( ( is_array( $cart_item ) && isset( $cart_item['wc_sc_product_source'] ) ) || ( is_object( $cart_item ) && is_callable( array( $cart_item, 'get_meta' ) ) && $cart_item->get_meta( '_wc_sc_product_source' ) ) ) { - if ( wc_price( 0 ) === $product_price ) { - $product_price = apply_filters( - 'wc_sc_price_zero_text', - $product_price, - array( - 'cart_item' => $cart_item, - 'cart_item_key' => $cart_item_key, - ) - ); - } - } - - return $product_price; - } - - /** - * Remove products added by the coupon from validation - * - * Since the filter 'woocommerce_coupon_get_items_to_validate' is added in WooCommerce 3.4.0, this function will work only in WC 3.4.0+ - * Otherwise, the products added by coupon might get double discounts applied - * - * @param array $items The cart/order items. - * @param WC_Discounts $discounts The discounts object. - * @return mixed $items - */ - public function remove_products_from_validation( $items = array(), $discounts = null ) { - - if ( ! empty( $items ) ) { - foreach ( $items as $index => $item ) { - $coupon_code = ''; - if ( is_array( $item->object ) && isset( $item->object['wc_sc_product_source'] ) ) { - $coupon_code = $item->object['wc_sc_product_source']; - } elseif ( is_a( $item->object, 'WC_Order_Item' ) && is_callable( array( $item->object, 'get_meta' ) ) && $item->object->get_meta( '_wc_sc_product_source' ) ) { - $coupon_code = $item->object->get_meta( '_wc_sc_product_source' ); - } - if ( ! empty( $coupon_code ) ) { - $item_product_id = ( is_a( $item->product, 'WC_Product' ) && is_callable( array( $item->product, 'get_id' ) ) ) ? $item->product->get_id() : 0; - $coupon_actions = $this->get_coupon_actions( $coupon_code ); - if ( ! empty( $coupon_actions ) ) { - foreach ( $coupon_actions as $product_data ) { - if ( ! empty( $product_data['product_id'] ) && absint( $product_data['product_id'] ) === absint( $item_product_id ) ) { - $discount_amount = ( '' !== $product_data['discount_amount'] ) ? $product_data['discount_amount'] : ''; - if ( '' !== $discount_amount ) { - unset( $items[ $index ] ); - } - } - } - } - } - } - } - - return $items; - - } - - /** - * Apply coupons actions - * - * @param string $coupon_code The coupon code. - */ - public function coupon_action( $coupon_code = '' ) { - - if ( empty( $coupon_code ) ) { - return; - } - - $coupon_actions = $this->get_coupon_actions( $coupon_code ); - - if ( ! empty( $coupon_actions ) && ! is_scalar( $coupon_actions ) ) { - $product_names = array(); - foreach ( $coupon_actions as $coupon_action ) { - if ( empty( $coupon_action['product_id'] ) ) { - continue; - } - - $id = absint( $coupon_action['product_id'] ); - - $product = wc_get_product( $id ); - - $product_data = $this->get_product_data( $product ); - - $product_id = ( ! empty( $product_data['product_id'] ) ) ? absint( $product_data['product_id'] ) : 0; - $variation_id = ( ! empty( $product_data['variation_id'] ) ) ? absint( $product_data['variation_id'] ) : 0; - $variation = array(); - - if ( ! empty( $variation_id ) ) { - $variation = $product->get_variation_attributes(); - } - - $quantity = absint( $coupon_action['quantity'] ); - - $cart_item_data = array( - 'wc_sc_product_source' => $coupon_code, - ); - - $cart_item_key = WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variation, $cart_item_data ); - - if ( ! empty( $cart_item_key ) ) { - if ( $this->is_wc_gte_30() ) { - $product_names[] = ( is_object( $product ) && is_callable( array( $product, 'get_name' ) ) ) ? $product->get_name() : ''; - } else { - $product_names[] = ( is_object( $product ) && is_callable( array( $product, 'get_title' ) ) ) ? $product->get_title() : ''; - } - } - } - - if ( ! empty( $product_names ) ) { - /* translators: 1. Product title */ - wc_add_notice( sprintf( __( '%s has been added to your cart!', 'woocommerce-smart-coupons' ), implode( ', ', $product_names ) ) ); - } - } - - } - - /** - * Remove products from cart if the coupon, which added the product, is removed - * - * @param string $coupon_code The coupon code. - */ - public function remove_product_from_cart( $coupon_code = '' ) { - - if ( is_admin() ) { - return; - } - - if ( ! empty( $coupon_code ) ) { - foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { - if ( isset( $cart_item['wc_sc_product_source'] ) && $cart_item['wc_sc_product_source'] === $coupon_code ) { - // Action 'woocommerce_before_calculate_totals' is hooked by WooCommerce Subscription while removing coupons in local WooCommerce Cart variable in which we don't need to remove added cart item. - if ( ! doing_action( 'woocommerce_before_calculate_totals' ) ) { - WC()->cart->set_quantity( $cart_item_key, 0 ); - } - } - } - } - - } - - /** - * Review cart items - */ - public function review_cart_items() { - - $applied_coupons = (array) WC()->cart->applied_coupons; - - $products = array(); - foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { - if ( ! empty( $cart_item['wc_sc_product_source'] ) && ! in_array( $cart_item['wc_sc_product_source'], $applied_coupons, true ) ) { - WC()->cart->set_quantity( $cart_item_key, 0 ); - $coupon_code = $cart_item['wc_sc_product_source']; - if ( empty( $products[ $coupon_code ] ) || ! is_array( $products[ $coupon_code ] ) ) { - $products[ $coupon_code ] = array(); - } - $products[ $coupon_code ][] = ( is_object( $cart_item['data'] ) && is_callable( array( $cart_item['data'], 'get_name' ) ) ) ? $cart_item['data']->get_name() : ''; - $products[ $coupon_code ] = array_filter( $products[ $coupon_code ] ); - } - } - - if ( ! empty( $products ) ) { - foreach ( $products as $coupon_code => $product_names ) { - /* translators: 1. Product/s 2. Product names 3. is/are 4. Coupons code */ - wc_add_notice( sprintf( __( '%1$s %2$s %3$s removed because coupon %4$s is removed.', 'woocommerce-smart-coupons' ), _n( 'Product', 'Products', count( $products[ $coupon_code ] ), 'woocommerce-smart-coupons' ), '' . implode( ', ', $products[ $coupon_code ] ) . '', _n( 'is', 'are', count( $products[ $coupon_code ] ), 'woocommerce-smart-coupons' ), '' . $coupon_code . '' ), 'error' ); - } - } - - } - - /** - * Add product source in order item meta - * - * @param mixed $item The item. - * @param string $cart_item_key The cart item key. - * @param array $values The cart item. - * @param WC_Order $order The order. - */ - public function add_product_source_in_order_item_meta( $item = null, $cart_item_key = '', $values = array(), $order = null ) { - - if ( isset( $values['wc_sc_product_source'] ) ) { - $item->add_meta_data( '_wc_sc_product_source', $values['wc_sc_product_source'], true ); - } - - } - - /** - * Get product data - * - * @param mixed $product The product object. - * @return array - */ - public function get_product_data( $product = null ) { - - if ( empty( $product ) ) { - return array(); - } - - if ( $this->is_wc_gte_30() ) { - $product_id = ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0; - } else { - $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; - } - - $product_type = ( is_object( $product ) && is_callable( array( $product, 'get_type' ) ) ) ? $product->get_type() : ''; - - if ( 'variation' === $product_type ) { - $variation_id = $product_id; - if ( $this->is_wc_gte_30() ) { - $parent_id = ( is_object( $product ) && is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0; - $variation_data = wc_get_product_variation_attributes( $variation_id ); - } else { - $parent_id = ( is_object( $product ) && is_callable( array( $product, 'get_parent' ) ) ) ? $product->get_parent() : 0; - $variation_data = ( ! empty( $product->variation_data ) ) ? $product->variation_data : array(); - } - $product_id = $parent_id; - } else { - $variation_id = 0; - $variation_data = array(); - } - - $product_data = array( - 'product_id' => $product_id, - 'variation_id' => $variation_id, - 'variation_data' => $variation_data, - ); - - return apply_filters( 'wc_sc_product_data', $product_data, array( 'product_obj' => $product ) ); - - } - - /** - * Add action's meta in export headers - * - * @param array $headers Existing headers. - * @return array - */ - public function export_headers( $headers = array() ) { - - $action_headers = array( - 'wc_sc_add_product_details' => __( 'Add product details', 'woocommerce-smart-coupons' ), - ); - - return array_merge( $headers, $action_headers ); - - } - - /** - * Function to handle coupon meta data during export of existing coupons - * - * @param mixed $meta_value The meta value. - * @param array $args Additional arguments. - * @return string Processed meta value - */ - public function export_coupon_meta_data( $meta_value = '', $args = array() ) { - - $index = ( ! empty( $args['index'] ) ) ? $args['index'] : -1; - $meta_keys = ( ! empty( $args['meta_keys'] ) ) ? $args['meta_keys'] : array(); - $meta_values = ( ! empty( $args['meta_values'] ) ) ? $args['meta_values'] : array(); - - if ( $index >= 0 && ! empty( $meta_keys[ $index ] ) && 'wc_sc_add_product_details' === $meta_keys[ $index ] ) { - - if ( ! empty( $meta_value ) && is_array( $meta_value ) ) { - $product_details = array(); - foreach ( $meta_value as $value ) { - $product_details[] = implode( ',', $value ); - } - $meta_value = implode( '|', $product_details ); - } - } - - return $meta_value; - - } - - /** - * Post meta defaults for action's meta - * - * @param array $defaults Existing postmeta defaults. - * @return array - */ - public function postmeta_defaults( $defaults = array() ) { - - $actions_defaults = array( - 'wc_sc_add_product_details' => '', - ); - - return array_merge( $defaults, $actions_defaults ); - } - - /** - * Add action's meta with value in coupon meta - * - * @param array $data The row data. - * @param array $post The POST values. - * @return array Modified data - */ - public function generate_coupon_meta( $data = array(), $post = array() ) { - - if ( isset( $post['wc_sc_add_product_ids'] ) ) { - if ( $this->is_wc_gte_30() ) { - $product_ids = wc_clean( wp_unslash( $post['wc_sc_add_product_ids'] ) ); // phpcs:ignore - } else { - $product_ids = array_filter( array_map( 'trim', explode( ',', sanitize_text_field( wp_unslash( $post['wc_sc_add_product_ids'] ) ) ) ) ); // phpcs:ignore - } - $add_product_details = array(); - if ( ! empty( $product_ids ) ) { - $quantity = ( isset( $post['wc_sc_add_product_qty'] ) ) ? wc_clean( wp_unslash( $post['wc_sc_add_product_qty'] ) ) : 1; - $discount_amount = ( isset( $post['wc_sc_product_discount_amount'] ) ) ? wc_clean( wp_unslash( $post['wc_sc_product_discount_amount'] ) ) : ''; - $discount_type = ( isset( $post['wc_sc_product_discount_type'] ) ) ? wc_clean( wp_unslash( $post['wc_sc_product_discount_type'] ) ) : ''; - foreach ( $product_ids as $id ) { - $product_data = array(); - $product_data['product_id'] = $id; - $product_data['quantity'] = $quantity; - $product_data['discount_amount'] = $discount_amount; - $product_data['discount_type'] = $discount_type; - $add_product_details[] = implode( ',', $product_data ); - } - } - $data['wc_sc_add_product_details'] = implode( '|', $add_product_details ); - } - - return $data; - } - - /** - * Make meta data of SC actions, protected - * - * @param bool $protected Is protected. - * @param string $meta_key The meta key. - * @param string $meta_type The meta type. - * @return bool $protected - */ - public function make_action_meta_protected( $protected, $meta_key, $meta_type ) { - $sc_meta = array( - 'wc_sc_add_product_details', - ); - if ( in_array( $meta_key, $sc_meta, true ) ) { - return true; - } - return $protected; - } - - /** - * Function to copy coupon action meta in newly generated coupon - * - * @param array $args The arguments. - */ - public function copy_coupon_action_meta( $args = array() ) { - - $new_coupon_id = ( ! empty( $args['new_coupon_id'] ) ) ? absint( $args['new_coupon_id'] ) : 0; - $coupon = ( ! empty( $args['ref_coupon'] ) ) ? $args['ref_coupon'] : false; - - if ( empty( $new_coupon_id ) || empty( $coupon ) ) { - return; - } - - $add_product_details = array(); - if ( $this->is_wc_gte_30() ) { - $add_product_details = $coupon->get_meta( 'wc_sc_add_product_details' ); - } else { - $old_coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $add_product_details = get_post_meta( $old_coupon_id, 'wc_sc_add_product_details', true ); - } - $this->update_post_meta( $new_coupon_id, 'wc_sc_add_product_details', $add_product_details ); - - } - - /** - * Function to validate whether to show the coupon or not - * - * @param boolean $is_show Show or not. - * @param array $args Additional arguments. - * @return boolean - */ - public function show_coupon_with_actions( $is_show = false, $args = array() ) { - - $coupon = ( ! empty( $args['coupon'] ) ) ? $args['coupon'] : null; - - if ( empty( $coupon ) ) { - return $is_show; - } - - if ( $this->is_wc_gte_30() ) { - $coupon_code = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - } else { - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - $coupon_actions = $this->get_coupon_actions( $coupon_code ); - - if ( ! empty( $coupon_actions ) ) { - return true; - } - - return $is_show; - - } - - /** - * Allow auto-generate of coupon with coupon action - * - * @param boolean $is_auto_generate Whether to auto-generate or not. - * @param array $args Additional parameters. - * @return boolean $is_auto_generate - */ - public function auto_generate_coupon_with_actions( $is_auto_generate = false, $args = array() ) { - - $coupon = ( ! empty( $args['coupon_obj'] ) && $args['coupon_obj'] instanceof WC_Coupon ) ? $args['coupon_obj'] : false; - $coupon_id = ( ! empty( $args['coupon_id'] ) ) ? $args['coupon_id'] : false; - - if ( ! empty( $coupon ) && ! empty( $coupon_id ) ) { - if ( $this->is_wc_gte_30() ) { - $coupon_code = $coupon->get_code(); - } else { - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - if ( ! empty( $coupon_code ) ) { - $actions = ( $this->is_callable( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'wc_sc_add_product_details' ) : get_post_meta( $coupon_id, 'wc_sc_add_product_details', true ); - $coupon_actions = apply_filters( - 'wc_sc_coupon_actions', - $actions, - array( - 'coupon_code' => $coupon_code, - 'source' => $this, - ) - ); - if ( ! empty( $coupon_actions ) ) { - return true; - } - } - } - - return $is_auto_generate; - } - - /** - * Validate coupon having actions but without an amount - * - * @param boolean $is_valid_coupon_amount Whether the amount is validate or not. - * @param array $args Additional parameters. - * @return boolean - */ - public function validate_coupon_amount( $is_valid_coupon_amount = true, $args = array() ) { - - if ( ! $is_valid_coupon_amount ) { - $coupon_amount = ( ! empty( $args['coupon_amount'] ) ) ? $args['coupon_amount'] : 0; - $discount_type = ( ! empty( $args['discount_type'] ) ) ? $args['discount_type'] : ''; - $coupon_code = ( ! empty( $args['coupon_code'] ) ) ? $args['coupon_code'] : ''; - - $coupon_actions = ( ! empty( $coupon_code ) ) ? $this->get_coupon_actions( $coupon_code ) : array(); - - if ( 'smart_coupon' === $discount_type && $coupon_amount <= 0 && ! empty( $coupon_actions ) ) { - return true; - } - } - - return $is_valid_coupon_amount; - } - - /** - * Handle coupon actions when the cart is empty - * - * @param boolean $is_hold Whether to hold the coupon in cookie. - * @param array $args Additional arguments. - * @return boolean - */ - public function maybe_run_coupon_actions( $is_hold = true, $args = array() ) { - $cart = ( is_object( WC() ) && isset( WC()->cart ) ) ? WC()->cart : null; - if ( empty( $cart ) || WC()->cart->is_empty() ) { - $coupons_data = ( ! empty( $args['coupons_data'] ) ) ? $args['coupons_data'] : array(); - if ( ! empty( $coupons_data ) ) { - foreach ( $coupons_data as $coupon_data ) { - $coupon_code = ( ! empty( $coupon_data['coupon-code'] ) ) ? $coupon_data['coupon-code'] : ''; - if ( ! empty( $coupon_code ) ) { - $coupon_actions = $this->get_coupon_actions( $coupon_code ); - $coupon_products = ( ! empty( $coupon_actions ) ) ? wp_list_pluck( $coupon_actions, 'product_id' ) : array(); - if ( ! empty( $coupon_products ) ) { - if ( ! WC()->cart->has_discount( $coupon_code ) ) { - WC()->cart->add_discount( trim( $coupon_code ) ); - $is_hold = false; - } - } - } - } - } - } - return $is_hold; - } - - /** - * Stop product update option for action tab products. - * - * @param string $cart_item_key contains the id of the cart item. - * @param int $quantity Current quantity of the item. - * @param int $old_quantity Old quantity of the item. - * @param WC_Cart $cart Cart object. - * @return void - */ - public function stop_cart_item_quantity_update( $cart_item_key = '', $quantity = 1, $old_quantity = 1, $cart = object ) { - - if ( empty( $cart_item_key ) || ! is_object( $cart ) || ! is_a( $cart, 'WC_Cart' ) ) { - return; - } - - $cart_data = is_callable( array( $cart, 'get_cart' ) ) ? $cart->get_cart() : array(); - $cart_item = ( ! empty( $cart_data[ $cart_item_key ] ) ) ? $cart_data[ $cart_item_key ] : array(); - - if ( empty( $cart_item ) ) { - return; - } - - $applied_coupons = is_callable( array( $cart, 'get_applied_coupons' ) ) ? $cart->get_applied_coupons() : array(); - - if ( ! empty( $cart_item['wc_sc_product_source'] ) && in_array( $cart_item['wc_sc_product_source'], $applied_coupons, true ) ) { - $cart->cart_contents[ $cart_item_key ]['quantity'] = $old_quantity; - } - - } - - } - -} - -WC_SC_Coupon_Actions::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-categories.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-categories.php deleted file mode 100644 index 5afe772f..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-categories.php +++ /dev/null @@ -1,216 +0,0 @@ - __( 'Coupon categories', 'woocommerce-smart-coupons' ), - 'singular_name' => __( 'Category', 'woocommerce-smart-coupons' ), - 'menu_name' => _x( 'Categories', 'Admin menu name', 'woocommerce-smart-coupons' ), - 'search_items' => __( 'Search coupon categories', 'woocommerce-smart-coupons' ), - 'all_items' => __( 'All coupon categories', 'woocommerce-smart-coupons' ), - 'parent_item' => __( 'Parent coupon category', 'woocommerce-smart-coupons' ), - 'parent_item_colon' => __( 'Parent coupon category:', 'woocommerce-smart-coupons' ), - 'edit_item' => __( 'Edit coupon category', 'woocommerce-smart-coupons' ), - 'update_item' => __( 'Update coupon category', 'woocommerce-smart-coupons' ), - 'add_new_item' => __( 'Add new coupon category', 'woocommerce-smart-coupons' ), - 'new_item_name' => __( 'New coupon category name', 'woocommerce-smart-coupons' ), - 'not_found' => __( 'No coupon categories found', 'woocommerce-smart-coupons' ), - ); - register_taxonomy( - 'sc_coupon_category', // Taxonomy name. - array( 'shop_coupon' ), // object for which the taxonomy is created. - array( - 'labels' => $labels, - 'description' => __( 'Manage coupon categories', 'woocommerce-smart-coupons' ), - 'public' => true, - 'hierarchical' => true, - 'show_ui' => true, - 'show_in_menu' => false, - 'show_in_rest' => true, - 'show_admin_column' => true, - 'rewrite' => array( 'slug' => 'sc_coupon_category' ), - 'query_var' => true, - ) - ); - register_taxonomy_for_object_type( 'sc_coupon_category', 'shop_coupon' ); - } - - /** - * Function to render coupon category column on coupons dashboard. - * - * @param int $post_id The coupon ID. - */ - public function render_coupon_category_column( $post_id ) { - $terms = get_the_terms( $post_id, 'sc_coupon_category' ); - if ( ! empty( $terms ) ) { - foreach ( $terms as $term ) { - $content[] = '' . esc_html( $term->name ) . ''; - } - echo join( ', ', $content ); // phpcs:ignore - } else { - echo ''; - } - } - - /** - * Function to set woocommerce menu active - * - * @param string $parent_file file reference for menu. - */ - public function wc_sc_make_menu_active( $parent_file ) { - global $current_screen; - - $taxonomy = $current_screen->taxonomy; - if ( 'sc_coupon_category' === $taxonomy ) { - if ( $this->is_wc_gte_44() ) { - $parent_file = 'woocommerce-marketing'; - } else { - $parent_file = 'woocommerce'; - } - } - - return $parent_file; - } - - /** - * Function to add custom script in admin footer. - */ - public function add_footer_script() { - global $pagenow, $post; - $get_post_type = ( ! empty( $post->post_type ) ) ? $post->post_type : ( ( ! empty( $_GET['post_type'] ) ) ? wc_clean( wp_unslash( $_GET['post_type'] ) ) : '' ); // phpcs:ignore - if ( 'shop_coupon' === $get_post_type ) { - if ( 'post.php' === $pagenow || 'post-new.php' === $pagenow ) { - $manage_category_string = __( 'Manage coupon categories', 'woocommerce-smart-coupons' ); - ?> - - 'ID' ) + array_slice( $columns, 1, count( $columns ) - 1, true ); - } - return $columns; - } - - /** - * Function for add content to ID column of coupon category taxonomy page. - * - * @param string $content - column content. - * @param string $column_name - column_name. - * @param string $term_id - id. - * @return string - */ - public function wc_sc_coupon_category_id_column_content( $content = '', $column_name = '', $term_id = 0 ) { - return $term_id; - } - - /** - * Function for change ID column to sortable. - * - * @param array $columns - Existing columns. - * @return array - */ - public function wc_sc_define_sortable_id_columns( $columns = array() ) { - $columns['id'] = 'id'; - return $columns; - } - - - } - -} - -WC_SC_Coupon_Categories::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-columns.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-columns.php deleted file mode 100644 index e8dfde81..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-columns.php +++ /dev/null @@ -1,196 +0,0 @@ -list_table_type . '_posts_columns', array( $this, 'define_columns' ), 11 ); - add_action( 'manage_' . $this->list_table_type . '_posts_custom_column', array( $this, 'render_columns' ), 10, 2 ); - } - - /** - * Get single instance of WC_SC_Coupon_Columns - * - * @return WC_SC_Coupon_Columns Singleton object of WC_SC_Coupon_Columns - */ - public static function get_instance() { - // Check if instance is already exists. - if ( is_null( self::$instance ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Handle call to functions which is not available in this class - * - * @param string $function_name The function name. - * @param array $arguments Array of arguments passed while calling $function_name. - * @return result of function call - */ - public function __call( $function_name, $arguments = array() ) { - - global $woocommerce_smart_coupon; - - if ( ! is_callable( array( $woocommerce_smart_coupon, $function_name ) ) ) { - return; - } - - if ( ! empty( $arguments ) ) { - return call_user_func_array( array( $woocommerce_smart_coupon, $function_name ), $arguments ); - } else { - return call_user_func( array( $woocommerce_smart_coupon, $function_name ) ); - } - - } - - /** - * Pre-fetch any data for the row each column has access to it. - * - * @param int $post_id Post ID being shown. - */ - protected function prepare_row_data( $post_id = 0 ) { - - if ( empty( $post_id ) ) { - return; - } - - $coupon_id = 0; - if ( ! empty( $this->object ) ) { - $coupon = $this->object; - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - } - } - - if ( empty( $this->object ) || $coupon_id !== $post_id ) { - $this->object = new WC_Coupon( $post_id ); - } - } - - /** - * Define which columns to show on this screen. - * - * @param array $columns Existing columns. - * @return array - */ - public function define_columns( $columns = array() ) { - - if ( ! is_array( $columns ) || empty( $columns ) ) { - $columns = array(); - } - - $columns['wc_sc_view_orders'] = __( 'Used in orders', 'woocommerce-smart-coupons' ); - $columns['wc_sc_coupon_category'] = __( 'Coupon categories', 'woocommerce-smart-coupons' ); - - return $columns; - } - - /** - * Render individual columns. - * - * @param string $column Column ID to render. - * @param int $post_id Post ID being shown. - */ - public function render_columns( $column = '', $post_id = 0 ) { - - $this->prepare_row_data( $post_id ); - - if ( ! $this->object ) { - return; - } - - if ( ! empty( $column ) ) { - switch ( $column ) { - case 'wc_sc_view_orders': - $this->render_view_orders_column(); - break; - case 'wc_sc_coupon_category': - WC_SC_Coupon_Categories::get_instance()->render_coupon_category_column( $post_id ); - break; - } - } - - } - - /** - * Render column: view_orders. - */ - public function render_view_orders_column() { - - $coupon = $this->object; - - if ( $this->is_wc_gte_30() ) { - $usage_count = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_usage_count' ) ) ) ? $coupon->get_usage_count() : 0; - } else { - $usage_count = ( ! empty( $coupon->usage_count ) ) ? $coupon->usage_count : 0; - } - - $column_content = ''; - if ( ! empty( $usage_count ) ) { - if ( $this->is_wc_gte_30() ) { - $coupon_code = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - } else { - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - $coupon_usage_url = esc_url( admin_url( sprintf( 'edit.php?s=%s&post_status=all&post_type=shop_order&trigger=woocommerce-smart-coupons', esc_html( $coupon_code ) ) ) ); - $column_content = sprintf( '', $coupon_usage_url ); - } else { - $column_content = '–'; - } - - $column_content = apply_filters( 'wc_sc_view_orders_column_content', $column_content, array( 'coupon' => $coupon ) ); - echo $column_content; // phpcs:ignore - - } - - } - -} - -WC_SC_Coupon_Columns::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-fields.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-fields.php deleted file mode 100644 index 1394dbc2..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-fields.php +++ /dev/null @@ -1,1246 +0,0 @@ -post_title ) ) { - return; - } - - $shop_page_id = get_option( 'woocommerce_shop_page_id', 0 ); - - if ( ! empty( $shop_page_id ) ) { - $shop_page_id = 'shop'; - } else { - $home_url = home_url(); - $shop_page_id = ( function_exists( 'wpcom_vip_url_to_postid' ) ) ? wpcom_vip_url_to_postid( $home_url ) : url_to_postid( $home_url ); // phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.url_to_postid_url_to_postid - } - - if ( empty( $shop_page_id ) ) { - $shop_page_id = 'cart'; - } - - $coupon_share_url = add_query_arg( - array( - 'coupon-code' => $post->post_title, - 'sc-page' => $shop_page_id, - ), - home_url( '/' ) - ); - - ?> -

            - -


            - - ID ) ) ? $post->ID : 0; - } - $coupon = ( ! empty( $coupon_id ) ) ? new WC_Coupon( $coupon_id ) : null; - } - - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - - ?> - -
            - is_wc_gte_32() ) { - woocommerce_wp_hidden_input( - array( - 'id' => 'wc_sc_expiry_time', - ) - ); - - woocommerce_wp_text_input( - array( - 'id' => 'wc_sc_expiry_time_picker', - 'label' => __( 'Coupon expiry time', 'woocommerce-smart-coupons' ), - 'placeholder' => esc_attr__( 'HH:MM', 'woocommerce-smart-coupons' ), - 'description' => __( 'Time after which coupon will be expired. This will work in conjunction with Coupon expiry date.', 'woocommerce-smart-coupons' ), - 'type' => 'text', - 'desc_tip' => true, - 'custom_attributes' => array( - 'autocomplete' => 'off', - ), - ) - ); - } - - // Max discount field for percentage type coupon. - woocommerce_wp_text_input( - array( - 'id' => 'wc_sc_max_discount', - 'label' => __( 'Max discount', 'woocommerce-smart-coupons' ), - 'placeholder' => esc_attr__( 'Unlimited discount', 'woocommerce-smart-coupons' ), - 'description' => __( 'The maximum discount this coupon can give on a cart.', 'woocommerce-smart-coupons' ), - 'type' => 'number', - 'desc_tip' => true, - 'custom_attributes' => array( - 'step' => 'any', - 'min' => 0, - ), - ) - ); - - woocommerce_wp_checkbox( - array( - 'id' => 'sc_restrict_to_new_user', - 'label' => __( 'For new user only?', 'woocommerce-smart-coupons' ), - 'description' => __( 'When checked, this coupon will be valid for the user\'s first order on the store.', 'woocommerce-smart-coupons' ), - ) - ); - - if ( true === $is_callable_coupon_get_meta ) { - $sc_coupon_validity = $coupon->get_meta( 'sc_coupon_validity' ); - $validity_suffix = $coupon->get_meta( 'validity_suffix' ); - } else { - $sc_coupon_validity = get_post_meta( $post->ID, 'sc_coupon_validity', true ); - $validity_suffix = get_post_meta( $post->ID, 'validity_suffix', true ); - } - - ?> -

            - -   - - -

            - 'is_pick_price_of_product', - 'label' => __( 'Coupon value same as product\'s price?', 'woocommerce-smart-coupons' ), - 'description' => __( 'When checked, generated coupon\'s value will be same as product\'s price', 'woocommerce-smart-coupons' ), - ) - ); - woocommerce_wp_checkbox( - array( - 'id' => 'auto_generate_coupon', - 'label' => __( 'Auto generate new coupons with each item', 'woocommerce-smart-coupons' ), - 'description' => __( 'Generate exact copy of this coupon with unique coupon code for each purchased product (needs this coupon to be linked with that product)', 'woocommerce-smart-coupons' ), - ) - ); - } - - echo '
            '; - - ?> -

            - get_meta( 'coupon_title_prefix' ); - $coupon_title_suffix = $coupon->get_meta( 'coupon_title_suffix' ); - } elseif ( ! empty( $post->ID ) ) { - $coupon_title_prefix = get_post_meta( $post->ID, 'coupon_title_prefix', true ); - $coupon_title_suffix = get_post_meta( $post->ID, 'coupon_title_suffix', true ); - } - ?> - -   - coupon_code  - - -

            - '; - - if ( ! $is_page_bulk_generate ) { - - echo '
            '; - // for disabling e-mail restriction. - woocommerce_wp_checkbox( - array( - 'id' => 'sc_is_visible_storewide', - 'label' => __( 'Show on cart, checkout', 'woocommerce-smart-coupons' ) . '
            ' . __( 'and my account?', 'woocommerce-smart-coupons' ), - 'description' => __( 'When checked, this coupon will be visible on cart/checkout page for everyone', 'woocommerce-smart-coupons' ), - ) - ); - - echo '
            '; - - } - ?> -
            - -
            - $this, - 'coupon_id' => $coupon_id, - 'coupon_obj' => $coupon, - ) - ); - - woocommerce_wp_checkbox( - array( - 'id' => 'sc_disable_email_restriction', - 'label' => __( 'Disable email restriction?', 'woocommerce-smart-coupons' ), - 'description' => __( 'Do not restrict auto-generated coupons to buyer/receiver email, anyone with coupon code can use it', 'woocommerce-smart-coupons' ), - ) - ); - ?> -
            - is_callable( $coupon, 'get_meta' ) ) ? $coupon->get_discount_type() : get_post_meta( $post_id, 'discount_type', true ); - - if ( true === $this->is_callable( $coupon, 'update_meta_data' ) ) { - - if ( isset( $_POST['sc_restrict_to_new_user'] ) ) { // phpcs:ignore - $coupon->update_meta_data( 'sc_restrict_to_new_user', $post_sc_restrict_to_new_user ); - } else { - $coupon->update_meta_data( 'sc_restrict_to_new_user', 'no' ); - } - - if ( isset( $_POST['auto_generate_coupon'] ) ) { // phpcs:ignore - $coupon->update_meta_data( 'auto_generate_coupon', $post_auto_generate_coupon ); - } else { - if ( 'smart_coupon' === $type ) { - $coupon->update_meta_data( 'auto_generate_coupon', 'yes' ); - } else { - $coupon->update_meta_data( 'auto_generate_coupon', 'no' ); - } - } - - if ( isset( $_POST['usage_limit_per_user'] ) ) { // phpcs:ignore - $coupon->set_usage_limit_per_user( $post_usage_limit_per_user ); - } - - if ( isset( $_POST['limit_usage_to_x_items'] ) ) { // phpcs:ignore - $coupon->set_limit_usage_to_x_items( $post_limit_usage_to_x_items ); - } - - if ( 'smart_coupon' === $type ) { - $coupon->update_meta_data( 'apply_before_tax', 'no' ); - } - - if ( isset( $_POST['coupon_title_prefix'] ) ) { // phpcs:ignore - $coupon->update_meta_data( 'coupon_title_prefix', $post_coupon_title_prefix ); - } - - if ( isset( $_POST['coupon_title_suffix'] ) ) { // phpcs:ignore - $coupon->update_meta_data( 'coupon_title_suffix', $post_coupon_title_suffix ); - } - - if ( isset( $_POST['sc_coupon_validity'] ) ) { // phpcs:ignore - $coupon->update_meta_data( 'sc_coupon_validity', $post_sc_coupon_validity ); - $coupon->update_meta_data( 'validity_suffix', $post_validity_suffix ); - } - - if ( isset( $_POST['sc_is_visible_storewide'] ) ) { // phpcs:ignore - $coupon->update_meta_data( 'sc_is_visible_storewide', $post_sc_is_visible_storewide ); - } else { - $coupon->update_meta_data( 'sc_is_visible_storewide', 'no' ); - } - - if ( isset( $_POST['sc_disable_email_restriction'] ) ) { // phpcs:ignore - $coupon->update_meta_data( 'sc_disable_email_restriction', $post_sc_disable_email_restriction ); - } else { - $coupon->update_meta_data( 'sc_disable_email_restriction', 'no' ); - } - - if ( isset( $_POST['is_pick_price_of_product'] ) ) { // phpcs:ignore - $coupon->update_meta_data( 'is_pick_price_of_product', $post_is_pick_price_of_product ); - } else { - $coupon->update_meta_data( 'is_pick_price_of_product', 'no' ); - } - - if ( isset( $_POST['wc_sc_add_product_ids'] ) ) { // phpcs:ignore - if ( $this->is_wc_gte_30() ) { - $product_ids = $post_wc_sc_add_product_ids; - } else { - $product_ids = array_filter( array_map( 'trim', explode( ',', $post_wc_sc_add_product_ids ) ) ); - } - $add_product_details = array(); - if ( ! empty( $product_ids ) ) { - $quantity = $post_wc_sc_add_product_qty; - $discount_amount = $post_wc_sc_product_discount_amount; - $discount_type = $post_wc_sc_product_discount_type; - foreach ( $product_ids as $id ) { - $data = array(); - $data['product_id'] = $id; - $data['quantity'] = $quantity; - $data['discount_amount'] = $discount_amount; - $data['discount_type'] = $discount_type; - $add_product_details[] = $data; - } - } - $coupon->update_meta_data( 'wc_sc_add_product_details', $add_product_details ); - } else { - $coupon->update_meta_data( 'wc_sc_add_product_details', array() ); - } - - if ( isset( $_POST['wc_sc_max_discount'] ) ) { // phpcs:ignore - $max_discount = wc_clean( wp_unslash( $_POST['wc_sc_max_discount'] ) ); // phpcs:ignore - $coupon->update_meta_data( 'wc_sc_max_discount', $max_discount ); - } - - if ( isset( $_POST['wc_sc_expiry_time'] ) ) { // phpcs:ignore - $expiry_time = wc_clean( wp_unslash( $_POST['wc_sc_expiry_time'] ) ); // phpcs:ignore - $coupon->update_meta_data( 'wc_sc_expiry_time', $expiry_time ); - } - - if ( ! empty( $post_discount_type ) && 'smart_coupon' === $post_discount_type && ! empty( $post_original_post_status ) && 'auto-draft' === $post_original_post_status && ! empty( $post_coupon_amount ) ) { - $coupon->update_meta_data( 'wc_sc_original_amount', $post_coupon_amount ); - } - } else { - - if ( isset( $_POST['sc_restrict_to_new_user'] ) ) { // phpcs:ignore - update_post_meta( $post_id, 'sc_restrict_to_new_user', $post_sc_restrict_to_new_user ); - } else { - update_post_meta( $post_id, 'sc_restrict_to_new_user', 'no' ); - } - - if ( isset( $_POST['auto_generate_coupon'] ) ) { // phpcs:ignore - update_post_meta( $post_id, 'auto_generate_coupon', $post_auto_generate_coupon ); - } else { - if ( 'smart_coupon' === $type ) { - update_post_meta( $post_id, 'auto_generate_coupon', 'yes' ); - } else { - update_post_meta( $post_id, 'auto_generate_coupon', 'no' ); - } - } - - if ( isset( $_POST['usage_limit_per_user'] ) ) { // phpcs:ignore - update_post_meta( $post_id, 'usage_limit_per_user', $post_usage_limit_per_user ); - } - - if ( isset( $_POST['limit_usage_to_x_items'] ) ) { // phpcs:ignore - update_post_meta( $post_id, 'limit_usage_to_x_items', $post_limit_usage_to_x_items ); - } - - if ( 'smart_coupon' === $type ) { - update_post_meta( $post_id, 'apply_before_tax', 'no' ); - } - - if ( isset( $_POST['coupon_title_prefix'] ) ) { // phpcs:ignore - update_post_meta( $post_id, 'coupon_title_prefix', $post_coupon_title_prefix ); - } - - if ( isset( $_POST['coupon_title_suffix'] ) ) { // phpcs:ignore - update_post_meta( $post_id, 'coupon_title_suffix', $post_coupon_title_suffix ); - } - - if ( isset( $_POST['sc_coupon_validity'] ) ) { // phpcs:ignore - update_post_meta( $post_id, 'sc_coupon_validity', $post_sc_coupon_validity ); - update_post_meta( $post_id, 'validity_suffix', $post_validity_suffix ); - } - - if ( isset( $_POST['sc_is_visible_storewide'] ) ) { // phpcs:ignore - update_post_meta( $post_id, 'sc_is_visible_storewide', $post_sc_is_visible_storewide ); - } else { - update_post_meta( $post_id, 'sc_is_visible_storewide', 'no' ); - } - - if ( isset( $_POST['sc_disable_email_restriction'] ) ) { // phpcs:ignore - update_post_meta( $post_id, 'sc_disable_email_restriction', $post_sc_disable_email_restriction ); - } else { - update_post_meta( $post_id, 'sc_disable_email_restriction', 'no' ); - } - - if ( isset( $_POST['is_pick_price_of_product'] ) ) { // phpcs:ignore - update_post_meta( $post_id, 'is_pick_price_of_product', $post_is_pick_price_of_product ); - } else { - update_post_meta( $post_id, 'is_pick_price_of_product', 'no' ); - } - - if ( isset( $_POST['wc_sc_add_product_ids'] ) ) { // phpcs:ignore - if ( $this->is_wc_gte_30() ) { - $product_ids = $post_wc_sc_add_product_ids; - } else { - $product_ids = array_filter( array_map( 'trim', explode( ',', $post_wc_sc_add_product_ids ) ) ); - } - $add_product_details = array(); - if ( ! empty( $product_ids ) ) { - $quantity = $post_wc_sc_add_product_qty; - $discount_amount = $post_wc_sc_product_discount_amount; - $discount_type = $post_wc_sc_product_discount_type; - foreach ( $product_ids as $id ) { - $data = array(); - $data['product_id'] = $id; - $data['quantity'] = $quantity; - $data['discount_amount'] = $discount_amount; - $data['discount_type'] = $discount_type; - $add_product_details[] = $data; - } - } - update_post_meta( $post_id, 'wc_sc_add_product_details', $add_product_details ); - } else { - update_post_meta( $post_id, 'wc_sc_add_product_details', array() ); - } - - if ( isset( $_POST['wc_sc_max_discount'] ) ) { // phpcs:ignore - $max_discount = wc_clean( wp_unslash( $_POST['wc_sc_max_discount'] ) ); // phpcs:ignore - update_post_meta( $post_id, 'wc_sc_max_discount', $max_discount ); - } - - if ( isset( $_POST['wc_sc_expiry_time'] ) ) { // phpcs:ignore - $expiry_time = wc_clean( wp_unslash( $_POST['wc_sc_expiry_time'] ) ); // phpcs:ignore - update_post_meta( $post_id, 'wc_sc_expiry_time', $expiry_time ); - } - - if ( ! empty( $post_discount_type ) && 'smart_coupon' === $post_discount_type && ! empty( $post_original_post_status ) && 'auto-draft' === $post_original_post_status && ! empty( $post_coupon_amount ) ) { - update_post_meta( $post_id, 'wc_sc_original_amount', $post_coupon_amount ); - } - } - - if ( $this->is_callable( $coupon, 'save' ) ) { - $coupon->save(); - } - - } - - /** - * Add a tab in coupon data metabox - * - * @param array $tabs Existing tabs. - * @return array $tabs With additional tab - */ - public function smart_coupons_data_tabs( $tabs = array() ) { - - $tabs['wc_sc_actions'] = array( - 'label' => __( 'Actions', 'woocommerce-smart-coupons' ), - 'target' => 'wc_smart_coupons_actions', - 'class' => '', - ); - - return $tabs; - } - - /** - * Panel for Smart Coupons additional data fields - * - * @param integer $coupon_id The coupon id. - * @param WC_Coupon $coupon The coupon object. - */ - public function smart_coupons_data_panels( $coupon_id = 0, $coupon = null ) { - - $add_product_details = ( ! empty( $coupon_id ) ) ? $this->get_post_meta( $coupon_id, 'wc_sc_add_product_details', true ) : array(); - $add_product_qty = ( isset( $add_product_details[0]['quantity'] ) ) ? $add_product_details[0]['quantity'] : 1; - $discount_amount = ( isset( $add_product_details[0]['discount_amount'] ) && '' !== $add_product_details[0]['discount_amount'] ) ? $add_product_details[0]['discount_amount'] : ''; - $discount_type = ( ! empty( $add_product_details[0]['discount_type'] ) ) ? $add_product_details[0]['discount_type'] : 'percent'; - - $is_js_started = did_action( 'wc_sc_enhanced_select_script_start' ); - if ( 0 === $is_js_started ) { - do_action( 'wc_sc_enhanced_select_script_start' ); - } - ?> -
            -
            -

            -

            - - - is_wc_gte_30() ) { ?> - - - get_formatted_name() ); - } - } - } - ?> - - -

            -

            - - - -

            -

            - - - - -

            -
            - -
            - plugin_url() ) . '/assets/'; - - // Register scripts. - if ( ! wp_script_is( 'woocommerce_admin', 'registered' ) ) { - wp_register_script( 'woocommerce_admin', WC()->plugin_url() . '/assets/js/admin/woocommerce_admin' . $suffix . '.js', array( 'jquery', 'jquery-blockui', 'jquery-ui-sortable', 'jquery-ui-widget', 'jquery-ui-core', 'jquery-tiptip' ), WC()->version, false ); - } - - if ( $this->is_wc_gte_32() ) { - wp_register_script( 'wc-sc-select2', WC()->plugin_url() . '/assets/js/selectWoo/selectWoo.full' . $suffix . '.js', array( 'jquery' ), WC()->version, false ); - } else { - wp_register_script( 'wc-sc-select2', WC()->plugin_url() . '/assets/js/select2/select2.full' . $suffix . '.js', array( 'jquery' ), WC()->version, false ); - } - - if ( ! wp_script_is( 'wc-enhanced-select', 'registered' ) ) { - wp_register_script( 'wc-enhanced-select', WC()->plugin_url() . '/assets/js/admin/wc-enhanced-select' . $suffix . '.js', array( 'jquery', 'wc-sc-select2' ), WC()->version, false ); - } - $wc_sc_select_params = array( - 'i18n_matches_1' => _x( 'One result is available, press enter to select it.', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_matches_n' => _x( '%qty% results are available, use up and down arrow keys to navigate.', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_no_matches' => _x( 'No matches found', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_ajax_error' => _x( 'Searching…', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_input_too_short_1' => _x( 'Please enter 1 or more characters', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_input_too_short_n' => _x( 'Please enter %qty% or more characters', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_input_too_long_1' => _x( 'Please delete 1 character', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_input_too_long_n' => _x( 'Please delete %qty% characters', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_selection_too_long_1' => _x( 'You can only select 1 item', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_selection_too_long_n' => _x( 'You can only select %qty% items', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_load_more' => _x( 'Loading more results…', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_searching' => _x( 'Searching…', 'enhanced select', 'woocommerce-smart-coupons' ), - 'ajax_url' => admin_url( 'admin-ajax.php' ), - 'search_products_nonce' => wp_create_nonce( 'search-products' ), - 'search_customers_nonce' => wp_create_nonce( 'search-customers' ), - ); - - $params = array( - 'strings' => array( - 'import_products' => '', - 'export_products' => '', - ), - 'urls' => array( - 'import_products' => '', - 'export_products' => '', - ), - ); - - wp_localize_script( 'woocommerce_admin', 'woocommerce_admin', $params ); - wp_localize_script( 'wc-sc-select2', 'wc_enhanced_select_params', $wc_sc_select_params ); - - wp_enqueue_script( 'woocommerce_admin' ); - wp_enqueue_style( 'woocommerce_admin_styles', WC()->plugin_url() . '/assets/css/admin.css', array(), WC()->version ); - - wp_enqueue_script( 'wc-sc-select2' ); - wp_enqueue_script( 'wc-enhanced-select' ); - wp_enqueue_style( 'wc-sc-select2', $assets_path . 'css/select2.css', array(), WC()->version ); - - } - - /** - * Enhanced select script end - */ - public function enhanced_select_script_end() { - ?> - - 'false', - 'message' => __( 'Could not locate WooCommerce', 'woocommerce-smart-coupons' ), - ) - ); - } - include_once dirname( WC_PLUGIN_FILE ) . '/includes/class-wc-ajax.php'; - } - - $term = (string) urldecode( sanitize_text_field( wp_unslash( $_GET['term'] ) ) ); // phpcs:ignore - - WC_AJAX::json_search_products( $term, true ); - - } - - /** - * Remove variation parent from search result - * - * @param array $products Array of product ids with product name. - * @return array $products Array of product ids with product name after removing variation parent - */ - public function exclude_variation_parent( $products = null ) { - - $backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - - if ( 'wc_sc_json_search_products_and_variations' === $backtrace[5]['function'] ) { - if ( ! empty( $products ) ) { - $product_ids = array_keys( $products ); - $parent_ids = array_map( 'wp_get_post_parent_id', $product_ids ); - $parent_ids = array_filter( array_unique( $parent_ids ) ); - foreach ( $parent_ids as $parent ) { - unset( $products[ $parent ] ); - } - } - } - - return $products; - - } - - /** - * Function to add new discount type 'smart_coupon' - * - * @param array $discount_types Existing discount types. - * @return array $discount_types Including smart coupon discount type. - */ - public function add_smart_coupon_discount_type( $discount_types ) { - global $store_credit_label; - - $discount_types['smart_coupon'] = ! empty( $store_credit_label['singular'] ) ? ucfirst( $store_credit_label['singular'] ) : __( 'Store Credit / Gift Certificate', 'woocommerce-smart-coupons' ); - - return $discount_types; - } - - /** - * Function to enqueue required styles and scripts for Smart Coupons' custom fields - */ - public function enqueue_styles_scripts() { - global $post; - - if ( ! empty( $post->post_type ) && 'shop_coupon' === $post->post_type && ! empty( $post->ID ) ) { - - $coupon = ( ! empty( $post->ID ) ) ? new WC_Coupon( $post->ID ) : null; - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - - // Compatibility between expiry_date & date_expires meta field. - if ( $this->is_wc_gte_30() ) { - $date_expires = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_date_expires() : intval( get_post_meta( $post->ID, 'date_expires', true ) ); - $expiry_date = get_post_meta( $post->ID, 'expiry_date', true ); - - if ( is_object( $date_expires ) && is_a( $date_expires, 'WC_DateTime' ) && $this->is_callable( $date_expires, 'getTimestamp' ) ) { - $date_expires = $date_expires->getTimestamp(); - } - - if ( ! empty( $expiry_date ) && empty( $date_expires ) ) { - $date_expires = $this->wc_string_to_datetime_to_timestamp( $expiry_date ); - $date_expires = $this->get_date_expires_value( $date_expires ); - $this->update_post_meta( $post->ID, 'date_expires', $date_expires ); - delete_post_meta( $post->ID, 'expiry_date' ); // No need to run CRUD function as this meta_key no longer exists. - $js = "jQuery('input#expiry_date').val('" . $expiry_date . "');"; - wc_enqueue_js( $js ); - } - } - - if ( is_callable( 'WC_Smart_Coupons::get_smart_coupons_plugin_data' ) ) { - $plugin_data = WC_Smart_Coupons::get_smart_coupons_plugin_data(); - $version = $plugin_data['Version']; - } else { - $version = ''; - } - - $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; - - if ( ! wp_style_is( 'jquery-ui-style', 'registered' ) ) { - wp_register_style( 'jquery-ui-style', WC()->plugin_url() . '/assets/css/jquery-ui/jquery-ui' . $suffix . '.css', array(), WC()->version ); - } - - if ( ! wp_style_is( 'jquery-ui-timepicker', 'registered' ) ) { - wp_register_style( 'jquery-ui-timepicker', untrailingslashit( plugins_url( '/', WC_SC_PLUGIN_FILE ) ) . '/assets/css/jquery-ui-timepicker-addon' . $suffix . '.css', array( 'jquery-ui-style' ), $version ); - } - - if ( ! wp_style_is( 'jquery-ui-timepicker' ) ) { - wp_enqueue_style( 'jquery-ui-timepicker' ); - } - - if ( ! wp_script_is( 'jquery-ui-timepicker', 'registered' ) ) { - wp_register_script( 'jquery-ui-timepicker', untrailingslashit( plugins_url( '/', WC_SC_PLUGIN_FILE ) ) . '/assets/js/jquery-ui-timepicker-addon' . $suffix . '.js', array( 'jquery', 'jquery-ui-datepicker', 'jquery-ui-slider' ), $version, true ); - } - - if ( ! wp_script_is( 'jquery-ui-timepicker' ) ) { - wp_enqueue_script( 'jquery-ui-timepicker' ); - } - - $screen = get_current_screen(); - if ( 'shop_coupon' === $screen->id ) { - ?> - - import_page = 'wc-sc-coupons'; - add_filter( 'upload_dir', array( $this, 'upload_dir' ) ); - ob_start(); - } - - /** - * Get single instance of WC_SC_Coupon_Fields - * - * @return WC_SC_Coupon_Fields Singleton object of WC_SC_Coupon_Fields - */ - public static function get_instance() { - // Check if instance is already exists. - if ( is_null( self::$instance ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Handle call to functions which is not available in this class - * - * @param string $function_name The function name. - * @param array $arguments Array of arguments passed while calling $function_name. - * @return result of function call - */ - public function __call( $function_name, $arguments = array() ) { - - global $woocommerce_smart_coupon; - - if ( ! is_callable( array( $woocommerce_smart_coupon, $function_name ) ) ) { - return; - } - - if ( ! empty( $arguments ) ) { - return call_user_func_array( array( $woocommerce_smart_coupon, $function_name ), $arguments ); - } else { - return call_user_func( array( $woocommerce_smart_coupon, $function_name ) ); - } - - } - - /** - * Registered callback function for the WordPress Importer - * - * Manages the three separate stages of the CSV import process - */ - public function dispatch() { - global $woocommerce_smart_coupon; - $step = ( empty( $_GET['step'] ) ) ? 0 : absint( wc_clean( wp_unslash( $_GET['step'] ) ) ); // phpcs:ignore - - switch ( $step ) { - case 0: - $this->greet(); - break; - case 1: - check_admin_referer( 'import-upload' ); - if ( $this->handle_upload() ) { - $this->import_options(); - } - break; - case 2: - $action_processed = $this->process_bulk_generate_action(); - $url = admin_url( 'edit.php?post_type=shop_coupon' ); - - ob_clean(); - wp_safe_redirect( $url ); - exit; - } - } - - /** - * Process bulk generation action - * - * @return bool $action_processed Is action processed - */ - public function process_bulk_generate_action() { - global $woocommerce_smart_coupon; - - check_admin_referer( 'import-woocommerce-coupon' ); - - $schedule_action = ''; - $permission_error = false; - $action_processed = false; - - $post_smart_coupons_generate_action = ( isset( $_POST['smart_coupons_generate_action'] ) ) ? wc_clean( wp_unslash( $_POST['smart_coupons_generate_action'] ) ) : ''; // phpcs:ignore - $post_generate_and_import = ( isset( $_POST['generate_and_import'] ) ) ? wc_clean( wp_unslash( $_POST['generate_and_import'] ) ) : ''; // phpcs:ignore - - if ( empty( $post_smart_coupons_generate_action ) && empty( $post_generate_and_import ) ) { - - $this->id = ( ! empty( $_POST['import_id'] ) ) ? absint( wc_clean( wp_unslash( $_POST['import_id'] ) ) ) : 0; // phpcs:ignore - $this->file_url = ( ! empty( $_POST['import_url'] ) ) ? wc_clean( wp_unslash( $_POST['import_url'] ) ) : ''; // phpcs:ignore - - if ( $this->id ) { - $file = get_attached_file( $this->id ); - } else { - $file = ( ! empty( $this->file_url ) ) ? ABSPATH . $this->file_url : ''; - } - - $upload_dir = wp_get_upload_dir(); - $csv_file_data['file_name'] = basename( $file ); - $csv_file_data['wp_upload_dir'] = $upload_dir['basedir'] . '/woocommerce_uploads/'; - - $_POST['export_file'] = $csv_file_data; - - if ( ! isset( $_POST['no_of_coupons_to_generate'] ) ) { - ini_set( 'auto_detect_line_endings', true ); // phpcs:ignore - $fp = file( $file ); - if ( is_array( $fp ) && ! empty( $fp ) ) { - $_POST['no_of_coupons_to_generate'] = count( $fp ) - 1; - } else { - $permission_error = true; - } - } - - $total_coupons_to_generate = sanitize_text_field( wp_unslash( $_POST['no_of_coupons_to_generate'] ) ); - $_POST['total_coupons_to_generate'] = $total_coupons_to_generate; - - $_POST['action_stage'] = 0; - $_POST['smart_coupons_generate_action'] = 'import_from_csv'; - - update_option( 'woo_sc_generate_coupon_posted_data', $_POST, 'no' ); - - update_option( 'start_time_woo_sc', time(), 'no' ); - update_option( 'current_time_woo_sc', time(), 'no' ); - update_option( 'all_tasks_count_woo_sc', sanitize_text_field( wp_unslash( $_POST['no_of_coupons_to_generate'] ) ), 'no' ); - update_option( 'remaining_tasks_count_woo_sc', sanitize_text_field( wp_unslash( $_POST['no_of_coupons_to_generate'] ) ), 'no' ); - - as_unschedule_action( 'woo_sc_generate_coupon_csv' ); - as_unschedule_action( 'woo_sc_import_coupons_from_csv' ); - - $schedule_action = 'woo_sc_import_coupons_from_csv'; - } else { - - // If we are exporting coupons then create export file and save its path in options table. - $coupon_column_headers = $this->get_coupon_column_headers(); - $coupon_posts_headers = $coupon_column_headers['posts_headers']; - $coupon_postmeta_headers = $coupon_column_headers['postmeta_headers']; - $coupon_term_headers = $coupon_column_headers['term_headers']; - $column_headers = array_merge( $coupon_posts_headers, $coupon_postmeta_headers, $coupon_term_headers ); - $export_file = $woocommerce_smart_coupon->export_coupon_csv( $column_headers, array() ); // phpcs:ignore - - if ( is_array( $export_file ) && ! isset( $export_file['error'] ) ) { - - // Create CSV file. - $csv_folder = $export_file['wp_upload_dir']; - $filename = str_replace( array( '\'', '"', ',', ';', '<', '>', '/', ':' ), '', $export_file['file_name'] ); - $csvfilename = $csv_folder . $filename; - $fp = fopen( $csvfilename, 'w' ); // phpcs:ignore - if ( false !== $fp ) { - fwrite( $fp , $export_file['file_content'] ); // phpcs:ignore - fclose( $fp ); // phpcs:ignore - $_POST['export_file'] = $export_file; - - $total_coupons_to_generate = sanitize_text_field( wp_unslash( $_POST['no_of_coupons_to_generate'] ) ); - $_POST['total_coupons_to_generate'] = $total_coupons_to_generate; - - $_POST['action_stage'] = 0; - - update_option( 'woo_sc_generate_coupon_posted_data', $_POST, 'no' ); - update_option( 'start_time_woo_sc', time(), 'no' ); - update_option( 'current_time_woo_sc', time(), 'no' ); - update_option( 'all_tasks_count_woo_sc', sanitize_text_field( wp_unslash( $_POST['no_of_coupons_to_generate'] ) ), 'no' ); - update_option( 'remaining_tasks_count_woo_sc', sanitize_text_field( wp_unslash( $_POST['no_of_coupons_to_generate'] ) ), 'no' ); - - as_unschedule_action( 'woo_sc_generate_coupon_csv' ); - as_unschedule_action( 'woo_sc_import_coupons_from_csv' ); - delete_option( 'woo_sc_action_data' ); - - $schedule_action = 'woo_sc_generate_coupon_csv'; - } else { - $permission_error = true; - } - } else { - $permission_error = true; - } - } - - // Proceed only if there is no any file permission error. - if ( true !== $permission_error ) { - if ( ( ! empty( $post_smart_coupons_generate_action ) && ( 'woo_sc_is_email_imported_coupons' === $post_smart_coupons_generate_action || 'send_store_credit' === $post_smart_coupons_generate_action ) ) || ( isset( $_POST['woo_sc_is_email_imported_coupons'] ) ) ) { - update_option( 'woo_sc_is_email_imported_coupons', 'yes', 'no' ); - } - - $generate_action = ( isset( $_POST['smart_coupons_generate_action'] ) ) ? wc_clean( wp_unslash( $_POST['smart_coupons_generate_action'] ) ) : ''; // phpcs:ignore - $is_import_email = get_option( 'woo_sc_is_email_imported_coupons' ); - - if ( 'yes' === $is_import_email && ( isset( $_POST['import_id'] ) || isset( $_POST['import_url'] ) ) ) { // phpcs:ignore - $bulk_action = 'import_email'; - } elseif ( isset( $_POST['import_id'] ) || isset( $_POST['import_url'] ) ) { // phpcs:ignore - $bulk_action = 'import'; - } elseif ( 'woo_sc_is_email_imported_coupons' === $generate_action ) { - $bulk_action = 'generate_email'; - } elseif ( 'send_store_credit' === $generate_action ) { - $bulk_action = 'send_store_credit'; - } else { - $bulk_action = 'generate'; - } - - update_option( 'bulk_coupon_action_woo_sc', $bulk_action, 'no' ); - - if ( ! empty( $schedule_action ) ) { - do_action( $schedule_action ); - $action_processed = true; - } - } - - return $action_processed; - } - - /** - * Create new posts based on import information - * - * @param array $post The post. - * @return int $global_coupon_id The imported coupon id - */ - public function process_coupon( $post ) { - global $woocommerce_smart_coupon; - - $global_coupon_id = ''; // for handling global coupons. - - // Get parent. - $post_parent = absint( $post['post_parent'] ); - - if ( ! empty( $post_parent ) ) { - // if we already know the parent, map it to the new local ID. - if ( isset( $this->processed_posts[ $post_parent ] ) ) { - $post_parent = $this->processed_posts[ $post_parent ]; - // otherwise record the parent for later. - } else { - $this->post_orphans[ intval( $post['post_id'] ) ] = $post_parent; - $post_parent = 0; - } - } - - // Generate coupon code if post_title is empty. - $post_title = ( ! empty( $post['post_title'] ) ) ? $post['post_title'] : $woocommerce_smart_coupon->generate_unique_code(); - - $postdata = array( - 'import_id' => $post['post_id'], - 'post_author' => ( ! empty( $post['post_author'] ) ) ? absint( $post['post_author'] ) : get_current_user_id(), - 'post_date' => ( $post['post_date'] ) ? gmdate( 'Y-m-d H:i:s', strtotime( $post['post_date'] ) ) : '', - 'post_date_gmt' => ( $post['post_date_gmt'] ) ? gmdate( 'Y-m-d H:i:s', strtotime( $post['post_date_gmt'] ) ) : '', - 'post_content' => $post['post_content'], - 'post_excerpt' => $post['post_excerpt'], - 'post_title' => $post_title, - 'post_name' => ( ! empty( $post['post_name'] ) ) ? $post['post_name'] : ( ! empty( $post['post_title'] ) ? sanitize_title( $post['post_title'] ) : sanitize_title( $post_title ) ), - 'post_status' => $post['post_status'], - 'post_parent' => $post_parent, - 'menu_order' => $post['menu_order'], - 'post_type' => 'shop_coupon', - 'post_password' => $post['post_password'], - 'comment_status' => $post['comment_status'], - ); - - $_coupon = new WC_Coupon(); - $_coupon->set_code( $postdata['post_title'] ); - $_coupon->set_status( $postdata['post_status'] ); - $_coupon->set_date_created( $postdata['post_date'] ); - $_coupon->set_description( $postdata['post_excerpt'] ); - - $post_id = $_coupon->save(); - - if ( ! empty( $post_id ) ) { - $postdata = array_diff_key( $postdata, array_flip( array( 'post_date', 'post_excerpt', 'post_title', 'post_status', 'post_type' ) ) ); - $postdata['ID'] = $post_id; - wp_update_post( $postdata ); - } else { - $this->skipped++; - unset( $post ); - return; - } - - unset( $postdata ); - - // map pre-import ID to local ID. - if ( empty( $post['post_id'] ) ) { - $post['post_id'] = $post_id; - } - $this->processed_posts[ intval( $post['post_id'] ) ] = $post_id; - - $coupon_code = strtolower( $post_title ); - - $_coupon = new WC_Coupon( $post_id ); - - // add/update post meta. - if ( ! empty( $post['postmeta'] ) && is_array( $post['postmeta'] ) ) { - - $postmeta = array(); - foreach ( $post['postmeta'] as $meta ) { - $postmeta[ $meta['key'] ] = $meta['value']; - } - - $is_callable_update_meta_data = $this->is_callable( $_coupon, 'update_meta_data' ); - - foreach ( $postmeta as $meta_key => $meta_value ) { - switch ( $meta_key ) { - - case 'customer_email': - $customer_emails = maybe_unserialize( $meta_value ); - break; - - case 'coupon_amount': - $coupon_amount = maybe_unserialize( $meta_value ); - $discount_type = ! empty( $postmeta['discount_type'] ) ? $postmeta['discount_type'] : ''; - if ( ! empty( $discount_type ) && 'smart_coupon' === $discount_type ) { - if ( true === $is_callable_update_meta_data ) { - $_coupon->update_meta_data( 'wc_sc_original_amount', $coupon_amount ); - } else { - update_post_meta( $post_id, 'wc_sc_original_amount', $coupon_amount ); - } - } - break; - - case 'expiry_date': - if ( empty( $meta_value ) && ! empty( $postmeta['sc_coupon_validity'] ) && ! empty( $postmeta['validity_suffix'] ) ) { - $sc_coupon_validity = $postmeta['sc_coupon_validity']; - $validity_suffix = $postmeta['validity_suffix']; - $meta_value = gmdate( 'Y-m-d', strtotime( "+$sc_coupon_validity $validity_suffix" ) ); - } - break; - - case 'discount_type': - $discount_type = maybe_unserialize( $meta_value ); - break; - - case 'free_shipping': - $allowed_free_shipping = maybe_unserialize( $meta_value ); - break; - - case '_used_by': - if ( ! empty( $meta_value ) ) { - $used_by = explode( '|', $meta_value ); - if ( ! empty( $used_by ) && is_array( $used_by ) ) { - foreach ( $used_by as $_used_by ) { - add_post_meta( $post_id, $meta_key, $_used_by ); - } - } - } - break; - - case 'wc_sc_add_product_details': - if ( ! empty( $meta_value ) ) { - $add_product_details = array(); - $product_details = explode( '|', $meta_value ); - if ( ! empty( $product_details ) ) { - foreach ( $product_details as $index => $product_detail ) { - $data = array_map( 'trim', explode( ',', $product_detail ) ); - if ( empty( $data[0] ) ) { - continue; - } - $product_data['product_id'] = $data[0]; - $product_data['quantity'] = ( ! empty( $data[1] ) ) ? absint( $data[1] ) : 1; - $product_data['discount_amount'] = ( ! empty( $data[2] ) ) ? $data[2] : ''; - $product_data['discount_type'] = ( ! empty( $data[3] ) ) ? $data[3] : 'percent'; - $add_product_details[] = $product_data; - } - } - $meta_value = $add_product_details; - } - break; - - default: - $meta_value = apply_filters( - 'wc_sc_process_coupon_meta_value_for_import', - $meta_value, - array( - 'meta_key' => $meta_key, // phpcs:ignore - 'postmeta' => $postmeta, - 'post' => $post, - 'coupon_importer' => $this, - ) - ); - - } - - if ( $meta_key ) { - if ( 'customer_email' === $meta_key && ! empty( $postmeta['sc_disable_email_restriction'] ) && 'yes' === $postmeta['sc_disable_email_restriction'] ) { - continue; - } - if ( '_used_by' === $meta_key ) { - continue; - } - $is_import_meta = apply_filters( - 'wc_sc_is_import_meta', - true, - array( - 'meta_key' => $meta_key, // phpcs:ignore - 'postmeta' => $postmeta, - 'post' => $post, - 'coupon_importer' => $this, - ) - ); - if ( true === $is_import_meta ) { - if ( $this->is_wc_gte_30() ) { - if ( 'expiry_date' === $meta_key ) { - if ( ! empty( $meta_value ) ) { - $meta_value = $this->wc_string_to_datetime_to_timestamp( $meta_value ); - $meta_value = $this->get_date_expires_value( $meta_value ); - } else { - $meta_value = null; - } - if ( true === $is_callable_update_meta_data ) { - $_coupon->set_date_expires( $meta_value ); - } else { - update_post_meta( $post_id, 'date_expires', $meta_value ); - } - } else { - $key = ltrim( $meta_key, '_' ); - $key_to_props = array( - 'coupon_amount' => 'amount', - 'customer_email' => 'email_restrictions', - 'exclude_product_categories' => 'excluded_product_categories', - 'exclude_product_ids' => 'excluded_product_ids', - ); - if ( array_key_exists( $key, $key_to_props ) ) { - $key = $key_to_props[ $key ]; - } - $function = 'set_' . $key; - $has_setter = $this->is_callable( $_coupon, $function ); - if ( true === $has_setter ) { - $value = in_array( $key, array( 'individual_use', 'free_shipping', 'exclude_sale_items' ), true ) ? $this->wc_string_to_bool( maybe_unserialize( $meta_value ) ) : maybe_unserialize( $meta_value ); - $_coupon->{$function}( $value ); - } elseif ( true === $is_callable_update_meta_data ) { - $_coupon->update_meta_data( $meta_key, maybe_unserialize( $meta_value ) ); - } else { - update_post_meta( $post_id, $meta_key, maybe_unserialize( $meta_value ) ); - } - } - } else { - if ( true === $is_callable_update_meta_data ) { - $_coupon->update_meta_data( $meta_key, maybe_unserialize( $meta_value ) ); - } else { - update_post_meta( $post_id, $meta_key, maybe_unserialize( $meta_value ) ); - } - } - } - } - } - - if ( $this->is_callable( $_coupon, 'save' ) ) { - $_coupon->save(); - } - - unset( $post['postmeta'] ); - } - - // Update term data. - if ( ! empty( $post['term_data'] ) && is_array( $post['term_data'] ) ) { - foreach ( $post['term_data'] as $data ) { - if ( isset( $data['key'] ) && 'sc_coupon_category' === $data['key'] ) { - if ( ! empty( $data['value'] ) ) { - $coupon_cat_details = explode( '|', $data['value'] ); - wp_set_post_terms( $post_id, $coupon_cat_details, 'sc_coupon_category', true ); - } - } - } - unset( $post['term_data'] ); - } - - $posted_data = get_option( 'woo_sc_generate_coupon_posted_data', true ); - if ( isset( $posted_data['sc_coupon_category'] ) && ! empty( $posted_data['sc_coupon_category'] ) ) { - wp_set_post_terms( $post_id, $posted_data['sc_coupon_category'], 'sc_coupon_category', true ); - } - - $is_email_imported_coupons = get_option( 'woo_sc_is_email_imported_coupons' ); - - if ( 'yes' === $is_email_imported_coupons && ! empty( $customer_emails ) && ( ! empty( $coupon_amount ) || 'yes' === $allowed_free_shipping ) && ! empty( $coupon_code ) && ! empty( $discount_type ) ) { - $coupon = array( - 'amount' => $coupon_amount, - 'code' => $coupon_code, - ); - $coupon_title = array(); - foreach ( $customer_emails as $customer_email ) { - $coupon_title[ $customer_email ] = $coupon; - } - - $message = ''; - if ( ! empty( $posted_data ) && is_array( $posted_data ) ) { - $message = ( ! empty( $posted_data['smart_coupon_message'] ) ) ? $posted_data['smart_coupon_message'] : ''; - } - - $woocommerce_smart_coupon->sa_email_coupon( $coupon_title, $discount_type, 0, '', $message ); - } - - $this->imported++; - - // code for handling global coupons option. - if ( ( ! empty( $post['post_status'] ) && 'publish' === $post['post_status'] ) - && ( isset( $postmeta['customer_email'] ) && array() === $postmeta['customer_email'] ) - && ( isset( $postmeta['sc_is_visible_storewide'] ) && 'yes' === $postmeta['sc_is_visible_storewide'] ) - && ( isset( $postmeta['auto_generate_coupon'] ) && 'yes' !== $postmeta['auto_generate_coupon'] ) - && ( isset( $postmeta['discount_type'] ) && 'smart_coupon' !== $postmeta['discount_type'] ) ) { - - $global_coupon_id = $post_id; - } - - unset( $post ); - - return $global_coupon_id; - } - - /** - * Parses the CSV file and prepares us for the task of processing parsed data - * - * @param string $file Path to the CSV file for importing. - */ - public function import_start( $file ) { - - if ( ! is_file( $file ) ) { - echo '

            ' . esc_html__( 'Sorry, there has been an error.', 'woocommerce-smart-coupons' ) . '
            '; - echo esc_html__( 'The file does not exist, please try again.', 'woocommerce-smart-coupons' ) . '

            '; - die(); - } - - $this->parser = new WC_SC_Coupon_Parser( 'shop_coupon' ); - $import_data = $this->parser->parse_data( $file ); - - $this->parsed_data = $import_data[0]; - $this->raw_headers = $import_data[1]; - - unset( $import_data ); - - wp_defer_term_counting( true ); - wp_defer_comment_counting( true ); - - } - - /** - * Added to http_request_timeout filter to force timeout at 60 seconds during import - * - * @param int $val The current value. - * @return int 60 - */ - public function bump_request_timeout( $val ) { - return 60; - } - - /** - * Performs post-import cleanup of files and the cache - */ - public function import_end() { - - wp_cache_flush(); - - wp_defer_term_counting( false ); - wp_defer_comment_counting( false ); - - do_action( 'import_end' ); - - } - - /** - * Handles the CSV upload and initial parsing of the file to prepare for - * displaying author import options - * - * @return bool False if error uploading or invalid file, true otherwise - */ - public function handle_upload() { - - $post_file_url = ( ! empty( $_POST['file_url'] ) ) ? wc_clean( wp_unslash( $_POST['file_url'] ) ) : ''; // phpcs:ignore - - if ( empty( $post_file_url ) ) { - $file = wp_import_handle_upload(); - - if ( isset( $file['error'] ) ) { - echo '

            ' . esc_html__( 'Sorry, there has been an error.', 'woocommerce-smart-coupons' ) . '
            '; - echo esc_html( $file['error'] ) . '

            '; - return false; - } - - $this->id = absint( $file['id'] ); - - } else { - - if ( file_exists( ABSPATH . $post_file_url ) ) { - $this->file_url = esc_attr( $post_file_url ); - } else { - echo '

            ' . esc_html__( 'Sorry, there has been an error.', 'woocommerce-smart-coupons' ) . '

            '; - return false; - } - } - - return true; - } - - /** - * Function to validate import CSV file is following correct format - * - * @param array $header File headers. - * @return bool - */ - public function validate_file_header( $header = array() ) { - - $is_valid = true; - - if ( empty( $header ) || count( $header ) < 21 ) { - $is_valid = false; - } else { - $default = array( - 'post_title', - 'post_excerpt', - 'post_status', - 'post_parent', - 'menu_order', - 'post_date', - 'discount_type', - 'coupon_amount', - 'free_shipping', - 'expiry_date', - 'minimum_amount', - 'maximum_amount', - 'individual_use', - 'exclude_sale_items', - 'product_ids', - 'exclude_product_ids', - 'product_categories', - 'exclude_product_categories', - 'customer_email', - 'usage_limit', - 'usage_limit_per_user', - ); - } - - return $is_valid; - } - - /** - * Display pre-import options - */ - public function import_options() { - $j = 0; - - if ( $this->id ) { - $file = get_attached_file( $this->id ); - } else { - $file = ( ! empty( $this->file_url ) ) ? ABSPATH . $this->file_url : ''; - } - - // Set locale. - $enc = $this->mb_detect_encoding( $file, 'UTF-8, ISO-8859-1', true ); - if ( $enc ) { - setlocale( LC_ALL, 'en_US.' . $enc ); - } - ini_set( 'auto_detect_line_endings', true ); // phpcs:ignore - - $is_email_present = false; - - $handle = fopen( $file, 'r' ); // phpcs:ignore - - if ( false !== $handle ) { - - $row = array(); - $raw_headers = array(); - - $header = fgetcsv( $handle, 0 ); // gets header of the file. - - $is_valid = $this->validate_file_header( $header ); - - if ( ! $is_valid ) { - fclose( $handle ); // phpcs:ignore - ?> -
            -

            ' . esc_html__( 'Coupon Import Error', 'woocommerce-smart-coupons' ) . ': ' . esc_html__( 'Invalid CSV file. Make sure your CSV file contains all columns, header row, and data in correct format.', 'woocommerce-smart-coupons' ) . ' ' . esc_html__( 'Download a sample.csv to confirm', 'woocommerce-smart-coupons' ) . '.'; ?>

            -
            - greet(); - return; - } - - while ( false !== ( $postmeta = fgetcsv( $handle, 0 ) ) ) { // phpcs:ignore - foreach ( $header as $key => $heading ) { - if ( ! $heading ) { - continue; - } - - $s_heading = strtolower( $heading ); - $row[ $s_heading ] = ( isset( $postmeta[ $key ] ) ) ? $this->format_data_from_csv( $postmeta[ $key ], $enc ) : ''; - if ( ! $is_email_present && 'customer_email' === $header[ $key ] ) { - if ( ! empty( $row[ $s_heading ] ) && is_email( $row[ $s_heading ] ) ) { - $is_email_present = true; - } - } - $raw_headers[ $s_heading ] = $heading; - } - // Thanks to: Rohit Kumar. - if ( true === $is_email_present ) { - break; - } - } - - fclose( $handle ); // phpcs:ignore - } - ?> - - 'wc-smart-coupons', - 'tab' => 'import-smart-coupons', - 'step' => '2', - ), - admin_url( 'admin.php' ) - ); - ?> -
            - - - - -
            -
            -

            - -
            -
              -
            • -
            • -
            - is_email_template_enabled(); ?> - -

            - -

            - -
            -
            -
            -
            - -
            - - - -
            -

            -

            ' . esc_html__( 'Click here to download a sample', 'woocommerce-smart-coupons' ) . ', ' . esc_html__( 'and create your CSV based on that.', 'woocommerce-smart-coupons' ); // phpcs:ignore ?>

            -

            -

            -
            -
            -
            - 'wc-smart-coupons', - 'tab' => 'import-smart-coupons', - 'step' => '1', - ), - 'admin.php' - ); - - $bytes = apply_filters( 'import_upload_size_limit', wp_max_upload_size() ); - $size = size_format( $bytes ); - $upload_dir = wp_get_upload_dir(); - - if ( ! empty( $upload_dir['error'] ) ) { - ?> -
            -

            -

            -
            - -
            -
            - - - -

            -

            -

            ' . esc_html__( 'Enter location on the server', 'woocommerce-smart-coupons' ) . ':'; ?>

            - -   -
            -
            - -
            -
            -
            -
            - - - 'wc_coupon_message', - 'textarea_rows' => 10, - 'editor_class' => 'wp_editor_coupon_message', - 'media_buttons' => true, - 'tinymce' => true, - ); - echo '
            '; - ?> -

            - - get_post_meta( $post->ID, 'wc_coupon_message', true ); ?> - -

            - 'wc_email_message', - 'label' => __( 'Email message?', 'woocommerce-smart-coupons' ), - 'description' => __( - 'Check this box to include above message in order confirmation email', - 'woocommerce-smart-coupons' - ), - ) - ); - echo '
            '; - } - - /** - * Function to save coupon plus data in coupon's meta - * - * @since 1.0 - * - * @param integer $post_id Coupon's id. - * @param WC_Coupon $coupon Current coupon object. - */ - public function wc_process_coupon_message_meta( $post_id = 0, $coupon = null ) { - - if ( empty( $post_id ) ) { - return; - } - - if ( is_null( $coupon ) || ! is_a( $coupon, 'WC_Coupon' ) ) { - $coupon = new WC_Coupon( $post_id ); - } - - if ( $this->is_callable( $coupon, 'update_meta_data' ) && $this->is_callable( $coupon, 'save' ) ) { - if ( isset( $_POST['wc_coupon_message'] ) ) { // phpcs:ignore - $coupon->update_meta_data( 'wc_coupon_message', wp_filter_post_kses( $_POST['wc_coupon_message'] ) ); // phpcs:ignore - } - if ( isset( $_POST['wc_email_message'] ) ) { // phpcs:ignore - $coupon->update_meta_data( 'wc_email_message', wc_clean( wp_unslash( $_POST['wc_email_message'] ) ) ); // phpcs:ignore - } else { - $coupon->update_meta_data( 'wc_email_message', 'no' ); - } - $coupon->save(); - } else { - if ( isset( $_POST['wc_coupon_message'] ) ) { // phpcs:ignore - update_post_meta( $post_id, 'wc_coupon_message', wp_filter_post_kses( $_POST['wc_coupon_message'] ) ); // phpcs:ignore - } - if ( isset( $_POST['wc_email_message'] ) ) { // phpcs:ignore - update_post_meta( $post_id, 'wc_email_message', wc_clean( wp_unslash( $_POST['wc_email_message'] ) ) ); // phpcs:ignore - } else { - update_post_meta( $post_id, 'wc_email_message', 'no' ); - } - } - - } - - /** - * Function to print coupon message - * - * @param array $applied_coupons Applied coupons. - */ - public function print_coupon_message( $applied_coupons = array() ) { - - if ( empty( $applied_coupons ) ) { - echo '
            '; - return; - } - - foreach ( $applied_coupons as $coupon_code ) { - - $coupon = new WC_Coupon( $coupon_code ); - if ( ! $coupon->is_valid() ) { - continue; - } - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - } - $wc_coupon_message = ( $this->is_callable( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'wc_coupon_message' ) : get_post_meta( $coupon_id, 'wc_coupon_message', true ); - if ( empty( $wc_coupon_message ) ) { - continue; - } - ?> -
            -
            - $this, - 'called_by' => current_filter(), - 'coupon_object' => $coupon, - ) - ); - if ( true === $is_filter_content ) { - $wc_coupon_message = apply_filters( 'the_content', $wc_coupon_message ); - } - ?> - -
            -
            - cart ) || WC()->cart->is_empty() ) { - return; - } - - $applied_coupons = WC()->cart->get_applied_coupons(); - - ?> -
            - print_coupon_message( $applied_coupons ); ?> -
            - cart->get_applied_coupons(); - - $this->print_coupon_message( $applied_coupons ); - - die(); - } - - /** - * Function to add coupon's message in email - * - * @since 1.0 - * - * @param WC_Order $order Order's object. - * @param boolean $bool Not used in this function. - * @param boolean $plain_text Not used in this function. - */ - public function wc_add_coupons_message_in_email( $order = null, $bool = false, $plain_text = false ) { - $used_coupons = $this->get_coupon_codes( $order ); - if ( count( $used_coupons ) <= 0 ) { - return; - } - $show_coupon_message_title = false; - $coupon_messages = ''; - foreach ( $used_coupons as $coupon_code ) { - $coupon = new WC_Coupon( $coupon_code ); - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - } - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - if ( true === $is_callable_coupon_get_meta ) { - $coupon_message = $coupon->get_meta( 'wc_coupon_message' ); - $include_in_email = $coupon->get_meta( 'wc_email_message' ); - } else { - $coupon_message = get_post_meta( $coupon_id, 'wc_coupon_message', true ); - $include_in_email = get_post_meta( $coupon_id, 'wc_email_message', true ); - } - if ( ! empty( $coupon_message ) && 'yes' === $include_in_email ) { - $is_filter_content = apply_filters( - 'wc_sc_is_filter_content_coupon_message', - true, - array( - 'source' => $this, - 'called_by' => current_filter(), - 'coupon_object' => $coupon, - 'order_object' => $order, - ) - ); - if ( true === $is_filter_content ) { - $coupon_messages .= apply_filters( 'the_content', $coupon_message ); - } else { - $coupon_messages .= $coupon_message; - } - $show_coupon_message_title = true; - } - } - if ( $show_coupon_message_title ) { - ?> -

            - '; - echo wp_kses_post( $coupon_messages ); // phpcs:ignore - echo '
            '; - } - } - - /** - * Add meta in export headers - * - * @param array $headers Existing headers. - * @return array - */ - public function export_headers( $headers = array() ) { - - $cm_headers = array( - 'wc_coupon_message' => __( 'Coupon Message', 'woocommerce-smart-coupons' ), - 'wc_email_message' => __( 'Is Email Coupon Message', 'woocommerce-smart-coupons' ), - ); - - return array_merge( $headers, $cm_headers ); - - } - - /** - * Post meta defaults for CM's meta - * - * @param array $defaults Existing postmeta defaults. - * @return array - */ - public function postmeta_defaults( $defaults = array() ) { - - $cm_defaults = array( - 'wc_coupon_message' => '', - 'wc_email_message' => '', - ); - - return array_merge( $defaults, $cm_defaults ); - } - - /** - * Add CM's meta with value in coupon meta - * - * @param array $data The row data. - * @param array $post The POST values. - * @return array Modified data - */ - public function generate_coupon_meta( $data = array(), $post = array() ) { - - $data['wc_coupon_message'] = ( ! empty( $post['wc_coupon_message'] ) ) ? wp_kses_post( $post['wc_coupon_message'] ) : ''; - $data['wc_email_message'] = ( ! empty( $post['wc_email_message'] ) ) ? wc_clean( wp_unslash( $post['wc_email_message'] ) ) : 'no'; - - return $data; - } - - /** - * Make meta data of SC CM, protected - * - * @param bool $protected Is protected. - * @param string $meta_key The meta key. - * @param string $meta_type The meta type. - * @return bool $protected - */ - public function make_action_meta_protected( $protected, $meta_key, $meta_type ) { - $sc_meta = array( - 'wc_coupon_message' => '', - 'wc_email_message' => '', - ); - if ( in_array( $meta_key, $sc_meta, true ) ) { - return true; - } - return $protected; - } - - /** - * Function to copy CM meta in newly generated coupon - * - * @param array $args The arguments. - */ - public function copy_coupon_action_meta( $args = array() ) { - - $new_coupon_id = ( ! empty( $args['new_coupon_id'] ) ) ? absint( $args['new_coupon_id'] ) : 0; - $coupon = ( ! empty( $args['ref_coupon'] ) ) ? $args['ref_coupon'] : false; - - if ( empty( $new_coupon_id ) || empty( $coupon ) ) { - return; - } - - $new_coupon = new WC_Coupon( $new_coupon_id ); - - if ( $this->is_callable( $new_coupon, 'get_meta' ) && $this->is_callable( $new_coupon, 'update_meta_data' ) && $this->is_callable( $new_coupon, 'save' ) ) { - $coupon_message = $coupon->get_meta( 'wc_coupon_message' ); - $email_message = $coupon->get_meta( 'wc_email_message' ); - $new_coupon->update_meta_data( 'wc_coupon_message', wp_filter_post_kses( $coupon_message ) ); - $new_coupon->update_meta_data( 'wc_email_message', $email_message ); - } else { - $old_coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $coupon_message = get_post_meta( $old_coupon_id, 'wc_coupon_message', true ); - $email_message = get_post_meta( $old_coupon_id, 'wc_email_message', true ); - update_post_meta( $new_coupon_id, 'wc_coupon_message', wp_filter_post_kses( $coupon_message ) ); - update_post_meta( $new_coupon_id, 'wc_email_message', $email_message ); - } - - } - - } - -} - -WC_SC_Coupon_Message::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-parser.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-parser.php deleted file mode 100644 index 2079fb09..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-parser.php +++ /dev/null @@ -1,450 +0,0 @@ -post_type = $post_type; - - $this->reserved_fields = array( - 'id', - 'post_id', - 'post_type', - 'menu_order', - 'postmeta', - 'post_status', - 'post_title', - 'post_name', - 'comment_status', - 'post_date', - 'post_date_gmt', - 'post_content', - 'post_excerpt', - 'post_parent', - 'post_password', - 'discount_type', - 'coupon_amount', - 'free_shipping', - 'expiry_date', - 'minimum_amount', - 'maximum_amount', - 'individual_use', - 'exclude_sale_items', - 'product_ids', - 'exclude_product_ids', - 'product_categories', - 'exclude_product_categories', - 'customer_email', - 'usage_limit', - 'usage_limit_per_user', - 'limit_usage_to_x_items', - 'usage_count', - '_used_by', - ); - - $this->post_defaults = array( - 'post_type' => $this->post_type, - 'menu_order' => '', - 'postmeta' => array(), - 'post_status' => 'publish', - 'post_title' => '', - 'post_name' => '', - 'comment_status' => 'closed', - 'post_date' => '', - 'post_date_gmt' => '', - 'post_content' => '', - 'post_excerpt' => '', - 'post_parent' => 0, - 'post_password' => '', - 'post_author' => get_current_user_id(), - ); - - $this->postmeta_defaults = apply_filters( - 'smart_coupons_parser_postmeta_defaults', - array( - 'discount_type' => 'fixed_cart', - 'coupon_amount' => '', - 'free_shipping' => '', - 'expiry_date' => '', - 'sc_coupon_validity' => '', - 'validity_suffix' => '', - 'auto_generate_coupon' => '', - 'coupon_title_prefix' => '', - 'coupon_title_suffix' => '', - 'is_pick_price_of_product' => '', - 'minimum_amount' => '', - 'maximum_amount' => '', - 'individual_use' => '', - 'exclude_sale_items' => '', - 'product_ids' => '', - 'exclude_product_ids' => '', - 'product_categories' => '', - 'exclude_product_categories' => '', - 'customer_email' => '', - 'sc_disable_email_restriction' => '', - 'usage_limit' => '', - 'usage_limit_per_user' => '', - 'limit_usage_to_x_items' => '', - 'sc_is_visible_storewide' => '', - 'usage_count' => '', - '_used_by' => '', - 'sc_restrict_to_new_user' => '', - 'wc_sc_max_discount' => '', - ) - ); - - $this->term_defaults = array( - 'sc_coupon_category' => '', - ); - } - - /** - * Handle call to functions which is not available in this class - * - * @param string $function_name The function name. - * @param array $arguments Array of arguments passed while calling $function_name. - * @return result of function call - */ - public function __call( $function_name, $arguments = array() ) { - - global $woocommerce_smart_coupon; - - if ( ! is_callable( array( $woocommerce_smart_coupon, $function_name ) ) ) { - return; - } - - if ( ! empty( $arguments ) ) { - return call_user_func_array( array( $woocommerce_smart_coupon, $function_name ), $arguments ); - } else { - return call_user_func( array( $woocommerce_smart_coupon, $function_name ) ); - } - - } - - /** - * Format data passed from CSV - * - * @param array $data The data to format. - * @param string $enc encoding The encoding. - */ - public function format_data_from_csv( $data, $enc ) { - return ( 'UTF-8' === $enc ) ? $data : utf8_encode( $data ); - } - - /** - * Parse data - * - * @param string $file Imported file. - * @return array parsed data with headers - */ - public function parse_data( $file ) { - - // Set locale. - $enc = $this->mb_detect_encoding( $file, 'UTF-8, ISO-8859-1', true ); - if ( $enc ) { - setlocale( LC_ALL, 'en_US.' . $enc ); - } - ini_set( 'auto_detect_line_endings', true ); // phpcs:ignore - - $parsed_data = array(); - - $handle = fopen( $file, 'r' ); // phpcs:ignore - - // Put all CSV data into an associative array. - if ( false !== $handle ) { - - $header = fgetcsv( $handle, 0 ); - - while ( false !== ( $postmeta = fgetcsv( $handle, 0 ) ) ) { // phpcs:ignore - $row = array(); - foreach ( $header as $key => $heading ) { - - $s_heading = strtolower( $heading ); - - $row[ $s_heading ] = ( isset( $postmeta[ $key ] ) ) ? $this->format_data_from_csv( stripslashes( $postmeta[ $key ] ), $enc ) : ''; - - $raw_headers[ $s_heading ] = $heading; - } - - $parsed_data[] = $row; - - unset( $postmeta, $row ); - - } - - fclose( $handle ); // phpcs:ignore - } - - return array( $parsed_data, $raw_headers ); - } - - /** - * Parse data one row at a time - * - * @param boolean $file_handler CSV file handler. - * @param array $header CSV header meta column name. - * @param integer $file_position file pointer posistion to read from. - * @param string $encoding Character encoding. - * @return array $result parsed data with current file pointer position - */ - public function parse_data_by_row( $file_handler = false, $header = array(), $file_position = 0, $encoding = '' ) { - - $parsed_csv_data = array(); - - $reading_completed = false; - - if ( false !== $file_handler ) { - - if ( $file_position > 0 ) { - - fseek( $file_handler, (int) $file_position ); - - } - - if ( false !== ( $postmeta = fgetcsv( $file_handler, 0 ) ) ) { // phpcs:ignore - $row = array(); - foreach ( $header as $key => $heading ) { - - $s_heading = strtolower( $heading ); - - // Put all CSV data into an associative array by row. - $row[ $s_heading ] = ( isset( $postmeta[ $key ] ) ) ? $this->format_data_from_csv( stripslashes( $postmeta[ $key ] ), $encoding ) : ''; - } - - $parsed_csv_data = $row; - - unset( $postmeta, $row ); - - } else { - - $reading_completed = true; - - } - - $file_position = ftell( $file_handler ); - } - - $result = array( - 'parsed_csv_data' => $parsed_csv_data, - 'file_position' => $file_position, - 'reading_completed' => $reading_completed, - ); - - return $result; - } - - /** - * Parse coupon - * - * @param array $item The imported item. - * @return array $coupon - */ - public function parse_coupon( $item ) { - global $wc_csv_coupon_import, $wpdb; - - $this->row++; - $postmeta = array(); - $term_data = array(); - $coupon = array(); - - $post_id = ( ! empty( $item['id'] ) ) ? absint( $item['id'] ) : 0; - $post_id = ( ! empty( $item['post_id'] ) ) ? absint( $item['post_id'] ) : $post_id; - - $product['post_id'] = $post_id; - - // Get post fields. - foreach ( $this->post_defaults as $column => $default ) { - if ( isset( $item[ $column ] ) ) { - $product[ $column ] = $item[ $column ]; - } - } - - // Get custom fields. - foreach ( $this->postmeta_defaults as $column => $default ) { - if ( isset( $item[ $column ] ) ) { - $postmeta[ $column ] = (string) $item[ $column ]; - } elseif ( isset( $item[ '_' . $column ] ) ) { - $postmeta[ $column ] = (string) $item[ '_' . $column ]; - } - } - - // Get term fields. - foreach ( $this->term_defaults as $column => $default ) { - if ( isset( $item[ $column ] ) ) { - $term_data[ $column ] = $item[ $column ]; - } - } - - // Merge post meta with defaults. - $coupon = wp_parse_args( $product, $this->post_defaults ); - $postmeta = wp_parse_args( $postmeta, $this->postmeta_defaults ); - $term_data = wp_parse_args( $term_data, $this->term_defaults ); - - if ( ! empty( $postmeta['discount_type'] ) ) { - $discount_type = $postmeta['discount_type']; - } else { - if ( $this->is_wc_gte_30() ) { - $discount_type = 'Percentage discount'; - } else { - $discount_type = 'Cart % Discount'; - } - } - - $all_discount_types = wc_get_coupon_types(); - - // discount types. - if ( ! empty( $discount_type ) ) { - - if ( in_array( $discount_type, $all_discount_types, true ) ) { - $postmeta['discount_type'] = array_search( $discount_type, $all_discount_types, true ); - } - - if ( empty( $postmeta['discount_type'] ) ) { - $postmeta['discount_type'] = 'percent'; - } - } - - // product_ids. - if ( isset( $postmeta['product_ids'] ) && ! is_array( $postmeta['product_ids'] ) ) { - $ids = array_filter( array_map( 'trim', explode( '|', $postmeta['product_ids'] ) ) ); - $ids = implode( ',', $ids ); - $postmeta['product_ids'] = $ids; - } - - // exclude_product_ids. - if ( isset( $postmeta['exclude_product_ids'] ) && ! is_array( $postmeta['exclude_product_ids'] ) ) { - $ids = array_filter( array_map( 'trim', explode( '|', $postmeta['exclude_product_ids'] ) ) ); - $ids = implode( ',', $ids ); - $postmeta['exclude_product_ids'] = $ids; - } - - // product_categories. - if ( isset( $postmeta['product_categories'] ) && ! is_array( $postmeta['product_categories'] ) ) { - $ids = array_filter( array_map( 'trim', explode( '|', $postmeta['product_categories'] ) ) ); - $postmeta['product_categories'] = $ids; - } - - // exclude_product_categories. - if ( isset( $postmeta['exclude_product_categories'] ) && ! is_array( $postmeta['exclude_product_categories'] ) ) { - $ids = array_filter( array_map( 'trim', explode( '|', $postmeta['exclude_product_categories'] ) ) ); - $postmeta['exclude_product_categories'] = $ids; - } - - // customer_email. - if ( isset( $postmeta['customer_email'] ) && ! is_array( $postmeta['customer_email'] ) ) { - $email_ids = array_filter( array_map( 'trim', explode( ',', $postmeta['customer_email'] ) ) ); - $postmeta['customer_email'] = $email_ids; - } - - // expiry date. - if ( isset( $postmeta['expiry_date'] ) ) { - $timestamp_expiry_date = ''; - if ( ! empty( $postmeta['expiry_date'] ) ) { - $timestamp_expiry_date = ( function_exists( 'wc_string_to_timestamp' ) ) ? wc_string_to_timestamp( $postmeta['expiry_date'] ) : 0; - } - if ( ! empty( $postmeta['expiry_date'] ) && empty( $timestamp_expiry_date ) ) { - /* translators: 1. Coupon code 2. Expiry date */ - $this->log( 'error', sprintf( __( 'Incorrect format for expiry date of coupon "%1$s". Entered date is %2$s. Expected date format: YYYY-MM-DD', 'woocommerce-smart-coupons' ), $coupon['post_title'], $postmeta['expiry_date'] ) ); - } - $postmeta['expiry_date'] = ( ! empty( $timestamp_expiry_date ) ) ? gmdate( 'Y-m-d', $timestamp_expiry_date ) : ''; - } - - // usage count. - if ( isset( $postmeta['usage_count'] ) ) { - $postmeta['usage_count'] = ( ! empty( $postmeta['usage_count'] ) ) ? $postmeta['usage_count'] : 0; - } - - // used_by. - if ( isset( $postmeta['_used_by'] ) ) { - $postmeta['_used_by'] = ( ! empty( $postmeta['_used_by'] ) ) ? $postmeta['_used_by'] : ''; - } - - // Put set core product postmeta into product array. - foreach ( $postmeta as $key => $value ) { - $coupon['postmeta'][] = array( - 'key' => esc_attr( $key ), - 'value' => $value, - ); - } - - // term data. - foreach ( $term_data as $key => $value ) { - $coupon['term_data'][] = array( - 'key' => esc_attr( $key ), - 'value' => $value, - ); - } - - unset( $item, $postmeta ); - - return $coupon; - - } - } - -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-process.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-process.php deleted file mode 100644 index 7f9801a9..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-process.php +++ /dev/null @@ -1,1724 +0,0 @@ -is_callable( $order, 'update_meta_data' ); - - $schedule_store_credit = get_option( 'smart_coupons_schedule_store_credit' ); - $schedule_gift_sending = ( 'yes' === $schedule_store_credit && 'yes' === $request_is_gift && ( isset( $_REQUEST['wc_sc_schedule_gift_sending'] ) ) ) ? wc_clean( wp_unslash( $_REQUEST['wc_sc_schedule_gift_sending'] ) ) : ''; // phpcs:ignore - - if ( 'yes' === $request_is_gift ) { - if ( ! empty( $request_sc_send_to ) ) { - switch ( $request_sc_send_to ) { - case 'one': - $email_for_one = ( isset( $request_gift_receiver_email[0][0] ) && ! empty( $request_gift_receiver_email[0][0] ) && is_email( $request_gift_receiver_email[0][0] ) ) ? $request_gift_receiver_email[0][0] : $request_billing_email; - $message_for_one = ( isset( $request_gift_receiver_message[0][0] ) && ! empty( $request_gift_receiver_message[0][0] ) ) ? $request_gift_receiver_message[0][0] : ''; - $schedule_for_one = ( isset( $request_gift_sending_timestamp[0][0] ) && ! empty( $request_gift_sending_timestamp[0][0] ) ) ? $request_gift_sending_timestamp[0][0] : ''; - unset( $request_gift_receiver_email[0][0] ); - unset( $request_gift_receiver_message[0][0] ); - unset( $request_gift_sending_timestamp[0][0] ); - foreach ( $request_gift_receiver_email as $coupon_id => $emails ) { - foreach ( $emails as $key => $email ) { - $request_gift_receiver_email[ $coupon_id ][ $key ] = $email_for_one; - $request_gift_receiver_message[ $coupon_id ][ $key ] = $message_for_one; - $request_gift_sending_timestamp[ $coupon_id ][ $key ] = $schedule_for_one; - } - } - if ( ! empty( $request_gift_receiver_message ) && '' !== $request_gift_receiver_message ) { - if ( true === $is_callable_update_meta_data ) { - $order->update_meta_data( 'gift_receiver_message', $request_gift_receiver_message ); - } else { - update_post_meta( $order_id, 'gift_receiver_message', $request_gift_receiver_message ); - } - } - if ( ! empty( $request_gift_sending_timestamp ) && '' !== $request_gift_sending_timestamp ) { - if ( true === $is_callable_update_meta_data ) { - $order->update_meta_data( 'gift_sending_timestamp', $request_gift_sending_timestamp ); - } else { - update_post_meta( $order_id, 'gift_sending_timestamp', $request_gift_sending_timestamp ); - } - } - break; - - case 'many': - if ( isset( $request_gift_receiver_email[0][0] ) && ! empty( $request_gift_receiver_email[0][0] ) ) { - unset( $request_gift_receiver_email[0][0] ); - } - if ( isset( $request_gift_receiver_message[0][0] ) && ! empty( $request_gift_receiver_message[0][0] ) ) { - unset( $request_gift_receiver_message[0][0] ); - } - if ( isset( $request_gift_sending_timestamp[0][0] ) && ! empty( $request_gift_sending_timestamp[0][0] ) ) { - unset( $request_gift_sending_timestamp[0][0] ); - } - if ( ! empty( $request_gift_receiver_message ) && '' !== $request_gift_receiver_message ) { - if ( true === $is_callable_update_meta_data ) { - $order->update_meta_data( 'gift_receiver_message', $request_gift_receiver_message ); - } else { - update_post_meta( $order_id, 'gift_receiver_message', $request_gift_receiver_message ); - } - } - if ( ! empty( $request_gift_sending_timestamp ) && '' !== $request_gift_sending_timestamp ) { - if ( true === $is_callable_update_meta_data ) { - $order->update_meta_data( 'gift_sending_timestamp', $request_gift_sending_timestamp ); - } else { - update_post_meta( $order_id, 'gift_sending_timestamp', $request_gift_sending_timestamp ); - } - } - break; - } - } - if ( true === $is_callable_update_meta_data ) { - $order->update_meta_data( 'is_gift', 'yes' ); - } else { - update_post_meta( $order_id, 'is_gift', 'yes' ); - } - if ( ! empty( $schedule_gift_sending ) ) { - if ( true === $is_callable_update_meta_data ) { - $order->update_meta_data( 'wc_sc_schedule_gift_sending', $schedule_gift_sending ); - } else { - update_post_meta( $order_id, 'wc_sc_schedule_gift_sending', $schedule_gift_sending ); - } - } - } else { - if ( ! empty( $request_gift_receiver_email[0][0] ) && is_array( $request_gift_receiver_email[0][0] ) ) { - unset( $request_gift_receiver_email[0][0] ); - foreach ( $request_gift_receiver_email as $coupon_id => $emails ) { - foreach ( $emails as $key => $email ) { - $request_gift_receiver_email[ $coupon_id ][ $key ] = $request_billing_email; - } - } - } - if ( true === $is_callable_update_meta_data ) { - $order->update_meta_data( 'is_gift', 'no' ); - } else { - update_post_meta( $order_id, 'is_gift', 'no' ); - } - } - - if ( true === $is_callable_update_meta_data ) { - $order->update_meta_data( 'gift_receiver_email', $request_gift_receiver_email ); - } else { - update_post_meta( $order_id, 'gift_receiver_email', $request_gift_receiver_email ); - } - - if ( $this->is_callable( $order, 'save' ) ) { - $order->save(); - } - } - - } - - /** - * Function to verify gift certificate form details - */ - public function verify_gift_certificate_receiver_details() { - - $post_gift_receiver_email = ( ! empty( $_POST['gift_receiver_email'] ) ) ? wc_clean( wp_unslash( $_POST['gift_receiver_email'] ) ) : array(); // phpcs:ignore - $post_billing_email = ( ! empty( $_POST['billing_email'] ) ) ? wc_clean( wp_unslash( $_POST['billing_email'] ) ) : ''; // phpcs:ignore - $is_gift = ( ! empty( $_POST['is_gift'] ) ) ? wc_clean( wp_unslash( $_POST['is_gift'] ) ) : ''; // phpcs:ignore - $send_to = ( isset( $_POST['sc_send_to'] ) ) ? wc_clean( wp_unslash( $_POST['sc_send_to'] ) ) : ''; // phpcs:ignore - - if ( empty( $post_gift_receiver_email ) || ! is_array( $post_gift_receiver_email ) ) { - return; - } - - $is_email_required = apply_filters( 'wc_sc_is_email_required_for_sending_coupon', $this->sc_get_option( 'wc_sc_is_email_required_for_sending_coupon', 'no' ), array( 'source' => $this ) ); - - if ( 'yes' === $is_gift && 'yes' === $is_email_required ) { - if ( 'one' === $send_to ) { - $gift_receiver_email_to_one = array( - $post_gift_receiver_email[0], - ); - $post_gift_receiver_email = $gift_receiver_email_to_one; - } elseif ( 'many' === $send_to ) { - unset( $post_gift_receiver_email[0] ); - } - } - - foreach ( $post_gift_receiver_email as $key => $emails ) { - if ( ! empty( $emails ) ) { - foreach ( $emails as $index => $email ) { - - $placeholder = __( 'Email address', 'woocommerce-smart-coupons' ); - $placeholder .= '...'; - - if ( empty( $email ) || $email === $placeholder ) { - if ( 'yes' === $is_gift && 'yes' === $is_email_required ) { - $this->sc_add_notice_for_gift_card_receiver_validation(); - return; - } - $post_gift_receiver_email[ $key ][ $index ] = ( ! empty( $post_billing_email ) ) ? $post_billing_email : ''; - } elseif ( ! empty( $email ) && ! is_email( $email ) ) { - $this->sc_add_notice_for_gift_card_receiver_validation(); - return; - } - } - } - } - - $_POST['gift_receiver_email'] = $post_gift_receiver_email; // phpcs:ignore - - } - - /** - * Function will add notice if gift card receiver details are not verified. - * - * @return void - */ - public function sc_add_notice_for_gift_card_receiver_validation() { - global $store_credit_label; - if ( ! empty( $store_credit_label['singular'] ) ) { - /* translators: %s: singular name for store credit */ - wc_add_notice( sprintf( __( 'Error: %s Receiver’s E-mail address is invalid.', 'woocommerce-smart-coupons' ), ucwords( $store_credit_label['singular'] ) ), 'error' ); - } else { - wc_add_notice( __( 'Error: Gift Card Receiver’s E-mail address is invalid.', 'woocommerce-smart-coupons' ), 'error' ); - } - } - - /** - * Function to save Smart Coupon's contribution in discount - * - * @param int $order_id The order id. - */ - public function smart_coupons_contribution( $order_id = 0 ) { - - $applied_coupons = ( is_object( WC()->cart ) && isset( WC()->cart->applied_coupons ) ) ? WC()->cart->applied_coupons : array(); - - if ( ! empty( $applied_coupons ) ) { - - $order_id = absint( $order_id ); - $order = ( ! empty( $order_id ) ) ? wc_get_order( $order_id ) : null; - - foreach ( $applied_coupons as $code ) { - - $smart_coupon = new WC_Coupon( $code ); - - if ( $this->is_wc_gte_30() ) { - $discount_type = $smart_coupon->get_discount_type(); - } else { - $discount_type = ( ! empty( $smart_coupon->discount_type ) ) ? $smart_coupon->discount_type : ''; - } - - if ( 'smart_coupon' === $discount_type ) { - - $this->update_post_meta( $order_id, 'smart_coupons_contribution', WC()->cart->smart_coupon_credit_used, true, $order ); - - } - } - } - } - - /** - * Function to delete Smart Coupons contribution on removal of coupon - */ - public function delete_smart_coupons_contribution() { - - $post_action = ( ! empty( $_POST['action'] ) ) ? wc_clean( wp_unslash( $_POST['action'] ) ) : ''; // phpcs:ignore - $post_order_id = ( ! empty( $_POST['order_id'] ) ) ? wc_clean( wp_unslash( $_POST['order_id'] ) ) : 0; // phpcs:ignore - $post_coupon = ( ! empty( $_POST['coupon'] ) ) ? wc_clean( wp_unslash( $_POST['coupon'] ) ) : ''; // phpcs:ignore - - if ( 'woocommerce_remove_order_coupon' === $post_action && ! empty( $post_order_id ) && ! empty( $post_coupon ) ) { - $order = wc_get_order( $post_order_id ); - - $smart_coupons_contribution = $this->get_post_meta( $post_order_id, 'smart_coupons_contribution', true, true ); - - if ( isset( $smart_coupons_contribution[ $post_coupon ] ) ) { - unset( $smart_coupons_contribution[ $post_coupon ] ); - - $_POST['smart_coupon_removed'] = $post_coupon; - - if ( empty( $smart_coupons_contribution ) ) { - $this->delete_post_meta( $post_order_id, 'smart_coupons_contribution', null, $order ); - } else { - $this->update_post_meta( $post_order_id, 'smart_coupons_contribution', $smart_coupons_contribution, true, $order ); - } - } - - $order_status = $order->get_status(); - - $pending_statuses = $this->get_pending_statuses(); - - if ( $order->has_status( $pending_statuses ) ) { - $this->sa_restore_smart_coupon_amount( $post_order_id ); - } - } - } - - /** - * Function to update Store Credit / Gift Certificate balance - * - * @param int $order_id The order id. - */ - public function update_smart_coupon_balance( $order_id ) { - - if ( ( ! empty( $_POST['post_type'] ) && 'shop_order' === $_POST['post_type'] && ! empty( $_POST['action'] ) && 'editpost' === $_POST['action'] ) // phpcs:ignore - || ( ! empty( $_GET['action'] ) && in_array( $_GET['action'], array( 'woocommerce_mark_order_status', 'mark_on-hold', 'mark_processing', 'mark_completed' ), true ) ) // phpcs:ignore - ) { - return; - } - - $order = wc_get_order( $order_id ); - - $order_used_coupons = $this->get_coupon_codes( $order ); - - if ( ! empty( $order_used_coupons ) ) { - - $smart_coupons_contribution = $this->get_post_meta( $order_id, 'smart_coupons_contribution', true, true ); - - if ( empty( $smart_coupons_contribution ) || ! is_array( $smart_coupons_contribution ) ) { - $this->update_smart_coupon_balance_by_used_coupon( $order_id ); - return; - } - - foreach ( $order_used_coupons as $code ) { - - if ( array_key_exists( $code, $smart_coupons_contribution ) ) { - - $smart_coupon = new WC_Coupon( $code ); - - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $smart_coupon ) ) { - continue; - } - $coupon_id = ( is_callable( array( $smart_coupon, 'get_id' ) ) ) ? $smart_coupon->get_id() : 0; - if ( empty( $coupon_id ) ) { - $coupon_id = function_exists( 'wc_get_coupon_id_by_code' ) ? wc_get_coupon_id_by_code( $code ) : 0; - if ( empty( $coupon_id ) ) { - continue; - } - } - $discount_type = ( is_callable( array( $smart_coupon, 'get_discount_type' ) ) ) ? $smart_coupon->get_discount_type() : ''; - } else { - $coupon_id = ( ! empty( $smart_coupon->id ) ) ? $smart_coupon->id : 0; - $discount_type = ( ! empty( $smart_coupon->discount_type ) ) ? $smart_coupon->discount_type : ''; - } - - if ( 'smart_coupon' === $discount_type ) { - - $coupon_amount = $this->get_amount( $smart_coupon, true, $order ); - $discount_amount = round( ( $coupon_amount - $smart_coupons_contribution[ $code ] ), get_option( 'woocommerce_price_num_decimals', 2 ) ); - $credit_remaining = max( 0, $discount_amount ); - - // Allow 3rd party plugin to modify the remaining balance of the store credit. - $credit_remaining = apply_filters( - 'wc_sc_credit_remaining', - $credit_remaining, - array( - 'source' => $this, - 'order_obj' => $order, - 'coupon_obj' => $smart_coupon, - ) - ); - - if ( $credit_remaining <= 0 && get_option( 'woocommerce_delete_smart_coupon_after_usage' ) === 'yes' ) { - $this->update_post_meta( $coupon_id, 'coupon_amount', 0, true, $order ); - wp_trash_post( $coupon_id ); - } else { - $this->update_post_meta( $coupon_id, 'coupon_amount', $credit_remaining, true, $order ); - } - } - } - } - } - } - - /** - * Update smart coupon balance by used coupon. - * - * @param int $order_id Integer. - * @return void - */ - public function update_smart_coupon_balance_by_used_coupon( $order_id = 0 ) { - - if ( empty( $order_id ) ) { - return; - } - - if ( ( ! empty( $_POST['post_type'] ) && 'shop_order' === $_POST['post_type'] && ! empty( $_POST['action'] ) && 'editpost' === $_POST['action'] )// phpcs:ignore - || ( ! empty( $_GET['action'] ) && in_array( $_GET['action'], array( 'woocommerce_mark_order_status', 'mark_on-hold', 'mark_processing', 'mark_completed' ), true ) )// phpcs:ignore - ) { - return; - } - - $order = function_exists( 'wc_get_order' ) ? wc_get_order( $order_id ) : null; - - if ( ! is_object( $order ) || ! is_a( $order, 'WC_Order' ) ) { - return; - } - - $order_items = is_callable( array( $order, 'get_items' ) ) ? $order->get_items( 'coupon' ) : array(); - - if ( ! empty( $order_items ) ) { - - foreach ( $order_items as $item_id => $item ) { - $item_title = ( is_object( $item ) && is_callable( array( $item, 'get_name' ) ) ) ? $item->get_name() : ''; - $coupon_post_obj = ( function_exists( 'wpcom_vip_get_page_by_title' ) ) ? wpcom_vip_get_page_by_title( $item_title, OBJECT, 'shop_coupon' ) : get_page_by_title( $item_title, OBJECT, 'shop_coupon' );// phpcs:ignore - $coupon_id = isset( $coupon_post_obj->ID ) ? $coupon_post_obj->ID : 0; - $coupon_code = isset( $coupon_post_obj->post_title ) ? $coupon_post_obj->post_title : ''; - $smart_coupon = new WC_Coupon( $coupon_id ); - if ( is_a( $smart_coupon, 'WC_Coupon' ) ) { - $coupon_amount = $this->get_amount( $smart_coupon ); - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $smart_coupon ) || ! is_callable( array( $smart_coupon, 'get_id' ) ) ) { - continue; - } - $coupon_id = $smart_coupon->get_id(); - if ( empty( $coupon_id ) ) { - $coupon_id = wc_get_coupon_id_by_code( $coupon_code ); - if ( empty( $coupon_id ) ) { - continue; - } - } - $discount_type = is_callable( array( $smart_coupon, 'get_discount_type' ) ) ? $smart_coupon->get_discount_type() : ''; - } else { - $coupon_id = ( ! empty( $smart_coupon->id ) ) ? $smart_coupon->id : 0; - $discount_type = ( ! empty( $smart_coupon->discount_type ) ) ? $smart_coupon->discount_type : ''; - } - - if ( 'smart_coupon' === $discount_type ) { - $order_discount_amount = $this->get_order_item_meta( $item_id, 'discount_amount', true ); - $order_discount_tax_amount = $this->get_order_item_meta( $item_id, 'discount_amount_tax', true ); - - $sc_include_tax = $this->is_store_credit_include_tax(); - // Add discount on tax if it has been given on tax. - if ( 'yes' === $sc_include_tax && ! empty( $order_discount_tax_amount ) ) { - $order_discount_amount += $order_discount_tax_amount; - } - - $credit_remaining = round( ( $coupon_amount - $order_discount_amount ), get_option( 'woocommerce_price_num_decimals', 2 ) ); - - // Allow 3rd party plugin to modify the remaining balance of the store credit. - $credit_remaining = apply_filters( - 'wc_sc_credit_remaining', - $credit_remaining, - array( - 'source' => $this, - 'order_obj' => $order, - 'coupon_obj' => $smart_coupon, - ) - ); - - if ( $credit_remaining <= 0 && get_option( 'woocommerce_delete_smart_coupon_after_usage' ) === 'yes' ) { - $this->update_post_meta( $coupon_id, 'coupon_amount', 0 ); - wp_trash_post( $coupon_id ); - } else { - $this->update_post_meta( $coupon_id, 'coupon_amount', $credit_remaining ); - } - } - } - } - } - } - - /** - * Handle Coupon Process on 3rd party order statuses - * - * @param integer $order_id The order id. - * @param string $old_status Old order status. - * @param string $new_status New order status. - */ - public function handle_coupon_process_on_3rd_party_order_statuses( $order_id = 0, $old_status = '', $new_status = '' ) { - - if ( empty( $order_id ) ) { - return; - } - - $hooks_available_for_statuses = array( 'on-hold', 'pending', 'processing', 'completed', 'failed', 'refunded', 'cancelled' ); - - if ( in_array( $old_status, $hooks_available_for_statuses, true ) || in_array( $new_status, $hooks_available_for_statuses, true ) ) { - return; - } - - $paid_statuses = wc_get_is_paid_statuses(); - $pending_statuses = wc_get_is_pending_statuses(); - $return_statuses = apply_filters( 'wc_sc_return_order_statuses', array() ); - - if ( in_array( $new_status, $paid_statuses, true ) ) { - $this->sa_add_coupons( $order_id ); - $this->coupons_used( $order_id ); - } - - if ( in_array( $new_status, $return_statuses, true ) ) { - $this->sa_remove_coupons( $order_id ); - } - - if ( in_array( $old_status, $paid_statuses, true ) && in_array( $new_status, $return_statuses, true ) ) { - $this->sa_restore_smart_coupon_amount( $order_id ); - } - - if ( in_array( $old_status, $pending_statuses, true ) && in_array( $new_status, $paid_statuses, true ) ) { - $this->update_smart_coupon_balance( $order_id ); - } - - if ( in_array( $old_status, $return_statuses, true ) && in_array( $new_status, $paid_statuses, true ) ) { - $this->update_smart_coupon_balance( $order_id ); - } - - } - - /** - * Update discount details in PayPal args if store credit is applied - * - * @param array $args PayPal args. - * @param WC_Order $order The order object. - * - * @return array $args Modified PayPal args - */ - public function modify_paypal_args( $args = array(), $order = null ) { - global $store_credit_label; - - $apply_before_tax = get_option( 'woocommerce_smart_coupon_apply_before_tax', 'no' ); - - if ( 'yes' === $apply_before_tax ) { - return $args; - } - - $is_order_contains_store_credit = $this->is_order_contains_store_credit( $order ); - - if ( ! $is_order_contains_store_credit ) { - return $args; - } - - $discount_amount_cart = ( ! empty( $args['discount_amount_cart'] ) ) ? $args['discount_amount_cart'] : 0; - - if ( empty( $discount_amount_cart ) ) { - return $args; - } - - $item_total = 0; - - foreach ( $args as $key => $value ) { - if ( strpos( $key, 'amount_' ) === 0 ) { - $index = str_replace( 'amount_', '', $key ); - $qty = ( ! empty( $args[ 'quantity_' . $index ] ) ) ? $args[ 'quantity_' . $index ] : 1; - $item_total += ( $value * $qty ); - } - } - - if ( $discount_amount_cart > $item_total ) { - $difference = $discount_amount_cart - $item_total; - $args['discount_amount_cart'] = $item_total; - - if ( $this->is_wc_gte_30() ) { - $order_id = ( is_object( $order ) && is_callable( array( $order, 'get_id' ) ) ) ? $order->get_id() : 0; - } else { - $order_id = ( ! empty( $order->id ) ) ? $order->id : 0; - } - - if ( ! empty( $order_id ) && ! is_a( $order, 'WC_Order' ) ) { - $order = wc_get_order( $order_id ); - } - - $coupons = $order->get_items( 'coupon' ); - $order_total = $order->get_total(); - $order_note = array(); - - foreach ( $coupons as $item_id => $item ) { - if ( empty( $difference ) ) { - break; - } - $code = ( is_object( $item ) && is_callable( array( $item, 'get_name' ) ) ) ? $item->get_name() : trim( $item['name'] ); - $coupon = new WC_Coupon( $code ); - if ( $this->is_wc_gte_30() ) { - $discount_type = $coupon->get_discount_type(); - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - $discount = ( is_object( $item ) && is_callable( array( $item, 'get_discount' ) ) ) ? $item->get_discount() : $item['discount_amount']; - if ( 'smart_coupon' === $discount_type && ! empty( $discount ) ) { - $new_discount = 0; - $item_discount = $discount; - $cut_amount = min( $difference, $item_discount ); - $new_discount = $item_discount - $cut_amount; - $difference -= $cut_amount; - $item_args = array( - 'discount_amount' => $new_discount, - ); - if ( $this->is_wc_gte_30() ) { - $item = $order->get_item( $item_id ); - - if ( ! is_object( $item ) || ! is_callable( array( $item, 'get_id' ) ) ) { - continue; - } - - if ( ! is_object( $item ) || ! $item->is_type( 'coupon' ) ) { - $discount_updated = false; - } - if ( ! $order->get_id() ) { - $order->save(); // Order must exist. - } - - // BW compatibility for old args. - if ( isset( $item_args['discount_amount'] ) ) { - $item_args['discount'] = $item_args['discount_amount']; - } - if ( isset( $item_args['discount_amount_tax'] ) ) { - $item_args['discount_tax'] = $item_args['discount_amount_tax']; - } - - unset( $item_args['discount_amount'] ); // deprecated offset. - unset( $item_args['discount_amount_tax'] ); // deprecated offset. - - $item->set_order_id( $order->get_id() ); - $item->set_props( $item_args ); - $item->save(); - - do_action( 'woocommerce_order_update_coupon', $order->get_id(), $item->get_id(), $item_args ); - $discount_updated = true; - } else { - $discount_updated = $order->update_coupon( $item_id, $item_args ); - } - - if ( $discount_updated ) { - $order_total += $cut_amount; - $smart_coupons_contribution = $this->get_post_meta( $order_id, 'smart_coupons_contribution', true, true ); - if ( empty( $smart_coupons_contribution ) || ! is_array( $smart_coupons_contribution ) ) { - $smart_coupons_contribution = array(); - } - $smart_coupons_contribution[ $code ] = ( $this->is_wc_gte_30() ) ? $item_args['discount'] : $item_args['discount_amount']; - $this->update_post_meta( $order_id, 'smart_coupons_contribution', $smart_coupons_contribution, true, $order ); - - if ( ! empty( $store_credit_label['singular'] ) ) { - /* translators: 1. amount of store credit 2. store credit label 3. coupon code */ - $order_note[] = sprintf( __( '%1$s worth of %2$s restored to coupon %3$s.', 'woocommerce-smart-coupons' ), '' . wc_price( $cut_amount ) . '', ucwords( $store_credit_label['singular'] ), '' . $code . '' ); - } else { - /* translators: 1. amount of store credit 2. coupon code */ - $order_note[] = sprintf( __( '%1$s worth of Store Credit restored to coupon %2$s.', 'woocommerce-smart-coupons' ), '' . wc_price( $cut_amount ) . '', '' . $code . '' ); - } - } - } - } - $order->set_total( $order_total, 'total' ); - if ( ! empty( $order_note ) ) { - /* translators: Order notes */ - $note = sprintf( __( '%s Because PayPal doesn\'t accept discount on shipping & tax.', 'woocommerce-smart-coupons' ), implode( ', ', $order_note ) ); - $order->add_order_note( $note ); - if ( ! wc_has_notice( $note ) ) { - wc_add_notice( $note ); - } - } - } - - return $args; - } - - /** - * Function to track whether coupon is used or not - * - * @param int $order_id The order id. - */ - public function coupons_used( $order_id ) { - - $order = wc_get_order( $order_id ); - - $email = ( $this->is_callable( $order, 'get_meta' ) ) ? $order->get_meta( 'gift_receiver_email' ) : get_post_meta( $order_id, 'gift_receiver_email', true ); - - $used_coupons = $this->get_coupon_codes( $order ); - if ( ! empty( $used_coupons ) ) { - $this->update_coupons( $used_coupons, $email, '', 'remove' ); - } - } - - /** - * Function to update details related to coupons - * - * @param array $coupon_titles The coupon codes. - * @param mixed $email Email addresses. - * @param array $product_ids Array of product ids. - * @param string $operation Operation to perform. - * @param array $order_item The order item. - * @param array $gift_certificate_receiver Array of gift receiver emails. - * @param array $gift_certificate_receiver_name Array of gift receiver name. - * @param string $message_from_sender The message from sender. - * @param string $gift_certificate_sender_name Name of the sender. - * @param string $gift_certificate_sender_email Email address of the sender. - * @param int $order_id The order id. - */ - public function update_coupons( $coupon_titles = array(), $email = array(), $product_ids = '', $operation = '', $order_item = null, $gift_certificate_receiver = false, $gift_certificate_receiver_name = '', $message_from_sender = '', $gift_certificate_sender_name = '', $gift_certificate_sender_email = '', $order_id = '' ) { - - global $smart_coupon_codes; - - $order = null; - - $temp_gift_card_receivers_emails = array(); - if ( ! empty( $order_id ) ) { - $order = wc_get_order( $order_id ); - if ( $this->is_callable( $order, 'get_meta' ) ) { - $receivers_messages = $order->get_meta( 'gift_receiver_message' ); - $temp_gift_card_receivers_emails = $order->get_meta( 'temp_gift_card_receivers_emails' ); - $schedule_gift_sending = $order->get_meta( 'wc_sc_schedule_gift_sending' ); - $sending_timestamps = $order->get_meta( 'gift_sending_timestamp' ); - } else { - $receivers_messages = get_post_meta( $order_id, 'gift_receiver_message', true ); - $temp_gift_card_receivers_emails = get_post_meta( $order_id, 'temp_gift_card_receivers_emails', true ); - $schedule_gift_sending = get_post_meta( $order_id, 'wc_sc_schedule_gift_sending', true ); - $sending_timestamps = get_post_meta( $order_id, 'gift_sending_timestamp', true ); - } - } - - if ( ! is_a( $order, 'WC_Order' ) ) { - $order = ( is_object( $order_item ) && is_callable( array( $order_item, 'get_order' ) ) ) ? $order_item->get_order() : null; - } - - $prices_include_tax = ( get_option( 'woocommerce_prices_include_tax' ) === 'yes' ) ? true : false; - - if ( ! empty( $coupon_titles ) ) { - - if ( $this->is_wc_gte_30() ) { - $item_qty = ( ! empty( $order_item ) && is_callable( array( $order_item, 'get_quantity' ) ) ) ? $order_item->get_quantity() : 1; - $item_total = ( ! empty( $order_item ) && is_callable( array( $order_item, 'get_total' ) ) ) ? $order_item->get_total() : 0; - $item_tax = ( ! empty( $order_item ) && is_callable( array( $order_item, 'get_total_tax' ) ) ) ? $order_item->get_total_tax() : 0; - $item_product = ( ! empty( $order_item ) && is_callable( array( $order_item, 'get_product' ) ) ) ? $order_item->get_product() : null; - } else { - $item_qty = ( ! empty( $order_item['qty'] ) ) ? $order_item['qty'] : 1; - $item_total = ( ! empty( $order_item['line_total'] ) ) ? $order_item['line_total'] : 0; - $item_tax = ( ! empty( $order_item['line_tax'] ) ) ? $order_item['line_tax'] : 0; - $item_product = null; - } - - $item_sc_called_credit = ( is_a( $order_item, 'WC_Order_Item' ) ) ? $this->get_meta( $order_item, 'sc_called_credit' ) : ''; - - $qty = ( ! empty( $item_qty ) ) ? $item_qty : 1; - - foreach ( $coupon_titles as $coupon_title ) { - - $coupon = new WC_Coupon( $coupon_title ); - - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - continue; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - continue; - } - $is_free_shipping = ( $coupon->get_free_shipping() ) ? 'yes' : 'no'; - $discount_type = $coupon->get_discount_type(); - $coupon_code = $coupon->get_code(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - $coupon_amount = $this->get_amount( $coupon, true, $order ); - - $auto_generation_of_code = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'auto_generate_coupon' ) : get_post_meta( $coupon_id, 'auto_generate_coupon', true ); - - if ( ! empty( $item_sc_called_credit ) && 'smart_coupon' === $discount_type ) { - continue; // because it is already processed. - } - - $email_id = ( 'yes' === $auto_generation_of_code && 'smart_coupon' !== $discount_type && ! empty( $temp_gift_card_receivers_emails[ $coupon_id ][0] ) ) ? $temp_gift_card_receivers_emails[ $coupon_id ][0] : $gift_certificate_sender_email; - - if ( ( 'yes' === $auto_generation_of_code || 'smart_coupon' === $discount_type ) && 'add' === $operation ) { - - $is_pick_price_of_product = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'is_pick_price_of_product' ) : get_post_meta( $coupon_id, 'is_pick_price_of_product', true ); - - if ( 'yes' === $is_pick_price_of_product && 'smart_coupon' === $discount_type ) { - - $amount = 0; - $sell_sc_at_less_price = get_option( 'smart_coupons_sell_store_credit_at_less_price', 'no' ); - - if ( is_object( $order_item ) && is_a( $order_item, 'WC_Order_Item_Product' ) ) { - $subtotal = ( is_callable( array( $order_item, 'get_subtotal' ) ) ) ? $order_item->get_subtotal() : 0; - $subtotal_tax = ( is_callable( array( $order_item, 'get_subtotal_tax' ) ) ) ? $order_item->get_subtotal_tax() : 0; - $amount = $subtotal + $subtotal_tax; - $amount = round( $amount, get_option( 'woocommerce_price_num_decimals', 2 ) ); - } - - if ( 'yes' === $sell_sc_at_less_price ) { - - $args = array( - 'qty' => $qty, - 'price' => ( is_object( $item_product ) && is_callable( array( $item_product, 'get_regular_price' ) ) ) ? $item_product->get_regular_price() : '', - ); - - if ( ! $prices_include_tax ) { - $products_price = function_exists( 'wc_get_price_excluding_tax' ) ? wc_get_price_excluding_tax( $item_product, $args ) : $item_total; - } else { - $products_price = function_exists( 'wc_get_price_including_tax' ) ? wc_get_price_including_tax( $item_product, $args ) : $item_total + $item_tax; - } - } else { - $products_price = ( ! $prices_include_tax ) ? $item_total : $item_total + $item_tax; - } - - $amount = ( empty( $products_price ) ) ? $amount : $products_price; - - $amount = $amount / $qty; - - $amount = apply_filters( - 'wc_sc_auto_generated_coupon_pick_price_of_product', - $amount, - array( - 'calculated_product_price' => $calculated_product_price, - 'order_item' => $order_item, - ) - ); - - } else { - if ( false === stripos( $discount_type, 'percent' ) ) { - $coupon_amount = $this->write_price( $coupon_amount, true, $order ); - } - $amount = $coupon_amount; - } - - if ( ! empty( $temp_gift_card_receivers_emails ) ) { - $email = $temp_gift_card_receivers_emails; - } - - $is_auto_generate = $amount > 0 || 'yes' === $is_free_shipping; - - $is_auto_generate = apply_filters( - 'wc_sc_is_auto_generate', - $is_auto_generate, - array( - 'coupon_id' => $coupon_id, - 'auto_generate' => $auto_generation_of_code, - 'coupon_obj' => $coupon, - 'coupon_amount' => $amount, - 'current_receiver' => $email_id, - 'receiver_email_ids' => $email, - 'receivers_messages' => $receivers_messages, - 'order_id' => $order_id, - 'order_item' => $order_item, - ) - ); - - if ( $is_auto_generate ) { - $message_index = ( ! empty( $email[ $coupon_id ] ) && is_array( $email[ $coupon_id ] ) ) ? array_search( $email_id, $email[ $coupon_id ], true ) : false; - - if ( false !== $message_index && isset( $receivers_messages[ $coupon_id ][ $message_index ] ) && ! empty( $receivers_messages[ $coupon_id ][ $message_index ] ) ) { - $message_from_sender = $receivers_messages[ $coupon_id ][ $message_index ]; - unset( $email[ $coupon_id ][ $message_index ] ); - $this->update_post_meta( $order_id, 'temp_gift_card_receivers_emails', $email, false, $order ); - } else { - $message_from_sender = ''; - } - if ( false !== $message_index && isset( $sending_timestamp[ $coupon_id ][ $message_index ] ) && ! empty( $sending_timestamp[ $coupon_id ][ $message_index ] ) ) { - $sending_timestamp = $sending_timestamps[ $coupon_id ][ $message_index ]; - } else { - $sending_timestamp = ''; - } - for ( $i = 0; $i < $qty; $i++ ) { - if ( 'yes' === $auto_generation_of_code || 'smart_coupon' === $discount_type ) { - $email_id = ! empty( $temp_gift_card_receivers_emails[ $coupon_id ][ $i ] ) ? $temp_gift_card_receivers_emails[ $coupon_id ][ $i ] : $gift_certificate_sender_email; - if ( isset( $receivers_messages[ $coupon_id ][ $i ] ) && ! empty( $receivers_messages[ $coupon_id ][ $i ] ) ) { - $message_from_sender = $receivers_messages[ $coupon_id ][ $i ]; - unset( $email[ $coupon_id ][ $i ] ); - $this->update_post_meta( $order_id, 'temp_gift_card_receivers_emails', $email, false, $order ); - } else { - $message_from_sender = ''; - } - if ( isset( $sending_timestamps[ $coupon_id ][ $i ] ) && ! empty( $sending_timestamps[ $coupon_id ][ $i ] ) ) { - $sending_timestamp = $sending_timestamps[ $coupon_id ][ $i ]; - } else { - $sending_timestamp = ''; - } - $this->generate_smart_coupon( $email_id, $amount, $order_id, $coupon, $discount_type, $gift_certificate_receiver_name, $message_from_sender, $gift_certificate_sender_name, $gift_certificate_sender_email, $sending_timestamp ); - $smart_coupon_codes = array(); - } - } - } - } else { - - $coupon_receiver_email = ( ! empty( $temp_gift_card_receivers_emails[ $coupon_id ][0] ) ) ? $temp_gift_card_receivers_emails[ $coupon_id ][0] : $gift_certificate_sender_email; - - $sc_disable_email_restriction = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'sc_disable_email_restriction' ) : get_post_meta( $coupon_id, 'sc_disable_email_restriction', true ); - - if ( ( 'no' === $sc_disable_email_restriction || empty( $sc_disable_email_restriction ) ) ) { - $old_customers_email_ids = ( $this->is_callable( $coupon, 'get_email_restrictions' ) ) ? (array) maybe_unserialize( $coupon->get_email_restrictions() ) : (array) maybe_unserialize( get_post_meta( $coupon_id, 'customer_email', true ) ); - } - - if ( 'add' === $operation && 'yes' !== $auto_generation_of_code && 'smart_coupon' !== $discount_type ) { - $message_index = ( ! empty( $temp_gift_card_receivers_emails[ $coupon_id ] ) && is_array( $temp_gift_card_receivers_emails[ $coupon_id ] ) ) ? array_search( $email_id, $temp_gift_card_receivers_emails[ $coupon_id ], true ) : false; - - if ( false !== $message_index && isset( $receivers_messages[ $coupon_id ][ $message_index ] ) && ! empty( $receivers_messages[ $coupon_id ][ $message_index ] ) ) { - $message_from_sender = $receivers_messages[ $coupon_id ][ $message_index ]; - unset( $temp_gift_card_receivers_emails[ $coupon_id ][ $message_index ] ); - $this->update_post_meta( $order_id, 'temp_gift_card_receivers_emails', $temp_gift_card_receivers_emails, false, $order ); - } else { - $message_from_sender = ''; - } - - if ( false !== $message_index && isset( $sending_timestamps[ $coupon_id ][ $message_index ] ) && ! empty( $sending_timestamps[ $coupon_id ][ $message_index ] ) ) { - $sending_timestamp = $sending_timestamps[ $coupon_id ][ $message_index ]; - } else { - $sending_timestamp = ''; - } - - for ( $i = 0; $i < $qty; $i++ ) { - - $coupon_receiver_email = ( ! empty( $temp_gift_card_receivers_emails[ $coupon_id ][ $i ] ) ) ? $temp_gift_card_receivers_emails[ $coupon_id ][ $i ] : $coupon_receiver_email; - $message_from_sender = ( ! empty( $receivers_messages[ $coupon_id ][ $i ] ) ) ? $receivers_messages[ $coupon_id ][ $i ] : ''; - $sending_timestamp = ( ! empty( $sending_timestamps[ $coupon_id ][ $i ] ) ) ? $sending_timestamps[ $coupon_id ][ $i ] : ''; - - if ( false === stripos( $discount_type, 'percent' ) ) { - $coupon_amount = $this->write_price( $coupon_amount, true, $order ); - } - - $coupon_details = array( - $coupon_receiver_email => array( - 'parent' => $coupon_id, - 'code' => $coupon_title, - 'amount' => $coupon_amount, - ), - ); - - $receiver_name = ''; - - if ( 'yes' === $schedule_gift_sending && $this->is_valid_timestamp( $sending_timestamp ) ) { - $sender_message_index_key = ( ! empty( $receivers_messages[ $coupon_id ][ $i ] ) ) ? $coupon_id . ':' . $i : ''; - $action_args = array( - 'auto_generate' => 'no', - 'coupon_id' => $coupon_id, - 'parent_id' => $coupon_id, // Parent coupon id. - 'order_id' => $order_id, - 'receiver_email' => $coupon_receiver_email, - 'message_index_key' => $sender_message_index_key, - 'ref_key' => uniqid(), // A unique timestamp key to relate action schedulers with their coupons. - ); - $is_scheduled = $this->schedule_coupon_email( $action_args, $sending_timestamp ); - if ( ! $is_scheduled ) { - /* translators: 1. Receiver email 2. Coupon code 3. Order id */ - $this->log( 'error', sprintf( __( 'Failed to schedule email to "%1$s" for coupon "%2$s" received from order #%3$s.', 'woocommerce-smart-coupons' ), $coupon_receiver_email, $coupon_title, $order_id ) ); - } - } else { - $this->sa_email_coupon( $coupon_details, $discount_type, $order_id, $receiver_name, $message_from_sender ); - } - } - - if ( $qty > 0 && ( 'no' === $sc_disable_email_restriction || empty( $sc_disable_email_restriction ) ) ) { - for ( $i = 0; $i < $qty; $i++ ) { - $sending_timestamp = ( ! empty( $sending_timestamps[ $coupon_id ][ $i ] ) ) ? $sending_timestamps[ $coupon_id ][ $i ] : ''; - // Add receiver email to coupon only if it is not scheduled otherwise it would be added by action scheduler later on. - if ( ! ( 'yes' === $schedule_gift_sending && $this->is_valid_timestamp( $sending_timestamp ) ) ) { - $old_customers_email_ids[] = $coupon_receiver_email; - } - } - } - } elseif ( 'remove' === $operation && 'smart_coupon' !== $discount_type && ( 'no' === $sc_disable_email_restriction || empty( $sc_disable_email_restriction ) ) ) { - - $key = array_search( $coupon_receiver_email, $old_customers_email_ids, true ); - - if ( false !== $key ) { - unset( $old_customers_email_ids[ $key ] ); - } - } - - if ( ( 'no' === $sc_disable_email_restriction || empty( $sc_disable_email_restriction ) ) ) { - if ( $this->is_callable( $coupon, 'update_meta_data' ) && $this->is_callable( $coupon, 'save' ) ) { - $coupon->set_email_restrictions( $old_customers_email_ids ); - $coupon->save(); - } else { - update_post_meta( $coupon_id, 'customer_email', $old_customers_email_ids ); - } - } - } - } - } - - } - - /** - * Get receiver's email addresses - * - * @param array $coupon_details The coupon details. - * @param string $gift_certificate_sender_email Sender email address. - * @return array $receivers_email Array of receiver's email - */ - public function get_receivers_detail( $coupon_details = array(), $gift_certificate_sender_email = '' ) { - - if ( count( $coupon_details ) <= 0 ) { - return 0; - } - - $all_discount_types = wc_get_coupon_types(); - - $receivers_email = array(); - - foreach ( $coupon_details as $coupon_id => $emails ) { - $discount_type = $this->get_post_meta( $coupon_id, 'discount_type', true ); - if ( ! empty( $discount_type ) && array_key_exists( $discount_type, $all_discount_types ) ) { - $receivers_email = array_merge( $receivers_email, array_diff( $emails, array( $gift_certificate_sender_email ) ) ); - } - } - - return $receivers_email; - } - - /** - * Function to process coupons based on change in order status - * - * @param int $order_id The order id. - * @param string $operation Operation. - */ - public function process_coupons( $order_id, $operation ) { - global $smart_coupon_codes, $woocommerce_smart_coupon; - - $smart_coupon_codes = array(); - $message_from_sender = ''; - $sending_timestamp = ''; - - $order = wc_get_order( $order_id ); - $is_callable_order_get_meta = $this->is_callable( $order, 'get_meta' ); - - if ( true === $is_callable_order_get_meta ) { - $receivers_emails = $order->get_meta( 'gift_receiver_email' ); - $receivers_messages = $order->get_meta( 'gift_receiver_message' ); - $sending_timestamps = $order->get_meta( 'gift_sending_timestamp' ); - $is_coupon_sent = $order->get_meta( 'coupon_sent' ); - } else { - $receivers_emails = get_post_meta( $order_id, 'gift_receiver_email', true ); - $receivers_messages = get_post_meta( $order_id, 'gift_receiver_message', true ); - $sending_timestamps = get_post_meta( $order_id, 'gift_sending_timestamp', true ); - $is_coupon_sent = get_post_meta( $order_id, 'coupon_sent', true ); - } - $is_send_email = $this->is_email_template_enabled(); - - if ( 'yes' === $is_coupon_sent ) { - return; - } - - $order_items = ( is_object( $order ) && is_callable( array( $order, 'get_items' ) ) ) ? $order->get_items() : array(); - - $receivers_data = $receivers_emails; - $sc_called_credit_details = $this->get_post_meta( $order_id, 'sc_called_credit_details', true, false, $order ); - - if ( count( $order_items ) <= 0 ) { - return; - } - - if ( $this->is_wc_gte_30() ) { - $order_billing_email = ( is_object( $order ) && is_callable( array( $order, 'get_billing_email' ) ) ) ? $order->get_billing_email() : ''; - $order_billing_first_name = ( is_object( $order ) && is_callable( array( $order, 'get_billing_first_name' ) ) ) ? $order->get_billing_first_name() : ''; - $order_billing_last_name = ( is_object( $order ) && is_callable( array( $order, 'get_billing_last_name' ) ) ) ? $order->get_billing_last_name() : ''; - } else { - $order_billing_email = ( ! empty( $order->billing_email ) ) ? $order->billing_email : ''; - $order_billing_first_name = ( ! empty( $order->billing_first_name ) ) ? $order->billing_first_name : ''; - $order_billing_last_name = ( ! empty( $order->billing_last_name ) ) ? $order->billing_last_name : ''; - } - - if ( is_array( $receivers_emails ) && ! empty( $receivers_emails ) ) { - - foreach ( $receivers_emails as $coupon_id => $emails ) { - foreach ( $emails as $key => $email ) { - if ( empty( $email ) ) { - $email = $order_billing_email; - $receivers_emails[ $coupon_id ][ $key ] = $email; - } - } - } - - if ( count( $receivers_emails ) > 1 && isset( $receivers_emails[0][0] ) ) { - unset( $receivers_emails[0] ); // Disable sending to one customer. - } - $email = $receivers_emails; - } else { - $email = ''; - } - - $receivers_emails_list = $receivers_emails; - if ( ! empty( $email ) ) { - $this->update_post_meta( $order_id, 'temp_gift_card_receivers_emails', $email, false, $order ); - } - - $gift_certificate_receiver = true; - $gift_certificate_sender_name = $order_billing_first_name . ' ' . $order_billing_last_name; - $gift_certificate_sender_email = $order_billing_email; - $gift_certificate_receiver_name = ''; - - $receivers_detail = array(); - $email_to_credit = array(); - $receiver_count = 0; - - if ( is_array( $sc_called_credit_details ) && count( $sc_called_credit_details ) > 0 && 'add' === $operation ) { - - foreach ( $order_items as $item_id => $item ) { - - $product = ( is_object( $item ) && is_callable( array( $item, 'get_product' ) ) ) ? $item->get_product() : $order->get_product_from_item( $item ); - $item_qty = ( is_object( $item ) && is_callable( array( $item, 'get_quantity' ) ) ) ? $item->get_quantity() : $item['qty']; - - if ( $this->is_wc_gte_30() ) { - $product_type = ( is_object( $product ) && is_callable( array( $product, 'get_type' ) ) ) ? $product->get_type() : ''; - $product_id = ( in_array( $product_type, array( 'variable', 'variable-subscription', 'variation', 'subscription_variation' ), true ) ) ? ( ( is_object( $product ) && is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0 ) : ( ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0 ); - } else { - $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; - } - - $coupon_titles = $this->get_coupon_titles( array( 'product_object' => $product ) ); - - if ( $coupon_titles ) { - - foreach ( $coupon_titles as $coupon_title ) { - $coupon = new WC_Coupon( $coupon_title ); - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - continue; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - continue; - } - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - } - - $coupon_amount = $this->get_amount( $coupon, true, $order ); - - if ( ! isset( $receivers_emails[ $coupon_id ] ) ) { - continue; - } - for ( $i = 0; $i < $item_qty; $i++ ) { - if ( isset( $receivers_emails[ $coupon_id ][0] ) ) { - if ( ! isset( $email_to_credit[ $receivers_emails[ $coupon_id ][0] ] ) ) { - $email_to_credit[ $receivers_emails[ $coupon_id ][0] ] = array(); - } - if ( isset( $sc_called_credit_details[ $item_id ] ) && ! empty( $sc_called_credit_details[ $item_id ] ) ) { - - if ( $this->is_coupon_amount_pick_from_product_price( array( $coupon_title ) ) ) { - $credit_price = $sc_called_credit_details[ $item_id ]; - // Allow 3rd party plugins to modify the amount before generating credit. - $credit_price = apply_filters( - 'wc_sc_credit_called_price_order', - $credit_price, - array( - 'source' => $this, - 'item_id' => $item_id, - 'order_obj' => $order, - ) - ); - $email_to_credit[ $receivers_emails[ $coupon_id ][0] ][] = $coupon_id . ':' . $credit_price; - } else { - $email_to_credit[ $receivers_emails[ $coupon_id ][0] ][] = $coupon_id . ':' . $coupon_amount; - } - - unset( $receivers_emails[ $coupon_id ][0] ); - $receivers_emails[ $coupon_id ] = array_values( $receivers_emails[ $coupon_id ] ); - } - } - } - } - } - if ( $this->is_coupon_amount_pick_from_product_price( $coupon_titles ) && is_object( $product ) && is_callable( array( $product, 'get_price' ) ) && $product->get_price() >= 0 ) { - $sc_called_credit = ( ! empty( $sc_called_credit_details[ $item_id ] ) ) ? $sc_called_credit_details[ $item_id ] : ''; - $woocommerce_smart_coupon->update_meta_data( $item, 'sc_called_credit', $sc_called_credit ); - } - } - } - - if ( ! empty( $email_to_credit ) && count( $email_to_credit ) > 0 ) { - $update_temp_email = false; - $temp_email = $email; - foreach ( $email_to_credit as $email_id => $credits ) { - $email_to_credit[ $email_id ] = array_count_values( $credits ); - foreach ( $email_to_credit[ $email_id ] as $coupon_credit => $qty ) { - $coupon_details = explode( ':', $coupon_credit ); - $coupon_title = get_the_title( $coupon_details[0] ); - $coupon = new WC_Coupon( $coupon_title ); - $credit_amount = $coupon_details[1]; - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - continue; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - continue; - } - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - - for ( $i = 0; $i < $qty; $i++ ) { - if ( 'smart_coupon' !== $discount_type ) { - continue; // only process smart_coupon here, rest coupon will be processed by function update_coupon. - } - - $message_index = array_search( $email_id, $temp_email[ $coupon_id ], true ); - - if ( false !== $message_index ) { - $temp_email[ $coupon_id ][ $message_index ] = ''; // Empty value at found index so that we don't get same index in next loop run. - } - if ( false !== $message_index && isset( $receivers_messages[ $coupon_id ][ $message_index ] ) && ! empty( $receivers_messages[ $coupon_id ][ $message_index ] ) ) { - $message_from_sender = $receivers_messages[ $coupon_id ][ $message_index ]; - } else { - $message_from_sender = ''; - } - if ( false !== $message_index && isset( $sending_timestamps[ $coupon_id ][ $message_index ] ) && ! empty( $sending_timestamps[ $coupon_id ][ $message_index ] ) ) { - $sending_timestamp = $sending_timestamps[ $coupon_id ][ $message_index ]; - } else { - $sending_timestamp = ''; - } - - $this->generate_smart_coupon( $email_id, $credit_amount, $order_id, $coupon, 'smart_coupon', $gift_certificate_receiver_name, $message_from_sender, $gift_certificate_sender_name, $gift_certificate_sender_email, $sending_timestamp ); - $smart_coupon_codes = array(); - } - } - } - foreach ( $email_to_credit as $email => $coupon_detail ) { - if ( $email === $gift_certificate_sender_email ) { - continue; - } - $receiver_count += count( $coupon_detail ); - } - } - - if ( count( $order_items ) > 0 ) { - - $flag = false; - - foreach ( $order_items as $item_id => $item ) { - - $product = ( is_object( $item ) && is_callable( array( $item, 'get_product' ) ) ) ? $item->get_product() : ( ( is_object( $order ) && is_callable( array( $order, 'get_product_from_item' ) ) ) ? $order->get_product_from_item( $item ) : new stdClass() ); - if ( $this->is_wc_gte_30() ) { - $product_type = ( is_object( $product ) && is_callable( array( $product, 'get_type' ) ) ) ? $product->get_type() : ''; - $product_id = ( in_array( $product_type, array( 'variable', 'variable-subscription', 'variation', 'subscription_variation' ), true ) ) ? ( ( is_object( $product ) && is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0 ) : ( ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0 ); - } else { - $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; - } - - $coupon_titles = $this->get_coupon_titles( array( 'product_object' => $product ) ); - - if ( $coupon_titles ) { - - $flag = true; - - if ( $this->is_coupon_amount_pick_from_product_price( $coupon_titles ) && is_object( $product ) && is_callable( array( $product, 'get_price' ) ) && $product->get_price() >= 0 ) { - $sc_called_credit = ( ! empty( $sc_called_credit_details[ $item_id ] ) ) ? $sc_called_credit_details[ $item_id ] : ''; - $woocommerce_smart_coupon->update_meta_data( $item, 'sc_called_credit', $sc_called_credit ); - } - - $this->update_coupons( $coupon_titles, $email, '', $operation, $item, $gift_certificate_receiver, $gift_certificate_receiver_name, $message_from_sender, $gift_certificate_sender_name, $gift_certificate_sender_email, $order_id ); - - if ( 'add' === $operation && ! empty( $receivers_emails_list ) ) { - $receivers_detail += $this->get_receivers_detail( $receivers_emails_list, $gift_certificate_sender_email ); - } - } - } - - if ( $flag && 'add' === $operation ) { - $combine_emails = $this->is_email_template_enabled( 'combine' ); - if ( 'yes' === $is_send_email && 'yes' === $combine_emails ) { - $coupon_receiver_details = ( true === $is_callable_order_get_meta ) ? $order->get_meta( 'sc_coupon_receiver_details' ) : get_post_meta( $order_id, 'sc_coupon_receiver_details', true ); - if ( is_array( $coupon_receiver_details ) && ! empty( $coupon_receiver_details ) ) { - $combined_coupon_receiver_details = array(); - foreach ( $coupon_receiver_details as $receiver_detail ) { - $receiver_email = $receiver_detail['email']; - if ( ! isset( $combined_coupon_receiver_details[ $receiver_email ] ) || ! is_array( $combined_coupon_receiver_details[ $receiver_email ] ) ) { - $combined_coupon_receiver_details[ $receiver_email ] = array(); - } - $combined_coupon_receiver_details[ $receiver_email ][] = array( - 'code' => $receiver_detail['code'], - 'message' => $receiver_detail['message'], - ); - } - if ( ! empty( $combined_coupon_receiver_details ) ) { - foreach ( $combined_coupon_receiver_details as $combined_receiver_email => $combined_receiver_details ) { - $this->send_combined_coupon_email( $combined_receiver_email, $combined_receiver_details, $order_id, $gift_certificate_sender_name, $gift_certificate_sender_email ); - } - } - } - } - $this->update_post_meta( $order_id, 'coupon_sent', 'yes', false, $order ); // to know whether coupon has sent or not. - } - } - - $email_scheduled_details = array(); - // Assign scheduled timestamps to each user's email. - if ( ! empty( $receivers_data ) && is_array( $receivers_data ) && ! empty( $sending_timestamps ) ) { - foreach ( $receivers_data as $coupon_id => $receivers ) { - $scheduled_timestamp = ! empty( $sending_timestamps[ $coupon_id ] ) ? $sending_timestamps[ $coupon_id ] : ''; - // Get the receivers by coupon codes. - if ( ! empty( $scheduled_timestamp ) && is_array( $receivers ) && ! empty( $receivers ) ) { - foreach ( $receivers as $key => $receiver_email ) { - $before_timestamps = ! empty( $email_scheduled_details[ $receiver_email ] ) ? $email_scheduled_details[ $receiver_email ] : ''; - $timestamps = ! empty( $scheduled_timestamp[ $key ] ) ? array( $scheduled_timestamp[ $key ] ) : array(); - $email_scheduled_details[ $receiver_email ] = ! empty( $before_timestamps ) && is_array( $before_timestamps ) ? array_merge( $before_timestamps, $timestamps ) : $timestamps; - } - } - } - } - - if ( 'yes' === $is_send_email && ( count( $receivers_detail ) + $receiver_count ) > 0 ) { - WC()->mailer(); - - $contains_core_coupons = false; - if ( ! empty( $receivers_emails_list ) ) { - $coupon_ids_to_be_sent = array_keys( $receivers_emails_list ); - if ( ! empty( $coupon_ids_to_be_sent ) ) { - foreach ( $coupon_ids_to_be_sent as $coupon_id ) { - $discount_type = $this->get_post_meta( $coupon_id, 'discount_type', true ); - if ( ! empty( $discount_type ) && 'smart_coupon' !== $discount_type ) { - $contains_core_coupons = true; - break; - } - } - } - } - - $action_args = apply_filters( - 'wc_sc_acknowledgement_email_notification_args', - array( - 'email' => $gift_certificate_sender_email, - 'order_id' => $order_id, - 'receivers_detail' => $receivers_detail, - 'receiver_name' => $gift_certificate_receiver_name, - 'receiver_count' => count( $receivers_detail ), - 'scheduled_email' => array_filter( $email_scheduled_details ), - 'contains_core_coupons' => ( true === $contains_core_coupons ) ? 'yes' : 'no', - ) - ); - - // Trigger email notification. - do_action( 'wc_sc_acknowledgement_email_notification', $action_args ); - } - - if ( 'add' === $operation ) { - $this->delete_post_meta( $order_id, 'temp_gift_card_receivers_emails', null, $order ); - } - unset( $smart_coupon_codes ); - } - - /** - * Whether to auto generate coupon or not - * - * @param int $order_id The order id. - * @return boolean - */ - public function should_coupon_auto_generate( $order_id = 0 ) { - $should_auto_generate = true; - $valid_order_statuses = get_option( 'wc_sc_valid_order_statuses_for_coupon_auto_generation', wc_get_is_paid_statuses() ); - if ( ! empty( $valid_order_statuses ) ) { - $valid_order_statuses = apply_filters( 'wc_sc_valid_order_statuses_for_coupon_auto_generation', $valid_order_statuses, $order_id ); - if ( ! empty( $valid_order_statuses ) ) { - $order = wc_get_order( $order_id ); - $order_status = $order->get_status(); - if ( ! in_array( $order_status, $valid_order_statuses, true ) ) { - $should_auto_generate = false; - } - } - } - return apply_filters( - 'wc_sc_should_coupon_auto_generate', - $should_auto_generate, - array( - 'source' => $this, - 'order_id' => $order_id, - ) - ); - } - - /** - * Function to add details to coupons - * - * @param int $order_id The order id. - */ - public function sa_add_coupons( $order_id ) { - if ( ! $this->should_coupon_auto_generate( $order_id ) ) { - return; - } - $this->process_coupons( $order_id, 'add' ); - } - - /** - * Function to remove details from coupons - * - * @param int $order_id The order id. - */ - public function sa_remove_coupons( $order_id ) { - $this->process_coupons( $order_id, 'remove' ); - } - - /** - * Function to Restore Smart Coupon Amount back, when an order which was created using this coupon, is refunded or cancelled, - * - * @param int $order_id The order id. - */ - public function sa_restore_smart_coupon_amount( $order_id = 0 ) { - - if ( empty( $order_id ) ) { - return; - } - - $order = wc_get_order( $order_id ); - - $order_id = ( is_object( $order ) && is_callable( array( $order, 'get_id' ) ) ) ? $order->get_id() : 0; - - if ( empty( $order_id ) ) { - return; - } - - $coupons = $order->get_items( 'coupon' ); - - if ( ! empty( $coupons ) ) { - - foreach ( $coupons as $item_id => $item ) { - - $code = ( is_object( $item ) && is_callable( array( $item, 'get_name' ) ) ) ? $item->get_name() : trim( $item['name'] ); - - if ( empty( $code ) ) { - continue; - } - - $coupon = new WC_Coupon( $code ); - - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - continue; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - continue; - } - $discount_type = $coupon->get_discount_type(); - $usage_count = $coupon->get_usage_count(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $usage_count = ( ! empty( $coupon->usage_count ) ) ? $coupon->usage_count : 0; - } - - $coupon_amount = $this->get_amount( $coupon, true, $order ); - - if ( empty( $discount_type ) || 'smart_coupon' !== $discount_type ) { - continue; - } - - if ( ! empty( $_POST['action'] ) && 'woocommerce_remove_order_coupon' === wc_clean( wp_unslash( $_POST['action'] ) ) && ! empty( $_POST['smart_coupon_removed'] ) && sanitize_text_field( wp_unslash( $_POST['smart_coupon_removed'] ) ) !== $code ) { // phpcs:ignore - continue; - } - - $discount = ( is_object( $item ) && is_callable( array( $item, 'get_discount' ) ) ) ? $item->get_discount() : $item['discount_amount']; - $discount_tax = ( is_object( $item ) && is_callable( array( $item, 'get_discount_tax' ) ) ) ? $item->get_discount_tax() : $item['discount_amount_tax']; - - $sc_refunded_discount = $this->get_order_item_meta( $item_id, 'sc_refunded_discount', true ); - $sc_refunded_discount_tax = $this->get_order_item_meta( $item_id, 'sc_refunded_discount_tax', true ); - $sc_refunded_coupon_id = $this->get_order_item_meta( $item_id, 'sc_refunded_coupon_id', true ); - - if ( absint( $coupon_id ) === absint( $sc_refunded_coupon_id ) ) { - $discount -= $sc_refunded_discount; - $discount_tax -= $sc_refunded_discount_tax; - } - - $update = false; - if ( floatval( $discount ) > floatval( 0 ) ) { - $coupon_amount += $discount; - - $sc_include_tax = $this->is_store_credit_include_tax(); - // Add discount on tax if it has been given on tax. - if ( 'yes' === $sc_include_tax && ! empty( $discount_tax ) ) { - $coupon_amount += $discount_tax; - } - $update = true; - } - - if ( $update ) { - $user = ( function_exists( 'get_current_user_id' ) ) ? get_current_user_id() : 0; - $local_time = ( function_exists( 'current_datetime' ) ) ? current_datetime() : ''; - $get_timestamp = ( is_object( $local_time ) && is_callable( array( $local_time, 'getTimestamp' ) ) ) ? $local_time->getTimestamp() : ''; - $get_offset = ( is_object( $local_time ) && is_callable( array( $local_time, 'getOffset' ) ) ) ? $local_time->getOffset() : ''; - $current_time_stamp = $get_timestamp + $get_offset; - - $this->update_post_meta( $coupon_id, 'coupon_amount', $coupon_amount, true, $order ); - $this->update_order_item_meta( $item_id, 'sc_refunded_discount', ( $sc_refunded_discount + $discount ), true, $order ); - $this->update_order_item_meta( $item_id, 'sc_refunded_discount_tax', ( $sc_refunded_discount_tax + $discount_tax ), true, $order ); - $this->update_order_item_meta( $item_id, 'sc_refunded_user_id', $user ); - $this->update_order_item_meta( $item_id, 'sc_refunded_timestamp', $current_time_stamp ); - $this->update_order_item_meta( $item_id, 'sc_refunded_coupon_id', $coupon_id ); - } - - $usage_count = intval( $usage_count ); - $usage_count--; - if ( $usage_count < 0 ) { - $usage_count = 0; - } - if ( $this->is_callable( $coupon, 'set_usage_count' ) && $this->is_callable( $coupon, 'save' ) ) { - $coupon->set_usage_count( $usage_count ); - $coupon->save(); - } else { - update_post_meta( $coupon_id, 'usage_count', $usage_count ); - } - } - } - - } - - /** - * Allow overriding of Smart Coupon's template for email - * - * @param string $template The template name. - * @return mixed $template - */ - public function woocommerce_gift_certificates_email_template_path( $template = '' ) { - - $template_name = 'email.php'; - - $template = $this->locate_template_for_smart_coupons( $template_name, $template ); - - return $template; - - } - - /** - * Allow overriding of Smart Coupon's template for combined emails template - * - * @param string $template The template name. - * @return mixed $template - */ - public function woocommerce_combined_gift_certificates_email_template_path( $template = '' ) { - - $template_name = 'combined-email.php'; - - $template = $this->locate_template_for_smart_coupons( $template_name, $template ); - - return $template; - - } - - /** - * Virtual downloadable order item needs update smart coupon balance. - * - * @param boolean $virtual_downloadable_item true/false. - * @param object $_product line item. - * @param int $order_id order id. - * @return bool|mixed - */ - public function virtual_downloadable_item_needs_update_smart_coupon_balance( $virtual_downloadable_item = true, $_product = null, $order_id = 0 ) { - if ( empty( $order_id ) ) { - return $virtual_downloadable_item; - } - $order = wc_get_order( $order_id ); - $hooks_available_for_statuses = array( 'on-hold', 'pending', 'processing', 'completed', 'failed', 'refunded', 'cancelled' ); - $order_status = ( is_object( $order ) && is_callable( array( $order, 'get_status' ) ) ) ? $order->get_status() : ''; - if ( ! in_array( $order_status, $hooks_available_for_statuses, true ) ) { - return $virtual_downloadable_item; - } - - if ( did_action( 'wc_sc_balance_updated_for_virtual_downloadable_item' ) >= 1 ) { - return $virtual_downloadable_item; - } - - $order_items = ( is_object( $order ) && is_callable( array( $order, 'get_items' ) ) ) ? $order->get_items() : array(); - - if ( false === $virtual_downloadable_item ) { - $is_included_other_products_in_cart = false; - if ( ! empty( $order_items ) ) { - foreach ( $order_items as $item ) { - if ( $item->is_type( 'line_item' ) ) { - $product = ( is_object( $item ) && is_callable( array( $item, 'get_product' ) ) ) ? $item->get_product() : null; - - if ( ! is_a( $product, 'WC_Product' ) ) { - continue; - } - - $is_virtual_downloadable_item = $product->is_downloadable() && $product->is_virtual(); - - if ( false === $is_virtual_downloadable_item ) { - $is_included_other_products_in_cart = true; - break; - } - } - } - } - $order_used_coupons = $this->get_coupon_codes( $order ); - - if ( ! empty( $order_used_coupons ) ) { - foreach ( $order_used_coupons as $code ) { - $smart_coupon = new WC_Coupon( $code ); - if ( $this->is_wc_gte_30() ) { - $discount_type = $smart_coupon->get_discount_type(); - } else { - $discount_type = ( ! empty( $smart_coupon->discount_type ) ) ? $smart_coupon->discount_type : ''; - } - if ( 'smart_coupon' === $discount_type ) { - if ( false === $is_included_other_products_in_cart ) { - remove_action( 'woocommerce_order_status_pending_to_completed', array( $this, 'update_smart_coupon_balance' ) ); - remove_action( 'woocommerce_order_status_pending_to_on-hold', array( $this, 'update_smart_coupon_balance' ) ); - remove_action( 'woocommerce_order_status_failed_to_on-hold', array( $this, 'update_smart_coupon_balance' ) ); - remove_action( 'woocommerce_order_status_failed_to_processing', array( $this, 'update_smart_coupon_balance' ) ); - remove_action( 'woocommerce_order_status_failed_to_completed', array( $this, 'update_smart_coupon_balance' ) ); - $this->update_smart_coupon_balance( $order_id ); - do_action( - 'wc_sc_balance_updated_for_virtual_downloadable_item', - array( - 'order_id' => $order_id, - 'product' => $_product, - 'source' => $this, - ) - ); - break; - } - } - } - } - } - return $virtual_downloadable_item; - } - - /** - * Check if the product is only going to generate/issue coupon, if so, tell the system that this product doesn't needs processing & can proceed with completing the order. - * - * @param boolean $needs_processing Whether needs processing or not. - * @param WC_Product $product The product object. - * @param integer $order_id The order id. - * @return boolean - */ - public function coupon_product_dont_need_processing( $needs_processing = true, $product = null, $order_id = 0 ) { - $coupon_titles = $this->get_coupon_titles( array( 'product_object' => $product ) ); - if ( $product->is_virtual() && ! empty( $coupon_titles ) ) { - $needs_processing = apply_filters( - 'wc_sc_coupon_product_need_processing', - $this->sc_get_option( 'wc_sc_coupon_product_need_processing', 'no' ), - array( - 'source' => $this, - 'original_needs_processing' => $needs_processing, - 'product' => $product, - 'order_id' => $order_id, - ) - ); - $needs_processing = ( 'yes' !== $needs_processing ) ? 'no' : $needs_processing; - return wc_string_to_bool( $needs_processing ); - } - return $needs_processing; - } - - } - -} - -WC_SC_Coupon_Process::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-refund-process.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-refund-process.php deleted file mode 100644 index a337c2a4..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupon-refund-process.php +++ /dev/null @@ -1,713 +0,0 @@ - - - - - - get_taxes() : array(); - $order_items = ( is_object( $order ) && is_callable( array( $order, 'get_items' ) ) ) ? $order->get_items( 'coupon' ) : array(); - $i = 1; - if ( ! empty( $order_items ) ) { - foreach ( $order_items as $item_id => $item ) { - $order_discount_amount = $sc_refunded_discount = $sc_refunded_discount_tax = $order_discount_tax_amount = 0; // phpcs:ignore - $coupon_post_obj = ( function_exists( 'wpcom_vip_get_page_by_title' ) ) ? wpcom_vip_get_page_by_title( $item->get_name(), OBJECT, 'shop_coupon' ) : get_page_by_title( $item->get_name(), OBJECT, 'shop_coupon' );// phpcs:ignore - $coupon_id = isset( $coupon_post_obj->ID ) ? $coupon_post_obj->ID : ''; - $coupon_title = isset( $coupon_post_obj->post_title ) ? $coupon_post_obj->post_title : ''; - $coupon = new WC_Coupon( $coupon_id ); - if ( is_a( $coupon, 'WC_Coupon' ) ) { - if ( $coupon->is_type( 'smart_coupon' ) ) { - - if ( 1 === $i ) { - ?> - - - - - - - - - - - - - - - - - - - - - - get_order_item_meta( $item_id, 'discount_amount', true ); - $sc_refunded_discount = $this->get_order_item_meta( $item_id, 'sc_refunded_discount', true ); - $sc_refunded_discount_tax = $this->get_order_item_meta( $item_id, 'sc_refunded_discount_tax', true ); - $order_discount_tax_amount = $this->get_order_item_meta( $item_id, 'discount_amount_tax', true ); - } - - ?> - - -
            - - - - -
            - - - -
            - -
            - - -   -   - - -
            - - - -
            - - - - - -
            - - - -
            - - - - - - - - - - get_order_item_meta( $item_id, 'discount_amount', true ); - $refunded_amount = $this->get_order_item_meta( $item_id, 'sc_refunded_discount', true ); - $refunded_tax_amount = $this->get_order_item_meta( $item_id, 'sc_refunded_discount_tax', true ); - $order_discount_tax_amount = $this->get_order_item_meta( $item_id, 'discount_amount_tax', true ); - } - - if ( floatval( $order_discount_amount ) === floatval( $refunded_amount ) && floatval( $order_discount_tax_amount ) === floatval( $refunded_tax_amount ) ) { - continue; - } - - if ( $refunded_amount ) { - $total_refunded = $refund_amount + $refunded_amount; - } - - if ( $refunded_tax_amount ) { - $total_refunded_tax = $order_sc_refund_tax_amount + $refunded_tax_amount; - } - if ( $order_discount_amount >= $refund_amount && $order_discount_amount >= $total_refunded && $order_discount_tax_amount >= $order_sc_refund_tax_amount && $order_discount_tax_amount >= $total_refunded_tax && ! empty( $smart_coupon_id ) ) { - $coupon = new WC_Coupon( $smart_coupon_id ); - - if ( is_a( $coupon, 'WC_Coupon' ) ) { - if ( $this->is_wc_gte_30() ) { - $discount_type = ( is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - $coupon_amount = $this->get_amount( $coupon, true, $order ); - if ( 'smart_coupon' === $discount_type && is_numeric( $refund_amount ) && is_numeric( $order_sc_refund_tax_amount ) ) { - $amount = $coupon_amount + $refund_amount + $order_sc_refund_tax_amount; - $this->update_post_meta( $smart_coupon_id, 'coupon_amount', $amount, true, $order ); - $user = ( function_exists( 'get_current_user_id' ) ) ? get_current_user_id() : 0; - $local_time = ( function_exists( 'current_datetime' ) ) ? current_datetime() : ''; - $get_timestamp = ( is_object( $local_time ) && is_callable( array( $local_time, 'getTimestamp' ) ) ) ? $local_time->getTimestamp() : ''; - $get_offset = ( is_object( $local_time ) && is_callable( array( $local_time, 'getOffset' ) ) ) ? $local_time->getOffset() : ''; - $current_time_stamp = $get_timestamp + $get_offset; - - if ( 0 < $total_refunded ) { - $refund_amount = $total_refunded; - } - - if ( 0 < $total_refunded_tax ) { - $order_sc_refund_tax_amount = $total_refunded_tax; - } - - if ( is_callable( array( $this, 'update_order_item_meta' ) ) ) { - $this->update_order_item_meta( $item_id, 'sc_refunded_discount_tax', $order_sc_refund_tax_amount ); - $this->update_order_item_meta( $item_id, 'sc_refunded_discount', $refund_amount ); - $this->update_order_item_meta( $item_id, 'sc_refunded_user_id', $user ); - $this->update_order_item_meta( $item_id, 'sc_refunded_timestamp', $current_time_stamp ); - $this->update_order_item_meta( $item_id, 'sc_refunded_coupon_id', $smart_coupon_id ); - $message = __( 'Successfully updated store credit refund details.', 'woocommerce-smart-coupons' ); - } else { - $message = __( 'Failed to update store credit refund details.', 'woocommerce-smart-coupons' ); - $woocommerce_smart_coupon->log( 'notice', $message . ' ' . __FILE__ . ' ' . __LINE__ ); - } - $response['message'] = $message; - } - } - } - } - } - wp_send_json_success( $response ); - } else { - $response['message'] = __( 'Nonce verification failed for action "wc_sc_refund_store_credit".', 'woocommerce-smart-coupons' ); - wp_send_json_error( $response ); - } - } - - /** - * Render refund store credit UI in order page - * - * @param int $order_id order id. - * @return void revoke refund html - */ - public function render_refunded_store_credits_details( $order_id ) { - ?> - - - - get_items( 'coupon' ) : array(); - if ( ! empty( $order_items ) ) { - foreach ( $order_items as $item_id => $item ) { - $sc_refunded_discount = $sc_refunded_discount_tax = $sc_refunded_user = $sc_refunded_timestamp = 0; // phpcs:ignore - $coupon_post_obj = ( function_exists( 'wpcom_vip_get_page_by_title' ) ) ? wpcom_vip_get_page_by_title( $item->get_name(), OBJECT, 'shop_coupon' ) : get_page_by_title( $item->get_name(), OBJECT, 'shop_coupon' );// phpcs:ignore - $coupon_id = isset( $coupon_post_obj->ID ) ? $coupon_post_obj->ID : ''; - $coupon_title = isset( $coupon_post_obj->post_title ) ? $coupon_post_obj->post_title : ''; - $coupon = new WC_Coupon( $coupon_id ); - if ( is_callable( array( $this, 'get_order_item_meta' ) ) ) { - $sc_refunded_discount = $this->get_order_item_meta( $item_id, 'sc_refunded_discount', true ); - $sc_refunded_discount_tax = $this->get_order_item_meta( $item_id, 'sc_refunded_discount_tax', true ); - $sc_refunded_user = $this->get_order_item_meta( $item_id, 'sc_refunded_user_id', true ); - $sc_refunded_timestamp = $this->get_order_item_meta( $item_id, 'sc_refunded_timestamp', true ); - } - if ( empty( $sc_refunded_timestamp ) ) { - $sc_refunded_timestamp = time() + $this->wc_timezone_offset(); - } - $sc_refunded_discount = empty( $sc_refunded_discount ) ? 0 : $sc_refunded_discount; - $sc_refunded_discount_tax = empty( $sc_refunded_discount_tax ) ? 0 : $sc_refunded_discount_tax; - - if ( is_a( $coupon, 'WC_Coupon' ) ) { - if ( $coupon->is_type( 'smart_coupon' ) && ( ! empty( $sc_refunded_discount ) || ! empty( $sc_refunded_discount_tax ) ) ) { - $who_refunded = new WP_User( $sc_refunded_user ); - $refunder_id = isset( $who_refunded->ID ) ? $who_refunded->ID : 0; - $refunder_name = isset( $who_refunded->display_name ) ? $who_refunded->display_name : ''; - ?> - - - -
            - - - exists() ) { - printf( - /* translators: 1: refund id 2: refund date 3: username */ - esc_html__( 'Refund %1$s - %2$s by %3$s', 'woocommerce-smart-coupons' ), - esc_html( 'Store Credit Coupon - ' . $coupon_title ), - esc_html( $this->format_date( $sc_refunded_timestamp ) ), - sprintf( - '%2$s', - /* translators: 1: ID who refunded */ - sprintf( esc_attr__( 'ID: %d', 'woocommerce-smart-coupons' ), absint( $refunder_id ) ), - esc_html( $refunder_name ) - ) - ); - } else { - printf( - /* translators: 1: refund id 2: refund date */ - esc_html__( 'Refund %1$s - %2$s', 'woocommerce-smart-coupons' ), - esc_html( 'Store Credit Coupon -' . $coupon_title ), - esc_html( $this->format_date( $sc_refunded_timestamp ) ) - ); - } - ?> - - -   -   - - -
            - -
            - - - - - - - -
            - -
            - - - get_order_item_meta( $wc_sc_refunded_id, 'discount_amount', true ); - $order_discount_tax_amount = $this->get_order_item_meta( $wc_sc_refunded_id, 'discount_amount_tax', true ); - if ( $order_discount_amount >= $refunded_amount && $order_discount_tax_amount >= $refunded_amount_tax && ! empty( $smart_coupon_id ) ) { - $coupon = new WC_Coupon( $smart_coupon_id ); - if ( is_a( $coupon, 'WC_Coupon' ) ) { - if ( $this->is_wc_gte_30() ) { - $discount_type = ( is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - $coupon_amount = $this->get_amount( $coupon, true, $order ); - if ( 'smart_coupon' === $discount_type ) { - if ( ! is_numeric( $refunded_amount ) ) { - $refunded_amount = 0; - } - if ( ! is_numeric( $refunded_amount_tax ) ) { - $refunded_amount_tax = 0; - } - $refund_amount = $refunded_amount + $refunded_amount_tax; - $amount = $coupon_amount - $refund_amount; - $this->update_post_meta( $smart_coupon_id, 'coupon_amount', $amount, true, $order ); - $user = ( function_exists( 'get_current_user_id' ) ) ? get_current_user_id() : 0; - $local_time = ( function_exists( 'current_datetime' ) ) ? current_datetime() : ''; - $get_timestamp = ( is_object( $local_time ) && is_callable( array( $local_time, 'getTimestamp' ) ) ) ? $local_time->getTimestamp() : 0; - $get_offset = ( is_object( $local_time ) && is_callable( array( $local_time, 'getOffset' ) ) ) ? $local_time->getOffset() : 0; - $current_time_stamp = $get_timestamp + $get_offset; - - if ( is_callable( array( $this, 'update_order_item_meta' ) ) ) { - $this->update_order_item_meta( $wc_sc_refunded_id, 'sc_revoke_refunded_discount', $refunded_amount, true ); - $this->update_order_item_meta( $wc_sc_refunded_id, 'sc_revoke_refunded_discount_tax', $refunded_amount_tax, true ); - $this->update_order_item_meta( $wc_sc_refunded_id, 'sc_revoke_refunded_user_id', $user ); - $this->update_order_item_meta( $wc_sc_refunded_id, 'sc_revoke_refunded_timestamp', $current_time_stamp ); - $this->update_order_item_meta( $wc_sc_refunded_id, 'sc_revoke_refunded_coupon_id', $smart_coupon_id ); - - $this->update_order_item_meta( $wc_sc_refunded_id, 'sc_refunded_discount', 0 ); - $this->update_order_item_meta( $wc_sc_refunded_id, 'sc_refunded_discount_tax', 0 ); - } - } - } - } - } - wp_send_json_success(); - } else { - wp_send_json_error(); - } - } - - /** - * Change order status when fully refunded. - * - * @param string $status order status. - * @param number $order_id order id. - * @param number $refund_id refund id. - * @return false|mixed order status - */ - public function update_fully_refunded_status( $status, $order_id, $refund_id ) { - $order = wc_get_order( $order_id ); - $order_items = ( is_object( $order ) && is_callable( array( $order, 'get_items' ) ) ) ? $order->get_items( 'coupon' ) : array(); - if ( ! empty( $order_items ) ) { - foreach ( $order_items as $item_id => $item ) { - $sc_refunded_discount = $sc_refunded_discount_tax = $order_discount_amount = $order_discount_tax_amount = 0; // phpcs:ignore - $coupon_post_obj = ( function_exists( 'wpcom_vip_get_page_by_title' ) ) ? wpcom_vip_get_page_by_title( $item->get_name(), OBJECT, 'shop_coupon' ) : get_page_by_title( $item->get_name(), OBJECT, 'shop_coupon' );// phpcs:ignore - $coupon_id = isset( $coupon_post_obj->ID ) ? $coupon_post_obj->ID : ''; - $coupon = new WC_Coupon( $coupon_id ); - if ( is_callable( array( $this, 'get_order_item_meta' ) ) ) { - $sc_refunded_discount = $this->get_order_item_meta( $item_id, 'sc_refunded_discount', true ); - $sc_refunded_discount_tax = $this->get_order_item_meta( $item_id, 'sc_refunded_discount_tax', true ); - $order_discount_amount = $this->get_order_item_meta( $item_id, 'discount_amount', true ); - $order_discount_tax_amount = $this->get_order_item_meta( $item_id, 'discount_amount_tax', true ); - } - - if ( is_a( $coupon, 'WC_Coupon' ) ) { - if ( $coupon->is_type( 'smart_coupon' ) ) { - $get_order_total = ( is_object( $order ) && is_callable( array( $order, 'get_total' ) ) ) ? $order->get_total() : 0; - $refunded_order_total = ( is_object( $order ) && is_callable( array( $order, 'get_total_refunded' ) ) ) ? $order->get_total_refunded() : 0; - if ( empty( $get_order_total ) && empty( $sc_refunded_discount_tax ) && empty( $order_discount_tax_amount ) && $order_discount_amount !== $sc_refunded_discount ) { - return false; - } elseif ( empty( $get_order_total ) && ! empty( $sc_refunded_discount_tax ) && ! empty( $order_discount_tax_amount ) && $order_discount_amount !== $sc_refunded_discount && $sc_refunded_discount_tax !== $order_discount_tax_amount ) { - return false; - } elseif ( ! empty( $get_order_total ) && empty( $sc_refunded_discount_tax ) && empty( $order_discount_tax_amount ) && $get_order_total === $refunded_order_total && $order_discount_amount !== $sc_refunded_discount ) { - return false; - } elseif ( ! empty( $get_order_total ) && ! empty( $sc_refunded_discount_tax ) && ! empty( $order_discount_tax_amount ) && $get_order_total === $refunded_order_total && $order_discount_amount !== $sc_refunded_discount && $sc_refunded_discount_tax !== $order_discount_tax_amount ) { - return false; - } elseif ( empty( $sc_refunded_discount_tax ) && ! empty( $order_discount_tax_amount ) ) { - return false; - } - } - } - } - } - return $status; - } - } -} -WC_SC_Coupon_Refund_Process::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-excluded-email.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-excluded-email.php deleted file mode 100644 index 507ec563..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-excluded-email.php +++ /dev/null @@ -1,343 +0,0 @@ -get_meta( 'wc_sc_excluded_customer_email' ) : get_post_meta( $coupon_id, 'wc_sc_excluded_customer_email', true ); - - if ( ! is_array( $excluded_emails ) || empty( $excluded_emails ) ) { - $excluded_emails = array(); - } - - woocommerce_wp_text_input( - array( - 'id' => 'wc_sc_excluded_customer_email', - 'label' => __( 'Excluded emails', 'woocommerce-smart-coupons' ), - 'placeholder' => __( 'No restrictions', 'woocommerce-smart-coupons' ), - 'description' => __( 'List of excluded billing emails to check against when an order is placed. Separate email addresses with commas. You can also use an asterisk (*) to match parts of an email. For example "*@gmail.com" would match all gmail addresses.', 'woocommerce-smart-coupons' ), - 'value' => implode( ', ', $excluded_emails ), - 'desc_tip' => true, - 'type' => 'email', - 'class' => '', - 'custom_attributes' => array( - 'multiple' => 'multiple', - ), - ) - ); - - } - - /** - * Save coupon by excluded email data in meta - * - * @param Integer $post_id The coupon post ID. - * @param WC_Coupon $coupon The coupon object. - */ - public function process_meta( $post_id = 0, $coupon = null ) { - if ( empty( $post_id ) ) { - return; - } - - if ( is_null( $coupon ) || ! is_a( $coupon, 'WC_Coupon' ) ) { - $coupon = new WC_Coupon( $post_id ); - } - - $excluded_emails = ( isset( $_POST['wc_sc_excluded_customer_email'] ) ) ? wc_clean( wp_unslash( $_POST['wc_sc_excluded_customer_email'] ) ) : ''; // phpcs:ignore - $excluded_emails = explode( ',', $excluded_emails ); - $excluded_emails = array_map( 'trim', $excluded_emails ); - $excluded_emails = array_filter( $excluded_emails, 'is_email' ); - $excluded_emails = array_filter( $excluded_emails ); - - if ( $this->is_callable( $coupon, 'update_meta_data' ) && $this->is_callable( $coupon, 'save' ) ) { - $coupon->update_meta_data( 'wc_sc_excluded_customer_email', $excluded_emails ); - $coupon->save(); - } else { - update_post_meta( $post_id, 'wc_sc_excluded_customer_email', $excluded_emails ); - } - - } - - /** - * Now that we have billing email, check if the coupon is excluded to be used for the user or billing email - * - * Credit: WooCommerce - * - * @param array $posted Post data. - */ - public function check_customer_coupons( $posted = array() ) { - $cart = ( function_exists( 'WC' ) && isset( WC()->cart ) ) ? WC()->cart : null; - if ( is_a( $cart, 'WC_Cart' ) ) { - $is_cart_empty = is_callable( array( $cart, 'is_empty' ) ) && $cart->is_empty(); - if ( false === $is_cart_empty ) { - $applied_coupons = ( is_callable( array( $cart, 'get_applied_coupons' ) ) ) ? $cart->get_applied_coupons() : array(); - if ( ! empty( $applied_coupons ) ) { - foreach ( $applied_coupons as $code ) { - $coupon = new WC_Coupon( $code ); - - if ( is_object( $coupon ) && is_callable( array( $coupon, 'is_valid' ) ) && $coupon->is_valid() ) { - - // Get user and posted emails to compare. - $current_user = wp_get_current_user(); - $billing_email = isset( $posted['billing_email'] ) ? $posted['billing_email'] : ''; - $check_emails = array_unique( - array_filter( - array_map( - 'strtolower', - array_map( - 'sanitize_email', - array( - $billing_email, - $current_user->user_email, - ) - ) - ) - ) - ); - - if ( is_object( $coupon ) && is_callable( array( $coupon, 'get_meta' ) ) ) { - $exclude_restrictions = $coupon->get_meta( 'wc_sc_excluded_customer_email' ); - } else { - if ( is_object( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) { - $coupon_id = $coupon->get_id(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - } - $exclude_restrictions = ( ! empty( $coupon_id ) ) ? get_post_meta( $coupon_id, 'wc_sc_excluded_customer_email', true ) : array(); - } - - if ( is_array( $exclude_restrictions ) && 0 < count( $exclude_restrictions ) && is_callable( array( $coupon, 'add_coupon_message' ) ) && is_callable( array( $cart, 'remove_coupon' ) ) && is_callable( array( $cart, 'is_coupon_emails_allowed' ) ) && $cart->is_coupon_emails_allowed( $check_emails, $exclude_restrictions ) ) { - $coupon->add_coupon_message( WC_Coupon::E_WC_COUPON_NOT_YOURS_REMOVED ); - $cart->remove_coupon( $code ); - } - - /* - |===========================================================================================================================================================================| - | | - | Before this method, WooCommerce checks for Allowed emails. | - | And in that method, it already checks for the usage limit whether it is allowed to apply the coupon or not. | - | 1. If it's allowed, it means the usage limit is within reach & we can proceed with checking for excluded email. | - | Because the main purpose of excluded email is to prevent application of coupon. And since the usage limit is already checked, it's not needed to check it again | - | 2. If it's not allowed, the process will not reach in this method, as it's already invalidated. | - | | - |===========================================================================================================================================================================| - */ - } - } - } - } - } - } - - /** - * Add meta in export headers - * - * @param array $headers Existing headers. - * @return array - */ - public function export_headers( $headers = array() ) { - - $headers['wc_sc_excluded_customer_email'] = __( 'Excluded emails', 'woocommerce-smart-coupons' ); - - return $headers; - - } - - /** - * Post meta defaults for excluded email ids meta - * - * @param array $defaults Existing postmeta defaults. - * @return array $defaults Modified postmeta defaults - */ - public function postmeta_defaults( $defaults = array() ) { - - $defaults['wc_sc_excluded_customer_email'] = ''; - - return $defaults; - } - - /** - * Make meta data of excluded email ids protected - * - * @param bool $protected Is protected. - * @param string $meta_key The meta key. - * @param string $meta_type The meta type. - * @return bool $protected - */ - public function make_action_meta_protected( $protected = false, $meta_key = '', $meta_type = '' ) { - - $sc_excluded_email_keys = array( - 'wc_sc_excluded_customer_email', - ); - - if ( in_array( $meta_key, $sc_excluded_email_keys, true ) ) { - return true; - } - - return $protected; - } - - /** - * Add excluded email in coupon meta - * - * @param array $data The row data. - * @param array $post The POST values. - * @return array Modified data - */ - public function generate_coupon_meta( $data = array(), $post = array() ) { - - $excluded_emails = ( isset( $post['wc_sc_excluded_customer_email'] ) ) ? wc_clean( wp_unslash( $post['wc_sc_excluded_customer_email'] ) ) : ''; // phpcs:ignore - $excluded_emails = explode( ',', $excluded_emails ); - $excluded_emails = array_map( 'trim', $excluded_emails ); - $excluded_emails = array_filter( $excluded_emails, 'is_email' ); - $excluded_emails = array_filter( $excluded_emails ); - $excluded_emails = implode( ',', $excluded_emails ); - - $data['wc_sc_excluded_customer_email'] = $excluded_emails; - - return $data; - } - - /** - * Process coupon meta value for import - * - * @param mixed $meta_value The meta value. - * @param array $args Additional Arguments. - * @return mixed $meta_value - */ - public function import_coupon_meta( $meta_value = null, $args = array() ) { - if ( ! empty( $args['meta_key'] ) && 'wc_sc_excluded_customer_email' === $args['meta_key'] ) { - $excluded_emails = ( isset( $args['postmeta']['wc_sc_excluded_customer_email'] ) ) ? wc_clean( wp_unslash( $args['postmeta']['wc_sc_excluded_customer_email'] ) ) : ''; // phpcs:ignore - $excluded_emails = explode( ',', $excluded_emails ); - $excluded_emails = array_map( 'trim', $excluded_emails ); - $excluded_emails = array_filter( $excluded_emails, 'is_email' ); - $meta_value = array_filter( $excluded_emails ); - } - return $meta_value; - } - - /** - * Function to copy excluded email meta in newly generated coupon - * - * @param array $args The arguments. - */ - public function copy_coupon_meta( $args = array() ) { - - $new_coupon_id = ( ! empty( $args['new_coupon_id'] ) ) ? absint( $args['new_coupon_id'] ) : 0; - $coupon = ( ! empty( $args['ref_coupon'] ) ) ? $args['ref_coupon'] : false; - - if ( empty( $new_coupon_id ) || empty( $coupon ) ) { - return; - } - - if ( $this->is_wc_gte_30() && is_object( $coupon ) && is_callable( array( $coupon, 'get_meta' ) ) ) { - $excluded_emails = $coupon->get_meta( 'wc_sc_excluded_customer_email' ); - } else { - $old_coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $excluded_emails = get_post_meta( $old_coupon_id, 'wc_sc_excluded_customer_email', true ); - } - - if ( ! is_array( $excluded_emails ) || empty( $excluded_emails ) ) { - $excluded_emails = array(); - } - - $new_coupon = new WC_Coupon( $new_coupon_id ); - - if ( is_object( $new_coupon ) && is_callable( array( $new_coupon, 'update_meta_data' ) ) && is_callable( array( $new_coupon, 'save' ) ) ) { - $new_coupon->update_meta_data( 'wc_sc_excluded_customer_email', $excluded_emails ); - $new_coupon->save(); - } else { - update_post_meta( $new_coupon_id, 'wc_sc_excluded_customer_email', $excluded_emails ); - } - - } - } -} - -WC_SC_Coupons_By_Excluded_Email::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-location.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-location.php deleted file mode 100644 index 36082df0..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-location.php +++ /dev/null @@ -1,642 +0,0 @@ -global_additional_locations ) ) { - $this->global_additional_locations = get_option( 'sa_cbl_additional_locations', array() ); - } - } - - /** - * Styles & scripts - */ - public function enqueue_admin_javascript_css() { - - global $woocommerce_smart_coupon; - - $post_type = get_post_type(); - $get_page = ( ! empty( $_GET['page'] ) ) ? wc_clean( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore - - if ( 'shop_coupon' !== $post_type && 'wc-smart-coupons' !== $get_page ) { - return; - } - - $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; - - // Add customized chosen javascript library for adding new location from same field. - wp_register_script( 'sa_coupons_by_location_chosen', plugins_url( '/', dirname( __FILE__ ) ) . 'assets/js/chosen.jquery' . $suffix . '.js', array( 'jquery' ), $woocommerce_smart_coupon->plugin_data['Version'], true ); - wp_enqueue_style( 'sa_coupons_by_location_css', plugins_url( '/', dirname( __FILE__ ) ) . 'assets/css/cbl-admin' . $suffix . '.css', array(), $woocommerce_smart_coupon->plugin_data['Version'] ); - - } - - /** - * Display field for coupon by location - */ - public function usage_restriction() { - global $post; - - if ( ! wp_script_is( 'sa_coupons_by_location_chosen' ) ) { - wp_enqueue_script( 'sa_coupons_by_location_chosen' ); - } - - $coupon = ( ! empty( $post->ID ) ) ? new WC_Coupon( $post->ID ) : null; - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - - $this->locations_lookup_in = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'sa_cbl_locations_lookup_in' ) : get_post_meta( $post->ID, 'sa_cbl_locations_lookup_in', true ); - if ( ! is_array( $this->locations_lookup_in ) || empty( $this->locations_lookup_in ) ) { - $this->locations_lookup_in = array( 'address' => 'billing' ); - $this->update_post_meta( $post->ID, 'sa_cbl_locations_lookup_in', $this->locations_lookup_in ); - } - - $this->address = $this->locations_lookup_in['address']; - - ?> - -
            -

            - -   - -

            -

            - - get_meta( 'sa_cbl_' . $this->address . '_locations' ) : get_post_meta( $post->ID, 'sa_cbl_' . $this->address . '_locations', true ); - if ( empty( $locations ) || ! is_array( $locations ) ) { - $locations = array(); - } - if ( ! array_key_exists( 'additional_locations', $locations ) || ! is_array( $locations['additional_locations'] ) ) { - $locations['additional_locations'] = array(); - } - $this->additional_locations = array_map( 'html_entity_decode', array_map( 'strtolower', $locations['additional_locations'] ) ); - $this->countries = array_map( 'strtolower', WC()->countries->countries ); - - echo ''; - ?> -

            - -
            - locations_lookup_in['address'] = ( ! empty( $_POST['sa_cbl_search_in']['address'] ) ) ? wc_clean( wp_unslash( $_POST['sa_cbl_search_in']['address'] ) ) : ''; // phpcs:ignore - - if ( $this->is_callable( $coupon, 'update_meta_data' ) && $this->is_callable( $coupon, 'save' ) ) { - $coupon->update_meta_data( 'sa_cbl_' . $this->locations_lookup_in['address'] . '_locations', $locations ); - if ( isset( $this->locations_lookup_in['address'] ) && ! empty( $this->locations_lookup_in['address'] ) ) { - $coupon->update_meta_data( 'sa_cbl_locations_lookup_in', $this->locations_lookup_in ); - } - $coupon->save(); - } else { - update_post_meta( $post_id, 'sa_cbl_' . $this->locations_lookup_in['address'] . '_locations', $locations ); - if ( isset( $this->locations_lookup_in['address'] ) && ! empty( $this->locations_lookup_in['address'] ) ) { - update_post_meta( $post_id, 'sa_cbl_locations_lookup_in', $this->locations_lookup_in ); - } - } - - $this->countries = array_map( 'strtolower', WC()->countries->countries ); - if ( ! empty( $locations['additional_locations'] ) ) { - $this->additional_locations = array_map( 'strtolower', $locations['additional_locations'] ); - } - - if ( count( $this->additional_locations ) > 0 ) { - - // Loop through all location entered in Billing location of coupons. - // and collect those location which is not available in WooCommerce countries. - foreach ( $this->additional_locations as $location ) { - if ( ! in_array( $location, $this->countries, true ) ) { - $this->custom_locations[] = strtolower( $location ); - } - } - - // Add new location with already saved locations. - if ( false !== $this->global_additional_locations && ! empty( $this->global_additional_locations ) ) { - $this->global_additional_locations = array_merge( $this->global_additional_locations, $this->custom_locations ); - } else { - $this->global_additional_locations = $this->custom_locations; - } - - // Discard duplicate values, arrange alphabetically & save. - $this->global_additional_locations = array_unique( $this->global_additional_locations ); - sort( $this->global_additional_locations ); - update_option( 'sa_cbl_additional_locations', $this->global_additional_locations, 'no' ); - } - - } - - /** - * Validate the coupon based on location - * - * @param boolean $valid Is valid or not. - * @param WC_Coupon $coupon The coupon object. - * - * @throws Exception If the coupon is invalid. - * @return boolean Is valid or not - */ - public function validate( $valid, $coupon ) { - global $checkout; - - // If coupon is invalid already, no need for further checks. - if ( ! $valid ) { - return $valid; - } - - $coupon_id = ( $this->is_wc_gte_30() ) ? $coupon->get_id() : $coupon->id; - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - - $this->locations_lookup_in = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'sa_cbl_locations_lookup_in' ) : get_post_meta( $coupon_id, 'sa_cbl_locations_lookup_in', true ); - - if ( empty( $this->locations_lookup_in ) || empty( $this->locations_lookup_in['address'] ) ) { - return $valid; - } - - $locations = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'sa_cbl_' . $this->locations_lookup_in['address'] . '_locations' ) : get_post_meta( $coupon_id, 'sa_cbl_' . $this->locations_lookup_in['address'] . '_locations', true ); - - if ( ! empty( $locations ) && is_array( $locations ) && ! empty( $locations['additional_locations'] ) && is_array( $locations['additional_locations'] ) && array_key_exists( 'additional_locations', $locations ) ) { - - $wc_customer = WC()->customer; - $wc_countries = WC()->countries; - - // Collect country, state & city. - if ( 'billing' === $this->locations_lookup_in['address'] ) { - - if ( $this->is_wc_gte_30() ) { - $customer_billing_country = $wc_customer->get_billing_country(); - $customer_billing_state = $wc_customer->get_billing_state(); - $customer_billing_city = $wc_customer->get_billing_city(); - $customer_billing_postcode = $wc_customer->get_billing_postcode(); - - $current_country = ( ! empty( $customer_billing_country ) ) ? $customer_billing_country : ''; - $current_state = ( ! empty( $customer_billing_state ) ) ? $customer_billing_state : ''; - $current_city = ( ! empty( $customer_billing_city ) ) ? $customer_billing_city : ''; - $current_post_code = ( ! empty( $customer_billing_postcode ) ) ? $customer_billing_postcode : ''; - } else { - $current_country = ( ! empty( $wc_customer->country ) ) ? $wc_customer->country : ''; - $current_state = ( ! empty( $wc_customer->state ) ) ? $wc_customer->state : ''; - $current_city = ( ! empty( $wc_customer->city ) ) ? $wc_customer->city : ''; - $current_post_code = ( ! empty( $wc_customer->postcode ) ) ? $wc_customer->postcode : ''; - } - } else { - if ( $this->is_wc_gte_30() ) { - $customer_shipping_country = $wc_customer->get_shipping_country(); - $customer_shipping_state = $wc_customer->get_shipping_state(); - $customer_shipping_city = $wc_customer->get_shipping_city(); - $customer_shipping_postcode = $wc_customer->get_shipping_postcode(); - - $current_country = ( ! empty( $customer_shipping_country ) ) ? $customer_shipping_country : ''; - $current_state = ( ! empty( $customer_shipping_state ) ) ? $customer_shipping_state : ''; - $current_city = ( ! empty( $customer_shipping_city ) ) ? $customer_shipping_city : ''; - $current_post_code = ( ! empty( $customer_shipping_postcode ) ) ? $customer_shipping_postcode : ''; - } else { - $current_country = ( ! empty( $wc_customer->shipping_country ) ) ? $wc_customer->shipping_country : ''; - $current_state = ( ! empty( $wc_customer->shipping_state ) ) ? $wc_customer->shipping_state : ''; - $current_city = ( ! empty( $wc_customer->shipping_city ) ) ? $wc_customer->shipping_city : ''; - $current_post_code = ( ! empty( $wc_customer->shipping_postcode ) ) ? $wc_customer->shipping_postcode : ''; - } - } - - // Convert country code or state code to actual country & state. - $country = ( ! empty( $wc_countries->countries[ $current_country ] ) ) ? strtolower( $wc_countries->countries[ $current_country ] ) : ''; - $state = ( ! empty( $wc_countries->states[ $current_country ][ $current_state ] ) ) ? strtolower( $wc_countries->states[ $current_country ][ $current_state ] ) : strtolower( $current_state ); - $city = ( ! empty( $current_city ) ) ? strtolower( $current_city ) : ''; - $post_code = ( ! empty( $current_post_code ) ) ? strtolower( $current_post_code ) : ''; - - // Loop through additional_locations and return true on matching with either country, state or city. - // Return false otherwise. - foreach ( $locations['additional_locations'] as $additional_location ) { - if ( $country === $additional_location || $state === $additional_location || $city === $additional_location || $post_code === $additional_location ) { - return true; - } - } - throw new Exception( __( 'Coupon is not valid for the', 'woocommerce-smart-coupons' ) . ' ' . ( ( 'billing' === $this->locations_lookup_in['address'] ) ? __( 'billing address', 'woocommerce-smart-coupons' ) : __( 'shipping address', 'woocommerce-smart-coupons' ) ) ); - } - - return $valid; - } - - /** - * Add meta in export headers - * - * @param array $headers Existing headers. - * @return array - */ - public function export_headers( $headers = array() ) { - - $cbl_headers = array( - 'sa_cbl_locations_lookup_in' => __( 'Locations lookup in', 'woocommerce-smart-coupons' ), - 'sa_cbl_billing_locations' => __( 'Billing Locations', 'woocommerce-smart-coupons' ), - 'sa_cbl_shipping_locations' => __( 'Shipping Locations', 'woocommerce-smart-coupons' ), - ); - - return array_merge( $headers, $cbl_headers ); - - } - - /** - * Function to handle coupon meta data during export of existing coupons - * - * @param mixed $meta_value The meta value. - * @param array $args Additional arguments. - * @return string Processed meta value - */ - public function export_coupon_meta_data( $meta_value = '', $args = array() ) { - - if ( ! empty( $args['meta_key'] ) && in_array( $args['meta_key'], array( 'sa_cbl_billing_locations', 'sa_cbl_shipping_locations' ), true ) ) { - switch ( $args['meta_key'] ) { - case 'sa_cbl_billing_locations': - case 'sa_cbl_shipping_locations': - $meta_value = ( ! empty( $meta_value['additional_locations'] ) ) ? implode( '|', wc_clean( wp_unslash( $meta_value['additional_locations'] ) ) ) : ''; - break; - } - } - - return $meta_value; - - } - - /** - * Post meta defaults for CBL's meta - * - * @param array $defaults Existing postmeta defaults. - * @return array - */ - public function postmeta_defaults( $defaults = array() ) { - - $cbl_defaults = array( - 'sa_cbl_locations_lookup_in' => '', - 'sa_cbl_billing_locations' => '', - 'sa_cbl_shipping_locations' => '', - ); - - return array_merge( $defaults, $cbl_defaults ); - } - - /** - * Add CBL's meta with value in coupon meta - * - * @param array $data The row data. - * @param array $post The POST values. - * @return array Modified data - */ - public function generate_coupon_meta( $data = array(), $post = array() ) { - - $data['sa_cbl_locations_lookup_in'] = ( ! empty( $post['sa_cbl_search_in']['address'] ) ) ? wc_clean( wp_unslash( $post['sa_cbl_search_in']['address'] ) ) : ''; - $data['sa_cbl_billing_locations'] = ( ! empty( $data['sa_cbl_locations_lookup_in'] ) && 'billing' === $data['sa_cbl_locations_lookup_in'] && ! empty( $post['locations']['additional_locations'] ) && is_array( $post['locations']['additional_locations'] ) ) ? implode( '|', wc_clean( wp_unslash( $post['locations']['additional_locations'] ) ) ) : ''; - $data['sa_cbl_shipping_locations'] = ( ! empty( $data['sa_cbl_locations_lookup_in'] ) && 'shipping' === $data['sa_cbl_locations_lookup_in'] && ! empty( $post['locations']['additional_locations'] ) && is_array( $post['locations']['additional_locations'] ) ) ? implode( '|', wc_clean( wp_unslash( $post['locations']['additional_locations'] ) ) ) : ''; - - if ( ! empty( $post['locations']['additional_locations'] ) ) { - $additional_locations = wc_clean( wp_unslash( $post['locations']['additional_locations'] ) ); - $this->update_global_additional_locations( $additional_locations ); - } - - return $data; - } - - /** - * Make meta data of SC CBL, protected - * - * @param bool $protected Is protected. - * @param string $meta_key The meta key. - * @param string $meta_type The meta type. - * @return bool $protected - */ - public function make_action_meta_protected( $protected, $meta_key, $meta_type ) { - $sc_meta = array( - 'sa_cbl_locations_lookup_in' => '', - 'sa_cbl_billing_locations' => '', - 'sa_cbl_shipping_locations' => '', - ); - if ( in_array( $meta_key, $sc_meta, true ) ) { - return true; - } - return $protected; - } - - /** - * Function to copy CBL meta in newly generated coupon - * - * @param array $args The arguments. - */ - public function copy_coupon_action_meta( $args = array() ) { - - $new_coupon_id = ( ! empty( $args['new_coupon_id'] ) ) ? absint( $args['new_coupon_id'] ) : 0; - $coupon = ( ! empty( $args['ref_coupon'] ) ) ? $args['ref_coupon'] : false; - - if ( empty( $new_coupon_id ) || empty( $coupon ) ) { - return; - } - - if ( $this->is_wc_gte_30() ) { - $locations_lookup_in = $coupon->get_meta( 'sa_cbl_locations_lookup_in' ); - $billing_locations = $coupon->get_meta( 'sa_cbl_billing_locations' ); - $shipping_locations = $coupon->get_meta( 'sa_cbl_shipping_locations' ); - } else { - $old_coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $locations_lookup_in = get_post_meta( $old_coupon_id, 'sa_cbl_locations_lookup_in', true ); - $billing_locations = get_post_meta( $old_coupon_id, 'sa_cbl_billing_locations', true ); - $shipping_locations = get_post_meta( $old_coupon_id, 'sa_cbl_shipping_locations', true ); - } - - $new_coupon = new WC_Coupon( $new_coupon_id ); - - if ( $this->is_callable( $new_coupon, 'update_meta_data' ) && $this->is_callable( $new_coupon, 'save' ) ) { - $new_coupon->update_meta_data( 'sa_cbl_locations_lookup_in', $locations_lookup_in ); - $new_coupon->update_meta_data( 'sa_cbl_billing_locations', $billing_locations ); - $new_coupon->update_meta_data( 'sa_cbl_shipping_locations', $shipping_locations ); - $new_coupon->save(); - } else { - update_post_meta( $new_coupon_id, 'sa_cbl_locations_lookup_in', $locations_lookup_in ); - update_post_meta( $new_coupon_id, 'sa_cbl_billing_locations', $billing_locations ); - update_post_meta( $new_coupon_id, 'sa_cbl_shipping_locations', $shipping_locations ); - } - - if ( ! empty( $billing_locations['additional_locations'] ) ) { - $this->update_global_additional_locations( $billing_locations['additional_locations'] ); - } - - if ( ! empty( $shipping_locations['additional_locations'] ) ) { - $this->update_global_additional_locations( $shipping_locations['additional_locations'] ); - } - - } - - /** - * Process coupon meta value for import - * - * @param mixed $meta_value The meta value. - * @param array $args Additional Arguments. - * @return mixed $meta_value - */ - public function process_coupon_meta_value_for_import( $meta_value = null, $args = array() ) { - - if ( ! empty( $args['meta_key'] ) && in_array( $args['meta_key'], array( 'sa_cbl_locations_lookup_in', 'sa_cbl_billing_locations', 'sa_cbl_shipping_locations' ), true ) ) { - switch ( $args['meta_key'] ) { - case 'sa_cbl_locations_lookup_in': - $meta_value = ( ! empty( $args['postmeta']['sa_cbl_locations_lookup_in'] ) ) ? array( 'address' => wc_clean( wp_unslash( $args['postmeta']['sa_cbl_locations_lookup_in'] ) ) ) : array(); - break; - case 'sa_cbl_billing_locations': - $meta_value = ( ! empty( $args['postmeta']['sa_cbl_billing_locations'] ) ) ? array( 'additional_locations' => explode( '|', wc_clean( wp_unslash( $args['postmeta']['sa_cbl_billing_locations'] ) ) ) ) : array(); - break; - case 'sa_cbl_shipping_locations': - $meta_value = ( ! empty( $args['postmeta']['sa_cbl_shipping_locations'] ) ) ? array( 'additional_locations' => explode( '|', wc_clean( wp_unslash( $args['postmeta']['sa_cbl_shipping_locations'] ) ) ) ) : array(); - break; - } - if ( in_array( $args['meta_key'], array( 'sa_cbl_billing_locations', 'sa_cbl_shipping_locations' ), true ) && ! empty( $meta_value['additional_locations'] ) ) { - $this->update_global_additional_locations( $meta_value['additional_locations'] ); - } - } - - return $meta_value; - } - - /** - * Update global additional locations - * - * @param array $additional_locations The locations. - */ - public function update_global_additional_locations( $additional_locations = array() ) { - - if ( empty( $additional_locations ) ) { - return; - } - - $additional_locations = array_map( 'strtolower', $additional_locations ); - $wc_countries = array_map( 'strtolower', WC()->countries->countries ); - - foreach ( $wc_countries as $index => $country ) { - $encoding = $this->mb_detect_encoding( $country, 'UTF-8, ISO-8859-1', true ); - $wc_countries[ $index ] = ( false !== $encoding ) ? html_entity_decode( $country, ENT_COMPAT, $encoding ) : $country; - } - - if ( count( $additional_locations ) > 0 ) { - - $custom_locations = array(); - - // Loop through all location entered in Billing location of coupons. - // and collect those location which is not available in WooCommerce countries. - foreach ( $additional_locations as $location ) { - if ( ! in_array( $location, $wc_countries, true ) ) { - $custom_locations[] = $location; - } - } - - $global_additional_locations = ( ! empty( $this->global_additional_locations ) ) ? $this->global_additional_locations : get_option( 'sa_cbl_additional_locations', array() ); - - // Add new location with already saved locations. - if ( false !== $global_additional_locations && ! empty( $global_additional_locations ) ) { - $global_additional_locations = array_merge( $global_additional_locations, $custom_locations ); - } else { - $global_additional_locations = $custom_locations; - } - - // Discard duplicate values, arrange alphabetically & save. - $global_additional_locations = array_unique( $global_additional_locations ); - sort( $global_additional_locations ); - update_option( 'sa_cbl_additional_locations', $global_additional_locations, 'no' ); - } - - } - - } -} - -WC_SC_Coupons_By_Location::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-payment-method.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-payment-method.php deleted file mode 100644 index 65492049..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-payment-method.php +++ /dev/null @@ -1,378 +0,0 @@ -get_post_meta( $coupon_id, 'wc_sc_payment_method_ids', true ); - if ( empty( $payment_method_ids ) || ! is_array( $payment_method_ids ) ) { - $payment_method_ids = array(); - } - } - $available_payment_methods = WC()->payment_gateways->get_available_payment_gateways(); - ?> -
            -

            - - - -

            -
            - is_callable( $coupon, 'update_meta_data' ) && $this->is_callable( $coupon, 'save' ) ) { - $coupon->update_meta_data( 'wc_sc_payment_method_ids', $payment_method_ids ); - $coupon->save(); - } else { - $this->update_post_meta( $post_id, 'wc_sc_payment_method_ids', $payment_method_ids ); - } - } - - /** - * Validate the coupon based on payment method - * - * @param boolean $valid Is valid or not. - * @param WC_Coupon $coupon The coupon object. - * @param WC_Discounts $discounts The discount object. - * - * @throws Exception If the coupon is invalid. - * @return boolean Is valid or not - */ - public function validate( $valid = false, $coupon = object, $discounts = object ) { - - // If coupon is already invalid, no need for further checks. - if ( false === $valid ) { - return $valid; - } - - if ( ! is_a( $coupon, 'WC_Coupon' ) ) { - return $valid; - } - - if ( ! is_a( $discounts, 'WC_Discounts' ) ) { - return $valid; - } - - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - $coupon_code = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - if ( empty( $coupon_id ) ) { - return $valid; - } - - $payment_method_ids = $this->get_post_meta( $coupon_id, 'wc_sc_payment_method_ids', true ); - $cart_or_order_object = is_callable( array( $discounts, 'get_object' ) ) ? $discounts->get_object() : null; - $is_wc_session = is_a( $cart_or_order_object, 'WC_Cart' ) && function_exists( 'WC' ) && isset( WC()->session ) && is_object( WC()->session ); - - if ( is_array( $payment_method_ids ) && ! empty( $payment_method_ids ) ) { - $payment_titles = $this->get_payment_method_titles_by_ids( $payment_method_ids ); - $chosen_payment_method = ''; - if ( is_a( $cart_or_order_object, 'WC_Order' ) ) { - $chosen_payment_method = is_callable( array( $cart_or_order_object, 'get_payment_method' ) ) ? $cart_or_order_object->get_payment_method() : ''; - } elseif ( true === $is_wc_session ) { - $chosen_payment_method = ( WC()->session->__isset( 'chosen_payment_method' ) ) ? WC()->session->get( 'chosen_payment_method' ) : ''; - } - if ( ! in_array( $chosen_payment_method, $payment_method_ids, true ) ) { - if ( true === $is_wc_session && is_callable( array( WC()->session, 'set' ) ) ) { - WC()->session->set( 'wc_sc_reload_payment_method', 'yes' ); - } - /* translators: 1. The coupon code 2. The text 'payment method/s' 3. List of payment method names 4. Link to the checkout page */ - throw new Exception( sprintf( __( 'Coupon code %1$s is valid only for %2$s: %3$s. You can change payment method from the %4$s page.', 'woocommerce-smart-coupons' ), '' . $coupon_code . '', _n( 'payment method', 'payment methods', count( $payment_titles ), 'woocommerce-smart-coupons' ), '"' . implode( '", "', $payment_titles ) . '"', '' . __( 'Checkout', 'woocommerce-smart-coupons' ) . '' ) ); - } - if ( true === $is_wc_session && is_callable( array( WC()->session, 'set' ) ) ) { - WC()->session->set( 'wc_sc_reload_payment_method', 'no' ); - } - } - - return $valid; - - } - - /** - * Add meta in export headers - * - * @param array $headers Existing headers. - * @return array - */ - public function export_headers( $headers = array() ) { - - $headers['wc_sc_payment_method_ids'] = __( 'Payment methods', 'woocommerce-smart-coupons' ); - - return $headers; - - } - - /** - * Function to handle coupon meta data during export of existing coupons - * - * @param mixed $meta_value The meta value. - * @param array $args Additional arguments. - * @return string Processed meta value - */ - public function export_coupon_meta_data( $meta_value = '', $args = array() ) { - - if ( ! empty( $args['meta_key'] ) && 'wc_sc_payment_method_ids' === $args['meta_key'] ) { - if ( isset( $args['meta_value'] ) && ! empty( $args['meta_value'] ) ) { - $payment_method_ids = maybe_unserialize( stripslashes( $args['meta_value'] ) ); - if ( is_array( $payment_method_ids ) && ! empty( $payment_method_ids ) ) { - $payment_method_titles = $this->get_payment_method_titles_by_ids( $payment_method_ids ); - if ( is_array( $payment_method_titles ) && ! empty( $payment_method_titles ) ) { - $meta_value = implode( '|', wc_clean( wp_unslash( $payment_method_titles ) ) ); // Replace payment method ids with their respective method titles. - } - } - } - } - - return $meta_value; - - } - - /** - * Post meta defaults for payment method ids meta - * - * @param array $defaults Existing postmeta defaults. - * @return array $defaults Modified postmeta defaults - */ - public function postmeta_defaults( $defaults = array() ) { - - $defaults['wc_sc_payment_method_ids'] = ''; - - return $defaults; - } - - /** - * Add payment method's meta with value in coupon meta - * - * @param array $data The row data. - * @param array $post The POST values. - * @return array $data Modified row data - */ - public function generate_coupon_meta( $data = array(), $post = array() ) { - - $payment_method_titles = ''; - - if ( ! empty( $post['wc_sc_payment_method_ids'] ) && is_array( $post['wc_sc_payment_method_ids'] ) ) { - $payment_method_titles = $this->get_payment_method_titles_by_ids( $post['wc_sc_payment_method_ids'] ); - if ( is_array( $payment_method_titles ) && ! empty( $payment_method_titles ) ) { - $payment_method_titles = implode( '|', wc_clean( wp_unslash( $payment_method_titles ) ) ); - } - } - - $data['wc_sc_payment_method_ids'] = $payment_method_titles; // Replace payment method ids with their respective method titles. - - return $data; - } - - /** - * Function to get payment method titles for given payment method ids - * - * @param array $payment_method_ids ids of payment methods. - * @return array $payment_method_titles titles of payment methods - */ - public function get_payment_method_titles_by_ids( $payment_method_ids = array() ) { - - $payment_method_titles = array(); - - if ( is_array( $payment_method_ids ) && ! empty( $payment_method_ids ) ) { - $available_payment_methods = WC()->payment_gateways->get_available_payment_gateways(); - foreach ( $payment_method_ids as $index => $payment_method_id ) { - $payment_method = ( isset( $available_payment_methods[ $payment_method_id ] ) && ! empty( $available_payment_methods[ $payment_method_id ] ) ) ? $available_payment_methods[ $payment_method_id ] : ''; - if ( ! empty( $payment_method ) && is_a( $payment_method, 'WC_Payment_Gateway' ) ) { - $payment_method_title = is_callable( array( $payment_method, 'get_title' ) ) ? $payment_method->get_title() : ''; - if ( ! empty( $payment_method_title ) ) { - $payment_method_titles[ $index ] = $payment_method_title; // Replace payment method id with it's repective title. - } else { - $payment_method_titles[ $index ] = $payment_method->id; // In case of empty payment method title replace it with method id. - } - } - } - } - - return $payment_method_titles; - } - - /** - * Process coupon meta value for import - * - * @param mixed $meta_value The meta value. - * @param array $args Additional Arguments. - * @return mixed $meta_value - */ - public function process_coupon_meta_value_for_import( $meta_value = null, $args = array() ) { - - if ( ! empty( $args['meta_key'] ) && 'wc_sc_payment_method_ids' === $args['meta_key'] ) { - - $meta_value = ( ! empty( $args['postmeta']['wc_sc_payment_method_ids'] ) ) ? explode( '|', wc_clean( wp_unslash( $args['postmeta']['wc_sc_payment_method_ids'] ) ) ) : array(); - if ( is_array( $meta_value ) && ! empty( $meta_value ) ) { - $available_payment_methods = WC()->payment_gateways->get_available_payment_gateways(); - if ( is_array( $available_payment_methods ) && ! empty( $available_payment_methods ) ) { - foreach ( $meta_value as $index => $payment_method_title ) { - foreach ( $available_payment_methods as $payment_method ) { - $method_title = is_callable( array( $payment_method, 'get_title' ) ) ? $payment_method->get_title() : ''; - if ( $method_title === $payment_method_title && ! empty( $payment_method->id ) ) { - $meta_value[ $index ] = $payment_method->id; // Replace payment method title with it's respective id. - } - } - } - } - } - } - - return $meta_value; - } - - /** - * Function to copy payment method restriction meta in newly generated coupon - * - * @param array $args The arguments. - */ - public function copy_coupon_payment_method_meta( $args = array() ) { - - // Copy meta data to new coupon. - $this->copy_coupon_meta_data( - $args, - array( 'wc_sc_payment_method_ids' ) - ); - - } - - /** - * Make meta data of payment method ids protected - * - * @param bool $protected Is protected. - * @param string $meta_key The meta key. - * @param string $meta_type The meta type. - * @return bool $protected - */ - public function make_action_meta_protected( $protected = false, $meta_key = '', $meta_type = '' ) { - - if ( 'wc_sc_payment_method_ids' === $meta_key ) { - return true; - } - return $protected; - } - } -} - -WC_SC_Coupons_By_Payment_Method::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-product-attribute.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-product-attribute.php deleted file mode 100644 index e992c86a..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-product-attribute.php +++ /dev/null @@ -1,642 +0,0 @@ - $coupon_label ) { - if ( ! in_array( $coupon_type, $product_coupon_types, true ) ) { - $non_product_coupon_types[] = $coupon_label; - } - } - if ( ! empty( $non_product_coupon_types ) ) { - $non_product_coupon_types_label = '"' . implode( ', ', $non_product_coupon_types ) . '"'; - } else { - $non_product_coupon_types_label = ''; - } - if ( ! empty( $coupon_id ) ) { - $coupon = ( ! empty( $coupon_id ) ) ? new WC_Coupon( $coupon_id ) : null; - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - - $product_attribute_ids = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'wc_sc_product_attribute_ids' ) : get_post_meta( $coupon_id, 'wc_sc_product_attribute_ids', true ); - if ( ! empty( $product_attribute_ids ) ) { - $product_attribute_ids = explode( '|', $product_attribute_ids ); - } else { - $product_attribute_ids = array(); - } - - $exclude_product_attribute_ids = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'wc_sc_exclude_product_attribute_ids' ) : get_post_meta( $coupon_id, 'wc_sc_exclude_product_attribute_ids', true ); - if ( ! empty( $exclude_product_attribute_ids ) ) { - $exclude_product_attribute_ids = explode( '|', $exclude_product_attribute_ids ); - } else { - $exclude_product_attribute_ids = array(); - } - } - - $attribute_taxonomies = wc_get_attribute_taxonomies(); - $attribute_options = array(); - $attribute_taxonomies_label = array(); - - if ( ! empty( $attribute_taxonomies ) && is_array( $attribute_taxonomies ) ) { - $attribute_taxonomies_name = array(); - foreach ( $attribute_taxonomies as $attribute_taxonomy ) { - $attribute_name = isset( $attribute_taxonomy->attribute_name ) ? $attribute_taxonomy->attribute_name : ''; - $attribute_label = isset( $attribute_taxonomy->attribute_label ) ? $attribute_taxonomy->attribute_label : ''; - if ( ! empty( $attribute_name ) && ! empty( $attribute_label ) ) { - $attribute_taxonomy_name = wc_attribute_taxonomy_name( $attribute_name ); - $attribute_taxonomies_name[] = $attribute_taxonomy_name; - $attribute_taxonomies_label[ $attribute_taxonomy_name ] = $attribute_label; - } - } - if ( ! empty( $attribute_taxonomies_name ) ) { - $args = array( - 'orderby' => 'name', - 'hide_empty' => 0, - ); - $args = apply_filters( 'woocommerce_product_attribute_terms', $args ); - if ( version_compare( $wp_version, '4.5.0', '>=' ) ) { - $attribute_taxonomies_terms = get_terms( - array_merge( - array( - 'taxonomy' => $attribute_taxonomies_name, - ), - $args - ) - ); - } else { - $attribute_taxonomies_terms = get_terms( $attribute_taxonomies_name, $args ); - } - if ( ! empty( $attribute_taxonomies_terms ) && is_array( $attribute_taxonomies_terms ) ) { - foreach ( $attribute_taxonomies_terms as $attribute_taxonomy_term ) { - $attribute_taxonomy = $attribute_taxonomy_term->taxonomy; - $attribute_taxonomy_label = isset( $attribute_taxonomies_label[ $attribute_taxonomy ] ) ? $attribute_taxonomies_label[ $attribute_taxonomy ] : ''; - if ( empty( $attribute_taxonomy_label ) ) { - continue; - } - $attribute_term_id = $attribute_taxonomy_term->term_id; - $attribute_term_name = $attribute_taxonomy_term->name; - $attribute_title = __( 'Attribute=', 'woocommerce-smart-coupons' ) . $attribute_taxonomy_label . ':' . __( 'Value=', 'woocommerce-smart-coupons' ) . $attribute_term_name; - $attribute_label = $attribute_taxonomy_label . ': ' . $attribute_term_name; - - $attribute_options[ $attribute_term_id ] = array( - 'title' => $attribute_title, - 'label' => $attribute_label, - ); - } - } - } - } - ?> -
            -

            - - - -

            -
            -
            -

            - - - -

            -
            - is_callable( $coupon, 'update_meta_data' ); - - $product_attribute_ids = ( isset( $_POST['wc_sc_product_attribute_ids'] ) ) ? wc_clean( wp_unslash( $_POST['wc_sc_product_attribute_ids'] ) ) : array(); // phpcs:ignore - $product_attribute_ids = implode( '|', $product_attribute_ids ); // Store attribute ids as delimited data instead of serialized data. - if ( true === $is_callable_coupon_update_meta ) { - $coupon->update_meta_data( 'wc_sc_product_attribute_ids', $product_attribute_ids ); - } else { - update_post_meta( $post_id, 'wc_sc_product_attribute_ids', $product_attribute_ids ); - } - - $exclude_product_attribute_ids = ( isset( $_POST['wc_sc_exclude_product_attribute_ids'] ) ) ? wc_clean( wp_unslash( $_POST['wc_sc_exclude_product_attribute_ids'] ) ) : array(); // phpcs:ignore - $exclude_product_attribute_ids = implode( '|', $exclude_product_attribute_ids ); // Store attribute ids as delimited data instead of serialized data. - if ( true === $is_callable_coupon_update_meta ) { - $coupon->update_meta_data( 'wc_sc_exclude_product_attribute_ids', $exclude_product_attribute_ids ); - } else { - update_post_meta( $post_id, 'wc_sc_exclude_product_attribute_ids', $exclude_product_attribute_ids ); - } - - if ( $this->is_callable( $coupon, 'save' ) ) { - $coupon->save(); - } - } - - /** - * Function to validate coupons for against product attributes - * - * @param bool $valid Coupon validity. - * @param WC_Product|null $product Product object. - * @param WC_Coupon|null $coupon Coupon object. - * @param array|null $values Values. - * @return bool $valid - */ - public function validate( $valid = false, $product = null, $coupon = null, $values = null ) { - - $backtrace = wp_list_pluck( debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ), 'function' ); // phpcs:ignore - - // If coupon is already invalid, no need for further checks. - // Ignore this check if the discount type is a non-product-type discount. - if ( true !== $valid && ! in_array( 'handle_non_product_type_coupons', $backtrace, true ) ) { - return $valid; - } - - if ( empty( $product ) || empty( $coupon ) ) { - return $valid; - } - - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - } - - if ( ! empty( $coupon_id ) ) { - $coupon = ( ! empty( $coupon_id ) ) ? new WC_Coupon( $coupon_id ) : null; - - if ( $this->is_callable( $coupon, 'get_meta' ) ) { - $product_attribute_ids = $coupon->get_meta( 'wc_sc_product_attribute_ids' ); - $exclude_product_attribute_ids = $coupon->get_meta( 'wc_sc_exclude_product_attribute_ids' ); - } else { - $product_attribute_ids = get_post_meta( $coupon_id, 'wc_sc_product_attribute_ids', true ); - $exclude_product_attribute_ids = get_post_meta( $coupon_id, 'wc_sc_exclude_product_attribute_ids', true ); - } - - if ( ! empty( $product_attribute_ids ) || ! empty( $exclude_product_attribute_ids ) ) { - $current_product_attribute_ids = $this->get_product_attributes( $product ); - if ( ! empty( $product_attribute_ids ) ) { - $product_attribute_ids = explode( '|', $product_attribute_ids ); - } - $product_attribute_found = true; - if ( ! empty( $product_attribute_ids ) && is_array( $product_attribute_ids ) ) { - $common_attribute_ids = array_intersect( $product_attribute_ids, $current_product_attribute_ids ); - if ( count( $common_attribute_ids ) > 0 ) { - $product_attribute_found = true; - } else { - $product_attribute_found = false; - } - } - - if ( ! empty( $exclude_product_attribute_ids ) ) { - $exclude_product_attribute_ids = explode( '|', $exclude_product_attribute_ids ); - } - - $exclude_attribute_found = false; - if ( ! empty( $exclude_product_attribute_ids ) && is_array( $exclude_product_attribute_ids ) ) { - $common_exclude_attribute_ids = array_intersect( $exclude_product_attribute_ids, $current_product_attribute_ids ); - if ( count( $common_exclude_attribute_ids ) > 0 ) { - $exclude_attribute_found = true; - } else { - $exclude_attribute_found = false; - } - } - - if ( false === $product_attribute_found && false === $exclude_attribute_found ) { - $product_parent_id = is_callable( array( $product, 'get_parent_id' ) ) ? $product->get_parent_id() : 0; - if ( ! empty( $product_parent_id ) ) { - $parent_product = ( function_exists( 'wc_get_product' ) ) ? wc_get_product( $product_parent_id ) : null; - if ( ! empty( $parent_product ) ) { - $parent_product_attribute_ids = $this->get_product_attributes( $parent_product ); - if ( apply_filters( 'wc_sc_check_parent_attributes', true, $product ) && ! empty( $product_attribute_ids ) && is_array( $product_attribute_ids ) ) { - $parent_product_attribute_id = array_intersect( $product_attribute_ids, $parent_product_attribute_ids ); - if ( count( $parent_product_attribute_id ) > 0 ) { - $product_attribute_found = true; - } else { - $product_attribute_found = false; - } - } - if ( apply_filters( 'wc_sc_check_parent_attributes', true, $product ) && ! empty( $exclude_product_attribute_ids ) && is_array( $exclude_product_attribute_ids ) ) { - $exclude_parent_product_attribute_id = array_intersect( $exclude_product_attribute_ids, $parent_product_attribute_ids ); - if ( count( $exclude_parent_product_attribute_id ) > 0 ) { - $exclude_attribute_found = true; - } else { - $exclude_attribute_found = false; - } - } - } - } - } - - $valid = ( $product_attribute_found && ! $exclude_attribute_found ) ? true : false; - } - } - - return $valid; - } - - /** - * Function to get product attributes of a given product. - * - * @param WC_Product $product Product. - * @return array $product_attributes_ids IDs of product attributes - */ - public function get_product_attributes( $product = null ) { - - $product_attributes_ids = array(); - - if ( ! is_a( $product, 'WC_Product' ) ) { - // Check if product id has been passed. - if ( is_numeric( $product ) ) { - $product = wc_get_product( $product ); - } - } - - if ( ! is_a( $product, 'WC_Product' ) ) { - return $product_attribute_ids; - } - - $product_attributes = $product->get_attributes(); - if ( ! empty( $product_attributes ) ) { - if ( true === $product->is_type( 'variation' ) ) { - foreach ( $product_attributes as $variation_taxonomy => $variation_slug ) { - $variation_attribute = get_term_by( 'slug', $variation_slug, $variation_taxonomy ); - if ( is_object( $variation_attribute ) ) { - $product_attributes_ids[] = $variation_attribute->term_id; - } - } - } else { - $product_id = ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0; - if ( ! empty( $product_id ) ) { - foreach ( $product_attributes as $attribute ) { - if ( isset( $attribute['is_taxonomy'] ) && ! empty( $attribute['is_taxonomy'] ) ) { - $attribute_taxonomy_name = $attribute['name']; - $product_term_ids = wc_get_product_terms( $product_id, $attribute_taxonomy_name, array( 'fields' => 'ids' ) ); - if ( ! empty( $product_term_ids ) && is_array( $product_term_ids ) ) { - foreach ( $product_term_ids as $product_term_id ) { - $product_attributes_ids[] = $product_term_id; - } - } - } - } - } - } - } - - return $product_attributes_ids; - } - - /** - * Function to validate non product type coupons against product attribute restriction - * We need to remove coupon if it does not pass attribute validation even for single cart item in case of non product type coupons e.g fixed_cart, smart_coupon since these coupon type require all products in the cart to be valid - * - * @param boolean $valid Coupon validity. - * @param WC_Coupon $coupon Coupon object. - * @param WC_Discounts $discounts Discounts object. - * @throws Exception Validation exception. - * @return boolean $valid Coupon validity - */ - public function handle_non_product_type_coupons( $valid = true, $coupon = null, $discounts = null ) { - - // If coupon is already invalid, no need for further checks. - if ( true !== $valid ) { - return $valid; - } - - if ( ! is_a( $coupon, 'WC_Coupon' ) ) { - return $valid; - } - - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - - if ( ! empty( $coupon_id ) ) { - if ( $this->is_callable( $coupon, 'get_meta' ) ) { - $product_attribute_ids = $coupon->get_meta( 'wc_sc_product_attribute_ids' ); - $exclude_product_attribute_ids = $coupon->get_meta( 'wc_sc_exclude_product_attribute_ids' ); - } else { - $product_attribute_ids = get_post_meta( $coupon_id, 'wc_sc_product_attribute_ids', true ); - $exclude_product_attribute_ids = get_post_meta( $coupon_id, 'wc_sc_exclude_product_attribute_ids', true ); - } - // If product attributes are not set in coupon, stop further processing and return from here. - if ( empty( $product_attribute_ids ) && empty( $exclude_product_attribute_ids ) ) { - return $valid; - } - } else { - return $valid; - } - - $product_coupon_types = wc_get_product_coupon_types(); - - // Proceed if it is non product type coupon. - if ( ! in_array( $discount_type, $product_coupon_types, true ) ) { - if ( class_exists( 'WC_Discounts' ) && isset( WC()->cart ) ) { - $wc_cart = WC()->cart; - $wc_discounts = new WC_Discounts( $wc_cart ); - $items_to_validate = array(); - if ( is_callable( array( $wc_discounts, 'get_items_to_validate' ) ) ) { - $items_to_validate = $wc_discounts->get_items_to_validate(); - } elseif ( is_callable( array( $wc_discounts, 'get_items' ) ) ) { - $items_to_validate = $wc_discounts->get_items(); - } elseif ( isset( $wc_discounts->items ) && is_array( $wc_discounts->items ) ) { - $items_to_validate = $wc_discounts->items; - } - if ( ! empty( $items_to_validate ) && is_array( $items_to_validate ) ) { - $valid_products = array(); - $invalid_products = array(); - foreach ( $items_to_validate as $item ) { - $cart_item = clone $item; // Clone the item so changes to wc_discounts item do not affect the originals. - $item_product = isset( $cart_item->product ) ? $cart_item->product : null; - $item_object = isset( $cart_item->object ) ? $cart_item->object : null; - if ( ! is_null( $item_product ) && ! is_null( $item_object ) ) { - if ( $coupon->is_valid_for_product( $item_product, $item_object ) ) { - $valid_products[] = $item_product; - } else { - $invalid_products[] = $item_product; - } - } - } - - // If cart does not have any valid product then throw Exception. - if ( 0 === count( $valid_products ) ) { - $error_message = __( 'Sorry, this coupon is not applicable to selected products.', 'woocommerce-smart-coupons' ); - $error_code = defined( 'E_WC_COUPON_NOT_APPLICABLE' ) ? E_WC_COUPON_NOT_APPLICABLE : 0; - throw new Exception( $error_message, $error_code ); - } elseif ( count( $invalid_products ) > 0 && ! empty( $exclude_product_attribute_ids ) ) { - - $exclude_product_attribute_ids = explode( '|', $exclude_product_attribute_ids ); - $excluded_products = array(); - foreach ( $invalid_products as $invalid_product ) { - $product_attributes = $this->get_product_attributes( $invalid_product ); - if ( ! empty( $product_attributes ) && is_array( $product_attributes ) ) { - $common_exclude_attribute_ids = array_intersect( $exclude_product_attribute_ids, $product_attributes ); - if ( count( $common_exclude_attribute_ids ) > 0 ) { - $excluded_products[] = $invalid_product->get_name(); - } else { - $product_parent_id = is_callable( array( $invalid_product, 'get_parent_id' ) ) ? $invalid_product->get_parent_id() : 0; - if ( ! empty( $product_parent_id ) ) { - $parent_product = ( function_exists( 'wc_get_product' ) ) ? wc_get_product( $product_parent_id ) : ''; - if ( ! empty( $parent_product ) ) { - $parent_product_attribute_ids = $this->get_product_attributes( $parent_product ); - if ( apply_filters( 'wc_sc_check_parent_attributes', true, $invalid_product ) && ! empty( $exclude_product_attribute_ids ) && is_array( $exclude_product_attribute_ids ) ) { - $exclude_parent_product_attribute_id = array_intersect( $exclude_product_attribute_ids, $parent_product_attribute_ids ); - if ( count( $exclude_parent_product_attribute_id ) > 0 ) { - $excluded_products[] = $invalid_product->get_name(); - } - } - } - } - } - } - } - - if ( count( $excluded_products ) > 0 ) { - // If cart contains any excluded product and it is being excluded from our excluded product attributes then throw Exception. - /* translators: 1. Singular/plural label for product(s) 2. Excluded product names */ - $error_message = sprintf( __( 'Sorry, this coupon is not applicable to the %1$s: %2$s.', 'woocommerce-smart-coupons' ), _n( 'product', 'products', count( $excluded_products ), 'woocommerce-smart-coupons' ), implode( ', ', $excluded_products ) ); - $error_code = defined( 'E_WC_COUPON_EXCLUDED_PRODUCTS' ) ? E_WC_COUPON_EXCLUDED_PRODUCTS : 0; - throw new Exception( $error_message, $error_code ); - } - } - } - } - } - - return $valid; - } - - /** - * Add meta in export headers - * - * @param array $headers Existing headers. - * @return array - */ - public function export_headers( $headers = array() ) { - - $headers['wc_sc_product_attribute_ids'] = __( 'Product Attributes', 'woocommerce-smart-coupons' ); - $headers['wc_sc_exclude_product_attribute_ids'] = __( 'Exclude Attributes', 'woocommerce-smart-coupons' ); - - return $headers; - - } - - /** - * Post meta defaults for product attribute ids meta - * - * @param array $defaults Existing postmeta defaults. - * @return array $defaults Modified postmeta defaults - */ - public function postmeta_defaults( $defaults = array() ) { - - $defaults['wc_sc_product_attribute_ids'] = ''; - $defaults['wc_sc_exclude_product_attribute_ids'] = ''; - - return $defaults; - } - - /** - * Make meta data of product attribute ids protected - * - * @param bool $protected Is protected. - * @param string $meta_key The meta key. - * @param string $meta_type The meta type. - * @return bool $protected - */ - public function make_action_meta_protected( $protected = false, $meta_key = '', $meta_type = '' ) { - - $sc_product_attribute_keys = array( - 'wc_sc_product_attribute_ids', - 'wc_sc_exclude_product_attribute_ids', - ); - - if ( in_array( $meta_key, $sc_product_attribute_keys, true ) ) { - return true; - } - - return $protected; - } - - /** - * Add product's attribute in coupon meta - * - * @param array $data The row data. - * @param array $post The POST values. - * @return array Modified data - */ - public function generate_coupon_attribute_meta( $data = array(), $post = array() ) { - - $product_attribute_ids = ( isset( $post['wc_sc_product_attribute_ids'] ) ) ? wc_clean( wp_unslash( $post['wc_sc_product_attribute_ids'] ) ) : array(); // phpcs:ignore - $data['wc_sc_product_attribute_ids'] = implode( '|', $product_attribute_ids ); // Store attribute ids as delimited data instead of serialized data. - - $exclude_product_attribute_ids = ( isset( $post['wc_sc_exclude_product_attribute_ids'] ) ) ? wc_clean( wp_unslash( $post['wc_sc_exclude_product_attribute_ids'] ) ) : array(); // phpcs:ignore - $data['wc_sc_exclude_product_attribute_ids'] = implode( '|', $exclude_product_attribute_ids ); // Store attribute ids as delimited data instead of serialized data. - - return $data; - } - - /** - * Function to copy product's attribute meta in newly generated coupon - * - * @param array $args The arguments. - */ - public function copy_coupon_attributes_meta( $args = array() ) { - - $new_coupon_id = ( ! empty( $args['new_coupon_id'] ) ) ? absint( $args['new_coupon_id'] ) : 0; - $coupon = ( ! empty( $args['ref_coupon'] ) ) ? $args['ref_coupon'] : false; - - if ( empty( $new_coupon_id ) || empty( $coupon ) ) { - return; - } - - if ( $this->is_wc_gte_30() ) { - $product_attribute_ids = $coupon->get_meta( 'wc_sc_product_attribute_ids' ); - $exclude_product_attribute_ids = $coupon->get_meta( 'wc_sc_exclude_product_attribute_ids' ); - } else { - $old_coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $product_attribute_ids = get_post_meta( $old_coupon_id, 'wc_sc_product_attribute_ids', true ); - $exclude_product_attribute_ids = get_post_meta( $old_coupon_id, 'wc_sc_exclude_product_attribute_ids', true ); - } - - $new_coupon = new WC_Coupon( $new_coupon_id ); - - if ( $this->is_callable( $new_coupon, 'update_meta_data' ) && $this->is_callable( $new_coupon, 'save' ) ) { - $new_coupon->update_meta_data( 'wc_sc_product_attribute_ids', $product_attribute_ids ); - $new_coupon->update_meta_data( 'wc_sc_exclude_product_attribute_ids', $exclude_product_attribute_ids ); - $new_coupon->save(); - } else { - update_post_meta( $new_coupon_id, 'wc_sc_product_attribute_ids', $product_attribute_ids ); - update_post_meta( $new_coupon_id, 'wc_sc_exclude_product_attribute_ids', $exclude_product_attribute_ids ); - } - - } - } -} - -WC_SC_Coupons_By_Product_Attribute::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-product-quantity.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-product-quantity.php deleted file mode 100644 index ada265f2..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-product-quantity.php +++ /dev/null @@ -1,759 +0,0 @@ -is_callable( $coupon, 'get_meta' ) ) { - $product_quantity_restrictions = $coupon->get_meta( 'wc_sc_product_quantity_restrictions' ); - } else { - $product_quantity_restrictions = $this->get_post_meta( $coupon_id, 'wc_sc_product_quantity_restrictions', true ); - } - - if ( ! is_array( $product_quantity_restrictions ) ) { - $product_quantity_restrictions = array(); - } - - $cart_min_quantity = ! empty( $product_quantity_restrictions['values']['cart']['min'] ) ? intval( $product_quantity_restrictions['values']['cart']['min'] ) : ''; - $cart_max_quantity = ! empty( $product_quantity_restrictions['values']['cart']['max'] ) ? intval( $product_quantity_restrictions['values']['cart']['max'] ) : ''; - $product_quantity_restrictions_type = ! empty( $product_quantity_restrictions['type'] ) ? $product_quantity_restrictions['type'] : 'cart'; - ?> -
            -

            -

            - - - - -

            -

            - - -

            -

            - - -

            -
            - $value ) { - if ( 0 !== $product_id ) { - $product = wc_get_product( $product_id ); - if ( ! empty( $product ) && is_object( $product ) ) { - $product_name = is_callable( array( $product, 'get_name' ) ) ? $product->get_name() : ''; - $product_max_quantity = ! empty( $value['max'] ) ? intval( $value['max'] ) : ''; - $product_min_quantity = ! empty( $value['min'] ) ? intval( $value['min'] ) : ''; - ?> -

            - - - - - - - - -

            - -

            - - -

            - -
            -
            - $value ) { - if ( 0 !== $category_id ) { - $term = get_term_by( 'id', $category_id, 'product_cat', ARRAY_A ); - if ( ! empty( $term ) && is_array( $term ) ) { - $category_name = ! empty( $term['name'] ) ? $term['name'] : ''; - ?> -

            - - - - - - - - -

            - -

            - - -

            - -
            -
            - - - - - - - - - - - - - - - $restrictions ) { - if ( 'values' === $restriction_key ) { - // Max quantity feature not included for product quantity. - foreach ( $restrictions['product'] as $id => $restriction ) { - $id = absint( $id ); - if ( 0 !== $id && isset( $product_quantity_restrictions['values']['product'][ $id ]['max'] ) ) { - $product_quantity_restrictions['values']['product'][ $id ]['max'] = ! empty( $restriction['min'] ) ? intval( $restriction['min'] ) : ''; - } - } - - // Max quantity feature not included for product category quantity. - foreach ( $restrictions['product_category'] as $id => $restriction ) { - $id = absint( $id ); - if ( 0 !== $id && isset( $product_quantity_restrictions['values']['product_category'][ $id ]['max'] ) ) { - $product_quantity_restrictions['values']['product_category'][ $id ]['max'] = ! empty( $restriction['min'] ) ? intval( $restriction['min'] ) : ''; - } - } - } - } - } - - if ( $this->is_callable( $coupon, 'update_meta_data' ) && $this->is_callable( $coupon, 'save' ) ) { - $coupon->update_meta_data( 'wc_sc_product_quantity_restrictions', $product_quantity_restrictions ); - $coupon->save(); - } else { - $this->update_post_meta( $post_id, 'wc_sc_product_quantity_restrictions', $product_quantity_restrictions ); - } - } - - /** - * Validate the coupon based on product quantity - * - * @param boolean $valid Is valid or not. - * @param WC_Coupon $coupon The coupon object. - * @param WC_Discounts $wc_discounts The discounts object. - * - * @return boolean Is valid or not - * @throws Exception If the coupon is invalid. - */ - public function validate( $valid = false, $coupon = null, $wc_discounts = null ) { - - // If coupon is invalid already, no need for further checks. - if ( false === $valid ) { - return $valid; - } - - if ( ! is_a( $coupon, 'WC_Coupon' ) ) { - return $valid; - } - if ( ! is_a( $wc_discounts, 'WC_Discounts' ) ) { - return $valid; - } - - $items_to_validate = array(); - $cart_quantity = 0; - - if ( is_callable( array( $wc_discounts, 'get_items_to_validate' ) ) ) { - $items_to_validate = $wc_discounts->get_items_to_validate(); - } else { - return $valid; - } - - if ( ! empty( $items_to_validate ) ) { - foreach ( $items_to_validate as $key => $cart_content ) { - $cart_item = ! empty( $cart_content->object ) ? $cart_content->object : array(); - $cart_quantity += ! empty( $cart_item['quantity'] ) ? intval( $cart_item['quantity'] ) : 0; - } - } else { - return $valid; - } - - // If the cart quantity is empty the rule will not work. - if ( $cart_quantity <= 0 ) { - return $valid; - } - - $coupon_id = is_callable( array( $coupon, 'get_id' ) ) ? $coupon->get_id() : 0; - - if ( $this->is_callable( $coupon, 'get_meta' ) ) { - $product_quantity_restrictions = $coupon->get_meta( 'wc_sc_product_quantity_restrictions' ); - } else { - $product_quantity_restrictions = get_post_meta( $coupon_id, 'wc_sc_product_quantity_restrictions', true ); - } - if ( is_array( $product_quantity_restrictions ) && ! empty( $product_quantity_restrictions ) ) { - $type = ! empty( $product_quantity_restrictions['type'] ) ? $product_quantity_restrictions['type'] : ''; - $values = ! empty( $product_quantity_restrictions['values'] ) ? $product_quantity_restrictions['values'] : ''; - $condition = ! empty( $product_quantity_restrictions['condition'] ) ? $product_quantity_restrictions['condition'] : 'any'; - - switch ( $type ) { - case 'cart': - $min = ! empty( $product_quantity_restrictions['values']['cart']['min'] ) ? intval( $product_quantity_restrictions['values']['cart']['min'] ) : 0; - $max = ! empty( $product_quantity_restrictions['values']['cart']['max'] ) ? intval( $product_quantity_restrictions['values']['cart']['max'] ) : 0; - $messages = array( - __( 'Your cart does not meet the quantity requirement.', 'woocommerce-smart-coupons' ), - ); - - if ( empty( $min ) && empty( $max ) ) { - return $valid; - } elseif ( empty( $min ) && ! empty( $max ) && $cart_quantity <= $max ) { - return $valid; - } elseif ( empty( $max ) && ! empty( $min ) && $cart_quantity >= $min ) { - return $valid; - } elseif ( ! empty( $min ) && ! empty( $max ) && $cart_quantity >= $min && $cart_quantity <= $max ) { - return $valid; - } else { - if ( $cart_quantity > $max ) { - /* translators: 1. Number of quantity 2. Singular or plural text based on number of quantities */ - $messages[] = sprintf( __( 'Your cart should have a maximum of %1$d %2$s in total.', 'woocommerce-smart-coupons' ), $max, _n( 'quantity', 'quantities', $max ) ); - } - if ( $cart_quantity < $min ) { - /* translators: 1. Number of quantity 2. Singular or plural text based on number of quantities */ - $messages[] = sprintf( __( 'Your cart should have a minimum of %1$d %2$s in total.', 'woocommerce-smart-coupons' ), $min, _n( 'quantity', 'quantities', $min ) ); - } - throw new Exception( implode( ' ', $messages ) ); - } - break; - default: - case 'product': - $product_quantity_restrictions = ! empty( $values['product'] ) ? $values['product'] : array(); - $product_category_quantity_restrictions = ! empty( $values['product_category'] ) ? $values['product_category'] : array(); - - $params = array( - 'condition' => $condition, - 'items_to_validate' => $items_to_validate, - ); - $product_condition = $this->process_product_quantities( $product_quantity_restrictions, $params ); - $product_category_condition = $this->process_category_quantities( $product_category_quantity_restrictions, $params ); - - if ( false === $product_condition && false === $product_category_condition ) { - throw new Exception( __( 'Your cart does not meet the product quantity requirement.', 'woocommerce-smart-coupons' ) ); - } elseif ( 'empty' === $product_condition && false === $product_category_condition ) { - throw new Exception( __( 'Your cart does not meet the product quantity requirement.', 'woocommerce-smart-coupons' ) ); - } elseif ( false === $product_condition && 'empty' === $product_category_condition ) { - throw new Exception( __( 'Your cart does not meet the product quantity requirement.', 'woocommerce-smart-coupons' ) ); - } - break; - } - } - - return $valid; - - } - - /** - * Process cart product quantities - * - * @param array $product_quantity_restrictions values. - * @param array $params condition and cart contents. - * @return bool - * @throws Exception If empty product quantities. - */ - public function process_product_quantities( $product_quantity_restrictions = array(), $params = array() ) { - if ( ! empty( $product_quantity_restrictions ) ) { - $status = array(); - $condition = ! empty( $params['condition'] ) ? $params['condition'] : 'any'; - $items_to_validate = ! empty( $params['items_to_validate'] ) ? $params['items_to_validate'] : array(); - foreach ( $product_quantity_restrictions as $id => $restriction ) { - if ( 0 === $id ) { - continue; - } - $min_quantity = ! empty( $restriction['min'] ) ? intval( $restriction['min'] ) : 0; - $max_quantity = ! empty( $restriction['max'] ) ? intval( $restriction['max'] ) : 0; - $cart_product_quantities = $this->cart_product_quantities( $items_to_validate ); - $product_quantity = ! empty( $cart_product_quantities[ $id ] ) ? intval( $cart_product_quantities[ $id ] ) : 1; - - if ( empty( $min_quantity ) && empty( $max_quantity ) ) { - $status[] = 'empty'; - } elseif ( empty( $min_quantity ) && ! empty( $max_quantity ) && $product_quantity <= $max_quantity ) { - $status[] = 'true'; - } elseif ( empty( $max_quantity ) && ! empty( $min_quantity ) && $product_quantity >= $min_quantity ) { - $status[] = 'true'; - } elseif ( ! empty( $min_quantity ) && ! empty( $max_quantity ) && $product_quantity >= $min_quantity && $product_quantity <= $max_quantity ) { - $status[] = 'true'; - } else { - $status[] = 'false'; - } - } - - switch ( $condition ) { - case 'all': - if ( in_array( 'false', $status, true ) ) { - return false; - } elseif ( in_array( 'true', $status, true ) ) { - return true; - } else { - return 'empty'; - } - default: - case 'any': - if ( in_array( 'true', $status, true ) ) { - return true; - } elseif ( in_array( 'false', $status, true ) ) { - return false; - } else { - return 'empty'; - } - } - } - return 'empty'; - } - - /** - * Process cart category quantities - * - * @param array $product_category_quantity_restrictions values. - * @param array $params condition and cart contents. - * @return bool - * @throws Exception If empty cart category quantities. - */ - public function process_category_quantities( $product_category_quantity_restrictions = array(), $params = array() ) { - - if ( ! empty( $product_category_quantity_restrictions ) ) { - $status = array(); - $condition = ! empty( $params['condition'] ) ? $params['condition'] : 'any'; - $items_to_validate = ! empty( $params['items_to_validate'] ) ? $params['items_to_validate'] : array(); - $cart_product_categories_quantities = $this->cart_product_categories_quantities( $items_to_validate ); - foreach ( $product_category_quantity_restrictions as $id => $restriction ) { - $min_quantity = ! empty( $restriction['min'] ) ? intval( $restriction['min'] ) : ''; - $max_quantity = ! empty( $restriction['max'] ) ? intval( $restriction['max'] ) : ''; - if ( 0 === $id ) { - continue; - } - $category_quantity = ! empty( $cart_product_categories_quantities[ $id ] ) ? intval( $cart_product_categories_quantities[ $id ] ) : 0; - - if ( empty( $min_quantity ) && empty( $max_quantity ) ) { - $status[] = 'empty'; - } elseif ( empty( $min_quantity ) && ! empty( $max_quantity ) && $category_quantity <= $max_quantity ) { - $status[] = 'true'; - } elseif ( empty( $max_quantity ) && ! empty( $min_quantity ) && $category_quantity >= $min_quantity ) { - $status[] = 'true'; - } elseif ( ! empty( $min_quantity ) && ! empty( $max_quantity ) && $category_quantity >= $min_quantity && $category_quantity <= $max_quantity ) { - $status[] = 'true'; - } else { - $status[] = 'false'; - } - } - - switch ( $condition ) { - case 'all': - if ( in_array( 'false', $status, true ) ) { - return false; - } elseif ( in_array( 'true', $status, true ) ) { - return true; - } else { - return 'empty'; - } - default: - case 'any': - if ( in_array( 'true', $status, true ) ) { - return true; - } elseif ( in_array( 'false', $status, true ) ) { - return false; - } else { - return 'empty'; - } - } - } - return 'empty'; - } - - /** - * Calculate product quantities - * - * @param array $cart_contents cart contents. - * @return array - */ - public function cart_product_quantities( $cart_contents = array() ) { - if ( empty( $cart_contents ) ) { - return $cart_contents; - } - $cart_product_quantities = array(); - foreach ( $cart_contents as $key => $cart_content ) { - $cart_item = ! empty( $cart_content->object ) ? $cart_content->object : array(); - $quantity = ! empty( $cart_item['quantity'] ) ? intval( $cart_item['quantity'] ) : 1; - $product_id = ! empty( $cart_item['product_id'] ) ? intval( $cart_item['product_id'] ) : 0; - $variation_id = ! empty( $cart_item['variation_id'] ) ? intval( $cart_item['variation_id'] ) : 0; - if ( ! empty( $variation_id ) ) { - if ( isset( $cart_product_quantities[ $variation_id ] ) ) { - $cart_product_quantities[ $variation_id ] = $cart_product_quantities[ $variation_id ] + $quantity; - } else { - $cart_product_quantities[ $variation_id ] = $quantity; - } - } - - if ( isset( $cart_product_quantities[ $product_id ] ) ) { - $cart_product_quantities[ $product_id ] = $cart_product_quantities[ $product_id ] + $quantity; - } else { - $cart_product_quantities[ $product_id ] = $quantity; - } - } - return $cart_product_quantities; - } - - /** - * Calculate category quantities - * - * @param array $cart_contents cart contents. - * @return array - */ - public function cart_product_categories_quantities( $cart_contents = array() ) { - if ( empty( $cart_contents ) ) { - return $cart_contents; - } - $categories_quantities = array(); - foreach ( $cart_contents as $key => $cart_content ) { - $cart_item = ! empty( $cart_content->object ) ? $cart_content->object : array(); - $product = ! empty( $cart_item['data'] ) ? $cart_item['data'] : array(); - $quantity = ! empty( $cart_item['quantity'] ) ? intval( $cart_item['quantity'] ) : 1; - - if ( is_object( $product ) && is_callable( array( $product, 'get_category_ids' ) ) ) { - $product_variation = ( is_callable( array( $product, 'is_type' ) ) ) ? $product->is_type( 'variation' ) : false; - if ( $product_variation ) { - $parent_id = ( is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0; - if ( ! empty( $parent_id ) ) { - $product = wc_get_product( $parent_id ); - } - } - $categories = $product->get_category_ids(); - if ( ! empty( $categories ) ) { - foreach ( $categories as $category ) { - if ( isset( $categories_quantities[ $category ] ) ) { - $categories_quantities[ $category ] = $categories_quantities[ $category ] + $quantity; - } else { - $categories_quantities[ $category ] = $quantity; - } - } - } - } - } - return $categories_quantities; - } - - } -} - -WC_SC_Coupons_By_Product_Quantity::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-shipping-method.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-shipping-method.php deleted file mode 100644 index 21a27767..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-shipping-method.php +++ /dev/null @@ -1,380 +0,0 @@ -is_callable( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'wc_sc_shipping_method_ids' ) : $this->get_post_meta( $coupon_id, 'wc_sc_shipping_method_ids', true ); - if ( empty( $shipping_method_ids ) || ! is_array( $shipping_method_ids ) ) { - $shipping_method_ids = array(); - } - } - $available_shipping_methods = WC()->shipping->get_shipping_methods(); - ?> -
            -

            - - - -

            -
            - is_callable( $coupon, 'update_meta_data' ) && $this->is_callable( $coupon, 'save' ) ) { - $coupon->update_meta_data( 'wc_sc_shipping_method_ids', $shipping_method_ids ); - $coupon->save(); - } else { - $this->update_post_meta( $post_id, 'wc_sc_shipping_method_ids', $shipping_method_ids ); - } - } - - /** - * Validate the coupon based on shipping method - * - * @param boolean $valid Is valid or not. - * @param WC_Coupon $coupon The coupon object. - * - * @throws Exception If the coupon is invalid. - * @return boolean Is valid or not - */ - public function validate( $valid = false, $coupon = object ) { - - // If coupon is already invalid, no need for further checks. - if ( false === $valid ) { - return $valid; - } - - $coupon_id = ( $this->is_wc_gte_30() ) ? $coupon->get_id() : $coupon->id; - $shipping_method_ids = ( $this->is_callable( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'wc_sc_shipping_method_ids' ) : $this->get_post_meta( $coupon_id, 'wc_sc_shipping_method_ids', true ); - - if ( is_array( $shipping_method_ids ) && ! empty( $shipping_method_ids ) ) { - $chosen_shipping_method_data = WC()->session->__isset( 'chosen_shipping_methods' ) ? WC()->session->get( 'chosen_shipping_methods' ) : ''; - $chosen_shipping_method_string = is_array( $chosen_shipping_method_data ) && ! empty( $chosen_shipping_method_data ) ? $chosen_shipping_method_data[0] : ''; - if ( ! empty( $chosen_shipping_method_string ) ) { - $chosen_shipping_method_string = explode( ':', $chosen_shipping_method_string ); - $chosen_shipping_method_id = $chosen_shipping_method_string[0]; - if ( ! in_array( $chosen_shipping_method_id, $shipping_method_ids, true ) ) { - $wc_shipping_packages = ( is_callable( array( WC()->shipping, 'get_packages' ) ) ) ? WC()->shipping->get_packages() : null; - if ( empty( $wc_shipping_packages ) && is_callable( array( WC()->cart, 'calculate_shipping' ) ) ) { - WC()->cart->calculate_shipping(); - } - $chosen_shipping_method_rate_id = is_array( $chosen_shipping_method_data ) && ! empty( $chosen_shipping_method_data ) ? $chosen_shipping_method_data[0] : ''; - $shipping_method_id = ''; - $available_shipping_packages = ( is_callable( array( WC()->shipping, 'get_packages' ) ) ) ? WC()->shipping->get_packages() : ''; - - if ( ! empty( $available_shipping_packages ) ) { - foreach ( $available_shipping_packages as $key => $package ) { - if ( ! empty( $shipping_method_id ) ) { - break; - } - // Loop through Shipping rates. - if ( isset( $package['rates'] ) && ! empty( $package['rates'] ) ) { - foreach ( $package['rates'] as $rate_id => $rate ) { - if ( $chosen_shipping_method_rate_id === $rate_id ) { - $shipping_method_id = ( is_callable( array( $rate, 'get_method_id' ) ) ) ? $rate->get_method_id() : ''; - break; - } - } - } - } - if ( ! in_array( $shipping_method_id, $shipping_method_ids, true ) ) { - if ( ! apply_filters( 'wc_sc_coupon_validate_shipping_method', false, $chosen_shipping_method_id, $shipping_method_ids ) ) { - throw new Exception( __( 'This coupon is not valid for selected shipping method.', 'woocommerce-smart-coupons' ) ); - } - } - } else { - if ( ! apply_filters( 'wc_sc_coupon_validate_shipping_method', false, $chosen_shipping_method_id, $shipping_method_ids ) ) { - throw new Exception( __( 'This coupon is not valid for selected shipping method.', 'woocommerce-smart-coupons' ) ); - } - } - } - } - } - - return $valid; - - } - - /** - * Add meta in export headers - * - * @param array $headers Existing headers. - * @return array - */ - public function export_headers( $headers = array() ) { - - $headers['wc_sc_shipping_method_ids'] = __( 'Shipping methods', 'woocommerce-smart-coupons' ); - - return $headers; - - } - - /** - * Function to handle coupon meta data during export of existing coupons - * - * @param mixed $meta_value The meta value. - * @param array $args Additional arguments. - * @return string Processed meta value - */ - public function export_coupon_meta_data( $meta_value = '', $args = array() ) { - - if ( ! empty( $args['meta_key'] ) && 'wc_sc_shipping_method_ids' === $args['meta_key'] ) { - if ( isset( $args['meta_value'] ) && ! empty( $args['meta_value'] ) ) { - $shipping_method_ids = maybe_unserialize( stripslashes( $args['meta_value'] ) ); - if ( is_array( $shipping_method_ids ) && ! empty( $shipping_method_ids ) ) { - $shipping_method_titles = $this->get_shipping_method_titles_by_ids( $shipping_method_ids ); - if ( is_array( $shipping_method_titles ) && ! empty( $shipping_method_titles ) ) { - $meta_value = implode( '|', wc_clean( wp_unslash( $shipping_method_titles ) ) ); // Replace shipping method ids with their respective method titles. - } - } - } - } - - return $meta_value; - - } - - /** - * Post meta defaults for shipping method ids meta - * - * @param array $defaults Existing postmeta defaults. - * @return array $defaults Modified postmeta defaults - */ - public function postmeta_defaults( $defaults = array() ) { - - $defaults['wc_sc_shipping_method_ids'] = ''; - - return $defaults; - } - - /** - * Add shipping method's meta with value in coupon meta - * - * @param array $data The row data. - * @param array $post The POST values. - * @return array $data Modified row data - */ - public function generate_coupon_meta( $data = array(), $post = array() ) { - - $shipping_method_titles = ''; - - if ( ! empty( $post['wc_sc_shipping_method_ids'] ) && is_array( $post['wc_sc_shipping_method_ids'] ) ) { - $shipping_method_titles = $this->get_shipping_method_titles_by_ids( $post['wc_sc_shipping_method_ids'] ); - if ( is_array( $shipping_method_titles ) && ! empty( $shipping_method_titles ) ) { - $shipping_method_titles = implode( '|', wc_clean( wp_unslash( $shipping_method_titles ) ) ); - } - } - - $data['wc_sc_shipping_method_ids'] = $shipping_method_titles; // Replace shipping method ids with their respective method titles. - - return $data; - } - - /** - * Function to get shipping method titles for given shipping method ids - * - * @param array $shipping_method_ids ids of shipping methods. - * @return array $shipping_method_titles titles of shipping methods - */ - public function get_shipping_method_titles_by_ids( $shipping_method_ids = array() ) { - - $shipping_method_titles = array(); - - if ( is_array( $shipping_method_ids ) && ! empty( $shipping_method_ids ) ) { - $available_shipping_methods = WC()->shipping->load_shipping_methods(); - foreach ( $shipping_method_ids as $index => $shipping_method_id ) { - $shipping_method = ( isset( $available_shipping_methods[ $shipping_method_id ] ) && ! empty( $available_shipping_methods[ $shipping_method_id ] ) ) ? $available_shipping_methods[ $shipping_method_id ] : ''; - if ( ! empty( $shipping_method ) && is_a( $shipping_method, 'WC_Shipping_Method' ) ) { - $shipping_method_title = is_callable( array( $shipping_method, 'get_method_title' ) ) ? $shipping_method->get_method_title() : ''; - if ( ! empty( $shipping_method_title ) ) { - $shipping_method_titles[ $index ] = $shipping_method_title; // Replace shipping method id with it's repective title. - } else { - $shipping_method_titles[ $index ] = $shipping_method->id; // In case of empty shipping method title replace it with method id. - } - } - } - } - - return $shipping_method_titles; - } - - /** - * Process coupon meta value for import - * - * @param mixed $meta_value The meta value. - * @param array $args Additional Arguments. - * @return mixed $meta_value - */ - public function process_coupon_meta_value_for_import( $meta_value = null, $args = array() ) { - - if ( ! empty( $args['meta_key'] ) && 'wc_sc_shipping_method_ids' === $args['meta_key'] ) { - - $meta_value = ( ! empty( $args['postmeta']['wc_sc_shipping_method_ids'] ) ) ? explode( '|', wc_clean( wp_unslash( $args['postmeta']['wc_sc_shipping_method_ids'] ) ) ) : array(); - if ( is_array( $meta_value ) && ! empty( $meta_value ) ) { - $available_shipping_methods = WC()->shipping->load_shipping_methods(); - if ( is_array( $available_shipping_methods ) && ! empty( $available_shipping_methods ) ) { - foreach ( $meta_value as $index => $shipping_method_title ) { - foreach ( $available_shipping_methods as $shipping_method ) { - $method_title = is_callable( array( $shipping_method, 'get_method_title' ) ) ? $shipping_method->get_method_title() : ''; - if ( $method_title === $shipping_method_title && ! empty( $shipping_method->id ) ) { - $meta_value[ $index ] = $shipping_method->id; // Replace shipping method title with it's repective id. - } - } - } - } - } - } - - return $meta_value; - } - - /** - * Function to copy shipping method restriction meta in newly generated coupon - * - * @param array $args The arguments. - */ - public function copy_coupon_shipping_method_meta( $args = array() ) { - - // Copy meta data to new coupon. - $this->copy_coupon_meta_data( - $args, - array( 'wc_sc_shipping_method_ids' ) - ); - - } - - /** - * Make meta data of shipping method ids protected - * - * @param bool $protected Is protected. - * @param string $meta_key The meta key. - * @param string $meta_type The meta type. - * @return bool $protected - */ - public function make_action_meta_protected( $protected = false, $meta_key = '', $meta_type = '' ) { - - if ( 'wc_sc_shipping_method_ids' === $meta_key ) { - return true; - } - return $protected; - } - } -} - -WC_SC_Coupons_By_Shipping_Method::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-taxonomy.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-taxonomy.php deleted file mode 100644 index 9d7c88b1..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-taxonomy.php +++ /dev/null @@ -1,811 +0,0 @@ -get_taxonomy_with_label(); - $terms = $this->get_terms_grouped_by_taxonomy(); - $operators = array( - 'incl' => __( 'Include', 'woocommerce-smart-coupons' ), - 'excl' => __( 'Exclude', 'woocommerce-smart-coupons' ), - ); - - $taxonomy_restrictions = ( $this->is_callable( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'wc_sc_taxonomy_restrictions' ) : $this->get_post_meta( $coupon_id, 'wc_sc_taxonomy_restrictions', true ); - - ?> -
            - get_default_taxonomy_restriction_row(); - } - if ( ! empty( $taxonomy_restrictions ) ) { - $count = count( $taxonomy_restrictions ); - for ( $i = 0; $i < $count; $i++ ) { - $args = array( - 'index' => $i, - 'taxonomy_restriction' => $taxonomy_restrictions[ $i ], - 'taxonomy_to_label' => $taxonomy_to_label, - 'operators' => $operators, - 'terms' => $terms, - ); - $this->get_taxonomy_restriction_row( $args ); - } - } - ?> -
            - -

            - - -

            - get_default_taxonomy_restriction_row(); - - die(); - } - - /** - * Get taxonomy restriction row - * - * @param array $args Arguments. - */ - public function get_taxonomy_restriction_row( $args = array() ) { - $index = ( ! empty( $args['index'] ) ) ? absint( $args['index'] ) : 0; - $taxonomy_restriction = ( ! empty( $args['taxonomy_restriction'] ) ) ? $args['taxonomy_restriction'] : array(); - $taxonomy_to_label = ( ! empty( $args['taxonomy_to_label'] ) ) ? $args['taxonomy_to_label'] : array(); - $terms = ( ! empty( $args['terms'] ) ) ? $args['terms'] : array(); - $operators = ( ! empty( $args['operators'] ) ) ? $args['operators'] : array(); - $tax = $taxonomy_restriction['tax']; - $op = $taxonomy_restriction['op']; - $value = $taxonomy_restriction['val']; - ?> -

            - - $index, - 'column' => 'tax', - 'all' => $taxonomy_to_label, - 'selected' => $tax, - 'width' => '140px', - ); - $this->get_taxonomy_restriction_select_tag( $args ); - ?> - $index, - 'column' => 'op', - 'all' => $operators, - 'selected' => $op, - 'width' => '70px', - ); - $this->get_taxonomy_restriction_select_tag( $args ); - ?> - $index, - 'column' => 'val', - 'all' => $terms[ $tax ], - 'selected' => $value, - ); - $this->get_taxonomy_restriction_select_tag( $args ); - ?> - -

            - - - get_terms_grouped_by_taxonomy(); - - $args = array( - 'index' => $index, - 'column' => 'val', - 'all' => $terms[ $tax ], - ); - $this->get_taxonomy_restriction_select_tag( $args ); - - die(); - } - - /** - * Get taxonomy restriction row HTML via AJAX - */ - public function ajax_taxonomy_restriction_row_html() { - - check_ajax_referer( 'wc-sc-taxonomy-restriction-row', 'security' ); - - $index = ( ! empty( $_POST['index'] ) ) ? sanitize_text_field( wp_unslash( $_POST['index'] ) ) : 0; - - $taxonomy_to_label = $this->get_taxonomy_with_label(); - $terms = $this->get_terms_grouped_by_taxonomy(); - $operators = array( - 'incl' => __( 'Include', 'woocommerce-smart-coupons' ), - 'excl' => __( 'Exclude', 'woocommerce-smart-coupons' ), - ); - - $tax = current( array_keys( $taxonomy_to_label ) ); - $op = current( array_keys( $operators ) ); - - $args = array( - 'index' => $index, - 'taxonomy_restriction' => array( - 'tax' => $tax, - 'op' => $op, - 'val' => array(), - ), - 'taxonomy_to_label' => $taxonomy_to_label, - 'operators' => $operators, - 'terms' => $terms, - ); - $this->get_taxonomy_restriction_row( $args ); - - die(); - } - - /** - * Styles and scripts - */ - public function styles_and_scripts() { - if ( ! wp_script_is( 'jquery' ) ) { - wp_enqueue_script( 'jquery' ); - } - ?> - - - $this ) ); - - if ( ! empty( $wp_taxonomies ) ) { - foreach ( $wp_taxonomies as $taxonomy => $wp_taxonomy ) { - if ( in_array( $taxonomy, $include_taxonomy, true ) ) { - $taxonomy_to_label[ $taxonomy ] = $wp_taxonomy->label; - } - } - } - - return $taxonomy_to_label; - } - - /** - * Get terms grouped by taxonomy - * - * @return array - */ - public function get_terms_grouped_by_taxonomy() { - $terms_by_taxonomy = array(); - - $args = array( - 'hide_empty' => false, - ); - - $terms = get_terms( $args ); - - if ( ! empty( $terms ) ) { - foreach ( $terms as $term ) { - if ( empty( $terms_by_taxonomy[ $term->taxonomy ] ) || ! is_array( $terms_by_taxonomy[ $term->taxonomy ] ) ) { - $terms_by_taxonomy[ $term->taxonomy ] = array(); - } - $terms_by_taxonomy[ $term->taxonomy ][ $term->slug ] = $term->name; - } - } - - return $terms_by_taxonomy; - } - - /** - * Save coupon by payment method data in meta - * - * @param Integer $post_id The coupon post ID. - * @param WC_Coupon $coupon The coupon object. - */ - public function process_meta( $post_id = 0, $coupon = null ) { - if ( empty( $post_id ) ) { - return; - } - - if ( is_null( $coupon ) || ! is_a( $coupon, 'WC_Coupon' ) ) { - $coupon = new WC_Coupon( $post_id ); - } - - $taxonomy_restrictions = ( isset( $_POST['wc_sc_taxonomy_restrictions'] ) ) ? wc_clean( wp_unslash( $_POST['wc_sc_taxonomy_restrictions'] ) ) : array(); // phpcs:ignore - if ( ! empty( $taxonomy_restrictions ) ) { - $taxonomy_restrictions = array_values( $taxonomy_restrictions ); - } - - if ( $this->is_callable( $coupon, 'update_meta_data' ) && $this->is_callable( $coupon, 'save' ) ) { - $coupon->update_meta_data( 'wc_sc_taxonomy_restrictions', $taxonomy_restrictions ); - $coupon->save(); - } else { - $this->update_post_meta( $post_id, 'wc_sc_taxonomy_restrictions', $taxonomy_restrictions ); - } - } - - /** - * Function to validate coupons against taxonomy - * - * @param bool $valid Coupon validity. - * @param WC_Product|null $product Product object. - * @param WC_Coupon|null $coupon Coupon object. - * @param array|null $values Values. - * @return bool $valid - */ - public function validate( $valid = false, $product = null, $coupon = null, $values = null ) { - - $backtrace = wp_list_pluck( debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ), 'function' ); // phpcs:ignore - - // If coupon is already invalid, no need for further checks. - // Ignore this check if the discount type is a non-product-type discount. - if ( true !== $valid && ! in_array( 'handle_non_product_type_coupons', $backtrace, true ) ) { - return $valid; - } - - if ( empty( $product ) || empty( $coupon ) ) { - return $valid; - } - - $product_ids = array(); - - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - $product_ids[] = ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0; - $product_ids[] = ( is_object( $product ) && is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $product_ids[] = ( ! empty( $product->id ) ) ? $product->id : 0; - $product_ids[] = ( is_object( $product ) && is_callable( array( $product, 'get_parent' ) ) ) ? $product->get_parent() : 0; - } - - $product_ids = array_unique( array_filter( $product_ids ) ); - - if ( ! empty( $coupon_id ) ) { - $taxonomy_restrictions = ( $this->is_callable( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'wc_sc_taxonomy_restrictions' ) : $this->get_post_meta( $coupon_id, 'wc_sc_taxonomy_restrictions', true ); - - if ( ! empty( $taxonomy_restrictions ) ) { - $term_ids = $this->get_restricted_term_ids( array( 'taxonomy_restrictions' => $taxonomy_restrictions ) ); - - $include_ids = array(); - $exclude_ids = array(); - - if ( isset( $term_ids['include'] ) && is_array( $term_ids['include'] ) ) { - $include_ids = $term_ids['include']; - } - - if ( isset( $term_ids['exclude'] ) && is_array( $term_ids['exclude'] ) ) { - $exclude_ids = $term_ids['exclude']; - } - - $taxonomies = wp_list_pluck( $taxonomy_restrictions, 'tax' ); - $args = array( - 'fields' => 'ids', - ); - $object_term_ids = wp_get_object_terms( $product_ids, $taxonomies, $args ); - $object_term_ids = array_unique( array_filter( $object_term_ids ) ); - - $taxonomy_found = true; - if ( ! empty( $include_ids ) && is_array( $include_ids ) ) { - $common_term_ids = array_intersect( $include_ids, $object_term_ids ); - if ( count( $common_term_ids ) > 0 ) { - $taxonomy_found = true; - } else { - $taxonomy_found = false; - } - } - - $exclude_taxonomy_found = false; - if ( ! empty( $exclude_ids ) && is_array( $exclude_ids ) ) { - $common_exclude_term_ids = array_intersect( $exclude_ids, $object_term_ids ); - if ( count( $common_exclude_term_ids ) > 0 ) { - $exclude_taxonomy_found = true; - } else { - $exclude_taxonomy_found = false; - } - } - - $valid = ( $taxonomy_found && ! $exclude_taxonomy_found ) ? true : false; - } - } - - return $valid; - } - - /** - * Function to validate non product type coupons against taxonomy restriction - * We need to remove coupon if it does not pass taxonomy validation even for single cart item in case of non product type coupons e.g fixed_cart, smart_coupon since these coupon type require all products in the cart to be valid - * - * @param boolean $valid Coupon validity. - * @param WC_Coupon $coupon Coupon object. - * @param WC_Discounts $discounts Discounts object. - * @throws Exception Validation exception. - * @return boolean $valid Coupon validity - */ - public function handle_non_product_type_coupons( $valid = true, $coupon = null, $discounts = null ) { - - // If coupon is already invalid, no need for further checks. - if ( true !== $valid ) { - return $valid; - } - - if ( ! is_a( $coupon, 'WC_Coupon' ) ) { - return $valid; - } - - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - - if ( ! empty( $coupon_id ) ) { - $taxonomy_restrictions = ( $this->is_callable( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'wc_sc_taxonomy_restrictions' ) : $this->get_post_meta( $coupon_id, 'wc_sc_taxonomy_restrictions', true ); - // If product attributes are not set in coupon, stop further processing and return from here. - if ( empty( $taxonomy_restrictions ) ) { - return $valid; - } - } else { - return $valid; - } - - $product_coupon_types = wc_get_product_coupon_types(); - - // Proceed if it is non product type coupon. - if ( ! in_array( $discount_type, $product_coupon_types, true ) ) { - if ( class_exists( 'WC_Discounts' ) && isset( WC()->cart ) ) { - $wc_cart = WC()->cart; - $wc_discounts = new WC_Discounts( $wc_cart ); - $items_to_validate = array(); - if ( is_callable( array( $wc_discounts, 'get_items_to_validate' ) ) ) { - $items_to_validate = $wc_discounts->get_items_to_validate(); - } elseif ( is_callable( array( $wc_discounts, 'get_items' ) ) ) { - $items_to_validate = $wc_discounts->get_items(); - } elseif ( isset( $wc_discounts->items ) && is_array( $wc_discounts->items ) ) { - $items_to_validate = $wc_discounts->items; - } - if ( ! empty( $items_to_validate ) && is_array( $items_to_validate ) ) { - $term_ids = $this->get_restricted_term_ids( array( 'taxonomy_restrictions' => $taxonomy_restrictions ) ); - - $include_ids = array(); - $exclude_ids = array(); - - if ( isset( $term_ids['include'] ) && is_array( $term_ids['include'] ) ) { - $include_ids = $term_ids['include']; - } - - if ( isset( $term_ids['exclude'] ) && is_array( $term_ids['exclude'] ) ) { - $exclude_ids = $term_ids['exclude']; - } - - $taxonomies = wp_list_pluck( $taxonomy_restrictions, 'tax' ); - - $valid_products = array(); - $invalid_products = array(); - foreach ( $items_to_validate as $item ) { - $cart_item = clone $item; // Clone the item so changes to wc_discounts item do not affect the originals. - $item_product = isset( $cart_item->product ) ? $cart_item->product : null; - $item_object = isset( $cart_item->object ) ? $cart_item->object : null; - if ( ! is_null( $item_product ) && ! is_null( $item_object ) ) { - if ( $coupon->is_valid_for_product( $item_product, $item_object ) ) { - $valid_products[] = $item_product; - } else { - $invalid_products[] = $item_product; - } - } - } - - // If cart does not have any valid product then throw Exception. - if ( 0 === count( $valid_products ) ) { - $error_message = __( 'Sorry, this coupon is not applicable to selected products.', 'woocommerce-smart-coupons' ); - $error_code = defined( 'E_WC_COUPON_NOT_APPLICABLE' ) ? E_WC_COUPON_NOT_APPLICABLE : 0; - throw new Exception( $error_message, $error_code ); - } elseif ( count( $invalid_products ) > 0 && ! empty( $exclude_ids ) ) { - - $excluded_products = array(); - foreach ( $invalid_products as $invalid_product ) { - $product_ids = array(); - $product_ids[] = ( is_object( $invalid_product ) && is_callable( array( $invalid_product, 'get_id' ) ) ) ? $invalid_product->get_id() : 0; - $product_ids[] = ( is_object( $invalid_product ) && is_callable( array( $invalid_product, 'get_parent_id' ) ) ) ? $invalid_product->get_parent_id() : 0; - $product_name = ( is_object( $invalid_product ) && is_callable( array( $invalid_product, 'get_name' ) ) ) ? $invalid_product->get_name() : ''; - - $args = array( - 'fields' => 'ids', - ); - $object_term_ids = wp_get_object_terms( $product_ids, $taxonomies, $args ); - $object_term_ids = array_unique( array_filter( $object_term_ids ) ); - - if ( ! empty( $object_term_ids ) && is_array( $object_term_ids ) ) { - $common_exclude_term_ids = array_intersect( $exclude_ids, $object_term_ids ); - if ( count( $common_exclude_term_ids ) > 0 ) { - $excluded_products[] = $product_name; - } - } - } - - if ( count( $excluded_products ) > 0 ) { - // If cart contains any excluded product and it is being excluded from our excluded product attributes then throw Exception. - /* translators: 1. Singular/plural label for product(s) 2. Excluded product names */ - $error_message = sprintf( __( 'Sorry, this coupon is not applicable to the %1$s: %2$s.', 'woocommerce-smart-coupons' ), _n( 'product', 'products', count( $excluded_products ), 'woocommerce-smart-coupons' ), implode( ', ', $excluded_products ) ); - $error_code = defined( 'E_WC_COUPON_EXCLUDED_PRODUCTS' ) ? E_WC_COUPON_EXCLUDED_PRODUCTS : 0; - throw new Exception( $error_message, $error_code ); - } - } - } - } - } - - return $valid; - } - - /** - * Get restricted term ids - * - * @param array $args Arguments. - * @return array - */ - public function get_restricted_term_ids( $args = array() ) { - global $wp_taxonomies; - - $term_ids = array(); - - $taxonomy_restrictions = ( ! empty( $args['taxonomy_restrictions'] ) ) ? $args['taxonomy_restrictions'] : array(); - - if ( ! empty( $taxonomy_restrictions ) ) { - $include_ids = array(); - $exclude_ids = array(); - foreach ( $taxonomy_restrictions as $taxonomy_restriction ) { - $taxonomy = ( ! empty( $taxonomy_restriction['tax'] ) ) ? $taxonomy_restriction['tax'] : ''; - $operator = ( ! empty( $taxonomy_restriction['op'] ) ) ? $taxonomy_restriction['op'] : ''; - $value = ( ! empty( $taxonomy_restriction['val'] ) ) ? $taxonomy_restriction['val'] : array(); - if ( ! empty( $taxonomy ) && ! empty( $operator ) && ! empty( $value ) ) { - $args = array( - 'taxonomy' => $taxonomy, - 'hide_empty' => false, - 'fields' => 'ids', - 'slug' => $value, - ); - $found_ids = get_terms( $args ); - $found_ids = array_unique( array_filter( $found_ids ) ); - if ( ! empty( $found_ids ) ) { - switch ( $operator ) { - case 'incl': - $include_ids = array_merge( $include_ids, $found_ids ); - break; - case 'excl': - $exclude_ids = array_merge( $exclude_ids, $found_ids ); - break; - } - } - } - } - if ( ! empty( $include_ids ) ) { - $term_ids['include'] = array_unique( array_filter( $include_ids ) ); - } - if ( ! empty( $exclude_ids ) ) { - $term_ids['exclude'] = array_unique( array_filter( $exclude_ids ) ); - } - } - - return $term_ids; - } - - /** - * Function to copy taxonomy restriction meta in newly generated coupon - * - * @param array $args The arguments. - */ - public function copy_coupon_taxonomy_meta( $args = array() ) { - - // Copy meta data to new coupon. - $this->copy_coupon_meta_data( - $args, - array( 'wc_sc_taxonomy_restrictions' ) - ); - - } - - /** - * Make meta data of payment method ids protected - * - * @param bool $protected Is protected. - * @param string $meta_key The meta key. - * @param string $meta_type The meta type. - * @return bool $protected - */ - public function make_action_meta_protected( $protected = false, $meta_key = '', $meta_type = '' ) { - - if ( 'wc_sc_taxonomy_restrictions' === $meta_key ) { - return true; - } - return $protected; - } - } -} - -WC_SC_Coupons_By_Taxonomy::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-user-role.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-user-role.php deleted file mode 100644 index 09d9aa61..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-coupons-by-user-role.php +++ /dev/null @@ -1,548 +0,0 @@ -is_callable( $coupon, 'get_meta' ); - - $user_role_ids = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'wc_sc_user_role_ids' ) : get_post_meta( $coupon_id, 'wc_sc_user_role_ids', true ); - if ( empty( $user_role_ids ) || ! is_array( $user_role_ids ) ) { - $user_role_ids = array(); - } - $exclude_user_role_ids = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'wc_sc_exclude_user_role_ids' ) : get_post_meta( $coupon_id, 'wc_sc_exclude_user_role_ids', true ); - if ( empty( $exclude_user_role_ids ) || ! is_array( $exclude_user_role_ids ) ) { - $exclude_user_role_ids = array(); - } - } - $available_user_roles = $this->get_available_user_roles(); - ?> -
            -

            - - - -

            -

            - - - -

            -
            - is_callable( $coupon, 'update_meta_data' ) && $this->is_callable( $coupon, 'save' ) ) { - $coupon->update_meta_data( 'wc_sc_user_role_ids', $user_role_ids ); - $coupon->update_meta_data( 'wc_sc_exclude_user_role_ids', $exclude_user_role_ids ); - $coupon->save(); - } else { - update_post_meta( $post_id, 'wc_sc_user_role_ids', $user_role_ids ); - update_post_meta( $post_id, 'wc_sc_exclude_user_role_ids', $exclude_user_role_ids ); - } - - } - - /** - * Validate the coupon based on user role - * - * @param boolean $valid Is valid or not. - * @param WC_Coupon $coupon The coupon object. - * - * @throws Exception If the coupon is invalid. - * @return boolean Is valid or not - */ - public function validate( $valid = false, $coupon = object ) { - - // If coupon is invalid already, no need for further checks. - if ( false === $valid ) { - return $valid; - } - - $coupon_id = ( $this->is_wc_gte_30() ) ? $coupon->get_id() : $coupon->id; - if ( ! is_a( $coupon, 'WC_Coupon' ) ) { - $coupon = new WC_Coupon( $coupon_id ); - } - if ( $this->is_callable( $coupon, 'get_meta' ) ) { - $user_role_ids = $coupon->get_meta( 'wc_sc_user_role_ids' ); - $exclude_user_role_ids = $coupon->get_meta( 'wc_sc_exclude_user_role_ids' ); - } else { - $user_role_ids = get_post_meta( $coupon_id, 'wc_sc_user_role_ids', true ); - $exclude_user_role_ids = get_post_meta( $coupon_id, 'wc_sc_exclude_user_role_ids', true ); - } - - $current_user = wp_get_current_user(); - - $post_action = ( ! empty( $_POST['action'] ) ) ? wc_clean( wp_unslash( $_POST['action'] ) ) : ''; // phpcs:ignore - - if ( is_admin() && wp_doing_ajax() && 'woocommerce_add_coupon_discount' === $post_action ) { // This condition will allow the addition of coupon from admin side, in the order even if the user role is not matching. - return true; - } - - if ( is_array( $user_role_ids ) && ! empty( $user_role_ids ) ) { - // Check if current user's role is allowed. - if ( ! array_intersect( $current_user->roles, $user_role_ids ) ) { - throw new Exception( __( 'This coupon is not valid for you.', 'woocommerce-smart-coupons' ) ); - } - } - - if ( is_array( $exclude_user_role_ids ) && ! empty( $exclude_user_role_ids ) ) { - // Check if current user's role is excluded. - if ( array_intersect( $current_user->roles, $exclude_user_role_ids ) ) { - throw new Exception( __( 'This coupon is not valid for you.', 'woocommerce-smart-coupons' ) ); - } - } - - return $valid; - - } - - /** - * Add meta in export headers - * - * @param array $headers Existing headers. - * @return array - */ - public function export_headers( $headers = array() ) { - - $headers['wc_sc_user_role_ids'] = __( 'User Role', 'woocommerce-smart-coupons' ); - $headers['wc_sc_exclude_user_role_ids'] = __( 'Exclude User Role', 'woocommerce-smart-coupons' ); - - return $headers; - - } - - /** - * Function to handle coupon meta data during export of existing coupons - * - * @param mixed $meta_value The meta value. - * @param array $args Additional arguments. - * @return string Processed meta value - */ - public function export_coupon_meta_data( $meta_value = '', $args = array() ) { - - if ( ! empty( $args['meta_key'] ) ) { - if ( 'wc_sc_user_role_ids' === $args['meta_key'] ) { - if ( isset( $args['meta_value'] ) && ! empty( $args['meta_value'] ) ) { - $user_role_ids = maybe_unserialize( stripslashes( $args['meta_value'] ) ); - if ( is_array( $user_role_ids ) && ! empty( $user_role_ids ) ) { - $user_role_names = $this->get_user_role_names_by_ids( $user_role_ids ); - if ( is_array( $user_role_names ) && ! empty( $user_role_names ) ) { - $meta_value = implode( '|', wc_clean( wp_unslash( $user_role_names ) ) ); // Replace user role ids with their respective role name. - } - } - } - } elseif ( 'wc_sc_exclude_user_role_ids' === $args['meta_key'] ) { - if ( isset( $args['meta_value'] ) && ! empty( $args['meta_value'] ) ) { - $exclude_user_role_ids = maybe_unserialize( stripslashes( $args['meta_value'] ) ); - if ( is_array( $exclude_user_role_ids ) && ! empty( $exclude_user_role_ids ) ) { - $exclude_user_role_names = $this->get_user_role_names_by_ids( $exclude_user_role_ids ); - if ( is_array( $exclude_user_role_names ) && ! empty( $exclude_user_role_names ) ) { - $meta_value = implode( '|', wc_clean( wp_unslash( $exclude_user_role_names ) ) ); // Replace user role ids with their respective role name. - } - } - } - } - } - - return $meta_value; - - } - - /** - * Post meta defaults for user role ids meta - * - * @param array $defaults Existing postmeta defaults. - * @return array - */ - public function postmeta_defaults( $defaults = array() ) { - - $defaults['wc_sc_user_role_ids'] = ''; - $defaults['wc_sc_exclude_user_role_ids'] = ''; - - return $defaults; - } - - /** - * Add user role's meta with value in coupon meta - * - * @param array $data The row data. - * @param array $post The POST values. - * @return array Modified data - */ - public function generate_coupon_meta( $data = array(), $post = array() ) { - - $user_role_names = ''; - $exclude_user_role_names = ''; - - if ( ! empty( $post['wc_sc_user_role_ids'] ) && is_array( $post['wc_sc_user_role_ids'] ) ) { - $user_role_names = $this->get_user_role_names_by_ids( $post['wc_sc_user_role_ids'] ); - if ( is_array( $user_role_names ) && ! empty( $user_role_names ) ) { - $user_role_names = implode( '|', wc_clean( wp_unslash( $user_role_names ) ) ); - } - } - - if ( ! empty( $post['wc_sc_exclude_user_role_ids'] ) && is_array( $post['wc_sc_exclude_user_role_ids'] ) ) { - $exclude_user_role_names = $this->get_user_role_names_by_ids( $post['wc_sc_exclude_user_role_ids'] ); - if ( is_array( $exclude_user_role_names ) && ! empty( $exclude_user_role_names ) ) { - $exclude_user_role_names = implode( '|', wc_clean( wp_unslash( $exclude_user_role_names ) ) ); - } - } - - $data['wc_sc_user_role_ids'] = $user_role_names; // Replace user role ids with their respective role name. - $data['wc_sc_exclude_user_role_ids'] = $exclude_user_role_names; // Replace user role ids with their respective role name. - - return $data; - } - - /** - * Function to get user role titles for given user role ids - * - * @param array $user_role_ids ids of user roles. - * @return array $user_role_names titles of user roles - */ - public function get_user_role_names_by_ids( $user_role_ids = array() ) { - - $user_role_names = array(); - - if ( is_array( $user_role_ids ) && ! empty( $user_role_ids ) ) { - $available_user_roles = $this->get_available_user_roles(); - foreach ( $user_role_ids as $index => $user_role_id ) { - $user_role = ( isset( $available_user_roles[ $user_role_id ] ) && ! empty( $available_user_roles[ $user_role_id ] ) ) ? $available_user_roles[ $user_role_id ] : ''; - if ( is_array( $user_role ) && ! empty( $user_role ) ) { - $user_role_name = ! empty( $user_role['name'] ) ? $user_role['name'] : ''; - if ( ! empty( $user_role_name ) ) { - $user_role_names[ $index ] = $user_role_name; // Replace user role id with it's repective name. - } else { - $user_role_names[ $index ] = $user_role_id; // In case of empty user role name replace it with role id. - } - } - } - } - - return $user_role_names; - } - - /** - * Process coupon meta value for import - * - * @param mixed $meta_value The meta value. - * @param array $args Additional Arguments. - * @return mixed $meta_value - */ - public function process_coupon_meta_value_for_import( $meta_value = null, $args = array() ) { - - if ( ! empty( $args['meta_key'] ) ) { - $available_user_roles = $this->get_available_user_roles(); - if ( 'wc_sc_user_role_ids' === $args['meta_key'] ) { - $meta_value = ( ! empty( $args['postmeta']['wc_sc_user_role_ids'] ) ) ? explode( '|', wc_clean( wp_unslash( $args['postmeta']['wc_sc_user_role_ids'] ) ) ) : array(); - if ( is_array( $meta_value ) && ! empty( $meta_value ) ) { - if ( is_array( $available_user_roles ) && ! empty( $available_user_roles ) ) { - foreach ( $meta_value as $index => $user_role_name ) { - foreach ( $available_user_roles as $role_id => $user_role ) { - $role_name = isset( $user_role['name'] ) ? $user_role['name'] : ''; - if ( $role_name === $user_role_name ) { - $meta_value[ $index ] = $role_id; // Replace user role title with it's repective id. - } - } - } - } - } - } elseif ( 'wc_sc_exclude_user_role_ids' === $args['meta_key'] ) { - $meta_value = ( ! empty( $args['postmeta']['wc_sc_exclude_user_role_ids'] ) ) ? explode( '|', wc_clean( wp_unslash( $args['postmeta']['wc_sc_exclude_user_role_ids'] ) ) ) : array(); - if ( is_array( $meta_value ) && ! empty( $meta_value ) ) { - if ( is_array( $available_user_roles ) && ! empty( $available_user_roles ) ) { - foreach ( $meta_value as $index => $user_role_name ) { - foreach ( $available_user_roles as $role_id => $user_role ) { - $role_name = isset( $user_role['name'] ) ? $user_role['name'] : ''; - if ( $role_name === $user_role_name ) { - $meta_value[ $index ] = $role_id; // Replace user role title with it's repective id. - } - } - } - } - } - } - } - - return $meta_value; - } - - /** - * Make meta data of user role ids protected - * - * @param bool $protected Is protected. - * @param string $meta_key The meta key. - * @param string $meta_type The meta type. - * @return bool $protected - */ - public function make_action_meta_protected( $protected = false, $meta_key = '', $meta_type = '' ) { - - if ( in_array( $meta_key, array( 'wc_sc_user_role_ids', 'wc_sc_exclude_user_role_ids' ), true ) ) { - return true; - } - return $protected; - } - - - /** - * Function to get available user roles which current user use. - * - * @return array $available_user_roles Available user roles - */ - public function get_available_user_roles() { - $available_user_roles = array(); - - if ( ! function_exists( 'get_editable_roles' ) ) { - require_once ABSPATH . 'wp-admin/includes/user.php'; - } - - if ( function_exists( 'get_editable_roles' ) ) { - $available_user_roles = get_editable_roles(); - } - - return $available_user_roles; - } - - /** - * Function to copy user role restriction meta in newly generated coupon - * - * @param array $args The arguments. - */ - public function copy_coupon_user_role_meta( $args = array() ) { - - // Copy meta data to new coupon. - $this->copy_coupon_meta_data( - $args, - array( 'wc_sc_user_role_ids', 'wc_sc_exclude_user_role_ids' ) - ); - - } - - /** - * Validate user role after checkout. - * - * @param array $posted Post data. - * @param WP_Error $errors Validation errors. - * @return void - */ - public function validate_after_checkout( $posted = array(), $errors = object ) { - - $current_user_id = get_current_user_id(); - - if ( ! empty( $current_user_id ) ) { - return; - } - - $billing_email = ! empty( $posted['billing_email'] ) ? $posted['billing_email'] : ''; - - if ( empty( $posted['billing_email'] ) ) { - return; - } - - $cart = ( function_exists( 'WC' ) && isset( WC()->cart ) ) ? WC()->cart : null; - if ( is_a( $cart, 'WC_Cart' ) ) { - $is_cart_empty = is_callable( array( $cart, 'is_empty' ) ) && $cart->is_empty(); - if ( false === $is_cart_empty ) { - $applied_coupons = ( is_callable( array( $cart, 'get_applied_coupons' ) ) ) ? $cart->get_applied_coupons() : array(); - if ( ! empty( $applied_coupons ) ) { - foreach ( $applied_coupons as $code ) { - $coupon = new WC_Coupon( $code ); - if ( ! is_object( $coupon ) ) { - continue; - } - - if ( is_callable( array( $coupon, 'get_meta' ) ) ) { - $user_role_ids = $coupon->get_meta( 'wc_sc_user_role_ids' ); - $exclude_user_role_ids = $coupon->get_meta( 'wc_sc_exclude_user_role_ids' ); - } else { - if ( is_callable( array( $coupon, 'get_id' ) ) ) { - $coupon_id = $coupon->get_id(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - } - if ( empty( $coupon_id ) ) { - continue; - } - $user_role_ids = get_post_meta( $coupon_id, 'wc_sc_user_role_ids', true ); - $exclude_user_role_ids = get_post_meta( $coupon_id, 'wc_sc_exclude_user_role_ids', true ); - } - - if ( empty( $exclude_user_role_ids ) && empty( $user_role_ids ) ) { - continue; - } - - $current_user = get_user_by( 'email', $billing_email ); - $current_user_roles = ! empty( $current_user->roles ) ? $current_user->roles : array(); - - $is_message = is_callable( array( $coupon, 'add_coupon_message' ) ); - $is_remove = is_callable( array( $cart, 'remove_coupon' ) ); - - if ( is_array( $user_role_ids ) && ! empty( $user_role_ids ) ) { - // Check if current user's role is allowed. - if ( ! array_intersect( $current_user_roles, $user_role_ids ) ) { - if ( true === $is_message ) { - $coupon->add_coupon_message( WC_Coupon::E_WC_COUPON_NOT_YOURS_REMOVED ); - } - if ( true === $is_remove ) { - $cart->remove_coupon( $code ); - } - } - } - - if ( is_array( $exclude_user_role_ids ) && ! empty( $exclude_user_role_ids ) ) { - // Check if current user's role is excluded. - if ( array_intersect( $current_user_roles, $exclude_user_role_ids ) ) { - if ( true === $is_message ) { - $coupon->add_coupon_message( WC_Coupon::E_WC_COUPON_NOT_YOURS_REMOVED ); - } - if ( true === $is_remove ) { - $cart->remove_coupon( $code ); - } - } - } - } - } - } - } - } - } -} - -WC_SC_Coupons_By_User_Role::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-display-coupons.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-display-coupons.php deleted file mode 100644 index 45f40704..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-display-coupons.php +++ /dev/null @@ -1,2458 +0,0 @@ - $this ) ); - $max_coupon_to_show = absint( $max_coupon_to_show ); - - $coupons = array(); - if ( $max_coupon_to_show > 0 ) { - $coupons = $this->sc_get_available_coupons_list( array() ); - } - - if ( empty( $coupons ) ) { - do_action( - 'wc_sc_no_available_coupons', - array( - 'available_coupons_heading' => $available_coupons_heading, - 'page' => $page, - ) - ); - return false; - } - - if ( ! wp_style_is( 'smart-coupon' ) ) { - wp_enqueue_style( 'smart-coupon' ); - } - - $design = get_option( 'wc_sc_setting_coupon_design', 'basic' ); - $background_color = get_option( 'wc_sc_setting_coupon_background_color', '#39cccc' ); - $foreground_color = get_option( 'wc_sc_setting_coupon_foreground_color', '#30050b' ); - $third_color = get_option( 'wc_sc_setting_coupon_third_color', '#39cccc' ); - - $show_coupon_description = get_option( 'smart_coupons_show_coupon_description', 'no' ); - - $valid_designs = $this->get_valid_coupon_designs(); - - if ( ! in_array( $design, $valid_designs, true ) ) { - $design = 'basic'; - } - - ?> - - show_available_coupons_before_checkout_form(); - die(); - } - - /** - * Function to show available coupons before checkout form - */ - public function show_available_coupons_before_checkout_form() { - - $smart_coupon_cart_page_text = get_option( 'smart_coupon_cart_page_text' ); - $smart_coupon_cart_page_text = ( ! empty( $smart_coupon_cart_page_text ) ) ? $smart_coupon_cart_page_text : __( 'Available Coupons (click on a coupon to use it)', 'woocommerce-smart-coupons' ); - $this->show_available_coupons( $smart_coupon_cart_page_text, 'checkout' ); - - } - - /** - * Check if store credit is valid based on amount - * - * @param boolean $is_valid Validity. - * @param array $args Additional arguments. - * @return boolean Validity. - */ - public function show_as_valid( $is_valid = false, $args = array() ) { - - $coupon = ( ! empty( $args['coupon_obj'] ) ) ? $args['coupon_obj'] : false; - - if ( empty( $coupon ) ) { - return $is_valid; - } - - if ( $this->is_wc_gte_30() ) { - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - - $coupon_amount = $this->get_amount( $coupon, true ); - - if ( true === $is_valid && 'smart_coupon' === $discount_type && empty( $coupon_amount ) ) { - return false; - } - - return $is_valid; - } - - /** - * Hooks for handling display of coupons on My Account page - */ - public function myaccount_display_coupons() { - - $is_show_on_my_account = get_option( 'woocommerce_smart_coupon_show_my_account', 'yes' ); - - if ( 'yes' !== $is_show_on_my_account ) { - return; - } - - if ( $this->is_wc_gte_26() ) { - add_filter( 'woocommerce_get_query_vars', array( $this, 'sc_add_query_vars' ) ); - // Change the My Account page title. - add_filter( 'the_title', array( $this, 'sc_endpoint_title' ) ); - // Inserting our new tab/page into the My Account page. - add_filter( 'woocommerce_account_menu_items', array( $this, 'sc_new_menu_items' ) ); - add_action( 'woocommerce_account_' . self::$endpoint . '_endpoint', array( $this, 'sc_endpoint_content' ) ); - } else { - add_action( 'woocommerce_before_my_account', array( $this, 'show_smart_coupon_balance' ) ); - add_action( 'woocommerce_before_my_account', array( $this, 'generated_coupon_details_before_my_account' ) ); - } - - } - - /** - * Function to show gift certificates that are attached with the product - */ - public function show_attached_gift_certificates() { - global $post; - - if ( empty( $post->ID ) ) { - return; - } - - $is_show_associated_coupons = get_option( 'smart_coupons_is_show_associated_coupons', 'no' ); - - if ( 'yes' !== $is_show_associated_coupons ) { - return; - } - - add_action( 'wp_footer', array( $this, 'attached_coupons_styles_and_scripts' ) ); - - ?> -
            - - ID ); - ?> - - get_coupon_titles( array( 'product_object' => $_product ) ); - - if ( $this->is_wc_gte_30() ) { - $product_type = ( is_object( $_product ) && is_callable( array( $_product, 'get_type' ) ) ) ? $_product->get_type() : ''; - } else { - $product_type = ( ! empty( $_product->product_type ) ) ? $_product->product_type : ''; - } - - $sell_sc_at_less_price = get_option( 'smart_coupons_sell_store_credit_at_less_price', 'no' ); - $generated_credit_includes_tax = $this->is_generated_store_credit_includes_tax(); - - if ( 'yes' === $sell_sc_at_less_price ) { - if ( is_a( $_product, 'WC_Product_Variable' ) ) { - $price = ( is_object( $_product ) && is_callable( array( $_product, 'get_variation_regular_price' ) ) ) ? $_product->get_variation_regular_price( 'max' ) : 0; - } else { - $price = ( is_object( $_product ) && is_callable( array( $_product, 'get_regular_price' ) ) ) ? $_product->get_regular_price() : 0; - } - } else { - if ( is_a( $_product, 'WC_Product_Variable' ) ) { - $price = ( is_object( $_product ) && is_callable( array( $_product, 'get_variation_price' ) ) ) ? $_product->get_variation_price( 'max' ) : 0; - } else { - $price = ( is_object( $_product ) && is_callable( array( $_product, 'get_price' ) ) ) ? $_product->get_price() : 0; - } - } - - if ( $coupon_titles && count( $coupon_titles ) > 0 && ! empty( $price ) ) { - - $all_discount_types = wc_get_coupon_types(); - $smart_coupons_product_page_text = get_option( 'smart_coupon_product_page_text' ); - $smart_coupons_product_page_text = ( ! empty( $smart_coupons_product_page_text ) ) ? $smart_coupons_product_page_text : __( 'You will get following coupon(s) when you buy this item:', 'woocommerce-smart-coupons' ); - - $list_started = true; - - ob_start(); - - foreach ( $coupon_titles as $coupon_title ) { - - $coupon = new WC_Coupon( $coupon_title ); - - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - continue; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - continue; - } - $discount_type = $coupon->get_discount_type(); - $is_free_shipping = ( $coupon->get_free_shipping() ) ? 'yes' : 'no'; - $product_ids = $coupon->get_product_ids(); - $excluded_product_ids = $coupon->get_excluded_product_ids(); - $product_categories = $coupon->get_product_categories(); - $excluded_product_categories = $coupon->get_excluded_product_categories(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - $product_ids = ( ! empty( $coupon->product_ids ) ) ? $coupon->product_ids : array(); - $excluded_product_ids = ( ! empty( $coupon->exclude_product_ids ) ) ? $coupon->exclude_product_ids : array(); - $product_categories = ( ! empty( $coupon->product_categories ) ) ? $coupon->product_categories : array(); - $excluded_product_categories = ( ! empty( $coupon->exclude_product_categories ) ) ? $coupon->exclude_product_categories : array(); - } - - $coupon_amount = $this->get_amount( $coupon, true ); - - $is_pick_price_of_product = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'is_pick_price_of_product' ) : get_post_meta( $coupon_id, 'is_pick_price_of_product', true ); - - if ( $list_started && ! empty( $discount_type ) ) { - echo '
            '; - echo '

            ' . esc_html( wp_unslash( $smart_coupons_product_page_text ) ) . ''; - echo '

              '; - $list_started = false; - } - - switch ( $discount_type ) { - - case 'smart_coupon': - /* translators: %s: singular name for store credit */ - $credit_label = ! empty( $store_credit_label['singular'] ) ? sprintf( __( '%s of ', 'woocommerce-smart-coupons' ), esc_html( ucwords( $store_credit_label['singular'] ) ) ) : __( 'Store Credit of ', 'woocommerce-smart-coupons' ); - if ( 'yes' === $is_pick_price_of_product ) { - $amount = ( $price > 0 ) ? $credit_label . wc_price( $price ) : ''; - } else { - $amount = ( ! empty( $coupon_amount ) ) ? $credit_label . wc_price( $coupon_amount ) : ''; - } - - break; - - case 'fixed_cart': - $amount = wc_price( $coupon_amount ) . esc_html__( ' discount on your entire purchase', 'woocommerce-smart-coupons' ); - break; - - case 'fixed_product': - if ( ! empty( $product_ids ) || ! empty( $excluded_product_ids ) || ! empty( $product_categories ) || ! empty( $excluded_product_categories ) ) { - $discount_on_text = esc_html__( 'some products', 'woocommerce-smart-coupons' ); - } else { - $discount_on_text = esc_html__( 'all products', 'woocommerce-smart-coupons' ); - } - $amount = wc_price( $coupon_amount ) . esc_html__( ' discount on ', 'woocommerce-smart-coupons' ) . $discount_on_text; - break; - - case 'percent_product': - if ( ! empty( $product_ids ) || ! empty( $excluded_product_ids ) || ! empty( $product_categories ) || ! empty( $excluded_product_categories ) ) { - $discount_on_text = esc_html__( 'some products', 'woocommerce-smart-coupons' ); - } else { - $discount_on_text = esc_html__( 'all products', 'woocommerce-smart-coupons' ); - } - $amount = $coupon_amount . '%' . esc_html__( ' discount on ', 'woocommerce-smart-coupons' ) . $discount_on_text; - break; - - case 'percent': - if ( ! empty( $product_ids ) || ! empty( $excluded_product_ids ) || ! empty( $product_categories ) || ! empty( $excluded_product_categories ) ) { - $discount_on_text = esc_html__( 'some products', 'woocommerce-smart-coupons' ); - } else { - $discount_on_text = esc_html__( 'your entire purchase', 'woocommerce-smart-coupons' ); - } - $max_discount_text = ''; - $max_discount = $this->get_post_meta( $coupon_id, 'wc_sc_max_discount', true, true ); - if ( ! empty( $max_discount ) && is_numeric( $max_discount ) ) { - /* translators: %s: Maximum coupon discount amount */ - $max_discount_text = sprintf( __( ' upto %s', 'woocommerce-smart-coupons' ), wc_price( $max_discount ) ); - } - $amount = $coupon_amount . '%' . esc_html__( ' discount', 'woocommerce-smart-coupons' ) . $max_discount_text . esc_html__( ' on ', 'woocommerce-smart-coupons' ) . $discount_on_text; - break; - - default: - $default_coupon_type = ( ! empty( $all_discount_types[ $discount_type ] ) ) ? $all_discount_types[ $discount_type ] : ucwords( str_replace( array( '_', '-' ), ' ', $discount_type ) ); - $coupon_amount = apply_filters( 'wc_sc_coupon_amount', $coupon_amount, $coupon ); - /* translators: 1. Discount type 2. Discount amount */ - $amount = sprintf( esc_html__( '%1$s coupon of %2$s', 'woocommerce-smart-coupons' ), $default_coupon_type, $coupon_amount ); - $amount = apply_filters( 'wc_sc_coupon_description', $amount, $coupon ); - break; - - } - - if ( 'yes' === $is_free_shipping && in_array( $discount_type, array( 'fixed_cart', 'fixed_product', 'percent_product', 'percent' ), true ) ) { - /* translators: Add more detail to coupon description */ - $amount = sprintf( esc_html__( '%s Free Shipping', 'woocommerce-smart-coupons' ), ( ( ! empty( $coupon_amount ) ) ? $amount . esc_html__( ' &', 'woocommerce-smart-coupons' ) : '' ) ); - } - - if ( ! empty( $amount ) ) { - // Allow third party developers to modify the text being shown for the linked coupons. - $amount = apply_filters( 'wc_sc_linked_coupon_text', $amount, array( 'coupon' => $coupon ) ); - - // Mostly escaped earlier hence not escaping because it might have some HTML code. - echo '
            • ' . $amount . '
            • '; // phpcs:ignore - } - } - - if ( ! $list_started ) { - echo '

            '; - } - - $response = ob_get_clean(); - - } - } - - echo wp_kses_post( $response ); - - die(); - } - - /** - * Function to allow CSS from this plugin - * - * @param boolean $allow_css Whether the CSS in the test string is considered safe. - * @param string $css_test_string The CSS string to test. - * @return boolean - */ - public function check_safecss( $allow_css = false, $css_test_string = '' ) { - $backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $backtrace_functions = wp_list_pluck( $backtrace, 'function' ); - $allowed_css = array( - 'sc-color', - ); - if ( false === $allow_css && in_array( 'sc_endpoint_content', $backtrace_functions, true ) ) { - foreach ( $allowed_css as $css ) { - if ( false !== strpos( $css_test_string, $css ) ) { - $allow_css = true; - break; - } - } - } - return $allow_css; - } - - /** - * Replace Add to cart button with Select Option button for products which are created for purchasing credit, on shop page - */ - public function remove_add_to_cart_button_from_shop_page() { - global $product; - - if ( ! is_a( $product, 'WC_Product' ) ) { - return; - } - - if ( $this->is_wc_gte_30() ) { - $product_id = ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0; - } else { - $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; - } - - $coupons = $this->get_coupon_titles( array( 'product_object' => $product ) ); - - if ( ! empty( $coupons ) && $this->is_coupon_amount_pick_from_product_price( $coupons ) && ! ( $product->get_price() > 0 ) ) { - - $js = " - var target_class = 'wc_sc_loop_button_" . $product_id . "'; - var wc_sc_loop_button = jQuery('.' + target_class); - var wc_sc_old_element = jQuery(wc_sc_loop_button).siblings('a[data-product_id=" . $product_id . "]'); - var wc_sc_loop_button_classes = wc_sc_old_element.attr('class'); - wc_sc_loop_button.removeClass( target_class ).addClass( wc_sc_loop_button_classes ).show(); - wc_sc_old_element.remove(); - "; - - wc_enqueue_js( $js ); - - ?> - - show_available_coupons( $smart_coupon_cart_page_text, 'cart' ); - - } - - /** - * Function to display current balance associated with Gift Certificate - */ - public function show_smart_coupon_balance() { - global $store_credit_label; - - $smart_coupon_myaccount_page_text = get_option( 'smart_coupon_myaccount_page_text' ); - - /* translators: %s: plural name for store credit */ - $smart_coupons_myaccount_page_text = ( ! empty( $smart_coupon_myaccount_page_text ) ) ? $smart_coupon_myaccount_page_text : ( ! empty( $store_credit_label['plural'] ) ? sprintf( __( 'Available Coupons & %s', 'woocommerce-smart-coupons' ), ucwords( $store_credit_label['plural'] ) ) : __( 'Available Coupons & Store Credits', 'woocommerce-smart-coupons' ) ); - $this->show_available_coupons( $smart_coupons_myaccount_page_text, 'myaccount' ); - - } - - /** - * Display generated coupon's details on My Account page - */ - public function generated_coupon_details_before_my_account() { - $show_coupon_received_on_my_account = get_option( 'show_coupon_received_on_my_account', 'no' ); - - if ( is_user_logged_in() && 'yes' === $show_coupon_received_on_my_account ) { - $user_id = get_current_user_id(); - $this->get_generated_coupon_data( '', $user_id, true, true ); - } - } - - /** - * Add new query var. - * - * @param array $vars The query vars. - * @return array - */ - public function sc_add_query_vars( $vars = array() ) { - - $vars[ self::$endpoint ] = self::$endpoint; - return $vars; - } - - /** - * Set endpoint title. - * - * @param string $title The title of coupon page. - * @return string - */ - public function sc_endpoint_title( $title ) { - global $wp_query; - - $is_endpoint = isset( $wp_query->query_vars[ self::$endpoint ] ); - - if ( $is_endpoint && ! is_admin() && is_main_query() && in_the_loop() && is_account_page() ) { - // New page title. - $title = __( 'Coupons', 'woocommerce-smart-coupons' ); - remove_filter( 'the_title', array( $this, 'sc_endpoint_title' ) ); - } - - return $title; - } - - /** - * Insert the new endpoint into the My Account menu. - * - * @param array $items Existing menu items. - * @return array - */ - public function sc_new_menu_items( $items ) { - - // Remove the menu items. - if ( isset( $items['edit-address'] ) ) { - $edit_address = $items['edit-address']; - unset( $items['edit-address'] ); - } - - if ( isset( $items['payment-methods'] ) ) { - $payment_methods = $items['payment-methods']; - unset( $items['payment-methods'] ); - } - - if ( isset( $items['edit-account'] ) ) { - $edit_account = $items['edit-account']; - unset( $items['edit-account'] ); - } - - if ( isset( $items['customer-logout'] ) ) { - $logout = $items['customer-logout']; - unset( $items['customer-logout'] ); - } - - // Insert our custom endpoint. - $items[ self::$endpoint ] = __( 'Coupons', 'woocommerce-smart-coupons' ); - - // Insert back the items. - if ( ! empty( $edit_address ) ) { - $items['edit-address'] = $edit_address; - } - if ( ! empty( $payment_methods ) ) { - $items['payment-methods'] = $payment_methods; - } - if ( ! empty( $edit_account ) ) { - $items['edit-account'] = $edit_account; - } - if ( ! empty( $logout ) ) { - $items['customer-logout'] = $logout; - } - - return $items; - } - - /** - * Get coupon HTML - * - * @param array $coupon_data the coupon data. - * @return string Coupon's HTML - */ - public function get_coupon_html( $coupon_data = array() ) { - - ob_start(); - - $design = ( ! empty( $coupon_data['design'] ) ) ? $coupon_data['design'] : null; - $coupon = ( ! empty( $coupon_data['coupon_object'] ) ) ? $coupon_data['coupon_object'] : null; - $is_free_shipping = ( ! empty( $coupon_data['is_free_shipping'] ) ) ? $coupon_data['is_free_shipping'] : null; - $show_coupon_description = ( ! empty( $coupon_data['show_coupon_description'] ) ) ? $coupon_data['show_coupon_description'] : null; - $coupon_description = ( ! empty( $coupon_data['coupon_description'] ) ) ? $coupon_data['coupon_description'] : null; - - $coupon_amount = $this->get_amount( $coupon, true ); - - $coupon_type = ( ! empty( $coupon_data['coupon_type'] ) ) ? $coupon_data['coupon_type'] : ''; - - if ( 'yes' === $is_free_shipping ) { - if ( ! empty( $coupon_type ) ) { - $coupon_type .= __( ' & ', 'woocommerce-smart-coupons' ); - } - $coupon_type .= __( 'Free Shipping', 'woocommerce-smart-coupons' ); - } - - $coupon_description = ( 'yes' === $show_coupon_description ) ? $coupon_description : ''; - - $is_percent = $this->is_percent_coupon( array( 'coupon_object' => $coupon ) ); - - $args = array( - 'coupon_object' => $coupon, - 'coupon_amount' => $coupon_amount, - 'amount_symbol' => ( true === $is_percent ) ? '%' : get_woocommerce_currency_symbol(), - 'discount_type' => wp_strip_all_tags( $coupon_type ), - 'coupon_description' => ( ! empty( $coupon_description ) ) ? $coupon_description : wp_strip_all_tags( $this->generate_coupon_description( array( 'coupon_object' => $coupon ) ) ), - 'coupon_code' => $coupon_data['coupon_code'], - 'coupon_expiry' => ( ! empty( $coupon_data['expiry_date'] ) ) ? $coupon_data['expiry_date'] : __( 'Never expires', 'woocommerce-smart-coupons' ), - 'thumbnail_src' => $this->get_coupon_design_thumbnail_src( - array( - 'design' => $design, - 'coupon_object' => $coupon, - ) - ), - 'classes' => 'apply_coupons_credits', - 'template_id' => $design, - 'is_percent' => $is_percent, - ); - - wc_get_template( 'coupon-design/' . $design . '.php', $args, '', plugin_dir_path( WC_SC_PLUGIN_FILE ) . 'templates/' ); - - $html = ob_get_clean(); - - return $html; - - } - - /** - * Endpoint HTML content. - * To show available coupons on My Account page - */ - public function sc_endpoint_content() { - global $store_credit_label, $woocommerce_smart_coupon; - - $max_coupon_to_show = get_option( 'wc_sc_setting_max_coupon_to_show', 5 ); - $max_coupon_to_show = get_option( 'wc_sc_setting_max_coupon_to_show_on_myaccount', ( $max_coupon_to_show * 10 ) ); - $max_coupon_to_show = apply_filters( 'wc_sc_max_coupon_to_show_on_myaccount', $max_coupon_to_show, array( 'source' => $this ) ); - $max_coupon_to_show = absint( $max_coupon_to_show ); - - $coupons = array(); - if ( $max_coupon_to_show > 0 ) { - $coupons = $this->sc_get_available_coupons_list( array() ); - } - - if ( empty( $coupons ) ) { - ?> -
            - -
            - cart ) && is_callable( array( WC()->cart, 'get_applied_coupons' ) ) ) ? WC()->cart->get_applied_coupons() : array(); - - $available_coupons_heading = get_option( 'smart_coupon_myaccount_page_text' ); - - /* translators: %s: plural name for store credit */ - $available_coupons_heading = ( ! empty( $available_coupons_heading ) ) ? $available_coupons_heading : ( ! empty( $store_credit_label['plural'] ) ? sprintf( __( 'Available Coupons & %s', 'woocommerce-smart-coupons' ), ucwords( $store_credit_label['plural'] ) ) : __( 'Available Coupons & Store Credits', 'woocommerce-smart-coupons' ) ); - - $design = get_option( 'wc_sc_setting_coupon_design', 'basic' ); - $background_color = get_option( 'wc_sc_setting_coupon_background_color', '#39cccc' ); - $foreground_color = get_option( 'wc_sc_setting_coupon_foreground_color', '#30050b' ); - $third_color = get_option( 'wc_sc_setting_coupon_third_color', '#39cccc' ); - $show_coupon_description = get_option( 'smart_coupons_show_coupon_description', 'no' ); - - $valid_designs = $this->get_valid_coupon_designs(); - - if ( ! in_array( $design, $valid_designs, true ) ) { - $design = 'basic'; - } - - ?> - - - - - -

            -

            - - - - array( - 'html' => array(), - ), - 'valid_coupons' => array( - 'html' => array(), - ), - 'invalid_coupons' => array( - 'html' => array(), - ), - ); - - $total_store_credit = 0; - $coupons_to_print = array(); - - foreach ( $coupons as $code ) { - - if ( in_array( $code->post_title, $coupons_applied, true ) ) { - continue; - } - - $coupon_id = wc_get_coupon_id_by_code( $code->post_title ); - - if ( empty( $coupon_id ) ) { - continue; - } - - if ( $max_coupon_to_show <= 0 ) { - break; - } - - $coupon = new WC_Coupon( $code->post_title ); - - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - continue; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - continue; - } - $is_free_shipping = ( $coupon->get_free_shipping() ) ? 'yes' : 'no'; - $discount_type = $coupon->get_discount_type(); - $expiry_date = $coupon->get_date_expires(); - $coupon_code = $coupon->get_code(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $expiry_date = ( ! empty( $coupon->expiry_date ) ) ? $coupon->expiry_date : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - $coupon_amount = $this->get_amount( $coupon, true ); - - if ( $this->is_wc_gte_30() && $expiry_date instanceof WC_DateTime ) { - $expiry_date = ( is_callable( array( $expiry_date, 'getTimestamp' ) ) ) ? $expiry_date->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - - if ( ! empty( $expiry_date ) && is_int( $expiry_date ) ) { - $expiry_time = ( $this->is_callable( $coupon, 'get_meta' ) ) ? (int) $coupon->get_meta( 'wc_sc_expiry_time' ) : (int) get_post_meta( $coupon_id, 'wc_sc_expiry_time', true ); - if ( ! empty( $expiry_time ) ) { - $expiry_date += $expiry_time; // Adding expiry time to expiry date. - } - } - - if ( empty( $discount_type ) ) { - continue; - } - - $coupon_post = get_post( $coupon_id ); - - $coupon_data = $this->get_coupon_meta_data( $coupon ); - - $block_data = array(); - $block_data['coupon_code'] = $coupon_code; - $block_data['coupon_amount'] = $coupon_data['coupon_amount']; - $block_data['coupon_type'] = $coupon_data['coupon_type']; - $block_data['is_free_shipping'] = $is_free_shipping; - $block_data['coupon_object'] = $coupon; - $block_data['design'] = $design; - $block_data['show_coupon_description'] = $show_coupon_description; - - if ( ! empty( $coupon_post->post_excerpt ) && 'yes' === $show_coupon_description ) { - $block_data['coupon_description'] = $coupon_post->post_excerpt; - } - - if ( ! empty( $expiry_date ) ) { - $block_data['expiry_date'] = $this->get_expiration_format( $expiry_date ); - } else { - $block_data['expiry_date'] = ''; - } - - $show_as_valid = apply_filters( 'wc_sc_show_as_valid', $coupon->is_valid(), array( 'coupon_obj' => $coupon ) ); - - if ( true === $show_as_valid ) { - $coupons_to_print[] = $block_data['coupon_code']; - $html = $this->get_coupon_html( $block_data ); - if ( 'smart_coupon' === $discount_type ) { - $total_store_credit += $coupon_amount; - $coupon_block_data['smart_coupons']['html'][] = $html; - } else { - $coupon_block_data['valid_coupons']['html'][] = $html; - } - } else { - $block_data['is_invalid'] = 'yes'; - $html = $this->get_coupon_html( $block_data ); - $coupon_block_data['invalid_coupons']['html'][] = $html; - } - - $max_coupon_to_show--; - - } - - $coupon_block_data['smart_coupons']['total'] = $total_store_credit; - - $is_print = get_option( 'smart_coupons_is_print_coupon', 'yes' ); - $is_print = apply_filters( 'wc_sc_myaccount_show_print_button', wc_string_to_bool( $is_print ), array( 'source' => $woocommerce_smart_coupon ) ); - - if ( true === $is_print && ! empty( $coupons_to_print ) ) { - $print_url = add_query_arg( - array( - 'print-coupons' => 'yes', - 'source' => 'wc-smart-coupons', - 'coupon-codes' => implode( - ',', - $coupons_to_print - ), - ) - ); - ?> - - - - - array( - 'fill' => true, - 'viewbox' => true, - 'stroke' => true, - 'class' => true, - 'style' => true, - 'xmlns' => true, - 'preserveaspectratio' => true, - ), - 'path' => array( - 'stroke-linecap' => true, - 'stroke-linejoin' => true, - 'stroke-width' => true, - 'd' => true, - 'fill' => true, - 'class' => true, - ), - 'g' => array( - 'stroke-miterlimit' => true, - 'stroke-linecap' => true, - 'stroke-linejoin' => true, - 'stroke-width' => true, - ), - 'circle' => array( - 'cx' => true, - 'cy' => true, - 'r' => true, - ), - 'defs' => array(), - 'style' => array(), - ); - - $additional_allowed_html = apply_filters( 'wc_sc_kses_allowed_html_for_coupon', $additional_allowed_html, array( 'source' => $this ) ); - - if ( ! empty( $additional_allowed_html ) ) { - foreach ( $additional_allowed_html as $tag => $attributes ) { - if ( ! empty( $attributes ) && array_key_exists( $tag, $allowed_html ) ) { - $allowed_html[ $tag ] = array_merge( $allowed_html[ $tag ], $attributes ); - } else { - $allowed_html[ $tag ] = $attributes; - } - } - } - - $smart_coupons_block = ''; - - if ( ! empty( $coupon_block_data['smart_coupons']['html'] ) ) { - $smart_coupons_block = implode( '', $coupon_block_data['smart_coupons']['html'] ); - } - - $smart_coupons_block = trim( $smart_coupons_block ); - - if ( ! empty( $smart_coupons_block ) ) { - ?> -
            -

            -
            -
            - -
            -
            - -
            - -
            -
            - - -
            -

            -
            -
            - -
            -
            -
            -
            - - generated_coupon_details_before_my_account(); - - $is_show_invalid_coupons = get_option( 'smart_coupons_show_invalid_coupons_on_myaccount', 'no' ); - if ( 'yes' === $is_show_invalid_coupons ) { - $invalid_coupons_block = ''; - - if ( ! empty( $coupon_block_data['invalid_coupons']['html'] ) ) { - $invalid_coupons_block = implode( '', $coupon_block_data['invalid_coupons']['html'] ); - } - - $invalid_coupons_block = trim( $invalid_coupons_block ); - - if ( ! empty( $invalid_coupons_block ) ) { - ?> -
            -
            -

            -

            -
            -
            - -
            -
            -
            - frontend_styles_and_scripts( array( 'page' => 'myaccount' ) ); - } - - $js = "var total_store_credit = '" . $total_store_credit . "'; - if ( total_store_credit == 0 ) { - jQuery('#sc_coupons_list').hide(); - } - - if( jQuery('div#all_coupon_container').children().length == 0 ) { - jQuery('#coupons_list').hide(); - } - - if( jQuery('div.woocommerce-MyAccount-content').children().length == 0 ) { - jQuery('.woocommerce-MyAccount-content').append(jQuery('.woocommerce-Message.woocommerce-Message--info.woocommerce-info')); - jQuery('.woocommerce-Message.woocommerce-Message--info.woocommerce-info').show(); - } - - /* to show scroll bar for core coupons */ - var coupons_list = jQuery('#coupons_list'); - var coupons_list_height = coupons_list.height(); - - if ( coupons_list_height > 400 ) { - coupons_list.css('height', '400px'); - coupons_list.css('overflow-y', 'scroll'); - } else { - coupons_list.css('height', ''); - coupons_list.css('overflow-y', ''); - } - "; - - wc_enqueue_js( $js ); - - } - - /** - * Function to get available coupons list - * - * @param array $coupons The coupons. - * @return array Modified coupons. - */ - public function sc_get_available_coupons_list( $coupons = array() ) { - - global $wpdb; - - $global_coupons = array(); - - $wpdb->query( $wpdb->prepare( 'SET SESSION group_concat_max_len=%d', 999999 ) ); // phpcs:ignore - - $global_coupons = wp_cache_get( 'wc_sc_global_coupons', 'woocommerce_smart_coupons' ); - - if ( false === $global_coupons ) { - $global_coupons_ids = get_option( 'sc_display_global_coupons' ); - - if ( ! empty( $global_coupons_ids ) ) { - $global_coupons = $wpdb->get_results( // phpcs:ignore - $wpdb->prepare( - "SELECT * - FROM {$wpdb->prefix}posts - WHERE FIND_IN_SET (ID, (SELECT GROUP_CONCAT(option_value SEPARATOR ',') FROM {$wpdb->prefix}options WHERE option_name = %s)) > 0 - GROUP BY ID - ORDER BY post_date DESC", - 'sc_display_global_coupons' - ) - ); - wp_cache_set( 'wc_sc_global_coupons', $global_coupons, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_global_coupons' ); - } - } - - if ( is_scalar( $global_coupons ) ) { - $global_coupons = array(); - } - - $global_coupons = apply_filters( 'wc_smart_coupons_global_coupons', $global_coupons ); - - if ( is_user_logged_in() ) { - - global $current_user; - - if ( ! empty( $current_user->user_email ) && ! empty( $current_user->ID ) ) { - - $count_option_current_user = wp_cache_get( 'wc_sc_current_users_option_name_' . $current_user->ID, 'woocommerce_smart_coupons' ); - - if ( false === $count_option_current_user ) { - $count_option_current_user = $wpdb->get_col( // phpcs:ignore - $wpdb->prepare( - "SELECT option_name - FROM {$wpdb->prefix}options - WHERE option_name LIKE %s - ORDER BY option_id DESC", - $wpdb->esc_like( 'sc_display_custom_credit_' . $current_user->ID . '_' ) . '%' - ) - ); - wp_cache_set( 'wc_sc_current_users_option_name_' . $current_user->ID, $count_option_current_user, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_current_users_option_name_' . $current_user->ID ); - } - - if ( count( $count_option_current_user ) > 0 ) { - $count_option_current_user = substr( strrchr( $count_option_current_user[0], '_' ), 1 ); - $count_option_current_user = ( ! empty( $count_option_current_user ) ) ? $count_option_current_user + 2 : 1; - } else { - $count_option_current_user = 1; - } - - $option_nm = 'sc_display_custom_credit_' . $current_user->ID . '_' . $count_option_current_user; - $wpdb->query( $wpdb->prepare( 'SET SESSION group_concat_max_len=%d', 999999 ) ); // phpcs:ignore - $wpdb->delete( $wpdb->prefix . 'options', array( 'option_name' => $option_nm ) ); // WPCS: db call ok. - $wpdb->query( // phpcs:ignore - $wpdb->prepare( - "REPLACE INTO {$wpdb->prefix}options (option_name, option_value, autoload) - SELECT %s, - IFNULL(GROUP_CONCAT(DISTINCT p.id SEPARATOR ','), ''), - %s - FROM {$wpdb->prefix}posts AS p - JOIN {$wpdb->prefix}postmeta AS pm - ON(pm.post_id = p.ID - AND p.post_type = %s - AND p.post_status = %s - AND pm.meta_key = %s - AND pm.meta_value LIKE %s)", - $option_nm, - 'no', - 'shop_coupon', - 'publish', - 'customer_email', - '%' . $wpdb->esc_like( $current_user->user_email ) . '%' - ) - ); - - $customer_coupon_ids = get_option( $option_nm ); - - // Only execute rest of the queries if coupons found. - if ( ! empty( $customer_coupon_ids ) ) { - $wpdb->query( // phpcs:ignore - $wpdb->prepare( - "UPDATE {$wpdb->prefix}options - SET option_value = (SELECT IFNULL(GROUP_CONCAT(post_id SEPARATOR ','), '') - FROM {$wpdb->prefix}postmeta - WHERE meta_key = %s - AND CAST(meta_value AS SIGNED) >= '0' - AND FIND_IN_SET(post_id, (SELECT option_value FROM (SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = %s) as temp )) > 0 ) - WHERE option_name = %s", - 'coupon_amount', - $option_nm, - $option_nm - ) - ); - } - $coupons = wp_cache_get( 'wc_sc_all_coupon_id_for_user_' . $current_user->ID, 'woocommerce_smart_coupons' ); - - if ( false === $coupons ) { - $coupons = $wpdb->get_results( // phpcs:ignore - $wpdb->prepare( - "SELECT * - FROM {$wpdb->prefix}posts - WHERE FIND_IN_SET (ID, (SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = %s)) > 0 - GROUP BY ID - ORDER BY post_date DESC", - $option_nm - ) - ); - wp_cache_set( 'wc_sc_all_coupon_id_for_user_' . $current_user->ID, $coupons, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_all_coupon_id_for_user_' . $current_user->ID ); - } - - $wpdb->query( // phpcs:ignore - $wpdb->prepare( - "DELETE FROM {$wpdb->prefix}options WHERE option_name = %s", - $option_nm - ) - ); - } - } - - $coupons = array_merge( $coupons, $global_coupons ); - - $unique_id_to_code = array_unique( array_reverse( wp_list_pluck( $coupons, 'post_title', 'ID' ), true ) ); - - $unique_ids = array_map( 'absint', array_keys( $unique_id_to_code ) ); - - foreach ( $coupons as $index => $coupon ) { - if ( empty( $coupon->ID ) || ! in_array( absint( $coupon->ID ), $unique_ids, true ) ) { - unset( $coupons[ $index ] ); - } - } - - return $coupons; - - } - - /** - * Include frontend styles & scripts - * - * @param array $args Arguments. - */ - public function frontend_styles_and_scripts( $args = array() ) { - - if ( is_account_page() ) { - $show_myaccount_menu_icon = apply_filters( - 'wc_sc_show_myaccount_menu_icon', - $this->sc_get_option( 'wc_sc_show_myaccount_menu_icon' ), - array( - 'source' => $this, - 'args' => $args, - ) - ); - - if ( 'yes' === $show_myaccount_menu_icon ) { - if ( empty( self::$endpoint ) ) { - self::$endpoint = self::get_endpoint(); - } - ?> - - $this ) ) ) { - $url = WC_AJAX::get_endpoint( 'apply_coupon' ); - $wp_security_nonce = wp_create_nonce( 'apply-coupon' ); - $js = "function wc_sc_apply_coupon_js() { - let coupon_code = jQuery(this).data('coupon_code'); - if( coupon_code != '' && coupon_code != undefined ) { - jQuery(this).css('opacity', '0.5');"; - - if ( is_cart() ) { - $js .= "block_cart_elements( jQuery( '.woocommerce-cart-form' ) ); - block_cart_elements( jQuery( 'div.cart_totals' ) ); - block_cart_elements( jQuery( '.sc-coupons-list' ) ); "; - } else { - $js .= "block_cart_elements( jQuery( '.sc-coupons-list' ) ); "; - } - $js .= "var data = { - coupon_code: coupon_code, - security: '" . $wp_security_nonce . "' - }; - - jQuery.ajax( { - type: 'POST', - url: '" . $url . "', - data: data, - dataType: 'html',"; - if ( is_cart() ) { - $js .= "success: function( response ) { - jQuery( '.woocommerce-error, .woocommerce-message, .woocommerce-info' ).remove(); - jQuery( '.woocommerce-notices-wrapper:first' ).prepend( response ); - }, - complete: function() { - update_cart(); - jQuery( '.woocommerce-cart-form' ).removeClass( 'processing' ).unblock(); - jQuery( 'div.cart_totals' ).removeClass( 'processing' ).unblock(); - jQuery( '.sc-coupons-list' ).removeClass( 'processing' ).unblock(); - }"; - } elseif ( is_checkout() ) { - $js .= "success: function( response ) { - if ( response ) { - jQuery( '.woocommerce-error, .woocommerce-message' ).remove(); - jQuery( 'form.woocommerce-checkout' ).before( response ); - - $( document.body ).trigger( 'update_checkout', { update_shipping_method: false } ); - } - }, - complete: function() { - jQuery( '.sc-coupons-list' ).removeClass( 'processing' ).unblock(); - }"; - } else { - $js .= "success: function( response ) { - jQuery( '.woocommerce-error, .woocommerce-message, .woocommerce-info' ).remove(); - - if( jQuery('body #sc_coupons_list').length ){ - jQuery( '#sc_coupons_list' ).before( response ); - }else{ - jQuery( '#coupons_list' ).before( response ); - } - scroll_to_notices( jQuery( '[role=\"alert\"]' ) ); - }, - complete: function() { - jQuery( '.sc-coupons-list' ).removeClass( 'processing' ).unblock(); - }"; - } - - $js .= ' } ); - - } - }'; - } else { - $js = "function wc_sc_apply_coupon_js() { - let coupon_code = jQuery(this).data('coupon_code'); - - if( coupon_code != '' && coupon_code != undefined ) { - - jQuery(this).css('opacity', '0.5'); - var url = '" . trailingslashit( home_url() ) . ( ( strpos( home_url(), '?' ) === false ) ? '?' : '&' ) . ( ( ! empty( $args['page'] ) ) ? 'sc-page=' . $args['page'] : '' ) . "&coupon-code='+coupon_code; - jQuery(location).attr('href', url); - - } - }"; - } - - $js .= "var show_hide_coupon_list = function() { - if ( jQuery('div#coupons_list').find('div.sc-coupon, div.coupon-container').length > 0 ) { - jQuery('div#coupons_list').slideDown(800); - } else { - jQuery('div#coupons_list').hide(); - } - }; - - var coupon_container_height = jQuery('#all_coupon_container').height(); - if ( coupon_container_height > 400 ) { - jQuery('#all_coupon_container').css('height', '400px'); - jQuery('#all_coupon_container').css('overflow-y', 'scroll'); - } else { - jQuery('#all_coupon_container').css('height', ''); - jQuery('#all_coupon_container').css('overflow-y', ''); - } - - jQuery( document.body ).on('click', '.apply_coupons_credits', wc_sc_apply_coupon_js); - - jQuery('.checkout_coupon').next('#coupons_list').hide(); - - jQuery('a.showcoupon').on('click', function() { - show_hide_coupon_list(); - }); - - jQuery('div#invalid_coupons_list div#all_coupon_container .sc-coupon').removeClass('apply_coupons_credits'); - - function wc_sc_update_checkout() { - jQuery( document.body ).trigger('update_checkout'); - } - - function scroll_to_notices( scrollElement ){ - if ( scrollElement.length ) { - jQuery( 'html, body' ).animate( { - scrollTop: ( scrollElement.offset().top - 100 ) - }, 1000 ); - } - } - - function block_cart_elements( node ){ - if ( ! ( node.is( '.processing' ) || node.parents( '.processing' ).length ) ) { - node.addClass( 'processing' ).block( { - message: null, - overlayCSS: { - background: '#fff', - opacity: 0.6 - } - } ); - } - } - - function update_cart() - { - var cart_form = jQuery( '.woocommerce-cart-form' ); - block_cart_elements( cart_form ); - block_cart_elements( jQuery( 'div.cart_totals' ) ); - block_cart_elements( jQuery( '.sc-coupons-list' ) ); - - // Make call to actual form post URL. - jQuery.ajax( { - type: cart_form.attr( 'method' ), - url: cart_form.attr( 'action' ), - data: cart_form.serialize(), - dataType: 'html', - success: function( response ) { - var response_html = jQuery.parseHTML( response ); - var updated_cart_form = jQuery( '.woocommerce-cart-form', response_html ); - var updated_totals = jQuery( '.cart_totals', response_html ); - jQuery( '.woocommerce-cart-form' ).replaceWith( updated_cart_form ); - jQuery( '.woocommerce-cart-form' ).find( ':input[name=\"update_cart\"]' ).prop( 'disabled', true ).attr( 'aria-disabled', true ); - - jQuery( '.cart_totals' ).replaceWith( updated_totals ); - jQuery( document.body ).trigger( 'updated_cart_totals' ); - - }, - complete: function() { - scroll_to_notices( jQuery( '[role=\"alert\"]' ) ); - cart_form.removeClass( 'processing' ).unblock(); - jQuery( 'div.cart_totals' ).removeClass( 'processing' ).unblock(); - jQuery( '.sc-coupons-list' ).removeClass( 'processing' ).unblock(); - - } - } ); - }"; - - if ( is_checkout() ) { - $is_wc_session_get = function_exists( 'WC' ) && isset( WC()->session ) && is_object( WC()->session ) && is_callable( array( WC()->session, 'get' ) ); - if ( true === $is_wc_session_get ) { - $is_reload = WC()->session->get( 'wc_sc_reload_payment_method' ); - if ( 'yes' === $is_reload ) { - $js .= " - jQuery(document.body).off('change', 'input[name=payment_method]', wc_sc_update_checkout); - jQuery(document.body).on('change', 'input[name=payment_method]', wc_sc_update_checkout); - "; - } else { - $js .= " - jQuery(document.body).off('change', 'input[name=payment_method]', wc_sc_update_checkout); - "; - } - } - $js .= " - jQuery(document.body).on('applied_coupon_in_checkout', function( e, data ){ - if ( jQuery('.woocommerce .woocommerce-message').length ) { - jQuery(document.body).off('change', 'input[name=payment_method]', wc_sc_update_checkout); - } else { - jQuery(document.body).on('change', 'input[name=payment_method]', wc_sc_update_checkout); - } - }); - jQuery(document.body).on('updated_checkout', function( e, data ){ - try { - if ( data.fragments.wc_sc_available_coupons ) { - jQuery('div#coupons_list').replaceWith( data.fragments.wc_sc_available_coupons ); - jQuery( document.body ).on('click', '.apply_coupons_credits', wc_sc_apply_coupon_js); - } - } catch(e) {} - show_hide_coupon_list(); - }); - "; - } else { - $js .= ' - show_hide_coupon_list(); - '; - } - - if ( $this->is_wc_gte_26() ) { - $js .= " - if (typeof sc_available_coupons_ajax === 'undefined') { - var sc_available_coupons_ajax = null; - } - jQuery(document.body).on('updated_cart_totals update_checkout', function(){ - clearTimeout( sc_available_coupons_ajax ); - sc_available_coupons_ajax = setTimeout(function(){ - jQuery('div#coupons_list').css('opacity', '0.5'); - jQuery.ajax({ - url: '" . admin_url( 'admin-ajax.php' ) . "', - type: 'post', - dataType: 'html', - data: { - action: 'sc_get_available_coupons', - security: '" . wp_create_nonce( 'sc-get-available-coupons' ) . "' - }, - success: function( response ) { - if ( response != undefined && response != '' ) { - jQuery('div#coupons_list').replaceWith( response ); - } - show_hide_coupon_list(); - jQuery('div#coupons_list').css('opacity', '1'); - } - }); - }, 200); - });"; - } else { - $js .= " - jQuery('body').on( 'update_checkout', function( e ){ - var coupon_code = jQuery('.woocommerce-remove-coupon').data( 'coupon' ); - if ( coupon_code != undefined && coupon_code != '' ) { - jQuery('div[data-coupon_code=\"'+coupon_code+'\"].apply_coupons_credits').show(); - } - });"; - } - - wc_enqueue_js( $js ); - - do_action( 'wc_smart_coupons_frontend_styles_and_scripts' ); - - } - - /** - * Generate & add available coupons fragments - * - * @param array $fragments Existing fragments. - * @return array $fragments - */ - public function woocommerce_update_order_review_fragments( $fragments = array() ) { - - if ( ! empty( $_POST['post_data'] ) ) { // phpcs:ignore - wp_parse_str( $_POST['post_data'], $posted_data ); // phpcs:ignore - if ( empty( $_REQUEST['billing_email'] ) && ! empty( $posted_data['billing_email'] ) ) { // phpcs:ignore - $_REQUEST['billing_email'] = $posted_data['billing_email']; - } - } - - ob_start(); - $this->show_available_coupons_before_checkout_form(); - $fragments['wc_sc_available_coupons'] = ob_get_clean(); - - return $fragments; - } - - /** - * Get endpoint - * - * @return string The endpoint - */ - public static function get_endpoint() { - self::$endpoint = get_option( 'woocommerce_myaccount_wc_sc_dashboard_endpoint', 'wc-smart-coupons' ); - return self::$endpoint; - } - - /** - * Hooks for handle endpoint - */ - public function endpoint_hooks() { - if ( empty( self::$endpoint ) ) { - self::$endpoint = self::get_endpoint(); - } - if ( $this->is_wc_gte_34() ) { - add_filter( 'woocommerce_get_settings_advanced', array( $this, 'add_endpoint_account_settings' ) ); - } else { - add_filter( 'woocommerce_account_settings', array( $this, 'add_endpoint_account_settings' ) ); - } - } - - /** - * Add UI option for changing Smart Coupons endpoints in WC settings - * - * @param mixed $settings Existing settings. - * @return mixed $settings - */ - public function add_endpoint_account_settings( $settings ) { - - $sc_endpoint_setting = array( - 'title' => __( 'Coupons', 'woocommerce-smart-coupons' ), - 'desc' => __( 'Endpoint for the My Account → Coupons page', 'woocommerce-smart-coupons' ), - 'id' => 'woocommerce_myaccount_wc_sc_dashboard_endpoint', - 'type' => 'text', - 'default' => 'wc-smart-coupons', - 'desc_tip' => true, - ); - - $after_key = 'woocommerce_myaccount_view_order_endpoint'; - - $after_key = apply_filters( - 'wc_sc_endpoint_account_settings_after_key', - $after_key, - array( - 'settings' => $settings, - 'source' => $this, - ) - ); - - WC_Smart_Coupons::insert_setting_after( $settings, $after_key, $sc_endpoint_setting ); - - return $settings; - } - - /** - * Fetch generated coupon's details - * - * Either order_ids or user_ids required - * - * @param array|int $order_ids Order IDs. - * @param array|int $user_ids User IDs. - * @param boolean $html Whether to return only data or html code, optional, default:false. - * @param boolean $header Whether to add a header above the list of generated coupon details, optional, default:false. - * @param string $layout Possible values 'box' or 'table' layout to show generated coupons details, optional, default:box. - * - * @return array $generated_coupon_data associative array containing generated coupon's details - */ - public function get_generated_coupon_data( $order_ids = '', $user_ids = '', $html = false, $header = false, $layout = 'box' ) { - global $wpdb; - - if ( ! is_array( $order_ids ) ) { - $order_ids = ( ! empty( $order_ids ) ) ? array( $order_ids ) : array(); - } - - if ( ! is_array( $user_ids ) ) { - $user_ids = ( ! empty( $user_ids ) ) ? array( $user_ids ) : array(); - } - - $user_order_ids = array(); - - if ( ! empty( $user_ids ) ) { - - $user_order_ids_query = $wpdb->prepare( - "SELECT DISTINCT postmeta.post_id FROM {$wpdb->prefix}postmeta AS postmeta - WHERE postmeta.meta_key = %s - AND postmeta.meta_value", - '_customer_user' - ); - - if ( count( $user_ids ) === 1 ) { - $user_order_ids_query .= $wpdb->prepare( ' = %d', current( $user_ids ) ); - } else { - $how_many = count( $user_ids ); - $placeholders = array_fill( 0, $how_many, '%d' ); - $user_order_ids_query .= $wpdb->prepare( ' IN ( ' . implode( ',', $placeholders ) . ' )', $user_ids ); // phpcs:ignore - } - - $unique_user_ids = array_unique( $user_ids ); - - $user_order_ids = wp_cache_get( 'wc_sc_order_ids_by_user_id_' . implode( '_', $unique_user_ids ), 'woocommerce_smart_coupons' ); - - if ( false === $user_order_ids ) { - $user_order_ids = $wpdb->get_col( $user_order_ids_query ); // phpcs:ignore - wp_cache_set( 'wc_sc_order_ids_by_user_id_' . implode( '_', $unique_user_ids ), $user_order_ids, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_order_ids_by_user_id_' . implode( '_', $unique_user_ids ) ); - } - } - - $new_order_ids = array_unique( array_merge( $user_order_ids, $order_ids ) ); - - $generated_coupon_data = array(); - foreach ( $new_order_ids as $id ) { - $order = function_exists( 'wc_get_order' ) ? wc_get_order( $id ) : null; - $is_callable_order_get_meta = $this->is_callable( $order, 'get_meta' ); - $data = ( true === $is_callable_order_get_meta ) ? $order->get_meta( 'sc_coupon_receiver_details' ) : get_post_meta( $id, 'sc_coupon_receiver_details', true ); - if ( empty( $data ) ) { - continue; - } - $from = ( true === $is_callable_order_get_meta ) ? $order->get_billing_email() : get_post_meta( $id, '_billing_email', true ); - if ( empty( $generated_coupon_data[ $from ] ) ) { - $generated_coupon_data[ $from ] = array(); - } - $generated_coupon_data[ $from ] = array_merge( $generated_coupon_data[ $from ], $data ); - } - - $backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $backtrace_functions = wp_list_pluck( $backtrace, 'function' ); - if ( in_array( 'sc_generated_coupon_data_metabox', $backtrace_functions, true ) ) { - reset( $order_ids ); - $order_id = current( $order_ids ); - $from = $this->get_post_meta( $order_id, '_billing_email', true ); - $coupon_ids = $wpdb->get_col( // phpcs:ignore - $wpdb->prepare( - "SELECT DISTINCT p.ID - FROM {$wpdb->posts} AS p - LEFT JOIN {$wpdb->postmeta} AS pm - ON (p.ID = pm.post_id) - WHERE p.post_type = %s - AND p.post_status = %s - AND pm.meta_key = %s - AND (pm.meta_value = %s - OR pm.meta_value = %d )", - 'shop_coupon', - 'future', - 'generated_from_order_id', - $order_id, - $order_id - ) - ); - if ( ! empty( $coupon_ids ) && is_array( $coupon_ids ) ) { - foreach ( $coupon_ids as $coupon_id ) { - $coupon_receiver_details = $this->get_post_meta( $coupon_id, 'wc_sc_coupon_receiver_details', true ); - $from = ( ! empty( $coupon_receiver_details['gift_certificate_sender_email'] ) ) ? $coupon_receiver_details['gift_certificate_sender_email'] : $from; - if ( empty( $generated_coupon_data[ $from ] ) || ! is_array( $generated_coupon_data[ $from ] ) ) { - $generated_coupon_data[ $from ] = array(); - } - $generated_coupon_data[ $from ][] = array( - 'code' => ( ! empty( $coupon_receiver_details['coupon_details']['code'] ) ) ? $coupon_receiver_details['coupon_details']['code'] : '', - 'amount' => ( ! empty( $coupon_receiver_details['coupon_details']['amount'] ) ) ? $coupon_receiver_details['coupon_details']['amount'] : 0, - 'email' => ( ! empty( $coupon_receiver_details['gift_certificate_receiver_email'] ) ) ? $coupon_receiver_details['gift_certificate_receiver_email'] : '', - 'message' => ( ! empty( $coupon_receiver_details['message_from_sender'] ) ) ? $coupon_receiver_details['message_from_sender'] : '', - 'order_id' => ( ! empty( $order_id ) ) ? $order_id : 0, - ); - } - } - } - - if ( empty( $generated_coupon_data ) ) { - return; - } - - if ( $html ) { - - ob_start(); - if ( 'table' === $layout ) { - $this->get_generated_coupon_data_table( $generated_coupon_data ); - } else { - $this->get_generated_coupon_data_box( $generated_coupon_data ); - } - $coupon_details_html_content = ob_get_clean(); - - $found_coupon = ( 'table' === $layout ) ? ( strpos( $coupon_details_html_content, 'coupon_received_row' ) !== false ) : ( strpos( $coupon_details_html_content, ''; - - if ( $header ) { - echo '

            ' . esc_html__( 'Coupon Received', 'woocommerce-smart-coupons' ) . '

            '; - echo '

            ' . esc_html__( 'List of coupons & their details which you have received from the store. Click on the coupon to see the details.', 'woocommerce-smart-coupons' ) . '

            '; - } - - echo $coupon_details_html_content; // phpcs:ignore - - echo '
            '; - - } - - return; - - } - - return $generated_coupon_data; - } - - /** - * HTML code to display generated coupon's data in box layout - * - * @param array $generated_coupon_data Associative array containing generated coupon's details. - */ - public function get_generated_coupon_data_box( $generated_coupon_data = array() ) { - if ( empty( $generated_coupon_data ) ) { - return; - } - - $design = get_option( 'wc_sc_setting_coupon_design', 'basic' ); - $background_color = get_option( 'wc_sc_setting_coupon_background_color', '#39cccc' ); - $foreground_color = get_option( 'wc_sc_setting_coupon_foreground_color', '#30050b' ); - $third_color = get_option( 'wc_sc_setting_coupon_third_color', '#39cccc' ); - - $show_coupon_description = get_option( 'smart_coupons_show_coupon_description', 'no' ); - - $valid_designs = $this->get_valid_coupon_designs(); - - if ( ! in_array( $design, $valid_designs, true ) ) { - $design = 'basic'; - } - - $current_filter = current_filter(); - if ( 'woocommerce_email_after_order_table' === $current_filter ) { - $design = 'email-coupon'; - } - - $email = $this->get_current_user_email(); - $js = " - var switchMoreLess = function() { - var total = jQuery('details').length; - var open = jQuery('details[open]').length; - if ( open == total ) { - jQuery('a#more_less').text('" . __( 'Less details', 'woocommerce-smart-coupons' ) . "'); - } else { - jQuery('a#more_less').text('" . __( 'More details', 'woocommerce-smart-coupons' ) . "'); - } - }; - switchMoreLess(); - - jQuery('a#more_less').on('click', function(){ - var current = jQuery('details').attr('open'); - if ( current == '' || current == undefined ) { - jQuery('details').attr('open', 'open'); - jQuery('a#more_less').text('" . __( 'Less details', 'woocommerce-smart-coupons' ) . "'); - } else { - jQuery('details').removeAttr('open'); - jQuery('a#more_less').text('" . __( 'More details', 'woocommerce-smart-coupons' ) . "'); - } - }); - - jQuery('summary.generated_coupon_summary').on('mouseup', function(){ - setTimeout( switchMoreLess, 10 ); - }); - - jQuery('span.expand_collapse').show(); - - var generated_coupon_element = jQuery('#all_generated_coupon'); - var generated_coupon_container_height = generated_coupon_element.height(); - if ( generated_coupon_container_height > 400 ) { - generated_coupon_element.css('height', '400px'); - generated_coupon_element.css('overflow-y', 'scroll'); - } else { - generated_coupon_element.css('height', ''); - generated_coupon_element.css('overflow-y', ''); - } - - jQuery('#all_generated_coupon').on('click', '.coupon-container', function(){ - setTimeout(function(){ - var current_element = jQuery(this).find('details'); - var is_open = current_element.attr('open'); - if ( is_open == '' || is_open == undefined ) { - current_element.attr('open', 'open'); - } else { - current_element.removeAttr('open'); - } - }, 1); - }); - - "; - - wc_enqueue_js( $js ); - - ?> - - - - - -
            - -
            -
            - $data ) { - $order = null; - foreach ( $data as $coupon_data ) { - - if ( ! is_admin() && ! empty( $coupon_data['email'] ) && ! empty( $email ) && $coupon_data['email'] !== $email ) { - continue; - } - - if ( empty( $this->sc_coupon_exists( $coupon_data['code'] ) ) ) { - continue; - } - - $coupon = new WC_Coupon( $coupon_data['code'] ); - $order_id = ( ! empty( $coupon_data['order_id'] ) ) ? absint( $coupon_data['order_id'] ) : 0; - $order = ( ! is_a( $order, 'WC_Order' ) && ! empty( $order_id ) ) ? wc_get_order( $order_id ) : $order; - - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - continue; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - if ( true === $is_meta_box ) { - $coupon_post = ( function_exists( 'wpcom_vip_get_page_by_title' ) ) ? wpcom_vip_get_page_by_title( $coupon_data['code'], ARRAY_A, 'shop_coupon' ) : get_page_by_title( $coupon_data['code'], ARRAY_A, 'shop_coupon' ); // phpcs:ignore - if ( ! empty( $coupon_post['ID'] ) ) { - $coupon = new WC_Coupon( $coupon_post['ID'] ); - $coupon_id = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - } else { - continue; - } - } else { - continue; - } - } - $is_free_shipping = ( $coupon->get_free_shipping() ) ? 'yes' : 'no'; - $discount_type = $coupon->get_discount_type(); - $expiry_date = $coupon->get_date_expires(); - $coupon_code = $coupon->get_code(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $expiry_date = ( ! empty( $coupon->expiry_date ) ) ? $coupon->expiry_date : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - $coupon_amount = $this->get_amount( $coupon, true, $order ); - - if ( empty( $coupon_id ) || empty( $discount_type ) ) { - continue; - } - - $coupon_post = get_post( $coupon_id ); - - $coupon_meta = $this->get_coupon_meta_data( $coupon ); - - $coupon_type = ( ! empty( $coupon_meta['coupon_type'] ) ) ? $coupon_meta['coupon_type'] : ''; - - if ( 'yes' === $is_free_shipping ) { - if ( ! empty( $coupon_type ) ) { - $coupon_type .= __( ' & ', 'woocommerce-smart-coupons' ); - } - $coupon_type .= __( 'Free Shipping', 'woocommerce-smart-coupons' ); - } - - if ( $this->is_wc_gte_30() && $expiry_date instanceof WC_DateTime ) { - $expiry_date = ( is_callable( array( $expiry_date, 'getTimestamp' ) ) ) ? $expiry_date->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - - if ( ! empty( $expiry_date ) && is_int( $expiry_date ) ) { - $expiry_time = ( $this->is_callable( $coupon, 'get_meta' ) ) ? (int) $coupon->get_meta( 'wc_sc_expiry_time' ) : (int) get_post_meta( $coupon_id, 'wc_sc_expiry_time', true ); - if ( ! empty( $expiry_time ) ) { - $expiry_date += $expiry_time; // Adding expiry time to expiry date. - } - } - - $coupon_description = ''; - if ( ! empty( $coupon_post->post_excerpt ) && 'yes' === $show_coupon_description ) { - $coupon_description = $coupon_post->post_excerpt; - } - - $is_percent = $this->is_percent_coupon( array( 'coupon_object' => $coupon ) ); - - $args = array( - 'coupon_object' => $coupon, - 'coupon_amount' => $coupon_amount, - 'amount_symbol' => ( true === $is_percent ) ? '%' : get_woocommerce_currency_symbol(), - 'discount_type' => wp_strip_all_tags( $coupon_type ), - 'coupon_description' => ( ! empty( $coupon_description ) ) ? $coupon_description : wp_strip_all_tags( $this->generate_coupon_description( array( 'coupon_object' => $coupon ) ) ), - 'coupon_code' => $coupon_code, - 'coupon_expiry' => ( ! empty( $expiry_date ) ) ? $this->get_expiration_format( $expiry_date ) : __( 'Never expires', 'woocommerce-smart-coupons' ), - 'thumbnail_src' => $this->get_coupon_design_thumbnail_src( - array( - 'design' => $design, - 'coupon_object' => $coupon, - ) - ), - 'classes' => '', - 'template_id' => $design, - 'is_percent' => $is_percent, - ); - - ?> -
            -
            - - - -
            -

            :

            -

            :

            - -

            :

            - -
            -
            -
            - -
            -
            -
            - get_current_user_email(); - ?> -
            - - - - - - - - - - - - $data ) { - $email = ( ! empty( $email ) ) ? $email : $from; - foreach ( $data as $coupon_data ) { - if ( ! is_admin() && ! empty( $coupon_data['email'] ) && $coupon_data['email'] !== $email ) { - continue; - } - echo ''; - echo ''; - echo ''; // phpcs:ignore - echo ''; - echo ''; - echo ''; - echo ''; - } - } - ?> - -
            ' . esc_html( $coupon_data['code'] ) . '' . wc_price( $coupon_data['amount'] ) . '' . esc_html( $coupon_data['email'] ) . '' . esc_html( $coupon_data['message'] ) . '' . esc_html( $from ) . '
            -
            - ID, 'billing_email', true ); - $email = ( ! empty( $billing_email ) ) ? $billing_email : $current_user->user_email; - return $email; - } - - /** - * Display generated coupons details after Order table - * - * @param WC_Order $order The order. - * @param boolean $sent_to_admin Whether sent to admin. - * @param boolean $plain_text Whether a plain text email. - */ - public function generated_coupon_details_after_order_table( $order = false, $sent_to_admin = false, $plain_text = false ) { - - if ( $this->is_wc_gte_30() ) { - $order_id = ( is_object( $order ) && is_callable( array( $order, 'get_id' ) ) ) ? $order->get_id() : 0; - $order_refunds = ( ! empty( $order ) && is_callable( array( $order, 'get_refunds' ) ) ) ? $order->get_refunds() : array(); - } else { - $order_id = ( ! empty( $order->id ) ) ? $order->id : 0; - $order_refunds = ( ! empty( $order->refunds ) ) ? $order->refunds : array(); - } - - if ( ! empty( $order_refunds ) ) { - return; - } - - if ( ! empty( $order_id ) ) { - $this->get_generated_coupon_data( $order_id, '', true, true ); - } - } - - /** - * Display generated coupons details on View Order page - * - * @param int $order_id The order id. - */ - public function generated_coupon_details_view_order( $order_id = 0 ) { - if ( ! empty( $order_id ) ) { - $this->get_generated_coupon_data( $order_id, '', true, true ); - } - } - - /** - * Metabox on Order Edit Admin page to show generated coupons during the order - */ - public function add_generated_coupon_details() { - global $post; - - if ( empty( $post->post_type ) || 'shop_order' !== $post->post_type ) { - return; - } - - add_meta_box( 'sc-generated-coupon-data', __( 'Generated coupons', 'woocommerce-smart-coupons' ), array( $this, 'sc_generated_coupon_data_metabox' ), 'shop_order', 'normal' ); - } - - /** - * Metabox content (Generated coupon's details) - */ - public function sc_generated_coupon_data_metabox() { - global $post; - if ( ! empty( $post->ID ) ) { - $this->get_generated_coupon_data( $post->ID, '', true, false ); - } - } - - /** - * Modify available variation - * - * @param array $found_variation The found variation. - * @param WC_Product_Variable $product The variable product object. - * @param WC_Product_Variation $variation The variation object. - * @return array - */ - public function modify_available_variation( $found_variation = array(), $product = null, $variation = null ) { - if ( is_a( $product, 'WC_Product_Variable' ) ) { - if ( $this->is_wc_gte_30() ) { - $product_id = ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0; - } else { - $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; - } - - $coupons = $this->get_coupon_titles( array( 'product_object' => $variation ) ); - - if ( ! empty( $coupons ) && $this->is_coupon_amount_pick_from_product_price( $coupons ) ) { - if ( is_a( $variation, 'WC_Product_Variation' ) ) { - $found_variation['price_including_tax'] = wc_round_discount( wc_get_price_including_tax( $variation ), 2 ); - $found_variation['price_including_tax_html'] = wc_price( $found_variation['price_including_tax'] ); - $found_variation['price_excluding_tax'] = wc_round_discount( wc_get_price_excluding_tax( $variation ), 2 ); - $found_variation['price_excluding_tax_html'] = wc_price( $found_variation['price_excluding_tax'] ); - if ( is_callable( array( $variation, 'get_regular_price' ) ) ) { - $regular_price = $variation->get_regular_price(); - $found_variation['regular_price_including_tax'] = wc_round_discount( wc_get_price_including_tax( $variation, array( 'price' => $regular_price ) ), 2 ); - $found_variation['regular_price_including_tax_html'] = wc_price( $found_variation['regular_price_including_tax'] ); - $found_variation['regular_price_excluding_tax'] = wc_round_discount( wc_get_price_excluding_tax( $variation, array( 'price' => $regular_price ) ), 2 ); - $found_variation['regular_price_excluding_tax_html'] = wc_price( $found_variation['regular_price_excluding_tax'] ); - } - } - } - } - return $found_variation; - } - - /** - * Function to check & enable store notice for coupon - */ - public function maybe_enable_store_notice_for_coupon() { - $coupon_code = get_option( 'smart_coupons_storewide_offer_coupon_code' ); - if ( ! empty( $coupon_code ) ) { - $coupon_id = wc_get_coupon_id_by_code( $coupon_code ); - $coupon = new WC_Coupon( $coupon_id ); - $coupon_status = ( $this->is_callable( $coupon, 'get_status' ) ) ? $coupon->get_status() : get_post_status( $coupon_id ); - if ( 'publish' === $coupon_status && ! is_store_notice_showing() ) { - update_option( 'woocommerce_demo_store', 'yes' ); - } elseif ( 'publish' !== $coupon_status && is_store_notice_showing() ) { - update_option( 'woocommerce_demo_store', 'no' ); - } - } - } - - /** - * Check if the store notice needs any change & apply the change if required - * - * @param string $displayed_notice The notice to be displayed. - * @param string $raw_notice The raw notice. - * @return string - */ - public function maybe_change_store_notice( $displayed_notice = '', $raw_notice = '' ) { - $current_currency = get_woocommerce_currency(); - $base_currency = get_option( 'woocommerce_currency' ); - if ( $base_currency !== $current_currency ) { - $storewide_offer_coupon_code = get_option( 'smart_coupons_storewide_offer_coupon_code' ); - if ( ! empty( $storewide_offer_coupon_code ) && false !== stripos( $raw_notice, '' . $storewide_offer_coupon_code . '' ) ) { - if ( ! empty( $this->sc_coupon_exists( $storewide_offer_coupon_code ) ) ) { - $coupon = new WC_Coupon( $storewide_offer_coupon_code ); - $is_percent = $this->is_percent_coupon( array( 'coupon_object' => $coupon ) ); - if ( false === $is_percent ) { - $coupon_amount = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_amount' ) ) ) ? $coupon->get_amount( 'edit' ) : 0; - $search = get_woocommerce_currency_symbol( $base_currency ) . $coupon_amount; - $replace = get_woocommerce_currency_symbol( $current_currency ) . $this->convert_price( $coupon_amount, $current_currency, $base_currency ); - $displayed_notice = str_replace( $search, $replace, $displayed_notice ); - } - } - } - } - return $displayed_notice; - } - - } - -} - -WC_SC_Display_Coupons::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-global-coupons.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-global-coupons.php deleted file mode 100644 index 9c2c1d60..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-global-coupons.php +++ /dev/null @@ -1,349 +0,0 @@ -query( $wpdb->prepare( 'SET SESSION group_concat_max_len=%d', 999999 ) ); // phpcs:ignore - $wpdb->delete( $wpdb->prefix . 'options', array( 'option_name' => $global_coupon_option_name ) ); // WPCS: cache ok, db call ok. - $wpdb->query( // phpcs:ignore - $wpdb->prepare( - "REPLACE INTO {$wpdb->prefix}options (option_name, option_value, autoload) - SELECT %s, - IFNULL(GROUP_CONCAT(p.id SEPARATOR ','), ''), - %s - FROM {$wpdb->prefix}posts AS p - JOIN {$wpdb->prefix}postmeta AS pm - ON(pm.post_id = p.ID - AND p.post_type = %s - AND p.post_status = %s - AND pm.meta_key = %s - AND pm.meta_value = %s) - ", - $global_coupon_option_name, - 'no', - 'shop_coupon', - 'publish', - 'sc_is_visible_storewide', - 'yes' - ) - ); - - if ( ! empty( $this->sc_get_option( $global_coupon_option_name ) ) ) { - $wpdb->query( // phpcs:ignore - $wpdb->prepare( - "UPDATE {$wpdb->prefix}options - SET option_value = (SELECT IFNULL(GROUP_CONCAT(DISTINCT pm.post_id SEPARATOR ','), '') - FROM {$wpdb->prefix}postmeta AS pm - WHERE ( ( pm.meta_key = %s AND CAST(pm.meta_value AS CHAR) = %s ) - OR NOT EXISTS( SELECT 1 FROM {$wpdb->prefix}postmeta AS pm1 WHERE pm1.meta_key = %s AND pm.post_id = pm1.post_id ) ) - AND FIND_IN_SET(pm.post_id, (SELECT option_value FROM (SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = %s) as temp )) > 0 ) - WHERE option_name = %s", - 'customer_email', - 'a:0:{}', - 'customer_email', - $global_coupon_option_name, - $global_coupon_option_name - ) - ); - - if ( ! empty( $this->sc_get_option( $global_coupon_option_name ) ) ) { - $wpdb->query( // phpcs:ignore - $wpdb->prepare( - "UPDATE {$wpdb->prefix}options - SET option_value = (SELECT IFNULL(GROUP_CONCAT(post_id SEPARATOR ','), '') - FROM {$wpdb->prefix}postmeta - WHERE meta_key = %s - AND CAST(meta_value AS CHAR) != %s - AND FIND_IN_SET(post_id, (SELECT option_value FROM (SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = %s) as temp )) > 0 ) - WHERE option_name = %s", - 'auto_generate_coupon', - 'yes', - $global_coupon_option_name, - $global_coupon_option_name - ) - ); - - if ( ! empty( $this->sc_get_option( $global_coupon_option_name ) ) ) { - $wpdb->query( // phpcs:ignore - $wpdb->prepare( - "UPDATE {$wpdb->prefix}options - SET option_value = (SELECT IFNULL(GROUP_CONCAT(post_id SEPARATOR ','), '') - FROM {$wpdb->prefix}postmeta - WHERE meta_key = %s - AND CAST(meta_value AS CHAR) != %s - AND FIND_IN_SET(post_id, (SELECT option_value FROM (SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = %s) as temp )) > 0 ) - WHERE option_name = %s", - 'discount_type', - 'smart_coupon', - $global_coupon_option_name, - $global_coupon_option_name - ) - ); - - if ( ! empty( $this->sc_get_option( $global_coupon_option_name ) ) ) { - $wpdb->query( // phpcs:ignore - $wpdb->prepare( - "UPDATE {$wpdb->prefix}options - SET option_value = (SELECT IFNULL(GROUP_CONCAT(DISTINCT pm_expiry_date.post_id SEPARATOR ','), '') - FROM {$wpdb->prefix}postmeta AS pm_expiry_date - JOIN {$wpdb->prefix}postmeta AS pm_expiry_time - on ( pm_expiry_time.post_id = pm_expiry_date.post_id - AND pm_expiry_date.meta_key = %s - AND pm_expiry_time.meta_key = %s - ) - WHERE ( (pm_expiry_date.meta_value IS NULL OR pm_expiry_date.meta_value = '') - OR ( IFNULL(pm_expiry_date.meta_value, 0) + IFNULL(pm_expiry_time.meta_value, 0) ) > %d ) - AND FIND_IN_SET(pm_expiry_date.post_id, (SELECT option_value FROM (SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = %s) as temp )) > 0 ) - WHERE option_name = %s", - 'date_expires', - 'wc_sc_expiry_time', - time(), - $global_coupon_option_name, - $global_coupon_option_name - ) - ); - $global_coupons = $this->sc_get_option( $global_coupon_option_name ); - } - } - } - } - } - - if ( ( empty( $current_sc_version ) || version_compare( $current_sc_version, '3.3.6', '<' ) ) && ! empty( $this->sc_get_option( $global_coupon_option_name ) ) ) { - - $wpdb->query( // phpcs:ignore - $wpdb->prepare( - "UPDATE {$wpdb->prefix}options - SET autoload = %s - WHERE option_name = %s", - 'no', - $global_coupon_option_name - ) - ); - - $current_sc_version = '3.3.6'; - - update_option( 'sa_sc_db_version', $current_sc_version, 'no' ); - } - - } - - /** - * Function to update list of global coupons - * - * @param int $post_id The post id. - * @param string $action Action. - * @param WC_Coupn $coupon The coupon object. - */ - public function sc_update_global_coupons( $post_id, $action = 'add', $coupon = null ) { - if ( empty( $post_id ) ) { - return; - } - if ( 'shop_coupon' !== get_post_type( $post_id ) ) { - return; - } - - if ( is_null( $coupon ) || ! is_a( $coupon, 'WC_Coupon' ) ) { - $coupon = new WC_Coupon( $post_id ); - } - - $coupon_status = ( $this->is_callable( $coupon, 'get_status' ) ) ? $coupon->get_status() : get_post_status( $post_id ); - - if ( $this->is_callable( $coupon, 'get_meta' ) ) { - $customer_email = $coupon->get_email_restrictions(); - $sc_is_visible_storewide = $coupon->get_meta( 'sc_is_visible_storewide' ); - $auto_generate_coupon = $coupon->get_meta( 'auto_generate_coupon' ); - $discount_type = $coupon->get_discount_type(); - } else { - $coupon_meta = get_post_meta( $post_id ); - $customer_email = ( ! empty( $coupon_meta['customer_email'] ) ) ? $coupon_meta['customer_email'][0] : ''; - $sc_is_visible_storewide = ( ! empty( $coupon_meta['sc_is_visible_storewide'] ) ) ? $coupon_meta['sc_is_visible_storewide'][0] : ''; - $auto_generate_coupon = ( ! empty( $coupon_meta['auto_generate_coupon'] ) ) ? $coupon_meta['auto_generate_coupon'][0] : ''; - $discount_type = ( ! empty( $coupon_meta['discount_type'] ) ) ? $coupon_meta['discount_type'][0] : ''; - } - - $global_coupons_list = get_option( 'sc_display_global_coupons' ); - $global_coupons = ( ! empty( $global_coupons_list ) ) ? explode( ',', $global_coupons_list ) : array(); - $key = array_search( (string) $post_id, $global_coupons, true ); - - if ( ( 'publish' === $coupon_status - && ( empty( $customer_email ) || serialize( array() ) === $customer_email ) // phpcs:ignore - && ( ! empty( $sc_is_visible_storewide ) && 'yes' === $sc_is_visible_storewide ) - && ( ! empty( $auto_generate_coupon ) && 'yes' !== $auto_generate_coupon ) - && ( ! empty( $discount_type ) && 'smart_coupon' !== $discount_type ) ) - || ( 'trash' === $coupon_status && 'delete' === $action ) ) { - - if ( 'add' === $action && false === $key ) { - $global_coupons[] = $post_id; - } elseif ( 'delete' === $action && false !== $key ) { - unset( $global_coupons[ $key ] ); - } - } else { - if ( false !== $key ) { - unset( $global_coupons[ $key ] ); - } - } - - update_option( 'sc_display_global_coupons', implode( ',', array_unique( $global_coupons ) ), 'no' ); - } - - /** - * Function to update list of global coupons on trash / delete coupon - * - * @param int $post_id The post id. - */ - public function sc_delete_global_coupons( $post_id ) { - if ( empty( $post_id ) ) { - return; - } - if ( 'shop_coupon' !== get_post_type( $post_id ) ) { - return; - } - - $this->sc_update_global_coupons( $post_id, 'delete' ); - } - - /** - * Function to update list of global coupons on untrash coupon - * - * @param int $post_id The post id. - */ - public function sc_untrash_global_coupons( $post_id ) { - if ( empty( $post_id ) ) { - return; - } - if ( 'shop_coupon' !== get_post_type( $post_id ) ) { - return; - } - - $this->sc_update_global_coupons( $post_id ); - } - - /** - * Update global coupons data for sheduled coupons - * - * @param WP_Post $post The post object. - */ - public function future_to_publish_global_coupons( $post = null ) { - $post_id = ( ! empty( $post->ID ) ) ? $post->ID : 0; - - if ( empty( $post ) || empty( $post_id ) ) { - return; - } - if ( 'shop_coupon' !== $post->post_type ) { - return; - } - - $this->sc_update_global_coupons( $post_id ); - } - - /** - * Update global coupons on saving coupon - * - * @param int $post_id The post id. - * @param WC_Coupon $coupon The coupon object. - */ - public function update_global_coupons( $post_id = 0, $coupon = null ) { - if ( empty( $post_id ) ) { - return; - } - - if ( is_null( $coupon ) || ! is_a( $coupon, 'WC_Coupon' ) ) { - $coupon = new WC_Coupon( $post_id ); - } - - $this->sc_update_global_coupons( $post_id, 'add', $coupon ); - - } - - } - -} - -WC_SC_Global_Coupons::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-order-fields.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-order-fields.php deleted file mode 100644 index 8f967a6d..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-order-fields.php +++ /dev/null @@ -1,513 +0,0 @@ -get_items( 'coupon' ); - - if ( ! empty( $coupons ) ) { - - foreach ( $coupons as $item_id => $item ) { - - $code = ( is_object( $item ) && is_callable( array( $item, 'get_code' ) ) ) ? $item->get_code() : $item['code']; - - if ( empty( $code ) ) { - continue; - } - - $coupon = new WC_Coupon( $code ); - if ( ! empty( $coupon ) && $coupon instanceof WC_Coupon ) { - - if ( $this->is_wc_gte_30() ) { - $coupon_discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - $discount_type = ( ! empty( $coupon_discount_type ) ) ? $coupon_discount_type : ''; - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - - if ( 'smart_coupon' !== $discount_type ) { - continue; - } - - $discount = ( is_object( $item ) && is_callable( array( $item, 'get_discount' ) ) ) ? $item->get_discount() : $item['discount_amount']; - $discount_tax = ( is_object( $item ) && is_callable( array( $item, 'get_discount_tax' ) ) ) ? $item->get_discount_tax() : $item['discount_amount_tax']; - - $total_credit_used += $discount; - - $sc_include_tax = $this->is_store_credit_include_tax(); - // Check if discount include tax. - if ( 'yes' === $sc_include_tax && ! empty( $discount_tax ) ) { - $total_credit_used += $discount_tax; - } else { - $prices_include_tax = ( 'incl' === get_option( 'woocommerce_tax_display_cart' ) ) ? true : false; - if ( true === $prices_include_tax ) { - $apply_before_tax = get_option( 'woocommerce_smart_coupon_apply_before_tax', 'no' ); - if ( 'yes' === $apply_before_tax ) { - $_sc_include_tax = get_option( 'woocommerce_smart_coupon_include_tax', 'no' ); - if ( 'no' === $_sc_include_tax ) { - $total_credit_used += $discount_tax; - } - } - } - } - } - } - } - - return $total_credit_used; - - } - - /** - * Function to show store credit used in order admin panel - * - * @param int $order_id The order id. - */ - public function admin_order_totals_add_smart_coupons_discount_details( $order_id = 0 ) { - global $store_credit_label; - - if ( empty( $order_id ) ) { - return; - } - - $order = wc_get_order( $order_id ); - - $total_credit_used = $this->get_total_credit_used_in_order( $order ); - - if ( empty( $total_credit_used ) ) { - return; - } - - ?> - - - - - [?]: - - - is_wc_gte_30() ) { - echo wc_price( $total_credit_used, array( 'currency' => $order->get_currency() ) ); // phpcs:ignore - } else { - echo wc_price( $total_credit_used, array( 'currency' => $order->get_order_currency() ) ); // phpcs:ignore - } - ?> - - - - is_wc_gte_30() ) { - add_filter( 'woocommerce_order_get_total_discount', array( $this, 'smart_coupons_order_amount_total_discount' ), 10, 2 ); - } else { - add_filter( 'woocommerce_order_amount_total_discount', array( $this, 'smart_coupons_order_amount_total_discount' ), 10, 2 ); - } - - } - - /** - * Function to add details of discount coming from Smart Coupons - * - * @param array $total_rows All rows. - * @param WC_Order $order The order object. - * @return array $total_rows - */ - public function add_smart_coupons_discount_details( $total_rows = array(), $order = null ) { - global $store_credit_label; - - if ( empty( $order ) ) { - return $total_rows; - } - - $total_credit_used = $this->get_total_credit_used_in_order( $order ); - - $offset = array_search( 'order_total', array_keys( $total_rows ), true ); - - if ( false !== $offset && ! empty( $total_credit_used ) && ! empty( $total_rows ) ) { - $total_rows = array_merge( - array_slice( $total_rows, 0, $offset ), - array( - 'smart_coupon' => array( - /* translators: %s: singular name for store credit */ - 'label' => ! empty( $store_credit_label['singular'] ) ? sprintf( __( '%s Used:', 'woocommerce-smart-coupons' ), ucwords( $store_credit_label['singular'] ) ) : __( 'Store Credit Used:', 'woocommerce-smart-coupons' ), - 'value' => '-' . wc_price( $total_credit_used ), - ), - ), - array_slice( $total_rows, $offset, null ) - ); - - $total_discount = $order->get_total_discount(); - // code to check and manipulate 'Discount' amount based on Store Credit used. - if ( $total_discount === $total_credit_used ) { - unset( $total_rows['discount'] ); - } else { - $total_discount = $total_discount - $total_credit_used; - $total_rows['discount']['value'] = '-' . wc_price( $total_discount ); - } - } - - return $total_rows; - - } - - /** - * Function to include discounts from Smart Coupons in total discount of order - * - * @param float $total_discount Total discount. - * @param WC_Order $order The order object. - * @return float $total_discount - */ - public function smart_coupons_order_amount_total_discount( $total_discount, $order = null ) { - - // To avoid adding store credit in 'Discount' field on order admin panel. - if ( did_action( 'woocommerce_admin_order_item_headers' ) >= 1 ) { - return $total_discount; - } - - $total_credit_used = $this->get_total_credit_used_in_order( $order ); - if ( $total_credit_used > 0 ) { - $total_discount += $total_credit_used; - } - return $total_discount; - - } - - /** - * Function to add label for smart_coupons in cart total - * - * @param string $default_label Default label. - * @param WC_Coupon $coupon The coupon object. - * @return string $new_label - */ - public function cart_totals_smart_coupons_label( $default_label = '', $coupon = null ) { - global $store_credit_label; - - if ( empty( $coupon ) ) { - return $default_label; - } - - if ( $this->is_wc_gte_30() ) { - $discount_type = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - $coupon_code = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - if ( ! empty( $discount_type ) && 'smart_coupon' === $discount_type ) { - $credit_label = ! empty( $store_credit_label['singular'] ) ? ucwords( $store_credit_label['singular'] ) . ':' : __( 'Store Credit:', 'woocommerce-smart-coupons' ); - return $credit_label . ' ' . $coupon_code; - } - - return $default_label; - - } - - /** - * Modify Tax detail HTML if store credit is applied, in cart - * - * @param string $html The total html. - * @return string $html - */ - public function cart_totals_order_total_html( $html = null ) { - - if ( empty( $html ) ) { - return $html; - } - - if ( ! class_exists( 'WCS_SC_Compatibility' ) ) { - include_once 'class-wcs-compatibility.php'; - } - - $is_display_price_incl_tax = ( $this->is_wc_gte_33() ) ? WC()->cart->display_prices_including_tax() : ( 'incl' === WC()->cart->tax_display_cart ); - - if ( wc_tax_enabled() && true === $is_display_price_incl_tax ) { - - $applied_coupons = ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'get_applied_coupons' ) ) ) ? WC()->cart->get_applied_coupons() : array(); - - if ( empty( $applied_coupons ) ) { - return $html; - } - - foreach ( $applied_coupons as $code ) { - $coupon = new WC_Coupon( $code ); - if ( $this->is_wc_gte_30() ) { - $discount_type = $coupon->get_discount_type(); - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - if ( ! is_a( $coupon, 'WC_Coupon' ) || 'smart_coupon' !== $discount_type ) { - continue; - } - if ( WC()->cart->get_total() === 0 || WC()->cart->get_total() <= WC()->cart->get_taxes_total() ) { - $cart_contains_subscription = WCS_SC_Compatibility::is_cart_contains_subscription(); - $calculation_type = ''; - if ( $cart_contains_subscription ) { - $calculation_type = WC_Subscriptions_Cart::get_calculation_type(); - if ( 'recurring_total' !== $calculation_type ) { - return '' . WC()->cart->get_total() . ' '; - } else { - return $html; - } - } else { - return '' . WC()->cart->get_total() . ' '; - } - } - } - } - - return $html; - } - - - /** - * Modify Tax detail HTML if store credit is applied, in order - * - * @param string $html The order total html. - * @param WC_Order $order The order object (optional). - * @return string $html - */ - public function get_formatted_order_total( $html = null, $order = null ) { - - if ( empty( $html ) || empty( $order ) ) { - return $html; - } - - if ( $this->is_wc_gte_30() ) { - $tax_display = get_option( 'woocommerce_tax_display_cart' ); - } else { - $tax_display = ( ! empty( $order->tax_display_cart ) ) ? $order->tax_display_cart : ''; - } - - if ( wc_tax_enabled() && 'incl' === $tax_display ) { - - $applied_coupons = $this->get_coupon_codes( $order ); - - if ( empty( $applied_coupons ) ) { - return $html; - } - - foreach ( $applied_coupons as $code ) { - $coupon = new WC_Coupon( $code ); - if ( $this->is_wc_gte_30() ) { - $discount_type = $coupon->get_discount_type(); - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - if ( ! is_a( $coupon, 'WC_Coupon' ) || 'smart_coupon' !== $discount_type ) { - continue; - } - if ( $order->get_total() === 0 || $order->get_total() <= $order->get_total_tax() ) { - return wc_price( $order->get_total() ); - } - } - } - - return $html; - } - - /** - * Function to notify user about remaining balance in Store Credit in "Order Complete" email - * - * @param WC_Order $order The order object. - * @param boolean $send_to_admin Is send to admin. - * @param boolean $plain_text Is plain text email. - */ - public function show_store_credit_balance( $order = false, $send_to_admin = false, $plain_text = false ) { - global $store_credit_label; - - if ( $send_to_admin ) { - return; - } - - if ( $this->is_wc_gte_30() ) { - $order_refunds = ( ! empty( $order ) && is_callable( array( $order, 'get_refunds' ) ) ) ? $order->get_refunds() : array(); - } else { - $order_refunds = ( ! empty( $order->refunds ) ) ? $order->refunds : array(); - } - - if ( ! empty( $order_refunds ) ) { - return; - } - - $used_coupons = $this->get_coupon_codes( $order ); - if ( count( $used_coupons ) > 0 ) { - $store_credit_balance = ''; - foreach ( $used_coupons as $code ) { - if ( ! $code ) { - continue; - } - $coupon = new WC_Coupon( $code ); - if ( $this->is_wc_gte_30() ) { - $discount_type = $coupon->get_discount_type(); - $coupon_code = $coupon->get_code(); - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - $coupon_amount = $this->get_amount( $coupon, true, $order ); - - if ( 'smart_coupon' === $discount_type && $coupon_amount > 0 ) { - $store_credit_balance .= '
          • ' . $coupon_code . ' — ' . wc_price( $coupon_amount ) . '
          • '; - } - } - - if ( ! empty( $store_credit_balance ) ) { - /* translators: %s: singular name for store credit */ - $balance_left_txt = ! empty( $store_credit_label['singular'] ) ? sprintf( __( '%s Balance ', 'woocommerce-smart-coupons' ), esc_html( ucwords( $store_credit_label['singular'] ) ) ) : __( 'Store Credit / Gift Card Balance', 'woocommerce-smart-coupons' ); - echo '

            ' . esc_html( $balance_left_txt ) . ':

            '; - echo '
              ' . wp_kses_post( $store_credit_balance ) . '

            '; // phpcs:ignore - } - } - } - - /** - * Force try to find the coupon's id by code - * in some cases like when coupon is trashed - * - * @param integer $id The coupon's id. - * @param string $code The coupon code. - * @param integer $exclude_id Exclude coupon's id. - * @return integer - */ - public function get_coupon_id_from_code( $id = 0, $code = '', $exclude_id = 0 ) { - if ( empty( $id ) ) { - $backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $backtrace_functions = wp_list_pluck( $backtrace, 'function' ); - if ( in_array( 'get_total_credit_used_in_order', $backtrace_functions, true ) ) { - $index = array_search( 'get_total_credit_used_in_order', $backtrace_functions, true ); - $traced = ( ! empty( $backtrace[ $index ] ) && 'WC_SC_Order_Fields' === $backtrace[ $index ]['class'] && 'get_total_credit_used_in_order' === $backtrace[ $index ]['function'] ); - if ( true === $traced ) { - global $wpdb; - $post_id = $wpdb->get_var( // phpcs:ignore - $wpdb->prepare( - " - SELECT ID - FROM $wpdb->posts - WHERE post_title = %s - AND post_type = 'shop_coupon' - ORDER BY ID DESC - ", - $code - ) - ); - if ( ! empty( $post_id ) ) { - return absint( $post_id ); - } - } - } - } - return $id; - } - - } - -} - -WC_SC_Order_Fields::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-print-coupon.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-print-coupon.php deleted file mode 100644 index ddf6f0e8..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-print-coupon.php +++ /dev/null @@ -1,470 +0,0 @@ -template_base = dirname( WC_SC_PLUGIN_FILE ) . '/templates/'; - - // Email template location. - $print_style = get_option( 'wc_sc_coupon_print_style', 'default' ); - - $this->template_html = 'print-coupons-' . $print_style . '.php'; - - add_action( 'init', array( $this, 'may_be_save_terms_page' ) ); - add_action( 'admin_notices', array( $this, 'may_be_show_terms_notice' ) ); - add_action( 'wp_ajax_wc_sc_terms_notice_action', array( $this, 'terms_notice_action' ) ); - add_action( 'wp_loaded', array( $this, 'print_coupon_from_url' ), 20 ); - add_filter( 'display_post_states', array( $this, 'display_post_states' ), 10, 2 ); - add_filter( 'pre_delete_post', array( $this, 'prevent_deletion_of_terms_page' ), 10, 3 ); - add_filter( 'pre_trash_post', array( $this, 'prevent_deletion_of_terms_page' ), 10, 2 ); - add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts_and_styles' ), 99 ); - } - - /** - * Get single instance of WC_SC_Print_Coupon - * - * @return WC_SC_Print_Coupon Singleton object of WC_SC_Print_Coupon - */ - public static function get_instance() { - // Check if instance is already exists. - if ( is_null( self::$instance ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Handle call to functions which is not available in this class - * - * @param string $function_name The function name. - * @param array $arguments Array of arguments passed while calling $function_name. - * @return result of function call - */ - public function __call( $function_name, $arguments = array() ) { - - global $woocommerce_smart_coupon; - - if ( ! is_callable( array( $woocommerce_smart_coupon, $function_name ) ) ) { - return; - } - - if ( ! empty( $arguments ) ) { - return call_user_func_array( array( $woocommerce_smart_coupon, $function_name ), $arguments ); - } else { - return call_user_func( array( $woocommerce_smart_coupon, $function_name ) ); - } - - } - - /** - * Function to create and save terms page if already not created - */ - public function may_be_save_terms_page() { - $terms_page_option = $this->get_terms_page_option(); - $terms_page_id = get_option( $terms_page_option, false ); - - // If terms page option is not created yet or may be deleted. - if ( empty( $terms_page_id ) ) { - $terms_page_id = $this->add_terms_page(); - $this->update_terms_page_option( $terms_page_id ); - } - } - - /** - * Function to add create terms page - */ - public function add_terms_page() { - - $name = _x( 'wc-sc-coupons-terms', 'Page slug', 'woocommerce-smart-coupons' ); - $title = _x( 'Smart Coupons Terms', 'Page title', 'woocommerce-smart-coupons' ); - $terms_page_id = $this->create_page( $name, $title, '', 'private' ); - - return $terms_page_id; - } - - /** - * Utility function for creating Smart Coupons' pages - * - * @param string $slug Page slug. - * @param string $page_title Page title. - * @param string $page_content Page content. - * @param string $post_status Page status. - * @param int $post_parent Page parent. - * @return int $page_id Create page id - */ - public function create_page( $slug = '', $page_title = '', $page_content = '', $post_status = 'publish', $post_parent = 0 ) { - - $page_id = 0; - if ( empty( $slug ) ) { - return $page_id; - } - - $args = array( - 'role' => 'administrator', - 'orderby' => 'ID', - 'order' => 'ASC', - 'fields' => 'ID', - ); - - $admin_user_ids = get_users( $args ); - - $page_data = array( - 'post_author' => current( $admin_user_ids ), - 'post_status' => $post_status, - 'post_type' => 'page', - 'post_name' => $slug, - 'post_title' => $page_title, - 'post_content' => $page_content, - 'post_parent' => $post_parent, - 'comment_status' => 'closed', - ); - $page_id = wp_insert_post( $page_data ); - - return $page_id; - } - - /** - * Function to get terms page id - */ - public function get_terms_page_id() { - - $terms_page_option = $this->get_terms_page_option(); - $terms_page_id = get_option( $terms_page_option, false ); - - return $terms_page_id; - } - - /** - * Function to get the option key name for terms page - */ - public function get_terms_page_option() { - - // Option key name for Smart Coupons' term page id. - $terms_page_option = 'wc_sc_terms_page_id'; - return $terms_page_option; - } - - /** - * Function to update terms' page id in the options table - * - * @param int $terms_page_id Page parent. - */ - public function update_terms_page_option( $terms_page_id = 0 ) { - - if ( ! empty( $terms_page_id ) && is_numeric( $terms_page_id ) ) { - $terms_page_option = $this->get_terms_page_option(); - update_option( $terms_page_option, $terms_page_id, 'no' ); - } - } - - /** - * Function to show notice for entering terms' page content - */ - public function may_be_show_terms_notice() { - - global $pagenow, $post; - - $is_coupon_enabled = wc_coupons_enabled(); - // Don't show message if coupons are not enabled. - if ( false === $is_coupon_enabled ) { - return; - } - - $terms_page_id = $this->get_terms_page_id(); - // Return if terms page hasn't been set. - if ( empty( $terms_page_id ) ) { - return; - } - - $valid_post_types = array( 'shop_coupon', 'shop_order', 'product' ); - $valid_pagenow = array( 'edit.php', 'post.php', 'plugins.php' ); - $is_show_terms_notice = get_option( 'wc_sc_is_show_terms_notice', false ); - $get_post_type = ( ! empty( $post->post_type ) ) ? $post->post_type : ''; - $get_page = ( ! empty( $_GET['page'] ) ) ? wc_clean( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore - $get_tab = ( ! empty( $_GET['tab'] ) ) ? wc_clean( wp_unslash( $_GET['tab'] ) ) : ''; // phpcs:ignore - - $is_page = ( in_array( $pagenow, $valid_pagenow, true ) || in_array( $get_post_type, $valid_post_types, true ) || ( 'admin.php' === $pagenow && ( 'wc-smart-coupons' === $get_page || 'wc-smart-coupons' === $get_tab ) ) ); - - // Terms page notice. - if ( $is_page && 'no' !== $is_show_terms_notice ) { - if ( ! wp_script_is( 'jquery' ) ) { - wp_enqueue_script( 'jquery' ); - } - ?> - - -
            -
            - -
            -

            - ' . esc_html__( 'here', 'woocommerce-smart-coupons' ) . ''; ?> -

            -
            - 'no', - ); - - $option_updated = update_option( 'wc_sc_is_show_terms_notice', 'no', 'no' ); - if ( true === $option_updated ) { - $response['success'] = 'yes'; - if ( 'redirect' === $post_do ) { - $terms_page_id = $this->get_terms_page_id(); - $terms_edit_url = get_edit_post_link( $terms_page_id, 'edit' ); - if ( ! empty( $terms_edit_url ) ) { - $response['redirect_url'] = $terms_edit_url; - } - } - } - - wp_send_json( $response ); - } - - /** - * Print coupon codes along with terms' page content - */ - public function print_coupon_from_url() { - global $woocommerce_smart_coupon; - - if ( empty( $_SERVER['QUERY_STRING'] ) ) { - return; - } - - parse_str( wp_unslash( $_SERVER['QUERY_STRING'] ), $coupon_args ); // phpcs:ignore - $coupon_args = wc_clean( $coupon_args ); - - if ( ! empty( $coupon_args['print-coupons'] ) && 'yes' === $coupon_args['print-coupons'] && ! empty( $coupon_args['source'] ) && 'wc-smart-coupons' === $coupon_args['source'] && ! empty( $coupon_args['coupon-codes'] ) ) { - - $coupon_args['coupon-codes'] = urldecode( $coupon_args['coupon-codes'] ); - - $coupon_codes = explode( ',', $coupon_args['coupon-codes'] ); - - $coupon_codes = array_filter( $coupon_codes ); // Remove empty coupon codes if any. - - $coupons_data = array(); - - foreach ( $coupon_codes as $coupon_code ) { - - if ( empty( $coupon_code ) ) { - continue; - } - - $coupons_data[] = array( - 'code' => $coupon_code, - ); - } - - if ( ! empty( $coupons_data ) ) { - $terms_page_id = $this->get_terms_page_id(); - $terms_page_title = ''; - $terms_page_content = ''; - if ( ! empty( $terms_page_id ) ) { - $terms_page = get_post( $terms_page_id ); - if ( is_a( $terms_page, 'WP_Post' ) ) { - - $terms_page_title = ( ! empty( $terms_page->post_title ) ) ? $terms_page->post_title : ''; - - $terms_page_content = ( ! empty( $terms_page->post_content ) ) ? $terms_page->post_content : ''; - if ( ! empty( $terms_page_content ) ) { - $terms_page_content = apply_filters( 'the_content', $terms_page_content ); - } - } - } - $design = get_option( 'wc_sc_setting_coupon_design', 'basic' ); - $background_color = get_option( 'wc_sc_setting_coupon_background_color', '#39cccc' ); - $foreground_color = get_option( 'wc_sc_setting_coupon_foreground_color', '#30050b' ); - $third_color = get_option( 'wc_sc_setting_coupon_third_color', '#39cccc' ); - - $show_coupon_description = get_option( 'smart_coupons_show_coupon_description', 'no' ); - - $valid_designs = $this->get_valid_coupon_designs(); - - if ( ! in_array( $design, $valid_designs, true ) ) { - $design = 'basic'; - } - - $coupon_styles = $woocommerce_smart_coupon->get_coupon_styles( $design ); - - $default_path = $this->template_base; - $template_path = $woocommerce_smart_coupon->get_template_base_dir( $this->template_html ); - - wc_get_template( - $this->template_html, - array( - 'coupon_codes' => $coupons_data, - 'terms_page_title' => $terms_page_title, - 'terms_page_content' => $terms_page_content, - 'background_color' => $background_color, - 'foreground_color' => $foreground_color, - 'third_color' => $third_color, - 'coupon_styles' => $coupon_styles, - 'design' => $design, - 'show_coupon_description' => $show_coupon_description, - ), - $template_path, - $default_path - ); - } - exit; - } - - } - - /** - * Add display state for printable coupon's terms page - * - * @param array $post_states An array of post display states. - * @param WP_Post $post The current post object. - */ - public function display_post_states( $post_states, $post ) { - - $terms_page_id = $this->get_terms_page_id(); - - if ( ! empty( $post->ID ) && ! empty( $terms_page_id ) && absint( $terms_page_id ) === absint( $post->ID ) ) { - if ( isset( $post_states['private'] ) ) { - unset( $post_states['private'] ); - } - $post_states['wc_sc_coupons_terms'] = __( 'Used during coupon printing', 'woocommerce-smart-coupons' ); - } - - return $post_states; - } - - /** - * Prevent Deletion Of Terms Page - * - * @param mixed $is_delete Whether to allow deletion or not. - * @param WP_Post $post The post to delete. - * @param boolean $force_delete Whether to permanently delete or not. - * @return mixed - */ - public function prevent_deletion_of_terms_page( $is_delete = null, $post = null, $force_delete = false ) { - $terms_page_id = $this->get_terms_page_id(); - if ( ! empty( $post->ID ) && ! empty( $terms_page_id ) && absint( $terms_page_id ) === absint( $post->ID ) ) { - return false; - } - return $is_delete; - } - - /** - * Scripts & styles - */ - public function enqueue_scripts_and_styles() { - global $woocommerce_smart_coupon; - - if ( empty( $_SERVER['QUERY_STRING'] ) ) { - return; - } - - parse_str( wp_unslash( $_SERVER['QUERY_STRING'] ), $coupon_args ); // phpcs:ignore - $coupon_args = wc_clean( $coupon_args ); - - $design = get_option( 'wc_sc_setting_coupon_design', 'basic' ); - - if ( ! empty( $coupon_args['print-coupons'] ) && 'yes' === $coupon_args['print-coupons'] && ! empty( $coupon_args['source'] ) && 'wc-smart-coupons' === $coupon_args['source'] && ! empty( $coupon_args['coupon-codes'] ) ) { - if ( 'custom-design' !== $design ) { - if ( ! wp_style_is( 'smart-coupon-designs' ) ) { - wp_enqueue_style( 'smart-coupon-designs' ); - } - } - } - } - - } - -} - -WC_SC_Print_Coupon::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-privacy.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-privacy.php deleted file mode 100644 index d26f4dc2..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-privacy.php +++ /dev/null @@ -1,783 +0,0 @@ -plugin_data = WC_Smart_Coupons::get_smart_coupons_plugin_data(); - - parent::__construct( $this->plugin_data['Name'] ); - - /* translators: Plugin's name */ - $this->add_exporter( WC_SC_PLUGIN_DIRNAME . '-coupon-data-exporter', sprintf( __( '%s - Coupon Personal Data Exporter', 'woocommerce-smart-coupons' ), $this->plugin_data['Name'] ), array( $this, 'wc_sc_coupon_data_exporter' ) ); - /* translators: Plugin's name */ - $this->add_eraser( WC_SC_PLUGIN_DIRNAME . '-coupon-data-eraser', sprintf( __( '%s - Coupon Personal Data Eraser', 'woocommerce-smart-coupons' ), $this->plugin_data['Name'] ), array( $this, 'wc_sc_coupon_data_eraser' ) ); - - /* translators: Plugin's name */ - $this->add_exporter( WC_SC_PLUGIN_DIRNAME . '-order-data-exporter', sprintf( __( '%s - Order Personal Data Exporter', 'woocommerce-smart-coupons' ), $this->plugin_data['Name'] ), array( $this, 'wc_sc_order_data_exporter' ) ); - /* translators: Plugin's name */ - $this->add_eraser( WC_SC_PLUGIN_DIRNAME . '-order-data-eraser', sprintf( __( '%s - Order Personal Data Eraser', 'woocommerce-smart-coupons' ), $this->plugin_data['Name'] ), array( $this, 'wc_sc_order_data_eraser' ) ); - - /* translators: Plugin's name */ - $this->add_exporter( WC_SC_PLUGIN_DIRNAME . '-user-data-exporter', sprintf( __( '%s - User Personal Data Exporter', 'woocommerce-smart-coupons' ), $this->plugin_data['Name'] ), array( $this, 'wc_sc_user_data_exporter' ) ); - /* translators: Plugin's name */ - $this->add_eraser( WC_SC_PLUGIN_DIRNAME . '-user-data-eraser', sprintf( __( '%s - User Personal Data Eraser', 'woocommerce-smart-coupons' ), $this->plugin_data['Name'] ), array( $this, 'wc_sc_user_data_eraser' ) ); - - add_action( 'woocommerce_privacy_before_remove_order_personal_data', array( $this, 'remove_order_personal_data' ) ); - - add_filter( 'woocommerce_get_settings_account', array( $this, 'account_settings' ) ); - } - - /** - * Get single instance of WC_SC_Privacy - * - * @return WC_SC_Privacy Singleton object of WC_SC_Privacy - */ - public static function get_instance() { - // Check if instance is already exists. - if ( is_null( self::$instance ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Handle call to functions which is not available in this class - * - * @param string $function_name The function name. - * @param array $arguments Array of arguments passed while calling $function_name. - * @return result of function call - */ - public function __call( $function_name, $arguments = array() ) { - - global $woocommerce_smart_coupon; - - if ( ! is_callable( array( $woocommerce_smart_coupon, $function_name ) ) ) { - return; - } - - if ( ! empty( $arguments ) ) { - return call_user_func_array( array( $woocommerce_smart_coupon, $function_name ), $arguments ); - } else { - return call_user_func( array( $woocommerce_smart_coupon, $function_name ) ); - } - - } - - /** - * Gets the message of the privacy to display. - */ - public function get_privacy_message() { - - $content = '

            ' . esc_html__( 'Store Credit/Gift Certificate', 'woocommerce-smart-coupons' ) . '

            - ' . esc_html__( 'What we access?', 'woocommerce-smart-coupons' ) . ' -
              -
            • ' . esc_html__( 'If you are logged in: We access your billing email address saved in your account & billing email address entered during purchase', 'woocommerce-smart-coupons' ) . '
            • -
            • ' . esc_html__( 'If you are a visitor: We access your billing email address entered during purchase', 'woocommerce-smart-coupons' ) . '
            • -
            - ' . esc_html__( 'What we store & why?', 'woocommerce-smart-coupons' ) . ' -
              -
            • ' . esc_html__( 'Coupon code generated for you', 'woocommerce-smart-coupons' ) . '
            • -
            • ' . esc_html__( 'Coupon code passed via URL', 'woocommerce-smart-coupons' ) . '
            • -
            • ' . esc_html__( 'Coupon amount, email & message entered for gift card receiver', 'woocommerce-smart-coupons' ) . '
            • -
            -

            ' . esc_html__( 'We store these data so that we can process it for you whenever required.', 'woocommerce-smart-coupons' ) . '

            '; - - return $content; - - } - - /** - * Returns Smart Coupons data based on email. - * - * @param string $email_address The email address. - * @param int $page Pagination. - * - * @return array - */ - protected function get_wc_sc_data( $email_address, $page ) { - - global $wpdb; - - $wpdb->query( $wpdb->prepare( 'SET SESSION group_concat_max_len=%d', 999999 ) ); // phpcs:ignore - - $results = wp_cache_get( 'wc_sc_coupon_data_' . sanitize_key( $email_address ), 'woocommerce_smart_coupons' ); - - if ( false === $results ) { - $results = $wpdb->get_results( // phpcs:ignore - $wpdb->prepare( - "SELECT p.ID, - p.post_title, - p.post_date, - GROUP_CONCAT( pm.meta_key ORDER BY pm.meta_id SEPARATOR '###' ) AS meta_keys, - GROUP_CONCAT( pm.meta_value ORDER BY pm.meta_id SEPARATOR '###' ) AS meta_values - FROM $wpdb->posts AS p - LEFT JOIN $wpdb->postmeta AS pm - ON ( p.ID = pm.post_id AND p.post_type = %s AND pm.meta_key IN ( %s, %s, %s ) ) - WHERE pm.meta_value = %s - OR pm.meta_value LIKE %s - OR pm.meta_value <> '' - GROUP BY p.ID - ORDER BY p.ID", - 'shop_coupon', - 'discount_type', - 'customer_email', - 'generated_from_order_id', - 'smart_coupon', - '%' . $wpdb->esc_like( $email_address ) . '%' - ), - ARRAY_A - ); - wp_cache_set( 'wc_sc_coupon_data_' . sanitize_key( $email_address ), $results, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_coupon_data_' . sanitize_key( $email_address ) ); - } - - $coupon_data = array(); - - if ( ! empty( $results ) ) { - foreach ( $results as $result ) { - - $meta_keys = ( ! empty( $result['meta_keys'] ) ) ? explode( '###', $result['meta_keys'] ) : array(); - $meta_values = ( ! empty( $result['meta_values'] ) ) ? explode( '###', $result['meta_values'] ) : array(); - - if ( count( $meta_keys ) === count( $meta_values ) ) { - $meta_values = array_map( 'maybe_unserialize', $meta_values ); - $meta = array_combine( $meta_keys, $meta_values ); - if ( empty( $meta['discount_type'] ) || 'smart_coupon' !== $meta['discount_type'] ) { - continue; - } - unset( $meta['discount_type'] ); - if ( empty( $meta['customer_email'] ) ) { - continue; - } - $customer_emails = array_unique( $meta['customer_email'] ); - $common_email = array_intersect( array( $email_address ), $customer_emails ); - if ( empty( $common_email ) ) { - continue; - } - $meta['customer_email'] = current( $common_email ); - } else { - continue; - } - - if ( empty( $coupon_data[ $result['ID'] ] ) || ! is_array( $coupon_data[ $result['ID'] ] ) ) { - $coupon_data[ $result['ID'] ] = array(); - } - - $coupon_data[ $result['ID'] ]['coupon_id'] = $result['ID']; - $coupon_data[ $result['ID'] ]['coupon_code'] = $result['post_title']; - $coupon_data[ $result['ID'] ]['created_date'] = $result['post_date']; - - if ( ! empty( $meta ) ) { - foreach ( $meta as $key => $value ) { - $coupon_data[ $result['ID'] ][ $key ] = $value; - } - } - } - } - - return $coupon_data; - } - - /** - * Handle exporting data for Smart Coupons' Coupon data. - * - * @param string $email_address E-mail address to export. - * @param int $page Pagination of data. - * - * @return array - */ - public function wc_sc_coupon_data_exporter( $email_address, $page = 0 ) { - $done = false; - $data_to_export = array(); - - $coupon_data = $this->get_wc_sc_data( $email_address, (int) $page ); - - if ( 0 < count( $coupon_data ) ) { - $data = array(); - $index = 0; - foreach ( $coupon_data as $coupon_id => $coupon ) { - $data[] = array( - 'name' => $coupon['coupon_code'], - 'value' => $coupon['customer_email'], - ); - } - $data_to_export[] = array( - 'group_id' => 'wc_smart_coupons_coupon_data', - 'group_label' => __( 'Store Credit/Gift Certificate - Coupon Data', 'woocommerce-smart-coupons' ), - 'item_id' => 'wc-smart-coupons-coupon-data-' . sanitize_title( $email_address ), - 'data' => $data, - ); - - $done = 10 > count( $coupon_data ); - } else { - $done = true; - } - - return array( - 'data' => $data_to_export, - 'done' => $done, - ); - } - - /** - * Finds and erases Smart Coupons by email address. - * - * @param string $email_address The user email address. - * @param int $page Pagination. - * @return array An array of personal data in name value pairs - */ - public function wc_sc_coupon_data_eraser( $email_address, $page ) { - $coupon_data = $this->get_wc_sc_data( $email_address, (int) $page ); - - $done = false; - $items_removed = false; - $items_retained = false; - $messages = array(); - - foreach ( $coupon_data as $coupon ) { - list( $removed, $retained, $msgs ) = $this->maybe_handle_coupon_data( $coupon ); - $items_removed |= $removed; - $items_retained |= $retained; - $messages = array_merge( $messages, $msgs ); - } - - // Tell core if we have more coupons to work on still. - $done = count( $coupon_data ) < 10; - - return array( - 'items_removed' => $items_removed, - 'items_retained' => $items_retained, - 'messages' => $messages, - 'done' => $done, - ); - } - - /** - * Handle eraser of Coupon data - * - * @param array $coupon The coupon data. - * @return array - */ - protected function maybe_handle_coupon_data( $coupon ) { - if ( empty( $coupon ) || ! $this->is_retention_expired( $coupon['created_date'] ) ) { - return array( false, false, array() ); - } - - if ( $this->is_wc_gte_30() ) { - $_coupon = ( ! empty( $coupon['coupon_id'] ) ) ? new WC_Coupon( $coupon['coupon_id'] ) : null; - if ( $this->is_callable( $_coupon, 'delete_meta_data' ) && $this->is_callable( $_coupon, 'save' ) && $this->is_callable( $_coupon, 'delete' ) ) { - if ( $this->is_callable( $_coupon, 'set_email_restrictions' ) ) { - $_coupon->set_email_restrictions( array() ); - } - $_coupon->delete_meta_data( 'customer_email' ); - $_coupon->delete_meta_data( 'generated_from_order_id' ); - $_coupon->save(); - $_coupon->delete( true ); - } - } else { - delete_post_meta( $coupon['coupon_id'], 'customer_email' ); - delete_post_meta( $coupon['coupon_id'], 'generated_from_order_id' ); - wp_delete_post( $coupon['coupon_id'], true ); - } - - return array( true, false, array( '' . __( 'Store Credit/Gift Certificate', 'woocommerce-smart-coupons' ) . ' - ' . __( 'Removed Coupon Personal Data', 'woocommerce-smart-coupons' ) ) ); - } - - /** - * Returns Smart Coupons data based on email. - * - * @param string $email_address The email addres. - * @param int $page Pagination. - * - * @return array - */ - protected function get_wc_sc_user_data( $email_address, $page ) { - - $user_data = array(); - - $user = get_user_by( 'email', $email_address ); - - if ( ! empty( $user->ID ) ) { - - $sc_shortcode_generated_coupons = get_user_meta( $user->ID, '_sc_shortcode_generated_coupons', true ); - - if ( ! empty( $sc_shortcode_generated_coupons ) ) { - $user_data['shortcode'] = array(); - foreach ( $sc_shortcode_generated_coupons as $sc_shortcode_generated_coupons ) { - $user_data['shortcode'][] = implode( ', ', $sc_shortcode_generated_coupons ); - } - } - - $sc_applied_coupon_from_url = get_user_meta( $user->ID, 'sc_applied_coupon_from_url', true ); - - if ( ! empty( $sc_applied_coupon_from_url ) ) { - $user_data['url'] = implode( ', ', $sc_applied_coupon_from_url ); - } - } - - return $user_data; - } - - /** - * Handle exporting data for Smart Coupons User data. - * - * @param string $email_address E-mail address to export. - * @param int $page Pagination of data. - * - * @return array - */ - public function wc_sc_user_data_exporter( $email_address, $page = 0 ) { - $done = false; - $data_to_export = array(); - - $user_data = $this->get_wc_sc_user_data( $email_address, (int) $page ); - - if ( 0 < count( $user_data ) ) { - $shortcode = array(); - $url = array(); - $index = 0; - foreach ( $user_data as $key => $value ) { - if ( 'shortcode' === $key ) { - foreach ( $value as $val ) { - $shortcode[] = array( - 'name' => __( 'Coupon', 'woocommerce-smart-coupons' ), - 'value' => $val, - ); - } - $data_to_export[] = array( - 'group_id' => 'wc_smart_coupons_coupon_shortcode_data', - 'group_label' => __( 'Generated Coupon Data', 'woocommerce-smart-coupons' ), - 'item_id' => 'wc-smart-coupons-shorcode-data-' . sanitize_title( $email_address ), - 'data' => $shortcode, - ); - } elseif ( 'url' === $key ) { - $url[] = array( - 'name' => __( 'Coupon' ), - 'value' => $value, - ); - $data_to_export[] = array( - 'group_id' => 'wc_smart_coupons_url_data', - 'group_label' => __( 'Coupon passed in URL', 'woocommerce-smart-coupons' ), - 'item_id' => 'wc-smart-coupons-url-data-' . sanitize_title( $email_address ), - 'data' => $url, - ); - } - } - - $done = 10 > count( $user_data ); - } else { - $done = true; - } - - return array( - 'data' => $data_to_export, - 'done' => $done, - ); - } - - /** - * Finds and erases Smart Coupons by email address. - * - * @param string $email_address The user email address. - * @param int $page Pagination. - * @return array An array of personal data in name value pairs - */ - public function wc_sc_user_data_eraser( $email_address, $page ) { - - $user = get_user_by( 'email', $email_address ); - - $done = false; - $items_removed = false; - $items_retained = false; - $messages = array(); - - if ( ! empty( $user->ID ) ) { - - $meta_keys = array( '_sc_shortcode_generated_coupons', 'sc_applied_coupon_from_url' ); - - foreach ( $meta_keys as $meta_key ) { - delete_user_meta( $user->ID, $meta_key ); - $removed = true; - $retained = false; - $msgs = array( '' . __( 'Store Credit/Gift Certificate', 'woocommerce-smart-coupons' ) . ' - ' . __( 'Removed User Personal Data', 'woocommerce-smart-coupons' ) ); - $items_removed |= $removed; - $items_retained |= $retained; - $messages = array_merge( $messages, $msgs ); - } - } - - // Tell core if we have more coupons to work on still. - $done = true; - - return array( - 'items_removed' => $items_removed, - 'items_retained' => $items_retained, - 'messages' => $messages, - 'done' => $done, - ); - } - - /** - * Returns Smart Coupons data based on email. - * - * @param string $email_address The email address. - * @param int $page Pagination. - * - * @return array - */ - protected function get_wc_sc_order_data( $email_address, $page ) { - - global $wpdb; - - $user = get_user_by( 'email', $email_address ); - - $order_ids = wp_cache_get( 'wc_sc_order_ids_for_' . sanitize_key( $email_address ), 'woocommerce_smart_coupons' ); - - if ( false === $order_ids ) { - $order_ids = $wpdb->get_col( // phpcs:ignore - $wpdb->prepare( - "SELECT pm.post_id - FROM {$wpdb->posts} AS p - LEFT JOIN {$wpdb->postmeta} AS pm - ON ( p.ID = pm.post_id AND p.post_type = %s ) - WHERE pm.meta_key = %s - AND pm.meta_value = %d", - 'shop_order', - '_customer_user', - $user->ID - ) - ); - wp_cache_set( 'wc_sc_order_ids_for_' . sanitize_key( $email_address ), $order_ids, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_order_ids_for_' . sanitize_key( $email_address ) ); - } - - if ( empty( $order_ids ) ) { - return array(); - } - - $how_many = count( $order_ids ); - $placeholders = array_fill( 0, $how_many, '%d' ); - - $query = $wpdb->prepare( - "SELECT p.ID, - pm.meta_value AS sc_coupon_receiver_details - FROM $wpdb->posts AS p - LEFT JOIN $wpdb->postmeta AS pm - ON ( p.ID = pm.post_id AND p.post_type = %s AND pm.meta_key = %s )", - 'shop_order', - 'sc_coupon_receiver_details' - ); - - $query .= $wpdb->prepare( 'WHERE p.ID IN (' . implode( ',', $placeholders ) . ') ', $order_ids ); // phpcs:ignore - - $query .= $wpdb->prepare( - ' AND pm.meta_value <> %s - GROUP BY p.ID - ORDER BY p.ID', - '' - ); - - $unique_order_ids = array_unique( $order_ids ); - - $results = wp_cache_get( 'wc_sc_receiver_detail_in_orders_' . implode( '_', $unique_order_ids ), 'woocommerce_smart_coupons' ); - - if ( false === $results ) { - $results = $wpdb->get_results( $query, ARRAY_A ); // phpcs:ignore - wp_cache_set( 'wc_sc_receiver_detail_in_orders_' . implode( '_', $unique_order_ids ), $results, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_receiver_detail_in_orders_' . implode( '_', $unique_order_ids ) ); - } - - $order_data = array(); - - if ( ! empty( $results ) ) { - foreach ( $results as $result ) { - $order_data[ $result['ID'] ] = maybe_unserialize( $result['sc_coupon_receiver_details'] ); - } - } - - return $order_data; - } - - /** - * Handle exporting data for Smart Coupons User data. - * - * @param string $email_address E-mail address to export. - * @param int $page Pagination of data. - * - * @return array - */ - public function wc_sc_order_data_exporter( $email_address, $page = 0 ) { - $done = false; - $data_to_export = array(); - - $order_data = $this->get_wc_sc_order_data( $email_address, (int) $page ); - - if ( 0 < count( $order_data ) ) { - $index = 0; - foreach ( $order_data as $key => $value ) { - foreach ( $value as $val ) { - $index++; - $data = array(); - foreach ( $val as $k => $v ) { - if ( $val['email'] !== $email_address && 'code' === $k ) { - continue; - } - switch ( $k ) { - case 'code': - $name = __( 'Coupon Code', 'woocommerce-smart-coupons' ); - break; - case 'amount': - $name = __( 'Coupon Amount', 'woocommerce-smart-coupons' ); - break; - case 'email': - $name = __( 'Coupon For', 'woocommerce-smart-coupons' ); - break; - case 'message': - $name = __( 'Message', 'woocommerce-smart-coupons' ); - break; - } - $data[] = array( - 'name' => $name, - 'value' => $v, - ); - } - $data_to_export[] = array( - 'group_id' => 'wc_smart_coupons_order_data_' . $index, - 'group_label' => __( 'Store Credit/Gift Certificate - Order Data', 'woocommerce-smart-coupons' ), - 'item_id' => 'wc-smart-coupons-order-data-' . $index, - 'data' => $data, - ); - } - } - - $done = 10 > count( $order_data ); - } else { - $done = true; - } - - return array( - 'data' => $data_to_export, - 'done' => $done, - ); - } - - /** - * Finds and erases Smart Coupons by email address. - * - * @param string $email_address The user email address. - * @param int $page Pagination. - * @return array An array of personal data in name value pairs - */ - public function wc_sc_order_data_eraser( $email_address, $page ) { - - global $wpdb; - - $user = get_user_by( 'email', $email_address ); - - $orders = wp_cache_get( 'wc_sc_order_by_email_for_' . $user->ID, 'woocommerce_smart_coupons' ); - - if ( false === $orders ) { - $orders = $wpdb->get_results( // phpcs:ignore - $wpdb->prepare( - "SELECT p.post_date AS created_date, - pm.post_id - FROM {$wpdb->posts} AS p - LEFT JOIN {$wpdb->postmeta} AS pm - ON ( p.ID = pm.post_id AND p.post_type = %s ) - WHERE pm.meta_key = %s - AND pm.meta_value = %d", - 'shop_order', - '_customer_user', - $user->ID - ), - ARRAY_A - ); - wp_cache_set( 'wc_sc_order_by_email_for_' . $user->ID, $orders, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_order_by_email_for_' . $user->ID ); - } - - $done = false; - $items_removed = false; - $items_retained = false; - $messages = array(); - - if ( ! empty( $orders ) ) { - foreach ( $orders as $order ) { - list( $removed, $retained, $msgs ) = $this->maybe_handle_order_data( $order ); - $items_removed |= $removed; - $items_retained |= $retained; - $messages = array_merge( $messages, $msgs ); - } - } - - // Tell core if we have more coupons to work on still. - $done = count( $orders ) < 10; - - return array( - 'items_removed' => $items_removed, - 'items_retained' => $items_retained, - 'messages' => $messages, - 'done' => $done, - ); - } - - /** - * Handle eraser of Coupon data - * - * @param array $order The order data. - * @return array - */ - protected function maybe_handle_order_data( $order ) { - if ( empty( $order ) || ! $this->is_retention_expired( $order['created_date'] ) ) { - return array( false, false, array() ); - } - - $order = ( ! empty( $order['post_id'] ) && function_exists( 'wc_get_order' ) ) ? wc_get_order( $order['post_id'] ) : null; - if ( $this->is_callable( $order, 'delete_meta_data' ) && $this->is_callable( $order, 'save' ) ) { - $order->delete_meta_data( 'sc_coupon_receiver_details' ); - $order->delete_meta_data( 'gift_receiver_email' ); - $order->delete_meta_data( 'gift_receiver_message' ); - $order->delete_meta_data( 'gift_sending_timestamp' ); - $order->save(); - } else { - delete_post_meta( $order['post_id'], 'sc_coupon_receiver_details' ); - delete_post_meta( $order['post_id'], 'gift_receiver_email' ); - delete_post_meta( $order['post_id'], 'gift_receiver_message' ); - delete_post_meta( $order['post_id'], 'gift_sending_timestamp' ); - } - - return array( true, false, array( '' . __( 'Store Credit/Gift Certificate', 'woocommerce-smart-coupons' ) . ' - ' . __( 'Removed Order Personal Data', 'woocommerce-smart-coupons' ) ) ); - } - - /** - * Remove Smart Coupons order personal data - * - * @param WC_Order $order The order object. - */ - public function remove_order_personal_data( $order ) { - $created_date = $order->get_date_created(); - $args = array( - 'post_id' => $order->get_id(), - 'created_date' => $created_date, - ); - $result = $this->maybe_handle_order_data( $args ); - } - - /** - * Checks if create date is passed retention duration. - * - * @param string $created_date The date. - */ - public function is_retention_expired( $created_date ) { - $retention = wc_parse_relative_date_option( get_option( 'woocommerce_smart_coupons_retention' ) ); - $is_expired = false; - $time_span = time() - strtotime( $created_date ); - - if ( empty( $retention ) || empty( $created_date ) ) { - return false; - } - - switch ( $retention['unit'] ) { - case 'days': - $retention = $retention['number'] * DAY_IN_SECONDS; - - if ( $time_span > $retention ) { - $is_expired = true; - } - break; - case 'weeks': - $retention = $retention['number'] * WEEK_IN_SECONDS; - - if ( $time_span > $retention ) { - $is_expired = true; - } - break; - case 'months': - $retention = $retention['number'] * MONTH_IN_SECONDS; - - if ( $time_span > $retention ) { - $is_expired = true; - } - break; - case 'years': - $retention = $retention['number'] * YEAR_IN_SECONDS; - - if ( $time_span > $retention ) { - $is_expired = true; - } - break; - } - - return $is_expired; - } - - /** - * Add retention settings to account tab. - * - * @param array $settings Settings. - * @return array $settings Updated - */ - public function account_settings( $settings ) { - $insert_setting = array( - array( - 'title' => __( 'Retain Store Credit/Gift Certificate', 'woocommerce-smart-coupons' ), - 'desc_tip' => __( 'Store Credit/Gift Certificate that are stored for customers via coupons. If erased, the customer will not be able to use the coupons.', 'woocommerce-smart-coupons' ), - 'id' => 'woocommerce_smart_coupons_retention', - 'type' => 'relative_date_selector', - 'placeholder' => __( 'N/A', 'woocommerce-smart-coupons' ), - 'default' => '', - 'autoload' => false, - ), - ); - - array_splice( $settings, ( count( $settings ) - 1 ), 0, $insert_setting ); - - return $settings; - } - - } - -} - -WC_SC_Privacy::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-product-fields.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-product-fields.php deleted file mode 100644 index b7e0b1a4..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-product-fields.php +++ /dev/null @@ -1,524 +0,0 @@ -ID ); - - $product = ( ! empty( $post->ID ) && function_exists( 'wc_get_product' ) ) ? wc_get_product( $post->ID ) : null; - $is_callable_product_get_meta = $this->is_callable( $product, 'get_meta' ); - - $is_send_coupons_on_renewals = ( true === $is_callable_product_get_meta ) ? $product->get_meta( 'send_coupons_on_renewals' ) : get_post_meta( $post->ID, 'send_coupons_on_renewals', true ); - - echo '
            '; - - $all_discount_types = wc_get_coupon_types(); - - ?> -

            - - - -

            - - product_options_admin_js(); ?> - '; - - } - - /** - * Coupon fields for variation - * - * @param int $loop Position in the loop. - * @param array $variation_data Variation data. - * @param WP_Post $variation Post data. - */ - public function woocommerce_product_options_coupons_variable( $loop = 0, $variation_data = array(), $variation = null ) { - - $variation_id = $variation->ID; - - $all_discount_types = wc_get_coupon_types(); - - $product = ( ! empty( $variation_id ) && function_exists( 'wc_get_product' ) ) ? wc_get_product( $variation_id ) : null; - $is_callable_product_get_meta = $this->is_callable( $product, 'get_meta' ); - - $is_send_coupons_on_renewals = ( true === $is_callable_product_get_meta ) ? $product->get_meta( 'send_coupons_on_renewals' ) : get_post_meta( $variation_id, 'send_coupons_on_renewals', true ); - - ?> -
            -

            - - - -

            -

            - -

            - product_options_admin_js(); ?> -
            - - - is_callable( $product, 'update_meta_data' ); - - if ( ! empty( $post_coupon_title ) ) { - if ( $this->is_wc_gte_30() ) { - $coupon_titles = $post_coupon_title; - } else { - $coupon_titles = array_filter( array_map( 'trim', explode( ',', $post_coupon_title ) ) ); - } - if ( true === $is_callable_product_update_meta ) { - $product->update_meta_data( '_coupon_title', $coupon_titles ); - } else { - update_post_meta( $post_id, '_coupon_title', $coupon_titles ); - } - } else { - if ( true === $is_callable_product_update_meta ) { - $product->update_meta_data( '_coupon_title', array() ); - } else { - update_post_meta( $post_id, '_coupon_title', array() ); - } - } - - if ( isset( $_POST['send_coupons_on_renewals'][ $post_id ] ) ) { // phpcs:ignore - if ( true === $is_callable_product_update_meta ) { - $product->update_meta_data( 'send_coupons_on_renewals', wc_clean( wp_unslash( $_POST['send_coupons_on_renewals'][ $post_id ] ) ) ); // phpcs:ignore - } else { - update_post_meta( $post_id, 'send_coupons_on_renewals', wc_clean( wp_unslash( $_POST['send_coupons_on_renewals'][ $post_id ] ) ) ); // phpcs:ignore - } - } else { - if ( true === $is_callable_product_update_meta ) { - $product->update_meta_data( 'send_coupons_on_renewals', 'no' ); - } else { - update_post_meta( $post_id, 'send_coupons_on_renewals', 'no' ); - } - } - - if ( $this->is_callable( $product, 'save' ) ) { - $product->save(); - } - } - - /** - * Function for saving coupon details in product meta - * - * @param integer $variation_id Variation ID. - * @param integer $i Loop ID. - */ - public function woocommerce_process_product_meta_coupons_variable( $variation_id = 0, $i = 0 ) { - - if ( empty( $variation_id ) ) { - return; - } - - $variation_id = absint( $variation_id ); - $variation = ( ! empty( $variation_id ) ) ? wc_get_product( $variation_id ) : null; - $is_callable_variation_update_meta = $this->is_callable( $variation, 'update_meta_data' ); - - $post_coupon_title = ( ! empty( $_POST['_coupon_title'][ $variation_id ][ $i ] ) ) ? wc_clean( wp_unslash( $_POST['_coupon_title'][ $variation_id ][ $i ] ) ) : ''; // phpcs:ignore - - if ( ! empty( $post_coupon_title ) ) { - if ( $this->is_wc_gte_30() ) { - $coupon_titles = $post_coupon_title; - } else { - $coupon_titles = array_filter( array_map( 'trim', explode( ',', $post_coupon_title ) ) ); - } - if ( true === $is_callable_variation_update_meta ) { - $variation->update_meta_data( '_coupon_title', $coupon_titles ); - } else { - update_post_meta( $variation_id, '_coupon_title', $coupon_titles ); - } - } else { - if ( true === $is_callable_variation_update_meta ) { - $variation->update_meta_data( '_coupon_title', array() ); - } else { - update_post_meta( $variation_id, '_coupon_title', array() ); - } - } - - if ( isset( $_POST['send_coupons_on_renewals'][ $variation_id ][ $i ] ) ) { // phpcs:ignore - if ( true === $is_callable_variation_update_meta ) { - $variation->update_meta_data( 'send_coupons_on_renewals', wc_clean( wp_unslash( $_POST['send_coupons_on_renewals'][ $variation_id ][ $i ] ) ) ); // phpcs:ignore - } else { - update_post_meta( $variation_id, 'send_coupons_on_renewals', wc_clean( wp_unslash( $_POST['send_coupons_on_renewals'][ $variation_id ][ $i ] ) ) ); // phpcs:ignore - } - } else { - if ( true === $is_callable_variation_update_meta ) { - $variation->update_meta_data( 'send_coupons_on_renewals', 'no' ); - } else { - update_post_meta( $variation_id, 'send_coupons_on_renewals', 'no' ); - } - } - - if ( $this->is_callable( $variation, 'save' ) ) { - $variation->save(); - } - - } - - } - -} - -WC_SC_Product_Fields::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-purchase-credit.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-purchase-credit.php deleted file mode 100644 index 321dafb6..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-purchase-credit.php +++ /dev/null @@ -1,1451 +0,0 @@ -is_wc_gte_30() ) { - if ( ! is_object( $product ) || ! is_callable( array( $product, 'get_id' ) ) ) { - return; - } - $product_id = $product->get_id(); - if ( empty( $product_id ) ) { - return; - } - } else { - $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; - } - - $coupons = $this->get_coupon_titles( array( 'product_object' => $product ) ); - - if ( ! function_exists( 'is_plugin_active' ) ) { - require_once ABSPATH . 'wp-admin/includes/plugin.php'; - } - - $product_price = $product->get_price(); - - $_nyp = ( $this->is_callable( $product, 'get_meta' ) ) ? $product->get_meta( '_nyp' ) : get_post_meta( $product_id, '_nyp', true ); - - // MADE CHANGES IN THE CONDITION TO SHOW INPUT FIELD FOR PRICE ONLY FOR COUPON AS A PRODUCT. - if ( ! empty( $coupons ) && $this->is_coupon_amount_pick_from_product_price( $coupons ) && ( ! ( ! empty( $product_price ) || ( is_plugin_active( 'woocommerce-name-your-price/woocommerce-name-your-price.php' ) && ( 'yes' === $_nyp ) ) ) ) ) { - - $js = " - const minCreditAmount = parseFloat( jQuery('input#credit_called').attr('min') ); - const maxCreditAmount = parseFloat( jQuery('input#credit_called').attr('max') ); - var validateCreditCalled = function(){ - var enteredCreditAmount = parseFloat( jQuery('input#credit_called').val() ); - if ( isNaN(enteredCreditAmount) || enteredCreditAmount < minCreditAmount || ( maxCreditAmount > 0 && enteredCreditAmount > maxCreditAmount ) ) { - var creditErrorMsg = '" . __( 'Invalid amount.', 'woocommerce-smart-coupons' ) . "'; - if ( isNaN(enteredCreditAmount) ) { - creditErrorMsg += ' " . __( 'Enter a numeric value.', 'woocommerce-smart-coupons' ) . "'; - } - if ( enteredCreditAmount < minCreditAmount ) { - creditErrorMsg += ' " . __( 'The value should not be less than', 'woocommerce-smart-coupons' ) . " ' + minCreditAmount; - } else if ( enteredCreditAmount > maxCreditAmount ) { - creditErrorMsg += ' " . __( 'The value should not be greater than', 'woocommerce-smart-coupons' ) . " ' + maxCreditAmount; - } - jQuery('#error_message').text(creditErrorMsg); - jQuery('input#credit_called').css('border-color', 'red'); - return false; - } else { - jQuery('form.cart').unbind('submit'); - jQuery('#error_message').text(''); - jQuery('input#credit_called').css('border-color', ''); - return true; - } - }; - - jQuery('input#credit_called').bind('change keyup', function(){ - validateCreditCalled(); - jQuery('input#hidden_credit').remove(); - if ( jQuery('input[name=quantity]').length ) { - jQuery('input[name=quantity]').append(''); - } else { - jQuery('input[name=\"add-to-cart\"]').after(''); - } - }); - - jQuery('button.single_add_to_cart_button').on('click', function(e) { - if ( validateCreditCalled() == false ) { - e.preventDefault(); - } - }); - - jQuery('input#credit_called').on( 'keypress', function (e) { - if (e.which == 13) { - jQuery('form.cart').find('button[name=\"add-to-cart\"]').trigger('click'); - } - }); - - // To handle, if the call for credit form is included twice. - jQuery.each( jQuery('body').find('div#call_for_credit'), function(){ - let current_element = jQuery(this); - let is_visible = current_element.is(':visible'); - if ( false === is_visible ) { - current_element.remove(); - } - }); - - "; - - // To handle, if the call for credit form is included twice. - if ( did_action( 'wc_sc_call_for_credit_script_enqueued' ) <= 0 ) { - wc_enqueue_js( $js ); - do_action( 'wc_sc_call_for_credit_script_enqueued', array( 'source' => $this ) ); - } - - $smart_coupon_store_gift_page_text = get_option( 'smart_coupon_store_gift_page_text' ); - - /* translators: %s: singular name for store credit */ - $smart_coupon_store_gift_page_text = ( ! empty( $smart_coupon_store_gift_page_text ) ) ? $smart_coupon_store_gift_page_text . ' ' : ( ! empty( $store_credit_label['singular'] ) ? sprintf( __( 'Purchase %s worth', 'woocommerce-smart-coupons' ), ucwords( $store_credit_label['singular'] ) ) : __( 'Purchase credit worth', 'woocommerce-smart-coupons' ) ) . ' '; - - $custom_classes = array( - 'container' => '', - 'row' => '', - 'label' => '', - 'input' => '', - 'error' => '', - ); - - $custom_classes = apply_filters( 'wc_sc_call_for_credit_template_custom_classes', $custom_classes ); - - $currency_symbol = get_woocommerce_currency_symbol(); - - $input = array( - 'type' => 'number', - 'autocomplete' => 'off', - 'autofocus' => 'autofocus', - 'height' => '', - 'max' => '', - 'maxlength' => '', - 'min' => '1', - 'minlength' => '', - 'name' => '', - 'pattern' => '', - 'placeholder' => '', - 'required' => 'required', - 'size' => '', - 'step' => 'any', - 'width' => '', - ); - - $input = apply_filters( 'wc_sc_call_for_credit_template_input', $input, array( 'source' => $this ) ); - - $input = array_filter( $input ); - - $input['id'] = 'credit_called'; - $input['name'] = $input['id']; - $input['value'] = ''; - - $allowed_html = wp_kses_allowed_html( 'post' ); - - $allowed_html['input'] = array( - 'aria-describedby' => true, - 'aria-details' => true, - 'aria-label' => true, - 'aria-labelledby' => true, - 'aria-hidden' => true, - ); - $input_element = ' $value ) { - $input_element .= $attribute . '="' . esc_attr( $value ) . '" '; - $allowed_html['input'][ $attribute ] = true; - } - $input_element .= ' />'; - - if ( function_exists( 'wc_get_template' ) ) { - $args = array( - 'custom_classes' => $custom_classes, - 'currency_symbol' => $currency_symbol, - 'smart_coupon_store_gift_page_text' => $smart_coupon_store_gift_page_text, - 'allowed_html' => $allowed_html, - 'input' => $input, - 'input_element' => $input_element, - ); - wc_get_template( 'call-for-credit-form.php', $args, '', plugin_dir_path( WC_SC_PLUGIN_FILE ) . 'templates/' ); - } else { - include apply_filters( 'woocommerce_call_for_credit_form_template', 'templates/call-for-credit-form.php' ); - } - } - } - - /** - * Allow overriding of Smart Coupon's template for credit of any amount - * - * @param string $template The template name. - * @return mixed $template - */ - public function woocommerce_call_for_credit_form_template_path( $template ) { - - $template_name = 'call-for-credit-form.php'; - - $template = $this->locate_template_for_smart_coupons( $template_name, $template ); - - // Return what we found. - return $template; - } - - /** - * Make product whose price is set as zero but is for purchasing credit, purchasable - * - * @param boolean $purchasable Is purchasable. - * @param WC_Product $product The product. - * @return boolean $purchasable - */ - public function make_product_purchasable( $purchasable, $product ) { - - if ( $this->is_wc_gte_30() ) { - $product_id = ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0; - } else { - $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; - } - $coupons = $this->get_coupon_titles( array( 'product_object' => $product ) ); - - if ( ! empty( $coupons ) && $product instanceof WC_Product && $product->get_price() === '' && $this->is_coupon_amount_pick_from_product_price( $coupons ) && ! ( $product->get_price() > 0 ) ) { - return true; - } - - return $purchasable; - } - - /** - * Remove price html for product which is selling any amount of storecredit - * - * @param string $price Current price HTML. - * @param WC_Product $product The product object. - * @return string $price - */ - public function price_html_for_purchasing_credit( $price = null, $product = null ) { - - if ( $this->is_wc_gte_30() ) { - $product_id = ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0; - } else { - $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; - } - $coupons = $this->get_coupon_titles( array( 'product_object' => $product ) ); - - $is_product = is_a( $product, 'WC_Product' ); - $is_purchasable_credit = $this->is_coupon_amount_pick_from_product_price( $coupons ); - $product_price = $product->get_price(); - - if ( ! empty( $coupons ) && true === $is_product && true === $is_purchasable_credit && ( ! ( $product_price > 0 ) || empty( $product_price ) ) ) { - return ''; - } - - return $price; - } - - /** - * Set price for store credit to be purchased before calculating total in cart - * - * @param WC_Cart $cart_object The cart object. - */ - public function override_price_before_calculate_totals( $cart_object ) { - - $credit_called = $this->get_session( 'credit_called' ); - - foreach ( $cart_object->cart_contents as $key => $value ) { - - $product = $value['data']; - $credit_amount = ( ! empty( $value['credit_amount'] ) ) ? $value['credit_amount'] : 0; - - if ( $this->is_wc_gte_30() ) { - $product_type = ( is_object( $product ) && is_callable( array( $product, 'get_type' ) ) ) ? $product->get_type() : ''; - $product_id = ( in_array( $product_type, array( 'variable', 'variable-subscription', 'variation', 'subscription_variation' ), true ) ) ? ( ( is_object( $product ) && is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0 ) : ( ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0 ); - $product_price = ( is_object( $product ) && is_callable( array( $product, 'get_price' ) ) ) ? $product->get_price() : 0; - } else { - $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; - $product_price = ( ! empty( $product->price ) ) ? $product->price : 0; - } - - $coupons = $this->get_coupon_titles( array( 'product_object' => $product ) ); - - if ( ! empty( $coupons ) && $this->is_coupon_amount_pick_from_product_price( $coupons ) && ! ( $product_price > 0 ) ) { - - $price = ( ! empty( $credit_called[ $key ] ) ) ? $credit_called[ $key ] : $credit_amount; - - if ( $price <= 0 ) { - WC()->cart->set_quantity( $key, 0 ); // Remove product from cart if price is not found either in session or in product. - continue; - } - - $price = $this->read_price( $price, true ); - - if ( $this->is_wc_gte_30() && is_callable( array( $cart_object->cart_contents[ $key ]['data'], 'set_price' ) ) ) { - $cart_object->cart_contents[ $key ]['data']->set_price( $price ); - } else { - $cart_object->cart_contents[ $key ]['data']->price = $price; - } - } - } - - } - - /** - * Override empty price of voucher product by 0 to avoid 'non numeric value' warning for product price being triggered on coupon validation. - * - * @param string $price product price. - * @param WC_Product $product WooCommerce product. - * @return integer $price new product price - */ - public function override_voucher_product_empty_price( $price, $product ) { - - if ( ! doing_action( 'woocommerce_single_product_summary' ) ) { - - if ( $this->is_wc_gte_30() ) { - $product_type = ( is_object( $product ) && is_callable( array( $product, 'get_type' ) ) ) ? $product->get_type() : ''; - $product_id = ( in_array( $product_type, array( 'variable', 'variable-subscription', 'variation', 'subscription_variation' ), true ) ) ? ( ( is_object( $product ) && is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0 ) : ( ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0 ); - } else { - $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; - } - - $coupons = $this->get_coupon_titles( array( 'product_object' => $product ) ); - - // Override product price only if product contains coupon and price is already an empty string. - if ( ! empty( $coupons ) && '' === $price ) { - $price = 0; - } - } - - return $price; - - } - - /** - * Display store credit's value as cart item's price - * - * @param string $product_price The product price HTML. - * @param array $cart_item Associative array of cart item. - * @param string $cart_item_key The cart item key. - * @return string product's price with currency symbol - */ - public function woocommerce_cart_item_price_html( $product_price, $cart_item, $cart_item_key ) { - - $gift_certificate = $this->get_session( 'credit_called' ); - - if ( ! empty( $gift_certificate ) && isset( $gift_certificate[ $cart_item_key ] ) && ! empty( $gift_certificate[ $cart_item_key ] ) ) { - $price = $gift_certificate[ $cart_item_key ]; - $price = $this->read_price( $price, true ); - // Hook for 3rd party plugin to modify value of the credit. - $price = apply_filters( - 'wc_sc_credit_called_price_cart', - $price, - array( - 'source' => $this, - 'cart_item_key' => $cart_item_key, - 'cart_item' => $cart_item, - 'credit_called' => $gift_certificate, - ) - ); - return wc_price( $price ); - } elseif ( ! empty( $cart_item['credit_amount'] ) ) { - $price = $cart_item['credit_amount']; - $price = $this->read_price( $price, true ); - // Hook for 3rd party plugin to modify value of the credit. - $price = apply_filters( - 'wc_sc_credit_called_price_cart', - $price, - array( - 'source' => $this, - 'cart_item_key' => $cart_item_key, - 'cart_item' => $cart_item, - 'credit_called' => $gift_certificate, - ) - ); - return wc_price( $price ); - } - - return $product_price; - - } - - /** - * Receiver Detail Form Styles And Scripts - */ - public function receiver_detail_form_styles_and_scripts() { - if ( ! wp_script_is( 'jquery' ) ) { - wp_enqueue_script( 'jquery' ); - } - $deliver_coupon_option = apply_filters( - 'wc_sc_deliver_coupon', - 'now', - array( - 'source' => $this, - 'cart_contents' => ( isset( WC()->cart->cart_contents ) && is_array( WC()->cart->cart_contents ) ) ? WC()->cart->cart_contents : array(), - 'schedule_store_credit' => get_option( 'smart_coupons_schedule_store_credit' ), - ) - ); - ?> - - - - - get_coupon_receiver_details_session(); - - if ( ! is_null( $coupon_receiver_details_session ) ) { - $is_gift = ( ! empty( $coupon_receiver_details_session['is_gift'] ) ) ? wc_clean( wp_unslash( $coupon_receiver_details_session['is_gift'] ) ) : ''; - $sc_send_to = ( ! empty( $coupon_receiver_details_session['sc_send_to'] ) ) ? wc_clean( wp_unslash( $coupon_receiver_details_session['sc_send_to'] ) ) : ''; - $wc_sc_schedule_gift_sending = ( ! empty( $coupon_receiver_details_session['wc_sc_schedule_gift_sending'] ) ) ? wc_clean( wp_unslash( $coupon_receiver_details_session['wc_sc_schedule_gift_sending'] ) ) : ''; - $gift_receiver_email = ( ! empty( $coupon_receiver_details_session['gift_receiver_email'] ) ) ? wc_clean( wp_unslash( $coupon_receiver_details_session['gift_receiver_email'] ) ) : array(); - $gift_sending_date_time = ( ! empty( $coupon_receiver_details_session['gift_sending_date_time'] ) ) ? wc_clean( wp_unslash( $coupon_receiver_details_session['gift_sending_date_time'] ) ) : array(); - $gift_sending_timestamp = ( ! empty( $coupon_receiver_details_session['gift_sending_timestamp'] ) ) ? wc_clean( wp_unslash( $coupon_receiver_details_session['gift_sending_timestamp'] ) ) : array(); - $gift_receiver_message = ( ! empty( $coupon_receiver_details_session['gift_receiver_message'] ) ) ? wc_clean( wp_unslash( $coupon_receiver_details_session['gift_receiver_message'] ) ) : array(); - } else { - $is_gift = ''; - $sc_send_to = ''; - $wc_sc_schedule_gift_sending = ''; - $gift_receiver_email = array(); - $gift_sending_date_time = array(); - $gift_sending_timestamp = array(); - $gift_receiver_message = array(); - } - - $coupon_receiver_details_session = array( - 'is_gift' => $is_gift, - 'sc_send_to' => $sc_send_to, - 'wc_sc_schedule_gift_sending' => $wc_sc_schedule_gift_sending, - 'gift_receiver_email' => $gift_receiver_email, - 'gift_sending_date_time' => $gift_sending_date_time, - 'gift_sending_timestamp' => $gift_sending_timestamp, - 'gift_receiver_message' => $gift_receiver_message, - ); - - foreach ( WC()->cart->cart_contents as $product ) { - - if ( ! empty( $product['variation_id'] ) ) { - $_product = wc_get_product( $product['variation_id'] ); - } elseif ( ! empty( $product['product_id'] ) ) { - $_product = wc_get_product( $product['product_id'] ); - } else { - continue; - } - - $coupon_titles = $this->get_coupon_titles( array( 'product_object' => $_product ) ); - - $price = $_product->get_price(); - - if ( $coupon_titles ) { - - foreach ( $coupon_titles as $coupon_title ) { - - $coupon = new WC_Coupon( $coupon_title ); - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - continue; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - continue; - } - $discount_type = $coupon->get_discount_type(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - - $coupon_amount = $this->get_amount( $coupon, true ); - - $pick_price_of_prod = ( $this->is_callable( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'is_pick_price_of_product' ) : get_post_meta( $coupon_id, 'is_pick_price_of_product', true ); - $smart_coupon_gift_certificate_form_page_text = get_option( 'smart_coupon_gift_certificate_form_page_text' ); - $smart_coupon_gift_certificate_form_page_text = ( ! empty( $smart_coupon_gift_certificate_form_page_text ) ) ? $smart_coupon_gift_certificate_form_page_text : __( 'Send Coupons to...', 'woocommerce-smart-coupons' ); - $smart_coupon_gift_certificate_form_details_text = get_option( 'smart_coupon_gift_certificate_form_details_text' ); - $smart_coupon_gift_certificate_form_details_text = ( ! empty( $smart_coupon_gift_certificate_form_details_text ) ) ? $smart_coupon_gift_certificate_form_details_text : ''; // Enter email address and optional message for Gift Card receiver. - - // MADE CHANGES IN THE CONDITION TO SHOW FORM. - if ( array_key_exists( $discount_type, $all_discount_types ) || ( 'yes' === $pick_price_of_prod && '' === $price ) || ( 'yes' === $pick_price_of_prod && '' !== $price && $coupon_amount > 0 ) ) { - - if ( ! $form_started ) { - $is_show_coupon_receiver_form = get_option( 'smart_coupons_display_coupon_receiver_details_form', 'yes' ); - if ( 'no' === $is_show_coupon_receiver_form ) { - ?> -
            -

            -
            - -
            > -

            - -

            - -
            -

            -
              -
            • />
            • -
            • - /> -
                -
              • />
              • -
              • />
              • -
              - -
            • - - -
            • - - -
            -
            -
            -
            -
            - add_text_field_for_email( $coupon, $product, $coupon_receiver_details_session ); - - } - } - } - } - - if ( $form_started ) { - ?> -
            -
            -
            - - -
            -
            -
            -
            -
            -
            - is_wc_gte_30() ) { - add_action( 'woocommerce_new_order_item', array( $this, 'save_called_credit_details_in_order_item' ), 10, 3 ); - } else { - add_action( 'woocommerce_add_order_item_meta', array( $this, 'save_called_credit_details_in_order_item_meta' ), 10, 2 ); - } - - } - - /** - * Display form to enter receiver's details on checkout page - * - * @param WC_Coupon $coupon The coupon object. - * @param array $product The product object. - * @param array $coupon_receiver_details_session Coupon receiver details from. - */ - public function add_text_field_for_email( $coupon = '', $product = '', $coupon_receiver_details_session = array() ) { - global $total_coupon_amount; - - if ( empty( $coupon ) ) { - return; - } - - extract( $coupon_receiver_details_session ); // phpcs:ignore - - $sell_sc_at_less_price = get_option( 'smart_coupons_sell_store_credit_at_less_price', 'no' ); - - $coupon_data = $this->get_coupon_meta_data( $coupon ); - - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : ''; - $coupon_code = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - $product_price = ( is_object( $product['data'] ) && is_callable( array( $product['data'], 'get_price' ) ) ) ? $product['data']->get_price() : 0; - $is_free_shipping = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_free_shipping' ) ) ) ? ( ( $coupon->get_free_shipping() ) ? 'yes' : 'no' ) : ''; - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - $product_price = ( ! empty( $product['data']->price ) ) ? $product['data']->price : 0; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - - $coupon_amount = $this->get_amount( $coupon, true ); - - for ( $i = 0; $i < $product['quantity']; $i++ ) { - - if ( $this->is_coupon_amount_pick_from_product_price( array( $coupon_code ) ) ) { - if ( 'yes' === $sell_sc_at_less_price ) { - $_coupon_amount = ( is_object( $product['data'] ) && is_callable( array( $product['data'], 'get_regular_price' ) ) ) ? $product['data']->get_regular_price() : 0; - if ( empty( $_coupon_amount ) && ! empty( $product_price ) ) { - $_coupon_amount = $product_price; - } - } else { - $_coupon_amount = $product_price; - } - } else { - $_coupon_amount = $coupon_amount; - } - - // NEWLY ADDED CONDITION TO NOT TO SHOW TEXTFIELD IF COUPON AMOUNT IS "0". - // TODO: Free Gift Coupon: Due to coupon amount as zero, following condition is not showing multiple form to send coupon to different people. - if ( '' !== $_coupon_amount || $_coupon_amount > 0 || $coupon_amount > 0 || 'yes' === $is_free_shipping ) { - - $total_coupon_amount += $_coupon_amount; - - $formatted_coupon_text = ''; - $formatted_coupon_amount = 0; - if ( ! empty( $_coupon_amount ) || ! empty( $coupon_amount ) ) { - $formatted_coupon_amount = ( $coupon_amount <= 0 ) ? wc_price( $_coupon_amount ) : $coupon_data['coupon_amount']; - $formatted_coupon_text .= $coupon_data['coupon_type']; - if ( 'yes' === $is_free_shipping ) { - $formatted_coupon_text .= ' & '; - } - } - if ( 'yes' === $is_free_shipping ) { - $formatted_coupon_text .= __( 'Free Shipping coupon', 'woocommerce-smart-coupons' ); - } - if ( 'smart_coupon' !== $discount_type && strpos( $formatted_coupon_text, 'coupon' ) === false ) { - $formatted_coupon_text .= ' ' . __( 'coupon', 'woocommerce-smart-coupons' ); - } - ?> -
            - - - -
            -
            -
            -
            - get_items(); - - $sc_called_credit = array(); - $update = false; - - $prices_include_tax = ( get_option( 'woocommerce_prices_include_tax' ) === 'yes' ) ? true : false; - - foreach ( $order_items as $item_id => $order_item ) { - - $item_sc_called_credit = $this->get_meta( $order_item, 'sc_called_credit', true ); - - if ( ! empty( $item_sc_called_credit ) ) { - - $product = ( is_object( $order_item ) && is_callable( array( $order_item, 'get_product' ) ) ) ? $order_item->get_product() : $order->get_product_from_item( $order_item ); - - if ( ! is_object( $product ) ) { - continue; - } - - if ( $this->is_wc_gte_30() ) { - $product_type = ( is_object( $product ) && is_callable( array( $product, 'get_type' ) ) ) ? $product->get_type() : ''; - $product_id = ( in_array( $product_type, array( 'variable', 'variable-subscription', 'variation', 'subscription_variation' ), true ) ) ? ( ( is_object( $product ) && is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0 ) : ( ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0 ); - $item_qty = ( is_object( $order_item ) && is_callable( array( $order_item, 'get_quantity' ) ) ) ? $order_item->get_quantity() : 1; - $item_tax = ( is_object( $order_item ) && is_callable( array( $order_item, 'get_subtotal_tax' ) ) ) ? $order_item->get_subtotal_tax() : 0; - } else { - $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; - $item_qty = ( ! empty( $order_item['qty'] ) ) ? $order_item['qty'] : 1; - $item_tax = ( ! empty( $order_item['line_subtotal_tax'] ) ) ? $order_item['line_subtotal_tax'] : 0; - } - - if ( true === $prices_include_tax && ! $this->is_generated_store_credit_includes_tax() ) { - $item_total = $item_sc_called_credit - $item_tax; - } elseif ( false === $prices_include_tax && $this->is_generated_store_credit_includes_tax() ) { - $item_total = $item_sc_called_credit + $item_tax; - } else { - $item_total = $item_sc_called_credit; - } - - if ( ! empty( $item_qty ) ) { - $qty = $item_qty; - } else { - $qty = 1; - } - - $coupon_titles = $this->get_coupon_titles( array( 'product_object' => $product ) ); - - if ( $coupon_titles ) { - - foreach ( $coupon_titles as $coupon_title ) { - - $coupon = new WC_Coupon( $coupon_title ); - - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - continue; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - continue; - } - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - } - - if ( $this->is_coupon_amount_pick_from_product_price( array( $coupon_title ) ) ) { - $products_price = ( ! $prices_include_tax ) ? $item_total : $item_total + $item_tax; - $amount = $products_price / $qty; - $sc_called_credit[ $item_id ] = wc_round_discount( $amount, 2 ); - $update = true; - } - } - } - - $this->delete_order_item_meta( $item_id, 'sc_called_credit' ); - } - } - if ( $update ) { - $this->update_post_meta( $order_id, 'sc_called_credit_details', $sc_called_credit, true, $order ); - } - - $this->maybe_clear_credit_called_session(); - - } - - /** - * Save entered credit value by customer in order item meta - * - * @param int $item_id The order item id. - * @param array $values Associative array containing item's details. - */ - public function save_called_credit_details_in_order_item_meta( $item_id = 0, $values = array() ) { - - if ( empty( $item_id ) || empty( $values ) ) { - return; - } - $sell_sc_at_less_price = get_option( 'smart_coupons_sell_store_credit_at_less_price', 'no' ); - if ( $this->is_wc_gte_30() ) { - if ( ! $values instanceof WC_Order_Item_Product ) { - return; - } - $product = $values->get_product(); - if ( ! is_object( $product ) || ! is_a( $product, 'WC_Product' ) ) { - return; - } - $product_type = ( is_object( $product ) && is_callable( array( $product, 'get_type' ) ) ) ? $product->get_type() : ''; - $product_id = ( in_array( $product_type, array( 'variable', 'variable-subscription', 'variation', 'subscription_variation' ), true ) ) ? ( ( is_object( $product ) && is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0 ) : ( ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0 ); - $qty = ( is_callable( array( $values, 'get_quantity' ) ) ) ? $values->get_quantity() : 1; - $qty = ( ! empty( $qty ) ) ? absint( $qty ) : 1; - - // Check if selling store credit at less price is enabled. - if ( 'yes' === $sell_sc_at_less_price ) { - // For gift certificate of any amount. - if ( isset( $values->legacy_values['credit_amount'] ) && ! empty( $values->legacy_values['credit_amount'] ) ) { - $order_id = ( ! empty( $item_id ) ) ? wc_get_order_id_by_order_item_id( $item_id ) : 0; - $order = ( ! empty( $order_id ) ) ? wc_get_order( $order_id ) : null; - $credit_amount = $this->read_price( $values->legacy_values['credit_amount'], true, $order ); - $product_price = floatval( $credit_amount ) * $qty; - } else { - // For gift certificate of fixed price. - $product_price = ( is_callable( array( $product, 'get_regular_price' ) ) ) ? floatval( $product->get_regular_price() ) * $qty : 0; - } - } else { - $subtotal = ( is_callable( array( $values, 'get_subtotal' ) ) ) ? $values->get_subtotal() : 0; - $product_price = $subtotal; - } - if ( wp_doing_ajax() && defined( 'WP_ADMIN' ) && true === WP_ADMIN ) { - $action = ( ! empty( $_POST['action'] ) ) ? wc_clean( wp_unslash( $_POST['action'] ) ) : ''; // phpcs:ignore - $order_id = ( ! empty( $_POST['order_id'] ) ) ? absint( $_POST['order_id'] ) : 0; - if ( 'woocommerce_add_order_item' === $action && check_ajax_referer( 'order-item', 'security' ) && ! empty( $order_id ) ) { - $product_price = $product_price / $qty; - } - } - } else { - if ( empty( $values['data'] ) ) { - return; - } - $product = $values['data']; - $product_id = ( ! empty( $values['product_id'] ) ) ? $values['product_id'] : 0; - $product_price = ( ! empty( $values['data']->price ) ) ? $values['data']->price : 0; - } - - if ( empty( $product_id ) ) { - return; - } - - $coupon_titles = $this->get_coupon_titles( array( 'product_object' => $product ) ); - - if ( $this->is_coupon_amount_pick_from_product_price( $coupon_titles ) && $product_price > 0 ) { - $this->add_order_item_meta( $item_id, 'sc_called_credit', $product_price, true ); - } - } - - /** - * Save entered credit value by customer in order item - * - * @param int $item_id The order item id. - * @param array $values Associative array containing item's details. - * @param int $order_id The order id. - */ - public function save_called_credit_details_in_order_item( $item_id = 0, $values = array(), $order_id = 0 ) { - - $this->save_called_credit_details_in_order_item_meta( $item_id, $values ); - - } - - /** - * Save entered credit value by customer in order for PayPal Express Checkout - * - * @param WC_Order $order The order object. - */ - public function ppe_save_called_credit_details_in_order( $order ) { - if ( $this->is_wc_gte_30() ) { - $order_id = ( is_object( $order ) && is_callable( array( $order, 'get_id' ) ) ) ? $order->get_id() : 0; - } else { - $order_id = ( ! empty( $order->id ) ) ? $order->id : 0; - } - $this->save_called_credit_details_in_order( $order_id, null ); - } - - /** - * Save entered credit value by customer in cart item data - * - * This function is only for simple products. - * - * @param array $cart_item_data The cart item data. - * @param int $product_id The product id. - * @param int $variation_id The variation id. - * @return array $cart_item_data - */ - public function call_for_credit_cart_item_data( $cart_item_data = array(), $product_id = '', $variation_id = '' ) { - - if ( ! empty( $variation_id ) && $variation_id > 0 || empty( $product_id ) ) { - return $cart_item_data; - } - - $_product = wc_get_product( $product_id ); - - $coupons = ( $this->is_callable( $_product, 'get_meta' ) ) ? $_product->get_meta( '_coupon_title' ) : get_post_meta( $product_id, '_coupon_title', true ); - - if ( ! empty( $coupons ) && $this->is_coupon_amount_pick_from_product_price( $coupons ) && ! ( $_product->get_price() > 0 ) ) { - $request_credit_called = ( ! empty( $_REQUEST['credit_called'] ) ) ? wc_clean( wp_unslash( $_REQUEST['credit_called'] ) ) : array(); // phpcs:ignore - $request_add_to_cart = ( ! empty( $_REQUEST['add-to-cart'] ) ) ? wc_clean( wp_unslash( $_REQUEST['add-to-cart'] ) ) : 0; // phpcs:ignore - $product_id = apply_filters( - 'wc_sc_call_for_credit_product_id', - $request_add_to_cart, - array( - 'cart_item_data' => $cart_item_data, - 'product_id' => $product_id, - 'variation_id' => $variation_id, - 'source' => $this, - ) - ); - $cart_item_data['credit_amount'] = ( ! empty( $request_credit_called ) && ! empty( $product_id ) && ! empty( $request_credit_called[ $product_id ] ) ) ? $this->write_price( $request_credit_called[ $product_id ], true ) : 0; - return $cart_item_data; - } - - return $cart_item_data; - } - - /** - * Save entered credit value by customer in session - * - * This function is only for simple products. - * - * @param string $cart_item_key The cart item key. - * @param int $product_id The product id. - * @param int $quantity The product quantity. - * @param int $variation_id The variation id. - * @param array $variation The variation data. - * @param array $cart_item_data The cart item data. - */ - public function save_called_credit_in_session( $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data ) { - - if ( ! empty( $variation_id ) && $variation_id > 0 ) { - return; - } - if ( ! isset( $cart_item_data['credit_amount'] ) || empty( $cart_item_data['credit_amount'] ) ) { - return; - } - - $_product = wc_get_product( $product_id ); - - $coupons = ( $this->is_callable( $_product, 'get_meta' ) ) ? $_product->get_meta( '_coupon_title' ) : get_post_meta( $product_id, '_coupon_title', true ); - - if ( ! empty( $coupons ) && $this->is_coupon_amount_pick_from_product_price( $coupons ) && ! ( $_product->get_price() > 0 ) ) { - $credit_called = $this->get_session( 'credit_called' ); - if ( empty( $credit_called ) || ! is_array( $credit_called ) ) { - $credit_called = array(); - } - $credit_called[ $cart_item_key ] = $cart_item_data['credit_amount']; - $this->set_session( 'credit_called', $credit_called ); - } - - } - - /** - * Enqueue required styles/scripts for store credit frontend form - */ - public function enqueue_styles_scripts() { - - // Return if gift certificate form is not shown. - if ( ! did_action( 'wc_sc_gift_certificate_form_shown' ) ) { - return; - } - - $this->enqueue_timepicker(); - - ?> - - plugin_url() . '/assets/css/jquery-ui/jquery-ui' . $suffix . '.css', array(), WC()->version ); - } - - if ( ! wp_style_is( 'jquery-ui-timepicker', 'registered' ) ) { - wp_register_style( 'jquery-ui-timepicker', untrailingslashit( plugins_url( '/', WC_SC_PLUGIN_FILE ) ) . '/assets/css/jquery-ui-timepicker-addon' . $suffix . '.css', array( 'jquery-ui-style' ), $version ); - } - - if ( ! wp_style_is( 'jquery-ui-timepicker' ) ) { - wp_enqueue_style( 'jquery-ui-timepicker' ); - } - - if ( ! wp_script_is( 'jquery-ui-timepicker', 'registered' ) ) { - wp_register_script( 'jquery-ui-timepicker', untrailingslashit( plugins_url( '/', WC_SC_PLUGIN_FILE ) ) . '/assets/js/jquery-ui-timepicker-addon' . $suffix . '.js', array( 'jquery', 'jquery-ui-datepicker', 'jquery-ui-slider' ), $version, true ); - } - - if ( ! wp_script_is( 'jquery-ui-timepicker' ) ) { - wp_enqueue_script( 'jquery-ui-timepicker' ); - } - - } - - /** - * Clear session variable credit_called (if set) when cart is empty - */ - public function maybe_clear_credit_called_session() { - if ( WC()->session->__isset( 'credit_called' ) ) { - WC()->session->__unset( 'credit_called' ); - } - } - - /** - * Validate checkout based on whether delivery time is required or not - * - * @param array $fields checkout fields. - * @param WP_Error $errors WP Error Object. - * @return void - */ - public function maybe_required_coupon_delivery_date_time( $fields = array(), $errors = object ) { - - $nonce_value = ( ! empty( $_POST['woocommerce-process-checkout-nonce'] ) ) ? wc_clean( wp_unslash( $_POST['woocommerce-process-checkout-nonce'] ) ) : ''; // phpcs:ignore - if ( ! wp_verify_nonce( $nonce_value, 'woocommerce-process_checkout' ) ) { - return; - } - - global $store_credit_label; - - $is_schedule_gift_sending = ( ! empty( $_POST['wc_sc_schedule_gift_sending'] ) ) ? wc_clean( wp_unslash( $_POST['wc_sc_schedule_gift_sending'] ) ) : ''; // phpcs:ignore - $gift_sending_timestamp = ( ! empty( $_POST['gift_sending_timestamp'] ) && is_array( $_POST['gift_sending_timestamp'] ) ) ? wc_clean( wp_unslash( $_POST['gift_sending_timestamp'] ) ) : array(); // phpcs:ignore - $send_to = ( ! empty( $_POST['sc_send_to'] ) ) ? wc_clean( wp_unslash( $_POST['sc_send_to'] ) ) : ''; // phpcs:ignore - $is_gift = ( ! empty( $_POST['is_gift'] ) ) ? wc_clean( wp_unslash( $_POST['is_gift'] ) ) : ''; // phpcs:ignore - - if ( 'yes' === $is_gift && 'yes' === $is_schedule_gift_sending ) { - $is_date_available = true; - if ( is_array( $gift_sending_timestamp ) && ! empty( $gift_sending_timestamp ) ) { - if ( 'many' === $send_to ) { - foreach ( $gift_sending_timestamp as $coupon_id => $timestamp ) { - if ( 0 === absint( $coupon_id ) ) { - continue; - } - $filtered = array_filter( $timestamp ); - if ( count( $filtered ) !== count( $timestamp ) ) { - $is_date_available = false; - break; - } - } - } elseif ( 'one' === $send_to ) { - if ( empty( $gift_sending_timestamp[0][0] ) ) { - $is_date_available = false; - } - } - } - if ( false === $is_date_available ) { - if ( is_object( $errors ) && is_callable( array( $errors, 'add' ) ) ) { - /* translators: %s: field name */ - $errors->add( 'validation', __( 'Coupon delivery date and time is a required field.', 'woocommerce-smart-coupons' ) ); - } - } - } - } - - /** - * Save coupon receiver details in session - * - * @param array $fields checkout fields. - * @param WP_Error $errors WP Error Object. - */ - public function save_coupon_receiver_details_in_session( $fields = array(), $errors = object ) { - $nonce_value = ( ! empty( $_POST['woocommerce-process-checkout-nonce'] ) ) ? wc_clean( wp_unslash( $_POST['woocommerce-process-checkout-nonce'] ) ) : ''; // phpcs:ignore - if ( ! wp_verify_nonce( $nonce_value, 'woocommerce-process_checkout' ) ) { - return; - } - $posted_data = array_map( 'wp_unslash', $_POST ); // phpcs:ignore - $posted_data = wc_clean( $posted_data ); // phpcs:ignore - $this->set_coupon_receiver_details_session( $posted_data ); - } - - /** - * Set coupon receiver details in session variable - * - * @param array $posted_data The posted data. - */ - public function set_coupon_receiver_details_session( $posted_data = array() ) { - if ( is_callable( 'WC' ) && is_object( WC() ) && is_object( WC()->session ) && is_callable( array( WC()->session, 'set' ) ) ) { - $keys_to_copy = array( 'is_gift', 'sc_send_to', 'wc_sc_schedule_gift_sending', 'gift_receiver_email', 'gift_sending_date_time', 'gift_sending_timestamp', 'gift_receiver_message' ); - $coupon_receiver_details = array(); - foreach ( $keys_to_copy as $key ) { - if ( isset( $posted_data[ $key ] ) ) { - $coupon_receiver_details[ $key ] = $posted_data[ $key ]; - } - } - $coupon_receiver_details = apply_filters( - 'wc_sc_before_set_coupon_receiver_details_session', - $coupon_receiver_details, - array( - 'source' => $this, - 'posted_data' => $posted_data, - ) - ); - if ( ! empty( $coupon_receiver_details ) ) { - WC()->session->set( 'wc_sc_coupon_receiver_details_session', $coupon_receiver_details ); - } else { - WC()->session->set( 'wc_sc_coupon_receiver_details_session', null ); - } - } - } - - /** - * Get coupon receiver details from session variable - */ - public function get_coupon_receiver_details_session() { - if ( is_callable( 'WC' ) && is_object( WC() ) && is_object( WC()->session ) && is_callable( array( WC()->session, 'get' ) ) ) { - return WC()->session->get( 'wc_sc_coupon_receiver_details_session' ); - } - return null; - } - - /** - * Function to cleanup order item meta if not required - * - * @param integer $order_id The order id. - */ - public function cleanup_order_item_meta( $order_id = 0 ) { - if ( empty( $order_id ) ) { - return; - } - - $order = wc_get_order( $order_id ); - $order_items = ( is_object( $order ) && is_callable( array( $order, 'get_items' ) ) ) ? $order->get_items() : array(); - - foreach ( $order_items as $item_id => $order_item ) { - $this->delete_order_item_meta( $item_id, 'sc_called_credit' ); - } - } - - /** - * Save coupon receiver details in session during update order review - * - * @param array $fragments The fragments. - * @return array - */ - public function update_order_review_fragments( $fragments = array() ) { - if ( ! empty( $_POST['post_data'] ) ) { // phpcs:ignore - wp_parse_str( $_POST['post_data'], $posted_data ); // phpcs:ignore - $this->set_coupon_receiver_details_session( $posted_data ); - } - return $fragments; - } - - /** - * Save coupon receiver detail via AJAX - */ - public function ajax_save_coupon_receiver_details() { - - check_ajax_referer( 'wc-sc-save-coupon-receiver-details', 'security' ); - - wp_parse_str( wc_clean( wp_unslash( urldecode_deep( $_POST['data'] ) ) ), $posted_data ); // phpcs:ignore - $this->set_coupon_receiver_details_session( $posted_data ); - - wp_send_json( array( 'success' => 'yes' ) ); - - } - - /** - * Check & clear coupon receiver details from session when cart is emptied (e.g. after creation of order) - */ - public function maybe_clear_coupon_receiver_details_session() { - $coupon_receiver_details_session = $this->get_coupon_receiver_details_session(); - if ( ! is_null( $coupon_receiver_details_session ) ) { - WC()->session->set( 'wc_sc_coupon_receiver_details_session', null ); - } - } - - } - -} - -WC_SC_Purchase_Credit::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-rest-coupons-controller.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-rest-coupons-controller.php deleted file mode 100644 index 7eaa39ea..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-rest-coupons-controller.php +++ /dev/null @@ -1,236 +0,0 @@ -post_type}_object", array( $this, 'handle_response_data' ), 99, 3 ); - } - - /** - * Register the routes for coupons. - */ - public function register_routes() { - register_rest_route( - $this->namespace, - '/' . $this->rest_base, - array( - 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' ), - ) - ); - } - - /** - * Prepare a single coupon for create or update. - * - * @param WP_REST_Request $request Request object. - * @param bool $creating If is creating a new object. - * @return WP_Error|WC_Data - */ - protected function prepare_object_for_database( $request, $creating = false ) { - global $woocommerce_smart_coupon; - - $id = isset( $request['id'] ) ? absint( $request['id'] ) : 0; - $coupon = new WC_Coupon( $id ); - $schema = $this->get_item_schema(); - $data_keys = array_keys( array_filter( $schema['properties'], array( $this, 'filter_writable_props' ) ) ); - $email_restrictions = ( ! empty( $request['email_restrictions'] ) && count( $request['email_restrictions'] ) === 1 ) ? $request['email_restrictions'] : ''; - - // Validate required POST fields. - if ( $creating ) { - if ( empty( $request['code'] ) ) { - $request['code'] = $woocommerce_smart_coupon->generate_unique_code( $email_restrictions ); - } else { - $_coupon = new WC_Coupon( $request['code'] ); - $is_auto_generate = ( is_object( $_coupon ) && is_callable( array( $_coupon, 'get_meta' ) ) ) ? $_coupon->get_meta( 'auto_generate_coupon' ) : 'no'; - if ( 'yes' === $is_auto_generate ) { - $request['code'] = $woocommerce_smart_coupon->generate_unique_code( $email_restrictions ); - foreach ( $data_keys as $key ) { - if ( empty( $request[ $key ] ) ) { - switch ( $key ) { - case 'code': - // do nothing. - break; - case 'meta_data': - $meta_data = ( is_object( $_coupon ) && is_callable( array( $_coupon, 'get_meta_data' ) ) ) ? $_coupon->get_meta_data() : null; - $new_meta_data = array(); - if ( ! empty( $meta_data ) ) { - foreach ( $meta_data as $meta ) { - if ( is_object( $meta ) && is_callable( array( $meta, 'get_data' ) ) ) { - $data = $meta->get_data(); - if ( isset( $data['id'] ) ) { - unset( $data['id'] ); - } - $new_meta_data[] = $data; - } - } - } - $request[ $key ] = $new_meta_data; - break; - case 'description': - $request[ $key ] = ( is_object( $_coupon ) && is_callable( array( $_coupon, 'get_description' ) ) ) ? $_coupon->get_description() : null; - break; - default: - if ( is_callable( array( $_coupon, "get_{$key}" ) ) ) { - $request[ $key ] = $_coupon->{"get_{$key}"}(); - } - break; - } - } - } - } - } - } - - // Handle all writable props. - foreach ( $data_keys as $key ) { - $value = $request[ $key ]; - - if ( ! is_null( $value ) ) { - switch ( $key ) { - case 'code': - $coupon_code = wc_format_coupon_code( $value ); - $id = $coupon->get_id() ? $coupon->get_id() : 0; - $id_from_code = wc_get_coupon_id_by_code( $coupon_code, $id ); - - if ( $id_from_code ) { - return new WP_Error( 'woocommerce_rest_coupon_code_already_exists', __( 'The coupon code already exists', 'woocommerce-smart-coupons' ), array( 'status' => 400 ) ); - } - - $coupon->set_code( $coupon_code ); - break; - case 'meta_data': - if ( is_array( $value ) ) { - foreach ( $value as $meta ) { - $coupon->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); - } - } - break; - case 'description': - $coupon->set_description( wp_filter_post_kses( $value ) ); - break; - default: - if ( is_callable( array( $coupon, "set_{$key}" ) ) ) { - $coupon->{"set_{$key}"}( $value ); - } - break; - } - } - } - - /** - * Filters an object before it is inserted via the REST API. - * - * The dynamic portion of the hook name, `$this->post_type`, - * refers to the object type slug. - * - * @param WC_Data $coupon Object object. - * @param WP_REST_Request $request Request object. - * @param bool $creating If is creating a new object. - */ - return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $coupon, $request, $creating ); - } - - /** - * Handle REST response data - * - * @param WP_REST_Response|mixed $response The response. - * @param WC_Coupon|mixed $object The object. - * @param WP_REST_Request|mixed $request The request. - * @return WP_REST_Response - */ - public function handle_response_data( $response = null, $object = null, $request = null ) { - global $woocommerce_smart_coupon; - - if ( ! empty( $request['sc_is_send_email'] ) && 'yes' === $request['sc_is_send_email'] ) { - $is_send_email = $woocommerce_smart_coupon->is_email_template_enabled(); - $email_restrictions = ( ! empty( $request['email_restrictions'] ) ) ? current( $request['email_restrictions'] ) : ''; - if ( 'yes' === $is_send_email && ! empty( $email_restrictions ) ) { - $coupon = array( - 'code' => ( is_object( $object ) && is_callable( array( $object, 'get_code' ) ) ) ? $object->get_code() : '', - 'amount' => ( is_object( $object ) && is_callable( array( $object, 'get_amount' ) ) ) ? $object->get_amount() : 0, - ); - $action_args = apply_filters( - 'wc_sc_email_coupon_notification_args', - array( - 'email' => $email_restrictions, - 'coupon' => $coupon, - 'discount_type' => ( is_object( $object ) && is_callable( array( $object, 'get_discount_type' ) ) ) ? $object->get_discount_type() : '', - ) - ); - // Trigger email notification. - do_action( 'wc_sc_email_coupon_notification', $action_args ); - } - } - - if ( ! empty( $request['sc_is_html'] ) && 'yes' === $request['sc_is_html'] ) { - $data = ''; - ob_start(); - do_action( - 'wc_sc_paint_coupon', - array( - 'coupon' => $object, - 'with_css' => 'yes', - 'with_container' => 'yes', - ) - ); - $data = ob_get_clean(); - $response = rest_ensure_response( $data ); - } - - return $response; - } - - } - -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-settings.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-settings.php deleted file mode 100644 index 8ebf365a..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-settings.php +++ /dev/null @@ -1,1061 +0,0 @@ - - - - - - - get_settings(); - if ( ! is_array( $sc_settings ) || empty( $sc_settings ) ) { - return; - } - - woocommerce_admin_fields( $sc_settings ); - wp_nonce_field( 'wc_smart_coupons_settings', 'sc_security', false ); - $this->sc_settings_page_styles_scripts(); - } - - /** - * Function to get Smart Coupons admin settings - * - * @return array $sc_settings Smart Coupons admin settings. - */ - public function get_settings() { - global $store_credit_label; - - $singular = ( ! empty( $store_credit_label['singular'] ) ) ? $store_credit_label['singular'] : __( 'store credit', 'woocommerce-smart-coupons' ); - $plural = ( ! empty( $store_credit_label['plural'] ) ) ? $store_credit_label['plural'] : __( 'store credits', 'woocommerce-smart-coupons' ); - - $valid_order_statuses = get_option( 'wc_sc_valid_order_statuses_for_coupon_auto_generation' ); - - $paid_statuses = wc_get_is_paid_statuses(); - - if ( false === $valid_order_statuses ) { - add_option( 'wc_sc_valid_order_statuses_for_coupon_auto_generation', $paid_statuses, '', 'no' ); - } elseif ( ! is_array( $valid_order_statuses ) ) { - update_option( 'wc_sc_valid_order_statuses_for_coupon_auto_generation', $paid_statuses, 'no' ); - } - - $all_order_statuses = wc_get_order_statuses(); - $all_paid_order_statuses = array(); - - foreach ( $paid_statuses as $paid_status ) { - $wc_paid_status = 'wc-' . $paid_status; - if ( array_key_exists( $wc_paid_status, $all_order_statuses ) ) { - $all_paid_order_statuses[ $paid_status ] = $all_order_statuses[ $wc_paid_status ]; - } - } - - $all_discount_types = wc_get_coupon_types(); - - $storewide_offer_coupon_option = array(); - $storewide_offer_coupon_code = get_option( 'smart_coupons_storewide_offer_coupon_code' ); - if ( ! empty( $storewide_offer_coupon_code ) ) { - $coupon = new WC_Coupon( $storewide_offer_coupon_code ); - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : 'percent'; - /* translators: 1. The coupon code, 2. The discount type */ - $storewide_offer_coupon_option[ $storewide_offer_coupon_code ] = sprintf( __( '%1$s (Type: %2$s)', 'woocommerce-smart-coupons' ), $storewide_offer_coupon_code, ( ( array_key_exists( $discount_type, $all_discount_types ) ) ? $all_discount_types[ $discount_type ] : $discount_type ) ); - } - - $valid_designs = $this->get_valid_coupon_designs(); - - $coupon_design = get_option( 'wc_sc_setting_coupon_design' ); - $default_coupon_design = 'basic'; - if ( ! empty( $coupon_design ) && 'custom-design' === $coupon_design ) { - $default_coupon_design = $coupon_design; - } - - $sc_settings = array( - array( - 'title' => __( 'Smart Coupons Settings', 'woocommerce-smart-coupons' ), - 'type' => 'title', - 'desc' => __( 'Set up Smart Coupons the way you like. Use these options to configure/change the way Smart Coupons works.', 'woocommerce-smart-coupons' ), - 'id' => 'sc_display_coupon_settings', - ), - array( - 'title' => __( 'Colors', 'woocommerce-smart-coupons' ), - 'id' => 'wc_sc_setting_coupon_design_colors', - 'default' => '2b2d42-edf2f4-d90429', - 'type' => 'wc_sc_radio_with_html', - 'desc_tip' => __( 'Choose a color scheme for coupons.', 'woocommerce-smart-coupons' ), - 'class' => 'wc_sc_setting_coupon_design_colors', - 'autoload' => false, - 'options' => array( - '2b2d42-edf2f4-d90429' => __( 'Amaranth red', 'woocommerce-smart-coupons' ), - '003459-ffffff-00a8e8' => __( 'Carolina Blue', 'woocommerce-smart-coupons' ), - '334752-fffdf5-46b39d' => __( 'Keppel', 'woocommerce-smart-coupons' ), - 'edf2f4-bb2538-fcbf49' => __( 'McDonald', 'woocommerce-smart-coupons' ), - 'd6b56d-231f20-ffe09c' => __( 'Gold', 'woocommerce-smart-coupons' ), - '362f78-f8f9fa-5950ec' => __( 'Majorelle Blue', 'woocommerce-smart-coupons' ), - 'a82f82-f5f8ff-f45dc4' => __( 'Rose Pink', 'woocommerce-smart-coupons' ), - '2c5f72-f3d2b3-f16a6c' => __( 'Vintage', 'woocommerce-smart-coupons' ), - 'e37332-fefefe-de4f3c' => __( 'Spanish Orange', 'woocommerce-smart-coupons' ), - '8e6e5d-f2f2f2-333333' => __( 'Chocolate', 'woocommerce-smart-coupons' ), - 'a7e7ff-418fde-ffffff' => __( 'Ocean', 'woocommerce-smart-coupons' ), - ), - 'args' => array( - 'html_callback' => array( $this, 'color_scheme_html' ), - ), - ), - array( - 'title' => __( 'Customize colors', 'woocommerce-smart-coupons' ), - 'id' => 'wc_sc_setting_coupon_design_colors', - 'default' => 'custom', - 'type' => 'wc_sc_radio_with_html', - 'desc_tip' => __( 'Customize color scheme for coupons.', 'woocommerce-smart-coupons' ), - 'class' => 'wc_sc_setting_coupon_design_colors custom', - 'autoload' => false, - 'options' => array( - 'custom' => __( 'Custom colors', 'woocommerce-smart-coupons' ), - ), - 'args' => array( - 'html_callback' => array( $this, 'color_scheme_html' ), - ), - ), - array( - 'title' => __( 'Styles', 'woocommerce-smart-coupons' ), - 'id' => 'wc_sc_setting_coupon_design', - 'default' => $default_coupon_design, - 'type' => 'wc_sc_radio_with_html', - 'desc_tip' => __( 'Choose a style for coupon on the website.', 'woocommerce-smart-coupons' ), - 'class' => 'sc-coupons-list wc_sc_setting_coupon_design', - 'autoload' => false, - 'options' => array( - 'flat' => __( 'Flat', 'woocommerce-smart-coupons' ), - 'promotion' => __( 'Promotion', 'woocommerce-smart-coupons' ), - 'ticket' => __( 'Ticket', 'woocommerce-smart-coupons' ), - 'festive' => __( 'Festive', 'woocommerce-smart-coupons' ), - 'special' => __( 'Special', 'woocommerce-smart-coupons' ), - 'shipment' => __( 'Shipment', 'woocommerce-smart-coupons' ), - 'cutout' => __( 'Cutout', 'woocommerce-smart-coupons' ), - 'deliver' => __( 'Deliver', 'woocommerce-smart-coupons' ), - 'clipper' => __( 'Clipper', 'woocommerce-smart-coupons' ), - 'basic' => __( 'Basic', 'woocommerce-smart-coupons' ), - 'deal' => __( 'Deal', 'woocommerce-smart-coupons' ), - ), - 'args' => array( - 'html_callback' => array( $this, 'coupon_design_html' ), - ), - ), - array( - 'title' => __( 'Style for email', 'woocommerce-smart-coupons' ), - 'id' => 'wc_sc_setting_coupon_design_for_email', - 'default' => 'email-coupon', - 'type' => 'wc_sc_radio_with_html', - 'desc_tip' => __( 'Style for coupon in email.', 'woocommerce-smart-coupons' ), - 'class' => 'sc-coupons-list wc_sc_setting_coupon_design', - 'autoload' => false, - 'options' => array( - 'email-coupon' => __( 'Email coupon', 'woocommerce-smart-coupons' ), - ), - 'args' => array( - 'html_callback' => array( $this, 'coupon_design_html' ), - ), - ), - array( - 'name' => __( 'Number of coupons to show', 'woocommerce-smart-coupons' ), - 'desc' => __( 'How many coupons (at max) should be shown on cart, checkout & my account page? If set to 0 (zero) then coupons will not be displayed at all on the website.', 'woocommerce-smart-coupons' ), - 'id' => 'wc_sc_setting_max_coupon_to_show', - 'type' => 'number', - 'desc_tip' => true, - 'css' => 'min-width:300px;', - 'autoload' => false, - ), - array( - 'name' => __( 'Number of characters in auto-generated coupon code', 'woocommerce-smart-coupons' ), - 'desc' => __( 'Number of characters in auto-generated coupon code will be restricted to this number excluding prefix and/or suffix. The default length will be 13. It is recommended to keep this number between 10 to 15 to avoid coupon code duplication.', 'woocommerce-smart-coupons' ), - 'id' => 'wc_sc_coupon_code_length', - 'type' => 'number', - 'desc_tip' => true, - 'placeholder' => '13', - 'css' => 'min-width:300px;', - 'custom_attributes' => array( - 'min' => 7, - 'step' => 1, - 'max' => 20, - ), - 'autoload' => false, - ), - array( - 'name' => __( 'Valid order status for auto-generating coupon', 'woocommerce-smart-coupons' ), - 'desc' => __( 'Choose order status which will trigger the auto-generation of coupon, if the order contains product which will generate the coupon.', 'woocommerce-smart-coupons' ), - 'id' => 'wc_sc_valid_order_statuses_for_coupon_auto_generation', - 'default' => $paid_statuses, - 'type' => 'multiselect', - 'class' => 'wc-enhanced-select', - 'css' => 'min-width: 350px;', - 'desc_tip' => true, - 'options' => $all_paid_order_statuses, - 'custom_attributes' => array( - 'data-placeholder' => __( 'Select order status…', 'woocommerce-smart-coupons' ), - ), - 'autoload' => false, - ), - array( - 'name' => __( 'Enable store notice for the coupon', 'woocommerce-smart-coupons' ), - 'id' => 'smart_coupons_storewide_offer_coupon_code', - 'type' => 'select', - 'default' => '', - 'desc' => __( 'Search & select a coupon which you want to display as store notice. The selected coupon\'s description will be displayed along with the coupon code (if it is set) otherwise, a description will be generated automatically. To disable the feature, keep this field empty.', 'woocommerce-smart-coupons' ), - 'desc_tip' => true, - 'class' => 'wc-sc-storewide-coupon-search', - 'css' => 'min-width:300px;', - 'autoload' => false, - 'custom_attributes' => array( - 'data-placeholder' => __( 'Search for a coupon...', 'woocommerce-smart-coupons' ), - 'data-action' => 'sc_json_search_storewide_coupons', - 'data-security' => wp_create_nonce( 'search-coupons' ), - 'data-allow_clear' => true, - ), - 'options' => $storewide_offer_coupon_option, - ), - array( - /* translators: %s: Label for store credit */ - 'name' => sprintf( __( 'Generated %s amount', 'woocommerce-smart-coupons' ), strtolower( $singular ) ), - /* translators: %s: Label for store credit */ - 'desc' => sprintf( __( 'Include tax in the amount of the generated %s', 'woocommerce-smart-coupons' ), strtolower( $singular ) ), - 'id' => 'wc_sc_generated_store_credit_includes_tax', - 'type' => 'checkbox', - 'default' => 'no', - 'checkboxgroup' => 'start', - 'autoload' => false, - ), - array( - 'name' => __( 'Displaying coupons', 'woocommerce-smart-coupons' ), - /* translators: %s: Preview link */ - 'desc' => sprintf( __( 'Include coupon details on product\'s page, for products that issue coupons %s', 'woocommerce-smart-coupons' ), '' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '' ), - 'id' => 'smart_coupons_is_show_associated_coupons', - 'type' => 'checkbox', - 'default' => 'no', - 'checkboxgroup' => 'start', - 'autoload' => false, - ), - array( - /* translators: %s: Preview link */ - 'desc' => sprintf( __( 'Show coupons available to customers on their My Account > Coupons page %s', 'woocommerce-smart-coupons' ), '' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '' ), - 'id' => 'woocommerce_smart_coupon_show_my_account', - 'type' => 'checkbox', - 'default' => 'yes', - 'checkboxgroup' => '', - 'autoload' => false, - ), - array( - /* translators: %s: Preview link */ - 'desc' => sprintf( __( 'Include coupons received from other people on My Account > Coupons page %s', 'woocommerce-smart-coupons' ), '' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '' ), - 'id' => 'show_coupon_received_on_my_account', - 'type' => 'checkbox', - 'default' => 'no', - 'checkboxgroup' => '', - 'autoload' => false, - ), - array( - /* translators: %s: Preview link */ - 'desc' => sprintf( __( 'Show invalid or used coupons in My Account > Coupons %s', 'woocommerce-smart-coupons' ), '' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '' ), - 'id' => 'smart_coupons_show_invalid_coupons_on_myaccount', - 'type' => 'checkbox', - 'default' => 'no', - 'checkboxgroup' => '', - 'autoload' => false, - ), - array( - /* translators: %s: Preview link */ - 'desc' => sprintf( __( 'Display coupon description along with coupon code (on site as well as in emails) %s', 'woocommerce-smart-coupons' ), '' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '' ), - 'id' => 'smart_coupons_show_coupon_description', - 'type' => 'checkbox', - 'default' => 'no', - 'checkboxgroup' => 'end', - 'autoload' => false, - ), - array( - 'name' => __( 'Automatic deletion', 'woocommerce-smart-coupons' ), - /* translators: %s: Note for admin */ - 'desc' => sprintf( __( 'Delete the %1$s when entire credit amount is used up %2$s', 'woocommerce-smart-coupons' ), strtolower( $singular ), '' . __( '(Note: It\'s recommended to keep it Disabled)', 'woocommerce-smart-coupons' ) . '' ), - 'id' => 'woocommerce_delete_smart_coupon_after_usage', - 'type' => 'checkbox', - 'default' => 'no', - 'checkboxgroup' => 'start', - 'autoload' => false, - ), - array( - 'name' => __( 'Coupon emails', 'woocommerce-smart-coupons' ), - 'desc' => __( 'Email auto generated coupons to recipients', 'woocommerce-smart-coupons' ), - 'id' => 'smart_coupons_is_send_email', - 'type' => 'checkbox', - 'default' => 'yes', - 'checkboxgroup' => 'start', - 'autoload' => false, - ), - array( - 'name' => __( 'Printing coupons', 'woocommerce-smart-coupons' ), - 'desc' => __( 'Enable feature to allow printing of coupons', 'woocommerce-smart-coupons' ) . ' ' . __( '[Read More]', 'woocommerce-smart-coupons' ) . '', - 'id' => 'smart_coupons_is_print_coupon', - 'type' => 'checkbox', - 'default' => 'yes', - 'checkboxgroup' => 'start', - 'autoload' => false, - ), - array( - /* translators: %s: Label for store credit */ - 'name' => sprintf( __( 'Sell %s at less price?', 'woocommerce-smart-coupons' ), strtolower( $plural ) ), - /* translators: %s: Label for store credit, 1: : Label for store credit, 2: Label for store credit, 3: Label for store credit */ - 'desc' => sprintf( __( 'Allow selling %s at discounted price', 'woocommerce-smart-coupons' ), strtolower( $plural ) ) . ' ' . __( '[Read More]', 'woocommerce-smart-coupons' ) . '', - 'id' => 'smart_coupons_sell_store_credit_at_less_price', - 'type' => 'checkbox', - 'checkboxgroup' => 'start', - 'default' => 'no', - 'autoload' => false, - 'desc_tip' => '', - ), - array( - 'type' => 'sectionend', - 'id' => 'sc_display_coupon_settings', - ), - array( - 'title' => __( 'Labels', 'woocommerce-smart-coupons' ), - 'type' => 'title', - 'desc' => __( 'Call it something else! Use these to quickly change text labels through your store. Use translations for complete control.', 'woocommerce-smart-coupons' ), - 'id' => 'sc_setting_labels', - ), - array( - 'name' => __( 'Store Credit / Gift Certificate', 'woocommerce-smart-coupons' ), - 'desc' => '' . __( '[Read More]', 'woocommerce-smart-coupons' ) . '', - 'id' => 'sc_store_credit_singular_text', - 'type' => 'text', - 'placeholder' => __( 'Singular name', 'woocommerce-smart-coupons' ), - 'desc_tip' => __( 'Give alternate singular name to Store Credit / Gift Certificate. This label will only rename Store Credit / Gift Certificate used in the Smart Coupons plugin.', 'woocommerce-smart-coupons' ), - 'css' => 'min-width:300px;', - 'autoload' => false, - ), - array( - 'id' => 'sc_store_credit_plural_text', - 'type' => 'text', - 'desc_tip' => __( 'Give plural name for the above singular name.', 'woocommerce-smart-coupons' ), - 'placeholder' => __( 'Plural name', 'woocommerce-smart-coupons' ), - 'css' => 'min-width:300px;', - 'autoload' => false, - ), - array( - /* translators: %s: Label for store credit */ - 'name' => sprintf( __( '%s product CTA', 'woocommerce-smart-coupons' ), ucfirst( $singular ) ), - 'desc' => '' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '', - 'id' => 'sc_gift_certificate_shop_loop_button_text', - 'type' => 'text', - /* translators: %s: Label for store credit */ - 'desc_tip' => sprintf( __( 'This is what will be shown instead of "Add to Cart" for products that sell %s.', 'woocommerce-smart-coupons' ), strtolower( $plural ) ), - 'placeholder' => __( 'Select options', 'woocommerce-smart-coupons' ), - 'css' => 'min-width:300px;', - 'autoload' => false, - ), - array( - /* translators: %s: Label for store credit */ - 'name' => sprintf( __( 'While purchasing %s', 'woocommerce-smart-coupons' ), strtolower( $plural ) ), - 'desc' => '' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '', - 'id' => 'smart_coupon_store_gift_page_text', - 'type' => 'text', - /* translators: %s: Label for store credit */ - 'desc_tip' => sprintf( __( 'When you opt to allow people to buy %s of any amount, this label will be used.', 'woocommerce-smart-coupons' ), strtolower( $plural ) ), - 'placeholder' => __( 'Purchase credit worth', 'woocommerce-smart-coupons' ), - 'css' => 'min-width:300px;', - 'autoload' => false, - ), - array( - 'name' => __( '"Coupons with Product" description', 'woocommerce-smart-coupons' ), - 'desc' => '' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '', - 'id' => 'smart_coupon_product_page_text', - 'type' => 'text', - 'desc_tip' => __( 'This is the heading above coupon details displayed on products that issue coupons.', 'woocommerce-smart-coupons' ), - 'placeholder' => __( 'You will get following coupon(s) when you buy this item', 'woocommerce-smart-coupons' ), - 'css' => 'min-width:300px;', - 'autoload' => false, - ), - array( - 'name' => __( 'On Cart/Checkout pages', 'woocommerce-smart-coupons' ), - 'desc' => '' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '', - 'id' => 'smart_coupon_cart_page_text', - 'type' => 'text', - 'desc_tip' => __( 'This is the title for the list of available coupons, shown on Cart and Checkout pages.', 'woocommerce-smart-coupons' ), - 'placeholder' => __( 'Available Coupons (click on a coupon to use it)', 'woocommerce-smart-coupons' ), - 'css' => 'min-width:300px;', - 'autoload' => false, - ), - array( - 'name' => __( 'My Account page', 'woocommerce-smart-coupons' ), - 'desc' => '' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '', - 'id' => 'smart_coupon_myaccount_page_text', - 'type' => 'text', - 'desc_tip' => __( 'Title of available coupons list on My Account page.', 'woocommerce-smart-coupons' ), - /* translators: %s: Label for store credit */ - 'placeholder' => sprintf( __( 'Available Coupons & %s', 'woocommerce-smart-coupons' ), ucwords( $plural ) ), - 'css' => 'min-width:300px;', - 'autoload' => false, - ), - array( - 'type' => 'sectionend', - 'id' => 'sc_setting_labels', - ), - array( - 'title' => __( 'Coupon Receiver Details during Checkout', 'woocommerce-smart-coupons' ), - 'type' => 'title', - 'desc' => __( 'Buyers can send purchased coupons to anyone – right while they\'re checking out.', 'woocommerce-smart-coupons' ), - 'id' => 'sc_coupon_receiver_settings', - ), - array( - 'name' => __( 'Allow sending of coupons to others', 'woocommerce-smart-coupons' ), - 'desc' => __( 'Allow the buyer to send coupons to someone else.', 'woocommerce-smart-coupons' ) . ' ' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '', - 'id' => 'smart_coupons_display_coupon_receiver_details_form', - 'type' => 'checkbox', - 'default' => 'yes', - 'autoload' => false, - 'desc_tip' => '', - ), - array( - 'name' => __( 'Title', 'woocommerce-smart-coupons' ), - 'desc' => '' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '', - 'id' => 'smart_coupon_gift_certificate_form_page_text', - 'type' => 'text', - 'desc_tip' => __( 'The title for coupon receiver details block.', 'woocommerce-smart-coupons' ), - 'placeholder' => __( 'Send Coupons to...', 'woocommerce-smart-coupons' ), - 'css' => 'min-width:300px;', - 'autoload' => false, - ), - array( - 'name' => __( 'Description', 'woocommerce-smart-coupons' ), - 'desc' => '' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '', - 'id' => 'smart_coupon_gift_certificate_form_details_text', - 'type' => 'text', - 'desc_tip' => __( 'Additional text below the title.', 'woocommerce-smart-coupons' ), - 'css' => 'min-width:300px;', - 'autoload' => false, - ), - array( - 'name' => __( 'Allow schedule sending of coupons?', 'woocommerce-smart-coupons' ), - 'desc' => __( 'Enable this to allow buyers to select date & time for delivering the coupon.', 'woocommerce-smart-coupons' ) . ' ' . __( '[Preview]', 'woocommerce-smart-coupons' ) . '', - 'id' => 'smart_coupons_schedule_store_credit', - 'type' => 'checkbox', - 'checkboxgroup' => 'start', - 'default' => 'no', - 'autoload' => false, - 'desc_tip' => '', - ), - array( - 'name' => __( 'Combine emails', 'woocommerce-smart-coupons' ), - 'desc' => __( 'Send only one email instead of multiple emails when multiple coupons are generated for same recipient', 'woocommerce-smart-coupons' ), - 'id' => 'smart_coupons_combine_emails', - 'type' => 'checkbox', - 'default' => 'no', - 'autoload' => false, - ), - array( - 'type' => 'sectionend', - 'id' => 'sc_coupon_receiver_settings', - ), - ); - - if ( $this->is_wc_gte_30() && wc_tax_enabled() ) { - $before_tax_option[] = array( - 'name' => __( 'Apply before tax', 'woocommerce-smart-coupons' ), - 'desc' => __( 'Deduct credit/gift before doing tax calculations', 'woocommerce-smart-coupons' ), - 'id' => 'woocommerce_smart_coupon_apply_before_tax', - 'type' => 'checkbox', - 'default' => 'no', - 'checkboxgroup' => 'start', - 'autoload' => false, - 'show_if_checked' => 'option', - ); - - $prices_include_tax = wc_prices_include_tax(); - - if ( true === $prices_include_tax ) { - $before_tax_option[] = array( - /* translators: %s: Label for store credit */ - 'name' => sprintf( __( '%s include tax?', 'woocommerce-smart-coupons' ), ucfirst( $singular ) ), - /* translators: %s: Label for store credit */ - 'desc' => sprintf( __( '%s discount is inclusive of tax', 'woocommerce-smart-coupons' ), ucfirst( $singular ) ), - 'id' => 'woocommerce_smart_coupon_include_tax', - 'type' => 'checkbox', - 'default' => 'no', - 'checkboxgroup' => 'end', - 'autoload' => false, - 'show_if_checked' => 'yes', - ); - } - - array_splice( $sc_settings, 15, 0, $before_tax_option ); - } - - return apply_filters( 'wc_smart_coupons_settings', $sc_settings ); - - } - - /** - * Function for saving settings for Gift Certificate - */ - public function save_smart_coupon_admin_settings() { - if ( empty( $_POST['sc_security'] ) || ! wp_verify_nonce( wp_unslash( $_POST['sc_security'] ), 'wc_smart_coupons_settings' ) ) { // phpcs:ignore - return; - } - - $sc_settings = $this->get_settings(); - if ( ! is_array( $sc_settings ) || empty( $sc_settings ) ) { - return; - } - - woocommerce_update_options( $sc_settings ); - - // Update WC Email settings when SC admin settings are updated. - $is_send_email = get_option( 'smart_coupons_is_send_email', 'yes' ); - $combine_emails = get_option( 'smart_coupons_combine_emails', 'no' ); - - $email_settings = get_option( 'woocommerce_wc_sc_email_coupon_settings', array() ); - if ( is_array( $email_settings ) ) { - $email_settings['enabled'] = $is_send_email; - update_option( 'woocommerce_wc_sc_email_coupon_settings', $email_settings, 'no' ); - } - - $combine_email_settings = get_option( 'woocommerce_wc_sc_combined_email_coupon_settings', array() ); - if ( is_array( $combine_email_settings ) ) { - $combine_email_settings['enabled'] = $combine_emails; - update_option( 'woocommerce_wc_sc_combined_email_coupon_settings', $combine_email_settings, 'no' ); - } - - $predefined_colors = array( - '2b2d42-edf2f4-d90429', - '003459-ffffff-00a8e8', - '334752-fffdf5-46b39d', - 'edf2f4-bb2538-fcbf49', - 'd6b56d-231f20-ffe09c', - '362f78-f8f9fa-5950ec', - 'a82f82-f5f8ff-f45dc4', - '2c5f72-f3d2b3-f16a6c', - 'e37332-fefefe-de4f3c', - '8e6e5d-f2f2f2-333333', - 'a7e7ff-418fde-ffffff', - ); - - $color_options = array( - 'wc_sc_setting_coupon_background_color', - 'wc_sc_setting_coupon_foreground_color', - 'wc_sc_setting_coupon_third_color', - ); - $colors = array(); - foreach ( $color_options as $option ) { - $post_option = ( isset( $_POST[ $option ] ) ) ? wc_clean( wp_unslash( $_POST[ $option ] ) ) : ''; // phpcs:ignore - if ( ! empty( $post_option ) ) { - $colors[] = $post_option; - update_option( $option, $post_option, 'no' ); - } - } - $color_scheme = implode( '-', $colors ); - $color_scheme = str_replace( '#', '', $color_scheme ); - if ( in_array( $color_scheme, $predefined_colors, true ) ) { - update_option( 'wc_sc_setting_coupon_design_colors', $color_scheme, 'no' ); - } - - $old_storewide_offer_coupon_code = get_option( 'smart_coupons_storewide_offer_coupon_code' ); - $post_storewide_offer_coupon_code = ( ! empty( $_POST['smart_coupons_storewide_offer_coupon_code'] ) ) ? wc_clean( wp_unslash( $_POST['smart_coupons_storewide_offer_coupon_code'] ) ) : ''; // phpcs:ignore - if ( $old_storewide_offer_coupon_code !== $post_storewide_offer_coupon_code ) { - update_option( 'smart_coupons_storewide_offer_coupon_code', $post_storewide_offer_coupon_code, 'no' ); - if ( ! empty( $post_storewide_offer_coupon_code ) ) { - $coupon_id = wc_get_coupon_id_by_code( $post_storewide_offer_coupon_code ); - $coupon = new WC_Coupon( $coupon_id ); - $coupon_status = ( $this->is_callable( $coupon, 'get_status' ) ) ? $coupon->get_status() : get_post_status( $coupon_id ); - if ( 'publish' === $coupon_status ) { - update_option( 'woocommerce_demo_store', 'yes' ); - } else { - update_option( 'woocommerce_demo_store', 'no' ); - } - update_option( 'woocommerce_demo_store_notice', '', 'no' ); - $notice = get_option( 'woocommerce_demo_store_notice' ); - if ( empty( $notice ) ) { - $coupon = new WC_Coupon( $post_storewide_offer_coupon_code ); - $notice = $this->generate_storewide_offer_coupon_description( array( 'coupon_object' => $coupon ) ); - update_option( 'woocommerce_demo_store_notice', wp_filter_post_kses( $notice ), 'no' ); - } - } else { - update_option( 'woocommerce_demo_store', 'no' ); - update_option( 'woocommerce_demo_store_notice', '', 'no' ); - } - } - - } - - /** - * Function to Add Delete Credit After Usage Notice - */ - public function add_delete_credit_after_usage_notice() { - - $is_delete_smart_coupon_after_usage = get_option( 'woocommerce_delete_smart_coupon_after_usage' ); - - if ( 'yes' !== $is_delete_smart_coupon_after_usage ) { - return; - } - - $admin_email = get_option( 'admin_email' ); - - $user = get_user_by( 'email', $admin_email ); - - $current_user_id = get_current_user_id(); - - if ( ! empty( $current_user_id ) && ! empty( $user->ID ) && $current_user_id === $user->ID ) { - add_action( 'admin_notices', array( $this, 'delete_credit_after_usage_notice' ) ); - add_action( 'admin_footer', array( $this, 'ignore_delete_credit_after_usage_notice' ) ); - } - - } - - /** - * Function to Delete Credit After Usage Notice - */ - public function delete_credit_after_usage_notice() { - global $store_credit_label; - $plural = ( ! empty( $store_credit_label['plural'] ) ) ? $store_credit_label['plural'] : __( 'store credits', 'woocommerce-smart-coupons' ); - $current_user_id = get_current_user_id(); - $is_hide_delete_after_usage_notice = get_user_meta( $current_user_id, 'hide_delete_credit_after_usage_notice', true ); // @codingStandardsIgnoreLine - if ( 'yes' !== $is_hide_delete_after_usage_notice ) { - echo '

            '; - if ( ! empty( $_GET['page'] ) && 'wc-settings' === $_GET['page'] && empty( $_GET['tab'] ) ) { // phpcs:ignore - /* translators: 1: plugin name 2: page based text 3: Label for store credit 4: Hide notice text */ - echo sprintf( esc_html__( '%1$s: %2$s to avoid issues related to missing data for %3$s. %4$s', 'woocommerce-smart-coupons' ), '' . esc_html__( 'WooCommerce Smart Coupons', 'woocommerce-smart-coupons' ) . '', esc_html__( 'Uncheck', 'woocommerce-smart-coupons' ) . ' "' . esc_html__( 'Delete Gift / Credit, when credit is used up', 'woocommerce-smart-coupons' ) . '"', esc_html( strtolower( $plural ) ), '' . esc_html__( 'Setting', 'woocommerce-smart-coupons' ) . '' ) . ' '; // phpcs ignore. - } else { - /* translators: 1: plugin name 2: page based text 3: Label for store credit 4: Hide notice text */ - echo sprintf( esc_html__( '%1$s: %2$s to avoid issues related to missing data for %3$s. %4$s', 'woocommerce-smart-coupons' ), '' . esc_html__( 'WooCommerce Smart Coupons', 'woocommerce-smart-coupons' ) . '', '' . esc_html__( 'Important setting', 'woocommerce-smart-coupons' ) . '', esc_html( strtolower( $plural ) ), '' . esc_html__( 'Setting', 'woocommerce-smart-coupons' ) . '' ) . ' '; // phpcs ignore. - } - echo '

            '; - } - - } - - /** - * Function to Ignore Delete Credit After Usage Notice - */ - public function ignore_delete_credit_after_usage_notice() { - - if ( ! wp_script_is( 'jquery' ) ) { - wp_enqueue_script( 'jquery' ); - } - - ?> - - $attribute_value ) { - $custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $attribute_value ) . '"'; - } - } - - $field_description = WC_Admin_Settings::get_field_description( $value ); - $description = $field_description['description']; - $tooltip_html = $field_description['tooltip_html']; - - $option_value = $value['value']; - ?> - - - - - -
            - -
              - $val ) { - ?> -
            • - - - /> - -
            • - -
            -
            - - - '#39cccc', - 'wc_sc_setting_coupon_foreground_color' => '#30050b', - 'wc_sc_setting_coupon_third_color' => '#39cccc', - ); - foreach ( $color_options as $option => $default ) { - $color_code = get_option( $option, $default ); - ?> - - - - - - 10, - 'amount_symbol' => get_woocommerce_currency_symbol(), - 'discount_type' => __( 'Discount', 'woocommerce-smart-coupons' ), - 'coupon_description' => __( 'Hurry. Going fast! On the entire range of products.', 'woocommerce-smart-coupons' ), - 'coupon_code' => 'sample-code', - 'coupon_expiry' => $this->get_expiration_format( strtotime( 'Dec 31' ) ), - 'thumbnail_src' => $this->get_coupon_design_thumbnail_src(), - 'classes' => '', - 'template_id' => $design, - 'is_percent' => false, - ); - ?> -
            - -
            - . - add_action( 'init', array( $this, 'register_smart_coupon_shortcode' ) ); - add_action( 'after_wp_tiny_mce', array( $this, 'smart_coupons_after_wp_tiny_mce' ) ); - - } - - /** - * Get single instance of WC_SC_Shortcode - * - * @return WC_SC_Shortcode Singleton object of WC_SC_Shortcode - */ - public static function get_instance() { - // Check if instance is already exists. - if ( is_null( self::$instance ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Handle call to functions which is not available in this class - * - * @param string $function_name The function name. - * @param array $arguments Array of arguments passed while calling $function_name. - * @return result of function call - */ - public function __call( $function_name, $arguments = array() ) { - - global $woocommerce_smart_coupon; - - if ( ! is_callable( array( $woocommerce_smart_coupon, $function_name ) ) ) { - return; - } - - if ( ! empty( $arguments ) ) { - return call_user_func_array( array( $woocommerce_smart_coupon, $function_name ), $arguments ); - } else { - return call_user_func( array( $woocommerce_smart_coupon, $function_name ) ); - } - - } - - /** - * Add Smart Coupons shortcode button in WP editor - */ - public function smart_coupon_shortcode_button_init() { - - if ( get_user_option( 'rich_editing' ) === 'true' && ! current_user_can( 'manage_options' ) ) { // Add shortcode button to WP Editor only when the user is from the top level. - return; - } - - if ( ! wp_script_is( 'wpdialogs' ) ) { - wp_enqueue_script( 'wpdialogs' ); - } - - if ( ! wp_style_is( 'wp-jquery-ui-dialog' ) ) { - wp_enqueue_style( 'wp-jquery-ui-dialog' ); - } - - if ( ! wp_style_is( 'smart-coupon' ) ) { - wp_enqueue_style( 'smart-coupon' ); - } - - add_filter( 'mce_external_plugins', array( $this, 'smart_coupon_register_tinymce_plugin' ) ); - add_filter( 'mce_buttons', array( $this, 'smart_coupon_add_tinymce_button' ) ); - - } - - /** - * Add Smart Coupon short code button in TinyMCE - * - * @param array $plugin_array Existing plugin. - * @return array $plugin array with SMart Coupon shortcode - */ - public function smart_coupon_register_tinymce_plugin( $plugin_array ) { - $plugin_array['sc_shortcode_button'] = plugins_url( 'assets/js/sc-shortcode.js', WC_SC_PLUGIN_FILE ); - return $plugin_array; - } - - /** - * Add Smart coupon shortcode button in TinyMCE - * - * @param array $buttons Existing button. - * @return array $buttons With Smart Coupons shortcode button - */ - public function smart_coupon_add_tinymce_button( $buttons ) { - $buttons[] = 'sc_shortcode_button'; - return $buttons; - } - - /** - * Register shortcode for Smart Coupons - */ - public function register_smart_coupon_shortcode() { - add_shortcode( 'smart_coupons', array( $this, 'execute_smart_coupons_shortcode' ) ); - add_shortcode( 'wc_sc_available_coupons', array( $this, 'show_available_coupons_shortcode' ) ); - } - - /** - * Execute Smart Coupons shortcode - * - * @param array $atts Shortcode attributes. - * @return HTML code for coupon to be displayed - */ - public function execute_smart_coupons_shortcode( $atts ) { - ob_start(); - global $wpdb, $store_credit_label; - - $current_user = wp_get_current_user(); - $customer_id = $current_user->ID; - - $shortcode = shortcode_atts( - array( - 'coupon_code' => '', - 'discount_type' => 'smart_coupon', - 'coupon_amount' => '', - 'individual_use' => 'no', - 'product_ids' => '', - 'exclude_product_ids' => '', - 'usage_limit' => '', - 'usage_limit_per_user' => '', - 'limit_usage_to_x_items' => '', - 'expiry_date' => '', - 'apply_before_tax' => 'no', - 'free_shipping' => 'no', - 'product_categories' => '', - 'exclude_product_categories' => '', - 'minimum_amount' => '', - 'maximum_amount' => '', - 'exclude_sale_items' => 'no', - 'auto_generate' => 'no', - 'coupon_prefix' => '', - 'coupon_suffix' => '', - 'customer_email' => '', - 'coupon_style' => '', - 'disable_email' => 'no', - 'expiry_days' => '', - 'is_email' => 'no', - 'is_clickable' => 'no', - ), - $atts - ); - - $_coupon_code = $shortcode['coupon_code']; - $_discount_type = $shortcode['discount_type']; - $_coupon_amount = $shortcode['coupon_amount']; - $_expiry_date = $shortcode['expiry_date']; - $_free_shipping = $shortcode['free_shipping']; - $customer_email = $shortcode['customer_email']; - $coupon_prefix = $shortcode['coupon_prefix']; - $coupon_suffix = $shortcode['coupon_suffix']; - $individual_use = $shortcode['individual_use']; - $minimum_amount = $shortcode['minimum_amount']; - $maximum_amount = $shortcode['maximum_amount']; - $usage_limit = $shortcode['usage_limit']; - $apply_before_tax = $shortcode['apply_before_tax']; - $disable_email = $shortcode['disable_email']; - $expiry_days = $shortcode['expiry_days']; - $is_email = $shortcode['is_email']; - $is_clickable = $shortcode['is_clickable']; - - if ( empty( $_coupon_code ) && empty( $_coupon_amount ) ) { - return; // Minimum requirement for shortcode is either $_coupon_code or $_coupon_amount. - } - - if ( empty( $customer_email ) ) { - - if ( ! ( $current_user instanceof WP_User ) ) { - $current_user = wp_get_current_user(); - $customer_email = ( isset( $current_user->user_email ) ) ? $current_user->user_email : ''; - } else { - $customer_email = ( ! empty( $current_user->data->user_email ) ) ? $current_user->data->user_email : ''; - } - } - - if ( ! empty( $_coupon_code ) && ! empty( $customer_email ) ) { - $coupon_exists = wp_cache_get( 'wc_sc_shortcode_coupon_id_' . sanitize_key( $customer_email ), 'woocommerce_smart_coupons' ); - if ( false === $coupon_exists ) { - $coupon_exists = $wpdb->get_var( // phpcs:ignore - $wpdb->prepare( - "SELECT ID - FROM {$wpdb->prefix}posts AS posts - LEFT JOIN {$wpdb->prefix}postmeta AS postmeta - ON ( postmeta.post_id = posts.ID ) - WHERE posts.post_title = %s - AND posts.post_type = %s - AND posts.post_status = %s - AND postmeta.meta_key = %s - AND postmeta.meta_value LIKE %s", - strtolower( $_coupon_code ), - 'shop_coupon', - 'publish', - 'customer_email', - '%' . $wpdb->esc_like( $customer_email ) . '%' - ) - ); - wp_cache_set( 'wc_sc_shortcode_coupon_id_' . sanitize_key( $customer_email ), $coupon_exists, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_shortcode_coupon_id_' . sanitize_key( $customer_email ) ); - } - } else { - $coupon_exists = null; - } - - $is_generate = apply_filters( - 'wc_sc_shortcode_always_generate_coupon', - ( null === $coupon_exists ), - array( - 'source' => $this, - 'shortcode_attributes' => $shortcode, - ) - ); - - $_expiry_date = ''; - - if ( ! wp_style_is( 'smart-coupon' ) ) { - wp_enqueue_style( 'smart-coupon' ); - } - - $all_discount_types = wc_get_coupon_types(); - - if ( true === $is_generate ) { - - if ( ! empty( $_coupon_code ) ) { - $coupon = new WC_Coupon( $_coupon_code ); - $is_callable_coupon_update_meta = $this->is_callable( $coupon, 'update_meta_data' ); - - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - return; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - return; - } - $is_free_shipping = ( $coupon->get_free_shipping() ) ? 'yes' : 'no'; - $discount_type = $coupon->get_discount_type(); - $expiry_date = $coupon->get_date_expires(); - $coupon_code = $coupon->get_code(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $expiry_date = ( ! empty( $coupon->expiry_date ) ) ? $coupon->expiry_date : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - $coupon_amount = $this->get_amount( $coupon, true ); - - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - - if ( ! empty( $discount_type ) ) { - - $is_auto_generate = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'auto_generate_coupon' ) : get_post_meta( $coupon_id, 'auto_generate_coupon', true ); - $is_disable_email_restriction = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'sc_disable_email_restriction' ) : get_post_meta( $coupon_id, 'sc_disable_email_restriction', true ); - - if ( ( empty( $is_disable_email_restriction ) || 'no' === $is_disable_email_restriction ) && ( empty( $is_auto_generate ) || 'no' === $is_auto_generate ) ) { - $existing_customer_emails = ( $this->is_callable( $coupon, 'get_email_restrictions' ) ) ? $coupon->get_email_restrictions() : get_post_meta( $coupon_id, 'customer_email', true ); - if ( empty( $existing_customer_emails ) || ! is_array( $existing_customer_emails ) ) { - $existing_customer_emails = array(); - } - $existing_customer_emails[] = $customer_email; - if ( true === $is_callable_coupon_update_meta ) { - $coupon->set_email_restrictions( $existing_customer_emails ); - } else { - update_post_meta( $coupon_id, 'customer_email', $existing_customer_emails ); - } - } - - if ( ! empty( $is_auto_generate ) && 'yes' === $is_auto_generate ) { - - if ( 0 === $current_user->ID ) { - if ( 'smart_coupon' === $discount_type ) { - return; // Don't generate & don't show coupon if coupon of the shortcode is store credit & user is guest, otherwise it'll lead to unlimited generation of coupon. - } else { - $new_generated_coupon_code = $coupon_code; - } - } elseif ( true === $is_generate && 'yes' === $is_email ) { - $generated_coupon_details = apply_filters( 'generate_smart_coupon_action', $customer_email, $coupon_amount, '', $coupon ); - $last_element = end( $generated_coupon_details[ $customer_email ] ); - $new_generated_coupon_code = $last_element['code']; - } else { - - $shortcode_generated_coupon = $this->get_shortcode_generated_coupon( $current_user, $coupon ); - - if ( empty( $shortcode_generated_coupon ) || ( true === $is_generate && 'yes' === $is_email ) ) { - $generated_coupon_details = apply_filters( 'generate_smart_coupon_action', $customer_email, $coupon_amount, '', $coupon ); - $last_element = end( $generated_coupon_details[ $customer_email ] ); - $new_generated_coupon_code = $last_element['code']; - $this->save_shortcode_generated_coupon( $new_generated_coupon_code, $current_user, $coupon ); - } else { - $new_generated_coupon_code = $shortcode_generated_coupon; - } - } - } else { - - $new_generated_coupon_code = $_coupon_code; - - } - } - } - - if ( ( ! empty( $_coupon_code ) && empty( $discount_type ) ) || ( empty( $_coupon_code ) ) ) { - - if ( empty( $current_user->ID ) && ( 'smart_coupon' === $_discount_type || 'smart_coupon' === $discount_type ) ) { - return; // It'll prevent generation of unlimited coupons for guest. - } - - if ( empty( $coupon ) ) { - $coupon = null; - } - - $shortcode_generated_coupon = $this->get_shortcode_generated_coupon( $current_user, $coupon ); - - if ( empty( $shortcode_generated_coupon ) ) { - - if ( empty( $_coupon_code ) ) { - $_coupon_code = $this->generate_unique_code( $customer_email ); - $_coupon_code = $coupon_prefix . $_coupon_code . $coupon_suffix; - } - - $coupon_args = array( - 'post_title' => strtolower( $_coupon_code ), - 'post_content' => '', - 'post_status' => 'publish', - 'post_author' => 1, - 'post_type' => 'shop_coupon', - 'post_parent' => ! empty( $coupon_id ) ? absint( $coupon_id ) : 0, - ); - - $new_coupon = new WC_Coupon(); - $new_coupon->set_code( $coupon_args['post_title'] ); - $new_coupon->set_status( $coupon_args['post_status'] ); - - $new_coupon_id = $new_coupon->save(); - - if ( ! empty( $new_coupon_id ) ) { - $coupon_args = array_diff_key( $coupon_args, array_flip( array( 'post_title', 'post_status', 'post_type' ) ) ); - $coupon_args['ID'] = $new_coupon_id; - wp_update_post( $coupon_args ); - } - - $new_coupon_id = absint( $new_coupon_id ); - - $new_coupon = new WC_Coupon( $new_coupon_id ); - - $is_callable_new_coupon_update_meta = $this->is_callable( $new_coupon, 'update_meta_data' ); - - if ( ! empty( $shortcode['expiry_date'] ) ) { - $timestamp = strtotime( $shortcode['expiry_date'] ) + $this->wc_timezone_offset(); - $_expiry_date = gmdate( 'Y-m-d', $timestamp ); - } elseif ( ! empty( $expiry_days ) ) { - $timestamp = strtotime( "+$expiry_days days" ) + $this->wc_timezone_offset(); - $_expiry_date = gmdate( 'Y-m-d', $timestamp ); - } - if ( $this->is_wc_gte_30() ) { - if ( ! empty( $_expiry_date ) ) { - $_expiry_date = strtotime( $_expiry_date ) - $this->wc_timezone_offset(); - $_expiry_date = $this->get_date_expires_value( $_expiry_date ); - if ( true === $is_callable_new_coupon_update_meta ) { - $new_coupon->set_date_expires( $_expiry_date ); - } else { - update_post_meta( $new_coupon_id, 'date_expires', $_expiry_date ); - } - } - } else { - if ( true === $is_callable_new_coupon_update_meta ) { - $new_coupon->update_meta_data( 'expiry_date', $_expiry_date ); - } else { - update_post_meta( $new_coupon_id, 'expiry_date', $_expiry_date ); - } - } - - if ( 'smart_coupon' === $_discount_type ) { - $this->update_post_meta( $new_coupon_id, 'wc_sc_original_amount', $_coupon_amount, false ); - } - - if ( true === $is_callable_new_coupon_update_meta ) { - $new_coupon->set_discount_type( $_discount_type ); - $new_coupon->set_amount( $_coupon_amount ); - $new_coupon->set_individual_use( $this->wc_string_to_bool( $individual_use ) ); - $new_coupon->set_minimum_amount( $minimum_amount ); - $new_coupon->set_maximum_amount( $maximum_amount ); - $new_coupon->set_usage_limit( $usage_limit ); - $new_coupon->set_email_restrictions( array( $customer_email ) ); - $new_coupon->update_meta_data( 'apply_before_tax', $apply_before_tax ); - $new_coupon->set_free_shipping( $this->wc_string_to_bool( $_free_shipping ) ); - $new_coupon->set_product_categories( array() ); - $new_coupon->set_excluded_product_categories( array() ); - $new_coupon->update_meta_data( 'sc_disable_email_restriction', $disable_email ); - } else { - update_post_meta( $new_coupon_id, 'discount_type', $_discount_type ); - update_post_meta( $new_coupon_id, 'coupon_amount', $_coupon_amount ); - update_post_meta( $new_coupon_id, 'individual_use', $individual_use ); - update_post_meta( $new_coupon_id, 'minimum_amount', $minimum_amount ); - update_post_meta( $new_coupon_id, 'maximum_amount', $maximum_amount ); - update_post_meta( $new_coupon_id, 'usage_limit', $usage_limit ); - update_post_meta( $new_coupon_id, 'customer_email', array( $customer_email ) ); - update_post_meta( $new_coupon_id, 'apply_before_tax', $apply_before_tax ); - update_post_meta( $new_coupon_id, 'free_shipping', $_free_shipping ); - update_post_meta( $new_coupon_id, 'product_categories', array() ); - update_post_meta( $new_coupon_id, 'exclude_product_categories', array() ); - update_post_meta( $new_coupon_id, 'sc_disable_email_restriction', $disable_email ); - } - - if ( $this->is_callable( $new_coupon, 'save' ) ) { - $new_coupon->save(); - } - - $new_generated_coupon_code = $_coupon_code; - $this->save_shortcode_generated_coupon( $new_generated_coupon_code, $current_user, $coupon ); - - } else { - - $new_generated_coupon_code = $shortcode_generated_coupon; - - } - } - } else { - - $new_generated_coupon_code = $_coupon_code; - - } - - $new_coupon_generated = false; - if ( ! empty( $new_generated_coupon_code ) ) { - $coupon = new WC_Coupon( $new_generated_coupon_code ); - $new_coupon_generated = true; - } - - if ( $new_coupon_generated ) { - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - return; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - return; - } - $is_free_shipping = ( $coupon->get_free_shipping() ) ? 'yes' : 'no'; - $discount_type = $coupon->get_discount_type(); - $expiry_date = $coupon->get_date_expires(); - $coupon_code = $coupon->get_code(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $expiry_date = ( ! empty( $coupon->expiry_date ) ) ? $coupon->expiry_date : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - } - - $coupon_amount = $this->get_amount( $coupon, true ); - - $coupon_post = get_post( $coupon_id ); - - $coupon_data = $this->get_coupon_meta_data( $coupon ); - - $design = get_option( 'wc_sc_setting_coupon_design', 'basic' ); - $background_color = get_option( 'wc_sc_setting_coupon_background_color', '#39cccc' ); - $foreground_color = get_option( 'wc_sc_setting_coupon_foreground_color', '#30050b' ); - $third_color = get_option( 'wc_sc_setting_coupon_third_color', '#39cccc' ); - - $show_coupon_description = get_option( 'smart_coupons_show_coupon_description', 'no' ); - - $valid_designs = $this->get_valid_coupon_designs(); - - if ( ! in_array( $design, $valid_designs, true ) ) { - $design = 'basic'; - } - - if ( 'yes' === $is_email ) { - $design = ( 'custom-design' !== $design ) ? 'email-coupon' : $design; - } - - ?> - - - - - - is_wc_gte_30() && $expiry_date instanceof WC_DateTime ) { - $expiry_date = ( is_callable( array( $expiry_date, 'getTimestamp' ) ) ) ? $expiry_date->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - - if ( ! empty( $expiry_date ) && is_int( $expiry_date ) ) { - $expiry_time = ( $this->is_callable( $coupon, 'get_meta' ) ) ? (int) $coupon->get_meta( 'wc_sc_expiry_time' ) : (int) get_post_meta( $coupon_id, 'wc_sc_expiry_time', true ); - if ( ! empty( $expiry_time ) ) { - $expiry_date += $expiry_time; // Adding expiry time to expiry date. - } - } - - $coupon_description = ''; - if ( ! empty( $coupon_post->post_excerpt ) && 'yes' === $show_coupon_description ) { - $coupon_description = $coupon_post->post_excerpt; - } - - $is_percent = $this->is_percent_coupon( array( 'coupon_object' => $coupon ) ); - - $args = array( - 'coupon_object' => $coupon, - 'coupon_amount' => $coupon_amount, - 'amount_symbol' => ( true === $is_percent ) ? '%' : get_woocommerce_currency_symbol(), - 'discount_type' => wp_strip_all_tags( $coupon_type ), - 'coupon_description' => ( ! empty( $coupon_description ) ) ? $coupon_description : wp_strip_all_tags( $this->generate_coupon_description( array( 'coupon_object' => $coupon ) ) ), - 'coupon_code' => $new_generated_coupon_code, - 'coupon_expiry' => ( ! empty( $expiry_date ) ) ? $this->get_expiration_format( $expiry_date ) : __( 'Never expires', 'woocommerce-smart-coupons' ), - 'thumbnail_src' => $this->get_coupon_design_thumbnail_src( - array( - 'design' => $design, - 'coupon_object' => $coupon, - ) - ), - 'classes' => '', - 'template_id' => $design, - 'is_percent' => $is_percent, - ); - - $coupon_target = ''; - $wc_url_coupons_active_urls = get_option( 'wc_url_coupons_active_urls' ); // From plugin WooCommerce URL coupons. - if ( ! empty( $wc_url_coupons_active_urls ) ) { - $coupon_target = ( ! empty( $wc_url_coupons_active_urls[ $coupon_id ]['url'] ) ) ? $wc_url_coupons_active_urls[ $coupon_id ]['url'] : ''; - } - if ( ! empty( $coupon_target ) ) { - $coupon_target = home_url( '/' . $coupon_target ); - } else { - $coupon_target = home_url( '/?sc-page=shop&coupon-code=' . $coupon_code ); - } - - $coupon_target = apply_filters( 'sc_coupon_url_in_email', $coupon_target, $coupon ); - - do_action( - 'wc_sc_before_shortcode_smart_coupons_html_start', - array( - 'source' => $this, - 'shortcode_attributes' => $shortcode, - 'coupon_object' => $coupon, - ) - ); - - if ( 'yes' === $is_email ) { - echo ''; - } - - return ob_get_clean(); - } - - /** - * Show available coupons - * - * @param array $atts Shortcode attributes. - * @return HTML code for coupon to be displayed - */ - public function show_available_coupons_shortcode( $atts ) { - - $shortcode = shortcode_atts( - array( - 'title' => get_option( 'smart_coupon_cart_page_text' ), - ), - $atts - ); - - $title = $shortcode['title']; - $title = ( ! empty( $title ) ) ? $title : __( 'Available Coupons (click on a coupon to use it)', 'woocommerce-smart-coupons' ); - - if ( ! class_exists( 'WC_SC_Display_Coupons' ) ) { - include_once 'class-wc-sc-display-coupons.php'; - } - $wc_sc_display_coupons = WC_SC_Display_Coupons::get_instance(); - - if ( ! is_object( $wc_sc_display_coupons ) || ! is_callable( array( $wc_sc_display_coupons, 'show_available_coupons' ) ) ) { - return ''; - } - - ob_start(); - $wc_sc_display_coupons->show_available_coupons( $title, get_the_title() ); - return ob_get_clean(); - } - - /** - * Function to check whether to generate a new coupon through shortcode for current user - * Don't create if it is already generated. - * - * @param WP_User $current_user The user object. - * @param WC_Coupon $coupon The coupon object. - * @return string $code - */ - public function get_shortcode_generated_coupon( $current_user = null, $coupon = null ) { - - $max_in_a_session = get_option( '_sc_max_coupon_generate_in_a_session', 1 ); - $max_per_coupon_per_user = get_option( '_sc_max_coupon_per_coupon_per_user', 1 ); - - if ( $this->is_wc_gte_30() ) { - $coupon_code = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - } else { - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - $code = ( ! empty( $coupon_code ) ) ? $coupon_code : ''; - - if ( ! empty( $current_user->ID ) ) { - - $generated_coupons = get_user_meta( $current_user->ID, '_sc_shortcode_generated_coupons', true ); - - if ( ! empty( $generated_coupons[ $code ] ) && count( $generated_coupons[ $code ] ) >= $max_per_coupon_per_user ) { - return end( $generated_coupons[ $code ] ); - } - } - - $session_shortcode_coupons = ( is_object( WC()->session ) && is_callable( array( WC()->session, 'get' ) ) ) ? WC()->session->get( '_sc_session_shortcode_generated_coupons' ) : array(); - - if ( ! empty( $session_shortcode_coupons[ $code ] ) && count( $session_shortcode_coupons[ $code ] ) >= $max_in_a_session ) { - return end( $session_shortcode_coupons[ $code ] ); - } - - return false; - - } - - /** - * Function to save shortcode generated coupon details - * - * @param string $new_code The coupon code. - * @param WP_User $current_user The user object. - * @param WC_Coupon $coupon The coupon object. - */ - public function save_shortcode_generated_coupon( $new_code, $current_user, $coupon ) { - - if ( $this->is_wc_gte_30() ) { - $coupon_code = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - } else { - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - $code = ( ! empty( $coupon_code ) ) ? $coupon_code : 0; - - $session_shortcode_coupons = ( is_object( WC()->session ) && is_callable( array( WC()->session, 'get' ) ) ) ? WC()->session->get( '_sc_session_shortcode_generated_coupons' ) : array(); - - if ( empty( $session_shortcode_coupons ) || ! is_array( $session_shortcode_coupons ) ) { - $session_shortcode_coupons = array(); - } - if ( empty( $session_shortcode_coupons[ $code ] ) ) { - $session_shortcode_coupons[ $code ] = array(); - } - if ( ! in_array( $new_code, $session_shortcode_coupons[ $code ], true ) ) { - $session_shortcode_coupons[ $code ][] = $new_code; - if ( is_object( WC()->session ) && is_callable( array( WC()->session, 'set' ) ) ) { - WC()->session->set( '_sc_session_shortcode_generated_coupons', $session_shortcode_coupons ); - } - } - - if ( ! empty( $current_user->ID ) ) { - $generated_coupons = get_user_meta( $current_user->ID, '_sc_shortcode_generated_coupons', true ); - if ( empty( $generated_coupons ) ) { - $generated_coupons = array(); - } - if ( empty( $generated_coupons[ $code ] ) ) { - $generated_coupons[ $code ] = array(); - } - if ( ! in_array( $new_code, $generated_coupons[ $code ], true ) ) { - $generated_coupons[ $code ][] = $new_code; - update_user_meta( $current_user->ID, '_sc_shortcode_generated_coupons', $generated_coupons ); - } - } - - } - - /** - * Smart coupon button after TinyMCE - * - * @param mixed $mce_settings The editor settings. - */ - public function smart_coupons_after_wp_tiny_mce( $mce_settings ) { - if ( ! is_admin() || ! current_user_can( 'manage_options' ) ) { // Show shortcode attribute dialog to only top level users. - return; - } - $this->sc_attributes_dialog(); - } - - /** - * Smart Coupons dialog content for shortcode - */ - public function sc_attributes_dialog() { - - ?> -
            -
            - - - - -
            -
            -
            - -
            -
            -
            -
            -
              -
              -
              -
              -
              -
              -
              -
              - -
              - get_valid_coupon_designs(); - - if ( ! in_array( $design, $valid_designs, true ) ) { - $design = 'basic'; - } - ?> - - - - - 'XX', - 'amount_symbol' => get_woocommerce_currency_symbol(), - 'discount_type' => 'Discount type', - 'coupon_description' => 'Description', - 'coupon_code' => 'coupon-code', - 'coupon_expiry' => 'Expires on xx date', - 'thumbnail_src' => '', - 'classes' => '', - 'template_id' => $design, - 'is_percent' => false, - ); - wc_get_template( 'coupon-design/' . $design . '.php', $args, '', plugin_dir_path( WC_SC_PLUGIN_FILE ) . 'templates/' ); - ?> -
              -
              -
              -
              - -
              -
              - -
              -
              -
              -
              - cart ) ) ? WC()->cart : null; - - foreach ( $coupon_codes as $coupon_index => $coupon_code ) { - // Process only first five coupons to avoid GET request parameter limit. - if ( apply_filters( 'wc_sc_max_url_coupons_limit', 5 ) === $coupon_index ) { - break; - } - - if ( empty( $coupon_code ) ) { - continue; - } - - $coupons_data[] = array( - 'coupon-code' => $coupon_code, - ); - } - - $is_cart_empty = is_a( $cart, 'WC_Cart' ) && is_callable( array( $cart, 'is_empty' ) ) && $cart->is_empty(); - - if ( true === $is_cart_empty ) { - $is_hold = apply_filters( - 'wc_sc_hold_applied_coupons', - true, - array( - 'coupons_data' => $coupons_data, - 'source' => $this, - ) - ); - if ( true === $is_hold ) { - $this->hold_applied_coupon( $coupons_data ); - } - // Set a session cookie to persist the coupon in case the cart is empty. This code will persist the coupon even if the param sc-page is not supplied. - WC()->session->set_customer_session_cookie( true ); // Thanks to: Devon Godfrey. - } else { - foreach ( $coupons_data as $coupon_data ) { - $coupon_code = $coupon_data['coupon-code']; - if ( ! WC()->cart->has_discount( $coupon_code ) ) { - WC()->cart->add_discount( trim( $coupon_code ) ); - } - } - } - - if ( ! empty( $coupon_args['add-to-cart'] ) ) { - add_filter( 'woocommerce_add_to_cart_redirect', array( $this, 'add_to_cart_redirect' ), 20, 2 ); - return; // Redirection handed over to WooCommerce. - } - - if ( empty( $coupon_args['sc-page'] ) ) { - return; - } - - $redirect_url = $this->get_sc_redirect_url( $coupon_args ); - wp_safe_redirect( $redirect_url ); - exit; - - } - - } - - /** - * Get Smart Coupons redirect url - * - * @param array $coupon_args Coupon args. - * @return string - */ - public function get_sc_redirect_url( $coupon_args = array() ) { - $redirect_url = ''; - - if ( in_array( $coupon_args['sc-page'], array( 'shop', 'cart', 'checkout', 'myaccount' ), true ) ) { - if ( $this->is_wc_gte_30() ) { - $page_id = wc_get_page_id( $coupon_args['sc-page'] ); - } else { - $page_id = woocommerce_get_page_id( $coupon_args['sc-page'] ); - } - $redirect_url = get_permalink( $page_id ); - } elseif ( is_string( $coupon_args['sc-page'] ) ) { - if ( is_numeric( $coupon_args['sc-page'] ) && ! is_float( $coupon_args['sc-page'] ) ) { - $page = $coupon_args['sc-page']; - } else { - $page = ( function_exists( 'wpcom_vip_get_page_by_path' ) ) ? wpcom_vip_get_page_by_path( $coupon_args['sc-page'], OBJECT, get_post_types() ) : get_page_by_path( $coupon_args['sc-page'], OBJECT, get_post_types() ); // phpcs:ignore - } - $redirect_url = get_permalink( $page ); - } elseif ( is_numeric( $coupon_args['sc-page'] ) && ! is_float( $coupon_args['sc-page'] ) ) { - $redirect_url = get_permalink( $coupon_args['sc-page'] ); - } - - if ( empty( $redirect_url ) ) { - $redirect_url = home_url(); - } - - return $this->get_redirect_url_after_smart_coupons_process( $redirect_url ); - } - - /** - * WooCommerce handles add to cart redirect. - * - * @param string $url The redirect URL. - * @param WC_Product $product Product. - * @return string - */ - public function add_to_cart_redirect( $url = '', $product = null ) { - - remove_filter( 'woocommerce_add_to_cart_redirect', array( $this, 'add_to_cart_redirect' ), 20 ); - - if ( empty( $_SERVER['QUERY_STRING'] ) ) { - return $url; - } - - parse_str( wp_unslash( $_SERVER['QUERY_STRING'] ), $coupon_args ); // phpcs:ignore - $coupon_args = wc_clean( $coupon_args ); - - if ( ! empty( $coupon_args['sc-page'] ) ) { - return $this->get_sc_redirect_url( $coupon_args ); - } - - return $url; - } - - /** - * Apply coupon code from session, if any - */ - public function apply_coupon_from_session() { - - $cart = ( is_object( WC() ) && isset( WC()->cart ) ) ? WC()->cart : null; - - if ( empty( $cart ) || WC()->cart->is_empty() ) { - return; - } - - $user_id = get_current_user_id(); - - if ( 0 === $user_id ) { - $unique_id = ( ! empty( $_COOKIE['sc_applied_coupon_profile_id'] ) ) ? wc_clean( wp_unslash( $_COOKIE['sc_applied_coupon_profile_id'] ) ) : ''; // phpcs:ignore - $applied_coupon_from_url = ( ! empty( $unique_id ) ) ? $this->get_applied_coupons_by_guest_user( $unique_id ) : array(); - } else { - $applied_coupon_from_url = get_user_meta( $user_id, 'sc_applied_coupon_from_url', true ); - } - - if ( empty( $applied_coupon_from_url ) ) { - return; - } - - foreach ( $applied_coupon_from_url as $index => $coupon_code ) { - $coupon = new WC_Coupon( $coupon_code ); - if ( $coupon->is_valid() && ! WC()->cart->has_discount( $coupon_code ) ) { - WC()->cart->add_discount( trim( $coupon_code ) ); - unset( $applied_coupon_from_url[ $index ] ); - } - } - - if ( 0 === $user_id ) { - $this->set_applied_coupon_for_guest_user( $unique_id, $applied_coupon_from_url ); - } else { - update_user_meta( $user_id, 'sc_applied_coupon_from_url', $applied_coupon_from_url ); - } - - } - - /** - * Apply coupon code from session, if any - * - * @param array $coupons_args The coupon arguments. - */ - public function hold_applied_coupon( $coupons_args = array() ) { - - $user_id = get_current_user_id(); - $saved_status = array(); - - if ( 0 === $user_id ) { - $saved_status = $this->save_applied_coupon_in_cookie( $coupons_args ); - } else { - $saved_status = $this->save_applied_coupon_in_account( $coupons_args, $user_id ); - } - - if ( ! empty( $saved_status ) ) { - foreach ( $coupons_args as $coupon_args ) { - $coupon_code = $coupon_args['coupon-code']; - $save_status = isset( $saved_status[ $coupon_code ] ) ? $saved_status[ $coupon_code ] : ''; - if ( 'saved' === $save_status ) { - /* translators: %s: $coupon_code coupon code */ - $notice = sprintf( __( 'Coupon code "%s" applied successfully. Please add some products to the cart to see the discount.', 'woocommerce-smart-coupons' ), $coupon_code ); - $this->set_coupon_notices( $notice, 'success' ); - } elseif ( 'already_saved' === $save_status ) { - /* translators: %s: $coupon_code coupon code */ - $notice = sprintf( __( 'Coupon code "%s" already applied! Please add some products to the cart to see the discount.', 'woocommerce-smart-coupons' ), $coupon_code ); - $this->set_coupon_notices( $notice, 'error' ); - } - } - } - - } - - /** - * Apply coupon code from session, if any - * - * @param array $coupons_args The coupon arguments. - * @return array $saved_status - */ - public function save_applied_coupon_in_cookie( $coupons_args = array() ) { - - $saved_status = array(); // Variable to store whether coupons saved/already saved in cookie. - - if ( ! empty( $coupons_args ) ) { - - if ( empty( $_COOKIE['sc_applied_coupon_profile_id'] ) ) { - $unique_id = $this->generate_unique_id(); - } else { - $unique_id = wc_clean( wp_unslash( $_COOKIE['sc_applied_coupon_profile_id'] ) ); // phpcs:ignore - } - - $applied_coupons = $this->get_applied_coupons_by_guest_user( $unique_id ); - - foreach ( $coupons_args as $coupon_args ) { - $coupon_code = isset( $coupon_args['coupon-code'] ) ? $coupon_args['coupon-code'] : ''; - if ( is_array( $applied_coupons ) && in_array( $coupon_code, $applied_coupons, true ) ) { - $saved_status[ $coupon_code ] = 'already_saved'; - } else { - $applied_coupons[] = $coupon_code; - $saved_status[ $coupon_code ] = 'saved'; - } - } - - $this->set_applied_coupon_for_guest_user( $unique_id, $applied_coupons ); - wc_setcookie( 'sc_applied_coupon_profile_id', $unique_id, $this->get_cookie_life() ); - } - - return $saved_status; - - } - - /** - * Apply coupon code from session, if any - * - * @param array $coupons_args The coupon arguments. - * @param int $user_id The user id. - * @return array $saved_status - */ - public function save_applied_coupon_in_account( $coupons_args = array(), $user_id = 0 ) { - - $saved_status = array(); // Variable to store whether coupons saved/already saved in user meta. - - if ( ! empty( $coupons_args ) ) { - - $applied_coupons = get_user_meta( $user_id, 'sc_applied_coupon_from_url', true ); - - if ( empty( $applied_coupons ) ) { - $applied_coupons = array(); - } - - foreach ( $coupons_args as $coupon_args ) { - $coupon_code = $coupon_args['coupon-code']; - if ( ! in_array( $coupon_code, $applied_coupons, true ) ) { - $applied_coupons[] = $coupon_args['coupon-code']; - $saved_status[ $coupon_code ] = 'saved'; - } else { - $saved_status[ $coupon_code ] = 'already_saved'; - } - } - - update_user_meta( $user_id, 'sc_applied_coupon_from_url', $applied_coupons ); - } - - return $saved_status; - - } - - /** - * Apply coupon code from session, if any - */ - public function move_applied_coupon_from_cookies_to_account() { - - $user_id = get_current_user_id(); - - if ( $user_id > 0 && ! empty( $_COOKIE['sc_applied_coupon_profile_id'] ) ) { - - $unique_id = wc_clean( wp_unslash( $_COOKIE['sc_applied_coupon_profile_id'] ) ); // phpcs:ignore - - $applied_coupons = $this->get_applied_coupons_by_guest_user( $unique_id ); - - if ( false !== $applied_coupons && is_array( $applied_coupons ) && ! empty( $applied_coupons ) ) { - - $saved_coupons = get_user_meta( $user_id, 'sc_applied_coupon_from_url', true ); - if ( empty( $saved_coupons ) || ! is_array( $saved_coupons ) ) { - $saved_coupons = array(); - } - $saved_coupons = array_merge( $saved_coupons, $applied_coupons ); - update_user_meta( $user_id, 'sc_applied_coupon_from_url', $saved_coupons ); - wc_setcookie( 'sc_applied_coupon_profile_id', '' ); - $this->delete_applied_coupons_of_guest_user( $unique_id ); - delete_option( 'sc_applied_coupon_profile_' . $unique_id ); - } - } - - } - - /** - * Function to get redirect URL after processing Smart Coupons params - * - * @param string $url The URL. - * @return string $url - */ - public function get_redirect_url_after_smart_coupons_process( $url = '' ) { - - if ( empty( $url ) ) { - return $url; - } - - $query_string = ( ! empty( $_SERVER['QUERY_STRING'] ) ) ? wc_clean( wp_unslash( $_SERVER['QUERY_STRING'] ) ) : array(); // phpcs:ignore - - parse_str( $query_string, $url_args ); - - $sc_params = array( 'coupon-code', 'sc-page' ); - - $url_params = array_diff_key( $url_args, array_flip( $sc_params ) ); - - if ( empty( $url_params['add-to-cart'] ) ) { - $redirect_url = apply_filters( 'wc_sc_redirect_url_after_smart_coupons_process', add_query_arg( $url_params, $url ), array( 'source' => $this ) ); - } else { - $redirect_url = apply_filters( 'wc_sc_redirect_url_after_smart_coupons_process', $url, array( 'source' => $this ) ); - } - - return $redirect_url; - } - - /** - * Function to convert sc coupon notices to wc notices - */ - public function convert_sc_coupon_notices_to_wc_notices() { - $coupon_notices = $this->get_coupon_notices(); - // If we have coupon notices to be shown and we are on a woocommerce page then convert them to wc notices. - if ( count( $coupon_notices ) > 0 && ( is_woocommerce() || is_cart() || is_checkout() || is_account_page() ) ) { - foreach ( $coupon_notices as $notice_type => $notices ) { - if ( count( $notices ) > 0 ) { - foreach ( $notices as $notice ) { - wc_add_notice( $notice, $notice_type ); - } - } - } - $this->remove_coupon_notices(); - } - } - - /** - * Function to get sc coupon notices - */ - public function get_coupon_notices() { - return apply_filters( 'wc_sc_coupon_notices', $this->coupon_notices ); - } - - /** - * Function to set sc coupon notices - * - * @param string $notice notice. - * @param string $type notice type. - */ - public function set_coupon_notices( $notice = '', $type = '' ) { - if ( empty( $notice ) || empty( $type ) ) { - return; - } - if ( empty( $this->coupon_notices[ $type ] ) || ! is_array( $this->coupon_notices[ $type ] ) ) { - $this->coupon_notices[ $type ] = array(); - } - $this->coupon_notices[ $type ][] = $notice; - } - - /** - * Function to remove sc coupon notices - */ - public function remove_coupon_notices() { - $this->coupon_notices = array(); - } - - /** - * Function to add coupon notices to wp content - * - * @param string $content page content. - * @return string $content page content - */ - public function show_coupon_notices( $content = '' ) { - - $coupon_notices = $this->get_coupon_notices(); - - if ( count( $coupon_notices ) > 0 ) { - - // Buffer output. - ob_start(); - - foreach ( $coupon_notices as $notice_type => $notices ) { - if ( count( $coupon_notices[ $notice_type ] ) > 0 ) { - wc_get_template( - "notices/{$notice_type}.php", - array( - 'messages' => $coupon_notices[ $notice_type ], - ) - ); - } - } - - $notices = wc_kses_notice( ob_get_clean() ); - $content = $notices . $content; - $this->remove_coupon_notices(); // Empty out notice data. - } - - return $content; - - } - - /** - * Function to get coupon codes by guest user's unique id. - * - * @param string $unique_id Unique id for guest user. - * - * @return array. - */ - public function get_applied_coupons_by_guest_user( $unique_id = '' ) { - $key = sprintf( 'sc_applied_coupon_profile_%s', $unique_id ); - - // Get coupons from `transient`. - $coupons = get_transient( $key ); - if ( ! empty( $coupons ) && is_array( $coupons ) ) { - return $coupons; - } - // Get coupon from `wp_option`. - return get_option( $key, array() ); - } - - /** - * Function to set applied coupons for guest user. - * - * @param string $unique_id Unique id for guest user. - * @param array $coupons Array of coupon codes. - * - * @return bool. - */ - public function set_applied_coupon_for_guest_user( $unique_id = '', $coupons = array() ) { - - if ( ! empty( $unique_id ) && is_array( $coupons ) ) { - $key = sprintf( 'sc_applied_coupon_profile_%s', $unique_id ); - - if ( empty( $coupons ) ) { - return delete_transient( $key ); - } else { - return set_transient( - $key, - $coupons, - apply_filters( 'wc_sc_applied_coupon_by_url_expire_time', MONTH_IN_SECONDS ) - ); - } - } - - return false; - } - - /** - * Function to delete all applied coupons for a guest user. - * - * @param string $unique_id Unique id for guest user. - * - * @return bool. - */ - public function delete_applied_coupons_of_guest_user( $unique_id = '' ) { - - if ( ! empty( $unique_id ) ) { - $key = sprintf( 'sc_applied_coupon_profile_%s', $unique_id ); - return delete_transient( $key ); - } - - return false; - } - - } - -} - -WC_SC_URL_Coupon::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-smart-coupons.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-smart-coupons.php deleted file mode 100644 index cb561d02..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-smart-coupons.php +++ /dev/null @@ -1,6280 +0,0 @@ -includes(); - - add_action( 'plugins_loaded', array( $this, 'load_action_scheduler' ), -1 ); - - add_action( 'init', array( $this, 'process_activation' ) ); - add_action( 'init', array( $this, 'add_sc_options' ) ); - add_action( 'init', array( $this, 'define_label_for_store_credit' ) ); - - add_filter( 'woocommerce_coupon_is_valid', array( $this, 'is_smart_coupon_valid' ), 10, 3 ); - add_filter( 'woocommerce_coupon_is_valid', array( $this, 'is_user_usage_limit_valid' ), 10, 3 ); - add_filter( 'woocommerce_coupon_is_valid_for_product', array( $this, 'smart_coupons_is_valid_for_product' ), 10, 4 ); - add_filter( 'woocommerce_coupon_validate_expiry_date', array( $this, 'validate_expiry_time' ), 999, 3 ); - add_filter( 'woocommerce_apply_individual_use_coupon', array( $this, 'smart_coupons_override_individual_use' ), 10, 3 ); - add_filter( 'woocommerce_apply_with_individual_use_coupon', array( $this, 'smart_coupons_override_with_individual_use' ), 10, 4 ); - - add_action( 'restrict_manage_posts', array( $this, 'woocommerce_restrict_manage_smart_coupons' ), 20 ); - add_action( 'admin_init', array( $this, 'woocommerce_export_coupons' ) ); - - add_action( 'personal_options_update', array( $this, 'my_profile_update' ) ); - add_action( 'edit_user_profile_update', array( $this, 'my_profile_update' ) ); - - add_filter( 'generate_smart_coupon_action', array( $this, 'generate_smart_coupon_action' ), 1, 10 ); - - add_action( 'wc_sc_new_coupon_generated', array( $this, 'smart_coupons_plugin_used' ) ); - - // Actions used to insert a new endpoint in the WordPress. - add_action( 'init', array( $this, 'sc_add_endpoints' ), 11 ); - - add_action( 'admin_enqueue_scripts', array( $this, 'smart_coupon_styles_and_scripts' ), 20 ); - add_action( 'admin_enqueue_scripts', array( $this, 'register_plugin_styles' ) ); - add_action( 'wp_enqueue_scripts', array( $this, 'register_plugin_styles' ) ); - - add_filter( 'wc_smart_coupons_export_headers', array( $this, 'wc_smart_coupons_export_headers' ) ); - add_filter( 'woocommerce_email_footer_text', array( $this, 'email_footer_replace_site_title' ) ); - - add_filter( 'is_protected_meta', array( $this, 'make_sc_meta_protected' ), 10, 3 ); - - add_action( 'admin_notices', array( $this, 'minimum_woocommerce_version_requirement' ) ); - - add_action( 'wp_loaded', array( $this, 'sc_handle_store_credit_application' ), 15 ); - - add_filter( 'woocommerce_debug_tools', array( $this, 'clear_cache_tool' ) ); - - add_action( 'woocommerce_checkout_update_order_review', array( $this, 'woocommerce_checkout_update_order_review' ) ); - - add_action( 'woocommerce_cart_reset', array( $this, 'woocommerce_cart_reset' ) ); - - // Actions used to schedule sending of coupons. - add_action( 'wc_sc_send_scheduled_coupon_email', array( $this, 'send_scheduled_coupon_email' ), 10, 7 ); - add_action( 'publish_future_post', array( $this, 'process_published_scheduled_coupon' ) ); - add_action( 'before_delete_post', array( $this, 'delete_scheduled_coupon_actions' ) ); - add_action( 'admin_footer', array( $this, 'enqueue_admin_footer_scripts' ) ); - add_action( 'wp_ajax_wc_sc_check_scheduled_coupon_actions', array( $this, 'check_scheduled_coupon_actions' ) ); - - // Filter to modify discount amount for percentage type coupon. - add_filter( 'woocommerce_coupon_get_discount_amount', array( $this, 'get_coupon_discount_amount' ), 10, 5 ); - - // Filter to add default values to coupon meta fields. - add_filter( 'smart_coupons_parser_postmeta_defaults', array( $this, 'postmeta_defaults' ) ); - - // Filter to register Smart Coupons' email classes. - add_filter( 'woocommerce_email_classes', array( $this, 'register_email_classes' ) ); - - add_filter( 'woocommerce_hold_stock_for_checkout', array( $this, 'hold_stock_for_checkout' ) ); - - add_action( 'wc_sc_generate_coupon', array( $this, 'generate_coupon' ) ); - add_action( 'wc_sc_paint_coupon', array( $this, 'paint_coupon' ) ); - - add_filter( 'woocommerce_rest_api_get_rest_namespaces', array( $this, 'rest_namespace' ) ); - - add_filter( 'woocommerce_shipping_free_shipping_is_available', array( $this, 'is_eligible_for_free_shipping' ), 10, 3 ); - - add_action( 'woocommerce_system_status_report', array( $this, 'smart_coupons_system_status_report' ), 11 ); - - add_action( 'woocommerce_rest_prepare_shop_order_object', array( $this, 'rest_api_prepare_shop_order_object' ), 10, 3 ); - - add_action( 'before_woocommerce_init', array( $this, 'hpos_compat_declaration' ) ); - - } - - /** - * Function to handle WC compatibility related function call from appropriate class - * - * @param string $function_name Function to call. - * @param array $arguments Array of arguments passed while calling $function_name. - * @return mixed Result of function call. - */ - public function __call( $function_name, $arguments = array() ) { - - if ( ! is_callable( 'SA_WC_Compatibility_4_4', $function_name ) ) { - return; - } - - if ( ! empty( $arguments ) ) { - return call_user_func_array( 'SA_WC_Compatibility_4_4::' . $function_name, $arguments ); - } else { - return call_user_func( 'SA_WC_Compatibility_4_4::' . $function_name ); - } - - } - - /** - * Include files - */ - public function includes() { - - include_once 'compat/class-sa-wc-compatibility-4-4.php'; - include_once 'compat/class-wc-sc-wpml-compatibility.php'; - include_once 'compat/class-wcopc-sc-compatibility.php'; - include_once 'compat/class-wcs-sc-compatibility.php'; - include_once 'compat/class-wc-sc-wmc-compatibility.php'; - include_once 'compat/class-wc-sc-aelia-cs-compatibility.php'; - include_once 'compat/class-wc-sc-kco-compatibility.php'; - - include_once 'class-wc-sc-admin-welcome.php'; - include_once 'class-wc-sc-background-coupon-importer.php'; - include_once 'class-wc-sc-admin-pages.php'; - include_once 'class-wc-sc-admin-notifications.php'; - - include_once 'class-wc-sc-ajax.php'; - include_once 'class-wc-sc-display-coupons.php'; - - include_once 'class-wc-sc-settings.php'; - include_once 'class-wc-sc-shortcode.php'; - include_once 'class-wc-sc-purchase-credit.php'; - include_once 'class-wc-sc-url-coupon.php'; - include_once 'class-wc-sc-print-coupon.php'; - include_once 'class-wc-sc-coupon-fields.php'; - include_once 'class-wc-sc-auto-apply-coupon.php'; - include_once 'class-wc-sc-product-fields.php'; - include_once 'class-wc-sc-order-fields.php'; - include_once 'class-wc-sc-coupon-process.php'; - include_once 'class-wc-sc-global-coupons.php'; - include_once 'class-wc-sc-admin-coupons-dashboard-actions.php'; - include_once 'class-wc-sc-privacy.php'; - include_once 'class-wc-sc-coupon-actions.php'; - include_once 'class-wc-sc-coupon-columns.php'; - include_once 'class-wc-sc-coupons-by-location.php'; - include_once 'class-wc-sc-coupons-by-payment-method.php'; - include_once 'class-wc-sc-coupons-by-shipping-method.php'; - include_once 'class-wc-sc-coupons-by-user-role.php'; - include_once 'class-wc-sc-coupons-by-product-attribute.php'; - include_once 'class-wc-sc-coupons-by-taxonomy.php'; - include_once 'class-wc-sc-coupons-by-excluded-email.php'; - include_once 'class-wc-sc-coupon-message.php'; - include_once 'class-wc-sc-coupon-categories.php'; - include_once 'class-wc-sc-coupons-by-product-quantity.php'; - include_once 'class-wc-sc-coupon-refund-process.php'; - include_once 'class-wc-sc-background-upgrade.php'; - include_once 'blocks/class-wc-sc-gutenberg-coupon-block.php'; - - } - - /** - * Process activation of the plugin - */ - public function process_activation() { - - if ( ! get_transient( '_smart_coupons_process_activation' ) ) { - return; - } - - delete_transient( '_smart_coupons_process_activation' ); - - include_once 'class-wc-sc-act-deact.php'; - - WC_SC_Act_Deact::process_activation(); - - } - - /** - * Load action scheduler - */ - public function load_action_scheduler() { - if ( ! class_exists( 'ActionScheduler' ) ) { - include_once 'libraries/action-scheduler/action-scheduler.php'; - } - } - - /** - * Set options - */ - public function add_sc_options() { - - $this->plugin_data = self::get_smart_coupons_plugin_data(); - - add_option( 'woocommerce_delete_smart_coupon_after_usage', 'no', '', 'no' ); - add_option( 'woocommerce_smart_coupon_apply_before_tax', 'no', '', 'no' ); - add_option( 'woocommerce_smart_coupon_include_tax', 'no', '', 'no' ); - add_option( 'woocommerce_smart_coupon_show_my_account', 'yes', '', 'no' ); - add_option( 'smart_coupons_is_show_associated_coupons', 'no', '', 'no' ); - add_option( 'smart_coupons_show_coupon_description', 'no', '', 'no' ); - add_option( 'smart_coupons_is_send_email', 'yes', '', 'no' ); - add_option( 'smart_coupons_is_print_coupon', 'yes', '', 'no' ); - add_option( 'show_coupon_received_on_my_account', 'no', '', 'no' ); - add_option( 'pay_from_smart_coupon_of_original_order', 'yes', '', 'no' ); - add_option( 'stop_recursive_coupon_generation', 'no', '', 'no' ); - add_option( 'sc_gift_certificate_shop_loop_button_text', __( 'Select options', 'woocommerce-smart-coupons' ), '', 'no' ); - add_option( 'wc_sc_setting_max_coupon_to_show', '5', '', 'no' ); - add_option( 'smart_coupons_show_invalid_coupons_on_myaccount', 'no', '', 'no' ); - add_option( 'smart_coupons_sell_store_credit_at_less_price', 'no', '', 'no' ); - add_option( 'smart_coupons_display_coupon_receiver_details_form', 'yes', '', 'no' ); - - // Convert SC admin email settings into WC email settings. - $is_send_email = get_option( 'smart_coupons_is_send_email' ); - if ( false !== $is_send_email ) { - $coupon_email_settings = get_option( 'woocommerce_wc_sc_email_coupon_settings' ); - if ( false === $coupon_email_settings ) { - $coupon_email_settings = array(); - $coupon_email_settings['enabled'] = $is_send_email; - update_option( 'woocommerce_wc_sc_email_coupon_settings', $coupon_email_settings, 'no' ); - } - } - - $is_combine_email = get_option( 'smart_coupons_combine_emails' ); - if ( false !== $is_combine_email ) { - $combine_email_settings = get_option( 'woocommerce_wc_sc_combined_email_coupon_settings' ); - if ( false === $combine_email_settings ) { - $combine_email_settings = array(); - $combine_email_settings['enabled'] = $is_combine_email; - update_option( 'woocommerce_wc_sc_combined_email_coupon_settings', $combine_email_settings, 'no' ); - } - } - - $valid_designs = $this->get_valid_coupon_designs(); - - $coupon_design = get_option( 'wc_sc_setting_coupon_design' ); - if ( false === $coupon_design ) { - add_option( 'wc_sc_setting_coupon_design', 'basic', '', 'no' ); - } else { - if ( 'custom-design' !== $coupon_design && ! in_array( $coupon_design, $valid_designs, true ) ) { - update_option( 'wc_sc_setting_coupon_design', 'basic', 'no' ); - } - } - - $coupon_background_color = get_option( 'wc_sc_setting_coupon_background_color' ); - if ( false === $coupon_background_color ) { - add_option( 'wc_sc_setting_coupon_background_color', '#2b2d42', '', 'no' ); - } else { - add_option( 'wc_sc_setting_coupon_third_color', $coupon_background_color, '', 'no' ); - } - - $coupon_foreground_color = get_option( 'wc_sc_setting_coupon_foreground_color' ); - if ( false === $coupon_foreground_color ) { - add_option( 'wc_sc_setting_coupon_foreground_color', '#edf2f4', '', 'no' ); - } - - $coupon_third_color = get_option( 'wc_sc_setting_coupon_third_color' ); - if ( false === $coupon_third_color ) { - add_option( 'wc_sc_setting_coupon_third_color', '#d90429', '', 'no' ); - } - - $coupon_design_colors = get_option( 'wc_sc_setting_coupon_design_colors' ); - if ( false === $coupon_design_colors ) { - if ( false !== $coupon_background_color && false !== $coupon_foreground_color ) { - add_option( 'wc_sc_setting_coupon_design_colors', 'custom', '', 'no' ); - } else { - add_option( 'wc_sc_setting_coupon_design_colors', '2b2d42-edf2f4-d90429', '', 'no' ); - } - } - - $coupon_design_for_email = get_option( 'wc_sc_setting_coupon_design_for_email' ); - if ( false === $coupon_design_for_email ) { - add_option( 'wc_sc_setting_coupon_design_for_email', 'email-coupon', '', 'no' ); - } - } - - /** - * Function to log messages generated by Smart Coupons plugin - * - * @param string $level Message type. Valid values: debug, info, notice, warning, error, critical, alert, emergency. - * @param string $message The message to log. - */ - public function log( $level = 'notice', $message = '' ) { - - if ( empty( $message ) ) { - return; - } - - if ( function_exists( 'wc_get_logger' ) ) { - $logger = wc_get_logger(); - $context = array( 'source' => 'woocommerce-smart-coupons' ); - $logger->log( $level, $message, $context ); - } else { - include_once plugin_dir_path( WC_PLUGIN_FILE ) . 'includes/class-wc-logger.php'; - $logger = new WC_Logger(); - $logger->add( 'woocommerce-smart-coupons', $message ); - } - - } - - /** - * Coupon's expiration date (formatted) - * - * @param int $expiry_date Expiry date of coupon. - * @return string $expires_string Formatted expiry date - */ - public function get_expiration_format( $expiry_date ) { - - if ( $this->is_wc_gte_30() && $expiry_date instanceof WC_DateTime ) { - $expiry_date = ( is_callable( array( $expiry_date, 'getTimestamp' ) ) ) ? $expiry_date->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - - $expiry_date += $this->wc_timezone_offset(); - - $expires_string = date_i18n( get_option( 'date_format', 'd-M-Y' ), $expiry_date ); - - return apply_filters( - 'wc_sc_formatted_coupon_expiry_date', - $expires_string, - array( - 'source' => $this, - 'expiry_date' => $expiry_date, - ) - ); - - } - - - /** - * Function to send e-mail containing coupon code to receiver - * - * @param array $coupon_title Associative array containing receiver's details. - * @param string $discount_type Type of coupon. - * @param int $order_id Associated order id. - * @param array $gift_certificate_receiver_name Array of receiver's name. - * @param string $message_from_sender Message added by sender. - * @param string $gift_certificate_sender_name Sender name. - * @param string $gift_certificate_sender_email Sender email. - * @param boolean $is_gift Whether it is a gift certificate or store credit. - */ - public function sa_email_coupon( $coupon_title, $discount_type, $order_id = '', $gift_certificate_receiver_name = '', $message_from_sender = '', $gift_certificate_sender_name = '', $gift_certificate_sender_email = '', $is_gift = '' ) { - - $is_send_email = $this->is_email_template_enabled(); - $combine_emails = $this->is_email_template_enabled( 'combine' ); - - if ( 'yes' === $is_send_email ) { - WC()->mailer(); - } - - $is_send_email = apply_filters( - 'wc_sc_is_send_coupon_email', - $is_send_email, - array( - 'source' => $this, - 'coupon_title' => $coupon_title, - 'discount_type' => $discount_type, - 'order_id' => $order_id, - 'gift_certificate_receiver_name' => $gift_certificate_receiver_name, - 'message_from_sender' => $message_from_sender, - 'gift_certificate_sender_name' => $gift_certificate_sender_name, - 'gift_certificate_sender_email' => $gift_certificate_sender_email, - 'is_gift' => $is_gift, - ) - ); - - $order = ( ! empty( $order_id ) ) ? wc_get_order( $order_id ) : null; - - foreach ( $coupon_title as $email => $coupon ) { - - if ( empty( $email ) ) { - $email = $gift_certificate_sender_email; - } - - $amount = $coupon['amount']; - $coupon_code = strtolower( $coupon['code'] ); - - if ( ! empty( $order_id ) ) { - $coupon_receiver_details = $this->get_post_meta( $order_id, 'sc_coupon_receiver_details', true, false, $order ); - if ( ! is_array( $coupon_receiver_details ) || empty( $coupon_receiver_details ) ) { - $coupon_receiver_details = array(); - } - $coupon_receiver_details[] = array( - 'code' => $coupon_code, - 'amount' => $amount, - 'email' => $email, - 'message' => $message_from_sender, - ); - $this->update_post_meta( $order_id, 'sc_coupon_receiver_details', $coupon_receiver_details, false, $order ); - } - - $action_args = apply_filters( - 'wc_sc_email_coupon_notification_args', - array( - 'order_id' => $order_id, - 'email' => $email, - 'coupon' => $coupon, - 'discount_type' => $discount_type, - 'receiver_name' => $gift_certificate_receiver_name, - 'message_from_sender' => $message_from_sender, - 'gift_certificate_sender_name' => $gift_certificate_sender_name, - 'gift_certificate_sender_email' => $gift_certificate_sender_email, - 'is_gift' => $is_gift, - ) - ); - - $schedule_gift_sending = 'no'; - if ( ! empty( $order_id ) ) { - $schedule_gift_sending = ( $this->is_callable( $order, 'get_meta' ) ) ? $order->get_meta( 'wc_sc_schedule_gift_sending' ) : $this->get_post_meta( $order_id, 'wc_sc_schedule_gift_sending', true ); - } - - $is_schedule_gift_sending = 'no'; - if ( 'yes' === $schedule_gift_sending ) { - $coupon_id = wc_get_coupon_id_by_code( $coupon_code ); - $coupon_receiver_details = $this->get_post_meta( $coupon_id, 'wc_sc_coupon_receiver_details', true ); - $scheduled_coupon_code = ( ! empty( $coupon_receiver_details['coupon_details']['code'] ) ) ? strtolower( $coupon_receiver_details['coupon_details']['code'] ) : ''; - if ( $scheduled_coupon_code === $coupon_code ) { - $is_schedule_gift_sending = 'yes'; - } - } - - if ( 'yes' === $is_send_email && ( 'no' === $combine_emails || 'yes' === $is_schedule_gift_sending ) ) { - // Trigger email notification. - do_action( 'wc_sc_email_coupon_notification', $action_args ); - if ( 'yes' === $is_schedule_gift_sending ) { - // Delete receiver detail post meta as it is no longer necessary. - $this->delete_post_meta( $coupon_id, 'wc_sc_coupon_receiver_details' ); - } - } - } - - } - - /** - * Function to send combined e-mail containing coupon codes to receiver - * - * @param string $receiver_email receiver's email. - * @param array $receiver_details receiver details(code,message etc). - * @param int $order_id Associated order id. - * @param string $gift_certificate_sender_name Sender name. - * @param string $gift_certificate_sender_email Sender email. - */ - public function send_combined_coupon_email( $receiver_email = '', $receiver_details = array(), $order_id = 0, $gift_certificate_sender_name = '', $gift_certificate_sender_email = '' ) { - - $is_send_email = $this->is_email_template_enabled(); - $combine_emails = $this->is_email_template_enabled( 'combine' ); - - if ( 'yes' === $is_send_email && 'yes' === $combine_emails ) { - WC()->mailer(); - - $order = ( ! empty( $order_id ) ) ? wc_get_order( $order_id ) : null; - - $is_gift = ''; - if ( ! empty( $order_id ) ) { - $is_gift = $this->get_post_meta( $order_id, 'is_gift', true ); - } - - if ( count( $receiver_details ) === 1 ) { - $coupon_code = ( ! empty( $receiver_details[0]['code'] ) ) ? $receiver_details[0]['code'] : ''; - $message_from_sender = ( ! empty( $receiver_details[0]['message'] ) ) ? $receiver_details[0]['message'] : ''; - - $coupon = new WC_Coupon( $coupon_code ); - $coupon_amount = $this->get_amount( $coupon, true, $order ); - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - $coupon_data = $this->get_coupon_meta_data( $coupon ); - - $coupon_detail = array( - 'amount' => $coupon_amount, - 'code' => $coupon_code, - ); - - $action_args = apply_filters( - 'wc_sc_email_coupon_notification_args', - array( - 'order_id' => $order_id, - 'email' => $receiver_email, - 'coupon' => $coupon_detail, - 'discount_type' => $discount_type, - 'receiver_name' => '', - 'message_from_sender' => $message_from_sender, - 'gift_certificate_sender_name' => $gift_certificate_sender_name, - 'gift_certificate_sender_email' => $gift_certificate_sender_email, - 'is_gift' => $is_gift, - ) - ); - // Trigger single email notification. - do_action( 'wc_sc_email_coupon_notification', $action_args ); - return; - } - - $action_args = apply_filters( - 'wc_sc_email_coupon_notification_args', - array( - 'order_id' => $order_id, - 'email' => $receiver_email, - 'receiver_details' => $receiver_details, - 'gift_certificate_sender_name' => $gift_certificate_sender_name, - 'gift_certificate_sender_email' => $gift_certificate_sender_email, - 'is_gift' => $is_gift, - ) - ); - - // Trigger combined email notification. - do_action( 'wc_sc_combined_email_coupon_notification', $action_args ); - } - } - - /** - * Function to schedule e-mail sending process containing coupon code to customer - * - * @param array $action_args arguments for Action Scheduler. - * @param string $sending_timestamp timestamp for scheduling email. - * @return boolean email sending scheduled or not. - */ - public function schedule_coupon_email( $action_args = array(), $sending_timestamp = '' ) { - - if ( empty( $action_args ) || empty( $sending_timestamp ) ) { - return false; - } - - $coupon_id = 0; - if ( isset( $action_args['coupon_id'] ) && ! empty( $action_args['coupon_id'] ) ) { - $coupon_id = $action_args['coupon_id']; - } - - $ref_key = ''; - if ( isset( $action_args['ref_key'] ) && ! empty( $action_args['ref_key'] ) ) { - $ref_key = $action_args['ref_key']; - } - - if ( ! empty( $coupon_id ) && ! empty( $ref_key ) && function_exists( 'as_schedule_single_action' ) ) { - $actions_id = as_schedule_single_action( $sending_timestamp, 'wc_sc_send_scheduled_coupon_email', $action_args ); - if ( $actions_id ) { - $scheduled_actions_ids = $this->get_post_meta( $coupon_id, 'wc_sc_scheduled_actions_ids', true ); - if ( empty( $scheduled_actions_ids ) || ! is_array( $scheduled_actions_ids ) ) { - $scheduled_actions_ids = array(); - } - $scheduled_actions_ids[ $ref_key ] = $actions_id; - // Stored actions ids in coupons so that we can delete them when coupon gets deleted or email is sent successfully. - $this->update_post_meta( $coupon_id, 'wc_sc_scheduled_actions_ids', $scheduled_actions_ids ); - return true; - } - } - return false; - } - - /** - * Function to send scheduled coupon's e-mail containing coupon code to receiver. It is triggered through Action Scheduler - * - * @param string $auto_generate is auto generated coupon. - * @param int $coupon_id Associated coupon id. - * @param int $parent_id Associated parent coupon id. - * @param int $order_id Associated order id. - * @param string $receiver_email receiver email. - * @param string $sender_message_index_key key containing index of sender's message from gift_receiver_message meta in order. - * @param string $ref_key timestamp based reference key. - */ - public function send_scheduled_coupon_email( $auto_generate = '', $coupon_id = '', $parent_id = '', $order_id = '', $receiver_email = '', $sender_message_index_key = '', $ref_key = '' ) { - - if ( ! empty( $coupon_id ) && ! empty( $order_id ) && ! empty( $receiver_email ) ) { - - $coupon = new WC_Coupon( $coupon_id ); - - $coupon_status = ( $this->is_callable( $coupon, 'get_status' ) ) ? $coupon->get_status() : get_post_status( $coupon_id ); - if ( 'publish' !== $coupon_status ) { - return; - } - - $order = wc_get_order( $order_id ); - if ( is_a( $coupon, 'WC_Coupon' ) && is_a( $order, 'WC_Order' ) ) { - $is_callable_order_get_meta = $this->is_callable( $order, 'get_meta' ); - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - $is_callable_coupon_update_meta_data = $this->is_callable( $coupon, 'update_meta_data' ); - $sc_disable_email_restriction = $this->get_post_meta( $parent_id, 'sc_disable_email_restriction', true ); - if ( $this->is_wc_gte_30() ) { - $discount_type = $coupon->get_discount_type(); - $coupon_code = $coupon->get_code(); - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - $coupon_amount = $this->get_amount( $coupon, true, $order ); - - $coupon_details = array( - $receiver_email => array( - 'parent' => $parent_id, - 'code' => $coupon_code, - 'amount' => $coupon_amount, - ), - ); - - $receiver_name = ''; - $message_from_sender = ''; - $gift_certificate_sender_name = ''; - $gift_certificate_sender_email = ''; - - $is_gift = ( true === $is_callable_order_get_meta ) ? $order->get_meta( 'is_gift' ) : $this->get_post_meta( $order_id, 'is_gift', true ); - - // In case of auto generated coupons receiver's details are saved in generated coupon. - if ( 'yes' === $auto_generate ) { - $coupon_receiver_details = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'wc_sc_coupon_receiver_details' ) : $this->get_post_meta( $coupon_id, 'wc_sc_coupon_receiver_details', true ); - if ( ! empty( $coupon_receiver_details ) && is_array( $coupon_receiver_details ) ) { - $message_from_sender = $coupon_receiver_details['message_from_sender']; - $gift_certificate_sender_name = $coupon_receiver_details['gift_certificate_sender_name']; - $gift_certificate_sender_email = $coupon_receiver_details['gift_certificate_sender_email']; - } - } else { - $receivers_messages = ( true === $is_callable_order_get_meta ) ? $order->get_meta( 'gift_receiver_message' ) : $this->get_post_meta( $order_id, 'gift_receiver_message', true ); - if ( strpos( $sender_message_index_key, ':' ) > 0 ) { - $index_keys = explode( ':', $sender_message_index_key ); - $coupon_index = $index_keys[0]; - $message_index = $index_keys[1]; - if ( isset( $receivers_messages[ $coupon_index ][ $message_index ] ) ) { - $message_from_sender = $receivers_messages[ $coupon_index ][ $message_index ]; - } - } - } - - $this->sa_email_coupon( $coupon_details, $discount_type, $order_id, $receiver_name, $message_from_sender, $gift_certificate_sender_name, $gift_certificate_sender_email, $is_gift ); - - if ( ( 'no' === $sc_disable_email_restriction || empty( $sc_disable_email_restriction ) ) ) { - $old_customers_email_ids = (array) maybe_unserialize( ( $this->is_callable( $coupon, 'get_email_restrictions' ) ) ? $coupon->get_email_restrictions() : $this->get_post_meta( $coupon_id, 'customer_email', true ) ); - $old_customers_email_ids[] = $receiver_email; - if ( true === $is_callable_coupon_update_meta_data ) { - $coupon->set_email_restrictions( $old_customers_email_ids ); - } else { - update_post_meta( $coupon_id, 'customer_email', $old_customers_email_ids ); - } - } - - if ( ! empty( $ref_key ) ) { - $scheduled_actions_ids = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'wc_sc_scheduled_actions_ids' ) : $this->get_post_meta( $coupon_id, 'wc_sc_scheduled_actions_ids', true ); - if ( isset( $scheduled_actions_ids[ $ref_key ] ) ) { - unset( $scheduled_actions_ids[ $ref_key ] ); - } - if ( ! empty( $scheduled_actions_ids ) ) { - if ( true === $is_callable_coupon_update_meta_data ) { - $coupon->update_meta_data( 'wc_sc_scheduled_actions_ids', $scheduled_actions_ids ); - } else { - update_post_meta( $coupon_id, 'wc_sc_scheduled_actions_ids', $scheduled_actions_ids ); - } - } else { - // Delete scheduled action ids meta since it is empty now. - $this->delete_post_meta( $coupon_id, 'wc_sc_scheduled_actions_ids', null, $coupon ); - } - } - if ( $this->is_callable( $coupon, 'save' ) ) { - $coupon->save(); - } - } - } - } - - /** - * Function to process scheduled coupons. - * - * @param int $coupon_id published coupon's id. - */ - public function process_published_scheduled_coupon( $coupon_id = 0 ) { - - $post_type = get_post_type( $coupon_id ); - if ( 'shop_coupon' !== $post_type ) { - return false; - } - - $coupon = new WC_Coupon( $coupon_id ); - if ( is_a( $coupon, 'WC_Coupon' ) ) { - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - $order_id = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'generated_from_order_id' ) : $this->get_post_meta( $coupon_id, 'generated_from_order_id', true ); - $order = wc_get_order( $order_id ); - if ( is_a( $order, 'WC_Order' ) ) { - $coupon_receiver_details = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'wc_sc_coupon_receiver_details' ) : $this->get_post_meta( $coupon_id, 'wc_sc_coupon_receiver_details', true ); - if ( ! empty( $coupon_receiver_details ) && is_array( $coupon_receiver_details ) ) { - $parent_id = $coupon_receiver_details['coupon_details']['parent']; - $receiver_email = $coupon_receiver_details['gift_certificate_receiver_email']; - $gift_certificate_sender_name = $coupon_receiver_details['gift_certificate_sender_name']; - $gift_certificate_sender_email = $coupon_receiver_details['gift_certificate_sender_email']; - $sending_timestamp = get_post_time( 'U', true, $coupon_id ); // Get coupon publish timestamp. - $action_args = array( - 'auto_generate' => 'yes', - 'coupon_id' => $coupon_id, - 'parent_id' => $parent_id, // Parent coupon id. - 'order_id' => $order_id, - 'receiver_email' => $receiver_email, - 'message_index_key' => '', - 'ref_key' => uniqid(), // A unique timestamp key to relate action schedulers with their coupons. - ); - $is_scheduled = $this->schedule_coupon_email( $action_args, $sending_timestamp ); - if ( ! $is_scheduled ) { - if ( $this->is_wc_gte_30() ) { - $coupon_code = $coupon->get_code(); - } else { - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - /* translators: 1. Receiver email 2. Coupon code 3. Order id */ - $this->log( 'error', sprintf( __( 'Failed to schedule email to "%1$s" for coupon "%2$s" received from order #%3$s.', 'woocommerce-smart-coupons' ), $receiver_email, $coupon_code, $order_id ) ); - } - } - } - } - - } - - /** - * Function to delete action schedulers when associated coupon is deleted. - * - * @param int $coupon_id coupon id. - */ - public function delete_scheduled_coupon_actions( $coupon_id = 0 ) { - - global $post_type; - - if ( 'shop_coupon' !== $post_type ) { - return false; - } - - $coupon = new WC_Coupon( $coupon_id ); - - if ( is_a( $coupon, 'WC_Coupon' ) ) { - - $scheduled_actions_ids = ( $this->is_callable( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'wc_sc_scheduled_actions_ids' ) : $this->get_post_meta( $coupon_id, 'wc_sc_scheduled_actions_ids', true ); - - if ( ! empty( $scheduled_actions_ids ) && is_array( $scheduled_actions_ids ) ) { - - if ( ! class_exists( 'ActionScheduler' ) || ! is_callable( array( 'ActionScheduler', 'store' ) ) ) { - return false; - } - - foreach ( $scheduled_actions_ids as $ref_key => $action_id ) { - $action_scheduler = ActionScheduler::store()->fetch_action( $action_id ); - if ( is_a( $action_scheduler, 'ActionScheduler_Action' ) && is_callable( array( $action_scheduler, 'is_finished' ) ) ) { - $is_action_complete = $action_scheduler->is_finished(); - - // Delete only unfinished actions related to coupon. - if ( ! $is_action_complete ) { - ActionScheduler::store()->delete_action( $action_id ); - } - } - } - } - } - - } - - /** - * Function to check if passed timestamp is valid. - * - * @param string $timestamp timestamp. - * @return boolean is valid timestamp. - */ - public function is_valid_timestamp( $timestamp = '' ) { - - if ( empty( $timestamp ) || ! is_numeric( $timestamp ) ) { - return false; - } - - // Check if time is already passed. - if ( time() > $timestamp ) { - return false; - } - return true; - } - - - /** - * Function to enqueue scripts in footer. - */ - public function enqueue_admin_footer_scripts() { - - global $pagenow, $typenow; - - if ( empty( $pagenow ) || 'edit.php' !== $pagenow ) { - return; - } - - $coupon_status = ( ! empty( $_GET['post_status'] ) ) ? wc_clean( wp_unslash( $_GET['post_status'] ) ) : ''; // phpcs:ignore - if ( 'edit.php' === $pagenow && 'shop_coupon' === $typenow && 'trash' === $coupon_status ) { - if ( ! wp_script_is( 'jquery' ) ) { - wp_enqueue_script( 'jquery' ); - } - ?> - - 'no', - ); - - if ( ! empty( $coupon_id ) ) { - $coupon = new WC_Coupon( $coupon_id ); - if ( is_a( $coupon, 'WC_Coupon' ) ) { - $scheduled_actions_ids = ( $this->is_callable( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'wc_sc_scheduled_actions_ids' ) : $this->get_post_meta( $coupon_id, 'wc_sc_scheduled_actions_ids', true ); - if ( is_array( $scheduled_actions_ids ) && ! empty( $scheduled_actions_ids ) ) { - $response['has_scheduled_actions'] = 'yes'; - } - } - } - - wp_send_json( $response ); - } - - /** - * Register new endpoint to use inside My Account page. - */ - public function sc_add_endpoints() { - - if ( empty( WC_SC_Display_Coupons::$endpoint ) ) { - WC_SC_Display_Coupons::$endpoint = WC_SC_Display_Coupons::get_endpoint(); - } - - if ( $this->is_wc_gte_26() ) { - add_rewrite_endpoint( WC_SC_Display_Coupons::$endpoint, EP_ROOT | EP_PAGES ); - $this->sc_check_if_flushed_rules(); - } - - } - - /** - * To register Smart Coupons Endpoint after plugin is activated - Necessary - */ - public function sc_check_if_flushed_rules() { - $sc_check_flushed_rules = get_option( 'sc_flushed_rules', 'notfound' ); - if ( 'notfound' === $sc_check_flushed_rules ) { - flush_rewrite_rules(); // phpcs:ignore - update_option( 'sc_flushed_rules', 'found', 'no' ); - } - } - - /** - * Register & enqueue Smart Coupons CSS - */ - public function register_plugin_styles() { - global $pagenow; - - $is_frontend = ( ! is_admin() ) ? true : false; - $is_valid_post_page = ( ! empty( $pagenow ) && in_array( $pagenow, array( 'edit.php', 'post.php', 'post-new.php' ), true ) ) ? true : false; - $is_valid_admin_page = ( ( ! empty( $_GET['page'] ) && 'wc-smart-coupons' === wc_clean( wp_unslash( $_GET['page'] ) ) ) || ( ! empty( $_GET['tab'] ) && 'wc-smart-coupons' === wc_clean( wp_unslash( $_GET['tab'] ) ) ) ) ? true : false; // phpcs:ignore - - if ( $is_frontend || $is_valid_admin_page || $is_valid_post_page ) { - $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; - wp_register_style( 'smart-coupon', untrailingslashit( plugins_url( '/', WC_SC_PLUGIN_FILE ) ) . '/assets/css/smart-coupon' . $suffix . '.css', array(), $this->plugin_data['Version'] ); - wp_register_style( 'smart-coupon-designs', untrailingslashit( plugins_url( '/', WC_SC_PLUGIN_FILE ) ) . '/assets/css/smart-coupon-designs.css', array(), $this->plugin_data['Version'] ); - } - } - - /** - * Get coupon style attributes - * - * @return string The coupon style attribute - */ - public function get_coupon_style_attributes() { - - $styles = array(); - - $coupon_design = get_option( 'wc_sc_setting_coupon_design', 'basic' ); - - if ( 'custom-design' !== $coupon_design ) { - $styles = array( - 'background-color: var(--sc-color1) !important;', - 'color: var(--sc-color2) !important;', - 'border-color: var(--sc-color3) !important;', - ); - } - - $styles = implode( ' ', $styles ); - - return apply_filters( 'wc_sc_coupon_style_attributes', $styles ); - - } - - /** - * Get coupon container classes - * - * @return string The coupon container classes - */ - public function get_coupon_container_classes() { - - return implode( ' ', apply_filters( 'wc_sc_coupon_container_classes', array( 'medium', get_option( 'wc_sc_setting_coupon_design', 'basic' ) ) ) ); - - } - - /** - * Get coupon content classes - * - * @return string The coupon content classes - */ - public function get_coupon_content_classes() { - - return implode( ' ', apply_filters( 'wc_sc_coupon_content_classes', array( 'dashed', 'small' ) ) ); - - } - - /** - * Formatted coupon data - * - * @param WC_Coupon $coupon Coupon object. - * @return array $coupon_data Associative array containing formatted coupon data. - */ - public function get_coupon_meta_data( $coupon ) { - global $store_credit_label, $post; - - $order = null; - - if ( ! empty( $post->post_type ) && 'shop_order' === $post->post_type && ! empty( $post->ID ) ) { - $order = wc_get_order( $post->ID ); - } - - $all_discount_types = wc_get_coupon_types(); - - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - - $coupon_amount = $this->get_amount( $coupon, true, $order ); - - $coupon_data = array(); - switch ( $discount_type ) { - case 'smart_coupon': - $coupon_data['coupon_type'] = ! empty( $store_credit_label['singular'] ) ? ucwords( $store_credit_label['singular'] ) : __( 'Store Credit', 'woocommerce-smart-coupons' ); - $coupon_data['coupon_amount'] = wc_price( $coupon_amount ); - break; - - case 'fixed_cart': - $coupon_data['coupon_type'] = __( 'Cart Discount', 'woocommerce-smart-coupons' ); - $coupon_data['coupon_amount'] = wc_price( $coupon_amount ); - break; - - case 'fixed_product': - $coupon_data['coupon_type'] = __( 'Product Discount', 'woocommerce-smart-coupons' ); - $coupon_data['coupon_amount'] = wc_price( $coupon_amount ); - break; - - case 'percent_product': - $coupon_data['coupon_type'] = __( 'Product Discount', 'woocommerce-smart-coupons' ); - $coupon_data['coupon_amount'] = $coupon_amount . '%'; - break; - - case 'percent': - $coupon_data['coupon_type'] = ( $this->is_wc_gte_30() ) ? __( 'Discount', 'woocommerce-smart-coupons' ) : __( 'Cart Discount', 'woocommerce-smart-coupons' ); - $coupon_data['coupon_amount'] = $coupon_amount . '%'; - $max_discount = $this->get_post_meta( $coupon_id, 'wc_sc_max_discount', true, true, $order ); - if ( ! empty( $max_discount ) && is_numeric( $max_discount ) ) { - /* translators: %s: Maximum coupon discount amount */ - $coupon_data['coupon_type'] .= ' ' . sprintf( __( ' upto %s', 'woocommerce-smart-coupons' ), wc_price( $max_discount ) ); - } - break; - - default: - $default_coupon_type = ( ! empty( $all_discount_types[ $discount_type ] ) ) ? $all_discount_types[ $discount_type ] : ucwords( str_replace( array( '_', '-' ), ' ', $discount_type ) ); - $coupon_data['coupon_type'] = apply_filters( 'wc_sc_coupon_type', $default_coupon_type, $coupon, $all_discount_types ); - $coupon_data['coupon_amount'] = apply_filters( 'wc_sc_coupon_amount', $coupon_amount, $coupon ); - break; - - } - return $coupon_data; - } - - /** - * Generate coupon description - * - * @param array $args The arguments. - * @return string - */ - public function generate_coupon_description( $args = array() ) { - $coupon = ( ! empty( $args['coupon_object'] ) ) ? $args['coupon_object'] : null; - $descriptions = array(); - $descriptions_data = array(); - if ( $this->is_wc_gte_30() && is_object( $coupon ) ) { - $discount_type = ( is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - $expiry_time = ( is_callable( array( $coupon, 'get_meta' ) ) ) ? $coupon->get_meta( 'wc_sc_expiry_time' ) : ''; - - $expiry_needed_in_design = array( 'ticket', 'special' ); - $design = get_option( 'wc_sc_setting_coupon_design', 'basic' ); - - $descriptions_data['minimum_amount'] = ( is_callable( array( $coupon, 'get_minimum_amount' ) ) ) ? $coupon->get_minimum_amount() : ''; - $descriptions_data['maximum_amount'] = ( is_callable( array( $coupon, 'get_maximum_amount' ) ) ) ? $coupon->get_maximum_amount() : ''; - $descriptions_data['exclude_sale_items'] = ( is_callable( array( $coupon, 'get_exclude_sale_items' ) ) ) ? $coupon->get_exclude_sale_items() : ''; - $descriptions_data['product_ids'] = ( is_callable( array( $coupon, 'get_product_ids' ) ) ) ? $coupon->get_product_ids() : array(); - $descriptions_data['excluded_product_ids'] = ( is_callable( array( $coupon, 'get_excluded_product_ids' ) ) ) ? $coupon->get_excluded_product_ids() : array(); - $descriptions_data['product_categories'] = ( is_callable( array( $coupon, 'get_product_categories' ) ) ) ? $coupon->get_product_categories() : array(); - $descriptions_data['excluded_product_categories'] = ( is_callable( array( $coupon, 'get_excluded_product_categories' ) ) ) ? $coupon->get_excluded_product_categories() : array(); - - $check_descriptions_data = array_filter( $descriptions_data ); - - if ( in_array( $design, $expiry_needed_in_design, true ) || empty( $check_descriptions_data ) ) { - $descriptions_data['date_expires'] = ( is_callable( array( $coupon, 'get_date_expires' ) ) ) ? $coupon->get_date_expires() : ''; - } - - $max_fields = apply_filters( - 'wc_sc_max_fields_to_show_in_coupon_description', - 2, - array( - 'source' => $this, - 'coupon_object' => $coupon, - ) - ); - - if ( ! empty( $descriptions_data ) ) { - foreach ( $descriptions_data as $key => $data ) { - if ( count( $descriptions ) > $max_fields ) { - break; - } - if ( ! empty( $data ) ) { - switch ( $key ) { - case 'minimum_amount': - /* translators: Formatted minimum amount */ - $descriptions[] = sprintf( __( 'Spend at least %s', 'woocommerce-smart-coupons' ), wc_price( $data ) ); - break; - case 'maximum_amount': - /* translators: Formatted maximum amount */ - $descriptions[] = sprintf( __( 'Spend up to %s', 'woocommerce-smart-coupons' ), wc_price( $data ) ); - break; - case 'exclude_sale_items': - /* translators: Formatted maximum amount */ - $descriptions[] = sprintf( __( 'Not valid for sale items', 'woocommerce-smart-coupons' ), wc_price( $data ) ); - break; - case 'product_ids': - $get_product_names = $this->get_coupon_product_names( $data ); - $product_names = ( ! empty( $get_product_names ) && is_array( $get_product_names ) ) ? implode( ', ', $get_product_names ) : ''; - /* translators: Product names */ - $descriptions[] = sprintf( __( 'Valid for %s', 'woocommerce-smart-coupons' ), $product_names ); - break; - case 'excluded_product_ids': - $get_product_names = $this->get_coupon_product_names( $data ); - $product_names = ( ! empty( $get_product_names ) && is_array( $get_product_names ) ) ? implode( ', ', $get_product_names ) : ''; - /* translators: Excluded product names */ - $descriptions[] = sprintf( __( 'Not valid for %s', 'woocommerce-smart-coupons' ), $product_names ); - break; - case 'product_categories': - $get_product_categories = $this->get_coupon_category_names( $data ); - $product_categories = ( ! empty( $get_product_categories ) ) ? implode( ', ', $get_product_categories ) : ''; - $count_product_categories = ( ! empty( $get_product_categories ) ) ? count( $get_product_categories ) : 1; - /* translators: 1: The category names */ - $descriptions[] = sprintf( esc_html( _n( 'Valid for category %s', 'Valid for categories %s', $count_product_categories, 'woocommerce-smart-coupons' ) ), $product_categories ); - break; - case 'excluded_product_categories': - $get_product_categories = $this->get_coupon_category_names( $data ); - $product_categories = ( ! empty( $get_product_categories ) ) ? implode( ', ', $get_product_categories ) : ''; - $count_product_categories = ( ! empty( $get_product_categories ) ) ? count( $get_product_categories ) : 1; - /* translators: 1: The category names excluded */ - $descriptions[] = sprintf( esc_html( _n( 'Not valid for category %s', 'Not valid for categories %s', $count_product_categories, 'woocommerce-smart-coupons' ) ), $product_categories ); - break; - case 'date_expires': - if ( $data instanceof WC_DateTime ) { - $expiry_date = ( is_object( $data ) && is_callable( array( $data, 'getTimestamp' ) ) ) ? $data->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - if ( ! empty( $expiry_date ) && is_int( $expiry_date ) && ! empty( $expiry_time ) ) { - $expiry_date += $expiry_time; // Adding expiry time to expiry date. - } - if ( ! empty( $expiry_date ) ) { - /* translators: 1: The expiry date */ - $descriptions[] = sprintf( __( 'Expiry: %s', 'woocommerce-smart-coupons' ), $this->get_expiration_format( $expiry_date ) ); - } - break; - } - } - } - } - } - if ( empty( $descriptions ) ) { - $descriptions[] = __( 'Valid on entire range of products. Buy anything in the store.', 'woocommerce-smart-coupons' ); - } - return apply_filters( - 'wc_sc_generated_coupon_description', - implode( '. ', $descriptions ), - array( - 'source' => $this, - 'coupon_object' => $coupon, - ) - ); - } - - /** - * Get coupon category names. - * - * @since 5.7.0 - * - * @param array $category_ids Category IDs. - * @return array - */ - public function get_coupon_category_names( $category_ids = array() ) { - $category_names = array(); - - if ( empty( $category_ids ) || ! is_array( $category_ids ) ) { - return $category_names; - } - - $category_name_count_restriction = (int) apply_filters( - 'wc_sc_max_restricted_category_names', - 2, - array( - 'source' => $this, - 'data' => $category_ids, - ) - ); - - if ( count( $category_ids ) > $category_name_count_restriction ) { - $category_ids = array_slice( $category_ids, 0, $category_name_count_restriction ); - } - $category_names = get_terms( - array( - 'taxonomy' => 'product_cat', - 'include' => $category_ids, - 'fields' => 'id=>name', - 'get' => 'all', - ) - ); - - return array_filter( $category_names ); - } - - /** - * Get coupon product's names. - * - * @since 5.7.0 - * - * @param array $product_ids Product IDs. - * @return array - */ - public function get_coupon_product_names( $product_ids = array() ) { - $product_names = array(); - - if ( empty( $product_ids ) || ! is_array( $product_ids ) ) { - return $product_names; - } - - $data_count = count( $product_ids ); - $product_name_count = 0; - - $product_name_count_restriction = (int) apply_filters( - 'wc_sc_max_restricted_product_names', - 2, - array( - 'source' => $this, - 'data' => $product_ids, - ) - ); - - for ( $i = 0; $i < $data_count && $product_name_count < $product_name_count_restriction; $i++ ) { - $product = wc_get_product( $product_ids[ $i ] ); - if ( is_object( $product ) && is_callable( array( $product, 'get_name' ) ) ) { - $product_names[] = $product->get_name(); - $product_name_count++; - } - } - - return array_filter( $product_names ); - - } - - /** - * Get valid coupon designs - * - * @return array - */ - public function get_valid_coupon_designs() { - $valid_designs = array( - 'flat', - 'promotion', - 'ticket', - 'festive', - 'special', - 'shipment', - 'cutout', - 'deliver', - 'clipper', - 'basic', - 'deal', - 'custom-design', - ); - return $valid_designs; - } - - /** - * Get coupon design thumbnail src - * - * @param array $args The arguments. - * @return string - */ - public function get_coupon_design_thumbnail_src( $args = array() ) { - $coupon = ( ! empty( $args['coupon_object'] ) ) ? $args['coupon_object'] : null; - $src = ''; - $src_selected = ''; - $placeholder = wc_placeholder_img_src(); - if ( is_object( $coupon ) ) { - $coupon_product_ids = ( is_callable( array( $coupon, 'get_product_ids' ) ) ) ? $coupon->get_product_ids() : array(); - if ( ! empty( $coupon_product_ids ) ) { - $product_id = current( $coupon_product_ids ); - $product = wc_get_product( $product_id ); - $thumbnail_id = ( is_object( $product ) && is_callable( array( $product, 'get_image_id' ) ) ) ? $product->get_image_id() : ''; - } else { - $coupon_product_category_ids = ( is_callable( array( $coupon, 'get_product_categories' ) ) ) ? $coupon->get_product_categories() : array(); - if ( ! empty( $coupon_product_category_ids ) ) { - $category_id = current( $coupon_product_category_ids ); - $thumbnail_id = get_term_meta( $category_id, 'thumbnail_id', true ); - } - } - $src_array = ( ! empty( $thumbnail_id ) ) ? wp_get_attachment_image_src( $thumbnail_id, 'woocommerce_thumbnail' ) : array(); - $src = ( ! empty( $src_array[0] ) ) ? $src_array[0] : wc_placeholder_img_src(); - if ( ! empty( $src ) && strpos( $src, $placeholder ) !== false ) { - $src = ''; - } - } - if ( empty( $src ) ) { - $src_set = array(); - if ( $this->is_wc_gte_30() ) { - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - $is_free_shipping = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_free_shipping' ) ) ) ? ( ( $coupon->get_free_shipping() ) ? 'yes' : 'no' ) : ''; - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - } - - if ( 'yes' === $is_free_shipping ) { - $src_set = array( - 'delivery-motorcyle.svg', - ); - } else { - switch ( $discount_type ) { - case 'smart_coupon': - $src_set = array( - 'giftbox-color.svg', - ); - break; - - case 'fixed_cart': - $src_set = array( - 'sale-splash-tag.svg', - ); - break; - - case 'fixed_product': - $src_set = array( - 'product-package-box.svg', - ); - break; - - case 'percent_product': - $src_set = array( - 'cart-discount.svg', - ); - break; - - case 'percent': - $src_set = array( - 'cart-discount.svg', - ); - break; - - default: - $src_set = apply_filters( - 'wc_sc_coupon_design_thumbnail_src_set', - array( 'discount-coupon.svg' ), - array( - 'source' => $this, - 'coupon_object' => $coupon, - ) - ); - break; - - } - } - if ( ! empty( $src_set ) ) { - $src_index = array_rand( $src_set ); - $src_selected = $src_set[ $src_index ]; - $file = trailingslashit( plugins_url( '/', WC_SC_PLUGIN_FILE ) ) . 'assets/images/' . $src_selected; - $src = apply_filters( - 'wc_sc_coupon_design_thumbnail_src', - $file, - array( - 'source' => $this, - 'selected' => $src_selected, - 'coupon_object' => $coupon, - ) - ); - } - } - if ( empty( $src ) ) { - $design = ( ! empty( $args['design'] ) ) ? $args['design'] : ''; - if ( ! empty( $design ) ) { - switch ( $design ) { - case 'special': - $src_selected = 'giftbox-color.svg'; - break; - case 'shipment': - $src_selected = 'product-package-box.svg'; - break; - case 'cutout': - $src_selected = 'cart-discount.svg'; - break; - case 'deliver': - $src_selected = 'delivery-motorcyle.svg'; - break; - case 'deal': - $src_selected = 'discount-coupon.svg'; - break; - case 'flat': - case 'promotion': - case 'ticket': - case 'festive': - case 'clipper': - case 'basic': - default: - $src_selected = 'discount-coupon.svg'; - break; - } - if ( ! empty( $src_selected ) ) { - $file = trailingslashit( plugins_url( '/', WC_SC_PLUGIN_FILE ) ) . 'assets/images/' . $src_selected; - $src = apply_filters( - 'wc_sc_coupon_design_thumbnail_src', - $file, - array( - 'source' => $this, - 'selected' => $src_selected, - 'coupon_object' => $coupon, - ) - ); - } else { - $src = ''; - } - } - } - return $src; - } - - /** - * Find if the discount type is percent - * - * @param array $args The arguments. - * @return boolean - */ - public function is_percent_coupon( $args = array() ) { - $is_percent = false; - $coupon = ( ! empty( $args['coupon_object'] ) ) ? $args['coupon_object'] : null; - $percent_discount_types = apply_filters( - 'wc_sc_percent_discount_types', - array( 'percent_product', 'percent' ), - array( - 'source' => $this, - 'coupon_object' => $coupon, - ) - ); - if ( $this->is_wc_gte_30() ) { - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - if ( in_array( $discount_type, $percent_discount_types, true ) ) { - $is_percent = true; - } - return $is_percent; - } - - /** - * Generate storewide offer coupon description - * - * @param array $args Arguments. - * @return string - */ - public function generate_storewide_offer_coupon_description( $args = array() ) { - $coupon = ( ! empty( $args['coupon_object'] ) ) ? $args['coupon_object'] : false; - $coupon_amount = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_amount' ) ) ) ? $coupon->get_amount( 'edit' ) : 0; - $coupon_code = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - - if ( empty( $coupon_amount ) || empty( $coupon_code ) ) { - return ''; - } - - $description = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_description' ) ) ) ? $coupon->get_description() : ''; - - if ( empty( $description ) ) { - - $is_percent = $this->is_percent_coupon( array( 'coupon_object' => $coupon ) ); - $currency_symbol = get_woocommerce_currency_symbol(); - - $before_heading = array( - __( 'Great News!', 'woocommerce-smart-coupons' ), - __( 'Super Savings!', 'woocommerce-smart-coupons' ), - __( 'Ending Soon!', 'woocommerce-smart-coupons' ), - __( 'Limited Time Offer!', 'woocommerce-smart-coupons' ), - __( 'This Week Only!', 'woocommerce-smart-coupons' ), - __( 'Attention!', 'woocommerce-smart-coupons' ), - __( 'You don\'t want to miss this...', 'woocommerce-smart-coupons' ), - __( 'This will be over soon! Hurry.', 'woocommerce-smart-coupons' ), - __( 'Act before the offer expires.', 'woocommerce-smart-coupons' ), - __( 'Don't Miss Out.', 'woocommerce-smart-coupons' ), - ); - - $heading = array( - /* translators: 1. The discount text */ - __( '%s discount on anything you want.', 'woocommerce-smart-coupons' ), - /* translators: 1. The discount text */ - __( '%s discount on entire store.', 'woocommerce-smart-coupons' ), - /* translators: 1. The discount text */ - __( 'Pick any item today for %s off.', 'woocommerce-smart-coupons' ), - /* translators: 1. The discount text */ - __( 'Buy as much as you want. Flat %s off everything.', 'woocommerce-smart-coupons' ), - /* translators: 1. The discount text */ - __( 'Flat %s discount on everything today.', 'woocommerce-smart-coupons' ), - ); - - $before_heading_index = array_rand( $before_heading ); - $heading_index = array_rand( $heading ); - - if ( true === $is_percent ) { - $discount_text = $coupon_amount . '%'; - } else { - $discount_text = $currency_symbol . $coupon_amount; - } - - $description = sprintf( '%s ' . $heading[ $heading_index ] . ' %s: %s', $before_heading[ $before_heading_index ], '' . $discount_text . '', __( 'Use code', 'woocommerce-smart-coupons' ), '' . $coupon_code . '' ); - - $description = apply_filters( - 'wc_sc_storewide_offer_coupon_description', - $description, - array_merge( - $args, - array( - 'before_heading' => $before_heading[ $before_heading_index ], - 'heading' => $heading, - 'discount_text' => $discount_text, - ) - ) - ); - - } else { - /* translators: 1. The coupon code */ - $description .= ' ' . sprintf( __( 'Use code: %s', 'woocommerce-smart-coupons' ), '' . $coupon_code . '' ); - } - - return $description; - - } - - /** - * Update coupon's email id with the updation of customer profile - * - * @param int $user_id User ID of the user being saved. - */ - public function my_profile_update( $user_id ) { - - global $wpdb; - - if ( current_user_can( 'edit_user', $user_id ) ) { - - $current_user = get_userdata( $user_id ); - - $old_customers_email_id = $current_user->data->user_email; - - $post_email = ( isset( $_POST['email'] ) ) ? wc_clean( wp_unslash( $_POST['email'] ) ) : ''; // phpcs:ignore - - if ( ! empty( $post_email ) && $post_email !== $old_customers_email_id ) { - - $result = wp_cache_get( 'wc_sc_customers_coupon_ids_' . sanitize_key( $old_customers_email_id ), 'woocommerce_smart_coupons' ); - - if ( false === $result ) { - $result = $wpdb->get_col( // phpcs:ignore - $wpdb->prepare( - "SELECT post_id - FROM $wpdb->postmeta - WHERE meta_key = %s - AND meta_value LIKE %s - AND post_id IN ( SELECT ID - FROM $wpdb->posts - WHERE post_type = %s)", - 'customer_email', - '%' . $wpdb->esc_like( $old_customers_email_id ) . '%', - 'shop_coupon' - ) - ); - wp_cache_set( 'wc_sc_customers_coupon_ids_' . sanitize_key( $old_customers_email_id ), $result, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_customers_coupon_ids_' . sanitize_key( $old_customers_email_id ) ); - } - - if ( ! empty( $result ) ) { - - foreach ( $result as $post_id ) { - - $coupon_meta = $this->get_post_meta( $post_id, 'customer_email', true ); - $is_update_coupon_meta = false; - - if ( ! empty( $coupon_meta ) ) { - foreach ( $coupon_meta as $key => $email_id ) { - if ( $email_id === $old_customers_email_id ) { - $coupon_meta[ $key ] = $post_email; - $is_update_coupon_meta = true; - } - } - } - - if ( true === $is_update_coupon_meta ) { - $this->update_post_meta( $post_id, 'customer_email', $coupon_meta ); - } - } //end foreach - } - } - } - } - - /** - * Method to check whether 'pick_price_from_product' is set or not - * - * @param array $coupons Array of coupon codes. - * @return boolean - */ - public function is_coupon_amount_pick_from_product_price( $coupons ) { - - if ( empty( $coupons ) ) { - return false; - } - - foreach ( $coupons as $coupon_code ) { - $coupon = new WC_Coupon( $coupon_code ); - if ( $this->is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - continue; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - continue; - } - $discount_type = $coupon->get_discount_type(); - $is_pick_price_of_product = ( $this->is_callable( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'is_pick_price_of_product' ) : $this->get_post_meta( $coupon_id, 'is_pick_price_of_product', true ); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $is_pick_price_of_product = get_post_meta( $coupon_id, 'is_pick_price_of_product', true ); - } - if ( 'smart_coupon' === $discount_type && 'yes' === $is_pick_price_of_product ) { - return true; - } - } - return false; - } - - /** - * Function to find if order is discounted with store credit - * - * @param WC_Order $order Order object. - * @return boolean - */ - public function is_order_contains_store_credit( $order = null ) { - - if ( empty( $order ) ) { - return false; - } - - $coupons = $order->get_items( 'coupon' ); - - foreach ( $coupons as $item_id => $item ) { - $code = ( is_object( $item ) && is_callable( array( $item, 'get_name' ) ) ) ? $item->get_name() : trim( $item['name'] ); - $coupon = new WC_Coupon( $code ); - if ( $this->is_wc_gte_30() ) { - $discount_type = $coupon->get_discount_type(); - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - if ( 'smart_coupon' === $discount_type ) { - return true; - } - } - - return false; - - } - - /** - * Function to validate smart coupon for product - * - * @param bool $valid Coupon validity. - * @param WC_Product|null $product Product object. - * @param WC_Coupon|null $coupon Coupon object. - * @param array|null $values Values. - * @return bool $valid - */ - public function smart_coupons_is_valid_for_product( $valid, $product = null, $coupon = null, $values = null ) { - - if ( empty( $product ) || empty( $coupon ) ) { - return $valid; - } - - if ( $this->is_wc_gte_30() ) { - $product_id = ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0; - $product_parent_id = ( is_object( $product ) && is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0; - $product_variation_id = ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0; - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - $coupon_product_ids = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_product_ids' ) ) ) ? $coupon->get_product_ids() : ''; - $coupon_product_categories = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_product_categories' ) ) ) ? $coupon->get_product_categories() : ''; - $coupon_excluded_product_ids = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_excluded_product_ids' ) ) ) ? $coupon->get_excluded_product_ids() : ''; - $coupon_excluded_product_categories = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_excluded_product_categories' ) ) ) ? $coupon->get_excluded_product_categories() : ''; - $is_exclude_sale_items = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_exclude_sale_items' ) ) ) ? ( ( $coupon->get_exclude_sale_items() ) ? 'yes' : 'no' ) : ''; - } else { - $product_id = ( ! empty( $product->id ) ) ? $product->id : 0; - $product_parent_id = ( ! empty( $product ) && is_callable( array( $product, 'get_parent' ) ) ) ? $product->get_parent() : 0; - $product_variation_id = ( ! empty( $product->variation_id ) ) ? $product->variation_id : 0; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $coupon_product_ids = ( ! empty( $coupon->product_ids ) ) ? $coupon->product_ids : array(); - $coupon_product_categories = ( ! empty( $coupon->product_categories ) ) ? $coupon->product_categories : array(); - $coupon_excluded_product_ids = ( ! empty( $coupon->exclude_product_ids ) ) ? $coupon->exclude_product_ids : array(); - $coupon_excluded_product_categories = ( ! empty( $coupon->exclude_product_categories ) ) ? $coupon->exclude_product_categories : array(); - $is_exclude_sale_items = ( ! empty( $coupon->exclude_sale_items ) ) ? $coupon->exclude_sale_items : ''; - } - - if ( 'smart_coupon' === $discount_type ) { - - $product_cats = wc_get_product_cat_ids( $product_id ); - - // Specific products get the discount. - if ( count( $coupon_product_ids ) > 0 ) { - - if ( in_array( $product_id, $coupon_product_ids, true ) || ( isset( $product_variation_id ) && in_array( $product_variation_id, $coupon_product_ids, true ) ) || in_array( $product_parent_id, $coupon_product_ids, true ) ) { - $valid = true; - } - - // Category discounts. - } elseif ( count( $coupon_product_categories ) > 0 ) { - - if ( count( array_intersect( $product_cats, $coupon_product_categories ) ) > 0 ) { - $valid = true; - } - } else { - // No product ids - all items discounted. - $valid = true; - } - - // Specific product ID's excluded from the discount. - if ( count( $coupon_excluded_product_ids ) > 0 ) { - if ( in_array( $product_id, $coupon_excluded_product_ids, true ) || ( isset( $product_variation_id ) && in_array( $product_variation_id, $coupon_excluded_product_ids, true ) ) || in_array( $product_parent_id, $coupon_excluded_product_ids, true ) ) { - $valid = false; - } - } - - // Specific categories excluded from the discount. - if ( count( $coupon_excluded_product_categories ) > 0 ) { - if ( count( array_intersect( $product_cats, $coupon_excluded_product_categories ) ) > 0 ) { - $valid = false; - } - } - - // Sale Items excluded from discount. - if ( 'yes' === $is_exclude_sale_items ) { - $product_ids_on_sale = wc_get_product_ids_on_sale(); - - if ( in_array( $product_id, $product_ids_on_sale, true ) || ( isset( $product_variation_id ) && in_array( $product_variation_id, $product_ids_on_sale, true ) ) || in_array( $product_parent_id, $product_ids_on_sale, true ) ) { - $valid = false; - } - } - } - - return $valid; - } - - /** - * Validate expiry time - * - * @param boolean $expired Whether the coupon is expired or not. - * @param WC_Coupon $coupon The coupon object. - * @param WC_Discounts $discounts The discount object. - * @return boolean - */ - public function validate_expiry_time( $expired = false, $coupon = null, $discounts = null ) { - - if ( ! $this->is_wc_gte_30() ) { - return $expired; // Expiry time feature is not supported for lower version of WooCommerce. - } - - $expiry_time = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_meta' ) ) ) ? $coupon->get_meta( 'wc_sc_expiry_time' ) : 0; - - if ( ! empty( $expiry_time ) ) { - $expiry_date = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_date_expires' ) ) ) ? $coupon->get_date_expires() : ''; - if ( ! empty( $expiry_date ) ) { - if ( $expiry_date instanceof WC_DateTime ) { - $expiry_date = ( is_callable( array( $expiry_date, 'getTimestamp' ) ) ) ? $expiry_date->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - if ( is_int( $expiry_date ) ) { - $expiry_date += $expiry_time; // Adding expiry time to expiry date. - if ( time() <= $expiry_date ) { - $expired = false; - } else { - $expired = true; - } - } - } - } - - return $expired; - } - - /** - * Function to keep valid coupons when individual use coupon is applied - * - * @param array $coupons_to_keep Coupons to keep. - * @param WC_Coupon|boolean $the_coupon Coupon object. - * @param array $applied_coupons Array of applied coupons. - * @return array $coupons_to_keep - */ - public function smart_coupons_override_individual_use( $coupons_to_keep = array(), $the_coupon = false, $applied_coupons = array() ) { - - if ( $this->is_wc_gte_30() ) { - foreach ( $applied_coupons as $code ) { - $coupon = new WC_Coupon( $code ); - if ( 'smart_coupon' === $coupon->get_discount_type() && ! $coupon->get_individual_use() && ! in_array( $code, $coupons_to_keep, true ) ) { - $coupons_to_keep[] = $code; - } - } - } - - return $coupons_to_keep; - } - - /** - * Force apply store credit even if the individual coupon already exists in cart - * - * @param boolean $is_apply Apply with individual use coupon. - * @param WC_Coupon|boolean $the_coupon Coupon object. - * @param WC_Coupon|boolean $applied_coupon Coupon object. - * @param array $applied_coupons Array of applied coupons. - * @return boolean - */ - public function smart_coupons_override_with_individual_use( $is_apply = false, $the_coupon = false, $applied_coupon = false, $applied_coupons = array() ) { - - if ( $this->is_wc_gte_30() ) { - if ( ! $is_apply && 'smart_coupon' === $the_coupon->get_discount_type() && ! $the_coupon->get_individual_use() ) { - $is_apply = true; - } - } - - return $is_apply; - } - - /** - * Function to add appropriate discount total filter - */ - public function smart_coupons_discount_total_filters() { - if ( WCS_SC_Compatibility::is_cart_contains_subscription() && WCS_SC_Compatibility::is_wcs_gte( '2.0.0' ) ) { - add_action( 'woocommerce_after_calculate_totals', array( $this, 'smart_coupons_after_calculate_totals' ), 9999 ); - } else { - add_action( 'woocommerce_after_calculate_totals', array( $this, 'smart_coupons_after_calculate_totals' ), 9999 ); - global $current_screen; - if ( ! empty( $current_screen ) && 'edit-shop_order' !== $current_screen ) { - add_filter( 'woocommerce_order_get_total', array( $this, 'smart_coupons_order_discounted_total' ), 10, 2 ); - } - } - } - - /** - * Function to handle store credit application - */ - public function sc_handle_store_credit_application() { - $apply_before_tax = get_option( 'woocommerce_smart_coupon_apply_before_tax', 'no' ); - - if ( $this->is_wc_gte_30() && 'yes' === $apply_before_tax ) { - include_once 'class-wc-sc-apply-before-tax.php'; - } else { - add_action( 'wp_loaded', array( $this, 'smart_coupons_discount_total_filters' ), 20 ); - add_action( 'woocommerce_order_after_calculate_totals', array( $this, 'order_calculate_discount_amount' ), 10, 2 ); - } - } - - /** - * Function to set store credit amount for orders that are manually created and updated from backend - * - * @param bool $and_taxes Calc taxes if true. - * @param WC_Order $order Order object. - */ - public function order_calculate_discount_amount( $and_taxes, $order ) { - if ( ! is_object( $order ) || ! $order instanceof WC_Order ) { - return; - } - $order_actions = array( 'woocommerce_add_coupon_discount', 'woocommerce_calc_line_taxes', 'woocommerce_save_order_items' ); - - $post_action = ( ! empty( $_POST['action'] ) ) ? wc_clean( wp_unslash( $_POST['action'] ) ) : ''; // phpcs:ignore - $post_post_type = ( ! empty( $_POST['post_type'] ) ) ? wc_clean( wp_unslash( $_POST['post_type'] ) ) : ''; // phpcs:ignore - - $order_created_via = ( is_callable( array( $order, 'get_created_via' ) ) ) ? $order->get_created_via() : ''; - - if ( ( ! empty( $post_action ) && ( in_array( $post_action, $order_actions, true ) || ( ! empty( $post_post_type ) && 'shop_order' === $post_post_type && 'editpost' === $post_action ) ) ) || 'rest-api' === $order_created_via ) { - if ( ! is_callable( array( $order, 'get_id' ) ) ) { - return; - } - $order_id = $order->get_id(); - if ( empty( $order_id ) ) { - return; - } - $coupons = $order->get_items( 'coupon' ); - - if ( ! empty( $coupons ) ) { - foreach ( $coupons as $item_id => $item ) { - $coupon_code = ( is_object( $item ) && is_callable( array( $item, 'get_name' ) ) ) ? $item->get_name() : trim( $item['name'] ); - - if ( empty( $coupon_code ) ) { - continue; - } - - $coupon = new WC_Coupon( $coupon_code ); - $discount_type = $coupon->get_discount_type(); - - if ( 'smart_coupon' === $discount_type ) { - $total = $order->get_total(); - $discount_amount = ( is_object( $item ) && is_callable( array( $item, 'get_discount' ) ) ) ? $item->get_discount() : $this->get_order_item_meta( $item_id, 'discount_amount', true, true ); - $smart_coupons_contribution = $this->get_post_meta( $order_id, 'smart_coupons_contribution', true, true ); - $smart_coupons_contribution = ! empty( $smart_coupons_contribution ) ? $smart_coupons_contribution : array(); - - if ( ! empty( $smart_coupons_contribution ) && count( $smart_coupons_contribution ) > 0 && array_key_exists( $coupon_code, $smart_coupons_contribution ) ) { - $discount = $smart_coupons_contribution[ $coupon_code ]; - } elseif ( ! empty( $discount_amount ) ) { - $discount = $discount_amount; - } else { - $discount = $this->sc_order_get_discount_amount( $total, $coupon, $order ); - } - - $discount = min( $total, $discount ); - if ( is_object( $item ) && is_callable( array( $item, 'set_discount' ) ) ) { - $item->set_discount( $discount ); - } else { - $item['discount_amount'] = $discount; - } - - $order->set_total( $total - $discount ); - - $smart_coupons_contribution[ $coupon_code ] = $discount; - - $this->update_post_meta( $order_id, 'smart_coupons_contribution', $smart_coupons_contribution, true, $order ); - - } - } - $pending_statuses = $this->get_pending_statuses(); - if ( 'woocommerce_add_coupon_discount' === $post_action && $order->has_status( $pending_statuses ) && did_action( 'sc_after_order_calculate_discount_amount' ) <= 0 ) { - do_action( 'sc_after_order_calculate_discount_amount', $order_id ); - } - } - } - } - - /** - * Function to get discount amount for orders - * - * @param float $total Order total. - * @param WC_Coupon $coupon Coupon object. - * @param WC_Order $order Order object. - * @return float $discount - */ - public function sc_order_get_discount_amount( $total, $coupon, $order ) { - $discount = 0; - - if ( is_a( $coupon, 'WC_Coupon' ) && is_a( $order, 'WC_Order' ) ) { - $discount_type = $coupon->get_discount_type(); - $coupon_code = $coupon->get_code(); - $coupon_product_ids = $coupon->get_product_ids(); - $coupon_product_categories = $coupon->get_product_categories(); - - if ( 'smart_coupon' === $discount_type ) { - - $coupon_amount = $this->get_amount( $coupon, true, $order ); - - $calculated_total = $total; - - if ( count( $coupon_product_ids ) > 0 || count( $coupon_product_categories ) > 0 ) { - - $discount = 0; - $line_totals = 0; - $line_taxes = 0; - $discounted_products = array(); - - $order_items = $order->get_items( 'line_item' ); - - foreach ( $order_items as $order_item_id => $order_item ) { - if ( $discount >= $coupon_amount ) { - break; - } - - $product_id = ( is_object( $order_item ) && is_callable( array( $order_item, 'get_product_id' ) ) ) ? $order_item->get_product_id() : $order_item['product_id']; - $variation_id = ( is_object( $order_item ) && is_callable( array( $order_item, 'get_variation_id' ) ) ) ? $order_item->get_variation_id() : $order_item['variation_id']; - $line_total = ( is_object( $order_item ) && is_callable( array( $order_item, 'get_total' ) ) ) ? $order_item->get_total() : $order_item['line_total']; - $line_tax = ( is_object( $order_item ) && is_callable( array( $order_item, 'get_total_tax' ) ) ) ? $order_item->get_total_tax() : $order_item['line_tax']; - - $product_cats = wc_get_product_cat_ids( $product_id ); - - if ( count( $coupon_product_categories ) > 0 ) { - - $continue = false; - - if ( ! empty( $order_item_id ) && ! empty( $discounted_products ) && is_array( $discounted_products ) && in_array( $order_item_id, $discounted_products, true ) ) { - $continue = true; - } - - if ( ! $continue && count( array_intersect( $product_cats, $coupon_product_categories ) ) > 0 ) { - - $discounted_products[] = ( ! empty( $order_item_id ) ) ? $order_item_id : ''; - - $line_totals += $line_total; - $line_taxes += $line_tax; - - } - } - - if ( count( $coupon_product_ids ) > 0 ) { - - $continue = false; - - if ( ! empty( $order_item_id ) && ! empty( $discounted_products ) && is_array( $discounted_products ) && in_array( $order_item_id, $discounted_products, true ) ) { - $continue = true; - } - - if ( ! $continue && in_array( $product_id, $coupon_product_ids, true ) || in_array( $variation_id, $coupon_product_ids, true ) ) { - - $discounted_products[] = ( ! empty( $order_item_id ) ) ? $order_item_id : ''; - - $line_totals += $line_total; - $line_taxes += $line_tax; - - } - } - } - - $calculated_total = round( ( $line_totals + $line_taxes ), wc_get_price_decimals() ); - - } - $discount = min( $calculated_total, $coupon_amount ); - } - } - - return $discount; - } - - /** - * Function to apply Smart Coupons discount - * - * @param float $total Cart total. - * @param WC_Cart $cart Cart object. - * @param boolean $cart_contains_subscription Is cart contains subscription. - * @param string $calculation_type The calculation type. - * @return float $total - */ - public function smart_coupons_discounted_totals( $total = 0, $cart = null, $cart_contains_subscription = false, $calculation_type = '' ) { - - if ( empty( $total ) ) { - return $total; - } - - $applied_coupons = ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'get_applied_coupons' ) ) ) ? WC()->cart->get_applied_coupons() : array(); - - $smart_coupon_credit_used = ( is_object( WC()->cart ) && isset( WC()->cart->smart_coupon_credit_used ) ) ? WC()->cart->smart_coupon_credit_used : array(); - - if ( ! empty( $applied_coupons ) ) { - foreach ( $applied_coupons as $code ) { - $request_wc_ajax = ( ! empty( $_REQUEST['wc-ajax'] ) ) ? wc_clean( wp_unslash( $_REQUEST['wc-ajax'] ) ) : ''; // phpcs:ignore - $ignore_ajax_action = array( 'update_order_review', 'checkout' ); - if ( ! empty( $request_wc_ajax ) && in_array( $request_wc_ajax, $ignore_ajax_action, true ) && array_key_exists( $code, $smart_coupon_credit_used ) && true !== $cart_contains_subscription && ! isset( WC()->session->reload_checkout ) ) { - continue; - } - $coupon = new WC_Coupon( $code ); - $discount = $this->sc_cart_get_discount_amount( $total, $coupon ); - - if ( ! empty( $discount ) ) { - $discount = min( $total, $discount ); - $total = $total - $discount; - $this->manage_smart_coupon_credit_used( $coupon, $discount, $cart_contains_subscription, $calculation_type ); - } - } - } - - return $total; - } - - /** - * Function to apply Smart Coupons discount after calculating tax - * - * @param WC_Cart $cart Cart object. - */ - public function smart_coupons_after_calculate_totals( $cart = null ) { - - if ( empty( $cart ) || ! ( $cart instanceof WC_Cart ) ) { - return; - } - - // Check if AvaTax is active by checking for its main function. - if ( function_exists( 'wc_avatax' ) ) { - $wc_avatax = wc_avatax(); - if ( is_callable( array( $wc_avatax, 'get_tax_handler' ) ) ) { - $ava_tax_handler = $wc_avatax->get_tax_handler(); - // Check if AvaTax is doing tax calculation. - if ( is_callable( array( $ava_tax_handler, 'is_available' ) ) && true === $ava_tax_handler->is_available() ) { - // Stop discount calculation till taxes from AvaTax have been calculated. - if ( is_checkout() && ! did_action( 'wc_avatax_after_checkout_tax_calculated' ) ) { - return; - } - } - } - } - - $cart_total = ( $this->is_wc_greater_than( '3.1.2' ) ) ? $cart->get_total( 'edit' ) : $cart->total; - - if ( ! empty( $cart_total ) ) { - - $stop_at = did_action( 'woocommerce_cart_reset' ); - - $stop_at = apply_filters( 'wc_sc_calculate_totals_stop_at', $stop_at, $cart ); - - if ( empty( $stop_at ) ) { - $stop_at = 1; - } - - $cart_contains_subscription = WCS_SC_Compatibility::is_cart_contains_subscription(); - $calculation_type = ''; - - if ( $cart_contains_subscription ) { - $stop_at++; - $calculation_type = WC_Subscriptions_Cart::get_calculation_type(); - } - - if ( did_action( 'smart_coupons_after_calculate_totals' ) > $stop_at ) { - return; - } - - if ( 'recurring_total' === $calculation_type ) { - $total = $cart_total; - } else { - $total = $this->smart_coupons_discounted_totals( $cart_total, $cart, $cart_contains_subscription, $calculation_type ); - } - - if ( $this->is_wc_greater_than( '3.1.2' ) ) { - $cart->set_total( $total ); - } else { - $cart->total = $total; - } - - do_action( 'smart_coupons_after_calculate_totals' ); - - } - - } - - - /** - * Function to do action 'smart_coupons_after_calculate_totals' since WooCommerce Services plugin triggers 'woocommerce_cart_reset' in its function for 'woocommerce_after_calculate_totals' action causing miscalculation in did_action( 'smart_coupons_after_calculate_totals' ) hook. - */ - public function woocommerce_cart_reset() { - - $cart_reset_action_count = did_action( 'woocommerce_cart_reset' ); - $sc_after_calculate_action_count = did_action( 'smart_coupons_after_calculate_totals' ); - - // This is to match counter for 'smart_coupons_after_calculate_totals' hook with 'woocommerce_cart_reset' counter since we are using these two counters to prevent store credit being appplied multiple times. - if ( $sc_after_calculate_action_count < $cart_reset_action_count ) { - do_action( 'smart_coupons_after_calculate_totals' ); - } - - } - - /** - * Function to calculate total cart contents. - * skip the product if the product is a bundled product. - * - * @since 4.32.0 - * @return int - */ - public function get_cart_contents_count() { - $total_product = 0; - $cart_data = ( isset( WC()->cart ) && is_callable( array( WC()->cart, 'get_cart' ) ) ) ? WC()->cart->get_cart() : array(); - if ( ! empty( $cart_data ) ) { - foreach ( $cart_data as $data ) { - // Skip bundled products. - if ( isset( $data['stamp'] ) && isset( $data['bundled_by'] ) ) { - continue; - } - $total_product++; - } - } - return $total_product; - } - - /** - * Get coupon discount amount for percentage type coupon. - * - * @param float $discount Amount this coupon has discounted. - * @param float $discounting_amount Amount the coupon is being applied to. - * @param array|null $cart_item Cart item being discounted if applicable. - * @param bool $single True if discounting a single qty item, false if its the line. - * @param WC_Coupon $coupon Coupon object. - * @return float $discount - */ - public function get_coupon_discount_amount( $discount = 0, $discounting_amount = 0, $cart_item = array(), $single = false, $coupon = object ) { - - if ( is_a( $coupon, 'WC_Coupon' ) ) { - - if ( is_object( $coupon ) && is_callable( array( $coupon, 'is_valid' ) ) && $coupon->is_valid() && is_callable( array( $coupon, 'is_type' ) ) && $coupon->is_type( 'percent' ) ) { - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - } - - if ( empty( $coupon_id ) ) { - return $discount; - } - - $order = ( is_a( $cart_item, 'WC_Order_Item' ) && is_callable( array( $cart_item, 'get_order' ) ) ) ? $cart_item->get_order() : null; - - $max_discount = $this->get_post_meta( $coupon_id, 'wc_sc_max_discount', true, true, $order ); - - if ( ! empty( $max_discount ) && is_numeric( $max_discount ) ) { - - $coupon_product_ids = ( is_callable( array( $coupon, 'get_product_ids' ) ) ) ? $coupon->get_product_ids() : array(); - $coupon_excluded_product_ids = ( is_callable( array( $coupon, 'get_excluded_product_ids' ) ) ) ? $coupon->get_excluded_product_ids() : array(); - $coupon_category_ids = ( is_callable( array( $coupon, 'get_product_categories' ) ) ) ? $coupon->get_product_categories() : array(); - $coupon_excluded_category_ids = ( is_callable( array( $coupon, 'get_excluded_product_categories' ) ) ) ? $coupon->get_excluded_product_categories() : array(); - $cart_items_subtotal = 0; - $cart_contents_count = 0; - $max_discount_name = 'wc_sc_max_discount_data'; - $inc_tax = wc_prices_include_tax(); - $is_restricted = count( $coupon_product_ids ) > 0 || count( $coupon_excluded_product_ids ) > 0 || count( $coupon_category_ids ) > 0 || count( $coupon_excluded_category_ids ) > 0; - $is_restricted = apply_filters( - 'wc_sc_is_coupon_restriction_available', - $is_restricted, - array( - 'source' => $this, - 'discount' => $discount, - 'discounting_amount' => $discounting_amount, - 'cart_item' => $cart_item, - 'single' => $single, - 'coupon_object' => $coupon, - ) - ); - - if ( is_a( $cart_item, 'WC_Order_Item_Product' ) ) { - $order = $wc_cart_or_order_object = ( is_callable( array( $cart_item, 'get_order' ) ) ) ? $cart_item->get_order() : null; // phpcs:ignore - $wc_order_id = ( is_callable( array( $cart_item, 'get_order_id' ) ) ) ? $cart_item->get_order_id() : 0; - if ( empty( $wc_order_id ) ) { - return $discount; - } - $order_line_items = array(); - if ( is_a( $order, 'WC_Order' ) ) { - $cart_items_subtotal = ( is_callable( array( $order, 'get_subtotal' ) ) ) ? $order->get_subtotal() : 0; - $order_line_items = ( is_callable( array( $order, 'get_items' ) ) ) ? $order->get_items() : array(); - } - - $max_discount_name = 'wc_sc_max_discount_data_for_' . $wc_order_id; - if ( ! empty( $order_line_items ) ) { - foreach ( $order_line_items as $order_line_item ) { - $cart_contents_count++; - } - } - - $max_discount_data = function_exists( 'get_transient' ) ? get_transient( $max_discount_name ) : array(); - } else { - $wc_cart = $wc_cart_or_order_object = ! empty( WC()->cart ) ? WC()->cart : null; // phpcs:ignore - $wc_session = ! empty( WC()->session ) ? WC()->session : null; - if ( ! is_a( $wc_cart, 'WC_Cart' ) ) { - return $discount; - } - if ( true === $inc_tax ) { - $cart_items_subtotal = ! empty( $wc_cart->subtotal ) ? $wc_cart->subtotal : 0; - } else { - $cart_items_subtotal = ! empty( $wc_cart->subtotal_ex_tax ) ? $wc_cart->subtotal_ex_tax : 0; - } - - $max_discount_data = ( ! empty( $wc_session ) && is_a( $wc_session, 'WC_Session' ) && is_callable( array( $wc_session, 'get' ) ) ) ? $wc_session->get( $max_discount_name ) : array(); - - $cart_contents_count = $this->get_cart_contents_count(); - } - - $is_update_valid_item_count = false; - - if ( empty( $max_discount_data ) || ! is_array( $max_discount_data ) ) { - $max_discount_data = array(); - } - - if ( empty( $max_discount_data[ $coupon_id ] ) || ! is_array( $max_discount_data[ $coupon_id ] ) ) { - $max_discount_data[ $coupon_id ] = array(); - $is_update_valid_item_count = true; - $max_discount_data[ $coupon_id ]['amount'] = $max_discount; - $max_discount_data[ $coupon_id ]['count'] = $cart_contents_count; - } - - if ( true === $is_restricted && class_exists( 'WC_Discounts' ) && ! empty( $wc_cart_or_order_object ) ) { - - $wc_discounts = new WC_Discounts( $wc_cart_or_order_object ); - $items_to_validate = array(); - - if ( is_callable( array( $wc_discounts, 'get_items_to_validate' ) ) ) { - $items_to_validate = $wc_discounts->get_items_to_validate(); - } elseif ( is_callable( array( $wc_discounts, 'get_items' ) ) ) { - $items_to_validate = $wc_discounts->get_items(); - } elseif ( ! empty( $wc_discounts->items ) && is_array( $wc_discounts->items ) ) { - $items_to_validate = $wc_discounts->items; - } - - if ( is_array( $items_to_validate ) ) { - $valid_product_count = 0; - foreach ( $items_to_validate as $item ) { - $item_to_apply = clone $item; // Clone the item so changes to wc_discounts item do not affect the originals. - $valid_product_quantity = ( ! empty( $item_to_apply->quantity ) ) ? intval( $item_to_apply->quantity ) : 0; - $product = ( ! empty( $item_to_apply->product ) ) ? $item_to_apply->product : null; - $item_to_apply_object = ( ! empty( $item_to_apply->object ) ) ? $item_to_apply->object : null; - - if ( 0 === $wc_discounts->get_discounted_price_in_cents( $item_to_apply ) || 0 >= $valid_product_quantity ) { - continue; - } - - if ( ! $coupon->is_valid_for_product( $product, $item_to_apply_object ) && ! $coupon->is_valid_for_cart() ) { - continue; - } - - // Increment if the product is not a bundled product. - $valid_product_count = ( isset( $item_to_apply_object['stamp'] ) && isset( $item_to_apply_object['bundled_by'] ) ) ? $valid_product_count : $valid_product_count + 1; - $line_subtotal = ! empty( $item_to_apply_object['line_subtotal'] ) ? intval( $item_to_apply_object['line_subtotal'] ) : 0; - if ( true === $inc_tax ) { - $line_subtotal_tax = ! empty( $item_to_apply_object['line_subtotal_tax'] ) ? intval( $item_to_apply_object['line_subtotal_tax'] ) : 0; - $cart_items_subtotal += $line_subtotal + $line_subtotal_tax; - } else { - $cart_items_subtotal += $line_subtotal; - } - } - - if ( true === $is_update_valid_item_count ) { - $max_discount_data[ $coupon_id ]['count'] = $valid_product_count; - } - } - } - - if ( 0 !== $cart_items_subtotal ) { - - $max_discount = ! empty( $max_discount_data[ $coupon_id ]['amount'] ) ? $max_discount_data[ $coupon_id ]['amount'] : 0; - if ( $max_discount < 0 ) { - $max_discount = 0; - } - - $discount = min( $max_discount, $discount ); - - if ( ! empty( $max_discount ) ) { - $max_discount_data[ $coupon_id ]['amount'] -= $discount; - } - - $max_discount_data[ $coupon_id ]['count']--; - - if ( 0 >= $max_discount_data[ $coupon_id ]['count'] ) { - unset( $max_discount_data[ $coupon_id ] ); - } - if ( 'wc_sc_max_discount_data' === $max_discount_name ) { - if ( ! empty( $wc_session ) && is_a( $wc_session, 'WC_Session' ) && is_callable( array( $wc_session, 'set' ) ) ) { - $wc_session->set( $max_discount_name, $max_discount_data ); - } - } elseif ( function_exists( 'set_transient' ) ) { - set_transient( $max_discount_name, $max_discount_data, DAY_IN_SECONDS ); - } - } - } - } - } - return $discount; - } - - /** - * Function to set default values to postmeta fields - * - * @param array $defaults Existing postmeta defaults. - * @return array - */ - public function postmeta_defaults( $defaults = array() ) { - - if ( $this->is_wc_gte_32() ) { - $defaults['wc_sc_expiry_time'] = ''; - } - - return $defaults; - } - - /** - * Function to get discount amount - * - * @param float $total The total. - * @param WC_Coupon $coupon The coupon object. - * @return float $discount - */ - public function sc_cart_get_discount_amount( $total = 0, $coupon = '' ) { - - $discount = 0; - - if ( is_a( $coupon, 'WC_Coupon' ) ) { - - if ( $coupon->is_valid() && $coupon->is_type( 'smart_coupon' ) ) { - - if ( $this->is_wc_gte_30() ) { - $coupon_code = $coupon->get_code(); - $coupon_product_ids = $coupon->get_product_ids(); - $coupon_product_categories = $coupon->get_product_categories(); - } else { - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - $coupon_product_ids = ( ! empty( $coupon->product_ids ) ) ? $coupon->product_ids : array(); - $coupon_product_categories = ( ! empty( $coupon->product_categories ) ) ? $coupon->product_categories : array(); - } - - $coupon_amount = $this->get_amount( $coupon, true ); - - $calculated_total = $total; - - if ( count( $coupon_product_ids ) > 0 || count( $coupon_product_categories ) > 0 ) { - - $discount = 0; - $line_totals = 0; - $line_taxes = 0; - $discounted_products = array(); - - foreach ( WC()->cart->cart_contents as $cart_item_key => $product ) { - - if ( $discount >= $coupon_amount ) { - break; - } - - $product_cats = wc_get_product_cat_ids( $product['product_id'] ); - - if ( count( $coupon_product_categories ) > 0 ) { - - $continue = false; - - if ( ! empty( $cart_item_key ) && ! empty( $discounted_products ) && is_array( $discounted_products ) && in_array( $cart_item_key, $discounted_products, true ) ) { - $continue = true; - } - - if ( ! $continue && count( array_intersect( $product_cats, $coupon_product_categories ) ) > 0 ) { - - $discounted_products[] = ( ! empty( $cart_item_key ) ) ? $cart_item_key : ''; - - $line_totals += $product['line_total']; - $line_taxes += $product['line_tax']; - - } - } - - if ( count( $coupon_product_ids ) > 0 ) { - - $continue = false; - - if ( ! empty( $cart_item_key ) && ! empty( $discounted_products ) && is_array( $discounted_products ) && in_array( $cart_item_key, $discounted_products, true ) ) { - $continue = true; - } - - if ( ! $continue && in_array( $product['product_id'], $coupon_product_ids, true ) || in_array( $product['variation_id'], $coupon_product_ids, true ) || in_array( $product['data']->get_parent(), $coupon_product_ids, true ) ) { - - $discounted_products[] = ( ! empty( $cart_item_key ) ) ? $cart_item_key : ''; - - $line_totals += $product['line_total']; - $line_taxes += $product['line_tax']; - - } - } - } - - $calculated_total = round( ( $line_totals + $line_taxes ), wc_get_price_decimals() ); - - } - - $discount = min( $calculated_total, $coupon_amount ); - } - } - - return $discount; - } - - /** - * Function to manage store credit used - * - * @param WC_Coupon $coupon The coupon object. - * @param float $discount The discount. - * @param bool $cart_contains_subscription Is cart contains subscription. - * @param string $calculation_type Calculation type. - */ - public function manage_smart_coupon_credit_used( $coupon = '', $discount = 0, $cart_contains_subscription = false, $calculation_type = '' ) { - if ( is_object( $coupon ) && $coupon instanceof WC_Coupon ) { - - if ( $this->is_wc_gte_30() ) { - $coupon_code = ( is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - } else { - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - if ( $cart_contains_subscription ) { - if ( WCS_SC_Compatibility::is_wcs_gte( '2.0.10' ) ) { - if ( $this->is_wc_greater_than( '3.1.2' ) ) { - $coupon_discount_totals = ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'get_coupon_discount_totals' ) ) ) ? WC()->cart->get_coupon_discount_totals() : array(); - if ( ! is_array( $coupon_discount_totals ) ) { - $coupon_discount_totals = array(); - } - if ( empty( $coupon_discount_totals[ $coupon_code ] ) ) { - $coupon_discount_totals[ $coupon_code ] = $discount; - } else { - $coupon_discount_totals[ $coupon_code ] += $discount; - } - ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'set_coupon_discount_totals' ) ) ) ? WC()->cart->set_coupon_discount_totals( $coupon_discount_totals ) : ''; - } else { - $coupon_discount_amounts = ( is_object( WC()->cart ) && isset( WC()->cart->coupon_discount_amounts ) ) ? WC()->cart->coupon_discount_amounts : array(); - if ( ! is_array( $coupon_discount_amounts ) ) { - $coupon_discount_amounts = array(); - } - if ( empty( $coupon_discount_amounts[ $coupon_code ] ) ) { - $coupon_discount_amounts[ $coupon_code ] = $discount; - } else { - $coupon_discount_amounts[ $coupon_code ] += $discount; - } - WC()->cart->coupon_discount_amounts = $coupon_discount_amounts; - } - } elseif ( WCS_SC_Compatibility::is_wcs_gte( '2.0.0' ) ) { - WC_Subscriptions_Coupon::increase_coupon_discount_amount( WC()->cart, $coupon_code, $discount ); - } else { - WC_Subscriptions_Cart::increase_coupon_discount_amount( $coupon_code, $discount ); - } - } else { - if ( $this->is_wc_greater_than( '3.1.2' ) ) { - $coupon_discount_totals = ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'get_coupon_discount_totals' ) ) ) ? WC()->cart->get_coupon_discount_totals() : array(); - if ( ! is_array( $coupon_discount_totals ) ) { - $coupon_discount_totals = array(); - } - if ( empty( $coupon_discount_totals[ $coupon_code ] ) ) { - $coupon_discount_totals[ $coupon_code ] = $discount; - } else { - $coupon_discount_totals[ $coupon_code ] += $discount; - } - ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'set_coupon_discount_totals' ) ) ) ? WC()->cart->set_coupon_discount_totals( $coupon_discount_totals ) : ''; - } else { - $coupon_discount_amounts = ( is_object( WC()->cart ) && isset( WC()->cart->coupon_discount_amounts ) ) ? WC()->cart->coupon_discount_amounts : array(); - if ( ! is_array( $coupon_discount_amounts ) ) { - $coupon_discount_amounts = array(); - } - if ( empty( $coupon_discount_amounts[ $coupon_code ] ) ) { - $coupon_discount_amounts[ $coupon_code ] = $discount; - } else { - $coupon_discount_amounts[ $coupon_code ] += $discount; - } - WC()->cart->coupon_discount_amounts = $coupon_discount_amounts; - } - } - - if ( isset( WC()->session->reload_checkout ) ) { // reload_checkout is triggered when customer is registered from checkout. - unset( WC()->cart->smart_coupon_credit_used ); // reset store credit used data for re-calculation. - } - - $smart_coupon_credit_used = ( is_object( WC()->cart ) && isset( WC()->cart->smart_coupon_credit_used ) ) ? WC()->cart->smart_coupon_credit_used : array(); - - if ( ! is_array( $smart_coupon_credit_used ) ) { - $smart_coupon_credit_used = array(); - } - if ( empty( $smart_coupon_credit_used[ $coupon_code ] ) || ( $cart_contains_subscription && ( 'combined_total' === $calculation_type || 'sign_up_fee_total' === $calculation_type ) ) ) { - $smart_coupon_credit_used[ $coupon_code ] = $discount; - } else { - $smart_coupon_credit_used[ $coupon_code ] += $discount; - } - WC()->cart->smart_coupon_credit_used = $smart_coupon_credit_used; - - } - } - - - - /** - * Apply store credit discount in order during recalculation - * - * @param float $total The total. - * @param WC_Order $order The order object. - * @return float $total - */ - public function smart_coupons_order_discounted_total( $total = 0, $order = null ) { - - if ( ! $this->is_wc_gte_30() ) { - - $is_proceed = check_ajax_referer( 'calc-totals', 'security', false ); - - if ( ! $is_proceed ) { - return $total; - } - - $called_by = ( ! empty( $_POST['action'] ) ) ? wc_clean( wp_unslash( $_POST['action'] ) ) : ''; // phpcs:ignore - - if ( 'woocommerce_calc_line_taxes' !== $called_by ) { - return $total; - } - } - - if ( empty( $order ) ) { - return $total; - } - - $coupons = ( is_object( $order ) && is_callable( array( $order, 'get_items' ) ) ) ? $order->get_items( 'coupon' ) : array(); - - if ( ! empty( $coupons ) ) { - foreach ( $coupons as $coupon ) { - $code = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - if ( empty( $code ) ) { - continue; - } - $_coupon = new WC_Coupon( $code ); - $discount_type = ( is_object( $_coupon ) && is_callable( array( $_coupon, 'get_discount_type' ) ) ) ? $_coupon->get_discount_type() : ''; - if ( ! empty( $discount_type ) && 'smart_coupon' === $discount_type ) { - $discount = $this->get_amount( $_coupon, true, $order ); - $applied_discount = min( $total, $discount ); - if ( $this->is_wc_gte_30() ) { - $coupon->set_discount( $applied_discount ); - $coupon->save(); - } - $total = $total - $applied_discount; - } - } - } - - return $total; - } - - /** - * Add tool for clearing cache - * - * @param array $tools Existing tools. - * @return array $tools - */ - public function clear_cache_tool( $tools = array() ) { - - $tools['wc_sc_clear_cache'] = array( - 'name' => __( 'WooCommerce Smart Coupons Cache', 'woocommerce-smart-coupons' ), - 'button' => __( 'Clear Smart Coupons Cache', 'woocommerce-smart-coupons' ), - 'desc' => __( 'This tool will clear the cache created by WooCommerce Smart Coupons.', 'woocommerce-smart-coupons' ), - 'callback' => array( - $this, - 'clear_cache', - ), - ); - - return $tools; - } - - /** - * Clear cache - * - * @return string $message - */ - public function clear_cache() { - - $message = ( is_callable( array( 'WC_SC_Act_Deact', 'clear_cache' ) ) ) ? WC_SC_Act_Deact::clear_cache() : ''; - - return $message; - } - - /** - * WooCommerce Checkout Update Order Review - * - * @param array $post_data The post data. - */ - public function woocommerce_checkout_update_order_review( $post_data = array() ) { - - wp_parse_str( $post_data, $posted_data ); - - if ( ! empty( $posted_data['billing_email'] ) ) { - $applied_coupons = ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'get_applied_coupons' ) ) ) ? WC()->cart->get_applied_coupons() : array(); - if ( ! empty( $applied_coupons ) ) { - if ( empty( $_REQUEST['billing_email'] ) ) { // phpcs:ignore - $_REQUEST['billing_email'] = $posted_data['billing_email']; - } - foreach ( $applied_coupons as $coupon_code ) { - $coupon = new WC_Coupon( $coupon_code ); - $is_valid = $this->is_user_usage_limit_valid( true, $coupon ); - if ( true !== $is_valid ) { - WC()->cart->remove_coupon( $coupon_code ); - /* translators: The coupon code */ - wc_add_notice( sprintf( __( 'Coupon %s is valid for a new user only, hence removed.', 'woocommerce-smart-coupons' ), '' . $coupon_code . '' ), 'error' ); - } - } - } - } - - } - - /** - * Function to return validity of Store Credit / Gift Certificate - * - * @param boolean $valid Coupon validity. - * @param WC_Coupon $coupon Coupon object. - * @param WC_Discounts $discounts Discounts object. - * @return boolean $valid TRUE if smart coupon valid, FALSE otherwise - */ - public function is_smart_coupon_valid( $valid, $coupon, $discounts = null ) { - - if ( $this->is_wc_gte_30() ) { - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - $coupon_code = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - $coupon_amount = $this->get_amount( $coupon, true ); - - if ( 'smart_coupon' !== $discount_type ) { - return $valid; - } - - $applied_coupons = ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'get_applied_coupons' ) ) ) ? WC()->cart->get_applied_coupons() : array(); - - if ( empty( $applied_coupons ) || ( ! empty( $applied_coupons ) && ! in_array( $coupon_code, $applied_coupons, true ) ) ) { - return $valid; - } - - if ( is_wc_endpoint_url( 'order-received' ) ) { - return $valid; - } - - $is_valid_coupon_amount = ( $coupon_amount <= 0 ) ? false : true; - - $is_valid_coupon_amount = apply_filters( - 'wc_sc_validate_coupon_amount', - $is_valid_coupon_amount, - array( - 'coupon' => $coupon, - 'discounts' => $discounts, - 'coupon_amount' => $coupon_amount, - 'discount_type' => $discount_type, - 'coupon_code' => $coupon_code, - ) - ); - - if ( $valid && ! $is_valid_coupon_amount ) { - WC()->cart->remove_coupon( $coupon_code ); - /* translators: The coupon code */ - wc_add_notice( sprintf( __( 'Coupon removed. There is no credit remaining in %s.', 'woocommerce-smart-coupons' ), '' . $coupon_code . '' ), 'error' ); - return false; - } - - return $valid; - } - - /** - * Strict check if user is valid as per usage limit - * - * @param boolean $is_valid Is valid. - * @param WC_Coupon $coupon The coupon object. - * @param WC_Discounts $discounts The discounts object. - * @return boolean - * @throws Exception When coupon is not valid as per the usage limit. - */ - public function is_user_usage_limit_valid( $is_valid = false, $coupon = null, $discounts = null ) { - - if ( is_admin() && ( ! defined( 'DOING_AJAX' ) || DOING_AJAX !== true ) ) { - return $is_valid; - } - - if ( true !== $is_valid ) { - return $is_valid; - } - - global $wpdb; - - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - } - - $for_new_user = ( $this->is_callable( $coupon, 'get_meta' ) ) ? $coupon->get_meta( 'sc_restrict_to_new_user' ) : get_post_meta( $coupon_id, 'sc_restrict_to_new_user', true ); - - if ( 'yes' === $for_new_user ) { - - $failed_notice = __( 'This coupon is valid for the first order only.', 'woocommerce-smart-coupons' ); - - $user_id_1 = 0; - $user_id_2 = 0; - $user_id_3 = 0; - - $current_user = wp_get_current_user(); - - $email = ( ! empty( $current_user->data->user_email ) ) ? $current_user->data->user_email : ''; - - $email = ( ! empty( $_REQUEST['billing_email'] ) ) ? sanitize_email( wp_unslash( $_REQUEST['billing_email'] ) ) : $email; // phpcs:ignore - - $valid_order_statuses = get_option( 'wc_sc_valid_order_statuses_for_coupon_auto_generation', array() ); - $statuses_placeholder = array(); - if ( ! empty( $valid_order_statuses ) ) { - $valid_order_statuses = array_map( - function( $status ) { - return 'wc-' . $status; - }, - $valid_order_statuses - ); - $how_many_statuses = count( $valid_order_statuses ); - $statuses_placeholder = array_fill( 0, $how_many_statuses, '%s' ); - } - - if ( ! empty( $email ) && is_email( $email ) ) { - - $order_id = wp_cache_get( 'wc_sc_order_id_by_billing_email_' . sanitize_key( $email ), 'woocommerce_smart_coupons' ); - - if ( false === $order_id ) { - $query = $wpdb->prepare( - "SELECT ID - FROM $wpdb->posts AS p - LEFT JOIN $wpdb->postmeta AS pm - ON ( p.ID = pm.post_id AND pm.meta_key = %s ) - WHERE p.post_type = %s - AND pm.meta_value = %s", - '_billing_email', - 'shop_order', - $email - ); - - if ( ! empty( $valid_order_statuses ) && ! empty( $statuses_placeholder ) ) { - // phpcs:disable - $query .= $wpdb->prepare( - ' AND p.post_status IN (' . implode( ',', $statuses_placeholder ) . ')', - $valid_order_statuses - ); - // phpcs:enable - } - - $order_id = $wpdb->get_var( $query ); // phpcs:ignore - - wp_cache_set( 'wc_sc_order_id_by_billing_email_' . sanitize_key( $email ), $order_id, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_order_id_by_billing_email_' . sanitize_key( $email ) ); - } - - if ( ! empty( $order_id ) ) { - if ( defined( 'WC_DOING_AJAX' ) && WC_DOING_AJAX === true ) { - $is_valid = false; - } else { - throw new Exception( $failed_notice ); - } - } - - $user_id_1 = wp_cache_get( 'wc_sc_user_id_by_user_email_' . sanitize_key( $email ), 'woocommerce_smart_coupons' ); - if ( false === $user_id_1 ) { - $user_id_1 = $wpdb->get_var( // phpcs:ignore - $wpdb->prepare( - "SELECT ID - FROM {$wpdb->base_prefix}users - WHERE user_email = %s", - $email - ) - ); - wp_cache_set( 'wc_sc_user_id_by_user_email_' . sanitize_key( $email ), $user_id_1, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_user_id_by_user_email_' . sanitize_key( $email ) ); - } - - $user_id_2 = wp_cache_get( 'wc_sc_user_id_by_billing_email_' . sanitize_key( $email ), 'woocommerce_smart_coupons' ); - if ( false === $user_id_2 ) { - $user_id_2 = $wpdb->get_var( // phpcs:ignore - $wpdb->prepare( - "SELECT user_id - FROM {$wpdb->base_prefix}usermeta - WHERE meta_key = %s - AND meta_value = %s", - 'billing_email', - $email - ) - ); - wp_cache_set( 'wc_sc_user_id_by_billing_email_' . sanitize_key( $email ), $user_id_2, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_user_id_by_billing_email_' . sanitize_key( $email ) ); - } - } - - $user_id_3 = get_current_user_id(); - - $user_ids = array( $user_id_1, $user_id_2, $user_id_3 ); - $user_ids = array_unique( array_filter( $user_ids ) ); - - if ( ! empty( $user_ids ) ) { - - $unique_user_ids = array_unique( $user_ids ); - - $order_id = wp_cache_get( 'wc_sc_order_for_user_id_' . implode( '_', $unique_user_ids ), 'woocommerce_smart_coupons' ); - - if ( false === $order_id ) { - $query = $wpdb->prepare( - "SELECT ID - FROM $wpdb->posts AS p - LEFT JOIN $wpdb->postmeta AS pm - ON ( p.ID = pm.post_id AND pm.meta_key = %s ) - WHERE p.post_type = %s", - '_customer_user', - 'shop_order' - ); - - if ( ! empty( $valid_order_statuses ) && ! empty( $statuses_placeholder ) ) { - // phpcs:disable - $query .= $wpdb->prepare( - ' AND p.post_status IN (' . implode( ',', $statuses_placeholder ) . ')', - $valid_order_statuses - ); - // phpcs:enable - } - - $how_many_user_ids = count( $user_ids ); - $id_placeholder = array_fill( 0, $how_many_user_ids, '%s' ); - - // phpcs:disable - $query .= $wpdb->prepare( - ' AND pm.meta_value IN (' . implode( ',', $id_placeholder ) . ')', - $user_ids - ); - // phpcs:enable - - $order_id = $wpdb->get_var( $query ); // phpcs:ignore - - wp_cache_set( 'wc_sc_order_for_user_id_' . implode( '_', $unique_user_ids ), $order_id, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_order_for_user_id_' . implode( '_', $unique_user_ids ) ); - } - - if ( ! empty( $order_id ) ) { - if ( defined( 'WC_DOING_AJAX' ) && WC_DOING_AJAX === true ) { - $is_valid = false; - } else { - throw new Exception( $failed_notice ); - } - } - } - } - - return $is_valid; - } - - /** - * Locate template for Smart Coupons - * - * @param string $template_name The template name. - * @param mixed $template Default template. - * @return mixed $template - */ - public function locate_template_for_smart_coupons( $template_name = '', $template = '' ) { - - $default_path = untrailingslashit( plugin_dir_path( WC_SC_PLUGIN_FILE ) ) . '/templates/'; - - $plugin_base_dir = substr( plugin_basename( WC_SC_PLUGIN_FILE ), 0, strpos( plugin_basename( WC_SC_PLUGIN_FILE ), '/' ) + 1 ); - - // Look within passed path within the theme - this is priority. - $template = locate_template( - array( - 'woocommerce/' . $plugin_base_dir . $template_name, - $plugin_base_dir . $template_name, - $template_name, - ) - ); - - // Get default template. - if ( ! $template ) { - $template = $default_path . $template_name; - } - - return $template; - } - - /** - * Function to get template base directory for Smart Coupons' email templates - * - * @param string $template_name Template name. - * @return string $template_base_dir Base directory for Smart Coupons' email templates. - */ - public function get_template_base_dir( $template_name = '' ) { - - $template_base_dir = ''; - $plugin_base_dir = substr( plugin_basename( WC_SC_PLUGIN_FILE ), 0, strpos( plugin_basename( WC_SC_PLUGIN_FILE ), '/' ) + 1 ); - $wc_sc_base_dir = 'woocommerce/' . $plugin_base_dir; - - // First locate the template in woocommerce/woocommerce-smart-coupons folder of active theme. - $template = locate_template( - array( - $wc_sc_base_dir . $template_name, - ) - ); - - if ( ! empty( $template ) ) { - $template_base_dir = $wc_sc_base_dir; - } else { - // If not found then locate the template in woocommerce-smart-coupons folder of active theme. - $template = locate_template( - array( - $plugin_base_dir . $template_name, - ) - ); - if ( ! empty( $template ) ) { - $template_base_dir = $plugin_base_dir; - } - } - - $template_base_dir = apply_filters( 'wc_sc_template_base_dir', $template_base_dir, $template_name ); - - return $template_base_dir; - } - - /** - * Check whether credit is sent or not - * - * @param string $email_id The email address. - * @param WC_Coupon $coupon The coupon object. - * @return boolean - */ - public function is_credit_sent( $email_id, $coupon ) { - - global $smart_coupon_codes; - - if ( isset( $smart_coupon_codes[ $email_id ] ) && count( $smart_coupon_codes[ $email_id ] ) > 0 ) { - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - } - foreach ( $smart_coupon_codes[ $email_id ] as $generated_coupon_details ) { - if ( $generated_coupon_details['parent'] === $coupon_id ) { - return true; - } - } - } - - return false; - - } - - /** - * Generate unique string to be used as coupon code. Also add prefix or suffix if already set - * - * @param string $email The email address. - * @param WC_Coupon $coupon The coupon object. - * @return string $unique_code - */ - public function generate_unique_code( $email = '', $coupon = '' ) { - $unique_code = ''; - srand( (double) microtime( true ) * 1000000 ); // phpcs:ignore - - $coupon_code_length = $this->get_coupon_code_length(); - - $chars = array_diff( array_merge( range( 'a', 'z' ), range( '0', '9' ) ), array( 'a', 'e', 'i', 'o', 'u' ) ); - $chars = apply_filters( - 'wc_sc_coupon_code_allowed_characters', - array_values( $chars ), - array( - 'source' => $this, - 'email' => $email, - 'coupon_object' => $coupon, - 'coupon_code_length' => $coupon_code_length, - ) - ); - - $numbers = array_values( array_filter( $chars, 'is_numeric' ) ); - $alphabets = ( count( $chars ) !== count( $numbers ) ) ? array_values( array_diff( $chars, $numbers ) ) : array(); - - if ( empty( $numbers ) || empty( $alphabets ) ) { - $chars = array_values( array_merge( $alphabets, $numbers ) ); - for ( $rand = 1; $rand <= $coupon_code_length; $rand++ ) { - $random = rand( 0, count( $chars ) - 1 ); // phpcs:ignore - $unique_code .= $chars[ $random ]; - } - } else { - for ( $rand = 1, $char_count = 0, $num_count = 0; $rand <= $coupon_code_length; $rand++ ) { - if ( $char_count >= 2 ) { - $random = rand( 0, count( $numbers ) - 1 ); // phpcs:ignore - $unique_code .= $numbers[ $random ]; - $char_count = 0; - $num_count++; - } elseif ( $num_count >= 1 ) { - $random = rand( 0, count( $alphabets ) - 1 ); // phpcs:ignore - $unique_code .= $alphabets[ $random ]; - $num_count = 0; - $char_count++; - } else { - $random = rand( 0, count( $chars ) - 1 ); // phpcs:ignore - $selected_char = $chars[ $random ]; - $unique_code .= $selected_char; - if ( is_numeric( $selected_char ) ) { - $num_count++; - } else { - $char_count++; - } - } - } - } - - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - } - - if ( $this->is_callable( $coupon, 'get_meta' ) ) { - if ( 'yes' === $coupon->get_meta( 'auto_generate_coupon' ) ) { - $prefix = $coupon->get_meta( 'coupon_title_prefix' ); - $suffix = $coupon->get_meta( 'coupon_title_suffix' ); - $unique_code = $prefix . $unique_code . $suffix; - } - } else { - if ( ! empty( $coupon_id ) && get_post_meta( $coupon_id, 'auto_generate_coupon', true ) === 'yes' ) { - $prefix = get_post_meta( $coupon_id, 'coupon_title_prefix', true ); - $suffix = get_post_meta( $coupon_id, 'coupon_title_suffix', true ); - $unique_code = $prefix . $unique_code . $suffix; - } - } - - return apply_filters( - 'wc_sc_generate_unique_coupon_code', - $unique_code, - array( - 'email' => $email, - 'coupon' => $coupon, - ) - ); - } - - /** - * Function for generating Gift Certificate - * - * @param mixed $email The email address. - * @param float $amount The amount. - * @param int $order_id The order id. - * @param WC_Coupon $coupon The coupon object. - * @param string $discount_type The discount type. - * @param array $gift_certificate_receiver_name Receiver name. - * @param string $message_from_sender Message from sender. - * @param string $gift_certificate_sender_name Sender name. - * @param string $gift_certificate_sender_email Sender email. - * @param string $sending_timestamp timestamp for scheduled sending. - * @return array of generated coupon details - */ - public function generate_smart_coupon( $email, $amount, $order_id = '', $coupon = '', $discount_type = 'smart_coupon', $gift_certificate_receiver_name = '', $message_from_sender = '', $gift_certificate_sender_name = '', $gift_certificate_sender_email = '', $sending_timestamp = '' ) { - return apply_filters( 'generate_smart_coupon_action', $email, $amount, $order_id, $coupon, $discount_type, $gift_certificate_receiver_name, $message_from_sender, $gift_certificate_sender_name, $gift_certificate_sender_email, $sending_timestamp ); - } - - /** - * Function for generating Gift Certificate - * - * @param mixed $email The email address. - * @param float $amount The amount. - * @param int $order_id The order id. - * @param WC_Coupon $coupon The coupon object. - * @param string $discount_type The discount type. - * @param array $gift_certificate_receiver_name Receiver name. - * @param string $message_from_sender Message from sender. - * @param string $gift_certificate_sender_name Sender name. - * @param string $gift_certificate_sender_email Sender email. - * @param string $sending_timestamp timestamp for scheduled sending. - * @return array $smart_coupon_codes associative array containing generated coupon details - */ - public function generate_smart_coupon_action( $email, $amount, $order_id = '', $coupon = '', $discount_type = 'smart_coupon', $gift_certificate_receiver_name = '', $message_from_sender = '', $gift_certificate_sender_name = '', $gift_certificate_sender_email = '', $sending_timestamp = '' ) { - - if ( '' === $email ) { - return false; - } - - global $smart_coupon_codes; - - $order_id = ( ! empty( $order_id ) ) ? absint( $order_id ) : 0; - $order = ( function_exists( 'wc_get_order' ) && ! empty( $order_id ) ) ? wc_get_order( $order_id ) : null; - - $is_callable_order_get_meta = $this->is_callable( $order, 'get_meta' ); - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - - if ( $this->is_wc_gte_30() ) { - $coupon_id = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - $is_free_shipping = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_free_shipping' ) ) ) ? ( ( $coupon->get_free_shipping() ) ? 'yes' : 'no' ) : ''; - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - $expiry_date = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_date_expires' ) ) ) ? $coupon->get_date_expires() : ''; - $coupon_product_ids = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_product_ids' ) ) ) ? $coupon->get_product_ids() : ''; - $coupon_product_categories = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_product_categories' ) ) ) ? $coupon->get_product_categories() : ''; - $coupon_excluded_product_ids = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_excluded_product_ids' ) ) ) ? $coupon->get_excluded_product_ids() : ''; - $coupon_excluded_product_categories = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_excluded_product_categories' ) ) ) ? $coupon->get_excluded_product_categories() : ''; - $coupon_minimum_amount = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_minimum_amount' ) ) ) ? $coupon->get_minimum_amount() : ''; - $coupon_maximum_amount = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_maximum_amount' ) ) ) ? $coupon->get_maximum_amount() : ''; - $coupon_usage_limit = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_usage_limit' ) ) ) ? $coupon->get_usage_limit() : ''; - $coupon_usage_limit_per_user = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_usage_limit_per_user' ) ) ) ? $coupon->get_usage_limit_per_user() : ''; - $coupon_limit_usage_to_x_items = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_limit_usage_to_x_items' ) ) ) ? $coupon->get_limit_usage_to_x_items() : ''; - $is_exclude_sale_items = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_exclude_sale_items' ) ) ) ? ( ( $coupon->get_exclude_sale_items() ) ? 'yes' : 'no' ) : ''; - $is_individual_use = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_individual_use' ) ) ) ? ( ( $coupon->get_individual_use() ) ? 'yes' : 'no' ) : ''; - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $expiry_date = ( ! empty( $coupon->expiry_date ) ) ? $coupon->expiry_date : ''; - $coupon_product_ids = ( ! empty( $coupon->product_ids ) ) ? $coupon->product_ids : ''; - $coupon_product_categories = ( ! empty( $coupon->product_categories ) ) ? $coupon->product_categories : ''; - $coupon_excluded_product_ids = ( ! empty( $coupon->exclude_product_ids ) ) ? $coupon->exclude_product_ids : ''; - $coupon_excluded_product_categories = ( ! empty( $coupon->exclude_product_categories ) ) ? $coupon->exclude_product_categories : ''; - $coupon_minimum_amount = ( ! empty( $coupon->minimum_amount ) ) ? $coupon->minimum_amount : ''; - $coupon_maximum_amount = ( ! empty( $coupon->maximum_amount ) ) ? $coupon->maximum_amount : ''; - $coupon_usage_limit = ( ! empty( $coupon->usage_limit ) ) ? $coupon->usage_limit : ''; - $coupon_usage_limit_per_user = ( ! empty( $coupon->usage_limit_per_user ) ) ? $coupon->usage_limit_per_user : ''; - $coupon_limit_usage_to_x_items = ( ! empty( $coupon->limit_usage_to_x_items ) ) ? $coupon->limit_usage_to_x_items : ''; - $is_exclude_sale_items = ( ! empty( $coupon->exclude_sale_items ) ) ? $coupon->exclude_sale_items : ''; - $is_individual_use = ( ! empty( $coupon->individual_use ) ) ? $coupon->individual_use : ''; - } - - if ( ! is_array( $email ) ) { - $emails = array( $email => 1 ); - } else { - $temp_email = ( true === $is_callable_order_get_meta ) ? $order->get_meta( 'temp_gift_card_receivers_emails' ) : get_post_meta( $order_id, 'temp_gift_card_receivers_emails', true ); - if ( ! empty( $temp_email ) && count( $temp_email ) > 0 ) { - $email = $temp_email; - } - $emails = ( ! empty( $coupon_id ) ) ? array_count_values( $email[ $coupon_id ] ) : array(); - } - - if ( ! empty( $order_id ) ) { - $receivers_messages = ( true === $is_callable_order_get_meta ) ? $order->get_meta( 'gift_receiver_message' ) : get_post_meta( $order_id, 'gift_receiver_message', true ); - $schedule_gift_sending = ( true === $is_callable_order_get_meta ) ? $order->get_meta( 'wc_sc_schedule_gift_sending' ) : get_post_meta( $order_id, 'wc_sc_schedule_gift_sending', true ); - $sending_timestamps = ( true === $is_callable_order_get_meta ) ? $order->get_meta( 'gift_sending_timestamp' ) : get_post_meta( $order_id, 'gift_sending_timestamp', true ); - } - - foreach ( $emails as $email_id => $qty ) { - - if ( $this->is_credit_sent( $email_id, $coupon ) ) { - continue; - } - - $smart_coupon_code = $this->generate_unique_code( $email_id, $coupon ); - - $coupon_post = ( ! empty( $coupon_id ) ) ? get_post( $coupon_id ) : new stdClass(); - - $smart_coupon_args = array( - 'post_title' => strtolower( $smart_coupon_code ), - 'post_excerpt' => ( ! empty( $coupon_post->post_excerpt ) ) ? $coupon_post->post_excerpt : '', - 'post_content' => '', - 'post_status' => 'publish', - 'post_author' => 1, - 'post_type' => 'shop_coupon', - 'post_parent' => ! empty( $coupon_id ) ? absint( $coupon_id ) : 0, - ); - - $should_schedule = isset( $schedule_gift_sending ) && 'yes' === $schedule_gift_sending && $this->is_valid_timestamp( $sending_timestamp ) ? true : false; - - if ( $should_schedule ) { - $smart_coupon_args['post_date_gmt'] = gmdate( 'Y-m-d H:i:s', $sending_timestamp ); - } - - $smart_coupon = new WC_Coupon(); - $smart_coupon->set_code( $smart_coupon_args['post_title'] ); - $smart_coupon->set_status( $smart_coupon_args['post_status'] ); - $smart_coupon->set_description( $smart_coupon_args['post_excerpt'] ); - - $smart_coupon_id = $smart_coupon->save(); - - if ( ! empty( $smart_coupon_id ) ) { - $smart_coupon_args = array_diff_key( $smart_coupon_args, array_flip( array( 'post_excerpt', 'post_title', 'post_status', 'post_type' ) ) ); - $smart_coupon_args['ID'] = $smart_coupon_id; - wp_update_post( $smart_coupon_args ); - } - - $smart_coupon_id = absint( $smart_coupon_id ); - - $smart_coupon = new WC_Coupon( $smart_coupon_id ); - - $is_callable_smart_coupon_update_meta = $this->is_callable( $smart_coupon, 'update_meta_data' ); - - $type = ( ! empty( $discount_type ) ) ? $discount_type : 'smart_coupon'; - $individual_use = ( ! empty( $is_individual_use ) ) ? $is_individual_use : 'no'; - $minimum_amount = ( ! empty( $coupon_minimum_amount ) ) ? $coupon_minimum_amount : ''; - $maximum_amount = ( ! empty( $coupon_maximum_amount ) ) ? $coupon_maximum_amount : ''; - $product_ids = ( ! empty( $coupon_product_ids ) ) ? implode( ',', $coupon_product_ids ) : ''; - $exclude_product_ids = ( ! empty( $coupon_excluded_product_ids ) ) ? implode( ',', $coupon_excluded_product_ids ) : ''; - $usage_limit = ( ! empty( $coupon_usage_limit ) ) ? $coupon_usage_limit : ''; - $usage_limit_per_user = ( ! empty( $coupon_usage_limit_per_user ) ) ? $coupon_usage_limit_per_user : ''; - $limit_usage_to_x_items = ( ! empty( $coupon_limit_usage_to_x_items ) ) ? $coupon_limit_usage_to_x_items : ''; - $free_shipping = ( ! empty( $is_free_shipping ) ) ? $is_free_shipping : 'no'; - $product_categories = ( ! empty( $coupon_product_categories ) ) ? $coupon_product_categories : array(); - $exclude_product_categories = ( ! empty( $coupon_excluded_product_categories ) ) ? $coupon_excluded_product_categories : array(); - $sc_coupon_validity = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'sc_coupon_validity' ) : ( ( ! empty( $coupon_id ) ) ? get_post_meta( $coupon_id, 'sc_coupon_validity', true ) : '' ); - $is_disable_email_restriction = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'sc_disable_email_restriction' ) : ( ( ! empty( $coupon_id ) ) ? get_post_meta( $coupon_id, 'sc_disable_email_restriction', true ) : '' ); - $sc_restrict_to_new_user = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'sc_restrict_to_new_user' ) : get_post_meta( $coupon_id, 'sc_restrict_to_new_user', true ); - $wc_sc_max_discount = $this->get_post_meta( $coupon_id, 'wc_sc_max_discount', true, true, $order ); - - if ( $this->is_wc_gte_30() && $expiry_date instanceof WC_DateTime ) { - $expiry_date = ( is_callable( array( $expiry_date, 'getTimestamp' ) ) ) ? $expiry_date->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - - if ( ! empty( $coupon_id ) && ! empty( $sc_coupon_validity ) ) { - $is_parent_coupon_expired = ( ! empty( $expiry_date ) && ( $expiry_date < time() ) ) ? true : false; - if ( ! $is_parent_coupon_expired ) { - $validity_suffix = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( 'validity_suffix' ) : get_post_meta( $coupon_id, 'validity_suffix', true ); - // In case of scheduled coupon, expiry date is calculated from scheduled publish date. - if ( isset( $smart_coupon_args['post_date_gmt'] ) ) { - $expiry_date = strtotime( $smart_coupon_args['post_date_gmt'] . "+$sc_coupon_validity $validity_suffix" ); - } else { - $expiry_date = strtotime( "+$sc_coupon_validity $validity_suffix" ); - } - } - } - - if ( $this->is_wc_gte_30() ) { - $expiry_date = $this->get_date_expires_value( $expiry_date ); - if ( true === $is_callable_smart_coupon_update_meta ) { - $smart_coupon->set_date_expires( $expiry_date ); - } else { - update_post_meta( $smart_coupon_id, 'date_expires', $expiry_date ); - } - } else { - $expiry_date = ( ! empty( $expiry_date ) ) ? gmdate( 'Y-m-d', intval( $expiry_date ) + $this->wc_timezone_offset() ) : ''; - if ( true === $is_callable_smart_coupon_update_meta ) { - $smart_coupon->update_meta_data( 'expiry_date', $expiry_date ); - } else { - update_post_meta( $smart_coupon_id, 'expiry_date', $expiry_date ); - } - } - - if ( 'smart_coupon' === $type ) { - $this->update_post_meta( $smart_coupon_id, 'wc_sc_original_amount', $amount, false, $order ); - } - - if ( true === $is_callable_smart_coupon_update_meta ) { - $smart_coupon->set_amount( $amount ); - $smart_coupon->set_excluded_product_ids( $exclude_product_ids ); - $smart_coupon->set_excluded_product_categories( $exclude_product_categories ); - $smart_coupon->set_discount_type( $type ); - $smart_coupon->set_individual_use( $this->wc_string_to_bool( $individual_use ) ); - $smart_coupon->set_minimum_amount( $minimum_amount ); - $smart_coupon->set_maximum_amount( $maximum_amount ); - $smart_coupon->set_product_ids( $product_ids ); - $smart_coupon->set_usage_limit( $usage_limit ); - $smart_coupon->set_usage_limit_per_user( $usage_limit_per_user ); - $smart_coupon->set_limit_usage_to_x_items( $limit_usage_to_x_items ); - $smart_coupon->set_free_shipping( $this->wc_string_to_bool( $free_shipping ) ); - $smart_coupon->set_product_categories( $product_categories ); - $smart_coupon->set_exclude_sale_items( $this->wc_string_to_bool( $is_exclude_sale_items ) ); - $smart_coupon->update_meta_data( 'sc_restrict_to_new_user', $sc_restrict_to_new_user ); - if ( ! empty( $order_id ) ) { - $smart_coupon->update_meta_data( 'generated_from_order_id', $order_id ); - } - if ( empty( $is_disable_email_restriction ) || 'no' === $is_disable_email_restriction ) { - // Update customer_email now if coupon is not scheduled otherwise it would be updated by action scheduler later on. - if ( ! $should_schedule ) { - $smart_coupon->set_email_restrictions( array( $email_id ) ); - } - } - } else { - update_post_meta( $smart_coupon_id, 'discount_type', $type ); - update_post_meta( $smart_coupon_id, 'coupon_amount', $amount ); - update_post_meta( $smart_coupon_id, 'individual_use', $individual_use ); - update_post_meta( $smart_coupon_id, 'minimum_amount', $minimum_amount ); - update_post_meta( $smart_coupon_id, 'maximum_amount', $maximum_amount ); - update_post_meta( $smart_coupon_id, 'product_ids', $product_ids ); - update_post_meta( $smart_coupon_id, 'exclude_product_ids', $exclude_product_ids ); - update_post_meta( $smart_coupon_id, 'usage_limit', $usage_limit ); - update_post_meta( $smart_coupon_id, 'usage_limit_per_user', $usage_limit_per_user ); - update_post_meta( $smart_coupon_id, 'limit_usage_to_x_items', $limit_usage_to_x_items ); - update_post_meta( $smart_coupon_id, 'free_shipping', $free_shipping ); - update_post_meta( $smart_coupon_id, 'product_categories', $product_categories ); - update_post_meta( $smart_coupon_id, 'exclude_product_categories', $exclude_product_categories ); - update_post_meta( $smart_coupon_id, 'exclude_sale_items', $is_exclude_sale_items ); - update_post_meta( $smart_coupon_id, 'sc_restrict_to_new_user', $sc_restrict_to_new_user ); - if ( ! empty( $order_id ) ) { - update_post_meta( $smart_coupon_id, 'generated_from_order_id', $order_id ); - } - if ( empty( $is_disable_email_restriction ) || 'no' === $is_disable_email_restriction ) { - // Update customer_email now if coupon is not scheduled otherwise it would be updated by action scheduler later on. - if ( ! $should_schedule ) { - update_post_meta( $smart_coupon_id, 'customer_email', array( $email_id ) ); - } - } - } - - if ( ! $this->is_wc_gte_30() ) { - $apply_before_tax = ( ! empty( $coupon->apply_before_tax ) ) ? $coupon->apply_before_tax : 'no'; - if ( true === $is_callable_smart_coupon_update_meta ) { - $smart_coupon->update_meta_data( 'apply_before_tax', $apply_before_tax ); - } else { - update_post_meta( $smart_coupon_id, 'apply_before_tax', $apply_before_tax ); - } - } - - // Add terms to auto-generated if found in parent coupon. - $coupon_terms = get_the_terms( $coupon_id, 'sc_coupon_category' ); - if ( ! empty( $coupon_terms ) ) { - $term_ids = array_column( $coupon_terms, 'term_id' ); - wp_set_object_terms( $smart_coupon_id, $term_ids, 'sc_coupon_category', false ); - } - - if ( ! empty( $wc_sc_max_discount ) ) { - $this->update_post_meta( $smart_coupon_id, 'wc_sc_max_discount', $wc_sc_max_discount, true, $order ); - } - - if ( $this->is_wc_gte_32() ) { - $wc_sc_expiry_time = ( true === $is_callable_coupon_get_meta ) ? (int) $coupon->get_meta( 'wc_sc_expiry_time' ) : (int) get_post_meta( $coupon_id, 'wc_sc_expiry_time', true ); - if ( ! empty( $wc_sc_expiry_time ) ) { - if ( true === $is_callable_smart_coupon_update_meta ) { - $smart_coupon->update_meta_data( 'wc_sc_expiry_time', $wc_sc_expiry_time ); - } else { - update_post_meta( $smart_coupon_id, 'wc_sc_expiry_time', $wc_sc_expiry_time ); - } - } - } - - if ( $this->is_callable( $smart_coupon, 'save' ) ) { - $smart_coupon->save(); - } - - /** - * Hook for 3rd party developers to add data in generated coupon - * - * New coupon id new_coupon_id Newly generated coupon post id - * Reference coupon ref_coupon This is the coupon from which meta will be copied to newly created coupon - */ - do_action( - 'wc_sc_new_coupon_generated', - array( - 'new_coupon_id' => $smart_coupon_id, - 'ref_coupon' => $coupon, - ) - ); - - $generated_coupon_details = array( - 'parent' => ( ! empty( $coupon_id ) ) ? $coupon_id : 0, - 'code' => $smart_coupon_code, - 'amount' => $amount, - ); - - $smart_coupon_codes[ $email_id ][] = $generated_coupon_details; - - if ( ! empty( $order_id ) ) { - $is_gift = ( true === $is_callable_order_get_meta ) ? $order->get_meta( 'is_gift' ) : get_post_meta( $order_id, 'is_gift', true ); - } else { - $is_gift = 'no'; - } - - if ( is_array( $email ) && ! empty( $coupon_id ) && isset( $email[ $coupon_id ] ) ) { - $message_index = array_search( $email_id, $email[ $coupon_id ], true ); - if ( false !== $message_index && isset( $receivers_messages[ $coupon_id ][ $message_index ] ) && ! empty( $receivers_messages[ $coupon_id ][ $message_index ] ) ) { - $message_from_sender = $receivers_messages[ $coupon_id ][ $message_index ]; - unset( $email[ $coupon_id ][ $message_index ] ); - $this->update_post_meta( $order_id, 'temp_gift_card_receivers_emails', $email, false, $order ); - } - } - - if ( ( isset( $schedule_gift_sending ) && 'yes' === $schedule_gift_sending && $this->is_valid_timestamp( $sending_timestamp ) ) ) { - $wc_sc_coupon_receiver_details = array( - 'coupon_details' => $generated_coupon_details, - 'gift_certificate_receiver_email' => $email_id, - 'gift_certificate_receiver_name' => $gift_certificate_receiver_name, - 'message_from_sender' => $message_from_sender, - 'gift_certificate_sender_name' => $gift_certificate_sender_name, - 'gift_certificate_sender_email' => $gift_certificate_sender_email, - ); - if ( true === $is_callable_smart_coupon_update_meta ) { - $smart_coupon->update_meta_data( 'wc_sc_coupon_receiver_details', $wc_sc_coupon_receiver_details ); - } else { - update_post_meta( $smart_coupon_id, 'wc_sc_coupon_receiver_details', $wc_sc_coupon_receiver_details ); - } - } else { - $is_send_email = $this->is_email_template_enabled(); - $combine_emails = $this->is_email_template_enabled( 'combine' ); - if ( 'yes' === $is_send_email ) { - if ( 'yes' === $combine_emails ) { - $coupon_receiver_details = ( true === $is_callable_order_get_meta ) ? $order->get_meta( 'sc_coupon_receiver_details' ) : get_post_meta( $order_id, 'sc_coupon_receiver_details', true ); - if ( empty( $coupon_receiver_details ) || ! is_array( $coupon_receiver_details ) ) { - $coupon_receiver_details = array(); - } - $coupon_receiver_details[] = array( - 'code' => $generated_coupon_details['code'], - 'amount' => $amount, - 'email' => $email_id, - 'message' => $message_from_sender, - ); - $this->update_post_meta( $order_id, 'sc_coupon_receiver_details', $coupon_receiver_details, false, $order ); - } else { - $this->sa_email_coupon( array( $email_id => $generated_coupon_details ), $type, $order_id, $gift_certificate_receiver_name, $message_from_sender, $gift_certificate_sender_name, $gift_certificate_sender_email, $is_gift ); - } - } else { - if ( ! empty( $order_id ) ) { - $coupon_receiver_details = ( true === $is_callable_order_get_meta ) ? $order->get_meta( 'sc_coupon_receiver_details' ) : get_post_meta( $order_id, 'sc_coupon_receiver_details', true ); - if ( empty( $coupon_receiver_details ) || ! is_array( $coupon_receiver_details ) ) { - $coupon_receiver_details = array(); - } - $coupon_receiver_details[] = array( - 'code' => $generated_coupon_details['code'], - 'amount' => $amount, - 'email' => $email_id, - 'message' => $message_from_sender, - ); - $this->update_post_meta( $order_id, 'sc_coupon_receiver_details', $coupon_receiver_details, false, $order ); - } - } - } - if ( $this->is_callable( $smart_coupon, 'save' ) ) { - $smart_coupon->save(); - } - } - - return $smart_coupon_codes; - - } - - /** - * Function to set that Smart Coupons plugin is used to auto generate a coupon - * - * @param array $args Data. - */ - public function smart_coupons_plugin_used( $args = array() ) { - - $is_show_review_notice = get_option( 'wc_sc_is_show_review_notice' ); - - if ( false === $is_show_review_notice ) { - update_option( 'wc_sc_is_show_review_notice', time(), 'no' ); - } - - } - - /** - * Add button to export coupons on Coupons admin page - */ - public function woocommerce_restrict_manage_smart_coupons() { - global $typenow, $wp_query, $wp, $woocommerce_smart_coupon; - - if ( 'shop_coupon' !== $typenow ) { - return; - } - - $is_print = get_option( 'smart_coupons_is_print_coupon', 'yes' ); - $is_print = apply_filters( 'wc_sc_admin_show_print_button', wc_string_to_bool( $is_print ), array( 'source' => $woocommerce_smart_coupon ) ); - $print_url = add_query_arg( - array( - 'print-coupons' => 'yes', - 'source' => 'wc-smart-coupons', - 'coupon-codes' => '', - ), - home_url() - ); - wc_product_dropdown_categories( - array( - 'selected' => isset( $wp_query->query_vars['sc_coupon_category'] ) ? $wp_query->query_vars['sc_coupon_category'] : '', - 'taxonomy' => 'sc_coupon_category', - 'name' => 'sc_coupon_category', - 'option_select_text' => __( 'Filter by category', 'woocommerce-smart-coupons' ), - 'hide_empty' => 0, - ) - ); - - ?> - -
              - '; // phpcs:ignore - } - ?> - - - - - -
              - '', - 'post_type' => '', - 'm' => '', - 'posts_per_page' => -1, - 'fields' => 'ids', - ); - - if ( ! empty( $_REQUEST['sc_export_query_args'] ) ) { // phpcs:ignore - parse_str( wc_clean( wp_unslash( $_REQUEST['sc_export_query_args'] ) ), $sc_args ); // phpcs:ignore - } - $args = array_merge( $args, $sc_args ); - - $get_coupon_type = ( ! empty( $_GET['coupon_type'] ) ) ? wc_clean( wp_unslash( $_GET['coupon_type'] ) ) : ''; // phpcs:ignore - $get_post = ( ! empty( $_GET['post'] ) ) ? wc_clean( wp_unslash( $_GET['post'] ) ) : ''; // phpcs:ignore - - if ( isset( $get_coupon_type ) && '' !== $get_coupon_type ) { - $args['meta_query'] = array( // phpcs:ignore - array( - 'key' => 'discount_type', - 'value' => $get_coupon_type, - ), - ); - } - - if ( ! empty( $get_post ) ) { - $args['post__in'] = $get_post; - } - - foreach ( $args as $key => $value ) { - if ( array_key_exists( $key, wc_clean( wp_unslash( $_GET ) ) ) ) { // phpcs:ignore - $args[ $key ] = wc_clean( wp_unslash( $_GET[ $key ] ) ); // phpcs:ignore - } - } - - if ( 'all' === $args['post_status'] ) { - $args['post_status'] = array( 'publish', 'draft', 'pending', 'private', 'future' ); - - } - - $query = new WP_Query( $args ); - - $post_ids = $query->posts; - - $this->export_coupon( '', wc_clean( wp_unslash( $_GET ) ), $post_ids ); // phpcs:ignore - } - } - - /** - * Generate coupon code - * - * @param array $post POST. - * @param array $get GET. - * @param array $post_ids Post ids. - * @param array $coupon_postmeta_headers Coupon postmeta headers. - * @return array $data associative array of generated coupon - */ - public function generate_coupons_code( $post = array(), $get = array(), $post_ids = array(), $coupon_postmeta_headers = array() ) { - global $wpdb, $wp, $wp_query; - - if ( ! empty( $post_ids ) ) { - if ( ! is_array( $post_ids ) ) { - $post_ids = array( $post_ids ); - } - $post_ids = array_map( 'absint', $post_ids ); - } - - $data = array(); - if ( ! empty( $post ) && isset( $post['generate_and_import'] ) ) { - - $customer_emails = array(); - $unique_code = ''; - if ( ! empty( $post['customer_email'] ) ) { - $emails = explode( ',', $post['customer_email'] ); - if ( is_array( $emails ) && count( $emails ) > 0 ) { - for ( $j = 1; $j <= $post['no_of_coupons_to_generate']; $j++ ) { - $email = ( ! empty( $emails[ $j - 1 ] ) ) ? sanitize_email( $emails[ $j - 1 ] ) : ''; - $customer_emails[ $j ] = ( ! empty( $email ) && is_email( $email ) ) ? $email : ''; - } - } - } - - $all_discount_types = wc_get_coupon_types(); - $generated_codes = array(); - - for ( $i = 1; $i <= $post['no_of_coupons_to_generate']; $i++ ) { - $customer_email = ( ! empty( $customer_emails[ $i ] ) ) ? $customer_emails[ $i ] : ''; - $unique_code = $this->generate_unique_code( $customer_email ); - if ( ! empty( $generated_codes ) && in_array( $unique_code, $generated_codes, true ) ) { - $max = ( $post['no_of_coupons_to_generate'] * 10 ) - 1; - do { - $unique_code_temp = $unique_code . wp_rand( 0, $max ); - } while ( in_array( $unique_code_temp, $generated_codes, true ) ); - $unique_code = $unique_code_temp; - } - $generated_codes[] = $unique_code; - $post['coupon_title_prefix'] = ( ! empty( $post['coupon_title_prefix'] ) ) ? $post['coupon_title_prefix'] : ''; - $post['coupon_title_suffix'] = ( ! empty( $post['coupon_title_suffix'] ) ) ? $post['coupon_title_suffix'] : ''; - $code = $post['coupon_title_prefix'] . $unique_code . $post['coupon_title_suffix']; - - $data[ $i ]['post_title'] = strtolower( $code ); - - $discount_type = ( ! empty( $post['discount_type'] ) ) ? $post['discount_type'] : 'percent'; - - if ( ! empty( $all_discount_types[ $discount_type ] ) ) { - $data[ $i ]['discount_type'] = $all_discount_types[ $discount_type ]; - } else { - if ( $this->is_wc_gte_30() ) { - $data[ $i ]['discount_type'] = 'Percentage discount'; - } else { - $data[ $i ]['discount_type'] = 'Cart % Discount'; - } - } - - if ( $this->is_wc_gte_30() ) { - $post['product_ids'] = ( ! empty( $post['product_ids'] ) ) ? ( ( is_array( $post['product_ids'] ) ) ? implode( ',', $post['product_ids'] ) : $post['product_ids'] ) : ''; - $post['exclude_product_ids'] = ( ! empty( $post['exclude_product_ids'] ) ) ? ( ( is_array( $post['exclude_product_ids'] ) ) ? implode( ',', $post['exclude_product_ids'] ) : $post['exclude_product_ids'] ) : ''; - } - - $data[ $i ]['coupon_amount'] = $post['coupon_amount']; - $data[ $i ]['individual_use'] = ( isset( $post['individual_use'] ) ) ? 'yes' : 'no'; - $data[ $i ]['product_ids'] = ( isset( $post['product_ids'] ) ) ? str_replace( array( ',', ' ' ), array( '|', '' ), $post['product_ids'] ) : ''; - $data[ $i ]['exclude_product_ids'] = ( isset( $post['exclude_product_ids'] ) ) ? str_replace( array( ',', ' ' ), array( '|', '' ), $post['exclude_product_ids'] ) : ''; - $data[ $i ]['usage_limit'] = ( isset( $post['usage_limit'] ) ) ? $post['usage_limit'] : ''; - $data[ $i ]['usage_limit_per_user'] = ( isset( $post['usage_limit_per_user'] ) ) ? $post['usage_limit_per_user'] : ''; - $data[ $i ]['limit_usage_to_x_items'] = ( isset( $post['limit_usage_to_x_items'] ) ) ? $post['limit_usage_to_x_items'] : ''; - if ( empty( $post['expiry_date'] ) && ! empty( $post['sc_coupon_validity'] ) && ! empty( $post['validity_suffix'] ) ) { - $data[ $i ]['expiry_date'] = gmdate( 'Y-m-d', strtotime( '+' . $post['sc_coupon_validity'] . ' ' . $post['validity_suffix'] ) + $this->wc_timezone_offset() ); - } else { - $data[ $i ]['expiry_date'] = $post['expiry_date']; - } - $data[ $i ]['free_shipping'] = ( isset( $post['free_shipping'] ) ) ? 'yes' : 'no'; - $data[ $i ]['product_categories'] = ( isset( $post['product_categories'] ) ) ? implode( '|', $post['product_categories'] ) : ''; - $data[ $i ]['exclude_product_categories'] = ( isset( $post['exclude_product_categories'] ) ) ? implode( '|', $post['exclude_product_categories'] ) : ''; - $data[ $i ]['exclude_sale_items'] = ( isset( $post['exclude_sale_items'] ) ) ? 'yes' : 'no'; - $data[ $i ]['minimum_amount'] = ( isset( $post['minimum_amount'] ) ) ? $post['minimum_amount'] : ''; - $data[ $i ]['maximum_amount'] = ( isset( $post['maximum_amount'] ) ) ? $post['maximum_amount'] : ''; - $data[ $i ]['customer_email'] = ( ! empty( $customer_emails ) ) ? $customer_emails[ $i ] : ''; - $data[ $i ]['sc_coupon_validity'] = ( isset( $post['sc_coupon_validity'] ) ) ? $post['sc_coupon_validity'] : ''; - $data[ $i ]['validity_suffix'] = ( isset( $post['validity_suffix'] ) ) ? $post['validity_suffix'] : ''; - $data[ $i ]['is_pick_price_of_product'] = ( isset( $post['is_pick_price_of_product'] ) ) ? 'yes' : 'no'; - $data[ $i ]['sc_disable_email_restriction'] = ( isset( $post['sc_disable_email_restriction'] ) ) ? 'yes' : 'no'; - $data[ $i ]['sc_is_visible_storewide'] = ( isset( $post['sc_is_visible_storewide'] ) ) ? 'yes' : 'no'; - $data[ $i ]['coupon_title_prefix'] = ( isset( $post['coupon_title_prefix'] ) ) ? $post['coupon_title_prefix'] : ''; - $data[ $i ]['coupon_title_suffix'] = ( isset( $post['coupon_title_suffix'] ) ) ? $post['coupon_title_suffix'] : ''; - $data[ $i ]['sc_restrict_to_new_user'] = ( isset( $post['sc_restrict_to_new_user'] ) ) ? $post['sc_restrict_to_new_user'] : ''; - $data[ $i ]['post_status'] = 'publish'; - $data[ $i ]['post_excerpt'] = ( isset( $post['excerpt'] ) ) ? $post['excerpt'] : ''; - $data[ $i ]['wc_sc_max_discount'] = ( isset( $post['wc_sc_max_discount'] ) ) ? $post['wc_sc_max_discount'] : ''; - $data[ $i ]['wc_sc_expiry_time'] = ( isset( $post['wc_sc_expiry_time'] ) ) ? $post['wc_sc_expiry_time'] : ''; - $data[ $i ]['wc_sc_product_attribute_ids'] = ( isset( $post['wc_sc_product_attribute_ids'] ) ) ? implode( '|', $post['wc_sc_product_attribute_ids'] ) : ''; - $data[ $i ]['wc_sc_exclude_product_attribute_ids'] = ( isset( $post['wc_sc_exclude_product_attribute_ids'] ) ) ? implode( '|', $post['wc_sc_exclude_product_attribute_ids'] ) : ''; - $data[ $i ]['sc_coupon_category'] = ( isset( $post['tax_input']['sc_coupon_category'] ) ) ? implode( '|', $post['tax_input']['sc_coupon_category'] ) : ''; - - $data[ $i ] = apply_filters( 'sc_generate_coupon_meta', $data[ $i ], $post ); - - } - } - - if ( ! empty( $get ) && isset( $get['export_coupons'] ) ) { - - $headers = array_keys( $coupon_postmeta_headers ); - if ( $this->is_wc_gte_30() ) { - $headers[] = 'date_expires'; - } - $headers = esc_sql( $headers ); - $how_many_headers = count( $headers ); - $header_placeholder = array_fill( 0, $how_many_headers, '%s' ); - - $how_many_ids = count( $post_ids ); - $id_placeholder = array_fill( 0, $how_many_ids, '%d' ); - - $wpdb->query( $wpdb->prepare( 'SET SESSION group_concat_max_len=%d', 999999 ) ); // phpcs:ignore - - $unique_post_ids = array_unique( $post_ids ); - - $results = wp_cache_get( 'wc_sc_exported_coupon_data_' . implode( '_', $unique_post_ids ), 'woocommerce_smart_coupons' ); - - if ( false === $results ) { - $results = $wpdb->get_results( // phpcs:ignore - // phpcs:disable - $wpdb->prepare( - "SELECT p.ID, - p.post_title, - p.post_excerpt, - p.post_status, - p.post_parent, - p.menu_order, - DATE_FORMAT(p.post_date,'%%d-%%m-%%Y %%H:%%i:%%s') AS post_date, - GROUP_CONCAT(pm.meta_key order by pm.meta_id SEPARATOR '###') AS coupon_meta_key, - GROUP_CONCAT(pm.meta_value order by pm.meta_id SEPARATOR '###') AS coupon_meta_value - FROM {$wpdb->prefix}posts as p JOIN {$wpdb->prefix}postmeta as pm ON (p.ID = pm.post_id - AND pm.meta_key IN (" . implode( ',', $header_placeholder ) . ') ) - WHERE p.ID IN (' . implode( ',', $id_placeholder ) . ') AND pm.meta_value IS NOT NULL - GROUP BY p.id ORDER BY p.id', - array_merge( $headers, $post_ids ) - ), - // phpcs:enable - ARRAY_A - ); - wp_cache_set( 'wc_sc_exported_coupon_data_' . implode( '_', $unique_post_ids ), $results, 'woocommerce_smart_coupons' ); - $this->maybe_add_cache_key( 'wc_sc_exported_coupon_data_' . implode( '_', $unique_post_ids ) ); - } - - foreach ( $results as $result ) { - - $coupon_meta_key = explode( '###', $result['coupon_meta_key'] ); - $coupon_meta_value = explode( '###', $result['coupon_meta_value'] ); - - unset( $result['coupon_meta_key'] ); - unset( $result['coupon_meta_value'] ); - - if ( ! empty( $result['post_date'] ) ) { - $timestamp = strtotime( $result['post_date'] ) + 1; - $result['post_date'] = gmdate( 'd-m-Y H:i:s', $timestamp ); - } - - $id = $result['ID']; - $data[ $id ] = $result; - - foreach ( $coupon_meta_key as $index => $key ) { - if ( 'product_ids' === $key || 'exclude_product_ids' === $key ) { - $data[ $id ][ $key ] = ( isset( $coupon_meta_value[ $index ] ) ) ? str_replace( array( ',', ' ' ), array( '|', '' ), $coupon_meta_value[ $index ] ) : ''; - } elseif ( 'product_categories' === $key || 'exclude_product_categories' === $key ) { - $data[ $id ][ $key ] = ( ! empty( $coupon_meta_value[ $index ] ) ) ? implode( '|', maybe_unserialize( stripslashes( $coupon_meta_value[ $index ] ) ) ) : ''; - } elseif ( '_used_by' === $key ) { - if ( ! isset( $data[ $id ][ $key ] ) ) { - $data[ $id ][ $key ] = ''; - } - $data[ $id ][ $key ] .= '|' . $coupon_meta_value[ $index ]; - $data[ $id ][ $key ] = trim( $data[ $id ][ $key ], '|' ); - } elseif ( 'date_expires' === $key && $this->is_wc_gte_30() ) { - if ( ! empty( $coupon_meta_value[ $index ] ) ) { - $data[ $id ]['expiry_date'] = gmdate( 'Y-m-d', intval( $coupon_meta_value[ $index ] ) + $this->wc_timezone_offset() ); - } - } elseif ( 'ID' !== $key ) { - if ( ! empty( $coupon_meta_value[ $index ] ) ) { - if ( is_serialized( $coupon_meta_value[ $index ] ) ) { - $temp_data = maybe_unserialize( stripslashes( $coupon_meta_value[ $index ] ) ); - $current_temp_data = current( $temp_data ); - if ( ! is_array( $current_temp_data ) ) { - $temp_data = implode( ',', $temp_data ); - } else { - $temp_data = apply_filters( - 'wc_sc_export_coupon_meta_data', - $temp_data, - array( - 'coupon_id' => $id, - 'index' => $index, - 'meta_key' => $key, // phpcs:ignore - 'meta_keys' => $coupon_meta_key, - 'meta_values' => $coupon_meta_value, - ) - ); - } - } else { - $temp_data = $coupon_meta_value[ $index ]; - } - $data[ $id ][ $key ] = apply_filters( - 'wc_sc_export_coupon_meta', - $temp_data, - array( - 'coupon_id' => $id, - 'index' => $index, - 'meta_key' => $key, // phpcs:ignore - 'meta_value' => $coupon_meta_value[ $index ], // phpcs:ignore - 'meta_keys' => $coupon_meta_key, - 'meta_values' => $coupon_meta_value, - ) - ); - } - } - } - } - } - - return $data; - - } - - /** - * Export coupon CSV data - * - * @param array $columns_header Column header. - * @param array $data The data. - * @return array $file_data - */ - public function export_coupon_csv( $columns_header, $data ) { - - $getfield = ''; - - foreach ( $columns_header as $key => $value ) { - $getfield .= $key . ','; - } - - $fields = substr_replace( $getfield, '', -1 ); - - $csv_file_name = get_bloginfo( 'name' ) . gmdate( 'd-M-Y_H_i_s' ) . '.csv'; - - $fields .= $this->get_coupon_csv_data( $columns_header, $data ); - - $upload_dir = wp_get_upload_dir(); - - $file_data = array(); - $file_data['wp_upload_dir'] = $upload_dir['basedir'] . '/woocommerce_uploads/'; - $file_data['file_name'] = $csv_file_name; - $file_data['file_content'] = $fields; - - if ( isset( $upload_dir['error'] ) && ! empty( $upload_dir['error'] ) ) { - $file_data['error'] = $upload_dir['error']; - } - - return $file_data; - } - - /** - * Export coupon CSV data - * - * @param array $columns_header Column header. - * @param array $data The data. - * @return array $file_data - */ - public function get_coupon_csv_data( $columns_header, $data ) { - - $each_field = array_keys( $columns_header ); - - $csv_data = ''; - - foreach ( (array) $data as $row ) { - $count_columns_header = count( $columns_header ); - for ( $i = 0; $i < $count_columns_header; $i++ ) { - if ( 0 === $i ) { - $csv_data .= "\n"; - } - - if ( array_key_exists( $each_field[ $i ], $row ) ) { - $row_each_field = $row[ $each_field[ $i ] ]; - } else { - $row_each_field = ''; - } - - $array = str_replace( array( "\n", "\n\r", "\r\n", "\r" ), "\t", $row_each_field ); - - $array = str_getcsv( $array, ',', '"', '\\' ); - - $str = ( $array && is_array( $array ) ) ? implode( ', ', $array ) : ''; - - $str = addslashes( $str ); - - $csv_data .= '"' . $str . '",'; - } - $csv_data = substr_replace( $csv_data, '', -1 ); - } - - return $csv_data; - } - - /** - * Smart Coupons export headers - * - * @param array $coupon_postmeta_headers Existing. - * @return array $coupon_postmeta_headers Including additional headers. - */ - public function wc_smart_coupons_export_headers( $coupon_postmeta_headers = array() ) { - - $sc_postmeta_headers = array( - 'sc_coupon_validity' => __( 'Coupon Validity', 'woocommerce-smart-coupons' ), - 'validity_suffix' => __( 'Validity Suffix', 'woocommerce-smart-coupons' ), - 'auto_generate_coupon' => __( 'Auto Generate Coupon', 'woocommerce-smart-coupons' ), - 'coupon_title_prefix' => __( 'Coupon Title Prefix', 'woocommerce-smart-coupons' ), - 'coupon_title_suffix' => __( 'Coupon Title Suffix', 'woocommerce-smart-coupons' ), - 'is_pick_price_of_product' => __( 'Is Pick Price of Product', 'woocommerce-smart-coupons' ), - 'sc_disable_email_restriction' => __( 'Disable Email Restriction', 'woocommerce-smart-coupons' ), - 'sc_is_visible_storewide' => __( 'Coupon Is Visible Storewide', 'woocommerce-smart-coupons' ), - 'sc_restrict_to_new_user' => __( 'For new user only?', 'woocommerce-smart-coupons' ), - 'wc_sc_max_discount' => __( 'Max discount', 'woocommerce-smart-coupons' ), - ); - - if ( $this->is_wc_gte_32() ) { - $sc_postmeta_headers['wc_sc_expiry_time'] = __( 'Coupon expiry time', 'woocommerce-smart-coupons' ); - } - - return array_merge( $coupon_postmeta_headers, $sc_postmeta_headers ); - - } - - /** - * Filter callback to replace {site_title} in email footer - * - * @param string $string Email footer text. - * @return string Email footer text with any replacements done. - */ - public function email_footer_replace_site_title( $string ) { - $blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); - return str_replace( '{site_title}', $blogname, $string ); - } - - /** - * Register Smart Coupons' email classes to WooCommerce's emails class list - * - * @param array $email_classes available email classes list. - * @return array $email_classes modified email classes list - */ - public function register_email_classes( $email_classes = array() ) { - - include_once 'emails/class-wc-sc-email.php'; - include_once 'emails/class-wc-sc-email-coupon.php'; - include_once 'emails/class-wc-sc-combined-email-coupon.php'; - include_once 'emails/class-wc-sc-acknowledgement-email.php'; - - // Add the email class to the list of email classes that WooCommerce loads. - $email_classes['WC_SC_Email_Coupon'] = new WC_SC_Email_Coupon(); - $email_classes['WC_SC_Combined_Email_Coupon'] = new WC_SC_Combined_Email_Coupon(); - $email_classes['WC_SC_Acknowledgement_Email'] = new WC_SC_Acknowledgement_Email(); - - return $email_classes; - } - - /** - * Whether to hold stock for checkout or not - * - * TODO: Rework to find perfect solution - * - * @param boolean $is_hold Whether to hold or not. - * @return boolean - */ - public function hold_stock_for_checkout( $is_hold = true ) { - $is_ignore = get_option( 'wc_sc_ignore_coupon_used_warning' ); - if ( 'yes' === $is_ignore ) { - return false; - } - return $is_hold; - } - - /** - * Function to generate a coupon - * - * @param array $args Additional data. - * @return string|WC_Coupon - */ - public function generate_coupon( $args = array() ) { - if ( ! $this->is_wc_gte_30() ) { - return; - } - - $args = array_filter( $args ); - - $return_type = ( ! empty( $args['return'] ) && in_array( $args['return'], array( 'code', 'object' ), true ) ) ? $args['return'] : 'object'; - - $coupon = null; - if ( ! empty( $args['coupon'] ) ) { - if ( is_numeric( $args['coupon'] ) || is_string( $args['coupon'] ) ) { - $coupon = new WC_Coupon( $args['coupon'] ); - } elseif ( $args['coupon'] instanceof WC_Coupon ) { - $coupon = $args['coupon']; - } - } elseif ( ! empty( $args['id'] ) ) { - $coupon = new WC_Coupon( $args['id'] ); - } elseif ( ! empty( $args['code'] ) ) { - $coupon = new WC_Coupon( $args['code'] ); - } - - $internal_keys = array( - 'code', - 'amount', - 'discount_type', - 'description', - 'date_expires', - 'individual_use', - 'product_ids', - 'excluded_product_ids', - 'usage_limit', - 'usage_limit_per_user', - 'limit_usage_to_x_items', - 'free_shipping', - 'product_categories', - 'excluded_product_categories', - 'exclude_sale_items', - 'minimum_amount', - 'maximum_amount', - 'email_restrictions', - 'meta_data', - ); - - $email_restrictions = ( ! empty( $args['email_restrictions'] ) && count( $args['email_restrictions'] ) === 1 ) ? $args['email_restrictions'] : ''; - - $new_code = ''; - if ( is_null( $coupon ) ) { - if ( ! empty( $args['discount_type'] ) && ! empty( $args['amount'] ) ) { - $new_code = $this->generate_unique_code( $email_restrictions ); - $new_coupon = new WC_Coupon(); - $new_coupon->set_code( $new_code ); - foreach ( $args as $key => $value ) { - switch ( $key ) { - case 'code': - // do nothing. - break; - case 'meta_data': - if ( is_array( $value ) && is_callable( array( $new_coupon, 'update_meta_data' ) ) ) { - foreach ( $value as $meta ) { - $new_coupon->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); - } - } - break; - case 'description': - $new_coupon->set_description( wp_filter_post_kses( $value ) ); - break; - default: - if ( is_callable( array( $new_coupon, "set_{$key}" ) ) ) { - $new_coupon->{"set_{$key}"}( $value ); - } - break; - } - } - $new_coupon->save(); - return ( 'code' === $return_type ) ? $new_code : $new_coupon; - } else { - return; - } - } else { - $is_auto_generate = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_meta' ) ) ) ? $coupon->get_meta( 'auto_generate_coupon' ) : 'no'; - if ( 'yes' !== $is_auto_generate ) { - $code = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - return ( 'code' === $return_type ) ? $code : $coupon; - } else { - $new_code = $this->generate_unique_code( $email_restrictions ); - $new_coupon = new WC_Coupon(); - $new_coupon->set_code( $new_code ); - foreach ( $internal_keys as $key ) { - if ( ! is_object( $coupon ) ) { - continue; - } - switch ( $key ) { - case 'code': - // do nothing. - break; - case 'meta_data': - $meta_data = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_meta_data' ) ) ) ? $coupon->get_meta_data() : null; - if ( ! empty( $meta_data ) ) { - foreach ( $meta_data as $meta ) { - if ( is_object( $meta ) && is_callable( array( $meta, 'get_data' ) ) ) { - $data = $meta->get_data(); - if ( is_callable( array( $new_coupon, 'update_meta_data' ) ) ) { - $new_coupon->update_meta_data( $data['key'], $data['value'] ); - } - } - } - } - break; - case 'description': - $description = ( is_callable( array( $coupon, 'get_description' ) ) ) ? $coupon->get_description() : ''; - if ( ! empty( $description ) && is_callable( array( $new_coupon, 'set_description' ) ) ) { - $new_coupon->set_description( wp_filter_post_kses( $description ) ); - } - break; - default: - $value = ( is_callable( array( $coupon, "get_{$key}" ) ) ) ? $coupon->{"get_{$key}"}() : ''; - if ( ! empty( $value ) && is_callable( array( $new_coupon, "set_{$key}" ) ) ) { - $new_coupon->{"set_{$key}"}( $value ); - } - break; - } - } - $new_coupon->save(); - return ( 'code' === $return_type ) ? $new_code : $new_coupon; - } - } - } - - /** - * Function to paint/draw coupon on a page in HTML format - * - * @param array $args Additional data including coupon info. - */ - public function paint_coupon( $args = array() ) { - if ( ! $this->is_wc_gte_30() ) { - return ''; - } - if ( empty( $args['coupon'] ) ) { - return ''; - } - ob_start(); - - if ( is_numeric( $args['coupon'] ) || is_string( $args['coupon'] ) ) { - $coupon = new WC_Coupon( $args['coupon'] ); - } elseif ( $args['coupon'] instanceof WC_Coupon ) { - $coupon = $args['coupon']; - } else { - return ''; - } - - $with_container = ( ! empty( $args['with_container'] ) ) ? $args['with_container'] : 'no'; - $with_css = ( ! empty( $args['with_css'] ) ) ? $args['with_css'] : 'no'; - - $design = get_option( 'wc_sc_setting_coupon_design', 'basic' ); - $background_color = get_option( 'wc_sc_setting_coupon_background_color', '#39cccc' ); - $foreground_color = get_option( 'wc_sc_setting_coupon_foreground_color', '#30050b' ); - $third_color = get_option( 'wc_sc_setting_coupon_third_color', '#39cccc' ); - $show_coupon_description = get_option( 'smart_coupons_show_coupon_description', 'no' ); - $coupon_id = ( is_callable( array( $coupon, 'get_id' ) ) ) ? $coupon->get_id() : 0; - $coupon_code = ( is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - $coupon_description = ( is_callable( array( $coupon, 'description' ) ) ) ? $coupon->get_description() : ''; - $coupon_amount = ( is_callable( array( $coupon, 'get_amount' ) ) ) ? $coupon->get_amount() : 0; - $is_free_shipping = ( is_callable( array( $coupon, 'get_free_shipping' ) ) ) ? wc_bool_to_string( $coupon->get_free_shipping() ) : 'no'; - $expiry_date = ( is_callable( array( $coupon, 'get_date_expires' ) ) ) ? $coupon->get_date_expires() : null; - - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - - $coupon_data = $this->get_coupon_meta_data( $coupon ); - $coupon_type = ( ! empty( $coupon_data['coupon_type'] ) ) ? $coupon_data['coupon_type'] : ''; - - if ( 'yes' === $is_free_shipping ) { - if ( ! empty( $coupon_type ) ) { - $coupon_type .= __( ' & ', 'woocommerce-smart-coupons' ); - } - $coupon_type .= __( 'Free Shipping', 'woocommerce-smart-coupons' ); - } - - $coupon_description = ( 'yes' === $show_coupon_description ) ? $coupon_description : ''; - - $is_percent = $this->is_percent_coupon( array( 'coupon_object' => $coupon ) ); - - if ( $expiry_date instanceof WC_DateTime ) { - $expiry_date = ( is_callable( array( $expiry_date, 'getTimestamp' ) ) ) ? $expiry_date->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - - if ( ! empty( $expiry_date ) && is_int( $expiry_date ) ) { - $expiry_time = ( $this->is_callable( $coupon, 'get_meta' ) ) ? (int) $coupon->get_meta( 'wc_sc_expiry_time' ) : (int) get_post_meta( $coupon_id, 'wc_sc_expiry_time', true ); - if ( ! empty( $expiry_time ) ) { - $expiry_date += $expiry_time; // Adding expiry time to expiry date. - } - } - - $args = array( - 'coupon_object' => $coupon, - 'coupon_amount' => $coupon_amount, - 'amount_symbol' => ( true === $is_percent ) ? '%' : get_woocommerce_currency_symbol(), - 'discount_type' => wp_strip_all_tags( $coupon_type ), - 'coupon_description' => ( ! empty( $coupon_description ) ) ? $coupon_description : wp_strip_all_tags( $this->generate_coupon_description( array( 'coupon_object' => $coupon ) ) ), - 'coupon_code' => $coupon_code, - 'coupon_expiry' => ( ! empty( $expiry_date ) ) ? $this->get_expiration_format( $expiry_date ) : __( 'Never expires', 'woocommerce-smart-coupons' ), - 'thumbnail_src' => $this->get_coupon_design_thumbnail_src( - array( - 'design' => $design, - 'coupon_object' => $coupon, - ) - ), - 'classes' => 'apply_coupons_credits', - 'template_id' => $design, - 'is_percent' => $is_percent, - ); - - if ( 'yes' === $with_css ) { - ?> -
              - - - -
              -
              - -
              -
              - -
              - $this ) ) ); - - echo $html; // phpcs:ignore - } - - /** - * Add Smart Coupons' REST API Controllers - * - * @param array $namespaces Existing namespaces. - * @return array - */ - public function rest_namespace( $namespaces = array() ) { - include_once 'class-wc-sc-rest-coupons-controller.php'; - $namespaces['wc/v3/sc'] = array( - 'coupons' => 'WC_SC_REST_Coupons_Controller', - ); - return $namespaces; - } - - /** - * Get coupon column headers - * - * @return array - */ - public function get_coupon_column_headers() { - - $coupon_posts_headers = array( - 'post_title' => __( 'Coupon Code', 'woocommerce-smart-coupons' ), - 'post_excerpt' => __( 'Post Excerpt', 'woocommerce-smart-coupons' ), - 'post_status' => __( 'Post Status', 'woocommerce-smart-coupons' ), - 'post_parent' => __( 'Post Parent', 'woocommerce-smart-coupons' ), - 'menu_order' => __( 'Menu Order', 'woocommerce-smart-coupons' ), - 'post_date' => __( 'Post Date', 'woocommerce-smart-coupons' ), - ); - - $coupon_postmeta_headers = apply_filters( - 'wc_smart_coupons_export_headers', - array( - 'discount_type' => __( 'Discount Type', 'woocommerce-smart-coupons' ), - 'coupon_amount' => __( 'Coupon Amount', 'woocommerce-smart-coupons' ), - 'free_shipping' => __( 'Free shipping', 'woocommerce-smart-coupons' ), - 'expiry_date' => __( 'Expiry date', 'woocommerce-smart-coupons' ), - 'minimum_amount' => __( 'Minimum Spend', 'woocommerce-smart-coupons' ), - 'maximum_amount' => __( 'Maximum Spend', 'woocommerce-smart-coupons' ), - 'individual_use' => __( 'Individual USe', 'woocommerce-smart-coupons' ), - 'exclude_sale_items' => __( 'Exclude Sale Items', 'woocommerce-smart-coupons' ), - 'product_ids' => __( 'Product IDs', 'woocommerce-smart-coupons' ), - 'exclude_product_ids' => __( 'Exclude product IDs', 'woocommerce-smart-coupons' ), - 'product_categories' => __( 'Product categories', 'woocommerce-smart-coupons' ), - 'exclude_product_categories' => __( 'Exclude Product categories', 'woocommerce-smart-coupons' ), - 'customer_email' => __( 'Customer Email', 'woocommerce-smart-coupons' ), - 'usage_limit' => __( 'Usage Limit', 'woocommerce-smart-coupons' ), - 'usage_limit_per_user' => __( 'Usage Limit Per User', 'woocommerce-smart-coupons' ), - 'limit_usage_to_x_items' => __( 'Limit Usage to X Items', 'woocommerce-smart-coupons' ), - 'usage_count' => __( 'Usage Count', 'woocommerce-smart-coupons' ), - '_used_by' => __( 'Used By', 'woocommerce-smart-coupons' ), - 'sc_restrict_to_new_user' => __( 'For new user only?', 'woocommerce-smart-coupons' ), - ) - ); - - $coupon_term_headers = array( - 'sc_coupon_category' => __( 'Coupon Category', 'woocommerce-smart-coupons' ), - ); - - return array( - 'posts_headers' => $coupon_posts_headers, - 'postmeta_headers' => $coupon_postmeta_headers, - 'term_headers' => $coupon_term_headers, - ); - } - - /** - * Write to file after exporting - * - * @param array $post POST. - * @param array $get GET. - * @param array $post_ids Post ids. - */ - public function export_coupon( $post = array(), $get = array(), $post_ids = array() ) { - // Run a capability check before attempting to export coupons. - if ( ! is_admin() && ! current_user_can( 'manage_woocommerce' ) ) { - return; - } - - $coupon_column_headers = $this->get_coupon_column_headers(); - $coupon_posts_headers = $coupon_column_headers['posts_headers']; - $coupon_postmeta_headers = $coupon_column_headers['postmeta_headers']; - - $column_headers = array_merge( $coupon_posts_headers, $coupon_postmeta_headers ); - - if ( ! empty( $post ) ) { - $data = $this->generate_coupons_code( $post, '', '', array() ); - } elseif ( ! empty( $get ) ) { - $data = $this->generate_coupons_code( '', $get, $post_ids, $coupon_postmeta_headers ); - } - - $file_data = $this->export_coupon_csv( $column_headers, $data ); - - if ( ( isset( $post['generate_and_import'] ) && ! empty( $post['smart_coupons_generate_action'] ) && 'sc_export_and_import' === $post['smart_coupons_generate_action'] ) || isset( $get['export_coupons'] ) ) { - - if ( ob_get_level() ) { - $levels = ob_get_level(); - for ( $i = 0; $i < $levels; $i++ ) { - ob_end_clean(); - } - } else { - ob_end_clean(); - } - nocache_headers(); - header( 'X-Robots-Tag: noindex, nofollow', true ); - header( 'Content-Type: text/x-csv; charset=UTF-8' ); - header( 'Content-Description: File Transfer' ); - header( 'Content-Transfer-Encoding: binary' ); - header( 'Content-Disposition: attachment; filename="' . sanitize_file_name( $file_data['file_name'] ) . '";' ); - - echo $file_data['file_content']; // phpcs:ignore - exit; - } else { - - // Proceed only if there is no directory permission related issue. - if ( ! isset( $file_data['error'] ) ) { - // Create CSV file. - $csv_folder = $file_data['wp_upload_dir']; - $filename = str_replace( array( '\'', '"', ',', ';', '<', '>', '/', ':' ), '', $file_data['file_name'] ); - $csvfilename = $csv_folder . $filename; - $fp = fopen( $csvfilename, 'w' ); // phpcs:ignore - if ( false !== $fp ) { - fwrite( $fp , $file_data['file_content'] ); // phpcs:ignore - fclose( $fp ); // phpcs:ignore - } - - return $csvfilename; - } - } - - } - - /** - * Function to enqueue additional styles & scripts for Smart Coupons in admin - */ - public function smart_coupon_styles_and_scripts() { - global $post, $pagenow; - - if ( ! empty( $pagenow ) ) { - $show_css_for_smart_coupon_tab = false; - $get_post_type = ( ! empty( $post->post_type ) ) ? $post->post_type : ( ( ! empty( $_GET['post_type'] ) ) ? wc_clean( wp_unslash( $_GET['post_type'] ) ) : '' ); // phpcs:ignore - $get_page = ( ! empty( $_GET['page'] ) ) ? wc_clean( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore - if ( ( 'edit.php' === $pagenow || 'post.php' === $pagenow || 'post-new.php' === $pagenow ) && in_array( $get_post_type, array( 'shop_coupon', 'product', 'product-variation' ), true ) ) { - $show_css_for_smart_coupon_tab = true; - } - if ( 'admin.php' === $pagenow && 'wc-smart-coupons' === $get_page ) { - $show_css_for_smart_coupon_tab = true; - } - if ( $show_css_for_smart_coupon_tab ) { - if ( ! wp_style_is( 'smart-coupon' ) ) { - wp_enqueue_style( 'smart-coupon' ); - } - $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; - wp_register_style( 'smart-coupons-admin', untrailingslashit( plugins_url( '/', WC_SC_PLUGIN_FILE ) ) . '/assets/css/smart-coupons-admin' . $suffix . '.css', array(), $this->plugin_data['Version'] ); - wp_enqueue_style( 'smart-coupons-admin' ); - } - } - - if ( ! empty( $post->post_type ) && 'product' === $post->post_type ) { - if ( wp_script_is( 'select2' ) ) { - wp_localize_script( - 'select2', - 'smart_coupons_select_params', - array( - 'i18n_matches_1' => _x( 'One result is available, press enter to select it.', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_matches_n' => _x( '%qty% results are available, use up and down arrow keys to navigate.', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_no_matches' => _x( 'No matches found', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_ajax_error' => _x( 'Loading failed', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_input_too_short_1' => _x( 'Please enter 1 or more characters', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_input_too_short_n' => _x( 'Please enter %qty% or more characters', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_input_too_long_1' => _x( 'Please delete 1 character', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_input_too_long_n' => _x( 'Please delete %qty% characters', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_selection_too_long_1' => _x( 'You can only select 1 item', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_selection_too_long_n' => _x( 'You can only select %qty% items', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_load_more' => _x( 'Loading more results…', 'enhanced select', 'woocommerce-smart-coupons' ), - 'i18n_searching' => _x( 'Searching…', 'enhanced select', 'woocommerce-smart-coupons' ), - 'ajax_url' => admin_url( 'admin-ajax.php' ), - 'search_products_nonce' => wp_create_nonce( 'search-products' ), - 'search_customers_nonce' => wp_create_nonce( 'search-customers' ), - ) - ); - } - } - - } - - /** - * Add if cache key doesn't exists - * - * @param string $key The cache key. - */ - public function maybe_add_cache_key( $key = '' ) { - if ( ! empty( $key ) ) { - $all_cache_key = get_option( 'wc_sc_all_cache_key' ); - if ( false !== $all_cache_key ) { - if ( empty( $all_cache_key ) || ! is_array( $all_cache_key ) ) { - $all_cache_key = array(); - } - if ( ! in_array( $key, $all_cache_key, true ) ) { - $all_cache_key[] = $key; - update_option( 'wc_sc_all_cache_key', $all_cache_key, 'no' ); - } - } - } - } - - /** - * Make meta data of this plugin, protected - * - * @param bool $protected Is protected. - * @param string $meta_key the meta key. - * @param string $meta_type The meta type. - * @return bool $protected - */ - public function make_sc_meta_protected( $protected, $meta_key, $meta_type ) { - $sc_meta = array( - 'auto_generate_coupon', - 'coupon_sent', - 'coupon_title_prefix', - 'coupon_title_suffix', - 'generated_from_order_id', - 'gift_receiver_email', - 'gift_receiver_message', - 'gift_sending_timestamp', - 'is_gift', - 'is_pick_price_of_product', - 'sc_called_credit_details', - 'sc_coupon_receiver_details', - 'sc_coupon_validity', - 'sc_disable_email_restriction', - 'sc_is_visible_storewide', - 'send_coupons_on_renewals', - 'smart_coupons_contribution', - 'temp_gift_card_receivers_emails', - 'validity_suffix', - 'sc_restrict_to_new_user', - 'wc_sc_schedule_gift_sending', - 'wc_sc_max_discount', - 'wc_sc_expiry_time', - 'wc_sc_product_attribute_ids', - 'wc_sc_exclude_product_attribute_ids', - ); - if ( in_array( $meta_key, $sc_meta, true ) ) { - return true; - } - return $protected; - } - - /** - * Get the order from the PayPal 'Custom' variable. - * - * Credit: WooCommerce - * - * @param string $raw_custom JSON Data passed back by PayPal. - * @return bool|WC_Order object - */ - public function get_paypal_order( $raw_custom ) { - - if ( ! class_exists( 'WC_Gateway_Paypal' ) ) { - include_once WC()->plugin_path() . '/includes/gateways/paypal/class-wc-gateway-paypal.php'; - } - // We have the data in the correct format, so get the order. - if ( ( $custom = json_decode( $raw_custom ) ) && is_object( $custom ) ) { // phpcs:ignore - $order_id = $custom->order_id; - $order_key = $custom->order_key; - - // Fallback to serialized data if safe. This is @deprecated in 2.3.11. - } elseif ( preg_match( '/^a:2:{/', $raw_custom ) && ! preg_match( '/[CO]:\+?[0-9]+:"/', $raw_custom ) && ( $custom = maybe_unserialize( $raw_custom ) ) ) { // phpcs:ignore - $order_id = $custom[0]; - $order_key = $custom[1]; - - // Nothing was found. - } else { - WC_Gateway_Paypal::log( 'Error: Order ID and key were not found in "custom".' ); - return false; - } - - if ( ! $order = wc_get_order( $order_id ) ) { // phpcs:ignore - // We have an invalid $order_id, probably because invoice_prefix has changed. - $order_id = wc_get_order_id_by_order_key( $order_key ); - $order = wc_get_order( $order_id ); - } - - if ( $this->is_wc_gte_30() ) { - $_order_key = ( ! empty( $order ) && is_callable( array( $order, 'get_order_key' ) ) ) ? $order->get_order_key() : ''; - } else { - $_order_key = ( ! empty( $order->order_key ) ) ? $order->order_key : ''; - } - - if ( ! $order || $_order_key !== $order_key ) { - WC_Gateway_Paypal::log( 'Error: Order Keys do not match.' ); - return false; - } - - return $order; - } - - /** - * Get all coupon styles - * - * @return array - */ - public function get_wc_sc_coupon_styles() { - - $all_styles = array( - 'inner' => __( 'Style 1', 'woocommerce-smart-coupons' ), - 'round-corner' => __( 'Style 2', 'woocommerce-smart-coupons' ), - 'round-dashed' => __( 'Style 3', 'woocommerce-smart-coupons' ), - 'outer-dashed' => __( 'Style 4', 'woocommerce-smart-coupons' ), - 'left' => __( 'Style 5', 'woocommerce-smart-coupons' ), - 'bottom' => __( 'Style 6', 'woocommerce-smart-coupons' ), - 'custom-design' => __( 'Custom Style', 'woocommerce-smart-coupons' ), - ); - - return apply_filters( 'wc_sc_get_wc_sc_coupon_styles', $all_styles ); - - } - - /** - * Get coupon display styles - * - * @param string $style_name The style name. - * @param array $args Additional arguments. - * @return string - */ - public function get_coupon_styles( $style_name = '', $args = array() ) { - - $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; - - $is_email = ( ! empty( $args['is_email'] ) ) ? $args['is_email'] : 'no'; - - ob_start(); - - if ( 'custom-design' === $style_name ) { - $custom_design_css = get_option( 'wc_sc_custom_design_css', '' ); - echo $custom_design_css; // phpcs:ignore - } elseif ( 'email-coupon' === $style_name ) { - $file = trailingslashit( WP_PLUGIN_DIR . '/' . WC_SC_PLUGIN_DIRNAME ) . 'assets/css/wc-sc-style-' . $style_name . $suffix . '.css'; - if ( file_exists( $file ) ) { - include $file; - } else { - /* translators: File path */ - $this->log( 'error', sprintf( __( 'File not found %s', 'woocommerce-smart-coupons' ), '' . $file . '' ) . ' ' . __FILE__ . ' ' . __LINE__ ); - } - } else { - $file = trailingslashit( WP_PLUGIN_DIR . '/' . WC_SC_PLUGIN_DIRNAME ) . 'assets/css/smart-coupon-designs.css'; - if ( file_exists( $file ) ) { - include $file; - } else { - /* translators: File path */ - $this->log( 'error', sprintf( __( 'File not found %s', 'woocommerce-smart-coupons' ), '' . $file . '' ) . ' ' . __FILE__ . ' ' . __LINE__ ); - } - } - - $styles = ob_get_clean(); - - if ( 'yes' === $is_email ) { - $styles = str_replace( array( ':before', ':hover', ':focus', ':active' ), array( '-pseudo-before', '-pseudo-hover', '-pseudo-focus', '-pseudo-active' ), $styles ); - } - - return apply_filters( 'wc_sc_get_coupon_styles', $styles, $style_name, $args ); - - } - - /** - * Insert a setting or an array of settings after another specific setting by its ID. - * - * @since 1.2.1 - * @param array $settings The original list of settings. - * @param string $insert_after_setting_id The setting id to insert the new setting after. - * @param array $new_setting The new setting to insert. Can be a single setting or an array of settings. - * @param string $insert_type The type of insert to perform. Can be 'single_setting' or 'multiple_settings'. Optional. Defaults to a single setting insert. - * - * @credit: WooCommerce Subscriptions - */ - public static function insert_setting_after( &$settings, $insert_after_setting_id, $new_setting, $insert_type = 'single_setting' ) { - if ( ! is_array( $settings ) ) { - return; - } - - $original_settings = $settings; - $settings = array(); - - foreach ( $original_settings as $setting ) { - $settings[] = $setting; - - if ( isset( $setting['id'] ) && $insert_after_setting_id === $setting['id'] ) { - if ( 'single_setting' === $insert_type ) { - $settings[] = $new_setting; - } else { - $settings = array_merge( $settings, $new_setting ); - } - } - } - } - - /** - * To generate unique id - * - * Credit: WooCommerce - */ - public function generate_unique_id() { - - require_once ABSPATH . 'wp-includes/class-phpass.php'; - $hasher = new PasswordHash( 8, false ); - return md5( $hasher->get_random_bytes( 32 ) ); - - } - - /** - * To get cookie life - */ - public function get_cookie_life() { - - $life = get_option( 'wc_sc_coupon_cookie_life', 180 ); - - return apply_filters( 'wc_sc_coupon_cookie_life', time() + ( 60 * 60 * 24 * $life ) ); - - } - - /** - * Show notice on admin panel about minimum required version of WooCommerce - */ - public function minimum_woocommerce_version_requirement() { - if ( $this->is_wc_gte_30() ) { - return; - } - - $plugin_data = self::get_smart_coupons_plugin_data(); - $plugin_name = $plugin_data['Name']; - ?> -
              -

              - ' . esc_html__( 'Important', 'woocommerce-smart-coupons' ) . ': ' . esc_html( $plugin_name ) . ' ' . esc_html__( 'is active but it will only work with WooCommerce 3.0.0+.', 'woocommerce-smart-coupons' ) . ' ' . esc_html__( 'Please update WooCommerce to the latest version', 'woocommerce-smart-coupons' ) . '.'; - ?> -

              -
              - is_wc_gte_37() ) { - $coupon_codes = is_callable( array( $order, 'get_coupon_codes' ) ) ? $order->get_coupon_codes() : array(); - } else { - $coupon_codes = is_callable( array( $order, 'get_used_coupons' ) ) ? $order->get_used_coupons() : array(); - } - } - } - return $coupon_codes; - } - - /** - * Function to get default CSS for custom coupon design - * - * @return string $default_css Default custom CSS. - */ - public function get_custom_design_default_css() { - $default_css = '/* Coupon style for custom-design */ -.coupon-container.custom-design { - background: #39cccc; -} - -.coupon-container.custom-design .coupon-content { - border: solid 1px lightgrey; - color: #30050b; -}'; - return apply_filters( 'wc_sc_coupon_custom_design_default_css', $default_css ); - } - - /** - * Function to check if coupon email is enabled or not - * - * TODO: Can be removed in future - * - * @param string $template The template's setting to check for. - * @return boolean $is_email_enabled Is email enabled - */ - public function is_email_template_enabled( $template = 'send' ) { - - if ( 'combine' === $template ) { - $wc_email_settings_key = 'woocommerce_wc_sc_combined_email_coupon_settings'; - $sc_email_setting_key = 'smart_coupons_combine_emails'; - $default = 'no'; - } else { - $wc_email_settings_key = 'woocommerce_wc_sc_email_coupon_settings'; - $sc_email_setting_key = 'smart_coupons_is_send_email'; - $default = 'yes'; - } - - $is_email_enabled = ''; - - $wc_email_settings = get_option( $wc_email_settings_key ); - - // If setting is not found in WC Email settings fetch it from SC admin settings. - if ( false === $wc_email_settings ) { - $is_email_enabled = get_option( $sc_email_setting_key, $default ); - } elseif ( is_array( $wc_email_settings ) && ! empty( $wc_email_settings ) ) { - $is_email_enabled = ( isset( $wc_email_settings['enabled'] ) && ! empty( $wc_email_settings['enabled'] ) ) ? $wc_email_settings['enabled'] : $default; - } - - return $is_email_enabled; - } - - /** - * Function to check if store credit discount is inclusive of tax. - * - * @return string $sc_include_tax Is store credit includes tax - */ - public function is_store_credit_include_tax() { - - $sc_include_tax = 'no'; - $prices_include_tax = wc_prices_include_tax(); - - // Discount can only be inclusive of tax if prices are inclusive of tax and apply before tax is enabled. - if ( true === $prices_include_tax ) { - $apply_before_tax = get_option( 'woocommerce_smart_coupon_apply_before_tax', 'no' ); - if ( 'yes' === $apply_before_tax ) { - // Get SC setting for include tax. - $sc_include_tax = get_option( 'woocommerce_smart_coupon_include_tax', 'no' ); - } - } - return $sc_include_tax; - } - - /** - * Whether to generate store credit including tax amount or not - * - * @return boolean - */ - public function is_generated_store_credit_includes_tax() { - $is_include_tax = get_option( 'wc_sc_generated_store_credit_includes_tax', 'no' ); - return apply_filters( 'wc_sc_is_generated_store_credit_includes_tax', wc_string_to_bool( $is_include_tax ), array( 'source' => $this ) ); - } - - /** - * Get emoji - * - * @return string - */ - public function get_emoji() { - $emojis = array( - 11088 => 'â­', - 127775 => '🌟', - 127873 => 'đźŽ', - 127881 => '🎉', - 127882 => '🎊', - 127941 => '🏅', - 127942 => '🏆', - 127991 => '🏷', - 128075 => 'đź‘‹', - 128076 => '👌', - 128077 => '👍', - 128079 => '👏', - 128081 => 'đź‘‘', - 128142 => 'đź’Ž', - 128165 => 'đź’Ą', - 128276 => 'đź””', - 128293 => '🔥', - 128640 => '🚀', - 129311 => '🤟', - 129321 => '🤩', - ); - $key = array_rand( $emojis ); - return $emojis[ $key ]; - } - - /** - * Get coupon titles for product - * - * @param array $args Additional data. - * @return array - */ - public function get_coupon_titles( $args = array() ) { - $coupon_titles = array(); - if ( empty( $args ) ) { - return $coupon_titles; - } - $product = ( ! empty( $args['product_object'] ) && is_a( $args['product_object'], 'WC_Product' ) ) ? $args['product_object'] : null; - if ( is_null( $product ) ) { - return $coupon_titles; - } - $coupon_titles = ( is_callable( array( $product, 'get_meta' ) ) ) ? $product->get_meta( '_coupon_title' ) : array(); - if ( empty( $coupon_titles ) ) { - $parent_id = ( is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0; - if ( empty( $parent_id ) ) { - return array(); - } - $parent_product = ( function_exists( 'wc_get_product' ) ) ? wc_get_product( $parent_id ) : null; - $coupon_titles = ( $this->is_callable( $parent_product, 'get_meta' ) ) ? $parent_product->get_meta( '_coupon_title' ) : $this->get_post_meta( $parent_id, '_coupon_title', true ); - } - if ( empty( $coupon_titles ) && ! is_array( $coupon_titles ) ) { - return array(); - } - return $coupon_titles; - } - - /** - * Function to copy coupon meta data and save to new coupon. - * - * @param array $coupon_data Array of new coupon id and old coupon object. - * @param array $meta_keys Meta keys. - */ - public function copy_coupon_meta_data( $coupon_data = array(), $meta_keys = array() ) { - - $new_coupon_id = ( ! empty( $coupon_data['new_coupon_id'] ) ) ? absint( $coupon_data['new_coupon_id'] ) : 0; - $coupon = ( ! empty( $coupon_data['ref_coupon'] ) ) ? $coupon_data['ref_coupon'] : false; - - if ( empty( $new_coupon_id ) || empty( $coupon ) ) { - return; - } - - if ( ! empty( $new_coupon_id ) && is_array( $meta_keys ) && ! empty( $meta_keys ) ) { - $new_coupon = new WC_Coupon( $new_coupon_id ); - $is_callable_new_coupon_update_meta = $this->is_callable( $new_coupon, 'update_meta_data' ); - $is_callable_coupon_get_meta = $this->is_callable( $coupon, 'get_meta' ); - // Save each meta to new coupon. - foreach ( $meta_keys as $meta_key ) { - $update = false; - if ( $this->is_wc_gte_30() ) { - $meta_value = ( true === $is_callable_coupon_get_meta ) ? $coupon->get_meta( $meta_key ) : ''; - $update = true; - } else { - $old_coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - if ( ! empty( $old_coupon_id ) ) { // This will confirm that the coupon exists. - $meta_value = get_post_meta( $old_coupon_id, $meta_key, true ); - $update = true; - } - } - if ( true === $update ) { - if ( true === $is_callable_new_coupon_update_meta ) { - $new_coupon->update_meta_data( $meta_key, $meta_value ); - } else { - update_post_meta( $new_coupon_id, $meta_key, $meta_value ); - } - } - } - if ( $this->is_callable( $new_coupon, 'save' ) ) { - $new_coupon->save(); - } - } - } - - /** - * Check given coupon exists. - * - * @param string $coupon_code Coupon code. - * @return bool - * - * Credit: WooCommerce - */ - public function sc_coupon_exists( $coupon_code = '' ) { - if ( empty( $coupon_code ) ) { - return false; - } - $coupon = new WC_Coupon( $coupon_code ); - return (bool) $coupon->get_id() || $coupon->get_virtual(); - } - - /** - * Function to get pending order statuses - * - * @return array - */ - public function get_pending_statuses() { - return apply_filters( 'wc_sc_pending_order_statuses', array( 'on-hold', 'auto-draft', 'pending' ), array( 'source' => $this ) ); - } - - /** - * Checking subtotal is eligible for free shipping method - * - * @param bool $is_available true/false. - * @param array $package Shipping package. - * @param object $free_shipping free shipping object. - * @return mixed|void - */ - public function is_eligible_for_free_shipping( $is_available = false, $package = array(), $free_shipping = null ) { - - // If free shipping is invalid already, no need for further checks. - if ( false === $is_available || ! is_object( $free_shipping ) ) { - return $is_available; - } - - $apply_before_tax = get_option( 'woocommerce_smart_coupon_apply_before_tax', 'no' ); - - if ( $this->is_wc_gte_30() && 'yes' === $apply_before_tax ) { - return $is_available; - } - - $has_coupon = false; - $has_met_min_amount = false; - $has_smart_coupon = false; - $coupon_usable_amount = 0; - $coupons = ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'get_coupons' ) ) ) ? WC()->cart->get_coupons() : array(); - $free_shipping_condition = ! empty( $free_shipping->requires ) ? $free_shipping->requires : ''; - $free_shipping_ignore_discounts = ! empty( $free_shipping->ignore_discounts ) ? $free_shipping->ignore_discounts : ''; - $free_shipping_min_amount = ! empty( $free_shipping->min_amount ) ? $free_shipping->min_amount : 0; - - if ( ! empty( $coupons ) ) { - - foreach ( $coupons as $coupon_code => $coupon ) { - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - if ( 'smart_coupon' === $discount_type ) { - $has_smart_coupon = true; - $coupon_usable_amount += $this->get_amount( $coupon, true ); - } - if ( in_array( $free_shipping_condition, array( 'coupon', 'either', 'both' ), true ) ) { - $coupon_is_valid = ( is_object( $coupon ) && is_callable( array( $coupon, 'is_valid' ) ) ) ? $coupon->is_valid() : false; - $coupon_get_free_shipping = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_free_shipping' ) ) ) ? $coupon->get_free_shipping() : false; - if ( true === $coupon_is_valid && true === $coupon_get_free_shipping ) { - $has_coupon = true; - } - } - } - } - - if ( false === $has_smart_coupon ) { - return $is_available; - } - - if ( in_array( $free_shipping_condition, array( 'min_amount', 'either', 'both' ), true ) ) { - - $total = ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'get_displayed_subtotal' ) ) ) ? WC()->cart->get_displayed_subtotal() : 0; - $display_prices_including_tax = ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'display_prices_including_tax' ) ) ) ? WC()->cart->display_prices_including_tax() : false; - - if ( $display_prices_including_tax ) { - $get_discount_tax = ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'get_discount_tax' ) ) ) ? WC()->cart->get_discount_tax() : 0; - $total = $total - $get_discount_tax; - } - - if ( 'no' === $free_shipping_ignore_discounts ) { - $get_discount_total = ( is_object( WC()->cart ) && is_callable( array( WC()->cart, 'get_discount_total' ) ) ) ? WC()->cart->get_discount_total() : 0; - $total = $total - $get_discount_total; - $total = $total - $coupon_usable_amount; - } - - $total = round( ( $total ), get_option( 'woocommerce_price_num_decimals', 2 ) ); - - if ( $total >= $free_shipping_min_amount ) { - $has_met_min_amount = true; - } - } - - switch ( $free_shipping->requires ) { - case 'min_amount': - $is_available = $has_met_min_amount; - break; - case 'coupon': - $is_available = $has_coupon; - break; - case 'both': - $is_available = $has_met_min_amount && $has_coupon; - break; - case 'either': - $is_available = $has_met_min_amount || $has_coupon; - break; - default: - $is_available = true; - break; - } - - return $is_available; - } - - /** - * Smart coupon system status section in wc system status. - * - * @return void - */ - public function smart_coupons_system_status_report() { - $smart_coupons_settings = array(); - - $max_coupon_to_show = get_option( 'wc_sc_setting_max_coupon_to_show' ); - $coupon_code_length = get_option( 'wc_sc_coupon_code_length' ); - $valid_order_statuses = get_option( 'wc_sc_valid_order_statuses_for_coupon_auto_generation' ); - $is_include_tax = get_option( 'wc_sc_generated_store_credit_includes_tax' ); - $apply_before_tax = get_option( 'woocommerce_smart_coupon_apply_before_tax' ); - $sc_include_tax = get_option( 'woocommerce_smart_coupon_include_tax' ); - $is_delete_smart_coupon_after_usage = get_option( 'woocommerce_delete_smart_coupon_after_usage' ); - $is_send_email = get_option( 'smart_coupons_is_send_email' ); - $is_print = get_option( 'smart_coupons_is_print_coupon' ); - $sell_sc_at_less_price = get_option( 'smart_coupons_sell_store_credit_at_less_price' ); - $pay_from_credit_of_original_order = get_option( 'pay_from_smart_coupon_of_original_order' ); - $stop_recursive_coupon_generation = get_option( 'stop_recursive_coupon_generation' ); - $is_show_coupon_receiver_form = get_option( 'smart_coupons_display_coupon_receiver_details_form' ); - $schedule_store_credit = get_option( 'smart_coupons_schedule_store_credit' ); - $combine_emails = get_option( 'smart_coupons_combine_emails' ); - $enable_taxes = get_option( 'woocommerce_calc_taxes' ); - $price_entered_with_tax_type = get_option( 'woocommerce_prices_include_tax' ); - $round_at_subtotal = get_option( 'woocommerce_tax_round_at_subtotal' ); - $tax_display_shop = get_option( 'woocommerce_tax_display_shop' ); - $tax_display_cart = get_option( 'woocommerce_tax_display_cart' ); - $tax_total_display = get_option( 'woocommerce_tax_total_display' ); - $wc_enable_coupons = get_option( 'woocommerce_enable_coupons' ); - $calc_discounts_sequentially = get_option( 'woocommerce_calc_discounts_sequentially' ); - $wc_sc_dashboard_endpoint = get_option( 'woocommerce_myaccount_wc_sc_dashboard_endpoint', 'wc-smart-coupons' ); - - if ( is_array( $valid_order_statuses ) && ! empty( $valid_order_statuses ) ) { - $valid_order_statuses = implode( ', ', $valid_order_statuses ); - } - - $auto_generated_coupon_email = $this->is_email_template_enabled(); - $combined_email_coupon_enabled = $this->is_email_template_enabled( 'combine' ); - - $smart_coupons_settings = array( - __( 'Number of coupons to show', 'woocommerce-smart-coupons' ) => $max_coupon_to_show, - __( 'Number of characters in auto-generated coupon code', 'woocommerce-smart-coupons' ) => $coupon_code_length, - __( 'Valid order status for auto-generating coupon', 'woocommerce-smart-coupons' ) => $valid_order_statuses, - __( 'Include tax in the amount of the generated gift card', 'woocommerce-smart-coupons' ) => $is_include_tax, - __( 'Deduct credit/gift before doing tax calculations', 'woocommerce-smart-coupons' ) => $apply_before_tax, - __( 'Gift Card discount is inclusive of tax', 'woocommerce-smart-coupons' ) => $sc_include_tax, - __( 'Automatic deletion', 'woocommerce-smart-coupons' ) => $is_delete_smart_coupon_after_usage, - __( 'Coupon emails', 'woocommerce-smart-coupons' ) => $is_send_email, - __( 'Printing coupons', 'woocommerce-smart-coupons' ) => $is_print, - __( 'Sell gift cards at less price?', 'woocommerce-smart-coupons' ) => $sell_sc_at_less_price, - __( 'Use gift card applied in first subscription order for subsequent renewals until credit reaches zero', 'woocommerce-smart-coupons' ) => $pay_from_credit_of_original_order, - __( 'Renewal orders should not generate coupons even when they include a product that issues coupons', 'woocommerce-smart-coupons' ) => $stop_recursive_coupon_generation, - __( 'Allow sending of coupons to others', 'woocommerce-smart-coupons' ) => $is_show_coupon_receiver_form, - __( 'Allow schedule sending of coupons?', 'woocommerce-smart-coupons' ) => $schedule_store_credit, - __( 'Combine emails', 'woocommerce-smart-coupons' ) => $combine_emails, - __( 'Auto generated coupon email', 'woocommerce-smart-coupons' ) => $auto_generated_coupon_email, - __( 'Combined auto generated coupons email', 'woocommerce-smart-coupons' ) => $combined_email_coupon_enabled, - __( 'Acknowledgement email', 'woocommerce-smart-coupons' ) => $auto_generated_coupon_email, - __( 'Enable taxes', 'woocommerce-smart-coupons' ) => $enable_taxes, - __( 'Prices entered with tax', 'woocommerce-smart-coupons' ) => $price_entered_with_tax_type, - __( 'Rounding', 'woocommerce-smart-coupons' ) => $round_at_subtotal, - __( 'Display prices in the shop', 'woocommerce-smart-coupons' ) => $tax_display_shop, - __( 'Display prices during cart and checkout', 'woocommerce-smart-coupons' ) => $tax_display_cart, - __( 'Display tax totals', 'woocommerce-smart-coupons' ) => $tax_total_display, - __( 'Enable the use of coupon codes', 'woocommerce-smart-coupons' ) => $wc_enable_coupons, - __( 'Calculate coupon discounts sequentially', 'woocommerce-smart-coupons' ) => $calc_discounts_sequentially, - __( 'Account endpoints > Coupons', 'woocommerce-smart-coupons' ) => $wc_sc_dashboard_endpoint, - ); - - ?> - - - - - - - - $value ) { - ?> - - - - - - - -

              - -
              - get_var( // phpcs:ignore - $wpdb->prepare( - "SELECT IFNULL( option_value, %s ) - FROM {$wpdb->prefix}options - WHERE option_name = %s", - $default, - $option_name - ) - ); - - } - - /** - * Add total SC used in REST API shop order object. - * - * @since 5.7.0 - * - * @param WP_REST_Response $response WP_REST_Response object. - * @param WC_Order $order WC_Order object. - * @param WP_REST_Request $request WP_REST_Response object. - * @return WP_REST_Response - */ - public function rest_api_prepare_shop_order_object( $response = null, $order = null, $request = null ) { - if ( empty( $response ) || empty( $order ) ) { - return $response; - } - - $sc_order_fields = WC_SC_Order_Fields::get_instance(); - - $total_credit_used = $sc_order_fields->get_total_credit_used_in_order( $order ); - - if ( is_object( $response ) && ! empty( $response->data ) && is_array( $response->data ) ) { - $response->data['store_credit_used'] = round( $total_credit_used, get_option( 'woocommerce_price_num_decimals', 2 ) ); - } - - return $response; - } - - /** - * Function to get coupon amount considering currency - * - * @param WC_Coupon $coupon The coupon object. - * @param boolean $convert Whether to convert or not. - * @param WC_Order $order The order object. - * - * @throws Exception If $coupon is not an object of WC_Coupon. - * @return float - */ - public function get_amount( $coupon = null, $convert = false, $order = null ) { - if ( ! is_a( $coupon, 'WC_Coupon' ) ) { - $error = __( '$coupon is not an object of WC_Coupon', 'woocommerce-smart-coupons' ); - ob_start(); - esc_html_e( '$coupon is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $coupon ) ) ? var_dump( $coupon ) : print_r( gettype( $coupon ) ) . print_r( "\r\n" ); // phpcs:ignore - debug_print_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $this->log( 'error', print_r( $error, true ) . ' ' . __FILE__ . ' ' . __LINE__ . print_r( "\r\n" . ob_get_clean(), true ) ); // phpcs:ignore - return floatval( 0 ); - } - if ( $this->is_wc_gte_30() ) { - $coupon_amount = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_amount' ) ) ) ? $coupon->get_amount() : 0; - } else { - $coupon_amount = ( ! empty( $coupon->amount ) ) ? $coupon->amount : 0; - } - return $coupon_amount; - } - - /** - * Maybe convert price read from database to current currency - * - * @param integer $price The price to be converted. - * @param boolean $convert Whether to convert or not. - * @param WC_Order $order The order object. - * @return float $price The converted price. - */ - public function read_price( $price = 0, $convert = false, $order = null ) { - if ( true === $convert ) { - $order_currency = ''; - if ( is_a( $order, 'WC_Order' ) ) { - if ( $this->is_wc_gte_30() ) { - $order_currency = ( is_callable( array( $order, 'get_currency' ) ) ) ? $order->get_currency() : ''; // phpcs:ignore - } else { - $order_currency = ( is_callable( array( $order, 'get_order_currency' ) ) ) ? $order->get_order_currency() : ''; // phpcs:ignore - } - } - $current_currency = ( ! empty( $order_currency ) ) ? $order_currency : get_woocommerce_currency(); - $base_currency = get_option( 'woocommerce_currency' ); - if ( $base_currency !== $current_currency ) { - $price = $this->convert_price( $price, $current_currency, $base_currency ); - } - $price = apply_filters( - 'wc_sc_read_price', - $price, - array( - 'source' => $this, - 'currency_conversion' => $convert, - 'order_obj' => $order, - ) - ); - } - return $price; - } - - /** - * Maybe convert price to base currency before saving to the database - * - * @param integer $price The price to be converted. - * @param boolean $convert Whether to convert or not. - * @param WC_Order $order The order object. - * @return float $price The converted price. - */ - public function write_price( $price = 0, $convert = false, $order = null ) { - if ( true === $convert ) { - $order_currency = ''; - if ( is_a( $order, 'WC_Order' ) ) { - if ( $this->is_wc_gte_30() ) { - $order_currency = ( is_callable( array( $order, 'get_currency' ) ) ) ? $order->get_currency() : ''; // phpcs:ignore - } else { - $order_currency = ( is_callable( array( $order, 'get_order_currency' ) ) ) ? $order->get_order_currency() : ''; // phpcs:ignore - } - } - $current_currency = ( ! empty( $order_currency ) ) ? $order_currency : get_woocommerce_currency(); - $base_currency = get_option( 'woocommerce_currency' ); - if ( $base_currency !== $current_currency ) { - $price = $this->convert_price( $price, $base_currency, $current_currency ); - } - $price = apply_filters( - 'wc_sc_write_price', - $price, - array( - 'source' => $this, - 'currency_conversion' => $convert, - 'order_obj' => $order, - ) - ); - } - return $price; - } - - /** - * Get post meta considering currency - * - * @param integer $post_id The post id. - * @param string $meta_key The meta key. - * @param boolean $single Whether to get single value or not. - * @param boolean $convert Whether to convert or not. - * @param WC_Order $order The order object. - * - * @throws Exception If Some values not passed for $post_id & $meta_key. - * @return mixed - */ - public function get_post_meta( $post_id = 0, $meta_key = '', $single = false, $convert = false, $order = null ) { - if ( empty( $post_id ) || empty( $meta_key ) ) { - $error = __( 'Some values required for $post_id & $meta_key', 'woocommerce-smart-coupons' ); - ob_start(); - esc_html_e( '$post_id is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $post_id ) ) ? var_dump( $post_id ) : print_r( gettype( $post_id ) ) . print_r( "\r\n" ); // phpcs:ignore - esc_html_e( '$meta_key is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $meta_key ) ) ? var_dump( $meta_key ) : print_r( gettype( $meta_key ) ) . print_r( "\r\n" ); // phpcs:ignore - debug_print_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $this->log( 'error', print_r( $error, true ) . ' ' . __FILE__ . ' ' . __LINE__ . print_r( "\r\n" . ob_get_clean(), true ) ); // phpcs:ignore - return null; - } - $meta_value = ''; - $post_type = ( function_exists( 'get_post_type' ) ) ? get_post_type( $post_id ) : ''; - if ( in_array( $post_type, array( 'product', 'product_variation', 'shop_coupon', 'shop_order' ), true ) ) { - $object = null; - $use_getter = false; - $post_id = absint( $post_id ); - switch ( $post_type ) { - case 'product': - case 'product_variation': - $object = ( function_exists( 'wc_get_product' ) ) ? wc_get_product( $post_id ) : null; - break; - case 'shop_coupon': - $object = new WC_Coupon( $post_id ); - $meta_key_to_props = array( - 'coupon_amount' => 'amount', - 'customer_email' => 'email_restrictions', - 'date_expires' => 'date_expires', - 'discount_type' => 'discount_type', - 'expiry_date' => 'date_expires', - ); - if ( array_key_exists( $meta_key, $meta_key_to_props ) ) { - $function = 'get_' . $meta_key_to_props[ $meta_key ]; - if ( $this->is_callable( $object, $function ) ) { - $use_getter = true; - } - } - break; - case 'shop_order': - $object = ( is_object( $order ) && is_a( $order, 'WC_Order' ) ) ? $order : ( function_exists( 'wc_get_order' ) ? wc_get_order( $post_id ) : null ); - $order = $object; - $meta_key_to_props = array( - '_order_total' => 'total', - '_billing_email' => 'billing_email', - ); - if ( array_key_exists( $meta_key, $meta_key_to_props ) ) { - $function = 'get_' . $meta_key_to_props[ $meta_key ]; - if ( $this->is_callable( $object, $function ) ) { - $use_getter = true; - } - } - break; - } - if ( true === $use_getter ) { - $meta_value = $object->{$function}(); - } elseif ( $this->is_callable( $object, 'get_meta' ) ) { - $meta_value = $object->get_meta( $meta_key ); - } else { - $meta_value = get_post_meta( $post_id, $meta_key, $single ); - } - if ( in_array( $meta_key, array( 'coupon_amount', 'smart_coupons_contribution', 'wc_sc_max_discount', 'wc_sc_original_amount', 'sc_called_credit_details', '_order_discount', '_order_total' ), true ) ) { - $order_currency = null; - if ( ! is_a( $order, 'WC_Order' ) && ! empty( $post_type ) && 'shop_order' === $post_type ) { - $order = ( ! empty( $post_id ) ) ? wc_get_order( $post_id ) : null; - } - if ( is_a( $order, 'WC_Order' ) ) { - if ( $this->is_wc_gte_30() ) { - $order_currency = ( is_callable( array( $order, 'get_currency' ) ) ) ? $order->get_currency() : ''; // phpcs:ignore - } else { - $order_currency = ( is_callable( array( $order, 'get_order_currency' ) ) ) ? $order->get_order_currency() : ''; // phpcs:ignore - } - } - if ( true === $convert ) { - $current_currency = ( ! is_null( $order_currency ) ) ? $order_currency : get_woocommerce_currency(); - $base_currency = get_option( 'woocommerce_currency' ); - if ( $base_currency !== $current_currency ) { - if ( is_scalar( $meta_value ) ) { - $meta_value = $this->convert_price( $meta_value, $current_currency, $base_currency ); - } elseif ( is_array( $meta_value ) ) { - array_walk( - $meta_value, - array( $this, 'array_convert_price' ), - array( - 'to_currency' => $current_currency, - 'from_currency' => $base_currency, - ) - ); - } - } - } - return apply_filters( - 'wc_sc_after_get_post_meta', - $meta_value, - array( - 'source' => $this, - 'currency_conversion' => $convert, - 'post_id' => $post_id, - 'meta_key' => $meta_key, // phpcs:ignore - 'order_obj' => $order, - ) - ); - } - } - return $meta_value; - } - - /** - * Update post meta considering currency - * - * @param integer $post_id The post id. - * @param string $meta_key The meta key. - * @param string $meta_value The meta value. - * @param boolean $convert Whether to convert or not. - * @param WC_Order $order The order object. - * - * @throws Exception If Some values not passed for $post_id & $meta_key. - */ - public function update_post_meta( $post_id = 0, $meta_key = '', $meta_value = '', $convert = false, $order = null ) { - if ( empty( $post_id ) || empty( $meta_key ) ) { - $error = __( 'Some values required for $post_id & $meta_key', 'woocommerce-smart-coupons' ); - ob_start(); - esc_html_e( '$post_id is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $post_id ) ) ? var_dump( $post_id ) : print_r( gettype( $post_id ) ) . print_r( "\r\n" ); // phpcs:ignore - esc_html_e( '$meta_key is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $meta_key ) ) ? var_dump( $meta_key ) : print_r( gettype( $meta_key ) ) . print_r( "\r\n" ); // phpcs:ignore - debug_print_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $this->log( 'error', print_r( $error, true ) . ' ' . __FILE__ . ' ' . __LINE__ . print_r( "\r\n" . ob_get_clean(), true ) ); // phpcs:ignore - return false; - } - $post_type = ( function_exists( 'get_post_type' ) ) ? get_post_type( $post_id ) : ''; - if ( in_array( $meta_key, array( 'coupon_amount', 'smart_coupons_contribution', 'wc_sc_max_discount', 'wc_sc_original_amount', 'sc_called_credit_details', '_order_discount', '_order_total' ), true ) ) { - $order_currency = null; - - if ( ! is_a( $order, 'WC_Order' ) && ! empty( $post_type ) && 'shop_order' === $post_type ) { - $order = ( ! empty( $post_id ) ) ? wc_get_order( $post_id ) : null; - } - if ( is_a( $order, 'WC_Order' ) ) { - if ( $this->is_wc_gte_30() ) { - $order_currency = ( is_callable( array( $order, 'get_currency' ) ) ) ? $order->get_currency() : ''; // phpcs:ignore - } else { - $order_currency = ( is_callable( array( $order, 'get_order_currency' ) ) ) ? $order->get_order_currency() : ''; // phpcs:ignore - } - } - if ( true === $convert ) { - $current_currency = ( ! is_null( $order_currency ) ) ? $order_currency : get_woocommerce_currency(); - $base_currency = get_option( 'woocommerce_currency' ); - if ( $base_currency !== $current_currency ) { - if ( is_scalar( $meta_value ) ) { - $meta_value = $this->convert_price( $meta_value, $base_currency, $current_currency ); - } elseif ( is_array( $meta_value ) ) { - array_walk( - $meta_value, - array( $this, 'array_convert_price' ), - array( - 'to_currency' => $base_currency, - 'from_currency' => $current_currency, - ) - ); - } - } - } - $meta_value = apply_filters( - 'wc_sc_before_update_post_meta', - $meta_value, - array( - 'source' => $this, - 'currency_conversion' => $convert, - 'post_id' => $post_id, - 'meta_key' => $meta_key, // phpcs:ignore - 'order_obj' => $order, - ) - ); - } - if ( in_array( $post_type, array( 'product', 'product_variation', 'shop_coupon', 'shop_order' ), true ) ) { - $object = null; - $use_setter = false; - $post_id = absint( $post_id ); - switch ( $post_type ) { - case 'product': - case 'product_variation': - $object = ( function_exists( 'wc_get_product' ) ) ? wc_get_product( $post_id ) : null; - break; - case 'shop_coupon': - $object = new WC_Coupon( $post_id ); - $meta_key_to_props = array( - 'coupon_amount' => 'amount', - 'customer_email' => 'email_restrictions', - 'date_expires' => 'date_expires', - 'discount_type' => 'discount_type', - 'expiry_date' => 'date_expires', - ); - if ( array_key_exists( $meta_key, $meta_key_to_props ) ) { - $function = 'set_' . $meta_key_to_props[ $meta_key ]; - if ( $this->is_callable( $object, $function ) && $this->is_callable( $object, 'save' ) ) { - $use_setter = true; - } - } - break; - case 'shop_order': - $object = ( is_object( $order ) && is_a( $order, 'WC_Order' ) ) ? $order : ( function_exists( 'wc_get_order' ) ? wc_get_order( $post_id ) : null ); - $meta_key_to_props = array( - '_order_total' => 'total', - '_billing_email' => 'billing_email', - ); - if ( array_key_exists( $meta_key, $meta_key_to_props ) ) { - $function = 'set_' . $meta_key_to_props[ $meta_key ]; - if ( $this->is_callable( $object, $function ) && $this->is_callable( $object, 'save' ) ) { - $use_setter = true; - } - } - break; - } - if ( true === $use_setter ) { - $object->{$function}( $meta_value ); - $object->save(); - } elseif ( $this->is_callable( $object, 'update_meta_data' ) && $this->is_callable( $object, 'save' ) ) { - $object->update_meta_data( $meta_key, $meta_value ); - $object->save(); - } else { - update_post_meta( $post_id, $meta_key, $meta_value ); - } - } - } - - /** - * Wrapper function for deleting post meta - * - * @param integer $post_id The post id. - * @param string $meta_key The meta key to delete. - * @param string $meta_value The meta value to delete. - * @param mixed $object The object. - * - * @throws Exception If Some values not passed for $post_id & $meta_key. - */ - public function delete_post_meta( $post_id = 0, $meta_key = '', $meta_value = '', $object = null ) { - if ( empty( $post_id ) || empty( $meta_key ) ) { - $error = __( 'Some values required for $post_id & $meta_key', 'woocommerce-smart-coupons' ); - ob_start(); - esc_html_e( '$post_id is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $post_id ) ) ? var_dump( $post_id ) : print_r( gettype( $post_id ) ) . print_r( "\r\n" ); // phpcs:ignore - esc_html_e( '$meta_key is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $meta_key ) ) ? var_dump( $meta_key ) : print_r( gettype( $meta_key ) ) . print_r( "\r\n" ); // phpcs:ignore - debug_print_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $this->log( 'error', print_r( $error, true ) . ' ' . __FILE__ . ' ' . __LINE__ . print_r( "\r\n" . ob_get_clean(), true ) ); // phpcs:ignore - return false; - } - if ( is_null( $object ) || ! ( $this->is_callable( $object, 'delete_meta_data' ) && $this->is_callable( $object, 'save' ) ) ) { - $post_type = ( function_exists( 'get_post_type' ) ) ? get_post_type( $post_id ) : ''; - if ( in_array( $post_type, array( 'product', 'product_variation', 'shop_coupon', 'shop_order' ), true ) ) { - $post_id = absint( $post_id ); - switch ( $post_type ) { - case 'product': - case 'product_variation': - $object = ( function_exists( 'wc_get_product' ) ) ? wc_get_product( $post_id ) : null; - break; - case 'shop_coupon': - $object = new WC_Coupon( $post_id ); - break; - case 'shop_order': - $object = ( is_object( $order ) && is_a( $order, 'WC_Order' ) ) ? $order : ( function_exists( 'wc_get_order' ) ? wc_get_order( $post_id ) : null ); - break; - } - } - } - if ( $this->is_callable( $object, 'delete_meta_data' ) && $this->is_callable( $object, 'save' ) ) { - $object->delete_meta_data( $meta_key ); - $object->save(); - } else { - delete_post_meta( $post_id, $meta_key ); - } - } - - /** - * Get value from WooCommerce session - * - * @param string $key The key. - * @param boolean $convert Whether to convert or not. - * - * @throws Exception If $key is not passed. - * @return mixed - */ - public function get_session( $key = '', $convert = false ) { - if ( empty( $key ) ) { - $error = __( '$key is required', 'woocommerce-smart-coupons' ); - ob_start(); - esc_html_e( '$key is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $key ) ) ? var_dump( $key ) : print_r( gettype( $key ) ) . print_r( "\r\n" ); // phpcs:ignore - debug_print_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $this->log( 'error', print_r( $error, true ) . ' ' . __FILE__ . ' ' . __LINE__ . print_r( "\r\n" . ob_get_clean(), true ) ); // phpcs:ignore - return null; - } - if ( ! is_callable( 'WC' ) || ! is_object( WC() ) || ! is_object( WC()->session ) || ! is_callable( array( WC()->session, 'get' ) ) ) { - return null; - } - $value = WC()->session->get( $key ); - if ( 'credit_called' !== $key ) { - return $value; - } - if ( true === $convert ) { - $current_currency = get_woocommerce_currency(); - $base_currency = get_option( 'woocommerce_currency' ); - if ( $base_currency !== $current_currency ) { - if ( ! empty( $value ) ) { - if ( is_scalar( $value ) ) { - $value = $this->convert_price( $value, $current_currency, $base_currency ); - } elseif ( is_array( $value ) ) { - array_walk( - $value, - array( $this, 'array_convert_price' ), - array( - 'to_currency' => $current_currency, - 'from_currency' => $base_currency, - ) - ); - } - } - } - } - return apply_filters( - 'wc_sc_after_get_session', - $value, - array( - 'source' => $this, - 'currency_conversion' => $convert, - 'key' => $key, - ) - ); - } - - /** - * Save a value in WooCommerce session - * - * @param string $key The key. - * @param string $value The value. - * @param boolean $convert Whether to convert or not. - * - * @throws Exception If $key is not passed. - */ - public function set_session( $key = '', $value = '', $convert = false ) { - if ( empty( $key ) ) { - $error = __( '$key is required', 'woocommerce-smart-coupons' ); - ob_start(); - esc_html_e( '$key is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $key ) ) ? var_dump( $key ) : print_r( gettype( $key ) ) . print_r( "\r\n" ); // phpcs:ignore - debug_print_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $this->log( 'error', print_r( $error, true ) . ' ' . __FILE__ . ' ' . __LINE__ . print_r( "\r\n" . ob_get_clean(), true ) ); // phpcs:ignore - return false; - } - if ( ! is_callable( 'WC' ) || ! is_object( WC() ) || ! is_object( WC()->session ) || ! is_callable( array( WC()->session, 'set' ) ) ) { - return; - } - if ( 'credit_called' !== $key ) { - return; - } - if ( true === $convert ) { - $current_currency = get_woocommerce_currency(); - $base_currency = get_option( 'woocommerce_currency' ); - if ( $base_currency !== $current_currency ) { - if ( ! empty( $value ) ) { - if ( is_scalar( $value ) ) { - $value = $this->convert_price( $value, $base_currency, $current_currency ); - } elseif ( is_array( $value ) ) { - array_walk( - $value, - array( $this, 'array_convert_price' ), - array( - 'to_currency' => $base_currency, - 'from_currency' => $current_currency, - ) - ); - } - } - } - } - $value = apply_filters( - 'wc_sc_before_set_session', - $value, - array( - 'source' => $this, - 'currency_conversion' => $convert, - 'key' => $key, - ) - ); - WC()->session->set( $key, $value ); - } - - /** - * Get order item meta considering currency - * - * @param integer $item_id The order item id. - * @param string $item_key The order item key. - * @param boolean $single Whether to get single value or not. - * @param boolean $convert Whether to convert or not. - * - * @throws Exception If Some values not passed for $item_id & $item_key. - * @return mixed - */ - public function get_order_item_meta( $item_id = 0, $item_key = '', $single = false, $convert = false ) { - if ( empty( $item_id ) || empty( $item_key ) ) { - $error = __( 'Some values required for $item_id & $item_key', 'woocommerce-smart-coupons' ); - ob_start(); - esc_html_e( '$item_id is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $item_id ) ) ? var_dump( $item_id ) : print_r( gettype( $item_id ) ) . print_r( "\r\n" ); // phpcs:ignore - esc_html_e( '$item_key is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $item_key ) ) ? var_dump( $item_key ) : print_r( gettype( $item_key ) ) . print_r( "\r\n" ); // phpcs:ignore - debug_print_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $this->log( 'error', print_r( $error, true ) . ' ' . __FILE__ . ' ' . __LINE__ . print_r( "\r\n" . ob_get_clean(), true ) ); // phpcs:ignore - return null; - } - $item_value = wc_get_order_item_meta( $item_id, $item_key, $single ); - if ( in_array( $item_key, array( 'discount', 'discount_amount', 'discount_amount_tax', 'sc_refunded_discount', 'sc_refunded_discount_tax', 'sc_called_credit' ), true ) ) { - if ( $this->is_wc_gte_30() ) { - $order_id = ( ! empty( $item_id ) ) ? wc_get_order_id_by_order_item_id( $item_id ) : 0; - } else { - $order_id = ( ! empty( $item_id ) ) ? $this->get_order_id_by_order_item_id_wclt30( $item_id ) : 0; - } - $order = ( ! empty( $order_id ) ) ? wc_get_order( $order_id ) : null; - $item = ( is_object( $order ) && is_callable( array( $order, 'get_item' ) ) ) ? $order->get_item( $item_id ) : null; - if ( true === $convert ) { - if ( $this->is_wc_gte_30() ) { - $order_currency = ( is_object( $order ) && is_callable( array( $order, 'get_currency' ) ) ) ? $order->get_currency() : ''; // phpcs:ignore - } else { - $order_currency = ( is_object( $order ) && is_callable( array( $order, 'get_order_currency' ) ) ) ? $order->get_order_currency() : ''; // phpcs:ignore - } - if ( ! empty( $order_currency ) ) { - $base_currency = get_option( 'woocommerce_currency' ); - $item_value = $this->convert_price( $item_value, $order_currency, $base_currency ); - } - } - return apply_filters( - 'wc_sc_after_get_order_item_meta', - $item_value, - array( - 'source' => $this, - 'currency_conversion' => $convert, - 'order_item_obj' => $item, - 'order_item_id' => $item_id, - 'order_item_key' => $item_key, - ) - ); - } - return $item_value; - } - - /** - * Add order item meta considering currency - * - * @param integer $item_id The order item id. - * @param string $item_key The order item key. - * @param string $item_value The order item value. - * @param boolean $convert Whether to convert or not. - * - * @throws Exception If Some values not passed for $item_id & $item_key. - */ - public function add_order_item_meta( $item_id = 0, $item_key = '', $item_value = '', $convert = false ) { - if ( empty( $item_id ) || empty( $item_key ) ) { - $error = __( 'Some values required for $item_id & $item_key', 'woocommerce-smart-coupons' ); - ob_start(); - esc_html_e( '$item_id is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $item_id ) ) ? var_dump( $item_id ) : print_r( gettype( $item_id ) ) . print_r( "\r\n" ); // phpcs:ignore - esc_html_e( '$item_key is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $item_key ) ) ? var_dump( $item_key ) : print_r( gettype( $item_key ) ) . print_r( "\r\n" ); // phpcs:ignore - debug_print_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $this->log( 'error', print_r( $error, true ) . ' ' . __FILE__ . ' ' . __LINE__ . print_r( "\r\n" . ob_get_clean(), true ) ); // phpcs:ignore - return 0; - } - if ( in_array( $item_key, array( 'discount', 'discount_amount', 'discount_amount_tax', 'sc_refunded_discount', 'sc_refunded_discount_tax', 'sc_called_credit' ), true ) ) { - $item_value = $this->get_item_value( $item_id, $item_value, $convert ); - } - if ( $this->is_wc_gte_30() ) { - wc_add_order_item_meta( $item_id, $item_key, $item_value ); - } else { - woocommerce_add_order_item_meta( $item_id, $item_key, $item_value ); - } - } - - /** - * Update order item meta considering currency - * - * @param integer $item_id The order item id. - * @param string $item_key The order item key. - * @param string $item_value The order item value. - * @param boolean $convert Whether to convert or not. - * - * @throws Exception If Some values not passed for $item_id & $item_key. - */ - public function update_order_item_meta( $item_id = 0, $item_key = '', $item_value = '', $convert = false ) { - if ( empty( $item_id ) || empty( $item_key ) ) { - $error = __( 'Some values required for $item_id & $item_key', 'woocommerce-smart-coupons' ); - ob_start(); - esc_html_e( '$item_id is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $item_id ) ) ? var_dump( $item_id ) : print_r( gettype( $item_id ) ) . print_r( "\r\n" ); // phpcs:ignore - esc_html_e( '$item_key is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $item_key ) ) ? var_dump( $item_key ) : print_r( gettype( $item_key ) ) . print_r( "\r\n" ); // phpcs:ignore - debug_print_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $this->log( 'error', print_r( $error, true ) . ' ' . __FILE__ . ' ' . __LINE__ . print_r( "\r\n" . ob_get_clean(), true ) ); // phpcs:ignore - return false; - } - if ( in_array( $item_key, array( 'discount', 'discount_amount', 'discount_amount_tax', 'sc_refunded_discount', 'sc_refunded_discount_tax', 'sc_called_credit' ), true ) ) { - $item_value = $this->get_item_value( $item_id, $item_value, $convert ); - } - wc_update_order_item_meta( $item_id, $item_key, $item_value ); - } - - /** - * Delete order item meta - * - * @param integer $item_id The order item id. - * @param string $item_key The order item key. - * @param boolean $convert Whether to convert or not. - * - * @throws Exception If Some values not passed for $item_id & $item_key. - */ - public function delete_order_item_meta( $item_id = 0, $item_key = '', $convert = false ) { - if ( empty( $item_id ) || empty( $item_key ) ) { - $error = __( 'Some values required for $item_id & $item_key', 'woocommerce-smart-coupons' ); - ob_start(); - esc_html_e( '$item_id is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $item_id ) ) ? var_dump( $item_id ) : print_r( gettype( $item_id ) ) . print_r( "\r\n" ); // phpcs:ignore - esc_html_e( '$item_key is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $item_key ) ) ? var_dump( $item_key ) : print_r( gettype( $item_key ) ) . print_r( "\r\n" ); // phpcs:ignore - debug_print_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $this->log( 'error', print_r( $error, true ) . ' ' . __FILE__ . ' ' . __LINE__ . print_r( "\r\n" . ob_get_clean(), true ) ); // phpcs:ignore - return false; - } - if ( in_array( $item_key, array( 'discount', 'discount_amount', 'discount_amount_tax', 'sc_refunded_discount', 'sc_refunded_discount_tax', 'sc_called_credit' ), true ) ) { - if ( $this->is_wc_gte_30() ) { - wc_delete_order_item_meta( $item_id, $item_key ); - } else { - woocommerce_delete_order_item_meta( $item_id, $item_key ); - } - } - } - - /** - * Get order item meta - * - * @param WC_Order_item $item The order item object. - * @param string $item_key The order item meta key. - * @param boolean $convert Whether to convert or not. - * - * @throws Exception If $item is not an object of WC_Order_Item. - * @return mixed - */ - public function get_meta( $item = null, $item_key = '', $convert = false ) { - if ( ! is_a( $item, 'WC_Order_Item' ) ) { - $error = __( '$item is not an object of WC_Order_Item', 'woocommerce-smart-coupons' ); - ob_start(); - esc_html_e( '$item is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $item ) ) ? var_dump( $item ) : print_r( gettype( $item ) ) . print_r( "\r\n" ); // phpcs:ignore - debug_print_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $this->log( 'error', print_r( $error, true ) . ' ' . __FILE__ . ' ' . __LINE__ . print_r( "\r\n" . ob_get_clean(), true ) ); // phpcs:ignore - return null; - } - $item_value = ( is_callable( array( $item, 'get_meta' ) ) ) ? $item->get_meta( $item_key ) : ( ( ! empty( $item[ $item_key ] ) ) ? $item[ $item_key ] : '' ); - if ( in_array( $item_key, array( 'discount', 'discount_amount', 'discount_amount_tax', 'sc_refunded_discount', 'sc_refunded_discount_tax', 'sc_called_credit' ), true ) ) { - $item_id = ( is_callable( array( $item, 'get_id' ) ) ) ? $item->get_id() : 0; - if ( true === $convert ) { - $order = ( is_callable( array( $item, 'get_order' ) ) ) ? $item->get_order() : null; - if ( $this->is_wc_gte_30() ) { - $order_currency = ( is_object( $order ) && is_callable( array( $order, 'get_currency' ) ) ) ? $order->get_currency() : ''; // phpcs:ignore - } else { - $order_currency = ( is_object( $order ) && is_callable( array( $order, 'get_order_currency' ) ) ) ? $order->get_order_currency() : ''; // phpcs:ignore - } - if ( ! empty( $order_currency ) ) { - $base_currency = get_option( 'woocommerce_currency' ); - $item_value = $this->convert_price( $item_value, $order_currency, $base_currency ); - } - } - return apply_filters( - 'wc_sc_after_get_order_item_meta', - $item_value, - array( - 'source' => $this, - 'currency_conversion' => $convert, - 'order_item_obj' => $item, - 'order_item_id' => $item_id, - 'order_item_key' => $item_key, - ) - ); - } - return $item_value; - } - - /** - * Update order item meta considering currency - * - * @param WC_Order_item $item The order item object. - * @param string $item_key The order item meta key. - * @param string $item_value The order item value. - * @param boolean $convert Whether to convert or not. - * - * @throws Exception If $item is not an object of WC_Order_Item. - */ - public function update_meta_data( &$item = null, $item_key = '', $item_value = '', $convert = false ) { - if ( ! is_a( $item, 'WC_Order_Item' ) ) { - $error = __( '$item is not an object of WC_Order_Item', 'woocommerce-smart-coupons' ); - ob_start(); - esc_html_e( '$item is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $item ) ) ? var_dump( $item ) : print_r( gettype( $item ) ) . print_r( "\r\n" ); // phpcs:ignore - debug_print_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $this->log( 'error', print_r( $error, true ) . ' ' . __FILE__ . ' ' . __LINE__ . print_r( "\r\n" . ob_get_clean(), true ) ); // phpcs:ignore - return false; - } - if ( in_array( $item_key, array( 'discount', 'discount_amount', 'discount_amount_tax', 'sc_refunded_discount', 'sc_refunded_discount_tax', 'sc_called_credit' ), true ) ) { - $item_id = ( is_callable( array( $item, 'get_id' ) ) ) ? $item->get_id() : 0; - $item_value = $this->get_item_value( $item_id, $item_value, $convert ); - if ( is_callable( array( $item, 'update_meta_data' ) ) ) { - $item->update_meta_data( $item_key, $item_value ); - } else { - $item[ $item_key ] = $item_value; - } - } - } - - /** - * Check & convert price - * - * @since 6.0.0 - * - * @param float $price The price need to be converted. - * @param string $to_currency The price will be converted to this currency. - * @param string $from_currency The price will be converted from this currency. - * @return float - */ - public function convert_price( $price = 0, $to_currency = null, $from_currency = null ) { - if ( ! class_exists( 'WC_SC_Aelia_CS_Compatibility' ) ) { - include_once 'compat/class-wc-sc-aelia-cs-compatibility.php'; - } - return WC_SC_Aelia_CS_Compatibility::get_instance()->convert_price( $price, $to_currency, $from_currency ); - } - - /** - * Callback function for array_walk to apply convert price on each element of array - * - * @param mixed $value The array element. - * @param mixed $key The array key. - * @param array $args The additional arguments. - */ - public function array_convert_price( &$value = null, $key = null, $args = null ) { - if ( ! is_null( $value ) && ! is_null( $key ) && ! is_null( $args ) ) { - $to_currency = ( ! empty( $args['to_currency'] ) ) ? $args['to_currency'] : ''; - $from_currency = ( ! empty( $args['from_currency'] ) ) ? $args['from_currency'] : ''; - if ( ! empty( $to_currency ) && ! empty( $from_currency ) ) { - $value = $this->convert_price( $value, $to_currency, $from_currency ); - } - } - } - - /** - * Get item value for saving/updating in DB considering currency - * - * @param integer $item_id The order item id. - * @param string $item_value The item value. - * @param boolean $convert Whether to convert or not. - * - * @throws Exception If $item is not passed. - * @return mixed - */ - public function get_item_value( $item_id = 0, $item_value = '', $convert = false ) { - if ( empty( $item_id ) ) { - $error = __( '$item_id is required', 'woocommerce-smart-coupons' ); - ob_start(); - esc_html_e( '$item_id is: ', 'woocommerce-smart-coupons' ) . ( is_scalar( $item_id ) ) ? var_dump( $item_id ) : print_r( gettype( $item_id ) ) . print_r( "\r\n" ); // phpcs:ignore - debug_print_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore - $this->log( 'error', print_r( $error, true ) . ' ' . __FILE__ . ' ' . __LINE__ . print_r( "\r\n" . ob_get_clean(), true ) ); // phpcs:ignore - return null; - } - if ( $this->is_wc_gte_30() ) { - $order_id = ( ! empty( $item_id ) ) ? wc_get_order_id_by_order_item_id( $item_id ) : 0; - } else { - $order_id = ( ! empty( $item_id ) ) ? $this->get_order_id_by_order_item_id_wclt30( $item_id ) : 0; - } - $order = ( ! empty( $order_id ) ) ? wc_get_order( $order_id ) : null; - if ( true === $convert ) { - if ( $this->is_wc_gte_30() ) { - $order_currency = ( is_object( $order ) && is_callable( array( $order, 'get_currency' ) ) ) ? $order->get_currency() : ''; // phpcs:ignore - } else { - $order_currency = ( is_object( $order ) && is_callable( array( $order, 'get_order_currency' ) ) ) ? $order->get_order_currency() : ''; // phpcs:ignore - } - if ( ! empty( $order_currency ) ) { - $base_currency = get_option( 'woocommerce_currency' ); - if ( $base_currency !== $order_currency ) { - $item_value = $this->convert_price( $item_value, $base_currency, $order_currency ); - } - } - } - return apply_filters( - 'wc_sc_before_update_order_item_meta', - $item_value, - array( - 'source' => $this, - 'currency_conversion' => $convert, - 'order_obj' => $order, - 'order_item_id' => $item_id, - ) - ); - - } - - /** - * Get order id by order item id for WooCommerce version lower than 3.0.0 - * - * @param integer $item_id The order item id. - * @return mixed - */ - public function get_order_id_by_order_item_id_wclt30( $item_id = 0 ) { - global $wpdb; - return $wpdb->get_var( // phpcs:ignore - $wpdb->prepare( - "SELECT order_id - FROM {$wpdb->prefix}woocommerce_order_items - WHERE order_item_id = %d", - absint( $item_id ) - ) - ); - } - - /** - * Convert a date string to a WC_DateTime. - * - * Wrapper function to give support for store running WooCommerce 3.0.0. - * - * Credit: WooCommerce - * - * @since 6.3.0 - * @param string $time_string Time string. - * @return WC_DateTime - */ - public function wc_string_to_datetime( $time_string ) { - - if ( function_exists( 'wc_string_to_datetime' ) ) { - return wc_string_to_datetime( $time_string ); - } - - // Strings are defined in local WP timezone. Convert to UTC. - if ( 1 === preg_match( '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(Z|((-|\+)\d{2}:\d{2}))$/', $time_string, $date_bits ) ) { - $offset = ! empty( $date_bits[7] ) ? iso8601_timezone_to_offset( $date_bits[7] ) : $this->wc_timezone_offset(); - $timestamp = gmmktime( $date_bits[4], $date_bits[5], $date_bits[6], $date_bits[2], $date_bits[3], $date_bits[1] ) - $offset; - } else { - $timestamp = wc_string_to_timestamp( get_gmt_from_date( gmdate( 'Y-m-d H:i:s', wc_string_to_timestamp( $time_string ) ) ) ); - } - $datetime = new WC_DateTime( "@{$timestamp}", new DateTimeZone( 'UTC' ) ); - - // Set local timezone or offset. - if ( get_option( 'timezone_string' ) ) { - $datetime->setTimezone( new DateTimeZone( wc_timezone_string() ) ); - } else { - $datetime->set_utc_offset( $this->wc_timezone_offset() ); - } - - return $datetime; - } - - /** - * Get timezone offset in seconds. - * - * Wrapper function for giving support to lower version of WooCommerce - * - * Credit: WooCommerce - * - * @since 6.3.0 - * @return float - */ - public function wc_timezone_offset() { - - if ( function_exists( 'wc_timezone_offset' ) ) { - return wc_timezone_offset(); - } - - $timezone = get_option( 'timezone_string' ); - - if ( $timezone ) { - $timezone_object = new DateTimeZone( $timezone ); - return $timezone_object->getOffset( new DateTime( 'now' ) ); - } else { - return floatval( get_option( 'gmt_offset', 0 ) ) * HOUR_IN_SECONDS; - } - } - - /** - * Get timestamp from date string - * - * @param string $date_string The date in string format. - * @return int - */ - public function wc_string_to_datetime_to_timestamp( $date_string = '' ) { - $timestamp = null; - if ( ! empty( $date_string ) ) { - $datetime = $this->wc_string_to_datetime( $date_string ); - $timestamp = ( is_object( $datetime ) && is_callable( array( $datetime, 'getTimestamp' ) ) ) ? $datetime->getTimestamp() : null; - } - return $timestamp; - } - - /** - * Maybe convert to correct value for meta 'date_expires' - * - * @param mixed $date_expires The current date_expires value. - * @return mixed - */ - public function get_date_expires_value( $date_expires = null ) { - $date_expires = intval( $date_expires ); - $date_expires = ( ! empty( $date_expires ) ) ? $date_expires : null; - return $date_expires; - } - - /** - * Converts a string (e.g. 'yes' or 'no') to a bool. - * - * Credit: WooCommerce - * - * @since 7.2.0 - * @param string|bool $string String to convert. If a bool is passed it will be returned as-is. - * @return bool - */ - public function wc_string_to_bool( $string ) { - - if ( function_exists( 'wc_string_to_bool' ) ) { - return wc_string_to_bool( $string ); - } - - return is_bool( $string ) ? $string : ( 'yes' === strtolower( $string ) || 1 === $string || 'true' === strtolower( $string ) || '1' === $string ); - } - - /** - * Converts a bool to a 'yes' or 'no'. - * - * Credit: WooCommerce - * - * @since 7.2.0 - * @param bool|string $bool Bool to convert. If a string is passed it will first be converted to a bool. - * @return string - */ - public function wc_bool_to_string( $bool ) { - - if ( function_exists( 'wc_bool_to_string' ) ) { - return wc_bool_to_string( $bool ); - } - - if ( ! is_bool( $bool ) ) { - $bool = $this->wc_string_to_bool( $bool ); - } - return true === $bool ? 'yes' : 'no'; - } - - /** - * Compatible function for mb_detect_encoding. - * - * (c) Fabien Potencier - * - * @author Nicolas Grekas - * - * @param string $string The string to be checked. - * @param mixed $encodings List of encoding. - * @param boolean $strict Strict checking or not. - * @return mixed - */ - public function mb_detect_encoding( $string, $encodings = null, $strict = false ) { - - if ( function_exists( 'mb_detect_encoding' ) ) { - return mb_detect_encoding( $string, $encodings, $strict ); - } - - if ( null === $encodings ) { - $encodings = array( 'ASCII', 'UTF-8' ); - } else { - if ( ! is_array( $encodings ) ) { - $encodings = array_map( 'trim', explode( ',', $encodings ) ); - } - $encodings = array_map( 'strtoupper', $encodings ); - } - - foreach ( $encodings as $enc ) { - switch ( $enc ) { - case 'ASCII': - if ( ! preg_match( '/[\x80-\xFF]/', $string ) ) { - return $enc; - } - break; - - case 'UTF8': - case 'UTF-8': - if ( preg_match( '//u', $string ) ) { - return 'UTF-8'; - } - break; - - default: - if ( 0 === strncmp( $enc, 'ISO-8859-', 9 ) ) { - return $enc; - } - } - } - - return false; - } - - /** - * Check if a method is callable w.r.t. given object or not - * - * @param mixed $object The object. - * @param string $method The method name. - * @return boolean - */ - public function is_callable( $object = null, $method = '' ) { - if ( empty( $object ) || empty( $method ) ) { - return false; - } - $type = gettype( $object ); - if ( ! in_array( $type, array( 'string', 'object' ), true ) ) { - return false; - } - if ( 'string' === $type && ! class_exists( $object ) ) { - return false; - } - return is_callable( array( $object, $method ) ); - } - - /** - * Function to declare WooCommerce HPOS related compatibility status - */ - public function hpos_compat_declaration() { - if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ) { - \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-smart-coupons/woocommerce-smart-coupons.php', false ); - } - } - - }//end class - -} // End class exists check diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/compat/class-sa-wc-compatibility-4-4.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/compat/class-sa-wc-compatibility-4-4.php deleted file mode 100644 index 351cb808..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/compat/class-sa-wc-compatibility-4-4.php +++ /dev/null @@ -1,203 +0,0 @@ -' ); - } - - } - -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/compat/class-wc-sc-aelia-cs-compatibility.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/compat/class-wc-sc-aelia-cs-compatibility.php deleted file mode 100644 index ff35170e..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/compat/class-wc-sc-aelia-cs-compatibility.php +++ /dev/null @@ -1,89 +0,0 @@ - $this ) ); - add_action( $form_position_hook, array( $wc_sc_purchase_credit, 'gift_certificate_receiver_detail_form' ) ); - } - add_action( 'wp_footer', array( $this, 'enqueue_styles_scripts' ), 99 ); - } - } - - /** - * Get single instance of WC_SC_KCO_Compatibility - * - * @return WC_SC_KCO_Compatibility Singleton object of WC_SC_KCO_Compatibility - */ - public static function get_instance() { - // Check if instance is already exists. - if ( is_null( self::$instance ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Handle call to functions which is not available in this class - * - * @param string $function_name Function to call. - * @param array $arguments Array of arguments passed while calling $function_name. - * @return mixed Result of function call. - */ - public function __call( $function_name, $arguments = array() ) { - - global $woocommerce_smart_coupon; - - if ( ! is_callable( array( $woocommerce_smart_coupon, $function_name ) ) ) { - return; - } - - if ( ! empty( $arguments ) ) { - return call_user_func_array( array( $woocommerce_smart_coupon, $function_name ), $arguments ); - } else { - return call_user_func( array( $woocommerce_smart_coupon, $function_name ) ); - } - } - - /** - * Enqueue required styles/scripts for store credit frontend form - */ - public function enqueue_styles_scripts() { - - // Return if gift certificate form is not shown. - if ( ! did_action( 'wc_sc_gift_certificate_form_shown' ) ) { - return; - } - - if ( ! wp_script_is( 'jquery' ) ) { - wp_enqueue_script( 'jquery' ); - } - - ?> - - get_currency() : false; - $price = wmc_get_price( $price, $currency ); - } - return $price; - } - - /** - * Function to modify the value of the credit called - * - * @param mized $price The price. - * @param array $args Additional arguments. - * @return mized - */ - public function credit_called_price_cart( $price = 0, $args = array() ) { - if ( function_exists( 'wmc_get_price' ) ) { - $price = wmc_get_price( $price ); - } - return $price; - } - - } - -} - -WC_SC_WMC_Compatibility::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/compat/class-wc-sc-wpml-compatibility.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/compat/class-wc-sc-wpml-compatibility.php deleted file mode 100644 index e5dede3c..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/compat/class-wc-sc-wpml-compatibility.php +++ /dev/null @@ -1,72 +0,0 @@ -products ) && has_action( 'woocommerce_before_checkout_process', array( $woocommerce_wpml->products, 'wcml_refresh_cart_total' ) ) ) { - remove_action( 'woocommerce_before_checkout_process', array( $woocommerce_wpml->products, 'wcml_refresh_cart_total' ) ); - } - if ( ! empty( $woocommerce_wpml->cart ) && has_action( 'woocommerce_before_checkout_process', array( $woocommerce_wpml->cart, 'wcml_refresh_cart_total' ) ) ) { - remove_action( 'woocommerce_before_checkout_process', array( $woocommerce_wpml->cart, 'wcml_refresh_cart_total' ) ); - } - } - } - - } - -} - -WC_SC_WPML_Compatibility::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/compat/class-wcopc-sc-compatibility.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/compat/class-wcopc-sc-compatibility.php deleted file mode 100644 index 45638350..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/compat/class-wcopc-sc-compatibility.php +++ /dev/null @@ -1,166 +0,0 @@ -gift_certificate_receiver_detail_form(); - $fragments['wc_sc_receiver_detail_form'] = ob_get_clean(); - - return $fragments; - } - - /** - * Add Styles And Scripts - */ - public function add_styles_and_scripts() { - if ( ! class_exists( 'WC_SC_Purchase_Credit' ) ) { - include_once '../class-wc-sc-purchase-credit.php'; - } - $wc_sc_purchase_credit = WC_SC_Purchase_Credit::get_instance(); - $wc_sc_purchase_credit->enqueue_timepicker(); - add_action( 'wp_footer', array( $this, 'styles_and_scripts' ) ); - } - - /** - * Styles And Scripts - */ - public function styles_and_scripts() { - if ( ! wp_script_is( 'jquery' ) ) { - wp_enqueue_script( 'jquery' ); - } - ?> - - is_wc_gte_30() ) { - $subscription_parent_order = $subscription->get_parent(); - $original_order_id = ( is_object( $subscription_parent_order ) && is_callable( array( $subscription_parent_order, 'get_id' ) ) ) ? $subscription_parent_order->get_id() : 0; - } else { - $original_order_id = ( ! empty( $subscription->order->id ) ) ? $subscription->order->id : 0; - } - - if ( empty( $original_order_id ) ) { - return $subscription; - } - - $renewal_total = $subscription->get_total(); - $original_order = wc_get_order( $original_order_id ); - $coupon_used_in_original_order = $this->get_coupon_codes( $original_order ); - - if ( $this->is_wc_gte_30() ) { - $order_payment_method = $original_order->get_payment_method(); - } else { - $order_payment_method = ( ! empty( $original_order->payment_method ) ) ? $original_order->payment_method : 0; - } - - if ( count( $coupon_used_in_original_order ) > 0 ) { - foreach ( $coupon_used_in_original_order as $coupon_code ) { - $coupon = new WC_Coupon( $coupon_code ); - if ( $this->is_wc_gte_30() ) { - $discount_type = $coupon->get_discount_type(); - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - $coupon_amount = $this->get_amount( $coupon, true, $original_order ); - if ( ! empty( $discount_type ) && 'smart_coupon' === $discount_type && ! empty( $coupon_amount ) ) { - if ( $coupon_amount >= $renewal_total ) { - $subscription->set_payment_method( '' ); - } else { - $payment_gateways = WC()->payment_gateways->get_available_payment_gateways(); - if ( ! empty( $payment_gateways[ $order_payment_method ] ) ) { - $payment_method = $payment_gateways[ $order_payment_method ]; - $subscription->set_payment_method( $payment_method ); - } - } - } - } - } - } - - return $subscription; - } - - /** - * Function to add meta which is necessary for coupon processing, in order - * - * @param array $meta Order meta. - * @param WC_Order $to_order Order to copy meta to. - * @param WC_Order $from_order Order to copy meta from. - * @return array $meta - */ - public function sc_wcs_renewal_order_meta( $meta = array(), $to_order = null, $from_order = null ) { - - if ( $this->is_wc_gte_30() ) { - $order = $from_order->get_parent(); - $order_id = ( is_object( $order ) && is_callable( array( $order, 'get_id' ) ) ) ? $order->get_id() : 0; - } else { - $order = $from_order->order; - $order_id = ( ! empty( $order->id ) ) ? $order->id : 0; - } - - if ( empty( $order_id ) ) { - return $meta; - } - - $is_callable_order_get_meta = $this->is_callable( $order, 'get_meta' ); - - $meta_exists = array( - 'coupon_sent' => false, - 'gift_receiver_email' => false, - 'gift_receiver_message' => false, - 'sc_called_credit_details' => false, - 'smart_coupons_contribution' => false, - ); - - foreach ( $meta as $index => $data ) { - if ( $this->is_wcs_gte( '2.2.0' ) ) { - if ( ! empty( $data['meta_key'] ) ) { - $prefixed_key = wcs_maybe_prefix_key( $data['meta_key'] ); - $unprefixed_key = ( $data['meta_key'] === $prefixed_key ) ? substr( $data['meta_key'], 1 ) : $data['meta_key']; - if ( array_key_exists( $unprefixed_key, $meta_exists ) ) { - unset( $meta[ $index ] ); - } - } - } else { - if ( ! empty( $data['meta_key'] ) && array_key_exists( $data['meta_key'], $meta_exists ) ) { - $meta_exists[ $data['meta_key'] ] = true; // phpcs:ignore - } - } - } - - foreach ( $meta_exists as $key => $value ) { - if ( $value ) { - continue; - } - $meta_value = ( true === $is_callable_order_get_meta ) ? $order->get_meta( $key ) : get_post_meta( $order_id, $key, true ); - - if ( empty( $meta_value ) ) { - continue; - } - - if ( $this->is_wcs_gte( '2.2.0' ) ) { - $renewal_order_id = ( $this->is_callable( $to_order, 'get_id' ) ) ? $to_order->get_id() : 0; - $is_callable_to_order_update_meta = $this->is_callable( $to_order, 'update_meta_data' ); - if ( 'coupon_sent' === $key ) { - // No need to update meta 'coupon_sent' as it's being updated by function sc_modify_renewal_order in this class. - continue; - } elseif ( 'smart_coupons_contribution' === $key ) { - if ( true === $is_callable_to_order_update_meta ) { - $to_order->update_meta_data( $key, array() ); - } else { - update_post_meta( $renewal_order_id, $key, array() ); - } - } else { - if ( true === $is_callable_to_order_update_meta ) { - $to_order->update_meta_data( $key, $meta_value ); - } else { - update_post_meta( $renewal_order_id, $key, $meta_value ); - } - } - } else { - if ( ! isset( $meta ) || ! is_array( $meta ) ) { - $meta = array(); - } - $meta[] = array( - 'meta_key' => $key, // phpcs:ignore - 'meta_value' => $meta_value, // phpcs:ignore - ); - } - } - - return $meta; - } - - /** - * Function to modify renewal order meta - * - * @param WC_Order $renewal_order Order created on subscription renewal. - * @param WC_Subscription $subscription Subscription we're basing the order off of. - * @return WC_Order $renewal_order - */ - public function sc_wcs_modify_renewal_order_meta( $renewal_order = null, $subscription = null ) { - global $wpdb; - - if ( $this->is_wc_gte_30() ) { - $renewal_order_id = ( is_object( $renewal_order ) && is_callable( array( $renewal_order, 'get_id' ) ) ) ? $renewal_order->get_id() : 0; - } else { - $renewal_order_id = ( ! empty( $renewal_order->id ) ) ? $renewal_order->id : 0; - } - - if ( empty( $renewal_order_id ) ) { - return $renewal_order; - } - - $sc_called_credit_details = $this->get_post_meta( $renewal_order_id, 'sc_called_credit_details', true, true, $renewal_order ); - if ( empty( $sc_called_credit_details ) ) { - return $renewal_order; - } - - $old_order_item_ids = ( ! empty( $sc_called_credit_details ) ) ? array_keys( $sc_called_credit_details ) : array(); - - if ( ! empty( $old_order_item_ids ) ) { - - $old_order_item_ids = array_map( 'absint', $old_order_item_ids ); - - $meta_keys = array( '_variation_id', '_product_id' ); - $how_many = count( $old_order_item_ids ); - $placeholder = array_fill( 0, $how_many, '%d' ); - - $meta_keys = esc_sql( $meta_keys ); - - // @codingStandardsIgnoreStart. - $query_to_fetch_product_ids = $wpdb->prepare( - "SELECT woim.order_item_id, - (CASE - WHEN woim.meta_key = %s AND woim.meta_value > 0 THEN woim.meta_value - WHEN woim.meta_key = %s AND woim.meta_value > 0 THEN woim.meta_value - END) AS product_id - FROM {$wpdb->prefix}woocommerce_order_itemmeta AS woim - WHERE woim.order_item_id IN ( " . implode( ',', $placeholder ) . " ) - AND woim.meta_key IN ( %s, %s ) - GROUP BY woim.order_item_id", - array_merge( $meta_keys, $old_order_item_ids, array_reverse( $meta_keys ) ) - ); - // @codingStandardsIgnoreEnd. - - $product_ids_results = $wpdb->get_results( $query_to_fetch_product_ids, 'ARRAY_A' ); // phpcs:ignore - - if ( ! is_wp_error( $product_ids_results ) && ! empty( $product_ids_results ) ) { - $product_to_old_item = array(); - foreach ( $product_ids_results as $result ) { - $product_to_old_item[ $result['product_id'] ] = $result['order_item_id']; - } - - $found_product_ids = ( ! empty( $product_to_old_item ) ) ? $product_to_old_item : array(); - - $query_to_fetch_new_order_item_ids = $wpdb->prepare( - "SELECT woim.order_item_id, - (CASE - WHEN woim.meta_value > 0 THEN woim.meta_value - END) AS product_id - FROM {$wpdb->prefix}woocommerce_order_items AS woi - LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS woim - ON (woim.order_item_id = woi.order_item_id AND woim.meta_key IN ( %s, %s )) - WHERE woi.order_id = %d - AND woim.order_item_id IS NOT NULL - GROUP BY woim.order_item_id", - '_product_id', - '_variation_id', - $renewal_order_id - ); - - $new_order_item_ids_result = $wpdb->get_results( $query_to_fetch_new_order_item_ids, 'ARRAY_A' ); // phpcs:ignore - - if ( ! is_wp_error( $new_order_item_ids_result ) && ! empty( $new_order_item_ids_result ) ) { - $product_to_new_item = array(); - foreach ( $new_order_item_ids_result as $result ) { - $product_to_new_item[ $result['product_id'] ] = $result['order_item_id']; - } - } - } - } - foreach ( $sc_called_credit_details as $item_id => $credit_amount ) { - $product_id = array_search( $item_id, $product_to_old_item, true ); - if ( false !== $product_id ) { - $sc_called_credit_details[ $product_to_new_item[ $product_id ] ] = $credit_amount; - unset( $sc_called_credit_details[ $product_to_old_item[ $product_id ] ] ); - } - } - - $this->update_post_meta( $renewal_order_id, 'sc_called_credit_details', $sc_called_credit_details, true, $renewal_order ); - return $renewal_order; - } - - /** - * New function to handle auto generation of coupon from renewal orders (WCS 2.0+) - * - * @param array $order_items Order items. - * @param WC_Order $renewal_order Order created on subscription renewal. - * @param WC_Subscription $subscription Subscription we're basing the order off of. - * @return array $order_items - */ - public function sc_wcs_modify_renewal_order( $order_items = null, $renewal_order = null, $subscription = null ) { - - if ( $this->is_wc_gte_30() ) { - $subscription_parent_order = $subscription->get_parent(); - $subscription_order_id = ( is_object( $subscription_parent_order ) && is_callable( array( $subscription_parent_order, 'get_id' ) ) ) ? $subscription_parent_order->get_id() : 0; - $renewal_order_id = ( is_callable( array( $renewal_order, 'get_id' ) ) ) ? $renewal_order->get_id() : 0; - } else { - $subscription_order_id = ( ! empty( $subscription->order->id ) ) ? $subscription->order->id : 0; - $renewal_order_id = ( ! empty( $renewal_order->id ) ) ? $renewal_order->id : 0; - } - - $order_items = $this->sc_modify_renewal_order( $order_items, $subscription_order_id, $renewal_order_id ); - return $order_items; - } - - /** - * New function to modify order_items of renewal order (WCS 2.0+) - * - * @param array $order_items Order items. - * @param WC_Order $renewal_order Order created on subscription renewal. - * @param WC_Subscription $subscription Subscription we're basing the order off of. - * @return array $order_items - */ - public function sc_wcs_renewal_order_items( $order_items = null, $renewal_order = null, $subscription = null ) { - - if ( $this->is_wc_gte_30() ) { - $subscription_parent_order = $subscription->get_parent(); - $subscription_order_id = ( is_object( $subscription_parent_order ) && is_callable( array( $subscription_parent_order, 'get_id' ) ) ) ? $subscription_parent_order->get_id() : 0; - $renewal_order_id = ( is_callable( array( $renewal_order, 'get_id' ) ) ) ? $renewal_order->get_id() : 0; - } else { - $subscription_order_id = ( ! empty( $subscription->order->id ) ) ? $subscription->order->id : 0; - $renewal_order_id = ( ! empty( $renewal_order->id ) ) ? $renewal_order->id : 0; - } - - $order_items = $this->sc_subscriptions_renewal_order_items( $order_items, $subscription_order_id, $renewal_order_id, 0, 'child' ); - return $order_items; - } - - /** - * New function to mark payment complete for renewal order (WCS 2.0+) - * - * @param WC_Order $renewal_order Order object. - * @param WC_Subscription $subscription Subscription we're basing the order off of. - * @return WC_Order $renewal_order - */ - public function sc_wcs_renewal_complete_payment( $renewal_order = null, $subscription = null ) { - $this->sc_renewal_complete_payment( $renewal_order ); - return $renewal_order; - } - - /** - * Function to save Smart Coupon's contribution in discount - * - * @param int $order_id Order ID. - */ - public function smart_coupons_contribution( $order_id = 0 ) { - - if ( self::is_wcs_gte( '2.0.0' ) ) { - $is_renewal_order = wcs_order_contains_renewal( $order_id ); - } else { - $is_renewal_order = WC_Subscriptions_Renewal_Order::is_renewal( $order_id ); - } - - if ( ! $is_renewal_order ) { - return; - } - - $applied_coupons = ( is_object( WC()->cart ) && isset( WC()->cart->applied_coupons ) ) ? WC()->cart->applied_coupons : array(); - - if ( ! empty( $applied_coupons ) ) { - - $order_id = absint( $order_id ); - $order = ( function_exists( 'wc_get_order' ) ) ? wc_get_order( $order_id ) : null; - - foreach ( $applied_coupons as $code ) { - - $smart_coupon = new WC_Coupon( $code ); - - if ( $this->is_wc_gte_30() ) { - $discount_type = $smart_coupon->get_discount_type(); - } else { - $discount_type = ( ! empty( $smart_coupon->discount_type ) ) ? $smart_coupon->discount_type : ''; - } - - if ( 'smart_coupon' === $discount_type ) { - - $smart_coupon_credit_used = $this->get_post_meta( $order_id, 'smart_coupons_contribution', true, true ); - - $cart_smart_coupon_credit_used = WC()->cart->smart_coupon_credit_used; - - $update = false; - - if ( ! empty( $smart_coupon_credit_used ) ) { - if ( ! empty( $cart_smart_coupon_credit_used ) ) { - foreach ( $cart_smart_coupon_credit_used as $code => $amount ) { - $smart_coupon_credit_used[ $code ] = $amount; - $update = true; - } - } - } else { - $smart_coupon_credit_used = $cart_smart_coupon_credit_used; - $update = true; - } - - if ( $update ) { - $this->update_post_meta( $order_id, 'smart_coupons_contribution', $smart_coupon_credit_used, true, $order ); - } - } - } - } - } - - /** - * Get first order of a subscription to which the supplied order belongs - * - * @param integer $order_id The order id. - * @return integer - */ - public function get_first_order_id( $order_id = 0 ) { - if ( self::is_wcs_gte( '2.0.0' ) && ! empty( $order_id ) ) { - $subscriptions = wcs_get_subscriptions_for_order( $order_id ); - $related_order_ids = ( is_object( $subscriptions ) && is_callable( array( $subscriptions, 'get_related_order_ids' ) ) ) ? $subscriptions->get_related_order_ids() : array(); - $related_order_ids = array_filter( $related_order_ids ); - if ( ! empty( $related_order_ids ) ) { - sort( $related_order_ids, SORT_NUMERIC ); - reset( $related_order_ids ); - return current( $related_order_ids ); - } - } - return 0; - } - - /** - * Set 'coupon_sent' as 'no' for renewal order to allow auto generation of coupons (if applicable) - * - * @param array $order_items Associative array of order items. - * @param int $original_order_id Post ID of the order being used to purchased the subscription being renewed. - * @param int $renewal_order_id Post ID of the order created for renewing the subscription. - * @param int $product_id ID of the product being renewed. - * @param string $new_order_role The role the renewal order is taking, one of 'parent' or 'child'. - * @return array $order_items - */ - public function sc_modify_renewal_order( $order_items = null, $original_order_id = 0, $renewal_order_id = 0, $product_id = 0, $new_order_role = null ) { - - if ( empty( $original_order_id ) && empty( $renewal_order_id ) ) { - return $order_items; - } - - if ( empty( $original_order_id ) ) { - $original_order_id = $this->get_first_order_id( $renewal_order_id ); - if ( empty( $original_order_id ) ) { - return $order_items; - } - } - - if ( self::is_wcs_gte( '2.0.0' ) ) { - $is_subscription_order = wcs_order_contains_subscription( $original_order_id ); - } else { - $is_subscription_order = WC_Subscriptions_Order::order_contains_subscription( $original_order_id ); - } - if ( $is_subscription_order ) { - $return = false; - } else { - $return = true; - } - if ( $return ) { - return $order_items; - } - - $is_recursive = false; - if ( ! empty( $order_items ) ) { - foreach ( $order_items as $order_item ) { - $send_coupons_on_renewals = 'no'; - $item_product_id = ( $this->is_callable( $order_item, 'get_product_id' ) ) ? $order_item->get_product_id() : $order_item['product_id']; - $item_variation_id = ( $this->is_callable( $order_item, 'get_variation_id' ) ) ? $order_item->get_variation_id() : $order_item['variation_id']; - $item_product = ( ! empty( $item_product_id ) && function_exists( 'wc_get_product' ) ) ? wc_get_product( $item_product_id ) : null; - $item_variation = ( ! empty( $item_variation_id ) && function_exists( 'wc_get_product' ) ) ? wc_get_product( $item_variation_id ) : null; - $is_callable_item_product_get_meta = $this->is_callable( $item_product, 'get_meta' ); - $is_callable_item_variation_get_meta = $this->is_callable( $item_variation, 'get_meta' ); - if ( ! empty( $item_variation_id ) ) { - $coupon_titles = ( true === $is_callable_item_variation_get_meta ) ? $item_variation->get_meta( '_coupon_title' ) : get_post_meta( $item_variation_id, '_coupon_title', true ); - if ( empty( $coupon_titles ) ) { - $send_coupons_on_renewals = ( true === $is_callable_item_product_get_meta ) ? $item_product->get_meta( 'send_coupons_on_renewals' ) : get_post_meta( $item_product_id, 'send_coupons_on_renewals', true ); - } else { - $send_coupons_on_renewals = ( true === $is_callable_item_variation_get_meta ) ? $item_variation->get_meta( 'send_coupons_on_renewals' ) : get_post_meta( $item_variation_id, 'send_coupons_on_renewals', true ); - } - } elseif ( ! empty( $item_product_id ) ) { - $send_coupons_on_renewals = ( true === $is_callable_item_product_get_meta ) ? $item_product->get_meta( 'send_coupons_on_renewals' ) : get_post_meta( $item_product_id, 'send_coupons_on_renewals', true ); - } else { - continue; - } - if ( 'yes' === $send_coupons_on_renewals ) { - $is_recursive = true; - break; // if in any order item recursive is enabled, it will set coupon_sent as 'no'. - } - } - } - $renewal_order_id = absint( $renewal_order_id ); - $renewal_order = ( ! empty( $renewal_order_id ) && function_exists( 'wc_get_order' ) ) ? wc_get_order( $renewal_order_id ) : null; - $is_callable_renewal_order_update_meta = $this->is_callable( $renewal_order, 'update_meta_data' ); - - $stop_recursive_coupon_generation = get_option( 'stop_recursive_coupon_generation', 'no' ); - if ( ( empty( $stop_recursive_coupon_generation ) || 'no' === $stop_recursive_coupon_generation ) && $is_recursive ) { - if ( true === $is_callable_renewal_order_update_meta ) { - $renewal_order->update_meta_data( 'coupon_sent', 'no' ); - } else { - update_post_meta( $renewal_order_id, 'coupon_sent', 'no' ); - } - } else { - if ( true === $is_callable_renewal_order_update_meta ) { - $renewal_order->update_meta_data( 'coupon_sent', 'yes' ); - } else { - update_post_meta( $renewal_order_id, 'coupon_sent', 'yes' ); - } - } - - if ( $this->is_callable( $renewal_order, 'save' ) ) { - $renewal_order->save(); - } - - return $order_items; - } - - /** - * Get order item subtotal - * - * @param WC_Order_Item_Product $order_item The order item. - * @return mixed - */ - public function sc_get_order_item_subtotal( $order_item = null ) { - if ( is_object( $order_item ) && is_callable( array( $order_item, 'get_total' ) ) ) { - return $order_item->get_total(); - } - return floatval( 0 ); - } - - /** - * Function to modify order_items of renewal order - * - * @param array $order_items Associative array of order items. - * @param int $original_order_id Post ID of the order being used to purchased the subscription being renewed. - * @param int $renewal_order_id Post ID of the order created for renewing the subscription. - * @param int $product_id ID of the product being renewed. - * @param string $new_order_role The role the renewal order is taking, one of 'parent' or 'child'. - * @return array $order_items - */ - public function sc_subscriptions_renewal_order_items( $order_items = null, $original_order_id = 0, $renewal_order_id = 0, $product_id = 0, $new_order_role = null ) { - - if ( empty( $original_order_id ) && empty( $renewal_order_id ) ) { - return $order_items; - } - - if ( empty( $original_order_id ) ) { - $original_order_id = $this->get_first_order_id( $renewal_order_id ); - if ( empty( $original_order_id ) ) { - return $order_items; - } - } - - if ( self::is_wcs_gte( '2.0.0' ) ) { - $is_subscription_order = wcs_order_contains_subscription( $original_order_id ); - } else { - $is_subscription_order = WC_Subscriptions_Order::order_contains_subscription( $original_order_id ); - } - if ( $is_subscription_order ) { - $return = false; - } else { - $return = true; - } - if ( $return ) { - return $order_items; - } - - $pay_from_credit_of_original_order = get_option( 'pay_from_smart_coupon_of_original_order', 'yes' ); - - if ( 'child' !== $new_order_role ) { - return $order_items; - } - if ( empty( $renewal_order_id ) || empty( $original_order_id ) ) { - return $order_items; - } - - $original_order = wc_get_order( $original_order_id ); - $renewal_order = wc_get_order( $renewal_order_id ); - - $subscriptions = wcs_get_subscriptions_for_order( $original_order, array( 'order_type' => 'parent' ) ); - reset( $subscriptions ); - $subscription = current( $subscriptions ); - - $coupon_used_in_original_order = $this->get_coupon_codes( $original_order ); - $coupon_used_in_renewal_order = $this->get_coupon_codes( $renewal_order ); - - if ( $this->is_wc_gte_30() ) { - $renewal_order_billing_email = ( is_callable( array( $renewal_order, 'get_billing_email' ) ) ) ? $renewal_order->get_billing_email() : ''; - } else { - $renewal_order_billing_email = ( ! empty( $renewal_order->billing_email ) ) ? $renewal_order->billing_email : ''; - } - - $all_coupons = array_merge( $coupon_used_in_original_order, $coupon_used_in_renewal_order ); - $all_coupons = array_unique( $all_coupons ); - - if ( count( $all_coupons ) > 0 ) { - $apply_before_tax = get_option( 'woocommerce_smart_coupon_apply_before_tax', 'no' ); - - $smart_coupons_contribution = array(); - foreach ( $all_coupons as $coupon_code ) { - $coupon = new WC_Coupon( $coupon_code ); - if ( $this->is_wc_gte_30() ) { - $discount_type = $coupon->get_discount_type(); - $coupon_product_ids = $coupon->get_product_ids(); - $coupon_category_ids = $coupon->get_product_categories(); - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $coupon_product_ids = ( ! empty( $coupon->product_ids ) ) ? $coupon->product_ids : array(); - $coupon_category_ids = ( ! empty( $coupon->product_categories ) ) ? $coupon->product_categories : array(); - } - - $coupon_amount = $this->get_amount( $coupon, true, $renewal_order ); - - if ( ! empty( $discount_type ) && 'smart_coupon' === $discount_type && ! empty( $coupon_amount ) ) { - if ( 'yes' !== $pay_from_credit_of_original_order && in_array( $coupon_code, $coupon_used_in_original_order, true ) ) { - continue; - } - if ( $this->is_wc_gte_30() && 'yes' === $apply_before_tax ) { - $renewal_order_items = ( is_object( $subscription ) && is_callable( array( $subscription, 'get_items' ) ) ) ? $subscription->get_items( 'line_item' ) : array(); - if ( empty( $renewal_order_items ) ) { - break; - } - $subtotal = 0; - $items_to_apply_credit = array(); - if ( count( $coupon_product_ids ) > 0 || count( $coupon_category_ids ) > 0 ) { - foreach ( $renewal_order_items as $renewal_order_item_id => $renewal_order_item ) { - $renewal_product_id = ( is_object( $renewal_order_item ) && is_callable( array( $renewal_order_item, 'get_product_id' ) ) ) ? $renewal_order_item->get_product_id() : $renewal_order_item['product_id']; - $renewal_variation_id = ( is_object( $renewal_order_item ) && is_callable( array( $renewal_order_item, 'get_variation_id' ) ) ) ? $renewal_order_item->get_variation_id() : $renewal_order_item['variation_id']; - $product_category_ids = wc_get_product_cat_ids( $renewal_product_id ); - if ( count( $coupon_product_ids ) > 0 && count( $coupon_category_ids ) > 0 ) { - if ( ( in_array( $renewal_product_id, $coupon_product_ids, true ) || in_array( $renewal_variation_id, $coupon_product_ids, true ) ) && count( array_intersect( $product_category_ids, $coupon_category_ids ) ) > 0 ) { - $items_to_apply_credit[ $renewal_order_item_id ] = $renewal_order_item; - } - } else { - if ( in_array( $renewal_product_id, $coupon_product_ids, true ) || in_array( $renewal_variation_id, $coupon_product_ids, true ) || count( array_intersect( $product_category_ids, $coupon_category_ids ) ) > 0 ) { - $items_to_apply_credit[ $renewal_order_item_id ] = $renewal_order_item; - } - } - } - } else { - $items_to_apply_credit = $renewal_order_items; - } - if ( empty( $items_to_apply_credit ) ) { - continue; - } - $subtotal = array_sum( array_map( array( $this, 'sc_get_order_item_subtotal' ), $items_to_apply_credit ) ); - if ( $subtotal <= 0 ) { - continue; - } - if ( ! class_exists( 'WC_SC_Apply_Before_Tax' ) ) { - include_once '../class-wc-sc-apply-before-tax.php'; - } - $sc_apply_before_tax = WC_SC_Apply_Before_Tax::get_instance(); - foreach ( $renewal_order_items as $renewal_order_item_id => $renewal_order_item ) { - if ( array_key_exists( $renewal_order_item_id, $items_to_apply_credit ) ) { - $discounting_amount = $renewal_order_item->get_total(); - $quantity = $renewal_order_item->get_quantity(); - $discount = $sc_apply_before_tax->sc_get_discounted_price( $discounting_amount, $quantity, $subtotal, $coupon_amount ); - $discount *= $quantity; - $renewal_order_items[ $renewal_order_item_id ]->set_total( $discounting_amount - $discount ); - } - } - $renewal_order_total = $subtotal; - $order_items = $renewal_order_items; - } else { - $renewal_order_total = $renewal_order->get_total(); - } - $discount = min( $renewal_order_total, $coupon_amount ); - if ( $discount > 0 ) { - $new_order_total = $renewal_order_total - $discount; - $this->update_post_meta( $renewal_order_id, '_order_total', $new_order_total, true, $renewal_order ); - $this->update_post_meta( $renewal_order_id, '_order_discount', $discount, true, $renewal_order ); - if ( $new_order_total <= floatval( 0 ) ) { - if ( $this->is_callable( $renewal_order, 'update_meta_data' ) && $this->is_callable( $renewal_order, 'save' ) ) { - $renewal_order->update_meta_data( '_renewal_paid_by_smart_coupon', 'yes' ); - $renewal_order->save(); - } else { - update_post_meta( $renewal_order_id, '_renewal_paid_by_smart_coupon', 'yes' ); - } - } - if ( $this->is_wc_gte_30() ) { - $item = new WC_Order_Item_Coupon(); - $item->set_props( - array( - 'code' => $coupon_code, - 'discount' => $discount, - 'order_id' => ( is_object( $renewal_order ) && is_callable( array( $renewal_order, 'get_id' ) ) ) ? $renewal_order->get_id() : 0, - ) - ); - $item->save(); - $renewal_order->add_item( $item ); - } else { - $renewal_order->add_coupon( $coupon_code, $discount ); - } - $smart_coupons_contribution[ $coupon_code ] = $discount; - } - } - } - if ( ! empty( $smart_coupons_contribution ) ) { - $this->update_post_meta( $renewal_order_id, 'smart_coupons_contribution', $smart_coupons_contribution, true, $renewal_order ); - $renewal_order->sc_total_credit_used = $smart_coupons_contribution; - } - } - - return $order_items; - } - - /** - * Function to trigger complete payment for renewal if it's paid by Smart Coupons - * - * @param WC_Order $renewal_order Order created on subscription renewal. - * @param WC_Order $original_order Order being used to purchased the subscription. - * @param int $product_id ID of the product being renewed. - * @param string $new_order_role The role the renewal order is taking, one of 'parent' or 'child'. - */ - public function sc_renewal_complete_payment( $renewal_order = null, $original_order = null, $product_id = 0, $new_order_role = null ) { - global $store_credit_label; - - if ( $this->is_wc_gte_30() ) { - $renewal_order_id = ( is_object( $renewal_order ) && is_callable( array( $renewal_order, 'get_id' ) ) ) ? $renewal_order->get_id() : 0; - } else { - $renewal_order_id = ( ! empty( $renewal_order->id ) ) ? $renewal_order->id : 0; - } - - if ( empty( $renewal_order_id ) ) { - return; - } - if ( self::is_wcs_gte( '2.0.0' ) ) { - $is_renewal_order = wcs_order_contains_renewal( $renewal_order_id ); - } else { - $is_renewal_order = WC_Subscriptions_Renewal_Order::is_renewal( $renewal_order_id ); - } - if ( $is_renewal_order ) { - $return = false; - } else { - $return = true; - } - if ( $return ) { - return; - } - - $order_needs_processing = false; - - if ( count( $renewal_order->get_items() ) > 0 ) { - foreach ( $renewal_order->get_items() as $item ) { - $_product = ( is_object( $item ) && is_callable( array( $item, 'get_product' ) ) ) ? $item->get_product() : $renewal_order->get_product_from_item( $item ); - - if ( $_product instanceof WC_Product ) { - $virtual_downloadable_item = $_product->is_downloadable() && $_product->is_virtual(); - - if ( apply_filters( 'woocommerce_order_item_needs_processing', ! $virtual_downloadable_item, $_product, $renewal_order_id ) ) { - $order_needs_processing = true; - break; - } - } else { - $order_needs_processing = true; - break; - } - } - } - - if ( $this->is_callable( $renewal_order, 'meta_exists' ) && true !== $renewal_order->meta_exists( '_renewal_paid_by_smart_coupon' ) ) { - $renewal_order->read_meta_data( true ); - } - - $is_renewal_paid_by_smart_coupon = ( $this->is_callable( $renewal_order, 'get_meta' ) ) ? $renewal_order->get_meta( '_renewal_paid_by_smart_coupon' ) : get_post_meta( $renewal_order_id, '_renewal_paid_by_smart_coupon', true ); - if ( ! empty( $is_renewal_paid_by_smart_coupon ) && 'yes' === $is_renewal_paid_by_smart_coupon ) { - - /* translators: %s: singular name for store credit */ - $order_paid_txt = ! empty( $store_credit_label['singular'] ) ? sprintf( __( 'Order paid by %s', 'woocommerce-smart-coupons' ), strtolower( $store_credit_label['singular'] ) ) : __( 'Order paid by store credit.', 'woocommerce-smart-coupons' ); - $renewal_order->update_status( apply_filters( 'woocommerce_payment_complete_order_status', $order_needs_processing ? 'processing' : 'completed', $renewal_order_id, $renewal_order ), $order_paid_txt ); // HN WC SA Support #7485. - } - } - - /** - * Get valid_subscription_coupon array and add smart_coupon type - * - * @param bool $is_validate_for_subscription Validate coupon or not. - * @param WC_Coupon $coupon Coupon object. - * @param bool $valid Coupon Validity. - * @return bool $is_validate_for_subscription whether to validate coupon for subscription or not. - */ - public function smart_coupon_as_valid_subscription_coupon_type( $is_validate_for_subscription, $coupon, $valid ) { - - if ( $this->is_wc_gte_30() ) { - $discount_type = ( ! empty( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : 0; - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - - if ( ! empty( $discount_type ) && 'smart_coupon' === $discount_type ) { - $is_validate_for_subscription = false; - } - - return $is_validate_for_subscription; - } - - /** - * Function to show gift certificate received details form based on product type - * - * @param boolean $is_show Whether to show or not. - * @param array $args Additional arguments. - * @return boolean [description] - */ - public function is_show_gift_certificate_receiver_detail_form( $is_show = false, $args = array() ) { - - if ( wcs_cart_contains_renewal() ) { - return false; - } - - return $is_show; - } - - /** - * Function to add subscription specific settings - * - * @param array $settings Existing settings. - * @return array $settings - */ - public function smart_coupons_settings( $settings = array() ) { - global $store_credit_label; - - $singular = ( ! empty( $store_credit_label['singular'] ) ) ? $store_credit_label['singular'] : __( 'store credit', 'woocommerce-smart-coupons' ); - - $wc_subscriptions_options = array( - array( - 'name' => __( 'Recurring subscriptions', 'woocommerce-smart-coupons' ), - /* translators: %s: Label for store credit */ - 'desc' => sprintf( __( 'Use %s applied in first subscription order for subsequent renewals until credit reaches zero', 'woocommerce-smart-coupons' ), strtolower( $singular ) ), - 'id' => 'pay_from_smart_coupon_of_original_order', - 'type' => 'checkbox', - 'default' => 'no', - 'checkboxgroup' => 'start', - 'autoload' => false, - ), - array( - 'desc' => __( 'Renewal orders should not generate coupons even when they include a product that issues coupons', 'woocommerce-smart-coupons' ), - 'id' => 'stop_recursive_coupon_generation', - 'type' => 'checkbox', - 'default' => 'no', - 'checkboxgroup' => 'end', - 'autoload' => false, - ), - ); - - array_splice( $settings, ( count( $settings ) - 17 ), 0, $wc_subscriptions_options ); - - return $settings; - - } - - /** - * Whether to bypass coupon removal from recurring item - * - * @param boolean $bypass Bypass or not. - * @param WC_Coupon $coupon The coupon object. - * @param string $coupon_type The discount type. - * @param string $calculation_type The calculation type of subscription. - * @return boolean $bypass Bypass or not - */ - public function bypass_removal_of_coupon_having_coupon_actions( $bypass = false, $coupon = null, $coupon_type = '', $calculation_type = '' ) { - - if ( $this->is_wc_gte_30() ) { - $coupon_code = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_code' ) ) ) ? $coupon->get_code() : ''; - } else { - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - if ( ! class_exists( 'WC_SC_Coupon_Actions' ) ) { - include_once 'class-wc-sc-coupon-actions.php'; - } - - $wc_sc_coupon_actions = WC_SC_Coupon_Actions::get_instance(); - - $coupon_actions = $wc_sc_coupon_actions->get_coupon_actions( $coupon_code ); - - if ( false === $bypass && ! empty( $coupon_actions ) ) { - $coupon = new WC_Coupon( $coupon_code ); - $discount_type = $coupon->get_discount_type(); - if ( 'smart_coupon' === $discount_type ) { - return true; - } - } - - return $bypass; - } - - /** - * Modify recurring cart - * Specifically, remove coupons having coupon actions from recurring carts - * - * @param mixed $total The total. - * @return mixed $total - */ - public function modify_recurring_cart( $total ) { - - $recurring_carts = WC()->cart->recurring_carts; - - if ( ! empty( $recurring_carts ) ) { - - if ( ! class_exists( 'WC_SC_Coupon_Actions' ) ) { - include_once 'class-wc-sc-coupon-actions.php'; - } - - $wc_sc_coupon_actions = WC_SC_Coupon_Actions::get_instance(); - - foreach ( WC()->cart->recurring_carts as $cart_item_key => $cart ) { - if ( ! empty( $cart->applied_coupons ) ) { - foreach ( $cart->applied_coupons as $index => $coupon_code ) { - $coupon_actions = $wc_sc_coupon_actions->get_coupon_actions( $coupon_code ); - if ( ! empty( $coupon_actions ) ) { - $coupon = new WC_Coupon( $coupon_code ); - $discount_type = $coupon->get_discount_type(); - if ( 'smart_coupon' === $discount_type ) { - unset( WC()->cart->recurring_carts[ $cart_item_key ]->applied_coupons[ $index ] ); - } - } - } - } - } - } - - return $total; - - } - - /** - * Hooks for WCS 2.3.0+ - */ - public function hooks_for_wcs_230() { - if ( $this->is_wcs_gte( '2.3.0' ) ) { - add_filter( 'wc_smart_coupons_export_headers', array( $this, 'export_headers' ) ); - add_filter( 'smart_coupons_parser_postmeta_defaults', array( $this, 'postmeta_defaults' ) ); - add_filter( 'sc_generate_coupon_meta', array( $this, 'generate_coupon_meta' ), 10, 2 ); - add_action( 'wc_sc_new_coupon_generated', array( $this, 'copy_subscriptions_coupon_meta' ) ); - } - } - - /** - * Add subscriptions coupon meta in export headers - * - * @param array $headers Existing headers. - * @return array - */ - public function export_headers( $headers = array() ) { - - $action_headers = array( - '_wcs_number_payments' => __( 'Active for x payments', 'woocommerce-smart-coupons' ), - ); - - return array_merge( $headers, $action_headers ); - - } - - /** - * Post meta defaults for subscriptions coupon meta - * - * @param array $defaults Existing postmeta defaults. - * @return array - */ - public function postmeta_defaults( $defaults = array() ) { - - $actions_defaults = array( - '_wcs_number_payments' => '', - ); - - return array_merge( $defaults, $actions_defaults ); - } - - /** - * Add subscriptions coupons meta with value in coupon meta - * - * @param array $data The row data. - * @param array $post The POST values. - * @return array Modified data - */ - public function generate_coupon_meta( $data = array(), $post = array() ) { - - if ( isset( $post['wcs_number_payments'] ) ) { - $data['_wcs_number_payments'] = trim( $post['wcs_number_payments'] ); - } - - return $data; - } - - /** - * Function to copy subscription coupon meta in newly generated coupon - * - * @param array $args The arguments. - */ - public function copy_subscriptions_coupon_meta( $args = array() ) { - - $new_coupon_id = ( ! empty( $args['new_coupon_id'] ) ) ? absint( $args['new_coupon_id'] ) : 0; - $coupon = ( ! empty( $args['ref_coupon'] ) ) ? $args['ref_coupon'] : false; - - if ( empty( $new_coupon_id ) || empty( $coupon ) ) { - return; - } - - $wcs_number_payments = ''; - if ( $this->is_wc_gte_30() ) { - $wcs_number_payments = $coupon->get_meta( '_wcs_number_payments' ); - } else { - $old_coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $wcs_number_payments = get_post_meta( $old_coupon_id, '_wcs_number_payments', true ); - } - $this->update_post_meta( $new_coupon_id, '_wcs_number_payments', $wcs_number_payments ); - - } - - /** - * Get the reference key after which the setting will be inserted - * - * @param string $after_key The key after which the setting to be inserted. - * @param array $args Additional arguments. - * @return string - */ - public function endpoint_account_settings_after_key( $after_key = '', $args = array() ) { - return 'woocommerce_myaccount_subscription_payment_method_endpoint'; - } - - /** - * Function to change coupon display name for Subscription coupons - * - * @param string $coupon_type The type of the coupon. - * @param WC_Coupon $coupon Coupon object. - * @param array $all_discount_types List of available discount types. - * @return string - */ - public function valid_display_type( $coupon_type, $coupon, $all_discount_types ) { - if ( 'Recurring Product % Discount' === $coupon_type ) { - $coupon_type = 'Recurring Product Discount'; - } elseif ( 'Sign Up Fee % Discount' === $coupon_type ) { - $coupon_type = 'Sign Up Fee Discount'; - } - return $coupon_type; - } - - /** - * Function to change coupon amount display for Subscription coupons - * - * @param float $coupon_amount Coupon amount. - * @param WC_Coupon $coupon Coupon object. - * @return float - */ - public function valid_display_amount( $coupon_amount, $coupon ) { - $coupon_discount_type = $coupon->get_discount_type(); - if ( 'recurring_percent' === $coupon_discount_type || 'sign_up_fee_percent' === $coupon_discount_type ) { - $coupon_amount = $coupon_amount . '%'; - } elseif ( 'recurring_fee' === $coupon_discount_type || 'sign_up_fee' === $coupon_discount_type ) { - $coupon_amount = wc_price( $coupon_amount ); - } - return $coupon_amount; - } - - /** - * Coupon design thumbnail src set for subscription coupons - * - * @param array $src_set Existing src set. - * @param array $args Additional arguments. - * @return array - */ - public function coupon_design_thumbnail_src_set( $src_set = array(), $args = array() ) { - $coupon = ( ! empty( $args['coupon_object'] ) ) ? $args['coupon_object'] : null; - if ( $this->is_wc_gte_30() ) { - $discount_type = ( is_object( $coupon ) && is_callable( array( $coupon, 'get_discount_type' ) ) ) ? $coupon->get_discount_type() : ''; - } else { - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - } - if ( ! empty( $discount_type ) ) { - switch ( $discount_type ) { - case 'sign_up_fee': - case 'sign_up_fee_percent': - $src_set = array( - 'subs-discount-voucher.svg', - ); - break; - - case 'recurring_fee': - case 'recurring_percent': - $src_set = array( - 'subs-calendar-discount.svg', - ); - break; - } - } - return $src_set; - } - - /** - * Get percent discount types fromm subscriptions - * - * @param array $discount_types Existing discount tyeps. - * @param array $args Additional arguments. - * @return array - */ - public function percent_discount_types( $discount_types = array(), $args = array() ) { - $subs_percent_discount_types = array( - 'sign_up_fee_percent', - 'recurring_percent', - ); - $discount_types = array_merge( $discount_types, $subs_percent_discount_types ); - return $discount_types; - } - - /** - * Function to check if a coupon can be auto applied or not - * - * @param boolean $is_auto_apply Is auto apply. - * @param array $args Additional arguments. - * @return boolean - */ - public function is_auto_apply( $is_auto_apply = true, $args = array() ) { - $cart_total = ( ! empty( $args['cart_total'] ) ) ? floatval( $args['cart_total'] ) : 0; - $cart_contains_subscription = self::is_cart_contains_subscription(); - if ( false === $is_auto_apply && empty( $cart_total ) && true === $cart_contains_subscription ) { - $is_auto_apply = true; - } - return $is_auto_apply; - } - - /** - * Function to check if cart contains subscription - * - * @return bool whether cart contains subscription or not - */ - public static function is_cart_contains_subscription() { - if ( class_exists( 'WC_Subscriptions_Cart' ) && WC_Subscriptions_Cart::cart_contains_subscription() ) { - return true; - } - return false; - } - - /** - * Function to check WooCommerce Subscription version - * - * @param string $version Subscription version. - * @return bool whether passed version is greater than or equal to current version of WooCommerce Subscription - */ - public static function is_wcs_gte( $version = null ) { - if ( is_null( $version ) ) { - return false; - } - if ( version_compare( $version, '4.0.0', '>=' ) && class_exists( 'WC_Subscriptions_Core_Plugin' ) ) { - return true; - } - if ( ! class_exists( 'WC_Subscriptions' ) || empty( WC_Subscriptions::$version ) ) { - return false; - } - return version_compare( WC_Subscriptions::$version, $version, '>=' ); - } - - } - -} - -WCS_SC_Compatibility::get_instance(); diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/emails/class-wc-sc-acknowledgement-email.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/emails/class-wc-sc-acknowledgement-email.php deleted file mode 100644 index 417739b7..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/emails/class-wc-sc-acknowledgement-email.php +++ /dev/null @@ -1,348 +0,0 @@ -id = 'wc_sc_acknowledgement_email'; - - $this->customer_email = true; - - // Set email title and description. - $this->title = __( 'Smart Coupons - Acknowledgement email', 'woocommerce-smart-coupons' ); - $this->description = __( 'Send an acknowledgement email to the purchaser. One email per customer.', 'woocommerce-smart-coupons' ); - - // Use our plugin templates directory as the template base. - $this->template_base = dirname( WC_SC_PLUGIN_FILE ) . '/templates/'; - - // Email template location. - $this->template_html = 'acknowledgement-email.php'; - $this->template_plain = 'plain/acknowledgement-email.php'; - - $this->placeholders = array( - '{coupon_type}' => '', - ); - - // Trigger for this email. - add_action( 'wc_sc_acknowledgement_email_notification', array( $this, 'trigger' ) ); - - // Call parent constructor to load any other defaults not explicity defined here. - parent::__construct(); - } - - /** - * Get default email subject. - * - * @return string Default email subject - */ - public function get_default_subject() { - return __( '{site_title}: {coupon_type} sent successfully', 'woocommerce-smart-coupons' ); - } - - /** - * Get default email heading. - * - * @return string Default email heading - */ - public function get_default_heading() { - return __( '{coupon_type} sent successfully', 'woocommerce-smart-coupons' ); - } - - /** - * Get default scheduled email subject. - * - * @return string Default email subject - */ - public function get_default_scheduled_subject() { - return __( '{site_title}: {coupon_type} has been successfully scheduled', 'woocommerce-smart-coupons' ); - } - - /** - * Get default scheduled email heading. - * - * @return string Default email heading - */ - public function get_default_scheduled_heading() { - return __( '{coupon_type} has been successfully scheduled', 'woocommerce-smart-coupons' ); - } - - /** - * Initialize Settings Form Fields - */ - public function init_form_fields() { - - /* translators: %s: list of placeholders */ - $placeholder_text = sprintf( __( 'This will be used when the setting "WooCommerce > Settings > Smart Coupons > Allow schedule sending of coupons?" is enabled. Available placeholders: %s.', 'woocommerce-smart-coupons' ), '' . implode( ', ', array_keys( $this->placeholders ) ) . '' ); - - $form_fields = array( - 'scheduled_subject' => array( - 'title' => __( 'Scheduled email subject', 'woocommerce-smart-coupons' ), - 'type' => 'text', - 'desc_tip' => true, - 'description' => $placeholder_text, - 'placeholder' => $this->get_default_scheduled_subject(), - 'default' => '', - ), - 'scheduled_heading' => array( - 'title' => __( 'Scheduled email heading', 'woocommerce-smart-coupons' ), - 'type' => 'text', - 'desc_tip' => true, - 'description' => $placeholder_text, - 'placeholder' => $this->get_default_scheduled_heading(), - 'default' => '', - ), - ); - - parent::init_form_fields(); - - $this->form_fields = array_merge( $this->form_fields, $form_fields ); - } - - /** - * Determine if the email should actually be sent and setup email merge variables - * - * @param array $args Email arguments. - */ - public function trigger( $args = array() ) { - - $this->email_args = wp_parse_args( $args, $this->email_args ); - - if ( ! isset( $this->email_args['email'] ) || empty( $this->email_args['email'] ) ) { - return; - } - - $email_scheduled_details = ! empty( $this->email_args['scheduled_email'] ) ? $this->email_args['scheduled_email'] : array(); - $this->is_email_scheduled = ! empty( $email_scheduled_details ); - - $this->setup_locale(); - - $this->recipient = $this->email_args['email']; - - $order_id = isset( $this->email_args['order_id'] ) ? $this->email_args['order_id'] : 0; - - // Get order object. - if ( ! empty( $order_id ) && 0 !== $order_id ) { - $order = wc_get_order( $order_id ); - if ( is_a( $order, 'WC_Order' ) ) { - $this->object = $order; - } - } - - $this->set_placeholders(); - - $email_content = $this->get_content(); - // Replace placeholders with values in the email content. - $email_content = ( is_callable( array( $this, 'format_string' ) ) ) ? $this->format_string( $email_content ) : $email_content; - - // Send email. - if ( $this->is_enabled() && $this->get_recipient() ) { - $this->send( $this->get_recipient(), $this->get_subject(), $email_content, $this->get_headers(), $this->get_attachments() ); - } - - $this->restore_locale(); - } - - /** - * Function to get email subject. - * - * @return string Email subject. - */ - public function get_subject() { - if ( true === $this->is_email_scheduled ) { - return $this->get_scheduled_subject(); - } - return parent::get_subject(); - } - - /** - * Function to get email subject. - * - * @return string Email subject. - */ - public function get_heading() { - if ( true === $this->is_email_scheduled ) { - return $this->get_scheduled_heading(); - } - return parent::get_heading(); - } - - /** - * Get scheduled email subject. - * - * @return string - */ - public function get_scheduled_subject() { - return apply_filters( - $this->id . '_scheduled_subject', - $this->format_string( $this->get_option( 'scheduled_subject', $this->get_default_scheduled_subject() ) ), - array( - 'email_object' => $this->object, - 'source' => $this, - ) - ); - } - - /** - * Get scheduled email heading. - * - * @return string - */ - public function get_scheduled_heading() { - return apply_filters( - $this->id . '_scheduled_heading', - $this->format_string( $this->get_option( 'scheduled_heading', $this->get_default_scheduled_heading() ) ), - array( - 'email_object' => $this->object, - 'source' => $this, - ) - ); - } - - /** - * Function to set placeholder variables used in email subject/heading - */ - public function set_placeholders() { - $this->placeholders['{coupon_type}'] = $this->get_coupon_type(); - } - - /** - * Function to load email html content - * - * @return string Email content html - */ - public function get_content_html() { - - global $woocommerce_smart_coupon; - - $order = $this->object; - - $email_heading = $this->get_heading(); - - $email = isset( $this->email_args['email'] ) ? $this->email_args['email'] : ''; - $receivers_detail = isset( $this->email_args['receivers_detail'] ) ? $this->email_args['receivers_detail'] : array(); - $receiver_name = isset( $this->email_args['receiver_name'] ) ? $this->email_args['receiver_name'] : ''; - $receiver_count = isset( $this->email_args['receiver_count'] ) ? $this->email_args['receiver_count'] : 0; - $email_scheduled_details = isset( $this->email_args['scheduled_email'] ) ? $this->email_args['scheduled_email'] : array(); - $contains_core_coupons = ( isset( $this->email_args['contains_core_coupons'] ) && 'yes' === $this->email_args['contains_core_coupons'] ) ? $this->email_args['contains_core_coupons'] : 'no'; - - $default_path = $this->template_base; - $template_path = $woocommerce_smart_coupon->get_template_base_dir( $this->template_html ); - - ob_start(); - - wc_get_template( - $this->template_html, - array( - 'email' => $email, - 'email_heading' => $email_heading, - 'order' => $order, - 'receivers_detail' => $receivers_detail, - 'gift_certificate_receiver_name' => $receiver_name, - 'receiver_count' => $receiver_count, - 'email_scheduled_details' => $email_scheduled_details, - 'contains_core_coupons' => $contains_core_coupons, - ), - $template_path, - $default_path - ); - - return ob_get_clean(); - } - - /** - * Function to load email plain content - * - * @return string Email plain content - */ - public function get_content_plain() { - - global $woocommerce_smart_coupon; - - $order = $this->object; - $email_heading = $this->get_heading(); - - $email = isset( $this->email_args['email'] ) ? $this->email_args['email'] : ''; - $receivers_detail = isset( $this->email_args['receivers_detail'] ) ? $this->email_args['receivers_detail'] : array(); - $receiver_name = isset( $this->email_args['receiver_name'] ) ? $this->email_args['receiver_name'] : ''; - $receiver_count = isset( $this->email_args['receiver_count'] ) ? $this->email_args['receiver_count'] : 0; - $email_scheduled_details = isset( $this->email_args['scheduled_email'] ) ? $this->email_args['scheduled_email'] : array(); - $contains_core_coupons = ( isset( $this->email_args['contains_core_coupons'] ) && 'yes' === $this->email_args['contains_core_coupons'] ) ? $this->email_args['contains_core_coupons'] : 'no'; - - $default_path = $this->template_base; - $template_path = $woocommerce_smart_coupon->get_template_base_dir( $this->template_html ); - - ob_start(); - - wc_get_template( - $this->template_plain, - array( - 'email' => $email, - 'email_heading' => $email_heading, - 'order' => $order, - 'receivers_detail' => $receivers_detail, - 'gift_certificate_receiver_name' => $receiver_name, - 'receiver_count' => $receiver_count, - 'email_scheduled_details' => $email_scheduled_details, - 'contains_core_coupons' => $contains_core_coupons, - ), - $template_path, - $default_path - ); - - return ob_get_clean(); - } - - /** - * Function to get coupon type for current coupon being sent. - * - * @return string $coupon_type Coupon type. - */ - public function get_coupon_type() { - - global $store_credit_label; - - $receiver_count = isset( $this->email_args['receiver_count'] ) ? $this->email_args['receiver_count'] : 0; - $singular = ( ! empty( $store_credit_label['singular'] ) ) ? ucwords( $store_credit_label['singular'] ) : __( 'Gift card', 'woocommerce-smart-coupons' ); - $plural = ( ! empty( $store_credit_label['plural'] ) ) ? ucwords( $store_credit_label['plural'] ) : __( 'Gift cards', 'woocommerce-smart-coupons' ); - $coupon_type = ( $receiver_count > 1 ) ? $plural : $singular; - $contains_core_coupons = ( isset( $this->email_args['contains_core_coupons'] ) && 'yes' === $this->email_args['contains_core_coupons'] ) ? $this->email_args['contains_core_coupons'] : 'no'; - - if ( 'yes' === $contains_core_coupons ) { - $coupon_type = _n( 'Coupon', 'Coupons', $receiver_count, 'woocommerce-smart-coupons' ); - } - - return $coupon_type; - } - - } - -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/emails/class-wc-sc-combined-email-coupon.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/emails/class-wc-sc-combined-email-coupon.php deleted file mode 100644 index 8114991c..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/emails/class-wc-sc-combined-email-coupon.php +++ /dev/null @@ -1,265 +0,0 @@ -id = 'wc_sc_combined_email_coupon'; - - $this->customer_email = true; - - // Set email title and description. - $this->title = __( 'Smart Coupons - Combined auto generated coupons email', 'woocommerce-smart-coupons' ); - $this->description = __( 'Send only one email instead of multiple emails when multiple coupons are generated per recipient.', 'woocommerce-smart-coupons' ); - - // Use our plugin templates directory as the template base. - $this->template_base = dirname( WC_SC_PLUGIN_FILE ) . '/templates/'; - - // Email template location. - $this->template_html = 'combined-email.php'; - $this->template_plain = 'plain/combined-email.php'; - - $this->placeholders = array( - '{sender_name}' => '', - ); - - // Trigger for this email. - add_action( 'wc_sc_combined_email_coupon_notification', array( $this, 'trigger' ) ); - - // Call parent constructor to load any other defaults not explicity defined here. - parent::__construct(); - } - - /** - * Get default email subject. - * - * @return string Default email subject - */ - public function get_default_subject() { - return __( '{site_title}: Congratulations! You\'ve received coupons from {sender_name}', 'woocommerce-smart-coupons' ); - } - - /** - * Get default email heading. - * - * @return string Default email heading - */ - public function get_default_heading() { - return __( 'You have received coupons.', 'woocommerce-smart-coupons' ); - } - - /** - * Determine if the email should actually be sent and setup email merge variables - * - * @param array $args Email arguments. - */ - public function trigger( $args = array() ) { - - $this->email_args = wp_parse_args( $args, $this->email_args ); - - if ( ! isset( $this->email_args['email'] ) || empty( $this->email_args['email'] ) ) { - return; - } - - $this->setup_locale(); - - $this->recipient = $this->email_args['email']; - - $order_id = isset( $this->email_args['order_id'] ) ? $this->email_args['order_id'] : 0; - - // Get order object. - if ( ! empty( $order_id ) && 0 !== $order_id ) { - $order = wc_get_order( $order_id ); - if ( is_a( $order, 'WC_Order' ) ) { - $this->object = $order; - } - } - - $this->set_placeholders(); - - $email_content = $this->get_content(); - // Replace placeholders with values in the email content. - $email_content = ( is_callable( array( $this, 'format_string' ) ) ) ? $this->format_string( $email_content ) : $email_content; - - // Send email. - if ( $this->is_enabled() && $this->get_recipient() ) { - $this->send( $this->get_recipient(), $this->get_subject(), $email_content, $this->get_headers(), $this->get_attachments() ); - } - - $this->restore_locale(); - } - - /** - * Function to set placeholder variables used in email subject/heading - */ - public function set_placeholders() { - $this->placeholders['{sender_name}'] = $this->get_sender_name(); - } - - /** - * Function to load email html content - * - * @return string Email content html - */ - public function get_content_html() { - - global $woocommerce_smart_coupon; - - $order = $this->object; - $url = $this->get_url(); - $email_heading = $this->get_heading(); - - $sender = ''; - $from = ''; - - $is_gift = isset( $this->email_args['is_gift'] ) ? $this->email_args['is_gift'] : ''; - - if ( 'yes' === $is_gift ) { - $sender_name = $this->get_sender_name(); - $sender_email = $this->get_sender_email(); - if ( ! empty( $sender_name ) && ! empty( $sender_email ) ) { - $sender = $sender_name . ' (' . $sender_email . ') '; - $from = ' ' . __( 'from', 'woocommerce-smart-coupons' ) . ' '; - } - } - - $email = isset( $this->email_args['email'] ) ? $this->email_args['email'] : ''; - $receiver_details = isset( $this->email_args['receiver_details'] ) ? $this->email_args['receiver_details'] : ''; - - $design = get_option( 'wc_sc_setting_coupon_design', 'basic' ); - $background_color = get_option( 'wc_sc_setting_coupon_background_color', '#39cccc' ); - $foreground_color = get_option( 'wc_sc_setting_coupon_foreground_color', '#30050b' ); - $third_color = get_option( 'wc_sc_setting_coupon_third_color', '#39cccc' ); - - $show_coupon_description = get_option( 'smart_coupons_show_coupon_description', 'no' ); - - $valid_designs = $woocommerce_smart_coupon->get_valid_coupon_designs(); - - if ( ! in_array( $design, $valid_designs, true ) ) { - $design = 'basic'; - } - - $design = ( 'custom-design' !== $design ) ? 'email-coupon' : $design; - - $coupon_styles = $woocommerce_smart_coupon->get_coupon_styles( $design, array( 'is_email' => 'yes' ) ); - - $default_path = $this->template_base; - $template_path = $woocommerce_smart_coupon->get_template_base_dir( $this->template_html ); - - ob_start(); - - wc_get_template( - $this->template_html, - array( - 'email' => $email, - 'email_heading' => $email_heading, - 'order' => $order, - 'url' => $url, - 'from' => $from, - 'background_color' => $background_color, - 'foreground_color' => $foreground_color, - 'third_color' => $third_color, - 'coupon_styles' => $coupon_styles, - 'sender' => $sender, - 'receiver_details' => $receiver_details, - 'show_coupon_description' => $show_coupon_description, - 'design' => $design, - ), - $template_path, - $default_path - ); - - return ob_get_clean(); - } - - /** - * Function to load email plain content - * - * @return string Email plain content - */ - public function get_content_plain() { - - global $woocommerce_smart_coupon; - - $order = $this->object; - $url = $this->get_url(); - $email_heading = $this->get_heading(); - - $sender = ''; - $from = ''; - - $is_gift = isset( $this->email_args['is_gift'] ) ? $this->email_args['is_gift'] : ''; - - if ( 'yes' === $is_gift ) { - $sender_name = $this->get_sender_name(); - $sender_email = $this->get_sender_email(); - if ( ! empty( $sender_name ) && ! empty( $sender_email ) ) { - $sender = $sender_name . ' (' . $sender_email . ') '; - $from = ' ' . __( 'from', 'woocommerce-smart-coupons' ) . ' '; - } - } - - $email = isset( $this->email_args['email'] ) ? $this->email_args['email'] : ''; - $receiver_details = isset( $this->email_args['receiver_details'] ) ? $this->email_args['receiver_details'] : ''; - - $default_path = $this->template_base; - $template_path = $woocommerce_smart_coupon->get_template_base_dir( $this->template_plain ); - - ob_start(); - - wc_get_template( - $this->template_plain, - array( - 'email' => $email, - 'email_heading' => $email_heading, - 'order' => $order, - 'url' => $url, - 'from' => $from, - 'sender' => $sender, - 'receiver_details' => $receiver_details, - ), - $template_path, - $default_path - ); - - return ob_get_clean(); - } - - /** - * Function to update SC admin email settings when WC email settings get updated - */ - public function process_admin_options() { - // Save regular options. - parent::process_admin_options(); - - $is_email_enabled = $this->get_field_value( 'enabled', $this->form_fields['enabled'] ); - - if ( ! empty( $is_email_enabled ) ) { - update_option( 'smart_coupons_combine_emails', $is_email_enabled, 'no' ); - } - } - - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/emails/class-wc-sc-email-coupon.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/emails/class-wc-sc-email-coupon.php deleted file mode 100644 index 94e417a4..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/emails/class-wc-sc-email-coupon.php +++ /dev/null @@ -1,506 +0,0 @@ -id = 'wc_sc_email_coupon'; - - $this->customer_email = true; - - // Set email title and description. - $this->title = __( 'Smart Coupons - Auto generated coupon email', 'woocommerce-smart-coupons' ); - $this->description = __( 'Email auto generated coupon to recipients. One email per coupon.', 'woocommerce-smart-coupons' ); - - // Use our plugin templates directory as the template base. - $this->template_base = dirname( WC_SC_PLUGIN_FILE ) . '/templates/'; - - // Email template location. - $this->template_html = 'email.php'; - $this->template_plain = 'plain/email.php'; - - $this->placeholders = array( - '{coupon_code}' => '', - '{coupon_type}' => '', - '{coupon_value}' => '', - '{sender_name}' => '', - ); - - // Trigger for this email. - add_action( 'wc_sc_email_coupon_notification', array( $this, 'trigger' ) ); - - // Call parent constructor to load any other defaults not explicity defined here. - parent::__construct(); - } - - /** - * Get default email subject. - * - * @return string Default email subject - */ - public function get_default_subject() { - return __( '{site_title}: Congratulations! You\'ve received a {coupon_type} from {sender_name}', 'woocommerce-smart-coupons' ); - } - - /** - * Get default email heading. - * - * @return string Default email heading - */ - public function get_default_heading() { - return __( 'You have received a {coupon_type} {coupon_value}', 'woocommerce-smart-coupons' ); - } - - /** - * Determine if the email should actually be sent and setup email merge variables - * - * @param array $args Email arguments. - */ - public function trigger( $args = array() ) { - - $this->email_args = wp_parse_args( $args, $this->email_args ); - - if ( ! isset( $this->email_args['email'] ) || empty( $this->email_args['email'] ) ) { - return; - } - - $this->setup_locale(); - - $this->recipient = $this->email_args['email']; - - $order_id = isset( $this->email_args['order_id'] ) ? $this->email_args['order_id'] : 0; - - // Get order object. - if ( ! empty( $order_id ) && 0 !== $order_id ) { - $order = wc_get_order( $order_id ); - if ( is_a( $order, 'WC_Order' ) ) { - $this->object = $order; - } - } - - $this->set_placeholders(); - - $email_content = $this->get_content(); - // Replace placeholders with values in the email content. - $email_content = ( is_callable( array( $this, 'format_string' ) ) ) ? $this->format_string( $email_content ) : $email_content; - - // Send email. - if ( $this->is_enabled() && $this->get_recipient() ) { - $this->send( $this->get_recipient(), $this->get_subject(), $email_content, $this->get_headers(), $this->get_attachments() ); - } - - $this->restore_locale(); - } - - /** - * Function to set placeholder variables used in email subject/heading - */ - public function set_placeholders() { - $this->placeholders['{coupon_code}'] = $this->get_coupon_code(); - $this->placeholders['{coupon_type}'] = $this->get_coupon_type(); - $this->placeholders['{coupon_value}'] = $this->get_coupon_value(); - $this->placeholders['{coupon_expiry}'] = $this->get_coupon_expiry(); - $this->placeholders['{sender_name}'] = $this->get_sender_name(); - } - - /** - * Function to get coupon expiry date/time for current coupon being sent. - * - * @return string $coupon_expiry Coupon expiry. - */ - public function get_coupon_expiry() { - - global $woocommerce_smart_coupon; - - $coupon_expiry = ''; - $coupon = isset( $this->email_args['coupon'] ) ? $this->email_args['coupon'] : ''; - - if ( empty( $coupon ) ) { - return $coupon_expiry; - } - - $coupon_code = ( ! empty( $coupon['code'] ) ) ? $coupon['code'] : ''; - if ( empty( $coupon_code ) ) { - return $coupon_expiry; - } - - $_coupon = new WC_Coupon( $coupon_code ); - if ( $woocommerce_smart_coupon->is_wc_gte_30() ) { - $coupon_id = ( is_object( $_coupon ) && is_callable( array( $_coupon, 'get_id' ) ) ) ? $_coupon->get_id() : 0; - $expiry_date = ( is_object( $_coupon ) && is_callable( array( $_coupon, 'get_date_expires' ) ) ) ? $_coupon->get_date_expires() : ''; - } else { - $coupon_id = ( ! empty( $_coupon->id ) ) ? $_coupon->id : 0; - $expiry_date = ( ! empty( $_coupon->expiry_date ) ) ? $_coupon->expiry_date : ''; - } - - if ( ! empty( $expiry_date ) ) { - if ( $woocommerce_smart_coupon->is_wc_gte_30() && $expiry_date instanceof WC_DateTime ) { - $expiry_date = ( is_callable( array( $expiry_date, 'getTimestamp' ) ) ) ? $expiry_date->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - - if ( ! empty( $expiry_date ) && is_int( $expiry_date ) ) { - $expiry_time = (int) $woocommerce_smart_coupon->get_post_meta( $coupon_id, 'wc_sc_expiry_time', true ); - if ( ! empty( $expiry_time ) ) { - $expiry_date += $expiry_time; // Adding expiry time to expiry date. - } - } - $coupon_expiry = $woocommerce_smart_coupon->get_expiration_format( $expiry_date ); - } else { - $coupon_expiry = esc_html__( 'Never expires', 'woocommerce-smart-coupons' ); - } - - return $coupon_expiry; - } - - /** - * Function to load email html content - * - * @return string Email content html - */ - public function get_content_html() { - - global $woocommerce_smart_coupon; - - $order = $this->object; - $url = $this->get_url(); - $email_heading = $this->get_heading(); - - $sender = ''; - $from = ''; - - $is_gift = isset( $this->email_args['is_gift'] ) ? $this->email_args['is_gift'] : ''; - - if ( 'yes' === $is_gift ) { - $sender_name = $this->get_sender_name(); - $sender_email = $this->get_sender_email(); - if ( ! empty( $sender_name ) && ! empty( $sender_email ) ) { - $sender = $sender_name . ' (' . $sender_email . ') '; - $from = ' ' . __( 'from', 'woocommerce-smart-coupons' ) . ' '; - } - } - - $email = isset( $this->email_args['email'] ) ? $this->email_args['email'] : ''; - $message_from_sender = isset( $this->email_args['message_from_sender'] ) ? $this->email_args['message_from_sender'] : ''; - $coupon_code = isset( $this->email_args['coupon']['code'] ) ? $this->email_args['coupon']['code'] : ''; - - $design = get_option( 'wc_sc_setting_coupon_design', 'basic' ); - $background_color = get_option( 'wc_sc_setting_coupon_background_color', '#39cccc' ); - $foreground_color = get_option( 'wc_sc_setting_coupon_foreground_color', '#30050b' ); - $third_color = get_option( 'wc_sc_setting_coupon_third_color', '#39cccc' ); - - $show_coupon_description = get_option( 'smart_coupons_show_coupon_description', 'no' ); - - $valid_designs = $woocommerce_smart_coupon->get_valid_coupon_designs(); - - if ( ! in_array( $design, $valid_designs, true ) ) { - $design = 'basic'; - } - - $design = ( 'custom-design' !== $design ) ? 'email-coupon' : $design; - - $coupon_styles = $woocommerce_smart_coupon->get_coupon_styles( $design, array( 'is_email' => 'yes' ) ); - - $default_path = $this->template_base; - $template_path = $woocommerce_smart_coupon->get_template_base_dir( $this->template_html ); - - ob_start(); - - wc_get_template( - $this->template_html, - array( - 'email' => $email, - 'email_heading' => $email_heading, - 'order' => $order, - 'url' => $url, - 'message_from_sender' => $message_from_sender, - 'from' => $from, - 'coupon_code' => $coupon_code, - 'background_color' => $background_color, - 'foreground_color' => $foreground_color, - 'third_color' => $third_color, - 'coupon_styles' => $coupon_styles, - 'sender' => $sender, - 'design' => $design, - 'show_coupon_description' => $show_coupon_description, - ), - $template_path, - $default_path - ); - - return ob_get_clean(); - } - - /** - * Function to load email plain content - * - * @return string Email plain content - */ - public function get_content_plain() { - - global $woocommerce_smart_coupon; - - $order = $this->object; - $url = $this->get_url(); - $email_heading = $this->get_heading(); - - $sender = ''; - $from = ''; - - $is_gift = isset( $this->email_args['is_gift'] ) ? $this->email_args['is_gift'] : ''; - - if ( 'yes' === $is_gift ) { - $sender_name = $this->get_sender_name(); - $sender_email = $this->get_sender_email(); - if ( ! empty( $sender_name ) && ! empty( $sender_email ) ) { - $sender = $sender_name . ' (' . $sender_email . ') '; - $from = ' ' . __( 'from', 'woocommerce-smart-coupons' ) . ' '; - } - } - - $email = isset( $this->email_args['email'] ) ? $this->email_args['email'] : ''; - $message_from_sender = isset( $this->email_args['message_from_sender'] ) ? $this->email_args['message_from_sender'] : ''; - $coupon_code = isset( $this->email_args['coupon']['code'] ) ? $this->email_args['coupon']['code'] : ''; - - $default_path = $this->template_base; - $template_path = $woocommerce_smart_coupon->get_template_base_dir( $this->template_plain ); - - ob_start(); - - wc_get_template( - $this->template_plain, - array( - 'email' => $email, - 'email_heading' => $email_heading, - 'order' => $order, - 'url' => $url, - 'message_from_sender' => $message_from_sender, - 'from' => $from, - 'coupon_code' => $coupon_code, - 'sender' => $sender, - ), - $template_path, - $default_path - ); - - return ob_get_clean(); - } - - - - /** - * Get coupon code - * - * @return string - */ - public function get_coupon_code() { - - $coupon_code = isset( $this->email_args['coupon']['code'] ) ? $this->email_args['coupon']['code'] : ''; - - return $coupon_code; - } - - /** - * Get coupon value - * - * @return string - */ - public function get_coupon_value() { - - global $woocommerce_smart_coupon, $store_credit_label; - - $coupon = isset( $this->email_args['coupon'] ) ? $this->email_args['coupon'] : ''; - - if ( empty( $coupon ) ) { - return ''; - } - - $order_id = isset( $this->email_args['order_id'] ) ? $this->email_args['order_id'] : 0; - $order = ( ! empty( $order_id ) ) ? wc_get_order( $order_id ) : null; - - $wc_price_args = array( - 'currency' => is_callable( array( $order, 'get_currency' ) ) ? $order->get_currency() : '', - ); - - $discount_type = isset( $this->email_args['discount_type'] ) ? $this->email_args['discount_type'] : ''; - $is_gift = isset( $this->email_args['is_gift'] ) ? $this->email_args['is_gift'] : ''; - - // Get smart coupon type string. - if ( 'smart_coupon' === $discount_type && 'yes' === $is_gift ) { - $smart_coupon_type = __( 'Gift Card', 'woocommerce-smart-coupons' ); - } else { - $smart_coupon_type = __( 'Store Credit', 'woocommerce-smart-coupons' ); - } - - if ( ! empty( $store_credit_label['singular'] ) ) { - $smart_coupon_type = ucwords( $store_credit_label['singular'] ); - } - - $amount = $coupon['amount']; - $coupon_code = $coupon['code']; - - // Get coupon types. - $all_discount_types = wc_get_coupon_types(); - - $_coupon = new WC_Coupon( $coupon_code ); - - if ( $woocommerce_smart_coupon->is_wc_gte_30() ) { - $_coupon_id = ( is_object( $_coupon ) && is_callable( array( $_coupon, 'get_id' ) ) ) ? $_coupon->get_id() : 0; - $_is_free_shipping = ( $_coupon->get_free_shipping() ) ? 'yes' : 'no'; - $_discount_type = $_coupon->get_discount_type(); - $_product_ids = $_coupon->get_product_ids(); - $_excluded_product_ids = $_coupon->get_excluded_product_ids(); - $_product_categories = $_coupon->get_product_categories(); - $_excluded_product_categories = $_coupon->get_excluded_product_categories(); - } else { - $_coupon_id = ( ! empty( $_coupon->id ) ) ? $_coupon->id : 0; - $_is_free_shipping = ( ! empty( $_coupon->free_shipping ) ) ? $_coupon->free_shipping : ''; - $_discount_type = ( ! empty( $_coupon->discount_type ) ) ? $_coupon->discount_type : ''; - $_product_ids = ( ! empty( $_coupon->product_ids ) ) ? $_coupon->product_ids : array(); - $_excluded_product_ids = ( ! empty( $_coupon->exclude_product_ids ) ) ? $_coupon->exclude_product_ids : array(); - $_product_categories = ( ! empty( $_coupon->product_categories ) ) ? $_coupon->product_categories : array(); - $_excluded_product_categories = ( ! empty( $_coupon->exclude_product_categories ) ) ? $_coupon->exclude_product_categories : array(); - } - - if ( false === stripos( $discount_type, 'percent' ) ) { - $amount = $woocommerce_smart_coupon->read_price( $amount, true, $order ); - } - - switch ( $discount_type ) { - - case 'smart_coupon': - /* translators: %s coupon amount */ - $coupon_value = sprintf( __( 'worth %s ', 'woocommerce-smart-coupons' ), wc_price( $amount, $wc_price_args ) ); - break; - - case 'fixed_cart': - /* translators: %s: coupon amount */ - $coupon_value = sprintf( __( 'worth %s (for entire purchase) ', 'woocommerce-smart-coupons' ), wc_price( $amount, $wc_price_args ) ); - break; - - case 'fixed_product': - if ( ! empty( $_product_ids ) || ! empty( $_excluded_product_ids ) || ! empty( $_product_categories ) || ! empty( $_excluded_product_categories ) ) { - $_discount_for_text = __( 'for some products', 'woocommerce-smart-coupons' ); - } else { - $_discount_for_text = __( 'for all products', 'woocommerce-smart-coupons' ); - } - - /* translators: 1: coupon amount 2: discount for text */ - $coupon_value = sprintf( __( 'worth %1$s (%2$s) ', 'woocommerce-smart-coupons' ), wc_price( $amount, $wc_price_args ), $_discount_for_text ); - break; - - case 'percent_product': - if ( ! empty( $_product_ids ) || ! empty( $_excluded_product_ids ) || ! empty( $_product_categories ) || ! empty( $_excluded_product_categories ) ) { - $_discount_for_text = __( 'for some products', 'woocommerce-smart-coupons' ); - } else { - $_discount_for_text = __( 'for all products', 'woocommerce-smart-coupons' ); - } - - /* translators: 1: coupon amount 2: discount for text */ - $coupon_value = sprintf( __( 'worth %1$s%% (%2$s) ', 'woocommerce-smart-coupons' ), $amount, $_discount_for_text ); - break; - - case 'percent': - if ( ! empty( $_product_ids ) || ! empty( $_excluded_product_ids ) || ! empty( $_product_categories ) || ! empty( $_excluded_product_categories ) ) { - $_discount_for_text = __( 'for some products', 'woocommerce-smart-coupons' ); - } else { - $_discount_for_text = __( 'for entire purchase', 'woocommerce-smart-coupons' ); - } - - $max_discount_text = ''; - $max_discount = $woocommerce_smart_coupon->get_post_meta( $_coupon_id, 'wc_sc_max_discount', true, true, $order ); - if ( ! empty( $max_discount ) && is_numeric( $max_discount ) ) { - /* translators: %s: Maximum coupon discount amount */ - $max_discount_text = sprintf( __( ' upto %s', 'woocommerce-smart-coupons' ), wc_price( $max_discount, $wc_price_args ) ); - } - - /* translators: 1: coupon amount 2: max discount text 3: discount for text */ - $coupon_value = sprintf( __( 'worth %1$s%% %2$s (%3$s) ', 'woocommerce-smart-coupons' ), $amount, $max_discount_text, $_discount_for_text ); - break; - - default: - $default_coupon_type = ( ! empty( $all_discount_types[ $discount_type ] ) ) ? $all_discount_types[ $discount_type ] : ucwords( str_replace( array( '_', '-' ), ' ', $discount_type ) ); - $coupon_type = apply_filters( 'wc_sc_coupon_type', $default_coupon_type, $_coupon, $all_discount_types ); - $coupon_amount = apply_filters( 'wc_sc_coupon_amount', $amount, $_coupon ); - - /* translators: 1: coupon type 2: coupon amount */ - $coupon_value = sprintf( __( '%1$s coupon of %2$s', 'woocommerce-smart-coupons' ), $coupon_type, $coupon_amount ); - $coupon_value = apply_filters( 'wc_sc_email_heading', $coupon_value, $_coupon ); - break; - - } - - if ( 'yes' === $_is_free_shipping && in_array( $_discount_type, array( 'fixed_cart', 'fixed_product', 'percent_product', 'percent' ), true ) ) { - /* translators: 1: email heading 2: suffix */ - $coupon_value = sprintf( __( '%1$s Free Shipping%2$s', 'woocommerce-smart-coupons' ), ( ( ! empty( $amount ) ) ? $coupon_value . __( '&', 'woocommerce-smart-coupons' ) : __( 'You have received a', 'woocommerce-smart-coupons' ) ), ( ( empty( $amount ) ) ? __( ' coupon', 'woocommerce-smart-coupons' ) : '' ) ); - } - - return wp_strip_all_tags( $coupon_value ); - } - - /** - * Function to get coupon type for current coupon being sent. - * - * @return string $coupon_type Coupon type. - */ - public function get_coupon_type() { - - global $store_credit_label; - - $discount_type = isset( $this->email_args['discount_type'] ) ? $this->email_args['discount_type'] : ''; - $is_gift = isset( $this->email_args['is_gift'] ) ? $this->email_args['is_gift'] : ''; - - if ( 'smart_coupon' === $discount_type && 'yes' === $is_gift ) { - $smart_coupon_type = __( 'Gift Card', 'woocommerce-smart-coupons' ); - } else { - $smart_coupon_type = __( 'Store Credit', 'woocommerce-smart-coupons' ); - } - - if ( ! empty( $store_credit_label['singular'] ) ) { - $smart_coupon_type = ucwords( $store_credit_label['singular'] ); - } - - $coupon_type = ( 'smart_coupon' === $discount_type && ! empty( $smart_coupon_type ) ) ? $smart_coupon_type : __( 'coupon', 'woocommerce-smart-coupons' ); - - return $coupon_type; - } - - /** - * Function to update SC admin email settings when WC email settings get updated - */ - public function process_admin_options() { - // Save regular options. - parent::process_admin_options(); - - $is_email_enabled = $this->get_field_value( 'enabled', $this->form_fields['enabled'] ); - - if ( ! empty( $is_email_enabled ) ) { - update_option( 'smart_coupons_is_send_email', $is_email_enabled, 'no' ); - } - } - - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/emails/class-wc-sc-email.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/emails/class-wc-sc-email.php deleted file mode 100644 index 904a4bce..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/emails/class-wc-sc-email.php +++ /dev/null @@ -1,149 +0,0 @@ - '', - 'coupon' => array(), - 'discount_type' => 'smart_coupon', - 'smart_coupon_type' => '', - 'receiver_name' => '', - 'message_from_sender' => '', - 'gift_certificate_sender_name' => '', - 'gift_certificate_sender_email' => '', - 'from' => '', - 'sender' => '', - 'is_gift' => false, - ); - - /** - * Get shop page url - * - * @return string $url Shop page url - */ - public function get_url() { - - global $woocommerce_smart_coupon; - - if ( $woocommerce_smart_coupon->is_wc_gte_30() ) { - $page_id = wc_get_page_id( 'shop' ); - } else { - $page_id = woocommerce_get_page_id( 'shop' ); - } - - $url = ( get_option( 'permalink_structure' ) ) ? get_permalink( $page_id ) : get_post_type_archive_link( 'product' ); - - return $url; - } - - /** - * Function to get sender name. - * - * @return string $sender_name Sender name. - */ - public function get_sender_name() { - - if ( isset( $this->email_args['gift_certificate_sender_name'] ) && ! empty( $this->email_args['gift_certificate_sender_name'] ) ) { - $sender_name = $this->email_args['gift_certificate_sender_name']; - } else { - $sender_name = is_callable( array( $this, 'get_blogname' ) ) ? $this->get_blogname() : ''; - } - - return $sender_name; - } - - /** - * Function to get sender email. - * - * @return string $sender_email Sender email. - */ - public function get_sender_email() { - - $sender_email = isset( $this->email_args['gift_certificate_sender_email'] ) ? $this->email_args['gift_certificate_sender_email'] : ''; - - return $sender_email; - } - - /** - * Initialize Settings Form Fields - */ - public function init_form_fields() { - - /* translators: %s: list of placeholders */ - $placeholder_text = sprintf( __( 'Available placeholders: %s', 'woocommerce-smart-coupons' ), '' . implode( ', ', array_keys( $this->placeholders ) ) . '' ); - - $this->form_fields = array( - 'enabled' => array( - 'title' => __( 'Enable/Disable', 'woocommerce-smart-coupons' ), - 'type' => 'checkbox', - 'label' => __( 'Enable this email notification', 'woocommerce-smart-coupons' ), - 'default' => 'yes', - ), - 'email_type' => array( - 'title' => __( 'Email type', 'woocommerce-smart-coupons' ), - 'type' => 'select', - 'description' => __( 'Choose which format of email to send.', 'woocommerce-smart-coupons' ), - 'default' => 'html', - 'class' => 'email_type wc-enhanced-select', - 'options' => $this->get_email_type_options(), - 'desc_tip' => true, - ), - 'subject' => array( - 'title' => __( 'Subject', 'woocommerce-smart-coupons' ), - 'type' => 'text', - 'desc_tip' => true, - 'description' => $placeholder_text, - 'placeholder' => $this->get_default_subject(), - 'default' => '', - ), - 'heading' => array( - 'title' => __( 'Email heading', 'woocommerce-smart-coupons' ), - 'type' => 'text', - 'desc_tip' => true, - 'description' => $placeholder_text, - 'placeholder' => $this->get_default_heading(), - 'default' => '', - ), - ); - } - - /** - * Function to update SC admin email settings when WC email settings get updated - */ - public function process_admin_options() { - // Save regular options. - parent::process_admin_options(); - - $is_email_enabled = $this->get_field_value( 'enabled', $this->form_fields['enabled'] ); - - if ( ! empty( $is_email_enabled ) ) { - update_option( 'smart_coupons_is_send_email', $is_email_enabled, 'no' ); - } - } - - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/README.md b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/README.md deleted file mode 100644 index bdfa2a62..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Action Scheduler - Job Queue for WordPress [![Build Status](https://travis-ci.org/woocommerce/action-scheduler.png?branch=master)](https://travis-ci.org/woocommerce/action-scheduler) [![codecov](https://codecov.io/gh/woocommerce/action-scheduler/branch/master/graph/badge.svg)](https://codecov.io/gh/woocommerce/action-scheduler) - -Action Scheduler is a scalable, traceable job queue for background processing large sets of actions in WordPress. It's specially designed to be distributed in WordPress plugins. - -Action Scheduler works by triggering an action hook to run at some time in the future. Each hook can be scheduled with unique data, to allow callbacks to perform operations on that data. The hook can also be scheduled to run on one or more occassions. - -Think of it like an extension to `do_action()` which adds the ability to delay and repeat a hook. - -## Battle-Tested Background Processing - -Every month, Action Scheduler processes millions of payments for [Subscriptions](https://woocommerce.com/products/woocommerce-subscriptions/), webhooks for [WooCommerce](https://wordpress.org/plugins/woocommerce/), as well as emails and other events for a range of other plugins. - -It's been seen on live sites processing queues in excess of 50,000 jobs and doing resource intensive operations, like processing payments and creating orders, at a sustained rate of over 10,000 / hour without negatively impacting normal site operations. - -This is all on infrastructure and WordPress sites outside the control of the plugin author. - -If your plugin needs background processing, especially of large sets of tasks, Action Scheduler can help. - -## Learn More - -To learn more about how to Action Scheduler works, and how to use it in your plugin, check out the docs on [ActionScheduler.org](https://actionscheduler.org). - -There you will find: - -* [Usage guide](https://actionscheduler.org/usage/): instructions on installing and using Action Scheduler -* [WP CLI guide](https://actionscheduler.org/wp-cli/): instructions on running Action Scheduler at scale via WP CLI -* [API Reference](https://actionscheduler.org/api/): complete reference guide for all API functions -* [Administration Guide](https://actionscheduler.org/admin/): guide to managing scheduled actions via the administration screen -* [Guide to Background Processing at Scale](https://actionscheduler.org/perf/): instructions for running Action Scheduler at scale via the default WP Cron queue runner - -## Credits - -Action Scheduler is developed and maintained by [Automattic](http://automattic.com/) with significant early development completed by [Flightless](https://flightless.us/). - -Collaboration is cool. We'd love to work with you to improve Action Scheduler. [Pull Requests](https://github.com/woocommerce/action-scheduler/pulls) welcome. diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/action-scheduler.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/action-scheduler.php deleted file mode 100644 index ec98ceff..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/action-scheduler.php +++ /dev/null @@ -1,66 +0,0 @@ -. - * - * @package ActionScheduler - */ - -if ( ! function_exists( 'action_scheduler_register_3_dot_4_dot_0' ) && function_exists( 'add_action' ) ) { - - if ( ! class_exists( 'ActionScheduler_Versions', false ) ) { - require_once __DIR__ . '/classes/ActionScheduler_Versions.php'; - add_action( 'plugins_loaded', array( 'ActionScheduler_Versions', 'initialize_latest_version' ), 1, 0 ); - } - - add_action( 'plugins_loaded', 'action_scheduler_register_3_dot_4_dot_0', 0, 0 ); - - /** - * Registers this version of Action Scheduler. - */ - function action_scheduler_register_3_dot_4_dot_0() { - $versions = ActionScheduler_Versions::instance(); - $versions->register( '3.4.0', 'action_scheduler_initialize_3_dot_4_dot_0' ); - } - - /** - * Initializes this version of Action Scheduler. - */ - function action_scheduler_initialize_3_dot_4_dot_0() { - // A final safety check is required even here, because historic versions of Action Scheduler - // followed a different pattern (in some unusual cases, we could reach this point and the - // ActionScheduler class is already defined—so we need to guard against that). - if ( ! class_exists( 'ActionScheduler', false ) ) { - require_once __DIR__ . '/classes/abstracts/ActionScheduler.php'; - ActionScheduler::init( __FILE__ ); - } - } - - // Support usage in themes - load this version if no plugin has loaded a version yet. - if ( did_action( 'plugins_loaded' ) && ! doing_action( 'plugins_loaded' ) && ! class_exists( 'ActionScheduler', false ) ) { - action_scheduler_initialize_3_dot_4_dot_0(); - do_action( 'action_scheduler_pre_theme_init' ); - ActionScheduler_Versions::initialize_latest_version(); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/changelog.txt b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/changelog.txt deleted file mode 100644 index 4bb2650b..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/changelog.txt +++ /dev/null @@ -1,45 +0,0 @@ -*** Changelog *** - -= 3.4.0 - 2021-10-29 = -* Enhancement - Number of items per page can now be set for the Scheduled Actions view (props @ovidiul). #771 -* Fix - Do not lower the max_execution_time if it is already set to 0 (unlimited) (props @barryhughes). #755 -* Fix - Avoid triggering autoloaders during the version resolution process (props @olegabr). #731 & #776 -* Dev - ActionScheduler_wcSystemStatus PHPCS fixes (props @ovidiul). #761 -* Dev - ActionScheduler_DBLogger.php PHPCS fixes (props @ovidiul). #768 -* Dev - Fixed phpcs for ActionScheduler_Schedule_Deprecated (props @ovidiul). #762 -* Dev - Improve actions table indicies (props @glagonikas). #774 & #777 -* Dev - PHPCS fixes for ActionScheduler_DBStore.php (props @ovidiul). #769 & #778 -* Dev - PHPCS Fixes for ActionScheduler_Abstract_ListTable (props @ovidiul). #763 & #779 -* Dev - Adds new filter action_scheduler_claim_actions_order_by to allow tuning of the claim query (props @glagonikas). #773 -* Dev - PHPCS fixes for ActionScheduler_WpPostStore class (props @ovidiul). #780 - -= 3.3.0 - 2021-09-15 = -* Enhancement - Adds as_has_scheduled_action() to provide a performant way to test for existing actions. #645 -* Fix - Improves compatibility with environments where NO_ZERO_DATE is enabled. #519 -* Fix - Adds safety checks to guard against errors when our database tables cannot be created. #645 -* Dev - Now supports queries that use multiple statuses. #649 -* Dev - Minimum requirements for WordPress and PHP bumped (to 5.2 and 5.6 respectively). #723 - -= 3.2.1 - 2021-06-21 = -* Fix - Add extra safety/account for different versions of AS and different loading patterns. #714 -* Fix - Handle hidden columns (Tools → Scheduled Actions) | #600. - -= 3.2.0 - 2021-06-03 = -* Fix - Add "no ordering" option to as_next_scheduled_action(). -* Fix - Add secondary scheduled date checks when claiming actions (DBStore) | #634. -* Fix - Add secondary scheduled date checks when claiming actions (wpPostStore) | #634. -* Fix - Adds a new index to the action table, reducing the potential for deadlocks (props: @glagonikas). -* Fix - Fix unit tests infrastructure and adapt tests to PHP 8. -* Fix - Identify in-use data store. -* Fix - Improve test_migration_is_scheduled. -* Fix - PHP notice on list table. -* Fix - Speed up clean up and batch selects. -* Fix - Update pending dependencies. -* Fix - [PHP 8.0] Only pass action arg values through to do_action_ref_array(). -* Fix - [PHP 8] Set the PHP version to 7.1 in composer.json for PHP 8 compatibility. -* Fix - add is_initialized() to docs. -* Fix - fix file permissions. -* Fix - fixes #664 by replacing __ with esc_html__. - -= 3.1.6 - 2020-05-12 = -* Change log starts. diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_ActionClaim.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_ActionClaim.php deleted file mode 100644 index 262158f9..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_ActionClaim.php +++ /dev/null @@ -1,24 +0,0 @@ -id = $id; - $this->action_ids = $action_ids; - } - - public function get_id() { - return $this->id; - } - - public function get_actions() { - return $this->action_ids; - } -} - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_ActionFactory.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_ActionFactory.php deleted file mode 100644 index 2d18f4b8..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_ActionFactory.php +++ /dev/null @@ -1,180 +0,0 @@ -get_date() ); - } - break; - default : - $action_class = 'ActionScheduler_FinishedAction'; - break; - } - - $action_class = apply_filters( 'action_scheduler_stored_action_class', $action_class, $status, $hook, $args, $schedule, $group ); - - $action = new $action_class( $hook, $args, $schedule, $group ); - - /** - * Allow 3rd party code to change the instantiated action for a given hook, args, schedule and group. - * - * @param ActionScheduler_Action $action The instantiated action. - * @param string $hook The instantiated action's hook. - * @param array $args The instantiated action's args. - * @param ActionScheduler_Schedule $schedule The instantiated action's schedule. - * @param string $group The instantiated action's group. - */ - return apply_filters( 'action_scheduler_stored_action_instance', $action, $hook, $args, $schedule, $group ); - } - - /** - * Enqueue an action to run one time, as soon as possible (rather a specific scheduled time). - * - * This method creates a new action with the NULLSchedule. This schedule maps to a MySQL datetime string of - * 0000-00-00 00:00:00. This is done to create a psuedo "async action" type that is fully backward compatible. - * Existing queries to claim actions claim by date, meaning actions scheduled for 0000-00-00 00:00:00 will - * always be claimed prior to actions scheduled for a specific date. This makes sure that any async action is - * given priority in queue processing. This has the added advantage of making sure async actions can be - * claimed by both the existing WP Cron and WP CLI runners, as well as a new async request runner. - * - * @param string $hook The hook to trigger when this action runs - * @param array $args Args to pass when the hook is triggered - * @param string $group A group to put the action in - * - * @return int The ID of the stored action - */ - public function async( $hook, $args = array(), $group = '' ) { - $schedule = new ActionScheduler_NullSchedule(); - $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); - return $this->store( $action ); - } - - /** - * @param string $hook The hook to trigger when this action runs - * @param array $args Args to pass when the hook is triggered - * @param int $when Unix timestamp when the action will run - * @param string $group A group to put the action in - * - * @return int The ID of the stored action - */ - public function single( $hook, $args = array(), $when = null, $group = '' ) { - $date = as_get_datetime_object( $when ); - $schedule = new ActionScheduler_SimpleSchedule( $date ); - $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); - return $this->store( $action ); - } - - /** - * Create the first instance of an action recurring on a given interval. - * - * @param string $hook The hook to trigger when this action runs - * @param array $args Args to pass when the hook is triggered - * @param int $first Unix timestamp for the first run - * @param int $interval Seconds between runs - * @param string $group A group to put the action in - * - * @return int The ID of the stored action - */ - public function recurring( $hook, $args = array(), $first = null, $interval = null, $group = '' ) { - if ( empty($interval) ) { - return $this->single( $hook, $args, $first, $group ); - } - $date = as_get_datetime_object( $first ); - $schedule = new ActionScheduler_IntervalSchedule( $date, $interval ); - $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); - return $this->store( $action ); - } - - /** - * Create the first instance of an action recurring on a Cron schedule. - * - * @param string $hook The hook to trigger when this action runs - * @param array $args Args to pass when the hook is triggered - * @param int $base_timestamp The first instance of the action will be scheduled - * to run at a time calculated after this timestamp matching the cron - * expression. This can be used to delay the first instance of the action. - * @param int $schedule A cron definition string - * @param string $group A group to put the action in - * - * @return int The ID of the stored action - */ - public function cron( $hook, $args = array(), $base_timestamp = null, $schedule = null, $group = '' ) { - if ( empty($schedule) ) { - return $this->single( $hook, $args, $base_timestamp, $group ); - } - $date = as_get_datetime_object( $base_timestamp ); - $cron = CronExpression::factory( $schedule ); - $schedule = new ActionScheduler_CronSchedule( $date, $cron ); - $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); - return $this->store( $action ); - } - - /** - * Create a successive instance of a recurring or cron action. - * - * Importantly, the action will be rescheduled to run based on the current date/time. - * That means when the action is scheduled to run in the past, the next scheduled date - * will be pushed forward. For example, if a recurring action set to run every hour - * was scheduled to run 5 seconds ago, it will be next scheduled for 1 hour in the - * future, which is 1 hour and 5 seconds from when it was last scheduled to run. - * - * Alternatively, if the action is scheduled to run in the future, and is run early, - * likely via manual intervention, then its schedule will change based on the time now. - * For example, if a recurring action set to run every day, and is run 12 hours early, - * it will run again in 24 hours, not 36 hours. - * - * This slippage is less of an issue with Cron actions, as the specific run time can - * be set for them to run, e.g. 1am each day. In those cases, and entire period would - * need to be missed before there was any change is scheduled, e.g. in the case of an - * action scheduled for 1am each day, the action would need to run an entire day late. - * - * @param ActionScheduler_Action $action The existing action. - * - * @return string The ID of the stored action - * @throws InvalidArgumentException If $action is not a recurring action. - */ - public function repeat( $action ) { - $schedule = $action->get_schedule(); - $next = $schedule->get_next( as_get_datetime_object() ); - - if ( is_null( $next ) || ! $schedule->is_recurring() ) { - throw new InvalidArgumentException( __( 'Invalid action - must be a recurring action.', 'action-scheduler' ) ); - } - - $schedule_class = get_class( $schedule ); - $new_schedule = new $schedule( $next, $schedule->get_recurrence(), $schedule->get_first_date() ); - $new_action = new ActionScheduler_Action( $action->get_hook(), $action->get_args(), $new_schedule, $action->get_group() ); - return $this->store( $new_action ); - } - - /** - * @param ActionScheduler_Action $action - * - * @return int The ID of the stored action - */ - protected function store( ActionScheduler_Action $action ) { - $store = ActionScheduler_Store::instance(); - return $store->save_action( $action ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php deleted file mode 100644 index 360e3d1b..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php +++ /dev/null @@ -1,155 +0,0 @@ -render(); - } - - /** - * Registers action-scheduler into WooCommerce > System status. - * - * @param array $tabs An associative array of tab key => label. - * @return array $tabs An associative array of tab key => label, including Action Scheduler's tabs - */ - public function register_system_status_tab( array $tabs ) { - $tabs['action-scheduler'] = __( 'Scheduled Actions', 'action-scheduler' ); - - return $tabs; - } - - /** - * Include Action Scheduler's administration under the Tools menu. - * - * A menu under the Tools menu is important for backward compatibility (as that's - * where it started), and also provides more convenient access than the WooCommerce - * System Status page, and for sites where WooCommerce isn't active. - */ - public function register_menu() { - $hook_suffix = add_submenu_page( - 'tools.php', - __( 'Scheduled Actions', 'action-scheduler' ), - __( 'Scheduled Actions', 'action-scheduler' ), - 'manage_options', - 'action-scheduler', - array( $this, 'render_admin_ui' ) - ); - add_action( 'load-' . $hook_suffix , array( $this, 'process_admin_ui' ) ); - } - - /** - * Triggers processing of any pending actions. - */ - public function process_admin_ui() { - $this->get_list_table(); - } - - /** - * Renders the Admin UI - */ - public function render_admin_ui() { - $table = $this->get_list_table(); - $table->display_page(); - } - - /** - * Get the admin UI object and process any requested actions. - * - * @return ActionScheduler_ListTable - */ - protected function get_list_table() { - if ( null === $this->list_table ) { - $this->list_table = new ActionScheduler_ListTable( ActionScheduler::store(), ActionScheduler::logger(), ActionScheduler::runner() ); - $this->list_table->process_actions(); - } - - return $this->list_table; - } - - /** - * Provide more information about the screen and its data in the help tab. - */ - public function add_help_tabs() { - $screen = get_current_screen(); - - if ( ! $screen || self::$screen_id != $screen->id ) { - return; - } - - $as_version = ActionScheduler_Versions::instance()->latest_version(); - $screen->add_help_tab( - array( - 'id' => 'action_scheduler_about', - 'title' => __( 'About', 'action-scheduler' ), - 'content' => - '

              ' . sprintf( __( 'About Action Scheduler %s', 'action-scheduler' ), $as_version ) . '

              ' . - '

              ' . - __( 'Action Scheduler is a scalable, traceable job queue for background processing large sets of actions. Action Scheduler works by triggering an action hook to run at some time in the future. Scheduled actions can also be scheduled to run on a recurring schedule.', 'action-scheduler' ) . - '

              ', - ) - ); - - $screen->add_help_tab( - array( - 'id' => 'action_scheduler_columns', - 'title' => __( 'Columns', 'action-scheduler' ), - 'content' => - '

              ' . __( 'Scheduled Action Columns', 'action-scheduler' ) . '

              ' . - '
                ' . - sprintf( '
              • %1$s: %2$s
              • ', __( 'Hook', 'action-scheduler' ), __( 'Name of the action hook that will be triggered.', 'action-scheduler' ) ) . - sprintf( '
              • %1$s: %2$s
              • ', __( 'Status', 'action-scheduler' ), __( 'Action statuses are Pending, Complete, Canceled, Failed', 'action-scheduler' ) ) . - sprintf( '
              • %1$s: %2$s
              • ', __( 'Arguments', 'action-scheduler' ), __( 'Optional data array passed to the action hook.', 'action-scheduler' ) ) . - sprintf( '
              • %1$s: %2$s
              • ', __( 'Group', 'action-scheduler' ), __( 'Optional action group.', 'action-scheduler' ) ) . - sprintf( '
              • %1$s: %2$s
              • ', __( 'Recurrence', 'action-scheduler' ), __( 'The action\'s schedule frequency.', 'action-scheduler' ) ) . - sprintf( '
              • %1$s: %2$s
              • ', __( 'Scheduled', 'action-scheduler' ), __( 'The date/time the action is/was scheduled to run.', 'action-scheduler' ) ) . - sprintf( '
              • %1$s: %2$s
              • ', __( 'Log', 'action-scheduler' ), __( 'Activity log for the action.', 'action-scheduler' ) ) . - '
              ', - ) - ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_AsyncRequest_QueueRunner.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_AsyncRequest_QueueRunner.php deleted file mode 100644 index 9e5a139a..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_AsyncRequest_QueueRunner.php +++ /dev/null @@ -1,98 +0,0 @@ -store = $store; - } - - /** - * Handle async requests - * - * Run a queue, and maybe dispatch another async request to run another queue - * if there are still pending actions after completing a queue in this request. - */ - protected function handle() { - do_action( 'action_scheduler_run_queue', 'Async Request' ); // run a queue in the same way as WP Cron, but declare the Async Request context - - $sleep_seconds = $this->get_sleep_seconds(); - - if ( $sleep_seconds ) { - sleep( $sleep_seconds ); - } - - $this->maybe_dispatch(); - } - - /** - * If the async request runner is needed and allowed to run, dispatch a request. - */ - public function maybe_dispatch() { - if ( ! $this->allow() ) { - return; - } - - $this->dispatch(); - ActionScheduler_QueueRunner::instance()->unhook_dispatch_async_request(); - } - - /** - * Only allow async requests when needed. - * - * Also allow 3rd party code to disable running actions via async requests. - */ - protected function allow() { - - if ( ! has_action( 'action_scheduler_run_queue' ) || ActionScheduler::runner()->has_maximum_concurrent_batches() || ! $this->store->has_pending_actions_due() ) { - $allow = false; - } else { - $allow = true; - } - - return apply_filters( 'action_scheduler_allow_async_request_runner', $allow ); - } - - /** - * Chaining async requests can crash MySQL. A brief sleep call in PHP prevents that. - */ - protected function get_sleep_seconds() { - return apply_filters( 'action_scheduler_async_request_sleep_seconds', 5, $this ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_Compatibility.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_Compatibility.php deleted file mode 100644 index 6bbce146..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_Compatibility.php +++ /dev/null @@ -1,110 +0,0 @@ - $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; - } - - /** - * Attempts to raise the PHP timeout for time intensive processes. - * - * Only allows raising the existing limit and prevents lowering it. Wrapper for wc_set_time_limit(), when available. - * - * @param int $limit The time limit in seconds. - */ - public static function raise_time_limit( $limit = 0 ) { - $limit = (int) $limit; - $max_execution_time = (int) ini_get( 'max_execution_time' ); - - /* - * If the max execution time is already unlimited (zero), or if it exceeds or is equal to the proposed - * limit, there is no reason for us to make further changes (we never want to lower it). - */ - if ( - 0 === $max_execution_time - || ( $max_execution_time >= $limit && $limit !== 0 ) - ) { - return; - } - - if ( function_exists( 'wc_set_time_limit' ) ) { - wc_set_time_limit( $limit ); - } elseif ( function_exists( 'set_time_limit' ) && false === strpos( ini_get( 'disable_functions' ), 'set_time_limit' ) && ! ini_get( 'safe_mode' ) ) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.safe_modeDeprecatedRemoved - @set_time_limit( $limit ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged - } - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_DataController.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_DataController.php deleted file mode 100644 index 866203ec..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_DataController.php +++ /dev/null @@ -1,188 +0,0 @@ -=' ); - return $php_support && apply_filters( 'action_scheduler_migration_dependencies_met', true ); - } - - /** - * Get a flag indicating whether the migration is complete. - * - * @return bool Whether the flag has been set marking the migration as complete - */ - public static function is_migration_complete() { - return get_option( self::STATUS_FLAG ) === self::STATUS_COMPLETE; - } - - /** - * Mark the migration as complete. - */ - public static function mark_migration_complete() { - update_option( self::STATUS_FLAG, self::STATUS_COMPLETE ); - } - - /** - * Unmark migration when a plugin is de-activated. Will not work in case of silent activation, for example in an update. - * We do this to mitigate the bug of lost actions which happens if there was an AS 2.x to AS 3.x migration in the past, but that plugin is now - * deactivated and the site was running on AS 2.x again. - */ - public static function mark_migration_incomplete() { - delete_option( self::STATUS_FLAG ); - } - - /** - * Set the action store class name. - * - * @param string $class Classname of the store class. - * - * @return string - */ - public static function set_store_class( $class ) { - return self::DATASTORE_CLASS; - } - - /** - * Set the action logger class name. - * - * @param string $class Classname of the logger class. - * - * @return string - */ - public static function set_logger_class( $class ) { - return self::LOGGER_CLASS; - } - - /** - * Set the sleep time in seconds. - * - * @param integer $sleep_time The number of seconds to pause before resuming operation. - */ - public static function set_sleep_time( $sleep_time ) { - self::$sleep_time = (int) $sleep_time; - } - - /** - * Set the tick count required for freeing memory. - * - * @param integer $free_ticks The number of ticks to free memory on. - */ - public static function set_free_ticks( $free_ticks ) { - self::$free_ticks = (int) $free_ticks; - } - - /** - * Free memory if conditions are met. - * - * @param int $ticks Current tick count. - */ - public static function maybe_free_memory( $ticks ) { - if ( self::$free_ticks && 0 === $ticks % self::$free_ticks ) { - self::free_memory(); - } - } - - /** - * Reduce memory footprint by clearing the database query and object caches. - */ - public static function free_memory() { - if ( 0 < self::$sleep_time ) { - /* translators: %d: amount of time */ - \WP_CLI::warning( sprintf( _n( 'Stopped the insanity for %d second', 'Stopped the insanity for %d seconds', self::$sleep_time, 'action-scheduler' ), self::$sleep_time ) ); - sleep( self::$sleep_time ); - } - - \WP_CLI::warning( __( 'Attempting to reduce used memory...', 'action-scheduler' ) ); - - /** - * @var $wpdb \wpdb - * @var $wp_object_cache \WP_Object_Cache - */ - global $wpdb, $wp_object_cache; - - $wpdb->queries = array(); - - if ( ! is_a( $wp_object_cache, 'WP_Object_Cache' ) ) { - return; - } - - $wp_object_cache->group_ops = array(); - $wp_object_cache->stats = array(); - $wp_object_cache->memcache_debug = array(); - $wp_object_cache->cache = array(); - - if ( is_callable( array( $wp_object_cache, '__remoteset' ) ) ) { - call_user_func( array( $wp_object_cache, '__remoteset' ) ); // important - } - } - - /** - * Connect to table datastores if migration is complete. - * Otherwise, proceed with the migration if the dependencies have been met. - */ - public static function init() { - if ( self::is_migration_complete() ) { - add_filter( 'action_scheduler_store_class', array( 'ActionScheduler_DataController', 'set_store_class' ), 100 ); - add_filter( 'action_scheduler_logger_class', array( 'ActionScheduler_DataController', 'set_logger_class' ), 100 ); - add_action( 'deactivate_plugin', array( 'ActionScheduler_DataController', 'mark_migration_incomplete' ) ); - } elseif ( self::dependencies_met() ) { - Controller::init(); - } - - add_action( 'action_scheduler/progress_tick', array( 'ActionScheduler_DataController', 'maybe_free_memory' ) ); - } - - /** - * Singleton factory. - */ - public static function instance() { - if ( ! isset( self::$instance ) ) { - self::$instance = new static(); - } - - return self::$instance; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_DateTime.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_DateTime.php deleted file mode 100644 index 0e890dc0..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_DateTime.php +++ /dev/null @@ -1,77 +0,0 @@ -format( 'U' ); - } - - /** - * Set the UTC offset. - * - * This represents a fixed offset instead of a timezone setting. - * - * @param $offset - */ - public function setUtcOffset( $offset ) { - $this->utcOffset = intval( $offset ); - } - - /** - * Returns the timezone offset. - * - * @return int - * @link http://php.net/manual/en/datetime.getoffset.php - */ - public function getOffset() { - return $this->utcOffset ? $this->utcOffset : parent::getOffset(); - } - - /** - * Set the TimeZone associated with the DateTime - * - * @param DateTimeZone $timezone - * - * @return static - * @link http://php.net/manual/en/datetime.settimezone.php - */ - public function setTimezone( $timezone ) { - $this->utcOffset = 0; - parent::setTimezone( $timezone ); - - return $this; - } - - /** - * Get the timestamp with the WordPress timezone offset added or subtracted. - * - * @since 3.0.0 - * @return int - */ - public function getOffsetTimestamp() { - return $this->getTimestamp() + $this->getOffset(); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_Exception.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_Exception.php deleted file mode 100644 index 6a18b6a9..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_Exception.php +++ /dev/null @@ -1,12 +0,0 @@ -store = $store; - } - - public function attach( ActionScheduler_ActionClaim $claim ) { - $this->claim = $claim; - add_action( 'shutdown', array( $this, 'handle_unexpected_shutdown' ) ); - add_action( 'action_scheduler_before_execute', array( $this, 'track_current_action' ), 0, 1 ); - add_action( 'action_scheduler_after_execute', array( $this, 'untrack_action' ), 0, 0 ); - add_action( 'action_scheduler_execution_ignored', array( $this, 'untrack_action' ), 0, 0 ); - add_action( 'action_scheduler_failed_execution', array( $this, 'untrack_action' ), 0, 0 ); - } - - public function detach() { - $this->claim = NULL; - $this->untrack_action(); - remove_action( 'shutdown', array( $this, 'handle_unexpected_shutdown' ) ); - remove_action( 'action_scheduler_before_execute', array( $this, 'track_current_action' ), 0 ); - remove_action( 'action_scheduler_after_execute', array( $this, 'untrack_action' ), 0 ); - remove_action( 'action_scheduler_execution_ignored', array( $this, 'untrack_action' ), 0 ); - remove_action( 'action_scheduler_failed_execution', array( $this, 'untrack_action' ), 0 ); - } - - public function track_current_action( $action_id ) { - $this->action_id = $action_id; - } - - public function untrack_action() { - $this->action_id = 0; - } - - public function handle_unexpected_shutdown() { - if ( $error = error_get_last() ) { - if ( in_array( $error['type'], array( E_ERROR, E_PARSE, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR ) ) ) { - if ( !empty($this->action_id) ) { - $this->store->mark_failure( $this->action_id ); - do_action( 'action_scheduler_unexpected_shutdown', $this->action_id, $error ); - } - } - $this->store->release_claim( $this->claim ); - } - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_InvalidActionException.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_InvalidActionException.php deleted file mode 100644 index b8944aa9..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_InvalidActionException.php +++ /dev/null @@ -1,48 +0,0 @@ - label). - * - * @var array - */ - protected $columns = array(); - - /** - * Actions (name => label). - * - * @var array - */ - protected $row_actions = array(); - - /** - * The active data stores - * - * @var ActionScheduler_Store - */ - protected $store; - - /** - * A logger to use for getting action logs to display - * - * @var ActionScheduler_Logger - */ - protected $logger; - - /** - * A ActionScheduler_QueueRunner runner instance (or child class) - * - * @var ActionScheduler_QueueRunner - */ - protected $runner; - - /** - * Bulk actions. The key of the array is the method name of the implementation: - * - * bulk_(array $ids, string $sql_in). - * - * See the comments in the parent class for further details - * - * @var array - */ - protected $bulk_actions = array(); - - /** - * Flag variable to render our notifications, if any, once. - * - * @var bool - */ - protected static $did_notification = false; - - /** - * Array of seconds for common time periods, like week or month, alongside an internationalised string representation, i.e. "Day" or "Days" - * - * @var array - */ - private static $time_periods; - - /** - * Sets the current data store object into `store->action` and initialises the object. - * - * @param ActionScheduler_Store $store - * @param ActionScheduler_Logger $logger - * @param ActionScheduler_QueueRunner $runner - */ - public function __construct( ActionScheduler_Store $store, ActionScheduler_Logger $logger, ActionScheduler_QueueRunner $runner ) { - - $this->store = $store; - $this->logger = $logger; - $this->runner = $runner; - - $this->table_header = __( 'Scheduled Actions', 'action-scheduler' ); - - $this->bulk_actions = array( - 'delete' => __( 'Delete', 'action-scheduler' ), - ); - - $this->columns = array( - 'hook' => __( 'Hook', 'action-scheduler' ), - 'status' => __( 'Status', 'action-scheduler' ), - 'args' => __( 'Arguments', 'action-scheduler' ), - 'group' => __( 'Group', 'action-scheduler' ), - 'recurrence' => __( 'Recurrence', 'action-scheduler' ), - 'schedule' => __( 'Scheduled Date', 'action-scheduler' ), - 'log_entries' => __( 'Log', 'action-scheduler' ), - ); - - $this->sort_by = array( - 'schedule', - 'hook', - 'group', - ); - - $this->search_by = array( - 'hook', - 'args', - 'claim_id', - ); - - $request_status = $this->get_request_status(); - - if ( empty( $request_status ) ) { - $this->sort_by[] = 'status'; - } elseif ( in_array( $request_status, array( 'in-progress', 'failed' ) ) ) { - $this->columns += array( 'claim_id' => __( 'Claim ID', 'action-scheduler' ) ); - $this->sort_by[] = 'claim_id'; - } - - $this->row_actions = array( - 'hook' => array( - 'run' => array( - 'name' => __( 'Run', 'action-scheduler' ), - 'desc' => __( 'Process the action now as if it were run as part of a queue', 'action-scheduler' ), - ), - 'cancel' => array( - 'name' => __( 'Cancel', 'action-scheduler' ), - 'desc' => __( 'Cancel the action now to avoid it being run in future', 'action-scheduler' ), - 'class' => 'cancel trash', - ), - ), - ); - - self::$time_periods = array( - array( - 'seconds' => YEAR_IN_SECONDS, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s year', '%s years', 'action-scheduler' ), - ), - array( - 'seconds' => MONTH_IN_SECONDS, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s month', '%s months', 'action-scheduler' ), - ), - array( - 'seconds' => WEEK_IN_SECONDS, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s week', '%s weeks', 'action-scheduler' ), - ), - array( - 'seconds' => DAY_IN_SECONDS, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s day', '%s days', 'action-scheduler' ), - ), - array( - 'seconds' => HOUR_IN_SECONDS, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s hour', '%s hours', 'action-scheduler' ), - ), - array( - 'seconds' => MINUTE_IN_SECONDS, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s minute', '%s minutes', 'action-scheduler' ), - ), - array( - 'seconds' => 1, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s second', '%s seconds', 'action-scheduler' ), - ), - ); - - parent::__construct( - array( - 'singular' => 'action-scheduler', - 'plural' => 'action-scheduler', - 'ajax' => false, - ) - ); - - add_screen_option( - 'per_page', - array( - 'default' => $this->items_per_page, - ) - ); - - add_filter( 'set_screen_option_' . $this->get_per_page_option_name(), array( $this, 'set_items_per_page_option' ), 10, 3 ); - set_screen_options(); - } - - /** - * Handles setting the items_per_page option for this screen. - * - * @param mixed $status Default false (to skip saving the current option). - * @param string $option Screen option name. - * @param int $value Screen option value. - * @return int - */ - public function set_items_per_page_option( $status, $option, $value ) { - return $value; - } - /** - * Convert an interval of seconds into a two part human friendly string. - * - * The WordPress human_time_diff() function only calculates the time difference to one degree, meaning - * even if an action is 1 day and 11 hours away, it will display "1 day". This function goes one step - * further to display two degrees of accuracy. - * - * Inspired by the Crontrol::interval() function by Edward Dale: https://wordpress.org/plugins/wp-crontrol/ - * - * @param int $interval A interval in seconds. - * @param int $periods_to_include Depth of time periods to include, e.g. for an interval of 70, and $periods_to_include of 2, both minutes and seconds would be included. With a value of 1, only minutes would be included. - * @return string A human friendly string representation of the interval. - */ - private static function human_interval( $interval, $periods_to_include = 2 ) { - - if ( $interval <= 0 ) { - return __( 'Now!', 'action-scheduler' ); - } - - $output = ''; - - for ( $time_period_index = 0, $periods_included = 0, $seconds_remaining = $interval; $time_period_index < count( self::$time_periods ) && $seconds_remaining > 0 && $periods_included < $periods_to_include; $time_period_index++ ) { - - $periods_in_interval = floor( $seconds_remaining / self::$time_periods[ $time_period_index ]['seconds'] ); - - if ( $periods_in_interval > 0 ) { - if ( ! empty( $output ) ) { - $output .= ' '; - } - $output .= sprintf( _n( self::$time_periods[ $time_period_index ]['names'][0], self::$time_periods[ $time_period_index ]['names'][1], $periods_in_interval, 'action-scheduler' ), $periods_in_interval ); - $seconds_remaining -= $periods_in_interval * self::$time_periods[ $time_period_index ]['seconds']; - $periods_included++; - } - } - - return $output; - } - - /** - * Returns the recurrence of an action or 'Non-repeating'. The output is human readable. - * - * @param ActionScheduler_Action $action - * - * @return string - */ - protected function get_recurrence( $action ) { - $schedule = $action->get_schedule(); - if ( $schedule->is_recurring() ) { - $recurrence = $schedule->get_recurrence(); - - if ( is_numeric( $recurrence ) ) { - /* translators: %s: time interval */ - return sprintf( __( 'Every %s', 'action-scheduler' ), self::human_interval( $recurrence ) ); - } else { - return $recurrence; - } - } - - return __( 'Non-repeating', 'action-scheduler' ); - } - - /** - * Serializes the argument of an action to render it in a human friendly format. - * - * @param array $row The array representation of the current row of the table - * - * @return string - */ - public function column_args( array $row ) { - if ( empty( $row['args'] ) ) { - return apply_filters( 'action_scheduler_list_table_column_args', '', $row ); - } - - $row_html = '
                '; - foreach ( $row['args'] as $key => $value ) { - $row_html .= sprintf( '
              • %s => %s
              • ', esc_html( var_export( $key, true ) ), esc_html( var_export( $value, true ) ) ); - } - $row_html .= '
              '; - - return apply_filters( 'action_scheduler_list_table_column_args', $row_html, $row ); - } - - /** - * Prints the logs entries inline. We do so to avoid loading Javascript and other hacks to show it in a modal. - * - * @param array $row Action array. - * @return string - */ - public function column_log_entries( array $row ) { - - $log_entries_html = '
                '; - - $timezone = new DateTimezone( 'UTC' ); - - foreach ( $row['log_entries'] as $log_entry ) { - $log_entries_html .= $this->get_log_entry_html( $log_entry, $timezone ); - } - - $log_entries_html .= '
              '; - - return $log_entries_html; - } - - /** - * Prints the logs entries inline. We do so to avoid loading Javascript and other hacks to show it in a modal. - * - * @param ActionScheduler_LogEntry $log_entry - * @param DateTimezone $timezone - * @return string - */ - protected function get_log_entry_html( ActionScheduler_LogEntry $log_entry, DateTimezone $timezone ) { - $date = $log_entry->get_date(); - $date->setTimezone( $timezone ); - return sprintf( '
            • %s
              %s
            • ', esc_html( $date->format( 'Y-m-d H:i:s O' ) ), esc_html( $log_entry->get_message() ) ); - } - - /** - * Only display row actions for pending actions. - * - * @param array $row Row to render - * @param string $column_name Current row - * - * @return string - */ - protected function maybe_render_actions( $row, $column_name ) { - if ( 'pending' === strtolower( $row[ 'status_name' ] ) ) { - return parent::maybe_render_actions( $row, $column_name ); - } - - return ''; - } - - /** - * Renders admin notifications - * - * Notifications: - * 1. When the maximum number of tasks are being executed simultaneously. - * 2. Notifications when a task is manually executed. - * 3. Tables are missing. - */ - public function display_admin_notices() { - global $wpdb; - - if ( ( is_a( $this->store, 'ActionScheduler_HybridStore' ) || is_a( $this->store, 'ActionScheduler_DBStore' ) ) && apply_filters( 'action_scheduler_enable_recreate_data_store', true ) ) { - $table_list = array( - 'actionscheduler_actions', - 'actionscheduler_logs', - 'actionscheduler_groups', - 'actionscheduler_claims', - ); - - $found_tables = $wpdb->get_col( "SHOW TABLES LIKE '{$wpdb->prefix}actionscheduler%'" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared - foreach ( $table_list as $table_name ) { - if ( ! in_array( $wpdb->prefix . $table_name, $found_tables ) ) { - $this->admin_notices[] = array( - 'class' => 'error', - 'message' => __( 'It appears one or more database tables were missing. Attempting to re-create the missing table(s).' , 'action-scheduler' ), - ); - $this->recreate_tables(); - parent::display_admin_notices(); - - return; - } - } - } - - if ( $this->runner->has_maximum_concurrent_batches() ) { - $claim_count = $this->store->get_claim_count(); - $this->admin_notices[] = array( - 'class' => 'updated', - 'message' => sprintf( - /* translators: %s: amount of claims */ - _n( - 'Maximum simultaneous queues already in progress (%s queue). No additional queues will begin processing until the current queues are complete.', - 'Maximum simultaneous queues already in progress (%s queues). No additional queues will begin processing until the current queues are complete.', - $claim_count, - 'action-scheduler' - ), - $claim_count - ), - ); - } elseif ( $this->store->has_pending_actions_due() ) { - - $async_request_lock_expiration = ActionScheduler::lock()->get_expiration( 'async-request-runner' ); - - // No lock set or lock expired - if ( false === $async_request_lock_expiration || $async_request_lock_expiration < time() ) { - $in_progress_url = add_query_arg( 'status', 'in-progress', remove_query_arg( 'status' ) ); - /* translators: %s: process URL */ - $async_request_message = sprintf( __( 'A new queue has begun processing. View actions in-progress »', 'action-scheduler' ), esc_url( $in_progress_url ) ); - } else { - /* translators: %d: seconds */ - $async_request_message = sprintf( __( 'The next queue will begin processing in approximately %d seconds.', 'action-scheduler' ), $async_request_lock_expiration - time() ); - } - - $this->admin_notices[] = array( - 'class' => 'notice notice-info', - 'message' => $async_request_message, - ); - } - - $notification = get_transient( 'action_scheduler_admin_notice' ); - - if ( is_array( $notification ) ) { - delete_transient( 'action_scheduler_admin_notice' ); - - $action = $this->store->fetch_action( $notification['action_id'] ); - $action_hook_html = '' . $action->get_hook() . ''; - if ( 1 == $notification['success'] ) { - $class = 'updated'; - switch ( $notification['row_action_type'] ) { - case 'run' : - /* translators: %s: action HTML */ - $action_message_html = sprintf( __( 'Successfully executed action: %s', 'action-scheduler' ), $action_hook_html ); - break; - case 'cancel' : - /* translators: %s: action HTML */ - $action_message_html = sprintf( __( 'Successfully canceled action: %s', 'action-scheduler' ), $action_hook_html ); - break; - default : - /* translators: %s: action HTML */ - $action_message_html = sprintf( __( 'Successfully processed change for action: %s', 'action-scheduler' ), $action_hook_html ); - break; - } - } else { - $class = 'error'; - /* translators: 1: action HTML 2: action ID 3: error message */ - $action_message_html = sprintf( __( 'Could not process change for action: "%1$s" (ID: %2$d). Error: %3$s', 'action-scheduler' ), $action_hook_html, esc_html( $notification['action_id'] ), esc_html( $notification['error_message'] ) ); - } - - $action_message_html = apply_filters( 'action_scheduler_admin_notice_html', $action_message_html, $action, $notification ); - - $this->admin_notices[] = array( - 'class' => $class, - 'message' => $action_message_html, - ); - } - - parent::display_admin_notices(); - } - - /** - * Prints the scheduled date in a human friendly format. - * - * @param array $row The array representation of the current row of the table - * - * @return string - */ - public function column_schedule( $row ) { - return $this->get_schedule_display_string( $row['schedule'] ); - } - - /** - * Get the scheduled date in a human friendly format. - * - * @param ActionScheduler_Schedule $schedule - * @return string - */ - protected function get_schedule_display_string( ActionScheduler_Schedule $schedule ) { - - $schedule_display_string = ''; - - if ( ! $schedule->get_date() ) { - return '0000-00-00 00:00:00'; - } - - $next_timestamp = $schedule->get_date()->getTimestamp(); - - $schedule_display_string .= $schedule->get_date()->format( 'Y-m-d H:i:s O' ); - $schedule_display_string .= '
              '; - - if ( gmdate( 'U' ) > $next_timestamp ) { - /* translators: %s: date interval */ - $schedule_display_string .= sprintf( __( ' (%s ago)', 'action-scheduler' ), self::human_interval( gmdate( 'U' ) - $next_timestamp ) ); - } else { - /* translators: %s: date interval */ - $schedule_display_string .= sprintf( __( ' (%s)', 'action-scheduler' ), self::human_interval( $next_timestamp - gmdate( 'U' ) ) ); - } - - return $schedule_display_string; - } - - /** - * Bulk delete - * - * Deletes actions based on their ID. This is the handler for the bulk delete. It assumes the data - * properly validated by the callee and it will delete the actions without any extra validation. - * - * @param array $ids - * @param string $ids_sql Inherited and unused - */ - protected function bulk_delete( array $ids, $ids_sql ) { - foreach ( $ids as $id ) { - $this->store->delete_action( $id ); - } - } - - /** - * Implements the logic behind running an action. ActionScheduler_Abstract_ListTable validates the request and their - * parameters are valid. - * - * @param int $action_id - */ - protected function row_action_cancel( $action_id ) { - $this->process_row_action( $action_id, 'cancel' ); - } - - /** - * Implements the logic behind running an action. ActionScheduler_Abstract_ListTable validates the request and their - * parameters are valid. - * - * @param int $action_id - */ - protected function row_action_run( $action_id ) { - $this->process_row_action( $action_id, 'run' ); - } - - /** - * Force the data store schema updates. - */ - protected function recreate_tables() { - if ( is_a( $this->store, 'ActionScheduler_HybridStore' ) ) { - $store = $this->store; - } else { - $store = new ActionScheduler_HybridStore(); - } - add_action( 'action_scheduler/created_table', array( $store, 'set_autoincrement' ), 10, 2 ); - - $store_schema = new ActionScheduler_StoreSchema(); - $logger_schema = new ActionScheduler_LoggerSchema(); - $store_schema->register_tables( true ); - $logger_schema->register_tables( true ); - - remove_action( 'action_scheduler/created_table', array( $store, 'set_autoincrement' ), 10 ); - } - /** - * Implements the logic behind processing an action once an action link is clicked on the list table. - * - * @param int $action_id - * @param string $row_action_type The type of action to perform on the action. - */ - protected function process_row_action( $action_id, $row_action_type ) { - try { - switch ( $row_action_type ) { - case 'run' : - $this->runner->process_action( $action_id, 'Admin List Table' ); - break; - case 'cancel' : - $this->store->cancel_action( $action_id ); - break; - } - $success = 1; - $error_message = ''; - } catch ( Exception $e ) { - $success = 0; - $error_message = $e->getMessage(); - } - - set_transient( 'action_scheduler_admin_notice', compact( 'action_id', 'success', 'error_message', 'row_action_type' ), 30 ); - } - - /** - * {@inheritDoc} - */ - public function prepare_items() { - $this->prepare_column_headers(); - - $per_page = $this->get_items_per_page( $this->get_per_page_option_name(), $this->items_per_page ); - - $query = array( - 'per_page' => $per_page, - 'offset' => $this->get_items_offset(), - 'status' => $this->get_request_status(), - 'orderby' => $this->get_request_orderby(), - 'order' => $this->get_request_order(), - 'search' => $this->get_request_search_query(), - ); - - $this->items = array(); - - $total_items = $this->store->query_actions( $query, 'count' ); - - $status_labels = $this->store->get_status_labels(); - - foreach ( $this->store->query_actions( $query ) as $action_id ) { - try { - $action = $this->store->fetch_action( $action_id ); - } catch ( Exception $e ) { - continue; - } - if ( is_a( $action, 'ActionScheduler_NullAction' ) ) { - continue; - } - $this->items[ $action_id ] = array( - 'ID' => $action_id, - 'hook' => $action->get_hook(), - 'status_name' => $this->store->get_status( $action_id ), - 'status' => $status_labels[ $this->store->get_status( $action_id ) ], - 'args' => $action->get_args(), - 'group' => $action->get_group(), - 'log_entries' => $this->logger->get_logs( $action_id ), - 'claim_id' => $this->store->get_claim_id( $action_id ), - 'recurrence' => $this->get_recurrence( $action ), - 'schedule' => $action->get_schedule(), - ); - } - - $this->set_pagination_args( array( - 'total_items' => $total_items, - 'per_page' => $per_page, - 'total_pages' => ceil( $total_items / $per_page ), - ) ); - } - - /** - * Prints the available statuses so the user can click to filter. - */ - protected function display_filter_by_status() { - $this->status_counts = $this->store->action_counts(); - parent::display_filter_by_status(); - } - - /** - * Get the text to display in the search box on the list table. - */ - protected function get_search_box_button_text() { - return __( 'Search hook, args and claim ID', 'action-scheduler' ); - } - - /** - * {@inheritDoc} - */ - protected function get_per_page_option_name() { - return str_replace( '-', '_', $this->screen->id ) . '_per_page'; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_LogEntry.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_LogEntry.php deleted file mode 100644 index 714efe37..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_LogEntry.php +++ /dev/null @@ -1,68 +0,0 @@ -comment_type - * to ActionScheduler_LogEntry::__construct(), goodness knows why, and the Follow-up Emails plugin - * hard-codes loading its own version of ActionScheduler_wpCommentLogger with that out-dated method, - * goodness knows why, so we need to guard against that here instead of using a DateTime type declaration - * for the constructor's 3rd param of $date and causing a fatal error with older versions of FUE. - */ - if ( null !== $date && ! is_a( $date, 'DateTime' ) ) { - _doing_it_wrong( __METHOD__, 'The third parameter must be a valid DateTime instance, or null.', '2.0.0' ); - $date = null; - } - - $this->action_id = $action_id; - $this->message = $message; - $this->date = $date ? $date : new Datetime; - } - - /** - * Returns the date when this log entry was created - * - * @return Datetime - */ - public function get_date() { - return $this->date; - } - - public function get_action_id() { - return $this->action_id; - } - - public function get_message() { - return $this->message; - } -} - diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_NullLogEntry.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_NullLogEntry.php deleted file mode 100644 index fcb4c5f3..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_NullLogEntry.php +++ /dev/null @@ -1,12 +0,0 @@ -maybe_dispatch_async_request() uses a lock to avoid - * calling ActionScheduler_QueueRunner->has_maximum_concurrent_batches() every time the 'shutdown', - * hook is triggered, because that method calls ActionScheduler_QueueRunner->store->get_claim_count() - * to find the current number of claims in the database. - * - * @param string $lock_type A string to identify different lock types. - * @bool True if lock value has changed, false if not or if set failed. - */ - public function set( $lock_type ) { - return update_option( $this->get_key( $lock_type ), time() + $this->get_duration( $lock_type ) ); - } - - /** - * If a lock is set, return the timestamp it was set to expiry. - * - * @param string $lock_type A string to identify different lock types. - * @return bool|int False if no lock is set, otherwise the timestamp for when the lock is set to expire. - */ - public function get_expiration( $lock_type ) { - return get_option( $this->get_key( $lock_type ) ); - } - - /** - * Get the key to use for storing the lock in the transient - * - * @param string $lock_type A string to identify different lock types. - * @return string - */ - protected function get_key( $lock_type ) { - return sprintf( 'action_scheduler_lock_%s', $lock_type ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_QueueCleaner.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_QueueCleaner.php deleted file mode 100644 index 1750eabe..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_QueueCleaner.php +++ /dev/null @@ -1,159 +0,0 @@ -store = $store ? $store : ActionScheduler_Store::instance(); - $this->batch_size = $batch_size; - } - - public function delete_old_actions() { - $lifespan = apply_filters( 'action_scheduler_retention_period', $this->month_in_seconds ); - $cutoff = as_get_datetime_object($lifespan.' seconds ago'); - - $statuses_to_purge = array( - ActionScheduler_Store::STATUS_COMPLETE, - ActionScheduler_Store::STATUS_CANCELED, - ); - - foreach ( $statuses_to_purge as $status ) { - $actions_to_delete = $this->store->query_actions( array( - 'status' => $status, - 'modified' => $cutoff, - 'modified_compare' => '<=', - 'per_page' => $this->get_batch_size(), - 'orderby' => 'none', - ) ); - - foreach ( $actions_to_delete as $action_id ) { - try { - $this->store->delete_action( $action_id ); - } catch ( Exception $e ) { - - /** - * Notify 3rd party code of exceptions when deleting a completed action older than the retention period - * - * This hook provides a way for 3rd party code to log or otherwise handle exceptions relating to their - * actions. - * - * @since 2.0.0 - * - * @param int $action_id The scheduled actions ID in the data store - * @param Exception $e The exception thrown when attempting to delete the action from the data store - * @param int $lifespan The retention period, in seconds, for old actions - * @param int $count_of_actions_to_delete The number of old actions being deleted in this batch - */ - do_action( 'action_scheduler_failed_old_action_deletion', $action_id, $e, $lifespan, count( $actions_to_delete ) ); - } - } - } - } - - /** - * Unclaim pending actions that have not been run within a given time limit. - * - * When called by ActionScheduler_Abstract_QueueRunner::run_cleanup(), the time limit passed - * as a parameter is 10x the time limit used for queue processing. - * - * @param int $time_limit The number of seconds to allow a queue to run before unclaiming its pending actions. Default 300 (5 minutes). - */ - public function reset_timeouts( $time_limit = 300 ) { - $timeout = apply_filters( 'action_scheduler_timeout_period', $time_limit ); - if ( $timeout < 0 ) { - return; - } - $cutoff = as_get_datetime_object($timeout.' seconds ago'); - $actions_to_reset = $this->store->query_actions( array( - 'status' => ActionScheduler_Store::STATUS_PENDING, - 'modified' => $cutoff, - 'modified_compare' => '<=', - 'claimed' => true, - 'per_page' => $this->get_batch_size(), - 'orderby' => 'none', - ) ); - - foreach ( $actions_to_reset as $action_id ) { - $this->store->unclaim_action( $action_id ); - do_action( 'action_scheduler_reset_action', $action_id ); - } - } - - /** - * Mark actions that have been running for more than a given time limit as failed, based on - * the assumption some uncatachable and unloggable fatal error occurred during processing. - * - * When called by ActionScheduler_Abstract_QueueRunner::run_cleanup(), the time limit passed - * as a parameter is 10x the time limit used for queue processing. - * - * @param int $time_limit The number of seconds to allow an action to run before it is considered to have failed. Default 300 (5 minutes). - */ - public function mark_failures( $time_limit = 300 ) { - $timeout = apply_filters( 'action_scheduler_failure_period', $time_limit ); - if ( $timeout < 0 ) { - return; - } - $cutoff = as_get_datetime_object($timeout.' seconds ago'); - $actions_to_reset = $this->store->query_actions( array( - 'status' => ActionScheduler_Store::STATUS_RUNNING, - 'modified' => $cutoff, - 'modified_compare' => '<=', - 'per_page' => $this->get_batch_size(), - 'orderby' => 'none', - ) ); - - foreach ( $actions_to_reset as $action_id ) { - $this->store->mark_failure( $action_id ); - do_action( 'action_scheduler_failed_action', $action_id, $timeout ); - } - } - - /** - * Do all of the cleaning actions. - * - * @param int $time_limit The number of seconds to use as the timeout and failure period. Default 300 (5 minutes). - * @author Jeremy Pry - */ - public function clean( $time_limit = 300 ) { - $this->delete_old_actions(); - $this->reset_timeouts( $time_limit ); - $this->mark_failures( $time_limit ); - } - - /** - * Get the batch size for cleaning the queue. - * - * @author Jeremy Pry - * @return int - */ - protected function get_batch_size() { - /** - * Filter the batch size when cleaning the queue. - * - * @param int $batch_size The number of actions to clean in one batch. - */ - return absint( apply_filters( 'action_scheduler_cleanup_batch_size', $this->batch_size ) ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_QueueRunner.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_QueueRunner.php deleted file mode 100644 index 8451e0da..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_QueueRunner.php +++ /dev/null @@ -1,198 +0,0 @@ -store ); - } - - $this->async_request = $async_request; - } - - /** - * @codeCoverageIgnore - */ - public function init() { - - add_filter( 'cron_schedules', array( self::instance(), 'add_wp_cron_schedule' ) ); - - // Check for and remove any WP Cron hook scheduled by Action Scheduler < 3.0.0, which didn't include the $context param - $next_timestamp = wp_next_scheduled( self::WP_CRON_HOOK ); - if ( $next_timestamp ) { - wp_unschedule_event( $next_timestamp, self::WP_CRON_HOOK ); - } - - $cron_context = array( 'WP Cron' ); - - if ( ! wp_next_scheduled( self::WP_CRON_HOOK, $cron_context ) ) { - $schedule = apply_filters( 'action_scheduler_run_schedule', self::WP_CRON_SCHEDULE ); - wp_schedule_event( time(), $schedule, self::WP_CRON_HOOK, $cron_context ); - } - - add_action( self::WP_CRON_HOOK, array( self::instance(), 'run' ) ); - $this->hook_dispatch_async_request(); - } - - /** - * Hook check for dispatching an async request. - */ - public function hook_dispatch_async_request() { - add_action( 'shutdown', array( $this, 'maybe_dispatch_async_request' ) ); - } - - /** - * Unhook check for dispatching an async request. - */ - public function unhook_dispatch_async_request() { - remove_action( 'shutdown', array( $this, 'maybe_dispatch_async_request' ) ); - } - - /** - * Check if we should dispatch an async request to process actions. - * - * This method is attached to 'shutdown', so is called frequently. To avoid slowing down - * the site, it mitigates the work performed in each request by: - * 1. checking if it's in the admin context and then - * 2. haven't run on the 'shutdown' hook within the lock time (60 seconds by default) - * 3. haven't exceeded the number of allowed batches. - * - * The order of these checks is important, because they run from a check on a value: - * 1. in memory - is_admin() maps to $GLOBALS or the WP_ADMIN constant - * 2. in memory - transients use autoloaded options by default - * 3. from a database query - has_maximum_concurrent_batches() run the query - * $this->store->get_claim_count() to find the current number of claims in the DB. - * - * If all of these conditions are met, then we request an async runner check whether it - * should dispatch a request to process pending actions. - */ - public function maybe_dispatch_async_request() { - if ( is_admin() && ! ActionScheduler::lock()->is_locked( 'async-request-runner' ) ) { - // Only start an async queue at most once every 60 seconds - ActionScheduler::lock()->set( 'async-request-runner' ); - $this->async_request->maybe_dispatch(); - } - } - - /** - * Process actions in the queue. Attached to self::WP_CRON_HOOK i.e. 'action_scheduler_run_queue' - * - * The $context param of this method defaults to 'WP Cron', because prior to Action Scheduler 3.0.0 - * that was the only context in which this method was run, and the self::WP_CRON_HOOK hook had no context - * passed along with it. New code calling this method directly, or by triggering the self::WP_CRON_HOOK, - * should set a context as the first parameter. For an example of this, refer to the code seen in - * @see ActionScheduler_AsyncRequest_QueueRunner::handle() - * - * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron' - * Generally, this should be capitalised and not localised as it's a proper noun. - * @return int The number of actions processed. - */ - public function run( $context = 'WP Cron' ) { - ActionScheduler_Compatibility::raise_memory_limit(); - ActionScheduler_Compatibility::raise_time_limit( $this->get_time_limit() ); - do_action( 'action_scheduler_before_process_queue' ); - $this->run_cleanup(); - $processed_actions = 0; - if ( false === $this->has_maximum_concurrent_batches() ) { - $batch_size = apply_filters( 'action_scheduler_queue_runner_batch_size', 25 ); - do { - $processed_actions_in_batch = $this->do_batch( $batch_size, $context ); - $processed_actions += $processed_actions_in_batch; - } while ( $processed_actions_in_batch > 0 && ! $this->batch_limits_exceeded( $processed_actions ) ); // keep going until we run out of actions, time, or memory - } - - do_action( 'action_scheduler_after_process_queue' ); - return $processed_actions; - } - - /** - * Process a batch of actions pending in the queue. - * - * Actions are processed by claiming a set of pending actions then processing each one until either the batch - * size is completed, or memory or time limits are reached, defined by @see $this->batch_limits_exceeded(). - * - * @param int $size The maximum number of actions to process in the batch. - * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron' - * Generally, this should be capitalised and not localised as it's a proper noun. - * @return int The number of actions processed. - */ - protected function do_batch( $size = 100, $context = '' ) { - $claim = $this->store->stake_claim($size); - $this->monitor->attach($claim); - $processed_actions = 0; - - foreach ( $claim->get_actions() as $action_id ) { - // bail if we lost the claim - if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $claim->get_id() ) ) ) { - break; - } - $this->process_action( $action_id, $context ); - $processed_actions++; - - if ( $this->batch_limits_exceeded( $processed_actions ) ) { - break; - } - } - $this->store->release_claim($claim); - $this->monitor->detach(); - $this->clear_caches(); - return $processed_actions; - } - - /** - * Running large batches can eat up memory, as WP adds data to its object cache. - * - * If using a persistent object store, this has the side effect of flushing that - * as well, so this is disabled by default. To enable: - * - * add_filter( 'action_scheduler_queue_runner_flush_cache', '__return_true' ); - */ - protected function clear_caches() { - if ( ! wp_using_ext_object_cache() || apply_filters( 'action_scheduler_queue_runner_flush_cache', false ) ) { - wp_cache_flush(); - } - } - - public function add_wp_cron_schedule( $schedules ) { - $schedules['every_minute'] = array( - 'interval' => 60, // in seconds - 'display' => __( 'Every minute', 'action-scheduler' ), - ); - - return $schedules; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_Versions.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_Versions.php deleted file mode 100644 index 8bf228cb..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_Versions.php +++ /dev/null @@ -1,63 +0,0 @@ -versions[$version_string]) ) { - return FALSE; - } - $this->versions[$version_string] = $initialization_callback; - return TRUE; - } - - public function get_versions() { - return $this->versions; - } - - public function latest_version() { - $keys = array_keys($this->versions); - if ( empty($keys) ) { - return false; - } - uasort( $keys, 'version_compare' ); - return end($keys); - } - - public function latest_version_callback() { - $latest = $this->latest_version(); - if ( empty($latest) || !isset($this->versions[$latest]) ) { - return '__return_null'; - } - return $this->versions[$latest]; - } - - /** - * @return ActionScheduler_Versions - * @codeCoverageIgnore - */ - public static function instance() { - if ( empty(self::$instance) ) { - self::$instance = new self(); - } - return self::$instance; - } - - /** - * @codeCoverageIgnore - */ - public static function initialize_latest_version() { - $self = self::instance(); - call_user_func($self->latest_version_callback()); - } -} - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php deleted file mode 100644 index 832bce17..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php +++ /dev/null @@ -1,116 +0,0 @@ - Status administration screen - add_action( 'load-tools_page_action-scheduler', array( __CLASS__, 'register_admin_notice' ) ); - add_action( 'load-woocommerce_page_wc-status', array( __CLASS__, 'register_admin_notice' ) ); - } - - /** - * Determines if there are log entries in the wp comments table. - * - * Uses the flag set on migration completion set by @see self::maybe_schedule_cleanup(). - * - * @return boolean Whether there are scheduled action comments in the comments table. - */ - public static function has_logs() { - return 'yes' === get_option( self::$has_logs_option_key ); - } - - /** - * Schedules the WP Post comment table cleanup to run in 6 months if it's not already scheduled. - * Attached to the migration complete hook 'action_scheduler/migration_complete'. - */ - public static function maybe_schedule_cleanup() { - if ( (bool) get_comments( array( 'type' => ActionScheduler_wpCommentLogger::TYPE, 'number' => 1, 'fields' => 'ids' ) ) ) { - update_option( self::$has_logs_option_key, 'yes' ); - - if ( ! as_next_scheduled_action( self::$cleanup_hook ) ) { - as_schedule_single_action( gmdate( 'U' ) + ( 6 * MONTH_IN_SECONDS ), self::$cleanup_hook ); - } - } - } - - /** - * Delete all action comments from the WP Comments table. - */ - public static function delete_all_action_comments() { - global $wpdb; - $wpdb->delete( $wpdb->comments, array( 'comment_type' => ActionScheduler_wpCommentLogger::TYPE, 'comment_agent' => ActionScheduler_wpCommentLogger::AGENT ) ); - delete_option( self::$has_logs_option_key ); - } - - /** - * Registers admin notices about the orphaned action logs. - */ - public static function register_admin_notice() { - add_action( 'admin_notices', array( __CLASS__, 'print_admin_notice' ) ); - } - - /** - * Prints details about the orphaned action logs and includes information on where to learn more. - */ - public static function print_admin_notice() { - $next_cleanup_message = ''; - $next_scheduled_cleanup_hook = as_next_scheduled_action( self::$cleanup_hook ); - - if ( $next_scheduled_cleanup_hook ) { - /* translators: %s: date interval */ - $next_cleanup_message = sprintf( __( 'This data will be deleted in %s.', 'action-scheduler' ), human_time_diff( gmdate( 'U' ), $next_scheduled_cleanup_hook ) ); - } - - $notice = sprintf( - /* translators: 1: next cleanup message 2: github issue URL */ - __( 'Action Scheduler has migrated data to custom tables; however, orphaned log entries exist in the WordPress Comments table. %1$s Learn more »', 'action-scheduler' ), - $next_cleanup_message, - 'https://github.com/woocommerce/action-scheduler/issues/368' - ); - - echo '

              ' . wp_kses_post( $notice ) . '

              '; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php deleted file mode 100644 index 424131e0..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php +++ /dev/null @@ -1,167 +0,0 @@ -store = $store; - } - - /** - * Display action data, including number of actions grouped by status and the oldest & newest action in each status. - * - * Helpful to identify issues, like a clogged queue. - */ - public function render() { - $action_counts = $this->store->action_counts(); - $status_labels = $this->store->get_status_labels(); - $oldest_and_newest = $this->get_oldest_and_newest( array_keys( $status_labels ) ); - - $this->get_template( $status_labels, $action_counts, $oldest_and_newest ); - } - - /** - * Get oldest and newest scheduled dates for a given set of statuses. - * - * @param array $status_keys Set of statuses to find oldest & newest action for. - * @return array - */ - protected function get_oldest_and_newest( $status_keys ) { - - $oldest_and_newest = array(); - - foreach ( $status_keys as $status ) { - $oldest_and_newest[ $status ] = array( - 'oldest' => '–', - 'newest' => '–', - ); - - if ( 'in-progress' === $status ) { - continue; - } - - $oldest_and_newest[ $status ]['oldest'] = $this->get_action_status_date( $status, 'oldest' ); - $oldest_and_newest[ $status ]['newest'] = $this->get_action_status_date( $status, 'newest' ); - } - - return $oldest_and_newest; - } - - /** - * Get oldest or newest scheduled date for a given status. - * - * @param string $status Action status label/name string. - * @param string $date_type Oldest or Newest. - * @return DateTime - */ - protected function get_action_status_date( $status, $date_type = 'oldest' ) { - - $order = 'oldest' === $date_type ? 'ASC' : 'DESC'; - - $action = $this->store->query_actions( - array( - 'claimed' => false, - 'status' => $status, - 'per_page' => 1, - 'order' => $order, - ) - ); - - if ( ! empty( $action ) ) { - $date_object = $this->store->get_date( $action[0] ); - $action_date = $date_object->format( 'Y-m-d H:i:s O' ); - } else { - $action_date = '–'; - } - - return $action_date; - } - - /** - * Get oldest or newest scheduled date for a given status. - * - * @param array $status_labels Set of statuses to find oldest & newest action for. - * @param array $action_counts Number of actions grouped by status. - * @param array $oldest_and_newest Date of the oldest and newest action with each status. - */ - protected function get_template( $status_labels, $action_counts, $oldest_and_newest ) { - $as_version = ActionScheduler_Versions::instance()->latest_version(); - $as_datastore = get_class( ActionScheduler_Store::instance() ); - ?> - - - - - - - - - - - - - - - - - - - - - - - - $count ) { - // WC uses the 3rd column for export, so we need to display more data in that (hidden when viewed as part of the table) and add an empty 2nd column. - printf( - '', - esc_html( $status_labels[ $status ] ), - esc_html( number_format_i18n( $count ) ), - esc_html( $oldest_and_newest[ $status ]['oldest'] ), - esc_html( $oldest_and_newest[ $status ]['newest'] ) - ); - } - ?> - -

               
              %1$s %2$s, Oldest: %3$s, Newest: %4$s%3$s%4$s
              - - run_cleanup(); - $this->add_hooks(); - - // Check to make sure there aren't too many concurrent processes running. - if ( $this->has_maximum_concurrent_batches() ) { - if ( $force ) { - WP_CLI::warning( __( 'There are too many concurrent batches, but the run is forced to continue.', 'action-scheduler' ) ); - } else { - WP_CLI::error( __( 'There are too many concurrent batches.', 'action-scheduler' ) ); - } - } - - // Stake a claim and store it. - $this->claim = $this->store->stake_claim( $batch_size, null, $hooks, $group ); - $this->monitor->attach( $this->claim ); - $this->actions = $this->claim->get_actions(); - - return count( $this->actions ); - } - - /** - * Add our hooks to the appropriate actions. - * - * @author Jeremy Pry - */ - protected function add_hooks() { - add_action( 'action_scheduler_before_execute', array( $this, 'before_execute' ) ); - add_action( 'action_scheduler_after_execute', array( $this, 'after_execute' ), 10, 2 ); - add_action( 'action_scheduler_failed_execution', array( $this, 'action_failed' ), 10, 2 ); - } - - /** - * Set up the WP CLI progress bar. - * - * @author Jeremy Pry - */ - protected function setup_progress_bar() { - $count = count( $this->actions ); - $this->progress_bar = new ProgressBar( - /* translators: %d: amount of actions */ - sprintf( _n( 'Running %d action', 'Running %d actions', $count, 'action-scheduler' ), number_format_i18n( $count ) ), - $count - ); - } - - /** - * Process actions in the queue. - * - * @author Jeremy Pry - * - * @param string $context Optional runner context. Default 'WP CLI'. - * - * @return int The number of actions processed. - */ - public function run( $context = 'WP CLI' ) { - do_action( 'action_scheduler_before_process_queue' ); - $this->setup_progress_bar(); - foreach ( $this->actions as $action_id ) { - // Error if we lost the claim. - if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $this->claim->get_id() ) ) ) { - WP_CLI::warning( __( 'The claim has been lost. Aborting current batch.', 'action-scheduler' ) ); - break; - } - - $this->process_action( $action_id, $context ); - $this->progress_bar->tick(); - } - - $completed = $this->progress_bar->current(); - $this->progress_bar->finish(); - $this->store->release_claim( $this->claim ); - do_action( 'action_scheduler_after_process_queue' ); - - return $completed; - } - - /** - * Handle WP CLI message when the action is starting. - * - * @author Jeremy Pry - * - * @param $action_id - */ - public function before_execute( $action_id ) { - /* translators: %s refers to the action ID */ - WP_CLI::log( sprintf( __( 'Started processing action %s', 'action-scheduler' ), $action_id ) ); - } - - /** - * Handle WP CLI message when the action has completed. - * - * @author Jeremy Pry - * - * @param int $action_id - * @param null|ActionScheduler_Action $action The instance of the action. Default to null for backward compatibility. - */ - public function after_execute( $action_id, $action = null ) { - // backward compatibility - if ( null === $action ) { - $action = $this->store->fetch_action( $action_id ); - } - /* translators: 1: action ID 2: hook name */ - WP_CLI::log( sprintf( __( 'Completed processing action %1$s with hook: %2$s', 'action-scheduler' ), $action_id, $action->get_hook() ) ); - } - - /** - * Handle WP CLI message when the action has failed. - * - * @author Jeremy Pry - * - * @param int $action_id - * @param Exception $exception - * @throws \WP_CLI\ExitException With failure message. - */ - public function action_failed( $action_id, $exception ) { - WP_CLI::error( - /* translators: 1: action ID 2: exception message */ - sprintf( __( 'Error processing action %1$s: %2$s', 'action-scheduler' ), $action_id, $exception->getMessage() ), - false - ); - } - - /** - * Sleep and help avoid hitting memory limit - * - * @param int $sleep_time Amount of seconds to sleep - * @deprecated 3.0.0 - */ - protected function stop_the_insanity( $sleep_time = 0 ) { - _deprecated_function( 'ActionScheduler_WPCLI_QueueRunner::stop_the_insanity', '3.0.0', 'ActionScheduler_DataController::free_memory' ); - - ActionScheduler_DataController::free_memory(); - } - - /** - * Maybe trigger the stop_the_insanity() method to free up memory. - */ - protected function maybe_stop_the_insanity() { - // The value returned by progress_bar->current() might be padded. Remove padding, and convert to int. - $current_iteration = intval( trim( $this->progress_bar->current() ) ); - if ( 0 === $current_iteration % 50 ) { - $this->stop_the_insanity(); - } - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php deleted file mode 100644 index 99a1ef1c..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php +++ /dev/null @@ -1,159 +0,0 @@ -] - * : The maximum number of actions to run. Defaults to 100. - * - * [--batches=] - * : Limit execution to a number of batches. Defaults to 0, meaning batches will continue being executed until all actions are complete. - * - * [--cleanup-batch-size=] - * : The maximum number of actions to clean up. Defaults to the value of --batch-size. - * - * [--hooks=] - * : Only run actions with the specified hook. Omitting this option runs actions with any hook. Define multiple hooks as a comma separated string (without spaces), e.g. `--hooks=hook_one,hook_two,hook_three` - * - * [--group=] - * : Only run actions from the specified group. Omitting this option runs actions from all groups. - * - * [--free-memory-on=] - * : The number of actions to process between freeing memory. 0 disables freeing memory. Default 50. - * - * [--pause=] - * : The number of seconds to pause when freeing memory. Default no pause. - * - * [--force] - * : Whether to force execution despite the maximum number of concurrent processes being exceeded. - * - * @param array $args Positional arguments. - * @param array $assoc_args Keyed arguments. - * @throws \WP_CLI\ExitException When an error occurs. - * - * @subcommand run - */ - public function run( $args, $assoc_args ) { - // Handle passed arguments. - $batch = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batch-size', 100 ) ); - $batches = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batches', 0 ) ); - $clean = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'cleanup-batch-size', $batch ) ); - $hooks = explode( ',', WP_CLI\Utils\get_flag_value( $assoc_args, 'hooks', '' ) ); - $hooks = array_filter( array_map( 'trim', $hooks ) ); - $group = \WP_CLI\Utils\get_flag_value( $assoc_args, 'group', '' ); - $free_on = \WP_CLI\Utils\get_flag_value( $assoc_args, 'free-memory-on', 50 ); - $sleep = \WP_CLI\Utils\get_flag_value( $assoc_args, 'pause', 0 ); - $force = \WP_CLI\Utils\get_flag_value( $assoc_args, 'force', false ); - - ActionScheduler_DataController::set_free_ticks( $free_on ); - ActionScheduler_DataController::set_sleep_time( $sleep ); - - $batches_completed = 0; - $actions_completed = 0; - $unlimited = $batches === 0; - - try { - // Custom queue cleaner instance. - $cleaner = new ActionScheduler_QueueCleaner( null, $clean ); - - // Get the queue runner instance - $runner = new ActionScheduler_WPCLI_QueueRunner( null, null, $cleaner ); - - // Determine how many tasks will be run in the first batch. - $total = $runner->setup( $batch, $hooks, $group, $force ); - - // Run actions for as long as possible. - while ( $total > 0 ) { - $this->print_total_actions( $total ); - $actions_completed += $runner->run(); - $batches_completed++; - - // Maybe set up tasks for the next batch. - $total = ( $unlimited || $batches_completed < $batches ) ? $runner->setup( $batch, $hooks, $group, $force ) : 0; - } - } catch ( Exception $e ) { - $this->print_error( $e ); - } - - $this->print_total_batches( $batches_completed ); - $this->print_success( $actions_completed ); - } - - /** - * Print WP CLI message about how many actions are about to be processed. - * - * @author Jeremy Pry - * - * @param int $total - */ - protected function print_total_actions( $total ) { - WP_CLI::log( - sprintf( - /* translators: %d refers to how many scheduled taks were found to run */ - _n( 'Found %d scheduled task', 'Found %d scheduled tasks', $total, 'action-scheduler' ), - number_format_i18n( $total ) - ) - ); - } - - /** - * Print WP CLI message about how many batches of actions were processed. - * - * @author Jeremy Pry - * - * @param int $batches_completed - */ - protected function print_total_batches( $batches_completed ) { - WP_CLI::log( - sprintf( - /* translators: %d refers to the total number of batches executed */ - _n( '%d batch executed.', '%d batches executed.', $batches_completed, 'action-scheduler' ), - number_format_i18n( $batches_completed ) - ) - ); - } - - /** - * Convert an exception into a WP CLI error. - * - * @author Jeremy Pry - * - * @param Exception $e The error object. - * - * @throws \WP_CLI\ExitException - */ - protected function print_error( Exception $e ) { - WP_CLI::error( - sprintf( - /* translators: %s refers to the exception error message */ - __( 'There was an error running the action scheduler: %s', 'action-scheduler' ), - $e->getMessage() - ) - ); - } - - /** - * Print a success message with the number of completed actions. - * - * @author Jeremy Pry - * - * @param int $actions_completed - */ - protected function print_success( $actions_completed ) { - WP_CLI::success( - sprintf( - /* translators: %d refers to the total number of taskes completed */ - _n( '%d scheduled task completed.', '%d scheduled tasks completed.', $actions_completed, 'action-scheduler' ), - number_format_i18n( $actions_completed ) - ) - ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/WP_CLI/Migration_Command.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/WP_CLI/Migration_Command.php deleted file mode 100644 index b5b1043a..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/WP_CLI/Migration_Command.php +++ /dev/null @@ -1,149 +0,0 @@ - 'Migrates actions to the DB tables store', - 'synopsis' => [ - [ - 'type' => 'assoc', - 'name' => 'batch-size', - 'optional' => true, - 'default' => 100, - 'description' => 'The number of actions to process in each batch', - ], - [ - 'type' => 'assoc', - 'name' => 'free-memory-on', - 'optional' => true, - 'default' => 50, - 'description' => 'The number of actions to process between freeing memory. 0 disables freeing memory', - ], - [ - 'type' => 'assoc', - 'name' => 'pause', - 'optional' => true, - 'default' => 0, - 'description' => 'The number of seconds to pause when freeing memory', - ], - [ - 'type' => 'flag', - 'name' => 'dry-run', - 'optional' => true, - 'description' => 'Reports on the actions that would have been migrated, but does not change any data', - ], - ], - ] ); - } - - /** - * Process the data migration. - * - * @param array $positional_args Required for WP CLI. Not used in migration. - * @param array $assoc_args Optional arguments. - * - * @return void - */ - public function migrate( $positional_args, $assoc_args ) { - $this->init_logging(); - - $config = $this->get_migration_config( $assoc_args ); - $runner = new Runner( $config ); - $runner->init_destination(); - - $batch_size = isset( $assoc_args[ 'batch-size' ] ) ? (int) $assoc_args[ 'batch-size' ] : 100; - $free_on = isset( $assoc_args[ 'free-memory-on' ] ) ? (int) $assoc_args[ 'free-memory-on' ] : 50; - $sleep = isset( $assoc_args[ 'pause' ] ) ? (int) $assoc_args[ 'pause' ] : 0; - \ActionScheduler_DataController::set_free_ticks( $free_on ); - \ActionScheduler_DataController::set_sleep_time( $sleep ); - - do { - $actions_processed = $runner->run( $batch_size ); - $this->total_processed += $actions_processed; - } while ( $actions_processed > 0 ); - - if ( ! $config->get_dry_run() ) { - // let the scheduler know that there's nothing left to do - $scheduler = new Scheduler(); - $scheduler->mark_complete(); - } - - WP_CLI::success( sprintf( '%s complete. %d actions processed.', $config->get_dry_run() ? 'Dry run' : 'Migration', $this->total_processed ) ); - } - - /** - * Build the config object used to create the Runner - * - * @param array $args Optional arguments. - * - * @return ActionScheduler\Migration\Config - */ - private function get_migration_config( $args ) { - $args = wp_parse_args( $args, [ - 'dry-run' => false, - ] ); - - $config = Controller::instance()->get_migration_config_object(); - $config->set_dry_run( ! empty( $args[ 'dry-run' ] ) ); - - return $config; - } - - /** - * Hook command line logging into migration actions. - */ - private function init_logging() { - add_action( 'action_scheduler/migrate_action_dry_run', function ( $action_id ) { - WP_CLI::debug( sprintf( 'Dry-run: migrated action %d', $action_id ) ); - }, 10, 1 ); - add_action( 'action_scheduler/no_action_to_migrate', function ( $action_id ) { - WP_CLI::debug( sprintf( 'No action found to migrate for ID %d', $action_id ) ); - }, 10, 1 ); - add_action( 'action_scheduler/migrate_action_failed', function ( $action_id ) { - WP_CLI::warning( sprintf( 'Failed migrating action with ID %d', $action_id ) ); - }, 10, 1 ); - add_action( 'action_scheduler/migrate_action_incomplete', function ( $source_id, $destination_id ) { - WP_CLI::warning( sprintf( 'Unable to remove source action with ID %d after migrating to new ID %d', $source_id, $destination_id ) ); - }, 10, 2 ); - add_action( 'action_scheduler/migrated_action', function ( $source_id, $destination_id ) { - WP_CLI::debug( sprintf( 'Migrated source action with ID %d to new store with ID %d', $source_id, $destination_id ) ); - }, 10, 2 ); - add_action( 'action_scheduler/migration_batch_starting', function ( $batch ) { - WP_CLI::debug( 'Beginning migration of batch: ' . print_r( $batch, true ) ); - }, 10, 1 ); - add_action( 'action_scheduler/migration_batch_complete', function ( $batch ) { - WP_CLI::log( sprintf( 'Completed migration of %d actions', count( $batch ) ) ); - }, 10, 1 ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/WP_CLI/ProgressBar.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/WP_CLI/ProgressBar.php deleted file mode 100644 index 9acfa2bb..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/WP_CLI/ProgressBar.php +++ /dev/null @@ -1,120 +0,0 @@ -total_ticks = 0; - $this->message = $message; - $this->count = $count; - $this->interval = $interval; - } - - /** - * Increment the progress bar ticks. - */ - public function tick() { - if ( null === $this->progress_bar ) { - $this->setup_progress_bar(); - } - - $this->progress_bar->tick(); - $this->total_ticks++; - - do_action( 'action_scheduler/progress_tick', $this->total_ticks ); - } - - /** - * Get the progress bar tick count. - * - * @return int - */ - public function current() { - return $this->progress_bar ? $this->progress_bar->current() : 0; - } - - /** - * Finish the current progress bar. - */ - public function finish() { - if ( null !== $this->progress_bar ) { - $this->progress_bar->finish(); - } - - $this->progress_bar = null; - } - - /** - * Set the message used when creating the progress bar. - * - * @param string $message The message to be used when the next progress bar is created. - */ - public function set_message( $message ) { - $this->message = $message; - } - - /** - * Set the count for a new progress bar. - * - * @param integer $count The total number of ticks expected to complete. - */ - public function set_count( $count ) { - $this->count = $count; - $this->finish(); - } - - /** - * Set up the progress bar. - */ - protected function setup_progress_bar() { - $this->progress_bar = \WP_CLI\Utils\make_progress_bar( - $this->message, - $this->count, - $this->interval - ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler.php deleted file mode 100644 index 10173f18..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler.php +++ /dev/null @@ -1,305 +0,0 @@ -init(); - $store->init(); - $logger->init(); - $runner->init(); - } - - if ( apply_filters( 'action_scheduler_load_deprecated_functions', true ) ) { - require_once( self::plugin_path( 'deprecated/functions.php' ) ); - } - - if ( defined( 'WP_CLI' ) && WP_CLI ) { - WP_CLI::add_command( 'action-scheduler', 'ActionScheduler_WPCLI_Scheduler_command' ); - if ( ! ActionScheduler_DataController::is_migration_complete() && Controller::instance()->allow_migration() ) { - $command = new Migration_Command(); - $command->register(); - } - } - - self::$data_store_initialized = true; - - /** - * Handle WP comment cleanup after migration. - */ - if ( is_a( $logger, 'ActionScheduler_DBLogger' ) && ActionScheduler_DataController::is_migration_complete() && ActionScheduler_WPCommentCleaner::has_logs() ) { - ActionScheduler_WPCommentCleaner::init(); - } - - add_action( 'action_scheduler/migration_complete', 'ActionScheduler_WPCommentCleaner::maybe_schedule_cleanup' ); - } - - /** - * Check whether the AS data store has been initialized. - * - * @param string $function_name The name of the function being called. Optional. Default `null`. - * @return bool - */ - public static function is_initialized( $function_name = null ) { - if ( ! self::$data_store_initialized && ! empty( $function_name ) ) { - $message = sprintf( __( '%s() was called before the Action Scheduler data store was initialized', 'action-scheduler' ), esc_attr( $function_name ) ); - error_log( $message, E_WARNING ); - } - - return self::$data_store_initialized; - } - - /** - * Determine if the class is one of our abstract classes. - * - * @since 3.0.0 - * - * @param string $class The class name. - * - * @return bool - */ - protected static function is_class_abstract( $class ) { - static $abstracts = array( - 'ActionScheduler' => true, - 'ActionScheduler_Abstract_ListTable' => true, - 'ActionScheduler_Abstract_QueueRunner' => true, - 'ActionScheduler_Abstract_Schedule' => true, - 'ActionScheduler_Abstract_RecurringSchedule' => true, - 'ActionScheduler_Lock' => true, - 'ActionScheduler_Logger' => true, - 'ActionScheduler_Abstract_Schema' => true, - 'ActionScheduler_Store' => true, - 'ActionScheduler_TimezoneHelper' => true, - ); - - return isset( $abstracts[ $class ] ) && $abstracts[ $class ]; - } - - /** - * Determine if the class is one of our migration classes. - * - * @since 3.0.0 - * - * @param string $class The class name. - * - * @return bool - */ - protected static function is_class_migration( $class ) { - static $migration_segments = array( - 'ActionMigrator' => true, - 'BatchFetcher' => true, - 'DBStoreMigrator' => true, - 'DryRun' => true, - 'LogMigrator' => true, - 'Config' => true, - 'Controller' => true, - 'Runner' => true, - 'Scheduler' => true, - ); - - $segments = explode( '_', $class ); - $segment = isset( $segments[ 1 ] ) ? $segments[ 1 ] : $class; - - return isset( $migration_segments[ $segment ] ) && $migration_segments[ $segment ]; - } - - /** - * Determine if the class is one of our WP CLI classes. - * - * @since 3.0.0 - * - * @param string $class The class name. - * - * @return bool - */ - protected static function is_class_cli( $class ) { - static $cli_segments = array( - 'QueueRunner' => true, - 'Command' => true, - 'ProgressBar' => true, - ); - - $segments = explode( '_', $class ); - $segment = isset( $segments[ 1 ] ) ? $segments[ 1 ] : $class; - - return isset( $cli_segments[ $segment ] ) && $cli_segments[ $segment ]; - } - - final public function __clone() { - trigger_error("Singleton. No cloning allowed!", E_USER_ERROR); - } - - final public function __wakeup() { - trigger_error("Singleton. No serialization allowed!", E_USER_ERROR); - } - - final private function __construct() {} - - /** Deprecated **/ - - public static function get_datetime_object( $when = null, $timezone = 'UTC' ) { - _deprecated_function( __METHOD__, '2.0', 'wcs_add_months()' ); - return as_get_datetime_object( $when, $timezone ); - } - - /** - * Issue deprecated warning if an Action Scheduler function is called in the shutdown hook. - * - * @param string $function_name The name of the function being called. - * @deprecated 3.1.6. - */ - public static function check_shutdown_hook( $function_name ) { - _deprecated_function( __FUNCTION__, '3.1.6' ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php deleted file mode 100644 index 4771f28e..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php +++ /dev/null @@ -1,767 +0,0 @@ - value pair. The - * key must much the table column name and the value is the label, which is - * automatically translated. - * - * @var array - */ - protected $columns = array(); - - /** - * Defines the row-actions. It expects an array where the key - * is the column name and the value is an array of actions. - * - * The array of actions are key => value, where key is the method name - * (with the prefix row_action_) and the value is the label - * and title. - * - * @var array - */ - protected $row_actions = array(); - - /** - * The Primary key of our table - * - * @var string - */ - protected $ID = 'ID'; - - /** - * Enables sorting, it expects an array - * of columns (the column names are the values) - * - * @var array - */ - protected $sort_by = array(); - - /** - * The default sort order - * - * @var string - */ - protected $filter_by = array(); - - /** - * The status name => count combinations for this table's items. Used to display status filters. - * - * @var array - */ - protected $status_counts = array(); - - /** - * Notices to display when loading the table. Array of arrays of form array( 'class' => {updated|error}, 'message' => 'This is the notice text display.' ). - * - * @var array - */ - protected $admin_notices = array(); - - /** - * Localised string displayed in the

              element above the able. - * - * @var string - */ - protected $table_header; - - /** - * Enables bulk actions. It must be an array where the key is the action name - * and the value is the label (which is translated automatically). It is important - * to notice that it will check that the method exists (`bulk_$name`) and will throw - * an exception if it does not exists. - * - * This class will automatically check if the current request has a bulk action, will do the - * validations and afterwards will execute the bulk method, with two arguments. The first argument - * is the array with primary keys, the second argument is a string with a list of the primary keys, - * escaped and ready to use (with `IN`). - * - * @var array - */ - protected $bulk_actions = array(); - - /** - * Makes translation easier, it basically just wraps - * `_x` with some default (the package name). - * - * @param string $text The new text to translate. - * @param string $context The context of the text. - * @return string|void The translated text. - * - * @deprecated 3.0.0 Use `_x()` instead. - */ - protected function translate( $text, $context = '' ) { - return $text; - } - - /** - * Reads `$this->bulk_actions` and returns an array that WP_List_Table understands. It - * also validates that the bulk method handler exists. It throws an exception because - * this is a library meant for developers and missing a bulk method is a development-time error. - * - * @return array - * - * @throws RuntimeException Throws RuntimeException when the bulk action does not have a callback method. - */ - protected function get_bulk_actions() { - $actions = array(); - - foreach ( $this->bulk_actions as $action => $label ) { - if ( ! is_callable( array( $this, 'bulk_' . $action ) ) ) { - throw new RuntimeException( "The bulk action $action does not have a callback method" ); - } - - $actions[ $action ] = $label; - } - - return $actions; - } - - /** - * Checks if the current request has a bulk action. If that is the case it will validate and will - * execute the bulk method handler. Regardless if the action is valid or not it will redirect to - * the previous page removing the current arguments that makes this request a bulk action. - */ - protected function process_bulk_action() { - global $wpdb; - // Detect when a bulk action is being triggered. - $action = $this->current_action(); - if ( ! $action ) { - return; - } - - check_admin_referer( 'bulk-' . $this->_args['plural'] ); - - $method = 'bulk_' . $action; - if ( array_key_exists( $action, $this->bulk_actions ) && is_callable( array( $this, $method ) ) && ! empty( $_GET['ID'] ) && is_array( $_GET['ID'] ) ) { - $ids_sql = '(' . implode( ',', array_fill( 0, count( $_GET['ID'] ), '%s' ) ) . ')'; - $id = array_map( 'absint', $_GET['ID'] ); - $this->$method( $id, $wpdb->prepare( $ids_sql, $id ) ); //phpcs:ignore WordPress.DB.PreparedSQL - } - - if ( isset( $_SERVER['REQUEST_URI'] ) ) { - wp_safe_redirect( - remove_query_arg( - array( '_wp_http_referer', '_wpnonce', 'ID', 'action', 'action2' ), - esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) - ) - ); - exit; - } - } - - /** - * Default code for deleting entries. - * validated already by process_bulk_action() - * - * @param array $ids ids of the items to delete. - * @param string $ids_sql the sql for the ids. - * @return void - */ - protected function bulk_delete( array $ids, $ids_sql ) { - $store = ActionScheduler::store(); - foreach ( $ids as $action_id ) { - $store->delete( $action_id ); - } - } - - /** - * Prepares the _column_headers property which is used by WP_Table_List at rendering. - * It merges the columns and the sortable columns. - */ - protected function prepare_column_headers() { - $this->_column_headers = array( - $this->get_columns(), - get_hidden_columns( $this->screen ), - $this->get_sortable_columns(), - ); - } - - /** - * Reads $this->sort_by and returns the columns name in a format that WP_Table_List - * expects - */ - public function get_sortable_columns() { - $sort_by = array(); - foreach ( $this->sort_by as $column ) { - $sort_by[ $column ] = array( $column, true ); - } - return $sort_by; - } - - /** - * Returns the columns names for rendering. It adds a checkbox for selecting everything - * as the first column - */ - public function get_columns() { - $columns = array_merge( - array( 'cb' => '' ), - $this->columns - ); - - return $columns; - } - - /** - * Get prepared LIMIT clause for items query - * - * @global wpdb $wpdb - * - * @return string Prepared LIMIT clause for items query. - */ - protected function get_items_query_limit() { - global $wpdb; - - $per_page = $this->get_items_per_page( $this->get_per_page_option_name(), $this->items_per_page ); - return $wpdb->prepare( 'LIMIT %d', $per_page ); - } - - /** - * Returns the number of items to offset/skip for this current view. - * - * @return int - */ - protected function get_items_offset() { - $per_page = $this->get_items_per_page( $this->get_per_page_option_name(), $this->items_per_page ); - $current_page = $this->get_pagenum(); - if ( 1 < $current_page ) { - $offset = $per_page * ( $current_page - 1 ); - } else { - $offset = 0; - } - - return $offset; - } - - /** - * Get prepared OFFSET clause for items query - * - * @global wpdb $wpdb - * - * @return string Prepared OFFSET clause for items query. - */ - protected function get_items_query_offset() { - global $wpdb; - - return $wpdb->prepare( 'OFFSET %d', $this->get_items_offset() ); - } - - /** - * Prepares the ORDER BY sql statement. It uses `$this->sort_by` to know which - * columns are sortable. This requests validates the orderby $_GET parameter is a valid - * column and sortable. It will also use order (ASC|DESC) using DESC by default. - */ - protected function get_items_query_order() { - if ( empty( $this->sort_by ) ) { - return ''; - } - - $orderby = esc_sql( $this->get_request_orderby() ); - $order = esc_sql( $this->get_request_order() ); - - return "ORDER BY {$orderby} {$order}"; - } - - /** - * Return the sortable column specified for this request to order the results by, if any. - * - * @return string - */ - protected function get_request_orderby() { - - $valid_sortable_columns = array_values( $this->sort_by ); - - if ( ! empty( $_GET['orderby'] ) && in_array( $_GET['orderby'], $valid_sortable_columns, true ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended - $orderby = sanitize_text_field( wp_unslash( $_GET['orderby'] ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended - } else { - $orderby = $valid_sortable_columns[0]; - } - - return $orderby; - } - - /** - * Return the sortable column order specified for this request. - * - * @return string - */ - protected function get_request_order() { - - if ( ! empty( $_GET['order'] ) && 'desc' === strtolower( sanitize_text_field( wp_unslash( $_GET['order'] ) ) ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended - $order = 'DESC'; - } else { - $order = 'ASC'; - } - - return $order; - } - - /** - * Return the status filter for this request, if any. - * - * @return string - */ - protected function get_request_status() { - $status = ( ! empty( $_GET['status'] ) ) ? sanitize_text_field( wp_unslash( $_GET['status'] ) ) : ''; //phpcs:ignore WordPress.Security.NonceVerification.Recommended - return $status; - } - - /** - * Return the search filter for this request, if any. - * - * @return string - */ - protected function get_request_search_query() { - $search_query = ( ! empty( $_GET['s'] ) ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : ''; //phpcs:ignore WordPress.Security.NonceVerification.Recommended - return $search_query; - } - - /** - * Process and return the columns name. This is meant for using with SQL, this means it - * always includes the primary key. - * - * @return array - */ - protected function get_table_columns() { - $columns = array_keys( $this->columns ); - if ( ! in_array( $this->ID, $columns, true ) ) { - $columns[] = $this->ID; - } - - return $columns; - } - - /** - * Check if the current request is doing a "full text" search. If that is the case - * prepares the SQL to search texts using LIKE. - * - * If the current request does not have any search or if this list table does not support - * that feature it will return an empty string. - * - * @return string - */ - protected function get_items_query_search() { - global $wpdb; - - if ( empty( $_GET['s'] ) || empty( $this->search_by ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended - return ''; - } - - $search_string = sanitize_text_field( wp_unslash( $_GET['s'] ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended - - $filter = array(); - foreach ( $this->search_by as $column ) { - $wild = '%'; - $sql_like = $wild . $wpdb->esc_like( $search_string ) . $wild; - $filter[] = $wpdb->prepare( '`' . $column . '` LIKE %s', $sql_like ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.DB.PreparedSQL.NotPrepared - } - return implode( ' OR ', $filter ); - } - - /** - * Prepares the SQL to filter rows by the options defined at `$this->filter_by`. Before trusting - * any data sent by the user it validates that it is a valid option. - */ - protected function get_items_query_filters() { - global $wpdb; - - if ( ! $this->filter_by || empty( $_GET['filter_by'] ) || ! is_array( $_GET['filter_by'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended - return ''; - } - - $filter = array(); - - foreach ( $this->filter_by as $column => $options ) { - if ( empty( $_GET['filter_by'][ $column ] ) || empty( $options[ $_GET['filter_by'][ $column ] ] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended - continue; - } - - $filter[] = $wpdb->prepare( "`$column` = %s", sanitize_text_field( wp_unslash( $_GET['filter_by'][ $column ] ) ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.DB.PreparedSQL.InterpolatedNotPrepared - } - - return implode( ' AND ', $filter ); - - } - - /** - * Prepares the data to feed WP_Table_List. - * - * This has the core for selecting, sorting and filting data. To keep the code simple - * its logic is split among many methods (get_items_query_*). - * - * Beside populating the items this function will also count all the records that matches - * the filtering criteria and will do fill the pagination variables. - */ - public function prepare_items() { - global $wpdb; - - $this->process_bulk_action(); - - $this->process_row_actions(); - - if ( ! empty( $_REQUEST['_wp_http_referer'] && ! empty( $_SERVER['REQUEST_URI'] ) ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended - // _wp_http_referer is used only on bulk actions, we remove it to keep the $_GET shorter - wp_safe_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ); - exit; - } - - $this->prepare_column_headers(); - - $limit = $this->get_items_query_limit(); - $offset = $this->get_items_query_offset(); - $order = $this->get_items_query_order(); - $where = array_filter( - array( - $this->get_items_query_search(), - $this->get_items_query_filters(), - ) - ); - $columns = '`' . implode( '`, `', $this->get_table_columns() ) . '`'; - - if ( ! empty( $where ) ) { - $where = 'WHERE (' . implode( ') AND (', $where ) . ')'; - } else { - $where = ''; - } - - $sql = "SELECT $columns FROM {$this->table_name} {$where} {$order} {$limit} {$offset}"; - - $this->set_items( $wpdb->get_results( $sql, ARRAY_A ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - - $query_count = "SELECT COUNT({$this->ID}) FROM {$this->table_name} {$where}"; - $total_items = $wpdb->get_var( $query_count ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - $per_page = $this->get_items_per_page( $this->get_per_page_option_name(), $this->items_per_page ); - $this->set_pagination_args( - array( - 'total_items' => $total_items, - 'per_page' => $per_page, - 'total_pages' => ceil( $total_items / $per_page ), - ) - ); - } - - /** - * Display the table. - * - * @param string $which The name of the table. - */ - public function extra_tablenav( $which ) { - if ( ! $this->filter_by || 'top' !== $which ) { - return; - } - - echo '
              '; - - foreach ( $this->filter_by as $id => $options ) { - $default = ! empty( $_GET['filter_by'][ $id ] ) ? sanitize_text_field( wp_unslash( $_GET['filter_by'][ $id ] ) ) : ''; //phpcs:ignore WordPress.Security.NonceVerification.Recommended - if ( empty( $options[ $default ] ) ) { - $default = ''; - } - - echo ''; - } - - submit_button( esc_html__( 'Filter', 'action-scheduler' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) ); - echo '
              '; - } - - /** - * Set the data for displaying. It will attempt to unserialize (There is a chance that some columns - * are serialized). This can be override in child classes for futher data transformation. - * - * @param array $items Items array. - */ - protected function set_items( array $items ) { - $this->items = array(); - foreach ( $items as $item ) { - $this->items[ $item[ $this->ID ] ] = array_map( 'maybe_unserialize', $item ); - } - } - - /** - * Renders the checkbox for each row, this is the first column and it is named ID regardless - * of how the primary key is named (to keep the code simpler). The bulk actions will do the proper - * name transformation though using `$this->ID`. - * - * @param array $row The row to render. - */ - public function column_cb( $row ) { - return ''; - } - - /** - * Renders the row-actions. - * - * This method renders the action menu, it reads the definition from the $row_actions property, - * and it checks that the row action method exists before rendering it. - * - * @param array $row Row to be rendered. - * @param string $column_name Column name. - * @return string - */ - protected function maybe_render_actions( $row, $column_name ) { - if ( empty( $this->row_actions[ $column_name ] ) ) { - return; - } - - $row_id = $row[ $this->ID ]; - - $actions = '
              '; - $action_count = 0; - foreach ( $this->row_actions[ $column_name ] as $action_key => $action ) { - - $action_count++; - - if ( ! method_exists( $this, 'row_action_' . $action_key ) ) { - continue; - } - - $action_link = ! empty( $action['link'] ) ? $action['link'] : add_query_arg( - array( - 'row_action' => $action_key, - 'row_id' => $row_id, - 'nonce' => wp_create_nonce( $action_key . '::' . $row_id ), - ) - ); - $span_class = ! empty( $action['class'] ) ? $action['class'] : $action_key; - $separator = ( $action_count < count( $this->row_actions[ $column_name ] ) ) ? ' | ' : ''; - - $actions .= sprintf( '', esc_attr( $span_class ) ); - $actions .= sprintf( '%3$s', esc_url( $action_link ), esc_attr( $action['desc'] ), esc_html( $action['name'] ) ); - $actions .= sprintf( '%s', $separator ); - } - $actions .= '
              '; - return $actions; - } - - /** - * Process the bulk actions. - * - * @return void - */ - protected function process_row_actions() { - $parameters = array( 'row_action', 'row_id', 'nonce' ); - foreach ( $parameters as $parameter ) { - if ( empty( $_REQUEST[ $parameter ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - return; - } - } - - $action = sanitize_text_field( wp_unslash( $_REQUEST['row_action'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotValidated - $row_id = sanitize_text_field( wp_unslash( $_REQUEST['row_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotValidated - $nonce = sanitize_text_field( wp_unslash( $_REQUEST['nonce'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotValidated - $method = 'row_action_' . $action; // phpcs:ignore WordPress.Security.NonceVerification.Recommended - - if ( wp_verify_nonce( $nonce, $action . '::' . $row_id ) && method_exists( $this, $method ) ) { - $this->$method( sanitize_text_field( wp_unslash( $row_id ) ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended - } - - if ( isset( $_SERVER['REQUEST_URI'] ) ) { - wp_safe_redirect( - remove_query_arg( - array( 'row_id', 'row_action', 'nonce' ), - esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) - ) - ); - exit; - } - } - - /** - * Default column formatting, it will escape everythig for security. - * - * @param array $item The item array. - * @param string $column_name Column name to display. - * - * @return string - */ - public function column_default( $item, $column_name ) { - $column_html = esc_html( $item[ $column_name ] ); - $column_html .= $this->maybe_render_actions( $item, $column_name ); - return $column_html; - } - - /** - * Display the table heading and search query, if any - */ - protected function display_header() { - echo '

              ' . esc_attr( $this->table_header ) . '

              '; - if ( $this->get_request_search_query() ) { - /* translators: %s: search query */ - echo '' . esc_attr( sprintf( __( 'Search results for "%s"', 'action-scheduler' ), $this->get_request_search_query() ) ) . ''; - } - echo '
              '; - } - - /** - * Display the table heading and search query, if any - */ - protected function display_admin_notices() { - foreach ( $this->admin_notices as $notice ) { - echo '
              '; - echo '

              ' . wp_kses_post( $notice['message'] ) . '

              '; - echo '
              '; - } - } - - /** - * Prints the available statuses so the user can click to filter. - */ - protected function display_filter_by_status() { - - $status_list_items = array(); - $request_status = $this->get_request_status(); - - // Helper to set 'all' filter when not set on status counts passed in. - if ( ! isset( $this->status_counts['all'] ) ) { - $this->status_counts = array( 'all' => array_sum( $this->status_counts ) ) + $this->status_counts; - } - - foreach ( $this->status_counts as $status_name => $count ) { - - if ( 0 === $count ) { - continue; - } - - if ( $status_name === $request_status || ( empty( $request_status ) && 'all' === $status_name ) ) { - $status_list_item = '
            • %3$s (%4$d)
            • '; - } else { - $status_list_item = '
            • %3$s (%4$d)
            • '; - } - - $status_filter_url = ( 'all' === $status_name ) ? remove_query_arg( 'status' ) : add_query_arg( 'status', $status_name ); - $status_filter_url = remove_query_arg( array( 'paged', 's' ), $status_filter_url ); - $status_list_items[] = sprintf( $status_list_item, esc_attr( $status_name ), esc_url( $status_filter_url ), esc_html( ucfirst( $status_name ) ), absint( $count ) ); - } - - if ( $status_list_items ) { - echo '
                '; - echo implode( " | \n", $status_list_items ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - echo '
              '; - } - } - - /** - * Renders the table list, we override the original class to render the table inside a form - * and to render any needed HTML (like the search box). By doing so the callee of a function can simple - * forget about any extra HTML. - */ - protected function display_table() { - echo '
              '; - foreach ( $_GET as $key => $value ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - if ( '_' === $key[0] || 'paged' === $key || 'ID' === $key ) { - continue; - } - echo ''; - } - if ( ! empty( $this->search_by ) ) { - echo $this->search_box( $this->get_search_box_button_text(), 'plugin' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - } - parent::display(); - echo '
              '; - } - - /** - * Process any pending actions. - */ - public function process_actions() { - $this->process_bulk_action(); - $this->process_row_actions(); - - if ( ! empty( $_REQUEST['_wp_http_referer'] ) && ! empty( $_SERVER['REQUEST_URI'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - // _wp_http_referer is used only on bulk actions, we remove it to keep the $_GET shorter - wp_safe_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ); - exit; - } - } - - /** - * Render the list table page, including header, notices, status filters and table. - */ - public function display_page() { - $this->prepare_items(); - - echo '
              '; - $this->display_header(); - $this->display_admin_notices(); - $this->display_filter_by_status(); - $this->display_table(); - echo '
              '; - } - - /** - * Get the text to display in the search box on the list table. - */ - protected function get_search_box_placeholder() { - return esc_html__( 'Search', 'action-scheduler' ); - } - - /** - * Gets the screen per_page option name. - * - * @return string - */ - protected function get_per_page_option_name() { - return $this->package . '_items_per_page'; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php deleted file mode 100644 index c871b981..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php +++ /dev/null @@ -1,241 +0,0 @@ -created_time = microtime( true ); - - $this->store = $store ? $store : ActionScheduler_Store::instance(); - $this->monitor = $monitor ? $monitor : new ActionScheduler_FatalErrorMonitor( $this->store ); - $this->cleaner = $cleaner ? $cleaner : new ActionScheduler_QueueCleaner( $this->store ); - } - - /** - * Process an individual action. - * - * @param int $action_id The action ID to process. - * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron' - * Generally, this should be capitalised and not localised as it's a proper noun. - */ - public function process_action( $action_id, $context = '' ) { - try { - $valid_action = false; - do_action( 'action_scheduler_before_execute', $action_id, $context ); - - if ( ActionScheduler_Store::STATUS_PENDING !== $this->store->get_status( $action_id ) ) { - do_action( 'action_scheduler_execution_ignored', $action_id, $context ); - return; - } - - $valid_action = true; - do_action( 'action_scheduler_begin_execute', $action_id, $context ); - - $action = $this->store->fetch_action( $action_id ); - $this->store->log_execution( $action_id ); - $action->execute(); - do_action( 'action_scheduler_after_execute', $action_id, $action, $context ); - $this->store->mark_complete( $action_id ); - } catch ( Exception $e ) { - if ( $valid_action ) { - $this->store->mark_failure( $action_id ); - do_action( 'action_scheduler_failed_execution', $action_id, $e, $context ); - } else { - do_action( 'action_scheduler_failed_validation', $action_id, $e, $context ); - } - } - - if ( isset( $action ) && is_a( $action, 'ActionScheduler_Action' ) && $action->get_schedule()->is_recurring() ) { - $this->schedule_next_instance( $action, $action_id ); - } - } - - /** - * Schedule the next instance of the action if necessary. - * - * @param ActionScheduler_Action $action - * @param int $action_id - */ - protected function schedule_next_instance( ActionScheduler_Action $action, $action_id ) { - try { - ActionScheduler::factory()->repeat( $action ); - } catch ( Exception $e ) { - do_action( 'action_scheduler_failed_to_schedule_next_instance', $action_id, $e, $action ); - } - } - - /** - * Run the queue cleaner. - * - * @author Jeremy Pry - */ - protected function run_cleanup() { - $this->cleaner->clean( 10 * $this->get_time_limit() ); - } - - /** - * Get the number of concurrent batches a runner allows. - * - * @return int - */ - public function get_allowed_concurrent_batches() { - return apply_filters( 'action_scheduler_queue_runner_concurrent_batches', 1 ); - } - - /** - * Check if the number of allowed concurrent batches is met or exceeded. - * - * @return bool - */ - public function has_maximum_concurrent_batches() { - return $this->store->get_claim_count() >= $this->get_allowed_concurrent_batches(); - } - - /** - * Get the maximum number of seconds a batch can run for. - * - * @return int The number of seconds. - */ - protected function get_time_limit() { - - $time_limit = 30; - - // Apply deprecated filter from deprecated get_maximum_execution_time() method - if ( has_filter( 'action_scheduler_maximum_execution_time' ) ) { - _deprecated_function( 'action_scheduler_maximum_execution_time', '2.1.1', 'action_scheduler_queue_runner_time_limit' ); - $time_limit = apply_filters( 'action_scheduler_maximum_execution_time', $time_limit ); - } - - return absint( apply_filters( 'action_scheduler_queue_runner_time_limit', $time_limit ) ); - } - - /** - * Get the number of seconds the process has been running. - * - * @return int The number of seconds. - */ - protected function get_execution_time() { - $execution_time = microtime( true ) - $this->created_time; - - // Get the CPU time if the hosting environment uses it rather than wall-clock time to calculate a process's execution time. - if ( function_exists( 'getrusage' ) && apply_filters( 'action_scheduler_use_cpu_execution_time', defined( 'PANTHEON_ENVIRONMENT' ) ) ) { - $resource_usages = getrusage(); - - if ( isset( $resource_usages['ru_stime.tv_usec'], $resource_usages['ru_stime.tv_usec'] ) ) { - $execution_time = $resource_usages['ru_stime.tv_sec'] + ( $resource_usages['ru_stime.tv_usec'] / 1000000 ); - } - } - - return $execution_time; - } - - /** - * Check if the host's max execution time is (likely) to be exceeded if processing more actions. - * - * @param int $processed_actions The number of actions processed so far - used to determine the likelihood of exceeding the time limit if processing another action - * @return bool - */ - protected function time_likely_to_be_exceeded( $processed_actions ) { - - $execution_time = $this->get_execution_time(); - $max_execution_time = $this->get_time_limit(); - $time_per_action = $execution_time / $processed_actions; - $estimated_time = $execution_time + ( $time_per_action * 3 ); - $likely_to_be_exceeded = $estimated_time > $max_execution_time; - - return apply_filters( 'action_scheduler_maximum_execution_time_likely_to_be_exceeded', $likely_to_be_exceeded, $this, $processed_actions, $execution_time, $max_execution_time ); - } - - /** - * Get memory limit - * - * Based on WP_Background_Process::get_memory_limit() - * - * @return int - */ - protected function get_memory_limit() { - if ( function_exists( 'ini_get' ) ) { - $memory_limit = ini_get( 'memory_limit' ); - } else { - $memory_limit = '128M'; // Sensible default, and minimum required by WooCommerce - } - - if ( ! $memory_limit || -1 === $memory_limit || '-1' === $memory_limit ) { - // Unlimited, set to 32GB. - $memory_limit = '32G'; - } - - return ActionScheduler_Compatibility::convert_hr_to_bytes( $memory_limit ); - } - - /** - * Memory exceeded - * - * Ensures the batch process never exceeds 90% of the maximum WordPress memory. - * - * Based on WP_Background_Process::memory_exceeded() - * - * @return bool - */ - protected function memory_exceeded() { - - $memory_limit = $this->get_memory_limit() * 0.90; - $current_memory = memory_get_usage( true ); - $memory_exceeded = $current_memory >= $memory_limit; - - return apply_filters( 'action_scheduler_memory_exceeded', $memory_exceeded, $this ); - } - - /** - * See if the batch limits have been exceeded, which is when memory usage is almost at - * the maximum limit, or the time to process more actions will exceed the max time limit. - * - * Based on WC_Background_Process::batch_limits_exceeded() - * - * @param int $processed_actions The number of actions processed so far - used to determine the likelihood of exceeding the time limit if processing another action - * @return bool - */ - protected function batch_limits_exceeded( $processed_actions ) { - return $this->memory_exceeded() || $this->time_likely_to_be_exceeded( $processed_actions ); - } - - /** - * Process actions in the queue. - * - * @author Jeremy Pry - * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron' - * Generally, this should be capitalised and not localised as it's a proper noun. - * @return int The number of actions processed. - */ - abstract public function run( $context = '' ); -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_RecurringSchedule.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_RecurringSchedule.php deleted file mode 100644 index 8fb3bc5c..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_RecurringSchedule.php +++ /dev/null @@ -1,103 +0,0 @@ -start - and logic to calculate the next run date after - * that - @see $this->calculate_next(). The $first_date property also keeps a record of when the very - * first instance of this chain of schedules ran. - * - * @var DateTime - */ - private $first_date = NULL; - - /** - * Timestamp equivalent of @see $this->first_date - * - * @var int - */ - protected $first_timestamp = NULL; - - /** - * The recurrance between each time an action is run using this schedule. - * Used to calculate the start date & time. Can be a number of seconds, in the - * case of ActionScheduler_IntervalSchedule, or a cron expression, as in the - * case of ActionScheduler_CronSchedule. Or something else. - * - * @var mixed - */ - protected $recurrence; - - /** - * @param DateTime $date The date & time to run the action. - * @param mixed $recurrence The data used to determine the schedule's recurrance. - * @param DateTime|null $first (Optional) The date & time the first instance of this interval schedule ran. Default null, meaning this is the first instance. - */ - public function __construct( DateTime $date, $recurrence, DateTime $first = null ) { - parent::__construct( $date ); - $this->first_date = empty( $first ) ? $date : $first; - $this->recurrence = $recurrence; - } - - /** - * @return bool - */ - public function is_recurring() { - return true; - } - - /** - * Get the date & time of the first schedule in this recurring series. - * - * @return DateTime|null - */ - public function get_first_date() { - return clone $this->first_date; - } - - /** - * @return string - */ - public function get_recurrence() { - return $this->recurrence; - } - - /** - * For PHP 5.2 compat, since DateTime objects can't be serialized - * @return array - */ - public function __sleep() { - $sleep_params = parent::__sleep(); - $this->first_timestamp = $this->first_date->getTimestamp(); - return array_merge( $sleep_params, array( - 'first_timestamp', - 'recurrence' - ) ); - } - - /** - * Unserialize recurring schedules serialized/stored prior to AS 3.0.0 - * - * Prior to Action Scheduler 3.0.0, schedules used different property names to refer - * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp - * was the same as ActionScheduler_SimpleSchedule::timestamp. This was addressed in - * Action Scheduler 3.0.0, where properties and property names were aligned for better - * inheritance. To maintain backward compatibility with scheduled serialized and stored - * prior to 3.0, we need to correctly map the old property names. - */ - public function __wakeup() { - parent::__wakeup(); - if ( $this->first_timestamp > 0 ) { - $this->first_date = as_get_datetime_object( $this->first_timestamp ); - } else { - $this->first_date = $this->get_date(); - } - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schedule.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schedule.php deleted file mode 100644 index 2d5e158f..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schedule.php +++ /dev/null @@ -1,84 +0,0 @@ -scheduled_date - * - * @var int - */ - protected $scheduled_timestamp = NULL; - - /** - * @param DateTime $date The date & time to run the action. - */ - public function __construct( DateTime $date ) { - $this->scheduled_date = $date; - } - - /** - * Check if a schedule should recur. - * - * @return bool - */ - abstract public function is_recurring(); - - /** - * Calculate when the next instance of this schedule would run based on a given date & time. - * - * @param DateTime $after - * @return DateTime - */ - abstract protected function calculate_next( DateTime $after ); - - /** - * Get the next date & time when this schedule should run after a given date & time. - * - * @param DateTime $after - * @return DateTime|null - */ - public function get_next( DateTime $after ) { - $after = clone $after; - if ( $after > $this->scheduled_date ) { - $after = $this->calculate_next( $after ); - return $after; - } - return clone $this->scheduled_date; - } - - /** - * Get the date & time the schedule is set to run. - * - * @return DateTime|null - */ - public function get_date() { - return $this->scheduled_date; - } - - /** - * For PHP 5.2 compat, since DateTime objects can't be serialized - * @return array - */ - public function __sleep() { - $this->scheduled_timestamp = $this->scheduled_date->getTimestamp(); - return array( - 'scheduled_timestamp', - ); - } - - public function __wakeup() { - $this->scheduled_date = as_get_datetime_object( $this->scheduled_timestamp ); - unset( $this->scheduled_timestamp ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schema.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schema.php deleted file mode 100644 index ea2ff314..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schema.php +++ /dev/null @@ -1,173 +0,0 @@ -tables as $table ) { - $wpdb->tables[] = $table; - $name = $this->get_full_table_name( $table ); - $wpdb->$table = $name; - } - - // create the tables - if ( $this->schema_update_required() || $force_update ) { - foreach ( $this->tables as $table ) { - /** - * Allow custom processing before updating a table schema. - * - * @param string $table Name of table being updated. - * @param string $db_version Existing version of the table being updated. - */ - do_action( 'action_scheduler_before_schema_update', $table, $this->db_version ); - $this->update_table( $table ); - } - $this->mark_schema_update_complete(); - } - } - - /** - * @param string $table The name of the table - * - * @return string The CREATE TABLE statement, suitable for passing to dbDelta - */ - abstract protected function get_table_definition( $table ); - - /** - * Determine if the database schema is out of date - * by comparing the integer found in $this->schema_version - * with the option set in the WordPress options table - * - * @return bool - */ - private function schema_update_required() { - $option_name = 'schema-' . static::class; - $this->db_version = get_option( $option_name, 0 ); - - // Check for schema option stored by the Action Scheduler Custom Tables plugin in case site has migrated from that plugin with an older schema - if ( 0 === $this->db_version ) { - - $plugin_option_name = 'schema-'; - - switch ( static::class ) { - case 'ActionScheduler_StoreSchema' : - $plugin_option_name .= 'Action_Scheduler\Custom_Tables\DB_Store_Table_Maker'; - break; - case 'ActionScheduler_LoggerSchema' : - $plugin_option_name .= 'Action_Scheduler\Custom_Tables\DB_Logger_Table_Maker'; - break; - } - - $this->db_version = get_option( $plugin_option_name, 0 ); - - delete_option( $plugin_option_name ); - } - - return version_compare( $this->db_version, $this->schema_version, '<' ); - } - - /** - * Update the option in WordPress to indicate that - * our schema is now up to date - * - * @return void - */ - private function mark_schema_update_complete() { - $option_name = 'schema-' . static::class; - - // work around race conditions and ensure that our option updates - $value_to_save = (string) $this->schema_version . '.0.' . time(); - - update_option( $option_name, $value_to_save ); - } - - /** - * Update the schema for the given table - * - * @param string $table The name of the table to update - * - * @return void - */ - private function update_table( $table ) { - require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); - $definition = $this->get_table_definition( $table ); - if ( $definition ) { - $updated = dbDelta( $definition ); - foreach ( $updated as $updated_table => $update_description ) { - if ( strpos( $update_description, 'Created table' ) === 0 ) { - do_action( 'action_scheduler/created_table', $updated_table, $table ); - } - } - } - } - - /** - * @param string $table - * - * @return string The full name of the table, including the - * table prefix for the current blog - */ - protected function get_full_table_name( $table ) { - return $GLOBALS[ 'wpdb' ]->prefix . $table; - } - - /** - * Confirms that all of the tables registered by this schema class have been created. - * - * @return bool - */ - public function tables_exist() { - global $wpdb; - - $existing_tables = $wpdb->get_col( 'SHOW TABLES' ); - $expected_tables = array_map( - function ( $table_name ) use ( $wpdb ) { - return $wpdb->prefix . $table_name; - }, - $this->tables - ); - - return count( array_intersect( $existing_tables, $expected_tables ) ) === count( $expected_tables ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Lock.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Lock.php deleted file mode 100644 index 02a47d92..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Lock.php +++ /dev/null @@ -1,63 +0,0 @@ -get_expiration( $lock_type ) >= time() ); - } - - /** - * Set a lock. - * - * @param string $lock_type A string to identify different lock types. - * @return bool - */ - abstract public function set( $lock_type ); - - /** - * If a lock is set, return the timestamp it was set to expiry. - * - * @param string $lock_type A string to identify different lock types. - * @return bool|int False if no lock is set, otherwise the timestamp for when the lock is set to expire. - */ - abstract public function get_expiration( $lock_type ); - - /** - * Get the amount of time to set for a given lock. 60 seconds by default. - * - * @param string $lock_type A string to identify different lock types. - * @return int - */ - protected function get_duration( $lock_type ) { - return apply_filters( 'action_scheduler_lock_duration', self::$lock_duration, $lock_type ); - } - - /** - * @return ActionScheduler_Lock - */ - public static function instance() { - if ( empty( self::$locker ) ) { - $class = apply_filters( 'action_scheduler_lock_class', 'ActionScheduler_OptionLock' ); - self::$locker = new $class(); - } - return self::$locker; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php deleted file mode 100644 index 8bf936af..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php +++ /dev/null @@ -1,177 +0,0 @@ -hook_stored_action(); - add_action( 'action_scheduler_canceled_action', array( $this, 'log_canceled_action' ), 10, 1 ); - add_action( 'action_scheduler_begin_execute', array( $this, 'log_started_action' ), 10, 2 ); - add_action( 'action_scheduler_after_execute', array( $this, 'log_completed_action' ), 10, 3 ); - add_action( 'action_scheduler_failed_execution', array( $this, 'log_failed_action' ), 10, 3 ); - add_action( 'action_scheduler_failed_action', array( $this, 'log_timed_out_action' ), 10, 2 ); - add_action( 'action_scheduler_unexpected_shutdown', array( $this, 'log_unexpected_shutdown' ), 10, 2 ); - add_action( 'action_scheduler_reset_action', array( $this, 'log_reset_action' ), 10, 1 ); - add_action( 'action_scheduler_execution_ignored', array( $this, 'log_ignored_action' ), 10, 2 ); - add_action( 'action_scheduler_failed_fetch_action', array( $this, 'log_failed_fetch_action' ), 10, 2 ); - add_action( 'action_scheduler_failed_to_schedule_next_instance', array( $this, 'log_failed_schedule_next_instance' ), 10, 2 ); - add_action( 'action_scheduler_bulk_cancel_actions', array( $this, 'bulk_log_cancel_actions' ), 10, 1 ); - } - - public function hook_stored_action() { - add_action( 'action_scheduler_stored_action', array( $this, 'log_stored_action' ) ); - } - - public function unhook_stored_action() { - remove_action( 'action_scheduler_stored_action', array( $this, 'log_stored_action' ) ); - } - - public function log_stored_action( $action_id ) { - $this->log( $action_id, __( 'action created', 'action-scheduler' ) ); - } - - public function log_canceled_action( $action_id ) { - $this->log( $action_id, __( 'action canceled', 'action-scheduler' ) ); - } - - public function log_started_action( $action_id, $context = '' ) { - if ( ! empty( $context ) ) { - /* translators: %s: context */ - $message = sprintf( __( 'action started via %s', 'action-scheduler' ), $context ); - } else { - $message = __( 'action started', 'action-scheduler' ); - } - $this->log( $action_id, $message ); - } - - public function log_completed_action( $action_id, $action = NULL, $context = '' ) { - if ( ! empty( $context ) ) { - /* translators: %s: context */ - $message = sprintf( __( 'action complete via %s', 'action-scheduler' ), $context ); - } else { - $message = __( 'action complete', 'action-scheduler' ); - } - $this->log( $action_id, $message ); - } - - public function log_failed_action( $action_id, Exception $exception, $context = '' ) { - if ( ! empty( $context ) ) { - /* translators: 1: context 2: exception message */ - $message = sprintf( __( 'action failed via %1$s: %2$s', 'action-scheduler' ), $context, $exception->getMessage() ); - } else { - /* translators: %s: exception message */ - $message = sprintf( __( 'action failed: %s', 'action-scheduler' ), $exception->getMessage() ); - } - $this->log( $action_id, $message ); - } - - public function log_timed_out_action( $action_id, $timeout ) { - /* translators: %s: amount of time */ - $this->log( $action_id, sprintf( __( 'action timed out after %s seconds', 'action-scheduler' ), $timeout ) ); - } - - public function log_unexpected_shutdown( $action_id, $error ) { - if ( ! empty( $error ) ) { - /* translators: 1: error message 2: filename 3: line */ - $this->log( $action_id, sprintf( __( 'unexpected shutdown: PHP Fatal error %1$s in %2$s on line %3$s', 'action-scheduler' ), $error['message'], $error['file'], $error['line'] ) ); - } - } - - public function log_reset_action( $action_id ) { - $this->log( $action_id, __( 'action reset', 'action-scheduler' ) ); - } - - public function log_ignored_action( $action_id, $context = '' ) { - if ( ! empty( $context ) ) { - /* translators: %s: context */ - $message = sprintf( __( 'action ignored via %s', 'action-scheduler' ), $context ); - } else { - $message = __( 'action ignored', 'action-scheduler' ); - } - $this->log( $action_id, $message ); - } - - /** - * @param string $action_id - * @param Exception|NULL $exception The exception which occured when fetching the action. NULL by default for backward compatibility. - * - * @return ActionScheduler_LogEntry[] - */ - public function log_failed_fetch_action( $action_id, Exception $exception = NULL ) { - - if ( ! is_null( $exception ) ) { - /* translators: %s: exception message */ - $log_message = sprintf( __( 'There was a failure fetching this action: %s', 'action-scheduler' ), $exception->getMessage() ); - } else { - $log_message = __( 'There was a failure fetching this action', 'action-scheduler' ); - } - - $this->log( $action_id, $log_message ); - } - - public function log_failed_schedule_next_instance( $action_id, Exception $exception ) { - /* translators: %s: exception message */ - $this->log( $action_id, sprintf( __( 'There was a failure scheduling the next instance of this action: %s', 'action-scheduler' ), $exception->getMessage() ) ); - } - - /** - * Bulk add cancel action log entries. - * - * Implemented here for backward compatibility. Should be implemented in parent loggers - * for more performant bulk logging. - * - * @param array $action_ids List of action ID. - */ - public function bulk_log_cancel_actions( $action_ids ) { - if ( empty( $action_ids ) ) { - return; - } - - foreach ( $action_ids as $action_id ) { - $this->log_canceled_action( $action_id ); - } - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php deleted file mode 100644 index 2471aca4..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php +++ /dev/null @@ -1,423 +0,0 @@ - null, - 'status' => self::STATUS_PENDING, - 'group' => '', - ) - ); - - // These params are fixed for this method. - $params['hook'] = $hook; - $params['orderby'] = 'date'; - $params['per_page'] = 1; - - if ( ! empty( $params['status'] ) ) { - if ( self::STATUS_PENDING === $params['status'] ) { - $params['order'] = 'ASC'; // Find the next action that matches. - } else { - $params['order'] = 'DESC'; // Find the most recent action that matches. - } - } - - $results = $this->query_actions( $params ); - - return empty( $results ) ? null : $results[0]; - } - - /** - * Query for action count or list of action IDs. - * - * @since x.x.x $query['status'] accepts array of statuses instead of a single status. - * - * @param array $query { - * Query filtering options. - * - * @type string $hook The name of the actions. Optional. - * @type string|array $status The status or statuses of the actions. Optional. - * @type array $args The args array of the actions. Optional. - * @type DateTime $date The scheduled date of the action. Used in UTC timezone. Optional. - * @type string $date_compare Operator for selecting by $date param. Accepted values are '!=', '>', '>=', '<', '<=', '='. Defaults to '<='. - * @type DateTime $modified The last modified date of the action. Used in UTC timezone. Optional. - * @type string $modified_compare Operator for comparing $modified param. Accepted values are '!=', '>', '>=', '<', '<=', '='. Defaults to '<='. - * @type string $group The group the action belongs to. Optional. - * @type bool|int $claimed TRUE to find claimed actions, FALSE to find unclaimed actions, an int to find a specific claim ID. Optional. - * @type int $per_page Number of results to return. Defaults to 5. - * @type int $offset The query pagination offset. Defaults to 0. - * @type int $orderby Accepted values are 'hook', 'group', 'modified', 'date' or 'none'. Defaults to 'date'. - * @type string $order Accepted values are 'ASC' or 'DESC'. Defaults to 'ASC'. - * } - * @param string $query_type Whether to select or count the results. Default, select. - * - * @return string|array|null The IDs of actions matching the query. Null on failure. - */ - abstract public function query_actions( $query = array(), $query_type = 'select' ); - - /** - * Run query to get a single action ID. - * - * @since x.x.x - * - * @see ActionScheduler_Store::query_actions for $query arg usage but 'per_page' and 'offset' can't be used. - * - * @param array $query Query parameters. - * - * @return int|null - */ - public function query_action( $query ) { - $query['per_page'] = 1; - $query['offset'] = 0; - $results = $this->query_actions( $query ); - - if ( empty( $results ) ) { - return null; - } else { - return (int) $results[0]; - } - } - - /** - * Get a count of all actions in the store, grouped by status - * - * @return array - */ - abstract public function action_counts(); - - /** - * @param string $action_id - */ - abstract public function cancel_action( $action_id ); - - /** - * @param string $action_id - */ - abstract public function delete_action( $action_id ); - - /** - * @param string $action_id - * - * @return DateTime The date the action is schedule to run, or the date that it ran. - */ - abstract public function get_date( $action_id ); - - - /** - * @param int $max_actions - * @param DateTime $before_date Claim only actions schedule before the given date. Defaults to now. - * @param array $hooks Claim only actions with a hook or hooks. - * @param string $group Claim only actions in the given group. - * - * @return ActionScheduler_ActionClaim - */ - abstract public function stake_claim( $max_actions = 10, DateTime $before_date = null, $hooks = array(), $group = '' ); - - /** - * @return int - */ - abstract public function get_claim_count(); - - /** - * @param ActionScheduler_ActionClaim $claim - */ - abstract public function release_claim( ActionScheduler_ActionClaim $claim ); - - /** - * @param string $action_id - */ - abstract public function unclaim_action( $action_id ); - - /** - * @param string $action_id - */ - abstract public function mark_failure( $action_id ); - - /** - * @param string $action_id - */ - abstract public function log_execution( $action_id ); - - /** - * @param string $action_id - */ - abstract public function mark_complete( $action_id ); - - /** - * @param string $action_id - * - * @return string - */ - abstract public function get_status( $action_id ); - - /** - * @param string $action_id - * @return mixed - */ - abstract public function get_claim_id( $action_id ); - - /** - * @param string $claim_id - * @return array - */ - abstract public function find_actions_by_claim_id( $claim_id ); - - /** - * @param string $comparison_operator - * @return string - */ - protected function validate_sql_comparator( $comparison_operator ) { - if ( in_array( $comparison_operator, array('!=', '>', '>=', '<', '<=', '=') ) ) { - return $comparison_operator; - } - return '='; - } - - /** - * Get the time MySQL formated date/time string for an action's (next) scheduled date. - * - * @param ActionScheduler_Action $action - * @param DateTime $scheduled_date (optional) - * @return string - */ - protected function get_scheduled_date_string( ActionScheduler_Action $action, DateTime $scheduled_date = NULL ) { - $next = null === $scheduled_date ? $action->get_schedule()->get_date() : $scheduled_date; - if ( ! $next ) { - return '0000-00-00 00:00:00'; - } - $next->setTimezone( new DateTimeZone( 'UTC' ) ); - - return $next->format( 'Y-m-d H:i:s' ); - } - - /** - * Get the time MySQL formated date/time string for an action's (next) scheduled date. - * - * @param ActionScheduler_Action $action - * @param DateTime $scheduled_date (optional) - * @return string - */ - protected function get_scheduled_date_string_local( ActionScheduler_Action $action, DateTime $scheduled_date = NULL ) { - $next = null === $scheduled_date ? $action->get_schedule()->get_date() : $scheduled_date; - if ( ! $next ) { - return '0000-00-00 00:00:00'; - } - - ActionScheduler_TimezoneHelper::set_local_timezone( $next ); - return $next->format( 'Y-m-d H:i:s' ); - } - - /** - * Validate that we could decode action arguments. - * - * @param mixed $args The decoded arguments. - * @param int $action_id The action ID. - * - * @throws ActionScheduler_InvalidActionException When the decoded arguments are invalid. - */ - protected function validate_args( $args, $action_id ) { - // Ensure we have an array of args. - if ( ! is_array( $args ) ) { - throw ActionScheduler_InvalidActionException::from_decoding_args( $action_id ); - } - - // Validate JSON decoding if possible. - if ( function_exists( 'json_last_error' ) && JSON_ERROR_NONE !== json_last_error() ) { - throw ActionScheduler_InvalidActionException::from_decoding_args( $action_id, $args ); - } - } - - /** - * Validate a ActionScheduler_Schedule object. - * - * @param mixed $schedule The unserialized ActionScheduler_Schedule object. - * @param int $action_id The action ID. - * - * @throws ActionScheduler_InvalidActionException When the schedule is invalid. - */ - protected function validate_schedule( $schedule, $action_id ) { - if ( empty( $schedule ) || ! is_a( $schedule, 'ActionScheduler_Schedule' ) ) { - throw ActionScheduler_InvalidActionException::from_schedule( $action_id, $schedule ); - } - } - - /** - * InnoDB indexes have a maximum size of 767 bytes by default, which is only 191 characters with utf8mb4. - * - * Previously, AS wasn't concerned about args length, as we used the (unindex) post_content column. However, - * with custom tables, we use an indexed VARCHAR column instead. - * - * @param ActionScheduler_Action $action Action to be validated. - * @throws InvalidArgumentException When json encoded args is too long. - */ - protected function validate_action( ActionScheduler_Action $action ) { - if ( strlen( json_encode( $action->get_args() ) ) > static::$max_args_length ) { - throw new InvalidArgumentException( sprintf( __( 'ActionScheduler_Action::$args too long. To ensure the args column can be indexed, action args should not be more than %d characters when encoded as JSON.', 'action-scheduler' ), static::$max_args_length ) ); - } - } - - /** - * Cancel pending actions by hook. - * - * @since 3.0.0 - * - * @param string $hook Hook name. - * - * @return void - */ - public function cancel_actions_by_hook( $hook ) { - $action_ids = true; - while ( ! empty( $action_ids ) ) { - $action_ids = $this->query_actions( - array( - 'hook' => $hook, - 'status' => self::STATUS_PENDING, - 'per_page' => 1000, - 'orderby' => 'action_id', - ) - ); - - $this->bulk_cancel_actions( $action_ids ); - } - } - - /** - * Cancel pending actions by group. - * - * @since 3.0.0 - * - * @param string $group Group slug. - * - * @return void - */ - public function cancel_actions_by_group( $group ) { - $action_ids = true; - while ( ! empty( $action_ids ) ) { - $action_ids = $this->query_actions( - array( - 'group' => $group, - 'status' => self::STATUS_PENDING, - 'per_page' => 1000, - 'orderby' => 'action_id', - ) - ); - - $this->bulk_cancel_actions( $action_ids ); - } - } - - /** - * Cancel a set of action IDs. - * - * @since 3.0.0 - * - * @param array $action_ids List of action IDs. - * - * @return void - */ - private function bulk_cancel_actions( $action_ids ) { - foreach ( $action_ids as $action_id ) { - $this->cancel_action( $action_id ); - } - - do_action( 'action_scheduler_bulk_cancel_actions', $action_ids ); - } - - /** - * @return array - */ - public function get_status_labels() { - return array( - self::STATUS_COMPLETE => __( 'Complete', 'action-scheduler' ), - self::STATUS_PENDING => __( 'Pending', 'action-scheduler' ), - self::STATUS_RUNNING => __( 'In-progress', 'action-scheduler' ), - self::STATUS_FAILED => __( 'Failed', 'action-scheduler' ), - self::STATUS_CANCELED => __( 'Canceled', 'action-scheduler' ), - ); - } - - /** - * Check if there are any pending scheduled actions due to run. - * - * @param ActionScheduler_Action $action - * @param DateTime $scheduled_date (optional) - * @return string - */ - public function has_pending_actions_due() { - $pending_actions = $this->query_actions( array( - 'date' => as_get_datetime_object(), - 'status' => ActionScheduler_Store::STATUS_PENDING, - 'orderby' => 'none', - ) ); - - return ! empty( $pending_actions ); - } - - /** - * Callable initialization function optionally overridden in derived classes. - */ - public function init() {} - - /** - * Callable function to mark an action as migrated optionally overridden in derived classes. - */ - public function mark_migrated( $action_id ) {} - - /** - * @return ActionScheduler_Store - */ - public static function instance() { - if ( empty( self::$store ) ) { - $class = apply_filters( 'action_scheduler_store_class', self::DEFAULT_CLASS ); - self::$store = new $class(); - } - return self::$store; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_TimezoneHelper.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_TimezoneHelper.php deleted file mode 100644 index 2f96834a..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_TimezoneHelper.php +++ /dev/null @@ -1,153 +0,0 @@ -format( 'U' ) ); - } - - if ( get_option( 'timezone_string' ) ) { - $date->setTimezone( new DateTimeZone( self::get_local_timezone_string() ) ); - } else { - $date->setUtcOffset( self::get_local_timezone_offset() ); - } - - return $date; - } - - /** - * Helper to retrieve the timezone string for a site until a WP core method exists - * (see https://core.trac.wordpress.org/ticket/24730). - * - * Adapted from wc_timezone_string() and https://secure.php.net/manual/en/function.timezone-name-from-abbr.php#89155. - * - * If no timezone string is set, and its not possible to match the UTC offset set for the site to a timezone - * string, then an empty string will be returned, and the UTC offset should be used to set a DateTime's - * timezone. - * - * @since 2.1.0 - * @return string PHP timezone string for the site or empty if no timezone string is available. - */ - protected static function get_local_timezone_string( $reset = false ) { - // If site timezone string exists, return it. - $timezone = get_option( 'timezone_string' ); - if ( $timezone ) { - return $timezone; - } - - // Get UTC offset, if it isn't set then return UTC. - $utc_offset = intval( get_option( 'gmt_offset', 0 ) ); - if ( 0 === $utc_offset ) { - return 'UTC'; - } - - // Adjust UTC offset from hours to seconds. - $utc_offset *= 3600; - - // Attempt to guess the timezone string from the UTC offset. - $timezone = timezone_name_from_abbr( '', $utc_offset ); - if ( $timezone ) { - return $timezone; - } - - // Last try, guess timezone string manually. - foreach ( timezone_abbreviations_list() as $abbr ) { - foreach ( $abbr as $city ) { - if ( (bool) date( 'I' ) === (bool) $city['dst'] && $city['timezone_id'] && intval( $city['offset'] ) === $utc_offset ) { - return $city['timezone_id']; - } - } - } - - // No timezone string - return ''; - } - - /** - * Get timezone offset in seconds. - * - * @since 2.1.0 - * @return float - */ - protected static function get_local_timezone_offset() { - $timezone = get_option( 'timezone_string' ); - - if ( $timezone ) { - $timezone_object = new DateTimeZone( $timezone ); - return $timezone_object->getOffset( new DateTime( 'now' ) ); - } else { - return floatval( get_option( 'gmt_offset', 0 ) ) * HOUR_IN_SECONDS; - } - } - - /** - * @deprecated 2.1.0 - */ - public static function get_local_timezone( $reset = FALSE ) { - _deprecated_function( __FUNCTION__, '2.1.0', 'ActionScheduler_TimezoneHelper::set_local_timezone()' ); - if ( $reset ) { - self::$local_timezone = NULL; - } - if ( !isset(self::$local_timezone) ) { - $tzstring = get_option('timezone_string'); - - if ( empty($tzstring) ) { - $gmt_offset = get_option('gmt_offset'); - if ( $gmt_offset == 0 ) { - $tzstring = 'UTC'; - } else { - $gmt_offset *= HOUR_IN_SECONDS; - $tzstring = timezone_name_from_abbr( '', $gmt_offset, 1 ); - - // If there's no timezone string, try again with no DST. - if ( false === $tzstring ) { - $tzstring = timezone_name_from_abbr( '', $gmt_offset, 0 ); - } - - // Try mapping to the first abbreviation we can find. - if ( false === $tzstring ) { - $is_dst = date( 'I' ); - foreach ( timezone_abbreviations_list() as $abbr ) { - foreach ( $abbr as $city ) { - if ( $city['dst'] == $is_dst && $city['offset'] == $gmt_offset ) { - // If there's no valid timezone ID, keep looking. - if ( null === $city['timezone_id'] ) { - continue; - } - - $tzstring = $city['timezone_id']; - break 2; - } - } - } - } - - // If we still have no valid string, then fall back to UTC. - if ( false === $tzstring ) { - $tzstring = 'UTC'; - } - } - } - - self::$local_timezone = new DateTimeZone($tzstring); - } - return self::$local_timezone; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/actions/ActionScheduler_Action.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/actions/ActionScheduler_Action.php deleted file mode 100644 index c44f8885..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/actions/ActionScheduler_Action.php +++ /dev/null @@ -1,76 +0,0 @@ -set_hook($hook); - $this->set_schedule($schedule); - $this->set_args($args); - $this->set_group($group); - } - - public function execute() { - return do_action_ref_array( $this->get_hook(), array_values( $this->get_args() ) ); - } - - /** - * @param string $hook - */ - protected function set_hook( $hook ) { - $this->hook = $hook; - } - - public function get_hook() { - return $this->hook; - } - - protected function set_schedule( ActionScheduler_Schedule $schedule ) { - $this->schedule = $schedule; - } - - /** - * @return ActionScheduler_Schedule - */ - public function get_schedule() { - return $this->schedule; - } - - protected function set_args( array $args ) { - $this->args = $args; - } - - public function get_args() { - return $this->args; - } - - /** - * @param string $group - */ - protected function set_group( $group ) { - $this->group = $group; - } - - /** - * @return string - */ - public function get_group() { - return $this->group; - } - - /** - * @return bool If the action has been finished - */ - public function is_finished() { - return FALSE; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/actions/ActionScheduler_CanceledAction.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/actions/ActionScheduler_CanceledAction.php deleted file mode 100644 index 0172da12..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/actions/ActionScheduler_CanceledAction.php +++ /dev/null @@ -1,24 +0,0 @@ -set_schedule( new ActionScheduler_NullSchedule() ); - } - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/actions/ActionScheduler_FinishedAction.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/actions/ActionScheduler_FinishedAction.php deleted file mode 100644 index fd1ddb32..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/actions/ActionScheduler_FinishedAction.php +++ /dev/null @@ -1,17 +0,0 @@ -set_schedule( new ActionScheduler_NullSchedule() ); - } - - public function execute() { - // don't execute - } -} - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBLogger.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBLogger.php deleted file mode 100644 index 9093128e..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBLogger.php +++ /dev/null @@ -1,155 +0,0 @@ -format( 'Y-m-d H:i:s' ); - ActionScheduler_TimezoneHelper::set_local_timezone( $date ); - $date_local = $date->format( 'Y-m-d H:i:s' ); - - /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort - global $wpdb; - $wpdb->insert( - $wpdb->actionscheduler_logs, - array( - 'action_id' => $action_id, - 'message' => $message, - 'log_date_gmt' => $date_gmt, - 'log_date_local' => $date_local, - ), - array( '%d', '%s', '%s', '%s' ) - ); - - return $wpdb->insert_id; - } - - /** - * Retrieve an action log entry. - * - * @param int $entry_id Log entry ID. - * - * @return ActionScheduler_LogEntry - */ - public function get_entry( $entry_id ) { - /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort - global $wpdb; - $entry = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->actionscheduler_logs} WHERE log_id=%d", $entry_id ) ); - - return $this->create_entry_from_db_record( $entry ); - } - - /** - * Create an action log entry from a database record. - * - * @param object $record Log entry database record object. - * - * @return ActionScheduler_LogEntry - */ - private function create_entry_from_db_record( $record ) { - if ( empty( $record ) ) { - return new ActionScheduler_NullLogEntry(); - } - - if ( is_null( $record->log_date_gmt ) ) { - $date = as_get_datetime_object( ActionScheduler_StoreSchema::DEFAULT_DATE ); - } else { - $date = as_get_datetime_object( $record->log_date_gmt ); - } - - return new ActionScheduler_LogEntry( $record->action_id, $record->message, $date ); - } - - /** - * Retrieve the an action's log entries from the database. - * - * @param int $action_id Action ID. - * - * @return ActionScheduler_LogEntry[] - */ - public function get_logs( $action_id ) { - /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort - global $wpdb; - - $records = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->actionscheduler_logs} WHERE action_id=%d", $action_id ) ); - - return array_map( array( $this, 'create_entry_from_db_record' ), $records ); - } - - /** - * Initialize the data store. - * - * @codeCoverageIgnore - */ - public function init() { - $table_maker = new ActionScheduler_LoggerSchema(); - $table_maker->init(); - $table_maker->register_tables(); - - parent::init(); - - add_action( 'action_scheduler_deleted_action', array( $this, 'clear_deleted_action_logs' ), 10, 1 ); - } - - /** - * Delete the action logs for an action. - * - * @param int $action_id Action ID. - */ - public function clear_deleted_action_logs( $action_id ) { - /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort - global $wpdb; - $wpdb->delete( $wpdb->actionscheduler_logs, array( 'action_id' => $action_id ), array( '%d' ) ); - } - - /** - * Bulk add cancel action log entries. - * - * @param array $action_ids List of action ID. - */ - public function bulk_log_cancel_actions( $action_ids ) { - if ( empty( $action_ids ) ) { - return; - } - - /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort - global $wpdb; - $date = as_get_datetime_object(); - $date_gmt = $date->format( 'Y-m-d H:i:s' ); - ActionScheduler_TimezoneHelper::set_local_timezone( $date ); - $date_local = $date->format( 'Y-m-d H:i:s' ); - $message = __( 'action canceled', 'action-scheduler' ); - $format = '(%d, ' . $wpdb->prepare( '%s, %s, %s', $message, $date_gmt, $date_local ) . ')'; - $sql_query = "INSERT {$wpdb->actionscheduler_logs} (action_id, message, log_date_gmt, log_date_local) VALUES "; - $value_rows = array(); - - foreach ( $action_ids as $action_id ) { - $value_rows[] = $wpdb->prepare( $format, $action_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - $sql_query .= implode( ',', $value_rows ); - - $wpdb->query( $sql_query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php deleted file mode 100644 index 72e5569c..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php +++ /dev/null @@ -1,869 +0,0 @@ -init(); - $table_maker->register_tables(); - } - - /** - * Save an action. - * - * @param ActionScheduler_Action $action Action object. - * @param DateTime $date Optional schedule date. Default null. - * - * @return int Action ID. - * @throws RuntimeException Throws exception when saving the action fails. - */ - public function save_action( ActionScheduler_Action $action, \DateTime $date = null ) { - try { - - $this->validate_action( $action ); - - /** @var \wpdb $wpdb */ - global $wpdb; - $data = array( - 'hook' => $action->get_hook(), - 'status' => ( $action->is_finished() ? self::STATUS_COMPLETE : self::STATUS_PENDING ), - 'scheduled_date_gmt' => $this->get_scheduled_date_string( $action, $date ), - 'scheduled_date_local' => $this->get_scheduled_date_string_local( $action, $date ), - 'schedule' => serialize( $action->get_schedule() ), // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize - 'group_id' => $this->get_group_id( $action->get_group() ), - ); - $args = wp_json_encode( $action->get_args() ); - if ( strlen( $args ) <= static::$max_index_length ) { - $data['args'] = $args; - } else { - $data['args'] = $this->hash_args( $args ); - $data['extended_args'] = $args; - } - - $table_name = ! empty( $wpdb->actionscheduler_actions ) ? $wpdb->actionscheduler_actions : $wpdb->prefix . 'actionscheduler_actions'; - $wpdb->insert( $table_name, $data ); - $action_id = $wpdb->insert_id; - - if ( is_wp_error( $action_id ) ) { - throw new \RuntimeException( $action_id->get_error_message() ); - } elseif ( empty( $action_id ) ) { - throw new \RuntimeException( $wpdb->last_error ? $wpdb->last_error : __( 'Database error.', 'action-scheduler' ) ); - } - - do_action( 'action_scheduler_stored_action', $action_id ); - - return $action_id; - } catch ( \Exception $e ) { - /* translators: %s: error message */ - throw new \RuntimeException( sprintf( __( 'Error saving action: %s', 'action-scheduler' ), $e->getMessage() ), 0 ); - } - } - - /** - * Generate a hash from json_encoded $args using MD5 as this isn't for security. - * - * @param string $args JSON encoded action args. - * @return string - */ - protected function hash_args( $args ) { - return md5( $args ); - } - - /** - * Get action args query param value from action args. - * - * @param array $args Action args. - * @return string - */ - protected function get_args_for_query( $args ) { - $encoded = wp_json_encode( $args ); - if ( strlen( $encoded ) <= static::$max_index_length ) { - return $encoded; - } - return $this->hash_args( $encoded ); - } - /** - * Get a group's ID based on its name/slug. - * - * @param string $slug The string name of a group. - * @param bool $create_if_not_exists Whether to create the group if it does not already exist. Default, true - create the group. - * - * @return int The group's ID, if it exists or is created, or 0 if it does not exist and is not created. - */ - protected function get_group_id( $slug, $create_if_not_exists = true ) { - if ( empty( $slug ) ) { - return 0; - } - /** @var \wpdb $wpdb */ - global $wpdb; - $group_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT group_id FROM {$wpdb->actionscheduler_groups} WHERE slug=%s", $slug ) ); - if ( empty( $group_id ) && $create_if_not_exists ) { - $group_id = $this->create_group( $slug ); - } - - return $group_id; - } - - /** - * Create an action group. - * - * @param string $slug Group slug. - * - * @return int Group ID. - */ - protected function create_group( $slug ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $wpdb->insert( $wpdb->actionscheduler_groups, array( 'slug' => $slug ) ); - - return (int) $wpdb->insert_id; - } - - /** - * Retrieve an action. - * - * @param int $action_id Action ID. - * - * @return ActionScheduler_Action - */ - public function fetch_action( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $data = $wpdb->get_row( - $wpdb->prepare( - "SELECT a.*, g.slug AS `group` FROM {$wpdb->actionscheduler_actions} a LEFT JOIN {$wpdb->actionscheduler_groups} g ON a.group_id=g.group_id WHERE a.action_id=%d", - $action_id - ) - ); - - if ( empty( $data ) ) { - return $this->get_null_action(); - } - - if ( ! empty( $data->extended_args ) ) { - $data->args = $data->extended_args; - unset( $data->extended_args ); - } - - // Convert NULL dates to zero dates. - $date_fields = array( - 'scheduled_date_gmt', - 'scheduled_date_local', - 'last_attempt_gmt', - 'last_attempt_gmt', - ); - foreach ( $date_fields as $date_field ) { - if ( is_null( $data->$date_field ) ) { - $data->$date_field = ActionScheduler_StoreSchema::DEFAULT_DATE; - } - } - - try { - $action = $this->make_action_from_db_record( $data ); - } catch ( ActionScheduler_InvalidActionException $exception ) { - do_action( 'action_scheduler_failed_fetch_action', $action_id, $exception ); - return $this->get_null_action(); - } - - return $action; - } - - /** - * Create a null action. - * - * @return ActionScheduler_NullAction - */ - protected function get_null_action() { - return new ActionScheduler_NullAction(); - } - - /** - * Create an action from a database record. - * - * @param object $data Action database record. - * - * @return ActionScheduler_Action|ActionScheduler_CanceledAction|ActionScheduler_FinishedAction - */ - protected function make_action_from_db_record( $data ) { - - $hook = $data->hook; - $args = json_decode( $data->args, true ); - $schedule = unserialize( $data->schedule ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_unserialize - - $this->validate_args( $args, $data->action_id ); - $this->validate_schedule( $schedule, $data->action_id ); - - if ( empty( $schedule ) ) { - $schedule = new ActionScheduler_NullSchedule(); - } - $group = $data->group ? $data->group : ''; - - return ActionScheduler::factory()->get_stored_action( $data->status, $data->hook, $args, $schedule, $group ); - } - - /** - * Returns the SQL statement to query (or count) actions. - * - * @since x.x.x $query['status'] accepts array of statuses instead of a single status. - * - * @param array $query Filtering options. - * @param string $select_or_count Whether the SQL should select and return the IDs or just the row count. - * - * @return string SQL statement already properly escaped. - * @throws InvalidArgumentException If the query is invalid. - */ - protected function get_query_actions_sql( array $query, $select_or_count = 'select' ) { - - if ( ! in_array( $select_or_count, array( 'select', 'count' ), true ) ) { - throw new InvalidArgumentException( __( 'Invalid value for select or count parameter. Cannot query actions.', 'action-scheduler' ) ); - } - - $query = wp_parse_args( - $query, - array( - 'hook' => '', - 'args' => null, - 'date' => null, - 'date_compare' => '<=', - 'modified' => null, - 'modified_compare' => '<=', - 'group' => '', - 'status' => '', - 'claimed' => null, - 'per_page' => 5, - 'offset' => 0, - 'orderby' => 'date', - 'order' => 'ASC', - ) - ); - - /** @var \wpdb $wpdb */ - global $wpdb; - $sql = ( 'count' === $select_or_count ) ? 'SELECT count(a.action_id)' : 'SELECT a.action_id'; - $sql .= " FROM {$wpdb->actionscheduler_actions} a"; - $sql_params = array(); - - if ( ! empty( $query['group'] ) || 'group' === $query['orderby'] ) { - $sql .= " LEFT JOIN {$wpdb->actionscheduler_groups} g ON g.group_id=a.group_id"; - } - - $sql .= ' WHERE 1=1'; - - if ( ! empty( $query['group'] ) ) { - $sql .= ' AND g.slug=%s'; - $sql_params[] = $query['group']; - } - - if ( $query['hook'] ) { - $sql .= ' AND a.hook=%s'; - $sql_params[] = $query['hook']; - } - if ( ! is_null( $query['args'] ) ) { - $sql .= ' AND a.args=%s'; - $sql_params[] = $this->get_args_for_query( $query['args'] ); - } - - if ( $query['status'] ) { - $statuses = (array) $query['status']; - $placeholders = array_fill( 0, count( $statuses ), '%s' ); - $sql .= ' AND a.status IN (' . join( ', ', $placeholders ) . ')'; - $sql_params = array_merge( $sql_params, array_values( $statuses ) ); - } - - if ( $query['date'] instanceof \DateTime ) { - $date = clone $query['date']; - $date->setTimezone( new \DateTimeZone( 'UTC' ) ); - $date_string = $date->format( 'Y-m-d H:i:s' ); - $comparator = $this->validate_sql_comparator( $query['date_compare'] ); - $sql .= " AND a.scheduled_date_gmt $comparator %s"; - $sql_params[] = $date_string; - } - - if ( $query['modified'] instanceof \DateTime ) { - $modified = clone $query['modified']; - $modified->setTimezone( new \DateTimeZone( 'UTC' ) ); - $date_string = $modified->format( 'Y-m-d H:i:s' ); - $comparator = $this->validate_sql_comparator( $query['modified_compare'] ); - $sql .= " AND a.last_attempt_gmt $comparator %s"; - $sql_params[] = $date_string; - } - - if ( true === $query['claimed'] ) { - $sql .= ' AND a.claim_id != 0'; - } elseif ( false === $query['claimed'] ) { - $sql .= ' AND a.claim_id = 0'; - } elseif ( ! is_null( $query['claimed'] ) ) { - $sql .= ' AND a.claim_id = %d'; - $sql_params[] = $query['claimed']; - } - - if ( ! empty( $query['search'] ) ) { - $sql .= ' AND (a.hook LIKE %s OR (a.extended_args IS NULL AND a.args LIKE %s) OR a.extended_args LIKE %s'; - for ( $i = 0; $i < 3; $i++ ) { - $sql_params[] = sprintf( '%%%s%%', $query['search'] ); - } - - $search_claim_id = (int) $query['search']; - if ( $search_claim_id ) { - $sql .= ' OR a.claim_id = %d'; - $sql_params[] = $search_claim_id; - } - - $sql .= ')'; - } - - if ( 'select' === $select_or_count ) { - if ( 'ASC' === strtoupper( $query['order'] ) ) { - $order = 'ASC'; - } else { - $order = 'DESC'; - } - switch ( $query['orderby'] ) { - case 'hook': - $sql .= " ORDER BY a.hook $order"; - break; - case 'group': - $sql .= " ORDER BY g.slug $order"; - break; - case 'modified': - $sql .= " ORDER BY a.last_attempt_gmt $order"; - break; - case 'none': - break; - case 'action_id': - $sql .= " ORDER BY a.action_id $order"; - break; - case 'date': - default: - $sql .= " ORDER BY a.scheduled_date_gmt $order"; - break; - } - - if ( $query['per_page'] > 0 ) { - $sql .= ' LIMIT %d, %d'; - $sql_params[] = $query['offset']; - $sql_params[] = $query['per_page']; - } - } - - if ( ! empty( $sql_params ) ) { - $sql = $wpdb->prepare( $sql, $sql_params ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - - return $sql; - } - - /** - * Query for action count or list of action IDs. - * - * @since x.x.x $query['status'] accepts array of statuses instead of a single status. - * - * @see ActionScheduler_Store::query_actions for $query arg usage. - * - * @param array $query Query filtering options. - * @param string $query_type Whether to select or count the results. Defaults to select. - * - * @return string|array|null The IDs of actions matching the query. Null on failure. - */ - public function query_actions( $query = array(), $query_type = 'select' ) { - /** @var wpdb $wpdb */ - global $wpdb; - - $sql = $this->get_query_actions_sql( $query, $query_type ); - - return ( 'count' === $query_type ) ? $wpdb->get_var( $sql ) : $wpdb->get_col( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.NoSql, WordPress.DB.DirectDatabaseQuery.NoCaching - } - - /** - * Get a count of all actions in the store, grouped by status. - * - * @return array Set of 'status' => int $count pairs for statuses with 1 or more actions of that status. - */ - public function action_counts() { - global $wpdb; - - $sql = "SELECT a.status, count(a.status) as 'count'"; - $sql .= " FROM {$wpdb->actionscheduler_actions} a"; - $sql .= ' GROUP BY a.status'; - - $actions_count_by_status = array(); - $action_stati_and_labels = $this->get_status_labels(); - - foreach ( $wpdb->get_results( $sql ) as $action_data ) { // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - // Ignore any actions with invalid status. - if ( array_key_exists( $action_data->status, $action_stati_and_labels ) ) { - $actions_count_by_status[ $action_data->status ] = $action_data->count; - } - } - - return $actions_count_by_status; - } - - /** - * Cancel an action. - * - * @param int $action_id Action ID. - * - * @return void - * @throws \InvalidArgumentException If the action update failed. - */ - public function cancel_action( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - - $updated = $wpdb->update( - $wpdb->actionscheduler_actions, - array( 'status' => self::STATUS_CANCELED ), - array( 'action_id' => $action_id ), - array( '%s' ), - array( '%d' ) - ); - if ( empty( $updated ) ) { - /* translators: %s: action ID */ - throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); - } - do_action( 'action_scheduler_canceled_action', $action_id ); - } - - /** - * Cancel pending actions by hook. - * - * @since 3.0.0 - * - * @param string $hook Hook name. - * - * @return void - */ - public function cancel_actions_by_hook( $hook ) { - $this->bulk_cancel_actions( array( 'hook' => $hook ) ); - } - - /** - * Cancel pending actions by group. - * - * @param string $group Group slug. - * - * @return void - */ - public function cancel_actions_by_group( $group ) { - $this->bulk_cancel_actions( array( 'group' => $group ) ); - } - - /** - * Bulk cancel actions. - * - * @since 3.0.0 - * - * @param array $query_args Query parameters. - */ - protected function bulk_cancel_actions( $query_args ) { - /** @var \wpdb $wpdb */ - global $wpdb; - - if ( ! is_array( $query_args ) ) { - return; - } - - // Don't cancel actions that are already canceled. - if ( isset( $query_args['status'] ) && self::STATUS_CANCELED === $query_args['status'] ) { - return; - } - - $action_ids = true; - $query_args = wp_parse_args( - $query_args, - array( - 'per_page' => 1000, - 'status' => self::STATUS_PENDING, - 'orderby' => 'action_id', - ) - ); - - while ( $action_ids ) { - $action_ids = $this->query_actions( $query_args ); - if ( empty( $action_ids ) ) { - break; - } - - $format = array_fill( 0, count( $action_ids ), '%d' ); - $query_in = '(' . implode( ',', $format ) . ')'; - $parameters = $action_ids; - array_unshift( $parameters, self::STATUS_CANCELED ); - - $wpdb->query( - $wpdb->prepare( - "UPDATE {$wpdb->actionscheduler_actions} SET status = %s WHERE action_id IN {$query_in}", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared - $parameters - ) - ); - - do_action( 'action_scheduler_bulk_cancel_actions', $action_ids ); - } - } - - /** - * Delete an action. - * - * @param int $action_id Action ID. - * @throws \InvalidArgumentException If the action deletion failed. - */ - public function delete_action( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $deleted = $wpdb->delete( $wpdb->actionscheduler_actions, array( 'action_id' => $action_id ), array( '%d' ) ); - if ( empty( $deleted ) ) { - throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); //phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment - } - do_action( 'action_scheduler_deleted_action', $action_id ); - } - - /** - * Get the schedule date for an action. - * - * @param string $action_id Action ID. - * - * @return \DateTime The local date the action is scheduled to run, or the date that it ran. - */ - public function get_date( $action_id ) { - $date = $this->get_date_gmt( $action_id ); - ActionScheduler_TimezoneHelper::set_local_timezone( $date ); - return $date; - } - - /** - * Get the GMT schedule date for an action. - * - * @param int $action_id Action ID. - * - * @throws \InvalidArgumentException If action cannot be identified. - * @return \DateTime The GMT date the action is scheduled to run, or the date that it ran. - */ - protected function get_date_gmt( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $record = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->actionscheduler_actions} WHERE action_id=%d", $action_id ) ); - if ( empty( $record ) ) { - throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); //phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment - } - if ( self::STATUS_PENDING === $record->status ) { - return as_get_datetime_object( $record->scheduled_date_gmt ); - } else { - return as_get_datetime_object( $record->last_attempt_gmt ); - } - } - - /** - * Stake a claim on actions. - * - * @param int $max_actions Maximum number of action to include in claim. - * @param \DateTime $before_date Jobs must be schedule before this date. Defaults to now. - * @param array $hooks Hooks to filter for. - * @param string $group Group to filter for. - * - * @return ActionScheduler_ActionClaim - */ - public function stake_claim( $max_actions = 10, \DateTime $before_date = null, $hooks = array(), $group = '' ) { - $claim_id = $this->generate_claim_id(); - - $this->claim_before_date = $before_date; - $this->claim_actions( $claim_id, $max_actions, $before_date, $hooks, $group ); - $action_ids = $this->find_actions_by_claim_id( $claim_id ); - $this->claim_before_date = null; - - return new ActionScheduler_ActionClaim( $claim_id, $action_ids ); - } - - /** - * Generate a new action claim. - * - * @return int Claim ID. - */ - protected function generate_claim_id() { - /** @var \wpdb $wpdb */ - global $wpdb; - $now = as_get_datetime_object(); - $wpdb->insert( $wpdb->actionscheduler_claims, array( 'date_created_gmt' => $now->format( 'Y-m-d H:i:s' ) ) ); - - return $wpdb->insert_id; - } - - /** - * Mark actions claimed. - * - * @param string $claim_id Claim Id. - * @param int $limit Number of action to include in claim. - * @param \DateTime $before_date Should use UTC timezone. - * @param array $hooks Hooks to filter for. - * @param string $group Group to filter for. - * - * @return int The number of actions that were claimed. - * @throws \InvalidArgumentException Throws InvalidArgumentException if group doesn't exist. - * @throws \RuntimeException Throws RuntimeException if unable to claim action. - */ - protected function claim_actions( $claim_id, $limit, \DateTime $before_date = null, $hooks = array(), $group = '' ) { - /** @var \wpdb $wpdb */ - global $wpdb; - - $now = as_get_datetime_object(); - $date = is_null( $before_date ) ? $now : clone $before_date; - - // can't use $wpdb->update() because of the <= condition. - $update = "UPDATE {$wpdb->actionscheduler_actions} SET claim_id=%d, last_attempt_gmt=%s, last_attempt_local=%s"; - $params = array( - $claim_id, - $now->format( 'Y-m-d H:i:s' ), - current_time( 'mysql' ), - ); - - $where = 'WHERE claim_id = 0 AND scheduled_date_gmt <= %s AND status=%s'; - $params[] = $date->format( 'Y-m-d H:i:s' ); - $params[] = self::STATUS_PENDING; - - if ( ! empty( $hooks ) ) { - $placeholders = array_fill( 0, count( $hooks ), '%s' ); - $where .= ' AND hook IN (' . join( ', ', $placeholders ) . ')'; - $params = array_merge( $params, array_values( $hooks ) ); - } - - if ( ! empty( $group ) ) { - - $group_id = $this->get_group_id( $group, false ); - - // throw exception if no matching group found, this matches ActionScheduler_wpPostStore's behaviour. - if ( empty( $group_id ) ) { - /* translators: %s: group name */ - throw new InvalidArgumentException( sprintf( __( 'The group "%s" does not exist.', 'action-scheduler' ), $group ) ); - } - - $where .= ' AND group_id = %d'; - $params[] = $group_id; - } - - /** - * Sets the order-by clause used in the action claim query. - * - * @since x.x.x - * - * @param string $order_by_sql - */ - $order = apply_filters( 'action_scheduler_claim_actions_order_by', 'ORDER BY attempts ASC, scheduled_date_gmt ASC, action_id ASC' ); - $params[] = $limit; - - $sql = $wpdb->prepare( "{$update} {$where} {$order} LIMIT %d", $params ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders - $rows_affected = $wpdb->query( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - if ( false === $rows_affected ) { - throw new \RuntimeException( __( 'Unable to claim actions. Database error.', 'action-scheduler' ) ); - } - - return (int) $rows_affected; - } - - /** - * Get the number of active claims. - * - * @return int - */ - public function get_claim_count() { - global $wpdb; - - $sql = "SELECT COUNT(DISTINCT claim_id) FROM {$wpdb->actionscheduler_actions} WHERE claim_id != 0 AND status IN ( %s, %s)"; - $sql = $wpdb->prepare( $sql, array( self::STATUS_PENDING, self::STATUS_RUNNING ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - - return (int) $wpdb->get_var( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - - /** - * Return an action's claim ID, as stored in the claim_id column. - * - * @param string $action_id Action ID. - * @return mixed - */ - public function get_claim_id( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - - $sql = "SELECT claim_id FROM {$wpdb->actionscheduler_actions} WHERE action_id=%d"; - $sql = $wpdb->prepare( $sql, $action_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - - return (int) $wpdb->get_var( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - - /** - * Retrieve the action IDs of action in a claim. - * - * @param int $claim_id Claim ID. - * @return int[] - */ - public function find_actions_by_claim_id( $claim_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - - $action_ids = array(); - $before_date = isset( $this->claim_before_date ) ? $this->claim_before_date : as_get_datetime_object(); - $cut_off = $before_date->format( 'Y-m-d H:i:s' ); - - $sql = $wpdb->prepare( - "SELECT action_id, scheduled_date_gmt FROM {$wpdb->actionscheduler_actions} WHERE claim_id = %d", - $claim_id - ); - - // Verify that the scheduled date for each action is within the expected bounds (in some unusual - // cases, we cannot depend on MySQL to honor all of the WHERE conditions we specify). - foreach ( $wpdb->get_results( $sql ) as $claimed_action ) { // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - if ( $claimed_action->scheduled_date_gmt <= $cut_off ) { - $action_ids[] = absint( $claimed_action->action_id ); - } - } - - return $action_ids; - } - - /** - * Release actions from a claim and delete the claim. - * - * @param ActionScheduler_ActionClaim $claim Claim object. - */ - public function release_claim( ActionScheduler_ActionClaim $claim ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $wpdb->update( $wpdb->actionscheduler_actions, array( 'claim_id' => 0 ), array( 'claim_id' => $claim->get_id() ), array( '%d' ), array( '%d' ) ); - $wpdb->delete( $wpdb->actionscheduler_claims, array( 'claim_id' => $claim->get_id() ), array( '%d' ) ); - } - - /** - * Remove the claim from an action. - * - * @param int $action_id Action ID. - * - * @return void - */ - public function unclaim_action( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $wpdb->update( - $wpdb->actionscheduler_actions, - array( 'claim_id' => 0 ), - array( 'action_id' => $action_id ), - array( '%s' ), - array( '%d' ) - ); - } - - /** - * Mark an action as failed. - * - * @param int $action_id Action ID. - * @throws \InvalidArgumentException Throw an exception if action was not updated. - */ - public function mark_failure( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $updated = $wpdb->update( - $wpdb->actionscheduler_actions, - array( 'status' => self::STATUS_FAILED ), - array( 'action_id' => $action_id ), - array( '%s' ), - array( '%d' ) - ); - if ( empty( $updated ) ) { - throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); //phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment - } - } - - /** - * Add execution message to action log. - * - * @param int $action_id Action ID. - * - * @return void - */ - public function log_execution( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - - $sql = "UPDATE {$wpdb->actionscheduler_actions} SET attempts = attempts+1, status=%s, last_attempt_gmt = %s, last_attempt_local = %s WHERE action_id = %d"; - $sql = $wpdb->prepare( $sql, self::STATUS_RUNNING, current_time( 'mysql', true ), current_time( 'mysql' ), $action_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - $wpdb->query( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - - /** - * Mark an action as complete. - * - * @param int $action_id Action ID. - * - * @return void - * @throws \InvalidArgumentException Throw an exception if action was not updated. - */ - public function mark_complete( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $updated = $wpdb->update( - $wpdb->actionscheduler_actions, - array( - 'status' => self::STATUS_COMPLETE, - 'last_attempt_gmt' => current_time( 'mysql', true ), - 'last_attempt_local' => current_time( 'mysql' ), - ), - array( 'action_id' => $action_id ), - array( '%s' ), - array( '%d' ) - ); - if ( empty( $updated ) ) { - throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); //phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment - } - } - - /** - * Get an action's status. - * - * @param int $action_id Action ID. - * - * @return string - * @throws \InvalidArgumentException Throw an exception if not status was found for action_id. - * @throws \RuntimeException Throw an exception if action status could not be retrieved. - */ - public function get_status( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $sql = "SELECT status FROM {$wpdb->actionscheduler_actions} WHERE action_id=%d"; - $sql = $wpdb->prepare( $sql, $action_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - $status = $wpdb->get_var( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - - if ( null === $status ) { - throw new \InvalidArgumentException( __( 'Invalid action ID. No status found.', 'action-scheduler' ) ); - } elseif ( empty( $status ) ) { - throw new \RuntimeException( __( 'Unknown status found for action.', 'action-scheduler' ) ); - } else { - return $status; - } - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php deleted file mode 100644 index 36779d47..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php +++ /dev/null @@ -1,427 +0,0 @@ -demarkation_id = (int) get_option( self::DEMARKATION_OPTION, 0 ); - if ( empty( $config ) ) { - $config = Controller::instance()->get_migration_config_object(); - } - $this->primary_store = $config->get_destination_store(); - $this->secondary_store = $config->get_source_store(); - $this->migration_runner = new Runner( $config ); - } - - /** - * Initialize the table data store tables. - * - * @codeCoverageIgnore - */ - public function init() { - add_action( 'action_scheduler/created_table', [ $this, 'set_autoincrement' ], 10, 2 ); - $this->primary_store->init(); - $this->secondary_store->init(); - remove_action( 'action_scheduler/created_table', [ $this, 'set_autoincrement' ], 10 ); - } - - /** - * When the actions table is created, set its autoincrement - * value to be one higher than the posts table to ensure that - * there are no ID collisions. - * - * @param string $table_name - * @param string $table_suffix - * - * @return void - * @codeCoverageIgnore - */ - public function set_autoincrement( $table_name, $table_suffix ) { - if ( ActionScheduler_StoreSchema::ACTIONS_TABLE === $table_suffix ) { - if ( empty( $this->demarkation_id ) ) { - $this->demarkation_id = $this->set_demarkation_id(); - } - /** @var \wpdb $wpdb */ - global $wpdb; - /** - * A default date of '0000-00-00 00:00:00' is invalid in MySQL 5.7 when configured with - * sql_mode including both STRICT_TRANS_TABLES and NO_ZERO_DATE. - */ - $default_date = new DateTime( 'tomorrow' ); - $null_action = new ActionScheduler_NullAction(); - $date_gmt = $this->get_scheduled_date_string( $null_action, $default_date ); - $date_local = $this->get_scheduled_date_string_local( $null_action, $default_date ); - - $row_count = $wpdb->insert( - $wpdb->{ActionScheduler_StoreSchema::ACTIONS_TABLE}, - [ - 'action_id' => $this->demarkation_id, - 'hook' => '', - 'status' => '', - 'scheduled_date_gmt' => $date_gmt, - 'scheduled_date_local' => $date_local, - 'last_attempt_gmt' => $date_gmt, - 'last_attempt_local' => $date_local, - ] - ); - if ( $row_count > 0 ) { - $wpdb->delete( - $wpdb->{ActionScheduler_StoreSchema::ACTIONS_TABLE}, - [ 'action_id' => $this->demarkation_id ] - ); - } - } - } - - /** - * Store the demarkation id in WP options. - * - * @param int $id The ID to set as the demarkation point between the two stores - * Leave null to use the next ID from the WP posts table. - * - * @return int The new ID. - * - * @codeCoverageIgnore - */ - private function set_demarkation_id( $id = null ) { - if ( empty( $id ) ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $id = (int) $wpdb->get_var( "SELECT MAX(ID) FROM $wpdb->posts" ); - $id ++; - } - update_option( self::DEMARKATION_OPTION, $id ); - - return $id; - } - - /** - * Find the first matching action from the secondary store. - * If it exists, migrate it to the primary store immediately. - * After it migrates, the secondary store will logically contain - * the next matching action, so return the result thence. - * - * @param string $hook - * @param array $params - * - * @return string - */ - public function find_action( $hook, $params = [] ) { - $found_unmigrated_action = $this->secondary_store->find_action( $hook, $params ); - if ( ! empty( $found_unmigrated_action ) ) { - $this->migrate( [ $found_unmigrated_action ] ); - } - - return $this->primary_store->find_action( $hook, $params ); - } - - /** - * Find actions matching the query in the secondary source first. - * If any are found, migrate them immediately. Then the secondary - * store will contain the canonical results. - * - * @param array $query - * @param string $query_type Whether to select or count the results. Default, select. - * - * @return int[] - */ - public function query_actions( $query = [], $query_type = 'select' ) { - $found_unmigrated_actions = $this->secondary_store->query_actions( $query, 'select' ); - if ( ! empty( $found_unmigrated_actions ) ) { - $this->migrate( $found_unmigrated_actions ); - } - - return $this->primary_store->query_actions( $query, $query_type ); - } - - /** - * Get a count of all actions in the store, grouped by status - * - * @return array Set of 'status' => int $count pairs for statuses with 1 or more actions of that status. - */ - public function action_counts() { - $unmigrated_actions_count = $this->secondary_store->action_counts(); - $migrated_actions_count = $this->primary_store->action_counts(); - $actions_count_by_status = array(); - - foreach ( $this->get_status_labels() as $status_key => $status_label ) { - - $count = 0; - - if ( isset( $unmigrated_actions_count[ $status_key ] ) ) { - $count += $unmigrated_actions_count[ $status_key ]; - } - - if ( isset( $migrated_actions_count[ $status_key ] ) ) { - $count += $migrated_actions_count[ $status_key ]; - } - - $actions_count_by_status[ $status_key ] = $count; - } - - $actions_count_by_status = array_filter( $actions_count_by_status ); - - return $actions_count_by_status; - } - - /** - * If any actions would have been claimed by the secondary store, - * migrate them immediately, then ask the primary store for the - * canonical claim. - * - * @param int $max_actions - * @param DateTime|null $before_date - * - * @return ActionScheduler_ActionClaim - */ - public function stake_claim( $max_actions = 10, DateTime $before_date = null, $hooks = array(), $group = '' ) { - $claim = $this->secondary_store->stake_claim( $max_actions, $before_date, $hooks, $group ); - - $claimed_actions = $claim->get_actions(); - if ( ! empty( $claimed_actions ) ) { - $this->migrate( $claimed_actions ); - } - - $this->secondary_store->release_claim( $claim ); - - return $this->primary_store->stake_claim( $max_actions, $before_date, $hooks, $group ); - } - - /** - * Migrate a list of actions to the table data store. - * - * @param array $action_ids List of action IDs. - */ - private function migrate( $action_ids ) { - $this->migration_runner->migrate_actions( $action_ids ); - } - - /** - * Save an action to the primary store. - * - * @param ActionScheduler_Action $action Action object to be saved. - * @param DateTime $date Optional. Schedule date. Default null. - * - * @return int The action ID - */ - public function save_action( ActionScheduler_Action $action, DateTime $date = null ) { - return $this->primary_store->save_action( $action, $date ); - } - - /** - * Retrieve an existing action whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function fetch_action( $action_id ) { - $store = $this->get_store_from_action_id( $action_id, true ); - if ( $store ) { - return $store->fetch_action( $action_id ); - } else { - return new ActionScheduler_NullAction(); - } - } - - /** - * Cancel an existing action whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function cancel_action( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - $store->cancel_action( $action_id ); - } - } - - /** - * Delete an existing action whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function delete_action( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - $store->delete_action( $action_id ); - } - } - - /** - * Get the schedule date an existing action whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function get_date( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - return $store->get_date( $action_id ); - } else { - return null; - } - } - - /** - * Mark an existing action as failed whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function mark_failure( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - $store->mark_failure( $action_id ); - } - } - - /** - * Log the execution of an existing action whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function log_execution( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - $store->log_execution( $action_id ); - } - } - - /** - * Mark an existing action complete whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function mark_complete( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - $store->mark_complete( $action_id ); - } - } - - /** - * Get an existing action status whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function get_status( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - return $store->get_status( $action_id ); - } - return null; - } - - /** - * Return which store an action is stored in. - * - * @param int $action_id ID of the action. - * @param bool $primary_first Optional flag indicating search the primary store first. - * @return ActionScheduler_Store - */ - protected function get_store_from_action_id( $action_id, $primary_first = false ) { - if ( $primary_first ) { - $stores = [ - $this->primary_store, - $this->secondary_store, - ]; - } elseif ( $action_id < $this->demarkation_id ) { - $stores = [ - $this->secondary_store, - $this->primary_store, - ]; - } else { - $stores = [ - $this->primary_store, - ]; - } - - foreach ( $stores as $store ) { - $action = $store->fetch_action( $action_id ); - if ( ! is_a( $action, 'ActionScheduler_NullAction' ) ) { - return $store; - } - } - return null; - } - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * - * All claim-related functions should operate solely - * on the primary store. - * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - /** - * Get the claim count from the table data store. - */ - public function get_claim_count() { - return $this->primary_store->get_claim_count(); - } - - /** - * Retrieve the claim ID for an action from the table data store. - * - * @param int $action_id Action ID. - */ - public function get_claim_id( $action_id ) { - return $this->primary_store->get_claim_id( $action_id ); - } - - /** - * Release a claim in the table data store. - * - * @param ActionScheduler_ActionClaim $claim Claim object. - */ - public function release_claim( ActionScheduler_ActionClaim $claim ) { - $this->primary_store->release_claim( $claim ); - } - - /** - * Release claims on an action in the table data store. - * - * @param int $action_id Action ID. - */ - public function unclaim_action( $action_id ) { - $this->primary_store->unclaim_action( $action_id ); - } - - /** - * Retrieve a list of action IDs by claim. - * - * @param int $claim_id Claim ID. - */ - public function find_actions_by_claim_id( $claim_id ) { - return $this->primary_store->find_actions_by_claim_id( $claim_id ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpCommentLogger.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpCommentLogger.php deleted file mode 100644 index edbca31d..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpCommentLogger.php +++ /dev/null @@ -1,241 +0,0 @@ -create_wp_comment( $action_id, $message, $date ); - return $comment_id; - } - - protected function create_wp_comment( $action_id, $message, DateTime $date ) { - - $comment_date_gmt = $date->format('Y-m-d H:i:s'); - ActionScheduler_TimezoneHelper::set_local_timezone( $date ); - $comment_data = array( - 'comment_post_ID' => $action_id, - 'comment_date' => $date->format('Y-m-d H:i:s'), - 'comment_date_gmt' => $comment_date_gmt, - 'comment_author' => self::AGENT, - 'comment_content' => $message, - 'comment_agent' => self::AGENT, - 'comment_type' => self::TYPE, - ); - return wp_insert_comment($comment_data); - } - - /** - * @param string $entry_id - * - * @return ActionScheduler_LogEntry - */ - public function get_entry( $entry_id ) { - $comment = $this->get_comment( $entry_id ); - if ( empty($comment) || $comment->comment_type != self::TYPE ) { - return new ActionScheduler_NullLogEntry(); - } - - $date = as_get_datetime_object( $comment->comment_date_gmt ); - ActionScheduler_TimezoneHelper::set_local_timezone( $date ); - return new ActionScheduler_LogEntry( $comment->comment_post_ID, $comment->comment_content, $date ); - } - - /** - * @param string $action_id - * - * @return ActionScheduler_LogEntry[] - */ - public function get_logs( $action_id ) { - $status = 'all'; - if ( get_post_status($action_id) == 'trash' ) { - $status = 'post-trashed'; - } - $comments = get_comments(array( - 'post_id' => $action_id, - 'orderby' => 'comment_date_gmt', - 'order' => 'ASC', - 'type' => self::TYPE, - 'status' => $status, - )); - $logs = array(); - foreach ( $comments as $c ) { - $entry = $this->get_entry( $c ); - if ( !empty($entry) ) { - $logs[] = $entry; - } - } - return $logs; - } - - protected function get_comment( $comment_id ) { - return get_comment( $comment_id ); - } - - - - /** - * @param WP_Comment_Query $query - */ - public function filter_comment_queries( $query ) { - foreach ( array('ID', 'parent', 'post_author', 'post_name', 'post_parent', 'type', 'post_type', 'post_id', 'post_ID') as $key ) { - if ( !empty($query->query_vars[$key]) ) { - return; // don't slow down queries that wouldn't include action_log comments anyway - } - } - $query->query_vars['action_log_filter'] = TRUE; - add_filter( 'comments_clauses', array( $this, 'filter_comment_query_clauses' ), 10, 2 ); - } - - /** - * @param array $clauses - * @param WP_Comment_Query $query - * - * @return array - */ - public function filter_comment_query_clauses( $clauses, $query ) { - if ( !empty($query->query_vars['action_log_filter']) ) { - $clauses['where'] .= $this->get_where_clause(); - } - return $clauses; - } - - /** - * Make sure Action Scheduler logs are excluded from comment feeds, which use WP_Query, not - * the WP_Comment_Query class handled by @see self::filter_comment_queries(). - * - * @param string $where - * @param WP_Query $query - * - * @return string - */ - public function filter_comment_feed( $where, $query ) { - if ( is_comment_feed() ) { - $where .= $this->get_where_clause(); - } - return $where; - } - - /** - * Return a SQL clause to exclude Action Scheduler comments. - * - * @return string - */ - protected function get_where_clause() { - global $wpdb; - return sprintf( " AND {$wpdb->comments}.comment_type != '%s'", self::TYPE ); - } - - /** - * Remove action log entries from wp_count_comments() - * - * @param array $stats - * @param int $post_id - * - * @return object - */ - public function filter_comment_count( $stats, $post_id ) { - global $wpdb; - - if ( 0 === $post_id ) { - $stats = $this->get_comment_count(); - } - - return $stats; - } - - /** - * Retrieve the comment counts from our cache, or the database if the cached version isn't set. - * - * @return object - */ - protected function get_comment_count() { - global $wpdb; - - $stats = get_transient( 'as_comment_count' ); - - if ( ! $stats ) { - $stats = array(); - - $count = $wpdb->get_results( "SELECT comment_approved, COUNT( * ) AS num_comments FROM {$wpdb->comments} WHERE comment_type NOT IN('order_note','action_log') GROUP BY comment_approved", ARRAY_A ); - - $total = 0; - $stats = array(); - $approved = array( '0' => 'moderated', '1' => 'approved', 'spam' => 'spam', 'trash' => 'trash', 'post-trashed' => 'post-trashed' ); - - foreach ( (array) $count as $row ) { - // Don't count post-trashed toward totals - if ( 'post-trashed' != $row['comment_approved'] && 'trash' != $row['comment_approved'] ) { - $total += $row['num_comments']; - } - if ( isset( $approved[ $row['comment_approved'] ] ) ) { - $stats[ $approved[ $row['comment_approved'] ] ] = $row['num_comments']; - } - } - - $stats['total_comments'] = $total; - $stats['all'] = $total; - - foreach ( $approved as $key ) { - if ( empty( $stats[ $key ] ) ) { - $stats[ $key ] = 0; - } - } - - $stats = (object) $stats; - set_transient( 'as_comment_count', $stats ); - } - - return $stats; - } - - /** - * Delete comment count cache whenever there is new comment or the status of a comment changes. Cache - * will be regenerated next time ActionScheduler_wpCommentLogger::filter_comment_count() is called. - */ - public function delete_comment_count_cache() { - delete_transient( 'as_comment_count' ); - } - - /** - * @codeCoverageIgnore - */ - public function init() { - add_action( 'action_scheduler_before_process_queue', array( $this, 'disable_comment_counting' ), 10, 0 ); - add_action( 'action_scheduler_after_process_queue', array( $this, 'enable_comment_counting' ), 10, 0 ); - - parent::init(); - - add_action( 'pre_get_comments', array( $this, 'filter_comment_queries' ), 10, 1 ); - add_action( 'wp_count_comments', array( $this, 'filter_comment_count' ), 20, 2 ); // run after WC_Comments::wp_count_comments() to make sure we exclude order notes and action logs - add_action( 'comment_feed_where', array( $this, 'filter_comment_feed' ), 10, 2 ); - - // Delete comments count cache whenever there is a new comment or a comment status changes - add_action( 'wp_insert_comment', array( $this, 'delete_comment_count_cache' ) ); - add_action( 'wp_set_comment_status', array( $this, 'delete_comment_count_cache' ) ); - } - - public function disable_comment_counting() { - wp_defer_comment_counting(true); - } - public function enable_comment_counting() { - wp_defer_comment_counting(false); - } - -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php deleted file mode 100644 index 56a70dd2..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php +++ /dev/null @@ -1,1067 +0,0 @@ -validate_action( $action ); - $post_array = $this->create_post_array( $action, $scheduled_date ); - $post_id = $this->save_post_array( $post_array ); - $this->save_post_schedule( $post_id, $action->get_schedule() ); - $this->save_action_group( $post_id, $action->get_group() ); - do_action( 'action_scheduler_stored_action', $post_id ); - return $post_id; - } catch ( Exception $e ) { - /* translators: %s: action error message */ - throw new RuntimeException( sprintf( __( 'Error saving action: %s', 'action-scheduler' ), $e->getMessage() ), 0 ); - } - } - - /** - * Create post array. - * - * @param ActionScheduler_Action $action Scheduled Action. - * @param DateTime $scheduled_date Scheduled Date. - * - * @return array Returns an array of post data. - */ - protected function create_post_array( ActionScheduler_Action $action, DateTime $scheduled_date = null ) { - $post = array( - 'post_type' => self::POST_TYPE, - 'post_title' => $action->get_hook(), - 'post_content' => wp_json_encode( $action->get_args() ), - 'post_status' => ( $action->is_finished() ? 'publish' : 'pending' ), - 'post_date_gmt' => $this->get_scheduled_date_string( $action, $scheduled_date ), - 'post_date' => $this->get_scheduled_date_string_local( $action, $scheduled_date ), - ); - return $post; - } - - /** - * Save post array. - * - * @param array $post_array Post array. - * @return int Returns the post ID. - * @throws RuntimeException Throws an exception if the action could not be saved. - */ - protected function save_post_array( $post_array ) { - add_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10, 1 ); - add_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10, 5 ); - - $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(); - } - - $post_id = wp_insert_post( $post_array ); - - if ( $has_kses ) { - kses_init_filters(); - } - - remove_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10 ); - remove_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10 ); - - if ( is_wp_error( $post_id ) || empty( $post_id ) ) { - throw new RuntimeException( __( 'Unable to save action.', 'action-scheduler' ) ); - } - return $post_id; - } - - /** - * Filter insert post data. - * - * @param array $postdata Post data to filter. - * - * @return array - */ - public function filter_insert_post_data( $postdata ) { - if ( self::POST_TYPE === $postdata['post_type'] ) { - $postdata['post_author'] = 0; - if ( 'future' === $postdata['post_status'] ) { - $postdata['post_status'] = 'publish'; - } - } - return $postdata; - } - - /** - * Create a (probably unique) post name for scheduled actions in a more performant manner than wp_unique_post_slug(). - * - * When an action's post status is transitioned to something other than 'draft', 'pending' or 'auto-draft, like 'publish' - * or 'failed' or 'trash', WordPress will find a unique slug (stored in post_name column) using the wp_unique_post_slug() - * function. This is done to ensure URL uniqueness. The approach taken by wp_unique_post_slug() is to iterate over existing - * post_name values that match, and append a number 1 greater than the largest. This makes sense when manually creating a - * post from the Edit Post screen. It becomes a bottleneck when automatically processing thousands of actions, with a - * database containing thousands of related post_name values. - * - * WordPress 5.1 introduces the 'pre_wp_unique_post_slug' filter for plugins to address this issue. - * - * We can short-circuit WordPress's wp_unique_post_slug() approach using the 'pre_wp_unique_post_slug' filter. This - * method is available to be used as a callback on that filter. It provides a more scalable approach to generating a - * post_name/slug that is probably unique. Because Action Scheduler never actually uses the post_name field, or an - * action's slug, being probably unique is good enough. - * - * For more backstory on this issue, see: - * - https://github.com/woocommerce/action-scheduler/issues/44 and - * - https://core.trac.wordpress.org/ticket/21112 - * - * @param string $override_slug Short-circuit return value. - * @param string $slug The desired slug (post_name). - * @param int $post_ID Post ID. - * @param string $post_status The post status. - * @param string $post_type Post type. - * @return string - */ - public function set_unique_post_slug( $override_slug, $slug, $post_ID, $post_status, $post_type ) { - if ( self::POST_TYPE === $post_type ) { - $override_slug = uniqid( self::POST_TYPE . '-', true ) . '-' . wp_generate_password( 32, false ); - } - return $override_slug; - } - - /** - * Save post schedule. - * - * @param int $post_id Post ID of the scheduled action. - * @param string $schedule Schedule to save. - * - * @return void - */ - protected function save_post_schedule( $post_id, $schedule ) { - update_post_meta( $post_id, self::SCHEDULE_META_KEY, $schedule ); - } - - /** - * Save action group. - * - * @param int $post_id Post ID. - * @param string $group Group to save. - * @return void - */ - protected function save_action_group( $post_id, $group ) { - if ( empty( $group ) ) { - wp_set_object_terms( $post_id, array(), self::GROUP_TAXONOMY, false ); - } else { - wp_set_object_terms( $post_id, array( $group ), self::GROUP_TAXONOMY, false ); - } - } - - /** - * Fetch actions. - * - * @param int $action_id Action ID. - * @return object - */ - public function fetch_action( $action_id ) { - $post = $this->get_post( $action_id ); - if ( empty( $post ) || self::POST_TYPE !== $post->post_type ) { - return $this->get_null_action(); - } - - try { - $action = $this->make_action_from_post( $post ); - } catch ( ActionScheduler_InvalidActionException $exception ) { - do_action( 'action_scheduler_failed_fetch_action', $post->ID, $exception ); - return $this->get_null_action(); - } - - return $action; - } - - /** - * Get post. - * - * @param string $action_id - Action ID. - * @return WP_Post|null - */ - protected function get_post( $action_id ) { - if ( empty( $action_id ) ) { - return null; - } - return get_post( $action_id ); - } - - /** - * Get NULL action. - * - * @return ActionScheduler_NullAction - */ - protected function get_null_action() { - return new ActionScheduler_NullAction(); - } - - /** - * Make action from post. - * - * @param WP_Post $post Post object. - * @return WP_Post - */ - protected function make_action_from_post( $post ) { - $hook = $post->post_title; - - $args = json_decode( $post->post_content, true ); - $this->validate_args( $args, $post->ID ); - - $schedule = get_post_meta( $post->ID, self::SCHEDULE_META_KEY, true ); - $this->validate_schedule( $schedule, $post->ID ); - - $group = wp_get_object_terms( $post->ID, self::GROUP_TAXONOMY, array( 'fields' => 'names' ) ); - $group = empty( $group ) ? '' : reset( $group ); - - return ActionScheduler::factory()->get_stored_action( $this->get_action_status_by_post_status( $post->post_status ), $hook, $args, $schedule, $group ); - } - - /** - * Get action status by post status. - * - * @param string $post_status Post status. - * - * @throws InvalidArgumentException Throw InvalidArgumentException if $post_status not in known status fields returned by $this->get_status_labels(). - * @return string - */ - protected function get_action_status_by_post_status( $post_status ) { - - switch ( $post_status ) { - case 'publish': - $action_status = self::STATUS_COMPLETE; - break; - case 'trash': - $action_status = self::STATUS_CANCELED; - break; - default: - if ( ! array_key_exists( $post_status, $this->get_status_labels() ) ) { - throw new InvalidArgumentException( sprintf( 'Invalid post status: "%s". No matching action status available.', $post_status ) ); - } - $action_status = $post_status; - break; - } - - return $action_status; - } - - /** - * Get post status by action status. - * - * @param string $action_status Action status. - * - * @throws InvalidArgumentException Throws InvalidArgumentException if $post_status not in known status fields returned by $this->get_status_labels(). - * @return string - */ - protected function get_post_status_by_action_status( $action_status ) { - - switch ( $action_status ) { - case self::STATUS_COMPLETE: - $post_status = 'publish'; - break; - case self::STATUS_CANCELED: - $post_status = 'trash'; - break; - default: - if ( ! array_key_exists( $action_status, $this->get_status_labels() ) ) { - throw new InvalidArgumentException( sprintf( 'Invalid action status: "%s".', $action_status ) ); - } - $post_status = $action_status; - break; - } - - return $post_status; - } - - /** - * Returns the SQL statement to query (or count) actions. - * - * @param array $query - Filtering options. - * @param string $select_or_count - Whether the SQL should select and return the IDs or just the row count. - * - * @throws InvalidArgumentException - Throw InvalidArgumentException if $select_or_count not count or select. - * @return string SQL statement. The returned SQL is already properly escaped. - */ - protected function get_query_actions_sql( array $query, $select_or_count = 'select' ) { - - if ( ! in_array( $select_or_count, array( 'select', 'count' ), true ) ) { - throw new InvalidArgumentException( __( 'Invalid schedule. Cannot save action.', 'action-scheduler' ) ); - } - - $query = wp_parse_args( - $query, - array( - 'hook' => '', - 'args' => null, - 'date' => null, - 'date_compare' => '<=', - 'modified' => null, - 'modified_compare' => '<=', - 'group' => '', - 'status' => '', - 'claimed' => null, - 'per_page' => 5, - 'offset' => 0, - 'orderby' => 'date', - 'order' => 'ASC', - 'search' => '', - ) - ); - - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - $sql = ( 'count' === $select_or_count ) ? 'SELECT count(p.ID)' : 'SELECT p.ID '; - $sql .= "FROM {$wpdb->posts} p"; - $sql_params = array(); - if ( empty( $query['group'] ) && 'group' === $query['orderby'] ) { - $sql .= " LEFT JOIN {$wpdb->term_relationships} tr ON tr.object_id=p.ID"; - $sql .= " LEFT JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id=tt.term_taxonomy_id"; - $sql .= " LEFT JOIN {$wpdb->terms} t ON tt.term_id=t.term_id"; - } elseif ( ! empty( $query['group'] ) ) { - $sql .= " INNER JOIN {$wpdb->term_relationships} tr ON tr.object_id=p.ID"; - $sql .= " INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id=tt.term_taxonomy_id"; - $sql .= " INNER JOIN {$wpdb->terms} t ON tt.term_id=t.term_id"; - $sql .= ' AND t.slug=%s'; - $sql_params[] = $query['group']; - } - $sql .= ' WHERE post_type=%s'; - $sql_params[] = self::POST_TYPE; - if ( $query['hook'] ) { - $sql .= ' AND p.post_title=%s'; - $sql_params[] = $query['hook']; - } - if ( ! is_null( $query['args'] ) ) { - $sql .= ' AND p.post_content=%s'; - $sql_params[] = wp_json_encode( $query['args'] ); - } - - if ( $query['status'] ) { - $post_statuses = array_map( array( $this, 'get_post_status_by_action_status' ), (array) $query['status'] ); - $placeholders = array_fill( 0, count( $post_statuses ), '%s' ); - $sql .= ' AND p.post_status IN (' . join( ', ', $placeholders ) . ')'; - $sql_params = array_merge( $sql_params, array_values( $post_statuses ) ); - } - - if ( $query['date'] instanceof DateTime ) { - $date = clone $query['date']; - $date->setTimezone( new DateTimeZone( 'UTC' ) ); - $date_string = $date->format( 'Y-m-d H:i:s' ); - $comparator = $this->validate_sql_comparator( $query['date_compare'] ); - $sql .= " AND p.post_date_gmt $comparator %s"; - $sql_params[] = $date_string; - } - - if ( $query['modified'] instanceof DateTime ) { - $modified = clone $query['modified']; - $modified->setTimezone( new DateTimeZone( 'UTC' ) ); - $date_string = $modified->format( 'Y-m-d H:i:s' ); - $comparator = $this->validate_sql_comparator( $query['modified_compare'] ); - $sql .= " AND p.post_modified_gmt $comparator %s"; - $sql_params[] = $date_string; - } - - if ( true === $query['claimed'] ) { - $sql .= " AND p.post_password != ''"; - } elseif ( false === $query['claimed'] ) { - $sql .= " AND p.post_password = ''"; - } elseif ( ! is_null( $query['claimed'] ) ) { - $sql .= ' AND p.post_password = %s'; - $sql_params[] = $query['claimed']; - } - - if ( ! empty( $query['search'] ) ) { - $sql .= ' AND (p.post_title LIKE %s OR p.post_content LIKE %s OR p.post_password LIKE %s)'; - for ( $i = 0; $i < 3; $i++ ) { - $sql_params[] = sprintf( '%%%s%%', $query['search'] ); - } - } - - if ( 'select' === $select_or_count ) { - switch ( $query['orderby'] ) { - case 'hook': - $orderby = 'p.post_title'; - break; - case 'group': - $orderby = 't.name'; - break; - case 'status': - $orderby = 'p.post_status'; - break; - case 'modified': - $orderby = 'p.post_modified'; - break; - case 'claim_id': - $orderby = 'p.post_password'; - break; - case 'schedule': - case 'date': - default: - $orderby = 'p.post_date_gmt'; - break; - } - if ( 'ASC' === strtoupper( $query['order'] ) ) { - $order = 'ASC'; - } else { - $order = 'DESC'; - } - $sql .= " ORDER BY $orderby $order"; - if ( $query['per_page'] > 0 ) { - $sql .= ' LIMIT %d, %d'; - $sql_params[] = $query['offset']; - $sql_params[] = $query['per_page']; - } - } - - return $wpdb->prepare( $sql, $sql_params ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - - /** - * Query for action count or list of action IDs. - * - * @since x.x.x $query['status'] accepts array of statuses instead of a single status. - * - * @see ActionScheduler_Store::query_actions for $query arg usage. - * - * @param array $query Query filtering options. - * @param string $query_type Whether to select or count the results. Defaults to select. - * - * @return string|array|null The IDs of actions matching the query. Null on failure. - */ - public function query_actions( $query = array(), $query_type = 'select' ) { - /** - * Global $wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - $sql = $this->get_query_actions_sql( $query, $query_type ); - - return ( 'count' === $query_type ) ? $wpdb->get_var( $sql ) : $wpdb->get_col( $sql ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.PreparedSQL.NotPrepared - } - - /** - * Get a count of all actions in the store, grouped by status - * - * @return array - */ - public function action_counts() { - - $action_counts_by_status = array(); - $action_stati_and_labels = $this->get_status_labels(); - $posts_count_by_status = (array) wp_count_posts( self::POST_TYPE, 'readable' ); - - foreach ( $posts_count_by_status as $post_status_name => $count ) { - - try { - $action_status_name = $this->get_action_status_by_post_status( $post_status_name ); - } catch ( Exception $e ) { - // Ignore any post statuses that aren't for actions. - continue; - } - if ( array_key_exists( $action_status_name, $action_stati_and_labels ) ) { - $action_counts_by_status[ $action_status_name ] = $count; - } - } - - return $action_counts_by_status; - } - - /** - * Cancel action. - * - * @param int $action_id Action ID. - * - * @throws InvalidArgumentException If $action_id is not identified. - */ - public function cancel_action( $action_id ) { - $post = get_post( $action_id ); - if ( empty( $post ) || ( self::POST_TYPE !== $post->post_type ) ) { - /* translators: %s is the action ID */ - throw new InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); - } - do_action( 'action_scheduler_canceled_action', $action_id ); - add_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10, 5 ); - wp_trash_post( $action_id ); - remove_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10 ); - } - - /** - * Delete action. - * - * @param int $action_id Action ID. - * @return void - * @throws InvalidArgumentException If action is not identified. - */ - public function delete_action( $action_id ) { - $post = get_post( $action_id ); - if ( empty( $post ) || ( self::POST_TYPE !== $post->post_type ) ) { - /* translators: %s is the action ID */ - throw new InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); - } - do_action( 'action_scheduler_deleted_action', $action_id ); - - wp_delete_post( $action_id, true ); - } - - /** - * Get date for claim id. - * - * @param int $action_id Action ID. - * @return ActionScheduler_DateTime The date the action is schedule to run, or the date that it ran. - */ - public function get_date( $action_id ) { - $next = $this->get_date_gmt( $action_id ); - return ActionScheduler_TimezoneHelper::set_local_timezone( $next ); - } - - /** - * Get Date GMT. - * - * @param int $action_id Action ID. - * - * @throws InvalidArgumentException If $action_id is not identified. - * @return ActionScheduler_DateTime The date the action is schedule to run, or the date that it ran. - */ - public function get_date_gmt( $action_id ) { - $post = get_post( $action_id ); - if ( empty( $post ) || ( self::POST_TYPE !== $post->post_type ) ) { - /* translators: %s is the action ID */ - throw new InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); - } - if ( 'publish' === $post->post_status ) { - return as_get_datetime_object( $post->post_modified_gmt ); - } else { - return as_get_datetime_object( $post->post_date_gmt ); - } - } - - /** - * Stake claim. - * - * @param int $max_actions Maximum number of actions. - * @param DateTime $before_date Jobs must be schedule before this date. Defaults to now. - * @param array $hooks Claim only actions with a hook or hooks. - * @param string $group Claim only actions in the given group. - * - * @return ActionScheduler_ActionClaim - * @throws RuntimeException When there is an error staking a claim. - * @throws InvalidArgumentException When the given group is not valid. - */ - public function stake_claim( $max_actions = 10, DateTime $before_date = null, $hooks = array(), $group = '' ) { - $this->claim_before_date = $before_date; - $claim_id = $this->generate_claim_id(); - $this->claim_actions( $claim_id, $max_actions, $before_date, $hooks, $group ); - $action_ids = $this->find_actions_by_claim_id( $claim_id ); - $this->claim_before_date = null; - - return new ActionScheduler_ActionClaim( $claim_id, $action_ids ); - } - - /** - * Get claim count. - * - * @return int - */ - public function get_claim_count() { - global $wpdb; - - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching - return $wpdb->get_var( - $wpdb->prepare( - "SELECT COUNT(DISTINCT post_password) FROM {$wpdb->posts} WHERE post_password != '' AND post_type = %s AND post_status IN ('in-progress','pending')", - array( self::POST_TYPE ) - ) - ); - } - - /** - * Generate claim id. - * - * @return string - */ - protected function generate_claim_id() { - $claim_id = md5( microtime( true ) . wp_rand( 0, 1000 ) ); - return substr( $claim_id, 0, 20 ); // to fit in db field with 20 char limit. - } - - /** - * Claim actions. - * - * @param string $claim_id Claim ID. - * @param int $limit Limit. - * @param DateTime $before_date Should use UTC timezone. - * @param array $hooks Claim only actions with a hook or hooks. - * @param string $group Claim only actions in the given group. - * - * @return int The number of actions that were claimed. - * @throws RuntimeException When there is a database error. - */ - protected function claim_actions( $claim_id, $limit, DateTime $before_date = null, $hooks = array(), $group = '' ) { - // Set up initial variables. - $date = null === $before_date ? as_get_datetime_object() : clone $before_date; - $limit_ids = ! empty( $group ); - $ids = $limit_ids ? $this->get_actions_by_group( $group, $limit, $date ) : array(); - - // If limiting by IDs and no posts found, then return early since we have nothing to update. - if ( $limit_ids && 0 === count( $ids ) ) { - return 0; - } - - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - /* - * Build up custom query to update the affected posts. Parameters are built as a separate array - * to make it easier to identify where they are in the query. - * - * We can't use $wpdb->update() here because of the "ID IN ..." clause. - */ - $update = "UPDATE {$wpdb->posts} SET post_password = %s, post_modified_gmt = %s, post_modified = %s"; - $params = array( - $claim_id, - current_time( 'mysql', true ), - current_time( 'mysql' ), - ); - - // Build initial WHERE clause. - $where = "WHERE post_type = %s AND post_status = %s AND post_password = ''"; - $params[] = self::POST_TYPE; - $params[] = ActionScheduler_Store::STATUS_PENDING; - - if ( ! empty( $hooks ) ) { - $placeholders = array_fill( 0, count( $hooks ), '%s' ); - $where .= ' AND post_title IN (' . join( ', ', $placeholders ) . ')'; - $params = array_merge( $params, array_values( $hooks ) ); - } - - /* - * Add the IDs to the WHERE clause. IDs not escaped because they came directly from a prior DB query. - * - * If we're not limiting by IDs, then include the post_date_gmt clause. - */ - if ( $limit_ids ) { - $where .= ' AND ID IN (' . join( ',', $ids ) . ')'; - } else { - $where .= ' AND post_date_gmt <= %s'; - $params[] = $date->format( 'Y-m-d H:i:s' ); - } - - // Add the ORDER BY clause and,ms limit. - $order = 'ORDER BY menu_order ASC, post_date_gmt ASC, ID ASC LIMIT %d'; - $params[] = $limit; - - // Run the query and gather results. - $rows_affected = $wpdb->query( $wpdb->prepare( "{$update} {$where} {$order}", $params ) ); // phpcs:ignore // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare - - if ( false === $rows_affected ) { - throw new RuntimeException( __( 'Unable to claim actions. Database error.', 'action-scheduler' ) ); - } - - return (int) $rows_affected; - } - - /** - * Get IDs of actions within a certain group and up to a certain date/time. - * - * @param string $group The group to use in finding actions. - * @param int $limit The number of actions to retrieve. - * @param DateTime $date DateTime object representing cutoff time for actions. Actions retrieved will be - * up to and including this DateTime. - * - * @return array IDs of actions in the appropriate group and before the appropriate time. - * @throws InvalidArgumentException When the group does not exist. - */ - protected function get_actions_by_group( $group, $limit, DateTime $date ) { - // Ensure the group exists before continuing. - if ( ! term_exists( $group, self::GROUP_TAXONOMY ) ) { - /* translators: %s is the group name */ - throw new InvalidArgumentException( sprintf( __( 'The group "%s" does not exist.', 'action-scheduler' ), $group ) ); - } - - // Set up a query for post IDs to use later. - $query = new WP_Query(); - $query_args = array( - 'fields' => 'ids', - 'post_type' => self::POST_TYPE, - 'post_status' => ActionScheduler_Store::STATUS_PENDING, - 'has_password' => false, - 'posts_per_page' => $limit * 3, - 'suppress_filters' => true, - 'no_found_rows' => true, - 'orderby' => array( - 'menu_order' => 'ASC', - 'date' => 'ASC', - 'ID' => 'ASC', - ), - 'date_query' => array( - 'column' => 'post_date_gmt', - 'before' => $date->format( 'Y-m-d H:i' ), - 'inclusive' => true, - ), - 'tax_query' => array( // phpcs:ignore WordPress.DB.SlowDBQuery - array( - 'taxonomy' => self::GROUP_TAXONOMY, - 'field' => 'slug', - 'terms' => $group, - 'include_children' => false, - ), - ), - ); - - return $query->query( $query_args ); - } - - /** - * Find actions by claim ID. - * - * @param string $claim_id Claim ID. - * @return array - */ - public function find_actions_by_claim_id( $claim_id ) { - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - $action_ids = array(); - $before_date = isset( $this->claim_before_date ) ? $this->claim_before_date : as_get_datetime_object(); - $cut_off = $before_date->format( 'Y-m-d H:i:s' ); - - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - $results = $wpdb->get_results( - $wpdb->prepare( - "SELECT ID, post_date_gmt FROM {$wpdb->posts} WHERE post_type = %s AND post_password = %s", - array( - self::POST_TYPE, - $claim_id, - ) - ) - ); - - // Verify that the scheduled date for each action is within the expected bounds (in some unusual - // cases, we cannot depend on MySQL to honor all of the WHERE conditions we specify). - foreach ( $results as $claimed_action ) { - if ( $claimed_action->post_date_gmt <= $cut_off ) { - $action_ids[] = absint( $claimed_action->ID ); - } - } - - return $action_ids; - } - - /** - * Release claim. - * - * @param ActionScheduler_ActionClaim $claim Claim object to release. - * @return void - * @throws RuntimeException When the claim is not unlocked. - */ - public function release_claim( ActionScheduler_ActionClaim $claim ) { - $action_ids = $this->find_actions_by_claim_id( $claim->get_id() ); - if ( empty( $action_ids ) ) { - return; // nothing to do. - } - $action_id_string = implode( ',', array_map( 'intval', $action_ids ) ); - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - $result = $wpdb->query( - $wpdb->prepare( - "UPDATE {$wpdb->posts} SET post_password = '' WHERE ID IN ($action_id_string) AND post_password = %s", //phpcs:ignore - array( - $claim->get_id(), - ) - ) - ); - if ( false === $result ) { - /* translators: %s: claim ID */ - throw new RuntimeException( sprintf( __( 'Unable to unlock claim %s. Database error.', 'action-scheduler' ), $claim->get_id() ) ); - } - } - - /** - * Unclaim action. - * - * @param string $action_id Action ID. - * @throws RuntimeException When unable to unlock claim on action ID. - */ - public function unclaim_action( $action_id ) { - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - $result = $wpdb->query( - $wpdb->prepare( - "UPDATE {$wpdb->posts} SET post_password = '' WHERE ID = %d AND post_type = %s", - $action_id, - self::POST_TYPE - ) - ); - if ( false === $result ) { - /* translators: %s: action ID */ - throw new RuntimeException( sprintf( __( 'Unable to unlock claim on action %s. Database error.', 'action-scheduler' ), $action_id ) ); - } - } - - /** - * Mark failure on action. - * - * @param int $action_id Action ID. - * - * @return void - * @throws RuntimeException When unable to mark failure on action ID. - */ - public function mark_failure( $action_id ) { - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - $result = $wpdb->query( - $wpdb->prepare( "UPDATE {$wpdb->posts} SET post_status = %s WHERE ID = %d AND post_type = %s", self::STATUS_FAILED, $action_id, self::POST_TYPE ) - ); - if ( false === $result ) { - /* translators: %s: action ID */ - throw new RuntimeException( sprintf( __( 'Unable to mark failure on action %s. Database error.', 'action-scheduler' ), $action_id ) ); - } - } - - /** - * Return an action's claim ID, as stored in the post password column - * - * @param int $action_id Action ID. - * @return mixed - */ - public function get_claim_id( $action_id ) { - return $this->get_post_column( $action_id, 'post_password' ); - } - - /** - * Return an action's status, as stored in the post status column - * - * @param int $action_id Action ID. - * - * @return mixed - * @throws InvalidArgumentException When the action ID is invalid. - */ - public function get_status( $action_id ) { - $status = $this->get_post_column( $action_id, 'post_status' ); - - if ( null === $status ) { - throw new InvalidArgumentException( __( 'Invalid action ID. No status found.', 'action-scheduler' ) ); - } - - return $this->get_action_status_by_post_status( $status ); - } - - /** - * Get post column - * - * @param string $action_id Action ID. - * @param string $column_name Column Name. - * - * @return string|null - */ - private function get_post_column( $action_id, $column_name ) { - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - return $wpdb->get_var( - $wpdb->prepare( - "SELECT {$column_name} FROM {$wpdb->posts} WHERE ID=%d AND post_type=%s", // phpcs:ignore - $action_id, - self::POST_TYPE - ) - ); - } - - /** - * Log Execution. - * - * @param string $action_id Action ID. - */ - public function log_execution( $action_id ) { - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - $wpdb->query( - $wpdb->prepare( - "UPDATE {$wpdb->posts} SET menu_order = menu_order+1, post_status=%s, post_modified_gmt = %s, post_modified = %s WHERE ID = %d AND post_type = %s", - self::STATUS_RUNNING, - current_time( 'mysql', true ), - current_time( 'mysql' ), - $action_id, - self::POST_TYPE - ) - ); - } - - /** - * Record that an action was completed. - * - * @param string $action_id ID of the completed action. - * - * @throws InvalidArgumentException When the action ID is invalid. - * @throws RuntimeException When there was an error executing the action. - */ - public function mark_complete( $action_id ) { - $post = get_post( $action_id ); - if ( empty( $post ) || ( self::POST_TYPE !== $post->post_type ) ) { - /* translators: %s is the action ID */ - throw new InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); - } - add_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10, 1 ); - add_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10, 5 ); - $result = wp_update_post( - array( - 'ID' => $action_id, - 'post_status' => 'publish', - ), - true - ); - remove_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10 ); - remove_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10 ); - if ( is_wp_error( $result ) ) { - throw new RuntimeException( $result->get_error_message() ); - } - } - - /** - * Mark action as migrated when there is an error deleting the action. - * - * @param int $action_id Action ID. - */ - public function mark_migrated( $action_id ) { - wp_update_post( - array( - 'ID' => $action_id, - 'post_status' => 'migrated', - ) - ); - } - - /** - * Determine whether the post store can be migrated. - * - * @param [type] $setting - Setting value. - * @return bool - */ - public function migration_dependencies_met( $setting ) { - global $wpdb; - - $dependencies_met = get_transient( self::DEPENDENCIES_MET ); - if ( empty( $dependencies_met ) ) { - $maximum_args_length = apply_filters( 'action_scheduler_maximum_args_length', 191 ); - $found_action = $wpdb->get_var( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - $wpdb->prepare( - "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND CHAR_LENGTH(post_content) > %d LIMIT 1", - $maximum_args_length, - self::POST_TYPE - ) - ); - $dependencies_met = $found_action ? 'no' : 'yes'; - set_transient( self::DEPENDENCIES_MET, $dependencies_met, DAY_IN_SECONDS ); - } - - return 'yes' === $dependencies_met ? $setting : false; - } - - /** - * InnoDB indexes have a maximum size of 767 bytes by default, which is only 191 characters with utf8mb4. - * - * Previously, AS wasn't concerned about args length, as we used the (unindex) post_content column. However, - * as we prepare to move to custom tables, and can use an indexed VARCHAR column instead, we want to warn - * developers of this impending requirement. - * - * @param ActionScheduler_Action $action Action object. - */ - protected function validate_action( ActionScheduler_Action $action ) { - try { - parent::validate_action( $action ); - } catch ( Exception $e ) { - /* translators: %s is the error message */ - $message = sprintf( __( '%s Support for strings longer than this will be removed in a future version.', 'action-scheduler' ), $e->getMessage() ); - _doing_it_wrong( 'ActionScheduler_Action::$args', esc_html( $message ), '2.1.0' ); - } - } - - /** - * (@codeCoverageIgnore) - */ - public function init() { - add_filter( 'action_scheduler_migration_dependencies_met', array( $this, 'migration_dependencies_met' ) ); - - $post_type_registrar = new ActionScheduler_wpPostStore_PostTypeRegistrar(); - $post_type_registrar->register(); - - $post_status_registrar = new ActionScheduler_wpPostStore_PostStatusRegistrar(); - $post_status_registrar->register(); - - $taxonomy_registrar = new ActionScheduler_wpPostStore_TaxonomyRegistrar(); - $taxonomy_registrar->register(); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php deleted file mode 100644 index 5798ec16..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php +++ /dev/null @@ -1,59 +0,0 @@ -post_status_args(), $this->post_status_running_labels() ) ); - register_post_status( ActionScheduler_Store::STATUS_FAILED, array_merge( $this->post_status_args(), $this->post_status_failed_labels() ) ); - } - - /** - * Build the args array for the post type definition - * - * @return array - */ - protected function post_status_args() { - $args = array( - 'public' => false, - 'exclude_from_search' => false, - 'show_in_admin_all_list' => true, - 'show_in_admin_status_list' => true, - ); - - return apply_filters( 'action_scheduler_post_status_args', $args ); - } - - /** - * Build the args array for the post type definition - * - * @return array - */ - protected function post_status_failed_labels() { - $labels = array( - 'label' => _x( 'Failed', 'post', 'action-scheduler' ), - /* translators: %s: count */ - 'label_count' => _n_noop( 'Failed (%s)', 'Failed (%s)', 'action-scheduler' ), - ); - - return apply_filters( 'action_scheduler_post_status_failed_labels', $labels ); - } - - /** - * Build the args array for the post type definition - * - * @return array - */ - protected function post_status_running_labels() { - $labels = array( - 'label' => _x( 'In-Progress', 'post', 'action-scheduler' ), - /* translators: %s: count */ - 'label_count' => _n_noop( 'In-Progress (%s)', 'In-Progress (%s)', 'action-scheduler' ), - ); - - return apply_filters( 'action_scheduler_post_status_running_labels', $labels ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php deleted file mode 100644 index 697e78b3..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php +++ /dev/null @@ -1,51 +0,0 @@ -post_type_args() ); - } - - /** - * Build the args array for the post type definition - * - * @return array - */ - protected function post_type_args() { - $args = array( - 'label' => __( 'Scheduled Actions', 'action-scheduler' ), - 'description' => __( 'Scheduled actions are hooks triggered on a cetain date and time.', 'action-scheduler' ), - 'public' => false, - 'map_meta_cap' => true, - 'hierarchical' => false, - 'supports' => array('title', 'editor','comments'), - 'rewrite' => false, - 'query_var' => false, - 'can_export' => true, - 'ep_mask' => EP_NONE, - 'labels' => array( - 'name' => __( 'Scheduled Actions', 'action-scheduler' ), - 'singular_name' => __( 'Scheduled Action', 'action-scheduler' ), - 'menu_name' => _x( 'Scheduled Actions', 'Admin menu name', 'action-scheduler' ), - 'add_new' => __( 'Add', 'action-scheduler' ), - 'add_new_item' => __( 'Add New Scheduled Action', 'action-scheduler' ), - 'edit' => __( 'Edit', 'action-scheduler' ), - 'edit_item' => __( 'Edit Scheduled Action', 'action-scheduler' ), - 'new_item' => __( 'New Scheduled Action', 'action-scheduler' ), - 'view' => __( 'View Action', 'action-scheduler' ), - 'view_item' => __( 'View Action', 'action-scheduler' ), - 'search_items' => __( 'Search Scheduled Actions', 'action-scheduler' ), - 'not_found' => __( 'No actions found', 'action-scheduler' ), - 'not_found_in_trash' => __( 'No actions found in trash', 'action-scheduler' ), - ), - ); - - $args = apply_filters('action_scheduler_post_type_args', $args); - return $args; - } -} - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_TaxonomyRegistrar.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_TaxonomyRegistrar.php deleted file mode 100644 index d76941ee..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_TaxonomyRegistrar.php +++ /dev/null @@ -1,27 +0,0 @@ -taxonomy_args() ); - } - - protected function taxonomy_args() { - $args = array( - 'label' => __( 'Action Group', 'action-scheduler' ), - 'public' => false, - 'hierarchical' => false, - 'show_admin_column' => true, - 'query_var' => false, - 'rewrite' => false, - ); - - $args = apply_filters( 'action_scheduler_taxonomy_args', $args ); - return $args; - } -} - \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/ActionMigrator.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/ActionMigrator.php deleted file mode 100644 index 282ab474..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/ActionMigrator.php +++ /dev/null @@ -1,110 +0,0 @@ -source = $source_store; - $this->destination = $destination_store; - $this->log_migrator = $log_migrator; - } - - /** - * Migrate an action. - * - * @param int $source_action_id Action ID. - * - * @return int 0|new action ID - */ - public function migrate( $source_action_id ) { - try { - $action = $this->source->fetch_action( $source_action_id ); - $status = $this->source->get_status( $source_action_id ); - } catch ( \Exception $e ) { - $action = null; - $status = ''; - } - - if ( is_null( $action ) || empty( $status ) || ! $action->get_schedule()->get_date() ) { - // null action or empty status means the fetch operation failed or the action didn't exist - // null schedule means it's missing vital data - // delete it and move on - try { - $this->source->delete_action( $source_action_id ); - } catch ( \Exception $e ) { - // nothing to do, it didn't exist in the first place - } - do_action( 'action_scheduler/no_action_to_migrate', $source_action_id, $this->source, $this->destination ); - - return 0; - } - - try { - - // Make sure the last attempt date is set correctly for completed and failed actions - $last_attempt_date = ( $status !== \ActionScheduler_Store::STATUS_PENDING ) ? $this->source->get_date( $source_action_id ) : null; - - $destination_action_id = $this->destination->save_action( $action, null, $last_attempt_date ); - } catch ( \Exception $e ) { - do_action( 'action_scheduler/migrate_action_failed', $source_action_id, $this->source, $this->destination ); - - return 0; // could not save the action in the new store - } - - try { - switch ( $status ) { - case \ActionScheduler_Store::STATUS_FAILED : - $this->destination->mark_failure( $destination_action_id ); - break; - case \ActionScheduler_Store::STATUS_CANCELED : - $this->destination->cancel_action( $destination_action_id ); - break; - } - - $this->log_migrator->migrate( $source_action_id, $destination_action_id ); - $this->source->delete_action( $source_action_id ); - - $test_action = $this->source->fetch_action( $source_action_id ); - if ( ! is_a( $test_action, 'ActionScheduler_NullAction' ) ) { - throw new \RuntimeException( sprintf( __( 'Unable to remove source migrated action %s', 'action-scheduler' ), $source_action_id ) ); - } - do_action( 'action_scheduler/migrated_action', $source_action_id, $destination_action_id, $this->source, $this->destination ); - - return $destination_action_id; - } catch ( \Exception $e ) { - // could not delete from the old store - $this->source->mark_migrated( $source_action_id ); - do_action( 'action_scheduler/migrate_action_incomplete', $source_action_id, $destination_action_id, $this->source, $this->destination ); - do_action( 'action_scheduler/migrated_action', $source_action_id, $destination_action_id, $this->source, $this->destination ); - - return $destination_action_id; - } - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php deleted file mode 100644 index 79fd68f0..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php +++ /dev/null @@ -1,48 +0,0 @@ - $this->get_scheduled_date_string( $action, $last_attempt_date ), - 'last_attempt_local' => $this->get_scheduled_date_string_local( $action, $last_attempt_date ), - ]; - - $wpdb->update( $wpdb->actionscheduler_actions, $data, array( 'action_id' => $action_id ), array( '%s', '%s' ), array( '%d' ) ); - } - - return $action_id; - } catch ( \Exception $e ) { - throw new \RuntimeException( sprintf( __( 'Error saving action: %s', 'action-scheduler' ), $e->getMessage() ), 0 ); - } - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/BatchFetcher.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/BatchFetcher.php deleted file mode 100644 index 7547bd49..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/BatchFetcher.php +++ /dev/null @@ -1,87 +0,0 @@ -store = $source_store; - } - - /** - * Retrieve a list of actions. - * - * @param int $count The number of actions to retrieve - * - * @return int[] A list of action IDs - */ - public function fetch( $count = 10 ) { - foreach ( $this->get_query_strategies( $count ) as $query ) { - $action_ids = $this->store->query_actions( $query ); - if ( ! empty( $action_ids ) ) { - return $action_ids; - } - } - - return []; - } - - /** - * Generate a list of prioritized of action search parameters. - * - * @param int $count Number of actions to find. - * - * @return array - */ - private function get_query_strategies( $count ) { - $now = as_get_datetime_object(); - $args = [ - 'date' => $now, - 'per_page' => $count, - 'offset' => 0, - 'orderby' => 'date', - 'order' => 'ASC', - ]; - - $priorities = [ - Store::STATUS_PENDING, - Store::STATUS_FAILED, - Store::STATUS_CANCELED, - Store::STATUS_COMPLETE, - Store::STATUS_RUNNING, - '', // any other unanticipated status - ]; - - foreach ( $priorities as $status ) { - yield wp_parse_args( [ - 'status' => $status, - 'date_compare' => '<=', - ], $args ); - yield wp_parse_args( [ - 'status' => $status, - 'date_compare' => '>=', - ], $args ); - } - } -} \ No newline at end of file diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/Config.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/Config.php deleted file mode 100644 index 4eb032c8..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/Config.php +++ /dev/null @@ -1,169 +0,0 @@ -source_store ) ) { - throw new \RuntimeException( __( 'Source store must be configured before running a migration', 'action-scheduler' ) ); - } - - return $this->source_store; - } - - /** - * Set the configured source store. - * - * @param ActionScheduler_Store $store Source store object. - */ - public function set_source_store( Store $store ) { - $this->source_store = $store; - } - - /** - * Get the configured source loger. - * - * @return ActionScheduler_Logger - */ - public function get_source_logger() { - if ( empty( $this->source_logger ) ) { - throw new \RuntimeException( __( 'Source logger must be configured before running a migration', 'action-scheduler' ) ); - } - - return $this->source_logger; - } - - /** - * Set the configured source logger. - * - * @param ActionScheduler_Logger $logger - */ - public function set_source_logger( Logger $logger ) { - $this->source_logger = $logger; - } - - /** - * Get the configured destination store. - * - * @return ActionScheduler_Store - */ - public function get_destination_store() { - if ( empty( $this->destination_store ) ) { - throw new \RuntimeException( __( 'Destination store must be configured before running a migration', 'action-scheduler' ) ); - } - - return $this->destination_store; - } - - /** - * Set the configured destination store. - * - * @param ActionScheduler_Store $store - */ - public function set_destination_store( Store $store ) { - $this->destination_store = $store; - } - - /** - * Get the configured destination logger. - * - * @return ActionScheduler_Logger - */ - public function get_destination_logger() { - if ( empty( $this->destination_logger ) ) { - throw new \RuntimeException( __( 'Destination logger must be configured before running a migration', 'action-scheduler' ) ); - } - - return $this->destination_logger; - } - - /** - * Set the configured destination logger. - * - * @param ActionScheduler_Logger $logger - */ - public function set_destination_logger( Logger $logger ) { - $this->destination_logger = $logger; - } - - /** - * Get flag indicating whether it's a dry run. - * - * @return bool - */ - public function get_dry_run() { - return $this->dry_run; - } - - /** - * Set flag indicating whether it's a dry run. - * - * @param bool $dry_run - */ - public function set_dry_run( $dry_run ) { - $this->dry_run = (bool) $dry_run; - } - - /** - * Get progress bar object. - * - * @return ActionScheduler\WPCLI\ProgressBar - */ - public function get_progress_bar() { - return $this->progress_bar; - } - - /** - * Set progress bar object. - * - * @param ActionScheduler\WPCLI\ProgressBar $progress_bar - */ - public function set_progress_bar( ProgressBar $progress_bar ) { - $this->progress_bar = $progress_bar; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/Controller.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/Controller.php deleted file mode 100644 index a71db94c..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/Controller.php +++ /dev/null @@ -1,227 +0,0 @@ -migration_scheduler = $migration_scheduler; - $this->store_classname = ''; - } - - /** - * Set the action store class name. - * - * @param string $class Classname of the store class. - * - * @return string - */ - public function get_store_class( $class ) { - if ( \ActionScheduler_DataController::is_migration_complete() ) { - return \ActionScheduler_DataController::DATASTORE_CLASS; - } elseif ( \ActionScheduler_Store::DEFAULT_CLASS !== $class ) { - $this->store_classname = $class; - return $class; - } else { - return 'ActionScheduler_HybridStore'; - } - } - - /** - * Set the action logger class name. - * - * @param string $class Classname of the logger class. - * - * @return string - */ - public function get_logger_class( $class ) { - \ActionScheduler_Store::instance(); - - if ( $this->has_custom_datastore() ) { - $this->logger_classname = $class; - return $class; - } else { - return \ActionScheduler_DataController::LOGGER_CLASS; - } - } - - /** - * Get flag indicating whether a custom datastore is in use. - * - * @return bool - */ - public function has_custom_datastore() { - return (bool) $this->store_classname; - } - - /** - * Set up the background migration process. - * - * @return void - */ - public function schedule_migration() { - $logging_tables = new ActionScheduler_LoggerSchema(); - $store_tables = new ActionScheduler_StoreSchema(); - - /* - * In some unusual cases, the expected tables may not have been created. In such cases - * we do not schedule a migration as doing so will lead to fatal error conditions. - * - * In such cases the user will likely visit the Tools > Scheduled Actions screen to - * investigate, and will see appropriate messaging (this step also triggers an attempt - * to rebuild any missing tables). - * - * @see https://github.com/woocommerce/action-scheduler/issues/653 - */ - if ( - ActionScheduler_DataController::is_migration_complete() - || $this->migration_scheduler->is_migration_scheduled() - || ! $store_tables->tables_exist() - || ! $logging_tables->tables_exist() - ) { - return; - } - - $this->migration_scheduler->schedule_migration(); - } - - /** - * Get the default migration config object - * - * @return ActionScheduler\Migration\Config - */ - public function get_migration_config_object() { - static $config = null; - - if ( ! $config ) { - $source_store = $this->store_classname ? new $this->store_classname() : new \ActionScheduler_wpPostStore(); - $source_logger = $this->logger_classname ? new $this->logger_classname() : new \ActionScheduler_wpCommentLogger(); - - $config = new Config(); - $config->set_source_store( $source_store ); - $config->set_source_logger( $source_logger ); - $config->set_destination_store( new \ActionScheduler_DBStoreMigrator() ); - $config->set_destination_logger( new \ActionScheduler_DBLogger() ); - - if ( defined( 'WP_CLI' ) && WP_CLI ) { - $config->set_progress_bar( new ProgressBar( '', 0 ) ); - } - } - - return apply_filters( 'action_scheduler/migration_config', $config ); - } - - /** - * Hook dashboard migration notice. - */ - public function hook_admin_notices() { - if ( ! $this->allow_migration() || \ActionScheduler_DataController::is_migration_complete() ) { - return; - } - add_action( 'admin_notices', array( $this, 'display_migration_notice' ), 10, 0 ); - } - - /** - * Show a dashboard notice that migration is in progress. - */ - public function display_migration_notice() { - printf( '

              %s

              ', esc_html__( 'Action Scheduler migration in progress. The list of scheduled actions may be incomplete.', 'action-scheduler' ) ); - } - - /** - * Add store classes. Hook migration. - */ - private function hook() { - add_filter( 'action_scheduler_store_class', array( $this, 'get_store_class' ), 100, 1 ); - add_filter( 'action_scheduler_logger_class', array( $this, 'get_logger_class' ), 100, 1 ); - add_action( 'init', array( $this, 'maybe_hook_migration' ) ); - add_action( 'wp_loaded', array( $this, 'schedule_migration' ) ); - - // Action Scheduler may be displayed as a Tools screen or WooCommerce > Status administration screen - add_action( 'load-tools_page_action-scheduler', array( $this, 'hook_admin_notices' ), 10, 0 ); - add_action( 'load-woocommerce_page_wc-status', array( $this, 'hook_admin_notices' ), 10, 0 ); - } - - /** - * Possibly hook the migration scheduler action. - * - * @author Jeremy Pry - */ - public function maybe_hook_migration() { - if ( ! $this->allow_migration() || \ActionScheduler_DataController::is_migration_complete() ) { - return; - } - - $this->migration_scheduler->hook(); - } - - /** - * Allow datastores to enable migration to AS tables. - */ - public function allow_migration() { - if ( ! \ActionScheduler_DataController::dependencies_met() ) { - return false; - } - - if ( null === $this->migrate_custom_store ) { - $this->migrate_custom_store = apply_filters( 'action_scheduler_migrate_data_store', false ); - } - - return ( ! $this->has_custom_datastore() ) || $this->migrate_custom_store; - } - - /** - * Proceed with the migration if the dependencies have been met. - */ - public static function init() { - if ( \ActionScheduler_DataController::dependencies_met() ) { - self::instance()->hook(); - } - } - - /** - * Singleton factory. - */ - public static function instance() { - if ( ! isset( self::$instance ) ) { - self::$instance = new static( new Scheduler() ); - } - - return self::$instance; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/DryRun_ActionMigrator.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/DryRun_ActionMigrator.php deleted file mode 100644 index bee36caa..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/DryRun_ActionMigrator.php +++ /dev/null @@ -1,29 +0,0 @@ -source = $source_logger; - $this->destination = $destination_Logger; - } - - /** - * Migrate an action log. - * - * @param int $source_action_id Source logger object. - * @param int $destination_action_id Destination logger object. - */ - public function migrate( $source_action_id, $destination_action_id ) { - $logs = $this->source->get_logs( $source_action_id ); - foreach ( $logs as $log ) { - if ( $log->get_action_id() == $source_action_id ) { - $this->destination->log( $destination_action_id, $log->get_message(), $log->get_date() ); - } - } - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/Runner.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/Runner.php deleted file mode 100644 index ae651835..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/Runner.php +++ /dev/null @@ -1,137 +0,0 @@ -source_store = $config->get_source_store(); - $this->destination_store = $config->get_destination_store(); - $this->source_logger = $config->get_source_logger(); - $this->destination_logger = $config->get_destination_logger(); - - $this->batch_fetcher = new BatchFetcher( $this->source_store ); - if ( $config->get_dry_run() ) { - $this->log_migrator = new DryRun_LogMigrator( $this->source_logger, $this->destination_logger ); - $this->action_migrator = new DryRun_ActionMigrator( $this->source_store, $this->destination_store, $this->log_migrator ); - } else { - $this->log_migrator = new LogMigrator( $this->source_logger, $this->destination_logger ); - $this->action_migrator = new ActionMigrator( $this->source_store, $this->destination_store, $this->log_migrator ); - } - - if ( defined( 'WP_CLI' ) && WP_CLI ) { - $this->progress_bar = $config->get_progress_bar(); - } - } - - /** - * Run migration batch. - * - * @param int $batch_size Optional batch size. Default 10. - * - * @return int Size of batch processed. - */ - public function run( $batch_size = 10 ) { - $batch = $this->batch_fetcher->fetch( $batch_size ); - $batch_size = count( $batch ); - - if ( ! $batch_size ) { - return 0; - } - - if ( $this->progress_bar ) { - /* translators: %d: amount of actions */ - $this->progress_bar->set_message( sprintf( _n( 'Migrating %d action', 'Migrating %d actions', $batch_size, 'action-scheduler' ), number_format_i18n( $batch_size ) ) ); - $this->progress_bar->set_count( $batch_size ); - } - - $this->migrate_actions( $batch ); - - return $batch_size; - } - - /** - * Migration a batch of actions. - * - * @param array $action_ids List of action IDs to migrate. - */ - public function migrate_actions( array $action_ids ) { - do_action( 'action_scheduler/migration_batch_starting', $action_ids ); - - \ActionScheduler::logger()->unhook_stored_action(); - $this->destination_logger->unhook_stored_action(); - - foreach ( $action_ids as $source_action_id ) { - $destination_action_id = $this->action_migrator->migrate( $source_action_id ); - if ( $destination_action_id ) { - $this->destination_logger->log( $destination_action_id, sprintf( - /* translators: 1: source action ID 2: source store class 3: destination action ID 4: destination store class */ - __( 'Migrated action with ID %1$d in %2$s to ID %3$d in %4$s', 'action-scheduler' ), - $source_action_id, - get_class( $this->source_store ), - $destination_action_id, - get_class( $this->destination_store ) - ) ); - } - - if ( $this->progress_bar ) { - $this->progress_bar->tick(); - } - } - - if ( $this->progress_bar ) { - $this->progress_bar->finish(); - } - - \ActionScheduler::logger()->hook_stored_action(); - - do_action( 'action_scheduler/migration_batch_complete', $action_ids ); - } - - /** - * Initialize destination store and logger. - */ - public function init_destination() { - $this->destination_store->init(); - $this->destination_logger->init(); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/Scheduler.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/Scheduler.php deleted file mode 100644 index 8050e8e9..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/migration/Scheduler.php +++ /dev/null @@ -1,129 +0,0 @@ -get_migration_runner(); - $count = $migration_runner->run( $this->get_batch_size() ); - - if ( $count === 0 ) { - $this->mark_complete(); - } else { - $this->schedule_migration( time() + $this->get_schedule_interval() ); - } - } - - /** - * Mark the migration complete. - */ - public function mark_complete() { - $this->unschedule_migration(); - - \ActionScheduler_DataController::mark_migration_complete(); - do_action( 'action_scheduler/migration_complete' ); - } - - /** - * Get a flag indicating whether the migration is scheduled. - * - * @return bool Whether there is a pending action in the store to handle the migration - */ - public function is_migration_scheduled() { - $next = as_next_scheduled_action( self::HOOK ); - - return ! empty( $next ); - } - - /** - * Schedule the migration. - * - * @param int $when Optional timestamp to run the next migration batch. Defaults to now. - * - * @return string The action ID - */ - public function schedule_migration( $when = 0 ) { - $next = as_next_scheduled_action( self::HOOK ); - - if ( ! empty( $next ) ) { - return $next; - } - - if ( empty( $when ) ) { - $when = time() + MINUTE_IN_SECONDS; - } - - return as_schedule_single_action( $when, self::HOOK, array(), self::GROUP ); - } - - /** - * Remove the scheduled migration action. - */ - public function unschedule_migration() { - as_unschedule_action( self::HOOK, null, self::GROUP ); - } - - /** - * Get migration batch schedule interval. - * - * @return int Seconds between migration runs. Defaults to 0 seconds to allow chaining migration via Async Runners. - */ - private function get_schedule_interval() { - return (int) apply_filters( 'action_scheduler/migration_interval', 0 ); - } - - /** - * Get migration batch size. - * - * @return int Number of actions to migrate in each batch. Defaults to 250. - */ - private function get_batch_size() { - return (int) apply_filters( 'action_scheduler/migration_batch_size', 250 ); - } - - /** - * Get migration runner object. - * - * @return Runner - */ - private function get_migration_runner() { - $config = Controller::instance()->get_migration_config_object(); - - return new Runner( $config ); - } - -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_CanceledSchedule.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_CanceledSchedule.php deleted file mode 100644 index 091513e6..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_CanceledSchedule.php +++ /dev/null @@ -1,58 +0,0 @@ -__wakeup() for details. - **/ - private $timestamp = NULL; - - /** - * @param DateTime $after - * - * @return DateTime|null - */ - public function calculate_next( DateTime $after ) { - return null; - } - - /** - * Cancelled actions should never have a next schedule, even if get_next() - * is called with $after < $this->scheduled_date. - * - * @param DateTime $after - * @return DateTime|null - */ - public function get_next( DateTime $after ) { - return null; - } - - /** - * @return bool - */ - public function is_recurring() { - return false; - } - - /** - * Unserialize recurring schedules serialized/stored prior to AS 3.0.0 - * - * Prior to Action Scheduler 3.0.0, schedules used different property names to refer - * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 - * aligned properties and property names for better inheritance. To maintain backward - * compatibility with schedules serialized and stored prior to 3.0, we need to correctly - * map the old property names with matching visibility. - */ - public function __wakeup() { - if ( ! is_null( $this->timestamp ) ) { - $this->scheduled_timestamp = $this->timestamp; - unset( $this->timestamp ); - } - parent::__wakeup(); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_CronSchedule.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_CronSchedule.php deleted file mode 100644 index 5851b0e7..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_CronSchedule.php +++ /dev/null @@ -1,103 +0,0 @@ -__wakeup() for details. - **/ - private $start_timestamp = NULL; - - /** - * Deprecated property @see $this->__wakeup() for details. - **/ - private $cron = NULL; - - /** - * Wrapper for parent constructor to accept a cron expression string and map it to a CronExpression for this - * objects $recurrence property. - * - * @param DateTime $start The date & time to run the action at or after. If $start aligns with the CronSchedule passed via $recurrence, it will be used. If it does not align, the first matching date after it will be used. - * @param CronExpression|string $recurrence The CronExpression used to calculate the schedule's next instance. - * @param DateTime|null $first (Optional) The date & time the first instance of this interval schedule ran. Default null, meaning this is the first instance. - */ - public function __construct( DateTime $start, $recurrence, DateTime $first = null ) { - if ( ! is_a( $recurrence, 'CronExpression' ) ) { - $recurrence = CronExpression::factory( $recurrence ); - } - - // For backward compatibility, we need to make sure the date is set to the first matching cron date, not whatever date is passed in. Importantly, by passing true as the 3rd param, if $start matches the cron expression, then it will be used. This was previously handled in the now deprecated next() method. - $date = $recurrence->getNextRunDate( $start, 0, true ); - - // parent::__construct() will set this to $date by default, but that may be different to $start now. - $first = empty( $first ) ? $start : $first; - - parent::__construct( $date, $recurrence, $first ); - } - - /** - * Calculate when an instance of this schedule would start based on a given - * date & time using its the CronExpression. - * - * @param DateTime $after - * @return DateTime - */ - protected function calculate_next( DateTime $after ) { - return $this->recurrence->getNextRunDate( $after, 0, false ); - } - - /** - * @return string - */ - public function get_recurrence() { - return strval( $this->recurrence ); - } - - /** - * Serialize cron schedules with data required prior to AS 3.0.0 - * - * Prior to Action Scheduler 3.0.0, reccuring schedules used different property names to - * refer to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 - * aligned properties and property names for better inheritance. To guard against the - * possibility of infinite loops if downgrading to Action Scheduler < 3.0.0, we need to - * also store the data with the old property names so if it's unserialized in AS < 3.0, - * the schedule doesn't end up with a null recurrence. - * - * @return array - */ - public function __sleep() { - - $sleep_params = parent::__sleep(); - - $this->start_timestamp = $this->scheduled_timestamp; - $this->cron = $this->recurrence; - - return array_merge( $sleep_params, array( - 'start_timestamp', - 'cron' - ) ); - } - - /** - * Unserialize cron schedules serialized/stored prior to AS 3.0.0 - * - * For more background, @see ActionScheduler_Abstract_RecurringSchedule::__wakeup(). - */ - public function __wakeup() { - if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->start_timestamp ) ) { - $this->scheduled_timestamp = $this->start_timestamp; - unset( $this->start_timestamp ); - } - - if ( is_null( $this->recurrence ) && ! is_null( $this->cron ) ) { - $this->recurrence = $this->cron; - unset( $this->cron ); - } - parent::__wakeup(); - } -} - diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_IntervalSchedule.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_IntervalSchedule.php deleted file mode 100644 index 4124f2a6..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_IntervalSchedule.php +++ /dev/null @@ -1,82 +0,0 @@ -__wakeup() for details. - **/ - private $start_timestamp = NULL; - - /** - * Deprecated property @see $this->__wakeup() for details. - **/ - private $interval_in_seconds = NULL; - - /** - * Calculate when this schedule should start after a given date & time using - * the number of seconds between recurrences. - * - * @param DateTime $after - * @return DateTime - */ - protected function calculate_next( DateTime $after ) { - $after->modify( '+' . (int) $this->get_recurrence() . ' seconds' ); - return $after; - } - - /** - * @return int - */ - public function interval_in_seconds() { - _deprecated_function( __METHOD__, '3.0.0', '(int)ActionScheduler_Abstract_RecurringSchedule::get_recurrence()' ); - return (int) $this->get_recurrence(); - } - - /** - * Serialize interval schedules with data required prior to AS 3.0.0 - * - * Prior to Action Scheduler 3.0.0, reccuring schedules used different property names to - * refer to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 - * aligned properties and property names for better inheritance. To guard against the - * possibility of infinite loops if downgrading to Action Scheduler < 3.0.0, we need to - * also store the data with the old property names so if it's unserialized in AS < 3.0, - * the schedule doesn't end up with a null/false/0 recurrence. - * - * @return array - */ - public function __sleep() { - - $sleep_params = parent::__sleep(); - - $this->start_timestamp = $this->scheduled_timestamp; - $this->interval_in_seconds = $this->recurrence; - - return array_merge( $sleep_params, array( - 'start_timestamp', - 'interval_in_seconds' - ) ); - } - - /** - * Unserialize interval schedules serialized/stored prior to AS 3.0.0 - * - * For more background, @see ActionScheduler_Abstract_RecurringSchedule::__wakeup(). - */ - public function __wakeup() { - if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->start_timestamp ) ) { - $this->scheduled_timestamp = $this->start_timestamp; - unset( $this->start_timestamp ); - } - - if ( is_null( $this->recurrence ) && ! is_null( $this->interval_in_seconds ) ) { - $this->recurrence = $this->interval_in_seconds; - unset( $this->interval_in_seconds ); - } - parent::__wakeup(); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_NullSchedule.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_NullSchedule.php deleted file mode 100644 index 8ff09813..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_NullSchedule.php +++ /dev/null @@ -1,29 +0,0 @@ -scheduled_date = null; - } - - /** - * This schedule has no scheduled DateTime, so we need to override the parent __sleep() - * @return array - */ - public function __sleep() { - return array(); - } - - public function __wakeup() { - $this->scheduled_date = null; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_Schedule.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_Schedule.php deleted file mode 100644 index 78a9899a..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schedules/ActionScheduler_Schedule.php +++ /dev/null @@ -1,19 +0,0 @@ -__wakeup() for details. - **/ - private $timestamp = NULL; - - /** - * @param DateTime $after - * - * @return DateTime|null - */ - public function calculate_next( DateTime $after ) { - return null; - } - - /** - * @return bool - */ - public function is_recurring() { - return false; - } - - /** - * Serialize schedule with data required prior to AS 3.0.0 - * - * Prior to Action Scheduler 3.0.0, schedules used different property names to refer - * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 - * aligned properties and property names for better inheritance. To guard against the - * scheduled date for single actions always being seen as "now" if downgrading to - * Action Scheduler < 3.0.0, we need to also store the data with the old property names - * so if it's unserialized in AS < 3.0, the schedule doesn't end up with a null recurrence. - * - * @return array - */ - public function __sleep() { - - $sleep_params = parent::__sleep(); - - $this->timestamp = $this->scheduled_timestamp; - - return array_merge( $sleep_params, array( - 'timestamp', - ) ); - } - - /** - * Unserialize recurring schedules serialized/stored prior to AS 3.0.0 - * - * Prior to Action Scheduler 3.0.0, schedules used different property names to refer - * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 - * aligned properties and property names for better inheritance. To maintain backward - * compatibility with schedules serialized and stored prior to 3.0, we need to correctly - * map the old property names with matching visibility. - */ - public function __wakeup() { - - if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->timestamp ) ) { - $this->scheduled_timestamp = $this->timestamp; - unset( $this->timestamp ); - } - parent::__wakeup(); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schema/ActionScheduler_LoggerSchema.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schema/ActionScheduler_LoggerSchema.php deleted file mode 100644 index 34f01f49..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schema/ActionScheduler_LoggerSchema.php +++ /dev/null @@ -1,91 +0,0 @@ -tables = [ - self::LOG_TABLE, - ]; - } - - /** - * Performs additional setup work required to support this schema. - */ - public function init() { - add_action( 'action_scheduler_before_schema_update', array( $this, 'update_schema_3_0' ), 10, 2 ); - } - - protected function get_table_definition( $table ) { - global $wpdb; - $table_name = $wpdb->$table; - $charset_collate = $wpdb->get_charset_collate(); - switch ( $table ) { - - case self::LOG_TABLE: - - $default_date = ActionScheduler_StoreSchema::DEFAULT_DATE; - return "CREATE TABLE {$table_name} ( - log_id bigint(20) unsigned NOT NULL auto_increment, - action_id bigint(20) unsigned NOT NULL, - message text NOT NULL, - log_date_gmt datetime NULL default '${default_date}', - log_date_local datetime NULL default '${default_date}', - PRIMARY KEY (log_id), - KEY action_id (action_id), - KEY log_date_gmt (log_date_gmt) - ) $charset_collate"; - - default: - return ''; - } - } - - /** - * Update the logs table schema, allowing datetime fields to be NULL. - * - * This is needed because the NOT NULL constraint causes a conflict with some versions of MySQL - * configured with sql_mode=NO_ZERO_DATE, which can for instance lead to tables not being created. - * - * Most other schema updates happen via ActionScheduler_Abstract_Schema::update_table(), however - * that method relies on dbDelta() and this change is not possible when using that function. - * - * @param string $table Name of table being updated. - * @param string $db_version The existing schema version of the table. - */ - public function update_schema_3_0( $table, $db_version ) { - global $wpdb; - - if ( 'actionscheduler_logs' !== $table || version_compare( $db_version, '3', '>=' ) ) { - return; - } - - // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared - $table_name = $wpdb->prefix . 'actionscheduler_logs'; - $table_list = $wpdb->get_col( "SHOW TABLES LIKE '${table_name}'" ); - $default_date = ActionScheduler_StoreSchema::DEFAULT_DATE; - - if ( ! empty( $table_list ) ) { - $query = " - ALTER TABLE ${table_name} - MODIFY COLUMN log_date_gmt datetime NULL default '${default_date}', - MODIFY COLUMN log_date_local datetime NULL default '${default_date}' - "; - $wpdb->query( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schema/ActionScheduler_StoreSchema.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schema/ActionScheduler_StoreSchema.php deleted file mode 100644 index a40beb83..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/classes/schema/ActionScheduler_StoreSchema.php +++ /dev/null @@ -1,130 +0,0 @@ -tables = [ - self::ACTIONS_TABLE, - self::CLAIMS_TABLE, - self::GROUPS_TABLE, - ]; - } - - /** - * Performs additional setup work required to support this schema. - */ - public function init() { - add_action( 'action_scheduler_before_schema_update', array( $this, 'update_schema_5_0' ), 10, 2 ); - } - - protected function get_table_definition( $table ) { - global $wpdb; - $table_name = $wpdb->$table; - $charset_collate = $wpdb->get_charset_collate(); - $max_index_length = 191; // @see wp_get_db_schema() - $default_date = self::DEFAULT_DATE; - switch ( $table ) { - - case self::ACTIONS_TABLE: - - return "CREATE TABLE {$table_name} ( - action_id bigint(20) unsigned NOT NULL auto_increment, - hook varchar(191) NOT NULL, - status varchar(20) NOT NULL, - scheduled_date_gmt datetime NULL default '${default_date}', - scheduled_date_local datetime NULL default '${default_date}', - args varchar($max_index_length), - schedule longtext, - group_id bigint(20) unsigned NOT NULL default '0', - attempts int(11) NOT NULL default '0', - last_attempt_gmt datetime NULL default '${default_date}', - last_attempt_local datetime NULL default '${default_date}', - claim_id bigint(20) unsigned NOT NULL default '0', - extended_args varchar(8000) DEFAULT NULL, - PRIMARY KEY (action_id), - KEY hook (hook($max_index_length)), - KEY status (status), - KEY scheduled_date_gmt (scheduled_date_gmt), - KEY args (args($max_index_length)), - KEY group_id (group_id), - KEY last_attempt_gmt (last_attempt_gmt), - KEY `claim_id_status_scheduled_date_gmt` (`claim_id`, `status`, `scheduled_date_gmt`) - ) $charset_collate"; - - case self::CLAIMS_TABLE: - - return "CREATE TABLE {$table_name} ( - claim_id bigint(20) unsigned NOT NULL auto_increment, - date_created_gmt datetime NULL default '${default_date}', - PRIMARY KEY (claim_id), - KEY date_created_gmt (date_created_gmt) - ) $charset_collate"; - - case self::GROUPS_TABLE: - - return "CREATE TABLE {$table_name} ( - group_id bigint(20) unsigned NOT NULL auto_increment, - slug varchar(255) NOT NULL, - PRIMARY KEY (group_id), - KEY slug (slug($max_index_length)) - ) $charset_collate"; - - default: - return ''; - } - } - - /** - * Update the actions table schema, allowing datetime fields to be NULL. - * - * This is needed because the NOT NULL constraint causes a conflict with some versions of MySQL - * configured with sql_mode=NO_ZERO_DATE, which can for instance lead to tables not being created. - * - * Most other schema updates happen via ActionScheduler_Abstract_Schema::update_table(), however - * that method relies on dbDelta() and this change is not possible when using that function. - * - * @param string $table Name of table being updated. - * @param string $db_version The existing schema version of the table. - */ - public function update_schema_5_0( $table, $db_version ) { - global $wpdb; - - if ( 'actionscheduler_actions' !== $table || version_compare( $db_version, '5', '>=' ) ) { - return; - } - - // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared - $table_name = $wpdb->prefix . 'actionscheduler_actions'; - $table_list = $wpdb->get_col( "SHOW TABLES LIKE '${table_name}'" ); - $default_date = self::DEFAULT_DATE; - - if ( ! empty( $table_list ) ) { - $query = " - ALTER TABLE ${table_name} - MODIFY COLUMN scheduled_date_gmt datetime NULL default '${default_date}', - MODIFY COLUMN scheduled_date_local datetime NULL default '${default_date}', - MODIFY COLUMN last_attempt_gmt datetime NULL default '${default_date}', - MODIFY COLUMN last_attempt_local datetime NULL default '${default_date}' - "; - $wpdb->query( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/deprecated/ActionScheduler_Abstract_QueueRunner_Deprecated.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/deprecated/ActionScheduler_Abstract_QueueRunner_Deprecated.php deleted file mode 100644 index 6f271688..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/deprecated/ActionScheduler_Abstract_QueueRunner_Deprecated.php +++ /dev/null @@ -1,28 +0,0 @@ -get_date(); - $replacement_method = 'get_date()'; - } else { - $return_value = $this->get_next( $after ); - $replacement_method = 'get_next( $after )'; - } - - _deprecated_function( __METHOD__, '3.0.0', __CLASS__ . '::' . $replacement_method ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - - return $return_value; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/deprecated/ActionScheduler_Store_Deprecated.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/deprecated/ActionScheduler_Store_Deprecated.php deleted file mode 100644 index eaf15b72..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/deprecated/ActionScheduler_Store_Deprecated.php +++ /dev/null @@ -1,50 +0,0 @@ -mark_failure( $action_id ); - } - - /** - * Add base hooks - * - * @since 2.2.6 - */ - protected static function hook() { - _deprecated_function( __METHOD__, '3.0.0' ); - } - - /** - * Remove base hooks - * - * @since 2.2.6 - */ - protected static function unhook() { - _deprecated_function( __METHOD__, '3.0.0' ); - } - - /** - * Get the site's local time. - * - * @deprecated 2.1.0 - * @return DateTimeZone - */ - protected function get_local_timezone() { - _deprecated_function( __FUNCTION__, '2.1.0', 'ActionScheduler_TimezoneHelper::set_local_timezone()' ); - return ActionScheduler_TimezoneHelper::get_local_timezone(); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/deprecated/functions.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/deprecated/functions.php deleted file mode 100644 index 56953362..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/deprecated/functions.php +++ /dev/null @@ -1,127 +0,0 @@ - '' - the name of the action that will be triggered - * 'args' => NULL - the args array that will be passed with the action - * 'date' => NULL - the scheduled date of the action. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. - * 'date_compare' => '<=' - operator for testing "date". accepted values are '!=', '>', '>=', '<', '<=', '=' - * 'modified' => NULL - the date the action was last updated. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. - * 'modified_compare' => '<=' - operator for testing "modified". accepted values are '!=', '>', '>=', '<', '<=', '=' - * 'group' => '' - the group the action belongs to - * 'status' => '' - ActionScheduler_Store::STATUS_COMPLETE or ActionScheduler_Store::STATUS_PENDING - * 'claimed' => NULL - TRUE to find claimed actions, FALSE to find unclaimed actions, a string to find a specific claim ID - * 'per_page' => 5 - Number of results to return - * 'offset' => 0 - * 'orderby' => 'date' - accepted values are 'hook', 'group', 'modified', or 'date' - * 'order' => 'ASC' - * @param string $return_format OBJECT, ARRAY_A, or ids - * - * @deprecated 2.1.0 - * - * @return array - */ -function wc_get_scheduled_actions( $args = array(), $return_format = OBJECT ) { - _deprecated_function( __FUNCTION__, '2.1.0', 'as_get_scheduled_actions()' ); - return as_get_scheduled_actions( $args, $return_format ); -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/functions.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/functions.php deleted file mode 100644 index d937ff8e..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/functions.php +++ /dev/null @@ -1,320 +0,0 @@ -async( $hook, $args, $group ); -} - -/** - * Schedule an action to run one time - * - * @param int $timestamp When the job will run. - * @param string $hook The hook to trigger. - * @param array $args Arguments to pass when the hook triggers. - * @param string $group The group to assign this job to. - * - * @return int The action ID. - */ -function as_schedule_single_action( $timestamp, $hook, $args = array(), $group = '' ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return 0; - } - return ActionScheduler::factory()->single( $hook, $args, $timestamp, $group ); -} - -/** - * Schedule a recurring action - * - * @param int $timestamp When the first instance of the job will run. - * @param int $interval_in_seconds How long to wait between runs. - * @param string $hook The hook to trigger. - * @param array $args Arguments to pass when the hook triggers. - * @param string $group The group to assign this job to. - * - * @return int The action ID. - */ -function as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args = array(), $group = '' ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return 0; - } - return ActionScheduler::factory()->recurring( $hook, $args, $timestamp, $interval_in_seconds, $group ); -} - -/** - * Schedule an action that recurs on a cron-like schedule. - * - * @param int $base_timestamp The first instance of the action will be scheduled - * to run at a time calculated after this timestamp matching the cron - * expression. This can be used to delay the first instance of the action. - * @param string $schedule A cron-link schedule string - * @see http://en.wikipedia.org/wiki/Cron - * * * * * * * - * ┬ ┬ ┬ ┬ ┬ ┬ - * | | | | | | - * | | | | | + year [optional] - * | | | | +----- day of week (0 - 7) (Sunday=0 or 7) - * | | | +---------- month (1 - 12) - * | | +--------------- day of month (1 - 31) - * | +-------------------- hour (0 - 23) - * +------------------------- min (0 - 59) - * @param string $hook The hook to trigger. - * @param array $args Arguments to pass when the hook triggers. - * @param string $group The group to assign this job to. - * - * @return int The action ID. - */ -function as_schedule_cron_action( $timestamp, $schedule, $hook, $args = array(), $group = '' ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return 0; - } - return ActionScheduler::factory()->cron( $hook, $args, $timestamp, $schedule, $group ); -} - -/** - * Cancel the next occurrence of a scheduled action. - * - * While only the next instance of a recurring or cron action is unscheduled by this method, that will also prevent - * all future instances of that recurring or cron action from being run. Recurring and cron actions are scheduled in - * a sequence instead of all being scheduled at once. Each successive occurrence of a recurring action is scheduled - * only after the former action is run. If the next instance is never run, because it's unscheduled by this function, - * then the following instance will never be scheduled (or exist), which is effectively the same as being unscheduled - * by this method also. - * - * @param string $hook The hook that the job will trigger. - * @param array $args Args that would have been passed to the job. - * @param string $group The group the job is assigned to. - * - * @return string|null The scheduled action ID if a scheduled action was found, or null if no matching action found. - */ -function as_unschedule_action( $hook, $args = array(), $group = '' ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return 0; - } - $params = array( - 'hook' => $hook, - 'status' => ActionScheduler_Store::STATUS_PENDING, - 'orderby' => 'date', - 'order' => 'ASC', - 'group' => $group, - ); - if ( is_array( $args ) ) { - $params['args'] = $args; - } - - $action_id = ActionScheduler::store()->query_action( $params ); - if ( $action_id ) { - ActionScheduler::store()->cancel_action( $action_id ); - } - - return $action_id; -} - -/** - * Cancel all occurrences of a scheduled action. - * - * @param string $hook The hook that the job will trigger. - * @param array $args Args that would have been passed to the job. - * @param string $group The group the job is assigned to. - */ -function as_unschedule_all_actions( $hook, $args = array(), $group = '' ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return; - } - if ( empty( $args ) ) { - if ( ! empty( $hook ) && empty( $group ) ) { - ActionScheduler_Store::instance()->cancel_actions_by_hook( $hook ); - return; - } - if ( ! empty( $group ) && empty( $hook ) ) { - ActionScheduler_Store::instance()->cancel_actions_by_group( $group ); - return; - } - } - do { - $unscheduled_action = as_unschedule_action( $hook, $args, $group ); - } while ( ! empty( $unscheduled_action ) ); -} - -/** - * Check if there is an existing action in the queue with a given hook, args and group combination. - * - * An action in the queue could be pending, in-progress or async. If the is pending for a time in - * future, its scheduled date will be returned as a timestamp. If it is currently being run, or an - * async action sitting in the queue waiting to be processed, in which case boolean true will be - * returned. Or there may be no async, in-progress or pending action for this hook, in which case, - * boolean false will be the return value. - * - * @param string $hook - * @param array $args - * @param string $group - * - * @return int|bool The timestamp for the next occurrence of a pending scheduled action, true for an async or in-progress action or false if there is no matching action. - */ -function as_next_scheduled_action( $hook, $args = null, $group = '' ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return false; - } - - $params = array( - 'hook' => $hook, - 'orderby' => 'date', - 'order' => 'ASC', - 'group' => $group, - ); - - if ( is_array( $args ) ) { - $params['args'] = $args; - } - - $params['status'] = ActionScheduler_Store::STATUS_RUNNING; - $action_id = ActionScheduler::store()->query_action( $params ); - if ( $action_id ) { - return true; - } - - $params['status'] = ActionScheduler_Store::STATUS_PENDING; - $action_id = ActionScheduler::store()->query_action( $params ); - if ( null === $action_id ) { - return false; - } - - $action = ActionScheduler::store()->fetch_action( $action_id ); - $scheduled_date = $action->get_schedule()->get_date(); - if ( $scheduled_date ) { - return (int) $scheduled_date->format( 'U' ); - } elseif ( null === $scheduled_date ) { // pending async action with NullSchedule - return true; - } - - return false; -} - -/** - * Check if there is a scheduled action in the queue but more efficiently than as_next_scheduled_action(). - * - * It's recommended to use this function when you need to know whether a specific action is currently scheduled - * (pending or in-progress). - * - * @since x.x.x - * - * @param string $hook The hook of the action. - * @param array $args Args that have been passed to the action. Null will matches any args. - * @param string $group The group the job is assigned to. - * - * @return bool True if a matching action is pending or in-progress, false otherwise. - */ -function as_has_scheduled_action( $hook, $args = null, $group = '' ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return false; - } - - $query_args = array( - 'hook' => $hook, - 'status' => array( ActionScheduler_Store::STATUS_RUNNING, ActionScheduler_Store::STATUS_PENDING ), - 'group' => $group, - 'orderby' => 'none', - ); - - if ( null !== $args ) { - $query_args['args'] = $args; - } - - $action_id = ActionScheduler::store()->query_action( $query_args ); - - return $action_id !== null; -} - -/** - * Find scheduled actions - * - * @param array $args Possible arguments, with their default values: - * 'hook' => '' - the name of the action that will be triggered - * 'args' => NULL - the args array that will be passed with the action - * 'date' => NULL - the scheduled date of the action. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. - * 'date_compare' => '<=' - operator for testing "date". accepted values are '!=', '>', '>=', '<', '<=', '=' - * 'modified' => NULL - the date the action was last updated. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. - * 'modified_compare' => '<=' - operator for testing "modified". accepted values are '!=', '>', '>=', '<', '<=', '=' - * 'group' => '' - the group the action belongs to - * 'status' => '' - ActionScheduler_Store::STATUS_COMPLETE or ActionScheduler_Store::STATUS_PENDING - * 'claimed' => NULL - TRUE to find claimed actions, FALSE to find unclaimed actions, a string to find a specific claim ID - * 'per_page' => 5 - Number of results to return - * 'offset' => 0 - * 'orderby' => 'date' - accepted values are 'hook', 'group', 'modified', 'date' or 'none' - * 'order' => 'ASC' - * - * @param string $return_format OBJECT, ARRAY_A, or ids. - * - * @return array - */ -function as_get_scheduled_actions( $args = array(), $return_format = OBJECT ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return array(); - } - $store = ActionScheduler::store(); - foreach ( array('date', 'modified') as $key ) { - if ( isset($args[$key]) ) { - $args[$key] = as_get_datetime_object($args[$key]); - } - } - $ids = $store->query_actions( $args ); - - if ( $return_format == 'ids' || $return_format == 'int' ) { - return $ids; - } - - $actions = array(); - foreach ( $ids as $action_id ) { - $actions[$action_id] = $store->fetch_action( $action_id ); - } - - if ( $return_format == ARRAY_A ) { - foreach ( $actions as $action_id => $action_object ) { - $actions[$action_id] = get_object_vars($action_object); - } - } - - return $actions; -} - -/** - * Helper function to create an instance of DateTime based on a given - * string and timezone. By default, will return the current date/time - * in the UTC timezone. - * - * Needed because new DateTime() called without an explicit timezone - * will create a date/time in PHP's timezone, but we need to have - * assurance that a date/time uses the right timezone (which we almost - * always want to be UTC), which means we need to always include the - * timezone when instantiating datetimes rather than leaving it up to - * the PHP default. - * - * @param mixed $date_string A date/time string. Valid formats are explained in http://php.net/manual/en/datetime.formats.php. - * @param string $timezone A timezone identifier, like UTC or Europe/Lisbon. The list of valid identifiers is available http://php.net/manual/en/timezones.php. - * - * @return ActionScheduler_DateTime - */ -function as_get_datetime_object( $date_string = null, $timezone = 'UTC' ) { - if ( is_object( $date_string ) && $date_string instanceof DateTime ) { - $date = new ActionScheduler_DateTime( $date_string->format( 'Y-m-d H:i:s' ), new DateTimeZone( $timezone ) ); - } elseif ( is_numeric( $date_string ) ) { - $date = new ActionScheduler_DateTime( '@' . $date_string, new DateTimeZone( $timezone ) ); - } else { - $date = new ActionScheduler_DateTime( $date_string, new DateTimeZone( $timezone ) ); - } - return $date; -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/WP_Async_Request.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/WP_Async_Request.php deleted file mode 100644 index 52d6ade0..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/WP_Async_Request.php +++ /dev/null @@ -1,171 +0,0 @@ -identifier = $this->prefix . '_' . $this->action; - - add_action( 'wp_ajax_' . $this->identifier, array( $this, 'maybe_handle' ) ); - add_action( 'wp_ajax_nopriv_' . $this->identifier, array( $this, 'maybe_handle' ) ); - } - - /** - * Set data used during the request - * - * @param array $data Data. - * - * @return $this - */ - public function data( $data ) { - $this->data = $data; - - return $this; - } - - /** - * Dispatch the async request - * - * @return array|WP_Error - */ - public function dispatch() { - $url = add_query_arg( $this->get_query_args(), $this->get_query_url() ); - $args = $this->get_post_args(); - - return wp_remote_post( esc_url_raw( $url ), $args ); - } - - /** - * Get query args - * - * @return array - */ - protected function get_query_args() { - if ( property_exists( $this, 'query_args' ) ) { - return $this->query_args; - } - - return array( - 'action' => $this->identifier, - 'nonce' => wp_create_nonce( $this->identifier ), - ); - } - - /** - * Get query URL - * - * @return string - */ - protected function get_query_url() { - if ( property_exists( $this, 'query_url' ) ) { - return $this->query_url; - } - - return admin_url( 'admin-ajax.php' ); - } - - /** - * Get post args - * - * @return array - */ - protected function get_post_args() { - if ( property_exists( $this, 'post_args' ) ) { - return $this->post_args; - } - - return array( - 'timeout' => 0.01, - 'blocking' => false, - 'body' => $this->data, - 'cookies' => $_COOKIE, - 'sslverify' => apply_filters( 'https_local_ssl_verify', false ), - ); - } - - /** - * Maybe handle - * - * Check for correct nonce and pass to handler. - */ - public function maybe_handle() { - // Don't lock up other requests while processing - session_write_close(); - - check_ajax_referer( $this->identifier, 'nonce' ); - - $this->handle(); - - wp_die(); - } - - /** - * Handle - * - * Override this method to perform any actions required - * during the async request. - */ - abstract protected function handle(); - - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression.php deleted file mode 100644 index eabb8df0..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression.php +++ /dev/null @@ -1,319 +0,0 @@ - - * @link http://en.wikipedia.org/wiki/Cron - */ -class CronExpression -{ - const MINUTE = 0; - const HOUR = 1; - const DAY = 2; - const MONTH = 3; - const WEEKDAY = 4; - const YEAR = 5; - - /** - * @var array CRON expression parts - */ - private $cronParts; - - /** - * @var CronExpression_FieldFactory CRON field factory - */ - private $fieldFactory; - - /** - * @var array Order in which to test of cron parts - */ - private static $order = array(self::YEAR, self::MONTH, self::DAY, self::WEEKDAY, self::HOUR, self::MINUTE); - - /** - * Factory method to create a new CronExpression. - * - * @param string $expression The CRON expression to create. There are - * several special predefined values which can be used to substitute the - * CRON expression: - * - * @yearly, @annually) - Run once a year, midnight, Jan. 1 - 0 0 1 1 * - * @monthly - Run once a month, midnight, first of month - 0 0 1 * * - * @weekly - Run once a week, midnight on Sun - 0 0 * * 0 - * @daily - Run once a day, midnight - 0 0 * * * - * @hourly - Run once an hour, first minute - 0 * * * * - * -*@param CronExpression_FieldFactory $fieldFactory (optional) Field factory to use - * - * @return CronExpression - */ - public static function factory($expression, CronExpression_FieldFactory $fieldFactory = null) - { - $mappings = array( - '@yearly' => '0 0 1 1 *', - '@annually' => '0 0 1 1 *', - '@monthly' => '0 0 1 * *', - '@weekly' => '0 0 * * 0', - '@daily' => '0 0 * * *', - '@hourly' => '0 * * * *' - ); - - if (isset($mappings[$expression])) { - $expression = $mappings[$expression]; - } - - return new self($expression, $fieldFactory ? $fieldFactory : new CronExpression_FieldFactory()); - } - - /** - * Parse a CRON expression - * - * @param string $expression CRON expression (e.g. '8 * * * *') - * @param CronExpression_FieldFactory $fieldFactory Factory to create cron fields - */ - public function __construct($expression, CronExpression_FieldFactory $fieldFactory) - { - $this->fieldFactory = $fieldFactory; - $this->setExpression($expression); - } - - /** - * Set or change the CRON expression - * - * @param string $value CRON expression (e.g. 8 * * * *) - * - * @return CronExpression - * @throws InvalidArgumentException if not a valid CRON expression - */ - public function setExpression($value) - { - $this->cronParts = preg_split('/\s/', $value, -1, PREG_SPLIT_NO_EMPTY); - if (count($this->cronParts) < 5) { - throw new InvalidArgumentException( - $value . ' is not a valid CRON expression' - ); - } - - foreach ($this->cronParts as $position => $part) { - $this->setPart($position, $part); - } - - return $this; - } - - /** - * Set part of the CRON expression - * - * @param int $position The position of the CRON expression to set - * @param string $value The value to set - * - * @return CronExpression - * @throws InvalidArgumentException if the value is not valid for the part - */ - public function setPart($position, $value) - { - if (!$this->fieldFactory->getField($position)->validate($value)) { - throw new InvalidArgumentException( - 'Invalid CRON field value ' . $value . ' as position ' . $position - ); - } - - $this->cronParts[$position] = $value; - - return $this; - } - - /** - * Get a next run date relative to the current date or a specific date - * - * @param string|DateTime $currentTime (optional) Relative calculation date - * @param int $nth (optional) Number of matches to skip before returning a - * matching next run date. 0, the default, will return the current - * date and time if the next run date falls on the current date and - * time. Setting this value to 1 will skip the first match and go to - * the second match. Setting this value to 2 will skip the first 2 - * matches and so on. - * @param bool $allowCurrentDate (optional) Set to TRUE to return the - * current date if it matches the cron expression - * - * @return DateTime - * @throws RuntimeException on too many iterations - */ - public function getNextRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false) - { - return $this->getRunDate($currentTime, $nth, false, $allowCurrentDate); - } - - /** - * Get a previous run date relative to the current date or a specific date - * - * @param string|DateTime $currentTime (optional) Relative calculation date - * @param int $nth (optional) Number of matches to skip before returning - * @param bool $allowCurrentDate (optional) Set to TRUE to return the - * current date if it matches the cron expression - * - * @return DateTime - * @throws RuntimeException on too many iterations - * @see CronExpression::getNextRunDate - */ - public function getPreviousRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false) - { - return $this->getRunDate($currentTime, $nth, true, $allowCurrentDate); - } - - /** - * Get multiple run dates starting at the current date or a specific date - * - * @param int $total Set the total number of dates to calculate - * @param string|DateTime $currentTime (optional) Relative calculation date - * @param bool $invert (optional) Set to TRUE to retrieve previous dates - * @param bool $allowCurrentDate (optional) Set to TRUE to return the - * current date if it matches the cron expression - * - * @return array Returns an array of run dates - */ - public function getMultipleRunDates($total, $currentTime = 'now', $invert = false, $allowCurrentDate = false) - { - $matches = array(); - for ($i = 0; $i < max(0, $total); $i++) { - $matches[] = $this->getRunDate($currentTime, $i, $invert, $allowCurrentDate); - } - - return $matches; - } - - /** - * Get all or part of the CRON expression - * - * @param string $part (optional) Specify the part to retrieve or NULL to - * get the full cron schedule string. - * - * @return string|null Returns the CRON expression, a part of the - * CRON expression, or NULL if the part was specified but not found - */ - public function getExpression($part = null) - { - if (null === $part) { - return implode(' ', $this->cronParts); - } elseif (array_key_exists($part, $this->cronParts)) { - return $this->cronParts[$part]; - } - - return null; - } - - /** - * Helper method to output the full expression. - * - * @return string Full CRON expression - */ - public function __toString() - { - return $this->getExpression(); - } - - /** - * Determine if the cron is due to run based on the current date or a - * specific date. This method assumes that the current number of - * seconds are irrelevant, and should be called once per minute. - * - * @param string|DateTime $currentTime (optional) Relative calculation date - * - * @return bool Returns TRUE if the cron is due to run or FALSE if not - */ - public function isDue($currentTime = 'now') - { - if ('now' === $currentTime) { - $currentDate = date('Y-m-d H:i'); - $currentTime = strtotime($currentDate); - } elseif ($currentTime instanceof DateTime) { - $currentDate = $currentTime->format('Y-m-d H:i'); - $currentTime = strtotime($currentDate); - } else { - $currentTime = new DateTime($currentTime); - $currentTime->setTime($currentTime->format('H'), $currentTime->format('i'), 0); - $currentDate = $currentTime->format('Y-m-d H:i'); - $currentTime = (int)($currentTime->getTimestamp()); - } - - return $this->getNextRunDate($currentDate, 0, true)->getTimestamp() == $currentTime; - } - - /** - * Get the next or previous run date of the expression relative to a date - * - * @param string|DateTime $currentTime (optional) Relative calculation date - * @param int $nth (optional) Number of matches to skip before returning - * @param bool $invert (optional) Set to TRUE to go backwards in time - * @param bool $allowCurrentDate (optional) Set to TRUE to return the - * current date if it matches the cron expression - * - * @return DateTime - * @throws RuntimeException on too many iterations - */ - protected function getRunDate($currentTime = null, $nth = 0, $invert = false, $allowCurrentDate = false) - { - if ($currentTime instanceof DateTime) { - $currentDate = $currentTime; - } else { - $currentDate = new DateTime($currentTime ? $currentTime : 'now'); - $currentDate->setTimezone(new DateTimeZone(date_default_timezone_get())); - } - - $currentDate->setTime($currentDate->format('H'), $currentDate->format('i'), 0); - $nextRun = clone $currentDate; - $nth = (int) $nth; - - // Set a hard limit to bail on an impossible date - for ($i = 0; $i < 1000; $i++) { - - foreach (self::$order as $position) { - $part = $this->getExpression($position); - if (null === $part) { - continue; - } - - $satisfied = false; - // Get the field object used to validate this part - $field = $this->fieldFactory->getField($position); - // Check if this is singular or a list - if (strpos($part, ',') === false) { - $satisfied = $field->isSatisfiedBy($nextRun, $part); - } else { - foreach (array_map('trim', explode(',', $part)) as $listPart) { - if ($field->isSatisfiedBy($nextRun, $listPart)) { - $satisfied = true; - break; - } - } - } - - // If the field is not satisfied, then start over - if (!$satisfied) { - $field->increment($nextRun, $invert); - continue 2; - } - } - - // Skip this match if needed - if ((!$allowCurrentDate && $nextRun == $currentDate) || --$nth > -1) { - $this->fieldFactory->getField(0)->increment($nextRun, $invert); - continue; - } - - return $nextRun; - } - - // @codeCoverageIgnoreStart - throw new RuntimeException('Impossible CRON expression'); - // @codeCoverageIgnoreEnd - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_AbstractField.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_AbstractField.php deleted file mode 100644 index 546c9d55..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_AbstractField.php +++ /dev/null @@ -1,101 +0,0 @@ - - */ -abstract class CronExpression_AbstractField implements CronExpression_FieldInterface -{ - /** - * Check to see if a field is satisfied by a value - * - * @param string $dateValue Date value to check - * @param string $value Value to test - * - * @return bool - */ - public function isSatisfied($dateValue, $value) - { - if ($this->isIncrementsOfRanges($value)) { - return $this->isInIncrementsOfRanges($dateValue, $value); - } elseif ($this->isRange($value)) { - return $this->isInRange($dateValue, $value); - } - - return $value == '*' || $dateValue == $value; - } - - /** - * Check if a value is a range - * - * @param string $value Value to test - * - * @return bool - */ - public function isRange($value) - { - return strpos($value, '-') !== false; - } - - /** - * Check if a value is an increments of ranges - * - * @param string $value Value to test - * - * @return bool - */ - public function isIncrementsOfRanges($value) - { - return strpos($value, '/') !== false; - } - - /** - * Test if a value is within a range - * - * @param string $dateValue Set date value - * @param string $value Value to test - * - * @return bool - */ - public function isInRange($dateValue, $value) - { - $parts = array_map('trim', explode('-', $value, 2)); - - return $dateValue >= $parts[0] && $dateValue <= $parts[1]; - } - - /** - * Test if a value is within an increments of ranges (offset[-to]/step size) - * - * @param string $dateValue Set date value - * @param string $value Value to test - * - * @return bool - */ - public function isInIncrementsOfRanges($dateValue, $value) - { - $parts = array_map('trim', explode('/', $value, 2)); - $stepSize = isset($parts[1]) ? $parts[1] : 0; - if ($parts[0] == '*' || $parts[0] === '0') { - return (int) $dateValue % $stepSize == 0; - } - - $range = explode('-', $parts[0], 2); - $offset = $range[0]; - $to = isset($range[1]) ? $range[1] : $dateValue; - // Ensure that the date value is within the range - if ($dateValue < $offset || $dateValue > $to) { - return false; - } - - for ($i = $offset; $i <= $to; $i+= $stepSize) { - if ($i == $dateValue) { - return true; - } - } - - return false; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_DayOfMonthField.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_DayOfMonthField.php deleted file mode 100644 index a7d0c4ba..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_DayOfMonthField.php +++ /dev/null @@ -1,111 +0,0 @@ - - */ -class CronExpression_DayOfMonthField extends CronExpression_AbstractField -{ - /** - * Get the nearest day of the week for a given day in a month - * - * @param int $currentYear Current year - * @param int $currentMonth Current month - * @param int $targetDay Target day of the month - * - * @return DateTime Returns the nearest date - */ - private static function getNearestWeekday($currentYear, $currentMonth, $targetDay) - { - $tday = str_pad($targetDay, 2, '0', STR_PAD_LEFT); - $target = new DateTime("$currentYear-$currentMonth-$tday"); - $currentWeekday = (int) $target->format('N'); - - if ($currentWeekday < 6) { - return $target; - } - - $lastDayOfMonth = $target->format('t'); - - foreach (array(-1, 1, -2, 2) as $i) { - $adjusted = $targetDay + $i; - if ($adjusted > 0 && $adjusted <= $lastDayOfMonth) { - $target->setDate($currentYear, $currentMonth, $adjusted); - if ($target->format('N') < 6 && $target->format('m') == $currentMonth) { - return $target; - } - } - } - } - - /** - * {@inheritdoc} - */ - public function isSatisfiedBy(DateTime $date, $value) - { - // ? states that the field value is to be skipped - if ($value == '?') { - return true; - } - - $fieldValue = $date->format('d'); - - // Check to see if this is the last day of the month - if ($value == 'L') { - return $fieldValue == $date->format('t'); - } - - // Check to see if this is the nearest weekday to a particular value - if (strpos($value, 'W')) { - // Parse the target day - $targetDay = substr($value, 0, strpos($value, 'W')); - // Find out if the current day is the nearest day of the week - return $date->format('j') == self::getNearestWeekday( - $date->format('Y'), - $date->format('m'), - $targetDay - )->format('j'); - } - - return $this->isSatisfied($date->format('d'), $value); - } - - /** - * {@inheritdoc} - */ - public function increment(DateTime $date, $invert = false) - { - if ($invert) { - $date->modify('previous day'); - $date->setTime(23, 59); - } else { - $date->modify('next day'); - $date->setTime(0, 0); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function validate($value) - { - return (bool) preg_match('/[\*,\/\-\?LW0-9A-Za-z]+/', $value); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_DayOfWeekField.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_DayOfWeekField.php deleted file mode 100644 index 164c532d..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_DayOfWeekField.php +++ /dev/null @@ -1,125 +0,0 @@ - - */ -class CronExpression_DayOfWeekField extends CronExpression_AbstractField -{ - /** - * {@inheritdoc} - */ - public function isSatisfiedBy(DateTime $date, $value) - { - if ($value == '?') { - return true; - } - - // Convert text day of the week values to integers - $value = str_ireplace( - array('SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'), - range(0, 6), - $value - ); - - $currentYear = $date->format('Y'); - $currentMonth = $date->format('m'); - $lastDayOfMonth = $date->format('t'); - - // Find out if this is the last specific weekday of the month - if (strpos($value, 'L')) { - $weekday = str_replace('7', '0', substr($value, 0, strpos($value, 'L'))); - $tdate = clone $date; - $tdate->setDate($currentYear, $currentMonth, $lastDayOfMonth); - while ($tdate->format('w') != $weekday) { - $tdate->setDate($currentYear, $currentMonth, --$lastDayOfMonth); - } - - return $date->format('j') == $lastDayOfMonth; - } - - // Handle # hash tokens - if (strpos($value, '#')) { - list($weekday, $nth) = explode('#', $value); - // Validate the hash fields - if ($weekday < 1 || $weekday > 5) { - throw new InvalidArgumentException("Weekday must be a value between 1 and 5. {$weekday} given"); - } - if ($nth > 5) { - throw new InvalidArgumentException('There are never more than 5 of a given weekday in a month'); - } - // The current weekday must match the targeted weekday to proceed - if ($date->format('N') != $weekday) { - return false; - } - - $tdate = clone $date; - $tdate->setDate($currentYear, $currentMonth, 1); - $dayCount = 0; - $currentDay = 1; - while ($currentDay < $lastDayOfMonth + 1) { - if ($tdate->format('N') == $weekday) { - if (++$dayCount >= $nth) { - break; - } - } - $tdate->setDate($currentYear, $currentMonth, ++$currentDay); - } - - return $date->format('j') == $currentDay; - } - - // Handle day of the week values - if (strpos($value, '-')) { - $parts = explode('-', $value); - if ($parts[0] == '7') { - $parts[0] = '0'; - } elseif ($parts[1] == '0') { - $parts[1] = '7'; - } - $value = implode('-', $parts); - } - - // Test to see which Sunday to use -- 0 == 7 == Sunday - $format = in_array(7, str_split($value)) ? 'N' : 'w'; - $fieldValue = $date->format($format); - - return $this->isSatisfied($fieldValue, $value); - } - - /** - * {@inheritdoc} - */ - public function increment(DateTime $date, $invert = false) - { - if ($invert) { - $date->modify('-1 day'); - $date->setTime(23, 59, 0); - } else { - $date->modify('+1 day'); - $date->setTime(0, 0, 0); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function validate($value) - { - return (bool) preg_match('/[\*,\/\-0-9A-Z]+/', $value); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_FieldFactory.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_FieldFactory.php deleted file mode 100644 index 29a427b7..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_FieldFactory.php +++ /dev/null @@ -1,56 +0,0 @@ - - * @link http://en.wikipedia.org/wiki/Cron - */ -class CronExpression_FieldFactory -{ - /** - * @var array Cache of instantiated fields - */ - private $fields = array(); - - /** - * Get an instance of a field object for a cron expression position - * - * @param int $position CRON expression position value to retrieve - * - * @return CronExpression_FieldInterface - * @throws InvalidArgumentException if a position is not valid - */ - public function getField($position) - { - if (!isset($this->fields[$position])) { - switch ($position) { - case 0: - $this->fields[$position] = new CronExpression_MinutesField(); - break; - case 1: - $this->fields[$position] = new CronExpression_HoursField(); - break; - case 2: - $this->fields[$position] = new CronExpression_DayOfMonthField(); - break; - case 3: - $this->fields[$position] = new CronExpression_MonthField(); - break; - case 4: - $this->fields[$position] = new CronExpression_DayOfWeekField(); - break; - case 5: - $this->fields[$position] = new CronExpression_YearField(); - break; - default: - throw new InvalidArgumentException( - $position . ' is not a valid position' - ); - } - } - - return $this->fields[$position]; - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_FieldInterface.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_FieldInterface.php deleted file mode 100644 index 8105042c..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_FieldInterface.php +++ /dev/null @@ -1,40 +0,0 @@ - - */ -interface CronExpression_FieldInterface -{ - /** - * Check if the respective value of a DateTime field satisfies a CRON exp - * - * @param DateTime $date DateTime object to check - * @param string $value CRON expression to test against - * - * @return bool Returns TRUE if satisfied, FALSE otherwise - */ - public function isSatisfiedBy(DateTime $date, $value); - - /** - * When a CRON expression is not satisfied, this method is used to increment - * or decrement a DateTime object by the unit of the cron field - * - * @param DateTime $date DateTime object to change - * @param bool $invert (optional) Set to TRUE to decrement - * - * @return CronExpression_FieldInterface - */ - public function increment(DateTime $date, $invert = false); - - /** - * Validates a CRON expression for a given field - * - * @param string $value CRON expression value to validate - * - * @return bool Returns TRUE if valid, FALSE otherwise - */ - public function validate($value); -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_HoursField.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_HoursField.php deleted file mode 100644 index 731a6997..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_HoursField.php +++ /dev/null @@ -1,48 +0,0 @@ - - */ -class CronExpression_HoursField extends CronExpression_AbstractField -{ - /** - * {@inheritdoc} - */ - public function isSatisfiedBy(DateTime $date, $value) - { - return $this->isSatisfied($date->format('H'), $value); - } - - /** - * {@inheritdoc} - */ - public function increment(DateTime $date, $invert = false) - { - // Change timezone to UTC temporarily. This will - // allow us to go back or forwards and hour even - // if DST will be changed between the hours. - $timezone = $date->getTimezone(); - $date->setTimezone(new DateTimeZone('UTC')); - if ($invert) { - $date->modify('-1 hour'); - $date->setTime($date->format('H'), 59); - } else { - $date->modify('+1 hour'); - $date->setTime($date->format('H'), 0); - } - $date->setTimezone($timezone); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function validate($value) - { - return (bool) preg_match('/[\*,\/\-0-9]+/', $value); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_MinutesField.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_MinutesField.php deleted file mode 100644 index 5e6fd8b6..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_MinutesField.php +++ /dev/null @@ -1,40 +0,0 @@ - - */ -class CronExpression_MinutesField extends CronExpression_AbstractField -{ - /** - * {@inheritdoc} - */ - public function isSatisfiedBy(DateTime $date, $value) - { - return $this->isSatisfied($date->format('i'), $value); - } - - /** - * {@inheritdoc} - */ - public function increment(DateTime $date, $invert = false) - { - if ($invert) { - $date->modify('-1 minute'); - } else { - $date->modify('+1 minute'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function validate($value) - { - return (bool) preg_match('/[\*,\/\-0-9]+/', $value); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_MonthField.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_MonthField.php deleted file mode 100644 index e9a5e386..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_MonthField.php +++ /dev/null @@ -1,56 +0,0 @@ - - */ -class CronExpression_MonthField extends CronExpression_AbstractField -{ - /** - * {@inheritdoc} - */ - public function isSatisfiedBy(DateTime $date, $value) - { - // Convert text month values to integers - $value = str_ireplace( - array( - 'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', - 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC' - ), - range(1, 12), - $value - ); - - return $this->isSatisfied($date->format('m'), $value); - } - - /** - * {@inheritdoc} - */ - public function increment(DateTime $date, $invert = false) - { - if ($invert) { - // $date->modify('last day of previous month'); // remove for php 5.2 compat - $date->modify('previous month'); - $date->modify($date->format('Y-m-t')); - $date->setTime(23, 59); - } else { - //$date->modify('first day of next month'); // remove for php 5.2 compat - $date->modify('next month'); - $date->modify($date->format('Y-m-01')); - $date->setTime(0, 0); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function validate($value) - { - return (bool) preg_match('/[\*,\/\-0-9A-Z]+/', $value); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_YearField.php b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_YearField.php deleted file mode 100644 index 1403f7f1..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/CronExpression_YearField.php +++ /dev/null @@ -1,44 +0,0 @@ - - */ -class CronExpression_YearField extends CronExpression_AbstractField -{ - /** - * {@inheritdoc} - */ - public function isSatisfiedBy(DateTime $date, $value) - { - return $this->isSatisfied($date->format('Y'), $value); - } - - /** - * {@inheritdoc} - */ - public function increment(DateTime $date, $invert = false) - { - if ($invert) { - $date->modify('-1 year'); - $date->setDate($date->format('Y'), 12, 31); - $date->setTime(23, 59, 0); - } else { - $date->modify('+1 year'); - $date->setDate($date->format('Y'), 1, 1); - $date->setTime(0, 0, 0); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function validate($value) - { - return (bool) preg_match('/[\*,\/\-0-9]+/', $value); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/LICENSE b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/LICENSE deleted file mode 100644 index c6d88ac6..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011 Michael Dowling and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/README.md b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/README.md deleted file mode 100644 index d4d9d5ad..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/lib/cron-expression/README.md +++ /dev/null @@ -1,92 +0,0 @@ -PHP Cron Expression Parser -========================== - -[![Latest Stable Version](https://poser.pugx.org/mtdowling/cron-expression/v/stable.png)](https://packagist.org/packages/mtdowling/cron-expression) [![Total Downloads](https://poser.pugx.org/mtdowling/cron-expression/downloads.png)](https://packagist.org/packages/mtdowling/cron-expression) [![Build Status](https://secure.travis-ci.org/mtdowling/cron-expression.png)](http://travis-ci.org/mtdowling/cron-expression) - -The PHP cron expression parser can parse a CRON expression, determine if it is -due to run, calculate the next run date of the expression, and calculate the previous -run date of the expression. You can calculate dates far into the future or past by -skipping n number of matching dates. - -The parser can handle increments of ranges (e.g. */12, 2-59/3), intervals (e.g. 0-9), -lists (e.g. 1,2,3), W to find the nearest weekday for a given day of the month, L to -find the last day of the month, L to find the last given weekday of a month, and hash -(#) to find the nth weekday of a given month. - -Credits -========== - -Created by Micheal Dowling. Ported to PHP 5.2 by Flightless, Inc. -Based on version 1.0.3: https://github.com/mtdowling/cron-expression/tree/v1.0.3 - -Installing -========== - -Add the following to your project's composer.json: - -```javascript -{ - "require": { - "mtdowling/cron-expression": "1.0.*" - } -} -``` - -Usage -===== -```php -isDue(); -echo $cron->getNextRunDate()->format('Y-m-d H:i:s'); -echo $cron->getPreviousRunDate()->format('Y-m-d H:i:s'); - -// Works with complex expressions -$cron = Cron\CronExpression::factory('3-59/15 2,6-12 */15 1 2-5'); -echo $cron->getNextRunDate()->format('Y-m-d H:i:s'); - -// Calculate a run date two iterations into the future -$cron = Cron\CronExpression::factory('@daily'); -echo $cron->getNextRunDate(null, 2)->format('Y-m-d H:i:s'); - -// Calculate a run date relative to a specific time -$cron = Cron\CronExpression::factory('@monthly'); -echo $cron->getNextRunDate('2010-01-12 00:00:00')->format('Y-m-d H:i:s'); -``` - -CRON Expressions -================ - -A CRON expression is a string representing the schedule for a particular command to execute. The parts of a CRON schedule are as follows: - - * * * * * * - - - - - - - - | | | | | | - | | | | | + year [optional] - | | | | +----- day of week (0 - 7) (Sunday=0 or 7) - | | | +---------- month (1 - 12) - | | +--------------- day of month (1 - 31) - | +-------------------- hour (0 - 23) - +------------------------- min (0 - 59) - -Requirements -============ - -- PHP 5.3+ -- PHPUnit is required to run the unit tests -- Composer is required to run the unit tests - -CHANGELOG -========= - -1.0.3 (2013-11-23) ------------------- - -* Only set default timezone if the given $currentTime is not a DateTime instance (#34) -* Fixes issue #28 where PHP increments of ranges were failing due to PHP casting hyphens to 0 -* Now supports expressions with any number of extra spaces, tabs, or newlines -* Using static instead of self in `CronExpression::factory` diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/license.txt b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/license.txt deleted file mode 100644 index f288702d..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/license.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/readme.txt b/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/readme.txt deleted file mode 100644 index 2afd6278..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/includes/libraries/action-scheduler/readme.txt +++ /dev/null @@ -1,89 +0,0 @@ -=== Action Scheduler === -Contributors: Automattic, wpmuguru, claudiosanches, peterfabian1000, vedjain, jamosova, obliviousharmony, konamiman, sadowski, royho, barryhughes-1 -Tags: scheduler, cron -Requires at least: 5.2 -Tested up to: 5.7 -Stable tag: 3.4.0 -License: GPLv3 -Requires PHP: 5.6 - -Action Scheduler - Job Queue for WordPress - -== Description == - -Action Scheduler is a scalable, traceable job queue for background processing large sets of actions in WordPress. It's specially designed to be distributed in WordPress plugins. - -Action Scheduler works by triggering an action hook to run at some time in the future. Each hook can be scheduled with unique data, to allow callbacks to perform operations on that data. The hook can also be scheduled to run on one or more occassions. - -Think of it like an extension to `do_action()` which adds the ability to delay and repeat a hook. - -## Battle-Tested Background Processing - -Every month, Action Scheduler processes millions of payments for [Subscriptions](https://woocommerce.com/products/woocommerce-subscriptions/), webhooks for [WooCommerce](https://wordpress.org/plugins/woocommerce/), as well as emails and other events for a range of other plugins. - -It's been seen on live sites processing queues in excess of 50,000 jobs and doing resource intensive operations, like processing payments and creating orders, at a sustained rate of over 10,000 / hour without negatively impacting normal site operations. - -This is all on infrastructure and WordPress sites outside the control of the plugin author. - -If your plugin needs background processing, especially of large sets of tasks, Action Scheduler can help. - -## Learn More - -To learn more about how to Action Scheduler works, and how to use it in your plugin, check out the docs on [ActionScheduler.org](https://actionscheduler.org). - -There you will find: - -* [Usage guide](https://actionscheduler.org/usage/): instructions on installing and using Action Scheduler -* [WP CLI guide](https://actionscheduler.org/wp-cli/): instructions on running Action Scheduler at scale via WP CLI -* [API Reference](https://actionscheduler.org/api/): complete reference guide for all API functions -* [Administration Guide](https://actionscheduler.org/admin/): guide to managing scheduled actions via the administration screen -* [Guide to Background Processing at Scale](https://actionscheduler.org/perf/): instructions for running Action Scheduler at scale via the default WP Cron queue runner - -## Credits - -Action Scheduler is developed and maintained by [Automattic](http://automattic.com/) with significant early development completed by [Flightless](https://flightless.us/). - -Collaboration is cool. We'd love to work with you to improve Action Scheduler. [Pull Requests](https://github.com/woocommerce/action-scheduler/pulls) welcome. - -== Changelog == - -= 3.4.0 - 2021-10-29 = -* Enhancement - Number of items per page can now be set for the Scheduled Actions view (props @ovidiul). #771 -* Fix - Do not lower the max_execution_time if it is already set to 0 (unlimited) (props @barryhughes). #755 -* Fix - Avoid triggering autoloaders during the version resolution process (props @olegabr). #731 & #776 -* Dev - ActionScheduler_wcSystemStatus PHPCS fixes (props @ovidiul). #761 -* Dev - ActionScheduler_DBLogger.php PHPCS fixes (props @ovidiul). #768 -* Dev - Fixed phpcs for ActionScheduler_Schedule_Deprecated (props @ovidiul). #762 -* Dev - Improve actions table indicies (props @glagonikas). #774 & #777 -* Dev - PHPCS fixes for ActionScheduler_DBStore.php (props @ovidiul). #769 & #778 -* Dev - PHPCS Fixes for ActionScheduler_Abstract_ListTable (props @ovidiul). #763 & #779 -* Dev - Adds new filter action_scheduler_claim_actions_order_by to allow tuning of the claim query (props @glagonikas). #773 -* Dev - PHPCS fixes for ActionScheduler_WpPostStore class (props @ovidiul). #780 - -= 3.3.0 - 2021-09-15 = -* Enhancement - Adds as_has_scheduled_action() to provide a performant way to test for existing actions. #645 -* Fix - Improves compatibility with environments where NO_ZERO_DATE is enabled. #519 -* Fix - Adds safety checks to guard against errors when our database tables cannot be created. #645 -* Dev - Now supports queries that use multiple statuses. #649 -* Dev - Minimum requirements for WordPress and PHP bumped (to 5.2 and 5.6 respectively). #723 - -= 3.2.1 - 2021-06-21 = -* Fix - Add extra safety/account for different versions of AS and different loading patterns. #714 -* Fix - Handle hidden columns (Tools → Scheduled Actions) | #600. - -= 3.2.0 - 2021-06-03 = -* Fix - Add "no ordering" option to as_next_scheduled_action(). -* Fix - Add secondary scheduled date checks when claiming actions (DBStore) | #634. -* Fix - Add secondary scheduled date checks when claiming actions (wpPostStore) | #634. -* Fix - Adds a new index to the action table, reducing the potential for deadlocks (props: @glagonikas). -* Fix - Fix unit tests infrastructure and adapt tests to PHP 8. -* Fix - Identify in-use data store. -* Fix - Improve test_migration_is_scheduled. -* Fix - PHP notice on list table. -* Fix - Speed up clean up and batch selects. -* Fix - Update pending dependencies. -* Fix - [PHP 8.0] Only pass action arg values through to do_action_ref_array(). -* Fix - [PHP 8] Set the PHP version to 7.1 in composer.json for PHP 8 compatibility. -* Fix - add is_initialized() to docs. -* Fix - fix file permissions. -* Fix - fixes #664 by replacing __ with esc_html__. diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/languages/woocommerce-smart-coupons-fr_FR.mo b/wp/wp-content/plugins/woocommerce-smart-coupons/languages/woocommerce-smart-coupons-fr_FR.mo deleted file mode 100644 index 6f2fbad4..00000000 Binary files a/wp/wp-content/plugins/woocommerce-smart-coupons/languages/woocommerce-smart-coupons-fr_FR.mo and /dev/null differ diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/languages/woocommerce-smart-coupons-fr_FR.po b/wp/wp-content/plugins/woocommerce-smart-coupons/languages/woocommerce-smart-coupons-fr_FR.po deleted file mode 100644 index 70f5fb6d..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/languages/woocommerce-smart-coupons-fr_FR.po +++ /dev/null @@ -1,5399 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: WooCommerce Smart Coupons\n" -"POT-Creation-Date: 2022-08-07 10:58+0200\n" -"PO-Revision-Date: 2022-08-07 11:43+0200\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: fr_FR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.1.1\n" -"X-Poedit-Basepath: ..\n" -"X-Poedit-Flags-xgettext: --add-comments=translators:\n" -"X-Poedit-WPHeader: woocommerce-smart-coupons.php\n" -"X-Poedit-SourceCharset: UTF-8\n" -"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" -"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" -"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" -"X-Poedit-Bookmarks: -1,-1,-1,-1,182,-1,-1,-1,-1,-1\n" -"X-Poedit-SearchPath-0: .\n" -"X-Poedit-SearchPathExcluded-0: *.min.js\n" - -#: includes/blocks/sc-gutenberg-block.js:43 -#: includes/class-wc-sc-settings.php:94 -msgid "Smart Coupons" -msgstr "Smart Coupons" - -#: includes/blocks/sc-gutenberg-block.js:48 -msgid "Show any WooCommerce coupon with Smart Coupons." -msgstr "Montrez n’importe quel code promo WooCommerce avec Smart Coupons." - -#: includes/blocks/sc-gutenberg-block.js:65 -msgid "Smart" -msgstr "Smart" - -#: includes/blocks/sc-gutenberg-block.js:66 -#: includes/class-wc-sc-admin-pages.php:120 -#: includes/class-wc-sc-admin-pages.php:547 -#: includes/class-wc-sc-admin-pages.php:552 -#: includes/class-wc-sc-admin-pages.php:1563 -#: includes/class-wc-sc-background-coupon-importer.php:387 -#: includes/class-wc-sc-display-coupons.php:791 -#: includes/class-wc-sc-display-coupons.php:828 -#: includes/class-wc-sc-display-coupons.php:1639 -#: includes/class-wc-sc-product-fields.php:96 -#: includes/class-wc-sc-product-fields.php:153 -msgid "Coupons" -msgstr "Codes promo" - -#: includes/blocks/sc-gutenberg-block.js:67 -#: includes/class-wc-sc-admin-pages.php:1368 -#: includes/class-wc-sc-admin-pages.php:1378 -#: includes/class-wc-sc-admin-pages.php:1534 includes/class-wc-sc-ajax.php:338 -#: includes/class-wc-smart-coupons.php:1030 -#: includes/emails/class-wc-sc-email-coupon.php:348 -#: includes/emails/class-wc-sc-email-coupon.php:468 -msgid "Store Credit" -msgstr "Bon d’achat" - -#: includes/class-wc-sc-act-deact.php:226 -msgid "Successfully cleared WooCommerce Smart Coupons cache!" -msgstr "Cache WooCommerce Smart Coupons effacé !" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:116 -msgid "Copy this coupon code" -msgstr "Copier ce code promo" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:116 -msgid "Copy" -msgstr "Copier" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:118 -msgid "Copy coupon shareable link and apply via URL" -msgstr "Copier le lien partageable du code promo et l’appliquer par URL" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:118 -msgid "Get shareable link" -msgstr "Obtenir un lien partageable" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:123 -msgid "Make a duplicate from this coupon" -msgstr "Faire un duplicata de ce code promo" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:123 -msgid "Duplicate" -msgstr "Dupliquer" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:200 -msgid "(Copy)" -msgstr "(Copie)" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:267 -msgid "No coupon to duplicate has been supplied!" -msgstr "Aucun code promo Ă  dupliquer n’a Ă©tĂ© fourni !" - -#. translators: %d: Post ID -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:289 -#, php-format -msgid "Coupon creation failed, could not find original product: %d" -msgstr "" -"La crĂ©ation de code promo a Ă©chouĂ©, impossible de trouver le produit " -"original : %d" - -#: includes/class-wc-sc-admin-notifications.php:99 -#: includes/class-wc-sc-admin-welcome.php:197 -msgid "Settings" -msgstr "Paramètres" - -#: includes/class-wc-sc-admin-notifications.php:100 -#: includes/class-wc-sc-admin-pages.php:156 -#: includes/class-wc-sc-admin-pages.php:607 -#: includes/class-wc-sc-admin-welcome.php:223 -msgid "FAQ's" -msgstr "FAQ" - -#: includes/class-wc-sc-admin-notifications.php:101 -#: includes/class-wc-sc-admin-welcome.php:198 -msgid "Docs" -msgstr "Docs" - -#: includes/class-wc-sc-admin-notifications.php:102 -msgid "Support" -msgstr "Support" - -#: includes/class-wc-sc-admin-notifications.php:103 -msgid "Review" -msgstr "Avis" - -#. translators: 1. Coupon type -#: includes/class-wc-sc-admin-notifications.php:165 -#: includes/class-wc-sc-background-coupon-importer.php:324 -#: includes/class-wc-sc-background-coupon-importer.php:391 -#: includes/class-wc-smart-coupons.php:4669 -msgid "Important" -msgstr "Important" - -#: includes/class-wc-sc-admin-notifications.php:165 -msgid "Setting \"Enable the use of coupon codes\" is disabled." -msgstr "Le paramètre « activer l’utilisation des codes promo » est dĂ©sactivĂ©." - -#: includes/class-wc-sc-admin-notifications.php:176 -msgid "Enable" -msgstr "Activer" - -#: includes/class-wc-sc-admin-notifications.php:177 -msgid "it to use" -msgstr "Ă  utiliser" - -#. Plugin Name of the plugin/theme -#: includes/class-wc-sc-admin-notifications.php:177 -#: includes/class-wc-sc-admin-notifications.php:243 -#: includes/class-wc-sc-admin-notifications.php:257 -#: includes/class-wc-sc-settings.php:892 includes/class-wc-sc-settings.php:895 -msgid "WooCommerce Smart Coupons" -msgstr "WooCommerce Smart Coupons" - -#: includes/class-wc-sc-admin-notifications.php:177 -msgid "features." -msgstr "caractĂ©ristiques." - -#: includes/class-wc-sc-admin-notifications.php:239 -msgid "Remind me after a month" -msgstr "Rappelez-moi après un mois" - -#: includes/class-wc-sc-admin-notifications.php:240 -#: includes/class-wc-sc-print-coupon.php:275 -msgid "Never show again" -msgstr "Ne plus afficher" - -#: includes/class-wc-sc-admin-notifications.php:243 -msgid "" -"Awesome, you successfully auto-generated a coupon! Are you having a great " -"experience with" -msgstr "" -"Bravo, vous avez rĂ©ussi Ă  gĂ©nĂ©rer automatiquement un code promo ! Avez-vous " -"une bonne expĂ©rience avec" - -#: includes/class-wc-sc-admin-notifications.php:243 -msgid "so far?" -msgstr "jusqu’à prĂ©sent ?" - -#: includes/class-wc-sc-admin-notifications.php:243 -msgid "Please consider" -msgstr "Veuillez considĂ©rer" - -#: includes/class-wc-sc-admin-notifications.php:243 -msgid "leaving a review" -msgstr "laisser un commentaire" - -#: includes/class-wc-sc-admin-notifications.php:243 -msgid "" -"! If things aren't going quite as expected, we're happy to help -- please " -"reach out to" -msgstr "" -"! Si les choses ne se passent pas tout Ă  fait comme prĂ©vu, nous serons " -"heureux de vous aider — contactez-nous pour" - -#: includes/class-wc-sc-admin-notifications.php:243 -msgid "our support team" -msgstr "notre Ă©quipe de support" - -#. translators: 1: WooCommerce Smart Coupons 2: Link for the Smart Coupons settings -#: includes/class-wc-sc-admin-notifications.php:256 -#, php-format -msgid "" -"%1$s: You are using a custom coupon style which is planned to be removed " -"from the plugin in upcoming versions. New, improved styles & colors are " -"added in the version 4.9.0. We would request you to choose a color scheme & " -"a style for coupon from the newly added colors & styles. You can do this " -"from %2$s." -msgstr "" -"%1$s : Vous utilisez un style de code promo personnalisĂ© qu’il est prĂ©vu de " -"supprimer de l’extension dans les prochaines versions. De nouveaux styles et " -"couleurs amĂ©liorĂ©s ont Ă©tĂ© ajoutĂ©s dans la version 4.9.0. Nous vous " -"demandons de choisir un schĂ©ma de couleurs et un style de code promo parmi " -"les nouvelles couleurs et les nouveaux styles ajoutĂ©s. Vous pouvez le faire " -"Ă  partir de %2$s." - -#: includes/class-wc-sc-admin-notifications.php:267 -msgid "Smart Coupons settings" -msgstr "RĂ©glages Smart Coupons" - -#. translators: %s: link to review WooCommerce Smart Coupons -#: includes/class-wc-sc-admin-notifications.php:304 -#, php-format -msgid "" -"Liked WooCommerce Smart Coupons? Leave us a %s. A huge thank you from " -"WooCommerce & StoreApps in advance!" -msgstr "" -"Aimez-vous WooCommerce Smart Coupons ? Laissez-nous un %s. WooCommerce & " -"StoreApps vous remercient Ă  l’avance !" - -#. translators: %s: link to submit idea for Smart Coupons on WooCommerce idea board -#: includes/class-wc-sc-admin-notifications.php:330 -#, php-format -msgid "Have a feature request? Submit it %s." -msgstr "Vous avez une demande de fonctionnalité ? Soumettez-la ici %s." - -#: includes/class-wc-sc-admin-notifications.php:330 -#: includes/class-wc-sc-admin-welcome.php:361 -#: includes/class-wc-sc-admin-welcome.php:369 -#: includes/class-wc-sc-background-coupon-importer.php:610 -#: includes/class-wc-sc-print-coupon.php:278 -msgid "here" -msgstr "ici" - -#. translators: %s: Plugin name -#: includes/class-wc-sc-admin-notifications.php:416 -#, php-format -msgid "%s database update required" -msgstr "%s mise Ă  jour de la base de donnĂ©es de requise" - -#: includes/class-wc-sc-admin-notifications.php:417 -msgid "" -"The database update process runs in the background and may take a little " -"while, so please be patient." -msgstr "" -"Le processus de mise Ă  jour de la base de donnĂ©es s’exĂ©cute en arrière-plan " -"et peut prendre un peu de temps, alors soyez patient." - -#: includes/class-wc-sc-admin-notifications.php:430 -msgid "Update database" -msgstr "Mettre Ă  jour la base de donnĂ©es" - -#. translators: %s: Plugin name -#: includes/class-wc-sc-admin-notifications.php:454 -#, php-format -msgid "" -"%s is updating the database in the background. The database update process " -"may take a little while, so please be patient." -msgstr "" -"%s met Ă  jour la base de donnĂ©es en arrière-plan. Le processus de mise Ă  " -"jour de la base de donnĂ©es peut prendre un peu de temps, alors soyez patient." - -#: includes/class-wc-sc-admin-notifications.php:456 -msgid "" -"Note: WP CRON has been disabled on your install which may prevent this " -"update from completing." -msgstr "" -"Remarque : WP CRON a Ă©tĂ© dĂ©sactivĂ© sur votre installation, ce qui peut " -"empĂŞcher cette mise Ă  jour de se terminer." - -#: includes/class-wc-sc-admin-notifications.php:458 -msgid "View status" -msgstr "Voir le statut" - -#. translators: %s: Plugin name -#: includes/class-wc-sc-admin-notifications.php:467 -#, php-format -msgid "" -"%s database update completed. Thank you for updating to the latest version!" -msgstr "" -"Mise Ă  jour de la base de donnĂ©es %s terminĂ©e. Merci d’avoir mis Ă  jour Ă  la " -"dernière version !" - -#: includes/class-wc-sc-admin-pages.php:121 -#: includes/class-wc-sc-admin-pages.php:553 -#: includes/class-wc-sc-admin-pages.php:1537 -msgid "Bulk Generate" -msgstr "GĂ©nĂ©rer en masse" - -#: includes/class-wc-sc-admin-pages.php:130 -#: includes/class-wc-sc-admin-pages.php:563 -#: includes/class-wc-sc-admin-pages.php:1530 -msgid "Import Coupons" -msgstr "Importer des codes promo" - -#. translators: %s: singular name for store credit -#. translators: %s: sigular name for store credit -#. translators: Store Credit label -#: includes/class-wc-sc-admin-pages.php:140 -#: includes/class-wc-sc-admin-pages.php:576 -#: includes/class-wc-sc-admin-pages.php:1534 -#, php-format -msgid "Send %s" -msgstr "Envoyer %s" - -#: includes/class-wc-sc-admin-pages.php:140 -#: includes/class-wc-sc-admin-pages.php:576 -msgid "Send Store Credit" -msgstr "Envoyer le bon d’achat" - -#: includes/class-wc-sc-admin-pages.php:149 -#: includes/class-wc-sc-admin-pages.php:593 -#: includes/class-wc-sc-settings.php:345 -msgid "Smart Coupons Settings" -msgstr "Paramètres des codes promos" - -#. translators: Decimal point -#: includes/class-wc-sc-admin-pages.php:194 -#, php-format -msgid "Please enter in decimal (%s) format without thousand separators." -msgstr "Veuillez saisir en format dĂ©cimal (%s) sans sĂ©parateur de milliers." - -#. translators: Decimal point -#: includes/class-wc-sc-admin-pages.php:196 -#, php-format -msgid "" -"Please enter in monetary decimal (%s) format without thousand separators and " -"currency symbols." -msgstr "" -"Veuillez saisir en format monĂ©taire, avec dĂ©cimal, (%s) sans sĂ©parateur de " -"milliers et sans symbole monĂ©taire." - -#: includes/class-wc-sc-admin-pages.php:197 -msgid "Please enter in country code with two capital letters." -msgstr "Veuillez saisir un code pays avec deux lettres majuscules." - -#: includes/class-wc-sc-admin-pages.php:198 -msgid "Please enter in a value less than the regular price." -msgstr "Veuillez saisir une valeur infĂ©rieure au tarif normal." - -#: includes/class-wc-sc-admin-pages.php:202 -#: includes/class-wc-sc-coupon-import.php:835 -msgid "Import" -msgstr "Importer" - -#: includes/class-wc-sc-admin-pages.php:203 -#: includes/class-wc-smart-coupons.php:3525 -msgid "Export" -msgstr "Exporter" - -#: includes/class-wc-sc-admin-pages.php:212 -msgid "" -"Are you sure you want to remove the selected items? If you have previously " -"reduced this item's stock, or this order was submitted by a customer, you " -"will need to manually restore the item's stock." -msgstr "" -"ĂŠtes-vous sĂ»r de vouloir supprimer ces articles ? Si vous avez prĂ©cĂ©demment " -"rĂ©duit le stock de cet article, ou bien si cette commande a Ă©tĂ© envoyĂ©e par " -"un client, vous devrez manuellement restaurer le stock de cet article." - -#: includes/class-wc-sc-admin-pages.php:213 -msgid "Please select some items." -msgstr "Veuillez sĂ©lectionner quelques articles." - -#: includes/class-wc-sc-admin-pages.php:214 -msgid "" -"Are you sure you wish to process this refund? This action cannot be undone." -msgstr "" -"ĂŠtes-vous sĂ»r de vouloir procĂ©der Ă  ce remboursement ? Cette action est " -"irrĂ©versible." - -#: includes/class-wc-sc-admin-pages.php:215 -#: includes/class-wc-sc-coupon-refund-process.php:434 -msgid "" -"Are you sure you wish to delete this refund? This action cannot be undone." -msgstr "" -"ĂŠtes-vous sĂ»r de vouloir supprimer ce remboursement ? Cette action est " -"irrĂ©versible." - -#: includes/class-wc-sc-admin-pages.php:216 -msgid "" -"Are you sure you wish to delete this tax column? This action cannot be " -"undone." -msgstr "" -"ĂŠtes-vous sur de vouloir supprimer cette colonne de TVA ? Cette action " -"est irrĂ©versible." - -#: includes/class-wc-sc-admin-pages.php:217 -msgid "Remove this item meta?" -msgstr "Supprimer la mĂ©ta de cet article ?" - -#: includes/class-wc-sc-admin-pages.php:218 -msgid "Remove this attribute?" -msgstr "Supprimer cet attribut ?" - -#: includes/class-wc-sc-admin-pages.php:219 -msgid "Name" -msgstr "Nom" - -#: includes/class-wc-sc-admin-pages.php:220 -msgid "Remove" -msgstr "Supprimer" - -#: includes/class-wc-sc-admin-pages.php:221 -msgid "Click to toggle" -msgstr "Cliquez ici pour basculer" - -#: includes/class-wc-sc-admin-pages.php:222 -msgid "Value(s)" -msgstr "Valeur(s)" - -#: includes/class-wc-sc-admin-pages.php:223 -msgid "Enter some text, or some attributes by pipe (|) separating values." -msgstr "" -"Saisissez du texte, ou des attributs en les sĂ©parant avec une barre " -"verticale (|)." - -#: includes/class-wc-sc-admin-pages.php:224 -msgid "Visible on the product page" -msgstr "Visible sur la page « Produit »" - -#: includes/class-wc-sc-admin-pages.php:225 -msgid "Used for variations" -msgstr "UtilisĂ© pour les variations" - -#: includes/class-wc-sc-admin-pages.php:226 -msgid "Enter a name for the new attribute term:" -msgstr "Saisissez un nom pour le nouvel attribut du terme :" - -#: includes/class-wc-sc-admin-pages.php:227 -msgid "Calculate totals based on order items, discounts, and shipping?" -msgstr "Calculer le total des articles, les remises, et la livraison ?" - -#: includes/class-wc-sc-admin-pages.php:228 -msgid "" -"Calculate line taxes? This will calculate taxes based on the customers " -"country. If no billing/shipping is set it will use the store base country." -msgstr "" -"Calculer la TVA en ligne ? Cela calculera la TVA basĂ©e sur le pays des " -"clients. Si aucune reçu/livraison n’est paramĂ©trĂ©e cela prendra le " -"pays de base de la boutique." - -#: includes/class-wc-sc-admin-pages.php:229 -msgid "" -"Copy billing information to shipping information? This will remove any " -"currently entered shipping information." -msgstr "" -"Copier les informations de facturation vers les informations d’expĂ©dition ? " -"Ceci enlèvera tout ce qui a Ă©tĂ© entrĂ© dans les informations d’expĂ©dition." - -#: includes/class-wc-sc-admin-pages.php:230 -msgid "" -"Load the customer's billing information? This will remove any currently " -"entered billing information." -msgstr "" -"Charger les informations de facturation du client ? Ceci supprimera toutes " -"les informations de facturation actuellement saisies." - -#: includes/class-wc-sc-admin-pages.php:231 -msgid "" -"Load the customer's shipping information? This will remove any currently " -"entered shipping information." -msgstr "" -"Charger les informations de livraison du client ? Ceci supprimera toutes les " -"informations de livraison actuellement saisies." - -#: includes/class-wc-sc-admin-pages.php:232 -msgid "Featured" -msgstr "En vedette" - -#: includes/class-wc-sc-admin-pages.php:235 -msgid "No customer selected" -msgstr "Aucun client sĂ©lectionnĂ©" - -#: includes/class-wc-sc-admin-pages.php:268 -msgid "" -"Could not grant access - the user may already have permission for this file " -"or billing email is not set. Ensure the billing email is set, and the order " -"has been saved." -msgstr "" -"Impossible d’accorder l’accès - l’utilisateur peut dĂ©jĂ  " -"avoir la permission pour ce fichier ou l’e-mail de facturation n’" -"est pas dĂ©fini. Assurez-vous que l’e-mail de facturation est dĂ©fini, " -"et que l’adhĂ©sion a Ă©tĂ© sauvegardĂ©e." - -#: includes/class-wc-sc-admin-pages.php:269 -msgid "Are you sure you want to revoke access to this download?" -msgstr "ĂŠtes-vous certain de vouloir supprimer l’accès Ă  ce tĂ©lĂ©chargement ?" - -#: includes/class-wc-sc-admin-pages.php:270 -msgid "You cannot add the same tax rate twice!" -msgstr "Vous ne pouvez pas ajouter deux fois le mĂŞme taux de TVA !" - -#: includes/class-wc-sc-admin-pages.php:271 -msgid "" -"Your product has variations! Before changing the product type, it is a good " -"idea to delete the variations to avoid errors in the stock reports." -msgstr "" -"Votre produit comporte des variations ! Avant de changer le type de produit, " -"c’est une bonne idĂ©e de supprimer les variations pour Ă©viter les erreurs " -"dans les rapports de stock." - -#: includes/class-wc-sc-admin-pages.php:281 -msgid "Generate coupon code" -msgstr "GĂ©nĂ©rer un code promo" - -#: includes/class-wc-sc-admin-pages.php:317 -msgid "Import complete - imported" -msgstr "Import complet - importĂ©" - -#: includes/class-wc-sc-admin-pages.php:317 -msgid "skipped" -msgstr "ignorĂ©" - -#: includes/class-wc-sc-admin-pages.php:382 -msgid "WooCommerce Coupons (CSV)" -msgstr "WooCommerce Coupons (CSV)" - -#: includes/class-wc-sc-admin-pages.php:382 -msgid "Import coupons to your store via a csv file." -msgstr "" -"Importez des codes promo Ă  votre magasin via un fichier CSV." - -#: includes/class-wc-sc-admin-pages.php:518 -#: includes/class-wc-sc-admin-pages.php:520 -msgid "Smart Coupon" -msgstr "Smart Coupon" - -#: includes/class-wc-sc-admin-pages.php:548 -msgid "Add Coupon" -msgstr "Ajouter un code promo" - -#: includes/class-wc-sc-admin-pages.php:614 -#: includes/class-wc-sc-admin-pages.php:1112 -msgid "Required" -msgstr "Requis" - -#: includes/class-wc-sc-admin-pages.php:614 -msgid "Please install and enable PHP extension" -msgstr "Veuillez installer et activer l’extension PHP" - -#: includes/class-wc-sc-admin-pages.php:614 -msgid "Click here" -msgstr "Cliquez ici" - -#: includes/class-wc-sc-admin-pages.php:614 -msgid "for more details." -msgstr "pour plus de dĂ©tails." - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-admin-pages.php:674 -#, php-format -msgid "%s sent successfully." -msgstr "%s envoyĂ© avec succès." - -#: includes/class-wc-sc-admin-pages.php:674 -msgid "Store Credit / Gift Certificate sent successfully." -msgstr "Bon d’achat/carte cadeau envoyĂ© avec succès." - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-admin-pages.php:678 -#, php-format -msgid "There has been an error in sending %s." -msgstr "Il y a eu une erreur lors de l’envoi de %s." - -#: includes/class-wc-sc-admin-pages.php:678 -msgid "There has been an error in sending Store Credit / Gift Certificate." -msgstr "Il y a eu une erreur dans l’envoi de bon d’achat/carte cadeau." - -#: includes/class-wc-sc-admin-pages.php:679 -msgid "Please try again later." -msgstr "Veuillez rĂ©essayer ultĂ©rieurement." - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-admin-pages.php:729 -#, php-format -msgid "Quickly create and email %s to one or more people." -msgstr "" -"CrĂ©er rapidement et envoyer par e-mail %s Ă  une ou plusieurs personnes." - -#: includes/class-wc-sc-admin-pages.php:731 -msgid "" -"Quickly create and email Store Credit or Gift Card to one or more people." -msgstr "" -"CrĂ©ez et envoyer rapidement par e-mail un bon d’achat ou une carte-cadeau Ă  " -"une ou plusieurs personnes." - -#: includes/class-wc-sc-admin-pages.php:764 -#: includes/class-wc-sc-admin-pages.php:1153 -#: includes/class-wc-sc-admin-pages.php:1171 -msgid "Send to" -msgstr "Envoyer Ă " - -#: includes/class-wc-sc-admin-pages.php:772 -msgid "Invalid email address." -msgstr "Adresse e-mail non valide." - -#: includes/class-wc-sc-admin-pages.php:775 -#: includes/class-wc-sc-admin-pages.php:1177 -msgid "Use comma \",\" to separate multiple email addresses" -msgstr "Utilisez la virgule \",\" pour sĂ©parer plusieurs adresses e-mail" - -#: includes/class-wc-sc-admin-pages.php:781 -msgid "Worth" -msgstr "Valeur" - -#: includes/class-wc-sc-admin-pages.php:786 -#: includes/class-wc-sc-coupon-fields.php:664 -msgid "0.00" -msgstr "0.00" - -#: includes/class-wc-sc-admin-pages.php:792 -#: includes/class-wc-sc-purchase-credit.php:142 -msgid "Invalid amount." -msgstr "Montant invalide." - -#: includes/class-wc-sc-admin-pages.php:802 -msgid "Expiry Date" -msgstr "Date d’expiration" - -#: includes/class-wc-sc-admin-pages.php:809 -msgid "The store credit will expire at 00:00:00 of this date." -msgstr "Ce crĂ©dit expirera Ă  00:00:00 Ă  cette date." - -#: includes/class-wc-sc-admin-pages.php:817 -#: includes/class-wc-sc-admin-pages.php:1182 -#: includes/class-wc-sc-display-coupons.php:2083 -#: includes/class-wc-sc-display-coupons.php:2116 -#: includes/class-wc-sc-privacy.php:564 -msgid "Message" -msgstr "Message" - -#: includes/class-wc-sc-admin-pages.php:817 -#: includes/class-wc-sc-admin-pages.php:1182 -msgid "(optional)" -msgstr "(facultatif)" - -#. translators: 1. Coupon type 2. Coupon amount -#: includes/class-wc-sc-admin-pages.php:827 -#: includes/class-wc-sc-purchase-credit.php:834 -msgid "Send" -msgstr "Envoyer" - -#: includes/class-wc-sc-admin-pages.php:833 -#: includes/class-wc-sc-admin-pages.php:1197 -msgid "Preview Email" -msgstr "PrĂ©visualiser Email" - -#: includes/class-wc-sc-admin-pages.php:981 -msgid "Please enter a valid value for Number of Coupons to Generate" -msgstr "Entrez une valeur valide pour le nombre de codes promo Ă  gĂ©nĂ©rer" - -#: includes/class-wc-sc-admin-pages.php:1062 -msgid "Need a lot of coupons? You can easily do that with Smart Coupons." -msgstr "" -"Besoin de beaucoup de codes promo ? Vous pouvez facilement le faire avec des " -"Smart Coupons." - -#: includes/class-wc-sc-admin-pages.php:1106 -msgid "Action" -msgstr "Action" - -#: includes/class-wc-sc-admin-pages.php:1112 -#: includes/class-wc-sc-admin-pages.php:1153 -msgid "Number of coupons to generate" -msgstr "Nombre de codes promo Ă  gĂ©nĂ©rer" - -#: includes/class-wc-sc-admin-pages.php:1113 -msgid "10" -msgstr "10" - -#: includes/class-wc-sc-admin-pages.php:1117 -msgid "Generate coupons and" -msgstr "GĂ©nĂ©rer des codes promo et" - -#: includes/class-wc-sc-admin-pages.php:1119 -msgid "Add to store" -msgstr "Ajouter dans la boutique" - -#: includes/class-wc-sc-admin-pages.php:1125 -msgid "Export to CSV" -msgstr "Exporter au format CSV" - -#: includes/class-wc-sc-admin-pages.php:1137 -msgid "(Does not add to store, but creates a .csv file, that you can" -msgstr "" -"(Ne s’ajoute pas Ă  la boutique, mais crĂ©e un fichier .csv que vous pouvez" - -#: includes/class-wc-sc-admin-pages.php:1137 -#: includes/class-wc-sc-background-coupon-importer.php:351 -msgid "import" -msgstr "importer" - -#: includes/class-wc-sc-admin-pages.php:1137 -msgid "later" -msgstr "plus tard" - -#: includes/class-wc-sc-admin-pages.php:1145 -msgid "Email to recipients" -msgstr "E-mail aux destinataires" - -#: includes/class-wc-sc-admin-pages.php:1147 -msgid "(Add to store and email generated coupons to recipients)" -msgstr "" -"(Ajouter des codes promo automatiques et les envoyer par e-mail aux " -"destinataires)" - -#. translators: 1: Path to setting 2: Setting to set email address 3: Setting for number of coupons to generate -#: includes/class-wc-sc-admin-pages.php:1153 -#, php-format -msgid "" -"Enter the email addresses of the recipients separated by comma under %1$1s. " -"Make sure to match the count of email addresses in %2$2s to %3$3s" -msgstr "" -"Entrez les adresses e-mail des destinataires sĂ©parĂ©es par des virgules " -"%1$1s. Assurez-vous d’avoir le mĂŞme nombre d’adresses e-mail en %2$2s Ă  %3$3s" - -#: includes/class-wc-sc-admin-pages.php:1165 -msgid "Email to " -msgstr "Envoyer un e-mail Ă  " - -#: includes/class-wc-sc-admin-pages.php:1219 -msgid "Coupon Description " -msgstr "Description du code promo " - -#. translators: 1: HTML small tag start 2: HTML small tag end -#: includes/class-wc-sc-admin-pages.php:1221 -#, php-format -msgid "" -"%1$s(This will add the same coupon description in all the bulk generated " -"coupons)%2$s" -msgstr "" -"%1$s(Ceci ajoutera la mĂŞme description de code promo dans tous les codes " -"promo gĂ©nĂ©rĂ©s en masse)%2$s" - -#: includes/class-wc-sc-admin-pages.php:1234 -msgid "Coupon Data" -msgstr "DonnĂ©es du code promo" - -#: includes/class-wc-sc-admin-pages.php:1244 -#: includes/class-wc-sc-coupon-categories.php:86 -#: includes/class-wc-sc-coupon-columns.php:129 -msgid "Coupon categories" -msgstr "CatĂ©gories de codes promo" - -#: includes/class-wc-sc-admin-pages.php:1248 -#: includes/class-wc-sc-coupon-categories.php:104 -#: includes/class-wc-sc-coupon-categories.php:163 -#: includes/class-wc-smart-coupons.php:3529 -msgid "Manage coupon categories" -msgstr "GĂ©rer les catĂ©gories de codes promo" - -#: includes/class-wc-sc-admin-pages.php:1290 -msgid "Apply" -msgstr "Appliquer" - -#. translators: 1: Singular name for post type 2: Email -#: includes/class-wc-sc-admin-pages.php:1494 -#, php-format -msgid "[%1$s restricted with email: %2$s]" -msgstr "[%1$s restreint avec e-mail: %2$s]" - -#: includes/class-wc-sc-admin-pages.php:1553 -msgid "WooCommerce" -msgstr "WooCommerce" - -#: includes/class-wc-sc-admin-pages.php:1558 -msgid "Marketing" -msgstr "Marketing" - -#: includes/class-wc-sc-admin-welcome.php:87 -msgid "About Smart Coupons" -msgstr "Ă€ propos de Smart Coupon" - -#: includes/class-wc-sc-admin-welcome.php:88 -msgid "Welcome to Smart Coupons" -msgstr "Bienvenue dans Smart Coupons" - -#: includes/class-wc-sc-admin-welcome.php:177 -msgid "Thank you for installing WooCommerce Smart Coupons" -msgstr "Merci d’avoir installĂ© WooCommerce Smart Coupons" - -#: includes/class-wc-sc-admin-welcome.php:179 -msgid "" -"Glad to have you onboard. We hope WooCommerce Smart Coupons adds to your " -"desired success 🏆" -msgstr "" -"Heureux de vous avoir Ă  bord. Nous espĂ©rons que WooCommerce Smart Coupons " -"participera Ă  votre succès 🏆" - -#: includes/class-wc-sc-admin-welcome.php:183 -msgid "Go To Coupons" -msgstr "Aller aux Codes promo" - -#: includes/class-wc-sc-admin-welcome.php:214 -msgid "Know Smart Coupons" -msgstr "En savoir plus sur Smart Coupons" - -#: includes/class-wc-sc-admin-welcome.php:252 -msgid "What is Smart Coupons?" -msgstr "Qu’est-ce que Smart Coupons ?" - -#: includes/class-wc-sc-admin-welcome.php:254 -msgid "" -"Smart Coupons is a powerful extension, built on top of WooCommerce coupons. " -"It adds a new discount type - Store Credit - and advanced functionality to " -"the default coupons." -msgstr "" -"Smart Coupons est une extension puissante, construite sur les codes promo de " -"WooCommerce. Elle ajoute un nouveau type de rĂ©duction - le bon d’achat - et " -"des fonctionnalitĂ©s avancĂ©es aux codes promo par dĂ©faut." - -#: includes/class-wc-sc-admin-welcome.php:255 -msgid "Smart Coupons enable coupons to become an automatic/interactive system." -msgstr "" -"Les codes promo intelligents permettent aux codes promo de devenir un " -"système automatique/interactif." - -#: includes/class-wc-sc-admin-welcome.php:259 -msgid "Top Smart Coupons features" -msgstr "CaractĂ©ristiques de Smart Coupons" - -#: includes/class-wc-sc-admin-welcome.php:261 -msgid "Create and gift Store Credit / Gift Cards" -msgstr "CrĂ©er et offrir des bons d’achat/cartes cadeaux" - -#: includes/class-wc-sc-admin-welcome.php:262 -msgid "Bulk generate coupons" -msgstr "GĂ©nère des codes promo en masse" - -#: includes/class-wc-sc-admin-welcome.php:263 -msgid "Apply multiple coupons via URL" -msgstr "Appliquer plusieurs codes promo via l’URL" - -#: includes/class-wc-sc-admin-welcome.php:264 -msgid "" -"Advanced restrictions - payment, shipping, location, user roles, product " -"attributes" -msgstr "" -"Restrictions avancĂ©es - paiement, expĂ©dition, localisation, rĂ´les des " -"utilisateurs, attributs des produits" - -#: includes/class-wc-sc-admin-welcome.php:267 -msgid "and a lot more…" -msgstr "et bien plus encore…" - -#: includes/class-wc-sc-admin-welcome.php:271 -msgid "Automatic payment for subscription renewals" -msgstr "Paiement automatique pour les renouvellements d’abonnement" - -#. translators: WooCommerce Subscriptions product link -#: includes/class-wc-sc-admin-welcome.php:275 -#, php-format -msgid "" -"If your store is using %s and your customer has purchased a subscription " -"using a Store Credit. If that store credit has balance left in it, store " -"will automatically use it for renewing that subscription." -msgstr "" -"Si votre magasin utilise %s et que votre client a achetĂ© un abonnement en " -"utilisant un bon d’achat. S’il reste un solde dans ce crĂ©dit, le magasin " -"l’utilisera automatiquement pour renouveler cet abonnement." - -#: includes/class-wc-sc-admin-welcome.php:275 -msgid "WooCommerce Subscriptions" -msgstr "WooCommerce Subscriptions" - -#: includes/class-wc-sc-admin-welcome.php:280 -msgid "How to use Smart Coupons the best way" -msgstr "Comment utiliser au mieux les codes promo intelligents" - -#: includes/class-wc-sc-admin-welcome.php:283 -msgid "Sell or issue store credit / gift cards" -msgstr "Vendre ou Ă©mettre des bons d’achat/cartes cadeaux" - -#. translators: 1: Affiliate For WooCommerce 2: Smart Manager 3: Smart Offers -#: includes/class-wc-sc-admin-welcome.php:287 -#, php-format -msgid "" -"Let customers purchase gift cards from you or you issue store credit that " -"your users can redeem on the current or next purchase. See how: %1$s or %2$s" -msgstr "" -"Permettez aux clients de vous acheter des cartes-cadeaux ou Ă©mettez des bons " -"d’achat que vos utilisateurs peuvent utiliser pour l’achat en cours ou le " -"suivant. Voir comment : %1$s ou %2$s" - -#: includes/class-wc-sc-admin-welcome.php:287 -msgid "any amount" -msgstr "n’importe quel montant" - -#: includes/class-wc-sc-admin-welcome.php:287 -msgid "variable but fixed amount" -msgstr "variable, mais montant fixe" - -#: includes/class-wc-sc-admin-welcome.php:292 -msgid "Bulk create unique coupons & email them" -msgstr "CrĂ©ez des codes promo uniques en lot et envoyez-les par e-mail" - -#: includes/class-wc-sc-admin-welcome.php:294 -msgid "" -"Import and export unique coupons in bulk via CSV. Share coupon codes to deal " -"sites or email them to your customers." -msgstr "" -"Importation et exportation de codes promo uniques en masse via CSV. Partagez " -"les codes promo sur des sites de vente ou envoyez-les par e-mail Ă  vos " -"clients." - -#: includes/class-wc-sc-admin-welcome.php:294 -#: includes/class-wc-sc-admin-welcome.php:300 -#: includes/class-wc-sc-admin-welcome.php:308 -#: includes/class-wc-sc-admin-welcome.php:401 -msgid "See how" -msgstr "Voyez comment" - -#: includes/class-wc-sc-admin-welcome.php:298 -msgid "Gift a product via coupon" -msgstr "Offrir un produit via un code promo" - -#: includes/class-wc-sc-admin-welcome.php:300 -msgid "" -"Attach a gift of any value (free or paid product) to a particular coupon. " -"Here, instead of a discount, a product is redeemed for the coupon code." -msgstr "" -"Attachez un cadeau de n’importe quelle valeur (produit gratuit ou payant) Ă  " -"un code promo particulier. Ici, au lieu d’une rĂ©duction, un produit est " -"Ă©changĂ© contre le code promo." - -#: includes/class-wc-sc-admin-welcome.php:306 -msgid "Give discounts to customers for next purchase" -msgstr "Offrir des rĂ©ductions aux clients pour leur prochain achat" - -#: includes/class-wc-sc-admin-welcome.php:308 -msgid "" -"You can give a coupon to your customer after every purchase, which can " -"encourage them to purchase again from you." -msgstr "" -"Vous pouvez donner un code promo Ă  votre client après chaque achat, ce qui " -"peut inciter Ă  acheter Ă  nouveau dans votre boutique." - -#: includes/class-wc-sc-admin-welcome.php:312 -msgid "Set a maximum discount limit" -msgstr "Fixer une limite maximale de remise" - -#: includes/class-wc-sc-admin-welcome.php:314 -#, php-format -msgid "" -"Give bigger discounts without hurting your profits. Offer a percentage off " -"coupon upto a particular value. Example - Flat 50% off upto $100." -msgstr "" -"Offrez des remises plus importantes sans nuire Ă  vos bĂ©nĂ©fices. Offrez un " -"pourcentage de rĂ©duction sur un code promo jusqu’à une certaine valeur. " -"Exemple - Moins 50% o jusqu’à 100 €." - -#: includes/class-wc-sc-admin-welcome.php:318 -msgid "Make customer's coupon usage, easy & simple" -msgstr "Rendez l’utilisation du code promo par votre client simple et facile" - -#: includes/class-wc-sc-admin-welcome.php:320 -msgid "" -"Show only valid coupons to your customer (if logged in) on cart, checkout & " -"My Account page. Coupons can be applied with single click. So, no need to " -"remember the coupon code or copy-pasting." -msgstr "" -"Ne montrez Ă  votre client (s’il est connectĂ©) que des codes promo valables " -"sur les pages « Panier », « Paiement » et « Mon compte ». Les codes promo " -"peuvent ĂŞtre appliquĂ©s en un seul clic. Il n’est donc pas nĂ©cessaire de " -"mĂ©moriser le code promo ou de le copier-coller." - -#: includes/class-wc-sc-admin-welcome.php:349 -msgid "FAQ / Common Problems" -msgstr "FAQ / Problèmes connus" - -#: includes/class-wc-sc-admin-welcome.php:354 -msgid "" -"When trying to add coupon/Smart Coupon, I get \"Invalid post type\" message." -msgstr "" -"Lorsque j’essaie d’ajouter un code promo/code promo intelligent, je reçois " -"le message « invalid post type »." - -#: includes/class-wc-sc-admin-welcome.php:355 -msgid "" -"Make sure use of coupon is enabled in your store. You can find this setting" -msgstr "" -"Assurez-vous que l’utilisation du code promo est activĂ©e dans votre magasin. " -"Vous pouvez trouver ce paramètre" - -#: includes/class-wc-sc-admin-welcome.php:364 -msgid "Smart Coupon's fields are broken?" -msgstr "Les champs de Smart Coupons sont dĂ©fectueux ?" - -#: includes/class-wc-sc-admin-welcome.php:365 -msgid "Make sure you are using the " -msgstr "Assurez-vous d’utiliser la " - -#: includes/class-wc-sc-admin-welcome.php:365 -msgid "latest version of Smart Coupons" -msgstr "la dernière version de Smart Coupons" - -#: includes/class-wc-sc-admin-welcome.php:365 -msgid "" -". If still the issue persist, temporarily de-activate all plugins except " -"WooCommerce & Smart Coupons. Re-check the issue, if the issue still " -"persists, contact us (from the link at the end of this page). If the issue " -"goes away, re-activate other plugins one-by-one & re-checking the fields, to " -"find out which plugin is conflicting." -msgstr "" -". Si le problème persiste, dĂ©sactivez temporairement tous les plugins, Ă  " -"l’exception de WooCommerce et de Smart Coupons. Re-vĂ©rifier, et si le " -"problème persiste, contactez-nous (Ă  partir du lien Ă  la fin de cette page). " -"Si le problème disparaĂ®t, rĂ©activer les autres plugins un par un pour savoir " -"quel plugin est en conflit." - -#: includes/class-wc-sc-admin-welcome.php:368 -msgid "How to translate texts from Smart Coupons?" -msgstr "Comment faire pour traduire des textes de Smart Coupons ?" - -#: includes/class-wc-sc-admin-welcome.php:369 -msgid "Simplest method is by installing" -msgstr "La mĂ©thode la plus simple consiste Ă  installer" - -#: includes/class-wc-sc-admin-welcome.php:369 -msgid "Loco Translate" -msgstr "Loco Translate" - -#: includes/class-wc-sc-admin-welcome.php:369 -msgid "plugin and then following steps listed " -msgstr "plugin, puis des suivre les Ă©tapes Ă©numĂ©rĂ©es " - -#: includes/class-wc-sc-admin-welcome.php:372 -msgid "How to change texts of the emails sent from Smart Coupons?" -msgstr "" -"Comment modifier les textes des e-mails envoyĂ©s Ă  partir de Smart Coupons ?" - -#: includes/class-wc-sc-admin-welcome.php:373 -msgid "You can do this by overriding the email template." -msgstr "Vous pouvez le faire en supprimant le modèle d’e-mail." - -#: includes/class-wc-sc-admin-welcome.php:373 -msgid "How to override email template" -msgstr "Comment remplacer le modèle d’e-mail" - -#: includes/class-wc-sc-admin-welcome.php:376 -msgid "" -"Can coupon code have any spaces in the name? / My Store Credit/Gift " -"Certificate is not working (not generating new coupon code)." -msgstr "" -"Le code promo peut-il avoir des espaces dans le nom ? / Mon bon d’achat/" -"carte cadeau ne fonctionne pas (ne gĂ©nère pas de nouveau code promo)." - -#: includes/class-wc-sc-admin-welcome.php:377 -msgid "" -"No. Coupon code should not have any spaces in the name, Eg, Coupon code " -"should be “gift-certificate” & not “gift certificate”." -msgstr "" -"Non. Le code promo ne devrait pas avoir d’espace dans le nom, par exemple, " -"le code promo devrait ĂŞtre « carte-cadeau » - pas « certificat de cadeau\"." - -#: includes/class-wc-sc-admin-welcome.php:380 -msgid "" -"What’s the URL to a coupon, so it’s automatically inserted when visiting?" -msgstr "" -"Qu’est-ce qu’est l’URL d’un code promo, est-il est automatiquement importĂ© " -"lors de la visite ?" - -#: includes/class-wc-sc-admin-welcome.php:381 -msgid "URL of coupon should be like this:" -msgstr "L’URL de code promo doit ĂŞtre comme ceci :" - -#: includes/class-wc-sc-admin-welcome.php:381 -msgid "" -". Replace www.mysite.com with your own site URL and replace discount5 with " -"the your coupon code." -msgstr "" -". Remplacez  « www.mysite.com » par votre propre URL, et remplacez le " -"« discount5 » par le code promo." - -#: includes/class-wc-sc-admin-welcome.php:384 -msgid "" -"Do not want to tie store credit to be used by only one customer? / Can a " -"customer send a gift certificate to themselves to pass on to someone else?" -msgstr "" -"Vous ne voulez pas lier le bon d’achat Ă  un seul client ? / Un client peut-" -"il s’envoyer une carte cadeau pour la transmettre Ă  quelqu’un d’autre ?" - -#: includes/class-wc-sc-admin-welcome.php:385 -msgid "" -"Edit the main coupon which is entered in \"Coupons\" field of the product " -"edit page, then go to \"Usage Restrictions\" > \"Disable Email Restriction\" " -"and disable this setting and save the coupon." -msgstr "" -"Modifiez le code promo principal saisi dans le champ « Code promo » de la " -"page d’édition du produit, puis allez Ă  « Restrictions d’utilisation » - " -"« DĂ©sactiver la restriction d’e-mail » et dĂ©sactiver ce paramètre puis " -"enregistrer le code promo." - -#: includes/class-wc-sc-admin-welcome.php:388 -msgid "" -"Getting 'Page Not Found Error' when accessing Coupons tab from My Account " -"Page?" -msgstr "" -"Message « Erreur page non trouvĂ©e » lors de l’accès Ă  l’onglet « Codes " -"promo » Ă  partir de la page « Mon compte » ?" - -#: includes/class-wc-sc-admin-welcome.php:389 -msgid "" -"Go to WordPress -> Settings -> Permalinks and click on Save Settings once." -msgstr "" -"Aller Ă  WordPress -> RĂ©glages ->Permaliens et cliquez une fois sur " -"enregistrer les paramètres." - -#: includes/class-wc-sc-admin-welcome.php:392 -msgid "Is there any reference file for creating an import file for coupons?" -msgstr "" -"Y a t-il un fichier de rĂ©fĂ©rence pour la crĂ©ation d’un fichier d’importation " -"pour les codes promo ?" - -#: includes/class-wc-sc-admin-welcome.php:393 -msgid "There is one file which is located inside the plugin. The file name is" -msgstr "" -"Il y a un fichier qui est situĂ© Ă  l’intĂ©rieur du plugin. Le nom du fichier " -"est" - -#: includes/class-wc-sc-admin-welcome.php:393 -msgid "If you want to import coupon through file, the file should be like" -msgstr "" -"Si vous voulez importer des codes promo par le biais d’un fichier, le " -"fichier doit ĂŞtre comme ceci" - -#: includes/class-wc-sc-admin-welcome.php:396 -msgid "Available coupons are not visible on Cart, Checkout & My Account page?" -msgstr "" -"Les codes promo disponibles ne sont pas visibles sur la page « Panier », la " -"page « Commande » et la page « Mon compte » ?" - -#: includes/class-wc-sc-admin-welcome.php:397 -msgid "" -"Smart Coupons uses hooks of Cart, Checkout & My Account page to display " -"available coupons. If your theme is not using those hooks in cart, checkout " -"& my-account template, coupons will not be displayed." -msgstr "" -"Smart Coupons utilise des hooks de la page Cart, de la page Checkout et My " -"Account pour afficher les codes promo disponibles. Si votre thème n’utilise " -"pas ces hooks dans les modèles de Cart, Checkout & My Account, les codes " -"promo ne s’afficheront pas." - -#: includes/class-wc-sc-admin-welcome.php:400 -msgid "How can I resend gift card coupon bought by customers?" -msgstr "Comment puis-je renvoyer la carte cadeau achetĂ©e par les clients ?" - -#: includes/class-wc-sc-admin-welcome.php:401 -msgid "You can resend them from order admin edit page." -msgstr "" -"Vous pouvez les renvoyer Ă  partir des pages de commandes sous " -"l’administration." - -#: includes/class-wc-sc-admin-welcome.php:404 -msgid "" -"Uncheck \"Auto-generate\" option in Store Credit is not saving? Is it always " -"checked?" -msgstr "" -"DĂ©cocher l’option « GĂ©nĂ©rer automatiquement » dans le bon d’achat n’est pas " -"sauvegardĂ©e ? Est-elle toujours cochĂ©e ?" - -#: includes/class-wc-sc-admin-welcome.php:405 -msgid "" -"Store Credit's default behavior is auto-generate because, when using a store " -"credit, it's balance keeps reducing. Therefore it should be uniquely created " -"for every user automatically." -msgstr "" -"Le comportement par dĂ©faut d’un bon d’achat est d’être auto-gĂ©nĂ©rĂ© parce " -"que, lorsque vous utilisez un bon d’achat, le solde conserve les rĂ©ductions. " -"C’est pourquoi il doit ĂŞtre créé automatiquement et de manière unique pour " -"chaque utilisateur." - -#: includes/class-wc-sc-admin-welcome.php:408 -msgid "Smart Coupons is not sending emails." -msgstr "Smart Coupons n’envoie pas d’e-mails." - -#: includes/class-wc-sc-admin-welcome.php:409 -msgid "" -"Smart Coupons sends email only after order completion. So make sure that " -"order complete email is enabled and sending. If enabled, then make sure all " -"settings of coupons, products are in place. Also check by switching your " -"theme." -msgstr "" -"Smart Coupons envoie des e-mails seulement après une commande terminĂ©e. " -"Assurez-vous donc que l’e-mail de commande terminĂ©e est activĂ© et " -"fonctionnel. Si c’est le cas, assurez-vous que tous les paramètres de codes " -"promo et de produits sont en place. VĂ©rifiez Ă©galement le fonctionnement des " -"e-mails en changeant provisoirement de thème." - -#: includes/class-wc-sc-admin-welcome.php:412 -msgid "\"Store Credit Receiver detail\" form not appearing on checkout page?" -msgstr "" -"Formulaire «DĂ©tail du bon d’achat du bĂ©nĂ©ficiaire » ne figure pas sur la " -"page « Commande » ?" - -#: includes/class-wc-sc-admin-welcome.php:413 -msgid "" -"This form is displayed using a hook which is available in My Account " -"template. Make sure your theme's my-account template contains all hooks " -"required for that template. Update your theme if it is not updated." -msgstr "" -"Ce formulaire s’affiche Ă  l’aide d’un hook disponible dans le modèle my-" -"account Assurez-vous que le modèle my-account de votre thème contient tous " -"les hooks requis pour ce modèle. Mettez Ă  jour votre thème s’il n’est pas Ă  " -"jour." - -#: includes/class-wc-sc-admin-welcome.php:416 -msgid "Does Smart Coupons allow printing of coupon as Gift Card?" -msgstr "" -"Smart Coupons permet-il l’impression d’un code promo en tant que carte-" -"cadeau ?" - -#: includes/class-wc-sc-admin-welcome.php:417 -msgid "" -"No, it doesn't provide any feature which enables you to take a printout of " -"the generated coupon, but if you can take printout from your email, you can " -"use it as an alternative." -msgstr "" -"Non, il ne fournit aucune fonctionnalitĂ© vous permettant d’imprimer " -"directement le code promo gĂ©nĂ©rĂ©, mais si vous pouvez imprimer Ă  partir de " -"votre e-mail, vous pouvez l’utiliser cette alternative." - -#: includes/class-wc-sc-admin-welcome.php:420 -msgid "" -"Is it possible to have a coupon for each variation of the variable product?" -msgstr "" -"Est-il possible d’avoir un code promo pour chaque variation d’un produit " -"variable ?" - -#: includes/class-wc-sc-admin-welcome.php:421 -msgid "No, currently, you cannot set a coupon for each variation." -msgstr "" -"Non, actuellement, vous ne pouvez pas dĂ©finir un code promo pour chaque " -"variation." - -#: includes/class-wc-sc-admin-welcome.php:424 -msgid "Is Smart Coupons compatible with WooCommerce Subscriptions?" -msgstr "Smart Coupons est-il compatible avec WooCommerce Subscriptions ?" - -#: includes/class-wc-sc-admin-welcome.php:425 -msgid "Yes, Smart Coupons does work with WooCommerce Subscriptions." -msgstr "" -"Oui, Les coupons intelligents fonctionnent avec les abonnements WooCommerce." - -#: includes/class-wc-sc-admin-welcome.php:428 -msgid "Which features of Smart Coupons work with Subscriptions?" -msgstr "" -"Quelles fonctionnalitĂ©s de Smart Coupons fonctionnent avec WooCommerce " -"Subscriptions ?" - -#: includes/class-wc-sc-admin-welcome.php:429 -msgid "" -"Give away a discount or credit on signing up a subscription, give away " -"recurring discount or credits, apply credit during sign up, automatic " -"payment for renewals from credit (Note: When using PayPal Standard Gateway, " -"store credit can be applied only during sign up. Automatic payment for " -"renewals by credit will not work for PayPal Standard Gateway)." -msgstr "" -"Offrez un code promo ou un bon d’achat lors de l’inscription Ă  un " -"abonnement; offrez des codes promo ou des bons d’achat rĂ©currents; appliquez " -"un bon d’achat lors de l’inscription; instaurer un paiement automatique pour " -"les renouvellements de bons d’achat. Note : Lorsque vous utilisez PayPal " -"Standard Gateway, le bon d’achat ne peut ĂŞtre appliquĂ© que lors de " -"l’inscription. Le paiement automatique pour les renouvellements par bon " -"d’achat ne fonctionnera pas pour PayPal Standard Gateway." - -#: includes/class-wc-sc-admin-welcome.php:432 -msgid "How does automatic payment by store credit work with Subscriptions?" -msgstr "" -"Comment fonctionne le paiement automatique par bon d’achat avec les " -"abonnements ?" - -#: includes/class-wc-sc-admin-welcome.php:433 -msgid "" -"Customers can apply store credit on a subscription during purchase of " -"subscription. If the same store credit has sufficient balance, it’ll keep " -"applying it to renewals till the remainder in store credit is higher than " -"renewal price. Customers will be able to apply store credit only during " -"signup. They will not get an option to apply store credit in renewals. But " -"if the store credit will not have sufficient balance to pay for the " -"renewals, then the order will go into pending mode. Now when the customer " -"will go to pay for this renewal order, they’ll get an option to apply store " -"credit again. To activate the subscription again, the customer will have to " -"pay for the renewals. When the customer is paying for the renewals from " -"their account, then in that process they can use the same store credit which " -"didn’t have the sufficient balance, again & pay for the remaining amount." -msgstr "" -"Les clients peuvent appliquer un bon d’achat sur un abonnement lors de " -"l’achat d’un abonnement. Si ce bon d’achat a un solde suffisant, il " -"continuera Ă  s’appliquer aux renouvellements tant que le solde du bon " -"d’achat est plus Ă©levĂ© que le prix du renouvellement. Les clients ne " -"pourront appliquer le bon d’achat que lors de l’inscription : ils n’auront " -"pas la possibilitĂ© d’appliquer le bon d’achat directement dans les " -"renouvellements. Si le bon d’achat du client n’a pas un solde suffisant pour " -"payer le renouvellement, la commande passera en Ă©tat « en attente ». Lorsque " -"le client viendra payer cette commande de renouvellement, une option pour " -"appliquer le bon d’achat sera prĂ©sente Ă  nouveau. Pour activer Ă  nouveau son " -"abonnement, le client devra payer le renouvellement. Lorsque le client paie " -"pour le renouvellement de son compte, il peut Ă  nouveau utiliser son bon " -"d’achat, mĂŞme si le solde n’est pas suffisant pour payer la totalitĂ© du " -"montant restant." - -#: includes/class-wc-sc-admin-welcome.php:436 -msgid "" -"Is it possible to partially pay for a subscription with store credit and the " -"remainder by another method?" -msgstr "" -"Est-il possible de payer partiellement un abonnement avec un bon d’achat et " -"le reste avec une autre mĂ©thode de paiement ?" - -#: includes/class-wc-sc-admin-welcome.php:437 -msgid "" -"No, this is possible only in those cases where subscription amount is more " -"than store credit’s balance. If store credit’s balance is more than " -"subscription’s total then your bank account or credit card will not be " -"charged." -msgstr "" -"Non, cela n’est possible que dans les cas oĂą le montant de l’abonnement est " -"supĂ©rieur au solde du bon d’achat. Si le solde du bon d’achat est supĂ©rieur " -"au total de l’abonnement, votre compte bancaire ou votre carte de crĂ©dit ne " -"sera pas dĂ©bitĂ©." - -#: includes/class-wc-sc-admin-welcome.php:440 -msgid "Is Smart Coupons WPML compatible?" -msgstr "Smart Coupon est-il compatible avec WPML ?" - -#: includes/class-wc-sc-admin-welcome.php:441 -msgid "" -"Not yet, but this is being worked on. You will find this in later versions." -msgstr "" -"Pas encore, mais on y travaille. Vous trouverez ceci dans les versions " -"ultĂ©rieures." - -#: includes/class-wc-sc-admin-welcome.php:444 -msgid "" -"I'm using WPML & WPML provides support for multi-currency, but Smart Coupons " -"only changes currency symbol & the price value remains same. Can Smart " -"Coupons change the currency symbol and the price value associated with it?" -msgstr "" -"J’utilise WPML & WPML prend en charge plusieurs devises, mais Smart Coupons " -"modifie uniquement le symbole monĂ©taire & la valeur prix reste la mĂŞme. Est-" -"ce que Smart Coupons peut modifier le symbole monĂ©taire et la valeur du prix " -"qui lui sont associĂ©s ?" - -#: includes/class-wc-sc-admin-welcome.php:445 -msgid "" -"Currently, It can only change the currency symbol the price value remains " -"the same. Smart Coupon is not compatible with multi-currency plugin. You may " -"find this in some future version." -msgstr "" -"Actuellement, il peut seulement changer le symbole monĂ©taire, prix reste le " -"mĂŞme. Smart Coupon n’est pas compatible avec le plugin multi-devises. Vous " -"pouvez trouver ceci dans une version future." - -#. translators: WooCommerce My Account support link -#: includes/class-wc-sc-admin-welcome.php:472 -#, php-format -msgid "If you are facing any issues, please %s from your WooCommerce account." -msgstr "" -"Si vous ĂŞtes confrontĂ© Ă  des problèmes, veuillez %s depuis votre compte " -"WooCommerce." - -#: includes/class-wc-sc-admin-welcome.php:472 -msgid "submit a ticket" -msgstr "soumettre une demande" - -#: includes/class-wc-sc-ajax.php:132 -#: includes/class-wc-sc-product-fields.php:111 -#: includes/class-wc-sc-product-fields.php:169 -msgid "Type" -msgstr "Type" - -#. translators: 1. The coupon code, 2. The discount type -#: includes/class-wc-sc-ajax.php:258 includes/class-wc-sc-settings.php:332 -#, php-format -msgid "%1$s (Type: %2$s)" -msgstr "%1$s (Type : %2$s)" - -#: includes/class-wc-sc-ajax.php:343 includes/class-wc-sc-ajax.php:358 -#: includes/class-wc-smart-coupons.php:1035 -#: includes/class-wc-smart-coupons.php:1050 -msgid "Cart Discount" -msgstr "Remise du panier" - -#: includes/class-wc-sc-ajax.php:348 includes/class-wc-sc-ajax.php:353 -#: includes/class-wc-smart-coupons.php:1040 -#: includes/class-wc-smart-coupons.php:1045 -msgid "Product Discount" -msgstr "Remise produit" - -#: includes/class-wc-sc-ajax.php:358 includes/class-wc-sc-settings.php:1040 -#: includes/class-wc-smart-coupons.php:1050 -msgid "Discount" -msgstr "Remise" - -#. translators: %s: Maximum coupon discount amount -#: includes/class-wc-sc-ajax.php:363 -#, php-format -msgid "upto %s" -msgstr "jusqu’à %s" - -#: includes/class-wc-sc-auto-apply-coupon.php:123 -#: includes/class-wc-sc-auto-apply-coupon.php:191 -msgid "Auto apply?" -msgstr "Appliquer automatiquement ?" - -#: includes/class-wc-sc-auto-apply-coupon.php:124 -msgid "" -"When checked, this coupon will be applied automatically, if it is valid. If " -"enabled in more than 5 coupons, only 5 coupons will be applied " -"automatically, rest will be ignored." -msgstr "" -"Si cochĂ©, ce code promo sera appliquĂ© automatiquement, s’il est valide. Si " -"cette option est activĂ©e dans plus de 5 codes promo, seuls 5 codes promo " -"seront appliquĂ©s automatiquement, les autres seront ignorĂ©s." - -#. translators: 1. Important 2. Upload path -#: includes/class-wc-sc-background-coupon-importer.php:324 -#, php-format -msgid "" -"%1$s: To allow bulk generation of coupons, please make sure %2$s directory " -"is writable." -msgstr "" -"%1$s: Pour permettre la gĂ©nĂ©ration en masse de codes promo, assurez-vous que " -"le rĂ©pertoire %2$s possède les autorisations d’écriture." - -#: includes/class-wc-sc-background-coupon-importer.php:329 -msgid "" -"Bulk generation is disabled since uploads directory is not writable. Please " -"ensure uploads directory is writable before starting bulk generate process." -msgstr "" -"La gĂ©nĂ©ration en masse est dĂ©sactivĂ©e car le rĂ©pertoire de tĂ©lĂ©chargements " -"n’a pas les autorisation d’écriture. Assurez-vous que le rĂ©pertoire de " -"tĂ©lĂ©chargements est inscriptible avant de commencer le processus de " -"gĂ©nĂ©ration en masse." - -#: includes/class-wc-sc-background-coupon-importer.php:350 -msgid "imported" -msgstr "importĂ©" - -#: includes/class-wc-sc-background-coupon-importer.php:356 -msgid "generated & sent" -msgstr "gĂ©nĂ©rĂ©s et envoyĂ©s" - -#: includes/class-wc-sc-background-coupon-importer.php:357 -#: includes/class-wc-sc-background-coupon-importer.php:362 -msgid "generate" -msgstr "gĂ©nĂ©rer" - -#: includes/class-wc-sc-background-coupon-importer.php:361 -#: includes/class-wc-sc-background-coupon-importer.php:585 -msgid "generated" -msgstr "gĂ©nĂ©rĂ©" - -#. translators: 1. Error title 2. The bulk process -#: includes/class-wc-sc-background-coupon-importer.php:376 -#, php-format -msgid "" -"%1$s: The coupon bulk %2$s process stopped. Please review the coupons list " -"to check the status." -msgstr "" -"%1$s : Le processus d’envoi de codes promo en masse %2$s s’est arrĂŞtĂ©. " -"Veuillez consulter la liste des codes promo pour vĂ©rifier le ." - -#: includes/class-wc-sc-background-coupon-importer.php:376 -msgid "Error" -msgstr "Erreur" - -#: includes/class-wc-sc-background-coupon-importer.php:385 -msgid "Store Credits / Gift Cards" -msgstr "Bons d’achat/Cartes cadeau" - -#: includes/class-wc-sc-background-coupon-importer.php:391 -#, php-format -msgid "%s are being" -msgstr "%s sont" - -#: includes/class-wc-sc-background-coupon-importer.php:393 -msgid "in the background. You will be notified when it is completed." -msgstr "en arrière-plan. Vous serez notifiĂ© une fois qu’il sera terminĂ©." - -#: includes/class-wc-sc-background-coupon-importer.php:396 -msgid "Progress" -msgstr "Progression" - -#: includes/class-wc-sc-background-coupon-importer.php:397 -msgid "--:--:--" -msgstr "--:--:--" - -#: includes/class-wc-sc-background-coupon-importer.php:398 -msgid "Stop" -msgstr "ArrĂŞter" - -#: includes/class-wc-sc-background-coupon-importer.php:402 -msgid "" -"You can continue with other work. But for bulk generating or importing new " -"coupons, wait for the current process to complete." -msgstr "" -"Vous pouvez poursuivre d’autres travaux. Mais pour gĂ©nĂ©rer ou importer en " -"masse de nouveaux codes promo, attendez que le processus en cours soit " -"terminĂ©." - -#: includes/class-wc-sc-background-coupon-importer.php:478 -msgid "" -"We are processing coupons in background. Please wait before starting new " -"process." -msgstr "" -"Nous traitons les codes promo en arrière-plan. S’il vous plaĂ®t attendez " -"avant de commencer un nouveau processus." - -#. translators: 1. The bulk process -#: includes/class-wc-sc-background-coupon-importer.php:542 -#, php-format -msgid "" -"Are you sure you want to stop the coupon bulk %s process? Click OK to stop." -msgstr "" -"ĂŠtes-vous sĂ»r de vouloir arrĂŞter le processus de gĂ©nĂ©ration de codes promo " -"en masse %s ? Cliquez sur OK pour l’arrĂŞter." - -#: includes/class-wc-sc-background-coupon-importer.php:567 -#: includes/class-wc-sc-background-coupon-importer.php:575 -msgid "Coupon import" -msgstr "Importation de codes promo" - -#: includes/class-wc-sc-background-coupon-importer.php:568 -#: includes/class-wc-sc-background-coupon-importer.php:572 -msgid "added & emailed" -msgstr "ajoutĂ© et envoyĂ© par e-mail" - -#: includes/class-wc-sc-background-coupon-importer.php:571 -#: includes/class-wc-sc-background-coupon-importer.php:584 -msgid "Coupon bulk generation" -msgstr "GĂ©nĂ©rer des codes promo" - -#: includes/class-wc-sc-background-coupon-importer.php:576 -#: includes/class-wc-sc-background-coupon-importer.php:585 -msgid "added" -msgstr "ajoutĂ©" - -#: includes/class-wc-sc-background-coupon-importer.php:579 -msgid "Store credit" -msgstr "Bon d’achat" - -#: includes/class-wc-sc-background-coupon-importer.php:580 -msgid "sent" -msgstr "envoyĂ©" - -#: includes/class-wc-sc-background-coupon-importer.php:591 -msgid "store credit / gift card" -msgstr "bon d’achat/carte cadeau" - -#: includes/class-wc-sc-background-coupon-importer.php:592 -msgid "store credits / gift cards" -msgstr "bons d’achat/cartes cadeau" - -#: includes/class-wc-sc-background-coupon-importer.php:594 -#: includes/class-wc-sc-purchase-credit.php:828 -#: includes/emails/class-wc-sc-email-coupon.php:475 -msgid "coupon" -msgstr "code promo" - -#: includes/class-wc-sc-background-coupon-importer.php:595 -msgid "coupons" -msgstr "codes promo" - -#: includes/class-wc-sc-background-coupon-importer.php:601 -msgid "Successfully" -msgstr "Avec succès" - -#: includes/class-wc-sc-background-coupon-importer.php:610 -msgid "CSV file has been generated. You can download it from " -msgstr "Le fichier CSV a Ă©tĂ© gĂ©nĂ©rĂ©. Vous pouvez le tĂ©lĂ©charger Ă  partir de " - -#: includes/class-wc-sc-background-coupon-importer.php:725 -#: includes/class-wc-sc-background-coupon-importer.php:742 -msgid "Failed to create export file." -msgstr "Échec de la crĂ©ation du fichier d’exportation." - -#: includes/class-wc-sc-background-coupon-importer.php:1232 -msgid "Every 5 Seconds" -msgstr "Toutes les 5 secondes" - -#. translators: 1. Product title -#: includes/class-wc-sc-coupon-actions.php:359 -#, php-format -msgid "%s has been added to your cart!" -msgstr "%s a Ă©tĂ© ajoutĂ© Ă  votre panier !" - -#. translators: 1. Product/s 2. Product names 3. is/are 4. Coupons code -#: includes/class-wc-sc-coupon-actions.php:412 -#, php-format -msgid "%1$s %2$s %3$s removed because coupon %4$s is removed." -msgstr "%1$s %2$s %3$s supprimĂ© car le code promo %4$s est supprimĂ©." - -#: includes/class-wc-sc-coupon-actions.php:412 -#: includes/class-wc-sc-coupons-by-product-quantity.php:111 -msgid "Product" -msgid_plural "Products" -msgstr[0] "Produit" -msgstr[1] "%s produits" - -#: includes/class-wc-sc-coupon-actions.php:412 -msgid "is" -msgid_plural "are" -msgstr[0] "est" -msgstr[1] "sont" - -#: includes/class-wc-sc-coupon-actions.php:488 -msgid "Add product details" -msgstr "Ajouter les dĂ©tails du produit" - -#: includes/class-wc-sc-coupon-categories.php:87 -msgid "Category" -msgstr "CatĂ©gorie" - -#: includes/class-wc-sc-coupon-categories.php:88 -msgctxt "Admin menu name" -msgid "Categories" -msgstr "CatĂ©gories" - -#: includes/class-wc-sc-coupon-categories.php:89 -msgid "Search coupon categories" -msgstr "Rechercher des catĂ©gories de codes promo" - -#: includes/class-wc-sc-coupon-categories.php:90 -msgid "All coupon categories" -msgstr "Toutes les catĂ©gories de codes promo" - -#: includes/class-wc-sc-coupon-categories.php:91 -msgid "Parent coupon category" -msgstr "CatĂ©gorie parente de code promo" - -#: includes/class-wc-sc-coupon-categories.php:92 -msgid "Parent coupon category:" -msgstr "CatĂ©gorie de code promo parent :" - -#: includes/class-wc-sc-coupon-categories.php:93 -msgid "Edit coupon category" -msgstr "Modifier la catĂ©gorie de code promo" - -#: includes/class-wc-sc-coupon-categories.php:94 -msgid "Update coupon category" -msgstr "Mise Ă  jour de la catĂ©gorie de code promo" - -#: includes/class-wc-sc-coupon-categories.php:95 -msgid "Add new coupon category" -msgstr "Ajouter une nouvelle catĂ©gorie de code promo" - -#: includes/class-wc-sc-coupon-categories.php:96 -msgid "New coupon category name" -msgstr "Nouveau nom de la catĂ©gorie de code promo" - -#: includes/class-wc-sc-coupon-categories.php:97 -msgid "No coupon categories found" -msgstr "Aucune catĂ©gorie de code promo trouvĂ©e" - -#: includes/class-wc-sc-coupon-columns.php:128 -msgid "Used in orders" -msgstr "UtilisĂ© dans les commandes" - -#: includes/class-wc-sc-coupon-fields.php:98 -msgid "Coupon shareable link" -msgstr "Lien partageable du code promo" - -#: includes/class-wc-sc-coupon-fields.php:136 -msgid "Copy the following link and share it to apply this coupon via URL." -msgstr "" -"Copiez le lien suivant et partagez-le pour utiliser ce code promo via URL." - -#: includes/class-wc-sc-coupon-fields.php:143 -#: includes/class-wc-sc-coupon-fields.php:1088 -msgid "Click to copy" -msgstr "Cliquez pour copier" - -#: includes/class-wc-sc-coupon-fields.php:147 -msgid "You can also apply multiple coupon codes via a single URL. For example:" -msgstr "" -"Vous pouvez Ă©galement appliquer plusieurs codes promo via une seule URL. Par " -"exemple :" - -#: includes/class-wc-sc-coupon-fields.php:303 -#: includes/class-wc-smart-coupons.php:3921 -msgid "Coupon expiry time" -msgstr "Heure d’expiration du code" - -#: includes/class-wc-sc-coupon-fields.php:304 -msgid "HH:MM" -msgstr "HH:MM" - -#: includes/class-wc-sc-coupon-fields.php:305 -msgid "" -"Time after which coupon will be expired. This will work in conjunction with " -"Coupon expiry date." -msgstr "" -"Heure Ă  laquelle le code promo expirera. Cela fonctionnera en conjonction " -"avec la date d’expiration du code promo." - -#: includes/class-wc-sc-coupon-fields.php:319 -#: includes/class-wc-smart-coupons.php:3917 -msgid "Max discount" -msgstr "RĂ©duction max" - -#: includes/class-wc-sc-coupon-fields.php:320 -msgid "Unlimited discount" -msgstr "Rabais illimitĂ©" - -#: includes/class-wc-sc-coupon-fields.php:321 -msgid "The maximum discount this coupon can give on a cart." -msgstr "La rĂ©duction maximale que ce code promo peut donner sur un panier." - -#: includes/class-wc-sc-coupon-fields.php:334 -#: includes/class-wc-smart-coupons.php:3916 -#: includes/class-wc-smart-coupons.php:4286 -msgid "For new user only?" -msgstr "Pour les nouveaux utilisateurs seulement ?" - -#: includes/class-wc-sc-coupon-fields.php:335 -msgid "" -"When checked, this coupon will be valid for the user's first order on the " -"store." -msgstr "" -"Si cochĂ©, ce code promo sera valable uniquement pour la première commande " -"d’un client." - -#: includes/class-wc-sc-coupon-fields.php:343 -msgid "Valid for" -msgstr "Valide pendant" - -#: includes/class-wc-sc-coupon-fields.php:346 -msgid "Days" -msgstr "Jours" - -#: includes/class-wc-sc-coupon-fields.php:347 -msgid "Weeks" -msgstr "Semaines" - -#: includes/class-wc-sc-coupon-fields.php:348 -msgid "Months" -msgstr "Mois" - -#: includes/class-wc-sc-coupon-fields.php:349 -msgid "Years" -msgstr "AnnĂ©es" - -#: includes/class-wc-sc-coupon-fields.php:351 -msgid "(Used only for auto-generated coupons)" -msgstr "(UtilisĂ© uniquement pour les codes promo auto-gĂ©nĂ©rĂ©s)" - -#: includes/class-wc-sc-coupon-fields.php:358 -msgid "Coupon value same as product's price?" -msgstr "Valeur du code promo identique au prix du produit ?" - -#: includes/class-wc-sc-coupon-fields.php:359 -msgid "When checked, generated coupon's value will be same as product's price" -msgstr "" -"Une fois cochĂ©e, la valeur du code promo gĂ©nĂ©rĂ© sera identique au prix du " -"produit" - -#: includes/class-wc-sc-coupon-fields.php:365 -msgid "Auto generate new coupons with each item" -msgstr "AutogĂ©nĂ©rer de nouveaux codes promo avec chaque article" - -#: includes/class-wc-sc-coupon-fields.php:366 -msgid "" -"Generate exact copy of this coupon with unique coupon code for each " -"purchased product (needs this coupon to be linked with that product)" -msgstr "" -"GĂ©nĂ©rer une copie exacte de ce code promo avec un code promo unique pour " -"chaque produit achetĂ© (ce code promo doit ĂŞtre liĂ© Ă  ce produit)" - -#: includes/class-wc-sc-coupon-fields.php:383 -msgid "Coupon code format" -msgstr "Format du code promo" - -#: includes/class-wc-sc-coupon-fields.php:384 -msgid "Prefix" -msgstr "PrĂ©fixe" - -#: includes/class-wc-sc-coupon-fields.php:386 -msgid "Suffix" -msgstr "Suffixe" - -#: includes/class-wc-sc-coupon-fields.php:387 -msgid "(We recommend up to three letters for prefix/suffix)" -msgstr "(Nous recommandons jusqu’à trois lettres pour le prĂ©fixe/suffixe)" - -#: includes/class-wc-sc-coupon-fields.php:400 -msgid "Show on cart, checkout" -msgstr "Afficher sur les pages « Panier », « Commande »" - -#: includes/class-wc-sc-coupon-fields.php:400 -msgid "and my account?" -msgstr "et « Mon compte » ?" - -#: includes/class-wc-sc-coupon-fields.php:401 -msgid "" -"When checked, this coupon will be visible on cart/checkout page for everyone" -msgstr "" -"Si cochĂ©, ce code promo sera visible sur les pages « Panier », « Commande » " -"et « Mon Compte » pour tout le monde" - -#: includes/class-wc-sc-coupon-fields.php:427 -msgid "Disable email restriction?" -msgstr "DĂ©sactiver la restriction d’e-mail ?" - -#: includes/class-wc-sc-coupon-fields.php:428 -msgid "" -"Do not restrict auto-generated coupons to buyer/receiver email, anyone with " -"coupon code can use it" -msgstr "" -"Ne pas restreindre l’utilisation des codes promo gĂ©nĂ©rĂ©s automatiquement au " -"destinataire de l’e-mail : autoriser n’importe qui Ă  l’utiliser" - -#: includes/class-wc-sc-coupon-fields.php:594 -msgid "Actions" -msgstr "Actions" - -#: includes/class-wc-sc-coupon-fields.php:622 -msgid "After applying the coupon do these also" -msgstr "Après avoir appliquĂ© le code promo faire Ă©galement ceci" - -#: includes/class-wc-sc-coupon-fields.php:624 -msgid "Add products to cart" -msgstr "Ajouter des produits au panier" - -#: includes/class-wc-sc-coupon-fields.php:627 -#: includes/class-wc-sc-coupon-fields.php:654 -msgid "Search for a product…" -msgstr "Rechercher un produit…" - -#: includes/class-wc-sc-coupon-fields.php:658 -msgid "each with quantity" -msgstr "chacun avec la quantitĂ©" - -#: includes/class-wc-sc-coupon-fields.php:659 -msgid "1" -msgstr "1. SĂ©lectionnez la barre latĂ©rale" - -#: includes/class-wc-sc-coupon-fields.php:660 -msgid "" -"This much quantity of each product, selected above, will be added to cart." -msgstr "" -"Cette quantitĂ© de chaque produit, sĂ©lectionnĂ© ci-dessus, sera ajoutĂ©e au " -"panier." - -#: includes/class-wc-sc-coupon-fields.php:663 -msgid "with discount of" -msgstr "avec remise de" - -#: includes/class-wc-sc-coupon-fields.php:666 -msgid "%" -msgstr "%" - -#: includes/class-wc-sc-coupon-fields.php:669 -msgid "" -"When this coupon will be applied, selected products will be added to cart " -"with set discount. If discount is not set, this coupon's discount will be " -"applied to these products." -msgstr "" -"Lorsque ce code promo sera appliquĂ©, les produits sĂ©lectionnĂ©s seront " -"ajoutĂ©s au panier avec remise dĂ©finie. Si la remise n’est pas dĂ©finie, la " -"remise de ce code promo sera appliquĂ©e Ă  ces produits." - -#: includes/class-wc-sc-coupon-fields.php:704 -#: includes/class-wc-smart-coupons.php:4399 -msgctxt "enhanced select" -msgid "One result is available, press enter to select it." -msgstr "Un rĂ©sultat est disponible, appuyez sur EntrĂ©e pour le sĂ©lectionner." - -#: includes/class-wc-sc-coupon-fields.php:705 -#: includes/class-wc-smart-coupons.php:4400 -msgctxt "enhanced select" -msgid "%qty% results are available, use up and down arrow keys to navigate." -msgstr "" -"%qty% rĂ©sultats sont disponibles, utilisez les flèches haut et bas pour " -"naviguer." - -#: includes/class-wc-sc-coupon-fields.php:706 -#: includes/class-wc-smart-coupons.php:4401 -msgctxt "enhanced select" -msgid "No matches found" -msgstr "Aucun rĂ©sultat" - -#: includes/class-wc-sc-coupon-fields.php:707 -#: includes/class-wc-sc-coupon-fields.php:715 -#: includes/class-wc-smart-coupons.php:4410 -msgctxt "enhanced select" -msgid "Searching…" -msgstr "Recherche…" - -#: includes/class-wc-sc-coupon-fields.php:708 -#: includes/class-wc-smart-coupons.php:4403 -msgctxt "enhanced select" -msgid "Please enter 1 or more characters" -msgstr "Veuillez saisir 1 caractère ou plus" - -#: includes/class-wc-sc-coupon-fields.php:709 -#: includes/class-wc-smart-coupons.php:4404 -msgctxt "enhanced select" -msgid "Please enter %qty% or more characters" -msgstr "Veuillez saisir %qty% caractères ou plus" - -#: includes/class-wc-sc-coupon-fields.php:710 -#: includes/class-wc-smart-coupons.php:4405 -msgctxt "enhanced select" -msgid "Please delete 1 character" -msgstr "Veuillez supprimer 1 caractère" - -#: includes/class-wc-sc-coupon-fields.php:711 -#: includes/class-wc-smart-coupons.php:4406 -msgctxt "enhanced select" -msgid "Please delete %qty% characters" -msgstr "Veuillez supprimer %qty% caractères" - -#: includes/class-wc-sc-coupon-fields.php:712 -#: includes/class-wc-smart-coupons.php:4407 -msgctxt "enhanced select" -msgid "You can only select 1 item" -msgstr "Vous ne pouvez sĂ©lectionner qu’1 article" - -#: includes/class-wc-sc-coupon-fields.php:713 -#: includes/class-wc-smart-coupons.php:4408 -msgctxt "enhanced select" -msgid "You can only select %qty% items" -msgstr "Vous ne pouvez sĂ©lectionner que %qty% articles" - -#: includes/class-wc-sc-coupon-fields.php:714 -#: includes/class-wc-smart-coupons.php:4409 -msgctxt "enhanced select" -msgid "Loading more results…" -msgstr "Charger plus de rĂ©sultats…" - -#: includes/class-wc-sc-coupon-fields.php:972 -msgid "Could not locate WooCommerce" -msgstr "Impossible de localiser WooCommerce" - -#: includes/class-wc-sc-coupon-fields.php:1019 -#: includes/class-wc-sc-settings.php:595 -msgid "Store Credit / Gift Certificate" -msgstr "Bon d’achat / Carte cadeau" - -#: includes/class-wc-sc-coupon-fields.php:1086 -#: includes/class-wc-sc-coupon-fields.php:1101 -msgid "Copied!" -msgstr "Copié !" - -#: includes/class-wc-sc-coupon-fields.php:1093 -#: includes/class-wc-sc-coupon-fields.php:1103 -msgid "Copy coupon code" -msgstr "Copier le code promo" - -#: includes/class-wc-sc-coupon-import.php:586 -#: includes/class-wc-sc-coupon-import.php:642 -#: includes/class-wc-sc-coupon-import.php:654 -msgid "Sorry, there has been an error." -msgstr "DĂ©solĂ©, il y a eu une erreur." - -#: includes/class-wc-sc-coupon-import.php:587 -msgid "The file does not exist, please try again." -msgstr "Le fichier n’existe pas, veuillez essayer de nouveau." - -#: includes/class-wc-sc-coupon-import.php:746 -msgid "Coupon Import Error" -msgstr "Erreur d’importation de code promo" - -#: includes/class-wc-sc-coupon-import.php:746 -msgid "" -"Invalid CSV file. Make sure your CSV file contains all columns, header row, " -"and data in correct format." -msgstr "" -"Fichier CSV non valide. Assurez-vous que votre fichier CSV contient toutes " -"les colonnes, la ligne d’en-tĂŞte et les donnĂ©es au format correct." - -#: includes/class-wc-sc-coupon-import.php:746 -msgid "Download a sample.csv to confirm" -msgstr "TĂ©lĂ©charger un sample.csv pour confirmer" - -#: includes/class-wc-sc-coupon-import.php:820 -msgid "All set, Begin import?" -msgstr "Tout est prĂŞt ! Commencer l’importation ?" - -#: includes/class-wc-sc-coupon-import.php:824 -msgid "File uploaded OK" -msgstr "Fichier tĂ©lĂ©chargĂ© OK" - -#: includes/class-wc-sc-coupon-import.php:825 -msgid "File format seems OK" -msgstr "Format de fichier semble OK" - -#: includes/class-wc-sc-coupon-import.php:831 -msgid "Email coupon to recipients?" -msgstr "Envoyer un code promo Ă  des destinataires ?" - -#: includes/class-wc-sc-coupon-import.php:831 -msgid "" -"Enable this to send coupon to recipient's email addresses, provided in " -"imported file." -msgstr "" -"Activez cette option pour envoyer un code promo aux adresses e-mail du " -"destinataire, fournies dans le fichier importĂ©." - -#: includes/class-wc-sc-coupon-import.php:900 -msgid "Chosen" -msgstr "Choisi" - -#: includes/class-wc-sc-coupon-import.php:916 -msgid "" -"Hi there! Upload a CSV file with coupons details to import them into your " -"shop." -msgstr "" -"Bonjour ! TĂ©lĂ©chargez un fichier CSV avec les dĂ©tails des codes promo pour " -"les importer dans votre boutique." - -#: includes/class-wc-sc-coupon-import.php:917 -msgid "The CSV must adhere to a specific format and include a header row." -msgstr "" -"Le CSV doit respecter un format spĂ©cifique et inclure une ligne d’en-tĂŞte." - -#: includes/class-wc-sc-coupon-import.php:917 -msgid "Click here to download a sample" -msgstr "Cliquez ici pour tĂ©lĂ©charger un Ă©chantillon" - -#: includes/class-wc-sc-coupon-import.php:917 -msgid "and create your CSV based on that." -msgstr "et crĂ©er votre CSV basĂ© sur cela." - -#: includes/class-wc-sc-coupon-import.php:918 -msgid "" -"Note: If any coupon from the CSV file already exists in the store, it will " -"not update the existing coupon, instead a new coupon will be imported & the " -"previous coupon with the same code will become inactive." -msgstr "" -"Note : Si un code promo du fichier CSV existe dĂ©jĂ  dans le magasin, il ne " -"mettra pas Ă  jour le code promo existant, mais un nouveau code promo sera " -"importĂ© et le code promo prĂ©cĂ©dent avec le mĂŞme code deviendra inactif." - -#: includes/class-wc-sc-coupon-import.php:919 -msgid "Ready to import? Choose a .csv file, then click \"Upload file\"." -msgstr "" -"PrĂŞt Ă  importer ? Choisissez un fichier. csv, puis cliquez sur « TĂ©lĂ©charger " -"le fichier »." - -#: includes/class-wc-sc-coupon-import.php:941 -msgid "" -"Before you can upload your import file, you will need to fix the following " -"error:" -msgstr "" -"Avant de pouvoir transfĂ©rer votre fichier d’importation, vous devez " -"corriger les erreurs suivantes :" - -#: includes/class-wc-sc-coupon-import.php:950 -msgid "Choose a CSV file" -msgstr "Choisir un fichier CSV" - -#: includes/class-wc-sc-coupon-import.php:955 -msgid "Maximum file size" -msgstr "Taille maximale du fichier" - -#: includes/class-wc-sc-coupon-import.php:956 -msgid "OR" -msgstr "OU" - -#: includes/class-wc-sc-coupon-import.php:957 -msgid "Already uploaded CSV to the server?" -msgstr "DĂ©jĂ  tĂ©lĂ©chargĂ© CSV sur le serveur?" - -#: includes/class-wc-sc-coupon-import.php:957 -msgid "Enter location on the server" -msgstr "Entrez l’emplacement sur le serveur" - -#: includes/class-wc-sc-coupon-import.php:959 -msgid "Upload file" -msgstr "TĂ©lĂ©charger le fichier" - -#: includes/class-wc-sc-coupon-message.php:125 -msgid "Display message" -msgstr "Afficher le message" - -#: includes/class-wc-sc-coupon-message.php:133 -msgid "Email message?" -msgstr "Message de l’e-mail ?" - -#: includes/class-wc-sc-coupon-message.php:135 -msgid "Check this box to include above message in order confirmation email" -msgstr "" -"Cochez cette case pour inclure le message ci-dessus dans l’e-mail de " -"confirmation de la commande" - -#: includes/class-wc-sc-coupon-message.php:350 -#: includes/class-wc-sc-coupon-message.php:367 -msgid "Coupon Message" -msgstr "Message du code promo" - -#: includes/class-wc-sc-coupon-message.php:368 -msgid "Is Email Coupon Message" -msgstr "Message du code promo pour l’e-mail" - -#. translators: 1. Coupon code 2. Expiry date -#: includes/class-wc-sc-coupon-parser.php:409 -#, php-format -msgid "" -"Incorrect format for expiry date of coupon \"%1$s\". Entered date is %2$s. " -"Expected date format: YYYY-MM-DD" -msgstr "" -"Format incorrect pour la date d’expiration du code promo « %1$s ». La date " -"entrĂ©e est « %2$s ». Format de la date prĂ©vue: AAAA-MM-DD" - -#: includes/class-wc-sc-coupon-process.php:216 -msgid "Email address" -msgstr "Adresse e-mail" - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-coupon-process.php:224 -#, php-format -msgid "Error: %s Receiver’s E-mail address is invalid." -msgstr "" -"Erreur: l’adresse de messagerie du %s Destinataire ’ s n’est pas valide." - -#: includes/class-wc-sc-coupon-process.php:226 -msgid "Error: Gift Card Receiver’s E-mail address is invalid." -msgstr "Erreur : l’e-mail du bĂ©nĂ©ficiaire de la carte cadeau n’est pas valide." - -#. translators: 1. amount of store credit 2. store credit label 3. coupon code -#: includes/class-wc-sc-coupon-process.php:547 -#, php-format -msgid "%1$s worth of %2$s restored to coupon %3$s." -msgstr "%1$s d’une valeur de %2$s restaurĂ© en code promo %3$s." - -#. translators: 1. amount of store credit 2. coupon code -#: includes/class-wc-sc-coupon-process.php:550 -#, php-format -msgid "%1$s worth of Store Credit restored to coupon %2$s." -msgstr "valeur de %1$s de bon d’achat restaurĂ© au code promo %2$s." - -#. translators: Order notes -#: includes/class-wc-sc-coupon-process.php:558 -#, php-format -msgid "%s Because PayPal doesn't accept discount on shipping & tax." -msgstr "" -"%s parce que PayPal n’accepte pas les rabais sur l’expĂ©dition & fiscale." - -#. translators: 1. Receiver email 2. Coupon code 3. Order id -#: includes/class-wc-sc-coupon-process.php:813 -#: includes/class-wc-smart-coupons.php:764 -#, php-format -msgid "" -"Failed to schedule email to \"%1$s\" for coupon \"%2$s\" received from order " -"#%3$s." -msgstr "" -"Impossible de planifier l’envoi du mail Ă  « %1$s » pour le code promo " -"« %2$s » reçu Ă  partir de la commande #%3$s." - -#: includes/class-wc-sc-coupon-refund-process.php:184 -msgid "Refund to Store Credit" -msgstr "Remboursement au crĂ©dit d’achat" - -#: includes/class-wc-sc-coupon-refund-process.php:195 -msgid "Auto-fill refund amount" -msgstr "Remplir automatiquement le montant du remboursement" - -#. translators: 1: refund id 2: refund date 3: username -#: includes/class-wc-sc-coupon-refund-process.php:520 -#, php-format -msgid "Refund %1$s - %2$s by %3$s" -msgstr "Remboursement %1$s - %2$s par %3$s" - -#. translators: 1: ID who refunded -#: includes/class-wc-sc-coupon-refund-process.php:526 -#, php-format -msgid "ID: %d" -msgstr "ID : %d" - -#. translators: 1: refund id 2: refund date -#: includes/class-wc-sc-coupon-refund-process.php:533 -#, php-format -msgid "Refund %1$s - %2$s" -msgstr "Remboursement %1$s - %2$s" - -#: includes/class-wc-sc-coupons-by-location.php:187 -msgid "Address to look in" -msgstr "Adresse Ă  rechercher dans" - -#: includes/class-wc-sc-coupons-by-location.php:190 -msgid "Billing" -msgstr "Facturation" - -#: includes/class-wc-sc-coupons-by-location.php:194 -msgid "Shipping" -msgstr "Livraison" - -#: includes/class-wc-sc-coupons-by-location.php:198 -msgid "Locations" -msgstr "Emplacements" - -#: includes/class-wc-sc-coupons-by-location.php:210 -msgid "Select location" -msgstr "SĂ©lectionner le lieu" - -#: includes/class-wc-sc-coupons-by-location.php:213 -msgid "Select Country" -msgstr "SĂ©lectionnez un pays" - -#: includes/class-wc-sc-coupons-by-location.php:226 -msgid "Select Additional Locations" -msgstr "SĂ©lectionnez d’autres emplacements" - -#: includes/class-wc-sc-coupons-by-location.php:413 -msgid "Coupon is not valid for the" -msgstr "Le code promo n’est pas valide pour" - -#: includes/class-wc-sc-coupons-by-location.php:413 -msgid "billing address" -msgstr "adresse de facturation" - -#: includes/class-wc-sc-coupons-by-location.php:413 -msgid "shipping address" -msgstr "adresse de livraison" - -#: includes/class-wc-sc-coupons-by-location.php:428 -msgid "Locations lookup in" -msgstr "Recherche de lieux dans" - -#: includes/class-wc-sc-coupons-by-location.php:429 -msgid "Billing Locations" -msgstr "Emplacement de facturation" - -#: includes/class-wc-sc-coupons-by-location.php:430 -msgid "Shipping Locations" -msgstr "Emplacement de livraison" - -#: includes/class-wc-sc-coupons-by-payment-method.php:103 -#: includes/class-wc-sc-coupons-by-payment-method.php:194 -msgid "Payment methods" -msgstr "Moyens de paiement" - -#: includes/class-wc-sc-coupons-by-payment-method.php:104 -msgid "No payment methods" -msgstr "Pas de mode de paiement" - -#: includes/class-wc-sc-coupons-by-payment-method.php:114 -msgid "" -"Payment methods that must be selected during checkout for this coupon to be " -"valid." -msgstr "" -"Moyens de paiement qui doivent ĂŞtre sĂ©lectionnĂ©s lors de la commande pour " -"que ce code promo soit valide." - -#: includes/class-wc-sc-coupons-by-payment-method.php:178 -msgid "This coupon is not valid for selected payment method." -msgstr "Ce code promo n’est pas valable pour le mode de paiement sĂ©lectionnĂ©." - -#: includes/class-wc-sc-coupons-by-product-attribute.php:164 -msgid "Attribute=" -msgstr "Attribut=" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:164 -msgid "Value=" -msgstr "Valeur=" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:178 -msgid "Product attributes" -msgstr "Attributs du produit" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:179 -#: includes/class-wc-sc-coupons-by-product-attribute.php:198 -msgid "No product attributes" -msgstr "Aucun attribut produit" - -#. translators: Non product type coupon labels -#: includes/class-wc-sc-coupons-by-product-attribute.php:190 -#, php-format -msgid "" -"Product attributes that the coupon will be applied to, or that need to be in " -"the cart in order for the %s to be applied." -msgstr "" -"Attributs du produit pour que le code promo soit appliquĂ©, ou qui doivent " -"ĂŞtre dans le panier afin que les %s s’appliquent." - -#: includes/class-wc-sc-coupons-by-product-attribute.php:197 -msgid "Exclude attributes" -msgstr "Exclure les attributs" - -#. translators: Non product type coupon labels -#: includes/class-wc-sc-coupons-by-product-attribute.php:209 -#, php-format -msgid "" -"Product attributes that the coupon will not be applied to, or that cannot be " -"in the cart in order for the %s to be applied." -msgstr "" -"Attributs de produit auxquels le code promo ne sera pas appliquĂ©, ou qui ne " -"peuvent pas ĂŞtre dans le panier pour que les %s soient appliquĂ©s." - -#: includes/class-wc-sc-coupons-by-product-attribute.php:475 -#: includes/class-wc-sc-coupons-by-taxonomy.php:694 -msgid "Sorry, this coupon is not applicable to selected products." -msgstr "DĂ©solĂ©, ce code promo n’est pas applicable aux produits sĂ©lectionnĂ©s." - -#. translators: 1. Singular/plural label for product(s) 2. Excluded product names -#: includes/class-wc-sc-coupons-by-product-attribute.php:509 -#: includes/class-wc-sc-coupons-by-taxonomy.php:723 -#, php-format -msgid "Sorry, this coupon is not applicable to the %1$s: %2$s." -msgstr "DĂ©solĂ©, ce code promo n’est pas applicable aux %1$s : %2$s." - -#: includes/class-wc-sc-coupons-by-product-attribute.php:509 -#: includes/class-wc-sc-coupons-by-taxonomy.php:723 -msgid "product" -msgid_plural "products" -msgstr[0] "produit" -msgstr[1] "produits" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:529 -msgid "Product Attributes" -msgstr "Attributs du produit" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:530 -msgid "Exclude Attributes" -msgstr "Exclure les attributs" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:102 -msgid "Product quantity based restrictions" -msgstr "Restrictions basĂ©es sur la quantitĂ© de produits" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:104 -msgid "Validate quantity of" -msgstr "Valider la quantitĂ© de" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:107 -msgid "Cart" -msgstr "Panier" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:114 -msgid "Choose whether to validate the quantity, cart-wise or product-wise" -msgstr "Choisissez de valider la quantitĂ©, par panier ou par produit" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:118 -msgid "Minimum quantity" -msgstr "QuantitĂ© minimale" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:119 -#: includes/class-wc-sc-coupons-by-product-quantity.php:144 -#: includes/class-wc-sc-coupons-by-product-quantity.php:182 -#: includes/class-wc-sc-coupons-by-product-quantity.php:212 -#: includes/class-wc-sc-coupons-by-product-quantity.php:224 -msgid "No minimum" -msgstr "Pas de minimum" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:122 -msgid "Maximum quantity" -msgstr "QuantitĂ© maximale" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:123 -#: includes/class-wc-sc-coupons-by-product-quantity.php:145 -#: includes/class-wc-sc-coupons-by-product-quantity.php:183 -#: includes/class-wc-sc-coupons-by-product-quantity.php:213 -#: includes/class-wc-sc-coupons-by-product-quantity.php:225 -msgid "No maximum" -msgstr "Pas de maximum" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:140 -#: includes/class-wc-sc-coupons-by-product-quantity.php:156 -#: includes/class-wc-sc-coupons-by-product-quantity.php:232 -#: includes/class-wc-sc-coupons-by-product-quantity.php:247 -msgid "Products" -msgstr "Produits" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:158 -#: includes/class-wc-sc-coupons-by-product-quantity.php:234 -msgid "Please select some products" -msgstr "Veuillez sĂ©lectionner des produits" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:178 -#: includes/class-wc-sc-coupons-by-product-quantity.php:195 -#: includes/class-wc-sc-coupons-by-product-quantity.php:240 -#: includes/class-wc-sc-coupons-by-product-quantity.php:250 -msgid "Categories" -msgstr "CatĂ©gories" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:197 -#: includes/class-wc-sc-coupons-by-product-quantity.php:242 -msgid "Please select some categories" -msgstr "Veuillez sĂ©lectionner des catĂ©gories" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:525 -msgid "Your cart does not meet the quantity requirement." -msgstr "Votre panier ne respecte pas la quantitĂ© requise." - -#. translators: 1. Number of quantity 2. Singular or plural text based on number of quantities -#: includes/class-wc-sc-coupons-by-product-quantity.php:539 -#, php-format -msgid "Your cart should have a maximum of %1$d %2$s in total." -msgstr "Votre panier doit contenir un maximum de %1$d %2$s au total." - -#: includes/class-wc-sc-coupons-by-product-quantity.php:539 -#: includes/class-wc-sc-coupons-by-product-quantity.php:543 -msgid "quantity" -msgid_plural "quantities" -msgstr[0] "quantitĂ©" -msgstr[1] "quantitĂ©s" - -#. translators: 1. Number of quantity 2. Singular or plural text based on number of quantities -#: includes/class-wc-sc-coupons-by-product-quantity.php:543 -#, php-format -msgid "Your cart should have a minimum of %1$d %2$s in total." -msgstr "Votre panier doit contenir au moins %1$d %2$s au total." - -#: includes/class-wc-sc-coupons-by-product-quantity.php:561 -#: includes/class-wc-sc-coupons-by-product-quantity.php:563 -#: includes/class-wc-sc-coupons-by-product-quantity.php:565 -msgid "Your cart does not meet the product quantity requirement." -msgstr "Votre panier ne respecte pas la quantitĂ© requise." - -#: includes/class-wc-sc-coupons-by-shipping-method.php:103 -#: includes/class-wc-sc-coupons-by-shipping-method.php:231 -msgid "Shipping methods" -msgstr "MĂ©thodes d’expĂ©dition" - -#: includes/class-wc-sc-coupons-by-shipping-method.php:104 -msgid "No shipping methods" -msgstr "Pas de mode de livraison" - -#: includes/class-wc-sc-coupons-by-shipping-method.php:114 -msgid "" -"Shipping methods that must be selected during checkout for this coupon to be " -"valid." -msgstr "" -"Modes de livraison qui doivent ĂŞtre sĂ©lectionnĂ©es lors du paiement pour que " -"ce code promo soit valide." - -#: includes/class-wc-sc-coupons-by-shipping-method.php:207 -#: includes/class-wc-sc-coupons-by-shipping-method.php:212 -msgid "This coupon is not valid for selected shipping method." -msgstr "Ce code promo n’est pas valable pour le mode de livraison sĂ©lectionnĂ©." - -#: includes/class-wc-sc-coupons-by-taxonomy.php:95 -#: includes/class-wc-sc-coupons-by-taxonomy.php:282 -msgid "Include" -msgstr "Inclure" - -#: includes/class-wc-sc-coupons-by-taxonomy.php:96 -#: includes/class-wc-sc-coupons-by-taxonomy.php:283 -msgid "Exclude" -msgstr "Exclure" - -#: includes/class-wc-sc-coupons-by-taxonomy.php:133 -#: includes/class-wc-sc-coupons-by-taxonomy.php:174 -msgid "Taxonomy" -msgstr "Taxonomie" - -#: includes/class-wc-sc-coupons-by-taxonomy.php:134 -msgid "" -"Product taxonomies that the coupon will be applicable for, or its " -"availability in the cart in order for the \"Fixed cart discount\" to be " -"applied, based on whether the taxonomies are included or excluded. All the " -"taxonomies selected here, should be valid, for this coupon to be valid." -msgstr "" -"Les taxonomies de produits pour lesquelles le code promo sera applicable, ou " -"sa disponibilitĂ© dans le panier afin que la « remise fixe sur le panier » " -"soit appliquĂ©e, selon que les taxonomies sont incluses ou exclues. Toutes " -"les taxonomies sĂ©lectionnĂ©es ici doivent ĂŞtre valides pour que ce code promo " -"soit valable." - -#: includes/class-wc-sc-coupons-by-taxonomy.php:138 -#: includes/class-wc-sc-coupons-by-taxonomy.php:211 -msgid "Add taxonomy restriction" -msgstr "Ajouter une restriction sur une taxonomie" - -#: includes/class-wc-sc-coupons-by-taxonomy.php:175 -msgid "" -"Product taxonomies that the coupon will be applicable for, or its " -"availability in the cart in order for the \"Fixed cart discount\" to be " -"applied, based on whether the taxonomies are included or excluded." -msgstr "" -"Les taxonomies de produits pour lesquelles le code promo sera applicable, ou " -"sa disponibilitĂ© dans le panier pour que la « remise panier fixe » soit " -"appliquĂ©e, selon que les taxonomies sont incluses ou exclues." - -#: includes/class-wc-sc-coupons-by-taxonomy.php:211 -msgid "Remove taxonomy restriction" -msgstr "Supprimer la restriction de taxonomie" - -#: includes/class-wc-sc-coupons-by-user-role.php:109 -msgid "Allowed user roles" -msgstr "RĂ´les utilisateur autorisĂ©s" - -#: includes/class-wc-sc-coupons-by-user-role.php:110 -#: includes/class-wc-sc-coupons-by-user-role.php:127 -msgid "No user roles" -msgstr "Aucun rĂ´le utilisateur" - -#: includes/class-wc-sc-coupons-by-user-role.php:121 -msgid "" -"Role of the users for whom this coupon is valid. Keep empty if you want this " -"coupon to be valid for users with any role." -msgstr "" -"RĂ´le des utilisateurs pour lesquels ce code promo est valable. Laissez vide " -"si vous voulez que ce code promo soit valable pour tous les types de rĂ´les." - -#: includes/class-wc-sc-coupons-by-user-role.php:126 -msgid "Exclude user roles" -msgstr "Exclure les rĂ´les utilisateur" - -#: includes/class-wc-sc-coupons-by-user-role.php:138 -msgid "" -"Role of the users for whom this coupon is not valid. Keep empty if you want " -"this coupon to be valid for users with any role." -msgstr "" -"RĂ´le des utilisateurs pour lesquels ce code promo n’est pas valable. Laissez " -"vide si vous voulez que ce code promo soit valable pour les utilisateurs " -"ayant un rĂ´le quelconque." - -#: includes/class-wc-sc-coupons-by-user-role.php:213 -#: includes/class-wc-sc-coupons-by-user-role.php:220 -msgid "This coupon is not valid for you." -msgstr "Ce code promo n’est pas valable pour vous." - -#: includes/class-wc-sc-coupons-by-user-role.php:236 -msgid "User Role" -msgstr "RĂ´le de l’utilisateur" - -#: includes/class-wc-sc-coupons-by-user-role.php:237 -msgid "Exclude User Role" -msgstr "RĂ´le d’utilisateur Ă  exclure" - -#: includes/class-wc-sc-display-coupons.php:272 -#: includes/class-wc-sc-display-coupons.php:873 -#: includes/class-wc-sc-display-coupons.php:2030 -#: includes/class-wc-sc-shortcode.php:480 -#: includes/class-wc-smart-coupons.php:4153 templates/combined-email.php:124 -#: templates/email.php:121 templates/print-coupons-default.php:138 -msgid " & " -msgstr " & " - -#: includes/class-wc-sc-display-coupons.php:274 -#: includes/class-wc-sc-display-coupons.php:875 -#: includes/class-wc-sc-display-coupons.php:2032 -#: includes/class-wc-sc-shortcode.php:482 -#: includes/class-wc-smart-coupons.php:4155 templates/combined-email.php:126 -#: templates/email.php:123 templates/plain/combined-email.php:91 -#: templates/plain/email.php:86 templates/print-coupons-default.php:140 -msgid "Free Shipping" -msgstr "Livraison gratuite" - -#: includes/class-wc-sc-display-coupons.php:291 -#: includes/class-wc-sc-display-coupons.php:889 -#: includes/class-wc-sc-display-coupons.php:2061 -#: includes/class-wc-sc-shortcode.php:511 -#: includes/class-wc-smart-coupons.php:4182 -#: includes/emails/class-wc-sc-email-coupon.php:173 -#: templates/combined-email.php:155 templates/email.php:152 -#: templates/plain/combined-email.php:123 templates/plain/email.php:118 -#: templates/print-coupons-default.php:170 -msgid "Never expires" -msgstr "N’expire jamais" - -#: includes/class-wc-sc-display-coupons.php:337 -#: includes/class-wc-sc-display-coupons.php:735 -#: includes/class-wc-sc-settings.php:652 includes/class-wc-sc-shortcode.php:582 -msgid "Available Coupons (click on a coupon to use it)" -msgstr "Codes promo disponibles (cliquer pour utiliser)" - -#: includes/class-wc-sc-display-coupons.php:535 -msgid "You will get following coupon(s) when you buy this item:" -msgstr "" -"Vous obtiendrez le ou les code(s) promo suivant(s) si vous achetez cet " -"article :" - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-display-coupons.php:584 -#, php-format -msgid "%s of " -msgstr "%s de " - -#: includes/class-wc-sc-display-coupons.php:584 -msgid "Store Credit of " -msgstr "Bon d’achat de " - -#: includes/class-wc-sc-display-coupons.php:594 -msgid " discount on your entire purchase" -msgstr " de remise sur la totalitĂ© de votre achat" - -#: includes/class-wc-sc-display-coupons.php:599 -#: includes/class-wc-sc-display-coupons.php:608 -#: includes/class-wc-sc-display-coupons.php:617 -msgid "some products" -msgstr "certains produits" - -#: includes/class-wc-sc-display-coupons.php:601 -#: includes/class-wc-sc-display-coupons.php:610 -msgid "all products" -msgstr "tous les produits" - -#: includes/class-wc-sc-display-coupons.php:603 -#: includes/class-wc-sc-display-coupons.php:612 -msgid " discount on " -msgstr " remise sur " - -#: includes/class-wc-sc-display-coupons.php:619 -msgid "your entire purchase" -msgstr "la totalitĂ© de votre achat" - -#. translators: %s: Maximum coupon discount amount -#: includes/class-wc-sc-display-coupons.php:625 -#: includes/class-wc-smart-coupons.php:1055 -#: includes/emails/class-wc-sc-email-coupon.php:426 -#, php-format -msgid " upto %s" -msgstr " jusqu’à %s" - -#: includes/class-wc-sc-display-coupons.php:627 -msgid " discount" -msgstr " Remise" - -#: includes/class-wc-sc-display-coupons.php:627 -msgid " on " -msgstr " sur " - -#. translators: 1. Discount type 2. Discount amount -#. translators: 1: coupon type 2: coupon amount -#: includes/class-wc-sc-display-coupons.php:634 -#: includes/emails/class-wc-sc-email-coupon.php:439 -#, php-format -msgid "%1$s coupon of %2$s" -msgstr "%1$s code promo de %2$s" - -#. translators: Add more detail to coupon description -#: includes/class-wc-sc-display-coupons.php:642 -#, php-format -msgid "%s Free Shipping" -msgstr "%s Livraison gratuite" - -#: includes/class-wc-sc-display-coupons.php:642 -msgid " &" -msgstr " &" - -#: includes/class-wc-sc-display-coupons.php:724 -#: includes/class-wc-sc-settings.php:620 -#: includes/class-wc-smart-coupons.php:295 -msgid "Select options" -msgstr "SĂ©lectionner les options" - -#. translators: %s: plural name for store credit -#. translators: %s: Label for store credit -#: includes/class-wc-sc-display-coupons.php:749 -#: includes/class-wc-sc-display-coupons.php:944 -#: includes/class-wc-sc-settings.php:663 -#, php-format -msgid "Available Coupons & %s" -msgstr "Codes promo et %s disponibles" - -#: includes/class-wc-sc-display-coupons.php:749 -#: includes/class-wc-sc-display-coupons.php:944 -msgid "Available Coupons & Store Credits" -msgstr "Codes promo & bons d’achat disponibles" - -#: includes/class-wc-sc-display-coupons.php:929 -#: includes/class-wc-sc-display-coupons.php:985 -msgid "Sorry, No coupons available for you." -msgstr "DĂ©solĂ©, aucun code promo actuellement disponible." - -#: includes/class-wc-sc-display-coupons.php:982 -msgid "" -"List of coupons which are valid & available for use. Click on the coupon to " -"use it. The coupon discount will be visible only when at least one product " -"is present in the cart." -msgstr "" -"Liste des codes promo valables et disponibles Ă  l’utilisation. Cliquez sur " -"le code promo pour l’utiliser. Le code promo ne sera visible que si au moins " -"un produit est prĂ©sent dans le panier." - -#: includes/class-wc-sc-display-coupons.php:1124 -#: templates/combined-email.php:225 templates/email.php:205 -msgid "Print coupon" -msgid_plural "Print coupons" -msgstr[0] "Imprimer le code promo" -msgstr[1] "Imprimer les codes promo" - -#: includes/class-wc-sc-display-coupons.php:1189 -msgid "Store Credits" -msgstr "Bons d’achat" - -#: includes/class-wc-sc-display-coupons.php:1198 -msgid "Total Credit Amount" -msgstr "Montant total du bon" - -#: includes/class-wc-sc-display-coupons.php:1217 -msgid "Discount Coupons" -msgstr "Codes promo" - -#: includes/class-wc-sc-display-coupons.php:1244 -msgid "Invalid / Used Coupons" -msgstr "Codes promo invalides / dĂ©jĂ  utilisĂ©s" - -#: includes/class-wc-sc-display-coupons.php:1245 -msgid "" -"List of coupons which can not be used. The reason can be based on its usage " -"restrictions, usage limits, expiry date." -msgstr "" -"Liste des codes promo qui ne peuvent pas ĂŞtre utilisĂ©s. La raison peut ĂŞtre " -"basĂ©e sur ses restrictions d’utilisation, ses limites d’utilisation, sa date " -"d’expiration." - -#: includes/class-wc-sc-display-coupons.php:1640 -msgid "Endpoint for the My Account → Coupons page" -msgstr "Endpoint pour la page « Mon compte » → onglet « Codes promo »" - -#: includes/class-wc-sc-display-coupons.php:1794 -msgid "Coupon Received" -msgstr "Code promo reçu" - -#: includes/class-wc-sc-display-coupons.php:1795 -msgid "" -"List of coupons & their details which you have received from the store. " -"Click on the coupon to see the details." -msgstr "" -"Liste des codes promo que vous avez reçus. Cliquez sur le code promo pour " -"voir les dĂ©tails." - -#: includes/class-wc-sc-display-coupons.php:1845 -#: includes/class-wc-sc-display-coupons.php:1856 -msgid "Less details" -msgstr "Moins de dĂ©tails" - -#: includes/class-wc-sc-display-coupons.php:1847 -#: includes/class-wc-sc-display-coupons.php:1859 -#: includes/class-wc-sc-display-coupons.php:1962 -msgid "More details" -msgstr "Plus de dĂ©tails" - -#: includes/class-wc-sc-display-coupons.php:2080 -#: includes/class-wc-sc-display-coupons.php:2117 -msgid "Sender" -msgstr "ExpĂ©diteur" - -#: includes/class-wc-sc-display-coupons.php:2081 -#: includes/class-wc-sc-display-coupons.php:2115 -msgid "Receiver" -msgstr "Destinataire" - -#: includes/class-wc-sc-display-coupons.php:2113 -msgid "Code" -msgstr "Code" - -#: includes/class-wc-sc-display-coupons.php:2114 -msgid "Amount" -msgstr "Montant" - -#: includes/class-wc-sc-display-coupons.php:2206 -msgid "Generated coupons" -msgstr "Codes promo gĂ©nĂ©rĂ©s" - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-order-fields.php:181 -#, php-format -msgid "%s Used" -msgstr "%s utilisĂ©" - -#: includes/class-wc-sc-order-fields.php:181 -msgid "Store Credit Used" -msgstr "Bon d’achat utilisĂ©" - -#: includes/class-wc-sc-order-fields.php:183 -msgid "This is the total credit used." -msgstr "Ceci est le total des bons d’achat utilisĂ©." - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-order-fields.php:237 -#, php-format -msgid "%s Used:" -msgstr "%s utilisé :" - -#: includes/class-wc-sc-order-fields.php:237 -msgid "Store Credit Used:" -msgstr "CrĂ©dit bon d’achat utilisĂ© :" - -#: includes/class-wc-sc-order-fields.php:303 -msgid "Store Credit:" -msgstr "Bon d’achat :" - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-order-fields.php:463 -#, php-format -msgid "%s Balance " -msgstr "%s solde " - -#: includes/class-wc-sc-order-fields.php:463 -msgid "Store Credit / Gift Card Balance" -msgstr "Solde Bon d’achat / Carte Cadeau" - -#: includes/class-wc-sc-print-coupon.php:123 -msgctxt "Page slug" -msgid "wc-sc-coupons-terms" -msgstr "wc-sc-coupons-terms" - -#: includes/class-wc-sc-print-coupon.php:124 -msgctxt "Page title" -msgid "Smart Coupons Terms" -msgstr "Termes des Codes promo" - -#: includes/class-wc-sc-print-coupon.php:278 -msgid "" -"Smart Coupons has created a coupon's terms page (used during coupon " -"printing) for you. Please edit it as required from" -msgstr "" -"Smart Coupons a créé pour vous une page de termes de code promo (utilisĂ©e " -"lors de l’impression de codes promo). Veuillez la modifier au besoin" - -#: includes/class-wc-sc-print-coupon.php:420 -msgid "Used during coupon printing" -msgstr "UtilisĂ© lors de l’impression des codes promo" - -#. translators: Plugin's name -#: includes/class-wc-sc-privacy.php:51 -#, php-format -msgid "%s - Coupon Personal Data Exporter" -msgstr "%s - Exporter les donnĂ©es personnelles de code promo" - -#. translators: Plugin's name -#: includes/class-wc-sc-privacy.php:53 -#, php-format -msgid "%s - Coupon Personal Data Eraser" -msgstr "%s - Effacer les donnĂ©es personnelles de code promo" - -#. translators: Plugin's name -#: includes/class-wc-sc-privacy.php:56 -#, php-format -msgid "%s - Order Personal Data Exporter" -msgstr "%s - Exporter les donnĂ©es personnelles de commande" - -#. translators: Plugin's name -#: includes/class-wc-sc-privacy.php:58 -#, php-format -msgid "%s - Order Personal Data Eraser" -msgstr "%s - Effacer les donnĂ©es personnelles de commande" - -#. translators: Plugin's name -#: includes/class-wc-sc-privacy.php:61 -#, php-format -msgid "%s - User Personal Data Exporter" -msgstr "%s - Exporter les donnĂ©es personnelles de l’utilisateur" - -#. translators: Plugin's name -#: includes/class-wc-sc-privacy.php:63 -#, php-format -msgid "%s - User Personal Data Eraser" -msgstr "%s - Effacer les donnĂ©es personnelles de l’utilisateur" - -#: includes/class-wc-sc-privacy.php:112 includes/class-wc-sc-privacy.php:311 -#: includes/class-wc-sc-privacy.php:430 includes/class-wc-sc-privacy.php:668 -msgid "Store Credit/Gift Certificate" -msgstr "Bon d’achat / Carte cadeau" - -#: includes/class-wc-sc-privacy.php:113 -msgid "What we access?" -msgstr "Ă€ quelles informations avons-nous accès ?" - -#: includes/class-wc-sc-privacy.php:115 -msgid "" -"If you are logged in: We access your billing email address saved in your " -"account & billing email address entered during purchase" -msgstr "" -"Si vous ĂŞtes connectĂ©(e) : nous accèderons Ă  votre adresse e-mail de " -"facturation enregistrĂ©e dans votre compte et votre adresse e-mail de " -"facturation saisie lors de l’achat" - -#: includes/class-wc-sc-privacy.php:116 -msgid "" -"If you are a visitor: We access your billing email address entered during " -"purchase" -msgstr "" -"Si vous ĂŞtes un visiteur: nous accèderons Ă  votre adresse e-mail de " -"facturation saisie lors de l’achat" - -#: includes/class-wc-sc-privacy.php:118 -msgid "What we store & why?" -msgstr "Quelles donnĂ©es enregistrons-nous et pourquoi ?" - -#: includes/class-wc-sc-privacy.php:120 -msgid "Coupon code generated for you" -msgstr "Code promo gĂ©nĂ©rĂ© pour vous" - -#: includes/class-wc-sc-privacy.php:121 -msgid "Coupon code passed via URL" -msgstr "Code promo passĂ© par URL" - -#: includes/class-wc-sc-privacy.php:122 -msgid "Coupon amount, email & message entered for gift card receiver" -msgstr "" -"Montant du code promo, e-mail & message entrĂ© pour le destinataire de la " -"carte-cadeau" - -#: includes/class-wc-sc-privacy.php:124 -msgid "" -"We store these data so that we can process it for you whenever required." -msgstr "" -"Nous stockons ces donnĂ©es afin que nous puissions les traiter pour vous " -"chaque fois que nĂ©cessaire." - -#: includes/class-wc-sc-privacy.php:247 -msgid "Store Credit/Gift Certificate - Coupon Data" -msgstr "Bon d’achat/carte cadeau - DonnĂ©es du code promo" - -#: includes/class-wc-sc-privacy.php:311 -msgid "Removed Coupon Personal Data" -msgstr "DonnĂ©es personnelles des codes promo supprimĂ©es" - -#: includes/class-wc-sc-privacy.php:371 includes/class-wc-sc-privacy.php:383 -#: includes/emails/class-wc-sc-acknowledgement-email.php:340 -#: templates/acknowledgement-email.php:66 templates/coupon-design/basic.php:39 -#: templates/coupon-design/clipper.php:38 templates/coupon-design/cutout.php:55 -#: templates/coupon-design/deal.php:29 templates/coupon-design/deliver.php:34 -#: templates/coupon-design/shipment.php:33 -#: templates/coupon-design/special.php:58 templates/coupon-design/ticket.php:40 -#: templates/plain/acknowledgement-email.php:56 -msgid "Coupon" -msgid_plural "Coupons" -msgstr[0] "Code promo" -msgstr[1] "Codes promo" - -#: includes/class-wc-sc-privacy.php:377 -msgid "Generated Coupon Data" -msgstr "DonnĂ©es de code promo gĂ©nĂ©rĂ©es" - -#: includes/class-wc-sc-privacy.php:388 -msgid "Coupon passed in URL" -msgstr "Code promo passĂ© dans l’URL" - -#: includes/class-wc-sc-privacy.php:430 -msgid "Removed User Personal Data" -msgstr "DonnĂ©es personnelles des utilisateurs supprimĂ©s" - -#: includes/class-wc-sc-privacy.php:555 -#: includes/class-wc-smart-coupons.php:4257 -msgid "Coupon Code" -msgstr "Code Promo" - -#: includes/class-wc-sc-privacy.php:558 -#: includes/class-wc-smart-coupons.php:4269 -msgid "Coupon Amount" -msgstr "Montant du code promo" - -#: includes/class-wc-sc-privacy.php:561 -msgid "Coupon For" -msgstr "Code promo pour" - -#: includes/class-wc-sc-privacy.php:574 -msgid "Store Credit/Gift Certificate - Order Data" -msgstr "Bon d’achat/Carte cadeau - DonnĂ©es de la commande" - -#: includes/class-wc-sc-privacy.php:668 -msgid "Removed Order Personal Data" -msgstr "DonnĂ©es personnelles des commandes supprimĂ©es" - -#: includes/class-wc-sc-privacy.php:742 -msgid "Retain Store Credit/Gift Certificate" -msgstr "Conserver le bon d’achat/carte cadeau" - -#: includes/class-wc-sc-privacy.php:743 -msgid "" -"Store Credit/Gift Certificate that are stored for customers via coupons. If " -"erased, the customer will not be able to use the coupons." -msgstr "" -"Bons d’achat/cartes cadeau qui sont stockĂ©s pour les clients via les codes " -"promo. S’ils sont effacĂ©s, le client ne pourra pas utiliser les codes promo." - -#: includes/class-wc-sc-privacy.php:746 -msgid "N/A" -msgstr "N/A" - -#: includes/class-wc-sc-product-fields.php:97 -#: includes/class-wc-sc-product-fields.php:155 -msgid "Search for a coupon…" -msgstr "Chercher un code promo…" - -#. translators: 1. Discount type 2. Discount Type Label -#: includes/class-wc-sc-product-fields.php:111 -#: includes/class-wc-sc-product-fields.php:169 -#, php-format -msgid " ( %1$s: %2$s )" -msgstr " ( %1$s : %2$s )" - -#: includes/class-wc-sc-product-fields.php:120 -#: includes/class-wc-sc-product-fields.php:154 -msgid "" -"These coupon/s will be given to customers who buy this product. The coupon " -"code will be automatically sent to their email address on purchase." -msgstr "" -"Ce ou ces codes promo seront accordĂ©s aux clients qui achèteront ce produit. " -"Le ou les codes promo seront automatiquement envoyĂ©s Ă  leur adresse e-mail " -"après achat." - -#: includes/class-wc-sc-product-fields.php:124 -#: includes/class-wc-sc-product-fields.php:180 -msgid "Send coupons on renewals?" -msgstr "Envoyer des codes promo sur les renouvellements ?" - -#: includes/class-wc-sc-product-fields.php:126 -#: includes/class-wc-sc-product-fields.php:179 -msgid "Check this box to send above coupons on each renewal order." -msgstr "" -"Cochez cette case pour envoyer les codes promo ci-dessus pour chaque " -"commande renouvelĂ©e." - -#: includes/class-wc-sc-purchase-credit.php:144 -msgid "Enter a numeric value." -msgstr "Saisissez une valeur numĂ©rique." - -#: includes/class-wc-sc-purchase-credit.php:147 -msgid "The value should not be less than" -msgstr "La valeur ne doit pas ĂŞtre infĂ©rieure Ă " - -#: includes/class-wc-sc-purchase-credit.php:149 -msgid "The value should not be greater than" -msgstr "La valeur ne doit pas ĂŞtre supĂ©rieure Ă " - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-purchase-credit.php:204 -#, php-format -msgid "Purchase %s worth" -msgstr "Achat %s valeur" - -#: includes/class-wc-sc-purchase-credit.php:204 -#: includes/class-wc-sc-settings.php:632 -msgid "Purchase credit worth" -msgstr "Montant de la carte cadeau" - -#: includes/class-wc-sc-purchase-credit.php:506 -msgid "Now" -msgstr "Maintenant" - -#: includes/class-wc-sc-purchase-credit.php:516 -msgid "Later" -msgstr "Plus tard" - -#: includes/class-wc-sc-purchase-credit.php:663 -#: includes/class-wc-sc-settings.php:692 -msgid "Send Coupons to..." -msgstr "Envoyer le(s) codes(s) promo Ă ..." - -#: includes/class-wc-sc-purchase-credit.php:675 -msgid "" -"Your order contains coupons. You will receive them after completion of this " -"order." -msgstr "" -"Votre commande contient des codes promo. Vous les recevrez une fois la " -"commande finalisĂ©e." - -#: includes/class-wc-sc-purchase-credit.php:686 -msgid "Your order contains coupons. What would you like to do?" -msgstr "Vous allez offrir des codes promo. Comment voulez vous procĂ©der ?" - -#: includes/class-wc-sc-purchase-credit.php:688 -msgid "Send to me" -msgstr "Me les envoyer" - -#: includes/class-wc-sc-purchase-credit.php:690 -msgid "Gift to someone else" -msgstr "Les offrir Ă  quelqu’un" - -#: includes/class-wc-sc-purchase-credit.php:692 -msgid "Send to one person" -msgstr "L’envoyer Ă  une personne" - -#: includes/class-wc-sc-purchase-credit.php:693 -msgid "Send to different people" -msgstr "L’envoyer Ă  plusieurs personnes" - -#: includes/class-wc-sc-purchase-credit.php:697 -msgid "Deliver coupon" -msgstr "Envoyer le code promo" - -#: includes/class-wc-sc-purchase-credit.php:730 -#: includes/class-wc-sc-purchase-credit.php:835 -msgid "Enter recipient e-mail address" -msgstr "E-mail du destinataire" - -#: includes/class-wc-sc-purchase-credit.php:733 -#: includes/class-wc-sc-purchase-credit.php:840 -msgid "Pick a delivery date & time" -msgstr "Choisissez une date et une heure de remise" - -#: includes/class-wc-sc-purchase-credit.php:737 -#: includes/class-wc-sc-purchase-credit.php:846 -msgid "Write a message" -msgstr "Écrire un message" - -#: includes/class-wc-sc-purchase-credit.php:825 -msgid "Free Shipping coupon" -msgstr "Code promo de livraison gratuite" - -#: includes/class-wc-sc-purchase-credit.php:834 -msgid "of" -msgstr "de" - -#: includes/class-wc-sc-rest-coupons-controller.php:147 -msgid "The coupon code already exists" -msgstr "Ce code promotionnel existe dĂ©jĂ " - -#: includes/class-wc-sc-settings.php:209 includes/class-wc-sc-shortcode.php:803 -msgid "Preview" -msgstr "Aperçu" - -#: includes/class-wc-sc-settings.php:211 -msgid "See coupon search limitations" -msgstr "Voir les limitations de la recherche de coupons" - -#: includes/class-wc-sc-settings.php:301 -#: includes/compat/class-wcs-sc-compatibility.php:863 -msgid "store credit" -msgstr "bon d’achat" - -#: includes/class-wc-sc-settings.php:302 includes/class-wc-sc-settings.php:885 -msgid "store credits" -msgstr "bons d’achat" - -#: includes/class-wc-sc-settings.php:347 -msgid "" -"Set up Smart Coupons the way you like. Use these options to configure/change " -"the way Smart Coupons works." -msgstr "" -"Configurez les codes promo comme vous le souhaitez. Utilisez ces options " -"pour configurer/modifier la façon dont fonctionne l’extension Smart Coupons." - -#: includes/class-wc-sc-settings.php:351 -msgid "Colors" -msgstr "Couleurs" - -#: includes/class-wc-sc-settings.php:355 -msgid "Choose a color scheme for coupons." -msgstr "Choisissez un schĂ©ma de couleurs pour les codes promo." - -#: includes/class-wc-sc-settings.php:359 -msgid "Amaranth red" -msgstr "Rouge amarante" - -#: includes/class-wc-sc-settings.php:360 -msgid "Carolina Blue" -msgstr "Bleu Carolina" - -#: includes/class-wc-sc-settings.php:361 -msgid "Keppel" -msgstr "Keppel" - -#: includes/class-wc-sc-settings.php:362 -msgid "McDonald" -msgstr "McDonald" - -#: includes/class-wc-sc-settings.php:363 -msgid "Gold" -msgstr "Gold" - -#: includes/class-wc-sc-settings.php:364 -msgid "Majorelle Blue" -msgstr "Majorelle Blue" - -#: includes/class-wc-sc-settings.php:365 -msgid "Rose Pink" -msgstr "Rose" - -#: includes/class-wc-sc-settings.php:366 -msgid "Vintage" -msgstr "MillĂ©sime" - -#: includes/class-wc-sc-settings.php:367 -msgid "Spanish Orange" -msgstr "Orange espagnole" - -#: includes/class-wc-sc-settings.php:368 -msgid "Chocolate" -msgstr "Chocolat" - -#: includes/class-wc-sc-settings.php:369 -msgid "Ocean" -msgstr "OcĂ©an" - -#: includes/class-wc-sc-settings.php:376 -msgid "Customize colors" -msgstr "Personnaliser les couleurs" - -#: includes/class-wc-sc-settings.php:380 -msgid "Customize color scheme for coupons." -msgstr "Personnalisez le schĂ©ma de couleurs des codes promo." - -#: includes/class-wc-sc-settings.php:384 -msgid "Custom colors" -msgstr "Couleurs personnalisĂ©es" - -#: includes/class-wc-sc-settings.php:391 -msgid "Styles" -msgstr "Styles" - -#: includes/class-wc-sc-settings.php:395 -msgid "Choose a style for coupon on the website." -msgstr "Choisissez un style de codes promo sur le site web." - -#: includes/class-wc-sc-settings.php:399 -msgid "Flat" -msgstr "Plat" - -#: includes/class-wc-sc-settings.php:400 -msgid "Promotion" -msgstr "Promotion" - -#: includes/class-wc-sc-settings.php:401 -msgid "Ticket" -msgstr "Ticket" - -#: includes/class-wc-sc-settings.php:402 -msgid "Festive" -msgstr "Festive" - -#: includes/class-wc-sc-settings.php:403 -msgid "Special" -msgstr "SpĂ©cial" - -#: includes/class-wc-sc-settings.php:404 -msgid "Shipment" -msgstr "ExpĂ©dition" - -#: includes/class-wc-sc-settings.php:405 -msgid "Cutout" -msgstr "DĂ©coupe" - -#: includes/class-wc-sc-settings.php:406 -msgid "Deliver" -msgstr "Livraisons" - -#: includes/class-wc-sc-settings.php:407 -msgid "Clipper" -msgstr "Clipper" - -#: includes/class-wc-sc-settings.php:408 -msgid "Basic" -msgstr "Basique" - -#: includes/class-wc-sc-settings.php:409 -msgid "Deal" -msgstr "Offre" - -#: includes/class-wc-sc-settings.php:416 -msgid "Style for email" -msgstr "Style pour l’e-mail" - -#: includes/class-wc-sc-settings.php:420 -msgid "Style for coupon in email." -msgstr "Style du code promo dans l’e-mail." - -#: includes/class-wc-sc-settings.php:424 -msgid "Email coupon" -msgstr "Code promo d’e-mail" - -#: includes/class-wc-sc-settings.php:431 -#: includes/class-wc-smart-coupons.php:5087 -msgid "Number of coupons to show" -msgstr "Nombre de codes promo Ă  afficher" - -#: includes/class-wc-sc-settings.php:432 -msgid "" -"How many coupons (at max) should be shown on cart, checkout & my account " -"page? If set to 0 (zero) then coupons will not be displayed at all on the " -"website." -msgstr "" -"Combien de codes promo (au maximum) doivent ĂŞtre affichĂ©s sur la page " -"« Panier », sur la page « Commande » et sur la page « Mon compte » ? S’il " -"est fixĂ© Ă  0 (zĂ©ro), les codes promo ne seront pas du tout affichĂ©s." - -#: includes/class-wc-sc-settings.php:440 -#: includes/class-wc-smart-coupons.php:5088 -msgid "Number of characters in auto-generated coupon code" -msgstr "Nombre de caractères dans le code promo auto-gĂ©nĂ©rĂ©" - -#: includes/class-wc-sc-settings.php:441 -msgid "" -"Number of characters in auto-generated coupon code will be restricted to " -"this number excluding prefix and/or suffix. The default length will be 13. " -"It is recommended to keep this number between 10 to 15 to avoid coupon code " -"duplication." -msgstr "" -"Le nombre de caractères dans le code promo auto-gĂ©nĂ©rĂ© sera limitĂ© Ă  ce " -"numĂ©ro excluant le prĂ©fixe et/ou le suffixe. La longueur par dĂ©faut sera 13. " -"Il est recommandĂ© de garder ce nombre entre 10 et 15 pour Ă©viter la " -"duplication du code promo." - -#: includes/class-wc-sc-settings.php:455 -#: includes/class-wc-smart-coupons.php:5089 -msgid "Valid order status for auto-generating coupon" -msgstr "" -"État(s) de commande qui dĂ©clencheront la gĂ©nĂ©ration automatique de codes " -"promo" - -#: includes/class-wc-sc-settings.php:456 -msgid "" -"Choose order status which will trigger the auto-generation of coupon, if the " -"order contains product which will generate the coupon." -msgstr "" -"Choisissez l’état de la commande qui dĂ©clenchera la gĂ©nĂ©ration automatique " -"du code promo, si la commande contient un produit gĂ©nĂ©rant des codes promo." - -#: includes/class-wc-sc-settings.php:465 -msgid "Select order status…" -msgstr "SĂ©lectionnez l’état de la commande …" - -#: includes/class-wc-sc-settings.php:470 -msgid "Enable store notice for the coupon" -msgstr "Activer la notification de la boutique pour le code promo" - -#: includes/class-wc-sc-settings.php:474 -msgid "" -"Search & select a coupon which you want to display as store notice. The " -"selected coupon's description will be displayed along with the coupon code " -"(if it is set) otherwise, a description will be generated automatically. To " -"disable the feature, keep this field empty." -msgstr "" -"Recherchez et sĂ©lectionnez un code promo que vous souhaitez afficher comme " -"avis de magasin. La description du code promo sĂ©lectionnĂ© sera affichĂ©e avec " -"le code du code promo (si celui-ci est dĂ©fini), sinon une description sera " -"gĂ©nĂ©rĂ©e automatiquement. Pour dĂ©sactiver la fonction, laissez ce champ vide." - -#: includes/class-wc-sc-settings.php:480 -msgid "Search for a coupon..." -msgstr "Recherche un code promo…" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:489 -#, php-format -msgid "Generated %s amount" -msgstr "Montant gĂ©nĂ©rĂ© du %s" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:491 -#, php-format -msgid "Include tax in the amount of the generated %s" -msgstr "Inclure la taxe dans le montant gĂ©nĂ©rĂ© du %s" - -#: includes/class-wc-sc-settings.php:499 -msgid "Displaying coupons" -msgstr "Afficher les codes promo" - -#. translators: %s: Preview link -#: includes/class-wc-sc-settings.php:501 -#, php-format -msgid "" -"Include coupon details on product's page, for products that issue coupons %s" -msgstr "" -"Inclure les dĂ©tails du code promo sur la page « Produit », pour les produits " -"qui Ă©mettent des codes promo %s" - -#: includes/class-wc-sc-settings.php:501 includes/class-wc-sc-settings.php:510 -#: includes/class-wc-sc-settings.php:519 includes/class-wc-sc-settings.php:528 -#: includes/class-wc-sc-settings.php:537 includes/class-wc-sc-settings.php:615 -#: includes/class-wc-sc-settings.php:627 includes/class-wc-sc-settings.php:638 -#: includes/class-wc-sc-settings.php:648 includes/class-wc-sc-settings.php:658 -#: includes/class-wc-sc-settings.php:679 includes/class-wc-sc-settings.php:688 -#: includes/class-wc-sc-settings.php:698 includes/class-wc-sc-settings.php:707 -msgid "[Preview]" -msgstr "[Aperçu]" - -#. translators: %s: Preview link -#: includes/class-wc-sc-settings.php:510 -#, php-format -msgid "" -"Show coupons available to customers on their My Account > Coupons page %s" -msgstr "" -"Afficher les codes promo disponibles pour les clients sur leur page « Mon " -"compte » > onglet « Codes promo » %s" - -#. translators: %s: Preview link -#: includes/class-wc-sc-settings.php:519 -#, php-format -msgid "" -"Include coupons received from other people on My Account > Coupons page %s" -msgstr "" -"Inclure les codes promo reçus de la part d’autres personnes sur la page " -"« Mon compte » > onglet « Codes promo » %s" - -#. translators: %s: Preview link -#: includes/class-wc-sc-settings.php:528 -#, php-format -msgid "Show invalid or used coupons in My Account > Coupons %s" -msgstr "" -"Afficher les codes promo non valides ou dĂ©jĂ  utilisĂ©s sur la page « Mon " -"compte » > onglet « Codes promo » %s" - -#. translators: %s: Preview link -#: includes/class-wc-sc-settings.php:537 -#, php-format -msgid "" -"Display coupon description along with coupon code (on site as well as in " -"emails) %s" -msgstr "" -"Afficher la description du code promo en plus du code (sur le site ainsi que " -"dans les e-mails) %s" - -#: includes/class-wc-sc-settings.php:545 -#: includes/class-wc-smart-coupons.php:5093 -msgid "Automatic deletion" -msgstr "Suppression automatique" - -#. translators: %s: Note for admin -#: includes/class-wc-sc-settings.php:547 -#, php-format -msgid "Delete the %1$s when entire credit amount is used up %2$s" -msgstr "Supprimez la %1$s lorsque le montant total du crĂ©dit est Ă©puisĂ© %2$s" - -#: includes/class-wc-sc-settings.php:547 -msgid "(Note: It's recommended to keep it Disabled)" -msgstr "(Note: il est recommandĂ© de le garder dĂ©sactivĂ©)" - -#: includes/class-wc-sc-settings.php:555 -#: includes/class-wc-smart-coupons.php:5094 -msgid "Coupon emails" -msgstr "E-mails de code promo" - -#: includes/class-wc-sc-settings.php:556 -msgid "Email auto generated coupons to recipients" -msgstr "Envoyer des codes promo auto gĂ©nĂ©rĂ©s par e-mail aux destinataires" - -#: includes/class-wc-sc-settings.php:564 -#: includes/class-wc-smart-coupons.php:5095 -msgid "Printing coupons" -msgstr "Impression des codes promo" - -#: includes/class-wc-sc-settings.php:565 -msgid "Enable feature to allow printing of coupons" -msgstr "Activer la fonction permettant l’impression de codes promo" - -#: includes/class-wc-sc-settings.php:565 includes/class-wc-sc-settings.php:576 -#: includes/class-wc-sc-settings.php:596 -msgid "[Read More]" -msgstr "[Lire la suite]" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:574 -#, php-format -msgid "Sell %s at less price?" -msgstr "Vendre %s Ă  moindre prix ?" - -#. translators: %s: Label for store credit, 1: : Label for store credit, 2: Label for store credit, 3: Label for store credit -#: includes/class-wc-sc-settings.php:576 -#, php-format -msgid "Allow selling %s at discounted price" -msgstr "Autoriser les ventes de %s Ă  prix rĂ©duit" - -#: includes/class-wc-sc-settings.php:576 -#, php-format -msgid "" -"When selling %1$s, if Regular and Sale price is found for the product, then " -"coupon will be created with product's Regular Price but customer will pay " -"product's Sale price. This setting will also make sure if any discount " -"coupon is applied on the %2$s while purchasing, then customer will get %3$s " -"in their picked price" -msgstr "" -"Lors de la vente %1$s, si le prix normal et le prix de vente sont trouvĂ©s " -"pour le produit, le code promo sera créé avec le prix normal du produit mais " -"le client paiera le prix de vente du produit. Ce paramètre permettra " -"Ă©galement de s’assurer que si un code promo est appliquĂ© sur le %2$s lors de " -"l’achat, le client obtiendra %3$s dans son prix choisi" - -#: includes/class-wc-sc-settings.php:589 -msgid "Labels" -msgstr "LibellĂ©s" - -#: includes/class-wc-sc-settings.php:591 -msgid "" -"Call it something else! Use these to quickly change text labels through your " -"store. Use translations for " -"complete control." -msgstr "" -"Appelez vos codes promo autrement ! Utilisez cette fonctionnalitĂ© pour " -"modifier rapidement le libellĂ© de vos codes promo depuis votre boutique. Utilisez les traductions pour un contrĂ´le " -"complet." - -#: includes/class-wc-sc-settings.php:599 -msgid "Singular name" -msgstr "Nom singulier" - -#: includes/class-wc-sc-settings.php:600 -msgid "" -"Give alternate singular name to Store Credit / Gift Certficate. This label " -"will only rename Store Credit / Gift Certficate used in the Smart Coupons " -"plugin." -msgstr "" -"Donnez un nom singulier Ă  « Bons d’achat » / « Cartes cadeau ». Ce label " -"renommera « Bons d’achat » / « Cartes cadeau » uniquement dans l’extension " -"Smart Coupons." - -#: includes/class-wc-sc-settings.php:607 -msgid "Give plural name for the above singular name." -msgstr "Donnez le nom pluriel pour le nom singulier ci-dessus." - -#: includes/class-wc-sc-settings.php:608 -msgid "Plural name" -msgstr "Nom pluriel" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:614 -#, php-format -msgid "%s product CTA" -msgstr "%s Produit CTA" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:619 -#, php-format -msgid "" -"This is what will be shown instead of \"Add to Cart\" for products that sell " -"%s." -msgstr "" -"C’est ce qui sera affichĂ© Ă  la place de \"Ajouter au panier\" pour les " -"produits qui vendent %s." - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:626 -#, php-format -msgid "While purchasing %s" -msgstr "Lors de l’achat de %s" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:631 -#, php-format -msgid "" -"When you opt to allow people to buy %s of any amount, this label will be " -"used." -msgstr "" -"Lorsque vous choisissez d’autoriser les gens Ă  acheter des %s de n’importe " -"quel montant, ce libellĂ© sera utilisĂ©." - -#: includes/class-wc-sc-settings.php:637 -msgid "\"Coupons with Product\" description" -msgstr "Description des « Codes promo avec produit »" - -#: includes/class-wc-sc-settings.php:641 -msgid "" -"This is the heading above coupon details displayed on products that issue " -"coupons." -msgstr "" -"Il s’agit de l’entĂŞte au dessus des dĂ©tails du code promo qui sont affichĂ©s " -"sur les produits qui Ă©mettent des codes promo." - -#: includes/class-wc-sc-settings.php:642 -msgid "You will get following coupon(s) when you buy this item" -msgstr "" -"Vous obtiendrez le(s) code(s) promo suivant(s) si vous achetez cet article" - -#: includes/class-wc-sc-settings.php:647 -msgid "On Cart/Checkout pages" -msgstr "Sur les pages Panier/Commande" - -#: includes/class-wc-sc-settings.php:651 -msgid "" -"This is the title for the list of available coupons, shown on Cart and " -"Checkout pages." -msgstr "" -"Titre de la liste des codes promo disponibles figurant sur la page " -"« Panier » et la page « Commande »." - -#: includes/class-wc-sc-settings.php:657 -msgid "My Account page" -msgstr "Page « Mon compte »" - -#: includes/class-wc-sc-settings.php:661 -msgid "Title of available coupons list on My Account page." -msgstr "" -"Titre de la liste des codes promo disponibles sur la page « Mon compte »." - -#: includes/class-wc-sc-settings.php:672 -msgid "Coupon Receiver Details during Checkout" -msgstr "DĂ©tails du destinataire du code promo pendant la commande" - -#: includes/class-wc-sc-settings.php:674 -msgid "" -"Buyers can send purchased coupons to anyone – right while they're checking " -"out." -msgstr "" -"Les clients peuvent acheter et envoyer des codes promo Ă  la personne de leur " -"choix pendant qu’ils effectuent une commande." - -#: includes/class-wc-sc-settings.php:678 -#: includes/class-wc-smart-coupons.php:5099 -msgid "Allow sending of coupons to others" -msgstr "Autoriser l’envoi de codes promo Ă  d’autres personnes" - -#: includes/class-wc-sc-settings.php:679 -msgid "Allow the buyer to send coupons to someone else." -msgstr "Permettre au client d’envoyer des codes promo Ă  quelqu’un d’autre." - -#: includes/class-wc-sc-settings.php:687 -msgid "Title" -msgstr "Titre" - -#: includes/class-wc-sc-settings.php:691 -msgid "The title for coupon receiver details block." -msgstr "Le titre pour le bloc des dĂ©tails du destinataire du code promo." - -#: includes/class-wc-sc-settings.php:697 -msgid "Description" -msgstr "Description" - -#: includes/class-wc-sc-settings.php:701 -msgid "Additional text below the title." -msgstr "Texte supplĂ©mentaire sous le titre." - -#: includes/class-wc-sc-settings.php:706 -#: includes/class-wc-smart-coupons.php:5100 -msgid "Allow schedule sending of coupons?" -msgstr "Autoriser l’envoi programmĂ© de codes promo ?" - -#: includes/class-wc-sc-settings.php:707 -msgid "" -"Enable this to allow buyers to select date & time for delivering the coupon." -msgstr "" -"Activez ceci pour permettre aux acheteurs de sĂ©lectionner la date et l’heure " -"pour l’envoi des codes promo." - -#: includes/class-wc-sc-settings.php:707 -msgid "" -"The coupons will be sent to the recipients via email on the selected date & " -"time" -msgstr "" -"Les codes promo seront envoyĂ©s aux destinataires par e-mail Ă  la date et " -"l’heure sĂ©lectionnĂ©es" - -#: includes/class-wc-sc-settings.php:716 -#: includes/class-wc-smart-coupons.php:5101 -msgid "Combine emails" -msgstr "Combiner les e-mails" - -#: includes/class-wc-sc-settings.php:717 -msgid "" -"Send only one email instead of multiple emails when multiple coupons are " -"generated for same recipient" -msgstr "" -"Envoyer un seul e-mail au lieu de plusieurs lorsque plusieurs codes promo " -"sont gĂ©nĂ©rĂ©s pour le mĂŞme destinataire" - -#: includes/class-wc-sc-settings.php:731 -msgid "Apply before tax" -msgstr "Appliquer avant les taxes" - -#: includes/class-wc-sc-settings.php:732 -#: includes/class-wc-smart-coupons.php:5091 -msgid "Deduct credit/gift before doing tax calculations" -msgstr "DĂ©duisez la promotion avant de calculer les taxes" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:746 -#, php-format -msgid "%s include tax?" -msgstr "%s inclure les taxes ?" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:748 -#, php-format -msgid "%s discount is inclusive of tax" -msgstr "%s la remise inclus les taxes" - -#. translators: 1: plugin name 2: page based text 3: Label for store credit 4: Hide notice text -#: includes/class-wc-sc-settings.php:892 includes/class-wc-sc-settings.php:895 -#, php-format -msgid "%1$s: %2$s to avoid issues related to missing data for %3$s. %4$s" -msgstr "" -"%1$s : %2$s pour Ă©viter les problèmes liĂ©s aux donnĂ©es manquantes pour %3$s. " -"%4$s" - -#: includes/class-wc-sc-settings.php:892 -msgid "Uncheck" -msgstr "DĂ©cochez" - -#: includes/class-wc-sc-settings.php:892 -msgid "Delete Gift / Credit, when credit is used up" -msgstr "" -"Supprimer la carte cadeau ou le bon d’achat lorsque le crĂ©dit est Ă©puisĂ©" - -#: includes/class-wc-sc-settings.php:892 includes/class-wc-sc-settings.php:895 -msgid "Setting" -msgstr "Paramètre" - -#: includes/class-wc-sc-settings.php:892 includes/class-wc-sc-settings.php:895 -msgid "Hide this notice" -msgstr "Cacher cet avertissement" - -#: includes/class-wc-sc-settings.php:895 -msgid "Important setting" -msgstr "RĂ©glage important" - -#: includes/class-wc-sc-settings.php:1041 -msgid "Hurry. Going fast! On the entire range of products." -msgstr "" -"DĂ©pĂŞchez-vous. Profitez de cette remise sur toute la gamme de produits." - -#: includes/class-wc-sc-shortcode.php:546 templates/combined-email.php:192 -#: templates/email.php:178 -msgid "Click to visit store. This coupon will be applied automatically." -msgstr "" -"Cliquez ici pour visiter la boutique. Ce code promo sera automatiquement " -"appliquĂ©." - -#: includes/class-wc-sc-shortcode.php:716 -#: includes/class-wc-sc-shortcode.php:757 -#: includes/class-wc-sc-shortcode.php:794 -msgid "No search term specified." -msgstr "Aucun terme de recherche spĂ©cifiĂ©." - -#: includes/class-wc-sc-shortcode.php:720 -msgid "Enter more than one character to search." -msgstr "Saisissez plus d’un caractère pour la recherche." - -#: includes/class-wc-sc-shortcode.php:736 -msgid "Click to select coupon code." -msgstr "Cliquez pour sĂ©lectionner le code promo." - -#: includes/class-wc-sc-shortcode.php:738 -msgid "No coupon code found." -msgstr "Aucun code promo trouvĂ©." - -#: includes/class-wc-sc-shortcode.php:790 -msgid "Coupon code" -msgstr "Code promo" - -#: includes/class-wc-sc-shortcode.php:790 -msgid "Search coupon..." -msgstr "Rechercher un code promo…" - -#: includes/class-wc-sc-shortcode.php:852 -msgid "Insert Shortcode" -msgstr "InsĂ©rer un Shortcode" - -#: includes/class-wc-sc-shortcode.php:855 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:134 -msgid "Cancel" -msgstr "Annuler" - -#. translators: %s: $coupon_code coupon code -#: includes/class-wc-sc-url-coupon.php:249 -#, php-format -msgid "" -"Coupon code \"%s\" applied successfully. Please add some products to the " -"cart to see the discount." -msgstr "" -"Code promo %s appliquĂ© avec succès. Ajoutez des produits dans le panier pour " -"voir la rĂ©duction." - -#. translators: %s: $coupon_code coupon code -#: includes/class-wc-sc-url-coupon.php:253 -#, php-format -msgid "" -"Coupon code \"%s\" already applied! Please add some products to the cart to " -"see the discount." -msgstr "" -"Code promo %s dĂ©jĂ  appliquĂ© avec succès. Ajoutez des produits dans le panier " -"pour voir la rĂ©duction." - -#: includes/class-wc-smart-coupons.php:67 -#: includes/class-wc-smart-coupons.php:76 -msgid "Cheatin’ huh?" -msgstr "Alors ’ on triche ?" - -#: includes/class-wc-smart-coupons.php:870 -msgid "" -"This coupon has pending emails to be sent. Deleting it will delete those " -"emails also. Are you sure to delete this coupon?" -msgstr "" -"Ce code promo a des e-mails en attente Ă  envoyer. Le supprimer supprimera " -"Ă©galement ces e-mails. ĂŠtes-vous sĂ»r de vouloir supprimer ce code promo ?" - -#: includes/class-wc-smart-coupons.php:879 -msgid "An error has occurred. Please try again later." -msgstr "Une erreur est apparue, merci de rĂ©essayer plus tard." - -#. translators: Formatted minimum amount -#: includes/class-wc-smart-coupons.php:1118 -#, php-format -msgid "Spend at least %s" -msgstr "DĂ©pensez au moins %s" - -#. translators: Formatted maximum amount -#: includes/class-wc-smart-coupons.php:1122 -#, php-format -msgid "Spend up to %s" -msgstr "DĂ©pensez jusqu’à %s" - -#. translators: Formatted maximum amount -#: includes/class-wc-smart-coupons.php:1126 -msgid "Not valid for sale items" -msgstr "Non valable pour les articles en vente" - -#. translators: Product names -#: includes/class-wc-smart-coupons.php:1132 -#, php-format -msgid "Valid for %s" -msgstr "Valable pour %s" - -#. translators: Excluded product names -#: includes/class-wc-smart-coupons.php:1138 -#, php-format -msgid "Not valid for %s" -msgstr "Non valable pour %s" - -#. translators: 1: The category names -#: includes/class-wc-smart-coupons.php:1145 -#, php-format -msgid "Valid for category %s" -msgid_plural "Valid for categories %s" -msgstr[0] "Valide pour la catĂ©gorie %s" -msgstr[1] "Valide pour les catĂ©gories %s" - -#. translators: 1: The category names excluded -#: includes/class-wc-smart-coupons.php:1152 -#, php-format -msgid "Not valid for category %s" -msgid_plural "Not valid for categories %s" -msgstr[0] "Non valable pour la catĂ©gorie %s" -msgstr[1] "Non valable pour les catĂ©gories %s" - -#. translators: 1: The expiry date -#: includes/class-wc-smart-coupons.php:1162 -#, php-format -msgid "Expiry: %s" -msgstr "Expiration : %s" - -#: includes/class-wc-smart-coupons.php:1172 -msgid "Valid on entire range of products. Buy anything in the store." -msgstr "Valable sur toute la gamme de produits. Achetez ce que vous voulez." - -#: includes/class-wc-smart-coupons.php:1488 -msgid "Great News!" -msgstr "Bonnes nouvelles !" - -#: includes/class-wc-smart-coupons.php:1489 -msgid "Super Savings!" -msgstr "De super Ă©conomies !" - -#: includes/class-wc-smart-coupons.php:1490 -msgid "Ending Soon!" -msgstr "BientĂ´t la fin !" - -#: includes/class-wc-smart-coupons.php:1491 -msgid "Limited Time Offer!" -msgstr "Offre Ă  durĂ©e limitĂ©e !" - -#: includes/class-wc-smart-coupons.php:1492 -msgid "This Week Only!" -msgstr "Cette semaine seulement !" - -#: includes/class-wc-smart-coupons.php:1493 -msgid "Attention!" -msgstr "Attention !" - -#: includes/class-wc-smart-coupons.php:1494 -msgid "You don’t want to miss this..." -msgstr "Vous ne voulez pas manquer ça…" - -#: includes/class-wc-smart-coupons.php:1495 -msgid "This will be over soon! Hurry." -msgstr "Ce sera bientĂ´t terminé ! DĂ©pĂŞchez-vous." - -#: includes/class-wc-smart-coupons.php:1496 -msgid "Act before the offer expires." -msgstr "Profitez-en avant que l’offre n’expire." - -#: includes/class-wc-smart-coupons.php:1497 -msgid "Don't Miss Out." -msgstr "Ne manquez pas ça." - -#. translators: 1. The discount text -#: includes/class-wc-smart-coupons.php:1502 -#, php-format -msgid "%s discount on anything you want." -msgstr "%s rabais sur tout ce que vous voulez." - -#. translators: 1. The discount text -#: includes/class-wc-smart-coupons.php:1504 -#, php-format -msgid "%s discount on entire store." -msgstr "%s rabais sur tout le magasin." - -#. translators: 1. The discount text -#: includes/class-wc-smart-coupons.php:1506 -#, php-format -msgid "Pick any item today for %s off." -msgstr "Choisissez n’importe quel Ă©lĂ©ment aujourd’hui pour le %s." - -#. translators: 1. The discount text -#: includes/class-wc-smart-coupons.php:1508 -#, php-format -msgid "Buy as much as you want. Flat %s off everything." -msgstr "Achetez autant que vous voulez. %s net sur tout." - -#. translators: 1. The discount text -#: includes/class-wc-smart-coupons.php:1510 -#, php-format -msgid "Flat %s discount on everything today." -msgstr "%s de Remise sur tout aujourd’hui." - -#: includes/class-wc-smart-coupons.php:1522 -msgid "Use code" -msgstr "Utiliser un code" - -#. translators: 1. The coupon code -#: includes/class-wc-smart-coupons.php:1539 -#, php-format -msgid "Use code: %s" -msgstr "Utilisez le code : %s" - -#: includes/class-wc-smart-coupons.php:2668 -msgid "WooCommerce Smart Coupons Cache" -msgstr "WooCommerce Smart Coupons cache" - -#: includes/class-wc-smart-coupons.php:2669 -msgid "Clear Smart Coupons Cache" -msgstr "Purger le cache des Smart Coupons" - -#: includes/class-wc-smart-coupons.php:2670 -msgid "This tool will clear the cache created by WooCommerce Smart Coupons." -msgstr "Cet outil effacera le cache créé par WooCommerce Smart coupons." - -#. translators: The coupon code -#: includes/class-wc-smart-coupons.php:2713 -#, php-format -msgid "Coupon %s is valid for a new user only, hence removed." -msgstr "" -"Le code promo %s n’est valable que pour les nouveaux utilisateurs, il est " -"donc retirĂ©." - -#. translators: The coupon code -#: includes/class-wc-smart-coupons.php:2772 -#, php-format -msgid "Coupon removed. There is no credit remaining in %s." -msgstr "Code promo retirĂ©. Il n’y a aucun crĂ©dit restant dans %s." - -#: includes/class-wc-smart-coupons.php:2810 -msgid "This coupon is valid for the first order only." -msgstr "Ce code promo est valable uniquement pour la première commande." - -#: includes/class-wc-smart-coupons.php:3492 -msgid "Filter by category" -msgstr "Filtrer par catĂ©gorie" - -#: includes/class-wc-smart-coupons.php:3512 -msgid "Please select at least one coupon to print." -msgstr "Veuillez sĂ©lectionner au moins un code promo Ă  imprimer." - -#: includes/class-wc-smart-coupons.php:3527 -msgid "Print selected coupons" -msgstr "Imprimer les codes promo sĂ©lectionnĂ©s" - -#: includes/class-wc-smart-coupons.php:3527 -msgid "Print" -msgstr "Imprimer" - -#: includes/class-wc-smart-coupons.php:3908 -msgid "Coupon Validity" -msgstr "ValiditĂ© du code promo" - -#: includes/class-wc-smart-coupons.php:3909 -msgid "Validity Suffix" -msgstr "Suffixe de validitĂ©" - -#: includes/class-wc-smart-coupons.php:3910 -msgid "Auto Generate Coupon" -msgstr "GĂ©nĂ©ration automatique de code promo" - -#: includes/class-wc-smart-coupons.php:3911 -msgid "Coupon Title Prefix" -msgstr "PrĂ©fixe du code promo" - -#: includes/class-wc-smart-coupons.php:3912 -msgid "Coupon Title Suffix" -msgstr "Suffixe du code promo" - -#: includes/class-wc-smart-coupons.php:3913 -msgid "Is Pick Price of Product" -msgstr "Choix du prix du produit" - -#: includes/class-wc-smart-coupons.php:3914 -msgid "Disable Email Restriction" -msgstr "DĂ©sactiver la restriction de l’e-mail" - -#: includes/class-wc-smart-coupons.php:3915 -msgid "Coupon Is Visible Storewide" -msgstr "Le code promo est visible dans toute la boutique" - -#: includes/class-wc-smart-coupons.php:4258 -msgid "Post Excerpt" -msgstr "Extrait d’article" - -#: includes/class-wc-smart-coupons.php:4259 -msgid "Post Status" -msgstr "Statut de l’article" - -#: includes/class-wc-smart-coupons.php:4260 -msgid "Post Parent" -msgstr "Article Parent" - -#: includes/class-wc-smart-coupons.php:4261 -msgid "Menu Order" -msgstr "Ordre du menu" - -#: includes/class-wc-smart-coupons.php:4262 -msgid "Post Date" -msgstr "Date de l’article" - -#: includes/class-wc-smart-coupons.php:4268 -msgid "Discount Type" -msgstr "Type de remise" - -#: includes/class-wc-smart-coupons.php:4270 -msgid "Free shipping" -msgstr "Livraison gratuite" - -#: includes/class-wc-smart-coupons.php:4271 -msgid "Expiry date" -msgstr "Date d’expiration" - -#: includes/class-wc-smart-coupons.php:4272 -msgid "Minimum Spend" -msgstr "DĂ©penses minimum" - -#: includes/class-wc-smart-coupons.php:4273 -msgid "Maximum Spend" -msgstr "DĂ©penses maximum" - -#: includes/class-wc-smart-coupons.php:4274 -msgid "Individual USe" -msgstr "Usage individuel" - -#: includes/class-wc-smart-coupons.php:4275 -msgid "Exclude Sale Items" -msgstr "Exclure des produits" - -#: includes/class-wc-smart-coupons.php:4276 -msgid "Product IDs" -msgstr "ID Produits" - -#: includes/class-wc-smart-coupons.php:4277 -msgid "Exclude product IDs" -msgstr "Exclure les ID produit" - -#: includes/class-wc-smart-coupons.php:4278 -msgid "Product categories" -msgstr "CatĂ©gories de produits" - -#: includes/class-wc-smart-coupons.php:4279 -msgid "Exclude Product categories" -msgstr "Exclure catĂ©gorie" - -#: includes/class-wc-smart-coupons.php:4280 -msgid "Customer Email" -msgstr "E-mail du client" - -#: includes/class-wc-smart-coupons.php:4281 -msgid "Usage Limit" -msgstr "Limite d’utilisation" - -#: includes/class-wc-smart-coupons.php:4282 -msgid "Usage Limit Per User" -msgstr "Limite d’utilisation par utilisateur" - -#: includes/class-wc-smart-coupons.php:4283 -msgid "Limit Usage to X Items" -msgstr "Limiter l’utilisation Ă  X articles" - -#: includes/class-wc-smart-coupons.php:4284 -msgid "Usage Count" -msgstr "Nombre d’utillisation" - -#: includes/class-wc-smart-coupons.php:4285 -msgid "Used By" -msgstr "UtilisĂ© par" - -#: includes/class-wc-smart-coupons.php:4291 -msgid "Coupon Category" -msgstr "CatĂ©gorie de codes promo" - -#: includes/class-wc-smart-coupons.php:4402 -msgctxt "enhanced select" -msgid "Loading failed" -msgstr "Échec du chargement" - -#: includes/class-wc-smart-coupons.php:4540 -msgid "Style 1" -msgstr "Style 1" - -#: includes/class-wc-smart-coupons.php:4541 -msgid "Style 2" -msgstr "Style 2" - -#: includes/class-wc-smart-coupons.php:4542 -msgid "Style 3" -msgstr "Style 3" - -#: includes/class-wc-smart-coupons.php:4543 -msgid "Style 4" -msgstr "Style 4" - -#: includes/class-wc-smart-coupons.php:4544 -msgid "Style 5" -msgstr "Style 5" - -#: includes/class-wc-smart-coupons.php:4545 -msgid "Style 6" -msgstr "Style 6" - -#: includes/class-wc-smart-coupons.php:4546 -msgid "Custom Style" -msgstr "Style personnalisĂ©" - -#. translators: File path -#: includes/class-wc-smart-coupons.php:4577 -#: includes/class-wc-smart-coupons.php:4585 -#, php-format -msgid "File not found %s" -msgstr "Fichier non trouvĂ© %s" - -#: includes/class-wc-smart-coupons.php:4669 -msgid "is active but it will only work with WooCommerce 3.0.0+." -msgstr "est actif mais ne fonctionnera qu’avec WooCommerce 3.0.0+." - -#: includes/class-wc-smart-coupons.php:4669 -msgid "Please update WooCommerce to the latest version" -msgstr "Veuillez mettre Ă  jour WooCommerce vers la dernière version" - -#: includes/class-wc-smart-coupons.php:5090 -msgid "Include tax in the amount of the generated gift card" -msgstr "Inclure la taxe dans le montant gĂ©nĂ©rĂ© de la carte cadeau" - -#: includes/class-wc-smart-coupons.php:5092 -msgid "Gift Card discount is inclusive of tax" -msgstr "Le montant de la carte cadeau inclut les taxes" - -#: includes/class-wc-smart-coupons.php:5096 -msgid "Sell gift cards at less price?" -msgstr "Vendre des cartes cadeaux Ă  moindre prix ?" - -#: includes/class-wc-smart-coupons.php:5097 -msgid "" -"Use gift card applied in first subscription order for subsequent renewals " -"until credit reaches zero" -msgstr "" -"Utilisez la carte-cadeau appliquĂ©e lors de la première commande d’abonnement " -"pour les renouvellements ultĂ©rieurs jusqu’à ce que le crĂ©dit atteigne zĂ©ro" - -#: includes/class-wc-smart-coupons.php:5098 -#: includes/compat/class-wcs-sc-compatibility.php:877 -msgid "" -"Renewal orders should not generate coupons even when they include a product " -"that issues coupons" -msgstr "" -"Les commandes de renouvellement ne doivent pas gĂ©nĂ©rer de code promo mĂŞme " -"lorsqu’ils comprennent un produit qui Ă©met des codes promo" - -#: includes/class-wc-smart-coupons.php:5102 -msgid "Auto generated coupon email" -msgstr "E-mail de code promo gĂ©nĂ©rĂ© automatiquement" - -#: includes/class-wc-smart-coupons.php:5103 -msgid "Combined auto generated coupons email" -msgstr "E-mail regroupant plusieurs codes promo gĂ©nĂ©rĂ©s automatiquement" - -#: includes/class-wc-smart-coupons.php:5104 -msgid "Acknowledgement email" -msgstr "E-mail d’accusĂ© de rĂ©ception" - -#: includes/class-wc-smart-coupons.php:5105 -msgid "Enable taxes" -msgstr "Activer les taxes" - -#: includes/class-wc-smart-coupons.php:5106 -msgid "Prices entered with tax" -msgstr "Prix saisis en TTC" - -#: includes/class-wc-smart-coupons.php:5107 -msgid "Rounding" -msgstr "Arrondir" - -#: includes/class-wc-smart-coupons.php:5108 -msgid "Display prices in the shop" -msgstr "Afficher les prix dans la boutique" - -#: includes/class-wc-smart-coupons.php:5109 -msgid "Display prices during cart and checkout" -msgstr "Afficher les prix sur le panier et la commande" - -#: includes/class-wc-smart-coupons.php:5110 -msgid "Display tax totals" -msgstr "Afficher le total des taxes" - -#: includes/class-wc-smart-coupons.php:5111 -msgid "Enable the use of coupon codes" -msgstr "Activer l’utilisation des codes promo" - -#: includes/class-wc-smart-coupons.php:5112 -msgid "Calculate coupon discounts sequentially" -msgstr "Calculer les remises de coupon de manière sĂ©quentielle" - -#: includes/class-wc-smart-coupons.php:5113 -msgid "Account endpoints > Coupons" -msgstr "Points de terminaison > Codes promo" - -#: includes/class-wc-smart-coupons.php:5120 -msgid "Smart Coupons related settings" -msgstr "RĂ©glages Smart Coupons" - -#: includes/class-wc-smart-coupons.php:5120 -msgid "" -"This section shows settings that affects Smart Coupons' functionalities." -msgstr "" -"Cette section prĂ©sente les paramètres relatifs aux fonctionnalitĂ©s de Smart " -"Coupons." - -#. translators: %s: singular name for store credit -#: includes/compat/class-wcs-sc-compatibility.php:810 -#, php-format -msgid "Order paid by %s" -msgstr "Commande payĂ©e par %s" - -#: includes/compat/class-wcs-sc-compatibility.php:810 -msgid "Order paid by store credit." -msgstr "Commande payĂ©e avec le code promo." - -#: includes/compat/class-wcs-sc-compatibility.php:867 -msgid "Recurring subscriptions" -msgstr "Abonnements rĂ©currents" - -#. translators: %s: Label for store credit -#: includes/compat/class-wcs-sc-compatibility.php:869 -#, php-format -msgid "" -"Use %s applied in first subscription order for subsequent renewals until " -"credit reaches zero" -msgstr "" -"Utiliser %s appliquĂ© dans le premier ordre de souscription pour les " -"renouvellements ultĂ©rieurs jusqu’à ce que le crĂ©dit atteigne zĂ©ro" - -#: includes/compat/class-wcs-sc-compatibility.php:988 -msgid "Active for x payments" -msgstr "Actif pour x paiements" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:41 -msgid "Smart Coupons - Acknowledgement email" -msgstr "Smart Coupons - E-mail accusĂ© de rĂ©ception" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:42 -msgid "Send an acknowledgement email to the purchaser. One email per customer." -msgstr "" -"Envoyer un e-mail d’accusĂ© de rĂ©ception Ă  l’acheter. Un e-mail par client." - -#: includes/emails/class-wc-sc-acknowledgement-email.php:68 -msgid "{site_title}: {coupon_type} sent successfully" -msgstr "{site_title}: \"{coupon_type}\" envoyĂ© avec succès" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:77 -msgid "{coupon_type} sent successfully" -msgstr "\"{coupon_type}\" envoyĂ© avec succès" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:86 -msgid "{site_title}: {coupon_type} has been successfully scheduled" -msgstr "{site_title}: {coupon_type} planifiĂ© avec succès" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:95 -msgid "{coupon_type} has been successfully scheduled" -msgstr "{coupon_type} planifiĂ© avec succès" - -#. translators: %s: list of placeholders -#: includes/emails/class-wc-sc-acknowledgement-email.php:104 -#, php-format -msgid "" -"This will be used when the setting \"WooCommerce > Settings > Smart Coupons " -"> Allow schedule sending of coupons?\" is enabled. Available placeholders: " -"%s." -msgstr "" -"Cela sera utilisĂ© lorsque le paramètre « WooCommerce > Paramètres > Smart " -"Coupons > Autoriser l'envoi programmĂ© de codes promo ?\" est cochĂ©. Espaces " -"rĂ©servĂ©s disponibles : %s." - -#: includes/emails/class-wc-sc-acknowledgement-email.php:108 -msgid "Scheduled email subject" -msgstr "Sujet de l’e-mail planifiĂ©" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:116 -msgid "Scheduled email heading" -msgstr "EntĂŞte de l’e-mail planifiĂ©" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:334 -#: templates/acknowledgement-email.php:61 -#: templates/plain/acknowledgement-email.php:51 -msgid "Gift card" -msgstr "Carte cadeau" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:335 -#: templates/acknowledgement-email.php:62 -#: templates/plain/acknowledgement-email.php:52 -msgid "Gift cards" -msgstr "Cartes cadeau" - -#: includes/emails/class-wc-sc-combined-email-coupon.php:34 -msgid "Smart Coupons - Combined auto generated coupons email" -msgstr "" -"Smart Coupons - E-mail regroupant plusieurs codes promo gĂ©nĂ©rĂ©s " -"automatiquement" - -#: includes/emails/class-wc-sc-combined-email-coupon.php:35 -msgid "" -"Send only one email instead of multiple emails when multiple coupons are " -"generated per recipient." -msgstr "" -"Envoyer un seul e-mail au lieu de plusieurs lorsque plusieurs codes promo " -"sont gĂ©nĂ©rĂ©s pour le mĂŞme destinataire." - -#: includes/emails/class-wc-sc-combined-email-coupon.php:61 -msgid "" -"{site_title}: Congratulations! You've received coupons from {sender_name}" -msgstr "" -"{site_title} : FĂ©licitations ! Vous avez reçu des codes promo de la part de " -"{from_sender_name}" - -#: includes/emails/class-wc-sc-combined-email-coupon.php:70 -msgid "You have received coupons." -msgstr "Vous avez reçu des codes promo." - -#: includes/emails/class-wc-sc-combined-email-coupon.php:144 -#: includes/emails/class-wc-sc-combined-email-coupon.php:220 -#: includes/emails/class-wc-sc-email-coupon.php:202 -#: includes/emails/class-wc-sc-email-coupon.php:280 -msgid "from" -msgstr "de" - -#: includes/emails/class-wc-sc-email-coupon.php:34 -msgid "Smart Coupons - Auto generated coupon email" -msgstr "Smart Coupons - E-mail de code promo gĂ©nĂ©rĂ© automatiquement" - -#: includes/emails/class-wc-sc-email-coupon.php:35 -msgid "Email auto generated coupon to recipients. One email per coupon." -msgstr "" -"Envoyez le code promo gĂ©nĂ©rĂ© automatiquement par e-mail aux destinataires. " -"Un e-mail par coupon." - -#: includes/emails/class-wc-sc-email-coupon.php:64 -msgid "" -"{site_title}: Congratulations! You've received a {coupon_type} from " -"{sender_name}" -msgstr "" -"{site_title} : FĂ©licitations ! Vous avez reçu un(e) {coupon_type} de la part " -"de {sender_name}" - -#: includes/emails/class-wc-sc-email-coupon.php:73 -msgid "You have received a {coupon_type} {coupon_value}" -msgstr "Vous avez reçu un {coupon_type} de {coupon_value}" - -#: includes/emails/class-wc-sc-email-coupon.php:346 -#: includes/emails/class-wc-sc-email-coupon.php:466 -msgid "Gift Card" -msgstr "Carte cadeau" - -#. translators: %s coupon amount -#: includes/emails/class-wc-sc-email-coupon.php:385 -#, php-format -msgid "worth %2$s " -msgstr "d’une valeur de %2$s " - -#. translators: %s: coupon amount -#: includes/emails/class-wc-sc-email-coupon.php:390 -#, php-format -msgid "worth %s (for entire purchase) " -msgstr "d’une valeur de %s (pour l’ensemble des achats) " - -#: includes/emails/class-wc-sc-email-coupon.php:395 -#: includes/emails/class-wc-sc-email-coupon.php:406 -#: includes/emails/class-wc-sc-email-coupon.php:417 -msgid "for some products" -msgstr "pour certains produits" - -#: includes/emails/class-wc-sc-email-coupon.php:397 -#: includes/emails/class-wc-sc-email-coupon.php:408 -msgid "for all products" -msgstr "pour tous les produits" - -#. translators: 1: coupon amount 2: discount for text -#: includes/emails/class-wc-sc-email-coupon.php:401 -#, php-format -msgid "worth %1$s (%2$s) " -msgstr "d’une valeur de %1$s (%2$s) " - -#. translators: 1: coupon amount 2: discount for text -#: includes/emails/class-wc-sc-email-coupon.php:412 -#, php-format -msgid "worth %1$s%% (%2$s) " -msgstr "d’une valeur de %1$s%% (%2$s) " - -#: includes/emails/class-wc-sc-email-coupon.php:419 -msgid "for entire purchase" -msgstr "pour la totalitĂ© de la commande" - -#. translators: 1: coupon amount 2: max discount text 3: discount for text -#: includes/emails/class-wc-sc-email-coupon.php:430 -#, php-format -msgid "worth %1$s%% %2$s (%3$s) " -msgstr "d’une valeur de %1$s%% %2$s (%3$s) " - -#. translators: 1: email heading 2: suffix -#: includes/emails/class-wc-sc-email-coupon.php:447 -#, php-format -msgid "%1$s Free Shipping%2$s" -msgstr "%1$s Livraison gratuite %2$s" - -#: includes/emails/class-wc-sc-email-coupon.php:447 -msgid "&" -msgstr "&" - -#: includes/emails/class-wc-sc-email-coupon.php:447 -msgid "You have received a" -msgstr "Vous avez reçu un" - -#: includes/emails/class-wc-sc-email-coupon.php:447 -msgid " coupon" -msgstr " code promo" - -#. translators: %s: list of placeholders -#: includes/emails/class-wc-sc-email.php:97 -#, php-format -msgid "Available placeholders: %s" -msgstr "Espaces rĂ©servĂ©s disponibles : %s" - -#: includes/emails/class-wc-sc-email.php:101 -msgid "Enable/Disable" -msgstr "Activer/DĂ©sactiver" - -#: includes/emails/class-wc-sc-email.php:103 -msgid "Enable this email notification" -msgstr "Activer cette notification par e-mail" - -#: includes/emails/class-wc-sc-email.php:107 -msgid "Email type" -msgstr "Type d’e-mail" - -#: includes/emails/class-wc-sc-email.php:109 -msgid "Choose which format of email to send." -msgstr "Choisissez quel format d’e-mail envoyer." - -#: includes/emails/class-wc-sc-email.php:116 -msgid "Subject" -msgstr "Sujet" - -#: includes/emails/class-wc-sc-email.php:124 -msgid "Email heading" -msgstr "EntĂŞte e-mail" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ActionFactory.php:162 -msgid "Invalid action - must be a recurring action." -msgstr "L’action invalide - doit ĂŞtre une action rĂ©currente." - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:61 -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:76 -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:77 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:90 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:20 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:31 -msgid "Scheduled Actions" -msgstr "Actions planifiĂ©es" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:128 -msgid "About" -msgstr "Ă€ propos" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:130 -#, php-format -msgid "About Action Scheduler %s" -msgstr "A propos d’Action Scheduler %s" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:132 -msgid "" -"Action Scheduler is a scalable, traceable job queue for background " -"processing large sets of actions. Action Scheduler works by triggering an " -"action hook to run at some time in the future. Scheduled actions can also be " -"scheduled to run on a recurring schedule." -msgstr "" -"Action Scheduler est une file d’attente d’emploi Ă©volutive et traçable pour " -"le traitement de fond de grands ensembles d’actions. Action Scheduler " -"fonctionne en dĂ©clenchant un crochet d’action pour fonctionner Ă  un moment " -"donnĂ© dans l’avenir. Les actions planifiĂ©es peuvent Ă©galement ĂŞtre " -"programmĂ©es pour fonctionner selon un calendrier rĂ©current." - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:140 -msgid "Columns" -msgstr "Colonnes" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:142 -msgid "Scheduled Action Columns" -msgstr "Colonnes des actions planifiĂ©es" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:144 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:97 -msgid "Hook" -msgstr "Crochet" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:144 -msgid "Name of the action hook that will be triggered." -msgstr "Nom du hook d’action qui sera dĂ©clenchĂ©." - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:145 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:98 -msgid "Status" -msgstr "Statut" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:145 -msgid "Action statuses are Pending, Complete, Canceled, Failed" -msgstr "Les statuts d’action sont en attente, complets, annulĂ©s, Ă©chouĂ©s" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:146 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:99 -msgid "Arguments" -msgstr "Arguments" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:146 -msgid "Optional data array passed to the action hook." -msgstr "Tableau de donnĂ©es facultatif passĂ© au crochet d’action." - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:147 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:100 -msgid "Group" -msgstr "Groupe" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:147 -msgid "Optional action group." -msgstr "Groupe d’action facultatif." - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:148 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:101 -msgid "Recurrence" -msgstr "RĂ©currence" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:148 -msgid "The action's schedule frequency." -msgstr "FrĂ©quence d’horaire de l’action." - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:149 -msgid "Scheduled" -msgstr "PlanifiĂ©" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:149 -msgid "The date/time the action is/was scheduled to run." -msgstr "La date/heure de l’action est/Ă©tait prĂ©vue pour fonctionner." - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:150 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:103 -msgid "Log" -msgstr "Journal" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:150 -msgid "Activity log for the action." -msgstr "Journal d’activitĂ© pour l’action." - -#. translators: %d: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_DataController.php:134 -#, php-format -msgid "Stopped the insanity for %d second" -msgid_plural "Stopped the insanity for %d seconds" -msgstr[0] "ArrĂŞtĂ© la folie pour %d seconde" -msgstr[1] "Faites une pause pendant %d secondes" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_DataController.php:138 -msgid "Attempting to reduce used memory..." -msgstr "Tentative de rĂ©duire la mĂ©moire utilisĂ©e…" - -#. translators: 1: action ID 2: schedule -#: includes/libraries/action-scheduler/classes/ActionScheduler_InvalidActionException.php:22 -#, php-format -msgid "Action [%1$s] has an invalid schedule: %2$s" -msgstr "Action [%1$s] a un horaire invalide: %2$s" - -#. translators: 1: action ID 2: arguments -#: includes/libraries/action-scheduler/classes/ActionScheduler_InvalidActionException.php:41 -#, php-format -msgid "" -"Action [%1$s] has invalid arguments. It cannot be JSON decoded to an array. " -"$args = %2$s" -msgstr "" -"L’action [%1$s] a des arguments non valables. Ca ne peut pas ĂŞtre du JSON " -"dĂ©codĂ© dans un tableau. $args = %2$s" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:93 -msgid "Delete" -msgstr "Supprimer" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:102 -msgid "Scheduled Date" -msgstr "Date planifiĂ©e" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:123 -msgid "Claim ID" -msgstr "ID de revendication" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:130 -msgid "Run" -msgstr "ExĂ©cuter" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:131 -msgid "Process the action now as if it were run as part of a queue" -msgstr "" -"Traiter l’action maintenant comme s’elle Ă©tait exĂ©cutĂ©e dans le cadre d’une " -"file d’attente" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:135 -msgid "Cancel the action now to avoid it being run in future" -msgstr "" -"Annuler l’action maintenant pour Ă©viter qu’elle soit exĂ©cutĂ©e Ă  l’avenir" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:145 -#, php-format -msgid "%s year" -msgid_plural "%s years" -msgstr[0] "%s annĂ©e" -msgstr[1] "%s annĂ©es" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:150 -#, php-format -msgid "%s month" -msgid_plural "%s months" -msgstr[0] "%s mois" -msgstr[1] "%s mois" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:155 -#, php-format -msgid "%s week" -msgid_plural "%s weeks" -msgstr[0] "%s semaine" -msgstr[1] "%s semaines" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:160 -#, php-format -msgid "%s day" -msgid_plural "%s days" -msgstr[0] "%s jour" -msgstr[1] "%s jours" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:165 -#, php-format -msgid "%s hour" -msgid_plural "%s hours" -msgstr[0] "%s heure" -msgstr[1] "%s heures" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:170 -#, php-format -msgid "%s minute" -msgid_plural "%s minutes" -msgstr[0] "%s minute" -msgstr[1] "%s minutes" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:175 -#, php-format -msgid "%s second" -msgid_plural "%s seconds" -msgstr[0] "%s seconde" -msgstr[1] "%s secondes" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:225 -msgid "Now!" -msgstr "Maintenant !" - -#. translators: %s: time interval -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:261 -#, php-format -msgid "Every %s" -msgstr "Chaque %s" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:267 -msgid "Non-repeating" -msgstr "Ne se rĂ©pète pas" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:365 -msgid "" -"It appears one or more database tables were missing. Attempting to re-create " -"the missing table(s)." -msgstr "" -"Il semble qu’il manquait une ou plusieurs tables dans la base de donnĂ©es. " -"Tentative de crĂ©ation de la ou des tables manquantes." - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:382 -#, php-format -msgid "" -"Maximum simultaneous queues already in progress (%s queue). No additional " -"queues will begin processing until the current queues are complete." -msgid_plural "" -"Maximum simultaneous queues already in progress (%s queues). No additional " -"queues will begin processing until the current queues are complete." -msgstr[0] "" -"Nombre maximum de files d’attente en simultanĂ© dĂ©jĂ  atteint (%s file " -"d’attente). Aucune file d’attente supplĂ©mentaire ne commencera Ă  ĂŞtre " -"traitĂ©e tant que les files d’attente actuelles ne seront pas terminĂ©es." -msgstr[1] "" -"Nombre maximum de files d’attente en simultanĂ© dĂ©jĂ  atteint (%s de files " -"d’attente). Aucune file d’attente supplĂ©mentaire ne dĂ©butera tant que celles " -"en cours ne seront pas terminĂ©es." - -#. translators: %s: process URL -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:398 -#, php-format -msgid "" -"A new queue has begun processing. View actions in-progress " -"»" -msgstr "" -"Une nouvelle file d’attente a commencĂ© Ă  traiter. Voir les " -"actions en cours »" - -#. translators: %d: seconds -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:401 -#, php-format -msgid "The next queue will begin processing in approximately %d seconds." -msgstr "" -"La prochaine file d’attente commencera le traitement dans %d secondes " -"environ." - -#. translators: %s: action HTML -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:422 -#, php-format -msgid "Successfully executed action: %s" -msgstr "Action exĂ©cutĂ©e avec succès: %s" - -#. translators: %s: action HTML -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:426 -#, php-format -msgid "Successfully canceled action: %s" -msgstr "Action annulĂ©e avec succès: %s" - -#. translators: %s: action HTML -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:430 -#, php-format -msgid "Successfully processed change for action: %s" -msgstr "Changement de traitement avec succès pour l’action: %s" - -#. translators: 1: action HTML 2: action ID 3: error message -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:436 -#, php-format -msgid "Could not process change for action: \"%1$s\" (ID: %2$d). Error: %3$s" -msgstr "" -"La modification n’a pas pu ĂŞtre effectuĂ©e pour l’action : \"%1$s\" (ID : " -"%2$d). Erreur : %3$s" - -#. translators: %s: date interval -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:482 -#, php-format -msgid " (%s ago)" -msgstr " (depuis %s)" - -#. translators: %s: date interval -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:485 -#, php-format -msgid " (%s)" -msgstr " (%s)" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:635 -msgid "Search hook, args and claim ID" -msgstr "Crochet de recherche, args et ID de revendication" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_QueueRunner.php:193 -msgid "Every minute" -msgstr "Chaque minute" - -#. translators: %s: date interval -#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php:104 -#, php-format -msgid "This data will be deleted in %s." -msgstr "Ces donnĂ©es seront supprimĂ©es dans %s." - -#. translators: 1: next cleanup message 2: github issue URL -#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php:109 -#, php-format -msgid "" -"Action Scheduler has migrated data to custom tables; however, orphaned log " -"entries exist in the WordPress Comments table. %1$s Learn " -"more »" -msgstr "" -"Le planificateur d’action a migrĂ© les donnĂ©es vers des tables " -"personnalisĂ©es ; cependant, les entrĂ©es de journaux orphelines existent dans " -"la table WordPress Comments. %1$s En savoir plus »" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:112 -msgid "Action Scheduler" -msgstr "Planificateur d’action" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:112 -msgid "This section shows details of Action Scheduler." -msgstr "Cette section montre les actions planifiĂ©es." - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:115 -msgid "Version:" -msgstr "Version :" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:119 -msgid "Data store:" -msgstr "Magasin de donnĂ©es :" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:123 -msgid "Action Status" -msgstr "Statut de l’action" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:125 -msgid "Count" -msgstr "Compte" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:126 -msgid "Oldest Scheduled Date" -msgstr "Date planifiĂ©e la plus ancienne" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:127 -msgid "Newest Scheduled Date" -msgstr "Date planifiĂ©e la plus rĂ©cente" - -#. translators: %s php class name -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:34 -#: includes/libraries/action-scheduler/classes/WP_CLI/ProgressBar.php:48 -#, php-format -msgid "The %s class can only be run within WP CLI." -msgstr "La classe %s ne peut ĂŞtre exĂ©cutĂ©e que dans WP CLI." - -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:60 -msgid "" -"There are too many concurrent batches, but the run is forced to continue." -msgstr "" -"Il y a trop de lots en simultanĂ©, mais le traitement est forcĂ© de continuer." - -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:62 -msgid "There are too many concurrent batches." -msgstr "Il y a trop de lots simultanĂ©s." - -#. translators: %d: amount of actions -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:94 -#, php-format -msgid "Running %d action" -msgid_plural "Running %d actions" -msgstr[0] "%d action en cours d’exĂ©cution" -msgstr[1] "%d actions en cours d’exĂ©cution" - -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:114 -msgid "The claim has been lost. Aborting current batch." -msgstr "La revendication a Ă©tĂ© perdue. Abandon du lot actuel." - -#. translators: %s refers to the action ID -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:139 -#, php-format -msgid "Started processing action %s" -msgstr "Traitement de l’action %s dĂ©butĂ©" - -#. translators: 1: action ID 2: hook name -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:156 -#, php-format -msgid "Completed processing action %1$s with hook: %2$s" -msgstr "Traitement de l’action terminĂ©e %1$s avec le hook : %2$s" - -#. translators: 1: action ID 2: exception message -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:171 -#, php-format -msgid "Error processing action %1$s: %2$s" -msgstr "Erreur de traitement de l’action %1$s :%2$s" - -#. translators: %d refers to how many scheduled taks were found to run -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php:101 -#, php-format -msgid "Found %d scheduled task" -msgid_plural "Found %d scheduled tasks" -msgstr[0] "%d tâche planifiĂ©e dĂ©tectĂ©e" -msgstr[1] "%d tâches planifiĂ©es dĂ©tectĂ©es" - -#. translators: %d refers to the total number of batches executed -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php:118 -#, php-format -msgid "%d batch executed." -msgid_plural "%d batches executed." -msgstr[0] "%d lot exĂ©cutĂ©." -msgstr[1] "%d lots exĂ©cutĂ©s." - -#. translators: %s refers to the exception error message -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php:137 -#, php-format -msgid "There was an error running the action scheduler: %s" -msgstr "Il y a eu une erreur en exĂ©cutant le planificateur d’actions : %s" - -#. translators: %d refers to the total number of taskes completed -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php:154 -#, php-format -msgid "%d scheduled task completed." -msgid_plural "%d scheduled tasks completed." -msgstr[0] "%d tâche planifiĂ©e terminĂ©e." -msgstr[1] "%d tâches planifiĂ©es terminĂ©es." - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler.php:196 -#, php-format -msgid "%s() was called before the Action Scheduler data store was initialized" -msgstr "%s() a Ă©tĂ© appelĂ©e avant que le planificateur d’action soit initialisĂ©" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php:524 -msgid "Filter" -msgstr "Filtre" - -#. translators: %s: search query -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php:651 -#, php-format -msgid "Search results for \"%s\"" -msgstr "RĂ©sultats de recherche pour « %s »" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php:756 -msgid "Search" -msgstr "Rechercher" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:73 -msgid "action created" -msgstr "action créée" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:77 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBLogger.php:143 -msgid "action canceled" -msgstr "action interrompue" - -#. translators: %s: context -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:83 -#, php-format -msgid "action started via %s" -msgstr "action commencĂ©e via %s" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:85 -msgid "action started" -msgstr "action commencĂ©e" - -#. translators: %s: context -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:93 -#, php-format -msgid "action complete via %s" -msgstr "action terminĂ©e via %s" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:95 -msgid "action complete" -msgstr "action terminĂ©e" - -#. translators: 1: context 2: exception message -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:103 -#, php-format -msgid "action failed via %1$s: %2$s" -msgstr "l’action a Ă©chouĂ© via %1$s: %2$s" - -#. translators: %s: exception message -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:106 -#, php-format -msgid "action failed: %s" -msgstr "l’action a Ă©choué : %s" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:113 -#, php-format -msgid "action timed out after %s seconds" -msgstr "l’action a expirĂ© après %s secondes" - -#. translators: 1: error message 2: filename 3: line -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:119 -#, php-format -msgid "unexpected shutdown: PHP Fatal error %1$s in %2$s on line %3$s" -msgstr "arrĂŞt inattendu : Erreur fatale PHP %1$s dans %2$s Ă  la ligne %3$s" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:124 -msgid "action reset" -msgstr "rĂ©initialiser l’action" - -#. translators: %s: context -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:130 -#, php-format -msgid "action ignored via %s" -msgstr "action ignorĂ©e via %s" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:132 -msgid "action ignored" -msgstr "action ignorĂ©e" - -#. translators: %s: exception message -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:147 -#, php-format -msgid "There was a failure fetching this action: %s" -msgstr "Échec de la rĂ©cupĂ©ration de cette action : %s" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:149 -msgid "There was a failure fetching this action" -msgstr "Il y a eu un Ă©chec lors de la rĂ©cupĂ©ration de l’action" - -#. translators: %s: exception message -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:157 -#, php-format -msgid "There was a failure scheduling the next instance of this action: %s" -msgstr "" -"Il y a eu un Ă©chec dans la planification de la prochaine instance de cette " -"action : %s" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php:302 -#, php-format -msgid "" -"ActionScheduler_Action::$args too long. To ensure the args column can be " -"indexed, action args should not be more than %d characters when encoded as " -"JSON." -msgstr "" -"ActionScheduler_Action::$args trop longtemps. Pour s’assurer que la colonne " -"d’args peut ĂŞtre indexĂ©e, les args d’action ne doivent pas ĂŞtre plus de %d " -"caractères lorsqu’ils sont encodĂ©s en JSON." - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php:378 -msgid "Complete" -msgstr "TerminĂ©" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php:379 -msgid "Pending" -msgstr "En attente" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php:380 -msgid "In-progress" -msgstr "En cours" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php:381 -msgid "Failed" -msgstr "Echec" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php:382 -msgid "Canceled" -msgstr "AnnulĂ©e" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:79 -msgid "Database error." -msgstr "Erreur de la base de donnĂ©es." - -#. translators: %s: error message -#. translators: %s: action error message -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:87 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:50 -#: includes/libraries/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php:45 -#, php-format -msgid "Error saving action: %s" -msgstr "Erreur lors de la sauvegarde de l’action : %s" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:247 -msgid "Invalid value for select or count parameter. Cannot query actions." -msgstr "" -"Valeur invalide pour la sĂ©lection ou le nombre de paramètres. Impossible de " -"gĂ©nĂ©rer des actions." - -#. translators: %s: action ID -#. translators: %s is the action ID -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:452 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:544 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:575 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:798 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:841 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:516 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:535 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:565 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:975 -#, php-format -msgid "Unidentified action %s" -msgstr "Action non identifiĂ©e %s" - -#. translators: %s: group name -#. translators: %s is the group name -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:664 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:718 -#, php-format -msgid "The group \"%s\" does not exist." -msgstr "Le groupe « %s » n’existe pas." - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:684 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:697 -msgid "Unable to claim actions. Database error." -msgstr "Impossible de revendiquer l’action. Erreur de base de donnĂ©es." - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:862 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:905 -msgid "Invalid action ID. No status found." -msgstr "ID d’action non valide. Aucun trouvĂ©." - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:864 -msgid "Unknown status found for action." -msgstr "Statut inconnu trouvĂ© pour l’action." - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:102 -msgid "Unable to save action." -msgstr "Impossible d’enregistrer l’action." - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:319 -msgid "Invalid schedule. Cannot save action." -msgstr "Planification non valide. Impossible d’enregistrer l’action." - -#. translators: %s: claim ID -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:825 -#, php-format -msgid "Unable to unlock claim %s. Database error." -msgstr "" -"Impossible de dĂ©verrouiller la revendication %s. Erreur de base de donnĂ©es." - -#. translators: %s: action ID -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:853 -#, php-format -msgid "Unable to unlock claim on action %s. Database error." -msgstr "" -"Impossible de dĂ©verrouiller la revendication sur l’action %s. Erreur de base " -"de donnĂ©es." - -#. translators: %s: action ID -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:879 -#, php-format -msgid "Unable to mark failure on action %s. Database error." -msgstr "" -"Impossible de marquer l’échec sur l’action %s. Erreur de base de donnĂ©es." - -#. translators: %s is the error message -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:1047 -#, php-format -msgid "" -"%s Support for strings longer than this will be removed in a future version." -msgstr "" -"%s La prise en charge des chaĂ®nes plus longues que celle-ci sera supprimĂ©e " -"dans une future version." - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php:37 -msgctxt "post" -msgid "Failed" -msgstr "Échec" - -#. translators: %s: count -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php:39 -#, php-format -msgid "Failed (%s)" -msgid_plural "Failed (%s)" -msgstr[0] "Échec (%s)" -msgstr[1] "Échec (%s)" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php:52 -msgctxt "post" -msgid "In-Progress" -msgstr "En cours" - -#. translators: %s: count -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php:54 -#, php-format -msgid "In-Progress (%s)" -msgid_plural "In-Progress (%s)" -msgstr[0] "En cours (%s)" -msgstr[1] "En cours (%s)" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:21 -msgid "Scheduled actions are hooks triggered on a cetain date and time." -msgstr "" -"Les actions programmĂ©es sont des hooks dĂ©clenchĂ©s Ă  une date et heure " -"dĂ©terminĂ©e." - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:32 -msgid "Scheduled Action" -msgstr "Action planifiĂ©e" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:33 -msgctxt "Admin menu name" -msgid "Scheduled Actions" -msgstr "Actions planifiĂ©es" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:34 -msgid "Add" -msgstr "Ajouter" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:35 -msgid "Add New Scheduled Action" -msgstr "Ajouter nouvelle action planifiĂ©e" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:36 -msgid "Edit" -msgstr "Modifier" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:37 -msgid "Edit Scheduled Action" -msgstr "Modifier l’action planifiĂ©e" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:38 -msgid "New Scheduled Action" -msgstr "Nouvelle action planifiĂ©e" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:39 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:40 -msgid "View Action" -msgstr "Voir l’action" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:41 -msgid "Search Scheduled Actions" -msgstr "Rechercher des actions planifiĂ©es" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:42 -msgid "No actions found" -msgstr "Aucune action trouvĂ©e" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:43 -msgid "No actions found in trash" -msgstr "Aucune action trouvĂ©e dans la corbeille" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_TaxonomyRegistrar.php:15 -msgid "Action Group" -msgstr "Groupe d’actions" - -#: includes/libraries/action-scheduler/classes/migration/ActionMigrator.php:96 -#, php-format -msgid "Unable to remove source migrated action %s" -msgstr "Impossible de supprimer l’action source migrĂ©e %s" - -#: includes/libraries/action-scheduler/classes/migration/Config.php:53 -msgid "Source store must be configured before running a migration" -msgstr "Le magasin source doit ĂŞtre configurĂ© avant d’exĂ©cuter une migration" - -#: includes/libraries/action-scheduler/classes/migration/Config.php:75 -msgid "Source logger must be configured before running a migration" -msgstr "" -"L’enregistreur de source doit ĂŞtre configurĂ© avant d’exĂ©cuter une migration" - -#: includes/libraries/action-scheduler/classes/migration/Config.php:97 -msgid "Destination store must be configured before running a migration" -msgstr "" -"Le magasin de destination doit ĂŞtre configurĂ© avant d’exĂ©cuter une migration" - -#: includes/libraries/action-scheduler/classes/migration/Config.php:119 -msgid "Destination logger must be configured before running a migration" -msgstr "" -"L’enregistreur de destination doit ĂŞtre configurĂ© avant d’exĂ©cuter une " -"migration" - -#: includes/libraries/action-scheduler/classes/migration/Controller.php:163 -msgid "" -"Action Scheduler migration in progress. The list of scheduled actions may be " -"incomplete." -msgstr "" -"Action Scheduler migration en cours. La liste des actions prĂ©vues peut ĂŞtre " -"incomplète." - -#. translators: %d: amount of actions -#: includes/libraries/action-scheduler/classes/migration/Runner.php:83 -#, php-format -msgid "Migrating %d action" -msgid_plural "Migrating %d actions" -msgstr[0] "%d action en cours de migration" -msgstr[1] "%d actions en cours de migration" - -#. translators: 1: source action ID 2: source store class 3: destination action ID 4: destination store class -#: includes/libraries/action-scheduler/classes/migration/Runner.php:108 -#, php-format -msgid "Migrated action with ID %1$d in %2$s to ID %3$d in %4$s" -msgstr "Action migrĂ©e avec ID %1$d en %2$s vers ID %3$d en %4$s" - -#. translators: 1. Receiver's count 2. Singular/Plural label for store credit(s) 3. Receiver name 4. Receiver details -#: templates/acknowledgement-email.php:34 -#: templates/plain/acknowledgement-email.php:24 -#, php-format -msgid "You have successfully sent %1$d %2$s to %3$s (%4$s)" -msgstr "Vous avez envoyĂ© avec succès %1$d %2$s Ă  %3$s (%4$s)" - -#. translators: 1. Receiver's count 2. Gift Card/s 3. Receiver name 4. Receiver details -#: templates/acknowledgement-email.php:37 -#: templates/plain/acknowledgement-email.php:27 -#, php-format -msgid "You have scheduled to sent %1$d %2$s to %3$s (%4$s)" -msgstr "Vous avez planifiĂ© d’envoyer %1$d %2$s Ă  %3$s (%4$s)" - -#: templates/combined-email.php:82 -msgid "To redeem your discount click on the following coupon(s):" -msgstr "" -"Pour profiter de votre remise, cliquez sur le(s) code(s) promo suivant(s) :" - -#: templates/combined-email.php:206 templates/email.php:190 -#: templates/plain/combined-email.php:129 templates/plain/email.php:122 -msgid "Visit store" -msgstr "Visiter la boutique" - -#: templates/combined-email.php:234 -msgid "You got these coupons " -msgstr "Vous avez reçu ce(s) code(s) promo " - -#. translators: %s: Coupon code -#: templates/email.php:85 -#, php-format -msgid "" -"To redeem your discount use coupon code %s during checkout or click on the " -"following coupon:" -msgstr "" -"Pour bĂ©nĂ©ficier de votre rĂ©duction, utilisez le code promo %s lors du " -"paiement ou cliquez sur le code promo suivant :" - -#. translators: %s: singular name for store credit -#: templates/email.php:215 templates/plain/combined-email.php:135 -#: templates/plain/email.php:128 -#, php-format -msgid "You got this %s" -msgstr "Vous avez obtenu ce %s" - -#: templates/email.php:215 templates/plain/combined-email.php:135 -#: templates/plain/email.php:128 -msgid "You got this gift card" -msgstr "Vous avez reçu cette carte cadeau" - -#: templates/plain/combined-email.php:22 -msgid "" -"To redeem your discount use below coupon codes during checkout or copy and " -"paste the below URLs and hit enter in your browser" -msgstr "" -"Pour utiliser votre rĂ©duction, utilisez les codes promo ci-dessous lors de " -"votre commande ou copiez-collez les URL ci-dessous et appuyez sur EntrĂ©e " -"dans votre navigateur" - -#: templates/plain/combined-email.php:73 templates/plain/email.php:26 -msgid "Message:" -msgstr "Message :" - -#: templates/plain/combined-email.php:81 templates/plain/email.php:76 -msgid "Discount:" -msgstr "Remise :" - -#: templates/plain/combined-email.php:86 templates/plain/email.php:81 -msgid " & " -msgstr " & " - -#: templates/plain/combined-email.php:95 templates/plain/email.php:90 -msgid "Coupon Code:" -msgstr "Code promo :" - -#: templates/plain/combined-email.php:101 templates/plain/email.php:96 -msgid "Description:" -msgstr "Description :" - -#: templates/plain/combined-email.php:106 templates/plain/email.php:101 -msgid "Expires on:" -msgstr "Expire le :" - -#. translators: %s: Coupon code -#: templates/plain/email.php:23 -#, php-format -msgid "" -"To redeem your discount use coupon code %s during checkout or copy and paste " -"the below URL and hit enter in your browser:" -msgstr "" -"Pour bĂ©nĂ©ficier de votre remise, utilisez le code promo %s lors du paiement, " -"ou copier/coller l’URL ci-dessous et appuyez sur « Entrer » dans votre " -"navigateur :" - -#. Plugin URI of the plugin/theme -msgid "https://woocommerce.com/products/smart-coupons/" -msgstr "http://www.woothemes.com/products/smart-coupons/" - -#. Description of the plugin/theme -msgid "" -"WooCommerce Smart Coupons lets customers buy gift " -"certificates, store credits or coupons easily. They can use purchased " -"credits themselves or gift to someone else." -msgstr "" -"WooCommerce Smart Coupons permet aux clients d’utiliser des " -"cartes cadeau, des bons d’achat ou des codes promo facilement. Ils peuvent " -"utiliser les crĂ©dits achetĂ©s eux-mĂŞmes ou en faire cadeau Ă  quelqu’un " -"d’autre." - -#. Author of the plugin/theme -msgid "StoreApps" -msgstr "StoreApps" - -#. Author URI of the plugin/theme -msgid "https://www.storeapps.org/" -msgstr "https://www.storeapps.org/" - -#~ msgid "Click To Copy" -#~ msgstr "Cliquez pour copier" - -#~ msgid "Valid" -#~ msgstr "Valide" - -#~ msgid "Not valid" -#~ msgstr "Non valide" - -#~ msgid "category" -#~ msgid_plural "categories" -#~ msgstr[0] "catĂ©gorie" -#~ msgstr[1] "catĂ©gories" diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/languages/woocommerce-smart-coupons.pot b/wp/wp-content/plugins/woocommerce-smart-coupons/languages/woocommerce-smart-coupons.pot deleted file mode 100644 index 2586b1ff..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/languages/woocommerce-smart-coupons.pot +++ /dev/null @@ -1,4898 +0,0 @@ -# Copyright (C) 2023 WooCommerce Smart Coupons -# This file is distributed under the same license as the WooCommerce Smart Coupons package. -msgid "" -msgstr "" -"Project-Id-Version: WooCommerce Smart Coupons 7.2.1\n" -"Report-Msgid-Bugs-To: https://www.storeapps.org/support/contact-us/\n" -"POT-Creation-Date: 2023-02-24 06:18:41+00:00\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: Fri, 24 Feb 2023 11:48:41 +0530\n" -"Last-Translator: Ratnakar Dubey \n" -"Language-Team: StoreApps \n" - -#: includes/class-wc-sc-act-deact.php:245 -msgid "Successfully cleared WooCommerce Smart Coupons cache!" -msgstr "" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:116 -msgid "Copy this coupon code" -msgstr "" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:116 -msgid "Copy" -msgstr "" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:118 -msgid "Copy coupon shareable link and apply via URL" -msgstr "" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:118 -msgid "Get shareable link" -msgstr "" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:123 -msgid "Make a duplicate from this coupon" -msgstr "" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:123 -msgid "Duplicate" -msgstr "" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:200 -msgid "(Copy)" -msgstr "" - -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:267 -msgid "No coupon to duplicate has been supplied!" -msgstr "" - -#. translators: %d: Post ID -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:289 -msgid "Coupon creation failed, could not find original coupon: %d" -msgstr "" - -#. translators: %s: coupon id -#: includes/class-wc-sc-admin-coupons-dashboard-actions.php:312 -msgid "Coupon creation failed, could not find original coupon: %s" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:99 -#: includes/class-wc-sc-admin-welcome.php:197 -msgid "Settings" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:100 -#: includes/class-wc-sc-admin-pages.php:159 -#: includes/class-wc-sc-admin-pages.php:610 -#: includes/class-wc-sc-admin-welcome.php:223 -msgid "FAQ's" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:101 -#: includes/class-wc-sc-admin-welcome.php:198 -msgid "Docs" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:102 -msgid "Support" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:103 -msgid "Review" -msgstr "" - -#. translators: 1. Coupon type -#: includes/class-wc-sc-admin-notifications.php:165 -#: includes/class-wc-sc-background-coupon-importer.php:324 -#: includes/class-wc-sc-background-coupon-importer.php:391 -#: includes/class-wc-smart-coupons.php:4717 -msgid "Important" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:165 -msgid "Setting \"Enable the use of coupon codes\" is disabled." -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:176 -msgid "Enable" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:177 -msgid "it to use" -msgstr "" - -#. #-#-#-#-# woocommerce-smart-coupons.pot (WooCommerce Smart Coupons 7.2.1) #-#-#-#-# -#. Plugin Name of the plugin/theme -#: includes/class-wc-sc-admin-notifications.php:177 -#: includes/class-wc-sc-admin-notifications.php:243 -#: includes/class-wc-sc-admin-notifications.php:257 -#: includes/class-wc-sc-settings.php:893 includes/class-wc-sc-settings.php:896 -msgid "WooCommerce Smart Coupons" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:177 -msgid "features." -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:239 -msgid "Remind me after a month" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:240 -#: includes/class-wc-sc-print-coupon.php:275 -msgid "Never show again" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:243 -msgid "" -"Awesome, you successfully auto-generated a coupon! Are you having a great " -"experience with" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:243 -msgid "so far?" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:243 -msgid "Please consider" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:243 -msgid "leaving a review" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:243 -msgid "" -"! If things aren't going quite as expected, we're happy to help -- please " -"reach out to" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:243 -msgid "our support team" -msgstr "" - -#. translators: 1: WooCommerce Smart Coupons 2: Link for the Smart Coupons -#. settings -#: includes/class-wc-sc-admin-notifications.php:256 -msgid "" -"%1$s: You are using a custom coupon style which is planned to be removed " -"from the plugin in upcoming versions. New, improved styles & colors are " -"added in the version 4.9.0. We would request you to choose a color scheme & " -"a style for coupon from the newly added colors & styles. You can do this " -"from %2$s." -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:266 -msgid "Smart Coupons settings" -msgstr "" - -#. translators: %s: link to review WooCommerce Smart Coupons -#: includes/class-wc-sc-admin-notifications.php:304 -msgid "" -"Liked WooCommerce Smart Coupons? Leave us a %s. A huge thank you from " -"WooCommerce & StoreApps in advance!" -msgstr "" - -#. translators: %s: link to submit idea for Smart Coupons on WooCommerce idea -#. board -#: includes/class-wc-sc-admin-notifications.php:330 -msgid "Have a feature request? Submit it %s." -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:330 -#: includes/class-wc-sc-admin-welcome.php:361 -#: includes/class-wc-sc-admin-welcome.php:369 -#: includes/class-wc-sc-admin-welcome.php:395 -#: includes/class-wc-sc-background-coupon-importer.php:610 -#: includes/class-wc-sc-print-coupon.php:278 -msgid "here" -msgstr "" - -#. translators: %s: Plugin name -#: includes/class-wc-sc-admin-notifications.php:416 -msgid "%s database update required" -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:417 -msgid "" -"The database update process runs in the background and may take a little " -"while, so please be patient." -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:430 -msgid "Update database" -msgstr "" - -#. translators: %s: Plugin name -#: includes/class-wc-sc-admin-notifications.php:454 -msgid "" -"%s is updating the database in the background. The database update process " -"may take a little while, so please be patient." -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:456 -msgid "" -"Note: WP CRON has been disabled on your install which may prevent this " -"update from completing." -msgstr "" - -#: includes/class-wc-sc-admin-notifications.php:458 -msgid "View status" -msgstr "" - -#. translators: %s: Plugin name -#: includes/class-wc-sc-admin-notifications.php:467 -msgid "" -"%s database update completed. Thank you for updating to the latest version!" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:123 -#: includes/class-wc-sc-admin-pages.php:550 -#: includes/class-wc-sc-admin-pages.php:555 -#: includes/class-wc-sc-admin-pages.php:1570 -#: includes/class-wc-sc-background-coupon-importer.php:387 -#: includes/class-wc-sc-display-coupons.php:793 -#: includes/class-wc-sc-display-coupons.php:830 -#: includes/class-wc-sc-display-coupons.php:1785 -#: includes/class-wc-sc-product-fields.php:99 -#: includes/class-wc-sc-product-fields.php:159 -msgid "Coupons" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:124 -#: includes/class-wc-sc-admin-pages.php:556 -#: includes/class-wc-sc-admin-pages.php:1544 -msgid "Bulk Generate" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:133 -#: includes/class-wc-sc-admin-pages.php:566 -#: includes/class-wc-sc-admin-pages.php:1537 -msgid "Import Coupons" -msgstr "" - -#. translators: %s: singular name for store credit -#. translators: %s: sigular name for store credit -#. translators: Store Credit label -#: includes/class-wc-sc-admin-pages.php:143 -#: includes/class-wc-sc-admin-pages.php:579 -#: includes/class-wc-sc-admin-pages.php:1541 -msgid "Send %s" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:143 -#: includes/class-wc-sc-admin-pages.php:579 -msgid "Send Store Credit" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:152 -#: includes/class-wc-sc-admin-pages.php:596 -#: includes/class-wc-sc-settings.php:345 -msgid "Smart Coupons Settings" -msgstr "" - -#. translators: Decimal point -#: includes/class-wc-sc-admin-pages.php:197 -msgid "Please enter in decimal (%s) format without thousand separators." -msgstr "" - -#. translators: Decimal point -#: includes/class-wc-sc-admin-pages.php:199 -msgid "" -"Please enter in monetary decimal (%s) format without thousand separators and " -"currency symbols." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:200 -msgid "Please enter in country code with two capital letters." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:201 -msgid "Please enter in a value less than the regular price." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:205 -#: includes/class-wc-sc-coupon-import.php:881 -msgid "Import" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:206 -#: includes/class-wc-smart-coupons.php:3571 -msgid "Export" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:215 -msgid "" -"Are you sure you want to remove the selected items? If you have previously " -"reduced this item's stock, or this order was submitted by a customer, you " -"will need to manually restore the item's stock." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:216 -msgid "Please select some items." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:217 -msgid "" -"Are you sure you wish to process this refund? This action cannot be undone." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:218 -#: includes/class-wc-sc-coupon-refund-process.php:442 -msgid "" -"Are you sure you wish to delete this refund? This action cannot be undone." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:219 -msgid "" -"Are you sure you wish to delete this tax column? This action cannot be " -"undone." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:220 -msgid "Remove this item meta?" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:221 -msgid "Remove this attribute?" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:222 -msgid "Name" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:223 -msgid "Remove" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:224 -msgid "Click to toggle" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:225 -msgid "Value(s)" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:226 -msgid "Enter some text, or some attributes by pipe (|) separating values." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:227 -msgid "Visible on the product page" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:228 -msgid "Used for variations" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:229 -msgid "Enter a name for the new attribute term:" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:230 -msgid "Calculate totals based on order items, discounts, and shipping?" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:231 -msgid "" -"Calculate line taxes? This will calculate taxes based on the customers " -"country. If no billing/shipping is set it will use the store base country." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:232 -msgid "" -"Copy billing information to shipping information? This will remove any " -"currently entered shipping information." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:233 -msgid "" -"Load the customer's billing information? This will remove any currently " -"entered billing information." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:234 -msgid "" -"Load the customer's shipping information? This will remove any currently " -"entered shipping information." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:235 -msgid "Featured" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:238 -msgid "No customer selected" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:271 -msgid "" -"Could not grant access - the user may already have permission for this file " -"or billing email is not set. Ensure the billing email is set, and the order " -"has been saved." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:272 -msgid "Are you sure you want to revoke access to this download?" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:273 -msgid "You cannot add the same tax rate twice!" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:274 -msgid "" -"Your product has variations! Before changing the product type, it is a good " -"idea to delete the variations to avoid errors in the stock reports." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:284 -msgid "Generate coupon code" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:320 -msgid "Import complete - imported" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:320 -msgid "skipped" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:385 -msgid "WooCommerce Coupons (CSV)" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:385 -msgid "Import coupons to your store via a csv file." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:521 -#: includes/class-wc-sc-admin-pages.php:523 -msgid "Smart Coupon" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:551 -msgid "Add Coupon" -msgstr "" - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-admin-pages.php:674 -msgid "%s sent successfully." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:674 -msgid "Store Credit / Gift Certificate sent successfully." -msgstr "" - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-admin-pages.php:678 -msgid "There has been an error in sending %s." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:678 -msgid "There has been an error in sending Store Credit / Gift Certificate." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:679 -msgid "Please try again later." -msgstr "" - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-admin-pages.php:729 -msgid "Quickly create and email %s to one or more people." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:731 -msgid "" -"Quickly create and email Store Credit or Gift Card to one or more people." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:764 -#: includes/class-wc-sc-admin-pages.php:1160 -#: includes/class-wc-sc-admin-pages.php:1178 -msgid "Send to" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:772 -msgid "Invalid email address." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:775 -#: includes/class-wc-sc-admin-pages.php:1184 -msgid "Use comma \",\" to separate multiple email addresses" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:781 -msgid "Worth" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:786 -#: includes/class-wc-sc-coupon-fields.php:786 -msgid "0.00" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:792 -#: includes/class-wc-sc-purchase-credit.php:155 -msgid "Invalid amount." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:802 -msgid "Expiry Date" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:809 -msgid "The store credit will expire at 00:00:00 of this date." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:817 -#: includes/class-wc-sc-admin-pages.php:1189 -#: includes/class-wc-sc-display-coupons.php:2236 -#: includes/class-wc-sc-display-coupons.php:2269 -#: includes/class-wc-sc-privacy.php:577 -msgid "Message" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:817 -#: includes/class-wc-sc-admin-pages.php:1189 -msgid "(optional)" -msgstr "" - -#. translators: 1. Coupon type 2. Coupon amount -#: includes/class-wc-sc-admin-pages.php:826 -#: includes/class-wc-sc-purchase-credit.php:915 -msgid "Send" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:832 -#: includes/class-wc-sc-admin-pages.php:1204 -msgid "Preview Email" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:988 -msgid "Please enter a valid value for Number of Coupons to Generate" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1069 -msgid "Need a lot of coupons? You can easily do that with Smart Coupons." -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1113 -msgid "Action" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1119 -#: includes/class-wc-sc-admin-pages.php:1160 -msgid "Number of coupons to generate" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1119 -msgid "Required" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1120 -msgid "10" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1124 -msgid "Generate coupons and" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1126 -msgid "Add to store" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1132 -msgid "Export to CSV" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1144 -msgid "(Does not add to store, but creates a .csv file, that you can" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1144 -#: includes/class-wc-sc-background-coupon-importer.php:351 -msgid "import" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1144 -msgid "later" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1152 -msgid "Email to recipients" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1154 -msgid "(Add to store and email generated coupons to recipients)" -msgstr "" - -#. translators: 1: Path to setting 2: Setting to set email address 3: Setting -#. for number of coupons to generate -#: includes/class-wc-sc-admin-pages.php:1160 -msgid "" -"Enter the email addresses of the recipients separated by comma under %1$1s. " -"Make sure to match the count of email addresses in %2$2s to %3$3s" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1172 -msgid "Email to " -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1226 -msgid "Coupon Description " -msgstr "" - -#. translators: 1: HTML small tag start 2: HTML small tag end -#: includes/class-wc-sc-admin-pages.php:1228 -msgid "" -"%1$s(This will add the same coupon description in all the bulk generated " -"coupons)%2$s" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1241 -msgid "Coupon Data" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1251 -#: includes/class-wc-sc-coupon-categories.php:86 -#: includes/class-wc-sc-coupon-columns.php:129 -msgid "Coupon categories" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1255 -#: includes/class-wc-sc-coupon-categories.php:104 -#: includes/class-wc-sc-coupon-categories.php:163 -#: includes/class-wc-smart-coupons.php:3575 -msgid "Manage coupon categories" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1297 -msgid "Apply" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1376 -#: includes/class-wc-sc-admin-pages.php:1386 -#: includes/class-wc-sc-admin-pages.php:1541 includes/class-wc-sc-ajax.php:332 -#: includes/class-wc-smart-coupons.php:1033 -#: includes/emails/class-wc-sc-email-coupon.php:355 -#: includes/emails/class-wc-sc-email-coupon.php:479 -msgid "Store Credit" -msgstr "" - -#. translators: 1: Singular name for post type 2: Email -#: includes/class-wc-sc-admin-pages.php:1501 -msgid "[%1$s restricted with email: %2$s]" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1560 -msgid "WooCommerce" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1565 -msgid "Marketing" -msgstr "" - -#: includes/class-wc-sc-admin-pages.php:1583 -msgid "Original amount" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:87 -msgid "About Smart Coupons" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:88 -msgid "Welcome to Smart Coupons" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:177 -msgid "Thank you for installing WooCommerce Smart Coupons" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:179 -msgid "" -"Glad to have you onboard. We hope WooCommerce Smart Coupons adds to your " -"desired success 🏆" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:183 -msgid "Go To Coupons" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:214 -msgid "Know Smart Coupons" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:252 -msgid "What is Smart Coupons?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:254 -msgid "" -"Smart Coupons is a powerful extension, built on top of WooCommerce coupons. " -"It adds a new discount type - Store Credit - and advanced functionality to " -"the default coupons." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:255 -msgid "Smart Coupons enable coupons to become an automatic/interactive system." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:259 -msgid "Top Smart Coupons features" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:261 -msgid "Create and gift Store Credit / Gift Cards" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:262 -msgid "Bulk generate coupons" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:263 -msgid "Apply multiple coupons via URL" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:264 -msgid "" -"Advanced restrictions - payment, shipping, location, user roles, product " -"attributes" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:267 -msgid "and a lot more…" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:271 -msgid "Automatic payment for subscription renewals" -msgstr "" - -#. translators: WooCommerce Subscriptions product link -#: includes/class-wc-sc-admin-welcome.php:275 -msgid "" -"If your store is using %s and your customer has purchased a subscription " -"using a Store Credit. If that store credit has balance left in it, store " -"will automatically use it for renewing that subscription." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:275 -msgid "WooCommerce Subscriptions" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:280 -msgid "How to use Smart Coupons the best way" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:283 -msgid "Sell or issue store credit / gift cards" -msgstr "" - -#. translators: 1: Affiliate For WooCommerce 2: Smart Manager 3: Smart Offers -#: includes/class-wc-sc-admin-welcome.php:287 -msgid "" -"Let customers purchase gift cards from you or you issue store credit that " -"your users can redeem on the current or next purchase. See how: %1$s or %2$s" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:287 -msgid "any amount" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:287 -msgid "variable but fixed amount" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:292 -msgid "Bulk create unique coupons & email them" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:294 -msgid "" -"Import and export unique coupons in bulk via CSV. Share coupon codes to deal " -"sites or email them to your customers." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:294 -#: includes/class-wc-sc-admin-welcome.php:300 -#: includes/class-wc-sc-admin-welcome.php:308 -#: includes/class-wc-sc-admin-welcome.php:403 -msgid "See how" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:298 -msgid "Gift a product via coupon" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:300 -msgid "" -"Attach a gift of any value (free or paid product) to a particular coupon. " -"Here, instead of a discount, a product is redeemed for the coupon code." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:306 -msgid "Give discounts to customers for next purchase" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:308 -msgid "" -"You can give a coupon to your customer after every purchase, which can " -"encourage them to purchase again from you." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:312 -msgid "Set a maximum discount limit" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:314 -msgid "" -"Give bigger discounts without hurting your profits. Offer a percentage off " -"coupon upto a particular value. Example - Flat 50% off upto $100." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:318 -msgid "Make customer's coupon usage, easy & simple" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:320 -msgid "" -"Show only valid coupons to your customer (if logged in) on cart, checkout & " -"My Account page. Coupons can be applied with single click. So, no need to " -"remember the coupon code or copy-pasting." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:349 -msgid "FAQ / Common Problems" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:354 -msgid "" -"When trying to add coupon/Smart Coupon, I get \"Invalid post type\" message." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:355 -msgid "" -"Make sure use of coupon is enabled in your store. You can find this setting" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:364 -msgid "Smart Coupon's fields are broken?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:365 -msgid "Make sure you are using the " -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:365 -msgid "latest version of Smart Coupons" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:365 -msgid "" -". If still the issue persist, temporarily de-activate all plugins except " -"WooCommerce & Smart Coupons. Re-check the issue, if the issue still " -"persists, contact us (from the link at the end of this page). If the issue " -"goes away, re-activate other plugins one-by-one & re-checking the fields, to " -"find out which plugin is conflicting." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:368 -msgid "How to translate texts from Smart Coupons?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:369 -msgid "Simplest method is by installing" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:369 -msgid "Loco Translate" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:369 -msgid "plugin and then following steps listed " -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:372 -msgid "How to change texts of the emails sent from Smart Coupons?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:373 -msgid "You can do this by overriding the email template." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:373 -msgid "How to override email template" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:376 -msgid "" -"Can coupon code have any spaces in the name? / My Store Credit/Gift " -"Certificate is not working (not generating new coupon code)." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:377 -msgid "" -"No. Coupon code should not have any spaces in the name, Eg, Coupon code " -"should be “gift-certificate” & not “gift certificate”." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:380 -msgid "" -"What's the URL to a coupon, so it's automatically inserted when visiting?" -msgstr "" - -#. translators: Documentation link for 'How to Apply Single or Multiple Coupons -#. on Click of a Link' -#: includes/class-wc-sc-admin-welcome.php:382 -msgid "URL of coupon should be like this:" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:382 -msgid "" -". Replace www.mysite.com with your own site URL and replace discount5 with " -"the your coupon code." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:382 -msgid "For more details you can refer to this article: %s" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:382 -msgid "How to Apply Single or Multiple Coupons on Click of a Link" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:385 -msgid "" -"Do not want to tie store credit to be used by only one customer? / Can a " -"customer send a gift certificate to themselves to pass on to someone else?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:386 -msgid "" -"Edit the main coupon which is entered in \"Coupons\" field of the product " -"edit page, then go to \"Usage Restrictions\" > \"Disable Email Restriction\" " -"and disable this setting and save the coupon." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:389 -msgid "" -"Getting 'Page Not Found Error' when accessing Coupons tab from My Account " -"Page?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:390 -msgid "" -"Go to WordPress -> Settings -> Permalinks and click on Save Settings once." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:393 -msgid "Is there any reference file for creating an import file for coupons?" -msgstr "" - -#. translators: 1. File name 2. File download link -#: includes/class-wc-sc-admin-welcome.php:395 -msgid "" -"There is one file which is located inside the plugin. You can download the " -"%1$s file from %2$s." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:395 -msgid "If you want to import coupon through file, the file should be like" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:398 -msgid "Available coupons are not visible on Cart, Checkout & My Account page?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:399 -msgid "" -"Smart Coupons uses hooks of Cart, Checkout & My Account page to display " -"available coupons. If your theme is not using those hooks in cart, checkout " -"& my-account template, coupons will not be displayed." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:402 -msgid "How can I resend gift card coupon bought by customers?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:403 -msgid "You can resend them from order admin edit page." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:406 -msgid "" -"Uncheck \"Auto-generate\" option in Store Credit is not saving? Is it always " -"checked?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:407 -msgid "" -"Store Credit's default behavior is auto-generate because, when using a store " -"credit, it's balance keeps reducing. Therefore it should be uniquely created " -"for every user automatically." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:410 -msgid "Smart Coupons is not sending emails." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:411 -msgid "" -"Smart Coupons sends email only after order completion. So make sure that " -"order complete email is enabled and sending. If enabled, then make sure all " -"settings of coupons, products are in place. Also check by switching your " -"theme." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:414 -msgid "\"Store Credit Receiver detail\" form not appearing on checkout page?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:415 -msgid "" -"This form is displayed using a hook which is available in My Account " -"template. Make sure your theme's my-account template contains all hooks " -"required for that template. Update your theme if it is not updated." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:418 -msgid "Does Smart Coupons allow printing of coupon as Gift Card?" -msgstr "" - -#. translators: Documentation link for 'How to Print Coupons' -#: includes/class-wc-sc-admin-welcome.php:420 -msgid "" -"Yes, Smart Coupons does provide a feature for printing coupons. For more " -"details, check this article: %s" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:420 -msgid "How to Print Coupons" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:423 -msgid "" -"Is it possible to have a coupon for each variation of the variable product?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:424 -msgid "" -"From version 4.11.0, you can add/link coupons to product variations as well. " -"This feature is not available in a version lower than 4.11.0." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:427 -msgid "Is Smart Coupons compatible with WooCommerce Subscriptions?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:428 -msgid "Yes, Smart Coupons does work with WooCommerce Subscriptions." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:431 -msgid "Which features of Smart Coupons work with Subscriptions?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:432 -msgid "" -"Give away a discount or credit on signing up a subscription, give away " -"recurring discount or credits, apply credit during sign up, automatic " -"payment for renewals from credit (Note: When using PayPal Standard Gateway, " -"store credit can be applied only during sign up. Automatic payment for " -"renewals by credit will not work for PayPal Standard Gateway)." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:435 -msgid "How does automatic payment by store credit work with Subscriptions?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:436 -msgid "" -"Customers can apply store credit on a subscription during purchase of " -"subscription. If the same store credit has sufficient balance, it'll keep " -"applying it to renewals till the remainder in store credit is higher than " -"renewal price. Customers will be able to apply store credit only during " -"signup. They will not get an option to apply store credit in renewals. But " -"if the store credit will not have sufficient balance to pay for the " -"renewals, then the order will go into pending mode. Now when the customer " -"will go to pay for this renewal order, they'll get an option to apply store " -"credit again. To activate the subscription again, the customer will have to " -"pay for the renewals. When the customer is paying for the renewals from " -"their account, then in that process they can use the same store credit which " -"didn't have the sufficient balance, again & pay for the remaining amount." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:439 -msgid "" -"Is it possible to partially pay for a subscription with store credit and the " -"remainder by another method?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:440 -msgid "" -"No, this is possible only in those cases where subscription amount is more " -"than store credit's balance. If store credit's balance is more than " -"subscription's total then your bank account or credit card will not be " -"charged." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:443 -msgid "Is Smart Coupons WPML compatible?" -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:444 -msgid "" -"Not yet, but this is being worked on. You will find this in later versions." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:447 -msgid "" -"I'm using WPML & WPML provides support for multi-currency, but Smart Coupons " -"only changes currency symbol & the price value remains same. Can Smart " -"Coupons change the currency symbol and the price value associated with it?" -msgstr "" - -#. translators: Link for the plugin 'Aelia Currency Switcher for WooCommerce' -#: includes/class-wc-sc-admin-welcome.php:449 -msgid "" -"Currently, Smart Coupons is compatible with %s. But it is not compatible " -"with any other multi-currency plugin or with WPML." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:449 -msgid "Aelia Currency Switcher for WooCommerce" -msgstr "" - -#. translators: WooCommerce My Account support link -#: includes/class-wc-sc-admin-welcome.php:476 -msgid "If you are facing any issues, please %s from your WooCommerce account." -msgstr "" - -#: includes/class-wc-sc-admin-welcome.php:476 -msgid "submit a ticket" -msgstr "" - -#: includes/class-wc-sc-ajax.php:132 -#: includes/class-wc-sc-product-fields.php:114 -#: includes/class-wc-sc-product-fields.php:175 -msgid "Type" -msgstr "" - -#. translators: 1. The coupon code, 2. The discount type -#: includes/class-wc-sc-ajax.php:252 includes/class-wc-sc-settings.php:332 -msgid "%1$s (Type: %2$s)" -msgstr "" - -#: includes/class-wc-sc-ajax.php:337 includes/class-wc-sc-ajax.php:352 -#: includes/class-wc-smart-coupons.php:1038 -#: includes/class-wc-smart-coupons.php:1053 -msgid "Cart Discount" -msgstr "" - -#: includes/class-wc-sc-ajax.php:342 includes/class-wc-sc-ajax.php:347 -#: includes/class-wc-smart-coupons.php:1043 -#: includes/class-wc-smart-coupons.php:1048 -msgid "Product Discount" -msgstr "" - -#: includes/class-wc-sc-ajax.php:352 includes/class-wc-sc-settings.php:1041 -#: includes/class-wc-smart-coupons.php:1053 -msgid "Discount" -msgstr "" - -#. translators: %s: Maximum coupon discount amount -#: includes/class-wc-sc-ajax.php:357 -msgid "upto %s" -msgstr "" - -#: includes/class-wc-sc-auto-apply-coupon.php:123 -#: includes/class-wc-sc-auto-apply-coupon.php:189 -msgid "Auto apply?" -msgstr "" - -#: includes/class-wc-sc-auto-apply-coupon.php:124 -msgid "" -"When checked, this coupon will be applied automatically, if it is valid. If " -"enabled in more than 5 coupons, only 5 coupons will be applied " -"automatically, rest will be ignored." -msgstr "" - -#. translators: 1. Important 2. Upload path -#: includes/class-wc-sc-background-coupon-importer.php:324 -msgid "" -"%1$s: To allow bulk generation of coupons, please make sure %2$s directory " -"is writable." -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:329 -msgid "" -"Bulk generation is disabled since uploads directory is not writable. Please " -"ensure uploads directory is writable before starting bulk generate process." -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:350 -msgid "imported" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:356 -msgid "generated & sent" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:357 -#: includes/class-wc-sc-background-coupon-importer.php:362 -msgid "generate" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:361 -#: includes/class-wc-sc-background-coupon-importer.php:585 -msgid "generated" -msgstr "" - -#. translators: 1. Error title 2. The bulk process -#: includes/class-wc-sc-background-coupon-importer.php:376 -msgid "" -"%1$s: The coupon bulk %2$s process stopped. Please review the coupons list " -"to check the status." -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:376 -msgid "Error" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:385 -msgid "Store Credits / Gift Cards" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:391 -msgid "%s are being" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:393 -msgid "in the background. You will be notified when it is completed." -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:396 -msgid "Progress" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:397 -msgid "--:--:--" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:398 -msgid "Stop" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:402 -msgid "" -"You can continue with other work. But for bulk generating or importing new " -"coupons, wait for the current process to complete." -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:478 -msgid "" -"We are processing coupons in background. Please wait before starting new " -"process." -msgstr "" - -#. translators: 1. The bulk process -#: includes/class-wc-sc-background-coupon-importer.php:542 -msgid "" -"Are you sure you want to stop the coupon bulk %s process? Click OK to stop." -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:567 -#: includes/class-wc-sc-background-coupon-importer.php:575 -msgid "Coupon import" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:568 -#: includes/class-wc-sc-background-coupon-importer.php:572 -msgid "added & emailed" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:571 -#: includes/class-wc-sc-background-coupon-importer.php:584 -msgid "Coupon bulk generation" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:576 -#: includes/class-wc-sc-background-coupon-importer.php:585 -msgid "added" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:579 -msgid "Store credit" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:580 -msgid "sent" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:591 -msgid "store credit / gift card" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:592 -msgid "store credits / gift cards" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:594 -#: includes/class-wc-sc-purchase-credit.php:909 -#: includes/emails/class-wc-sc-email-coupon.php:486 -msgid "coupon" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:595 -msgid "coupons" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:601 -msgid "Successfully" -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:610 -msgid "CSV file has been generated. You can download it from " -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:725 -#: includes/class-wc-sc-background-coupon-importer.php:742 -msgid "Failed to create export file." -msgstr "" - -#: includes/class-wc-sc-background-coupon-importer.php:1232 -msgid "Every 5 Seconds" -msgstr "" - -#. translators: 1. Product title -#: includes/class-wc-sc-coupon-actions.php:360 -msgid "%s has been added to your cart!" -msgstr "" - -#. translators: 1. Product/s 2. Product names 3. is/are 4. Coupons code -#: includes/class-wc-sc-coupon-actions.php:413 -msgid "%1$s %2$s %3$s removed because coupon %4$s is removed." -msgstr "" - -#: includes/class-wc-sc-coupon-actions.php:413 -#: includes/class-wc-sc-coupons-by-product-quantity.php:116 -msgid "Product" -msgid_plural "Products" -msgstr[0] "" -msgstr[1] "" - -#: includes/class-wc-sc-coupon-actions.php:413 -msgid "is" -msgid_plural "are" -msgstr[0] "" -msgstr[1] "" - -#: includes/class-wc-sc-coupon-actions.php:489 -msgid "Add product details" -msgstr "" - -#: includes/class-wc-sc-coupon-categories.php:87 -msgid "Category" -msgstr "" - -#: includes/class-wc-sc-coupon-categories.php:88 -msgctxt "Admin menu name" -msgid "Categories" -msgstr "" - -#: includes/class-wc-sc-coupon-categories.php:89 -msgid "Search coupon categories" -msgstr "" - -#: includes/class-wc-sc-coupon-categories.php:90 -msgid "All coupon categories" -msgstr "" - -#: includes/class-wc-sc-coupon-categories.php:91 -msgid "Parent coupon category" -msgstr "" - -#: includes/class-wc-sc-coupon-categories.php:92 -msgid "Parent coupon category:" -msgstr "" - -#: includes/class-wc-sc-coupon-categories.php:93 -msgid "Edit coupon category" -msgstr "" - -#: includes/class-wc-sc-coupon-categories.php:94 -msgid "Update coupon category" -msgstr "" - -#: includes/class-wc-sc-coupon-categories.php:95 -msgid "Add new coupon category" -msgstr "" - -#: includes/class-wc-sc-coupon-categories.php:96 -msgid "New coupon category name" -msgstr "" - -#: includes/class-wc-sc-coupon-categories.php:97 -msgid "No coupon categories found" -msgstr "" - -#: includes/class-wc-sc-coupon-columns.php:128 -msgid "Used in orders" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:98 -msgid "Coupon shareable link" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:136 -msgid "Copy the following link and share it to apply this coupon via URL." -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:143 -#: includes/class-wc-sc-coupon-fields.php:1216 -msgid "Click to copy" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:147 -msgid "You can also apply multiple coupon codes via a single URL. For example:" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:312 -#: includes/class-wc-smart-coupons.php:3967 -msgid "Coupon expiry time" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:313 -msgid "HH:MM" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:314 -msgid "" -"Time after which coupon will be expired. This will work in conjunction with " -"Coupon expiry date." -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:328 -#: includes/class-wc-smart-coupons.php:3963 -msgid "Max discount" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:329 -msgid "Unlimited discount" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:330 -msgid "The maximum discount this coupon can give on a cart." -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:343 -#: includes/class-wc-smart-coupons.php:3962 -#: includes/class-wc-smart-coupons.php:4334 -msgid "For new user only?" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:344 -msgid "" -"When checked, this coupon will be valid for the user's first order on the " -"store." -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:358 -msgid "Valid for" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:361 -msgid "Days" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:362 -msgid "Weeks" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:363 -msgid "Months" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:364 -msgid "Years" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:366 -msgid "(Used only for auto-generated coupons)" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:373 -msgid "Coupon value same as product's price?" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:374 -msgid "When checked, generated coupon's value will be same as product's price" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:380 -msgid "Auto generate new coupons with each item" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:381 -msgid "" -"Generate exact copy of this coupon with unique coupon code for each " -"purchased product (needs this coupon to be linked with that product)" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:401 -msgid "Coupon code format" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:402 -msgid "Prefix" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:404 -msgid "Suffix" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:405 -msgid "(We recommend up to three letters for prefix/suffix)" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:418 -msgid "Show on cart, checkout" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:418 -msgid "and my account?" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:419 -msgid "" -"When checked, this coupon will be visible on cart/checkout page for everyone" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:454 -msgid "Disable email restriction?" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:455 -msgid "" -"Do not restrict auto-generated coupons to buyer/receiver email, anyone with " -"coupon code can use it" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:716 -msgid "Actions" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:744 -msgid "After applying the coupon do these also" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:746 -msgid "Add products to cart" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:749 -#: includes/class-wc-sc-coupon-fields.php:776 -msgid "Search for a product…" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:780 -msgid "each with quantity" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:781 -msgid "1" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:782 -msgid "" -"This much quantity of each product, selected above, will be added to cart." -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:785 -msgid "with discount of" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:788 -msgid "%" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:791 -msgid "" -"When this coupon will be applied, selected products will be added to cart " -"with set discount. If discount is not set, this coupon's discount will be " -"applied to these products." -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:826 -#: includes/class-wc-smart-coupons.php:4447 -msgctxt "enhanced select" -msgid "One result is available, press enter to select it." -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:827 -#: includes/class-wc-smart-coupons.php:4448 -msgctxt "enhanced select" -msgid "%qty% results are available, use up and down arrow keys to navigate." -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:828 -#: includes/class-wc-smart-coupons.php:4449 -msgctxt "enhanced select" -msgid "No matches found" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:829 -#: includes/class-wc-sc-coupon-fields.php:837 -#: includes/class-wc-smart-coupons.php:4458 -msgctxt "enhanced select" -msgid "Searching…" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:830 -#: includes/class-wc-smart-coupons.php:4451 -msgctxt "enhanced select" -msgid "Please enter 1 or more characters" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:831 -#: includes/class-wc-smart-coupons.php:4452 -msgctxt "enhanced select" -msgid "Please enter %qty% or more characters" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:832 -#: includes/class-wc-smart-coupons.php:4453 -msgctxt "enhanced select" -msgid "Please delete 1 character" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:833 -#: includes/class-wc-smart-coupons.php:4454 -msgctxt "enhanced select" -msgid "Please delete %qty% characters" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:834 -#: includes/class-wc-smart-coupons.php:4455 -msgctxt "enhanced select" -msgid "You can only select 1 item" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:835 -#: includes/class-wc-smart-coupons.php:4456 -msgctxt "enhanced select" -msgid "You can only select %qty% items" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:836 -#: includes/class-wc-smart-coupons.php:4457 -msgctxt "enhanced select" -msgid "Loading more results…" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:1094 -msgid "Could not locate WooCommerce" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:1141 -#: includes/class-wc-sc-settings.php:595 -msgid "Store Credit / Gift Certificate" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:1214 -#: includes/class-wc-sc-coupon-fields.php:1229 -msgid "Copied!" -msgstr "" - -#: includes/class-wc-sc-coupon-fields.php:1221 -#: includes/class-wc-sc-coupon-fields.php:1231 -msgid "Copy coupon code" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:639 -#: includes/class-wc-sc-coupon-import.php:695 -#: includes/class-wc-sc-coupon-import.php:707 -msgid "Sorry, there has been an error." -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:640 -msgid "The file does not exist, please try again." -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:792 -msgid "Coupon Import Error" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:792 -msgid "" -"Invalid CSV file. Make sure your CSV file contains all columns, header row, " -"and data in correct format." -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:792 -msgid "Download a sample.csv to confirm" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:866 -msgid "All set, Begin import?" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:870 -msgid "File uploaded OK" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:871 -msgid "File format seems OK" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:877 -msgid "Email coupon to recipients?" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:877 -msgid "" -"Enable this to send coupon to recipient's email addresses, provided in " -"imported file." -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:946 -msgid "Chosen" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:962 -msgid "" -"Hi there! Upload a CSV file with coupons details to import them into your " -"shop." -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:963 -msgid "The CSV must adhere to a specific format and include a header row." -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:963 -msgid "Click here to download a sample" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:963 -msgid "and create your CSV based on that." -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:964 -msgid "" -"Note: If any coupon from the CSV file already exists in the store, it will " -"not update the existing coupon, instead a new coupon will be imported & the " -"previous coupon with the same code will become inactive." -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:965 -msgid "Ready to import? Choose a .csv file, then click \"Upload file\"." -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:987 -msgid "" -"Before you can upload your import file, you will need to fix the following " -"error:" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:996 -msgid "Choose a CSV file" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:1001 -msgid "Maximum file size" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:1002 -msgid "OR" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:1003 -msgid "Already uploaded CSV to the server?" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:1003 -msgid "Enter location on the server" -msgstr "" - -#: includes/class-wc-sc-coupon-import.php:1005 -msgid "Upload file" -msgstr "" - -#: includes/class-wc-sc-coupon-message.php:125 -msgid "Display message" -msgstr "" - -#: includes/class-wc-sc-coupon-message.php:133 -msgid "Email message?" -msgstr "" - -#: includes/class-wc-sc-coupon-message.php:134 -msgid "Check this box to include above message in order confirmation email" -msgstr "" - -#: includes/class-wc-sc-coupon-message.php:353 -#: includes/class-wc-sc-coupon-message.php:370 -msgid "Coupon Message" -msgstr "" - -#: includes/class-wc-sc-coupon-message.php:371 -msgid "Is Email Coupon Message" -msgstr "" - -#. translators: 1. Coupon code 2. Expiry date -#: includes/class-wc-sc-coupon-parser.php:412 -msgid "" -"Incorrect format for expiry date of coupon \"%1$s\". Entered date is %2$s. " -"Expected date format: YYYY-MM-DD" -msgstr "" - -#: includes/class-wc-sc-coupon-process.php:272 -msgid "Email address" -msgstr "" - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-coupon-process.php:302 -msgid "Error: %s Receiver’s E-mail address is invalid." -msgstr "" - -#: includes/class-wc-sc-coupon-process.php:304 -msgid "Error: Gift Card Receiver’s E-mail address is invalid." -msgstr "" - -#. translators: 1. amount of store credit 2. store credit label 3. coupon code -#: includes/class-wc-sc-coupon-process.php:713 -msgid "%1$s worth of %2$s restored to coupon %3$s." -msgstr "" - -#. translators: 1. amount of store credit 2. coupon code -#: includes/class-wc-sc-coupon-process.php:716 -msgid "%1$s worth of Store Credit restored to coupon %2$s." -msgstr "" - -#. translators: Order notes -#: includes/class-wc-sc-coupon-process.php:724 -msgid "%s Because PayPal doesn't accept discount on shipping & tax." -msgstr "" - -#. translators: 1. Receiver email 2. Coupon code 3. Order id -#: includes/class-wc-sc-coupon-process.php:1017 -#: includes/class-wc-smart-coupons.php:763 -msgid "" -"Failed to schedule email to \"%1$s\" for coupon \"%2$s\" received from order " -"#%3$s." -msgstr "" - -#: includes/class-wc-sc-coupon-refund-process.php:184 -msgid "Refund to Store Credit" -msgstr "" - -#: includes/class-wc-sc-coupon-refund-process.php:195 -msgid "Auto-fill refund amount" -msgstr "" - -#: includes/class-wc-sc-coupon-refund-process.php:377 -msgid "Successfully updated store credit refund details." -msgstr "" - -#: includes/class-wc-sc-coupon-refund-process.php:379 -msgid "Failed to update store credit refund details." -msgstr "" - -#: includes/class-wc-sc-coupon-refund-process.php:390 -msgid "Nonce verification failed for action \"wc_sc_refund_store_credit\"." -msgstr "" - -#. translators: 1: refund id 2: refund date 3: username -#: includes/class-wc-sc-coupon-refund-process.php:531 -msgid "Refund %1$s - %2$s by %3$s" -msgstr "" - -#. translators: 1: ID who refunded -#: includes/class-wc-sc-coupon-refund-process.php:537 -msgid "ID: %d" -msgstr "" - -#. translators: 1: refund id 2: refund date -#: includes/class-wc-sc-coupon-refund-process.php:544 -msgid "Refund %1$s - %2$s" -msgstr "" - -#: includes/class-wc-sc-coupons-by-excluded-email.php:102 -#: includes/class-wc-sc-coupons-by-excluded-email.php:226 -msgid "Excluded emails" -msgstr "" - -#: includes/class-wc-sc-coupons-by-excluded-email.php:103 -msgid "No restrictions" -msgstr "" - -#: includes/class-wc-sc-coupons-by-excluded-email.php:104 -msgid "" -"List of excluded billing emails to check against when an order is placed. " -"Separate email addresses with commas. You can also use an asterisk (*) to " -"match parts of an email. For example \"*@gmail.com\" would match all gmail " -"addresses." -msgstr "" - -#: includes/class-wc-sc-coupons-by-location.php:190 -msgid "Address to look in" -msgstr "" - -#: includes/class-wc-sc-coupons-by-location.php:193 -msgid "Billing" -msgstr "" - -#: includes/class-wc-sc-coupons-by-location.php:197 -msgid "Shipping" -msgstr "" - -#: includes/class-wc-sc-coupons-by-location.php:201 -msgid "Locations" -msgstr "" - -#: includes/class-wc-sc-coupons-by-location.php:213 -msgid "Select location" -msgstr "" - -#: includes/class-wc-sc-coupons-by-location.php:216 -msgid "Select Country" -msgstr "" - -#: includes/class-wc-sc-coupons-by-location.php:229 -msgid "Select Additional Locations" -msgstr "" - -#: includes/class-wc-sc-coupons-by-location.php:410 -msgid "Coupon is not valid for the" -msgstr "" - -#: includes/class-wc-sc-coupons-by-location.php:410 -msgid "billing address" -msgstr "" - -#: includes/class-wc-sc-coupons-by-location.php:410 -msgid "shipping address" -msgstr "" - -#: includes/class-wc-sc-coupons-by-location.php:425 -msgid "Locations lookup in" -msgstr "" - -#: includes/class-wc-sc-coupons-by-location.php:426 -msgid "Billing Locations" -msgstr "" - -#: includes/class-wc-sc-coupons-by-location.php:427 -msgid "Shipping Locations" -msgstr "" - -#: includes/class-wc-sc-coupons-by-payment-method.php:103 -#: includes/class-wc-sc-coupons-by-payment-method.php:220 -msgid "Payment methods" -msgstr "" - -#: includes/class-wc-sc-coupons-by-payment-method.php:104 -msgid "No payment methods" -msgstr "" - -#: includes/class-wc-sc-coupons-by-payment-method.php:114 -msgid "" -"Payment methods that must be selected during checkout for this coupon to be " -"valid." -msgstr "" - -#. translators: 1. The coupon code 2. The text 'payment method/s' 3. List of -#. payment method names 4. Link to the checkout page -#: includes/class-wc-sc-coupons-by-payment-method.php:201 -msgid "" -"Coupon code %1$s is valid only for %2$s: %3$s. You can change payment method " -"from the %4$s page." -msgstr "" - -#: includes/class-wc-sc-coupons-by-payment-method.php:201 -msgid "payment method" -msgid_plural "payment methods" -msgstr[0] "" -msgstr[1] "" - -#: includes/class-wc-sc-coupons-by-payment-method.php:201 -msgid "Checkout" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:167 -msgid "Attribute=" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:167 -msgid "Value=" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:181 -msgid "Product attributes" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:182 -#: includes/class-wc-sc-coupons-by-product-attribute.php:201 -msgid "No product attributes" -msgstr "" - -#. translators: Non product type coupon labels -#: includes/class-wc-sc-coupons-by-product-attribute.php:193 -msgid "" -"Product attributes that the coupon will be applied to, or that need to be in " -"the cart in order for the %s to be applied." -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:200 -msgid "Exclude attributes" -msgstr "" - -#. translators: Non product type coupon labels -#: includes/class-wc-sc-coupons-by-product-attribute.php:212 -msgid "" -"Product attributes that the coupon will not be applied to, or that cannot be " -"in the cart in order for the %s to be applied." -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:489 -#: includes/class-wc-sc-coupons-by-taxonomy.php:685 -msgid "Sorry, this coupon is not applicable to selected products." -msgstr "" - -#. translators: 1. Singular/plural label for product(s) 2. Excluded product -#. names -#: includes/class-wc-sc-coupons-by-product-attribute.php:523 -#: includes/class-wc-sc-coupons-by-taxonomy.php:714 -msgid "Sorry, this coupon is not applicable to the %1$s: %2$s." -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:523 -#: includes/class-wc-sc-coupons-by-taxonomy.php:714 -msgid "product" -msgid_plural "products" -msgstr[0] "" -msgstr[1] "" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:543 -msgid "Product Attributes" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-attribute.php:544 -msgid "Exclude Attributes" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:107 -msgid "Product quantity based restrictions" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:109 -msgid "Validate quantity of" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:112 -msgid "Cart" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:119 -msgid "Choose whether to validate the quantity, cart-wise or product-wise" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:123 -msgid "Minimum quantity" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:124 -#: includes/class-wc-sc-coupons-by-product-quantity.php:149 -#: includes/class-wc-sc-coupons-by-product-quantity.php:187 -#: includes/class-wc-sc-coupons-by-product-quantity.php:217 -#: includes/class-wc-sc-coupons-by-product-quantity.php:229 -msgid "No minimum" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:127 -msgid "Maximum quantity" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:128 -#: includes/class-wc-sc-coupons-by-product-quantity.php:150 -#: includes/class-wc-sc-coupons-by-product-quantity.php:188 -#: includes/class-wc-sc-coupons-by-product-quantity.php:218 -#: includes/class-wc-sc-coupons-by-product-quantity.php:230 -msgid "No maximum" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:145 -#: includes/class-wc-sc-coupons-by-product-quantity.php:161 -#: includes/class-wc-sc-coupons-by-product-quantity.php:237 -#: includes/class-wc-sc-coupons-by-product-quantity.php:252 -msgid "Products" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:163 -#: includes/class-wc-sc-coupons-by-product-quantity.php:239 -msgid "Please select some products" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:183 -#: includes/class-wc-sc-coupons-by-product-quantity.php:200 -#: includes/class-wc-sc-coupons-by-product-quantity.php:245 -#: includes/class-wc-sc-coupons-by-product-quantity.php:255 -msgid "Categories" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:202 -#: includes/class-wc-sc-coupons-by-product-quantity.php:247 -msgid "Please select some categories" -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:517 -msgid "Your cart does not meet the quantity requirement." -msgstr "" - -#. translators: 1. Number of quantity 2. Singular or plural text based on -#. number of quantities -#: includes/class-wc-sc-coupons-by-product-quantity.php:531 -msgid "Your cart should have a maximum of %1$d %2$s in total." -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:531 -#: includes/class-wc-sc-coupons-by-product-quantity.php:535 -msgid "quantity" -msgid_plural "quantities" -msgstr[0] "" -msgstr[1] "" - -#. translators: 1. Number of quantity 2. Singular or plural text based on -#. number of quantities -#: includes/class-wc-sc-coupons-by-product-quantity.php:535 -msgid "Your cart should have a minimum of %1$d %2$s in total." -msgstr "" - -#: includes/class-wc-sc-coupons-by-product-quantity.php:553 -#: includes/class-wc-sc-coupons-by-product-quantity.php:555 -#: includes/class-wc-sc-coupons-by-product-quantity.php:557 -msgid "Your cart does not meet the product quantity requirement." -msgstr "" - -#: includes/class-wc-sc-coupons-by-shipping-method.php:103 -#: includes/class-wc-sc-coupons-by-shipping-method.php:222 -msgid "Shipping methods" -msgstr "" - -#: includes/class-wc-sc-coupons-by-shipping-method.php:104 -msgid "No shipping methods" -msgstr "" - -#: includes/class-wc-sc-coupons-by-shipping-method.php:114 -msgid "" -"Shipping methods that must be selected during checkout for this coupon to be " -"valid." -msgstr "" - -#: includes/class-wc-sc-coupons-by-shipping-method.php:198 -#: includes/class-wc-sc-coupons-by-shipping-method.php:203 -msgid "This coupon is not valid for selected shipping method." -msgstr "" - -#: includes/class-wc-sc-coupons-by-taxonomy.php:95 -#: includes/class-wc-sc-coupons-by-taxonomy.php:282 -msgid "Include" -msgstr "" - -#: includes/class-wc-sc-coupons-by-taxonomy.php:96 -#: includes/class-wc-sc-coupons-by-taxonomy.php:283 -msgid "Exclude" -msgstr "" - -#: includes/class-wc-sc-coupons-by-taxonomy.php:133 -#: includes/class-wc-sc-coupons-by-taxonomy.php:174 -msgid "Taxonomy" -msgstr "" - -#: includes/class-wc-sc-coupons-by-taxonomy.php:134 -msgid "" -"Product taxonomies that the coupon will be applicable for, or its " -"availability in the cart in order for the \"Fixed cart discount\" to be " -"applied, based on whether the taxonomies are included or excluded. All the " -"taxonomies selected here, should be valid, for this coupon to be valid." -msgstr "" - -#: includes/class-wc-sc-coupons-by-taxonomy.php:138 -#: includes/class-wc-sc-coupons-by-taxonomy.php:211 -msgid "Add taxonomy restriction" -msgstr "" - -#: includes/class-wc-sc-coupons-by-taxonomy.php:175 -msgid "" -"Product taxonomies that the coupon will be applicable for, or its " -"availability in the cart in order for the \"Fixed cart discount\" to be " -"applied, based on whether the taxonomies are included or excluded." -msgstr "" - -#: includes/class-wc-sc-coupons-by-taxonomy.php:211 -msgid "Remove taxonomy restriction" -msgstr "" - -#: includes/class-wc-sc-coupons-by-user-role.php:116 -msgid "Allowed user roles" -msgstr "" - -#: includes/class-wc-sc-coupons-by-user-role.php:117 -#: includes/class-wc-sc-coupons-by-user-role.php:134 -msgid "No user roles" -msgstr "" - -#: includes/class-wc-sc-coupons-by-user-role.php:128 -msgid "" -"Role of the users for whom this coupon is valid. Keep empty if you want this " -"coupon to be valid for users with any role." -msgstr "" - -#: includes/class-wc-sc-coupons-by-user-role.php:133 -msgid "Exclude user roles" -msgstr "" - -#: includes/class-wc-sc-coupons-by-user-role.php:145 -msgid "" -"Role of the users for whom this coupon is not valid. Keep empty if you want " -"this coupon to be valid for users with any role." -msgstr "" - -#: includes/class-wc-sc-coupons-by-user-role.php:221 -#: includes/class-wc-sc-coupons-by-user-role.php:228 -msgid "This coupon is not valid for you." -msgstr "" - -#: includes/class-wc-sc-coupons-by-user-role.php:244 -msgid "User Role" -msgstr "" - -#: includes/class-wc-sc-coupons-by-user-role.php:245 -msgid "Exclude User Role" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:272 -#: includes/class-wc-sc-display-coupons.php:871 -#: includes/class-wc-sc-display-coupons.php:2182 -#: includes/class-wc-sc-shortcode.php:532 -#: includes/class-wc-smart-coupons.php:4201 templates/combined-email.php:125 -#: templates/email.php:123 templates/print-coupons-default.php:138 -msgid " & " -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:274 -#: includes/class-wc-sc-display-coupons.php:873 -#: includes/class-wc-sc-display-coupons.php:2184 -#: includes/class-wc-sc-shortcode.php:534 -#: includes/class-wc-smart-coupons.php:4203 templates/combined-email.php:127 -#: templates/email.php:125 templates/plain/combined-email.php:93 -#: templates/plain/email.php:88 templates/print-coupons-default.php:140 -msgid "Free Shipping" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:291 -#: includes/class-wc-sc-display-coupons.php:887 -#: includes/class-wc-sc-display-coupons.php:2214 -#: includes/class-wc-sc-shortcode.php:564 -#: includes/class-wc-smart-coupons.php:4230 -#: includes/emails/class-wc-sc-email-coupon.php:173 -#: templates/combined-email.php:158 templates/email.php:156 -#: templates/plain/combined-email.php:125 templates/plain/email.php:120 -#: templates/print-coupons-default.php:172 -msgid "Never expires" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:337 -#: includes/class-wc-sc-display-coupons.php:737 -#: includes/class-wc-sc-settings.php:652 includes/class-wc-sc-shortcode.php:635 -msgid "Available Coupons (click on a coupon to use it)" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:535 -msgid "You will get following coupon(s) when you buy this item:" -msgstr "" - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-display-coupons.php:586 -msgid "%s of " -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:586 -msgid "Store Credit of " -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:596 -msgid " discount on your entire purchase" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:601 -#: includes/class-wc-sc-display-coupons.php:610 -#: includes/class-wc-sc-display-coupons.php:619 -msgid "some products" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:603 -#: includes/class-wc-sc-display-coupons.php:612 -msgid "all products" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:605 -#: includes/class-wc-sc-display-coupons.php:614 -msgid " discount on " -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:621 -msgid "your entire purchase" -msgstr "" - -#. translators: %s: Maximum coupon discount amount -#: includes/class-wc-sc-display-coupons.php:627 -#: includes/class-wc-smart-coupons.php:1058 -#: includes/emails/class-wc-sc-email-coupon.php:437 -msgid " upto %s" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:629 -msgid " discount" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:629 -msgid " on " -msgstr "" - -#. translators: 1. Discount type 2. Discount amount -#. translators: 1: coupon type 2: coupon amount -#: includes/class-wc-sc-display-coupons.php:636 -#: includes/emails/class-wc-sc-email-coupon.php:450 -msgid "%1$s coupon of %2$s" -msgstr "" - -#. translators: Add more detail to coupon description -#: includes/class-wc-sc-display-coupons.php:644 -msgid "%s Free Shipping" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:644 -msgid " &" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:726 -#: includes/class-wc-sc-settings.php:620 -#: includes/class-wc-smart-coupons.php:272 -msgid "Select options" -msgstr "" - -#. translators: %s: plural name for store credit -#. translators: %s: Label for store credit -#: includes/class-wc-sc-display-coupons.php:751 -#: includes/class-wc-sc-display-coupons.php:942 -#: includes/class-wc-sc-settings.php:663 -msgid "Available Coupons & %s" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:751 -#: includes/class-wc-sc-display-coupons.php:942 -msgid "Available Coupons & Store Credits" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:927 -#: includes/class-wc-sc-display-coupons.php:983 -msgid "Sorry, No coupons available for you." -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:980 -msgid "" -"List of coupons which are valid & available for use. Click on the coupon to " -"use it. The coupon discount will be visible only when at least one product " -"is present in the cart." -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:1122 -#: templates/combined-email.php:228 templates/email.php:209 -msgid "Print coupon" -msgid_plural "Print coupons" -msgstr[0] "" -msgstr[1] "" - -#: includes/class-wc-sc-display-coupons.php:1187 -msgid "Store Credits" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:1196 -msgid "Total Credit Amount" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:1215 -msgid "Discount Coupons" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:1242 -msgid "Invalid / Used Coupons" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:1243 -msgid "" -"List of coupons which can not be used. The reason can be based on its usage " -"restrictions, usage limits, expiry date." -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:1786 -msgid "Endpoint for the My Account → Coupons page" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:1943 -msgid "Coupon Received" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:1944 -msgid "" -"List of coupons & their details which you have received from the store. " -"Click on the coupon to see the details." -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:1994 -#: includes/class-wc-sc-display-coupons.php:2005 -msgid "Less details" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:1996 -#: includes/class-wc-sc-display-coupons.php:2008 -#: includes/class-wc-sc-display-coupons.php:2111 -msgid "More details" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:2233 -#: includes/class-wc-sc-display-coupons.php:2270 -msgid "Sender" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:2234 -#: includes/class-wc-sc-display-coupons.php:2268 -msgid "Receiver" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:2266 -msgid "Code" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:2267 -msgid "Amount" -msgstr "" - -#: includes/class-wc-sc-display-coupons.php:2359 -msgid "Generated coupons" -msgstr "" - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-order-fields.php:181 -msgid "%s Used" -msgstr "" - -#: includes/class-wc-sc-order-fields.php:181 -msgid "Store Credit Used" -msgstr "" - -#: includes/class-wc-sc-order-fields.php:183 -msgid "This is the total credit used." -msgstr "" - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-order-fields.php:237 -msgid "%s Used:" -msgstr "" - -#: includes/class-wc-sc-order-fields.php:237 -msgid "Store Credit Used:" -msgstr "" - -#: includes/class-wc-sc-order-fields.php:303 -msgid "Store Credit:" -msgstr "" - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-order-fields.php:463 -msgid "%s Balance " -msgstr "" - -#: includes/class-wc-sc-order-fields.php:463 -msgid "Store Credit / Gift Card Balance" -msgstr "" - -#: includes/class-wc-sc-print-coupon.php:123 -msgctxt "Page slug" -msgid "wc-sc-coupons-terms" -msgstr "" - -#: includes/class-wc-sc-print-coupon.php:124 -msgctxt "Page title" -msgid "Smart Coupons Terms" -msgstr "" - -#: includes/class-wc-sc-print-coupon.php:278 -msgid "" -"Smart Coupons has created a coupon's terms page (used during coupon " -"printing) for you. Please edit it as required from" -msgstr "" - -#: includes/class-wc-sc-print-coupon.php:420 -msgid "Used during coupon printing" -msgstr "" - -#. translators: Plugin's name -#: includes/class-wc-sc-privacy.php:51 -msgid "%s - Coupon Personal Data Exporter" -msgstr "" - -#. translators: Plugin's name -#: includes/class-wc-sc-privacy.php:53 -msgid "%s - Coupon Personal Data Eraser" -msgstr "" - -#. translators: Plugin's name -#: includes/class-wc-sc-privacy.php:56 -msgid "%s - Order Personal Data Exporter" -msgstr "" - -#. translators: Plugin's name -#: includes/class-wc-sc-privacy.php:58 -msgid "%s - Order Personal Data Eraser" -msgstr "" - -#. translators: Plugin's name -#: includes/class-wc-sc-privacy.php:61 -msgid "%s - User Personal Data Exporter" -msgstr "" - -#. translators: Plugin's name -#: includes/class-wc-sc-privacy.php:63 -msgid "%s - User Personal Data Eraser" -msgstr "" - -#: includes/class-wc-sc-privacy.php:112 includes/class-wc-sc-privacy.php:324 -#: includes/class-wc-sc-privacy.php:443 includes/class-wc-sc-privacy.php:690 -msgid "Store Credit/Gift Certificate" -msgstr "" - -#: includes/class-wc-sc-privacy.php:113 -msgid "What we access?" -msgstr "" - -#: includes/class-wc-sc-privacy.php:115 -msgid "" -"If you are logged in: We access your billing email address saved in your " -"account & billing email address entered during purchase" -msgstr "" - -#: includes/class-wc-sc-privacy.php:116 -msgid "" -"If you are a visitor: We access your billing email address entered during " -"purchase" -msgstr "" - -#: includes/class-wc-sc-privacy.php:118 -msgid "What we store & why?" -msgstr "" - -#: includes/class-wc-sc-privacy.php:120 -msgid "Coupon code generated for you" -msgstr "" - -#: includes/class-wc-sc-privacy.php:121 -msgid "Coupon code passed via URL" -msgstr "" - -#: includes/class-wc-sc-privacy.php:122 -msgid "Coupon amount, email & message entered for gift card receiver" -msgstr "" - -#: includes/class-wc-sc-privacy.php:124 -msgid "" -"We store these data so that we can process it for you whenever required." -msgstr "" - -#: includes/class-wc-sc-privacy.php:247 -msgid "Store Credit/Gift Certificate - Coupon Data" -msgstr "" - -#: includes/class-wc-sc-privacy.php:324 -msgid "Removed Coupon Personal Data" -msgstr "" - -#: includes/class-wc-sc-privacy.php:384 includes/class-wc-sc-privacy.php:396 -#: includes/emails/class-wc-sc-acknowledgement-email.php:340 -#: templates/acknowledgement-email.php:66 templates/coupon-design/basic.php:39 -#: templates/coupon-design/clipper.php:38 templates/coupon-design/cutout.php:55 -#: templates/coupon-design/deal.php:29 templates/coupon-design/deliver.php:34 -#: templates/coupon-design/shipment.php:33 -#: templates/coupon-design/special.php:58 templates/coupon-design/ticket.php:40 -#: templates/plain/acknowledgement-email.php:56 -msgid "Coupon" -msgstr "" - -#: includes/class-wc-sc-privacy.php:390 -msgid "Generated Coupon Data" -msgstr "" - -#: includes/class-wc-sc-privacy.php:401 -msgid "Coupon passed in URL" -msgstr "" - -#: includes/class-wc-sc-privacy.php:443 -msgid "Removed User Personal Data" -msgstr "" - -#: includes/class-wc-sc-privacy.php:568 -#: includes/class-wc-smart-coupons.php:4305 -msgid "Coupon Code" -msgstr "" - -#: includes/class-wc-sc-privacy.php:571 -#: includes/class-wc-smart-coupons.php:4317 -msgid "Coupon Amount" -msgstr "" - -#: includes/class-wc-sc-privacy.php:574 -msgid "Coupon For" -msgstr "" - -#: includes/class-wc-sc-privacy.php:587 -msgid "Store Credit/Gift Certificate - Order Data" -msgstr "" - -#: includes/class-wc-sc-privacy.php:690 -msgid "Removed Order Personal Data" -msgstr "" - -#: includes/class-wc-sc-privacy.php:764 -msgid "Retain Store Credit/Gift Certificate" -msgstr "" - -#: includes/class-wc-sc-privacy.php:765 -msgid "" -"Store Credit/Gift Certificate that are stored for customers via coupons. If " -"erased, the customer will not be able to use the coupons." -msgstr "" - -#: includes/class-wc-sc-privacy.php:768 -msgid "N/A" -msgstr "" - -#: includes/class-wc-sc-product-fields.php:100 -#: includes/class-wc-sc-product-fields.php:161 -msgid "Search for a coupon…" -msgstr "" - -#. translators: 1. Discount type 2. Discount Type Label -#: includes/class-wc-sc-product-fields.php:114 -#: includes/class-wc-sc-product-fields.php:175 -msgid " ( %1$s: %2$s )" -msgstr "" - -#: includes/class-wc-sc-product-fields.php:123 -#: includes/class-wc-sc-product-fields.php:160 -msgid "" -"These coupon/s will be given to customers who buy this product. The coupon " -"code will be automatically sent to their email address on purchase." -msgstr "" - -#: includes/class-wc-sc-product-fields.php:127 -#: includes/class-wc-sc-product-fields.php:186 -msgid "Send coupons on renewals?" -msgstr "" - -#: includes/class-wc-sc-product-fields.php:129 -#: includes/class-wc-sc-product-fields.php:185 -msgid "Check this box to send above coupons on each renewal order." -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:157 -msgid "Enter a numeric value." -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:160 -msgid "The value should not be less than" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:162 -msgid "The value should not be greater than" -msgstr "" - -#. translators: %s: singular name for store credit -#: includes/class-wc-sc-purchase-credit.php:217 -msgid "Purchase %s worth" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:217 -#: includes/class-wc-sc-settings.php:632 -msgid "Purchase credit worth" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:532 -msgid "Now" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:542 -msgid "Later" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:741 -#: includes/class-wc-sc-settings.php:692 -msgid "Send Coupons to..." -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:753 -msgid "" -"Your order contains coupons. You will receive them after completion of this " -"order." -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:764 -msgid "Your order contains coupons. What would you like to do?" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:766 -msgid "Send to me" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:768 -msgid "Gift to someone else" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:770 -msgid "Send to one person" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:771 -msgid "Send to different people" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:775 -msgid "Deliver coupon" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:808 -#: includes/class-wc-sc-purchase-credit.php:916 -msgid "Enter recipient e-mail address" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:811 -#: includes/class-wc-sc-purchase-credit.php:921 -msgid "Pick a delivery date & time" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:815 -#: includes/class-wc-sc-purchase-credit.php:927 -msgid "Write a message" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:906 -msgid "Free Shipping coupon" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:915 -msgid "of" -msgstr "" - -#: includes/class-wc-sc-purchase-credit.php:1227 -#: includes/compat/class-wc-sc-kco-compatibility.php:123 -msgid "Failed to update coupon receiver details in session." -msgstr "" - -#. translators: %s: field name -#: includes/class-wc-sc-purchase-credit.php:1329 -msgid "Coupon delivery date and time is a required field." -msgstr "" - -#: includes/class-wc-sc-rest-coupons-controller.php:147 -msgid "The coupon code already exists" -msgstr "" - -#: includes/class-wc-sc-settings.php:94 -msgid "Smart Coupons" -msgstr "" - -#: includes/class-wc-sc-settings.php:209 includes/class-wc-sc-shortcode.php:856 -msgid "Preview" -msgstr "" - -#: includes/class-wc-sc-settings.php:211 -msgid "See coupon search limitations" -msgstr "" - -#: includes/class-wc-sc-settings.php:301 -#: includes/compat/class-wcs-sc-compatibility.php:910 -msgid "store credit" -msgstr "" - -#: includes/class-wc-sc-settings.php:302 includes/class-wc-sc-settings.php:886 -msgid "store credits" -msgstr "" - -#: includes/class-wc-sc-settings.php:347 -msgid "" -"Set up Smart Coupons the way you like. Use these options to configure/change " -"the way Smart Coupons works." -msgstr "" - -#: includes/class-wc-sc-settings.php:351 -msgid "Colors" -msgstr "" - -#: includes/class-wc-sc-settings.php:355 -msgid "Choose a color scheme for coupons." -msgstr "" - -#: includes/class-wc-sc-settings.php:359 -msgid "Amaranth red" -msgstr "" - -#: includes/class-wc-sc-settings.php:360 -msgid "Carolina Blue" -msgstr "" - -#: includes/class-wc-sc-settings.php:361 -msgid "Keppel" -msgstr "" - -#: includes/class-wc-sc-settings.php:362 -msgid "McDonald" -msgstr "" - -#: includes/class-wc-sc-settings.php:363 -msgid "Gold" -msgstr "" - -#: includes/class-wc-sc-settings.php:364 -msgid "Majorelle Blue" -msgstr "" - -#: includes/class-wc-sc-settings.php:365 -msgid "Rose Pink" -msgstr "" - -#: includes/class-wc-sc-settings.php:366 -msgid "Vintage" -msgstr "" - -#: includes/class-wc-sc-settings.php:367 -msgid "Spanish Orange" -msgstr "" - -#: includes/class-wc-sc-settings.php:368 -msgid "Chocolate" -msgstr "" - -#: includes/class-wc-sc-settings.php:369 -msgid "Ocean" -msgstr "" - -#: includes/class-wc-sc-settings.php:376 -msgid "Customize colors" -msgstr "" - -#: includes/class-wc-sc-settings.php:380 -msgid "Customize color scheme for coupons." -msgstr "" - -#: includes/class-wc-sc-settings.php:384 -msgid "Custom colors" -msgstr "" - -#: includes/class-wc-sc-settings.php:391 -msgid "Styles" -msgstr "" - -#: includes/class-wc-sc-settings.php:395 -msgid "Choose a style for coupon on the website." -msgstr "" - -#: includes/class-wc-sc-settings.php:399 -msgid "Flat" -msgstr "" - -#: includes/class-wc-sc-settings.php:400 -msgid "Promotion" -msgstr "" - -#: includes/class-wc-sc-settings.php:401 -msgid "Ticket" -msgstr "" - -#: includes/class-wc-sc-settings.php:402 -msgid "Festive" -msgstr "" - -#: includes/class-wc-sc-settings.php:403 -msgid "Special" -msgstr "" - -#: includes/class-wc-sc-settings.php:404 -msgid "Shipment" -msgstr "" - -#: includes/class-wc-sc-settings.php:405 -msgid "Cutout" -msgstr "" - -#: includes/class-wc-sc-settings.php:406 -msgid "Deliver" -msgstr "" - -#: includes/class-wc-sc-settings.php:407 -msgid "Clipper" -msgstr "" - -#: includes/class-wc-sc-settings.php:408 -msgid "Basic" -msgstr "" - -#: includes/class-wc-sc-settings.php:409 -msgid "Deal" -msgstr "" - -#: includes/class-wc-sc-settings.php:416 -msgid "Style for email" -msgstr "" - -#: includes/class-wc-sc-settings.php:420 -msgid "Style for coupon in email." -msgstr "" - -#: includes/class-wc-sc-settings.php:424 -msgid "Email coupon" -msgstr "" - -#: includes/class-wc-sc-settings.php:431 -#: includes/class-wc-smart-coupons.php:5146 -msgid "Number of coupons to show" -msgstr "" - -#: includes/class-wc-sc-settings.php:432 -msgid "" -"How many coupons (at max) should be shown on cart, checkout & my account " -"page? If set to 0 (zero) then coupons will not be displayed at all on the " -"website." -msgstr "" - -#: includes/class-wc-sc-settings.php:440 -#: includes/class-wc-smart-coupons.php:5147 -msgid "Number of characters in auto-generated coupon code" -msgstr "" - -#: includes/class-wc-sc-settings.php:441 -msgid "" -"Number of characters in auto-generated coupon code will be restricted to " -"this number excluding prefix and/or suffix. The default length will be 13. " -"It is recommended to keep this number between 10 to 15 to avoid coupon code " -"duplication." -msgstr "" - -#: includes/class-wc-sc-settings.php:455 -#: includes/class-wc-smart-coupons.php:5148 -msgid "Valid order status for auto-generating coupon" -msgstr "" - -#: includes/class-wc-sc-settings.php:456 -msgid "" -"Choose order status which will trigger the auto-generation of coupon, if the " -"order contains product which will generate the coupon." -msgstr "" - -#: includes/class-wc-sc-settings.php:465 -msgid "Select order status…" -msgstr "" - -#: includes/class-wc-sc-settings.php:470 -msgid "Enable store notice for the coupon" -msgstr "" - -#: includes/class-wc-sc-settings.php:474 -msgid "" -"Search & select a coupon which you want to display as store notice. The " -"selected coupon's description will be displayed along with the coupon code " -"(if it is set) otherwise, a description will be generated automatically. To " -"disable the feature, keep this field empty." -msgstr "" - -#: includes/class-wc-sc-settings.php:480 -msgid "Search for a coupon..." -msgstr "" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:489 -msgid "Generated %s amount" -msgstr "" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:491 -msgid "Include tax in the amount of the generated %s" -msgstr "" - -#: includes/class-wc-sc-settings.php:499 -msgid "Displaying coupons" -msgstr "" - -#. translators: %s: Preview link -#: includes/class-wc-sc-settings.php:501 -msgid "" -"Include coupon details on product's page, for products that issue coupons %s" -msgstr "" - -#: includes/class-wc-sc-settings.php:501 includes/class-wc-sc-settings.php:510 -#: includes/class-wc-sc-settings.php:519 includes/class-wc-sc-settings.php:528 -#: includes/class-wc-sc-settings.php:537 includes/class-wc-sc-settings.php:615 -#: includes/class-wc-sc-settings.php:627 includes/class-wc-sc-settings.php:638 -#: includes/class-wc-sc-settings.php:648 includes/class-wc-sc-settings.php:658 -#: includes/class-wc-sc-settings.php:679 includes/class-wc-sc-settings.php:688 -#: includes/class-wc-sc-settings.php:698 includes/class-wc-sc-settings.php:707 -msgid "[Preview]" -msgstr "" - -#. translators: %s: Preview link -#: includes/class-wc-sc-settings.php:510 -msgid "" -"Show coupons available to customers on their My Account > Coupons page %s" -msgstr "" - -#. translators: %s: Preview link -#: includes/class-wc-sc-settings.php:519 -msgid "" -"Include coupons received from other people on My Account > Coupons page %s" -msgstr "" - -#. translators: %s: Preview link -#: includes/class-wc-sc-settings.php:528 -msgid "Show invalid or used coupons in My Account > Coupons %s" -msgstr "" - -#. translators: %s: Preview link -#: includes/class-wc-sc-settings.php:537 -msgid "" -"Display coupon description along with coupon code (on site as well as in " -"emails) %s" -msgstr "" - -#: includes/class-wc-sc-settings.php:545 -#: includes/class-wc-smart-coupons.php:5152 -msgid "Automatic deletion" -msgstr "" - -#. translators: %s: Note for admin -#: includes/class-wc-sc-settings.php:547 -msgid "Delete the %1$s when entire credit amount is used up %2$s" -msgstr "" - -#: includes/class-wc-sc-settings.php:547 -msgid "(Note: It's recommended to keep it Disabled)" -msgstr "" - -#: includes/class-wc-sc-settings.php:555 -#: includes/class-wc-smart-coupons.php:5153 -msgid "Coupon emails" -msgstr "" - -#: includes/class-wc-sc-settings.php:556 -msgid "Email auto generated coupons to recipients" -msgstr "" - -#: includes/class-wc-sc-settings.php:564 -#: includes/class-wc-smart-coupons.php:5154 -msgid "Printing coupons" -msgstr "" - -#: includes/class-wc-sc-settings.php:565 -msgid "Enable feature to allow printing of coupons" -msgstr "" - -#: includes/class-wc-sc-settings.php:565 includes/class-wc-sc-settings.php:576 -#: includes/class-wc-sc-settings.php:596 -msgid "[Read More]" -msgstr "" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:574 -msgid "Sell %s at less price?" -msgstr "" - -#. translators: %s: Label for store credit, 1: : Label for store credit, 2: -#. Label for store credit, 3: Label for store credit -#: includes/class-wc-sc-settings.php:576 -msgid "Allow selling %s at discounted price" -msgstr "" - -#: includes/class-wc-sc-settings.php:576 -msgid "" -"When selling %1$s, if Regular and Sale price is found for the product, then " -"coupon will be created with product's Regular Price but customer will pay " -"product's Sale price. This setting will also make sure if any discount " -"coupon is applied on the %2$s while purchasing, then customer will get %3$s " -"in their picked price" -msgstr "" - -#: includes/class-wc-sc-settings.php:589 -msgid "Labels" -msgstr "" - -#: includes/class-wc-sc-settings.php:591 -msgid "" -"Call it something else! Use these to quickly change text labels through your " -"store. Use translations for " -"complete control." -msgstr "" - -#: includes/class-wc-sc-settings.php:599 -msgid "Singular name" -msgstr "" - -#: includes/class-wc-sc-settings.php:600 -msgid "" -"Give alternate singular name to Store Credit / Gift Certificate. This label " -"will only rename Store Credit / Gift Certificate used in the Smart Coupons " -"plugin." -msgstr "" - -#: includes/class-wc-sc-settings.php:607 -msgid "Give plural name for the above singular name." -msgstr "" - -#: includes/class-wc-sc-settings.php:608 -msgid "Plural name" -msgstr "" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:614 -msgid "%s product CTA" -msgstr "" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:619 -msgid "" -"This is what will be shown instead of \"Add to Cart\" for products that sell " -"%s." -msgstr "" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:626 -msgid "While purchasing %s" -msgstr "" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:631 -msgid "" -"When you opt to allow people to buy %s of any amount, this label will be " -"used." -msgstr "" - -#: includes/class-wc-sc-settings.php:637 -msgid "\"Coupons with Product\" description" -msgstr "" - -#: includes/class-wc-sc-settings.php:641 -msgid "" -"This is the heading above coupon details displayed on products that issue " -"coupons." -msgstr "" - -#: includes/class-wc-sc-settings.php:642 -msgid "You will get following coupon(s) when you buy this item" -msgstr "" - -#: includes/class-wc-sc-settings.php:647 -msgid "On Cart/Checkout pages" -msgstr "" - -#: includes/class-wc-sc-settings.php:651 -msgid "" -"This is the title for the list of available coupons, shown on Cart and " -"Checkout pages." -msgstr "" - -#: includes/class-wc-sc-settings.php:657 -msgid "My Account page" -msgstr "" - -#: includes/class-wc-sc-settings.php:661 -msgid "Title of available coupons list on My Account page." -msgstr "" - -#: includes/class-wc-sc-settings.php:672 -msgid "Coupon Receiver Details during Checkout" -msgstr "" - -#: includes/class-wc-sc-settings.php:674 -msgid "" -"Buyers can send purchased coupons to anyone – right while they're checking " -"out." -msgstr "" - -#: includes/class-wc-sc-settings.php:678 -#: includes/class-wc-smart-coupons.php:5158 -msgid "Allow sending of coupons to others" -msgstr "" - -#: includes/class-wc-sc-settings.php:679 -msgid "Allow the buyer to send coupons to someone else." -msgstr "" - -#: includes/class-wc-sc-settings.php:687 -msgid "Title" -msgstr "" - -#: includes/class-wc-sc-settings.php:691 -msgid "The title for coupon receiver details block." -msgstr "" - -#: includes/class-wc-sc-settings.php:697 -msgid "Description" -msgstr "" - -#: includes/class-wc-sc-settings.php:701 -msgid "Additional text below the title." -msgstr "" - -#: includes/class-wc-sc-settings.php:706 -#: includes/class-wc-smart-coupons.php:5159 -msgid "Allow schedule sending of coupons?" -msgstr "" - -#: includes/class-wc-sc-settings.php:707 -msgid "" -"Enable this to allow buyers to select date & time for delivering the coupon." -msgstr "" - -#: includes/class-wc-sc-settings.php:707 -msgid "" -"The coupons will be sent to the recipients via email on the selected date & " -"time" -msgstr "" - -#: includes/class-wc-sc-settings.php:716 -#: includes/class-wc-smart-coupons.php:5160 -msgid "Combine emails" -msgstr "" - -#: includes/class-wc-sc-settings.php:717 -msgid "" -"Send only one email instead of multiple emails when multiple coupons are " -"generated for same recipient" -msgstr "" - -#: includes/class-wc-sc-settings.php:731 -msgid "Apply before tax" -msgstr "" - -#: includes/class-wc-sc-settings.php:732 -#: includes/class-wc-smart-coupons.php:5150 -msgid "Deduct credit/gift before doing tax calculations" -msgstr "" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:746 -msgid "%s include tax?" -msgstr "" - -#. translators: %s: Label for store credit -#: includes/class-wc-sc-settings.php:748 -msgid "%s discount is inclusive of tax" -msgstr "" - -#. translators: 1: plugin name 2: page based text 3: Label for store credit 4: -#. Hide notice text -#: includes/class-wc-sc-settings.php:893 includes/class-wc-sc-settings.php:896 -msgid "%1$s: %2$s to avoid issues related to missing data for %3$s. %4$s" -msgstr "" - -#: includes/class-wc-sc-settings.php:893 -msgid "Uncheck" -msgstr "" - -#: includes/class-wc-sc-settings.php:893 -msgid "Delete Gift / Credit, when credit is used up" -msgstr "" - -#: includes/class-wc-sc-settings.php:893 includes/class-wc-sc-settings.php:896 -msgid "Setting" -msgstr "" - -#: includes/class-wc-sc-settings.php:893 includes/class-wc-sc-settings.php:896 -msgid "Hide this notice" -msgstr "" - -#: includes/class-wc-sc-settings.php:896 -msgid "Important setting" -msgstr "" - -#: includes/class-wc-sc-settings.php:1042 -msgid "Hurry. Going fast! On the entire range of products." -msgstr "" - -#: includes/class-wc-sc-shortcode.php:599 templates/combined-email.php:195 -#: templates/email.php:182 -msgid "Click to visit store. This coupon will be applied automatically." -msgstr "" - -#: includes/class-wc-sc-shortcode.php:769 -#: includes/class-wc-sc-shortcode.php:810 -#: includes/class-wc-sc-shortcode.php:847 -msgid "No search term specified." -msgstr "" - -#: includes/class-wc-sc-shortcode.php:773 -msgid "Enter more than one character to search." -msgstr "" - -#: includes/class-wc-sc-shortcode.php:789 -msgid "Click to select coupon code." -msgstr "" - -#: includes/class-wc-sc-shortcode.php:791 -msgid "No coupon code found." -msgstr "" - -#: includes/class-wc-sc-shortcode.php:843 -msgid "Coupon code" -msgstr "" - -#: includes/class-wc-sc-shortcode.php:843 -msgid "Search coupon..." -msgstr "" - -#: includes/class-wc-sc-shortcode.php:905 -msgid "Insert Shortcode" -msgstr "" - -#: includes/class-wc-sc-shortcode.php:908 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:134 -msgid "Cancel" -msgstr "" - -#. translators: %s: $coupon_code coupon code -#: includes/class-wc-sc-url-coupon.php:287 -msgid "" -"Coupon code \"%s\" applied successfully. Please add some products to the " -"cart to see the discount." -msgstr "" - -#. translators: %s: $coupon_code coupon code -#: includes/class-wc-sc-url-coupon.php:291 -msgid "" -"Coupon code \"%s\" already applied! Please add some products to the cart to " -"see the discount." -msgstr "" - -#: includes/class-wc-smart-coupons.php:67 -msgid "Cheatin’ huh?" -msgstr "" - -#: includes/class-wc-smart-coupons.php:867 -msgid "" -"This coupon has pending emails to be sent. Deleting it will delete those " -"emails also. Are you sure to delete this coupon?" -msgstr "" - -#: includes/class-wc-smart-coupons.php:876 -msgid "An error has occurred. Please try again later." -msgstr "" - -#. translators: Formatted minimum amount -#: includes/class-wc-smart-coupons.php:1121 -msgid "Spend at least %s" -msgstr "" - -#. translators: Formatted maximum amount -#: includes/class-wc-smart-coupons.php:1125 -msgid "Spend up to %s" -msgstr "" - -#. translators: Formatted maximum amount -#: includes/class-wc-smart-coupons.php:1129 -msgid "Not valid for sale items" -msgstr "" - -#. translators: Product names -#: includes/class-wc-smart-coupons.php:1135 -msgid "Valid for %s" -msgstr "" - -#. translators: Excluded product names -#: includes/class-wc-smart-coupons.php:1141 -msgid "Not valid for %s" -msgstr "" - -#. translators: 1: The category names -#: includes/class-wc-smart-coupons.php:1148 -msgid "Valid for category %s" -msgid_plural "Valid for categories %s" -msgstr[0] "" -msgstr[1] "" - -#. translators: 1: The category names excluded -#: includes/class-wc-smart-coupons.php:1155 -msgid "Not valid for category %s" -msgid_plural "Not valid for categories %s" -msgstr[0] "" -msgstr[1] "" - -#. translators: 1: The expiry date -#: includes/class-wc-smart-coupons.php:1168 -msgid "Expiry: %s" -msgstr "" - -#: includes/class-wc-smart-coupons.php:1177 -msgid "Valid on entire range of products. Buy anything in the store." -msgstr "" - -#: includes/class-wc-smart-coupons.php:1493 -msgid "Great News!" -msgstr "" - -#: includes/class-wc-smart-coupons.php:1494 -msgid "Super Savings!" -msgstr "" - -#: includes/class-wc-smart-coupons.php:1495 -msgid "Ending Soon!" -msgstr "" - -#: includes/class-wc-smart-coupons.php:1496 -msgid "Limited Time Offer!" -msgstr "" - -#: includes/class-wc-smart-coupons.php:1497 -msgid "This Week Only!" -msgstr "" - -#: includes/class-wc-smart-coupons.php:1498 -msgid "Attention!" -msgstr "" - -#: includes/class-wc-smart-coupons.php:1499 -msgid "You don't want to miss this..." -msgstr "" - -#: includes/class-wc-smart-coupons.php:1500 -msgid "This will be over soon! Hurry." -msgstr "" - -#: includes/class-wc-smart-coupons.php:1501 -msgid "Act before the offer expires." -msgstr "" - -#: includes/class-wc-smart-coupons.php:1502 -msgid "Don't Miss Out." -msgstr "" - -#. translators: 1. The discount text -#: includes/class-wc-smart-coupons.php:1507 -msgid "%s discount on anything you want." -msgstr "" - -#. translators: 1. The discount text -#: includes/class-wc-smart-coupons.php:1509 -msgid "%s discount on entire store." -msgstr "" - -#. translators: 1. The discount text -#: includes/class-wc-smart-coupons.php:1511 -msgid "Pick any item today for %s off." -msgstr "" - -#. translators: 1. The discount text -#: includes/class-wc-smart-coupons.php:1513 -msgid "Buy as much as you want. Flat %s off everything." -msgstr "" - -#. translators: 1. The discount text -#: includes/class-wc-smart-coupons.php:1515 -msgid "Flat %s discount on everything today." -msgstr "" - -#: includes/class-wc-smart-coupons.php:1527 -msgid "Use code" -msgstr "" - -#. translators: 1. The coupon code -#: includes/class-wc-smart-coupons.php:1544 -msgid "Use code: %s" -msgstr "" - -#: includes/class-wc-smart-coupons.php:2634 -msgid "WooCommerce Smart Coupons Cache" -msgstr "" - -#: includes/class-wc-smart-coupons.php:2635 -msgid "Clear Smart Coupons Cache" -msgstr "" - -#: includes/class-wc-smart-coupons.php:2636 -msgid "This tool will clear the cache created by WooCommerce Smart Coupons." -msgstr "" - -#. translators: The coupon code -#: includes/class-wc-smart-coupons.php:2679 -msgid "Coupon %s is valid for a new user only, hence removed." -msgstr "" - -#. translators: The coupon code -#: includes/class-wc-smart-coupons.php:2738 -msgid "Coupon removed. There is no credit remaining in %s." -msgstr "" - -#: includes/class-wc-smart-coupons.php:2776 -msgid "This coupon is valid for the first order only." -msgstr "" - -#: includes/class-wc-smart-coupons.php:3538 -msgid "Filter by category" -msgstr "" - -#: includes/class-wc-smart-coupons.php:3558 -msgid "Please select at least one coupon to print." -msgstr "" - -#: includes/class-wc-smart-coupons.php:3573 -msgid "Print selected coupons" -msgstr "" - -#: includes/class-wc-smart-coupons.php:3573 -msgid "Print" -msgstr "" - -#: includes/class-wc-smart-coupons.php:3954 -msgid "Coupon Validity" -msgstr "" - -#: includes/class-wc-smart-coupons.php:3955 -msgid "Validity Suffix" -msgstr "" - -#: includes/class-wc-smart-coupons.php:3956 -msgid "Auto Generate Coupon" -msgstr "" - -#: includes/class-wc-smart-coupons.php:3957 -msgid "Coupon Title Prefix" -msgstr "" - -#: includes/class-wc-smart-coupons.php:3958 -msgid "Coupon Title Suffix" -msgstr "" - -#: includes/class-wc-smart-coupons.php:3959 -msgid "Is Pick Price of Product" -msgstr "" - -#: includes/class-wc-smart-coupons.php:3960 -msgid "Disable Email Restriction" -msgstr "" - -#: includes/class-wc-smart-coupons.php:3961 -msgid "Coupon Is Visible Storewide" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4306 -msgid "Post Excerpt" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4307 -msgid "Post Status" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4308 -msgid "Post Parent" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4309 -msgid "Menu Order" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4310 -msgid "Post Date" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4316 -msgid "Discount Type" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4318 -msgid "Free shipping" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4319 -msgid "Expiry date" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4320 -msgid "Minimum Spend" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4321 -msgid "Maximum Spend" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4322 -msgid "Individual USe" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4323 -msgid "Exclude Sale Items" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4324 -msgid "Product IDs" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4325 -msgid "Exclude product IDs" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4326 -msgid "Product categories" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4327 -msgid "Exclude Product categories" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4328 -msgid "Customer Email" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4329 -msgid "Usage Limit" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4330 -msgid "Usage Limit Per User" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4331 -msgid "Limit Usage to X Items" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4332 -msgid "Usage Count" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4333 -msgid "Used By" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4339 -msgid "Coupon Category" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4450 -msgctxt "enhanced select" -msgid "Loading failed" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4588 -msgid "Style 1" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4589 -msgid "Style 2" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4590 -msgid "Style 3" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4591 -msgid "Style 4" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4592 -msgid "Style 5" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4593 -msgid "Style 6" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4594 -msgid "Custom Style" -msgstr "" - -#. translators: File path -#: includes/class-wc-smart-coupons.php:4625 -#: includes/class-wc-smart-coupons.php:4633 -msgid "File not found %s" -msgstr "" - -#: includes/class-wc-smart-coupons.php:4717 -msgid "is active but it will only work with WooCommerce 3.0.0+." -msgstr "" - -#: includes/class-wc-smart-coupons.php:4717 -msgid "Please update WooCommerce to the latest version" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5149 -msgid "Include tax in the amount of the generated gift card" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5151 -msgid "Gift Card discount is inclusive of tax" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5155 -msgid "Sell gift cards at less price?" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5156 -msgid "" -"Use gift card applied in first subscription order for subsequent renewals " -"until credit reaches zero" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5157 -#: includes/compat/class-wcs-sc-compatibility.php:924 -msgid "" -"Renewal orders should not generate coupons even when they include a product " -"that issues coupons" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5161 -msgid "Auto generated coupon email" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5162 -msgid "Combined auto generated coupons email" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5163 -msgid "Acknowledgement email" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5164 -msgid "Enable taxes" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5165 -msgid "Prices entered with tax" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5166 -msgid "Rounding" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5167 -msgid "Display prices in the shop" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5168 -msgid "Display prices during cart and checkout" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5169 -msgid "Display tax totals" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5170 -msgid "Enable the use of coupon codes" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5171 -msgid "Calculate coupon discounts sequentially" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5172 -msgid "Account endpoints > Coupons" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5179 -msgid "Smart Coupons related settings" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5179 -msgid "" -"This section shows settings that affects Smart Coupons' functionalities." -msgstr "" - -#: includes/class-wc-smart-coupons.php:5268 -msgid "$coupon is not an object of WC_Coupon" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5270 -msgid "$coupon is: " -msgstr "" - -#: includes/class-wc-smart-coupons.php:5369 -#: includes/class-wc-smart-coupons.php:5485 -#: includes/class-wc-smart-coupons.php:5600 -msgid "Some values required for $post_id & $meta_key" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5371 -#: includes/class-wc-smart-coupons.php:5487 -#: includes/class-wc-smart-coupons.php:5602 -msgid "$post_id is: " -msgstr "" - -#: includes/class-wc-smart-coupons.php:5372 -#: includes/class-wc-smart-coupons.php:5488 -#: includes/class-wc-smart-coupons.php:5603 -msgid "$meta_key is: " -msgstr "" - -#: includes/class-wc-smart-coupons.php:5645 -#: includes/class-wc-smart-coupons.php:5701 -msgid "$key is required" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5647 -#: includes/class-wc-smart-coupons.php:5703 -msgid "$key is: " -msgstr "" - -#: includes/class-wc-smart-coupons.php:5759 -#: includes/class-wc-smart-coupons.php:5814 -#: includes/class-wc-smart-coupons.php:5844 -#: includes/class-wc-smart-coupons.php:5869 -msgid "Some values required for $item_id & $item_key" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5761 -#: includes/class-wc-smart-coupons.php:5816 -#: includes/class-wc-smart-coupons.php:5846 -#: includes/class-wc-smart-coupons.php:5871 -#: includes/class-wc-smart-coupons.php:6013 -msgid "$item_id is: " -msgstr "" - -#: includes/class-wc-smart-coupons.php:5762 -#: includes/class-wc-smart-coupons.php:5817 -#: includes/class-wc-smart-coupons.php:5847 -#: includes/class-wc-smart-coupons.php:5872 -msgid "$item_key is: " -msgstr "" - -#: includes/class-wc-smart-coupons.php:5898 -#: includes/class-wc-smart-coupons.php:5947 -msgid "$item is not an object of WC_Order_Item" -msgstr "" - -#: includes/class-wc-smart-coupons.php:5900 -#: includes/class-wc-smart-coupons.php:5949 -msgid "$item is: " -msgstr "" - -#: includes/class-wc-smart-coupons.php:6011 -msgid "$item_id is required" -msgstr "" - -#. translators: %s: singular name for store credit -#: includes/compat/class-wcs-sc-compatibility.php:857 -msgid "Order paid by %s" -msgstr "" - -#: includes/compat/class-wcs-sc-compatibility.php:857 -msgid "Order paid by store credit." -msgstr "" - -#: includes/compat/class-wcs-sc-compatibility.php:914 -msgid "Recurring subscriptions" -msgstr "" - -#. translators: %s: Label for store credit -#: includes/compat/class-wcs-sc-compatibility.php:916 -msgid "" -"Use %s applied in first subscription order for subsequent renewals until " -"credit reaches zero" -msgstr "" - -#: includes/compat/class-wcs-sc-compatibility.php:1035 -msgid "Active for x payments" -msgstr "" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:41 -msgid "Smart Coupons - Acknowledgement email" -msgstr "" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:42 -msgid "Send an acknowledgement email to the purchaser. One email per customer." -msgstr "" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:68 -msgid "{site_title}: {coupon_type} sent successfully" -msgstr "" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:77 -msgid "{coupon_type} sent successfully" -msgstr "" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:86 -msgid "{site_title}: {coupon_type} has been successfully scheduled" -msgstr "" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:95 -msgid "{coupon_type} has been successfully scheduled" -msgstr "" - -#. translators: %s: list of placeholders -#: includes/emails/class-wc-sc-acknowledgement-email.php:104 -msgid "" -"This will be used when the setting \"WooCommerce > Settings > Smart Coupons " -"> Allow schedule sending of coupons?\" is enabled. Available placeholders: " -"%s." -msgstr "" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:108 -msgid "Scheduled email subject" -msgstr "" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:116 -msgid "Scheduled email heading" -msgstr "" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:334 -#: templates/acknowledgement-email.php:61 -#: templates/plain/acknowledgement-email.php:51 -msgid "Gift card" -msgstr "" - -#: includes/emails/class-wc-sc-acknowledgement-email.php:335 -#: templates/acknowledgement-email.php:62 -#: templates/plain/acknowledgement-email.php:52 -msgid "Gift cards" -msgstr "" - -#: includes/emails/class-wc-sc-combined-email-coupon.php:34 -msgid "Smart Coupons - Combined auto generated coupons email" -msgstr "" - -#: includes/emails/class-wc-sc-combined-email-coupon.php:35 -msgid "" -"Send only one email instead of multiple emails when multiple coupons are " -"generated per recipient." -msgstr "" - -#: includes/emails/class-wc-sc-combined-email-coupon.php:61 -msgid "" -"{site_title}: Congratulations! You've received coupons from {sender_name}" -msgstr "" - -#: includes/emails/class-wc-sc-combined-email-coupon.php:70 -msgid "You have received coupons." -msgstr "" - -#: includes/emails/class-wc-sc-combined-email-coupon.php:144 -#: includes/emails/class-wc-sc-combined-email-coupon.php:220 -#: includes/emails/class-wc-sc-email-coupon.php:202 -#: includes/emails/class-wc-sc-email-coupon.php:280 -msgid "from" -msgstr "" - -#: includes/emails/class-wc-sc-email-coupon.php:34 -msgid "Smart Coupons - Auto generated coupon email" -msgstr "" - -#: includes/emails/class-wc-sc-email-coupon.php:35 -msgid "Email auto generated coupon to recipients. One email per coupon." -msgstr "" - -#: includes/emails/class-wc-sc-email-coupon.php:64 -msgid "" -"{site_title}: Congratulations! You've received a {coupon_type} from " -"{sender_name}" -msgstr "" - -#: includes/emails/class-wc-sc-email-coupon.php:73 -msgid "You have received a {coupon_type} {coupon_value}" -msgstr "" - -#: includes/emails/class-wc-sc-email-coupon.php:353 -#: includes/emails/class-wc-sc-email-coupon.php:477 -msgid "Gift Card" -msgstr "" - -#. translators: %s coupon amount -#: includes/emails/class-wc-sc-email-coupon.php:396 -msgid "worth %s " -msgstr "" - -#. translators: %s: coupon amount -#: includes/emails/class-wc-sc-email-coupon.php:401 -msgid "worth %s (for entire purchase) " -msgstr "" - -#: includes/emails/class-wc-sc-email-coupon.php:406 -#: includes/emails/class-wc-sc-email-coupon.php:417 -#: includes/emails/class-wc-sc-email-coupon.php:428 -msgid "for some products" -msgstr "" - -#: includes/emails/class-wc-sc-email-coupon.php:408 -#: includes/emails/class-wc-sc-email-coupon.php:419 -msgid "for all products" -msgstr "" - -#. translators: 1: coupon amount 2: discount for text -#: includes/emails/class-wc-sc-email-coupon.php:412 -msgid "worth %1$s (%2$s) " -msgstr "" - -#. translators: 1: coupon amount 2: discount for text -#: includes/emails/class-wc-sc-email-coupon.php:423 -msgid "worth %1$s%% (%2$s) " -msgstr "" - -#: includes/emails/class-wc-sc-email-coupon.php:430 -msgid "for entire purchase" -msgstr "" - -#. translators: 1: coupon amount 2: max discount text 3: discount for text -#: includes/emails/class-wc-sc-email-coupon.php:441 -msgid "worth %1$s%% %2$s (%3$s) " -msgstr "" - -#. translators: 1: email heading 2: suffix -#: includes/emails/class-wc-sc-email-coupon.php:458 -msgid "%1$s Free Shipping%2$s" -msgstr "" - -#: includes/emails/class-wc-sc-email-coupon.php:458 -msgid "&" -msgstr "" - -#: includes/emails/class-wc-sc-email-coupon.php:458 -msgid "You have received a" -msgstr "" - -#: includes/emails/class-wc-sc-email-coupon.php:458 -msgid " coupon" -msgstr "" - -#. translators: %s: list of placeholders -#: includes/emails/class-wc-sc-email.php:97 -msgid "Available placeholders: %s" -msgstr "" - -#: includes/emails/class-wc-sc-email.php:101 -msgid "Enable/Disable" -msgstr "" - -#: includes/emails/class-wc-sc-email.php:103 -msgid "Enable this email notification" -msgstr "" - -#: includes/emails/class-wc-sc-email.php:107 -msgid "Email type" -msgstr "" - -#: includes/emails/class-wc-sc-email.php:109 -msgid "Choose which format of email to send." -msgstr "" - -#: includes/emails/class-wc-sc-email.php:116 -msgid "Subject" -msgstr "" - -#: includes/emails/class-wc-sc-email.php:124 -msgid "Email heading" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ActionFactory.php:162 -msgid "Invalid action - must be a recurring action." -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:61 -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:76 -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:77 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:90 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:20 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:31 -msgid "Scheduled Actions" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:128 -msgid "About" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:130 -msgid "About Action Scheduler %s" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:132 -msgid "" -"Action Scheduler is a scalable, traceable job queue for background " -"processing large sets of actions. Action Scheduler works by triggering an " -"action hook to run at some time in the future. Scheduled actions can also be " -"scheduled to run on a recurring schedule." -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:140 -msgid "Columns" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:142 -msgid "Scheduled Action Columns" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:144 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:97 -msgid "Hook" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:144 -msgid "Name of the action hook that will be triggered." -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:145 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:98 -msgid "Status" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:145 -msgid "Action statuses are Pending, Complete, Canceled, Failed" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:146 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:99 -msgid "Arguments" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:146 -msgid "Optional data array passed to the action hook." -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:147 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:100 -msgid "Group" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:147 -msgid "Optional action group." -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:148 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:101 -msgid "Recurrence" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:148 -msgid "The action's schedule frequency." -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:149 -msgid "Scheduled" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:149 -msgid "The date/time the action is/was scheduled to run." -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:150 -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:103 -msgid "Log" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:150 -msgid "Activity log for the action." -msgstr "" - -#. translators: %d: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_DataController.php:134 -msgid "Stopped the insanity for %d second" -msgid_plural "Stopped the insanity for %d seconds" -msgstr[0] "" -msgstr[1] "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_DataController.php:138 -msgid "Attempting to reduce used memory..." -msgstr "" - -#. translators: 1: action ID 2: schedule -#: includes/libraries/action-scheduler/classes/ActionScheduler_InvalidActionException.php:22 -msgid "Action [%1$s] has an invalid schedule: %2$s" -msgstr "" - -#. translators: 1: action ID 2: arguments -#: includes/libraries/action-scheduler/classes/ActionScheduler_InvalidActionException.php:41 -msgid "" -"Action [%1$s] has invalid arguments. It cannot be JSON decoded to an array. " -"$args = %2$s" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:93 -msgid "Delete" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:102 -msgid "Scheduled Date" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:123 -msgid "Claim ID" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:130 -msgid "Run" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:131 -msgid "Process the action now as if it were run as part of a queue" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:135 -msgid "Cancel the action now to avoid it being run in future" -msgstr "" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:145 -msgid "%s year" -msgid_plural "%s years" -msgstr[0] "" -msgstr[1] "" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:150 -msgid "%s month" -msgid_plural "%s months" -msgstr[0] "" -msgstr[1] "" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:155 -msgid "%s week" -msgid_plural "%s weeks" -msgstr[0] "" -msgstr[1] "" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:160 -msgid "%s day" -msgid_plural "%s days" -msgstr[0] "" -msgstr[1] "" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:165 -msgid "%s hour" -msgid_plural "%s hours" -msgstr[0] "" -msgstr[1] "" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:170 -msgid "%s minute" -msgid_plural "%s minutes" -msgstr[0] "" -msgstr[1] "" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:175 -msgid "%s second" -msgid_plural "%s seconds" -msgstr[0] "" -msgstr[1] "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:225 -msgid "Now!" -msgstr "" - -#. translators: %s: time interval -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:261 -msgid "Every %s" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:267 -msgid "Non-repeating" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:365 -msgid "" -"It appears one or more database tables were missing. Attempting to re-create " -"the missing table(s)." -msgstr "" - -#. translators: %s: amount of claims -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:381 -msgid "" -"Maximum simultaneous queues already in progress (%s queue). No additional " -"queues will begin processing until the current queues are complete." -msgid_plural "" -"Maximum simultaneous queues already in progress (%s queues). No additional " -"queues will begin processing until the current queues are complete." -msgstr[0] "" -msgstr[1] "" - -#. translators: %s: process URL -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:398 -msgid "" -"A new queue has begun processing. View actions in-progress " -"»" -msgstr "" - -#. translators: %d: seconds -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:401 -msgid "The next queue will begin processing in approximately %d seconds." -msgstr "" - -#. translators: %s: action HTML -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:422 -msgid "Successfully executed action: %s" -msgstr "" - -#. translators: %s: action HTML -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:426 -msgid "Successfully canceled action: %s" -msgstr "" - -#. translators: %s: action HTML -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:430 -msgid "Successfully processed change for action: %s" -msgstr "" - -#. translators: 1: action HTML 2: action ID 3: error message -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:436 -msgid "Could not process change for action: \"%1$s\" (ID: %2$d). Error: %3$s" -msgstr "" - -#. translators: %s: date interval -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:482 -msgid " (%s ago)" -msgstr "" - -#. translators: %s: date interval -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:485 -msgid " (%s)" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:635 -msgid "Search hook, args and claim ID" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_QueueRunner.php:193 -msgid "Every minute" -msgstr "" - -#. translators: %s: date interval -#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php:104 -msgid "This data will be deleted in %s." -msgstr "" - -#. translators: 1: next cleanup message 2: github issue URL -#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php:109 -msgid "" -"Action Scheduler has migrated data to custom tables; however, orphaned log " -"entries exist in the WordPress Comments table. %1$s Learn " -"more »" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:112 -msgid "Action Scheduler" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:112 -msgid "This section shows details of Action Scheduler." -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:115 -msgid "Version:" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:119 -msgid "Data store:" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:123 -msgid "Action Status" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:125 -msgid "Count" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:126 -msgid "Oldest Scheduled Date" -msgstr "" - -#: includes/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php:127 -msgid "Newest Scheduled Date" -msgstr "" - -#. translators: %s php class name -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:34 -#: includes/libraries/action-scheduler/classes/WP_CLI/ProgressBar.php:48 -msgid "The %s class can only be run within WP CLI." -msgstr "" - -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:60 -msgid "" -"There are too many concurrent batches, but the run is forced to continue." -msgstr "" - -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:62 -msgid "There are too many concurrent batches." -msgstr "" - -#. translators: %d: amount of actions -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:94 -msgid "Running %d action" -msgid_plural "Running %d actions" -msgstr[0] "" -msgstr[1] "" - -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:114 -msgid "The claim has been lost. Aborting current batch." -msgstr "" - -#. translators: %s refers to the action ID -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:139 -msgid "Started processing action %s" -msgstr "" - -#. translators: 1: action ID 2: hook name -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:156 -msgid "Completed processing action %1$s with hook: %2$s" -msgstr "" - -#. translators: 1: action ID 2: exception message -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php:171 -msgid "Error processing action %1$s: %2$s" -msgstr "" - -#. translators: %d refers to how many scheduled taks were found to run -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php:101 -msgid "Found %d scheduled task" -msgid_plural "Found %d scheduled tasks" -msgstr[0] "" -msgstr[1] "" - -#. translators: %d refers to the total number of batches executed -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php:118 -msgid "%d batch executed." -msgid_plural "%d batches executed." -msgstr[0] "" -msgstr[1] "" - -#. translators: %s refers to the exception error message -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php:137 -msgid "There was an error running the action scheduler: %s" -msgstr "" - -#. translators: %d refers to the total number of taskes completed -#: includes/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php:154 -msgid "%d scheduled task completed." -msgid_plural "%d scheduled tasks completed." -msgstr[0] "" -msgstr[1] "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler.php:196 -msgid "%s() was called before the Action Scheduler data store was initialized" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php:524 -msgid "Filter" -msgstr "" - -#. translators: %s: search query -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php:651 -msgid "Search results for \"%s\"" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php:756 -msgid "Search" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:73 -msgid "action created" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:77 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBLogger.php:143 -msgid "action canceled" -msgstr "" - -#. translators: %s: context -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:83 -msgid "action started via %s" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:85 -msgid "action started" -msgstr "" - -#. translators: %s: context -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:93 -msgid "action complete via %s" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:95 -msgid "action complete" -msgstr "" - -#. translators: 1: context 2: exception message -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:103 -msgid "action failed via %1$s: %2$s" -msgstr "" - -#. translators: %s: exception message -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:106 -msgid "action failed: %s" -msgstr "" - -#. translators: %s: amount of time -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:113 -msgid "action timed out after %s seconds" -msgstr "" - -#. translators: 1: error message 2: filename 3: line -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:119 -msgid "unexpected shutdown: PHP Fatal error %1$s in %2$s on line %3$s" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:124 -msgid "action reset" -msgstr "" - -#. translators: %s: context -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:130 -msgid "action ignored via %s" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:132 -msgid "action ignored" -msgstr "" - -#. translators: %s: exception message -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:147 -msgid "There was a failure fetching this action: %s" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:149 -msgid "There was a failure fetching this action" -msgstr "" - -#. translators: %s: exception message -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php:157 -msgid "There was a failure scheduling the next instance of this action: %s" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php:302 -msgid "" -"ActionScheduler_Action::$args too long. To ensure the args column can be " -"indexed, action args should not be more than %d characters when encoded as " -"JSON." -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php:378 -msgid "Complete" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php:379 -msgid "Pending" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php:380 -msgid "In-progress" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php:381 -msgid "Failed" -msgstr "" - -#: includes/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php:382 -msgid "Canceled" -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:79 -msgid "Database error." -msgstr "" - -#. translators: %s: error message -#. translators: %s: action error message -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:87 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:50 -#: includes/libraries/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php:45 -msgid "Error saving action: %s" -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:247 -msgid "Invalid value for select or count parameter. Cannot query actions." -msgstr "" - -#. translators: %s: action ID -#. translators: %s is the action ID -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:452 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:544 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:575 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:798 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:841 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:516 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:535 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:565 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:975 -msgid "Unidentified action %s" -msgstr "" - -#. translators: %s: group name -#. translators: %s is the group name -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:664 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:718 -msgid "The group \"%s\" does not exist." -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:684 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:697 -msgid "Unable to claim actions. Database error." -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:862 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:905 -msgid "Invalid action ID. No status found." -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php:864 -msgid "Unknown status found for action." -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:102 -msgid "Unable to save action." -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:319 -msgid "Invalid schedule. Cannot save action." -msgstr "" - -#. translators: %s: claim ID -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:825 -msgid "Unable to unlock claim %s. Database error." -msgstr "" - -#. translators: %s: action ID -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:853 -msgid "Unable to unlock claim on action %s. Database error." -msgstr "" - -#. translators: %s: action ID -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:879 -msgid "Unable to mark failure on action %s. Database error." -msgstr "" - -#. translators: %s is the error message -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php:1047 -msgid "" -"%s Support for strings longer than this will be removed in a future version." -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php:37 -msgctxt "post" -msgid "Failed" -msgstr "" - -#. translators: %s: count -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php:39 -msgid "Failed (%s)" -msgid_plural "Failed (%s)" -msgstr[0] "" -msgstr[1] "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php:52 -msgctxt "post" -msgid "In-Progress" -msgstr "" - -#. translators: %s: count -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php:54 -msgid "In-Progress (%s)" -msgid_plural "In-Progress (%s)" -msgstr[0] "" -msgstr[1] "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:21 -msgid "Scheduled actions are hooks triggered on a cetain date and time." -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:32 -msgid "Scheduled Action" -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:33 -msgctxt "Admin menu name" -msgid "Scheduled Actions" -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:34 -msgid "Add" -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:35 -msgid "Add New Scheduled Action" -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:36 -msgid "Edit" -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:37 -msgid "Edit Scheduled Action" -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:38 -msgid "New Scheduled Action" -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:39 -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:40 -msgid "View Action" -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:41 -msgid "Search Scheduled Actions" -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:42 -msgid "No actions found" -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php:43 -msgid "No actions found in trash" -msgstr "" - -#: includes/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_TaxonomyRegistrar.php:15 -msgid "Action Group" -msgstr "" - -#: includes/libraries/action-scheduler/classes/migration/ActionMigrator.php:96 -msgid "Unable to remove source migrated action %s" -msgstr "" - -#: includes/libraries/action-scheduler/classes/migration/Config.php:53 -msgid "Source store must be configured before running a migration" -msgstr "" - -#: includes/libraries/action-scheduler/classes/migration/Config.php:75 -msgid "Source logger must be configured before running a migration" -msgstr "" - -#: includes/libraries/action-scheduler/classes/migration/Config.php:97 -msgid "Destination store must be configured before running a migration" -msgstr "" - -#: includes/libraries/action-scheduler/classes/migration/Config.php:119 -msgid "Destination logger must be configured before running a migration" -msgstr "" - -#: includes/libraries/action-scheduler/classes/migration/Controller.php:163 -msgid "" -"Action Scheduler migration in progress. The list of scheduled actions may be " -"incomplete." -msgstr "" - -#. translators: %d: amount of actions -#: includes/libraries/action-scheduler/classes/migration/Runner.php:83 -msgid "Migrating %d action" -msgid_plural "Migrating %d actions" -msgstr[0] "" -msgstr[1] "" - -#. translators: 1: source action ID 2: source store class 3: destination action -#. ID 4: destination store class -#: includes/libraries/action-scheduler/classes/migration/Runner.php:108 -msgid "Migrated action with ID %1$d in %2$s to ID %3$d in %4$s" -msgstr "" - -#. translators: 1. Receiver's count 2. Singular/Plural label for store -#. credit(s) 3. Receiver name 4. Receiver details -#: templates/acknowledgement-email.php:34 -msgid "You have successfully sent %1$d %2$s %3$s %4$s" -msgstr "" - -#. translators: 1. Receiver's count 2. Gift Card/s 3. Receiver name 4. Receiver -#. details -#: templates/acknowledgement-email.php:37 -msgid "You have scheduled to send %1$d %2$s %3$s %4$s" -msgstr "" - -#: templates/acknowledgement-email.php:53 -msgid "on" -msgstr "" - -#: templates/acknowledgement-email.php:71 -msgid "to" -msgstr "" - -#: templates/combined-email.php:82 -msgid "To redeem your discount click on the following coupon(s):" -msgstr "" - -#: templates/combined-email.php:209 templates/email.php:194 -#: templates/plain/combined-email.php:131 templates/plain/email.php:124 -msgid "Visit store" -msgstr "" - -#: templates/combined-email.php:237 -msgid "You got these coupons " -msgstr "" - -#. translators: %s: Coupon code -#: templates/email.php:85 -msgid "" -"To redeem your discount use coupon code %s during checkout or click on the " -"following coupon:" -msgstr "" - -#. translators: %s: singular name for store credit -#: templates/email.php:219 templates/plain/combined-email.php:137 -#: templates/plain/email.php:130 -msgid "You got this %s" -msgstr "" - -#: templates/email.php:219 templates/plain/combined-email.php:137 -#: templates/plain/email.php:130 -msgid "You got this gift card" -msgstr "" - -#. translators: 1. Receiver's count 2. Singular/Plural label for store -#. credit(s) 3. Receiver name 4. Receiver details -#: templates/plain/acknowledgement-email.php:24 -msgid "You have successfully sent %1$d %2$s to %3$s (%4$s)" -msgstr "" - -#. translators: 1. Receiver's count 2. Gift Card/s 3. Receiver name 4. Receiver -#. details -#: templates/plain/acknowledgement-email.php:27 -msgid "You have scheduled to send %1$d %2$s to %3$s (%4$s)" -msgstr "" - -#: templates/plain/combined-email.php:22 -msgid "" -"To redeem your discount use below coupon codes during checkout or copy and " -"paste the below URLs and hit enter in your browser" -msgstr "" - -#: templates/plain/combined-email.php:75 templates/plain/email.php:26 -msgid "Message:" -msgstr "" - -#: templates/plain/combined-email.php:83 templates/plain/email.php:78 -msgid "Discount:" -msgstr "" - -#: templates/plain/combined-email.php:88 templates/plain/email.php:83 -msgid " & " -msgstr "" - -#: templates/plain/combined-email.php:97 templates/plain/email.php:92 -msgid "Coupon Code:" -msgstr "" - -#: templates/plain/combined-email.php:103 templates/plain/email.php:98 -msgid "Description:" -msgstr "" - -#: templates/plain/combined-email.php:108 templates/plain/email.php:103 -msgid "Expires on:" -msgstr "" - -#. translators: %s: Coupon code -#: templates/plain/email.php:23 -msgid "" -"To redeem your discount use coupon code %s during checkout or copy and paste " -"the below URL and hit enter in your browser:" -msgstr "" - -#. Plugin URI of the plugin/theme -msgid "https://woocommerce.com/products/smart-coupons/" -msgstr "" - -#. Description of the plugin/theme -msgid "" -"WooCommerce Smart Coupons lets customers buy gift " -"certificates, store credits or coupons easily. They can use purchased " -"credits themselves or gift to someone else." -msgstr "" - -#. Author of the plugin/theme -msgid "StoreApps" -msgstr "" - -#. Author URI of the plugin/theme -msgid "https://www.storeapps.org/" -msgstr "" diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/readme.txt b/wp/wp-content/plugins/woocommerce-smart-coupons/readme.txt deleted file mode 100644 index 6e469ab6..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/readme.txt +++ /dev/null @@ -1,66 +0,0 @@ -=== WooCommerce Smart Coupons === -Contributors: storeapps, niravmehta, ratnakar.dubey, Tarun.Parswani, Mansi Shah, Chandan Kumar -Donate link: https://www.storeapps.org/ -Tags: woocommerce, coupon, credit, store credit, gift, certificate, voucher, discount, gift certificate, gift voucher, customer, self service -Requires at least: 4.4 -Tested up to: 6.1.1 -Stable tag: 7.2.1 - -Powerful, "all in one" solution for gift certificates, store credits, discount coupons and vouchers. Allows customers to buy credits for themselves or gift them to others. Unique "Apply Coupon with One Click" technology during checkout, tight integration with WooCommerce and automatic maintenance. - -== Description == - -WooCommerce Smart Coupons is the most powerful, all in one solution for gift certificates, store credits, discount coupons and vouchers. - -Here's what you can do with this plugin: - -* Create coupons of a new type - "Store Credit / Gift Certificate". Credit balance will be managed automatically. -* Link any coupon with a product - new or existing. Customers automatically get that coupon when they purchase the product. -* Gift Certificates - create a new product, call it a Gift Certificate / Voucher (or anything else that suits your business). Add details and pricing and associate a "Store Credit / Gift Certificate" coupon with it. Customer will get an option to enter email address of the person to send the coupon to during checkout. They can also add a custom message along. -* Works great with Chained Products plugin - allowing you to create product combos that include other products and gift vouchers for future purchase - increasing the overall value of the offer. -* Buy Gift Certificate / Store Credit of any denomination -* Send Gift Certificate / Store Credit to multiple people -* Automatic coupon generation with prefix / suffix support -* Import coupons in bulk -* Admin can send a store credit / gift certificate to anyone -* Link as many coupons as you want with a product -* Link coupons with any product type - standard, digital, variable etc. -* Automatic Balance Maintenance - As a customer keeps using a credit coupon, balance will keep reducing automatically. -* Automatic Deletion on Zero Balance - When the balance reaches zero, the credit / certificate will be deleted automatically. No need to spend time on this. -* Unique coupon code generation for all credits / gift certificates. -* Tight security - coupons can be associated with customers and credits can be used only by their beneficiaries. -* Unique "Apply Coupon with One Click" technology - logged in customers will see available coupons on the cart / checkout pages and can apply a coupon with single click. No longer digging into mailboxes and time / attention waste during the critical checkout process. -* Offer Credits at a Discount - Link a coupon with any product and set the product's price lower than coupon's value. Offering a discounted gift certificate. We've seen huge increase in sales this way. You get money in advance, and customer keeps coming back to the store to buy more. **In our tests we actually discovered 84% customers bought more than the gift certificate value itself.** -* Carries forward benefits of WooCommerce coupon system: limiting coupons to specific products, validity period, usage times, expiry date etc. -* Can search for coupons issued to a customer by their email address -* Notifies customers about remaining store credit balance in order email -* Can even duplicate an existing coupon -* Same convenient and familiar coupon management interface - no need to learn a new interface to manage Smart Coupons - -== Installation == - -1. Ensure you have latest version of [WooCommerce](https://wordpress.org/plugins/woocommerce/) plugin installed -2. Unzip and upload the folder 'woocommerce-smart-coupons' to your `/wp-content/plugins/` directory -3. Activate 'WooCommerce Smart Coupons' through the 'Plugins' menu in WordPress - -== Usage == - -CREATING A COUPON -1. Go to Coupons settings in WooCommerce -2. Add new coupons as usual - if you want to create credit based coupon - Store Credit or Gift Certificate, use "Store Credit / Gift Certificate" in type -3. Add other coupon details as usual -4. Save the coupon! - -LINKING A COUPON WITH A PRODUCT -1. Add a new product (or edit an existing one). -2. Look for "Coupons" under "General" tab -3. Start typing name of a coupon you want to give to your customer with this product -4. Select the exact coupon from the suggestions displayed -5. Add as many coupons as you want like this -6. Set up price and other details for the main product as you like -7. Click 'Update' or 'Publish' to save the changes - -IMPORTING COUPONS IN BULK -Refer to the "sample.csv" file in the plugin root directory. Create your import file in the same structure and import it via Coupons administration in WooCommerce. - -Go to "WooCommerce -> Settings -> Smart Coupons" from WordPress sidebar menu for additional settings for this plugin. diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/sample.csv b/wp/wp-content/plugins/woocommerce-smart-coupons/sample.csv deleted file mode 100644 index 721f4525..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/sample.csv +++ /dev/null @@ -1,9 +0,0 @@ -post_title,post_excerpt,post_status,post_parent,menu_order,post_date,discount_type,coupon_amount,free_shipping,expiry_date,minimum_amount,maximum_amount,individual_use,exclude_sale_items,product_ids,exclude_product_ids,product_categories,exclude_product_categories,customer_email,usage_limit,usage_limit_per_user,limit_usage_to_x_items,usage_count,_used_by,sc_restrict_to_new_user,wc_sc_add_product_details,sa_cbl_locations_lookup_in,sa_cbl_billing_locations,sa_cbl_shipping_locations,wc_coupon_message,wc_email_message,sc_coupon_validity,validity_suffix,auto_generate_coupon,coupon_title_prefix,coupon_title_suffix,is_pick_price_of_product,wc_sc_auto_apply_coupon,sc_disable_email_restriction,sc_is_visible_storewide,wc_sc_max_discount,wc_sc_expiry_time,wc_sc_payment_method_ids,wc_sc_shipping_method_ids,wc_sc_user_role_ids,wc_sc_exclude_user_role_ids,wc_sc_product_attribute_ids,wc_sc_exclude_product_attribute_ids,_wcs_number_payments,sc_coupon_category -sczdmjd,,publish,0,0,,Percentage discount,30,yes,,10,1000,yes,yes,,,,,,2,1,,0,,no,,billing,united states (us),,,no,,days,no,,,no,,no,no,50,,PayPal|Credit Card (Stripe),Flat rate|Local pickup,Administrator|Subscriber,,24|26,28,, -sc44noo,,publish,0,0,,Fixed cart discount,25,no,,10,,no,yes,,,,,,,1,,0,,no,"115, 1, 100, percent|114, 1, 100, percent",billing,,,Congratulations on getting free products!!!,yes,,days,no,,,no,yes,no,no,,,Direct bank transfer|Check payments,,,Customer,,,, -scuy08i,,publish,0,0,,Fixed product discount,5,yes,2020/01/20,,100,yes,no,,,,,,2,1,,0,,no,,shipping,,united kingdom (uk),,no,,days,no,,,no,,no,no,,86340,,,Administrator|Editor|Author,,,,, -scyjrlj,,publish,0,0,,Sign Up Fee Discount,1,no,2019/12/20,1,,no,yes,,,,,,,,,0,,,,,,,,,,,,,,,,,,,,,Flat rate|Free shipping|Local pickup,,,,26,, -scrzyzh,,publish,0,0,,Sign Up Fee % Discount,10,yes,,,200,yes,no,,,,,,2,1,,0,,,,,,,,,,,,,,,,,,,,,,,Administrator|Editor|Author,26,,, -schapfo,,publish,0,0,,Recurring Product Discount,0.5,yes,2020/02/20,10,100,yes,yes,,,,,,,,,0,,,,,,,,,,,,,,,,,,,,,,Customer,,,,, -scl5052,,publish,0,0,,Recurring Product % Discount,5,no,2020/01/01,10,,no,yes,,,,,,,1,,0,,,,,,,,,,,,,,,,,,,,,Flat rate|Local pickup,Author,,,,, -sce9z9k,,publish,0,0,,Store Credit / Gift Certificate,20,no,,,500,yes,no,,,,,,2,,,0,,,,,,,,,,,,,,,,,,,,Cash on delivery|Credit Card (Stripe),,,,,,, diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/acknowledgement-email.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/acknowledgement-email.php deleted file mode 100644 index 88d9e38d..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/acknowledgement-email.php +++ /dev/null @@ -1,81 +0,0 @@ - $email_heading ) ); - } else { - woocommerce_get_template( 'emails/email-header.php', array( 'email_heading' => $email_heading ) ); - } -} - -$receivers_email = array_unique( $receivers_detail ); - -if ( empty( $email_scheduled_details ) ) { - /* translators: 1. Receiver's count 2. Singular/Plural label for store credit(s) 3. Receiver name 4. Receiver details */ - $message = __( 'You have successfully sent %1$d %2$s %3$s %4$s', 'woocommerce-smart-coupons' ); -} else { - /* translators: 1. Receiver's count 2. Gift Card/s 3. Receiver name 4. Receiver details */ - $message = __( 'You have scheduled to send %1$d %2$s %3$s %4$s', 'woocommerce-smart-coupons' ); - $receivers_email = array_map( - function( $email ) use ( $email_scheduled_details ) { - // Filter for time format of acknowledgement email. - $time_format = apply_filters( 'wc_sc_acknowledgement_email_time_format', get_option( 'date_format', 'Y-m-d' ) . ' ' . get_option( 'time_format', 'H:i' ) ); - // Check if the scheduled timestamps are available. - if ( isset( $email_scheduled_details[ $email ] ) && is_array( $email_scheduled_details[ $email ] ) ) { - $scheduled_times = array_map( - function( $time ) use ( $time_format ) { - // Convert to date format. - $time = get_date_from_gmt( gmdate( 'c', $time ), $time_format ); - return date_i18n( $time_format, strtotime( $time ) ); - }, - $email_scheduled_details[ $email ] - ); - // Concat scheduled times to comma separated times. - return $email . ' ' . __( 'on', 'woocommerce-smart-coupons' ) . ' ' . implode( ', ', $scheduled_times ); - } - return $email; - }, - $receivers_email - ); -} - -$singular = ( ! empty( $store_credit_label['singular'] ) ) ? ucwords( $store_credit_label['singular'] ) : __( 'Gift card', 'woocommerce-smart-coupons' ); -$plural = ( ! empty( $store_credit_label['plural'] ) ) ? ucwords( $store_credit_label['plural'] ) : __( 'Gift cards', 'woocommerce-smart-coupons' ); -$coupon_type = ( $receiver_count > 1 ) ? $plural : $singular; - -if ( 'yes' === $contains_core_coupons ) { - $coupon_type = _n( 'Coupon', 'Coupons', $receiver_count, 'woocommerce-smart-coupons' ); -} - -$is_receiver_name = ! empty( $gift_certificate_receiver_name ); - -echo esc_html( sprintf( $message, $receiver_count, strtolower( $coupon_type ), ( ( ! empty( $gift_certificate_receiver_name ) || ! empty( $receivers_email ) ) ? __( 'to', 'woocommerce-smart-coupons' ) . ' ' . $gift_certificate_receiver_name : '' ), ( true === $is_receiver_name ? '(' : '' ) . implode( ', ', $receivers_email ) . ( true === $is_receiver_name ? ')' : '' ) ) ); - -if ( has_action( 'woocommerce_email_footer' ) ) { - do_action( 'woocommerce_email_footer', $email ); -} else { - if ( function_exists( 'wc_get_template' ) ) { - wc_get_template( 'emails/email-footer.php' ); - } else { - woocommerce_get_template( 'emails/email-footer.php' ); - } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/call-for-credit-form.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/call-for-credit-form.php deleted file mode 100644 index ec3a3e07..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/call-for-credit-form.php +++ /dev/null @@ -1,37 +0,0 @@ - -

              -
              -
              -
              - -
              -
              - -
              -
              -
              -

              -
              -

              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/combined-email.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/combined-email.php deleted file mode 100644 index b78327d1..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/combined-email.php +++ /dev/null @@ -1,253 +0,0 @@ - $email_heading ) ); - } else { - woocommerce_get_template( 'emails/email-header.php', array( 'email_heading' => $email_heading ) ); - } -} -?> - - - - - - - -

              - -

              - -
              '; - $order = ( ! empty( $order_id ) ) ? wc_get_order( $order_id ) : null; // phpcs:ignore - foreach ( $receiver_details as $receiver_data ) { - - $coupon_code = $receiver_data['code']; - $sender_message = isset( $receiver_data['message'] ) ? $receiver_data['message'] : ''; - $coupon = new WC_Coupon( $coupon_code ); - - if ( $woocommerce_smart_coupon->is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - continue; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - continue; - } - $is_free_shipping = ( $coupon->get_free_shipping() ) ? 'yes' : 'no'; - $expiry_date = $coupon->get_date_expires(); - $coupon_code = $coupon->get_code(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - $expiry_date = ( ! empty( $coupon->expiry_date ) ) ? $coupon->expiry_date : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - $coupon_amount = $woocommerce_smart_coupon->get_amount( $coupon, true, $order ); - - $coupon_post = get_post( $coupon_id ); - - $coupon_data = $woocommerce_smart_coupon->get_coupon_meta_data( $coupon ); - - $coupon_type = ( ! empty( $coupon_data['coupon_type'] ) ) ? $coupon_data['coupon_type'] : ''; - - if ( 'yes' === $is_free_shipping ) { - if ( ! empty( $coupon_type ) ) { - $coupon_type .= __( ' & ', 'woocommerce-smart-coupons' ); - } - $coupon_type .= __( 'Free Shipping', 'woocommerce-smart-coupons' ); - } - - if ( ! empty( $expiry_date ) ) { - if ( $woocommerce_smart_coupon->is_wc_gte_30() && $expiry_date instanceof WC_DateTime ) { - $expiry_date = ( is_callable( array( $expiry_date, 'getTimestamp' ) ) ) ? $expiry_date->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - if ( ! empty( $expiry_date ) && is_int( $expiry_date ) ) { - $expiry_time = (int) $woocommerce_smart_coupon->get_post_meta( $coupon_id, 'wc_sc_expiry_time', true ); - if ( ! empty( $expiry_time ) ) { - $expiry_date += $expiry_time; // Adding expiry time to expiry date. - } - } - } - - $coupon_description = ''; - if ( ! empty( $coupon_post->post_excerpt ) && 'yes' === $show_coupon_description ) { - $coupon_description = $coupon_post->post_excerpt; - } - - $is_percent = $woocommerce_smart_coupon->is_percent_coupon( array( 'coupon_object' => $coupon ) ); - - $args = array( - 'coupon_object' => $coupon, - 'coupon_amount' => $coupon_amount, - 'amount_symbol' => ( true === $is_percent ) ? '%' : get_woocommerce_currency_symbol(), - 'discount_type' => wp_strip_all_tags( $coupon_type ), - 'coupon_description' => ( ! empty( $coupon_description ) ) ? $coupon_description : wp_strip_all_tags( $woocommerce_smart_coupon->generate_coupon_description( array( 'coupon_object' => $coupon ) ) ), - 'coupon_code' => $coupon_code, - 'coupon_expiry' => ( ! empty( $expiry_date ) ) ? $woocommerce_smart_coupon->get_expiration_format( $expiry_date ) : __( 'Never expires', 'woocommerce-smart-coupons' ), - 'thumbnail_src' => $woocommerce_smart_coupon->get_coupon_design_thumbnail_src( - array( - 'design' => $design, - 'coupon_object' => $coupon, - ) - ), - 'classes' => '', - 'template_id' => $design, - 'is_percent' => $is_percent, - ); - - $coupon_target = ''; - $wc_url_coupons_active_urls = get_option( 'wc_url_coupons_active_urls' ); // From plugin WooCommerce URL coupons. - if ( ! empty( $wc_url_coupons_active_urls ) ) { - $coupon_target = ( ! empty( $wc_url_coupons_active_urls[ $coupon_id ]['url'] ) ) ? $wc_url_coupons_active_urls[ $coupon_id ]['url'] : ''; - } - if ( ! empty( $coupon_target ) ) { - $coupon_target = home_url( '/' . $coupon_target ); - } else { - $coupon_target = home_url( '/?sc-page=shop&coupon-code=' . $coupon_code ); - } - - $coupon_target = apply_filters( 'sc_coupon_url_in_email', $coupon_target, $coupon ); - ?> -
              - -
              - -
              - -
              - - - -
              -
              -
              '; -} - -$site_url = ! empty( $url ) ? $url : home_url(); -?> -
              - - $woocommerce_smart_coupon ) ); - $coupons_to_print = ( ! empty( $receiver_details ) ) ? wp_list_pluck( $receiver_details, 'code' ) : array(); - if ( true === $is_print && ! empty( $coupons_to_print ) ) { - $print_coupon_url = add_query_arg( - array( - 'print-coupons' => 'yes', - 'source' => 'wc-smart-coupons', - 'coupon-codes' => implode( - ',', - $coupons_to_print - ), - ), - home_url() - ); - ?> - | - - -
              - - -

              - -

              - - -
              - - -
              -
              -
              - - - - - -
              -
              -
              - - -
              - -
              -
              -
              -
              -
              -
              -
              -
              -
              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/clipper.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/clipper.php deleted file mode 100644 index 077f03c7..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/clipper.php +++ /dev/null @@ -1,47 +0,0 @@ - -
              -
              -
              - - - - - - - -
              -
              -
              - - -
              - -
              -
              - -
              -
              -
              -
              -
              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/custom-design.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/custom-design.php deleted file mode 100644 index 35e64517..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/custom-design.php +++ /dev/null @@ -1,61 +0,0 @@ - -
              - -
              '; - - $discount_title = ''; - - if ( ! empty( $coupon_amount ) ) { - $discount_title = ( true === $is_percent ) ? $coupon_amount . '%' : wc_price( $coupon_amount ); - } - - if ( ! empty( $discount_type ) ) { - $discount_title .= ' ' . $discount_type; - } - - $discount_title = apply_filters( 'wc_smart_coupons_display_discount_title', $discount_title, $coupon_object ); - - if ( $discount_title ) { - - // Not escaping because 3rd party developer can have HTML code in discount title. - echo $discount_title; // phpcs:ignore - - } - - echo '
              '; - - echo '
              ' . esc_html( $coupon_code ) . '
              '; - - $show_coupon_description = get_option( 'smart_coupons_show_coupon_description', 'no' ); - if ( ! empty( $coupon_description ) && 'yes' === $show_coupon_description ) { - echo '
              ' . esc_html( $coupon_description ) . '
              '; - } - - if ( ! empty( $coupon_expiry ) ) { - echo '
              ' . esc_html( $coupon_expiry ) . '
              '; - } - - echo '
              '; - ?> -
              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/cutout.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/cutout.php deleted file mode 100644 index f556ca8e..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/cutout.php +++ /dev/null @@ -1,67 +0,0 @@ - -
              - - - - - -
              -
              -
              -
              - - - - - -
              -
              - - - - -
              -
              -
              -
              -
              - - -
              - -
              -
              -
              -
              - - -
              - -
              -
              -
              -
              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/deal.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/deal.php deleted file mode 100644 index 35b002ff..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/deal.php +++ /dev/null @@ -1,44 +0,0 @@ - -
              -
              -
              - -
              -
              -
              - - -
              - -
              -
              - -
              -
              -
              -
              - -
              -
              -
              -
              -
              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/deliver.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/deliver.php deleted file mode 100644 index fee055b8..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/deliver.php +++ /dev/null @@ -1,44 +0,0 @@ - -
              -
              -
              -
              - -
              - -
              -
              -
              - - -
              - -
              -
              -
              - -
              -
              -
              -
              -
              -
              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/email-coupon.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/email-coupon.php deleted file mode 100644 index b7a7241f..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/email-coupon.php +++ /dev/null @@ -1,67 +0,0 @@ - -
              - get_coupon_content_classes() ) . '"> -
              '; - - $discount_title = ''; - - if ( ! empty( $coupon_amount ) ) { - $discount_title = ( true === $is_percent ) ? $coupon_amount . '%' : wc_price( $coupon_amount ); - } - - if ( ! empty( $discount_type ) ) { - $discount_title .= ' ' . $discount_type; - } - - $discount_title = apply_filters( 'wc_smart_coupons_display_discount_title', $discount_title, $coupon_object ); - - if ( $discount_title ) { - - // Not escaping because 3rd party developer can have HTML code in discount title. - echo $discount_title; // phpcs:ignore - - } - - echo '
              '; - - echo '
              ' . esc_html( $coupon_code ) . '
              '; - - $show_coupon_description = get_option( 'smart_coupons_show_coupon_description', 'no' ); - if ( ! empty( $coupon_description ) && 'yes' === $show_coupon_description ) { - echo '
              ' . esc_html( $coupon_description ) . '
              '; - } - - if ( ! empty( $coupon_expiry ) ) { - echo '
              ' . esc_html( $coupon_expiry ) . '
              '; - } - - echo '
              '; - ?> -
              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/festive.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/festive.php deleted file mode 100644 index d60d7b87..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/festive.php +++ /dev/null @@ -1,88 +0,0 @@ - -
              -
              - - - - - - - -
              - - -
              - -
              -
              -
              -
              -
              - get_emoji() ); ?> - -
              -
              -
              -
              -
              -
              - -
              -
              -
              -
              -
              -
              -
              -
              -
              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/flat.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/flat.php deleted file mode 100644 index e1354a7a..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/flat.php +++ /dev/null @@ -1,64 +0,0 @@ - -
              -
              -
              -
              -
              - get_emoji() ); ?> - -
              -
              -
              -
              - -
              -
              -
              -
              - - - - - -
              -
              - - - - -
              -
              -
              -
              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/promotion.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/promotion.php deleted file mode 100644 index d5c26ce7..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/promotion.php +++ /dev/null @@ -1,76 +0,0 @@ - -
              -
              - - - - - - - - -
              -
              - - - - - -
              -
              - - - - -
              -
              - -
              -
              -
              -
              - get_emoji() ); ?> - -
              -
              -
              -
              - -
              -
              -
              -
              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/shipment.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/shipment.php deleted file mode 100644 index 5b6b8e69..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/shipment.php +++ /dev/null @@ -1,66 +0,0 @@ - -
              -
              -
              -
              -
              -
              -
              - - -
              - -
              -
              -
              - - -
              -
              - -
              - -
              -
              - - - - - -
              -
              - - - - -
              -
              -
              -
              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/special.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/special.php deleted file mode 100644 index 14dc647a..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/special.php +++ /dev/null @@ -1,67 +0,0 @@ - -
              -
              -
              -
              - -
              - -
              - - - - - - - - - -
              -
              -
              - - -
              - -
              -
              -
              - -
              -
              -
              -
              -
              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/ticket.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/ticket.php deleted file mode 100644 index 14fff43f..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/coupon-design/ticket.php +++ /dev/null @@ -1,53 +0,0 @@ - -
              - - - - - - - - - -
              -
              -
              -
              -
              -
              -
              -
              - get_emoji() ); ?> - -
              -
              -
              -
              -
              diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/email.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/email.php deleted file mode 100644 index 4aeda472..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/email.php +++ /dev/null @@ -1,235 +0,0 @@ - $email_heading ) ); - } else { - woocommerce_get_template( 'emails/email-header.php', array( 'email_heading' => $email_heading ) ); - } -} -?> - - - - - - - - - -

              -' . esc_html( $coupon_code ) . '' ); -?> -

              - -is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - return; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - return; - } - $is_free_shipping = ( $coupon->get_free_shipping() ) ? 'yes' : 'no'; - $expiry_date = $coupon->get_date_expires(); - $coupon_code = $coupon->get_code(); -} else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - $expiry_date = ( ! empty( $coupon->expiry_date ) ) ? $coupon->expiry_date : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; -} - -$coupon_amount = $woocommerce_smart_coupon->get_amount( $coupon, true, $order ); - -$coupon_post = get_post( $coupon_id ); - -$coupon_data = $woocommerce_smart_coupon->get_coupon_meta_data( $coupon ); - -$coupon_type = ( ! empty( $coupon_data['coupon_type'] ) ) ? $coupon_data['coupon_type'] : ''; - -if ( 'yes' === $is_free_shipping ) { - if ( ! empty( $coupon_type ) ) { - $coupon_type .= __( ' & ', 'woocommerce-smart-coupons' ); - } - $coupon_type .= __( 'Free Shipping', 'woocommerce-smart-coupons' ); -} - -if ( ! empty( $expiry_date ) ) { - if ( $woocommerce_smart_coupon->is_wc_gte_30() && $expiry_date instanceof WC_DateTime ) { - $expiry_date = ( is_callable( array( $expiry_date, 'getTimestamp' ) ) ) ? $expiry_date->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - if ( ! empty( $expiry_date ) && is_int( $expiry_date ) ) { - $expiry_time = (int) $woocommerce_smart_coupon->get_post_meta( $coupon_id, 'wc_sc_expiry_time', true ); - if ( ! empty( $expiry_time ) ) { - $expiry_date += $expiry_time; // Adding expiry time to expiry date. - } - } -} - -$coupon_description = ''; -if ( ! empty( $coupon_post->post_excerpt ) && 'yes' === $show_coupon_description ) { - $coupon_description = $coupon_post->post_excerpt; -} - -$is_percent = $woocommerce_smart_coupon->is_percent_coupon( array( 'coupon_object' => $coupon ) ); - -$args = array( - 'coupon_object' => $coupon, - 'coupon_amount' => $coupon_amount, - 'amount_symbol' => ( true === $is_percent ) ? '%' : get_woocommerce_currency_symbol(), - 'discount_type' => wp_strip_all_tags( $coupon_type ), - 'coupon_description' => ( ! empty( $coupon_description ) ) ? $coupon_description : wp_strip_all_tags( $woocommerce_smart_coupon->generate_coupon_description( array( 'coupon_object' => $coupon ) ) ), - 'coupon_code' => $coupon_code, - 'coupon_expiry' => ( ! empty( $expiry_date ) ) ? $woocommerce_smart_coupon->get_expiration_format( $expiry_date ) : __( 'Never expires', 'woocommerce-smart-coupons' ), - 'thumbnail_src' => $woocommerce_smart_coupon->get_coupon_design_thumbnail_src( - array( - 'design' => $design, - 'coupon_object' => $coupon, - ) - ), - 'classes' => '', - 'template_id' => $design, - 'is_percent' => $is_percent, -); - - $coupon_target = ''; - $wc_url_coupons_active_urls = get_option( 'wc_url_coupons_active_urls' ); // From plugin WooCommerce URL coupons. -if ( ! empty( $wc_url_coupons_active_urls ) ) { - $coupon_target = ( ! empty( $wc_url_coupons_active_urls[ $coupon_id ]['url'] ) ) ? $wc_url_coupons_active_urls[ $coupon_id ]['url'] : ''; -} -if ( ! empty( $coupon_target ) ) { - $coupon_target = home_url( '/' . $coupon_target ); -} else { - $coupon_target = home_url( '/?sc-page=shop&coupon-code=' . $coupon_code ); -} - - $coupon_target = apply_filters( 'sc_coupon_url_in_email', $coupon_target, $coupon ); -?> - - - - -
              - - $woocommerce_smart_coupon ) ); - if ( true === $is_print ) { - $print_coupon_url = add_query_arg( - array( - 'print-coupons' => 'yes', - 'source' => 'wc-smart-coupons', - 'coupon-codes' => $coupon_code, - ), - home_url() - ); - ?> - | - - -
              - - -

              - -

              - - -
              - - 1 ) ? $plural : $singular; - -if ( 'yes' === $contains_core_coupons ) { - $coupon_type = _n( 'Coupon', 'Coupons', $receiver_count, 'woocommerce-smart-coupons' ); -} - -echo esc_html( sprintf( $message, $receiver_count, strtolower( $coupon_type ), $gift_certificate_receiver_name, implode( ', ', $receivers_email ) ) ); - -echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/plain/combined-email.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/plain/combined-email.php deleted file mode 100644 index 17a7f304..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/plain/combined-email.php +++ /dev/null @@ -1,139 +0,0 @@ - - - - -is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - return; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - return; - } - $is_free_shipping = ( $coupon->get_free_shipping() ) ? 'yes' : 'no'; - $expiry_date = $coupon->get_date_expires(); - $coupon_code = $coupon->get_code(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - $expiry_date = ( ! empty( $coupon->expiry_date ) ) ? $coupon->expiry_date : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - $coupon_amount = $woocommerce_smart_coupon->get_amount( $coupon, true, $order ); - - $coupon_post = get_post( $coupon_id ); - - $coupon_data = $woocommerce_smart_coupon->get_coupon_meta_data( $coupon ); - - $coupon_target = ''; - $wc_url_coupons_active_urls = get_option( 'wc_url_coupons_active_urls' ); // From plugin WooCommerce URL coupons. - if ( ! empty( $wc_url_coupons_active_urls ) ) { - $coupon_target = ( ! empty( $wc_url_coupons_active_urls[ $coupon_id ]['url'] ) ) ? $wc_url_coupons_active_urls[ $coupon_id ]['url'] : ''; - } - if ( ! empty( $coupon_target ) ) { - $coupon_target = home_url( '/' . $coupon_target ); - } else { - $coupon_target = home_url( '/?sc-page=shop&coupon-code=' . $coupon_code ); - } - - $coupon_target = apply_filters( 'sc_coupon_url_in_email', $coupon_target, $coupon ); - - if ( ! empty( $sender_message ) ) { - echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; - echo esc_html__( 'Message:', 'woocommerce-smart-coupons' ); - echo esc_html( $sender_message ); - } - - echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; - echo esc_url( $coupon_target ); - echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; - - echo esc_html__( 'Discount:', 'woocommerce-smart-coupons' ); - if ( ! empty( $coupon_data['coupon_amount'] ) && 0 !== $coupon_amount ) { - echo $coupon_data['coupon_amount']; // phpcs:ignore - echo ' ' . $coupon_data['coupon_type']; // phpcs:ignore - if ( 'yes' === $is_free_shipping ) { - echo esc_html__( ' & ', 'woocommerce-smart-coupons' ); - } - } - - if ( 'yes' === $is_free_shipping ) { - echo esc_html__( 'Free Shipping', 'woocommerce-smart-coupons' ); - } - - echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; - echo esc_html__( 'Coupon Code:', 'woocommerce-smart-coupons' ); - echo esc_html( $coupon_code ); - echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; - - $show_coupon_description = get_option( 'smart_coupons_show_coupon_description', 'no' ); - if ( ! empty( $coupon_post->post_excerpt ) && 'yes' === $show_coupon_description ) { - echo esc_html__( 'Description:', 'woocommerce-smart-coupons' ); - echo $coupon_post->post_excerpt; // phpcs:ignore - echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; - } - - echo esc_html__( 'Expires on:', 'woocommerce-smart-coupons' ); - if ( ! empty( $expiry_date ) ) { - if ( $woocommerce_smart_coupon->is_wc_gte_30() && $expiry_date instanceof WC_DateTime ) { - $expiry_date = ( is_callable( array( $expiry_date, 'getTimestamp' ) ) ) ? $expiry_date->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - - if ( ! empty( $expiry_date ) && is_int( $expiry_date ) ) { - $expiry_time = (int) $woocommerce_smart_coupon->get_post_meta( $coupon_id, 'wc_sc_expiry_time', true ); - if ( ! empty( $expiry_time ) ) { - $expiry_date += $expiry_time; // Adding expiry time to expiry date. - } - } - $expiry_date = $woocommerce_smart_coupon->get_expiration_format( $expiry_date ); - echo esc_html( $expiry_date ); - } else { - echo esc_html__( 'Never expires', 'woocommerce-smart-coupons' ); - } - echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; -} - -echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; -echo esc_html__( 'Visit store', 'woocommerce-smart-coupons' ); -echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; -$site_url = ! empty( $url ) ? $url : home_url(); -echo esc_url( $site_url ); -if ( ! empty( $from ) ) { - /* translators: %s: singular name for store credit */ - echo ( ! empty( $store_credit_label['singular'] ) ? sprintf( esc_html__( 'You got this %s', 'woocommerce-smart-coupons' ), esc_html( strtolower( $store_credit_label['singular'] ) ) ) : esc_html__( 'You got this gift card', 'woocommerce-smart-coupons' ) ) . ' ' . esc_html( $from ) . esc_html( $sender ); - echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/plain/email.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/plain/email.php deleted file mode 100644 index ac09b662..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/plain/email.php +++ /dev/null @@ -1,132 +0,0 @@ - - - - -is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - return; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - return; - } - $is_free_shipping = ( $coupon->get_free_shipping() ) ? 'yes' : 'no'; - $expiry_date = $coupon->get_date_expires(); - $coupon_code = $coupon->get_code(); -} else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - $expiry_date = ( ! empty( $coupon->expiry_date ) ) ? $coupon->expiry_date : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; -} - -$coupon_amount = $woocommerce_smart_coupon->get_amount( $coupon, true, $order ); - -$coupon_post = get_post( $coupon_id ); - -$coupon_data = $woocommerce_smart_coupon->get_coupon_meta_data( $coupon ); - -$coupon_target = ''; -$wc_url_coupons_active_urls = get_option( 'wc_url_coupons_active_urls' ); // From plugin WooCommerce URL coupons. -if ( ! empty( $wc_url_coupons_active_urls ) ) { - $coupon_target = ( ! empty( $wc_url_coupons_active_urls[ $coupon_id ]['url'] ) ) ? $wc_url_coupons_active_urls[ $coupon_id ]['url'] : ''; -} -if ( ! empty( $coupon_target ) ) { - $coupon_target = home_url( '/' . $coupon_target ); -} else { - $coupon_target = home_url( '/?sc-page=shop&coupon-code=' . $coupon_code ); -} - -$coupon_target = apply_filters( 'sc_coupon_url_in_email', $coupon_target, $coupon ); - -echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; -echo esc_url( $coupon_target ); -echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; - -echo esc_html__( 'Discount:', 'woocommerce-smart-coupons' ); -if ( ! empty( $coupon_data['coupon_amount'] ) && 0 !== $coupon_amount ) { - echo $coupon_data['coupon_amount']; // phpcs:ignore - echo ' ' . $coupon_data['coupon_type']; // phpcs:ignore - if ( 'yes' === $is_free_shipping ) { - echo esc_html__( ' & ', 'woocommerce-smart-coupons' ); - } -} - -if ( 'yes' === $is_free_shipping ) { - echo esc_html__( 'Free Shipping', 'woocommerce-smart-coupons' ); -} - -echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; -echo esc_html__( 'Coupon Code:', 'woocommerce-smart-coupons' ); -echo esc_html( $coupon_code ); -echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; - -$show_coupon_description = get_option( 'smart_coupons_show_coupon_description', 'no' ); -if ( ! empty( $coupon_post->post_excerpt ) && 'yes' === $show_coupon_description ) { - echo esc_html__( 'Description:', 'woocommerce-smart-coupons' ); - echo $coupon_post->post_excerpt; // phpcs:ignore - echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; -} - -echo esc_html__( 'Expires on:', 'woocommerce-smart-coupons' ); -if ( ! empty( $expiry_date ) ) { - if ( $woocommerce_smart_coupon->is_wc_gte_30() && $expiry_date instanceof WC_DateTime ) { - $expiry_date = ( is_callable( array( $expiry_date, 'getTimestamp' ) ) ) ? $expiry_date->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - - if ( ! empty( $expiry_date ) && is_int( $expiry_date ) ) { - $expiry_time = (int) $woocommerce_smart_coupon->get_post_meta( $coupon_id, 'wc_sc_expiry_time', true ); - if ( ! empty( $expiry_time ) ) { - $expiry_date += $expiry_time; // Adding expiry time to expiry date. - } - } - $expiry_date = $woocommerce_smart_coupon->get_expiration_format( $expiry_date ); - echo esc_html( $expiry_date ); -} else { - echo esc_html__( 'Never expires', 'woocommerce-smart-coupons' ); -} - -echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; -echo esc_html__( 'Visit store', 'woocommerce-smart-coupons' ); -echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; -$site_url = ! empty( $url ) ? $url : home_url(); -echo esc_url( $site_url ); -if ( ! empty( $from ) ) { - /* translators: %s: singular name for store credit */ - echo ( ! empty( $store_credit_label['singular'] ) ? sprintf( esc_html__( 'You got this %s', 'woocommerce-smart-coupons' ), esc_html( strtolower( $store_credit_label['singular'] ) ) ) : esc_html__( 'You got this gift card', 'woocommerce-smart-coupons' ) ) . ' ' . esc_html( $from ) . esc_html( $sender ); - echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n"; -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/print-coupons-default.php b/wp/wp-content/plugins/woocommerce-smart-coupons/templates/print-coupons-default.php deleted file mode 100644 index 8af05f07..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/templates/print-coupons-default.php +++ /dev/null @@ -1,209 +0,0 @@ - - -> - - - - <?php echo $bloginfo; // phpcs:ignore ?> - - - - - - - - - > -
              -
              - is_wc_gte_30() ) { - if ( ! is_object( $coupon ) || ! is_callable( array( $coupon, 'get_id' ) ) ) { - continue; - } - $coupon_id = $coupon->get_id(); - if ( empty( $coupon_id ) ) { - continue; - } - $is_free_shipping = ( $coupon->get_free_shipping() ) ? 'yes' : 'no'; - $discount_type = $coupon->get_discount_type(); - $expiry_date = $coupon->get_date_expires(); - $coupon_code = $coupon->get_code(); - } else { - $coupon_id = ( ! empty( $coupon->id ) ) ? $coupon->id : 0; - $is_free_shipping = ( ! empty( $coupon->free_shipping ) ) ? $coupon->free_shipping : ''; - $discount_type = ( ! empty( $coupon->discount_type ) ) ? $coupon->discount_type : ''; - $expiry_date = ( ! empty( $coupon->expiry_date ) ) ? $coupon->expiry_date : ''; - $coupon_code = ( ! empty( $coupon->code ) ) ? $coupon->code : ''; - } - - $coupon_amount = $woocommerce_smart_coupon->get_amount( $coupon, true ); - - if ( empty( $coupon_id ) || empty( $discount_type ) ) { - continue; - } - - $coupon_post = get_post( $coupon_id ); - - $coupon_meta = $woocommerce_smart_coupon->get_coupon_meta_data( $coupon ); - - $coupon_type = ( ! empty( $coupon_meta['coupon_type'] ) ) ? $coupon_meta['coupon_type'] : ''; - - if ( 'yes' === $is_free_shipping ) { - if ( ! empty( $coupon_type ) ) { - $coupon_type .= __( ' & ', 'woocommerce-smart-coupons' ); - } - $coupon_type .= __( 'Free Shipping', 'woocommerce-smart-coupons' ); - } - - if ( ! empty( $expiry_date ) ) { - if ( $woocommerce_smart_coupon->is_wc_gte_30() && $expiry_date instanceof WC_DateTime ) { - $expiry_date = ( is_callable( array( $expiry_date, 'getTimestamp' ) ) ) ? $expiry_date->getTimestamp() : null; - } elseif ( ! is_int( $expiry_date ) ) { - $expiry_date = strtotime( $expiry_date ); - } - if ( ! empty( $expiry_date ) && is_int( $expiry_date ) ) { - $expiry_time = (int) $woocommerce_smart_coupon->get_post_meta( $coupon_id, 'wc_sc_expiry_time', true ); - if ( ! empty( $expiry_time ) ) { - $expiry_date += $expiry_time; // Adding expiry time to expiry date. - } - } - } - - $coupon_description = ''; - - if ( ! empty( $coupon_post->post_excerpt ) && 'yes' === $show_coupon_description ) { - $coupon_description = $coupon_post->post_excerpt; - } - - $is_percent = $woocommerce_smart_coupon->is_percent_coupon( array( 'coupon_object' => $coupon ) ); - - $args = array( - 'coupon_object' => $coupon, - 'coupon_amount' => $coupon_amount, - 'amount_symbol' => ( true === $is_percent ) ? '%' : get_woocommerce_currency_symbol(), - 'discount_type' => wp_strip_all_tags( $coupon_type ), - 'coupon_description' => ( ! empty( $coupon_description ) ) ? $coupon_description : wp_strip_all_tags( $woocommerce_smart_coupon->generate_coupon_description( array( 'coupon_object' => $coupon ) ) ), - 'coupon_code' => $coupon_code, - 'coupon_expiry' => ( ! empty( $expiry_date ) ) ? $woocommerce_smart_coupon->get_expiration_format( $expiry_date ) : __( 'Never expires', 'woocommerce-smart-coupons' ), - 'thumbnail_src' => $woocommerce_smart_coupon->get_coupon_design_thumbnail_src( - array( - 'design' => $design, - 'coupon_object' => $coupon, - ) - ), - 'classes' => '', - 'template_id' => $design, - 'is_percent' => $is_percent, - ); - - wc_get_template( 'coupon-design/' . $design . '.php', $args, '', plugin_dir_path( WC_SC_PLUGIN_FILE ) . 'templates/' ); - - } - ?> -
              -
              - -
              - -
              - -
              -
              - - - diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/woo-includes/class-wc-dependencies.php b/wp/wp-content/plugins/woocommerce-smart-coupons/woo-includes/class-wc-dependencies.php deleted file mode 100644 index 6eedc3d6..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/woo-includes/class-wc-dependencies.php +++ /dev/null @@ -1,31 +0,0 @@ -file = $file; - $plugin->file_id = $file_id; - $plugin->product_id = $product_id; - - $woothemes_queued_updates[] = $plugin; - } -} - -/** - * Load installer for the WooThemes Updater. - * - * @return $api Object - */ -if ( ! class_exists( 'WooThemes_Updater' ) && ! function_exists( 'woothemes_updater_install' ) ) { - function woothemes_updater_install( $api, $action, $args ) { - $download_url = 'http://woodojo.s3.amazonaws.com/downloads/woothemes-updater/woothemes-updater.zip'; - - if ( 'plugin_information' != $action || - false !== $api || - ! isset( $args->slug ) || - 'woothemes-updater' != $args->slug - ) { return $api; - } - - $api = new stdClass(); - $api->name = 'WooThemes Updater'; - $api->version = '1.0.0'; - $api->download_link = esc_url( $download_url ); - return $api; - } - - add_filter( 'plugins_api', 'woothemes_updater_install', 10, 3 ); -} - -/** - * WooUpdater Installation Prompts - */ -if ( ! class_exists( 'WooThemes_Updater' ) && ! function_exists( 'woothemes_updater_notice' ) ) { - - /** - * Display a notice if the "WooThemes Updater" plugin hasn't been installed. - * - * @return void - */ - function woothemes_updater_notice() { - $active_plugins = apply_filters( 'active_plugins', get_option( 'active_plugins' ) ); - if ( in_array( 'woothemes-updater/woothemes-updater.php', $active_plugins ) ) { return; - } - - $slug = 'woothemes-updater'; - $install_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $slug ), 'install-plugin_' . $slug ); - $activate_url = 'plugins.php?action=activate&plugin=' . urlencode( 'woothemes-updater/woothemes-updater.php' ) . '&plugin_status=all&paged=1&s&_wpnonce=' . urlencode( wp_create_nonce( 'activate-plugin_woothemes-updater/woothemes-updater.php' ) ); - - $message = 'Install the WooThemes Updater plugin to get updates for your WooThemes plugins.'; - $is_downloaded = false; - $plugins = array_keys( get_plugins() ); - foreach ( $plugins as $plugin ) { - if ( strpos( $plugin, 'woothemes-updater.php' ) !== false ) { - $is_downloaded = true; - $message = 'Activate the WooThemes Updater plugin to get updates for your WooThemes plugins.'; - } - } - echo '

              ' . $message . '

              ' . "\n"; - } - - add_action( 'admin_notices', 'woothemes_updater_notice' ); -} - -/** - * Prevent conflicts with older versions - */ -if ( ! class_exists( 'WooThemes_Plugin_Updater' ) ) { - class WooThemes_Plugin_Updater { - function init() {} } -} diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/woocommerce-smart-coupons.php b/wp/wp-content/plugins/woocommerce-smart-coupons/woocommerce-smart-coupons.php deleted file mode 100644 index 1d6889ed..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/woocommerce-smart-coupons.php +++ /dev/null @@ -1,65 +0,0 @@ -WooCommerce Smart Coupons lets customers buy gift certificates, store credits or coupons easily. They can use purchased credits themselves or gift to someone else. - * Version: 7.2.1 - * Author: StoreApps - * Author URI: https://www.storeapps.org/ - * Developer: StoreApps - * Developer URI: https://www.storeapps.org/ - * Requires at least: 4.4 - * Tested up to: 6.1.1 - * WC requires at least: 3.0.0 - * WC tested up to: 7.0.1 - * Text Domain: woocommerce-smart-coupons - * Domain Path: /languages - * Woo: 18729:05c45f2aa466106a466de4402fff9dde - * Copyright (c) 2014-2023 WooCommerce, StoreApps All rights reserved. - * License: GNU General Public License v3.0 - * License URI: http://www.gnu.org/licenses/gpl-3.0.html - * - * @package woocommerce-smart-coupons - */ - -/** - * Required functions - */ -if ( ! function_exists( 'woothemes_queue_update' ) ) { - require_once 'woo-includes/woo-functions.php'; -} - -/** - * Plugin updates - */ -woothemes_queue_update( plugin_basename( __FILE__ ), '05c45f2aa466106a466de4402fff9dde', '18729' ); - -/** - * Include class having function to execute during activation & deactivation of plugin - */ -require_once 'includes/class-wc-sc-act-deact.php'; - -/** - * On activation - */ -register_activation_hook( __FILE__, array( 'WC_SC_Act_Deact', 'smart_coupon_activate' ) ); - -/** - * On deactivation - */ -register_deactivation_hook( __FILE__, array( 'WC_SC_Act_Deact', 'smart_coupon_deactivate' ) ); - -if ( is_woocommerce_active() ) { - - if ( ! defined( 'WC_SC_PLUGIN_FILE' ) ) { - define( 'WC_SC_PLUGIN_FILE', __FILE__ ); - } - if ( ! defined( 'WC_SC_PLUGIN_DIRNAME' ) ) { - define( 'WC_SC_PLUGIN_DIRNAME', dirname( plugin_basename( __FILE__ ) ) ); - } - - include_once 'includes/class-wc-smart-coupons.php'; - - $GLOBALS['woocommerce_smart_coupon'] = WC_Smart_Coupons::get_instance(); - -} // End woocommerce active check diff --git a/wp/wp-content/plugins/woocommerce-smart-coupons/wpml-config.xml b/wp/wp-content/plugins/woocommerce-smart-coupons/wpml-config.xml deleted file mode 100644 index d56316ef..00000000 --- a/wp/wp-content/plugins/woocommerce-smart-coupons/wpml-config.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - auto_generate_coupon - coupon_title_prefix - coupon_title_suffix - sc_coupon_validity - validity_suffix - sc_is_visible_storewide - sc_disable_email_restriction - is_pick_price_of_product - _coupon_title - send_coupons_on_renewals - generated_from_order_id - - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-ai-generator-2200-rtl.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-ai-generator-2200-rtl.css deleted file mode 100644 index a0e7181c..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-ai-generator-2200-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.yst-root .yst-replacevar__use-ai-button{align-items:center;background-color:#f7f7f7;border:1px solid #dbdbdb;border-radius:4px;box-shadow:inset 0 -2px 0 0 #0000001a;box-sizing:border-box;color:#303030;cursor:pointer;display:flex;min-height:32px;padding:0 .5em;transition:var(--yoast-transition-default)}.yst-root .yst-replacevar__use-ai-button:hover{background-color:#fff;border-color:var(--yoast-color-border--default);color:#000}.yst-root .yst-logo-icon{background-color:var(--yoast-color-primary);display:inline-block;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%}.yst-root .yst-ai-mode .yst-radio-group__options{flex-direction:row;gap:1.5rem}.yst-root .yst-length-progress-bar.yst-score-good .yst-progress-bar__progress{background-color:#7ad03a}.yst-root .yst-length-progress-bar.yst-score-ok .yst-progress-bar__progress{background-color:#ee7c1b}.yst-root .yst-length-progress-bar.yst-score-bad .yst-progress-bar__progress{background-color:#dc3232}.yst-root .yst-suggestions-radio-group .yst-radio-group__options{gap:0}.yst-root .yst-suggestions-radio-group .yst-radio-group__options>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(-1px*var(--tw-space-y-reverse));margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-introduction-modal .yst-modal__close-button{--tw-text-opacity:1;background-color:initial;color:rgb(107 114 128/var(--tw-text-opacity))}.yst-root .yst-introduction-modal .yst-modal__close-button:focus{--tw-ring-offset-width:0px;outline:2px solid #0000;outline-offset:2px}.yst-root .yst-ai-modal .yst-modal__panel{overflow:visible}.yst-root .yst-revoke-button .yst-animate-spin{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-ai-generator-2200.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-ai-generator-2200.css deleted file mode 100644 index a0e7181c..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-ai-generator-2200.css +++ /dev/null @@ -1 +0,0 @@ -.yst-root .yst-replacevar__use-ai-button{align-items:center;background-color:#f7f7f7;border:1px solid #dbdbdb;border-radius:4px;box-shadow:inset 0 -2px 0 0 #0000001a;box-sizing:border-box;color:#303030;cursor:pointer;display:flex;min-height:32px;padding:0 .5em;transition:var(--yoast-transition-default)}.yst-root .yst-replacevar__use-ai-button:hover{background-color:#fff;border-color:var(--yoast-color-border--default);color:#000}.yst-root .yst-logo-icon{background-color:var(--yoast-color-primary);display:inline-block;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%}.yst-root .yst-ai-mode .yst-radio-group__options{flex-direction:row;gap:1.5rem}.yst-root .yst-length-progress-bar.yst-score-good .yst-progress-bar__progress{background-color:#7ad03a}.yst-root .yst-length-progress-bar.yst-score-ok .yst-progress-bar__progress{background-color:#ee7c1b}.yst-root .yst-length-progress-bar.yst-score-bad .yst-progress-bar__progress{background-color:#dc3232}.yst-root .yst-suggestions-radio-group .yst-radio-group__options{gap:0}.yst-root .yst-suggestions-radio-group .yst-radio-group__options>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(-1px*var(--tw-space-y-reverse));margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-introduction-modal .yst-modal__close-button{--tw-text-opacity:1;background-color:initial;color:rgb(107 114 128/var(--tw-text-opacity))}.yst-root .yst-introduction-modal .yst-modal__close-button:focus{--tw-ring-offset-width:0px;outline:2px solid #0000;outline-offset:2px}.yst-root .yst-ai-modal .yst-modal__panel{overflow:visible}.yst-root .yst-revoke-button .yst-animate-spin{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-draft-js-plugins-2200-rtl.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-draft-js-plugins-2200-rtl.css deleted file mode 100644 index 4f6b9824..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-draft-js-plugins-2200-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.emoji-select-button{align-items:center;background-color:#f7f7f7;border:1px solid #dbdbdb;border-radius:4px;box-shadow:inset 0 -2px 0 0 #0000001a;box-sizing:border-box;color:#303030;cursor:pointer;display:flex;min-height:32px;padding:0 .5em;transition:var(--yoast-transition-default);width:32px}.emoji-select-button svg{width:100%}.emoji-select-button-pressed,.emoji-select-button:hover{background-color:#fff;border-color:var(--yoast-color-border--default)}.yst-replacevar{position:relative}.yst-replacevar .emoji-select-popover{font-size:15px;margin-top:0;left:0}.rtl .yst-replacevar .emoji-select-popover{right:0;left:unset}.yst-replacevar .emoji-select-popover h3{font-size:1em;margin:0 0 .3em}.yst-replacevar .emoji-select-popover li{margin-bottom:unset}.yst-replacevar .emoji-select-popover .single-emoji{height:37.5px;width:37.5px}.yst-replacevar .emoji-select-popover .single-emoji span{font-size:20px!important}.yst-replacevar{color:#303030}.yst-replacevar .emoji-select-popover-nav{width:auto}.yst-replacevar .emoji-suggestions{padding:6px 0}.rtl .yst-replacevar .emoji-suggestions{left:0}.yst-replacevar .emoji-suggestion-item-wrapper{align-items:center;display:flex;padding:6px 10px}.yst-replacevar .emoji-suggestion-item-wrapper span{font-size:18px;line-height:1}.yst-replacevar .emoji-suggestion-item-wrapper .emoji-suggestion-item-text{font-size:13px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-draft-js-plugins-2200.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-draft-js-plugins-2200.css deleted file mode 100644 index 610f22e1..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-draft-js-plugins-2200.css +++ /dev/null @@ -1 +0,0 @@ -.emoji-select-button{align-items:center;background-color:#f7f7f7;border:1px solid #dbdbdb;border-radius:4px;box-shadow:inset 0 -2px 0 0 #0000001a;box-sizing:border-box;color:#303030;cursor:pointer;display:flex;min-height:32px;padding:0 .5em;transition:var(--yoast-transition-default);width:32px}.emoji-select-button svg{width:100%}.emoji-select-button-pressed,.emoji-select-button:hover{background-color:#fff;border-color:var(--yoast-color-border--default)}.yst-replacevar{position:relative}.yst-replacevar .emoji-select-popover{font-size:15px;margin-top:0;right:0}.rtl .yst-replacevar .emoji-select-popover{left:0;right:unset}.yst-replacevar .emoji-select-popover h3{font-size:1em;margin:0 0 .3em}.yst-replacevar .emoji-select-popover li{margin-bottom:unset}.yst-replacevar .emoji-select-popover .single-emoji{height:37.5px;width:37.5px}.yst-replacevar .emoji-select-popover .single-emoji span{font-size:20px!important}.yst-replacevar{color:#303030}.yst-replacevar .emoji-select-popover-nav{width:auto}.yst-replacevar .emoji-suggestions{padding:6px 0}.rtl .yst-replacevar .emoji-suggestions{right:0}.yst-replacevar .emoji-suggestion-item-wrapper{align-items:center;display:flex;padding:6px 10px}.yst-replacevar .emoji-suggestion-item-wrapper span{font-size:18px;line-height:1}.yst-replacevar .emoji-suggestion-item-wrapper .emoji-suggestion-item-text{font-size:13px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-elementor-2200-rtl.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-elementor-2200-rtl.css deleted file mode 100644 index 4f39cea3..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-elementor-2200-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.elementor-panel .yoast-link-suggestions a{color:var(--yoast-color-link)}.yoast-link-suggestion__wrapper .yoast-link-suggestion__container{max-width:100%;padding-left:6px}.yoast-link-suggestion__wrapper .yoast-link-suggestion__container>a{width:-moz-fit-content;width:fit-content}.yoast-link-suggestion__wrapper .yoast-link-suggestion__copy{margin-right:auto}.yoast .notice{border:1px solid #ccd0d4;border-right-width:4px;box-shadow:0 1px 1px #0000000a;padding:1px 12px}.yoast .notice-warning{border-right-color:#ffb900}.yoast .notice-warning.notice-alt{background-color:#fff8e5}.yoast .notice p,.yoast .notice-title{margin:.5em 0;padding:2px}.yoast-links-suggestions-notice .button{background-color:var(--yoast-color-secondary);border:1px solid #0003;border-radius:4px;box-shadow:inset 0 -2px 0 #0000001a;color:var(--yoast-color-dark);cursor:pointer;font-size:14px;line-height:1.2;padding:10px 12px 12px;transition:background-color .15s ease-out 0s}.yoast-links-suggestions-notice .button:focus{box-shadow:var(--yoast-color-focus);outline:none}p.yoast-redirect-notification-modal-url{margin-bottom:0}.yoast .yoast-data-model{color:var(--yoast-elementor-color-paragraph)}@media(hover:hover){.yoast .yoast-links-suggestions-notice .button:active,.yoast-links-suggestions-notice .button:not(:disabled):hover{background-color:var(--yoast-color-secondary-darker);border:1px solid #0003}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-elementor-2200.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-elementor-2200.css deleted file mode 100644 index 76d7cb92..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-elementor-2200.css +++ /dev/null @@ -1 +0,0 @@ -.elementor-panel .yoast-link-suggestions a{color:var(--yoast-color-link)}.yoast-link-suggestion__wrapper .yoast-link-suggestion__container{max-width:100%;padding-right:6px}.yoast-link-suggestion__wrapper .yoast-link-suggestion__container>a{width:-moz-fit-content;width:fit-content}.yoast-link-suggestion__wrapper .yoast-link-suggestion__copy{margin-left:auto}.yoast .notice{border:1px solid #ccd0d4;border-left-width:4px;box-shadow:0 1px 1px #0000000a;padding:1px 12px}.yoast .notice-warning{border-left-color:#ffb900}.yoast .notice-warning.notice-alt{background-color:#fff8e5}.yoast .notice p,.yoast .notice-title{margin:.5em 0;padding:2px}.yoast-links-suggestions-notice .button{background-color:var(--yoast-color-secondary);border:1px solid #0003;border-radius:4px;box-shadow:inset 0 -2px 0 #0000001a;color:var(--yoast-color-dark);cursor:pointer;font-size:14px;line-height:1.2;padding:10px 12px 12px;transition:background-color .15s ease-out 0s}.yoast-links-suggestions-notice .button:focus{box-shadow:var(--yoast-color-focus);outline:none}p.yoast-redirect-notification-modal-url{margin-bottom:0}.yoast .yoast-data-model{color:var(--yoast-elementor-color-paragraph)}@media(hover:hover){.yoast .yoast-links-suggestions-notice .button:active,.yoast-links-suggestions-notice .button:not(:disabled):hover{background-color:var(--yoast-color-secondary-darker);border:1px solid #0003}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-metabox-2200-rtl.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-metabox-2200-rtl.css deleted file mode 100644 index 64c0384f..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-metabox-2200-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-link-suggestion-icon.yoast-link-suggestion-icon{box-sizing:border-box}.yoast-link-suggestions--loading{display:block;height:75px;margin:0 auto;padding:3em 0;width:75px}#yoast_internal_linking .inside{margin-top:0;padding-bottom:25px;padding-top:10px}.yoast-links-suggestions-notice{margin:5px 0 2px}body.is-dark-theme .wp-block .yoast-links-suggestions-notice{color:#000}.yoast-redirect-notification-modal-url{margin:0}.yoast-redirect-notification-modal-buttons{align-items:center;display:flex;margin-top:16px}.yoast-redirect-notification-modal-buttons button{margin-left:16px}#wpseosynonyms{margin-bottom:2em}.yoast-section{background-color:#fff;box-shadow:0 1px 2px #0003;padding:0 20px 15px;position:relative}.yoast-section__heading{color:#555;font-family:Open Sans,sans-serif;font-size:.9rem;font-weight:300;margin:0 -20px 15px;padding:8px 20px}.yoast-section__heading-icon{background-position:right 20px top .6em;background-repeat:no-repeat;background-size:16px;padding-right:44px}.yoast-section,.yoast-section *,.yoast-section :after,.yoast-section :before,.yoast-section:after,.yoast-section:before{box-sizing:border-box}.editable-preview h3:first-child{margin-top:0}.wpseo-form .snippet-editor__label{display:inline-block;margin-top:24px;width:auto}.wpseo-form .snippet-editor__label:first-child{margin-top:0}.wpseo-form .yoast_help.yoast-help-button{margin-top:20px}.wpseo-form .snippet-editor__label:first-child+.yoast-help-button{margin-top:-4px}.remove-keyword{background:#0000;border:none;cursor:pointer;display:inline-block;margin:0 -3px 0 0;padding:5px 6px 6px}.remove-keyword span{border:1px solid #0000;border-radius:100%;color:#686868;display:inline-block;font-size:12px;font-weight:400;height:16px;line-height:15px;padding:0;text-align:center;vertical-align:top;width:16px}.remove-keyword:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;outline:none}.remove-keyword:focus span,.remove-keyword:hover span{background-color:#dc3232;color:#fff}.wrap .wpseo-notice-breakout-inside{margin:0 -12px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-metabox-2200.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-metabox-2200.css deleted file mode 100644 index 73c0060b..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-metabox-2200.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-link-suggestion-icon.yoast-link-suggestion-icon{box-sizing:border-box}.yoast-link-suggestions--loading{display:block;height:75px;margin:0 auto;padding:3em 0;width:75px}#yoast_internal_linking .inside{margin-top:0;padding-bottom:25px;padding-top:10px}.yoast-links-suggestions-notice{margin:5px 0 2px}body.is-dark-theme .wp-block .yoast-links-suggestions-notice{color:#000}.yoast-redirect-notification-modal-url{margin:0}.yoast-redirect-notification-modal-buttons{align-items:center;display:flex;margin-top:16px}.yoast-redirect-notification-modal-buttons button{margin-right:16px}#wpseosynonyms{margin-bottom:2em}.yoast-section{background-color:#fff;box-shadow:0 1px 2px #0003;padding:0 20px 15px;position:relative}.yoast-section__heading{color:#555;font-family:Open Sans,sans-serif;font-size:.9rem;font-weight:300;margin:0 -20px 15px;padding:8px 20px}.yoast-section__heading-icon{background-position:left 20px top .6em;background-repeat:no-repeat;background-size:16px;padding-left:44px}.yoast-section,.yoast-section *,.yoast-section :after,.yoast-section :before,.yoast-section:after,.yoast-section:before{box-sizing:border-box}.editable-preview h3:first-child{margin-top:0}.wpseo-form .snippet-editor__label{display:inline-block;margin-top:24px;width:auto}.wpseo-form .snippet-editor__label:first-child{margin-top:0}.wpseo-form .yoast_help.yoast-help-button{margin-top:20px}.wpseo-form .snippet-editor__label:first-child+.yoast-help-button{margin-top:-4px}.remove-keyword{background:#0000;border:none;cursor:pointer;display:inline-block;margin:0 0 0 -3px;padding:5px 6px 6px}.remove-keyword span{border:1px solid #0000;border-radius:100%;color:#686868;display:inline-block;font-size:12px;font-weight:400;height:16px;line-height:15px;padding:0;text-align:center;vertical-align:top;width:16px}.remove-keyword:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;outline:none}.remove-keyword:focus span,.remove-keyword:hover span{background-color:#dc3232;color:#fff}.wrap .wpseo-notice-breakout-inside{margin:0 -12px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-post-overview-2200-rtl.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-post-overview-2200-rtl.css deleted file mode 100644 index 6060dee7..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-post-overview-2200-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.fixed th.column-wpseo-cornerstone,.fixed th.column-wpseo-inclusive-language,.fixed th.column-wpseo-linked{padding:0;width:3em}th.column-wpseo-cornerstone .yoast-tooltip,th.column-wpseo-inclusive-language .yoast-tooltip{display:inline-block;overflow:visible;padding:8px 0;vertical-align:middle}th.column-wpseo-cornerstone .yoast-tooltip:after,th.column-wpseo-inclusive-language .yoast-tooltip:after{max-width:60px;white-space:break-spaces}td.column-wpseo-cornerstone,td.column-wpseo-inclusive-language{padding:8px 0 8px 10px}.manage-column .yoast-column-cornerstone:before{background:#0000 url(../../../assets/images/cornerstone-icon.svg) no-repeat 100% 3px;background-size:20px}.manage-column .yoast-column-inclusive-language:before{background:#0000 url(../../../assets/images/inclusive-language-icon.svg) no-repeat 100% 3px;background-size:20px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-post-overview-2200.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-post-overview-2200.css deleted file mode 100644 index 6e0e9e0e..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-post-overview-2200.css +++ /dev/null @@ -1 +0,0 @@ -.fixed th.column-wpseo-cornerstone,.fixed th.column-wpseo-inclusive-language,.fixed th.column-wpseo-linked{padding:0;width:3em}th.column-wpseo-cornerstone .yoast-tooltip,th.column-wpseo-inclusive-language .yoast-tooltip{display:inline-block;overflow:visible;padding:8px 0;vertical-align:middle}th.column-wpseo-cornerstone .yoast-tooltip:after,th.column-wpseo-inclusive-language .yoast-tooltip:after{max-width:60px;white-space:break-spaces}td.column-wpseo-cornerstone,td.column-wpseo-inclusive-language{padding:8px 10px 8px 0}.manage-column .yoast-column-cornerstone:before{background:#0000 url(../../../assets/images/cornerstone-icon.svg) no-repeat 0 3px;background-size:20px}.manage-column .yoast-column-inclusive-language:before{background:#0000 url(../../../assets/images/inclusive-language-icon.svg) no-repeat 0 3px;background-size:20px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-redirects-2200-rtl.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-redirects-2200-rtl.css deleted file mode 100644 index 24441a50..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-redirects-2200-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.redirect_form_row.field_error label{color:#dc3232}.redirect_form_row.field_error input{border-color:#dc3232}tbody .column-old .val:after{color:#d3d3d3;content:"/"}tbody .column-new .has-trailing-slash:after,tbody .column-new .val:before,tbody .column-old .val:before{content:"/"}tbody .column-new .remove-slashes:after,tbody .column-new .remove-slashes:before,tbody .column-old .remove-slashes:after,tbody .column-old .remove-slashes:before{content:none}.wpseo-redirect-clear{clear:both}.redirect_htaccess_disabled{opacity:.5}#inline-edit td{padding:0 20px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-redirects-2200.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-redirects-2200.css deleted file mode 100644 index 24441a50..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-redirects-2200.css +++ /dev/null @@ -1 +0,0 @@ -.redirect_form_row.field_error label{color:#dc3232}.redirect_form_row.field_error input{border-color:#dc3232}tbody .column-old .val:after{color:#d3d3d3;content:"/"}tbody .column-new .has-trailing-slash:after,tbody .column-new .val:before,tbody .column-old .val:before{content:"/"}tbody .column-new .remove-slashes:after,tbody .column-new .remove-slashes:before,tbody .column-old .remove-slashes:after,tbody .column-old .remove-slashes:before{content:none}.wpseo-redirect-clear{clear:both}.redirect_htaccess_disabled{opacity:.5}#inline-edit td{padding:0 20px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-schema-blocks-2200-rtl.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-schema-blocks-2200-rtl.css deleted file mode 100644 index 2716a864..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-schema-blocks-2200-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.wp-block-yoast-job-employment-type .components-input-control__container{width:50%}.yoast-job-block__salary .wp-block-yoast-job-salary-range{max-width:25%}.yoast-job-block__salary .wp-block-yoast-job-salary-range input[type=number]{-moz-appearance:textfield}.editor-styles-wrapper .wp-block-yoast-job-salary [data-block]{margin-bottom:0;margin-top:0} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-schema-blocks-2200.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-schema-blocks-2200.css deleted file mode 100644 index 2716a864..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-schema-blocks-2200.css +++ /dev/null @@ -1 +0,0 @@ -.wp-block-yoast-job-employment-type .components-input-control__container{width:50%}.yoast-job-block__salary .wp-block-yoast-job-salary-range{max-width:25%}.yoast-job-block__salary .wp-block-yoast-job-salary-range input[type=number]{-moz-appearance:textfield}.editor-styles-wrapper .wp-block-yoast-job-salary [data-block]{margin-bottom:0;margin-top:0} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-settings-2200-rtl.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-settings-2200-rtl.css deleted file mode 100644 index c39e4827..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-settings-2200-rtl.css +++ /dev/null @@ -1 +0,0 @@ -#yoast-seo-settings .emoji-select-button{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;line-height:1rem;min-height:34px;text-align:center;-webkit-text-decoration-line:none;text-decoration-line:none;width:34px}#yoast-seo-settings .emoji-select-button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}#yoast-seo-settings .emoji-select-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}#yoast-seo-settings .emoji-select-button>svg{height:1.25rem;margin-right:auto;margin-left:auto;width:1.25rem} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-settings-2200.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-settings-2200.css deleted file mode 100644 index c11f0dd3..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-settings-2200.css +++ /dev/null @@ -1 +0,0 @@ -#yoast-seo-settings .emoji-select-button{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;line-height:1rem;min-height:34px;text-align:center;-webkit-text-decoration-line:none;text-decoration-line:none;width:34px}#yoast-seo-settings .emoji-select-button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}#yoast-seo-settings .emoji-select-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}#yoast-seo-settings .emoji-select-button>svg{height:1.25rem;margin-left:auto;margin-right:auto;width:1.25rem} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-tailwind-2200-rtl.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-tailwind-2200-rtl.css deleted file mode 100644 index cd7f6506..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-tailwind-2200-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.yst-root *,.yst-root :after,.yst-root :before{border:0 solid #e5e7eb;box-sizing:border-box}.yst-root :after,.yst-root :before{--tw-content:""}.yst-root{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;margin:0;tab-size:4}.yst-root hr{border-top-width:1px;color:inherit;height:0}.yst-root abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6{font-size:inherit;font-weight:inherit}.yst-root a{color:inherit;text-decoration:inherit}.yst-root b,.yst-root strong{font-weight:bolder}.yst-root code,.yst-root kbd,.yst-root pre,.yst-root samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}.yst-root small{font-size:80%}.yst-root sub,.yst-root sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}.yst-root sub{bottom:-.25em}.yst-root sup{top:-.5em}.yst-root table{border-collapse:collapse;border-color:inherit;text-indent:0}.yst-root button,.yst-root input,.yst-root optgroup,.yst-root select,.yst-root textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}.yst-root button,.yst-root select{text-transform:none}.yst-root [type=button],.yst-root [type=reset],.yst-root [type=submit],.yst-root button{-webkit-appearance:button;background-color:initial;background-image:none}.yst-root :-moz-focusring{outline:auto}.yst-root :-moz-ui-invalid{box-shadow:none}.yst-root progress{vertical-align:initial}.yst-root ::-webkit-inner-spin-button,.yst-root ::-webkit-outer-spin-button{height:auto}.yst-root [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.yst-root ::-webkit-search-decoration{-webkit-appearance:none}.yst-root ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.yst-root summary{display:list-item}.yst-root blockquote,.yst-root dd,.yst-root dl,.yst-root figure,.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6,.yst-root hr,.yst-root p,.yst-root pre{margin:0}.yst-root fieldset{margin:0;padding:0}.yst-root legend{padding:0}.yst-root menu,.yst-root ol,.yst-root ul{list-style:none;margin:0;padding:0}.yst-root textarea{resize:vertical}.yst-root input::placeholder,.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root [role=button],.yst-root button{cursor:pointer}.yst-root :disabled{cursor:default}.yst-root audio,.yst-root canvas,.yst-root embed,.yst-root iframe,.yst-root img,.yst-root object,.yst-root svg,.yst-root video{display:block;vertical-align:middle}.yst-root img,.yst-root video{height:auto;max-width:100%}.yst-root [type=date],.yst-root [type=datetime-local],.yst-root [type=email],.yst-root [type=month],.yst-root [type=number],.yst-root [type=password],.yst-root [type=search],.yst-root [type=tel],.yst-root [type=text],.yst-root [type=time],.yst-root [type=url],.yst-root [type=week]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root [type=date]:focus,.yst-root [type=datetime-local]:focus,.yst-root [type=email]:focus,.yst-root [type=month]:focus,.yst-root [type=number]:focus,.yst-root [type=password]:focus,.yst-root [type=search]:focus,.yst-root [type=tel]:focus,.yst-root [type=text]:focus,.yst-root [type=time]:focus,.yst-root [type=url]:focus,.yst-root [type=week]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder{color:#6b7280;opacity:1}.yst-root [type=date]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=datetime-local]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=email]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=month]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=number]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=password]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=search]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=tel]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=text]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=time]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=url]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=week]::-webkit-datetime-edit-fields-wrapper{padding:0}.yst-root [type=date]::-webkit-date-and-time-value,.yst-root [type=datetime-local]::-webkit-date-and-time-value,.yst-root [type=email]::-webkit-date-and-time-value,.yst-root [type=month]::-webkit-date-and-time-value,.yst-root [type=number]::-webkit-date-and-time-value,.yst-root [type=password]::-webkit-date-and-time-value,.yst-root [type=search]::-webkit-date-and-time-value,.yst-root [type=tel]::-webkit-date-and-time-value,.yst-root [type=text]::-webkit-date-and-time-value,.yst-root [type=time]::-webkit-date-and-time-value,.yst-root [type=url]::-webkit-date-and-time-value,.yst-root [type=week]::-webkit-date-and-time-value{min-height:1.5em}.yst-root [type=date]::-webkit-datetime-edit,.yst-root [type=date]::-webkit-datetime-edit-day-field,.yst-root [type=date]::-webkit-datetime-edit-hour-field,.yst-root [type=date]::-webkit-datetime-edit-meridiem-field,.yst-root [type=date]::-webkit-datetime-edit-millisecond-field,.yst-root [type=date]::-webkit-datetime-edit-minute-field,.yst-root [type=date]::-webkit-datetime-edit-month-field,.yst-root [type=date]::-webkit-datetime-edit-second-field,.yst-root [type=date]::-webkit-datetime-edit-year-field,.yst-root [type=datetime-local]::-webkit-datetime-edit,.yst-root [type=datetime-local]::-webkit-datetime-edit-day-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-hour-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-meridiem-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-millisecond-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-minute-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-month-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-second-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-year-field,.yst-root [type=email]::-webkit-datetime-edit,.yst-root [type=email]::-webkit-datetime-edit-day-field,.yst-root [type=email]::-webkit-datetime-edit-hour-field,.yst-root [type=email]::-webkit-datetime-edit-meridiem-field,.yst-root [type=email]::-webkit-datetime-edit-millisecond-field,.yst-root [type=email]::-webkit-datetime-edit-minute-field,.yst-root [type=email]::-webkit-datetime-edit-month-field,.yst-root [type=email]::-webkit-datetime-edit-second-field,.yst-root [type=email]::-webkit-datetime-edit-year-field,.yst-root [type=month]::-webkit-datetime-edit,.yst-root [type=month]::-webkit-datetime-edit-day-field,.yst-root [type=month]::-webkit-datetime-edit-hour-field,.yst-root [type=month]::-webkit-datetime-edit-meridiem-field,.yst-root [type=month]::-webkit-datetime-edit-millisecond-field,.yst-root [type=month]::-webkit-datetime-edit-minute-field,.yst-root [type=month]::-webkit-datetime-edit-month-field,.yst-root [type=month]::-webkit-datetime-edit-second-field,.yst-root [type=month]::-webkit-datetime-edit-year-field,.yst-root [type=number]::-webkit-datetime-edit,.yst-root [type=number]::-webkit-datetime-edit-day-field,.yst-root [type=number]::-webkit-datetime-edit-hour-field,.yst-root [type=number]::-webkit-datetime-edit-meridiem-field,.yst-root [type=number]::-webkit-datetime-edit-millisecond-field,.yst-root [type=number]::-webkit-datetime-edit-minute-field,.yst-root [type=number]::-webkit-datetime-edit-month-field,.yst-root [type=number]::-webkit-datetime-edit-second-field,.yst-root [type=number]::-webkit-datetime-edit-year-field,.yst-root [type=password]::-webkit-datetime-edit,.yst-root [type=password]::-webkit-datetime-edit-day-field,.yst-root [type=password]::-webkit-datetime-edit-hour-field,.yst-root [type=password]::-webkit-datetime-edit-meridiem-field,.yst-root [type=password]::-webkit-datetime-edit-millisecond-field,.yst-root [type=password]::-webkit-datetime-edit-minute-field,.yst-root [type=password]::-webkit-datetime-edit-month-field,.yst-root [type=password]::-webkit-datetime-edit-second-field,.yst-root [type=password]::-webkit-datetime-edit-year-field,.yst-root [type=search]::-webkit-datetime-edit,.yst-root [type=search]::-webkit-datetime-edit-day-field,.yst-root [type=search]::-webkit-datetime-edit-hour-field,.yst-root [type=search]::-webkit-datetime-edit-meridiem-field,.yst-root [type=search]::-webkit-datetime-edit-millisecond-field,.yst-root [type=search]::-webkit-datetime-edit-minute-field,.yst-root [type=search]::-webkit-datetime-edit-month-field,.yst-root [type=search]::-webkit-datetime-edit-second-field,.yst-root [type=search]::-webkit-datetime-edit-year-field,.yst-root [type=tel]::-webkit-datetime-edit,.yst-root [type=tel]::-webkit-datetime-edit-day-field,.yst-root [type=tel]::-webkit-datetime-edit-hour-field,.yst-root [type=tel]::-webkit-datetime-edit-meridiem-field,.yst-root [type=tel]::-webkit-datetime-edit-millisecond-field,.yst-root [type=tel]::-webkit-datetime-edit-minute-field,.yst-root [type=tel]::-webkit-datetime-edit-month-field,.yst-root [type=tel]::-webkit-datetime-edit-second-field,.yst-root [type=tel]::-webkit-datetime-edit-year-field,.yst-root [type=text]::-webkit-datetime-edit,.yst-root [type=text]::-webkit-datetime-edit-day-field,.yst-root [type=text]::-webkit-datetime-edit-hour-field,.yst-root [type=text]::-webkit-datetime-edit-meridiem-field,.yst-root [type=text]::-webkit-datetime-edit-millisecond-field,.yst-root [type=text]::-webkit-datetime-edit-minute-field,.yst-root [type=text]::-webkit-datetime-edit-month-field,.yst-root [type=text]::-webkit-datetime-edit-second-field,.yst-root [type=text]::-webkit-datetime-edit-year-field,.yst-root [type=time]::-webkit-datetime-edit,.yst-root [type=time]::-webkit-datetime-edit-day-field,.yst-root [type=time]::-webkit-datetime-edit-hour-field,.yst-root [type=time]::-webkit-datetime-edit-meridiem-field,.yst-root [type=time]::-webkit-datetime-edit-millisecond-field,.yst-root [type=time]::-webkit-datetime-edit-minute-field,.yst-root [type=time]::-webkit-datetime-edit-month-field,.yst-root [type=time]::-webkit-datetime-edit-second-field,.yst-root [type=time]::-webkit-datetime-edit-year-field,.yst-root [type=url]::-webkit-datetime-edit,.yst-root [type=url]::-webkit-datetime-edit-day-field,.yst-root [type=url]::-webkit-datetime-edit-hour-field,.yst-root [type=url]::-webkit-datetime-edit-meridiem-field,.yst-root [type=url]::-webkit-datetime-edit-millisecond-field,.yst-root [type=url]::-webkit-datetime-edit-minute-field,.yst-root [type=url]::-webkit-datetime-edit-month-field,.yst-root [type=url]::-webkit-datetime-edit-second-field,.yst-root [type=url]::-webkit-datetime-edit-year-field,.yst-root [type=week]::-webkit-datetime-edit,.yst-root [type=week]::-webkit-datetime-edit-day-field,.yst-root [type=week]::-webkit-datetime-edit-hour-field,.yst-root [type=week]::-webkit-datetime-edit-meridiem-field,.yst-root [type=week]::-webkit-datetime-edit-millisecond-field,.yst-root [type=week]::-webkit-datetime-edit-minute-field,.yst-root [type=week]::-webkit-datetime-edit-month-field,.yst-root [type=week]::-webkit-datetime-edit-second-field,.yst-root [type=week]::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}.yst-root textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root select{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:left .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-left:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}.yst-root select[multiple]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select[multiple]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:0;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=checkbox]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:checked,.yst-root [type=checkbox]:checked:focus,.yst-root [type=checkbox]:checked:hover,.yst-root [type=checkbox]:indeterminate{background-color:currentColor;border-color:#0000}.yst-root [type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:indeterminate:focus,.yst-root [type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:#0000}.yst-root [type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:100%;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=radio]:checked,.yst-root [type=radio]:checked:focus,.yst-root [type=radio]:checked:hover{background-color:currentColor;border-color:#0000}.yst-root{--tw-text-opacity:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:rgb(71 85 105/var(--tw-text-opacity));font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.8125rem;font-weight:400;line-height:1.5}.yst-root a{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root a:visited{color:#a61e69}.yst-root a:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root a:hover:visited{color:#b94986}.yst-root a:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(99 102 241/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder,.yst-root textarea::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root svg path{stroke-width:inherit}.yst-root .yst-radio__input,.yst-root a:focus{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-radio__input{transition-property:none}.yst-root .yst-radio__input:checked:before{content:var(--tw-content);display:none}.yst-root .yst-modal{z-index:100000!important}.yst-root dd,.yst-root li{margin-bottom:0}.yst-root input[type=date],.yst-root input[type=datetime-local],.yst-root input[type=datetime],.yst-root input[type=email],.yst-root input[type=month],.yst-root input[type=number],.yst-root input[type=password],.yst-root input[type=search],.yst-root input[type=tel],.yst-root input[type=text],.yst-root input[type=time],.yst-root input[type=url],.yst-root input[type=week]{min-height:0}.yst-root input[type=checkbox]{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;min-height:0!important;min-width:0!important;transition-property:none!important}.yst-root input[type=checkbox]:before{--tw-content:none!important;content:var(--tw-content)!important}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.yst-root .yst-alert{border-radius:.375rem;display:flex;gap:.75rem;padding:1rem}.yst-root .yst-alert--info{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.yst-root .yst-alert--info .yst-alert__message{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.yst-root .yst-alert--warning{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.yst-root .yst-alert--warning .yst-alert__message{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.yst-root .yst-alert--success{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.yst-root .yst-alert--success .yst-alert__message{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.yst-root .yst-alert--error{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.yst-root .yst-alert--error .yst-alert__message{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.yst-root .yst-alert__icon{flex-grow:0;flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-autocomplete{position:relative}.yst-root .yst-autocomplete--error .yst-autocomplete__button{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.yst-root .yst-autocomplete--error .yst-autocomplete__button:focus{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity));border-color:rgb(239 68 68/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete--error .yst-autocomplete__input::placeholder{--tw-placeholder-opacity:1;color:rgb(252 165 165/var(--tw-placeholder-opacity))}.yst-root .yst-autocomplete--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-autocomplete--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete__button{--tw-border-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);display:flex;height:100%;padding-right:.75rem;padding-left:.75rem;width:100%}.yst-root .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;left:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-autocomplete__input{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem 0 .5rem 2.5rem;width:100%}.yst-root .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:20}.yst-root .yst-autocomplete__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-autocomplete__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-autocomplete__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-autocomplete__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-badge{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(219 234 254/var(--tw-bg-opacity));border-radius:9999px;color:rgb(30 64 175/var(--tw-text-opacity));display:inline-flex;font-size:.75rem;font-weight:500;line-height:1.25;padding:.125rem .5rem;vertical-align:middle;white-space:nowrap}.yst-root .yst-badge--info{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity));color:rgb(30 58 138/var(--tw-text-opacity))}.yst-root .yst-badge--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-badge--plain{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}.yst-root .yst-badge--small{font-size:.675rem}.yst-root .yst-badge--large{font-size:1rem;padding-right:.75rem;padding-left:.75rem}.yst-root .yst-button{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;justify-content:center;line-height:1rem;padding:.5rem .75rem;text-align:center;-webkit-text-decoration-line:none;text-decoration-line:none}.yst-root .yst-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root a.yst-button:focus{border-radius:.375rem}.yst-root a.yst-button:not(.yst-button--tertiary):focus{--tw-ring-offset-color:#fff}.yst-root .yst-button--primary{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));border-color:#0000;color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:visited{color:#fff}.yst-root .yst-button--primary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(143 15 87/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:hover:visited{color:#fff}.yst-root .yst-button--primary:focus{--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(143 15 87/var(--tw-ring-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--secondary{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:visited{color:#1e293b}.yst-root .yst-button--secondary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:hover:visited{color:#1e293b}.yst-root .yst-button--secondary:focus{--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(143 15 87/var(--tw-ring-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--tertiary{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:initial;border-style:none;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:visited{color:#83084e}.yst-root .yst-button--tertiary:hover{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:hover:visited{color:#83084e}.yst-root .yst-button--tertiary:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(143 15 87/var(--tw-ring-opacity));--tw-ring-offset-width:2px;--tw-ring-offset-color:#0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(131 8 78/var(--tw-text-opacity))}.yst-root .yst-button--error{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity));border-color:#0000;color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:visited{color:#fff}.yst-root .yst-button--error:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:hover:visited{color:#fff}.yst-root .yst-button--error:focus{--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity));border-color:#0000;color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:visited{color:#78350f}.yst-root .yst-button--upsell:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:hover:visited{color:#78350f}.yst-root .yst-button--upsell:focus{--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(251 191 36/var(--tw-ring-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--large{font-size:1rem;line-height:1.25rem;padding:.75rem 1.5rem}.yst-root .yst-button--small{font-size:.75rem;padding:.375rem .625rem}.yst-root .yst-button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-button--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-checkbox{align-items:center;display:flex}.yst-root .yst-checkbox--disabled .yst-checkbox__input,.yst-root .yst-checkbox--disabled .yst-checkbox__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.25rem;color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-checkbox__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-checkbox__label{margin-right:.75rem}.yst-root .yst-code{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;line-height:1.25;margin:0;padding:.25rem}.yst-root .yst-code--block{display:block;margin-bottom:.5rem;margin-top:.5rem;max-width:100%;overflow-x:auto;padding:.25rem .5rem;white-space:nowrap}.yst-root .yst-file-input{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border:2px dashed rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;padding:1.25rem 1.5rem 1.5rem;text-align:center;transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:100%}.yst-root .yst-file-input.yst-is-drag-over{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(250 243 247/var(--tw-bg-opacity));border-color:rgb(205 130 171/var(--tw-border-opacity))}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__content{pointer-events:none}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__icon{--tw-translate-y:-0.5rem;--tw-text-opacity:1;color:rgb(185 73 134/var(--tw-text-opacity));transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-file-input.yst-is-disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-file-input.yst-is-disabled .yst-file-input__select-label{cursor:not-allowed}.yst-root .yst-file-input__content{align-items:center;display:inline-flex;flex-direction:column;max-width:20rem}.yst-root .yst-file-input__content>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-input__content{text-align:center}.yst-root .yst-file-input__icon{stroke-width:1;--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:3rem;margin-right:auto;margin-left:auto;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:3rem}.yst-root .yst-file-input__icon>path{stroke-width:1}.yst-root .yst-file-input__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-file-input__input:focus+.yst-file-input__select-label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-input__labels{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;font-weight:400}.yst-root .yst-file-input__select-label{border-radius:.375rem;font-weight:500}[dir=rtl] .yst-root .yst-file-input__labels{flex-direction:row-reverse}.yst-root .yst-label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;font-weight:500}.yst-root .yst-link{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));cursor:pointer;-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root .yst-link:visited{color:#a61e69}.yst-root .yst-link:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root .yst-link:hover:visited{color:#b94986}.yst-root .yst-link:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(99 102 241/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-link--primary{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus,.yst-root .yst-link--primary:hover{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(154 22 96/var(--tw-ring-opacity))}.yst-root .yst-link--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-link--error:focus,.yst-root .yst-link--error:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-link--error:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity))}.yst-root .yst-paper{--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);display:flex;flex-direction:column}.yst-root .yst-paper__header{border-bottom-width:1px;padding:2rem}.yst-root .yst-paper__content{flex-grow:1;padding:2rem}.yst-root .yst-progress-bar{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;display:block;overflow:hidden;width:100%}.yst-root .yst-progress-bar__progress{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));border-radius:9999px;display:block;height:.375rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:linear}.yst-root .yst-radio{align-items:center;display:flex}.yst-root .yst-radio--disabled .yst-radio__check,.yst-root .yst-radio--disabled .yst-radio__input,.yst-root .yst-radio--disabled .yst-radio__label{cursor:not-allowed;opacity:.5}.yst-root .yst-radio--disabled .yst-radio__check:focus,.yst-root .yst-radio--disabled .yst-radio__input:focus,.yst-root .yst-radio--disabled .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block{display:inline-flex}.yst-root .yst-radio--inline-block .yst-radio__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:#0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__check{visibility:visible}.yst-root .yst-radio--inline-block .yst-radio__input:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-offset-width:1px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__content{position:relative}.yst-root .yst-radio--inline-block .yst-radio__label{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:flex;font-size:1rem;height:3.5rem;justify-content:center;margin-right:0;width:3.5rem}.yst-root .yst-radio--inline-block .yst-radio__label:hover{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.yst-root .yst-radio--inline-block .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio--inline-block .yst-radio__check{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity));height:1.25rem;position:absolute;left:.125rem;top:.125rem;visibility:hidden;width:1.25rem}.yst-root .yst-radio__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-radio__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-radio__label{margin-right:.75rem}.yst-root .yst-select{position:relative}.yst-root .yst-select--disabled .yst-select__button,.yst-root .yst-select--disabled .yst-select__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select__button{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;line-height:1.5rem;padding:.5rem .75rem;position:relative;text-align:right;width:100%}.yst-root .yst-select__button:focus{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;left:.625rem;top:.625rem;width:1.25rem}.yst-root .yst-select__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:10}.yst-root .yst-select__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-select__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-select__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(154 22 96/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__button-label,.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-select__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-skeleton-loader{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;display:block;height:auto;overflow:hidden;position:relative;width:-moz-fit-content;width:fit-content}.yst-root .yst-skeleton-loader:after{--tw-translate-x:-100%;animation:wave 2.5s linear .5s infinite;background:linear-gradient(-90deg,#0000,#00000012,#0000);bottom:0;content:"";right:0;position:absolute;left:0;top:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes wave{0%{transform:translateX(100%)}50%,to{transform:translateX(-100%)}}.yst-root .yst-tag-input{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;flex-wrap:wrap;font-size:.8125rem;gap:.375rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-tag-input::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root .yst-tag-input{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-tag-input:focus-within{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-input--disabled:focus-within{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:rgb(203 213 225/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus,.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(148 163 184/var(--tw-text-opacity))}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__input{cursor:not-allowed}.yst-root .yst-tag-input__tag{cursor:pointer;gap:.125rem;min-height:20px;padding-inline-end:.125rem}.yst-root .yst-tag-input__tag:hover{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input__tag:focus,.yst-root .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__remove-tag{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1rem;justify-content:center;width:1rem}.yst-root .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__input{border-style:none;display:inline-flex;flex:1 1 0%;font-size:.8125rem;margin:0;padding:0}.yst-root .yst-tag-input__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-text-input:focus{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-text-input--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-text-input--read-only{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:rgb(248 250 252/var(--tw-bg-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(100 116 139/var(--tw-text-opacity));cursor:default}.yst-root .yst-text-input[type=date]::-webkit-calendar-picker-indicator{background-image:url('data:image/svg+xml;charset=utf-8,');background-position:50%;background-size:contain;height:1.25rem;padding:0;width:1.25rem}.yst-root .yst-text-input--empty[type=date]:not(:focus)::-webkit-datetime-edit{opacity:0}.yst-root .yst-text-input--empty[type=date]:not(:focus):before{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));content:attr(placeholder);flex-grow:1}.yst-root .yst-textarea{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-textarea:focus{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-textarea--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-textarea--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-title{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity));font-weight:500;line-height:1.25}.yst-root .yst-title--1{font-size:1.5rem}.yst-root .yst-title--2{font-size:1.125rem}.yst-root .yst-title--3{font-size:.875rem}.yst-root .yst-title--4{font-size:1rem}.yst-root .yst-title--5{font-size:.8125rem}.yst-root .yst-toggle{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));border-color:#0000;border-radius:9999px;border-width:2px;cursor:pointer;display:inline-flex;flex-shrink:0;height:1.5rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2.75rem}.yst-root .yst-toggle:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-toggle--checked{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-toggle--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-toggle--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-toggle__handle{--tw-translate-x:0px;--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:9999px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;height:1.25rem;justify-content:center;pointer-events:none;position:relative;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1.25rem}.yst-root .yst-toggle__icon{stroke:currentColor;stroke-width:2;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-grow:0;flex-shrink:0;height:.625rem;transition-duration:.1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:.625rem}.yst-root .yst-toggle__icon--check{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-toggle__icon--x{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}[dir=rtl] .yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:-1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-validation-icon{pointer-events:none}.yst-root .yst-validation-icon--success{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.yst-root .yst-validation-icon--info{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.yst-root .yst-validation-icon--warning{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.yst-root .yst-validation-icon--error{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-validation-input{position:relative}.yst-root .yst-validation-input--success .yst-validation-input__input{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--success .yst-validation-input__input:focus,.yst-root .yst-validation-input--success .yst-validation-input__input:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity));border-color:rgb(34 197 94/var(--tw-border-opacity))}.yst-root .yst-validation-input--info .yst-validation-input__input{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--info .yst-validation-input__input:focus,.yst-root .yst-validation-input--info .yst-validation-input__input:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity));border-color:rgb(59 130 246/var(--tw-border-opacity))}.yst-root .yst-validation-input--warning .yst-validation-input__input{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--warning .yst-validation-input__input:focus,.yst-root .yst-validation-input--warning .yst-validation-input__input:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity));border-color:rgb(245 158 11/var(--tw-border-opacity))}.yst-root .yst-validation-input--error .yst-validation-input__input{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--error .yst-validation-input__input:focus,.yst-root .yst-validation-input--error .yst-validation-input__input:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity));border-color:rgb(239 68 68/var(--tw-border-opacity))}.yst-root .yst-validation-input__icon{height:1.25rem;position:absolute;left:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-validation-message a{color:inherit;font-weight:500}.yst-root .yst-validation-message a:visited:hover{color:inherit}.yst-root .yst-validation-message a:focus{--tw-ring-color:currentColor}.yst-root .yst-validation-message--success{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.yst-root .yst-validation-message--info{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.yst-root .yst-validation-message--warning{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.yst-root .yst-validation-message--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-autocomplete-field__description,.yst-root .yst-autocomplete-field__validation{margin-top:.5rem}.yst-root .yst-card{display:flex;flex-direction:column;position:relative}.yst-root .yst-card>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-card{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);overflow:hidden;padding:1.5rem;transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-card__header{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 244 246/var(--tw-bg-opacity));display:flex;height:6rem;justify-content:center;margin-right:-1.5rem;margin-left:-1.5rem;margin-top:-1.5rem;padding:1.5rem;position:relative}.yst-root .yst-card__content{flex-grow:1}.yst-root .yst-card__footer{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity));border-top-width:1px;padding-top:1.5rem}.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__description,.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox-group__label{margin-bottom:.5rem}.yst-root .yst-checkbox-group__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-checkbox-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-feature-upsell{position:relative}.yst-root .yst-feature-upsell--default{--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.yst-root .yst-feature-upsell--card{padding:1.5rem}.yst-root .yst-file-import>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-import__feedback{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);padding:1rem}.yst-root .yst-file-import__feedback-header{align-items:flex-start;display:flex}.yst-root .yst-file-import__feedback-header>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-left:calc(1rem*var(--tw-space-x-reverse))}.yst-root .yst-file-import__feedback-figure{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 229 237/var(--tw-bg-opacity));border-radius:9999px;display:flex;height:2rem;justify-content:center;width:2rem}.yst-root .yst-file-import__feedback-figure>svg{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity));height:1.25rem;width:1.25rem}.yst-root .yst-file-import__feedback-title{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:block;font-weight:500;margin-bottom:.125rem;overflow-wrap:break-word}.yst-root .yst-file-import__feedback-description{display:block;font-size:.75rem;font-weight:500}.yst-root .yst-file-import__abort-button{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(241 245 249/var(--tw-bg-opacity));border-radius:9999px;color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1.25rem;justify-content:center;width:1.25rem}.yst-root .yst-file-import__abort-button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(71 85 105/var(--tw-text-opacity))}.yst-root .yst-file-import__abort-button:focus{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-import__abort-button>svg{height:.75rem;width:.75rem}.yst-root .yst-file-import__abort-button>svg>path{stroke-width:3}.yst-root .yst-modal{bottom:0;right:0;padding:1rem;position:fixed;left:0;top:0;z-index:10}@media (min-width:640px){.yst-root .yst-modal{padding:2rem}}@media (min-width:768px){.yst-root .yst-modal{padding:5rem}}.yst-root .yst-modal__layout{display:flex;min-height:100%}.yst-root .yst-modal--center .yst-modal__layout{align-items:center;justify-content:center}.yst-root .yst-modal--top-center .yst-modal__layout{align-items:flex-start;justify-content:center}.yst-root .yst-modal__overlay{--tw-bg-opacity:0.75;background-color:rgb(100 116 139/var(--tw-bg-opacity));bottom:0;right:0;position:fixed;left:0;top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-modal__panel{--tw-bg-opacity:1;--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);max-width:36rem;overflow:hidden;padding:1.5rem;position:relative;width:100%}.yst-root .yst-modal__close{display:block;position:absolute;left:1rem;top:1rem}.yst-root .yst-modal__close-button{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(148 163 184/var(--tw-text-opacity));position:relative;z-index:10}.yst-root .yst-modal__close-button:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-modal__close-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-modal__container{display:flex;flex-direction:column;max-height:calc(100vh - 2rem)}@media (min-width:640px){.yst-root .yst-modal__container{max-height:calc(100vh - 4rem)}}@media (min-width:768px){.yst-root .yst-modal__container{max-height:calc(100vh - 10rem)}}.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 5rem)}@media (min-width:640px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 7rem)}}@media (min-width:768px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 13rem)}}.yst-root .yst-modal__container-footer,.yst-root .yst-modal__container-header{flex-shrink:0}.yst-root .yst-modal__container-content{overflow:auto}.yst-root .yst-modal__panel .yst-modal__container-content{margin-right:-1.5rem;margin-left:-1.5rem;padding-right:1.5rem;padding-left:1.5rem}.yst-root .yst-notifications{display:flex;flex-direction:column;max-height:calc(100vh - 4rem);max-width:calc(100vw - 4rem);pointer-events:none;position:fixed;width:100%;z-index:20}.yst-root .yst-notifications>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-notifications--bottom-center{align-items:center;bottom:2rem}.yst-root .yst-notifications--bottom-left{bottom:2rem;right:2rem}.yst-root .yst-notifications--top-center{align-items:center;top:2rem}.yst-root .yst-notification{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);max-width:100%;overflow-y:auto;padding:1rem;pointer-events:auto;width:20rem;z-index:20}.yst-root .yst-notification--large{width:24rem}.yst-root .yst-notification__icon{height:1.25rem;width:1.25rem}.yst-root .yst-pagination{display:inline-flex;isolation:isolate}.yst-root .yst-pagination>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*(1 - var(--tw-space-x-reverse)));margin-left:calc(-1px*var(--tw-space-x-reverse))}.yst-root .yst-pagination{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-pagination-display__text{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));font-weight:400;padding:.5rem .75rem}.yst-root .yst-pagination-display__current-text{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity));font-weight:600}.yst-root .yst-pagination-display__truncated{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));align-self:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;font-size:.8125rem;font-weight:600;padding:.5rem 1rem}.yst-root .yst-pagination__button{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;padding:.5rem;position:relative}.yst-root .yst-pagination__button:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.yst-root .yst-pagination__button:focus{outline-color:#a61e69;outline-offset:0;z-index:20}.yst-root .yst-pagination__button--active{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:rgb(166 30 105/var(--tw-bg-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(255 255 255/var(--tw-text-opacity));font-size:.8125rem;font-weight:600;z-index:10}.yst-root .yst-pagination__button--active:hover{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-pagination__button--active:focus{z-index:20}.yst-root .yst-pagination__button--active:focus-visible{border-radius:.125rem;outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root .yst-pagination__button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-pagination__button--disabled:hover{background-color:initial}.yst-root .yst-pagination__button--disabled:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio-group--inline-block .yst-radio-group__options{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}.yst-root .yst-radio-group--disabled .yst-radio-group__description,.yst-root .yst-radio-group--disabled .yst-radio-group__label{opacity:.5}.yst-root .yst-radio-group--disabled .yst-radio-group__label{cursor:not-allowed}.yst-root .yst-radio-group__label{margin-bottom:.5rem}.yst-root .yst-radio-group__options{display:flex;flex-direction:column;gap:.5rem}.yst-root .yst-radio-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-select-field--disabled .yst-select-field__description,.yst-root .yst-select-field--disabled .yst-select-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select-field__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-select-field__description,.yst-root .yst-select-field__validation{margin-top:.5rem}.yst-root .yst-mobile-navigation__top{position:sticky;top:0;width:100%;z-index:50}.yst-root .yst-mobile-navigation__dialog{bottom:0;display:flex;right:0;position:fixed;left:0;top:0;z-index:50}.yst-root .yst-tag-field--disabled .yst-tag-field__description,.yst-root .yst-tag-field--disabled .yst-tag-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-field__description,.yst-root .yst-tag-field__validation{margin-top:.5rem}.yst-root .yst-text-field--disabled .yst-text-field__description,.yst-root .yst-text-field--disabled .yst-text-field__label{opacity:.5}.yst-root .yst-text-field--disabled .yst-text-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-text-field__label{cursor:default}.yst-root .yst-text-field__description,.yst-root .yst-text-field__validation{margin-top:.5rem}.yst-root .yst-textarea-field--disabled .yst-textarea-field__description,.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{opacity:.5}.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-textarea-field__label{cursor:default}.yst-root .yst-textarea-field__description,.yst-root .yst-textarea-field__validation{margin-top:.5rem}.yst-root .yst-toggle-field{display:flex;flex-direction:column;gap:.25rem}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{opacity:.5}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{cursor:not-allowed}.yst-root .yst-toggle-field__header{align-items:center;display:flex;flex-direction:row;gap:1.5rem;justify-content:space-between}.yst-root .yst-toggle-field__label-wrapper{align-items:center;display:flex;gap:.25rem}.yst-root .yst-toggle-field__description{margin-left:4.25rem}.yst-sr-only{clip:rect(0,0,0,0)!important;border-width:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.yst-pointer-events-none{pointer-events:none!important}.yst-invisible{visibility:hidden!important}.yst-fixed{position:fixed!important}.yst-absolute{position:absolute!important}.yst-relative{position:relative!important}.yst-inset-0{bottom:0!important;top:0!important}.yst-inset-0,.yst-inset-x-0{right:0!important;left:0!important}.yst-top-0{top:0!important}.yst-right-0{left:0!important}.yst--left-3{right:-.75rem!important}.yst-right-2{left:.5rem!important}.yst-left-0{right:0!important}.yst-z-30{z-index:30!important}.yst-z-40{z-index:40!important}.yst-z-10{z-index:10!important}.yst-m-0{margin:0!important}.yst--mx-6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.yst-my-0\.5{margin-bottom:.125rem!important;margin-top:.125rem!important}.yst-my-0{margin-bottom:0!important;margin-top:0!important}.yst-mx-\[calc\(50\%-50vw\)\]{margin-right:calc(50% - 50vw)!important;margin-left:calc(50% - 50vw)!important}.yst-mx-1\.5{margin-right:.375rem!important;margin-left:.375rem!important}.yst-mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.yst-mx-auto{margin-right:auto!important;margin-left:auto!important}.yst--ml-1{margin-right:-.25rem!important}.yst-mt-6{margin-top:1.5rem!important}.yst-mt-1\.5{margin-top:.375rem!important}.yst-mt-1{margin-top:.25rem!important}.yst-ml-4{margin-right:1rem!important}.yst-ml-8{margin-right:2rem!important}.yst--mr-14{margin-left:-3.5rem!important}.yst-mb-2{margin-bottom:.5rem!important}.yst-mr-4{margin-left:1rem!important}.yst-mr-2{margin-left:.5rem!important}.yst-mb-px{margin-bottom:1px!important}.yst-mt-4{margin-top:1rem!important}.yst-mr-1{margin-left:.25rem!important}.yst-mb-8{margin-bottom:2rem!important}.yst-ml-3{margin-right:.75rem!important}.yst-mt-8{margin-top:2rem!important}.yst-mb-0{margin-bottom:0!important}.yst-mt-2{margin-top:.5rem!important}.yst-ml-1{margin-right:.25rem!important}.yst-mt-3{margin-top:.75rem!important}.yst-mr-1\.5{margin-left:.375rem!important}.yst-mb-6{margin-bottom:1.5rem!important}.yst-mb-4{margin-bottom:1rem!important}.yst-mt-2\.5{margin-top:.625rem!important}.yst--mt-10{margin-top:-2.5rem!important}.yst-mr-\[calc\(2\.5rem-1px\)\]{margin-left:calc(2.5rem - 1px)!important}.yst-mb-1{margin-bottom:.25rem!important}.yst--ml-3{margin-right:-.75rem!important}.yst-mb-3{margin-bottom:.75rem!important}.yst-mr-5{margin-left:1.25rem!important}.yst-mr-3{margin-left:.75rem!important}.yst-ml-2{margin-right:.5rem!important}.yst-block{display:block!important}.yst-inline-block{display:inline-block!important}.yst-flex{display:flex!important}.yst-inline-flex{display:inline-flex!important}.yst-hidden{display:none!important}.yst-h-5{height:1.25rem!important}.yst-h-6{height:1.5rem!important}.yst-h-4{height:1rem!important}.yst-h-12{height:3rem!important}.yst-h-0{height:0!important}.yst-h-full{height:100%!important}.yst-h-16{height:4rem!important}.yst-h-7{height:1.75rem!important}.yst-h-3{height:.75rem!important}.yst-h-8{height:2rem!important}.yst-h-2\.5{height:.625rem!important}.yst-h-2{height:.5rem!important}.yst-h-10{height:2.5rem!important}.yst-h-\[273px\]{height:273px!important}.yst-h-\[265px\]{height:265px!important}.yst-h-auto{height:auto!important}.yst-max-h-\[370px\]{max-height:370px!important}.yst-w-5{width:1.25rem!important}.yst-w-6{width:1.5rem!important}.yst-w-0{width:0!important}.yst-w-full{width:100%!important}.yst-w-4{width:1rem!important}.yst-w-12{width:3rem!important}.yst-w-2{width:.5rem!important}.yst-w-3{width:.75rem!important}.yst-w-8{width:2rem!important}.yst-w-7{width:1.75rem!important}.yst-w-1\/3{width:33.333333%!important}.yst-w-10\/12{width:83.333333%!important}.yst-w-9\/12{width:75%!important}.yst-w-7\/12{width:58.333333%!important}.yst-w-11\/12{width:91.666667%!important}.yst-w-8\/12{width:66.666667%!important}.yst-w-\[527px\]{width:527px!important}.yst-w-\[507px\]{width:507px!important}.yst-min-w-full{min-width:100%!important}.yst-max-w-xs{max-width:20rem!important}.yst-max-w-lg{max-width:32rem!important}.yst-max-w-xl{max-width:36rem!important}.yst-max-w-3xl{max-width:48rem!important}.yst-max-w-\[400px\]{max-width:400px!important}.yst-flex-1{flex:1 1 0%!important}.yst-flex-shrink-0,.yst-shrink-0{flex-shrink:0!important}.yst-flex-grow,.yst-grow{flex-grow:1!important}.yst-translate-y-4{--tw-translate-y:1rem!important}.yst-translate-y-0,.yst-translate-y-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-translate-y-0{--tw-translate-y:0px!important}.yst-translate-y-full{--tw-translate-y:100%!important}.yst--translate-y-full,.yst-translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst--translate-y-full{--tw-translate-y:-100%!important}.yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.yst-scale-100,.yst-scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important}.yst-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@keyframes yst-spin{to{transform:rotate(-1turn)}}.yst-animate-spin{animation:yst-spin 1s linear infinite!important}.yst-cursor-wait{cursor:wait!important}.yst-cursor-default{cursor:default!important}.yst-list-disc{list-style-type:disc!important}.yst-flex-row{flex-direction:row!important}.yst-flex-col{flex-direction:column!important}.yst-flex-wrap{flex-wrap:wrap!important}.yst-place-content-end{place-content:end!important}.yst-items-start{align-items:flex-start!important}.yst-items-center{align-items:center!important}.yst-justify-center{justify-content:center!important}.yst-justify-between{justify-content:space-between!important}.yst-gap-2{gap:.5rem!important}.yst-gap-3{gap:.75rem!important}.yst-gap-1{gap:.25rem!important}.yst-gap-x-3{column-gap:.75rem!important}.yst-gap-y-1{row-gap:.25rem!important}.yst-gap-x-4{column-gap:1rem!important}.yst-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(2rem*var(--tw-space-y-reverse))!important;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.25rem*var(--tw-space-y-reverse))!important;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-right:calc(2rem*(1 - var(--tw-space-x-reverse)))!important;margin-left:calc(2rem*var(--tw-space-x-reverse))!important}.yst-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-right:calc(.75rem*(1 - var(--tw-space-x-reverse)))!important;margin-left:calc(.75rem*var(--tw-space-x-reverse))!important}.yst--space-y-\[1px\]>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(-1px*var(--tw-space-y-reverse))!important;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)))!important}.yst-divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0!important;border-bottom-width:calc(1px*var(--tw-divide-y-reverse))!important;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))!important}.yst-divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(229 231 235/var(--tw-divide-opacity))!important}.yst-divide-slate-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(203 213 225/var(--tw-divide-opacity))!important}.yst-overflow-hidden{overflow:hidden!important}.yst-overflow-y-auto{overflow-y:auto!important}.yst-rounded-md{border-radius:.375rem!important}.yst-rounded-full{border-radius:9999px!important}.yst-rounded-lg{border-radius:.5rem!important}.yst-rounded-3xl{border-radius:1.5rem!important}.yst-rounded-none{border-radius:0!important}.yst-rounded-l-md{border-bottom-right-radius:.375rem!important;border-top-right-radius:.375rem!important}.yst-rounded-r-md{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}.yst-rounded-t-\[14px\]{border-top-right-radius:14px!important;border-top-left-radius:14px!important}.yst-border{border-width:1px!important}.yst-border-b{border-bottom-width:1px!important}.yst-border-r{border-left-width:1px!important}.yst-border-l{border-right-width:1px!important}.yst-border-dashed{border-style:dashed!important}.yst-border-none{border-style:none!important}.yst-border-slate-200{--tw-border-opacity:1!important;border-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-gray-200{--tw-border-opacity:1!important;border-color:rgb(229 231 235/var(--tw-border-opacity))!important}.yst-border-primary-500{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.yst-border-r-slate-200{--tw-border-opacity:1!important;border-left-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-bg-white{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.yst-bg-slate-600{--tw-bg-opacity:1!important;background-color:rgb(71 85 105/var(--tw-bg-opacity))!important}.yst-bg-slate-100{--tw-bg-opacity:1!important;background-color:rgb(241 245 249/var(--tw-bg-opacity))!important}.yst-bg-slate-200{--tw-bg-opacity:1!important;background-color:rgb(226 232 240/var(--tw-bg-opacity))!important}.yst-bg-slate-50{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.yst-bg-gray-100{--tw-bg-opacity:1!important;background-color:rgb(243 244 246/var(--tw-bg-opacity))!important}.yst-bg-red-100{--tw-bg-opacity:1!important;background-color:rgb(254 226 226/var(--tw-bg-opacity))!important}.yst-bg-opacity-75{--tw-bg-opacity:0.75!important}.yst-bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))!important}.yst-from-white{--tw-gradient-from:#fff!important;--tw-gradient-to:#fff0!important;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)!important}.yst-stroke-3{stroke-width:3px!important}.yst-p-1{padding:.25rem!important}.yst-p-0{padding:0!important}.yst-p-4{padding:1rem!important}.yst-p-10{padding:2.5rem!important}.yst-px-4{padding-right:1rem!important;padding-left:1rem!important}.yst-px-3{padding-right:.75rem!important;padding-left:.75rem!important}.yst-py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.yst-py-6{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.yst-px-2{padding-right:.5rem!important;padding-left:.5rem!important}.yst-py-4{padding-bottom:1rem!important;padding-top:1rem!important}.yst-py-1\.5{padding-bottom:.375rem!important;padding-top:.375rem!important}.yst-py-1{padding-bottom:.25rem!important}.yst-pt-1,.yst-py-1{padding-top:.25rem!important}.yst-pb-1{padding-bottom:.25rem!important}.yst-pb-10{padding-bottom:2.5rem!important}.yst-pt-6{padding-top:1.5rem!important}.yst-pt-\[56\.25\%\]{padding-top:56.25%!important}.yst-text-left{text-align:right!important}.yst-text-center{text-align:center!important}.yst-text-right{text-align:left!important}.yst-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.yst-text-sm{font-size:.8125rem!important}.yst-text-\[11px\]{font-size:11px!important}.yst-text-xs{font-size:.75rem!important}.yst-text-lg{font-size:1.125rem!important}.yst-font-medium{font-weight:500!important}.yst-font-semibold{font-weight:600!important}.yst-font-normal{font-weight:400!important}.yst-uppercase{text-transform:uppercase!important}.yst-text-slate-800{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.yst-text-slate-400{--tw-text-opacity:1!important;color:rgb(148 163 184/var(--tw-text-opacity))!important}.yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-text-slate-900{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.yst-text-slate-600{--tw-text-opacity:1!important;color:rgb(71 85 105/var(--tw-text-opacity))!important}.yst-text-primary-500{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.yst-text-gray-400{--tw-text-opacity:1!important;color:rgb(156 163 175/var(--tw-text-opacity))!important}.yst-text-gray-700{--tw-text-opacity:1!important;color:rgb(55 65 81/var(--tw-text-opacity))!important}.yst-text-red-600{--tw-text-opacity:1!important;color:rgb(220 38 38/var(--tw-text-opacity))!important}.yst-text-slate-700{--tw-text-opacity:1!important;color:rgb(51 65 85/var(--tw-text-opacity))!important}.yst-text-gray-200{--tw-text-opacity:1!important;color:rgb(229 231 235/var(--tw-text-opacity))!important}.yst-no-underline{-webkit-text-decoration-line:none!important;text-decoration-line:none!important}.yst-opacity-0{opacity:0!important}.yst-opacity-100{opacity:1!important}.yst-opacity-25{opacity:.25!important}.yst-opacity-75{opacity:.75!important}.yst-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a!important;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)!important}.yst-shadow,.yst-shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a!important;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)!important}.yst-shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-amber-700\/30{--tw-shadow-color:#b453094d!important;--tw-shadow:var(--tw-shadow-colored)!important}.yst-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.yst-ring-black{--tw-ring-opacity:1!important;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))!important}.yst-ring-gray-200{--tw-ring-opacity:1!important;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))!important}.yst-ring-opacity-5{--tw-ring-opacity:0.05!important}.yst-drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px #00000012) drop-shadow(0 2px 2px #0000000f)!important}.yst-drop-shadow-md,.yst-grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-grayscale{--tw-grayscale:grayscale(100%)!important}.yst-transition-opacity{transition-duration:.15s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-all{transition-duration:.15s!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-delay-200{transition-delay:.2s!important}.yst-duration-1000{transition-duration:1s!important}.yst-duration-200{transition-duration:.2s!important}.yst-duration-300{transition-duration:.3s!important}.yst-duration-150{transition-duration:.15s!important}.yst-duration-100{transition-duration:.1s!important}.yst-duration-75{transition-duration:75ms!important}.yst-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)!important}.yst-ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)!important}.first\:yst-rounded-t-md:first-child{border-top-right-radius:.375rem!important;border-top-left-radius:.375rem!important}.last\:yst-mr-0:last-child{margin-left:0!important}.last\:yst-rounded-b-md:last-child{border-bottom-right-radius:.375rem!important;border-bottom-left-radius:.375rem!important}.odd\:yst-bg-white:nth-child(odd){--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.even\:yst-bg-slate-50:nth-child(2n),.hover\:yst-bg-slate-50:hover{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.hover\:yst-text-slate-500:hover{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.hover\:yst-text-slate-900:hover{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.focus\:yst-outline-none:focus{outline:2px solid #0000!important;outline-offset:2px!important}.focus\:yst-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-1:focus,.focus\:yst-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus\:yst-ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-inset:focus{--tw-ring-inset:inset!important}.focus\:yst-ring-primary-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-offset-2:focus{--tw-ring-offset-width:2px!important}.focus\:yst-ring-offset-1:focus{--tw-ring-offset-width:1px!important}.focus\:yst-ring-offset-transparent:focus{--tw-ring-offset-color:#0000!important}.yst-group:hover .group-hover\:yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}[dir=rtl] .rtl\:yst-rotate-180{--tw-rotate:180deg!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@media (min-width:640px){.sm\:yst-flex{display:flex!important}.sm\:yst-w-auto{width:auto!important}.sm\:yst-translate-y-0{--tw-translate-y:0px!important}.sm\:yst-scale-95,.sm\:yst-translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.sm\:yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-flex-row-reverse{flex-direction:row-reverse!important}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-tailwind-2200.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-tailwind-2200.css deleted file mode 100644 index 2ac3744d..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-tailwind-2200.css +++ /dev/null @@ -1 +0,0 @@ -.yst-root *,.yst-root :after,.yst-root :before{border:0 solid #e5e7eb;box-sizing:border-box}.yst-root :after,.yst-root :before{--tw-content:""}.yst-root{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;margin:0;tab-size:4}.yst-root hr{border-top-width:1px;color:inherit;height:0}.yst-root abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6{font-size:inherit;font-weight:inherit}.yst-root a{color:inherit;text-decoration:inherit}.yst-root b,.yst-root strong{font-weight:bolder}.yst-root code,.yst-root kbd,.yst-root pre,.yst-root samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}.yst-root small{font-size:80%}.yst-root sub,.yst-root sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}.yst-root sub{bottom:-.25em}.yst-root sup{top:-.5em}.yst-root table{border-collapse:collapse;border-color:inherit;text-indent:0}.yst-root button,.yst-root input,.yst-root optgroup,.yst-root select,.yst-root textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}.yst-root button,.yst-root select{text-transform:none}.yst-root [type=button],.yst-root [type=reset],.yst-root [type=submit],.yst-root button{-webkit-appearance:button;background-color:initial;background-image:none}.yst-root :-moz-focusring{outline:auto}.yst-root :-moz-ui-invalid{box-shadow:none}.yst-root progress{vertical-align:initial}.yst-root ::-webkit-inner-spin-button,.yst-root ::-webkit-outer-spin-button{height:auto}.yst-root [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.yst-root ::-webkit-search-decoration{-webkit-appearance:none}.yst-root ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.yst-root summary{display:list-item}.yst-root blockquote,.yst-root dd,.yst-root dl,.yst-root figure,.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6,.yst-root hr,.yst-root p,.yst-root pre{margin:0}.yst-root fieldset{margin:0;padding:0}.yst-root legend{padding:0}.yst-root menu,.yst-root ol,.yst-root ul{list-style:none;margin:0;padding:0}.yst-root textarea{resize:vertical}.yst-root input::placeholder,.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root [role=button],.yst-root button{cursor:pointer}.yst-root :disabled{cursor:default}.yst-root audio,.yst-root canvas,.yst-root embed,.yst-root iframe,.yst-root img,.yst-root object,.yst-root svg,.yst-root video{display:block;vertical-align:middle}.yst-root img,.yst-root video{height:auto;max-width:100%}.yst-root [type=date],.yst-root [type=datetime-local],.yst-root [type=email],.yst-root [type=month],.yst-root [type=number],.yst-root [type=password],.yst-root [type=search],.yst-root [type=tel],.yst-root [type=text],.yst-root [type=time],.yst-root [type=url],.yst-root [type=week]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root [type=date]:focus,.yst-root [type=datetime-local]:focus,.yst-root [type=email]:focus,.yst-root [type=month]:focus,.yst-root [type=number]:focus,.yst-root [type=password]:focus,.yst-root [type=search]:focus,.yst-root [type=tel]:focus,.yst-root [type=text]:focus,.yst-root [type=time]:focus,.yst-root [type=url]:focus,.yst-root [type=week]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder{color:#6b7280;opacity:1}.yst-root [type=date]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=datetime-local]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=email]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=month]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=number]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=password]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=search]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=tel]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=text]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=time]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=url]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=week]::-webkit-datetime-edit-fields-wrapper{padding:0}.yst-root [type=date]::-webkit-date-and-time-value,.yst-root [type=datetime-local]::-webkit-date-and-time-value,.yst-root [type=email]::-webkit-date-and-time-value,.yst-root [type=month]::-webkit-date-and-time-value,.yst-root [type=number]::-webkit-date-and-time-value,.yst-root [type=password]::-webkit-date-and-time-value,.yst-root [type=search]::-webkit-date-and-time-value,.yst-root [type=tel]::-webkit-date-and-time-value,.yst-root [type=text]::-webkit-date-and-time-value,.yst-root [type=time]::-webkit-date-and-time-value,.yst-root [type=url]::-webkit-date-and-time-value,.yst-root [type=week]::-webkit-date-and-time-value{min-height:1.5em}.yst-root [type=date]::-webkit-datetime-edit,.yst-root [type=date]::-webkit-datetime-edit-day-field,.yst-root [type=date]::-webkit-datetime-edit-hour-field,.yst-root [type=date]::-webkit-datetime-edit-meridiem-field,.yst-root [type=date]::-webkit-datetime-edit-millisecond-field,.yst-root [type=date]::-webkit-datetime-edit-minute-field,.yst-root [type=date]::-webkit-datetime-edit-month-field,.yst-root [type=date]::-webkit-datetime-edit-second-field,.yst-root [type=date]::-webkit-datetime-edit-year-field,.yst-root [type=datetime-local]::-webkit-datetime-edit,.yst-root [type=datetime-local]::-webkit-datetime-edit-day-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-hour-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-meridiem-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-millisecond-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-minute-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-month-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-second-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-year-field,.yst-root [type=email]::-webkit-datetime-edit,.yst-root [type=email]::-webkit-datetime-edit-day-field,.yst-root [type=email]::-webkit-datetime-edit-hour-field,.yst-root [type=email]::-webkit-datetime-edit-meridiem-field,.yst-root [type=email]::-webkit-datetime-edit-millisecond-field,.yst-root [type=email]::-webkit-datetime-edit-minute-field,.yst-root [type=email]::-webkit-datetime-edit-month-field,.yst-root [type=email]::-webkit-datetime-edit-second-field,.yst-root [type=email]::-webkit-datetime-edit-year-field,.yst-root [type=month]::-webkit-datetime-edit,.yst-root [type=month]::-webkit-datetime-edit-day-field,.yst-root [type=month]::-webkit-datetime-edit-hour-field,.yst-root [type=month]::-webkit-datetime-edit-meridiem-field,.yst-root [type=month]::-webkit-datetime-edit-millisecond-field,.yst-root [type=month]::-webkit-datetime-edit-minute-field,.yst-root [type=month]::-webkit-datetime-edit-month-field,.yst-root [type=month]::-webkit-datetime-edit-second-field,.yst-root [type=month]::-webkit-datetime-edit-year-field,.yst-root [type=number]::-webkit-datetime-edit,.yst-root [type=number]::-webkit-datetime-edit-day-field,.yst-root [type=number]::-webkit-datetime-edit-hour-field,.yst-root [type=number]::-webkit-datetime-edit-meridiem-field,.yst-root [type=number]::-webkit-datetime-edit-millisecond-field,.yst-root [type=number]::-webkit-datetime-edit-minute-field,.yst-root [type=number]::-webkit-datetime-edit-month-field,.yst-root [type=number]::-webkit-datetime-edit-second-field,.yst-root [type=number]::-webkit-datetime-edit-year-field,.yst-root [type=password]::-webkit-datetime-edit,.yst-root [type=password]::-webkit-datetime-edit-day-field,.yst-root [type=password]::-webkit-datetime-edit-hour-field,.yst-root [type=password]::-webkit-datetime-edit-meridiem-field,.yst-root [type=password]::-webkit-datetime-edit-millisecond-field,.yst-root [type=password]::-webkit-datetime-edit-minute-field,.yst-root [type=password]::-webkit-datetime-edit-month-field,.yst-root [type=password]::-webkit-datetime-edit-second-field,.yst-root [type=password]::-webkit-datetime-edit-year-field,.yst-root [type=search]::-webkit-datetime-edit,.yst-root [type=search]::-webkit-datetime-edit-day-field,.yst-root [type=search]::-webkit-datetime-edit-hour-field,.yst-root [type=search]::-webkit-datetime-edit-meridiem-field,.yst-root [type=search]::-webkit-datetime-edit-millisecond-field,.yst-root [type=search]::-webkit-datetime-edit-minute-field,.yst-root [type=search]::-webkit-datetime-edit-month-field,.yst-root [type=search]::-webkit-datetime-edit-second-field,.yst-root [type=search]::-webkit-datetime-edit-year-field,.yst-root [type=tel]::-webkit-datetime-edit,.yst-root [type=tel]::-webkit-datetime-edit-day-field,.yst-root [type=tel]::-webkit-datetime-edit-hour-field,.yst-root [type=tel]::-webkit-datetime-edit-meridiem-field,.yst-root [type=tel]::-webkit-datetime-edit-millisecond-field,.yst-root [type=tel]::-webkit-datetime-edit-minute-field,.yst-root [type=tel]::-webkit-datetime-edit-month-field,.yst-root [type=tel]::-webkit-datetime-edit-second-field,.yst-root [type=tel]::-webkit-datetime-edit-year-field,.yst-root [type=text]::-webkit-datetime-edit,.yst-root [type=text]::-webkit-datetime-edit-day-field,.yst-root [type=text]::-webkit-datetime-edit-hour-field,.yst-root [type=text]::-webkit-datetime-edit-meridiem-field,.yst-root [type=text]::-webkit-datetime-edit-millisecond-field,.yst-root [type=text]::-webkit-datetime-edit-minute-field,.yst-root [type=text]::-webkit-datetime-edit-month-field,.yst-root [type=text]::-webkit-datetime-edit-second-field,.yst-root [type=text]::-webkit-datetime-edit-year-field,.yst-root [type=time]::-webkit-datetime-edit,.yst-root [type=time]::-webkit-datetime-edit-day-field,.yst-root [type=time]::-webkit-datetime-edit-hour-field,.yst-root [type=time]::-webkit-datetime-edit-meridiem-field,.yst-root [type=time]::-webkit-datetime-edit-millisecond-field,.yst-root [type=time]::-webkit-datetime-edit-minute-field,.yst-root [type=time]::-webkit-datetime-edit-month-field,.yst-root [type=time]::-webkit-datetime-edit-second-field,.yst-root [type=time]::-webkit-datetime-edit-year-field,.yst-root [type=url]::-webkit-datetime-edit,.yst-root [type=url]::-webkit-datetime-edit-day-field,.yst-root [type=url]::-webkit-datetime-edit-hour-field,.yst-root [type=url]::-webkit-datetime-edit-meridiem-field,.yst-root [type=url]::-webkit-datetime-edit-millisecond-field,.yst-root [type=url]::-webkit-datetime-edit-minute-field,.yst-root [type=url]::-webkit-datetime-edit-month-field,.yst-root [type=url]::-webkit-datetime-edit-second-field,.yst-root [type=url]::-webkit-datetime-edit-year-field,.yst-root [type=week]::-webkit-datetime-edit,.yst-root [type=week]::-webkit-datetime-edit-day-field,.yst-root [type=week]::-webkit-datetime-edit-hour-field,.yst-root [type=week]::-webkit-datetime-edit-meridiem-field,.yst-root [type=week]::-webkit-datetime-edit-millisecond-field,.yst-root [type=week]::-webkit-datetime-edit-minute-field,.yst-root [type=week]::-webkit-datetime-edit-month-field,.yst-root [type=week]::-webkit-datetime-edit-second-field,.yst-root [type=week]::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}.yst-root textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root select{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}.yst-root select[multiple]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select[multiple]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:0;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=checkbox]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:checked,.yst-root [type=checkbox]:checked:focus,.yst-root [type=checkbox]:checked:hover,.yst-root [type=checkbox]:indeterminate{background-color:currentColor;border-color:#0000}.yst-root [type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:indeterminate:focus,.yst-root [type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:#0000}.yst-root [type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:100%;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=radio]:checked,.yst-root [type=radio]:checked:focus,.yst-root [type=radio]:checked:hover{background-color:currentColor;border-color:#0000}.yst-root{--tw-text-opacity:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:rgb(71 85 105/var(--tw-text-opacity));font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.8125rem;font-weight:400;line-height:1.5}.yst-root a{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root a:visited{color:#a61e69}.yst-root a:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root a:hover:visited{color:#b94986}.yst-root a:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(99 102 241/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder,.yst-root textarea::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root svg path{stroke-width:inherit}.yst-root .yst-radio__input,.yst-root a:focus{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-radio__input{transition-property:none}.yst-root .yst-radio__input:checked:before{content:var(--tw-content);display:none}.yst-root .yst-modal{z-index:100000!important}.yst-root dd,.yst-root li{margin-bottom:0}.yst-root input[type=date],.yst-root input[type=datetime-local],.yst-root input[type=datetime],.yst-root input[type=email],.yst-root input[type=month],.yst-root input[type=number],.yst-root input[type=password],.yst-root input[type=search],.yst-root input[type=tel],.yst-root input[type=text],.yst-root input[type=time],.yst-root input[type=url],.yst-root input[type=week]{min-height:0}.yst-root input[type=checkbox]{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;min-height:0!important;min-width:0!important;transition-property:none!important}.yst-root input[type=checkbox]:before{--tw-content:none!important;content:var(--tw-content)!important}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.yst-root .yst-alert{border-radius:.375rem;display:flex;gap:.75rem;padding:1rem}.yst-root .yst-alert--info{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.yst-root .yst-alert--info .yst-alert__message{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.yst-root .yst-alert--warning{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.yst-root .yst-alert--warning .yst-alert__message{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.yst-root .yst-alert--success{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.yst-root .yst-alert--success .yst-alert__message{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.yst-root .yst-alert--error{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.yst-root .yst-alert--error .yst-alert__message{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.yst-root .yst-alert__icon{flex-grow:0;flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-autocomplete{position:relative}.yst-root .yst-autocomplete--error .yst-autocomplete__button{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.yst-root .yst-autocomplete--error .yst-autocomplete__button:focus{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity));border-color:rgb(239 68 68/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete--error .yst-autocomplete__input::placeholder{--tw-placeholder-opacity:1;color:rgb(252 165 165/var(--tw-placeholder-opacity))}.yst-root .yst-autocomplete--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-autocomplete--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete__button{--tw-border-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);display:flex;height:100%;padding-left:.75rem;padding-right:.75rem;width:100%}.yst-root .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;right:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-autocomplete__input{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem 2.5rem .5rem 0;width:100%}.yst-root .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:20}.yst-root .yst-autocomplete__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-autocomplete__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-autocomplete__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-autocomplete__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-badge{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(219 234 254/var(--tw-bg-opacity));border-radius:9999px;color:rgb(30 64 175/var(--tw-text-opacity));display:inline-flex;font-size:.75rem;font-weight:500;line-height:1.25;padding:.125rem .5rem;vertical-align:middle;white-space:nowrap}.yst-root .yst-badge--info{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity));color:rgb(30 58 138/var(--tw-text-opacity))}.yst-root .yst-badge--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-badge--plain{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}.yst-root .yst-badge--small{font-size:.675rem}.yst-root .yst-badge--large{font-size:1rem;padding-left:.75rem;padding-right:.75rem}.yst-root .yst-button{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;justify-content:center;line-height:1rem;padding:.5rem .75rem;text-align:center;-webkit-text-decoration-line:none;text-decoration-line:none}.yst-root .yst-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root a.yst-button:focus{border-radius:.375rem}.yst-root a.yst-button:not(.yst-button--tertiary):focus{--tw-ring-offset-color:#fff}.yst-root .yst-button--primary{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));border-color:#0000;color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:visited{color:#fff}.yst-root .yst-button--primary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(143 15 87/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:hover:visited{color:#fff}.yst-root .yst-button--primary:focus{--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(143 15 87/var(--tw-ring-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--secondary{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:visited{color:#1e293b}.yst-root .yst-button--secondary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:hover:visited{color:#1e293b}.yst-root .yst-button--secondary:focus{--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(143 15 87/var(--tw-ring-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--tertiary{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:initial;border-style:none;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:visited{color:#83084e}.yst-root .yst-button--tertiary:hover{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:hover:visited{color:#83084e}.yst-root .yst-button--tertiary:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(143 15 87/var(--tw-ring-opacity));--tw-ring-offset-width:2px;--tw-ring-offset-color:#0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(131 8 78/var(--tw-text-opacity))}.yst-root .yst-button--error{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity));border-color:#0000;color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:visited{color:#fff}.yst-root .yst-button--error:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:hover:visited{color:#fff}.yst-root .yst-button--error:focus{--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity));border-color:#0000;color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:visited{color:#78350f}.yst-root .yst-button--upsell:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:hover:visited{color:#78350f}.yst-root .yst-button--upsell:focus{--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(251 191 36/var(--tw-ring-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--large{font-size:1rem;line-height:1.25rem;padding:.75rem 1.5rem}.yst-root .yst-button--small{font-size:.75rem;padding:.375rem .625rem}.yst-root .yst-button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-button--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-checkbox{align-items:center;display:flex}.yst-root .yst-checkbox--disabled .yst-checkbox__input,.yst-root .yst-checkbox--disabled .yst-checkbox__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.25rem;color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-checkbox__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-checkbox__label{margin-left:.75rem}.yst-root .yst-code{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;line-height:1.25;margin:0;padding:.25rem}.yst-root .yst-code--block{display:block;margin-bottom:.5rem;margin-top:.5rem;max-width:100%;overflow-x:auto;padding:.25rem .5rem;white-space:nowrap}.yst-root .yst-file-input{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border:2px dashed rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;padding:1.25rem 1.5rem 1.5rem;text-align:center;transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:100%}.yst-root .yst-file-input.yst-is-drag-over{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(250 243 247/var(--tw-bg-opacity));border-color:rgb(205 130 171/var(--tw-border-opacity))}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__content{pointer-events:none}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__icon{--tw-translate-y:-0.5rem;--tw-text-opacity:1;color:rgb(185 73 134/var(--tw-text-opacity));transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-file-input.yst-is-disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-file-input.yst-is-disabled .yst-file-input__select-label{cursor:not-allowed}.yst-root .yst-file-input__content{align-items:center;display:inline-flex;flex-direction:column;max-width:20rem}.yst-root .yst-file-input__content>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-input__content{text-align:center}.yst-root .yst-file-input__icon{stroke-width:1;--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:3rem;margin-left:auto;margin-right:auto;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:3rem}.yst-root .yst-file-input__icon>path{stroke-width:1}.yst-root .yst-file-input__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-file-input__input:focus+.yst-file-input__select-label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-input__labels{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;font-weight:400}.yst-root .yst-file-input__select-label{border-radius:.375rem;font-weight:500}[dir=rtl] .yst-root .yst-file-input__labels{flex-direction:row-reverse}.yst-root .yst-label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;font-weight:500}.yst-root .yst-link{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));cursor:pointer;-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root .yst-link:visited{color:#a61e69}.yst-root .yst-link:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root .yst-link:hover:visited{color:#b94986}.yst-root .yst-link:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(99 102 241/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-link--primary{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus,.yst-root .yst-link--primary:hover{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(154 22 96/var(--tw-ring-opacity))}.yst-root .yst-link--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-link--error:focus,.yst-root .yst-link--error:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-link--error:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity))}.yst-root .yst-paper{--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);display:flex;flex-direction:column}.yst-root .yst-paper__header{border-bottom-width:1px;padding:2rem}.yst-root .yst-paper__content{flex-grow:1;padding:2rem}.yst-root .yst-progress-bar{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;display:block;overflow:hidden;width:100%}.yst-root .yst-progress-bar__progress{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));border-radius:9999px;display:block;height:.375rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:linear}.yst-root .yst-radio{align-items:center;display:flex}.yst-root .yst-radio--disabled .yst-radio__check,.yst-root .yst-radio--disabled .yst-radio__input,.yst-root .yst-radio--disabled .yst-radio__label{cursor:not-allowed;opacity:.5}.yst-root .yst-radio--disabled .yst-radio__check:focus,.yst-root .yst-radio--disabled .yst-radio__input:focus,.yst-root .yst-radio--disabled .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block{display:inline-flex}.yst-root .yst-radio--inline-block .yst-radio__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:#0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__check{visibility:visible}.yst-root .yst-radio--inline-block .yst-radio__input:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-offset-width:1px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__content{position:relative}.yst-root .yst-radio--inline-block .yst-radio__label{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:flex;font-size:1rem;height:3.5rem;justify-content:center;margin-left:0;width:3.5rem}.yst-root .yst-radio--inline-block .yst-radio__label:hover{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.yst-root .yst-radio--inline-block .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio--inline-block .yst-radio__check{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity));height:1.25rem;position:absolute;right:.125rem;top:.125rem;visibility:hidden;width:1.25rem}.yst-root .yst-radio__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-radio__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-radio__label{margin-left:.75rem}.yst-root .yst-select{position:relative}.yst-root .yst-select--disabled .yst-select__button,.yst-root .yst-select--disabled .yst-select__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select__button{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;line-height:1.5rem;padding:.5rem .75rem;position:relative;text-align:left;width:100%}.yst-root .yst-select__button:focus{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;right:.625rem;top:.625rem;width:1.25rem}.yst-root .yst-select__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:10}.yst-root .yst-select__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-select__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-select__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(154 22 96/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__button-label,.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-select__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-skeleton-loader{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;display:block;height:auto;overflow:hidden;position:relative;width:-moz-fit-content;width:fit-content}.yst-root .yst-skeleton-loader:after{--tw-translate-x:-100%;animation:wave 2.5s linear .5s infinite;background:linear-gradient(90deg,#0000,#00000012,#0000);bottom:0;content:"";left:0;position:absolute;right:0;top:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes wave{0%{transform:translateX(-100%)}50%,to{transform:translateX(100%)}}.yst-root .yst-tag-input{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;flex-wrap:wrap;font-size:.8125rem;gap:.375rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-tag-input::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root .yst-tag-input{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-tag-input:focus-within{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-input--disabled:focus-within{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:rgb(203 213 225/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus,.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(148 163 184/var(--tw-text-opacity))}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__input{cursor:not-allowed}.yst-root .yst-tag-input__tag{cursor:pointer;gap:.125rem;min-height:20px;padding-inline-end:.125rem}.yst-root .yst-tag-input__tag:hover{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input__tag:focus,.yst-root .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__remove-tag{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1rem;justify-content:center;width:1rem}.yst-root .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__input{border-style:none;display:inline-flex;flex:1 1 0%;font-size:.8125rem;margin:0;padding:0}.yst-root .yst-tag-input__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-text-input:focus{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-text-input--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-text-input--read-only{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:rgb(248 250 252/var(--tw-bg-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(100 116 139/var(--tw-text-opacity));cursor:default}.yst-root .yst-text-input[type=date]::-webkit-calendar-picker-indicator{background-image:url('data:image/svg+xml;charset=utf-8,');background-position:50%;background-size:contain;height:1.25rem;padding:0;width:1.25rem}.yst-root .yst-text-input--empty[type=date]:not(:focus)::-webkit-datetime-edit{opacity:0}.yst-root .yst-text-input--empty[type=date]:not(:focus):before{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));content:attr(placeholder);flex-grow:1}.yst-root .yst-textarea{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-textarea:focus{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-textarea--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-textarea--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-title{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity));font-weight:500;line-height:1.25}.yst-root .yst-title--1{font-size:1.5rem}.yst-root .yst-title--2{font-size:1.125rem}.yst-root .yst-title--3{font-size:.875rem}.yst-root .yst-title--4{font-size:1rem}.yst-root .yst-title--5{font-size:.8125rem}.yst-root .yst-toggle{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));border-color:#0000;border-radius:9999px;border-width:2px;cursor:pointer;display:inline-flex;flex-shrink:0;height:1.5rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2.75rem}.yst-root .yst-toggle:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-toggle--checked{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-toggle--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-toggle--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-toggle__handle{--tw-translate-x:0px;--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:9999px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;height:1.25rem;justify-content:center;pointer-events:none;position:relative;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1.25rem}.yst-root .yst-toggle__icon{stroke:currentColor;stroke-width:2;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-grow:0;flex-shrink:0;height:.625rem;transition-duration:.1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:.625rem}.yst-root .yst-toggle__icon--check{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-toggle__icon--x{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}[dir=rtl] .yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:-1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-validation-icon{pointer-events:none}.yst-root .yst-validation-icon--success{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.yst-root .yst-validation-icon--info{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.yst-root .yst-validation-icon--warning{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.yst-root .yst-validation-icon--error{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-validation-input{position:relative}.yst-root .yst-validation-input--success .yst-validation-input__input{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--success .yst-validation-input__input:focus,.yst-root .yst-validation-input--success .yst-validation-input__input:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity));border-color:rgb(34 197 94/var(--tw-border-opacity))}.yst-root .yst-validation-input--info .yst-validation-input__input{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--info .yst-validation-input__input:focus,.yst-root .yst-validation-input--info .yst-validation-input__input:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity));border-color:rgb(59 130 246/var(--tw-border-opacity))}.yst-root .yst-validation-input--warning .yst-validation-input__input{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--warning .yst-validation-input__input:focus,.yst-root .yst-validation-input--warning .yst-validation-input__input:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity));border-color:rgb(245 158 11/var(--tw-border-opacity))}.yst-root .yst-validation-input--error .yst-validation-input__input{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--error .yst-validation-input__input:focus,.yst-root .yst-validation-input--error .yst-validation-input__input:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity));border-color:rgb(239 68 68/var(--tw-border-opacity))}.yst-root .yst-validation-input__icon{height:1.25rem;position:absolute;right:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-validation-message a{color:inherit;font-weight:500}.yst-root .yst-validation-message a:visited:hover{color:inherit}.yst-root .yst-validation-message a:focus{--tw-ring-color:currentColor}.yst-root .yst-validation-message--success{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.yst-root .yst-validation-message--info{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.yst-root .yst-validation-message--warning{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.yst-root .yst-validation-message--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-autocomplete-field__description,.yst-root .yst-autocomplete-field__validation{margin-top:.5rem}.yst-root .yst-card{display:flex;flex-direction:column;position:relative}.yst-root .yst-card>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-card{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);overflow:hidden;padding:1.5rem;transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-card__header{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 244 246/var(--tw-bg-opacity));display:flex;height:6rem;justify-content:center;margin-left:-1.5rem;margin-right:-1.5rem;margin-top:-1.5rem;padding:1.5rem;position:relative}.yst-root .yst-card__content{flex-grow:1}.yst-root .yst-card__footer{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity));border-top-width:1px;padding-top:1.5rem}.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__description,.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox-group__label{margin-bottom:.5rem}.yst-root .yst-checkbox-group__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-checkbox-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-feature-upsell{position:relative}.yst-root .yst-feature-upsell--default{--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.yst-root .yst-feature-upsell--card{padding:1.5rem}.yst-root .yst-file-import>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-import__feedback{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);padding:1rem}.yst-root .yst-file-import__feedback-header{align-items:flex-start;display:flex}.yst-root .yst-file-import__feedback-header>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.yst-root .yst-file-import__feedback-figure{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 229 237/var(--tw-bg-opacity));border-radius:9999px;display:flex;height:2rem;justify-content:center;width:2rem}.yst-root .yst-file-import__feedback-figure>svg{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity));height:1.25rem;width:1.25rem}.yst-root .yst-file-import__feedback-title{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:block;font-weight:500;margin-bottom:.125rem;overflow-wrap:break-word}.yst-root .yst-file-import__feedback-description{display:block;font-size:.75rem;font-weight:500}.yst-root .yst-file-import__abort-button{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(241 245 249/var(--tw-bg-opacity));border-radius:9999px;color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1.25rem;justify-content:center;width:1.25rem}.yst-root .yst-file-import__abort-button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(71 85 105/var(--tw-text-opacity))}.yst-root .yst-file-import__abort-button:focus{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-import__abort-button>svg{height:.75rem;width:.75rem}.yst-root .yst-file-import__abort-button>svg>path{stroke-width:3}.yst-root .yst-modal{bottom:0;left:0;padding:1rem;position:fixed;right:0;top:0;z-index:10}@media (min-width:640px){.yst-root .yst-modal{padding:2rem}}@media (min-width:768px){.yst-root .yst-modal{padding:5rem}}.yst-root .yst-modal__layout{display:flex;min-height:100%}.yst-root .yst-modal--center .yst-modal__layout{align-items:center;justify-content:center}.yst-root .yst-modal--top-center .yst-modal__layout{align-items:flex-start;justify-content:center}.yst-root .yst-modal__overlay{--tw-bg-opacity:0.75;background-color:rgb(100 116 139/var(--tw-bg-opacity));bottom:0;left:0;position:fixed;right:0;top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-modal__panel{--tw-bg-opacity:1;--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);max-width:36rem;overflow:hidden;padding:1.5rem;position:relative;width:100%}.yst-root .yst-modal__close{display:block;position:absolute;right:1rem;top:1rem}.yst-root .yst-modal__close-button{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(148 163 184/var(--tw-text-opacity));position:relative;z-index:10}.yst-root .yst-modal__close-button:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-modal__close-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-modal__container{display:flex;flex-direction:column;max-height:calc(100vh - 2rem)}@media (min-width:640px){.yst-root .yst-modal__container{max-height:calc(100vh - 4rem)}}@media (min-width:768px){.yst-root .yst-modal__container{max-height:calc(100vh - 10rem)}}.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 5rem)}@media (min-width:640px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 7rem)}}@media (min-width:768px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 13rem)}}.yst-root .yst-modal__container-footer,.yst-root .yst-modal__container-header{flex-shrink:0}.yst-root .yst-modal__container-content{overflow:auto}.yst-root .yst-modal__panel .yst-modal__container-content{margin-left:-1.5rem;margin-right:-1.5rem;padding-left:1.5rem;padding-right:1.5rem}.yst-root .yst-notifications{display:flex;flex-direction:column;max-height:calc(100vh - 4rem);max-width:calc(100vw - 4rem);pointer-events:none;position:fixed;width:100%;z-index:20}.yst-root .yst-notifications>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-notifications--bottom-center{align-items:center;bottom:2rem}.yst-root .yst-notifications--bottom-left{bottom:2rem;left:2rem}.yst-root .yst-notifications--top-center{align-items:center;top:2rem}.yst-root .yst-notification{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);max-width:100%;overflow-y:auto;padding:1rem;pointer-events:auto;width:20rem;z-index:20}.yst-root .yst-notification--large{width:24rem}.yst-root .yst-notification__icon{height:1.25rem;width:1.25rem}.yst-root .yst-pagination{display:inline-flex;isolation:isolate}.yst-root .yst-pagination>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1px*var(--tw-space-x-reverse))}.yst-root .yst-pagination{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-pagination-display__text{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));font-weight:400;padding:.5rem .75rem}.yst-root .yst-pagination-display__current-text{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity));font-weight:600}.yst-root .yst-pagination-display__truncated{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));align-self:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;font-size:.8125rem;font-weight:600;padding:.5rem 1rem}.yst-root .yst-pagination__button{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;padding:.5rem;position:relative}.yst-root .yst-pagination__button:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.yst-root .yst-pagination__button:focus{outline-color:#a61e69;outline-offset:0;z-index:20}.yst-root .yst-pagination__button--active{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:rgb(166 30 105/var(--tw-bg-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(255 255 255/var(--tw-text-opacity));font-size:.8125rem;font-weight:600;z-index:10}.yst-root .yst-pagination__button--active:hover{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-pagination__button--active:focus{z-index:20}.yst-root .yst-pagination__button--active:focus-visible{border-radius:.125rem;outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root .yst-pagination__button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-pagination__button--disabled:hover{background-color:initial}.yst-root .yst-pagination__button--disabled:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio-group--inline-block .yst-radio-group__options{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}.yst-root .yst-radio-group--disabled .yst-radio-group__description,.yst-root .yst-radio-group--disabled .yst-radio-group__label{opacity:.5}.yst-root .yst-radio-group--disabled .yst-radio-group__label{cursor:not-allowed}.yst-root .yst-radio-group__label{margin-bottom:.5rem}.yst-root .yst-radio-group__options{display:flex;flex-direction:column;gap:.5rem}.yst-root .yst-radio-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-select-field--disabled .yst-select-field__description,.yst-root .yst-select-field--disabled .yst-select-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select-field__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-select-field__description,.yst-root .yst-select-field__validation{margin-top:.5rem}.yst-root .yst-mobile-navigation__top{position:sticky;top:0;width:100%;z-index:50}.yst-root .yst-mobile-navigation__dialog{bottom:0;display:flex;left:0;position:fixed;right:0;top:0;z-index:50}.yst-root .yst-tag-field--disabled .yst-tag-field__description,.yst-root .yst-tag-field--disabled .yst-tag-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-field__description,.yst-root .yst-tag-field__validation{margin-top:.5rem}.yst-root .yst-text-field--disabled .yst-text-field__description,.yst-root .yst-text-field--disabled .yst-text-field__label{opacity:.5}.yst-root .yst-text-field--disabled .yst-text-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-text-field__label{cursor:default}.yst-root .yst-text-field__description,.yst-root .yst-text-field__validation{margin-top:.5rem}.yst-root .yst-textarea-field--disabled .yst-textarea-field__description,.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{opacity:.5}.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-textarea-field__label{cursor:default}.yst-root .yst-textarea-field__description,.yst-root .yst-textarea-field__validation{margin-top:.5rem}.yst-root .yst-toggle-field{display:flex;flex-direction:column;gap:.25rem}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{opacity:.5}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{cursor:not-allowed}.yst-root .yst-toggle-field__header{align-items:center;display:flex;flex-direction:row;gap:1.5rem;justify-content:space-between}.yst-root .yst-toggle-field__label-wrapper{align-items:center;display:flex;gap:.25rem}.yst-root .yst-toggle-field__description{margin-right:4.25rem}.yst-sr-only{clip:rect(0,0,0,0)!important;border-width:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.yst-pointer-events-none{pointer-events:none!important}.yst-invisible{visibility:hidden!important}.yst-fixed{position:fixed!important}.yst-absolute{position:absolute!important}.yst-relative{position:relative!important}.yst-inset-0{bottom:0!important;top:0!important}.yst-inset-0,.yst-inset-x-0{left:0!important;right:0!important}.yst-top-0{top:0!important}.yst-right-0{right:0!important}.yst--left-3{left:-.75rem!important}.yst-right-2{right:.5rem!important}.yst-left-0{left:0!important}.yst-z-30{z-index:30!important}.yst-z-40{z-index:40!important}.yst-z-10{z-index:10!important}.yst-m-0{margin:0!important}.yst--mx-6{margin-left:-1.5rem!important;margin-right:-1.5rem!important}.yst-my-0\.5{margin-bottom:.125rem!important;margin-top:.125rem!important}.yst-my-0{margin-bottom:0!important;margin-top:0!important}.yst-mx-\[calc\(50\%-50vw\)\]{margin-left:calc(50% - 50vw)!important;margin-right:calc(50% - 50vw)!important}.yst-mx-1\.5{margin-left:.375rem!important;margin-right:.375rem!important}.yst-mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.yst-mx-auto{margin-left:auto!important;margin-right:auto!important}.yst--ml-1{margin-left:-.25rem!important}.yst-mt-6{margin-top:1.5rem!important}.yst-mt-1\.5{margin-top:.375rem!important}.yst-mt-1{margin-top:.25rem!important}.yst-ml-4{margin-left:1rem!important}.yst-ml-8{margin-left:2rem!important}.yst--mr-14{margin-right:-3.5rem!important}.yst-mb-2{margin-bottom:.5rem!important}.yst-mr-4{margin-right:1rem!important}.yst-mr-2{margin-right:.5rem!important}.yst-mb-px{margin-bottom:1px!important}.yst-mt-4{margin-top:1rem!important}.yst-mr-1{margin-right:.25rem!important}.yst-mb-8{margin-bottom:2rem!important}.yst-ml-3{margin-left:.75rem!important}.yst-mt-8{margin-top:2rem!important}.yst-mb-0{margin-bottom:0!important}.yst-mt-2{margin-top:.5rem!important}.yst-ml-1{margin-left:.25rem!important}.yst-mt-3{margin-top:.75rem!important}.yst-mr-1\.5{margin-right:.375rem!important}.yst-mb-6{margin-bottom:1.5rem!important}.yst-mb-4{margin-bottom:1rem!important}.yst-mt-2\.5{margin-top:.625rem!important}.yst--mt-10{margin-top:-2.5rem!important}.yst-mr-\[calc\(2\.5rem-1px\)\]{margin-right:calc(2.5rem - 1px)!important}.yst-mb-1{margin-bottom:.25rem!important}.yst--ml-3{margin-left:-.75rem!important}.yst-mb-3{margin-bottom:.75rem!important}.yst-mr-5{margin-right:1.25rem!important}.yst-mr-3{margin-right:.75rem!important}.yst-ml-2{margin-left:.5rem!important}.yst-block{display:block!important}.yst-inline-block{display:inline-block!important}.yst-flex{display:flex!important}.yst-inline-flex{display:inline-flex!important}.yst-hidden{display:none!important}.yst-h-5{height:1.25rem!important}.yst-h-6{height:1.5rem!important}.yst-h-4{height:1rem!important}.yst-h-12{height:3rem!important}.yst-h-0{height:0!important}.yst-h-full{height:100%!important}.yst-h-16{height:4rem!important}.yst-h-7{height:1.75rem!important}.yst-h-3{height:.75rem!important}.yst-h-8{height:2rem!important}.yst-h-2\.5{height:.625rem!important}.yst-h-2{height:.5rem!important}.yst-h-10{height:2.5rem!important}.yst-h-\[273px\]{height:273px!important}.yst-h-\[265px\]{height:265px!important}.yst-h-auto{height:auto!important}.yst-max-h-\[370px\]{max-height:370px!important}.yst-w-5{width:1.25rem!important}.yst-w-6{width:1.5rem!important}.yst-w-0{width:0!important}.yst-w-full{width:100%!important}.yst-w-4{width:1rem!important}.yst-w-12{width:3rem!important}.yst-w-2{width:.5rem!important}.yst-w-3{width:.75rem!important}.yst-w-8{width:2rem!important}.yst-w-7{width:1.75rem!important}.yst-w-1\/3{width:33.333333%!important}.yst-w-10\/12{width:83.333333%!important}.yst-w-9\/12{width:75%!important}.yst-w-7\/12{width:58.333333%!important}.yst-w-11\/12{width:91.666667%!important}.yst-w-8\/12{width:66.666667%!important}.yst-w-\[527px\]{width:527px!important}.yst-w-\[507px\]{width:507px!important}.yst-min-w-full{min-width:100%!important}.yst-max-w-xs{max-width:20rem!important}.yst-max-w-lg{max-width:32rem!important}.yst-max-w-xl{max-width:36rem!important}.yst-max-w-3xl{max-width:48rem!important}.yst-max-w-\[400px\]{max-width:400px!important}.yst-flex-1{flex:1 1 0%!important}.yst-flex-shrink-0,.yst-shrink-0{flex-shrink:0!important}.yst-flex-grow,.yst-grow{flex-grow:1!important}.yst-translate-y-4{--tw-translate-y:1rem!important}.yst-translate-y-0,.yst-translate-y-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-translate-y-0{--tw-translate-y:0px!important}.yst-translate-y-full{--tw-translate-y:100%!important}.yst--translate-y-full,.yst-translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst--translate-y-full{--tw-translate-y:-100%!important}.yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.yst-scale-100,.yst-scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important}.yst-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@keyframes yst-spin{to{transform:rotate(1turn)}}.yst-animate-spin{animation:yst-spin 1s linear infinite!important}.yst-cursor-wait{cursor:wait!important}.yst-cursor-default{cursor:default!important}.yst-list-disc{list-style-type:disc!important}.yst-flex-row{flex-direction:row!important}.yst-flex-col{flex-direction:column!important}.yst-flex-wrap{flex-wrap:wrap!important}.yst-place-content-end{place-content:end!important}.yst-items-start{align-items:flex-start!important}.yst-items-center{align-items:center!important}.yst-justify-center{justify-content:center!important}.yst-justify-between{justify-content:space-between!important}.yst-gap-2{gap:.5rem!important}.yst-gap-3{gap:.75rem!important}.yst-gap-1{gap:.25rem!important}.yst-gap-x-3{column-gap:.75rem!important}.yst-gap-y-1{row-gap:.25rem!important}.yst-gap-x-4{column-gap:1rem!important}.yst-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(2rem*var(--tw-space-y-reverse))!important;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.25rem*var(--tw-space-y-reverse))!important;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(2rem*var(--tw-space-x-reverse))!important}.yst-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.75rem*var(--tw-space-x-reverse))!important}.yst--space-y-\[1px\]>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(-1px*var(--tw-space-y-reverse))!important;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)))!important}.yst-divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0!important;border-bottom-width:calc(1px*var(--tw-divide-y-reverse))!important;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))!important}.yst-divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(229 231 235/var(--tw-divide-opacity))!important}.yst-divide-slate-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(203 213 225/var(--tw-divide-opacity))!important}.yst-overflow-hidden{overflow:hidden!important}.yst-overflow-y-auto{overflow-y:auto!important}.yst-rounded-md{border-radius:.375rem!important}.yst-rounded-full{border-radius:9999px!important}.yst-rounded-lg{border-radius:.5rem!important}.yst-rounded-3xl{border-radius:1.5rem!important}.yst-rounded-none{border-radius:0!important}.yst-rounded-l-md{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}.yst-rounded-r-md{border-bottom-right-radius:.375rem!important;border-top-right-radius:.375rem!important}.yst-rounded-t-\[14px\]{border-top-left-radius:14px!important;border-top-right-radius:14px!important}.yst-border{border-width:1px!important}.yst-border-b{border-bottom-width:1px!important}.yst-border-r{border-right-width:1px!important}.yst-border-l{border-left-width:1px!important}.yst-border-dashed{border-style:dashed!important}.yst-border-none{border-style:none!important}.yst-border-slate-200{--tw-border-opacity:1!important;border-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-gray-200{--tw-border-opacity:1!important;border-color:rgb(229 231 235/var(--tw-border-opacity))!important}.yst-border-primary-500{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.yst-border-r-slate-200{--tw-border-opacity:1!important;border-right-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-bg-white{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.yst-bg-slate-600{--tw-bg-opacity:1!important;background-color:rgb(71 85 105/var(--tw-bg-opacity))!important}.yst-bg-slate-100{--tw-bg-opacity:1!important;background-color:rgb(241 245 249/var(--tw-bg-opacity))!important}.yst-bg-slate-200{--tw-bg-opacity:1!important;background-color:rgb(226 232 240/var(--tw-bg-opacity))!important}.yst-bg-slate-50{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.yst-bg-gray-100{--tw-bg-opacity:1!important;background-color:rgb(243 244 246/var(--tw-bg-opacity))!important}.yst-bg-red-100{--tw-bg-opacity:1!important;background-color:rgb(254 226 226/var(--tw-bg-opacity))!important}.yst-bg-opacity-75{--tw-bg-opacity:0.75!important}.yst-bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))!important}.yst-from-white{--tw-gradient-from:#fff!important;--tw-gradient-to:#fff0!important;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)!important}.yst-stroke-3{stroke-width:3px!important}.yst-p-1{padding:.25rem!important}.yst-p-0{padding:0!important}.yst-p-4{padding:1rem!important}.yst-p-10{padding:2.5rem!important}.yst-px-4{padding-left:1rem!important;padding-right:1rem!important}.yst-px-3{padding-left:.75rem!important;padding-right:.75rem!important}.yst-py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.yst-py-6{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.yst-px-2{padding-left:.5rem!important;padding-right:.5rem!important}.yst-py-4{padding-bottom:1rem!important;padding-top:1rem!important}.yst-py-1\.5{padding-bottom:.375rem!important;padding-top:.375rem!important}.yst-py-1{padding-bottom:.25rem!important}.yst-pt-1,.yst-py-1{padding-top:.25rem!important}.yst-pb-1{padding-bottom:.25rem!important}.yst-pb-10{padding-bottom:2.5rem!important}.yst-pt-6{padding-top:1.5rem!important}.yst-pt-\[56\.25\%\]{padding-top:56.25%!important}.yst-text-left{text-align:left!important}.yst-text-center{text-align:center!important}.yst-text-right{text-align:right!important}.yst-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.yst-text-sm{font-size:.8125rem!important}.yst-text-\[11px\]{font-size:11px!important}.yst-text-xs{font-size:.75rem!important}.yst-text-lg{font-size:1.125rem!important}.yst-font-medium{font-weight:500!important}.yst-font-semibold{font-weight:600!important}.yst-font-normal{font-weight:400!important}.yst-uppercase{text-transform:uppercase!important}.yst-text-slate-800{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.yst-text-slate-400{--tw-text-opacity:1!important;color:rgb(148 163 184/var(--tw-text-opacity))!important}.yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-text-slate-900{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.yst-text-slate-600{--tw-text-opacity:1!important;color:rgb(71 85 105/var(--tw-text-opacity))!important}.yst-text-primary-500{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.yst-text-gray-400{--tw-text-opacity:1!important;color:rgb(156 163 175/var(--tw-text-opacity))!important}.yst-text-gray-700{--tw-text-opacity:1!important;color:rgb(55 65 81/var(--tw-text-opacity))!important}.yst-text-red-600{--tw-text-opacity:1!important;color:rgb(220 38 38/var(--tw-text-opacity))!important}.yst-text-slate-700{--tw-text-opacity:1!important;color:rgb(51 65 85/var(--tw-text-opacity))!important}.yst-text-gray-200{--tw-text-opacity:1!important;color:rgb(229 231 235/var(--tw-text-opacity))!important}.yst-no-underline{-webkit-text-decoration-line:none!important;text-decoration-line:none!important}.yst-opacity-0{opacity:0!important}.yst-opacity-100{opacity:1!important}.yst-opacity-25{opacity:.25!important}.yst-opacity-75{opacity:.75!important}.yst-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a!important;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)!important}.yst-shadow,.yst-shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a!important;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)!important}.yst-shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-amber-700\/30{--tw-shadow-color:#b453094d!important;--tw-shadow:var(--tw-shadow-colored)!important}.yst-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.yst-ring-black{--tw-ring-opacity:1!important;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))!important}.yst-ring-gray-200{--tw-ring-opacity:1!important;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))!important}.yst-ring-opacity-5{--tw-ring-opacity:0.05!important}.yst-drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px #00000012) drop-shadow(0 2px 2px #0000000f)!important}.yst-drop-shadow-md,.yst-grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-grayscale{--tw-grayscale:grayscale(100%)!important}.yst-transition-opacity{transition-duration:.15s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-all{transition-duration:.15s!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-delay-200{transition-delay:.2s!important}.yst-duration-1000{transition-duration:1s!important}.yst-duration-200{transition-duration:.2s!important}.yst-duration-300{transition-duration:.3s!important}.yst-duration-150{transition-duration:.15s!important}.yst-duration-100{transition-duration:.1s!important}.yst-duration-75{transition-duration:75ms!important}.yst-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)!important}.yst-ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)!important}.first\:yst-rounded-t-md:first-child{border-top-left-radius:.375rem!important;border-top-right-radius:.375rem!important}.last\:yst-mr-0:last-child{margin-right:0!important}.last\:yst-rounded-b-md:last-child{border-bottom-left-radius:.375rem!important;border-bottom-right-radius:.375rem!important}.odd\:yst-bg-white:nth-child(odd){--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.even\:yst-bg-slate-50:nth-child(2n),.hover\:yst-bg-slate-50:hover{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.hover\:yst-text-slate-500:hover{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.hover\:yst-text-slate-900:hover{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.focus\:yst-outline-none:focus{outline:2px solid #0000!important;outline-offset:2px!important}.focus\:yst-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-1:focus,.focus\:yst-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus\:yst-ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-inset:focus{--tw-ring-inset:inset!important}.focus\:yst-ring-primary-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-offset-2:focus{--tw-ring-offset-width:2px!important}.focus\:yst-ring-offset-1:focus{--tw-ring-offset-width:1px!important}.focus\:yst-ring-offset-transparent:focus{--tw-ring-offset-color:#0000!important}.yst-group:hover .group-hover\:yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}[dir=rtl] .rtl\:yst-rotate-180{--tw-rotate:180deg!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@media (min-width:640px){.sm\:yst-flex{display:flex!important}.sm\:yst-w-auto{width:auto!important}.sm\:yst-translate-y-0{--tw-translate-y:0px!important}.sm\:yst-scale-95,.sm\:yst-translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.sm\:yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-flex-row-reverse{flex-direction:row-reverse!important}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-thank-you-2200-rtl.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-thank-you-2200-rtl.css deleted file mode 100644 index dce0a3be..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-thank-you-2200-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.admin_page_wpseo_installation_successful{background:#fff}.admin_page_wpseo_installation_successful h1{color:#a4286a;font-size:40px;font-weight:400;margin-top:0;text-align:center}.admin_page_wpseo_installation_successful .yoast-image{display:block;margin:100px auto 24px;max-width:200px}.admin_page_wpseo_installation_successful #wpcontent{padding-left:20px}@media screen and (max-width:782px){.admin_page_wpseo_installation_successful #wpcontent{padding-left:10px}}.yoast-whats-next{font-size:16px;text-align:center}.yoast-grid{grid-gap:32px;display:grid;grid-template-columns:1fr 1fr 1fr 1fr;margin:48px auto 0;max-width:1120px;text-align:center;width:100%}@media screen and (max-width:1250px){.yoast-grid{grid-template-columns:1fr 1fr;max-width:768px}}@media screen and (max-width:600px){.yoast-grid{grid-template-columns:1fr;max-width:480px}}.yoast-grid div{display:flex;flex-direction:column}.yoast-grid h3{color:#a4286a;font-size:19px;font-weight:400;line-height:26px;margin-top:0}.yoast-grid .yoast-button{margin-top:auto;width:calc(100% - 26px)}.yoast-grid img{margin-bottom:16px;max-width:100%}.yoast-grid p{margin:16px 0} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-thank-you-2200.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-thank-you-2200.css deleted file mode 100644 index 129f2341..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-thank-you-2200.css +++ /dev/null @@ -1 +0,0 @@ -.admin_page_wpseo_installation_successful{background:#fff}.admin_page_wpseo_installation_successful h1{color:#a4286a;font-size:40px;font-weight:400;margin-top:0;text-align:center}.admin_page_wpseo_installation_successful .yoast-image{display:block;margin:100px auto 24px;max-width:200px}.admin_page_wpseo_installation_successful #wpcontent{padding-right:20px}@media screen and (max-width:782px){.admin_page_wpseo_installation_successful #wpcontent{padding-right:10px}}.yoast-whats-next{font-size:16px;text-align:center}.yoast-grid{grid-gap:32px;display:grid;grid-template-columns:1fr 1fr 1fr 1fr;margin:48px auto 0;max-width:1120px;text-align:center;width:100%}@media screen and (max-width:1250px){.yoast-grid{grid-template-columns:1fr 1fr;max-width:768px}}@media screen and (max-width:600px){.yoast-grid{grid-template-columns:1fr;max-width:480px}}.yoast-grid div{display:flex;flex-direction:column}.yoast-grid h3{color:#a4286a;font-size:19px;font-weight:400;line-height:26px;margin-top:0}.yoast-grid .yoast-button{margin-top:auto;width:calc(100% - 26px)}.yoast-grid img{margin-bottom:16px;max-width:100%}.yoast-grid p{margin:16px 0} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-workouts-2200-rtl.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-workouts-2200-rtl.css deleted file mode 100644 index 807b2164..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-workouts-2200-rtl.css +++ /dev/null @@ -1 +0,0 @@ -#wpseo-workouts-container h1,#wpseo-workouts-container h3{color:#a4286a;font-weight:500}#wpseo-workouts-container h2{font-size:12px;text-transform:uppercase}.workflow tr.cornerstone{font-weight:700}#wpseo-workouts-container hr{margin-bottom:24px}#wpseo-workouts-container progress{margin:16px 0 8px}#wpseo-workouts-container div.card{border:0;border-radius:8px;box-shadow:0 1px 3px 0 #0000001a,0 1px 2px 0 #0000000f;max-width:720px;padding:24px;width:100%}#wpseo-workouts-container div.card>h2{margin:0 0 1em}#wpseo-workouts-container div.card.card-small{display:flex;flex-direction:column;max-width:320px}#wpseo-workouts-container div.card.card-small>span{margin-top:auto}#wpseo-workouts-container table button{margin:2px}.workflow{counter-reset:line-number;list-style:none;margin-right:48px}.workflow li{counter-increment:line-number;padding-bottom:16px;position:relative}.workflow>li:before{background:#a4286a;bottom:-20px;content:"";right:-33px;position:absolute;top:0;width:2px}.workflow>li:last-of-type:before{display:none}.workflow>li:after{background:#fff;border:2px solid #a4286a;border-radius:100%;color:#a4286a;content:counter(line-number);display:block;height:28px;right:-48px;line-height:28px;position:absolute;text-align:center;top:-8px;width:28px}.workflow li.finished:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' fill='none' stroke='%23FFF' height='24' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m5 13 4 4L19 7'/%3E%3C/svg%3E") #a4286a;background-position:50%;background-repeat:no-repeat;background-size:20px 20px;content:""}.workflow li.finished p,.workflow li.finished table{opacity:.5}.workflow li img{max-width:100%}.workflow li img.workflow__image{max-height:100px;max-width:100px}.workflow li #react-select-2-input{box-shadow:none!important}.workflows__index__grid{display:grid;gap:16px;grid-template-columns:320px 320px}.workflow__grid{display:grid;gap:8px;grid-template-columns:auto 100px}.workflow__grid>div:last-of-type{display:flex;flex-wrap:wrap;justify-content:flex-end}table.yoast_help.yoast_link_suggestions thead td{padding:16px 8px}table.yoast_help.yoast_link_suggestions td{vertical-align:middle}table.yoast_help th.divider{text-align:center}.workflow table.yoast_help td{vertical-align:middle}.workflow table.yoast_help.yoast_link_suggestions td div{display:inline-block}.workflow table.yoast_help.yoast_link_suggestions td strong{display:inline-block;margin-left:8px}.components-modal__header{height:72px;padding:0 24px}.components-modal__header .components-modal__header-heading{color:#a4286a;font-size:20px;font-weight:400;line-height:1.2;margin:0}.components-modal__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.components-modal__content{padding:0 24px 24px}.components-modal__content input[type=text]{max-width:400px;width:100%}.components-modal__frame.yoast__workout{max-width:720px}.yoast__redirect-suggestions{line-height:2} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-workouts-2200.css b/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-workouts-2200.css deleted file mode 100644 index a023f3c4..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/css/dist/premium-workouts-2200.css +++ /dev/null @@ -1 +0,0 @@ -#wpseo-workouts-container h1,#wpseo-workouts-container h3{color:#a4286a;font-weight:500}#wpseo-workouts-container h2{font-size:12px;text-transform:uppercase}.workflow tr.cornerstone{font-weight:700}#wpseo-workouts-container hr{margin-bottom:24px}#wpseo-workouts-container progress{margin:16px 0 8px}#wpseo-workouts-container div.card{border:0;border-radius:8px;box-shadow:0 1px 3px 0 #0000001a,0 1px 2px 0 #0000000f;max-width:720px;padding:24px;width:100%}#wpseo-workouts-container div.card>h2{margin:0 0 1em}#wpseo-workouts-container div.card.card-small{display:flex;flex-direction:column;max-width:320px}#wpseo-workouts-container div.card.card-small>span{margin-top:auto}#wpseo-workouts-container table button{margin:2px}.workflow{counter-reset:line-number;list-style:none;margin-left:48px}.workflow li{counter-increment:line-number;padding-bottom:16px;position:relative}.workflow>li:before{background:#a4286a;bottom:-20px;content:"";left:-33px;position:absolute;top:0;width:2px}.workflow>li:last-of-type:before{display:none}.workflow>li:after{background:#fff;border:2px solid #a4286a;border-radius:100%;color:#a4286a;content:counter(line-number);display:block;height:28px;left:-48px;line-height:28px;position:absolute;text-align:center;top:-8px;width:28px}.workflow li.finished:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' fill='none' stroke='%23FFF' height='24' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m5 13 4 4L19 7'/%3E%3C/svg%3E") #a4286a;background-position:50%;background-repeat:no-repeat;background-size:20px 20px;content:""}.workflow li.finished p,.workflow li.finished table{opacity:.5}.workflow li img{max-width:100%}.workflow li img.workflow__image{max-height:100px;max-width:100px}.workflow li #react-select-2-input{box-shadow:none!important}.workflows__index__grid{display:grid;gap:16px;grid-template-columns:320px 320px}.workflow__grid{display:grid;gap:8px;grid-template-columns:auto 100px}.workflow__grid>div:last-of-type{display:flex;flex-wrap:wrap;justify-content:flex-end}table.yoast_help.yoast_link_suggestions thead td{padding:16px 8px}table.yoast_help.yoast_link_suggestions td{vertical-align:middle}table.yoast_help th.divider{text-align:center}.workflow table.yoast_help td{vertical-align:middle}.workflow table.yoast_help.yoast_link_suggestions td div{display:inline-block}.workflow table.yoast_help.yoast_link_suggestions td strong{display:inline-block;margin-right:8px}.components-modal__header{height:72px;padding:0 24px}.components-modal__header .components-modal__header-heading{color:#a4286a;font-size:20px;font-weight:400;line-height:1.2;margin:0}.components-modal__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.components-modal__content{padding:0 24px 24px}.components-modal__content input[type=text]{max-width:400px;width:100%}.components-modal__frame.yoast__workout{max-width:720px}.yoast__redirect-suggestions{line-height:2} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/images/cornerstone-icon.svg b/wp/wp-content/plugins/wordpress-seo-premium/assets/images/cornerstone-icon.svg deleted file mode 100644 index 6ddb4dda..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/images/cornerstone-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/images/inclusive-language-icon.svg b/wp/wp-content/plugins/wordpress-seo-premium/assets/images/inclusive-language-icon.svg deleted file mode 100644 index 49bf1678..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/images/inclusive-language-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/ai-generator-2200.min.js b/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/ai-generator-2200.min.js deleted file mode 100644 index 6100ea03..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/ai-generator-2200.min.js +++ /dev/null @@ -1,12 +0,0 @@ -(window.yoastPremiumWebpackJsonp=window.yoastPremiumWebpackJsonp||[]).push([[17],[function(e,t){e.exports=React},function(e,t){e.exports=window.lodash},function(e,t){e.exports=window.wp.i18n},function(e,t){e.exports=window.wp.element},function(e,t){e.exports=window.yoast.propTypes},function(e,t){e.exports=window.wp.data},function(e,t){e.exports=window.yoast.uiLibrary},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.STORE_NAME_EDITOR={free:"yoast-seo/editor",premium:"yoast-seo-premium/editor"},t.ASYNC_ACTION_NAMES={request:"request",success:"success",error:"error"},t.ASYNC_ACTION_STATUS={idle:"idle",loading:"loading",success:"success",error:"error"},t.VIDEO_FLOW={showPlay:"showPlay",askPermission:"askPermission",isPlaying:"isPlaying"}},function(e,t){e.exports=window.yoast.reduxJsToolkit},function(e,t){e.exports=window.yoast.analysis},function(e,t){e.exports=window.wp.apiFetch},,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.STORE_NAME_AI="yoast-seo-premium/ai-generator",t.PREVIEW_TYPE={google:"google",social:"social",twitter:"twitter"},t.EDIT_TYPE={title:"title",description:"description"},t.PREVIEW_MODE={mobile:"mobile",desktop:"desktop"},t.SUGGESTIONS_PER_PAGE=5,t.ASYNC_ACTION_STATUS={idle:"idle",loading:"loading",success:"success",error:"error"},t.FETCH_RESPONSE_STATUS={success:"success",error:"error",abort:"abort"}},function(e,t){e.exports=window.wp.components},,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(65);Object.defineProperty(t,"AiGenerateTitlesAndDescriptionsIntroduction",{enumerable:!0,get:function(){return n.AiGenerateTitlesAndDescriptionsIntroduction}});var i=r(67);Object.defineProperty(t,"OutboundLink",{enumerable:!0,get:function(){return i.OutboundLink}});var s=r(68);Object.defineProperty(t,"VideoFlow",{enumerable:!0,get:function(){return s.VideoFlow}})},,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(29);Object.defineProperty(t,"adminUrlActions",{enumerable:!0,get:function(){return n.adminUrlActions}}),Object.defineProperty(t,"adminUrlReducer",{enumerable:!0,get:function(){return n.adminUrlReducer}}),Object.defineProperty(t,"getInitialAdminUrlState",{enumerable:!0,get:function(){return n.getInitialAdminUrlState}}),Object.defineProperty(t,"ADMIN_URL_NAME",{enumerable:!0,get:function(){return n.ADMIN_URL_NAME}}),Object.defineProperty(t,"adminUrlSelectors",{enumerable:!0,get:function(){return n.adminUrlSelectors}});var i=r(30);Object.defineProperty(t,"getInitialHasAiGeneratorConsentState",{enumerable:!0,get:function(){return i.getInitialHasAiGeneratorConsentState}}),Object.defineProperty(t,"hasAiGeneratorConsentReducer",{enumerable:!0,get:function(){return i.hasAiGeneratorConsentReducer}}),Object.defineProperty(t,"hasAiGeneratorConsentActions",{enumerable:!0,get:function(){return i.hasAiGeneratorConsentActions}}),Object.defineProperty(t,"hasAiGeneratorConsentControls",{enumerable:!0,get:function(){return i.hasAiGeneratorConsentControls}}),Object.defineProperty(t,"HAS_AI_GENERATOR_CONSENT_NAME",{enumerable:!0,get:function(){return i.HAS_AI_GENERATOR_CONSENT_NAME}}),Object.defineProperty(t,"hasAiGeneratorConsentSelectors",{enumerable:!0,get:function(){return i.hasAiGeneratorConsentSelectors}});var s=r(31);Object.defineProperty(t,"pluginUrlSelectors",{enumerable:!0,get:function(){return s.pluginUrlSelectors}}),Object.defineProperty(t,"getInitialPluginUrlState",{enumerable:!0,get:function(){return s.getInitialPluginUrlState}}),Object.defineProperty(t,"PLUGIN_URL_NAME",{enumerable:!0,get:function(){return s.PLUGIN_URL_NAME}}),Object.defineProperty(t,"pluginUrlReducer",{enumerable:!0,get:function(){return s.pluginUrlReducer}}),Object.defineProperty(t,"pluginUrlActions",{enumerable:!0,get:function(){return s.pluginUrlActions}});var o=r(32);Object.defineProperty(t,"linkParamsSelectors",{enumerable:!0,get:function(){return o.linkParamsSelectors}}),Object.defineProperty(t,"getInitialLinkParamsState",{enumerable:!0,get:function(){return o.getInitialLinkParamsState}}),Object.defineProperty(t,"LINK_PARAMS_NAME",{enumerable:!0,get:function(){return o.LINK_PARAMS_NAME}}),Object.defineProperty(t,"linkParamsReducer",{enumerable:!0,get:function(){return o.linkParamsReducer}}),Object.defineProperty(t,"linkParamsActions",{enumerable:!0,get:function(){return o.linkParamsActions}});var a=r(33);Object.defineProperty(t,"WISTIA_EMBED_PERMISSION_NAME",{enumerable:!0,get:function(){return a.WISTIA_EMBED_PERMISSION_NAME}}),Object.defineProperty(t,"wistiaEmbedPermissionActions",{enumerable:!0,get:function(){return a.wistiaEmbedPermissionActions}}),Object.defineProperty(t,"getInitialWistiaEmbedPermissionState",{enumerable:!0,get:function(){return a.getInitialWistiaEmbedPermissionState}}),Object.defineProperty(t,"wistiaEmbedPermissionSelectors",{enumerable:!0,get:function(){return a.wistiaEmbedPermissionSelectors}}),Object.defineProperty(t,"wistiaEmbedPermissionControls",{enumerable:!0,get:function(){return a.wistiaEmbedPermissionControls}}),Object.defineProperty(t,"wistiaEmbedPermissionReducer",{enumerable:!0,get:function(){return a.wistiaEmbedPermissionReducer}})},function(e,t){e.exports=window.wp.domReady},function(e,t){e.exports=window.wp.url},,function(e,t){e.exports=window.wp.hooks},,,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useTypeContext=void 0;var n=r(3),i=r(138);t.useTypeContext=function(){return(0,n.useContext)(i.TypeContext)}},,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.adminUrlReducer=t.adminUrlActions=t.adminUrlSelectors=t.getInitialAdminUrlState=t.ADMIN_URL_NAME=void 0;var n=r(8),i=r(1),s=t.ADMIN_URL_NAME="adminUrl",o=(0,n.createSlice)({name:s,initialState:"",reducers:{setAdminUrl:function(e,t){return t.payload}}}),a=(t.getInitialAdminUrlState=o.getInitialState,t.adminUrlSelectors={selectAdminUrl:function(e){return(0,i.get)(e,s,"")}});a.selectAdminLink=(0,n.createSelector)([a.selectAdminUrl,function(e,t){return t}],function(e,t){try{return new URL(t,e).href}catch(t){return e}});t.adminUrlActions=o.actions,t.adminUrlReducer=o.reducer},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.hasAiGeneratorConsentReducer=t.hasAiGeneratorConsentControls=t.hasAiGeneratorConsentActions=t.hasAiGeneratorConsentSelectors=t.getInitialHasAiGeneratorConsentState=t.HAS_AI_GENERATOR_CONSENT_NAME=void 0;var n=Object.assign||function(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:"assets/images"},function(e,t){return t}],function(e,t,r){return[(0,i.trimEnd)(e,"/"),(0,i.trim)(t,"/"),(0,i.trimStart)(r,"/")].join("/")});t.pluginUrlActions=o.actions,t.pluginUrlReducer=o.reducer},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.linkParamsReducer=t.linkParamsActions=t.linkParamsSelectors=t.getInitialLinkParamsState=t.LINK_PARAMS_NAME=void 0;var n=r(8),i=r(19),s=r(1),o=t.LINK_PARAMS_NAME="linkParams",a=(0,n.createSlice)({name:o,initialState:{},reducers:{setLinkParams:function(e,t){return t.payload}}}),u=(t.getInitialLinkParamsState=a.getInitialState,t.linkParamsSelectors={selectLinkParam:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return(0,s.get)(e,o+"."+t,r)},selectLinkParams:function(e){return(0,s.get)(e,o,{})}});u.selectLink=(0,n.createSelector)([u.selectLinkParams,function(e,t){return t}],function(e,t){return(0,i.addQueryArgs)(t,e)});t.linkParamsActions=a.actions,t.linkParamsReducer=a.reducer},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.wistiaEmbedPermissionReducer=t.wistiaEmbedPermissionControls=t.wistiaEmbedPermissionActions=t.wistiaEmbedPermissionSelectors=t.getInitialWistiaEmbedPermissionState=t.WISTIA_EMBED_PERMISSION_NAME=void 0;var n=Object.assign||function(e){for(var t=1;t","","",""),{a1:wp.element.createElement(l.OutboundLink,{href:c}),a2:wp.element.createElement(l.OutboundLink,{href:u})});return wp.element.createElement("div",{className:"yst-flex yst-flex-col yst-items-center yst-p-10"},wp.element.createElement("div",{className:"yst-relative yst-w-full"},wp.element.createElement(l.VideoFlow,{videoId:"vmrahpfjxp",thumbnail:p,wistiaEmbedPermission:d}),wp.element.createElement(a.Badge,{className:"yst-absolute yst-top-0 yst-right-2 yst-mt-2 yst-ml-2",variant:"info"},"Beta")),wp.element.createElement("div",{className:"yst-mt-6 yst-text-xs yst-font-medium"},wp.element.createElement("span",{className:"yst-introduction-modal-uppercase"},(0,o.sprintf)((0,o.__)("New to %1$s","wordpress-seo-premium"),"Yoast SEO Premium"))," ",wp.element.createElement("span",{className:"yst-uppercase yst-text-slate-700"},"21.0")),wp.element.createElement("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},wp.element.createElement("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},(0,o.__)("Generate titles & descriptions with Yoast AI!","wordpress-seo-premium")),wp.element.createElement("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},(0,s.createInterpolateElement)((0,o.sprintf)((0,o.__)("Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s","wordpress-seo-premium"),"","",""),{a:wp.element.createElement(l.OutboundLink,{href:r,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:wp.element.createElement(i.default,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"})}))),wp.element.createElement("div",{className:"yst-flex yst-w-full yst-mt-6"},wp.element.createElement("hr",{className:"yst-w-full yst-text-gray-200"})),wp.element.createElement("div",{className:"yst-flex yst-items-start yst-mt-4"},wp.element.createElement("input",{type:"checkbox",id:"yst-ai-consent-checkbox",name:"yst-ai-consent-checkbox",checked:v,value:v?"true":"false",onChange:_,className:"yst-checkbox__input",ref:y}),wp.element.createElement("label",{htmlFor:"yst-ai-consent-checkbox",className:"yst-label yst-checkbox__label yst-text-xs yst-font-normal yst-text-slate-500"},S)),wp.element.createElement("div",{className:"yst-w-full yst-flex yst-mt-4"},wp.element.createElement(a.Button,{as:"button",className:"yst-grow",size:"large",disabled:!v,onClick:w},(0,o.__)("Start generating","wordpress-seo-premium"))),wp.element.createElement(a.Button,{as:"button",className:"yst-mt-4",variant:"tertiary",onClick:f},(0,o.__)("Close","wordpress-seo-premium")))}).propTypes={onGiveConsent:u.default.func.isRequired,learnMoreLink:u.default.string.isRequired,privacyPolicyLink:u.default.string.isRequired,termsOfServiceLink:u.default.string.isRequired,thumbnail:u.default.shape({src:u.default.string.isRequired,width:u.default.string,height:u.default.string}).isRequired,wistiaEmbedPermission:u.default.shape({value:u.default.bool.isRequired,status:u.default.string.isRequired,set:u.default.func.isRequired}).isRequired}},function(e,t,r){"use strict";r.r(t);var n=r(0);const i=n.forwardRef(function(e,t){return n.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),n.createElement("path",{fillRule:"evenodd",d:"M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))});t.default=i},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.OutboundLink=void 0;var n=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}(e,["href","children"]);return wp.element.createElement(s.Link,n({target:"_blank",rel:"noopener noreferrer"},o,{href:t}),r,wp.element.createElement("span",{className:"yst-sr-only"},(0,i.__)("(Opens in a new browser tab)","wordpress-seo-premium")))};t.OutboundLink=a,a.propTypes={href:o.default.string.isRequired,children:o.default.node},a.defaultProps={children:null}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.VideoFlow=void 0;var n=Object.assign||function(e){for(var t=1;t<\/badge>|^(?!))(?[\s\S]+?)(?|$)/g;(t.ModalContent=function(e){var t=e.height,r=(0,a.useState)(""),p=n(r,2),g=p[0],v=p[1],_=(0,l.useModalContext)().onClose,w=(0,f.useTypeContext)(),S=w.editType,b=w.previewType,T=(0,f.useLocation)(),P=(0,f.useSuggestions)(),A=P.suggestions,O=P.fetchSuggestions,h=P.setSelectedSuggestion,N=(0,f.usePreviewContent)(),R=(0,o.useDispatch)(m.STORE_NAME_AI).addAppliedSuggestion,I=(0,l.usePrevious)(t),C=(0,a.useState)(!1),M=n(C,2),k=M[0],x=M[1],j=(0,a.useCallback)(function(e){x(e.target.offsetHeight!==e.target.scrollHeight)},[x]),D=(0,f.useMeasuredRef)(j),L=(0,f.useTitleTemplate)(),U=(0,f.useDescriptionTemplate)(),G=(0,f.useApplyReplacementVariables)(),Y=(0,a.useMemo)(function(){return G(L,{overrides:S===m.EDIT_TYPE.title?{title:A.selected}:{}})},[G,L,S,A.selected]),q=(0,a.useMemo)(function(){var e={sep:"",sitename:""};return S===m.EDIT_TYPE.title&&(e.title=A.selected),G(L,{overrides:e})},[G,L,S,A.selected]),F=(0,a.useMemo)(function(){return S===m.EDIT_TYPE.description?A.selected:G(U,{editType:m.EDIT_TYPE.description})},[G,U,S,A.selected]),W=(0,a.useCallback)(function(e){return G(L,{overrides:{title:e},key:"badge",applyPluggable:!1})},[G,L]),V=(0,f.usePagination)({totalItems:A.status===m.ASYNC_ACTION_STATUS.loading||A.status===m.ASYNC_ACTION_STATUS.error?A.entities.length+m.SUGGESTIONS_PER_PAGE:A.entities.length,perPage:m.SUGGESTIONS_PER_PAGE}),B=V.currentPage,$=V.setCurrentPage,H=V.isOnLastPage,K=V.totalPages,z=V.getItemsOnCurrentPage,J=(0,a.useMemo)(function(){return(0,c.map)(z(A.entities),function(e){var t=e;return S===m.EDIT_TYPE.title&&(t=(t=W(e)).replace(E,function(e,t,r,n,i,s,o){var a=o.start,u=o.wrap,l=o.end,c=u.trim();return 0===c.length?""+a+u+l:a+""+c+""+l}),t=(0,a.createInterpolateElement)(t,{badge:wp.element.createElement(l.Badge,{className:"yst-mr-2 last:yst-mr-0",variant:"plain"}," "),span:wp.element.createElement("span",{className:"yst-flex yst-items-center yst-mr-2 last:yst-mr-0"})})),{value:e,label:t}})},[A.entities,z,S,W]),Q=(0,a.useMemo)(function(){return A.status!==m.ASYNC_ACTION_STATUS.error||A.status===m.ASYNC_ACTION_STATUS.error&&!H},[A.status,H]),X=(0,a.useMemo)(function(){return A.status===m.ASYNC_ACTION_STATUS.loading&&H},[A.status,H]),Z=(0,a.useMemo)(function(){return A.status===m.ASYNC_ACTION_STATUS.error&&H},[A.status,H]),ee=(0,a.useCallback)(function(){$(A.status===m.ASYNC_ACTION_STATUS.error?K:K+1),O()},[O,A.status,K,$,h]),te=(0,a.useCallback)(function(){return v("")},[v]),re=(0,y.useSetTitleOrDescription)(),ne=(0,a.useCallback)(function(){var e=S===m.EDIT_TYPE.title?L.replace("%%title%%",A.selected):A.selected;re(e),R({editType:S,previewType:b,suggestion:A.selected}),_()},[re,S,b,A.selected,L,_,R]);return(0,a.useEffect)(function(){""===g&&O().then(function(e){return v(e)})},[g,v,O]),g===m.FETCH_RESPONSE_STATUS.error||A.status===m.ASYNC_ACTION_STATUS.error&&402===A.error.code?wp.element.createElement("div",{className:"yst-flex yst-flex-col yst-space-y-6 yst-mt-6"},wp.element.createElement(d.SuggestionError,{errorCode:A.error.code,errorMessage:A.error.message,invalidSubscriptions:A.error.missingLicenses,showActions:!0,onRetry:te})):wp.element.createElement(a.Fragment,null,wp.element.createElement(l.Modal.Container.Content,{ref:D,className:"yst-flex yst-flex-col yst-py-6 yst-space-y-6"},wp.element.createElement(N,{title:Y,description:F,status:A.status,titleForLength:q,showPreviewSkeleton:""===g,showLengthProgress:!X}),Q&&(X?wp.element.createElement(d.SuggestionsListSkeleton,{idSuffix:T,suggestionClassNames:S===m.EDIT_TYPE.title?[["yst-h-3 yst-w-9/12"],["yst-h-3 yst-w-7/12"],["yst-h-3 yst-w-10/12"],["yst-h-3 yst-w-11/12"],["yst-h-3 yst-w-8/12"]]:void 0}):wp.element.createElement(d.SuggestionsList,{idSuffix:T,suggestions:J,selected:A.selected,onChange:h})),A.status===m.ASYNC_ACTION_STATUS.error&&H&&wp.element.createElement(d.SuggestionError,{errorCode:A.error.code,errorMessage:A.error.message,invalidSubscriptions:A.error.missingLicenses})),wp.element.createElement(l.Modal.Container.Footer,null,k&&wp.element.createElement("div",{className:"yst-absolute yst-inset-x-0 yst--mt-10 yst-mr-[calc(2.5rem-1px)] yst-h-10 yst-pointer-events-none yst-bg-gradient-to-t yst-from-white"}),wp.element.createElement("hr",{className:"yst-mb-6 yst--mx-6"}),wp.element.createElement("div",{className:"yst-flex yst-justify-between"},wp.element.createElement(l.Button,{variant:"secondary",onClick:A.status===m.ASYNC_ACTION_STATUS.loading?c.noop:ee,isLoading:A.status===m.ASYNC_ACTION_STATUS.loading},A.status!==m.ASYNC_ACTION_STATUS.loading&&wp.element.createElement(s.default,{className:"yst--ml-1 yst-mr-2 yst-h-4 yst-w-4 yst-text-gray-400"}),(0,u.__)("Generate 5 more","wordpress-seo-premium")),K>1&&wp.element.createElement(l.Pagination,{current:B,total:K,onNavigate:$,disabled:A.status===m.ASYNC_ACTION_STATUS.loading,variant:"text",screenReaderTextPrevious:(0,u.__)("Previous","wordpress-seo-premium"),screenReaderTextNext:(0,u.__)("Next","wordpress-seo-premium")}),wp.element.createElement(l.Button,{variant:"primary",onClick:ne,disabled:""===A.selected||A.status===m.ASYNC_ACTION_STATUS.loading||Z},wp.element.createElement(i.default,{className:"yst--ml-1 yst-mr-1 yst-h-4 yst-w-4 yst-text-white"}),S===m.EDIT_TYPE.title&&(0,u.__)("Apply AI title","wordpress-seo-premium"),S===m.EDIT_TYPE.description&&(0,u.__)("Apply AI description","wordpress-seo-premium")))),(A.status===m.ASYNC_ACTION_STATUS.success||A.status===m.ASYNC_ACTION_STATUS.loading)&&wp.element.createElement(d.TipNotification,{height:A.status===m.ASYNC_ACTION_STATUS.success?t:I}))}).propTypes={height:p.default.number.isRequired}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.productSubscriptionsReducer=t.productSubscriptionsActions=t.productSubscriptionsSelectors=t.getInitialProductSubscriptionsState=t.PRODUCT_SUBSCRIPTIONS_NAME=void 0;var n=r(8),i=r(1),s=t.PRODUCT_SUBSCRIPTIONS_NAME="productSubscriptions",o=(0,n.createSlice)({name:s,initialState:{premiumSubscription:!1,wooCommerceSubscription:!1},reducers:{}});t.getInitialProductSubscriptionsState=o.getInitialState,t.productSubscriptionsSelectors={selectProductSubscriptions:function(e){return(0,i.get)(e,s,!1)},selectPremiumSubscription:function(e){return(0,i.get)(e,s+".premiumSubscription")},selectWooCommerceSubscription:function(e){return(0,i.get)(e,s+".wooCommerceSubscription")}},t.productSubscriptionsActions=o.actions,t.productSubscriptionsReducer=o.reducer},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){"use strict";var n=r(13),i=r(5),s=function(e){return e&&e.__esModule?e:{default:e}}(r(18)),o=r(21),a=r(2),u=r(6),l=r(1),c=r(17),p=r(51),d=r(12),m=r(64),f=r(326),y=r(146);function g(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var E=!1,v=function(){E||(E=!0,"1"!==(0,l.get)(window,"wpseoPremiumAiGenerator.hasSeenIntroduction",!1)&&(0,m.setIntroductionSeen)())},_=["attachment"];var w=function(e,t){var r=t.fieldId,i=t.type,s=(0,l.get)(window,"wpseoPremiumAiGenerator.postType",""),o=(0,l.get)(window,"wpseoScriptData.woocommerceUpsell",!1);if(_.includes(s)||o)return e;var a=function(e){return e.startsWith("yoast-google-preview")?d.PREVIEW_TYPE.google:e.startsWith("social")?d.PREVIEW_TYPE.social:e.startsWith("twitter")?d.PREVIEW_TYPE.twitter:void 0}(r);if(!a)return e;var c=(0,l.get)(window,"wpseoScriptData.metabox.isRtl",!1);return e.push(wp.element.createElement(n.Fill,{name:"yoast.replacementVariableEditor.additionalButtons."+r},wp.element.createElement(u.Root,{context:{isRtl:c}},wp.element.createElement(p.TypeProvider,{value:{editType:i,previewType:a,postType:s}},wp.element.createElement(p.App,{onUseAi:v}))))),e},S=function(e,t){return E&&(0,i.select)(d.STORE_NAME_AI).selectHasAiGeneratorConsent()?((0,m.isConsideredEmpty)(t)&&e.push((0,a.__)("Please enter a focus keyphrase first to use AI.","wordpress-seo-premium")),e):e},b=function(){var e=(0,i.dispatch)(d.STORE_NAME_AI).setPromptContent;return function(){(0,m.preparePromptContent)(e)}},T=function(){b(),(0,i.subscribe)((0,l.debounce)(function(){var e=(0,i.select)("yoast-seo/editor").getEditorDataContent,t=(0,l.get)(window,"yoast.editorModules.helpers.createWatcher",l.noop),r=b();return setTimeout(r,1500),t(e,r)}(),1500,{maxWait:3e3}))};(0,s.default)(function(){var e;(0,f.registerStore)((g(e={},c.ADMIN_URL_NAME,(0,l.get)(window,"wpseoPremiumAiGenerator.adminUrl","")),g(e,c.HAS_AI_GENERATOR_CONSENT_NAME,"1"===(0,l.get)(window,"wpseoPremiumAiGenerator.hasConsent",!1)),g(e,y.PRODUCT_SUBSCRIPTIONS_NAME,(0,l.get)(window,"wpseoPremiumAiGenerator.productSubscriptions",{})),e)),(0,o.addFilter)("yoast.replacementVariableEditor.additionalButtons","yoast/yoast-seo-premium/AiGenerator",w),(0,o.addFilter)("yoast.focusKeyphrase.errors","yoast/yoast-seo-premium/AiGenerator",S),(0,o.addAction)("yoast.elementor.loaded","yoast/yoast-seo-premium/AiGenerator",T)}),window.jQuery(window).on("YoastSEO:ready",function(){T()})},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.App=void 0;var n=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:s.EDIT_TYPE.title,r=(0,n.get)(window,"yoast.editorModules.helpers.replacementVariableHelpers.applyReplaceUsingPlugin",function(e){return{url:e.url,title:i.languageProcessing.stripHTMLTags(e.title),description:i.languageProcessing.stripHTMLTags(e.description)}})(function(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}({title:"",description:""},t,i.languageProcessing.stripSpaces(e)));return(0,n.get)(r,t,e)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.fetchSuggestions=void 0;var n=Object.assign||function(e){for(var t=1;tt)return n;n+=e.text}),n+=" ",s+=1})}}e(n.trimEnd()||".")})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setIntroductionSeen=void 0;var n=function(e){return e&&e.__esModule?e:{default:e}}(r(10));t.setIntroductionSeen=function(){try{(0,n.default)({path:"yoast/v1/introductions/ai-generate-titles-and-descriptions/seen/",method:"POST"})}catch(e){}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useApplyReplacementVariables=void 0;var n=r(5),i=r(3),s=r(1),o=r(7),a=r(12),u=r(64);t.useApplyReplacementVariables=function(){var e=(0,n.useSelect)(function(e){var t=e(o.STORE_NAME_EDITOR.free).getReplaceVars();return t.forEach(function(e){""!==e.value||["title","excerpt","excerpt_only"].includes(e.name)||(e.value="%%"+e.name+"%%"),e.badge=""+e.label+""}),t},[]);return(0,i.useCallback)(function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=r.key,i=void 0===n?"value":n,o=r.overrides,l=void 0===o?{}:o,c=r.applyPluggable,p=void 0===c||c,d=r.editType,m=void 0===d?a.EDIT_TYPE.title:d,f=!0,y=!1,g=void 0;try{for(var E,v=e[Symbol.iterator]();!(f=(E=v.next()).done);f=!0){var _=E.value;t=t.replace(new RegExp("%%"+(0,s.escapeRegExp)(_.name)+"%%","g"),(0,s.get)(l,_.name,_[i]))}}catch(e){y=!0,g=e}finally{try{!f&&v.return&&v.return()}finally{if(y)throw g}}return p?(0,u.applyPluggableReplacementVariables)(t,m):t},[e])}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useDescriptionTemplate=void 0;var n=r(3),i=r(44);t.useDescriptionTemplate=function(){var e=(0,i.useGetDescriptionTemplate)();return(0,n.useMemo)(e,[e])}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useGetDescriptionTemplate=void 0;var n=r(5),i=r(3),s=r(1),o=r(7),a=r(12),u=r(27);t.useGetDescriptionTemplate=function(){var e=(0,u.useTypeContext)().previewType;return(0,i.useMemo)(function(){switch(e){case a.PREVIEW_TYPE.google:return function(){return(0,n.select)(o.STORE_NAME_EDITOR.free).getSnippetEditorData().description};case a.PREVIEW_TYPE.social:return(0,n.select)(o.STORE_NAME_EDITOR.free).getFacebookDescriptionOrFallback;case a.PREVIEW_TYPE.twitter:return(0,n.select)(o.STORE_NAME_EDITOR.free).getTwitterDescriptionOrFallback;default:return(0,s.constant)("")}},[e])}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useLocation=void 0;var n=r(3),i=(0,r(1).get)(window,"yoast.editorModules.components.contexts.location.LocationContext",(0,n.createContext)("unknown"));t.useLocation=function(){return(0,n.useContext)(i)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useMeasuredRef=void 0;var n=r(3),i=r(1);t.useMeasuredRef=function(e){var t=(0,n.useRef)(null);return(0,n.useCallback)(function(r){(0,i.attempt)(function(){return t.current&&t.current.disconnect()}),null!==r&&(t.current=new ResizeObserver(function(t){(0,i.forEach)(t,function(t){return e(t)})}),t.current.observe(r))},[e])}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useModalTitle=void 0;var n=r(2),i=r(12),s=r(27);t.useModalTitle=function(){var e=(0,s.useTypeContext)(),t=e.editType;switch(e.previewType){case i.PREVIEW_TYPE.social:return t===i.EDIT_TYPE.description?(0,n.__)("AI social description generator","wordpress-seo-premium"):(0,n.__)("AI social title generator","wordpress-seo-premium");case i.PREVIEW_TYPE.twitter:return t===i.EDIT_TYPE.description?(0,n.__)("AI Twitter description generator","wordpress-seo-premium"):(0,n.__)("AI Twitter title generator","wordpress-seo-premium");default:return t===i.EDIT_TYPE.description?(0,n.__)("AI description generator","wordpress-seo-premium"):(0,n.__)("AI title generator","wordpress-seo-premium")}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.usePagination=void 0;var n=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],n=!0,i=!1,s=void 0;try{for(var o,a=e[Symbol.iterator]();!(n=(o=a.next()).done)&&(r.push(o.value),!t||r.length!==t);n=!0);}catch(e){i=!0,s=e}finally{try{!n&&a.return&&a.return()}finally{if(i)throw s}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=r(3),s=r(1);t.usePagination=function(e){var t=e.totalItems,r=void 0===t?0:t,o=e.perPage,a=void 0===o?5:o,u=(0,i.useState)(1),l=n(u,2),c=l[0],p=l[1],d=(0,i.useMemo)(function(){return Math.ceil(r/a)},[r,a]),m=(0,i.useMemo)(function(){return c*a},[c,a]),f=(0,i.useMemo)(function(){return m-a},[m,a]),y=(0,i.useMemo)(function(){return 1===c},[c]),g=(0,i.useMemo)(function(){return c===d},[c,d]),E=(0,i.useCallback)(function(){c>1&&p(c-1)},[c,p]),v=(0,i.useCallback)(function(){c191&&(_=_.slice(0,191));var w=f===u.EDIT_TYPE.description?"meta-description":"seo-title";return"product"===g&&(w="product-"+w),{suggestions:r,fetchSuggestions:(0,o.useCallback)(function(e){return function(){var t=e.apply(this,arguments);return new Promise(function(e,r){return function n(i,s){try{var o=t[i](s),a=o.value}catch(e){return void r(e)}if(!o.done)return Promise.resolve(a).then(function(e){n("next",e)},function(e){n("throw",e)});e(a)}("next")})}}(regeneratorRuntime.mark(function e(){var t,r,n,s=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return i(p.actions.setLoading()),e.next=3,(0,l.fetchSuggestions)({canAbort:s,type:w,promptContent:v,focusKeyphrase:_,platform:d(y),language:E});case 3:t=e.sent,r=t.status,n=t.payload,e.t0=r,e.next=e.t0===u.FETCH_RESPONSE_STATUS.abort?9:e.t0===u.FETCH_RESPONSE_STATUS.error?10:e.t0===u.FETCH_RESPONSE_STATUS.success?12:14;break;case 9:return e.abrupt("break",14);case 10:return i(p.actions.setError(n)),e.abrupt("break",14);case 12:return i(p.actions.setSuccess(n)),e.abrupt("break",14);case 14:return e.abrupt("return",r);case 15:case"end":return e.stop()}},e,void 0)})),[i]),setSelectedSuggestion:(0,o.useCallback)(function(e){return i(p.actions.setSelected(e))},[i])}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useTitleOrDescriptionLengthProgress=void 0;var n=r(5),i=r(3),s=r(142),o=r(7),a=r(12);t.useTitleOrDescriptionLengthProgress=function(e){var t=e.editType,r=e.title,u=e.description,l=(0,n.useSelect)(function(e){return e(o.STORE_NAME_EDITOR.free).getDateFromSettings()},[]),c=(0,n.useSelect)(function(e){return e(o.STORE_NAME_EDITOR.free).getContentLocale()},[]),p=(0,n.useSelect)(function(e){return e(o.STORE_NAME_EDITOR.free).isCornerstoneContent()},[]),d=(0,n.useSelect)(function(e){return e(o.STORE_NAME_EDITOR.free).getIsTerm()},[]);return(0,i.useMemo)(function(){return t===a.EDIT_TYPE.description?(0,s.getDescriptionProgress)(u,l,p,d,c):(0,s.getTitleProgress)(r)},[t,r,u,l,p,d,c])}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useTitleTemplate=void 0;var n=r(5),i=r(3),s=r(12),o=r(64),a=r(139),u=r(27);t.useTitleTemplate=function(){var e=(0,u.useTypeContext)(),t=e.editType,r=e.previewType,l=(0,a.useGetTitleTemplate)(),c=(0,n.useSelect)(function(e){return e(s.STORE_NAME_AI).selectAppliedSuggestionFor({editType:t,previewType:r})},[t,r]);return(0,i.useMemo)(function(){var e=l();return t===s.EDIT_TYPE.description?e:(c&&(e=e.replace(c,"%%title%%")),(0,o.enforceTitleVariable)(e))},[t,l])}},function(e,t,r){"use strict";r.r(t);var n=r(0);const i=n.forwardRef(function(e,t){return n.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),n.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"}))});t.default=i},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FeatureError=void 0;var n=function(e){return e&&e.__esModule?e:{default:e}}(r(4)),i=r(143),s=r(6),o=r(44);(t.FeatureError=function(e){var t=e.currentSubscriptions,r=e.isSeoAnalysisActive,n=(0,o.useTypeContext)().postType,a=[];return t.premiumSubscription||a.push("Yoast SEO Premium"),t.wooCommerceSubscription||"product"!==n||a.push("Yoast WooCommerce SEO"),a.length>0?wp.element.createElement(s.Modal.Container.Content,{className:"yst-pt-6"},wp.element.createElement(i.SubscriptionError,{invalidSubscriptions:a})):r?void 0:wp.element.createElement(i.SeoAnalysisInactiveError,null)}).propTypes={currentSubscriptions:n.default.object,isSeoAnalysisActive:n.default.bool}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.GenericAlert=void 0;var n=r(5),i=r(3),s=r(2),o=r(6),a=r(15),u=r(7);t.GenericAlert=function(){var e=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).selectLink("https://yoa.st/ai-generator-support")},[]);return wp.element.createElement(o.Alert,{variant:"error"},wp.element.createElement("span",{className:"yst-block yst-font-medium"},(0,s.__)("Something went wrong","wordpress-seo-premium")),wp.element.createElement("p",{className:"yst-mt-2"},(0,i.createInterpolateElement)((0,s.sprintf)((0,s.__)("Please try again later. If the issue persists, please %1$scontact our support team%2$s!","wordpress-seo-premium"),"",""),{a:wp.element.createElement(a.OutboundLink,{variant:"error",href:e})})))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.NotEnoughContentAlert=void 0;var n=r(5),i=r(3),s=r(2),o=r(6),a=r(15),u=r(7);t.NotEnoughContentAlert=function(){var e=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).selectLink("https://yoa.st/ai-generator-support")},[]);return wp.element.createElement(o.Alert,{variant:"error"},wp.element.createElement("span",{className:"yst-block yst-font-medium"},(0,s.__)("Not enough content","wordpress-seo-premium")),wp.element.createElement("p",{className:"yst-mt-2"},(0,i.createInterpolateElement)((0,s.sprintf)((0,s.__)("Please try again later. If the issue persists, please %1$scontact our support team%2$s!","wordpress-seo-premium"),"",""),{a:wp.element.createElement(a.OutboundLink,{variant:"error",href:e})})))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SeoAnalysisInactiveError=void 0;var n=r(5),i=r(3),s=r(2),o=r(6),a=r(15),u=r(12);t.SeoAnalysisInactiveError=function(){var e=(0,n.useSelect)(function(e){return e(u.STORE_NAME_AI).selectAdminLink("?page=wpseo_page_settings#/site-features#card-wpseo-keyword_analysis_active")},[]),t=(0,i.useCallback)(function(){window.location.reload()},[]),r=(0,o.useModalContext)().onClose;return wp.element.createElement("div",{className:"yst-flex yst-flex-col yst-space-y-6 yst-mt-6"},wp.element.createElement(o.Alert,{variant:"error"},wp.element.createElement("p",null,(0,i.createInterpolateElement)((0,s.sprintf)((0,s.__)("The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.","wordpress-seo-premium"),"Yoast SEO","",""),{a:wp.element.createElement(a.OutboundLink,{variant:"error",href:e})}))),wp.element.createElement("div",{className:"yst-mt-6 yst-mb-1 yst-flex yst-space-x-3 yst-place-content-end"},wp.element.createElement(o.Button,{variant:"secondary",onClick:r},(0,s.__)("Close","wordpress-seo-premium")),wp.element.createElement(o.Button,{className:"yst-revoke-button",variant:"primary",onClick:t},(0,s.__)("Refresh page","wordpress-seo-premium"))))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.RateLimitAlert=void 0;var n=r(5),i=r(3),s=r(2),o=r(6),a=r(15),u=r(7);t.RateLimitAlert=function(){var e=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).selectLink("https://yoa.st/ai-generator-rate-limit-help")},[]);return wp.element.createElement(o.Alert,{variant:"error"},wp.element.createElement("span",{className:"yst-block yst-font-medium"},(0,s.__)("You've reached the Yoast AI rate limit.","wordpress-seo-premium")),wp.element.createElement("p",{className:"yst-mt-2"},(0,i.createInterpolateElement)((0,s.sprintf)((0,s.__)("To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.","wordpress-seo-premium"),"",""),{a:wp.element.createElement(a.OutboundLink,{variant:"error",href:e})})))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SubscriptionError=void 0;var n=p(r(10)),i=r(5),s=r(3),o=r(2),a=r(6),u=r(15),l=r(7),c=p(r(4));function p(e){return e&&e.__esModule?e:{default:e}}var d=t.SubscriptionError=function(e){var t=e.invalidSubscriptions,r=(0,i.useSelect)(function(e){return e(l.STORE_NAME_EDITOR.free).selectLink("https://yoa.st/ai-generator-activate-premium")},[]),c=(0,i.useSelect)(function(e){return e(l.STORE_NAME_EDITOR.free).selectLink("https://yoa.st/ai-generator-new-premium")},[]),p=(0,i.useSelect)(function(e){return e(l.STORE_NAME_EDITOR.free).selectLink("https://yoa.st/ai-generator-activate-yoast-woocommerce")},[]),d=(0,i.useSelect)(function(e){return e(l.STORE_NAME_EDITOR.free).selectLink("https://yoa.st/ai-generator-new-yoast-woocommerce")},[]),m=(0,i.useSelect)(function(e){return e(l.STORE_NAME_EDITOR.free).selectLink("https://yoa.st/ai-generator-activate-woocommerce-premium-bundle")},[]),f=(0,i.useSelect)(function(e){return e(l.STORE_NAME_EDITOR.free).selectLink("https://yoa.st/ai-generator-new-woocommerce-premium-bundle")},[]),y=(0,a.useModalContext)().onClose,g=(0,s.useCallback)(function(e){return function(){var t=e.apply(this,arguments);return new Promise(function(e,r){return function n(i,s){try{var o=t[i](s),a=o.value}catch(e){return void r(e)}if(!o.done)return Promise.resolve(a).then(function(e){n("next",e)},function(e){n("throw",e)});e(a)}("next")})}}(regeneratorRuntime.mark(function e(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,(0,n.default)({path:"yoast/v1/ai_generator/bust_subscription_cache",method:"POST",parse:!1});case 3:e.next=8;break;case 5:e.prev=5,e.t0=e.catch(0),console.error(e.t0);case 8:window.location.reload();case 9:case"end":return e.stop()}},e,void 0,[[0,5]])})),[]),E=void 0,v=void 0,_=void 0;1===t.length&&(v="Yoast SEO Premium"===(E=t[0])?r:p,_="Yoast SEO Premium"===E?c:d);var w=(0,s.createInterpolateElement)((0,o.sprintf)((0,o.__)("To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.","wordpress-seo-premium"),E,"MyYoast","","","",""),{Activate:wp.element.createElement(u.OutboundLink,{variant:"error",href:v}),New:wp.element.createElement(u.OutboundLink,{variant:"error",href:_})}),S=(0,s.createInterpolateElement)((0,o.sprintf)((0,o.__)("To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.","wordpress-seo-premium"),"MyYoast","Yoast SEO Premium","Yoast WooCommerce SEO","Yoast WooCommerce SEO Premium bundle","","","",""),{Activate:wp.element.createElement(u.OutboundLink,{variant:"error",href:m}),New:wp.element.createElement(u.OutboundLink,{variant:"error",href:f})});return wp.element.createElement(s.Fragment,null,wp.element.createElement(a.Alert,{variant:"error"},wp.element.createElement("p",null,1===t.length&&w,t.length>1&&S)),wp.element.createElement("div",{className:"yst-mt-6 yst-mb-1 yst-flex yst-space-x-3 yst-place-content-end"},wp.element.createElement(a.Button,{variant:"secondary",onClick:y},(0,o.__)("Close","wordpress-seo-premium")),wp.element.createElement(a.Button,{variant:"primary",onClick:g},(0,o.__)("Refresh page","wordpress-seo-premium"))))};d.propTypes={invalidSubscriptions:c.default.array},d.defaultProps={invalidSubscriptions:[]}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TimeoutAlert=void 0;var n=r(5),i=r(3),s=r(2),o=r(6),a=r(15),u=r(7);t.TimeoutAlert=function(){var e=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).selectLink("https://yoa.st/ai-generator-support")},[]);return wp.element.createElement(o.Alert,{variant:"error"},wp.element.createElement("span",{className:"yst-block yst-font-medium"},(0,s.__)("Connection timeout","wordpress-seo-premium")),wp.element.createElement("p",{className:"yst-mt-2"},(0,i.createInterpolateElement)((0,s.sprintf)((0,s.__)("It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s","wordpress-seo-premium"),"",""),{a:wp.element.createElement(a.OutboundLink,{variant:"error",href:e})})))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UnethicalRequestAlert=void 0;var n=r(5),i=r(3),s=r(2),o=r(6),a=r(15),u=r(7),l=r(12),c=r(44);t.UnethicalRequestAlert=function(){var e=(0,c.useTypeContext)().editType,t=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).selectLink("https://yoa.st/ai-generator-configure-page")},[]),r=(0,i.useMemo)(function(){return e===l.EDIT_TYPE.description?(0,s.__)("Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.","wordpress-seo-premium"):(0,s.__)("Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.","wordpress-seo-premium")},[e]);return wp.element.createElement(o.Alert,{variant:"error"},wp.element.createElement("p",null,(0,i.createInterpolateElement)((0,s.sprintf)(r,"","","",""),{a1:wp.element.createElement(a.OutboundLink,{variant:"error",href:"https://openai.com/policies/usage-policies"}),a2:wp.element.createElement(a.OutboundLink,{variant:"error",href:t})})))}},function(e,t,r){"use strict";r.r(t);var n=r(0);const i=n.forwardRef(function(e,t){return n.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),n.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}))});t.default=i},function(e,t,r){"use strict";r.r(t);var n=r(0);const i=n.forwardRef(function(e,t){return n.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),n.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"}))});t.default=i},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useSetTitleOrDescription=void 0;var n=r(1),i=r(12),s=r(140),o=r(141),a=r(27);t.useSetTitleOrDescription=function(){switch((0,a.useTypeContext)().editType){case i.EDIT_TYPE.title:return(0,o.useSetTitle)();case i.EDIT_TYPE.description:return(0,s.useSetDescription)();default:return n.noop}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.GoogleContent=void 0;var n=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],n=!0,i=!1,s=void 0;try{for(var o,a=e[Symbol.iterator]();!(n=(o=a.next()).done)&&(r.push(o.value),!t||r.length!==t);n=!0);}catch(e){i=!0,s=e}finally{try{!n&&a.return&&a.return()}finally{if(i)throw s}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=r(5),s=r(3),o=r(2),a=r(6),u=function(e){return e&&e.__esModule?e:{default:e}}(r(4)),l=r(51),c=r(7),p=r(12),d=r(44);(t.GoogleContent=function(e){var t=e.title,r=e.description,u=e.status,m=e.titleForLength,f=e.showPreviewSkeleton,y=e.showLengthProgress,g=(0,i.useSelect)(function(e){return e(c.STORE_NAME_EDITOR.free).getSnippetEditorMode()},[]),E=(0,s.useState)(g),v=n(E,2),_=v[0],w=v[1],S=(0,d.useTypeContext)().editType,b=(0,d.useLocation)(),T=(0,d.useTitleOrDescriptionLengthProgress)({editType:S,title:m,description:r});return wp.element.createElement("div",null,wp.element.createElement("div",{className:"yst-flex yst-mb-6"},wp.element.createElement(a.Label,{as:"span",className:"yst-flex-grow yst-cursor-default"},(0,o.__)("Google preview","wordpress-seo-premium")),wp.element.createElement(l.PreviewModePicker,{mode:_,idSuffix:b,onChange:w,disabled:u===p.ASYNC_ACTION_STATUS.loading})),f?wp.element.createElement(l.GooglePreviewSkeleton,null):wp.element.createElement(l.GooglePreview,{mode:_,title:t,description:r}),wp.element.createElement(l.LengthProgressBar,{className:"yst-mt-4",progress:y?T.actual:0,min:0,max:T.max,score:T.score}))}).propTypes={title:u.default.string.isRequired,description:u.default.string.isRequired,status:u.default.oneOf(Object.keys(p.ASYNC_ACTION_STATUS)).isRequired,titleForLength:u.default.string.isRequired,showPreviewSkeleton:u.default.bool.isRequired,showLengthProgress:u.default.bool.isRequired}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.GooglePreview=void 0;var n=r(5),i=r(3),s=r(142),o=r(1),a=function(e){return e&&e.__esModule?e:{default:e}}(r(4)),u=r(7),l=r(12);(t.GooglePreview=function(e){var t=e.mode,r=e.title,a=e.description,l=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).getBaseUrlFromSettings()},[]),c=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).getSnippetEditorData().slug||""},[]),p=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).getDateFromSettings()},[]),d=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).getFocusKeyphrase()},[]),m=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).getSnippetEditorPreviewImageUrl()},[]),f=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).getSiteIconUrlFromSettings()},[]),y=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).getShoppingData()},[]),g=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).getSnippetEditorWordsToHighlight()},[]),E=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).getSiteName()},[]),v=(0,n.useSelect)(function(e){return e(u.STORE_NAME_EDITOR.free).getContentLocale()},[]),_=(0,i.useMemo)(function(){return l+c},[l,c]);return wp.element.createElement(s.SnippetPreview,{title:r,description:a,mode:t,url:_,keyword:d,date:p,faviconSrc:f,mobileImageSrc:m,wordsToHighlight:g,siteName:E,locale:v,shoppingData:y,onMouseUp:o.noop})}).propTypes={mode:a.default.oneOf(Object.keys(l.PREVIEW_MODE)).isRequired,title:a.default.string.isRequired,description:a.default.string.isRequired}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.GooglePreviewSkeleton=void 0;var n=r(6);t.GooglePreviewSkeleton=function(){return wp.element.createElement("div",{className:"yst-max-w-[400px] yst-py-4 yst-px-3 yst-border yst-rounded-lg"},wp.element.createElement("div",{className:"yst-flex yst-gap-x-3"},wp.element.createElement(n.SkeletonLoader,{className:"yst-flex-shrink-0 yst-h-7 yst-w-7 yst-rounded-full"}),wp.element.createElement("div",{className:"yst-flex yst-flex-col yst-w-full yst-gap-y-1"},wp.element.createElement(n.SkeletonLoader,{className:"yst-h-3 yst-w-1/3"}),wp.element.createElement(n.SkeletonLoader,{className:"yst-h-2.5 yst-w-10/12"}))),wp.element.createElement(n.SkeletonLoader,{className:"yst-h-4 yst-w-full yst-mt-6 yst-mb-4"}),wp.element.createElement(n.SkeletonLoader,{className:"yst-h-3 yst-w-full"}),wp.element.createElement(n.SkeletonLoader,{className:"yst-h-3 yst-w-10/12 yst-mt-2.5"}))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LengthProgressBar=void 0;var n=r(3),i=r(6),s=a(r(76)),o=a(r(4));function a(e){return e&&e.__esModule?e:{default:e}}var u=t.LengthProgressBar=function(e){var t=e.className,r=e.progress,o=e.max,a=e.score,u=(0,n.useMemo)(function(){return function(e){return e>=7?"yst-score-good":e>=5?"yst-score-ok":"yst-score-bad"}(a)},[a]);return wp.element.createElement(i.ProgressBar,{className:(0,s.default)("yst-length-progress-bar",u,t),progress:r,min:0,max:o})};u.propTypes={className:o.default.string,progress:o.default.number.isRequired,max:o.default.number.isRequired,score:o.default.number.isRequired},u.defaultProps={className:""}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PreviewModePicker=void 0;var n=r(3),i=r(2),s=r(6),o=function(e){return e&&e.__esModule?e:{default:e}}(r(4)),a=r(12);(t.PreviewModePicker=function(e){var t=e.idSuffix,r=e.mode,o=e.onChange,u=e.disabled,l=(0,n.useCallback)(function(e){var t=e.target;return t.checked&&o(t.value)},[o]);return wp.element.createElement(s.RadioGroup,{id:"yst-ai-mode__"+t,className:"yst-ai-mode",disabled:u},wp.element.createElement(s.RadioGroup.Radio,{id:"yst-ai-mode__mobile__"+t,name:"yst-ai-mode__"+t,label:(0,i.__)("Mobile result","wordpress-seo-premium"),value:a.PREVIEW_MODE.mobile,checked:r===a.PREVIEW_MODE.mobile,onChange:l,disabled:u}),wp.element.createElement(s.RadioGroup.Radio,{id:"yst-ai-mode__desktop__"+t,name:"yst-ai-mode__"+t,label:(0,i.__)("Desktop result","wordpress-seo-premium"),value:a.PREVIEW_MODE.desktop,checked:r===a.PREVIEW_MODE.desktop,onChange:l,disabled:u}))}).propTypes={idSuffix:o.default.string.isRequired,mode:o.default.oneOf(Object.keys(a.PREVIEW_MODE)).isRequired,onChange:o.default.func.isRequired,disabled:o.default.bool.isRequired}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SocialContent=void 0;var n=r(2),i=r(6),s=function(e){return e&&e.__esModule?e:{default:e}}(r(4)),o=r(51);(t.SocialContent=function(e){var t=e.title,r=e.description,s=e.showPreviewSkeleton;return wp.element.createElement("div",null,wp.element.createElement("div",{className:"yst-flex yst-mb-6"},wp.element.createElement(i.Label,{as:"span",className:"yst-flex-grow yst-cursor-default"},(0,n.__)("Social preview","wordpress-seo-premium"))),s?wp.element.createElement(o.SocialPreviewSkeleton,null):wp.element.createElement(o.SocialPreview,{title:t,description:r}))}).propTypes={title:s.default.string.isRequired,description:s.default.string.isRequired,showPreviewSkeleton:s.default.bool.isRequired}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SocialPreview=void 0;var n=r(5),i=r(34),s=r(1),o=function(e){return e&&e.__esModule?e:{default:e}}(r(4)),a=r(7);(t.SocialPreview=function(e){var t=e.title,r=e.description,o=(0,n.useSelect)(function(e){return e(a.STORE_NAME_EDITOR.free).getSiteUrl()},[]),u=(0,n.useSelect)(function(e){return e(a.STORE_NAME_EDITOR.free).getFacebookImageUrl()},[]),l=(0,n.useSelect)(function(e){return e(a.STORE_NAME_EDITOR.free).getEditorDataImageFallback()},[]),c=(0,n.useSelect)(function(e){return e(a.STORE_NAME_EDITOR.free).getFacebookAltText()},[]);return wp.element.createElement(i.FacebookPreview,{title:t,description:r,siteUrl:o,imageUrl:u,imageFallbackUrl:l,alt:c,onSelect:s.noop,onImageClick:s.noop,onMouseHover:s.noop})}).propTypes={title:o.default.string.isRequired,description:o.default.string.isRequired}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SocialPreviewSkeleton=void 0;var n=r(6);t.SocialPreviewSkeleton=function(){return wp.element.createElement("div",{className:"yst-flex yst-flex-col yst-w-[527px] yst-border"},wp.element.createElement(n.SkeletonLoader,{className:"yst-h-[273px] yst-w-full yst-rounded-none yst-border yst-border-dashed"}),wp.element.createElement("div",{className:"yst-w-full yst-p-4 yst-space-y-1"},wp.element.createElement(n.SkeletonLoader,{className:"yst-h-3 yst-w-1/3"}),wp.element.createElement(n.SkeletonLoader,{className:"yst-h-5 yst-w-10/12"}),wp.element.createElement(n.SkeletonLoader,{className:"yst-h-3 yst-w-full"})))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SuggestionError=t.WithActions=void 0;var n=r(3),i=r(2),s=r(6),o=r(1),a=function(e){return e&&e.__esModule?e:{default:e}}(r(4)),u=r(143);var l=t.WithActions=function(e){var t=e.children,r=e.onRetry,o=(0,s.useModalContext)().onClose;return wp.element.createElement(n.Fragment,null,t,wp.element.createElement("div",{className:"yst-mt-6 yst-mb-1 yst-flex yst-space-x-3 yst-place-content-end"},wp.element.createElement(s.Button,{variant:"secondary",onClick:o},(0,i.__)("Close","wordpress-seo-premium")),wp.element.createElement(s.Button,{variant:"primary",onClick:r},(0,i.__)("Try again","wordpress-seo-premium"))))};l.propTypes={children:a.default.node.isRequired,onRetry:a.default.func.isRequired};var c=t.SuggestionError=function(e){var t=e.errorCode,r=e.errorMessage,n=e.invalidSubscriptions,i=e.showActions,s=e.onRetry;switch(t){case 400:switch(r){case"AI_CONTENT_FILTER":return wp.element.createElement(u.UnethicalRequestAlert,null);case"NOT_ENOUGH_CONTENT":return wp.element.createElement(u.NotEnoughContentAlert,null);default:return i?wp.element.createElement(l,{onRetry:s},wp.element.createElement(u.GenericAlert,null)):wp.element.createElement(u.GenericAlert,null)}case 402:return wp.element.createElement(u.SubscriptionError,{invalidSubscriptions:n});case 408:return i?wp.element.createElement(l,{onRetry:s},wp.element.createElement(u.TimeoutAlert,null)):wp.element.createElement(u.TimeoutAlert,null);case 429:return wp.element.createElement(u.RateLimitAlert,null);case 403:case 503:default:return i?wp.element.createElement(l,{onRetry:s},wp.element.createElement(u.GenericAlert,null)):wp.element.createElement(u.GenericAlert,null)}};c.propTypes={errorCode:a.default.number.isRequired,errorMessage:a.default.string.isRequired,invalidSubscriptions:a.default.array,showActions:a.default.bool,onRetry:a.default.func},c.defaultProps={showActions:!1,onRetry:o.noop,invalidSubscriptions:[]}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SuggestionsList=void 0;var n=r(3),i=r(2),s=r(6),o=u(r(76)),a=u(r(4));function u(e){return e&&e.__esModule?e:{default:e}}var l=a.default.shape({value:a.default.string.isRequired,label:a.default.node.isRequired}),c=function(e){var t=e.id,r=e.name,i=e.suggestion,s=e.isChecked,a=e.onChange,u=(0,n.useCallback)(function(){return a(i.value)},[i,a]);return wp.element.createElement("label",{htmlFor:t,className:(0,o.default)("yst-flex yst-p-4 yst-items-center yst-border first:yst-rounded-t-md last:yst-rounded-b-md",s&&"yst-z-10 yst-border-primary-500")},wp.element.createElement("input",{type:"radio",id:t,name:r,className:"yst-radio__input",value:i.value,checked:s,onChange:u}),wp.element.createElement("div",{className:(0,o.default)("yst-label yst-radio__label yst-flex yst-flex-wrap yst-items-center",!s&&"yst-text-slate-600")},i.label))};c.propTypes={id:a.default.string.isRequired,name:a.default.string.isRequired,suggestion:l.isRequired,isChecked:a.default.bool.isRequired,onChange:a.default.func.isRequired},(t.SuggestionsList=function(e){var t=e.idSuffix,r=e.suggestions,n=e.selected,o=e.onChange;return wp.element.createElement("div",null,wp.element.createElement(s.RadioGroup,{className:"yst-suggestions-radio-group yst-flex yst-flex-col",id:"yst-ai-suggestions-radio-group__"+t},r.map(function(e,r){return wp.element.createElement(c,{key:"yst-ai-suggestions-radio-"+t+"__"+r,id:"yst-ai-suggestions-radio-"+t+"__"+r,name:"ai-suggestion__"+t,isChecked:e.value===n,onChange:o,suggestion:e})})),wp.element.createElement("p",{className:"yst-text-slate-500 yst-text-[11px] yst-mt-1 yst-text-right"},(0,i.__)("Text generated by AI may be offensive or inaccurate.","wordpress-seo-premium")))}).propTypes={idSuffix:a.default.string.isRequired,suggestions:a.default.arrayOf(l).isRequired,selected:a.default.string.isRequired,onChange:a.default.func.isRequired}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SuggestionsListSkeleton=void 0;var n=r(6),i=function(e){return e&&e.__esModule?e:{default:e}}(r(4));var s=t.SuggestionsListSkeleton=function(e){var t=e.suggestionClassNames;return wp.element.createElement("div",{className:"yst-flex yst-flex-col yst--space-y-[1px]"},t.map(function(e,t){return wp.element.createElement("div",{key:"yst-ai-suggestion-radio-skeleton__"+t,className:"yst-flex yst-p-4 yst-gap-x-3 yst-items-center yst-border first:yst-rounded-t-md last:yst-rounded-b-md"},wp.element.createElement("input",{type:"radio",disabled:!0,className:"yst-my-0.5"}),wp.element.createElement("div",{className:"yst-flex yst-flex-col yst-w-full"},e.map(function(e,r){return wp.element.createElement(n.SkeletonLoader,{key:"yst-ai-suggestion-radio-skeleton-"+t+"__"+r,className:e})})))}))};s.propTypes={suggestionClassNames:i.default.arrayOf(i.default.arrayOf(i.default.string))},s.defaultProps={suggestionClassNames:[["yst-h-3 yst-w-full","yst-mt-2.5 yst-h-3 yst-w-9/12"],["yst-h-3 yst-w-full","yst-mt-2.5 yst-h-3 yst-w-7/12"],["yst-h-3 yst-w-full","yst-mt-2.5 yst-h-3 yst-w-10/12"],["yst-h-3 yst-w-full","yst-mt-2.5 yst-h-3 yst-w-11/12"],["yst-h-3 yst-w-full","yst-mt-2.5 yst-h-3 yst-w-8/12"]]}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TipNotification=void 0;var n=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],n=!0,i=!1,s=void 0;try{for(var o,a=e[Symbol.iterator]();!(n=(o=a.next()).done)&&(r.push(o.value),!t||r.length!==t);n=!0);}catch(e){i=!0,s=e}finally{try{!n&&a.return&&a.return()}finally{if(i)throw s}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=r(5),s=r(3),o=r(2),a=r(6),u=function(e){return e&&e.__esModule?e:{default:e}}(r(4)),l=r(7),c=r(12),p=r(44);(t.TipNotification=function(e){var t=e.height,r=(0,i.useSelect)(function(e){return e(l.STORE_NAME_EDITOR.free).isAlertDismissed("wpseo_premium_ai_generator")},[]),u=(0,i.useSelect)(function(e){return e(l.STORE_NAME_EDITOR.free).getEditorDataContent()},[]),d=(0,a.useToggleState)(!1),m=n(d,4),f=m[0],y=m[3],g=(0,p.useTypeContext)(),E=g.editType,v=g.postType,_=(0,i.useDispatch)(l.STORE_NAME_EDITOR.free).dismissAlert,w="product"===v?150:300,S=(0,s.useCallback)(function(){_("wpseo_premium_ai_generator")},[_]),b=(0,s.useMemo)(function(){return E===c.EDIT_TYPE.description?(0,o.__)("%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.","wordpress-seo-premium"):(0,o.__)("%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.","wordpress-seo-premium")},[E]);if(r||f||u.length>w)return null;var T="calc("+(0===t?"50%":t/2+"px")+" - 50vh)";return wp.element.createElement(a.Notifications,{className:"yst-mx-[calc(50%-50vw)] yst-transition-all",style:{marginTop:T,marginBottom:T},position:"bottom-left"},wp.element.createElement(a.Notifications.Notification,{id:"ai-generator-content-tip",variant:"info",dismissScreenReaderLabel:(0,o.__)("Dismiss","wordpress-seo-premium")},(0,s.createInterpolateElement)((0,o.sprintf)(b,"",""),{span:wp.element.createElement("span",{className:"yst-font-medium yst-text-slate-800"})}),wp.element.createElement("div",{className:"yst-flex yst-mt-3 yst--ml-3 yst-gap-1"},wp.element.createElement(a.Button,{type:"button",variant:"tertiary",onClick:S},(0,o.__)("Don’t show again","wordpress-seo-premium")),wp.element.createElement(a.Button,{type:"button",variant:"tertiary",className:"yst-text-slate-800",onClick:y},(0,o.__)("Dismiss","wordpress-seo-premium")))))}).propTypes={height:u.default.number.isRequired}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TwitterContent=void 0;var n=r(2),i=r(6),s=function(e){return e&&e.__esModule?e:{default:e}}(r(4)),o=r(51);(t.TwitterContent=function(e){var t=e.title,r=e.description,s=e.showPreviewSkeleton;return wp.element.createElement("div",null,wp.element.createElement("div",{className:"yst-flex yst-mb-6"},wp.element.createElement(i.Label,{as:"span",className:"yst-flex-grow yst-cursor-default"},(0,n.__)("Twitter preview","wordpress-seo-premium"))),s?wp.element.createElement(o.TwitterPreviewSkeleton,null):wp.element.createElement(o.TwitterPreview,{title:t,description:r}))}).propTypes={title:s.default.string.isRequired,description:s.default.string.isRequired,showPreviewSkeleton:s.default.bool.isRequired}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TwitterPreview=void 0;var n=r(5),i=r(34),s=r(1),o=function(e){return e&&e.__esModule?e:{default:e}}(r(4)),a=r(7);(t.TwitterPreview=function(e){var t=e.title,r=e.description,o=(0,n.useSelect)(function(e){return e(a.STORE_NAME_EDITOR.free).getSiteUrl()},[]),u=(0,n.useSelect)(function(e){return e(a.STORE_NAME_EDITOR.free).getTwitterImageUrl()},[]),l=(0,n.useSelect)(function(e){return e(a.STORE_NAME_EDITOR.free).getFacebookImageUrl()},[]),c=(0,n.useSelect)(function(e){return e(a.STORE_NAME_EDITOR.free).getEditorDataImageFallback()},[]),p=(0,n.useSelect)(function(e){return e(a.STORE_NAME_EDITOR.free).getTwitterImageType()},[]),d=(0,n.useSelect)(function(e){return e(a.STORE_NAME_EDITOR.free).getTwitterAltText()},[]);return wp.element.createElement(i.TwitterPreview,{title:t,description:r,siteUrl:o,imageUrl:u,imageFallbackUrl:l||c,isLarge:"summary"!==p,alt:d,onSelect:s.noop,onImageClick:s.noop,onMouseHover:s.noop})}).propTypes={title:o.default.string.isRequired,description:o.default.string.isRequired}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TwitterPreviewSkeleton=void 0;var n=r(6);t.TwitterPreviewSkeleton=function(){return wp.element.createElement("div",{className:"yst-flex yst-flex-col yst-max-h-[370px] yst-w-[507px] yst-border yst-rounded-t-[14px] yst-overflow-hidden"},wp.element.createElement(n.SkeletonLoader,{className:"yst-h-[265px] yst-w-full yst-rounded-none yst-border yst-border-dashed"}),wp.element.createElement("div",{className:"yst-w-full yst-p-4 yst-space-y-1"},wp.element.createElement(n.SkeletonLoader,{className:"yst-h-3 yst-w-1/3"}),wp.element.createElement(n.SkeletonLoader,{className:"yst-h-5 yst-w-10/12"}),wp.element.createElement(n.SkeletonLoader,{className:"yst-h-3 yst-w-full"})))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.registerStore=void 0;var n=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{};(0,i.register)(function(e){var t,r;return(0,i.createReduxStore)(a.STORE_NAME_AI,{actions:n({},o.adminUrlActions,o.hasAiGeneratorConsentActions,u.appliedSuggestionsActions,l.productSubscriptionsActions,c.promptContentActions),selectors:n({},o.adminUrlSelectors,o.hasAiGeneratorConsentSelectors,u.appliedSuggestionsSelectors,l.productSubscriptionsSelectors,c.promptContentSelectors),initialState:(0,s.merge)({},(t={},p(t,o.ADMIN_URL_NAME,(0,o.getInitialAdminUrlState)()),p(t,o.HAS_AI_GENERATOR_CONSENT_NAME,(0,o.getInitialHasAiGeneratorConsentState)()),p(t,u.APPLIED_SUGGESTIONS_NAME,(0,u.getInitialAppliedSuggestionsState)()),p(t,l.PRODUCT_SUBSCRIPTIONS_NAME,(0,l.getInitialProductSubscriptionsState)()),p(t,c.PROMPT_CONTENT_NAME,(0,c.getInitialPromptContentState)()),t),e),reducer:(0,i.combineReducers)((r={},p(r,o.ADMIN_URL_NAME,o.adminUrlReducer),p(r,o.HAS_AI_GENERATOR_CONSENT_NAME,o.hasAiGeneratorConsentReducer),p(r,u.APPLIED_SUGGESTIONS_NAME,u.appliedSuggestionsReducer),p(r,l.PRODUCT_SUBSCRIPTIONS_NAME,l.productSubscriptionsReducer),p(r,c.PROMPT_CONTENT_NAME,c.promptContentReducer),r)),controls:n({},o.hasAiGeneratorConsentControls)})}(e))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.appliedSuggestionsReducer=t.appliedSuggestionsActions=t.appliedSuggestionsSelectors=t.getInitialAppliedSuggestionsState=t.APPLIED_SUGGESTIONS_NAME=void 0;var n=Object.assign||function(e){for(var t=1;tRelated link 1
            • Related link 2
            • Related link 3
            • "}},edit:y,save:function(e){var t=e.attributes;return"loaded"!==t.status?null:wp.element.createElement(a.RichText.Content,{tagName:"ul",multiline:"li",value:t.values})}})};var r=n(60),a=n(71),i=n(13),s=n(5),l=g(n(18)),u=n(3),c=n(2),d=n(1),p=n(56),m=g(n(46)),f=g(n(123));function g(e){return e&&e.__esModule?e:{default:e}}var h=window.yoast.editorModules.helpers.createInterpolateElement;function w(e,t,n,o){t!==n&&o(e,{status:t})}function v(e){if((0,s.select)("yoast-seo-premium/editor")){(0,d.get)(YoastSEO,"analysis.linkSuggester")&&YoastSEO.analysis.linkSuggester.update();var t=(0,s.select)("yoast-seo-premium/editor").linkSuggestionsAreLoading,n=(0,(0,s.select)("core/block-editor").getBlockAttributes)(e);"loaded"!==n.status&&(t()?setTimeout(v.bind(null,e),500):function(e,t){var n=(0,s.select)("yoast-seo-premium/editor"),o=n.linkSuggestionsAreUnindexed,r=n.getLinkSuggestions,a=n.getWordsForLinking,i=(0,s.dispatch)("core/block-editor").updateBlockAttributes;if(o())w(e,"unindexed",t.status,i);else{var l=a();if(Array.isArray(l)&&0!==l.length){var u=r();0!==u.length?"loading"===t.status?i(e,{values:u.map(function(e){return'
            • '+e.value+"
            • "}).join(""),status:"loaded"}):w(e,"has-suggestions",t.status,i):w(e,"no-suggestions",t.status,i)}else w(e,"no-content",t.status,i)}}(e,n))}else setTimeout(v.bind(null,e),500)}function b(e){var t="notice notice-"+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"warning")+" notice-alt wpseo-notice-breakout-inside yoast-links-suggestions-notice";return wp.element.createElement("div",{className:t},wp.element.createElement("p",null,e))}function y(e){var t=e.clientId,n=e.attributes,s=e.setAttributes,l=e.mergeBlocks,d=e.onReplace,f=n.values,g=n.status,w=function(){s({status:"loading"}),v(t)};(0,u.useEffect)(function(){"loaded"!==g&&w()},[]);var y=(0,u.useCallback)(function(e){s({values:e})},[s]),k=(0,u.useCallback)(function(e){(0,r.createBlock)(name,o({},n,{values:e}))},[n]),_=(0,u.useCallback)(function(){d([])},d);if(!(0,m.default)()&&"loaded"!==g)return b(h((0,c.__)("You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.","wordpress-seo-premium"),{a:wp.element.createElement("a",{href:wpseoPremiumMetaboxData.data.settingsPageUrl,target:"_blank"},"#21441-gutenberg")}),"error");if("loaded"!==g)return function(e,t){if("unindexed"===e)return(0,p.getUnindexedWarning)();var n=(0,c.__)("We could not find any relevant articles on your website that you could link to from your post.","wordpress-seo-premium");return"no-content"===e&&(n=(0,c.__)("Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.","wordpress-seo-premium")),"loading"===e&&(n=(0,c.__)("It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.","wordpress-seo-premium")),"has-suggestions"===e&&(n=wp.element.createElement(u.Fragment,null,n,wp.element.createElement("br",null),wp.element.createElement("br",null),wp.element.createElement("button",{type:"button",className:"button",onClick:t},(0,c.__)("Load suggestions","wordpress-seo-premium")))),b(n)}(g,w);return wp.element.createElement(a.RichText,{identifier:"values",multiline:"li",tagName:"ul",onChange:y,value:f,placeholder:(0,c.__)("Write list…","wordpress-seo-premium"),onMerge:l,onSplit:k,onReplace:d,onRemove:_},function(){return wp.element.createElement(a.BlockControls,null,wp.element.createElement(i.ToolbarGroup,{controls:[{icon:"image-rotate",title:(0,c.__)("Refresh suggestions","wordpress-seo-premium"),isActive:!1,onClick:w}]}))})}function k(){return(0,s.select)("yoast-seo-premium/editor")?(0,s.select)("yoast-seo-premium/editor").getLinkSuggestions():null}function _(){return(0,s.select)("yoast-seo-premium/editor")?(0,s.select)("yoast-seo-premium/editor").getWordsForLinking():null}},178:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addAnchorOnParagraphToHeadingConversion=void 0;var o=Object.assign||function(e){for(var t=1;t0;(t!==p||c.length>0&&!n)&&(0,l.dispatch)("core/block-editor").updateBlockAttributes(e.clientId,{headings:c})}}),n=!1,t=p,o=d}e=s}})}()}),function(e){(0,a.registerBlockType)("yoast-seo/table-of-contents",{title:(0,d.__)("Yoast Table of Contents","wordpress-seo-premium"),icon:"editor-ul",category:"yoast-internal-linking-blocks",description:(0,d.__)("Adds a table of contents to this page.","wordpress-seo-premium"),keywords:[(0,d.__)("seo","wordpress-seo-premium"),(0,d.__)("links","wordpress-seo-premium"),(0,d.__)("site structure","wordpress-seo-premium"),(0,d.__)("toc","wordpress-seo-premium")],attributes:{title:{type:"string",source:"html",selector:"h2",default:e},level:{type:"number",default:2},maxHeadingLevel:{type:"number",default:3},headings:{type:"array",source:"query",selector:"a",query:{content:{type:"string",source:"html"},href:{type:"string",source:"attribute",attribute:"href"},level:{type:"string",source:"attribute",attribute:"data-level"}}}},example:{attributes:{headings:[{content:"Heading 1",href:"#heading-1",level:"2"},{content:"Subheading 1",href:"#subheading-1",level:"3"},{content:"Subheading 2",href:"#subheading-2",level:"3"},{content:"Heading 2",href:"#heading-2",level:"2"}]}},edit:function(e){var t=e.attributes,n=e.setAttributes,o=(0,c.useCallback)(function(e){return n({title:e})},[n]),r=(0,c.useCallback)(function(e){return n({level:e})},[n]),a=(0,c.useCallback)(function(e){return n({maxHeadingLevel:Number(e)})},[n]);return wp.element.createElement(c.Fragment,null,wp.element.createElement(i.BlockControls,null,wp.element.createElement(s.ToolbarGroup,null,wp.element.createElement(i.HeadingLevelDropdown,{value:t.level,options:[1,2,3,4,5,6],onChange:r}))),wp.element.createElement(i.InspectorControls,null,wp.element.createElement(s.PanelBody,{title:(0,d.__)("Settings","wordpress-seo"),className:"yoast-table-of-contents-controls"},wp.element.createElement(s.SelectControl,{label:(0,d.__)("Maximum heading level","wordpress-seo"),value:t.maxHeadingLevel,options:[1,2,3,4,5,6].map(function(e){return{label:(0,d.sprintf)((0,d.__)("Heading %d"),e),value:e}}),onChange:a}))),wp.element.createElement("div",{className:"yoast-table-of-contents"},wp.element.createElement(i.RichText,{tagName:"h"+t.level,value:t.title,onChange:o}),y(t.headings,t.maxHeadingLevel)))},save:function(e){var t=e.attributes,n=null;return t.title&&(n=wp.element.createElement(i.RichText.Content,{tagName:"h"+t.level,value:t.title})),wp.element.createElement("div",{className:"yoast-table-of-contents"},n,y(t.headings,t.maxHeadingLevel))},deprecated:[{attributes:{title:{type:"string",source:"html",selector:"h2",default:(0,d.__)("Table of contents","wordpress-seo-premium")},level:{type:"number",default:2},headings:{type:"array",source:"query",selector:"a",query:{content:{type:"string",source:"html"},href:{type:"string",source:"attribute",attribute:"href"},level:{type:"string",source:"attribute",attribute:"data-level"}}}},migrate:function(e){return o({maxHeadingLevel:6},e)},save:function(e){var t=e.attributes,n=null;return t.title&&(n=wp.element.createElement(i.RichText.Content,{tagName:"h"+t.level,value:t.title})),wp.element.createElement("div",{className:"yoast-table-of-contents"},n,y(t.headings))}}]})}(e)};var r=n(1),a=n(60),i=n(71),s=n(13),l=n(5),u=g(n(18)),c=n(3),d=n(2),p=n(21),m=n(9),f=g(n(123));function g(e){return e&&e.__esModule?e:{default:e}}var h=m.languageProcessing.stripHTMLTags;var w=function(e,t){for(var n="h-"+function(e){var t=new RegExp("[^\\p{L}\\p{N}]+","gu");return(0,r.trim)((0,r.deburr)(h(e)).replace(t,"-").toLowerCase(),"-")}((0,a.getBlockContent)(e)),o=n,i=0;t.includes(o);)o=n+"-"+i,i++;return o};var v=function(e){var t=[];return(0,f.default)(e,function(e){"core/heading"===e.name&&t.push(e.attributes.anchor)}),t};function b(e,t){for(var n=e;n&&n.level>=t;)n=n.parent;return n}function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:99;return e&&0!==e.length?function e(t){var n=t.map(function(t){var n=null;return t.children&&t.children.length>0&&(n=e(t.children)),wp.element.createElement("li",{key:t.href},wp.element.createElement("a",{href:t.href,"data-level":t.level},t.content),n)});return wp.element.createElement("ul",null,n)}(e=function(e){var t=[],n=void 0,r=!0,a=!1,i=void 0;try{for(var s,l=e[Symbol.iterator]();!(r=(s=l.next()).done);r=!0){var u=s.value,c=parseInt(u.level,10),d=o({children:[],parent:null},u,{level:c}),p=b(n,c);p?(d.parent=p,p.children.push(d)):t.push(d),n=d}}catch(e){a=!0,i=e}finally{try{!r&&l.return&&l.return()}finally{if(a)throw i}}return t}(e=e.filter(function(e){return e.level<=t}))):null}var k=t.addAnchorOnParagraphToHeadingConversion=function(e){if((0,r.isNil)(e.attributes.anchor)&&"core/heading"===e.name){var t=(0,l.select)("core/block-editor").getBlocks(),n=v(t);e.attributes.anchor=w(e,n)}return e};(0,p.addFilter)("blocks.switchToBlockType.transformedBlock","yoast-seo-table-of-contents/transformed-block",k)},18:function(e,t){e.exports=window.wp.domReady},19:function(e,t){e.exports=window.wp.url},2:function(e,t){e.exports=window.wp.i18n},21:function(e,t){e.exports=window.wp.hooks},22:function(e,t,n){"use strict";function o(e){return function(){return e}}var r=function(){};r.thatReturns=o,r.thatReturnsFalse=o(!1),r.thatReturnsTrue=o(!0),r.thatReturnsNull=o(null),r.thatReturnsThis=function(){return this},r.thatReturnsArgument=function(e){return e},e.exports=r},23:function(e,t){e.exports=window.yoast.styleGuide},25:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r=s(n(0)),a=s(n(38)),i=s(n(41));function s(e){return e&&e.__esModule?e:{default:e}}var l=void 0;function u(e,t){var n,i,s,c,d,p,m,f,g=[],h={};for(p=0;p "+l);if("componentClose"===d.type)throw new Error("Missing opening component token: `"+d.value+"`");if("componentOpen"===d.type){n=t[d.value],s=p;break}g.push(t[d.value])}else g.push(d.value);return n&&(c=function(e,t){var n,o,r=t[e],a=0;for(o=e+1;on&&(t.length=n),wp.element.createElement(f,null,wp.element.createElement("p",null,h," ",a),wp.element.createElement("p",null,r.metaMessage),t.map(function(e,t){return wp.element.createElement(d.default,o({key:t},e))}))};y.propTypes={suggestions:a.default.array.isRequired,maxSuggestions:a.default.number,customMessages:a.default.object,location:a.default.string},y.defaultProps={maxSuggestions:10,customMessages:{lengthMessage:"",metaMessage:""},location:""};var k=function(){window.open("admin.php?page=wpseo_tools&start-indexation=true","yoastSeoAnalyzeProminentWords")},_=function(e){var t="";return e.hasWordsForLinking||(t=(0,l.__)("Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.","wordpress-seo-premium")),{lengthMessage:t,metaMessage:function(e,t,n){switch(!0){case n&&!t&&""===e:return(0,l.__)("Add a title to your post for the best internal linking suggestions.","wordpress-seo-premium");case!n&&t&&""===e:return(0,l.__)("Add a metadescription to your post for the best internal linking suggestions.","wordpress-seo-premium");case!n&&!t&&""===e:return(0,l.__)("Add a title and a metadescription to your post for the best internal linking suggestions.","wordpress-seo-premium");case n&&!t&&""!==e:return(0,l.__)("Also, add a title to your post for the best internal linking suggestions.","wordpress-seo-premium");case!n&&t&&""!==e:return(0,l.__)("Also, add a metadescription to your post for the best internal linking suggestions.","wordpress-seo-premium");case!n&&!t&&""!==e:return(0,l.__)("Also, add a title and a metadescription to your post for the best internal linking suggestions.","wordpress-seo-premium")}}(t,e.hasTitle,e.hasMetaDescription)}},x=t.getUnindexedWarning=function(){var e=(0,l.__)("We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s","wordpress-seo-premium");return e=(e=(e=(e=(e=e.replace("%1$s","{{a}}")).replace("%2$s","{{/a}}")).replace("%3$s","{{startAnalysis}}")).replace("%4$s","{{/startAnalysis}}")).replace("\n\n","{{br /}}{{br /}}"),e=(0,s.default)({mixedString:e,components:{a:wp.element.createElement("a",{href:wpseoAdminL10n["shortlinks.notification_internal_link"],target:"_blank"}),startAnalysis:wp.element.createElement("button",{type:"button",className:"button",onClick:k}),br:wp.element.createElement("br",null)}}),wp.element.createElement("div",{className:"notice notice-warning notice-alt wpseo-notice-breakout-inside yoast-links-suggestions-notice"},wp.element.createElement("p",null,e))},E=function(e){if((0,r.useEffect)(function(){return e.suggester.subscribe(),function(){e.suggester.unsubscribe()}},[]),e.isLoading)return wp.element.createElement("div",{className:"yoast-link-suggestions"},wp.element.createElement("p",null,(0,l.__)("It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.","wordpress-seo-premium")));w||((w=new ClipboardJS(".yoast-link-suggestion__copy")).on("success",v),w.on("error",b));var t=null;e.showUnindexedWarning&&(t=x());var n=o({},e.messageData,{hasWordsForLinking:Array.isArray(e.wordsForLinking)&&e.wordsForLinking.length>0}),a=_(n);return wp.element.createElement("div",{className:"yoast-link-suggestions"},t,wp.element.createElement(y,{suggestions:e.suggestions,customMessages:a,location:e.location}))};E.propTypes={suggester:a.default.object,suggestions:a.default.array.isRequired,wordsForLinking:a.default.array,messageData:a.default.object,isLoading:a.default.bool.isRequired,showUnindexedWarning:a.default.bool,location:a.default.string},E.defaultProps={suggester:null,showUnindexedWarning:!1,messageData:{hasMetaDescription:!1,hasTitle:!1},wordsForLinking:[],location:""},t.default=E},57:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});u(n(0));var o=u(n(4)),r=u(n(14)),a=n(2),i=n(23),s=n(11),l=n(16);function u(e){return e&&e.__esModule?e:{default:e}}var c=r.default.div.withConfig({displayName:"LinkSuggestion__LinkSuggestionWrapper",componentId:"sc-1gewdgc-0"})(["display:flex;align-items:normal;min-height:40px;margin:10px 0 5px;"]),d=(0,l.createSvgIconComponent)({copy:{viewbox:"0 0 448 512",path:"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"},check:{viewbox:"0 0 512 512",path:"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"}}),p=r.default.div.withConfig({displayName:"LinkSuggestion__LinkSuggestionDivider",componentId:"sc-1gewdgc-1"})(["background-color:#e5e5e5;width:100%;height:1px;"]),m=r.default.button.withConfig({displayName:"LinkSuggestion__LinkSuggestionIcon",componentId:"sc-1gewdgc-2"})(["box-sizing:border-box;flex:0 0 30px;height:30px;width:30px;background-color:",";border-radius:5px;cursor:pointer;outline:none;border:1px solid ",";margin-left:3px;&:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,0.8);}"],function(e){return e.iconBackground},function(e){return e.iconBorder});m.props={iconBackground:o.default.string,iconBorder:o.default.string},m.defaultProps={iconBackground:i.colors.$color_button,iconBorder:i.colors.$color_button_border};var f=r.default.div.withConfig({displayName:"LinkSuggestion__LinkContainer",componentId:"sc-1gewdgc-3"})(["flex:auto;"]),g=(0,l.makeOutboundLink)(r.default.a.withConfig({displayName:"LinkSuggestion__Link",componentId:"sc-1gewdgc-4"})(["text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;max-height:40px;margin-bottom:4px;-webkit-box-orient:vertical;overflow:hidden;padding:0 0 4px;"])),h=r.default.div.withConfig({displayName:"LinkSuggestion__BadgesWrapper",componentId:"sc-1gewdgc-5"})(["flex-wrap:wrap;display:flex;flex-direction:row;justify-content:unset;margin-top:4px;"]),w=r.default.span.withConfig({displayName:"LinkSuggestion__Badge",componentId:"sc-1gewdgc-6"})(["white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;padding:3px 8px;font-size:0.85em;background-color:#f3f4f5;border-radius:2px;margin-bottom:4px;margin-right:4px;text-transform:lowercase;"]),v=function(e){var t=e.badges;return wp.element.createElement(h,null,t.map(function(e,t){return wp.element.createElement(w,{key:t},e)}))};v.propTypes={badges:o.default.array.isRequired};var b=function(e){var t=e.value,n=e.url,o=e.isActive,r=e.labels,l=(0,a.__)("Copy link","wordpress-seo-premium"),u=(0,a.sprintf)((0,a.__)("Copy link to suggested article: %s","wordpress-seo-premium"),t),h="copy",w=i.colors.$color_black,b=i.colors.$color_button,y="#979797";return o&&(h="check",w=i.colors.$color_alert_success_text,b=i.colors.$color_alert_success_background,y=i.colors.$color_alert_success_background),wp.element.createElement("div",null,wp.element.createElement(p,null),wp.element.createElement(c,{className:"yoast-link-suggestion__wrapper"},wp.element.createElement(f,{className:"yoast-link-suggestion__container"},wp.element.createElement(g,{href:n},t),wp.element.createElement(v,{badges:r})),wp.element.createElement(m,{type:"button",className:"yoast-link-suggestion__copy yoast-tooltip yoast-tooltip-alt yoast-tooltip-s",onBlur:function(e){e.nativeEvent.target.setAttribute("aria-label",u),e.nativeEvent.target.setAttribute("data-label",l)},"data-clipboard-text":n,"aria-label":u,"data-label":l,iconBackground:b,iconBorder:y},wp.element.createElement(d,{icon:h,color:w}),wp.element.createElement(s.ScreenReaderText,null,l))))};b.propTypes={value:o.default.string.isRequired,url:o.default.string.isRequired,isActive:o.default.bool,labels:o.default.array.isRequired},b.defaultProps={isActive:!1},t.default=b},60:function(e,t){e.exports=window.wp.blocks},71:function(e,t){e.exports=window.wp.blockEditor},9:function(e,t){e.exports=window.yoast.analysis}},[[176,0]]]); \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/commons-premium-2200.min.js b/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/commons-premium-2200.min.js deleted file mode 100644 index 00f333cf..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/commons-premium-2200.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){function r(r){for(var n,i,f=r[0],l=r[1],a=r[2],c=0,s=[];c a");if(e)return e.addEventListener("click",h),function(){return e.removeEventListener("click",h)}},[h]),(0,o.useEffect)(function(){return localStorage.setItem("wpseoFrontendInspectorOpen",c?"open":"closed")},[c]),(0,o.useEffect)(function(){var e=document.getElementById("wpadminbar");if(e){var t=function(){if(E.current)if(32===e.clientHeight||0===window.scrollY||window.innerWidth>600)E.current.removeAttribute("style");else{var t=window.scrollY<46?46-window.scrollY:0;E.current.setAttribute("style","--yst-admin-bar-margin: "+t+"px;")}};return window.addEventListener("resize",t),window.addEventListener("scroll",t),function(){window.removeEventListener("resize",t),window.removeEventListener("scroll",t)}}},[]),wp.element.createElement(p.default,{ref:E,isOpen:c,header:wp.element.createElement(m,{onClick:y})},e.editButton&&wp.element.createElement("section",null,e.keywordAnalysisActive&&wp.element.createElement(o.Fragment,null,wp.element.createElement("h3",null,(0,i.__)("Focus Keyphrase","wordpress-seo-premium")),wp.element.createElement("span",null,e.focusKeyphrase||wp.element.createElement(v,null))),(e.keywordAnalysisActive||e.contentAnalysisActive)&&wp.element.createElement("div",{className:"checks"},wp.element.createElement("h3",null,(0,i.__)("Checks","wordpress-seo-premium")),e.keywordAnalysisActive&&wp.element.createElement(d.AnalysisCheck,{label:(0,i.__)("SEO score","wordpress-seo-premium")+":",score:g.className||"not-set",scoreValue:g.screenReaderText||(0,i.__)("Not available","wordpress-seo-premium")}),e.contentAnalysisActive&&wp.element.createElement(d.AnalysisCheck,{label:(0,i.__)("Readability score","wordpress-seo-premium")+":",score:"na"!==x.className&&x.className?x.className:"not-set",scoreValue:x.screenReaderReadabilityText||(0,i.__)("Not available","wordpress-seo-premium")})),wp.element.createElement("div",{className:"yoast-edit-button"},wp.element.createElement(s.LinkButton,{href:e.editButton.href},wp.element.createElement(s.SvgIcon,{icon:"edit",color:l.colors.$color_grey_text})," ",e.editButton.text))),wp.element.createElement("section",null,wp.element.createElement("h3",null,(0,i.__)("Meta tags","wordpress-seo-premium")),wp.element.createElement("ul",null,e.metaTags.map(function(e,t){return wp.element.createElement("li",{key:e.key+"-"+t},wp.element.createElement("strong",null,e.key),wp.element.createElement("br",null),wp.element.createElement("span",{dir:b.test(e.val)?"ltr":null},e.val))}))),wp.element.createElement("section",null,wp.element.createElement("h3",null,(0,i.__)("Schema","wordpress-seo-premium")),wp.element.createElement(u.default,{src:e.schema,collapsed:3,displayDataTypes:!1,displayObjectSize:!1,indentWidth:2})))}},193:function(e,t,n){e.exports=function(e){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=48)}([function(t,n){t.exports=e},function(e,t){var n=e.exports={version:"2.6.12"};"number"==typeof __e&&(__e=n)},function(e,t,n){var r=n(26)("wks"),a=n(17),o=n(3).Symbol,i="function"==typeof o;(e.exports=function(e){return r[e]||(r[e]=i&&o[e]||(i?o:a)("Symbol."+e))}).store=r},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){e.exports=!n(8)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){var r=n(7),a=n(16);e.exports=n(4)?function(e,t,n){return r.f(e,t,a(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(10),a=n(35),o=n(23),i=Object.defineProperty;t.f=n(4)?Object.defineProperty:function(e,t,n){if(r(e),t=o(t,!0),r(n),a)try{return i(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){var r=n(40),a=n(22);e.exports=function(e){return r(a(e))}},function(e,t,n){var r=n(11);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t){e.exports={}},function(e,t,n){var r=n(39),a=n(27);e.exports=Object.keys||function(e){return r(e,a)}},function(e,t){e.exports=!0},function(e,t,n){var r=n(3),a=n(1),o=n(53),i=n(6),s=n(5),l=function(e,t,n){var c,u,d,p=e&l.F,f=e&l.G,b=e&l.S,v=e&l.P,m=e&l.B,h=e&l.W,y=f?a:a[t]||(a[t]={}),g=y.prototype,x=f?r:b?r[t]:(r[t]||{}).prototype;for(c in f&&(n=t),n)(u=!p&&x&&void 0!==x[c])&&s(y,c)||(d=u?x[c]:n[c],y[c]=f&&"function"!=typeof x[c]?n[c]:m&&u?o(d,r):h&&x[c]==d?function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(d):v&&"function"==typeof d?o(Function.call,d):d,v&&((y.virtual||(y.virtual={}))[c]=d,e&l.R&&g&&!g[c]&&i(g,c,d)))};l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,e.exports=l},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t,n){var r=n(22);e.exports=function(e){return Object(r(e))}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){"use strict";var r=n(52)(!0);n(34)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){var r=n(11);e.exports=function(e,t){if(!r(e))return e;var n,a;if(t&&"function"==typeof(n=e.toString)&&!r(a=n.call(e)))return a;if("function"==typeof(n=e.valueOf)&&!r(a=n.call(e)))return a;if(!t&&"function"==typeof(n=e.toString)&&!r(a=n.call(e)))return a;throw TypeError("Can't convert object to primitive value")}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var r=n(26)("keys"),a=n(17);e.exports=function(e){return r[e]||(r[e]=a(e))}},function(e,t,n){var r=n(1),a=n(3),o=a["__core-js_shared__"]||(a["__core-js_shared__"]={});(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:r.version,mode:n(14)?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){var r=n(7).f,a=n(5),o=n(2)("toStringTag");e.exports=function(e,t,n){e&&!a(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},function(e,t,n){n(62);for(var r=n(3),a=n(6),o=n(12),i=n(2)("toStringTag"),s="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),l=0;ldocument.F=Object<\/script>"),e.close(),l=e.F;r--;)delete l.prototype[o[r]];return l()};e.exports=Object.create||function(e,t){var n;return null!==e?(s.prototype=r(e),n=new s,s.prototype=null,n[i]=e):n=l(),void 0===t?n:a(n,t)}},function(e,t,n){var r=n(5),a=n(9),o=n(57)(!1),i=n(25)("IE_PROTO");e.exports=function(e,t){var n,s=a(e),l=0,c=[];for(n in s)n!=i&&r(s,n)&&c.push(n);for(;t.length>l;)r(s,n=t[l++])&&(~o(c,n)||c.push(n));return c}},function(e,t,n){var r=n(24);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},function(e,t,n){var r=n(39),a=n(27).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,a)}},function(e,t,n){var r=n(24),a=n(2)("toStringTag"),o="Arguments"==r(function(){return arguments}());e.exports=function(e){var t,n,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),a))?n:o?r(t):"Object"==(i=r(t))&&"function"==typeof t.callee?"Arguments":i}},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){var n=/-?\d+(\.\d+)?%?/g;e.exports=function(e){return e.match(n)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getBase16Theme=t.createStyling=t.invertTheme=void 0;var r=f(n(49)),a=f(n(76)),o=f(n(81)),i=f(n(89)),s=f(n(93)),l=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(94)),c=f(n(132)),u=f(n(133)),d=f(n(138)),p=n(139);function f(e){return e&&e.__esModule?e:{default:e}}var b=l.default,v=(0,i.default)(b),m=(0,d.default)(u.default,p.rgb2yuv,function(e){var t,n=(0,o.default)(e,3),r=n[0],a=n[1],i=n[2];return[(t=r,t<.25?1:t<.5?.9-t:1.1-t),a,i]},p.yuv2rgb,c.default),h=function(e){return function(t){return{className:[t.className,e.className].filter(Boolean).join(" "),style:(0,a.default)({},t.style||{},e.style||{})}}},y=function(e,t){var n=(0,i.default)(t);for(var o in e)-1===n.indexOf(o)&&n.push(o);return n.reduce(function(n,o){return n[o]=function(e,t){if(void 0===e)return t;if(void 0===t)return e;var n=void 0===e?"undefined":(0,r.default)(e),o=void 0===t?"undefined":(0,r.default)(t);switch(n){case"string":switch(o){case"string":return[t,e].filter(Boolean).join(" ");case"object":return h({className:e,style:t});case"function":return function(n){for(var r=arguments.length,a=Array(r>1?r-1:0),o=1;o1?r-1:0),o=1;o1?r-1:0),o=1;o1?r-1:0),o=1;o1?r-1:0),o=1;o2?n-2:0),s=2;s3?t-3:0),r=3;r1&&void 0!==arguments[1]?arguments[1]:{},l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},c=o.defaultBase16,u=void 0===c?b:c,d=o.base16Themes,p=void 0===d?null:d,f=E(l,p);f&&(l=(0,a.default)({},f,l));var m=v.reduce(function(e,t){return e[t]=l[t]||u[t],e},{}),h=(0,i.default)(l).reduce(function(e,t){return-1===v.indexOf(t)?(e[t]=l[t],e):e},{}),x=e(m),O=y(h,x);return(0,s.default)(g,2).apply(void 0,[O].concat(n))},3),t.getBase16Theme=function(e,t){if(e&&e.extend&&(e=e.extend),"string"==typeof e){var n=e.split(":"),r=(0,o.default)(n,2),a=r[0],i=r[1];e=(t||{})[a]||l[a],"inverted"===i&&(e=x(e))}return e&&e.hasOwnProperty("base00")?e:void 0})},function(e,t,n){"use strict";var r,a="object"==typeof Reflect?Reflect:null,o=a&&"function"==typeof a.apply?a.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};r=a&&"function"==typeof a.ownKeys?a.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var i=Number.isNaN||function(e){return e!=e};function s(){s.init.call(this)}e.exports=s,e.exports.once=function(e,t){return new Promise(function(n,r){function a(){void 0!==o&&e.removeListener("error",o),n([].slice.call(arguments))}var o;"error"!==t&&(o=function(n){e.removeListener(t,a),r(n)},e.once("error",o)),e.once(t,a)})},s.EventEmitter=s,s.prototype._events=void 0,s.prototype._eventsCount=0,s.prototype._maxListeners=void 0;var l=10;function c(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function u(e){return void 0===e._maxListeners?s.defaultMaxListeners:e._maxListeners}function d(e,t,n,r){var a,o,i,s;if(c(n),void 0===(o=e._events)?(o=e._events=Object.create(null),e._eventsCount=0):(void 0!==o.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),o=e._events),i=o[t]),void 0===i)i=o[t]=n,++e._eventsCount;else if("function"==typeof i?i=o[t]=r?[n,i]:[i,n]:r?i.unshift(n):i.push(n),(a=u(e))>0&&i.length>a&&!i.warned){i.warned=!0;var l=new Error("Possible EventEmitter memory leak detected. "+i.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");l.name="MaxListenersExceededWarning",l.emitter=e,l.type=t,l.count=i.length,s=l,console&&console.warn&&console.warn(s)}return e}function p(e,t,n){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},a=function(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}.bind(r);return a.listener=n,r.wrapFn=a,a}function f(e,t,n){var r=e._events;if(void 0===r)return[];var a=r[t];return void 0===a?[]:"function"==typeof a?n?[a.listener||a]:[a]:n?function(e){for(var t=new Array(e.length),n=0;n0&&(i=t[0]),i instanceof Error)throw i;var s=new Error("Unhandled error."+(i?" ("+i.message+")":""));throw s.context=i,s}var l=a[e];if(void 0===l)return!1;if("function"==typeof l)o(l,this,t);else{var c=l.length,u=v(l,c);for(n=0;n=0;o--)if(n[o]===t||n[o].listener===t){i=n[o].listener,a=o;break}if(a<0)return this;0===a?n.shift():function(e,t){for(;t+1=0;r--)this.removeListener(e,t[r]);return this},s.prototype.listeners=function(e){return f(this,e,!0)},s.prototype.rawListeners=function(e){return f(this,e,!1)},s.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):b.call(e,t)},s.prototype.listenerCount=b,s.prototype.eventNames=function(){return this._eventsCount>0?r(this._events):[]}},function(e,t,n){e.exports.Dispatcher=n(140)},function(e,t,n){e.exports=n(142)},function(e,t,n){"use strict";t.__esModule=!0;var r=i(n(50)),a=i(n(65)),o="function"==typeof a.default&&"symbol"==typeof r.default?function(e){return typeof e}:function(e){return e&&"function"==typeof a.default&&e.constructor===a.default&&e!==a.default.prototype?"symbol":typeof e};function i(e){return e&&e.__esModule?e:{default:e}}t.default="function"==typeof a.default&&"symbol"===o(r.default)?function(e){return void 0===e?"undefined":o(e)}:function(e){return e&&"function"==typeof a.default&&e.constructor===a.default&&e!==a.default.prototype?"symbol":void 0===e?"undefined":o(e)}},function(e,t,n){e.exports={default:n(51),__esModule:!0}},function(e,t,n){n(20),n(29),e.exports=n(30).f("iterator")},function(e,t,n){var r=n(21),a=n(22);e.exports=function(e){return function(t,n){var o,i,s=String(a(t)),l=r(n),c=s.length;return l<0||l>=c?e?"":void 0:(o=s.charCodeAt(l))<55296||o>56319||l+1===c||(i=s.charCodeAt(l+1))<56320||i>57343?e?s.charAt(l):o:e?s.slice(l,l+2):i-56320+(o-55296<<10)+65536}}},function(e,t,n){var r=n(54);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,a){return e.call(t,n,r,a)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){"use strict";var r=n(38),a=n(16),o=n(28),i={};n(6)(i,n(2)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(i,{next:a(1,n)}),o(e,t+" Iterator")}},function(e,t,n){var r=n(7),a=n(10),o=n(13);e.exports=n(4)?Object.defineProperties:function(e,t){a(e);for(var n,i=o(t),s=i.length,l=0;s>l;)r.f(e,n=i[l++],t[n]);return e}},function(e,t,n){var r=n(9),a=n(58),o=n(59);e.exports=function(e){return function(t,n,i){var s,l=r(t),c=a(l.length),u=o(i,c);if(e&&n!=n){for(;c>u;)if((s=l[u++])!=s)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}}},function(e,t,n){var r=n(21),a=Math.min;e.exports=function(e){return e>0?a(r(e),9007199254740991):0}},function(e,t,n){var r=n(21),a=Math.max,o=Math.min;e.exports=function(e,t){return(e=r(e))<0?a(e+t,0):o(e,t)}},function(e,t,n){var r=n(3).document;e.exports=r&&r.documentElement},function(e,t,n){var r=n(5),a=n(18),o=n(25)("IE_PROTO"),i=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=a(e),r(e,o)?e[o]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?i:null}},function(e,t,n){"use strict";var r=n(63),a=n(64),o=n(12),i=n(9);e.exports=n(34)(Array,"Array",function(e,t){this._t=i(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,a(1)):a(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values"),o.Arguments=o.Array,r("keys"),r("values"),r("entries")},function(e,t){e.exports=function(){}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){e.exports={default:n(66),__esModule:!0}},function(e,t,n){n(67),n(73),n(74),n(75),e.exports=n(1).Symbol},function(e,t,n){"use strict";var r=n(3),a=n(5),o=n(4),i=n(15),s=n(37),l=n(68).KEY,c=n(8),u=n(26),d=n(28),p=n(17),f=n(2),b=n(30),v=n(31),m=n(69),h=n(70),y=n(10),g=n(11),x=n(18),E=n(9),O=n(23),w=n(16),j=n(38),S=n(71),k=n(72),C=n(32),P=n(7),R=n(13),I=k.f,_=P.f,A=S.f,F=r.Symbol,T=r.JSON,D=T&&T.stringify,M=f("_hidden"),L=f("toPrimitive"),N={}.propertyIsEnumerable,B=u("symbol-registry"),z=u("symbols"),q=u("op-symbols"),V=Object.prototype,K="function"==typeof F&&!!C.f,U=r.QObject,W=!U||!U.prototype||!U.prototype.findChild,H=o&&c(function(){return 7!=j(_({},"a",{get:function(){return _(this,"a",{value:7}).a}})).a})?function(e,t,n){var r=I(V,t);r&&delete V[t],_(e,t,n),r&&e!==V&&_(V,t,r)}:_,$=function(e){var t=z[e]=j(F.prototype);return t._k=e,t},G=K&&"symbol"==typeof F.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof F},Y=function(e,t,n){return e===V&&Y(q,t,n),y(e),t=O(t,!0),y(n),a(z,t)?(n.enumerable?(a(e,M)&&e[M][t]&&(e[M][t]=!1),n=j(n,{enumerable:w(0,!1)})):(a(e,M)||_(e,M,w(1,{})),e[M][t]=!0),H(e,t,n)):_(e,t,n)},Q=function(e,t){y(e);for(var n,r=m(t=E(t)),a=0,o=r.length;o>a;)Y(e,n=r[a++],t[n]);return e},J=function(e){var t=N.call(this,e=O(e,!0));return!(this===V&&a(z,e)&&!a(q,e))&&(!(t||!a(this,e)||!a(z,e)||a(this,M)&&this[M][e])||t)},X=function(e,t){if(e=E(e),t=O(t,!0),e!==V||!a(z,t)||a(q,t)){var n=I(e,t);return!n||!a(z,t)||a(e,M)&&e[M][t]||(n.enumerable=!0),n}},Z=function(e){for(var t,n=A(E(e)),r=[],o=0;n.length>o;)a(z,t=n[o++])||t==M||t==l||r.push(t);return r},ee=function(e){for(var t,n=e===V,r=A(n?q:E(e)),o=[],i=0;r.length>i;)!a(z,t=r[i++])||n&&!a(V,t)||o.push(z[t]);return o};K||(s((F=function(){if(this instanceof F)throw TypeError("Symbol is not a constructor!");var e=p(arguments.length>0?arguments[0]:void 0),t=function(n){this===V&&t.call(q,n),a(this,M)&&a(this[M],e)&&(this[M][e]=!1),H(this,e,w(1,n))};return o&&W&&H(V,e,{configurable:!0,set:t}),$(e)}).prototype,"toString",function(){return this._k}),k.f=X,P.f=Y,n(41).f=S.f=Z,n(19).f=J,C.f=ee,o&&!n(14)&&s(V,"propertyIsEnumerable",J,!0),b.f=function(e){return $(f(e))}),i(i.G+i.W+i.F*!K,{Symbol:F});for(var te="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),ne=0;te.length>ne;)f(te[ne++]);for(var re=R(f.store),ae=0;re.length>ae;)v(re[ae++]);i(i.S+i.F*!K,"Symbol",{for:function(e){return a(B,e+="")?B[e]:B[e]=F(e)},keyFor:function(e){if(!G(e))throw TypeError(e+" is not a symbol!");for(var t in B)if(B[t]===e)return t},useSetter:function(){W=!0},useSimple:function(){W=!1}}),i(i.S+i.F*!K,"Object",{create:function(e,t){return void 0===t?j(e):Q(j(e),t)},defineProperty:Y,defineProperties:Q,getOwnPropertyDescriptor:X,getOwnPropertyNames:Z,getOwnPropertySymbols:ee});var oe=c(function(){C.f(1)});i(i.S+i.F*oe,"Object",{getOwnPropertySymbols:function(e){return C.f(x(e))}}),T&&i(i.S+i.F*(!K||c(function(){var e=F();return"[null]"!=D([e])||"{}"!=D({a:e})||"{}"!=D(Object(e))})),"JSON",{stringify:function(e){for(var t,n,r=[e],a=1;arguments.length>a;)r.push(arguments[a++]);if(n=t=r[1],(g(t)||void 0!==e)&&!G(e))return h(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!G(t))return t}),r[1]=t,D.apply(T,r)}}),F.prototype[L]||n(6)(F.prototype,L,F.prototype.valueOf),d(F,"Symbol"),d(Math,"Math",!0),d(r.JSON,"JSON",!0)},function(e,t,n){var r=n(17)("meta"),a=n(11),o=n(5),i=n(7).f,s=0,l=Object.isExtensible||function(){return!0},c=!n(8)(function(){return l(Object.preventExtensions({}))}),u=function(e){i(e,r,{value:{i:"O"+ ++s,w:{}}})},d=e.exports={KEY:r,NEED:!1,fastKey:function(e,t){if(!a(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!o(e,r)){if(!l(e))return"F";if(!t)return"E";u(e)}return e[r].i},getWeak:function(e,t){if(!o(e,r)){if(!l(e))return!0;if(!t)return!1;u(e)}return e[r].w},onFreeze:function(e){return c&&d.NEED&&l(e)&&!o(e,r)&&u(e),e}}},function(e,t,n){var r=n(13),a=n(32),o=n(19);e.exports=function(e){var t=r(e),n=a.f;if(n)for(var i,s=n(e),l=o.f,c=0;s.length>c;)l.call(e,i=s[c++])&&t.push(i);return t}},function(e,t,n){var r=n(24);e.exports=Array.isArray||function(e){return"Array"==r(e)}},function(e,t,n){var r=n(9),a=n(41).f,o={}.toString,i="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return i&&"[object Window]"==o.call(e)?function(e){try{return a(e)}catch(e){return i.slice()}}(e):a(r(e))}},function(e,t,n){var r=n(19),a=n(16),o=n(9),i=n(23),s=n(5),l=n(35),c=Object.getOwnPropertyDescriptor;t.f=n(4)?c:function(e,t){if(e=o(e),t=i(t,!0),l)try{return c(e,t)}catch(e){}if(s(e,t))return a(!r.f.call(e,t),e[t])}},function(e,t){},function(e,t,n){n(31)("asyncIterator")},function(e,t,n){n(31)("observable")},function(e,t,n){"use strict";t.__esModule=!0;var r,a=n(77),o=(r=a)&&r.__esModule?r:{default:r};t.default=o.default||function(e){for(var t=1;tu;)for(var f,b=l(arguments[u++]),v=d?a(b).concat(d(b)):a(b),m=v.length,h=0;m>h;)f=v[h++],r&&!p.call(b,f)||(n[f]=b[f]);return n}:c},function(e,t,n){"use strict";t.__esModule=!0;var r=o(n(82)),a=o(n(85));function o(e){return e&&e.__esModule?e:{default:e}}t.default=function(e,t){if(Array.isArray(e))return e;if((0,r.default)(Object(e)))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var s,l=(0,a.default)(e);!(r=(s=l.next()).done)&&(n.push(s.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&l.return&&l.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}},function(e,t,n){e.exports={default:n(83),__esModule:!0}},function(e,t,n){n(29),n(20),e.exports=n(84)},function(e,t,n){var r=n(42),a=n(2)("iterator"),o=n(12);e.exports=n(1).isIterable=function(e){var t=Object(e);return void 0!==t[a]||"@@iterator"in t||o.hasOwnProperty(r(t))}},function(e,t,n){e.exports={default:n(86),__esModule:!0}},function(e,t,n){n(29),n(20),e.exports=n(87)},function(e,t,n){var r=n(10),a=n(88);e.exports=n(1).getIterator=function(e){var t=a(e);if("function"!=typeof t)throw TypeError(e+" is not iterable!");return r(t.call(e))}},function(e,t,n){var r=n(42),a=n(2)("iterator"),o=n(12);e.exports=n(1).getIteratorMethod=function(e){if(null!=e)return e[a]||e["@@iterator"]||o[r(e)]}},function(e,t,n){e.exports={default:n(90),__esModule:!0}},function(e,t,n){n(91),e.exports=n(1).Object.keys},function(e,t,n){var r=n(18),a=n(13);n(92)("keys",function(){return function(e){return a(r(e))}})},function(e,t,n){var r=n(15),a=n(1),o=n(8);e.exports=function(e,t){var n=(a.Object||{})[e]||Object[e],i={};i[e]=t(n),r(r.S+r.F*o(function(){n(1)}),"Object",i)}},function(e,t,n){(function(t){var n=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],r=/^\s+|\s+$/g,a=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,o=/\{\n\/\* \[wrapped with (.+)\] \*/,i=/,? & /,s=/^[-+]0x[0-9a-f]+$/i,l=/^0b[01]+$/i,c=/^\[object .+?Constructor\]$/,u=/^0o[0-7]+$/i,d=/^(?:0|[1-9]\d*)$/,p=parseInt,f="object"==typeof t&&t&&t.Object===Object&&t,b="object"==typeof self&&self&&self.Object===Object&&self,v=f||b||Function("return this")();function m(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function h(e){return e!=e}function y(e,t){for(var n=-1,r=e.length,a=0,o=[];++n2?x:void 0);function T(e){return function(){var t=arguments;switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3]);case 5:return new e(t[0],t[1],t[2],t[3],t[4]);case 6:return new e(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new e(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var n=function(e){return U(e)?I(e):{}}(e.prototype),r=e.apply(n,t);return U(r)?r:n}}function D(e,t,n,r,a,o,i,s,l,c){var u=128&t,d=1&t,p=2&t,f=24&t,b=512&t,m=p?void 0:T(e);return function h(){for(var g=arguments.length,x=Array(g),E=g;E--;)x[E]=arguments[E];if(f)var O=L(h),w=function(e,t){for(var n=e.length,r=0;n--;)e[n]===t&&r++;return r}(x,O);if(r&&(x=function(e,t,n,r){for(var a=-1,o=e.length,i=n.length,s=-1,l=t.length,c=_(o-i,0),u=Array(l+c),d=!r;++s1&&x.reverse(),u&&l1?"& ":"")+t[r],t=t.join(n>2?", ":" "),e.replace(a,"{\n/* [wrapped with "+t+"] */\n")}function z(e,t){return!!(t=null==t?9007199254740991:t)&&("number"==typeof e||d.test(e))&&e>-1&&e%1==0&&e-1}(e,r)&&e.push(r)}),e.sort()}function K(e,t,n){var r=function(e,t,n,r,a,o,i,s){var l=2&t;if(!l&&"function"!=typeof e)throw new TypeError("Expected a function");var c=r?r.length:0;if(c||(t&=-97,r=a=void 0),i=void 0===i?i:_(W(i),0),s=void 0===s?s:W(s),c-=a?a.length:0,64&t){var u=r,d=a;r=a=void 0}var p=[e,t,n,r,a,u,d,o,i,s];if(e=p[0],t=p[1],n=p[2],r=p[3],a=p[4],!(s=p[9]=null==p[9]?l?0:e.length:_(p[9]-c,0))&&24&t&&(t&=-25),t&&1!=t)f=8==t||16==t?function(e,t,n){var r=T(e);return function a(){for(var o=arguments.length,i=Array(o),s=o,l=L(a);s--;)i[s]=arguments[s];var c=o<3&&i[0]!==l&&i[o-1]!==l?[]:y(i,l);if((o-=c.length)1&&r--,o=6*r<1?t+6*(n-t)*r:2*r<1?n:3*r<2?t+(n-t)*(2/3-r)*6:t,a[c]=255*o;return a}},function(e,t,n){(function(t){var n="object"==typeof t&&t&&t.Object===Object&&t,r="object"==typeof self&&self&&self.Object===Object&&self,a=n||r||Function("return this")();function o(e,t){for(var n=-1,r=t.length,a=e.length;++n-1&&e%1==0&&e<=9007199254740991}(e.length)&&!function(e){var t=function(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}(e)?l.call(e):"";return"[object Function]"==t||"[object GeneratorFunction]"==t}(e)}(e)}(e)&&s.call(e,"callee")&&(!u.call(e,"callee")||"[object Arguments]"==l.call(e))}(e)||!!(d&&e&&e[d])}var b,v,m=Array.isArray,h=(b=function(e){for(var t=(e=function e(t,n,r,a,i){var s=-1,l=t.length;for(r||(r=f),i||(i=[]);++s0&&r(c)?n>1?e(c,n-1,r,a,i):o(i,c):a||(i[i.length]=c)}return i}(e,1)).length,n=t;n--;)if("function"!=typeof e[n])throw new TypeError("Expected a function");return function(){for(var n=0,r=t?e[n].apply(this,arguments):arguments[0];++n2?n-2:0),a=2;a=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}function O(e){var t=function(e){return{}.toString.call(e).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}(e);return"number"===t&&(t=isNaN(e)?"nan":(0|e)!=e?"float":"integer"),t}h.__suppressDeprecationWarning=!0,y.__suppressDeprecationWarning=!0,g.__suppressDeprecationWarning=!0;var w={scheme:"rjv-default",author:"mac gainor",base00:"rgba(0, 0, 0, 0)",base01:"rgb(245, 245, 245)",base02:"rgb(235, 235, 235)",base03:"#93a1a1",base04:"rgba(0, 0, 0, 0.3)",base05:"#586e75",base06:"#073642",base07:"#002b36",base08:"#d33682",base09:"#cb4b16",base0A:"#dc322f",base0B:"#859900",base0C:"#6c71c4",base0D:"#586e75",base0E:"#2aa198",base0F:"#268bd2"},j={scheme:"rjv-grey",author:"mac gainor",base00:"rgba(1, 1, 1, 0)",base01:"rgba(1, 1, 1, 0.1)",base02:"rgba(0, 0, 0, 0.2)",base03:"rgba(1, 1, 1, 0.3)",base04:"rgba(0, 0, 0, 0.4)",base05:"rgba(1, 1, 1, 0.5)",base06:"rgba(1, 1, 1, 0.6)",base07:"rgba(1, 1, 1, 0.7)",base08:"rgba(1, 1, 1, 0.8)",base09:"rgba(1, 1, 1, 0.8)",base0A:"rgba(1, 1, 1, 0.8)",base0B:"rgba(1, 1, 1, 0.8)",base0C:"rgba(1, 1, 1, 0.8)",base0D:"rgba(1, 1, 1, 0.8)",base0E:"rgba(1, 1, 1, 0.8)",base0F:"rgba(1, 1, 1, 0.8)"},S={white:"#fff",black:"#000",transparent:"rgba(1, 1, 1, 0)",globalFontFamily:"monospace",globalCursor:"default",indentBlockWidth:"5px",braceFontWeight:"bold",braceCursor:"pointer",ellipsisFontSize:"18px",ellipsisLineHeight:"10px",ellipsisCursor:"pointer",keyMargin:"0px 5px",keyLetterSpacing:"0.5px",keyFontStyle:"none",keyBorderRadius:"3px",keyColonWeight:"bold",keyVerticalAlign:"top",keyOpacity:"0.85",keyOpacityHover:"1",keyValPaddingTop:"3px",keyValPaddingBottom:"3px",keyValPaddingRight:"5px",keyValBorderLeft:"1px solid",keyValBorderHover:"2px solid",keyValPaddingHover:"3px 5px 3px 4px",pushedContentMarginLeft:"6px",variableValuePaddingRight:"6px",nullFontSize:"11px",nullFontWeight:"bold",nullPadding:"1px 2px",nullBorderRadius:"3px",nanFontSize:"11px",nanFontWeight:"bold",nanPadding:"1px 2px",nanBorderRadius:"3px",undefinedFontSize:"11px",undefinedFontWeight:"bold",undefinedPadding:"1px 2px",undefinedBorderRadius:"3px",dataTypeFontSize:"11px",dataTypeMarginRight:"4px",datatypeOpacity:"0.8",objectSizeBorderRadius:"3px",objectSizeFontStyle:"italic",objectSizeMargin:"0px 6px 0px 0px",clipboardCursor:"pointer",clipboardCheckMarginLeft:"-12px",metaDataPadding:"0px 0px 0px 10px",arrayGroupMetaPadding:"0px 0px 0px 4px",iconContainerWidth:"17px",tooltipPadding:"4px",editInputMinWidth:"130px",editInputBorderRadius:"2px",editInputPadding:"5px",editInputMarginRight:"4px",editInputFontFamily:"monospace",iconCursor:"pointer",iconFontSize:"15px",iconPaddingRight:"1px",dateValueMarginLeft:"2px",iconMarginRight:"3px",detectedRowPaddingTop:"3px",addKeyCoverBackground:"rgba(255, 255, 255, 0.3)",addKeyCoverPosition:"absolute",addKeyCoverPositionPx:"0px",addKeyModalWidth:"200px",addKeyModalMargin:"auto",addKeyModalPadding:"10px",addKeyModalRadius:"3px"},k=n(45),C=function(e){var t=function(e){return{backgroundColor:e.base00,ellipsisColor:e.base09,braceColor:e.base07,expandedIcon:e.base0D,collapsedIcon:e.base0E,keyColor:e.base07,arrayKeyColor:e.base0C,objectSize:e.base04,copyToClipboard:e.base0F,copyToClipboardCheck:e.base0D,objectBorder:e.base02,dataTypes:{boolean:e.base0E,date:e.base0D,float:e.base0B,function:e.base0D,integer:e.base0F,string:e.base09,nan:e.base08,null:e.base0A,undefined:e.base05,regexp:e.base0A,background:e.base02},editVariable:{editIcon:e.base0E,cancelIcon:e.base09,removeIcon:e.base09,addIcon:e.base0E,checkIcon:e.base0E,background:e.base01,color:e.base0A,border:e.base07},addKeyModal:{background:e.base05,border:e.base04,color:e.base0A,labelColor:e.base01},validationFailure:{background:e.base09,iconColor:e.base01,fontColor:e.base01}}}(e);return{"app-container":{fontFamily:S.globalFontFamily,cursor:S.globalCursor,backgroundColor:t.backgroundColor,position:"relative"},ellipsis:{display:"inline-block",color:t.ellipsisColor,fontSize:S.ellipsisFontSize,lineHeight:S.ellipsisLineHeight,cursor:S.ellipsisCursor},"brace-row":{display:"inline-block",cursor:"pointer"},brace:{display:"inline-block",cursor:S.braceCursor,fontWeight:S.braceFontWeight,color:t.braceColor},"expanded-icon":{color:t.expandedIcon},"collapsed-icon":{color:t.collapsedIcon},colon:{display:"inline-block",margin:S.keyMargin,color:t.keyColor,verticalAlign:"top"},objectKeyVal:function(e,n){return{style:o({paddingTop:S.keyValPaddingTop,paddingRight:S.keyValPaddingRight,paddingBottom:S.keyValPaddingBottom,borderLeft:S.keyValBorderLeft+" "+t.objectBorder,":hover":{paddingLeft:n.paddingLeft-1+"px",borderLeft:S.keyValBorderHover+" "+t.objectBorder}},n)}},"object-key-val-no-border":{padding:S.keyValPadding},"pushed-content":{marginLeft:S.pushedContentMarginLeft},variableValue:function(e,t){return{style:o({display:"inline-block",paddingRight:S.variableValuePaddingRight,position:"relative"},t)}},"object-name":{display:"inline-block",color:t.keyColor,letterSpacing:S.keyLetterSpacing,fontStyle:S.keyFontStyle,verticalAlign:S.keyVerticalAlign,opacity:S.keyOpacity,":hover":{opacity:S.keyOpacityHover}},"array-key":{display:"inline-block",color:t.arrayKeyColor,letterSpacing:S.keyLetterSpacing,fontStyle:S.keyFontStyle,verticalAlign:S.keyVerticalAlign,opacity:S.keyOpacity,":hover":{opacity:S.keyOpacityHover}},"object-size":{color:t.objectSize,borderRadius:S.objectSizeBorderRadius,fontStyle:S.objectSizeFontStyle,margin:S.objectSizeMargin,cursor:"default"},"data-type-label":{fontSize:S.dataTypeFontSize,marginRight:S.dataTypeMarginRight,opacity:S.datatypeOpacity},boolean:{display:"inline-block",color:t.dataTypes.boolean},date:{display:"inline-block",color:t.dataTypes.date},"date-value":{marginLeft:S.dateValueMarginLeft},float:{display:"inline-block",color:t.dataTypes.float},function:{display:"inline-block",color:t.dataTypes.function,cursor:"pointer",whiteSpace:"pre-line"},"function-value":{fontStyle:"italic"},integer:{display:"inline-block",color:t.dataTypes.integer},string:{display:"inline-block",color:t.dataTypes.string},nan:{display:"inline-block",color:t.dataTypes.nan,fontSize:S.nanFontSize,fontWeight:S.nanFontWeight,backgroundColor:t.dataTypes.background,padding:S.nanPadding,borderRadius:S.nanBorderRadius},null:{display:"inline-block",color:t.dataTypes.null,fontSize:S.nullFontSize,fontWeight:S.nullFontWeight,backgroundColor:t.dataTypes.background,padding:S.nullPadding,borderRadius:S.nullBorderRadius},undefined:{display:"inline-block",color:t.dataTypes.undefined,fontSize:S.undefinedFontSize,padding:S.undefinedPadding,borderRadius:S.undefinedBorderRadius,backgroundColor:t.dataTypes.background},regexp:{display:"inline-block",color:t.dataTypes.regexp},"copy-to-clipboard":{cursor:S.clipboardCursor},"copy-icon":{color:t.copyToClipboard,fontSize:S.iconFontSize,marginRight:S.iconMarginRight,verticalAlign:"top"},"copy-icon-copied":{color:t.copyToClipboardCheck,marginLeft:S.clipboardCheckMarginLeft},"array-group-meta-data":{display:"inline-block",padding:S.arrayGroupMetaPadding},"object-meta-data":{display:"inline-block",padding:S.metaDataPadding},"icon-container":{display:"inline-block",width:S.iconContainerWidth},tooltip:{padding:S.tooltipPadding},removeVarIcon:{verticalAlign:"top",display:"inline-block",color:t.editVariable.removeIcon,cursor:S.iconCursor,fontSize:S.iconFontSize,marginRight:S.iconMarginRight},addVarIcon:{verticalAlign:"top",display:"inline-block",color:t.editVariable.addIcon,cursor:S.iconCursor,fontSize:S.iconFontSize,marginRight:S.iconMarginRight},editVarIcon:{verticalAlign:"top",display:"inline-block",color:t.editVariable.editIcon,cursor:S.iconCursor,fontSize:S.iconFontSize,marginRight:S.iconMarginRight},"edit-icon-container":{display:"inline-block",verticalAlign:"top"},"check-icon":{display:"inline-block",cursor:S.iconCursor,color:t.editVariable.checkIcon,fontSize:S.iconFontSize,paddingRight:S.iconPaddingRight},"cancel-icon":{display:"inline-block",cursor:S.iconCursor,color:t.editVariable.cancelIcon,fontSize:S.iconFontSize,paddingRight:S.iconPaddingRight},"edit-input":{display:"inline-block",minWidth:S.editInputMinWidth,borderRadius:S.editInputBorderRadius,backgroundColor:t.editVariable.background,color:t.editVariable.color,padding:S.editInputPadding,marginRight:S.editInputMarginRight,fontFamily:S.editInputFontFamily},"detected-row":{paddingTop:S.detectedRowPaddingTop},"key-modal-request":{position:S.addKeyCoverPosition,top:S.addKeyCoverPositionPx,left:S.addKeyCoverPositionPx,right:S.addKeyCoverPositionPx,bottom:S.addKeyCoverPositionPx,backgroundColor:S.addKeyCoverBackground},"key-modal":{width:S.addKeyModalWidth,backgroundColor:t.addKeyModal.background,marginLeft:S.addKeyModalMargin,marginRight:S.addKeyModalMargin,padding:S.addKeyModalPadding,borderRadius:S.addKeyModalRadius,marginTop:"15px",position:"relative"},"key-modal-label":{color:t.addKeyModal.labelColor,marginLeft:"2px",marginBottom:"5px",fontSize:"11px"},"key-modal-input-container":{overflow:"hidden"},"key-modal-input":{width:"100%",padding:"3px 6px",fontFamily:"monospace",color:t.addKeyModal.color,border:"none",boxSizing:"border-box",borderRadius:"2px"},"key-modal-cancel":{backgroundColor:t.editVariable.removeIcon,position:"absolute",top:"0px",right:"0px",borderRadius:"0px 3px 0px 3px",cursor:"pointer"},"key-modal-cancel-icon":{color:t.addKeyModal.labelColor,fontSize:S.iconFontSize,transform:"rotate(45deg)"},"key-modal-submit":{color:t.editVariable.addIcon,fontSize:S.iconFontSize,position:"absolute",right:"2px",top:"3px",cursor:"pointer"},"function-ellipsis":{display:"inline-block",color:t.ellipsisColor,fontSize:S.ellipsisFontSize,lineHeight:S.ellipsisLineHeight,cursor:S.ellipsisCursor},"validation-failure":{float:"right",padding:"3px 6px",borderRadius:"2px",cursor:"pointer",color:t.validationFailure.fontColor,backgroundColor:t.validationFailure.background},"validation-failure-label":{marginRight:"6px"},"validation-failure-clear":{position:"relative",verticalAlign:"top",cursor:"pointer",color:t.validationFailure.iconColor,fontSize:S.iconFontSize,transform:"rotate(45deg)"}}};function P(e,t,n){return e||console.error("theme has not been set"),function(e){var t=w;return!1!==e&&"none"!==e||(t=j),Object(k.createStyling)(C,{defaultBase16:t})(e)}(e)(t,n)}var R=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props,t=(e.rjvId,e.type_name),n=e.displayDataTypes,r=e.theme;return n?m.a.createElement("span",Object.assign({className:"data-type-label"},P(r,"data-type-label")),t):null}}]),n}(m.a.PureComponent),I=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props;return m.a.createElement("div",P(e.theme,"boolean"),m.a.createElement(R,Object.assign({type_name:"bool"},e)),e.value?"true":"false")}}]),n}(m.a.PureComponent),_=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props;return m.a.createElement("div",P(e.theme,"date"),m.a.createElement(R,Object.assign({type_name:"date"},e)),m.a.createElement("span",Object.assign({className:"date-value"},P(e.theme,"date-value")),e.value.toLocaleTimeString("en-us",{weekday:"short",year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})))}}]),n}(m.a.PureComponent),A=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props;return m.a.createElement("div",P(e.theme,"float"),m.a.createElement(R,Object.assign({type_name:"float"},e)),this.props.value)}}]),n}(m.a.PureComponent);function F(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,i=!0,s=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return i=e.done,e},e:function(e){s=!0,o=e},f:function(){try{i||null==n.return||n.return()}finally{if(s)throw o}}}}(a);try{for(d.s();!(s=d.n()).done;)u=u[s.value]}catch(e){d.e(e)}finally{d.f()}return i?"array"==O(u)?u.splice(r,1):delete u[r]:null!==r?u[r]=o:c=o,e.set(t,"global","src",c),c},e.deepCopy=function(t,n){var r,a=O(t),i=n.shift();return"array"==a?r=D(t):"object"==a&&(r=o({},t)),void 0!==i&&(r[i]=e.deepCopy(t[i],n)),r},e}return n}(M.EventEmitter));L.register(N.handleAction.bind(N));var B=N,z=function(e){u(n,e);var t=b(n);function n(e){var r;return i(this,n),(r=t.call(this,e)).toggleCollapsed=function(){r.setState({collapsed:!r.state.collapsed},function(){B.set(r.props.rjvId,r.props.namespace,"collapsed",r.state.collapsed)})},r.getFunctionDisplay=function(e){var t=f(r).props;return e?m.a.createElement("span",null,r.props.value.toString().slice(9,-1).replace(/\{[\s\S]+/,""),m.a.createElement("span",{className:"function-collapsed",style:{fontWeight:"bold"}},m.a.createElement("span",null,"{"),m.a.createElement("span",P(t.theme,"ellipsis"),"..."),m.a.createElement("span",null,"}"))):r.props.value.toString().slice(9,-1)},r.state={collapsed:B.get(e.rjvId,e.namespace,"collapsed",!0)},r}return l(n,[{key:"render",value:function(){var e=this.props,t=this.state.collapsed;return m.a.createElement("div",P(e.theme,"function"),m.a.createElement(R,Object.assign({type_name:"function"},e)),m.a.createElement("span",Object.assign({},P(e.theme,"function-value"),{className:"rjv-function-container",onClick:this.toggleCollapsed}),this.getFunctionDisplay(t)))}}]),n}(m.a.PureComponent),q=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){return m.a.createElement("div",P(this.props.theme,"nan"),"NaN")}}]),n}(m.a.PureComponent),V=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){return m.a.createElement("div",P(this.props.theme,"null"),"NULL")}}]),n}(m.a.PureComponent),K=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props;return m.a.createElement("div",P(e.theme,"integer"),m.a.createElement(R,Object.assign({type_name:"int"},e)),this.props.value)}}]),n}(m.a.PureComponent),U=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props;return m.a.createElement("div",P(e.theme,"regexp"),m.a.createElement(R,Object.assign({type_name:"regexp"},e)),this.props.value.toString())}}]),n}(m.a.PureComponent),W=function(e){u(n,e);var t=b(n);function n(e){var r;return i(this,n),(r=t.call(this,e)).toggleCollapsed=function(){r.setState({collapsed:!r.state.collapsed},function(){B.set(r.props.rjvId,r.props.namespace,"collapsed",r.state.collapsed)})},r.state={collapsed:B.get(e.rjvId,e.namespace,"collapsed",!0)},r}return l(n,[{key:"render",value:function(){this.state.collapsed;var e=this.props,t=e.collapseStringsAfterLength,n=e.theme,r=e.value,a={style:{cursor:"default"}};return"integer"===O(t)&&r.length>t&&(a.style.cursor="pointer",this.state.collapsed&&(r=m.a.createElement("span",null,r.substring(0,t),m.a.createElement("span",P(n,"ellipsis")," ...")))),m.a.createElement("div",P(n,"string"),m.a.createElement(R,Object.assign({type_name:"string"},e)),m.a.createElement("span",Object.assign({className:"string-value"},a,{onClick:this.toggleCollapsed}),'"',r,'"'))}}]),n}(m.a.PureComponent),H=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){return m.a.createElement("div",P(this.props.theme,"undefined"),"undefined")}}]),n}(m.a.PureComponent);function $(){return($=Object.assign||function(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,["cacheMeasurements","maxRows","minRows","onChange","onHeightChange"]),d=void 0!==u.value,p=Object(v.useRef)(null),f=function(e,t){var n=Object(v.useRef)();return Object(v.useCallback)(function(r){e.current=r,n.current&&Y(n.current,null),n.current=t,t&&Y(t,r)},[t])}(p,t),b=Object(v.useRef)(0),m=Object(v.useRef)(),h=function(){var e=p.current,t=r&&m.current?m.current:function(e){var t=window.getComputedStyle(e);if(null===t)return null;var n,r=(n=t,ee.reduce(function(e,t){return e[t]=n[t],e},{})),a=r.boxSizing;return""===a?null:(te&&"border-box"===a&&(r.width=parseFloat(r.width)+parseFloat(r.borderRightWidth)+parseFloat(r.borderLeftWidth)+parseFloat(r.paddingRight)+parseFloat(r.paddingLeft)+"px"),{sizingStyle:r,paddingSize:parseFloat(r.paddingBottom)+parseFloat(r.paddingTop),borderSize:parseFloat(r.borderBottomWidth)+parseFloat(r.borderTopWidth)})}(e);if(t){m.current=t;var n=function(e,t,n,r){void 0===n&&(n=1),void 0===r&&(r=1/0),X||((X=document.createElement("textarea")).setAttribute("tab-index","-1"),X.setAttribute("aria-hidden","true"),J(X)),null===X.parentNode&&document.body.appendChild(X);var a=e.paddingSize,o=e.borderSize,i=e.sizingStyle,s=i.boxSizing;Object.keys(i).forEach(function(e){var t=e;X.style[t]=i[t]}),J(X),X.value=t;var l=function(e,t){var n=e.scrollHeight;return"border-box"===t.sizingStyle.boxSizing?n+t.borderSize:n-t.paddingSize}(X,e);X.value="x";var c=X.scrollHeight-a,u=c*n;"border-box"===s&&(u=u+a+o),l=Math.max(u,l);var d=c*r;return"border-box"===s&&(d=d+a+o),[l=Math.min(d,l),c]}(t,e.value||e.placeholder||"x",o,a),i=n[0],s=n[1];b.current!==i&&(b.current=i,e.style.setProperty("height",i+"px","important"),c(i,{rowHeight:s}))}};return Object(v.useLayoutEffect)(h),n=function(e){var t=Object(v.useRef)(e);return G(function(){t.current=e}),t}(h),Object(v.useLayoutEffect)(function(){var e=function(e){n.current(e)};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}},[]),Object(v.createElement)("textarea",$({},u,{onChange:function(e){d||h(),s(e)},ref:f}))});function re(e){e=e.trim();try{if("["===(e=JSON.stringify(JSON.parse(e)))[0])return ae("array",JSON.parse(e));if("{"===e[0])return ae("object",JSON.parse(e));if(e.match(/\-?\d+\.\d+/)&&e.match(/\-?\d+\.\d+/)[0]===e)return ae("float",parseFloat(e));if(e.match(/\-?\d+e-\d+/)&&e.match(/\-?\d+e-\d+/)[0]===e)return ae("float",Number(e));if(e.match(/\-?\d+/)&&e.match(/\-?\d+/)[0]===e)return ae("integer",parseInt(e));if(e.match(/\-?\d+e\+\d+/)&&e.match(/\-?\d+e\+\d+/)[0]===e)return ae("integer",Number(e))}catch(e){}switch(e=e.toLowerCase()){case"undefined":return ae("undefined",void 0);case"nan":return ae("nan",NaN);case"null":return ae("null",null);case"true":return ae("boolean",!0);case"false":return ae("boolean",!1);default:if(e=Date.parse(e))return ae("date",new Date(e))}return ae(!1,null)}function ae(e,t){return{type:e,value:t}}var oe=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props,t=e.style,n=E(e,["style"]);return m.a.createElement("span",n,m.a.createElement("svg",Object.assign({},he(t),{viewBox:"0 0 24 24",fill:"currentColor",preserveAspectRatio:"xMidYMid meet"}),m.a.createElement("path",{d:"M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M7,13H17V11H7"})))}}]),n}(m.a.PureComponent),ie=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props,t=e.style,n=E(e,["style"]);return m.a.createElement("span",n,m.a.createElement("svg",Object.assign({},he(t),{viewBox:"0 0 24 24",fill:"currentColor",preserveAspectRatio:"xMidYMid meet"}),m.a.createElement("path",{d:"M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M13,7H11V11H7V13H11V17H13V13H17V11H13V7Z"})))}}]),n}(m.a.PureComponent),se=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props,t=e.style,n=E(e,["style"]),r=he(t).style;return m.a.createElement("span",n,m.a.createElement("svg",{fill:r.color,width:r.height,height:r.width,style:r,viewBox:"0 0 1792 1792"},m.a.createElement("path",{d:"M1344 800v64q0 14-9 23t-23 9h-832q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h832q14 0 23 9t9 23zm128 448v-832q0-66-47-113t-113-47h-832q-66 0-113 47t-47 113v832q0 66 47 113t113 47h832q66 0 113-47t47-113zm128-832v832q0 119-84.5 203.5t-203.5 84.5h-832q-119 0-203.5-84.5t-84.5-203.5v-832q0-119 84.5-203.5t203.5-84.5h832q119 0 203.5 84.5t84.5 203.5z"})))}}]),n}(m.a.PureComponent),le=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props,t=e.style,n=E(e,["style"]),r=he(t).style;return m.a.createElement("span",n,m.a.createElement("svg",{fill:r.color,width:r.height,height:r.width,style:r,viewBox:"0 0 1792 1792"},m.a.createElement("path",{d:"M1344 800v64q0 14-9 23t-23 9h-352v352q0 14-9 23t-23 9h-64q-14 0-23-9t-9-23v-352h-352q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h352v-352q0-14 9-23t23-9h64q14 0 23 9t9 23v352h352q14 0 23 9t9 23zm128 448v-832q0-66-47-113t-113-47h-832q-66 0-113 47t-47 113v832q0 66 47 113t113 47h832q66 0 113-47t47-113zm128-832v832q0 119-84.5 203.5t-203.5 84.5h-832q-119 0-203.5-84.5t-84.5-203.5v-832q0-119 84.5-203.5t203.5-84.5h832q119 0 203.5 84.5t84.5 203.5z"})))}}]),n}(m.a.PureComponent),ce=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props,t=e.style,n=E(e,["style"]);return m.a.createElement("span",n,m.a.createElement("svg",{style:o(o({},he(t).style),{},{paddingLeft:"2px",verticalAlign:"top"}),viewBox:"0 0 15 15",fill:"currentColor"},m.a.createElement("path",{d:"M0 14l6-6-6-6z"})))}}]),n}(m.a.PureComponent),ue=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props,t=e.style,n=E(e,["style"]);return m.a.createElement("span",n,m.a.createElement("svg",{style:o(o({},he(t).style),{},{paddingLeft:"2px",verticalAlign:"top"}),viewBox:"0 0 15 15",fill:"currentColor"},m.a.createElement("path",{d:"M0 5l6 6 6-6z"})))}}]),n}(m.a.PureComponent),de=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props,t=e.style,n=E(e,["style"]);return m.a.createElement("span",n,m.a.createElement("svg",Object.assign({},he(t),{viewBox:"0 0 40 40",fill:"currentColor",preserveAspectRatio:"xMidYMid meet"}),m.a.createElement("g",null,m.a.createElement("path",{d:"m30 35h-25v-22.5h25v7.5h2.5v-12.5c0-1.4-1.1-2.5-2.5-2.5h-7.5c0-2.8-2.2-5-5-5s-5 2.2-5 5h-7.5c-1.4 0-2.5 1.1-2.5 2.5v27.5c0 1.4 1.1 2.5 2.5 2.5h25c1.4 0 2.5-1.1 2.5-2.5v-5h-2.5v5z m-20-27.5h2.5s2.5-1.1 2.5-2.5 1.1-2.5 2.5-2.5 2.5 1.1 2.5 2.5 1.3 2.5 2.5 2.5h2.5s2.5 1.1 2.5 2.5h-20c0-1.5 1.1-2.5 2.5-2.5z m-2.5 20h5v-2.5h-5v2.5z m17.5-5v-5l-10 7.5 10 7.5v-5h12.5v-5h-12.5z m-17.5 10h7.5v-2.5h-7.5v2.5z m12.5-17.5h-12.5v2.5h12.5v-2.5z m-7.5 5h-5v2.5h5v-2.5z"}))))}}]),n}(m.a.PureComponent),pe=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props,t=e.style,n=E(e,["style"]);return m.a.createElement("span",n,m.a.createElement("svg",Object.assign({},he(t),{viewBox:"0 0 40 40",fill:"currentColor",preserveAspectRatio:"xMidYMid meet"}),m.a.createElement("g",null,m.a.createElement("path",{d:"m28.6 25q0-0.5-0.4-1l-4-4 4-4q0.4-0.5 0.4-1 0-0.6-0.4-1.1l-2-2q-0.4-0.4-1-0.4-0.6 0-1 0.4l-4.1 4.1-4-4.1q-0.4-0.4-1-0.4-0.6 0-1 0.4l-2 2q-0.5 0.5-0.5 1.1 0 0.5 0.5 1l4 4-4 4q-0.5 0.5-0.5 1 0 0.7 0.5 1.1l2 2q0.4 0.4 1 0.4 0.6 0 1-0.4l4-4.1 4.1 4.1q0.4 0.4 1 0.4 0.6 0 1-0.4l2-2q0.4-0.4 0.4-1z m8.7-5q0 4.7-2.3 8.6t-6.3 6.2-8.6 2.3-8.6-2.3-6.2-6.2-2.3-8.6 2.3-8.6 6.2-6.2 8.6-2.3 8.6 2.3 6.3 6.2 2.3 8.6z"}))))}}]),n}(m.a.PureComponent),fe=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props,t=e.style,n=E(e,["style"]);return m.a.createElement("span",n,m.a.createElement("svg",Object.assign({},he(t),{viewBox:"0 0 40 40",fill:"currentColor",preserveAspectRatio:"xMidYMid meet"}),m.a.createElement("g",null,m.a.createElement("path",{d:"m30.1 21.4v-2.8q0-0.6-0.4-1t-1-0.5h-5.7v-5.7q0-0.6-0.4-1t-1-0.4h-2.9q-0.6 0-1 0.4t-0.4 1v5.7h-5.7q-0.6 0-1 0.5t-0.5 1v2.8q0 0.6 0.5 1t1 0.5h5.7v5.7q0 0.5 0.4 1t1 0.4h2.9q0.6 0 1-0.4t0.4-1v-5.7h5.7q0.6 0 1-0.5t0.4-1z m7.2-1.4q0 4.7-2.3 8.6t-6.3 6.2-8.6 2.3-8.6-2.3-6.2-6.2-2.3-8.6 2.3-8.6 6.2-6.2 8.6-2.3 8.6 2.3 6.3 6.2 2.3 8.6z"}))))}}]),n}(m.a.PureComponent),be=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props,t=e.style,n=E(e,["style"]);return m.a.createElement("span",n,m.a.createElement("svg",Object.assign({},he(t),{viewBox:"0 0 40 40",fill:"currentColor",preserveAspectRatio:"xMidYMid meet"}),m.a.createElement("g",null,m.a.createElement("path",{d:"m31.6 21.6h-10v10h-3.2v-10h-10v-3.2h10v-10h3.2v10h10v3.2z"}))))}}]),n}(m.a.PureComponent),ve=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props,t=e.style,n=E(e,["style"]);return m.a.createElement("span",n,m.a.createElement("svg",Object.assign({},he(t),{viewBox:"0 0 40 40",fill:"currentColor",preserveAspectRatio:"xMidYMid meet"}),m.a.createElement("g",null,m.a.createElement("path",{d:"m19.8 26.4l2.6-2.6-3.4-3.4-2.6 2.6v1.3h2.2v2.1h1.2z m9.8-16q-0.3-0.4-0.7 0l-7.8 7.8q-0.4 0.4 0 0.7t0.7 0l7.8-7.8q0.4-0.4 0-0.7z m1.8 13.2v4.3q0 2.6-1.9 4.5t-4.5 1.9h-18.6q-2.6 0-4.5-1.9t-1.9-4.5v-18.6q0-2.7 1.9-4.6t4.5-1.8h18.6q1.4 0 2.6 0.5 0.3 0.2 0.4 0.5 0.1 0.4-0.2 0.7l-1.1 1.1q-0.3 0.3-0.7 0.1-0.5-0.1-1-0.1h-18.6q-1.4 0-2.5 1.1t-1 2.5v18.6q0 1.4 1 2.5t2.5 1h18.6q1.5 0 2.5-1t1.1-2.5v-2.9q0-0.2 0.2-0.4l1.4-1.5q0.3-0.3 0.8-0.1t0.4 0.6z m-2.1-16.5l6.4 6.5-15 15h-6.4v-6.5z m9.9 3l-2.1 2-6.4-6.4 2.1-2q0.6-0.7 1.5-0.7t1.5 0.7l3.4 3.4q0.6 0.6 0.6 1.5t-0.6 1.5z"}))))}}]),n}(m.a.PureComponent),me=function(e){u(n,e);var t=b(n);function n(){return i(this,n),t.apply(this,arguments)}return l(n,[{key:"render",value:function(){var e=this.props,t=e.style,n=E(e,["style"]);return m.a.createElement("span",n,m.a.createElement("svg",Object.assign({},he(t),{viewBox:"0 0 40 40",fill:"currentColor",preserveAspectRatio:"xMidYMid meet"}),m.a.createElement("g",null,m.a.createElement("path",{d:"m31.7 16.4q0-0.6-0.4-1l-2.1-2.1q-0.4-0.4-1-0.4t-1 0.4l-9.1 9.1-5-5q-0.5-0.4-1-0.4t-1 0.4l-2.1 2q-0.4 0.4-0.4 1 0 0.6 0.4 1l8.1 8.1q0.4 0.4 1 0.4 0.6 0 1-0.4l12.2-12.1q0.4-0.4 0.4-1z m5.6 3.6q0 4.7-2.3 8.6t-6.3 6.2-8.6 2.3-8.6-2.3-6.2-6.2-2.3-8.6 2.3-8.6 6.2-6.2 8.6-2.3 8.6 2.3 6.3 6.2 2.3 8.6z"}))))}}]),n}(m.a.PureComponent);function he(e){return e||(e={}),{style:o(o({verticalAlign:"middle"},e),{},{color:e.color?e.color:"#000000",height:"1em",width:"1em"})}}var ye=function(e){u(n,e);var t=b(n);function n(e){var r;return i(this,n),(r=t.call(this,e)).copiedTimer=null,r.handleCopy=function(){var e=document.createElement("textarea"),t=r.props,n=t.clickCallback,a=t.src,o=t.namespace;e.innerHTML=JSON.stringify(r.clipboardValue(a),null," "),document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),r.copiedTimer=setTimeout(function(){r.setState({copied:!1})},5500),r.setState({copied:!0},function(){"function"==typeof n&&n({src:a,namespace:o,name:o[o.length-1]})})},r.getClippyIcon=function(){var e=r.props.theme;return r.state.copied?m.a.createElement("span",null,m.a.createElement(de,Object.assign({className:"copy-icon"},P(e,"copy-icon"))),m.a.createElement("span",P(e,"copy-icon-copied"),"âś”")):m.a.createElement(de,Object.assign({className:"copy-icon"},P(e,"copy-icon")))},r.clipboardValue=function(e){switch(O(e)){case"function":case"regexp":return e.toString();default:return e}},r.state={copied:!1},r}return l(n,[{key:"componentWillUnmount",value:function(){this.copiedTimer&&(clearTimeout(this.copiedTimer),this.copiedTimer=null)}},{key:"render",value:function(){var e=this.props,t=(e.src,e.theme),n=e.hidden,r=e.rowHovered,a=P(t,"copy-to-clipboard").style,i="inline";return n&&(i="none"),m.a.createElement("span",{className:"copy-to-clipboard-container",title:"Copy to clipboard",style:{verticalAlign:"top",display:r?"inline-block":"none"}},m.a.createElement("span",{style:o(o({},a),{},{display:i}),onClick:this.handleCopy},this.getClippyIcon()))}}]),n}(m.a.PureComponent),ge=function(e){u(n,e);var t=b(n);function n(e){var r;return i(this,n),(r=t.call(this,e)).getEditIcon=function(){var e=r.props,t=e.variable,n=e.theme;return m.a.createElement("div",{className:"click-to-edit",style:{verticalAlign:"top",display:r.state.hovered?"inline-block":"none"}},m.a.createElement(ve,Object.assign({className:"click-to-edit-icon"},P(n,"editVarIcon"),{onClick:function(){r.prepopInput(t)}})))},r.prepopInput=function(e){if(!1!==r.props.onEdit){var t=function(e){var t;switch(O(e)){case"undefined":t="undefined";break;case"nan":t="NaN";break;case"string":t=e;break;case"date":case"function":case"regexp":t=e.toString();break;default:try{t=JSON.stringify(e,null," ")}catch(e){t=""}}return t}(e.value),n=re(t);r.setState({editMode:!0,editValue:t,parsedInput:{type:n.type,value:n.value}})}},r.getRemoveIcon=function(){var e=r.props,t=e.variable,n=e.namespace,a=e.theme,o=e.rjvId;return m.a.createElement("div",{className:"click-to-remove",style:{verticalAlign:"top",display:r.state.hovered?"inline-block":"none"}},m.a.createElement(pe,Object.assign({className:"click-to-remove-icon"},P(a,"removeVarIcon"),{onClick:function(){L.dispatch({name:"VARIABLE_REMOVED",rjvId:o,data:{name:t.name,namespace:n,existing_value:t.value,variable_removed:!0}})}})))},r.getValue=function(e,t){var n=!t&&e.type,a=f(r).props;switch(n){case!1:return r.getEditInput();case"string":return m.a.createElement(W,Object.assign({value:e.value},a));case"integer":return m.a.createElement(K,Object.assign({value:e.value},a));case"float":return m.a.createElement(A,Object.assign({value:e.value},a));case"boolean":return m.a.createElement(I,Object.assign({value:e.value},a));case"function":return m.a.createElement(z,Object.assign({value:e.value},a));case"null":return m.a.createElement(V,a);case"nan":return m.a.createElement(q,a);case"undefined":return m.a.createElement(H,a);case"date":return m.a.createElement(_,Object.assign({value:e.value},a));case"regexp":return m.a.createElement(U,Object.assign({value:e.value},a));default:return m.a.createElement("div",{className:"object-value"},JSON.stringify(e.value))}},r.getEditInput=function(){var e=r.props.theme,t=r.state.editValue;return m.a.createElement("div",null,m.a.createElement(ne,Object.assign({type:"text",inputRef:function(e){return e&&e.focus()},value:t,className:"variable-editor",onChange:function(e){var t=e.target.value,n=re(t);r.setState({editValue:t,parsedInput:{type:n.type,value:n.value}})},onKeyDown:function(e){switch(e.key){case"Escape":r.setState({editMode:!1,editValue:""});break;case"Enter":(e.ctrlKey||e.metaKey)&&r.submitEdit(!0)}e.stopPropagation()},placeholder:"update this value",minRows:2},P(e,"edit-input"))),m.a.createElement("div",P(e,"edit-icon-container"),m.a.createElement(pe,Object.assign({className:"edit-cancel"},P(e,"cancel-icon"),{onClick:function(){r.setState({editMode:!1,editValue:""})}})),m.a.createElement(me,Object.assign({className:"edit-check string-value"},P(e,"check-icon"),{onClick:function(){r.submitEdit()}})),m.a.createElement("div",null,r.showDetected())))},r.submitEdit=function(e){var t=r.props,n=t.variable,a=t.namespace,o=t.rjvId,i=r.state,s=i.editValue,l=i.parsedInput,c=s;e&&l.type&&(c=l.value),r.setState({editMode:!1}),L.dispatch({name:"VARIABLE_UPDATED",rjvId:o,data:{name:n.name,namespace:a,existing_value:n.value,new_value:c,variable_removed:!1}})},r.showDetected=function(){var e=r.props,t=e.theme,n=(e.variable,e.namespace,e.rjvId,r.state.parsedInput),a=(n.type,n.value,r.getDetectedInput());if(a)return m.a.createElement("div",null,m.a.createElement("div",P(t,"detected-row"),a,m.a.createElement(me,{className:"edit-check detected",style:o({verticalAlign:"top",paddingLeft:"3px"},P(t,"check-icon").style),onClick:function(){r.submitEdit(!0)}})))},r.getDetectedInput=function(){var e=r.state.parsedInput,t=e.type,n=e.value,a=f(r).props,i=a.theme;if(!1!==t)switch(t.toLowerCase()){case"object":return m.a.createElement("span",null,m.a.createElement("span",{style:o(o({},P(i,"brace").style),{},{cursor:"default"})},"{"),m.a.createElement("span",{style:o(o({},P(i,"ellipsis").style),{},{cursor:"default"})},"..."),m.a.createElement("span",{style:o(o({},P(i,"brace").style),{},{cursor:"default"})},"}"));case"array":return m.a.createElement("span",null,m.a.createElement("span",{style:o(o({},P(i,"brace").style),{},{cursor:"default"})},"["),m.a.createElement("span",{style:o(o({},P(i,"ellipsis").style),{},{cursor:"default"})},"..."),m.a.createElement("span",{style:o(o({},P(i,"brace").style),{},{cursor:"default"})},"]"));case"string":return m.a.createElement(W,Object.assign({value:n},a));case"integer":return m.a.createElement(K,Object.assign({value:n},a));case"float":return m.a.createElement(A,Object.assign({value:n},a));case"boolean":return m.a.createElement(I,Object.assign({value:n},a));case"function":return m.a.createElement(z,Object.assign({value:n},a));case"null":return m.a.createElement(V,a);case"nan":return m.a.createElement(q,a);case"undefined":return m.a.createElement(H,a);case"date":return m.a.createElement(_,Object.assign({value:new Date(n)},a))}},r.state={editMode:!1,editValue:"",hovered:!1,renameKey:!1,parsedInput:{type:!1,value:null}},r}return l(n,[{key:"render",value:function(){var e=this,t=this.props,n=t.variable,r=t.singleIndent,a=t.type,i=t.theme,s=t.namespace,l=t.indentWidth,c=t.enableClipboard,u=t.onEdit,d=t.onDelete,p=t.onSelect,f=t.displayArrayKey,b=t.quotesOnKeys,v=this.state.editMode;return m.a.createElement("div",Object.assign({},P(i,"objectKeyVal",{paddingLeft:l*r}),{onMouseEnter:function(){return e.setState(o(o({},e.state),{},{hovered:!0}))},onMouseLeave:function(){return e.setState(o(o({},e.state),{},{hovered:!1}))},className:"variable-row",key:n.name}),"array"==a?f?m.a.createElement("span",Object.assign({},P(i,"array-key"),{key:n.name+"_"+s}),n.name,m.a.createElement("div",P(i,"colon"),":")):null:m.a.createElement("span",null,m.a.createElement("span",Object.assign({},P(i,"object-name"),{className:"object-key",key:n.name+"_"+s}),!!b&&m.a.createElement("span",{style:{verticalAlign:"top"}},'"'),m.a.createElement("span",{style:{display:"inline-block"}},n.name),!!b&&m.a.createElement("span",{style:{verticalAlign:"top"}},'"')),m.a.createElement("span",P(i,"colon"),":")),m.a.createElement("div",Object.assign({className:"variable-value",onClick:!1===p&&!1===u?null:function(t){var r=D(s);(t.ctrlKey||t.metaKey)&&!1!==u?e.prepopInput(n):!1!==p&&(r.shift(),p(o(o({},n),{},{namespace:r})))}},P(i,"variableValue",{cursor:!1===p?"default":"pointer"})),this.getValue(n,v)),c?m.a.createElement(ye,{rowHovered:this.state.hovered,hidden:v,src:n.value,clickCallback:c,theme:i,namespace:[].concat(D(s),[n.name])}):null,!1!==u&&0==v?this.getEditIcon():null,!1!==d&&0==v?this.getRemoveIcon():null)}}]),n}(m.a.PureComponent),xe=function(e){u(n,e);var t=b(n);function n(){var e;i(this,n);for(var r=arguments.length,a=new Array(r),s=0;s0?i:null,namespace:a.splice(0,a.length-1),existing_value:s,variable_removed:!1,key_name:null};"object"===O(s)?L.dispatch({name:"ADD_VARIABLE_KEY_REQUEST",rjvId:l,data:e}):L.dispatch({name:"VARIABLE_ADDED",rjvId:l,data:o(o({},e),{},{new_value:[].concat(D(s),[null])})})}})))},e.getRemoveObject=function(t){var n=e.props,r=n.theme,a=(n.hover,n.namespace),o=n.name,i=n.src,s=n.rjvId;if(1!==a.length)return m.a.createElement("span",{className:"click-to-remove",style:{display:t?"inline-block":"none"}},m.a.createElement(pe,Object.assign({className:"click-to-remove-icon"},P(r,"removeVarIcon"),{onClick:function(){L.dispatch({name:"VARIABLE_REMOVED",rjvId:s,data:{name:o,namespace:a.splice(0,a.length-1),existing_value:i,variable_removed:!0}})}})))},e.render=function(){var t=e.props,n=t.theme,r=t.onDelete,a=t.onAdd,o=t.enableClipboard,i=t.src,s=t.namespace,l=t.rowHovered;return m.a.createElement("div",Object.assign({},P(n,"object-meta-data"),{className:"object-meta-data",onClick:function(e){e.stopPropagation()}}),e.getObjectSize(),o?m.a.createElement(ye,{rowHovered:l,clickCallback:o,src:i,theme:n,namespace:s}):null,!1!==a?e.getAddAttribute(l):null,!1!==r?e.getRemoveObject(l):null)},e}return n}(m.a.PureComponent);function Ee(e){var t=e.parent_type,n=e.namespace,r=e.quotesOnKeys,a=e.theme,o=e.jsvRoot,i=e.name,s=e.displayArrayKey,l=e.name?e.name:"";return!o||!1!==i&&null!==i?"array"==t?s?m.a.createElement("span",Object.assign({},P(a,"array-key"),{key:n}),m.a.createElement("span",{className:"array-key"},l),m.a.createElement("span",P(a,"colon"),":")):m.a.createElement("span",null):m.a.createElement("span",Object.assign({},P(a,"object-name"),{key:n}),m.a.createElement("span",{className:"object-key"},r&&m.a.createElement("span",{style:{verticalAlign:"top"}},'"'),m.a.createElement("span",null,l),r&&m.a.createElement("span",{style:{verticalAlign:"top"}},'"')),m.a.createElement("span",P(a,"colon"),":")):m.a.createElement("span",null)}function Oe(e){var t=e.theme;switch(e.iconStyle){case"triangle":return m.a.createElement(ue,Object.assign({},P(t,"expanded-icon"),{className:"expanded-icon"}));case"square":return m.a.createElement(se,Object.assign({},P(t,"expanded-icon"),{className:"expanded-icon"}));default:return m.a.createElement(oe,Object.assign({},P(t,"expanded-icon"),{className:"expanded-icon"}))}}function we(e){var t=e.theme;switch(e.iconStyle){case"triangle":return m.a.createElement(ce,Object.assign({},P(t,"collapsed-icon"),{className:"collapsed-icon"}));case"square":return m.a.createElement(le,Object.assign({},P(t,"collapsed-icon"),{className:"collapsed-icon"}));default:return m.a.createElement(ie,Object.assign({},P(t,"collapsed-icon"),{className:"collapsed-icon"}))}}var je=function(e){u(n,e);var t=b(n);function n(e){var r;return i(this,n),(r=t.call(this,e)).toggleCollapsed=function(e){var t=[];for(var n in r.state.expanded)t.push(r.state.expanded[n]);t[e]=!t[e],r.setState({expanded:t})},r.state={expanded:[]},r}return l(n,[{key:"getExpandedIcon",value:function(e){var t=this.props,n=t.theme,r=t.iconStyle;return this.state.expanded[e]?m.a.createElement(Oe,{theme:n,iconStyle:r}):m.a.createElement(we,{theme:n,iconStyle:r})}},{key:"render",value:function(){var e=this,t=this.props,n=t.src,r=t.groupArraysAfterLength,a=(t.depth,t.name),o=t.theme,i=t.jsvRoot,s=t.namespace,l=(t.parent_type,E(t,["src","groupArraysAfterLength","depth","name","theme","jsvRoot","namespace","parent_type"])),c=0,u=5*this.props.indentWidth;i||(c=5*this.props.indentWidth);var d=r,p=Math.ceil(n.length/d);return m.a.createElement("div",Object.assign({className:"object-key-val"},P(o,i?"jsv-root":"objectKeyVal",{paddingLeft:c})),m.a.createElement(Ee,this.props),m.a.createElement("span",null,m.a.createElement(xe,Object.assign({size:n.length},this.props))),D(Array(p)).map(function(t,r){return m.a.createElement("div",Object.assign({key:r,className:"object-key-val array-group"},P(o,"objectKeyVal",{marginLeft:6,paddingLeft:u})),m.a.createElement("span",P(o,"brace-row"),m.a.createElement("div",Object.assign({className:"icon-container"},P(o,"icon-container"),{onClick:function(t){e.toggleCollapsed(r)}}),e.getExpandedIcon(r)),e.state.expanded[r]?m.a.createElement(Ce,Object.assign({key:a+r,depth:0,name:!1,collapsed:!1,groupArraysAfterLength:d,index_offset:r*d,src:n.slice(r*d,r*d+d),namespace:s,type:"array",parent_type:"array_group",theme:o},l)):m.a.createElement("span",Object.assign({},P(o,"brace"),{onClick:function(t){e.toggleCollapsed(r)},className:"array-group-brace"}),"[",m.a.createElement("div",Object.assign({},P(o,"array-group-meta-data"),{className:"array-group-meta-data"}),m.a.createElement("span",Object.assign({className:"object-size"},P(o,"object-size")),r*d," - ",r*d+d>n.length?n.length:r*d+d)),"]")))}))}}]),n}(m.a.PureComponent),Se=function(e){u(n,e);var t=b(n);function n(e){var r;i(this,n),(r=t.call(this,e)).toggleCollapsed=function(){r.setState({expanded:!r.state.expanded},function(){B.set(r.props.rjvId,r.props.namespace,"expanded",r.state.expanded)})},r.getObjectContent=function(e,t,n){return m.a.createElement("div",{className:"pushed-content object-container"},m.a.createElement("div",Object.assign({className:"object-content"},P(r.props.theme,"pushed-content")),r.renderObjectContents(t,n)))},r.getEllipsis=function(){return 0===r.state.size?null:m.a.createElement("div",Object.assign({},P(r.props.theme,"ellipsis"),{className:"node-ellipsis",onClick:r.toggleCollapsed}),"...")},r.getObjectMetaData=function(e){var t=r.props,n=(t.rjvId,t.theme,r.state),a=n.size,o=n.hovered;return m.a.createElement(xe,Object.assign({rowHovered:o,size:a},r.props))},r.renderObjectContents=function(e,t){var n,a=r.props,o=a.depth,i=a.parent_type,s=a.index_offset,l=a.groupArraysAfterLength,c=a.namespace,u=r.state.object_type,d=[],p=Object.keys(e||{});return r.props.sortKeys&&"array"!==u&&(p=p.sort()),p.forEach(function(a){if(n=new ke(a,e[a]),"array_group"===i&&s&&(n.name=parseInt(n.name)+s),e.hasOwnProperty(a))if("object"===n.type)d.push(m.a.createElement(Ce,Object.assign({key:n.name,depth:o+1,name:n.name,src:n.value,namespace:c.concat(n.name),parent_type:u},t)));else if("array"===n.type){var p=Ce;l&&n.value.length>l&&(p=je),d.push(m.a.createElement(p,Object.assign({key:n.name,depth:o+1,name:n.name,src:n.value,namespace:c.concat(n.name),type:"array",parent_type:u},t)))}else d.push(m.a.createElement(ge,Object.assign({key:n.name+"_"+c,variable:n,singleIndent:5,namespace:c,type:r.props.type},t)))}),d};var a=n.getState(e);return r.state=o(o({},a),{},{prevProps:{}}),r}return l(n,[{key:"getBraceStart",value:function(e,t){var n=this,r=this.props,a=r.src,o=r.theme,i=r.iconStyle;if("array_group"===r.parent_type)return m.a.createElement("span",null,m.a.createElement("span",P(o,"brace"),"array"===e?"[":"{"),t?this.getObjectMetaData(a):null);var s=t?Oe:we;return m.a.createElement("span",null,m.a.createElement("span",Object.assign({onClick:function(e){n.toggleCollapsed()}},P(o,"brace-row")),m.a.createElement("div",Object.assign({className:"icon-container"},P(o,"icon-container")),m.a.createElement(s,{theme:o,iconStyle:i})),m.a.createElement(Ee,this.props),m.a.createElement("span",P(o,"brace"),"array"===e?"[":"{")),t?this.getObjectMetaData(a):null)}},{key:"render",value:function(){var e=this,t=this.props,n=t.depth,r=t.src,a=(t.namespace,t.name,t.type,t.parent_type),i=t.theme,s=t.jsvRoot,l=t.iconStyle,c=E(t,["depth","src","namespace","name","type","parent_type","theme","jsvRoot","iconStyle"]),u=this.state,d=u.object_type,p=u.expanded,f={};return s||"array_group"===a?"array_group"===a&&(f.borderLeft=0,f.display="inline"):f.paddingLeft=5*this.props.indentWidth,m.a.createElement("div",Object.assign({className:"object-key-val",onMouseEnter:function(){return e.setState(o(o({},e.state),{},{hovered:!0}))},onMouseLeave:function(){return e.setState(o(o({},e.state),{},{hovered:!1}))}},P(i,s?"jsv-root":"objectKeyVal",f)),this.getBraceStart(d,p),p?this.getObjectContent(n,r,o({theme:i,iconStyle:l},c)):this.getEllipsis(),m.a.createElement("span",{className:"brace-row"},m.a.createElement("span",{style:o(o({},P(i,"brace").style),{},{paddingLeft:p?"3px":"0px"})},"array"===d?"]":"}"),p?null:this.getObjectMetaData(r)))}}],[{key:"getDerivedStateFromProps",value:function(e,t){var r=t.prevProps;return e.src!==r.src||e.collapsed!==r.collapsed||e.name!==r.name||e.namespace!==r.namespace||e.rjvId!==r.rjvId?o(o({},n.getState(e)),{},{prevProps:e}):null}}]),n}(m.a.PureComponent);Se.getState=function(e){var t=Object.keys(e.src).length,n=(!1===e.collapsed||!0!==e.collapsed&&e.collapsed>e.depth)&&(!e.shouldCollapse||!1===e.shouldCollapse({name:e.name,src:e.src,type:O(e.src),namespace:e.namespace}))&&0!==t;return{expanded:B.get(e.rjvId,e.namespace,"expanded",n),object_type:"array"===e.type?"array":"object",parent_type:"array"===e.type?"array":"object",size:t,hovered:!1}};var ke=function e(t,n){i(this,e),this.name=t,this.value=n,this.type=O(n)};x(Se);var Ce=Se,Pe=function(e){u(n,e);var t=b(n);function n(){var e;i(this,n);for(var r=arguments.length,a=new Array(r),o=0;ot.groupArraysAfterLength&&(r=je),m.a.createElement("div",{className:"pretty-json-container object-container"},m.a.createElement("div",{className:"object-content"},m.a.createElement(r,Object.assign({namespace:n,depth:0,jsvRoot:!0},t))))},e}return n}(m.a.PureComponent),Re=function(e){u(n,e);var t=b(n);function n(e){var r;return i(this,n),(r=t.call(this,e)).closeModal=function(){L.dispatch({rjvId:r.props.rjvId,name:"RESET"})},r.submit=function(){r.props.submit(r.state.input)},r.state={input:e.input?e.input:""},r}return l(n,[{key:"render",value:function(){var e=this,t=this.props,n=t.theme,r=t.rjvId,a=t.isValid,o=this.state.input,i=a(o);return m.a.createElement("div",Object.assign({className:"key-modal-request"},P(n,"key-modal-request"),{onClick:this.closeModal}),m.a.createElement("div",Object.assign({},P(n,"key-modal"),{onClick:function(e){e.stopPropagation()}}),m.a.createElement("div",P(n,"key-modal-label"),"Key Name:"),m.a.createElement("div",{style:{position:"relative"}},m.a.createElement("input",Object.assign({},P(n,"key-modal-input"),{className:"key-modal-input",ref:function(e){return e&&e.focus()},spellCheck:!1,value:o,placeholder:"...",onChange:function(t){e.setState({input:t.target.value})},onKeyPress:function(t){i&&"Enter"===t.key?e.submit():"Escape"===t.key&&e.closeModal()}})),i?m.a.createElement(me,Object.assign({},P(n,"key-modal-submit"),{className:"key-modal-submit",onClick:function(t){return e.submit()}})):null),m.a.createElement("span",P(n,"key-modal-cancel"),m.a.createElement(be,Object.assign({},P(n,"key-modal-cancel-icon"),{className:"key-modal-cancel",onClick:function(){L.dispatch({rjvId:r,name:"RESET"})}})))))}}]),n}(m.a.PureComponent),Ie=function(e){u(n,e);var t=b(n);function n(){var e;i(this,n);for(var r=arguments.length,a=new Array(r),s=0;s0&&void 0!==arguments[0]?arguments[0]:function(){var e=document.getElementById("wp-admin-bar-edit"),t=e&&e.firstChild.href&&e.firstChild.text?{href:e.firstChild.href,text:e.firstChild.text}:null,n=Array.from(document.querySelectorAll(".yoast-schema-graph")).map(function(e){return JSON.parse(e.text)});return{isIndexable:(0,r.get)(window,"wpseoScriptData.frontendInspector.isIndexable",!0),contentAnalysisActive:(0,r.get)(window,"wpseoScriptData.frontendInspector.contentAnalysisActive",!1),keywordAnalysisActive:(0,r.get)(window,"wpseoScriptData.frontendInspector.keywordAnalysisActive",!1),focusKeyphrase:(0,r.get)(window,"wpseoScriptData.frontendInspector.indexable.primary_focus_keyword",""),seoScore:(0,r.get)(window,"wpseoScriptData.frontendInspector.indexable.primary_focus_keyword_score",null),readabilityScore:(0,r.get)(window,"wpseoScriptData.frontendInspector.indexable.readability_score",null)||0,metaTags:a(),schema:n,editButton:t}}();arguments[1];return e}},199:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.getData=function(e){return e}},2:function(e,t){e.exports=window.wp.i18n},200:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.default='\n#wpseo-frontend-inspector {\n\t--yoast-color-default: #404040;\n\t--yoast-color-default-darker: #303030;\n\t--yoast-color-primary: #a4286a;\n\t--yoast-color-secondary: #f7f7f7;\n\t--yoast-color-white: #fff;\n\t--yoast-color-green: #6EA029;\n\t--yoast-color-primary-darker: #7b1e50;\n\t--yoast-color-primary-lighter: #F5D6E6;\n\t--yoast-color-secondary-darker: #d9d9d9;\n\t--yoast-color-button-upsell: #FEC228;\n\t--yoast-color-button-upsell-hover: #F2AE01;\n\t--yoast-color-dark: #303030;\n\t--yoast-color-sale: #fec228;\n\t--yoast-color-sale-darker: #feb601;\n\t--yoast-color-border: rgba(0, 0, 0, 0.2);\n\t--yoast-color-label: #303030;\n\t--yoast-color-label-help: #707070;\n\t--yoast-color-active: #6EA029;\n\t--yoast-color-inactive: #DC3232;\n\t--yoast-color-inactive-text: #707070;\n\t--yoast-color-inactive-grey: #9E9E9E;\n\t--yoast-color-inactive-grey-light: #f1f1f1;\n\t--yoast-color-active-light: #B6CF94;\n\t--yoast-transition-default: all 150ms ease-out;\n\t--yoast-color-link: #006dac;\n\t--yoast-color-border--default: rgba(0, 0, 0, 0.2);\n\t--yoast-color-focus: 0 0 0 2px #007fff, 0 0 0 5px #bfdfff;\n\n\tbackground: #ffffff;\n\tz-index: 99998;\n\tfont-size: 14px;\n\tfont-weight: normal;\n\tfont-family: Inter var,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";\n\tcolor: #4b5563;\n\tbox-shadow: rgb(255, 255, 255) 0 0 0 0, rgba(0, 0, 0, 0.05) 0 0 0 1px, rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px;\n\tline-height: 1.5;\n\tletter-spacing: 0;\n}\n\n#wpseo-frontend-inspector section {\n\tpadding: 16px 24px;\n\tborder-bottom: 1px solid #e5e7eb;\n\tbox-sizing: border-box;\n\tword-break: break-word;\n}\n\n#wpseo-frontend-inspector h2 {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tmargin: 8px 0;\n\tfont-size: 16px;\n\tfont-weight: 500;\n\tcolor: var(--yoast-color-primary);\n}\n#wpseo-frontend-inspector h2 > svg {\n\twidth: 18px;\n\theight: 18px;\n\tfill: var(--yoast-color-primary);\n}\n\n#wpseo-frontend-inspector h3 {\n\tfont-size: 14px;\n\tfont-weight: 500;\n\tcolor: #111827;\n\tmargin: 8px 0 4px 0;\n}\n\n#wpseo-frontend-inspector strong {\n\tfont-weight: 500;\n\tcolor: #374151;\n}\n\n#wpseo-frontend-inspector button.close {\n\twidth: 44px;\n\theight: 44px;\n\tbackground: transparent;\n\tborder: 0;\n\tpadding: 0;\n\tmargin-right: -16px;\n\tcursor: pointer;\n}\n\n#wpseo-frontend-inspector .checks:not(:first-child) {\n\tmargin-top: 16px;\n}\n#wpseo-frontend-inspector .checks > div {\n\tline-height: 2;\n}\n#wpseo-frontend-inspector .checks svg {\n\tmargin-right: 4px;\n\twidth: 16px;\n\theight: 16px;\n\tvertical-align: middle;\n\tdisplay: inline;\n}\n\n#wpseo-frontend-inspector .yoast-edit-button:not(:first-child) {\n\tmargin-top: 16px;\n}\n#wpseo-frontend-inspector .yoast-edit-button svg {\n\tmargin-inline-end: 4px;\n\twidth: 16px;\n\theight: 16px;\n\t-webkit-flex: none;\n\t-ms-flex: none;\n\tflex: none;\n}\n\n#wpseo-frontend-inspector ul {\n\tpadding: 0;\n\tmargin: 0;\n\tlist-style: none;\n}\n#wpseo-frontend-inspector li {\n\tpadding: 8px 0;\n\tmargin: 0;\n}\n\n#wpseo-frontend-inspector .yoast-slide-over {\n\t--yst-admin-bar-margin: 32px;\n\t--yst-translate-x: 0;\n\t--yst-translate-y: 0;\n\t--yst-rotate: 0;\n\t--yst-skew-x: 0;\n\t--yst-skew-y: 0;\n\t--yst-scale-x: 1;\n\t--yst-scale-y: 1;\n\n\tposition: relative;\n\tz-index: 10;\n}\n#wpseo-frontend-inspector .yoast-slide-over .yoast-slide-over__container {\n\tmargin-top: var(--yst-admin-bar-margin);\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow-y: scroll;\n\theight: 100%;\n\t--yst-bg-opacity: 1;\n\tbackground-color: rgb(255 255 255 / var(--yst-bg-opacity));\n\tbox-shadow: 0 0 #0000,0 0 #0000,0 20px 25px -5px rgb(0 0 0 / 0.1),0 8px 10px -6px rgb(0 0 0 / 0.1);\n}\n#wpseo-frontend-inspector .yoast-slide-over__header {\n\tposition: sticky;\n\ttop: 0;\n\tleft: 0;\n\tpadding: 16px 24px;\n\tz-index: 99998;\n\tbackground: #f3f4f6;\n\tdisplay: flex;\n justify-content: space-between;\n}\n#wpseo-frontend-inspector .yoast-slide-over .yoast-slide-over__content {\n\tmargin-bottom: var(--yst-admin-bar-margin);\n\tposition: relative;\n\tflex: 1 1 0%;\n}\n@media (max-width: 782px) {\n\t#wpseo-frontend-inspector .yoast-slide-over {\n\t\t--yst-admin-bar-margin: 46px;\n\t}\n}\n#wpseo-frontend-inspector .fixed {\n\tposition: fixed;\n}\n#wpseo-frontend-inspector .absolute {\n\tposition: absolute;\n}\n#wpseo-frontend-inspector .inset-0 {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n}\n#wpseo-frontend-inspector .overflow-hidden {\n\toverflow: hidden;\n}\n#wpseo-frontend-inspector .pointer-events-none {\n\tpointer-events: none;\n}\n#wpseo-frontend-inspector .inset-y-0 {\n\ttop: 0;\n\tbottom: 0;\n}\n#wpseo-frontend-inspector .end-0 {\n\tright: 0;\n}\n#wpseo-frontend-inspector.rtl .end-0 {\n\tright: auto;\n\tleft: 0;\n}\n#wpseo-frontend-inspector .flex {\n\tdisplay: flex;\n}\n#wpseo-frontend-inspector .max-w-full {\n\tmax-width: 100%;\n}\n#wpseo-frontend-inspector .pend-10 {\n\tpadding-left: 40px;\n}\n#wpseo-frontend-inspector.rtl .pend-10 {\n\tpadding-left: 0;\n\tpadding-right: 40px;\n}\n#wpseo-frontend-inspector .transform {\n\ttransform: translate(var(--yst-translate-x),var(--yst-translate-y)) rotate(var(--yst-rotate)) skewX(var(--yst-skew-x)) skewY(var(--yst-skew-y)) scaleX(var(--yst-scale-x)) scaleY(var(--yst-scale-y));\n}\n#wpseo-frontend-inspector .transition {\n\ttransition-property: color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;\n\ttransition-property: color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;\n\ttransition-property: color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;\n\ttransition-timing-function: cubic-bezier(0.4,0,0.2,1);\n\ttransition-duration: 150ms;\n}\n#wpseo-frontend-inspector .ease-in-out {\n\ttransition-timing-function: cubic-bezier(0.4,0,0.2,1);\n}\n#wpseo-frontend-inspector .duration-500 {\n\ttransition-duration: .5s;\n}\n@media (min-width: 640px) {\n\t#wpseo-frontend-inspector .sm:duration-700 {\n\t\ttransition-duration: .7s;\n\t}\n}\n#wpseo-frontend-inspector .translate-x-full {\n\t--yst-translate-x: 100%;\n\ttransform: translate(var(--yst-translate-x),var(--yst-translate-y)) rotate(var(--yst-rotate)) skewX(var(--yst-skew-x)) skewY(var(--yst-skew-y)) scaleX(var(--yst-scale-x)) scaleY(var(--yst-scale-y));\n}\n#wpseo-frontend-inspector.rtl .translate-x-full {\n\t--yst-translate-x: -100%;\n}\n#wpseo-frontend-inspector .translate-x-0 {\n\t--yst-translate-x: 0px;\n\ttransform: translate(var(--yst-translate-x),var(--yst-translate-y)) rotate(var(--yst-rotate)) skewX(var(--yst-skew-x)) skewY(var(--yst-skew-y)) scaleX(var(--yst-scale-x)) scaleY(var(--yst-scale-y));\n}\n#wpseo-frontend-inspector .pointer-events-auto {\n\tpointer-events: auto;\n}\n#wpseo-frontend-inspector .w-screen {\n\twidth: 100vw;\n}\n#wpseo-frontend-inspector .max-w-md {\n\tmax-width: 448px;\n}\n\n#wpseo-frontend-inspector .variable-row .copy-to-clipboard-container {\n\tposition: absolute;\n}\n#wpseo-frontend-inspector .react-json-view {\n\tdirection: ltr;\n}\n'},23:function(e,t){e.exports=window.yoast.styleGuide},3:function(e,t){e.exports=window.wp.element},338:function(e,t,n){"use strict";n.r(t);var r=n(0),a=n.n(r);let o="undefined"!=typeof window?r.useLayoutEffect:r.useEffect;function i(e){let t=Object(r.useRef)(e);return o(()=>{t.current=e},[e]),t}function s(e,t){let[n,a]=Object(r.useState)(e),s=i(e);return o(()=>a(s.current),[s,a,...t]),n}function l(){let e=[],t=[],n={enqueue(e){t.push(e)},addEventListener:(e,t,r,a)=>(e.addEventListener(t,r,a),n.add(()=>e.removeEventListener(t,r,a))),requestAnimationFrame(...e){let t=requestAnimationFrame(...e);return n.add(()=>cancelAnimationFrame(t))},nextFrame:(...e)=>n.requestAnimationFrame(()=>n.requestAnimationFrame(...e)),setTimeout(...e){let t=setTimeout(...e);return n.add(()=>clearTimeout(t))},add:t=>(e.push(t),()=>{let n=e.indexOf(t);if(n>=0){let[t]=e.splice(n,1);t()}}),dispose(){for(let t of e.splice(0))t()},async workQueue(){for(let e of t.splice(0))await e()}};return n}function c(){let[e]=Object(r.useState)(l);return Object(r.useEffect)(()=>()=>e.dispose(),[e]),e}let u=function(e){let t=i(e);return a.a.useCallback((...e)=>t.current(...e),[t])},d={serverHandoffComplete:!1};function p(){let[e,t]=Object(r.useState)(d.serverHandoffComplete);return Object(r.useEffect)(()=>{!0!==e&&t(!0)},[e]),Object(r.useEffect)(()=>{!1===d.serverHandoffComplete&&(d.serverHandoffComplete=!0)},[]),e}var f;let b=0;function v(){return++b}let m=null!=(f=a.a.useId)?f:function(){let e=p(),[t,n]=a.a.useState(e?v:null);return o(()=>{null===t&&n(v())},[t]),null!=t?""+t:void 0};function h(e,t,...n){if(e in t){let r=t[e];return"function"==typeof r?r(...n):r}let r=new Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map(e=>`"${e}"`).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,h),r}function y(e){return"undefined"==typeof window?null:e instanceof Node?e.ownerDocument:null!=e&&e.hasOwnProperty("current")&&e.current instanceof Node?e.current.ownerDocument:document}let g=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map(e=>`${e}:not([tabindex='-1'])`).join(",");var x=(e=>(e[e.First=1]="First",e[e.Previous=2]="Previous",e[e.Next=4]="Next",e[e.Last=8]="Last",e[e.WrapAround=16]="WrapAround",e[e.NoScroll=32]="NoScroll",e))(x||{}),E=(e=>(e[e.Error=0]="Error",e[e.Overflow=1]="Overflow",e[e.Success=2]="Success",e[e.Underflow=3]="Underflow",e))(E||{}),O=(e=>(e[e.Previous=-1]="Previous",e[e.Next=1]="Next",e))(O||{});function w(e=document.body){return null==e?[]:Array.from(e.querySelectorAll(g))}var j=(e=>(e[e.Strict=0]="Strict",e[e.Loose=1]="Loose",e))(j||{});function S(e,t=0){var n;return e!==(null==(n=y(e))?void 0:n.body)&&h(t,{0:()=>e.matches(g),1(){let t=e;for(;null!==t;){if(t.matches(g))return!0;t=t.parentElement}return!1}})}function k(e){null==e||e.focus({preventScroll:!0})}let C=["textarea","input"].join(",");function P(e,t=(e=>e)){return e.slice().sort((e,n)=>{let r=t(e),a=t(n);if(null===r||null===a)return 0;let o=r.compareDocumentPosition(a);return o&Node.DOCUMENT_POSITION_FOLLOWING?-1:o&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function R(e,t,n=!0){let r,a=Array.isArray(e)?e.length>0?e[0].ownerDocument:document:e.ownerDocument,o=Array.isArray(e)?n?P(e):e:w(e),i=a.activeElement,s=(()=>{if(5&t)return 1;if(10&t)return-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),l=(()=>{if(1&t)return 0;if(2&t)return Math.max(0,o.indexOf(i))-1;if(4&t)return Math.max(0,o.indexOf(i))+1;if(8&t)return o.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),c=32&t?{preventScroll:!0}:{},u=0,d=o.length;do{if(u>=d||u+d<=0)return 0;let e=l+u;if(16&t)e=(e+d)%d;else{if(e<0)return 3;if(e>=d)return 1}null==(r=o[e])||r.focus(c),u+=s}while(r!==a.activeElement);return 6&t&&function(e){var t,n;return null!=(n=null==(t=null==e?void 0:e.matches)?void 0:t.call(e,C))&&n}(r)&&r.select(),r.hasAttribute("tabindex")||r.setAttribute("tabindex","0"),2}function I(e,t,n){let a=i(t);Object(r.useEffect)(()=>{function t(e){a.current(e)}return window.addEventListener(e,t,n),()=>window.removeEventListener(e,t,n)},[e,n])}function _(e,t,n=!0){let a=Object(r.useRef)(!1);function o(n,r){if(!a.current||n.defaultPrevented)return;let o=function e(t){return"function"==typeof t?e(t()):Array.isArray(t)||t instanceof Set?t:[t]}(e),i=r(n);if(null!==i&&i.ownerDocument.documentElement.contains(i)){for(let e of o){if(null===e)continue;let t=e instanceof HTMLElement?e:e.current;if(null!=t&&t.contains(i))return}return!S(i,j.Loose)&&-1!==i.tabIndex&&n.preventDefault(),t(n,i)}}Object(r.useEffect)(()=>{requestAnimationFrame(()=>{a.current=n})},[n]),I("click",e=>o(e,e=>e.target),!0),I("blur",e=>o(e,()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null),!0)}function A(e){var t;if(e.type)return e.type;let n=null!=(t=e.as)?t:"button";return"string"==typeof n&&"button"===n.toLowerCase()?"button":void 0}function F(e,t){let[n,a]=Object(r.useState)(()=>A(e));return o(()=>{a(A(e))},[e.type,e.as]),o(()=>{n||!t.current||t.current instanceof HTMLButtonElement&&!t.current.hasAttribute("type")&&a("button")},[n,t]),n}let T=Symbol();function D(e,t=!0){return Object.assign(e,{[T]:t})}function M(...e){let t=Object(r.useRef)(e);Object(r.useEffect)(()=>{t.current=e},[e]);let n=u(e=>{for(let n of t.current)null!=n&&("function"==typeof n?n(e):n.current=e)});return e.every(e=>null==e||(null==e?void 0:e[T]))?void 0:n}function L({container:e,accept:t,walk:n,enabled:a=!0}){let i=Object(r.useRef)(t),s=Object(r.useRef)(n);Object(r.useEffect)(()=>{i.current=t,s.current=n},[t,n]),o(()=>{if(!e||!a)return;let t=y(e);if(!t)return;let n=i.current,r=s.current,o=Object.assign(e=>n(e),{acceptNode:n}),l=t.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,o,!1);for(;l.nextNode();)r(l.currentNode)},[e,a,i,s])}var N=(e=>(e[e.First=0]="First",e[e.Previous=1]="Previous",e[e.Next=2]="Next",e[e.Last=3]="Last",e[e.Specific=4]="Specific",e[e.Nothing=5]="Nothing",e))(N||{});function B(e,t){let n=t.resolveItems();if(n.length<=0)return null;let r=t.resolveActiveIndex(),a=null!=r?r:-1,o=(()=>{switch(e.focus){case 0:return n.findIndex(e=>!t.resolveDisabled(e));case 1:{let e=n.slice().reverse().findIndex((e,n,r)=>!(-1!==a&&r.length-n-1>=a)&&!t.resolveDisabled(e));return-1===e?e:n.length-1-e}case 2:return n.findIndex((e,n)=>!(n<=a)&&!t.resolveDisabled(e));case 3:{let e=n.slice().reverse().findIndex(e=>!t.resolveDisabled(e));return-1===e?e:n.length-1-e}case 4:return n.findIndex(n=>t.resolveId(n)===e.id);case 5:return null;default:!function(e){throw new Error("Unexpected object: "+e)}(e)}})();return-1===o?r:o}var z=(e=>(e[e.None=0]="None",e[e.RenderStrategy=1]="RenderStrategy",e[e.Static=2]="Static",e))(z||{}),q=(e=>(e[e.Unmount=0]="Unmount",e[e.Hidden=1]="Hidden",e))(q||{});function V({ourProps:e,theirProps:t,slot:n,defaultTag:r,features:a,visible:o=!0,name:i}){let s=U(t,e);if(o)return K(s,n,r,i);let l=null!=a?a:0;if(2&l){let{static:e=!1,...t}=s;if(e)return K(t,n,r,i)}if(1&l){let{unmount:e=!0,...t}=s;return h(e?0:1,{0:()=>null,1:()=>K({...t,hidden:!0,style:{display:"none"}},n,r,i)})}return K(s,n,r,i)}function K(e,t={},n,a){let{as:o=n,children:i,refName:s="ref",...l}=$(e,["unmount","static"]),c=void 0!==e.ref?{[s]:e.ref}:{},u="function"==typeof i?i(t):i;l.className&&"function"==typeof l.className&&(l.className=l.className(t));let d={};if(o===r.Fragment&&Object.keys(H(l)).length>0){if(!Object(r.isValidElement)(u)||Array.isArray(u)&&u.length>1)throw new Error(['Passing props on "Fragment"!',"",`The current component <${a} /> is rendering a "Fragment".`,"However we need to passthrough the following props:",Object.keys(l).map(e=>` - ${e}`).join("\n"),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "Fragment".',"Render a single element as the child so that we can forward the props onto that element."].map(e=>` - ${e}`).join("\n")].join("\n"));return Object(r.cloneElement)(u,Object.assign({},U(u.props,H($(l,["ref"]))),d,c))}return Object(r.createElement)(o,Object.assign({},$(l,["ref"]),o!==r.Fragment&&c,o!==r.Fragment&&d),u)}function U(...e){if(0===e.length)return{};if(1===e.length)return e[0];let t={},n={};for(let r of e)for(let e in r)e.startsWith("on")&&"function"==typeof r[e]?(null!=n[e]||(n[e]=[]),n[e].push(r[e])):t[e]=r[e];if(t.disabled||t["aria-disabled"])return Object.assign(t,Object.fromEntries(Object.keys(n).map(e=>[e,void 0])));for(let e in n)Object.assign(t,{[e](t,...r){let a=n[e];for(let e of a){if(t.defaultPrevented)return;e(t,...r)}}});return t}function W(e){var t;return Object.assign(Object(r.forwardRef)(e),{displayName:null!=(t=e.displayName)?t:e.name})}function H(e){let t=Object.assign({},e);for(let e in t)void 0===t[e]&&delete t[e];return t}function $(e,t=[]){let n=Object.assign({},e);for(let e of t)e in n&&delete n[e];return n}function G(e){let t=e.parentElement,n=null;for(;t&&!(t instanceof HTMLFieldSetElement);)t instanceof HTMLLegendElement&&(n=t),t=t.parentElement;let r=""===(null==t?void 0:t.getAttribute("disabled"));return(!r||!function(e){if(!e)return!1;let t=e.previousElementSibling;for(;null!==t;){if(t instanceof HTMLLegendElement)return!1;t=t.previousElementSibling}return!0}(n))&&r}function Y(e={},t=null,n=[]){for(let[r,a]of Object.entries(e))J(n,Q(t,r),a);return n}function Q(e,t){return e?e+"["+t+"]":t}function J(e,t,n){if(Array.isArray(n))for(let[r,a]of n.entries())J(e,Q(t,r.toString()),a);else n instanceof Date?e.push([t,n.toISOString()]):"boolean"==typeof n?e.push([t,n?"1":"0"]):"string"==typeof n?e.push([t,n]):"number"==typeof n?e.push([t,`${n}`]):null==n?e.push([t,""]):Y(n,t,e)}function X(e){var t;let n=null!=(t=null==e?void 0:e.form)?t:e.closest("form");if(n)for(let e of n.elements)if("INPUT"===e.tagName&&"submit"===e.type||"BUTTON"===e.tagName&&"submit"===e.type||"INPUT"===e.nodeName&&"image"===e.type)return void e.click()}var Z=(e=>(e[e.None=1]="None",e[e.Focusable=2]="Focusable",e[e.Hidden=4]="Hidden",e))(Z||{});let ee=W(function(e,t){let{features:n=1,...r}=e;return V({ourProps:{ref:t,"aria-hidden":2==(2&n)||void 0,style:{position:"absolute",width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...4==(4&n)&&2!=(2&n)&&{display:"none"}}},theirProps:r,slot:{},defaultTag:"div",name:"Hidden"})}),te=Object(r.createContext)(null);te.displayName="OpenClosedContext";var ne=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(ne||{});function re(){return Object(r.useContext)(te)}function ae({value:e,children:t}){return a.a.createElement(te.Provider,{value:e},t)}var oe=(e=>(e.Space=" ",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Delete="Delete",e.ArrowLeft="ArrowLeft",e.ArrowUp="ArrowUp",e.ArrowRight="ArrowRight",e.ArrowDown="ArrowDown",e.Home="Home",e.End="End",e.PageUp="PageUp",e.PageDown="PageDown",e.Tab="Tab",e))(oe||{}),ie=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(ie||{}),se=(e=>(e[e.Single=0]="Single",e[e.Multi=1]="Multi",e))(se||{}),le=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(le||{}),ce=(e=>(e[e.OpenCombobox=0]="OpenCombobox",e[e.CloseCombobox=1]="CloseCombobox",e[e.GoToOption=2]="GoToOption",e[e.RegisterOption=3]="RegisterOption",e[e.UnregisterOption=4]="UnregisterOption",e))(ce||{});function ue(e,t=(e=>e)){let n=null!==e.activeOptionIndex?e.options[e.activeOptionIndex]:null,r=P(t(e.options.slice()),e=>e.dataRef.current.domRef.current),a=n?r.indexOf(n):null;return-1===a&&(a=null),{options:r,activeOptionIndex:a}}let de={1:e=>e.dataRef.current.disabled||1===e.comboboxState?e:{...e,activeOptionIndex:null,comboboxState:1},0(e){if(e.dataRef.current.disabled||0===e.comboboxState)return e;let t=e.activeOptionIndex,{isSelected:n}=e.dataRef.current,r=e.options.findIndex(e=>n(e.dataRef.current.value));return-1!==r&&(t=r),{...e,comboboxState:0,activeOptionIndex:t}},2(e,t){var n;if(e.dataRef.current.disabled||e.dataRef.current.optionsRef.current&&!e.dataRef.current.optionsPropsRef.current.static&&1===e.comboboxState)return e;let r=ue(e);if(null===r.activeOptionIndex){let e=r.options.findIndex(e=>!e.dataRef.current.disabled);-1!==e&&(r.activeOptionIndex=e)}let a=B(t,{resolveItems:()=>r.options,resolveActiveIndex:()=>r.activeOptionIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.current.disabled});return{...e,...r,activeOptionIndex:a,activationTrigger:null!=(n=t.trigger)?n:1}},3:(e,t)=>{let n={id:t.id,dataRef:t.dataRef},r=ue(e,e=>[...e,n]);null===e.activeOptionIndex&&e.dataRef.current.isSelected(t.dataRef.current.value)&&(r.activeOptionIndex=r.options.indexOf(n));let a={...e,...r,activationTrigger:1};return e.dataRef.current.__demoMode&&void 0===e.dataRef.current.value&&(a.activeOptionIndex=0),a},4:(e,t)=>{let n=ue(e,e=>{let n=e.findIndex(e=>e.id===t.id);return-1!==n&&e.splice(n,1),e});return{...e,...n,activationTrigger:1}}},pe=Object(r.createContext)(null);function fe(e){let t=Object(r.useContext)(pe);if(null===t){let t=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,fe),t}return t}pe.displayName="ComboboxActionsContext";let be=Object(r.createContext)(null);function ve(e){let t=Object(r.useContext)(be);if(null===t){let t=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,ve),t}return t}function me(e,t){return h(t.type,de,e,t)}be.displayName="ComboboxDataContext";let he=r.Fragment,ye=W(function(e,t){let{name:n,value:i,onChange:s,disabled:l=!1,__demoMode:c=!1,nullable:d=!1,multiple:p=!1,...f}=e,[b,v]=Object(r.useReducer)(me,{dataRef:Object(r.createRef)(),comboboxState:c?0:1,options:[],activeOptionIndex:null,activationTrigger:1}),m=Object(r.useRef)(!1),y=Object(r.useRef)({static:!1,hold:!1}),g=Object(r.useRef)({displayValue:void 0}),x=Object(r.useRef)(null),E=Object(r.useRef)(null),O=Object(r.useRef)(null),w=Object(r.useRef)(null),j=u((e,t)=>e===t),S=Object(r.useCallback)(e=>h(k.mode,{1:()=>i.some(t=>j(t,e)),0:()=>j(i,e)}),[i]),k=Object(r.useMemo)(()=>({...b,optionsPropsRef:y,inputPropsRef:g,labelRef:x,inputRef:E,buttonRef:O,optionsRef:w,value:i,disabled:l,mode:p?1:0,get activeOptionIndex(){if(m.current&&null===b.activeOptionIndex&&b.options.length>0){let e=b.options.findIndex(e=>!e.dataRef.current.disabled);if(-1!==e)return e}return b.activeOptionIndex},compare:j,isSelected:S,nullable:d,__demoMode:c}),[i,l,p,d,c,b]);o(()=>{b.dataRef.current=k},[k]),_([k.buttonRef,k.inputRef,k.optionsRef],()=>v({type:1}),0===k.comboboxState);let C=Object(r.useMemo)(()=>({open:0===k.comboboxState,disabled:l,activeIndex:k.activeOptionIndex,activeOption:null===k.activeOptionIndex?null:k.options[k.activeOptionIndex].dataRef.current.value}),[k,l]),P=Object(r.useCallback)(()=>{var e;if(!k.inputRef.current)return;let t=g.current.displayValue;k.inputRef.current.value="function"==typeof t?null!=(e=t(i))?e:"":"string"==typeof i?i:""},[i,k.inputRef,g]),R=u(e=>{let t=k.options.find(t=>t.id===e);!t||(M(t.dataRef.current.value),P())}),I=u(()=>{if(null!==k.activeOptionIndex){let{dataRef:e,id:t}=k.options[k.activeOptionIndex];M(e.current.value),P(),v({type:2,focus:N.Specific,id:t})}}),A=u(()=>{v({type:0}),m.current=!0}),F=u(()=>{v({type:1}),m.current=!1}),T=u((e,t,n)=>(m.current=!1,e===N.Specific?v({type:2,focus:N.Specific,id:t,trigger:n}):v({type:2,focus:e,trigger:n}))),D=u((e,t)=>(v({type:3,id:e,dataRef:t}),()=>v({type:4,id:e}))),M=u(e=>h(k.mode,{0:()=>s(e),1(){let t=k.value.slice(),n=t.indexOf(e);return-1===n?t.push(e):t.splice(n,1),s(t)}})),L=Object(r.useMemo)(()=>({onChange:M,registerOption:D,goToOption:T,closeCombobox:F,openCombobox:A,selectActiveOption:I,selectOption:R}),[]);o(()=>{1===k.comboboxState&&P()},[P,k.comboboxState]),o(P,[P]);let B=null===t?{}:{ref:t};return a.a.createElement(pe.Provider,{value:L},a.a.createElement(be.Provider,{value:k},a.a.createElement(ae,{value:h(k.comboboxState,{0:ne.Open,1:ne.Closed})},null!=n&&null!=i&&Y({[n]:i}).map(([e,t])=>a.a.createElement(ee,{features:Z.Hidden,...H({key:e,as:"input",type:"hidden",hidden:!0,readOnly:!0,name:e,value:t})})),V({ourProps:B,theirProps:f,slot:C,defaultTag:he,name:"Combobox"}))))}),ge=W(function(e,t){var n,a;let{value:i,onChange:l,displayValue:d,type:p="text",...f}=e,b=ve("Combobox.Input"),v=fe("Combobox.Input"),y=M(b.inputRef,t),g=b.inputPropsRef,x=`headlessui-combobox-input-${m()}`,E=c();o(()=>{g.current.displayValue=d},[d,g]);let O=u(e=>{switch(e.key){case oe.Backspace:case oe.Delete:if(0!==b.comboboxState||0!==b.mode||!b.nullable)return;let t=e.currentTarget;E.requestAnimationFrame(()=>{""===t.value&&(v.onChange(null),b.optionsRef.current&&(b.optionsRef.current.scrollTop=0),v.goToOption(N.Nothing))});break;case oe.Enter:if(0!==b.comboboxState)return;if(e.preventDefault(),e.stopPropagation(),null===b.activeOptionIndex)return void v.closeCombobox();v.selectActiveOption(),0===b.mode&&v.closeCombobox();break;case oe.ArrowDown:return e.preventDefault(),e.stopPropagation(),h(b.comboboxState,{0:()=>{v.goToOption(N.Next)},1:()=>{v.openCombobox()}});case oe.ArrowUp:return e.preventDefault(),e.stopPropagation(),h(b.comboboxState,{0:()=>{v.goToOption(N.Previous)},1:()=>{v.openCombobox(),E.nextFrame(()=>{b.value||v.goToOption(N.Last)})}});case oe.Home:case oe.PageUp:return e.preventDefault(),e.stopPropagation(),v.goToOption(N.First);case oe.End:case oe.PageDown:return e.preventDefault(),e.stopPropagation(),v.goToOption(N.Last);case oe.Escape:return 0!==b.comboboxState?void 0:(e.preventDefault(),b.optionsRef.current&&!b.optionsPropsRef.current.static&&e.stopPropagation(),v.closeCombobox());case oe.Tab:if(0!==b.comboboxState)return;v.selectActiveOption(),v.closeCombobox()}}),w=u(e=>{v.openCombobox(),null==l||l(e)}),j=s(()=>{if(b.labelRef.current)return[b.labelRef.current.id].join(" ")},[b.labelRef.current]),S=Object(r.useMemo)(()=>({open:0===b.comboboxState,disabled:b.disabled}),[b]);return V({ourProps:{ref:y,id:x,role:"combobox",type:p,"aria-controls":null==(n=b.optionsRef.current)?void 0:n.id,"aria-expanded":b.disabled?void 0:0===b.comboboxState,"aria-activedescendant":null===b.activeOptionIndex||null==(a=b.options[b.activeOptionIndex])?void 0:a.id,"aria-multiselectable":1===b.mode||void 0,"aria-labelledby":j,disabled:b.disabled,onKeyDown:O,onChange:w},theirProps:f,slot:S,defaultTag:"input",name:"Combobox.Input"})}),xe=W(function(e,t){var n;let a=ve("Combobox.Button"),o=fe("Combobox.Button"),i=M(a.buttonRef,t),l=`headlessui-combobox-button-${m()}`,d=c(),p=u(e=>{switch(e.key){case oe.ArrowDown:return e.preventDefault(),e.stopPropagation(),1===a.comboboxState&&o.openCombobox(),d.nextFrame(()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})});case oe.ArrowUp:return e.preventDefault(),e.stopPropagation(),1===a.comboboxState&&(o.openCombobox(),d.nextFrame(()=>{a.value||o.goToOption(N.Last)})),d.nextFrame(()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})});case oe.Escape:return 0!==a.comboboxState?void 0:(e.preventDefault(),a.optionsRef.current&&!a.optionsPropsRef.current.static&&e.stopPropagation(),o.closeCombobox(),d.nextFrame(()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})}));default:return}}),f=u(e=>{if(G(e.currentTarget))return e.preventDefault();0===a.comboboxState?o.closeCombobox():(e.preventDefault(),o.openCombobox()),d.nextFrame(()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})})}),b=s(()=>{if(a.labelRef.current)return[a.labelRef.current.id,l].join(" ")},[a.labelRef.current,l]),v=Object(r.useMemo)(()=>({open:0===a.comboboxState,disabled:a.disabled}),[a]),h=e;return V({ourProps:{ref:i,id:l,type:F(e,a.buttonRef),tabIndex:-1,"aria-haspopup":!0,"aria-controls":null==(n=a.optionsRef.current)?void 0:n.id,"aria-expanded":a.disabled?void 0:0===a.comboboxState,"aria-labelledby":b,disabled:a.disabled,onClick:f,onKeyDown:p},theirProps:h,slot:v,defaultTag:"button",name:"Combobox.Button"})}),Ee=W(function(e,t){let n=ve("Combobox.Label"),a=`headlessui-combobox-label-${m()}`;return V({ourProps:{ref:M(n.labelRef,t),id:a,onClick:u(()=>{var e;return null==(e=n.inputRef.current)?void 0:e.focus({preventScroll:!0})})},theirProps:e,slot:Object(r.useMemo)(()=>({open:0===n.comboboxState,disabled:n.disabled}),[n]),defaultTag:"label",name:"Combobox.Label"})}),Oe=z.RenderStrategy|z.Static,we=W(function(e,t){var n;let{hold:a=!1,...i}=e,l=ve("Combobox.Options"),c=M(l.optionsRef,t),u=`headlessui-combobox-options-${m()}`,d=re(),p=null!==d?d===ne.Open:0===l.comboboxState;o(()=>{var t;l.optionsPropsRef.current.static=null!=(t=e.static)&&t},[l.optionsPropsRef,e.static]),o(()=>{l.optionsPropsRef.current.hold=a},[l.optionsPropsRef,a]),L({container:l.optionsRef.current,enabled:0===l.comboboxState,accept:e=>"option"===e.getAttribute("role")?NodeFilter.FILTER_REJECT:e.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT,walk(e){e.setAttribute("role","none")}});let f=s(()=>{var e,t,n;return null!=(n=null==(e=l.labelRef.current)?void 0:e.id)?n:null==(t=l.buttonRef.current)?void 0:t.id},[l.labelRef.current,l.buttonRef.current]),b=Object(r.useMemo)(()=>({open:0===l.comboboxState}),[l]);return V({ourProps:{"aria-activedescendant":null===l.activeOptionIndex||null==(n=l.options[l.activeOptionIndex])?void 0:n.id,"aria-labelledby":f,role:"listbox",id:u,ref:c},theirProps:i,slot:b,defaultTag:"ul",features:Oe,visible:p,name:"Combobox.Options"})}),je=W(function(e,t){var n,a;let{disabled:s=!1,value:c,...d}=e,p=ve("Combobox.Option"),f=fe("Combobox.Option"),b=`headlessui-combobox-option-${m()}`,v=null!==p.activeOptionIndex&&p.options[p.activeOptionIndex].id===b,h=p.isSelected(c),y=Object(r.useRef)(null),g=i({disabled:s,value:c,domRef:y,textValue:null==(a=null==(n=y.current)?void 0:n.textContent)?void 0:a.toLowerCase()}),x=M(t,y),E=u(()=>f.selectOption(b));o(()=>f.registerOption(b,g),[g,b]);let O=Object(r.useRef)(!p.__demoMode);o(()=>{if(!p.__demoMode)return;let e=l();return e.requestAnimationFrame(()=>{O.current=!0}),e.dispose},[]),o(()=>{if(0!==p.comboboxState||!v||!O.current||0===p.activationTrigger)return;let e=l();return e.requestAnimationFrame(()=>{var e,t;null==(t=null==(e=y.current)?void 0:e.scrollIntoView)||t.call(e,{block:"nearest"})}),e.dispose},[y,v,p.comboboxState,p.activationTrigger,p.activeOptionIndex]);let w=u(e=>{var t;if(s)return e.preventDefault();E(),0===p.mode&&(f.closeCombobox(),null==(t=p.inputRef.current)||t.focus({preventScroll:!0}))}),j=u(()=>{if(s)return f.goToOption(N.Nothing);f.goToOption(N.Specific,b)}),S=u(()=>{s||v||f.goToOption(N.Specific,b,0)}),k=u(()=>{s||!v||p.optionsPropsRef.current.hold||f.goToOption(N.Nothing)}),C=Object(r.useMemo)(()=>({active:v,selected:h,disabled:s}),[v,h,s]);return V({ourProps:{id:b,ref:x,role:"option",tabIndex:!0===s?void 0:-1,"aria-disabled":!0===s||void 0,"aria-selected":!0===h||void 0,disabled:void 0,onClick:w,onFocus:j,onPointerMove:S,onMouseMove:S,onPointerLeave:k,onMouseLeave:k},theirProps:d,slot:C,defaultTag:"li",name:"Combobox.Option"})}),Se=Object.assign(ye,{Input:ge,Button:xe,Label:Ee,Options:we,Option:je});var ke=(e=>(e[e.Forwards=0]="Forwards",e[e.Backwards=1]="Backwards",e))(ke||{});function Ce(){let e=Object(r.useRef)(0);return I("keydown",t=>{"Tab"===t.key&&(e.current=t.shiftKey?1:0)},!0),e}function Pe(){let e=Object(r.useRef)(!1);return o(()=>(e.current=!0,()=>{e.current=!1}),[]),e}function Re(...e){return Object(r.useMemo)(()=>y(...e),[...e])}function Ie(e,t,n,a){let o=i(n);Object(r.useEffect)(()=>{function n(e){o.current(e)}return(e=null!=e?e:window).addEventListener(t,n,a),()=>e.removeEventListener(t,n,a)},[e,t,a])}function _e(e){"function"==typeof queueMicrotask?queueMicrotask(e):Promise.resolve().then(e).catch(e=>setTimeout(()=>{throw e}))}function Ae(e,t){let n=Object(r.useRef)([]),a=u(e);Object(r.useEffect)(()=>{for(let[e,r]of t.entries())if(n.current[e]!==r){let e=a(t);return n.current=t,e}},[a,...t])}var Fe=(e=>(e[e.None=1]="None",e[e.InitialFocus=2]="InitialFocus",e[e.TabLock=4]="TabLock",e[e.FocusLock=8]="FocusLock",e[e.RestoreFocus=16]="RestoreFocus",e[e.All=30]="All",e))(Fe||{});let Te=Object.assign(W(function(e,t){let n=Object(r.useRef)(null),o=M(n,t),{initialFocus:i,containers:s,features:l=30,...c}=e;p()||(l=1);let d=Re(n);!function({ownerDocument:e},t){let n=Object(r.useRef)(null);Ie(null==e?void 0:e.defaultView,"focusout",e=>{!t||n.current||(n.current=e.target)},!0),Ae(()=>{t||((null==e?void 0:e.activeElement)===(null==e?void 0:e.body)&&k(n.current),n.current=null)},[t]);let a=Object(r.useRef)(!1);Object(r.useEffect)(()=>(a.current=!1,()=>{a.current=!0,_e(()=>{!a.current||(k(n.current),n.current=null)})}),[])}({ownerDocument:d},Boolean(16&l));let f=function({ownerDocument:e,container:t,initialFocus:n},a){let o=Object(r.useRef)(null);return Ae(()=>{if(!a)return;let r=t.current;if(!r)return;let i=null==e?void 0:e.activeElement;if(null!=n&&n.current){if((null==n?void 0:n.current)===i)return void(o.current=i)}else if(r.contains(i))return void(o.current=i);null!=n&&n.current?k(n.current):R(r,x.First)===E.Error&&console.warn("There are no focusable elements inside the "),o.current=null==e?void 0:e.activeElement},[a]),o}({ownerDocument:d,container:n,initialFocus:i},Boolean(2&l));!function({ownerDocument:e,container:t,containers:n,previousActiveElement:r},a){let o=Pe();Ie(null==e?void 0:e.defaultView,"focus",e=>{if(!a||!o.current)return;let i=new Set(null==n?void 0:n.current);i.add(t);let s=r.current;if(!s)return;let l=e.target;l&&l instanceof HTMLElement?function(e,t){var n;for(let r of e)if(null!=(n=r.current)&&n.contains(t))return!0;return!1}(i,l)?(r.current=l,k(l)):(e.preventDefault(),e.stopPropagation(),k(s)):k(r.current)},!0)}({ownerDocument:d,container:n,containers:s,previousActiveElement:f},Boolean(8&l));let b=Ce(),v=u(()=>{let e=n.current;!e||h(b.current,{[ke.Forwards]:()=>R(e,x.First),[ke.Backwards]:()=>R(e,x.Last)})}),m={ref:o};return a.a.createElement(a.a.Fragment,null,Boolean(4&l)&&a.a.createElement(ee,{as:"button",type:"button",onFocus:v,features:Z.Focusable}),V({ourProps:m,theirProps:c,defaultTag:"div",name:"FocusTrap"}),Boolean(4&l)&&a.a.createElement(ee,{as:"button",type:"button",onFocus:v,features:Z.Focusable}))}),{features:Fe});let De=new Set,Me=new Map;function Le(e){e.setAttribute("aria-hidden","true"),e.inert=!0}function Ne(e){let t=Me.get(e);!t||(null===t["aria-hidden"]?e.removeAttribute("aria-hidden"):e.setAttribute("aria-hidden",t["aria-hidden"]),e.inert=t.inert)}var Be=n(148);let ze=Object(r.createContext)(!1);function qe(e){return a.a.createElement(ze.Provider,{value:e.force},e.children)}function Ve(e){let t=Object(r.useContext)(ze),n=Object(r.useContext)(He),a=Re(e),[o,i]=Object(r.useState)(()=>{if(!t&&null!==n||"undefined"==typeof window)return null;let e=null==a?void 0:a.getElementById("headlessui-portal-root");if(e)return e;if(null===a)return null;let r=a.createElement("div");return r.setAttribute("id","headlessui-portal-root"),a.body.appendChild(r)});return Object(r.useEffect)(()=>{null!==o&&(null!=a&&a.body.contains(o)||null==a||a.body.appendChild(o))},[o,a]),Object(r.useEffect)(()=>{t||null!==n&&i(n.current)},[n,i,t]),o}let Ke=r.Fragment,Ue=W(function(e,t){let n=e,a=Object(r.useRef)(null),i=M(D(e=>{a.current=e}),t),s=Re(a),l=Ve(a),[c]=Object(r.useState)(()=>{var e;return"undefined"==typeof window?null:null!=(e=null==s?void 0:s.createElement("div"))?e:null}),u=p(),d=Object(r.useRef)(!1);return o(()=>{if(d.current=!1,l&&c)return l.contains(c)||(c.setAttribute("data-headlessui-portal",""),l.appendChild(c)),()=>{d.current=!0,_e(()=>{var e;!d.current||!l||!c||(l.removeChild(c),l.childNodes.length<=0&&(null==(e=l.parentElement)||e.removeChild(l)))})}},[l,c]),u&&l&&c?Object(Be.createPortal)(V({ourProps:{ref:i},theirProps:n,defaultTag:Ke,name:"Portal"}),c):null}),We=r.Fragment,He=Object(r.createContext)(null),$e=W(function(e,t){let{target:n,...r}=e,o={ref:M(t)};return a.a.createElement(He.Provider,{value:n},V({ourProps:o,theirProps:r,defaultTag:We,name:"Popover.Group"}))}),Ge=Object.assign(Ue,{Group:$e}),Ye=Object(r.createContext)(null);function Qe(){let e=Object(r.useContext)(Ye);if(null===e){let e=new Error("You used a component, but it is not inside a relevant parent.");throw Error.captureStackTrace&&Error.captureStackTrace(e,Qe),e}return e}function Je(){let[e,t]=Object(r.useState)([]);return[e.length>0?e.join(" "):void 0,Object(r.useMemo)(()=>(function(e){let n=u(e=>(t(t=>[...t,e]),()=>t(t=>{let n=t.slice(),r=n.indexOf(e);return-1!==r&&n.splice(r,1),n}))),o=Object(r.useMemo)(()=>({register:n,slot:e.slot,name:e.name,props:e.props}),[n,e.slot,e.name,e.props]);return a.a.createElement(Ye.Provider,{value:o},e.children)}),[t])]}let Xe=W(function(e,t){let n=Qe(),r=`headlessui-description-${m()}`,a=M(t);o(()=>n.register(r),[r,n.register]);let i=e;return V({ourProps:{ref:a,...n.props,id:r},theirProps:i,slot:n.slot||{},defaultTag:"p",name:n.name||"Description"})}),Ze=Object(r.createContext)(()=>{});Ze.displayName="StackContext";var et=(e=>(e[e.Add=0]="Add",e[e.Remove=1]="Remove",e))(et||{});function tt({children:e,onUpdate:t,type:n,element:i}){let s=Object(r.useContext)(Ze),l=u((...e)=>{null==t||t(...e),s(...e)});return o(()=>(l(0,n,i),()=>l(1,n,i)),[l,n,i]),a.a.createElement(Ze.Provider,{value:l},e)}var nt=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(nt||{}),rt=(e=>(e[e.SetTitleId=0]="SetTitleId",e))(rt||{});let at={0:(e,t)=>e.titleId===t.id?e:{...e,titleId:t.id}},ot=Object(r.createContext)(null);function it(e){let t=Object(r.useContext)(ot);if(null===t){let t=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,it),t}return t}function st(e,t){return h(t.type,at,e,t)}ot.displayName="DialogContext";let lt=z.RenderStrategy|z.Static,ct=W(function(e,t){let{open:n,onClose:i,initialFocus:s,__demoMode:l=!1,...c}=e,[d,f]=Object(r.useState)(0),b=re();void 0===n&&null!==b&&(n=h(b,{[ne.Open]:!0,[ne.Closed]:!1}));let v=Object(r.useRef)(new Set),g=Object(r.useRef)(null),x=M(g,t),E=Object(r.useRef)(null),O=Re(g),w=e.hasOwnProperty("open")||null!==b,j=e.hasOwnProperty("onClose");if(!w&&!j)throw new Error("You have to provide an `open` and an `onClose` prop to the `Dialog` component.");if(!w)throw new Error("You provided an `onClose` prop to the `Dialog`, but forgot an `open` prop.");if(!j)throw new Error("You provided an `open` prop to the `Dialog`, but forgot an `onClose` prop.");if("boolean"!=typeof n)throw new Error(`You provided an \`open\` prop to the \`Dialog\`, but the value is not a boolean. Received: ${n}`);if("function"!=typeof i)throw new Error(`You provided an \`onClose\` prop to the \`Dialog\`, but the value is not a function. Received: ${i}`);let S=n?0:1,[k,C]=Object(r.useReducer)(st,{titleId:null,descriptionId:null,panelRef:Object(r.createRef)()}),P=u(()=>i(!1)),R=u(e=>C({type:0,id:e})),I=!!p()&&(!l&&0===S),A=d>1,F=null!==Object(r.useContext)(ot),T=A?"parent":"leaf";(function(e,t=!0){o(()=>{if(!t||!e.current)return;let n=e.current,r=y(n);if(r){De.add(n);for(let e of Me.keys())e.contains(n)&&(Ne(e),Me.delete(e));return r.querySelectorAll("body > *").forEach(e=>{if(e instanceof HTMLElement){for(let t of De)if(e.contains(t))return;1===De.size&&(Me.set(e,{"aria-hidden":e.getAttribute("aria-hidden"),inert:e.inert}),Le(e))}}),()=>{if(De.delete(n),De.size>0)r.querySelectorAll("body > *").forEach(e=>{if(e instanceof HTMLElement&&!Me.has(e)){for(let t of De)if(e.contains(t))return;Me.set(e,{"aria-hidden":e.getAttribute("aria-hidden"),inert:e.inert}),Le(e)}});else for(let e of Me.keys())Ne(e),Me.delete(e)}}},[t])})(g,!!A&&I),_(()=>{var e,t;return[...Array.from(null!=(e=null==O?void 0:O.querySelectorAll("body > *, [data-headlessui-portal]"))?e:[]).filter(e=>!(!(e instanceof HTMLElement)||e.contains(E.current)||k.panelRef.current&&e.contains(k.panelRef.current))),null!=(t=k.panelRef.current)?t:g.current]},P,I&&!A),Ie(null==O?void 0:O.defaultView,"keydown",e=>{e.defaultPrevented||e.key===oe.Escape&&0===S&&(A||(e.preventDefault(),e.stopPropagation(),P()))}),Object(r.useEffect)(()=>{var e;if(0!==S||F)return;let t=y(g);if(!t)return;let n=t.documentElement,r=null!=(e=t.defaultView)?e:window,a=n.style.overflow,o=n.style.paddingRight,i=r.innerWidth-n.clientWidth;if(n.style.overflow="hidden",i>0){let e=i-(n.clientWidth-n.offsetWidth);n.style.paddingRight=`${e}px`}return()=>{n.style.overflow=a,n.style.paddingRight=o}},[S,F]),Object(r.useEffect)(()=>{if(0!==S||!g.current)return;let e=new IntersectionObserver(e=>{for(let t of e)0===t.boundingClientRect.x&&0===t.boundingClientRect.y&&0===t.boundingClientRect.width&&0===t.boundingClientRect.height&&P()});return e.observe(g.current),()=>e.disconnect()},[S,g,P]);let[D,L]=Je(),N=`headlessui-dialog-${m()}`,B=Object(r.useMemo)(()=>[{dialogState:S,close:P,setTitleId:R},k],[S,k,P,R]),z=Object(r.useMemo)(()=>({open:0===S}),[S]),q={ref:x,id:N,role:"dialog","aria-modal":0===S||void 0,"aria-labelledby":k.titleId,"aria-describedby":D};return a.a.createElement(tt,{type:"Dialog",element:g,onUpdate:u((e,t,n)=>{"Dialog"===t&&h(e,{[et.Add](){v.current.add(n),f(e=>e+1)},[et.Remove](){v.current.add(n),f(e=>e-1)}})})},a.a.createElement(qe,{force:!0},a.a.createElement(Ge,null,a.a.createElement(ot.Provider,{value:B},a.a.createElement(Ge.Group,{target:g},a.a.createElement(qe,{force:!1},a.a.createElement(L,{slot:z,name:"Dialog.Description"},a.a.createElement(Te,{initialFocus:s,containers:v,features:I?h(T,{parent:Te.features.RestoreFocus,leaf:Te.features.All&~Te.features.FocusLock}):Te.features.None},V({ourProps:q,theirProps:c,slot:z,defaultTag:"div",features:lt,visible:0===S,name:"Dialog"})))))))),a.a.createElement(ee,{features:Z.Hidden,ref:E}))}),ut=W(function(e,t){let[{dialogState:n,close:a}]=it("Dialog.Overlay");return V({ourProps:{ref:M(t),id:`headlessui-dialog-overlay-${m()}`,"aria-hidden":!0,onClick:u(e=>{if(e.target===e.currentTarget){if(G(e.currentTarget))return e.preventDefault();e.preventDefault(),e.stopPropagation(),a()}})},theirProps:e,slot:Object(r.useMemo)(()=>({open:0===n}),[n]),defaultTag:"div",name:"Dialog.Overlay"})}),dt=W(function(e,t){let[{dialogState:n},o]=it("Dialog.Backdrop"),i=M(t),s=`headlessui-dialog-backdrop-${m()}`;Object(r.useEffect)(()=>{if(null===o.panelRef.current)throw new Error("A component is being used, but a component is missing.")},[o.panelRef]);let l=Object(r.useMemo)(()=>({open:0===n}),[n]);return a.a.createElement(qe,{force:!0},a.a.createElement(Ge,null,V({ourProps:{ref:i,id:s,"aria-hidden":!0},theirProps:e,slot:l,defaultTag:"div",name:"Dialog.Backdrop"})))}),pt=W(function(e,t){let[{dialogState:n},a]=it("Dialog.Panel"),o=M(t,a.panelRef),i=`headlessui-dialog-panel-${m()}`,s=Object(r.useMemo)(()=>({open:0===n}),[n]);return V({ourProps:{ref:o,id:i,onClick:u(e=>{e.stopPropagation()})},theirProps:e,slot:s,defaultTag:"div",name:"Dialog.Panel"})}),ft=W(function(e,t){let[{dialogState:n,setTitleId:a}]=it("Dialog.Title"),o=`headlessui-dialog-title-${m()}`,i=M(t);Object(r.useEffect)(()=>(a(o),()=>a(null)),[o,a]);let s=Object(r.useMemo)(()=>({open:0===n}),[n]);return V({ourProps:{ref:i,id:o},theirProps:e,slot:s,defaultTag:"h2",name:"Dialog.Title"})}),bt=Object.assign(ct,{Backdrop:dt,Panel:pt,Overlay:ut,Title:ft,Description:Xe});var vt=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(vt||{}),mt=(e=>(e[e.ToggleDisclosure=0]="ToggleDisclosure",e[e.CloseDisclosure=1]="CloseDisclosure",e[e.SetButtonId=2]="SetButtonId",e[e.SetPanelId=3]="SetPanelId",e[e.LinkPanel=4]="LinkPanel",e[e.UnlinkPanel=5]="UnlinkPanel",e))(mt||{});let ht={0:e=>({...e,disclosureState:h(e.disclosureState,{0:1,1:0})}),1:e=>1===e.disclosureState?e:{...e,disclosureState:1},4:e=>!0===e.linkedPanel?e:{...e,linkedPanel:!0},5:e=>!1===e.linkedPanel?e:{...e,linkedPanel:!1},2:(e,t)=>e.buttonId===t.buttonId?e:{...e,buttonId:t.buttonId},3:(e,t)=>e.panelId===t.panelId?e:{...e,panelId:t.panelId}},yt=Object(r.createContext)(null);function gt(e){let t=Object(r.useContext)(yt);if(null===t){let t=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,gt),t}return t}yt.displayName="DisclosureContext";let xt=Object(r.createContext)(null);function Et(e){let t=Object(r.useContext)(xt);if(null===t){let t=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,Et),t}return t}xt.displayName="DisclosureAPIContext";let Ot=Object(r.createContext)(null);function wt(e,t){return h(t.type,ht,e,t)}Ot.displayName="DisclosurePanelContext";let jt=r.Fragment,St=W(function(e,t){let{defaultOpen:n=!1,...o}=e,i=`headlessui-disclosure-button-${m()}`,s=`headlessui-disclosure-panel-${m()}`,l=Object(r.useRef)(null),c=M(t,D(e=>{l.current=e},void 0===e.as||e.as===a.a.Fragment)),d=Object(r.useRef)(null),p=Object(r.useRef)(null),f=Object(r.useReducer)(wt,{disclosureState:n?0:1,linkedPanel:!1,buttonRef:p,panelRef:d,buttonId:i,panelId:s}),[{disclosureState:b},v]=f;Object(r.useEffect)(()=>v({type:2,buttonId:i}),[i,v]),Object(r.useEffect)(()=>v({type:3,panelId:s}),[s,v]);let g=u(e=>{v({type:1});let t=y(l);if(!t)return;let n=e?e instanceof HTMLElement?e:e.current instanceof HTMLElement?e.current:t.getElementById(i):t.getElementById(i);null==n||n.focus()}),x=Object(r.useMemo)(()=>({close:g}),[g]),E=Object(r.useMemo)(()=>({open:0===b,close:g}),[b,g]),O={ref:c};return a.a.createElement(yt.Provider,{value:f},a.a.createElement(xt.Provider,{value:x},a.a.createElement(ae,{value:h(b,{0:ne.Open,1:ne.Closed})},V({ourProps:O,theirProps:o,slot:E,defaultTag:jt,name:"Disclosure"}))))}),kt=W(function(e,t){let[n,a]=gt("Disclosure.Button"),o=Object(r.useContext)(Ot),i=null!==o&&o===n.panelId,s=Object(r.useRef)(null),l=M(s,t,i?null:n.buttonRef),c=u(e=>{var t;if(i){if(1===n.disclosureState)return;switch(e.key){case oe.Space:case oe.Enter:e.preventDefault(),e.stopPropagation(),a({type:0}),null==(t=n.buttonRef.current)||t.focus()}}else switch(e.key){case oe.Space:case oe.Enter:e.preventDefault(),e.stopPropagation(),a({type:0})}}),d=u(e=>{switch(e.key){case oe.Space:e.preventDefault()}}),p=u(t=>{var r;G(t.currentTarget)||e.disabled||(i?(a({type:0}),null==(r=n.buttonRef.current)||r.focus()):a({type:0}))}),f=Object(r.useMemo)(()=>({open:0===n.disclosureState}),[n]),b=F(e,s),v=e;return V({ourProps:i?{ref:l,type:b,onKeyDown:c,onClick:p}:{ref:l,id:n.buttonId,type:b,"aria-expanded":e.disabled?void 0:0===n.disclosureState,"aria-controls":n.linkedPanel?n.panelId:void 0,onKeyDown:c,onKeyUp:d,onClick:p},theirProps:v,slot:f,defaultTag:"button",name:"Disclosure.Button"})}),Ct=z.RenderStrategy|z.Static,Pt=W(function(e,t){let[n,o]=gt("Disclosure.Panel"),{close:i}=Et("Disclosure.Panel"),s=M(t,n.panelRef,()=>{n.linkedPanel||o({type:4})}),l=re(),c=null!==l?l===ne.Open:0===n.disclosureState;Object(r.useEffect)(()=>()=>o({type:5}),[o]),Object(r.useEffect)(()=>{var t;1===n.disclosureState&&(null==(t=e.unmount)||t)&&o({type:5})},[n.disclosureState,e.unmount,o]);let u=Object(r.useMemo)(()=>({open:0===n.disclosureState,close:i}),[n,i]),d=e,p={ref:s,id:n.panelId};return a.a.createElement(Ot.Provider,{value:n.panelId},V({ourProps:p,theirProps:d,slot:u,defaultTag:"div",features:Ct,visible:c,name:"Disclosure.Panel"}))}),Rt=Object.assign(St,{Button:kt,Panel:Pt});var It=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(It||{}),_t=(e=>(e[e.Single=0]="Single",e[e.Multi=1]="Multi",e))(_t||{}),At=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(At||{}),Ft=(e=>(e[e.OpenListbox=0]="OpenListbox",e[e.CloseListbox=1]="CloseListbox",e[e.SetDisabled=2]="SetDisabled",e[e.SetOrientation=3]="SetOrientation",e[e.GoToOption=4]="GoToOption",e[e.Search=5]="Search",e[e.ClearSearch=6]="ClearSearch",e[e.RegisterOption=7]="RegisterOption",e[e.UnregisterOption=8]="UnregisterOption",e))(Ft||{});function Tt(e,t=(e=>e)){let n=null!==e.activeOptionIndex?e.options[e.activeOptionIndex]:null,r=P(t(e.options.slice()),e=>e.dataRef.current.domRef.current),a=n?r.indexOf(n):null;return-1===a&&(a=null),{options:r,activeOptionIndex:a}}let Dt={1:e=>e.disabled||1===e.listboxState?e:{...e,activeOptionIndex:null,listboxState:1},0(e){if(e.disabled||0===e.listboxState)return e;let t=e.activeOptionIndex,{value:n,mode:r,compare:a}=e.propsRef.current,o=e.options.findIndex(e=>{let t=e.dataRef.current.value;return h(r,{1:()=>n.some(e=>a(e,t)),0:()=>a(n,t)})});return-1!==o&&(t=o),{...e,listboxState:0,activeOptionIndex:t}},2:(e,t)=>e.disabled===t.disabled?e:{...e,disabled:t.disabled},3:(e,t)=>e.orientation===t.orientation?e:{...e,orientation:t.orientation},4(e,t){var n;if(e.disabled||1===e.listboxState)return e;let r=Tt(e),a=B(t,{resolveItems:()=>r.options,resolveActiveIndex:()=>r.activeOptionIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.current.disabled});return{...e,...r,searchQuery:"",activeOptionIndex:a,activationTrigger:null!=(n=t.trigger)?n:1}},5:(e,t)=>{if(e.disabled||1===e.listboxState)return e;let n=""!==e.searchQuery?0:1,r=e.searchQuery+t.value.toLowerCase(),a=(null!==e.activeOptionIndex?e.options.slice(e.activeOptionIndex+n).concat(e.options.slice(0,e.activeOptionIndex+n)):e.options).find(e=>{var t;return!e.dataRef.current.disabled&&(null==(t=e.dataRef.current.textValue)?void 0:t.startsWith(r))}),o=a?e.options.indexOf(a):-1;return-1===o||o===e.activeOptionIndex?{...e,searchQuery:r}:{...e,searchQuery:r,activeOptionIndex:o,activationTrigger:1}},6:e=>e.disabled||1===e.listboxState||""===e.searchQuery?e:{...e,searchQuery:""},7:(e,t)=>{let n={id:t.id,dataRef:t.dataRef},r=Tt(e,e=>[...e,n]);if(null===e.activeOptionIndex){let{value:a,mode:o,compare:i}=e.propsRef.current,s=t.dataRef.current.value;h(o,{1:()=>a.some(e=>i(e,s)),0:()=>i(a,s)})&&(r.activeOptionIndex=r.options.indexOf(n))}return{...e,...r}},8:(e,t)=>{let n=Tt(e,e=>{let n=e.findIndex(e=>e.id===t.id);return-1!==n&&e.splice(n,1),e});return{...e,...n,activationTrigger:1}}},Mt=Object(r.createContext)(null);function Lt(e){let t=Object(r.useContext)(Mt);if(null===t){let t=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,Lt),t}return t}function Nt(e,t){return h(t.type,Dt,e,t)}Mt.displayName="ListboxContext";let Bt=r.Fragment,zt=W(function(e,t){let{value:n,name:i,onChange:s,disabled:l=!1,horizontal:c=!1,multiple:d=!1,...p}=e;const f=c?"horizontal":"vertical";let b=M(t),v=Object(r.useReducer)(Nt,{listboxState:1,propsRef:{current:{value:n,onChange:s,mode:d?1:0,compare:u((e,t)=>e===t)}},labelRef:Object(r.createRef)(),buttonRef:Object(r.createRef)(),optionsRef:Object(r.createRef)(),disabled:l,orientation:f,options:[],searchQuery:"",activeOptionIndex:null,activationTrigger:1}),[{listboxState:m,propsRef:y,optionsRef:g,buttonRef:x},E]=v;y.current.value=n,y.current.mode=d?1:0,o(()=>{y.current.onChange=(e=>h(y.current.mode,{0:()=>s(e),1(){let t=y.current.value.slice(),n=t.indexOf(e);return-1===n?t.push(e):t.splice(n,1),s(t)}}))},[s,y]),o(()=>E({type:2,disabled:l}),[l]),o(()=>E({type:3,orientation:f}),[f]),_([x,g],(e,t)=>{var n;E({type:1}),S(t,j.Loose)||(e.preventDefault(),null==(n=x.current)||n.focus())},0===m);let O=Object(r.useMemo)(()=>({open:0===m,disabled:l}),[m,l]),w={ref:b};return a.a.createElement(Mt.Provider,{value:v},a.a.createElement(ae,{value:h(m,{0:ne.Open,1:ne.Closed})},null!=i&&null!=n&&Y({[i]:n}).map(([e,t])=>a.a.createElement(ee,{features:Z.Hidden,...H({key:e,as:"input",type:"hidden",hidden:!0,readOnly:!0,name:e,value:t})})),V({ourProps:w,theirProps:p,slot:O,defaultTag:Bt,name:"Listbox"})))}),qt=W(function(e,t){var n;let[a,o]=Lt("Listbox.Button"),i=M(a.buttonRef,t),l=`headlessui-listbox-button-${m()}`,d=c(),p=u(e=>{switch(e.key){case oe.Space:case oe.Enter:case oe.ArrowDown:e.preventDefault(),o({type:0}),d.nextFrame(()=>{a.propsRef.current.value||o({type:4,focus:N.First})});break;case oe.ArrowUp:e.preventDefault(),o({type:0}),d.nextFrame(()=>{a.propsRef.current.value||o({type:4,focus:N.Last})})}}),f=u(e=>{switch(e.key){case oe.Space:e.preventDefault()}}),b=u(e=>{if(G(e.currentTarget))return e.preventDefault();0===a.listboxState?(o({type:1}),d.nextFrame(()=>{var e;return null==(e=a.buttonRef.current)?void 0:e.focus({preventScroll:!0})})):(e.preventDefault(),o({type:0}))}),v=s(()=>{if(a.labelRef.current)return[a.labelRef.current.id,l].join(" ")},[a.labelRef.current,l]),h=Object(r.useMemo)(()=>({open:0===a.listboxState,disabled:a.disabled}),[a]),y=e;return V({ourProps:{ref:i,id:l,type:F(e,a.buttonRef),"aria-haspopup":!0,"aria-controls":null==(n=a.optionsRef.current)?void 0:n.id,"aria-expanded":a.disabled?void 0:0===a.listboxState,"aria-labelledby":v,disabled:a.disabled,onKeyDown:p,onKeyUp:f,onClick:b},theirProps:y,slot:h,defaultTag:"button",name:"Listbox.Button"})}),Vt=W(function(e,t){let[n]=Lt("Listbox.Label"),a=`headlessui-listbox-label-${m()}`;return V({ourProps:{ref:M(n.labelRef,t),id:a,onClick:u(()=>{var e;return null==(e=n.buttonRef.current)?void 0:e.focus({preventScroll:!0})})},theirProps:e,slot:Object(r.useMemo)(()=>({open:0===n.listboxState,disabled:n.disabled}),[n]),defaultTag:"label",name:"Listbox.Label"})}),Kt=z.RenderStrategy|z.Static,Ut=W(function(e,t){var n;let[a,o]=Lt("Listbox.Options"),i=M(a.optionsRef,t),d=`headlessui-listbox-options-${m()}`,p=c(),f=c(),b=re(),v=null!==b?b===ne.Open:0===a.listboxState;Object(r.useEffect)(()=>{var e;let t=a.optionsRef.current;!t||0===a.listboxState&&t!==(null==(e=y(t))?void 0:e.activeElement)&&t.focus({preventScroll:!0})},[a.listboxState,a.optionsRef]);let g=u(e=>{switch(f.dispose(),e.key){case oe.Space:if(""!==a.searchQuery)return e.preventDefault(),e.stopPropagation(),o({type:5,value:e.key});case oe.Enter:if(e.preventDefault(),e.stopPropagation(),null!==a.activeOptionIndex){let{dataRef:e}=a.options[a.activeOptionIndex];a.propsRef.current.onChange(e.current.value)}0===a.propsRef.current.mode&&(o({type:1}),l().nextFrame(()=>{var e;return null==(e=a.buttonRef.current)?void 0:e.focus({preventScroll:!0})}));break;case h(a.orientation,{vertical:oe.ArrowDown,horizontal:oe.ArrowRight}):return e.preventDefault(),e.stopPropagation(),o({type:4,focus:N.Next});case h(a.orientation,{vertical:oe.ArrowUp,horizontal:oe.ArrowLeft}):return e.preventDefault(),e.stopPropagation(),o({type:4,focus:N.Previous});case oe.Home:case oe.PageUp:return e.preventDefault(),e.stopPropagation(),o({type:4,focus:N.First});case oe.End:case oe.PageDown:return e.preventDefault(),e.stopPropagation(),o({type:4,focus:N.Last});case oe.Escape:return e.preventDefault(),e.stopPropagation(),o({type:1}),p.nextFrame(()=>{var e;return null==(e=a.buttonRef.current)?void 0:e.focus({preventScroll:!0})});case oe.Tab:e.preventDefault(),e.stopPropagation();break;default:1===e.key.length&&(o({type:5,value:e.key}),f.setTimeout(()=>o({type:6}),350))}}),x=s(()=>{var e,t,n;return null!=(n=null==(e=a.labelRef.current)?void 0:e.id)?n:null==(t=a.buttonRef.current)?void 0:t.id},[a.labelRef.current,a.buttonRef.current]),E=Object(r.useMemo)(()=>({open:0===a.listboxState}),[a]),O=e;return V({ourProps:{"aria-activedescendant":null===a.activeOptionIndex||null==(n=a.options[a.activeOptionIndex])?void 0:n.id,"aria-multiselectable":1===a.propsRef.current.mode||void 0,"aria-labelledby":x,"aria-orientation":a.orientation,id:d,onKeyDown:g,role:"listbox",tabIndex:0,ref:i},theirProps:O,slot:E,defaultTag:"ul",features:Kt,visible:v,name:"Listbox.Options"})}),Wt=W(function(e,t){let{disabled:n=!1,value:a,...i}=e,[s,c]=Lt("Listbox.Option"),d=`headlessui-listbox-option-${m()}`,p=null!==s.activeOptionIndex&&s.options[s.activeOptionIndex].id===d,{value:f,compare:b}=s.propsRef.current,v=h(s.propsRef.current.mode,{1:()=>f.some(e=>b(e,a)),0:()=>b(f,a)}),y=Object(r.useRef)(null),g=M(t,y);o(()=>{if(0!==s.listboxState||!p||0===s.activationTrigger)return;let e=l();return e.requestAnimationFrame(()=>{var e,t;null==(t=null==(e=y.current)?void 0:e.scrollIntoView)||t.call(e,{block:"nearest"})}),e.dispose},[y,p,s.listboxState,s.activationTrigger,s.activeOptionIndex]);let x=Object(r.useRef)({disabled:n,value:a,domRef:y});o(()=>{x.current.disabled=n},[x,n]),o(()=>{x.current.value=a},[x,a]),o(()=>{var e,t;x.current.textValue=null==(t=null==(e=y.current)?void 0:e.textContent)?void 0:t.toLowerCase()},[x,y]);let E=u(()=>s.propsRef.current.onChange(a));o(()=>(c({type:7,id:d,dataRef:x}),()=>c({type:8,id:d})),[x,d]);let O=u(e=>{if(n)return e.preventDefault();E(),0===s.propsRef.current.mode&&(c({type:1}),l().nextFrame(()=>{var e;return null==(e=s.buttonRef.current)?void 0:e.focus({preventScroll:!0})}))}),w=u(()=>{if(n)return c({type:4,focus:N.Nothing});c({type:4,focus:N.Specific,id:d})}),j=u(()=>{n||p||c({type:4,focus:N.Specific,id:d,trigger:0})}),S=u(()=>{n||!p||c({type:4,focus:N.Nothing})}),k=Object(r.useMemo)(()=>({active:p,selected:v,disabled:n}),[p,v,n]);return V({ourProps:{id:d,ref:g,role:"option",tabIndex:!0===n?void 0:-1,"aria-disabled":!0===n||void 0,"aria-selected":!0===v||void 0,disabled:void 0,onClick:O,onFocus:w,onPointerMove:j,onMouseMove:j,onPointerLeave:S,onMouseLeave:S},theirProps:i,slot:k,defaultTag:"li",name:"Listbox.Option"})}),Ht=Object.assign(zt,{Button:qt,Label:Vt,Options:Ut,Option:Wt});var $t=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))($t||{}),Gt=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(Gt||{}),Yt=(e=>(e[e.OpenMenu=0]="OpenMenu",e[e.CloseMenu=1]="CloseMenu",e[e.GoToItem=2]="GoToItem",e[e.Search=3]="Search",e[e.ClearSearch=4]="ClearSearch",e[e.RegisterItem=5]="RegisterItem",e[e.UnregisterItem=6]="UnregisterItem",e))(Yt||{});function Qt(e,t=(e=>e)){let n=null!==e.activeItemIndex?e.items[e.activeItemIndex]:null,r=P(t(e.items.slice()),e=>e.dataRef.current.domRef.current),a=n?r.indexOf(n):null;return-1===a&&(a=null),{items:r,activeItemIndex:a}}let Jt={1:e=>1===e.menuState?e:{...e,activeItemIndex:null,menuState:1},0:e=>0===e.menuState?e:{...e,menuState:0},2:(e,t)=>{var n;let r=Qt(e),a=B(t,{resolveItems:()=>r.items,resolveActiveIndex:()=>r.activeItemIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.current.disabled});return{...e,...r,searchQuery:"",activeItemIndex:a,activationTrigger:null!=(n=t.trigger)?n:1}},3:(e,t)=>{let n=""!==e.searchQuery?0:1,r=e.searchQuery+t.value.toLowerCase(),a=(null!==e.activeItemIndex?e.items.slice(e.activeItemIndex+n).concat(e.items.slice(0,e.activeItemIndex+n)):e.items).find(e=>{var t;return(null==(t=e.dataRef.current.textValue)?void 0:t.startsWith(r))&&!e.dataRef.current.disabled}),o=a?e.items.indexOf(a):-1;return-1===o||o===e.activeItemIndex?{...e,searchQuery:r}:{...e,searchQuery:r,activeItemIndex:o,activationTrigger:1}},4:e=>""===e.searchQuery?e:{...e,searchQuery:"",searchActiveItemIndex:null},5:(e,t)=>{let n=Qt(e,e=>[...e,{id:t.id,dataRef:t.dataRef}]);return{...e,...n}},6:(e,t)=>{let n=Qt(e,e=>{let n=e.findIndex(e=>e.id===t.id);return-1!==n&&e.splice(n,1),e});return{...e,...n,activationTrigger:1}}},Xt=Object(r.createContext)(null);function Zt(e){let t=Object(r.useContext)(Xt);if(null===t){let t=new Error(`<${e} /> is missing a parent
              component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,Zt),t}return t}function en(e,t){return h(t.type,Jt,e,t)}Xt.displayName="MenuContext";let tn=r.Fragment,nn=W(function(e,t){let n=Object(r.useReducer)(en,{menuState:1,buttonRef:Object(r.createRef)(),itemsRef:Object(r.createRef)(),items:[],searchQuery:"",activeItemIndex:null,activationTrigger:1}),[{menuState:o,itemsRef:i,buttonRef:s},l]=n,c=M(t);_([s,i],(e,t)=>{var n;l({type:1}),S(t,j.Loose)||(e.preventDefault(),null==(n=s.current)||n.focus())},0===o);let u=Object(r.useMemo)(()=>({open:0===o}),[o]),d=e,p={ref:c};return a.a.createElement(Xt.Provider,{value:n},a.a.createElement(ae,{value:h(o,{0:ne.Open,1:ne.Closed})},V({ourProps:p,theirProps:d,slot:u,defaultTag:tn,name:"Menu"})))}),rn=W(function(e,t){var n;let[a,o]=Zt("Menu.Button"),i=M(a.buttonRef,t),s=`headlessui-menu-button-${m()}`,l=c(),d=u(e=>{switch(e.key){case oe.Space:case oe.Enter:case oe.ArrowDown:e.preventDefault(),e.stopPropagation(),o({type:0}),l.nextFrame(()=>o({type:2,focus:N.First}));break;case oe.ArrowUp:e.preventDefault(),e.stopPropagation(),o({type:0}),l.nextFrame(()=>o({type:2,focus:N.Last}))}}),p=u(e=>{switch(e.key){case oe.Space:e.preventDefault()}}),f=u(t=>{if(G(t.currentTarget))return t.preventDefault();e.disabled||(0===a.menuState?(o({type:1}),l.nextFrame(()=>{var e;return null==(e=a.buttonRef.current)?void 0:e.focus({preventScroll:!0})})):(t.preventDefault(),o({type:0})))}),b=Object(r.useMemo)(()=>({open:0===a.menuState}),[a]),v=e;return V({ourProps:{ref:i,id:s,type:F(e,a.buttonRef),"aria-haspopup":!0,"aria-controls":null==(n=a.itemsRef.current)?void 0:n.id,"aria-expanded":e.disabled?void 0:0===a.menuState,onKeyDown:d,onKeyUp:p,onClick:f},theirProps:v,slot:b,defaultTag:"button",name:"Menu.Button"})}),an=z.RenderStrategy|z.Static,on=W(function(e,t){var n,a;let[o,i]=Zt("Menu.Items"),s=M(o.itemsRef,t),d=Re(o.itemsRef),p=`headlessui-menu-items-${m()}`,f=c(),b=re(),v=null!==b?b===ne.Open:0===o.menuState;Object(r.useEffect)(()=>{let e=o.itemsRef.current;!e||0===o.menuState&&e!==(null==d?void 0:d.activeElement)&&e.focus({preventScroll:!0})},[o.menuState,o.itemsRef,d]),L({container:o.itemsRef.current,enabled:0===o.menuState,accept:e=>"menuitem"===e.getAttribute("role")?NodeFilter.FILTER_REJECT:e.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT,walk(e){e.setAttribute("role","none")}});let h=u(e=>{var t,n;switch(f.dispose(),e.key){case oe.Space:if(""!==o.searchQuery)return e.preventDefault(),e.stopPropagation(),i({type:3,value:e.key});case oe.Enter:if(e.preventDefault(),e.stopPropagation(),i({type:1}),null!==o.activeItemIndex){let{dataRef:e}=o.items[o.activeItemIndex];null==(n=null==(t=e.current)?void 0:t.domRef.current)||n.click()}l().nextFrame(()=>{var e;return null==(e=o.buttonRef.current)?void 0:e.focus({preventScroll:!0})});break;case oe.ArrowDown:return e.preventDefault(),e.stopPropagation(),i({type:2,focus:N.Next});case oe.ArrowUp:return e.preventDefault(),e.stopPropagation(),i({type:2,focus:N.Previous});case oe.Home:case oe.PageUp:return e.preventDefault(),e.stopPropagation(),i({type:2,focus:N.First});case oe.End:case oe.PageDown:return e.preventDefault(),e.stopPropagation(),i({type:2,focus:N.Last});case oe.Escape:e.preventDefault(),e.stopPropagation(),i({type:1}),l().nextFrame(()=>{var e;return null==(e=o.buttonRef.current)?void 0:e.focus({preventScroll:!0})});break;case oe.Tab:e.preventDefault(),e.stopPropagation();break;default:1===e.key.length&&(i({type:3,value:e.key}),f.setTimeout(()=>i({type:4}),350))}}),y=u(e=>{switch(e.key){case oe.Space:e.preventDefault()}}),g=Object(r.useMemo)(()=>({open:0===o.menuState}),[o]),x=e;return V({ourProps:{"aria-activedescendant":null===o.activeItemIndex||null==(n=o.items[o.activeItemIndex])?void 0:n.id,"aria-labelledby":null==(a=o.buttonRef.current)?void 0:a.id,id:p,onKeyDown:h,onKeyUp:y,role:"menu",tabIndex:0,ref:s},theirProps:x,slot:g,defaultTag:"div",features:an,visible:v,name:"Menu.Items"})}),sn=r.Fragment,ln=W(function(e,t){let{disabled:n=!1,...a}=e,[i,s]=Zt("Menu.Item"),c=`headlessui-menu-item-${m()}`,d=null!==i.activeItemIndex&&i.items[i.activeItemIndex].id===c,p=Object(r.useRef)(null),f=M(t,p);o(()=>{if(0!==i.menuState||!d||0===i.activationTrigger)return;let e=l();return e.requestAnimationFrame(()=>{var e,t;null==(t=null==(e=p.current)?void 0:e.scrollIntoView)||t.call(e,{block:"nearest"})}),e.dispose},[p,d,i.menuState,i.activationTrigger,i.activeItemIndex]);let b=Object(r.useRef)({disabled:n,domRef:p});o(()=>{b.current.disabled=n},[b,n]),o(()=>{var e,t;b.current.textValue=null==(t=null==(e=p.current)?void 0:e.textContent)?void 0:t.toLowerCase()},[b,p]),o(()=>(s({type:5,id:c,dataRef:b}),()=>s({type:6,id:c})),[b,c]);let v=u(e=>{if(n)return e.preventDefault();s({type:1}),l().nextFrame(()=>{var e;return null==(e=i.buttonRef.current)?void 0:e.focus({preventScroll:!0})})}),h=u(()=>{if(n)return s({type:2,focus:N.Nothing});s({type:2,focus:N.Specific,id:c})}),y=u(()=>{n||d||s({type:2,focus:N.Specific,id:c,trigger:0})}),g=u(()=>{n||!d||s({type:2,focus:N.Nothing})}),x=Object(r.useMemo)(()=>({active:d,disabled:n}),[d,n]);return V({ourProps:{id:c,ref:f,role:"menuitem",tabIndex:!0===n?void 0:-1,"aria-disabled":!0===n||void 0,disabled:void 0,onClick:v,onFocus:h,onPointerMove:y,onMouseMove:y,onPointerLeave:g,onMouseLeave:g},theirProps:a,slot:x,defaultTag:sn,name:"Menu.Item"})}),cn=Object.assign(nn,{Button:rn,Items:on,Item:ln});var un=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(un||{}),dn=(e=>(e[e.TogglePopover=0]="TogglePopover",e[e.ClosePopover=1]="ClosePopover",e[e.SetButton=2]="SetButton",e[e.SetButtonId=3]="SetButtonId",e[e.SetPanel=4]="SetPanel",e[e.SetPanelId=5]="SetPanelId",e))(dn||{});let pn={0:e=>({...e,popoverState:h(e.popoverState,{0:1,1:0})}),1:e=>1===e.popoverState?e:{...e,popoverState:1},2:(e,t)=>e.button===t.button?e:{...e,button:t.button},3:(e,t)=>e.buttonId===t.buttonId?e:{...e,buttonId:t.buttonId},4:(e,t)=>e.panel===t.panel?e:{...e,panel:t.panel},5:(e,t)=>e.panelId===t.panelId?e:{...e,panelId:t.panelId}},fn=Object(r.createContext)(null);function bn(e){let t=Object(r.useContext)(fn);if(null===t){let t=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,bn),t}return t}fn.displayName="PopoverContext";let vn=Object(r.createContext)(null);function mn(e){let t=Object(r.useContext)(vn);if(null===t){let t=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,mn),t}return t}vn.displayName="PopoverAPIContext";let hn=Object(r.createContext)(null);function yn(){return Object(r.useContext)(hn)}hn.displayName="PopoverGroupContext";let gn=Object(r.createContext)(null);function xn(e,t){return h(t.type,pn,e,t)}gn.displayName="PopoverPanelContext";let En=W(function(e,t){var n;let o=`headlessui-popover-button-${m()}`,i=`headlessui-popover-panel-${m()}`,s=Object(r.useRef)(null),l=M(t,D(e=>{s.current=e})),c=Object(r.useReducer)(xn,{popoverState:1,button:null,buttonId:o,panel:null,panelId:i,beforePanelSentinel:Object(r.createRef)(),afterPanelSentinel:Object(r.createRef)()}),[{popoverState:d,button:p,panel:f,beforePanelSentinel:b,afterPanelSentinel:v},y]=c,g=Re(null!=(n=s.current)?n:p);Object(r.useEffect)(()=>y({type:3,buttonId:o}),[o,y]),Object(r.useEffect)(()=>y({type:5,panelId:i}),[i,y]);let x=Object(r.useMemo)(()=>{if(!p||!f)return!1;for(let e of document.querySelectorAll("body > *"))if(Number(null==e?void 0:e.contains(p))^Number(null==e?void 0:e.contains(f)))return!0;return!1},[p,f]),E=Object(r.useMemo)(()=>({buttonId:o,panelId:i,close:()=>y({type:1})}),[o,i,y]),O=yn(),w=null==O?void 0:O.registerPopover,k=u(()=>{var e;return null!=(e=null==O?void 0:O.isFocusWithinPopoverGroup())?e:(null==g?void 0:g.activeElement)&&((null==p?void 0:p.contains(g.activeElement))||(null==f?void 0:f.contains(g.activeElement)))});Object(r.useEffect)(()=>null==w?void 0:w(E),[w,E]),Ie(null==g?void 0:g.defaultView,"focus",e=>{var t,n,r,a;0===d&&(k()||!p||!f||null!=(n=null==(t=b.current)?void 0:t.contains)&&n.call(t,e.target)||null!=(a=null==(r=v.current)?void 0:r.contains)&&a.call(r,e.target)||y({type:1}))},!0),_([p,f],(e,t)=>{y({type:1}),S(t,j.Loose)||(e.preventDefault(),null==p||p.focus())},0===d);let C=u(e=>{y({type:1});let t=e?e instanceof HTMLElement?e:e.current instanceof HTMLElement?e.current:p:p;null==t||t.focus()}),P=Object(r.useMemo)(()=>({close:C,isPortalled:x}),[C,x]),R=Object(r.useMemo)(()=>({open:0===d,close:C}),[d,C]),I=e,A={ref:l};return a.a.createElement(fn.Provider,{value:c},a.a.createElement(vn.Provider,{value:P},a.a.createElement(ae,{value:h(d,{0:ne.Open,1:ne.Closed})},V({ourProps:A,theirProps:I,slot:R,defaultTag:"div",name:"Popover"}))))}),On=W(function(e,t){let[n,o]=bn("Popover.Button"),{isPortalled:i}=mn("Popover.Button"),s=Object(r.useRef)(null),l=`headlessui-focus-sentinel-${m()}`,c=yn(),d=null==c?void 0:c.closeOthers,p=Object(r.useContext)(gn),f=null!==p&&p===n.panelId,b=M(s,t,f?null:e=>o({type:2,button:e})),v=M(s,t),y=Re(s),g=u(e=>{var t,r,a;if(f){if(1===n.popoverState)return;switch(e.key){case oe.Space:case oe.Enter:e.preventDefault(),null==(r=(t=e.target).click)||r.call(t),o({type:1}),null==(a=n.button)||a.focus()}}else switch(e.key){case oe.Space:case oe.Enter:e.preventDefault(),e.stopPropagation(),1===n.popoverState&&(null==d||d(n.buttonId)),o({type:0});break;case oe.Escape:if(0!==n.popoverState)return null==d?void 0:d(n.buttonId);if(!s.current||(null==y?void 0:y.activeElement)&&!s.current.contains(y.activeElement))return;e.preventDefault(),e.stopPropagation(),o({type:1})}}),E=u(e=>{f||e.key===oe.Space&&e.preventDefault()}),O=u(t=>{var r,a;G(t.currentTarget)||e.disabled||(f?(o({type:1}),null==(r=n.button)||r.focus()):(t.preventDefault(),t.stopPropagation(),1===n.popoverState&&(null==d||d(n.buttonId)),o({type:0}),null==(a=n.button)||a.focus()))}),w=u(e=>{e.preventDefault(),e.stopPropagation()}),j=0===n.popoverState,S=Object(r.useMemo)(()=>({open:j}),[j]),k=F(e,s),C=e,P=f?{ref:v,type:k,onKeyDown:g,onClick:O}:{ref:b,id:n.buttonId,type:k,"aria-expanded":e.disabled?void 0:0===n.popoverState,"aria-controls":n.panel?n.panelId:void 0,onKeyDown:g,onKeyUp:E,onClick:O,onMouseDown:w},I=Ce(),_=u(()=>{let e=n.panel;e&&h(I.current,{[ke.Forwards]:()=>R(e,x.First),[ke.Backwards]:()=>R(e,x.Last)})});return a.a.createElement(a.a.Fragment,null,V({ourProps:P,theirProps:C,slot:S,defaultTag:"button",name:"Popover.Button"}),j&&!f&&i&&a.a.createElement(ee,{id:l,features:Z.Focusable,as:"button",type:"button",onFocus:_}))}),wn=z.RenderStrategy|z.Static,jn=W(function(e,t){let[{popoverState:n},a]=bn("Popover.Overlay"),o=M(t),i=`headlessui-popover-overlay-${m()}`,s=re(),l=null!==s?s===ne.Open:0===n;return V({ourProps:{ref:o,id:i,"aria-hidden":!0,onClick:u(e=>{if(G(e.currentTarget))return e.preventDefault();a({type:1})})},theirProps:e,slot:Object(r.useMemo)(()=>({open:0===n}),[n]),defaultTag:"div",features:wn,visible:l,name:"Popover.Overlay"})}),Sn=z.RenderStrategy|z.Static,kn=W(function(e,t){let{focus:n=!1,...o}=e,[i,s]=bn("Popover.Panel"),{close:l,isPortalled:c}=mn("Popover.Panel"),d=`headlessui-focus-sentinel-before-${m()}`,p=`headlessui-focus-sentinel-after-${m()}`,f=Object(r.useRef)(null),b=M(f,t,e=>{s({type:4,panel:e})}),v=Re(f),y=re(),g=null!==y?y===ne.Open:0===i.popoverState,E=u(e=>{var t;switch(e.key){case oe.Escape:if(0!==i.popoverState||!f.current||(null==v?void 0:v.activeElement)&&!f.current.contains(v.activeElement))return;e.preventDefault(),e.stopPropagation(),s({type:1}),null==(t=i.button)||t.focus()}});Object(r.useEffect)(()=>{var t;e.static||1===i.popoverState&&(null==(t=e.unmount)||t)&&s({type:4,panel:null})},[i.popoverState,e.unmount,e.static,s]),Object(r.useEffect)(()=>{if(!n||0!==i.popoverState||!f.current)return;let e=null==v?void 0:v.activeElement;f.current.contains(e)||R(f.current,x.First)},[n,f,i.popoverState]);let O=Object(r.useMemo)(()=>({open:0===i.popoverState,close:l}),[i,l]),j={ref:b,id:i.panelId,onKeyDown:E,onBlur:n&&0===i.popoverState?e=>{var t,n,r,a,o;let l=e.relatedTarget;!l||!f.current||null!=(t=f.current)&&t.contains(l)||(s({type:1}),((null==(r=null==(n=i.beforePanelSentinel.current)?void 0:n.contains)?void 0:r.call(n,l))||(null==(o=null==(a=i.afterPanelSentinel.current)?void 0:a.contains)?void 0:o.call(a,l)))&&l.focus({preventScroll:!0}))}:void 0,tabIndex:-1},S=Ce(),k=u(()=>{let e=f.current;e&&h(S.current,{[ke.Forwards]:()=>{R(e,x.First)},[ke.Backwards]:()=>{var e;null==(e=i.button)||e.focus({preventScroll:!0})}})}),C=u(()=>{let e=f.current;e&&h(S.current,{[ke.Forwards]:()=>{var e,t,n;if(!i.button)return;let r=w(),a=r.indexOf(i.button),o=r.slice(0,a+1),s=[...r.slice(a+1),...o];for(let r of s.slice())if((null==(t=null==(e=null==r?void 0:r.id)?void 0:e.startsWith)?void 0:t.call(e,"headlessui-focus-sentinel-"))||(null==(n=i.panel)?void 0:n.contains(r))){let e=s.indexOf(r);-1!==e&&s.splice(e,1)}R(s,x.First,!1)},[ke.Backwards]:()=>R(e,x.Last)})});return a.a.createElement(gn.Provider,{value:i.panelId},g&&c&&a.a.createElement(ee,{id:d,ref:i.beforePanelSentinel,features:Z.Focusable,as:"button",type:"button",onFocus:k}),V({ourProps:j,theirProps:o,slot:O,defaultTag:"div",features:Sn,visible:g,name:"Popover.Panel"}),g&&c&&a.a.createElement(ee,{id:p,ref:i.afterPanelSentinel,features:Z.Focusable,as:"button",type:"button",onFocus:C}))}),Cn=W(function(e,t){let n=Object(r.useRef)(null),o=M(n,t),[i,s]=Object(r.useState)([]),l=u(e=>{s(t=>{let n=t.indexOf(e);if(-1!==n){let e=t.slice();return e.splice(n,1),e}return t})}),c=u(e=>(s(t=>[...t,e]),()=>l(e))),d=u(()=>{var e;let t=y(n);if(!t)return!1;let r=t.activeElement;return!(null==(e=n.current)||!e.contains(r))||i.some(e=>{var n,a;return(null==(n=t.getElementById(e.buttonId))?void 0:n.contains(r))||(null==(a=t.getElementById(e.panelId))?void 0:a.contains(r))})}),p=u(e=>{for(let t of i)t.buttonId!==e&&t.close()}),f=Object(r.useMemo)(()=>({registerPopover:c,unregisterPopover:l,isFocusWithinPopoverGroup:d,closeOthers:p}),[c,l,d,p]),b=Object(r.useMemo)(()=>({}),[]),v=e,m={ref:o};return a.a.createElement(hn.Provider,{value:f},V({ourProps:m,theirProps:v,slot:b,defaultTag:"div",name:"Popover.Group"}))}),Pn=Object.assign(En,{Button:On,Overlay:jn,Panel:kn,Group:Cn});let Rn=Object(r.createContext)(null);function In(){let e=Object(r.useContext)(Rn);if(null===e){let e=new Error("You used a ","Yoast"),{em:wp.element.createElement("em",null)})),wp.element.createElement("p",null,(0,a.createInterpolateElement)((0,i.sprintf)((0,i.__)("%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s","wordpress-seo-premium"),"","","","","","","Yoast SEO Premium"),{icon:wp.element.createElement(c.default,null),a:wp.element.createElement("a",{href:S,target:"_blank",rel:"noopener noreferrer"}),em:wp.element.createElement("em",null)})),wp.element.createElement("hr",null),wp.element.createElement("ol",{className:"workflow yoast"},wp.element.createElement("li",{className:"step"+(l("cornerstone",x.chooseCornerstones)?" finished faded":"")},wp.element.createElement("h4",null,(0,i.__)("Start: Choose your cornerstones!","wordpress-seo-premium")),wp.element.createElement("div",{className:"workflow__grid"},wp.element.createElement("div",null,wp.element.createElement("p",null,(0,i.__)("Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.","wordpress-seo-premium")),wp.element.createElement("p",null,(0,i.__)("Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!","wordpress-seo-premium"))),wp.element.createElement("div",null,wp.element.createElement("img",{className:"workflow__image",src:"https://yoast.com/shared-assets/images/wpseo_workouts/17-9/motivated_bubble_man_1_optim.svg",width:"100",height:"100",alt:""}))),wp.element.createElement(d.default,{indexables:T.cornerstones,loading:P,setCornerstones:L,isDisabled:l("cornerstone",x.chooseCornerstones)}),wp.element.createElement("br",null),wp.element.createElement(m.default,{onClick:F,isFinished:l("cornerstone",x.chooseCornerstones)})),wp.element.createElement("li",{className:"step"+(l("cornerstone",x.checkLinks)?" finished faded":"")},wp.element.createElement("h4",null,(0,i.__)("Check the number of incoming internal links of your cornerstones","wordpress-seo-premium")),wp.element.createElement("p",null,(0,i.sprintf)((0,i.__)("Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.","wordpress-seo-premium"),"â…")),wp.element.createElement(w.default,{mostLinked:T.mostLinked,cornerstones:T.cornerstones,moveIndexables:E,improvableIds:K,loading:P}),wp.element.createElement("br",null),wp.element.createElement(m.default,{onClick:q,isFinished:l("cornerstone",x.checkLinks)})),wp.element.createElement("li",{className:"step"+(l("cornerstone",x.addLinks)?" finished faded":"")},wp.element.createElement("h4",null,(0,i.__)("Add internal links towards your cornerstones","wordpress-seo-premium")),wp.element.createElement("p",null,(0,i.__)("Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.","wordpress-seo-premium")),wp.element.createElement(h.LinkSuggestions,{indexables:s(y.WORKOUTS.cornerstone,y.STEPS.cornerstone.addLinks),finish:j}),wp.element.createElement("br",null),wp.element.createElement(m.default,{onClick:M,isFinished:l("cornerstone",x.addLinks)})),wp.element.createElement("li",{className:"step"+(o?" finished faded":"")},wp.element.createElement("h4",null,(0,i.__)("Well done!","wordpress-seo-premium")),wp.element.createElement("div",{className:"workflow__grid"},wp.element.createElement("div",null,wp.element.createElement("p",null,(0,i.__)("You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!","wordpress-seo-premium")),wp.element.createElement(u.Button,{className:"yoast-button yoast-button--primary",onClick:U},o?(0,i.__)("Reset this workout","wordpress-seo-premium"):(0,i.__)("I've finished this workout","wordpress-seo-premium"))),wp.element.createElement("div",null,wp.element.createElement("img",{className:"workflow__image",src:"https://yoast.com/shared-assets/images/wpseo_workouts/17-9/fit_bubble_man_1_optim.svg",width:"120",height:"120",alt:"",style:{maxWidth:"120px",maxHeight:"120px"}}))))))}x.propTypes={toggleStep:o.default.func.isRequired,toggleWorkout:o.default.func.isRequired,isWorkoutFinished:o.default.bool.isRequired,isStepFinished:o.default.func.isRequired,getIndexablesByStep:o.default.func.isRequired,moveIndexables:o.default.func.isRequired},t.default=(0,s.compose)([(0,l.withSelect)(function(e){var t=e("yoast-seo/workouts").getWorkouts(),n=e("yoast-seo/workouts").getFinishedWorkouts();return{finishedWorkouts:n,isStepFinished:function(e,n){return t[e].finishedSteps.includes(n)},isWorkoutFinished:n.includes(y.WORKOUTS.cornerstone),getIndexablesByStep:e("yoast-seo/workouts").getIndexablesByStep}}),(0,l.withDispatch)(function(e){var t=e("yoast-seo/workouts");return{toggleStep:t.toggleStep,toggleWorkout:t.toggleWorkout,moveIndexables:t.moveIndexables}})])(x)},181:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=f;var r=n(2),o=n(11),a=p(n(4)),l=n(9),s=n(37),i=p(n(36)),u=p(n(182)),m=n(3),c=n(1);function p(e){return e&&e.__esModule?e:{default:e}}var d=l.interpreters.scoreToRating;function w(e){var t=e.indexable;return wp.element.createElement("tr",null,wp.element.createElement("td",null,wp.element.createElement(o.SvgIcon,(0,s.getIconForScore)(d(t.primary_focus_keyword_score/10)))),wp.element.createElement("td",null,wp.element.createElement(o.SvgIcon,(0,s.getIconForScore)(d(t.readability_score/10)))),wp.element.createElement("td",null,wp.element.createElement("a",{href:t.permalink,target:"_blank",rel:"noopener noreferrer"},(0,s.unescape)(t.breadcrumb_title),wp.element.createElement(i.default,null))),wp.element.createElement("td",null,t.primary_focus_keyword||"-"))}function f(e){var t=e.indexables,n=e.loading,o=e.setCornerstones,a=e.isDisabled,l=(0,r.__)("SEO score","wordpress-seo-premium"),i=(0,r.__)("Readability score","wordpress-seo-premium"),p=(0,m.useCallback)((0,c.debounce)(function(e,t){(0,s.search)(e,t)},500),[]),d=(0,m.useCallback)(function(e){(0,s.enableCornerstone)(e.value,e.type,o)},[o]);return n?wp.element.createElement("div",null,wp.element.createElement("em",null,(0,r.__)("Loading data...","wordpress-seo-premium"))):t.length<=0?wp.element.createElement("div",null,wp.element.createElement("p",null,wp.element.createElement("em",null,(0,r.__)("You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.","wordpress-seo-premium"))),wp.element.createElement(u.default,{value:"",onChange:d,cacheOptions:!0,loadOptions:p,defaultOptions:!0,placeholder:(0,r.__)("Choose cornerstone articles...","wordpress-seo-premium"),isDisabled:a})):wp.element.createElement("div",null,wp.element.createElement("table",{className:"yoast_help"},wp.element.createElement("thead",null,wp.element.createElement("tr",null,wp.element.createElement("th",{className:"manage-column"},wp.element.createElement("span",{"data-label":l,className:"yoast-tooltip yoast-tooltip-n yoast-tooltip-alt"},wp.element.createElement("span",{className:"yoast-column-seo-score yoast-column-header-has-tooltip"},wp.element.createElement("span",{className:"screen-reader-text"},l)))),wp.element.createElement("th",{className:"manage-column"},wp.element.createElement("span",{"data-label":i,className:"yoast-tooltip yoast-tooltip-n yoast-tooltip-alt"},wp.element.createElement("span",{className:"yoast-column-readability yoast-column-header-has-tooltip"},wp.element.createElement("span",{className:"screen-reader-text"},i)))),wp.element.createElement("th",null,(0,r.__)("Article","wordpress-seo-premium")),wp.element.createElement("th",null,(0,r.__)("Focus keyphrase","wordpress-seo-premium")))),wp.element.createElement("tbody",null,t.map(function(e){return wp.element.createElement(w,{key:e.id,indexable:e})}))),wp.element.createElement(u.default,{value:"",onChange:d,cacheOptions:!0,loadOptions:p,defaultOptions:!0,placeholder:(0,r.__)("Choose cornerstone articles...","wordpress-seo-premium"),isDisabled:a}))}f.propTypes={indexables:a.default.arrayOf(a.default.object).isRequired,loading:a.default.bool.isRequired,setCornerstones:a.default.func.isRequired,isDisabled:a.default.bool.isRequired}},182:function(e,t){e.exports=window.yoast.reactSelectAsync},183:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=p;var r=n(2),o=n(11),a=n(37),l=m(n(36)),s=m(n(4)),i=n(3),u=n(49);function m(e){return e&&e.__esModule?e:{default:e}}function c(e){var t=e.indexable,n=e.moveIndexables,s=e.improvableIds,m=(0,i.useCallback)(function(){n(u.WORKOUTS.cornerstone,[t],"",u.STEPS.cornerstone.addLinks)},[n,t]),c=void 0;return c=s.includes(t.id)?wp.element.createElement("em",null,(0,r.__)("Added to next step","wordpress-seo-premium")):wp.element.createElement(o.Button,{onClick:m},(0,r.__)("Optimize","wordpress-seo-premium")),wp.element.createElement("tr",null,wp.element.createElement("td",null,t.incoming_link_count||"0"),wp.element.createElement("td",null,"1"===t.is_cornerstone?"â… ":"",wp.element.createElement("a",{href:t.permalink,target:"_blank",rel:"noopener noreferrer"},(0,a.unescape)(t.breadcrumb_title),wp.element.createElement(l.default,null))),wp.element.createElement("td",null,t.object_sub_type||t.object_type),wp.element.createElement("td",null,"1"===t.is_cornerstone&&c))}function p(e){var t=e.mostLinked,n=e.cornerstones,o=e.moveIndexables,a=e.improvableIds;if(e.loading)return wp.element.createElement("div",null,wp.element.createElement("em",null,(0,r.__)("Loading data...","wordpress-seo-premium")));if(t.length<=0)return wp.element.createElement("p",null,wp.element.createElement("em",null,(0,r.__)("We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.","wordpress-seo-premium")));var l=t.map(function(e){return e.id});return wp.element.createElement("table",{className:"yoast_help"},wp.element.createElement("thead",null,wp.element.createElement("tr",null,wp.element.createElement("th",null,(0,r.__)("Incoming links","wordpress-seo-premium")),wp.element.createElement("th",null,(0,r.__)("Article","wordpress-seo-premium")),wp.element.createElement("th",null,(0,r.__)("Type","wordpress-seo-premium")),wp.element.createElement("th",null,(0,r.__)("Action","wordpress-seo-premium")))),wp.element.createElement("tbody",null,t.map(function(e){return wp.element.createElement(c,{key:e.id,indexable:e,moveIndexables:o,improvableIds:a})}),n.map(function(e){if(!l.includes(e.id))return wp.element.createElement(c,{key:e.id,indexable:e,moveIndexables:o,improvableIds:a})})))}c.propTypes={indexable:s.default.object.isRequired,moveIndexables:s.default.func.isRequired,improvableIds:s.default.array.isRequired},p.propTypes={mostLinked:s.default.arrayOf(s.default.object).isRequired,cornerstones:s.default.arrayOf(s.default.object).isRequired,moveIndexables:s.default.func.isRequired,improvableIds:s.default.array.isRequired,loading:s.default.bool.isRequired}},184:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return wp.element.createElement(o.Alert,{type:"warning"},(0,r.__)("Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.","wordpress-seo-premium"))};var r=n(2),o=n(11)},185:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=u;var r=n(4),o=n(42),a=n(3),l=n(2),s=n(11);function i(){var e=new ClipboardJS(".yoast-copy__button");e.on("success",function(e){var t=(0,l.__)("Copied!","wordpress-seo-premium");e.trigger.focus(),e.trigger.setAttribute("aria-label",t),e.trigger.innerHTML=t,(0,o.speak)(t,"assertive")}),e.on("error",function(e){var t=(0,l.__)("Copy failed","wordpress-seo-premium");e.trigger.setAttribute("aria-label",t),e.trigger.innerHTML=t,(0,o.speak)(t,"assertive")})}function u(e){var t=e.clipboardText;(0,a.useEffect)(i,[]);var n=(0,l.__)("Copy link","wordpress-seo-premium"),r=(0,a.useCallback)(function(e){e.nativeEvent.target.setAttribute("aria-label",n),e.nativeEvent.target.innerText=n},[]);return wp.element.createElement(s.Button,{className:"yoast-copy__button","data-clipboard-text":t,"aria-label":n,onBlur:r},n)}u.propTypes={clipboardText:r.PropTypes.string.isRequired}},186:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=_(n(4)),o=n(3),a=n(5),l=n(20),s=n(2),i=n(11),u=_(n(124)),m=_(n(36)),c=n(125),p=n(49),d=n(187),w=n(126),f=n(188),h=n(189);function _(e){return e&&e.__esModule?e:{default:e}}var y=window.wpseoPremiumWorkoutsData,b=y.seoDataOptimizationNeeded,E=y.orphanedGuide,k=y.orphanedUpdateContent;function v(e){var t=e.toggleStep,n=e.toggleWorkout,r=e.isWorkoutFinished,a=e.isStepFinished,l=e.moveIndexables,_=e.clearIndexablesInSteps,y=e.getIndexablesByStep,v=window.wpseoWorkoutsData.toolsPageUrl,g=p.STEPS.orphaned,S=(0,o.useCallback)(function(){return t(p.WORKOUTS.orphaned,g.improveRemove)},[t]),x=(0,o.useCallback)(function(){return t(p.WORKOUTS.orphaned,g.update)},[t]),R=(0,o.useCallback)(function(){return t(p.WORKOUTS.orphaned,g.addLinks)},[t]),O=(0,o.useCallback)(function(){return n(p.WORKOUTS.orphaned)},[n]),T=(0,o.useCallback)(function(){return _(p.WORKOUTS.orphaned,["removed","noindexed","improved","skipped"])},[_]),C=(0,o.useCallback)(function(e){l(p.WORKOUTS.orphaned,[e],p.STEPS.orphaned.addLinks,p.STEPS.orphaned.improved)},[l]),I=(0,o.useCallback)(function(e){l(p.WORKOUTS.orphaned,[e],p.STEPS.orphaned.addLinks,p.STEPS.orphaned.skipped)},[l]),W=y(p.WORKOUTS.orphaned,p.STEPS.orphaned.improved),P=y(p.WORKOUTS.orphaned,p.STEPS.orphaned.removed),N=y(p.WORKOUTS.orphaned,p.STEPS.orphaned.noindexed),L=y(p.WORKOUTS.orphaned,p.STEPS.orphaned.skipped);return wp.element.createElement("div",{className:"card"},wp.element.createElement("h2",null,(0,s.__)("Orphaned content","wordpress-seo-premium")),wp.element.createElement("h3",null,(0,s.__)("Clean up your unlinked content to make sure people can find it","wordpress-seo-premium")),"1"===b&&wp.element.createElement(c.OrphanedSEODataAlert,{url:v}),wp.element.createElement("p",null,(0,s.__)("You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!","wordpress-seo-premium")),wp.element.createElement("p",null,(0,o.createInterpolateElement)((0,s.sprintf)((0,s.__)("%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s","wordpress-seo-premium"),"","","","","","","Yoast SEO Premium"),{icon:wp.element.createElement(m.default,null),a:wp.element.createElement("a",{href:E,target:"_blank",rel:"noopener noreferrer"}),em:wp.element.createElement("em",null)})),wp.element.createElement("hr",null),wp.element.createElement("ol",{className:"workflow yoast"},wp.element.createElement("li",{className:"step"+(a(p.WORKOUTS.orphaned,g.improveRemove)?" finished faded":"")},wp.element.createElement("h4",null,(0,s.__)("Start: Love it or leave it?","wordpress-seo-premium")),wp.element.createElement("div",{className:"workflow__grid"},wp.element.createElement("div",null,wp.element.createElement("p",null,(0,s.__)("Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?","wordpress-seo-premium"))),wp.element.createElement("div",null,wp.element.createElement("img",{className:"workflow__image",src:"https://yoast.com/shared-assets/images/wpseo_workouts/17-9/motivated_bubble_woman_2_optim.svg",width:"100",height:"100",alt:""}))),wp.element.createElement(h.OrphanedContent,{indexables:y(p.WORKOUTS.orphaned,p.STEPS.orphaned.improveRemove),moveIndexables:l}),wp.element.createElement("br",null),wp.element.createElement(u.default,{onClick:S,isFinished:a(p.WORKOUTS.orphaned,g.improveRemove)})),wp.element.createElement("li",{className:"step"+(a(p.WORKOUTS.orphaned,g.update)?" finished faded":"")},wp.element.createElement("h4",null,(0,s.__)("Should you update your article?","wordpress-seo-premium")),wp.element.createElement("p",null,(0,o.createInterpolateElement)((0,s.sprintf)((0,s.__)("Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).","wordpress-seo-premium"),"",""),{a:wp.element.createElement("a",{href:k,target:"_blank",rel:"noopener noreferrer"})})),wp.element.createElement(d.Improvables,{indexables:y(p.WORKOUTS.orphaned,p.STEPS.orphaned.update),moveIndexables:l}),wp.element.createElement("br",null),wp.element.createElement(u.default,{onClick:x,isFinished:a(p.WORKOUTS.orphaned,g.update)})),wp.element.createElement("li",{className:"step"+(a(p.WORKOUTS.orphaned,g.addLinks)?" finished faded":"")},wp.element.createElement("h4",null,(0,s.__)("Add internal links towards your orphaned articles.","wordpress-seo-premium")),wp.element.createElement("p",null,(0,s.__)("Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.","wordpress-seo-premium")),wp.element.createElement(w.LinkSuggestions,{indexables:y(p.WORKOUTS.orphaned,p.STEPS.orphaned.addLinks),finish:C,skip:I,minimumLinks:2}),wp.element.createElement("br",null),wp.element.createElement(u.default,{onClick:R,isFinished:a(p.WORKOUTS.orphaned,g.addLinks)})),wp.element.createElement("li",{className:"step"+(r?" finished faded":"")},wp.element.createElement("h4",null,(0,s.__)("Well done!","wordpress-seo-premium")),wp.element.createElement("div",{className:"workflow__grid"},wp.element.createElement("div",null,wp.element.createElement("p",null,(0,s.__)("You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!","wordpress-seo-premium"))),wp.element.createElement("div",null,wp.element.createElement("img",{className:"workflow__image",src:"https://yoast.com/shared-assets/images/wpseo_workouts/17-9/fit_bubble_woman_2_optim.svg",width:"120",height:"120",alt:"",style:{maxWidth:"120px",maxHeight:"120px"}}))),wp.element.createElement(f.Summary,{improved:W,removed:P,noindexed:N,skipped:L}),wp.element.createElement("br",null),wp.element.createElement(i.Button,{className:"yoast-button yoast-button--primary orphaned-summary",onClick:O},r?(0,s.__)("Reset this workout","wordpress-seo-premium"):(0,s.__)("I've finished this workout","wordpress-seo-premium"))," ",(W.length>0||P.length>0||N.length>0||L.length>0)&&wp.element.createElement(i.Button,{className:"yoast-button orphaned-summary",onClick:T},(0,s.__)("Clear summary","wordpress-seo-premium")))))}v.propTypes={toggleStep:r.default.func.isRequired,toggleWorkout:r.default.func.isRequired,isStepFinished:r.default.func.isRequired,isWorkoutFinished:r.default.bool.isRequired,getIndexablesByStep:r.default.func.isRequired,moveIndexables:r.default.func.isRequired,clearIndexablesInSteps:r.default.func.isRequired},t.default=(0,l.compose)([(0,a.withSelect)(function(e){var t=e("yoast-seo/workouts").getWorkouts(),n=e("yoast-seo/workouts").getFinishedWorkouts();return{finishedWorkouts:n,isStepFinished:function(e,n){return t[e].finishedSteps.includes(n)},isWorkoutFinished:n.includes(p.WORKOUTS.orphaned),getIndexablesByStep:e("yoast-seo/workouts").getIndexablesByStep}}),(0,a.withDispatch)(function(e){var t=e("yoast-seo/workouts");return{toggleStep:t.toggleStep,toggleWorkout:t.toggleWorkout,moveIndexables:t.moveIndexables,clearIndexablesInSteps:t.clearIndexablesInSteps}})])(v)},187:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Improvables=t.getLastUpdated=void 0;var r=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,a=void 0;try{for(var l,s=e[Symbol.iterator]();!(r=(l=s.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(e){o=!0,a=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw a}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),o=t.getLastUpdated=function(){var e=function(e){return function(){var t=e.apply(this,arguments);return new Promise(function(e,n){return function r(o,a){try{var l=t[o](a),s=l.value}catch(e){return void n(e)}if(!l.done)return Promise.resolve(s).then(function(e){r("next",e)},function(e){r("throw",e)});e(s)}("next")})}}(regeneratorRuntime.mark(function e(t,n){var r,o;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,(0,a.default)({path:"yoast/v1/workouts/last_updated?postId="+t});case 3:return r=e.sent,e.next=6,r.json;case 6:return o=e.sent,n(new Date(o).toDateString()),e.abrupt("return",o);case 11:return e.prev=11,e.t0=e.catch(0),console.error(e.t0.message),e.abrupt("return",!1);case 15:case"end":return e.stop()}},e,this,[[0,11]])}));return function(t,n){return e.apply(this,arguments)}}(),a=f(n(10)),l=n(13),s=n(3),i=n(2),u=n(11),m=f(n(4)),c=n(9),p=n(49),d=n(37),w=f(n(36));function f(e){return e&&e.__esModule?e:{default:e}}var h=c.interpreters.scoreToRating,_=function(e){var t=e.indexable,n=e.moveIndexables,a=(0,s.useState)(!1),m=r(a,2),c=m[0],f=m[1];(0,s.useEffect)(function(){"post"===t.object_type&&(f("Loading..."),o(t.object_id,f))},[t.id]);var _=!!t.purge;return wp.element.createElement("tr",null,wp.element.createElement("td",null,wp.element.createElement(u.SvgIcon,(0,d.getIconForScore)(h(t.primary_focus_keyword_score/10)))),wp.element.createElement("td",null,wp.element.createElement(u.SvgIcon,(0,d.getIconForScore)(h(t.readability_score/10)))),wp.element.createElement("td",null,wp.element.createElement("a",{href:t.permalink,target:"_blank",rel:"noopener noreferrer"},(0,d.unescape)(t.breadcrumb_title),wp.element.createElement(w.default,null))),wp.element.createElement("td",null,c||wp.element.createElement("em",null,(0,i.__)("Unknown","wordpress-seo-premium"))),!_&&wp.element.createElement("td",null,wp.element.createElement(l.CheckboxControl,{onChange:function(){n(p.WORKOUTS.orphaned,[t],p.STEPS.orphaned.update,p.STEPS.orphaned.addLinks)}})),_&&wp.element.createElement("td",null,wp.element.createElement("em",null,(0,i.__)("You've moved this article to the next step.","wordpress-seo-premium"))))};_.propTypes={indexable:m.default.object.isRequired,moveIndexables:m.default.func.isRequired},(t.Improvables=function(e){var t=e.indexables,n=e.moveIndexables,r=(0,i.__)("SEO score","wordpress-seo-premium"),o=(0,i.__)("Readability score","wordpress-seo-premium");return t.length>0?wp.element.createElement("table",{className:"yoast_help"},wp.element.createElement("thead",null,wp.element.createElement("tr",null,wp.element.createElement("th",{className:"manage-column"},wp.element.createElement("span",{"data-label":r,className:"yoast-tooltip yoast-tooltip-n yoast-tooltip-alt"},wp.element.createElement("span",{className:"yoast-column-seo-score yoast-column-header-has-tooltip"},wp.element.createElement("span",{className:"screen-reader-text"},r)))),wp.element.createElement("th",{className:"manage-column"},wp.element.createElement("span",{"data-label":o,className:"yoast-tooltip yoast-tooltip-n yoast-tooltip-alt"},wp.element.createElement("span",{className:"yoast-column-readability yoast-column-header-has-tooltip"},wp.element.createElement("span",{className:"screen-reader-text"},o)))),wp.element.createElement("th",null,(0,i.__)("Article","wordpress-seo-premium")),wp.element.createElement("th",null,(0,i.__)("Last Updated","wordpress-seo-premium")),wp.element.createElement("th",null,(0,i.__)("Is it up-to-date?","wordpress-seo-premium")))),wp.element.createElement("tbody",null,t.map(function(e){return wp.element.createElement(_,{key:"improvable-"+e.id,indexable:e,moveIndexables:n})}))):wp.element.createElement("p",null,wp.element.createElement("em",null,(0,i.__)("You haven't selected any articles for this step yet. You can do so in the previous step.","wordpress-seo-premium")))}).propTypes={indexables:m.default.arrayOf(m.default.object).isRequired,moveIndexables:m.default.func.isRequired}},188:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Summary=void 0;var r=n(2),o=s(n(4)),a=n(37),l=s(n(36));function s(e){return e&&e.__esModule?e:{default:e}}(t.Summary=function(e){var t=e.improved,n=e.removed,o=e.noindexed,s=e.skipped;return t.length>0||n.length>0||o.length>0||s.length>0?wp.element.createElement("table",{className:"yoast_help"},wp.element.createElement("thead",null,wp.element.createElement("tr",null,wp.element.createElement("th",null,(0,r.__)("Article","wordpress-seo-premium")),wp.element.createElement("th",null,(0,r.__)("Resolution","wordpress-seo-premium")))),wp.element.createElement("tbody",null,t.map(function(e){return wp.element.createElement("tr",{key:"improved-"+e.id},wp.element.createElement("td",null,wp.element.createElement("a",{href:e.permalink,target:"_blank",rel:"noopener noreferrer"},(0,a.unescape)(e.breadcrumb_title),wp.element.createElement(l.default,null))),wp.element.createElement("td",null,(0,r.__)("Improved","wordpress-seo-premium")))}),n.map(function(e){return wp.element.createElement("tr",{key:"removed-"+e.id},wp.element.createElement("td",null,wp.element.createElement("a",{href:e.permalink,target:"_blank",rel:"noopener noreferrer"},(0,a.unescape)(e.breadcrumb_title),wp.element.createElement(l.default,null))),wp.element.createElement("td",null,(0,r.__)("Removed","wordpress-seo-premium")))}),o.map(function(e){return wp.element.createElement("tr",{key:"noindexed"+e.id},wp.element.createElement("td",null,wp.element.createElement("a",{href:e.permalink,target:"_blank",rel:"noopener noreferrer"},(0,a.unescape)(e.breadcrumb_title),wp.element.createElement(l.default,null))),wp.element.createElement("td",null,(0,r.__)("Hidden from search engines.","wordpress-seo-premium")))}),s.map(function(e){return wp.element.createElement("tr",{key:"skipped"+e.id},wp.element.createElement("td",null,wp.element.createElement("a",{href:e.permalink,target:"_blank",rel:"noopener noreferrer"},(0,a.unescape)(e.breadcrumb_title),wp.element.createElement(l.default,null))),wp.element.createElement("td",null,(0,r.__)("Skipped","wordpress-seo-premium")))}))):wp.element.createElement("p",null,wp.element.createElement("em",null,(0,r.__)("You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.","wordpress-seo-premium")))}).propTypes={improved:o.default.arrayOf(o.default.object).isRequired,removed:o.default.arrayOf(o.default.object).isRequired,noindexed:o.default.arrayOf(o.default.object).isRequired,skipped:o.default.arrayOf(o.default.object).isRequired}},189:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.OrphanedContent=void 0;var r=function(){var e=function(e){return function(){var t=e.apply(this,arguments);return new Promise(function(e,n){return function r(o,a){try{var l=t[o](a),s=l.value}catch(e){return void n(e)}if(!l.done)return Promise.resolve(s).then(function(e){r("next",e)},function(e){r("throw",e)});e(s)}("next")})}}(regeneratorRuntime.mark(function e(t){var n;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,(0,d.default)({path:"yoast/v1/workouts/noindex",method:"POST",data:{object_id:t.object_id,object_type:t.object_type,object_sub_type:t.object_sub_type}});case 3:return n=e.sent,e.next=6,n.json;case 6:return e.abrupt("return",e.sent);case 9:return e.prev=9,e.t0=e.catch(0),console.error(e.t0.message),e.abrupt("return",!1);case 13:case"end":return e.stop()}},e,this,[[0,9]])}));return function(t){return e.apply(this,arguments)}}(),o=n(3),a=n(2),l=n(11),s=w(n(4)),i=n(9),u=n(49),m=n(37),c=w(n(36)),p=n(190),d=w(n(10));function w(e){return e&&e.__esModule?e:{default:e}}var f=i.interpreters.scoreToRating;(t.OrphanedContent=function(e){var t=e.indexables,n=e.moveIndexables,s=(0,a.__)("SEO score","wordpress-seo-premium"),i=(0,a.__)("Readability score","wordpress-seo-premium");return t.length>0?wp.element.createElement("table",{className:"yoast_help"},wp.element.createElement("thead",null,wp.element.createElement("tr",null,wp.element.createElement("th",{className:"manage-column"},wp.element.createElement("span",{"data-label":s,className:"yoast-tooltip yoast-tooltip-n yoast-tooltip-alt"},wp.element.createElement("span",{className:"yoast-column-seo-score yoast-column-header-has-tooltip"},wp.element.createElement("span",{className:"screen-reader-text"},s)))),wp.element.createElement("th",{className:"manage-column"},wp.element.createElement("span",{"data-label":i,className:"yoast-tooltip yoast-tooltip-n yoast-tooltip-alt"},wp.element.createElement("span",{className:"yoast-column-readability yoast-column-header-has-tooltip"},wp.element.createElement("span",{className:"screen-reader-text"},i)))),wp.element.createElement("th",null,(0,a.__)("Article","wordpress-seo-premium")),wp.element.createElement("th",null,(0,a.__)("Action","wordpress-seo-premium")))),wp.element.createElement("tbody",null,t.slice(0,10).map(function(e){var t=!!e.purge,s=(0,o.useCallback)(function(){n(u.WORKOUTS.orphaned,[e],u.STEPS.orphaned.improveRemove,u.STEPS.orphaned.update)},[n,e]),i=(0,o.useCallback)(function(){window.confirm((0,a.__)("Are you sure you wish to hide this article from search engines?","wordpress-seo-premium"))&&(r(e),n(u.WORKOUTS.orphaned,[e],u.STEPS.orphaned.improveRemove,u.STEPS.orphaned.noindexed))},[n,e]);return wp.element.createElement("tr",{key:"orphaned-"+e.id},wp.element.createElement("td",null,wp.element.createElement(l.SvgIcon,(0,m.getIconForScore)(f(e.primary_focus_keyword_score/10)))),wp.element.createElement("td",null,wp.element.createElement(l.SvgIcon,(0,m.getIconForScore)(f(e.readability_score/10)))),wp.element.createElement("td",null,wp.element.createElement("a",{href:e.permalink,target:"_blank",rel:"noopener noreferrer"},(0,m.unescape)(e.breadcrumb_title),wp.element.createElement(c.default,null))),!t&&wp.element.createElement("td",null,wp.element.createElement(l.Button,{onClick:s},(0,a.__)("Improve","wordpress-seo-premium")),wp.element.createElement(p.RedirectModal,{indexable:e,moveIndexables:n}),wp.element.createElement(l.Button,{onClick:i},(0,a.__)("Hide from search engines","wordpress-seo-premium"))),t&&wp.element.createElement("td",null,wp.element.createElement("em",null,function(e){switch(e){case u.STEPS.orphaned.removed:return(0,a.__)("You've removed this article.","wordpress-seo-premium");case u.STEPS.orphaned.noindexed:return(0,a.__)("You've hidden this article from search engines.","wordpress-seo-premium");case u.STEPS.orphaned.update:return(0,a.__)("You've moved this article to the next step.","wordpress-seo-premium");default:return""}}(e.movedTo))))}))):wp.element.createElement("p",null,wp.element.createElement("em",null,(0,a.__)("Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!","wordpress-seo-premium")))}).propTypes={indexables:s.default.arrayOf(s.default.object).isRequired,moveIndexables:s.default.func.isRequired}},190:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.RedirectModal=void 0;var r=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,a=void 0;try{for(var l,s=e[Symbol.iterator]();!(r=(l=s.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(e){o=!0,a=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw a}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),o=n(13),a=n(3),l=n(2),s=n(11),i=function(e){return e&&e.__esModule?e:{default:e}}(n(4)),u=n(37),m=n(49);(t.RedirectModal=function(e){var t=e.indexable,n=e.moveIndexables,i=window.wpseoWorkoutsData.homeUrl,c=(0,a.useState)(!1),p=r(c,2),d=p[0],w=p[1],f=(0,a.useState)([]),h=r(f,2),_=h[0],y=h[1],b=(0,a.useState)(i),E=r(b,2),k=E[0],v=E[1],g=(0,a.useState)(""),S=r(g,2),x=S[0],R=S[1],O=(0,a.useState)(!0),T=r(O,2),C=T[0],I=T[1],W=(0,a.useState)("yoast-redirect-to-homepage"),P=r(W,2),N=P[0],L=P[1],j=(0,a.useCallback)(function(e){y(e),I(!1)},[L,I]);(0,a.useEffect)(function(){d&&(0,u.getSuggestions)(t,j)},[d]);var q=(0,a.useCallback)(function(){return w(!1)},[]),F=(0,a.useCallback)(function(){return w(!0)},[]),M=(0,a.useCallback)(function(){(0,u.removeAndRedirectIndexable)(t,k),n(m.WORKOUTS.orphaned,[t],m.STEPS.orphaned.improveRemove,m.STEPS.orphaned.removed),q()},[u.removeAndRedirectIndexable,t,k,n,q]),U=(0,a.useCallback)(function(e){v(e.target.value),L("yoast-redirect-to-homepage")},[v,L]),A=(0,a.useCallback)(function(e){v(e.target.value),L("yoast-custom-redirect")},[v,L]),K=(0,a.useCallback)(function(e){R(e.target.value),v(e.target.value),L("yoast-custom-redirect")},[R,v,L]);return wp.element.createElement(a.Fragment,null,wp.element.createElement(s.Button,{onClick:F,className:"yoast__workout__remove-article",style:{color:"red"}},(0,l.__)("Remove","wordpress-seo-premium")),d&&wp.element.createElement(o.Modal,{onRequestClose:q,title:(0,l.__)("SEO Workout: Remove article","wordpress-seo-premium"),className:"yoast__workout",icon:wp.element.createElement("span",{className:"yoast-icon"})},wp.element.createElement("p",null,(0,a.createInterpolateElement)((0,l.sprintf)((0,l.__)("You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?","wordpress-seo-premium"),"",(0,u.unescape)(t.breadcrumb_title),""),{a:wp.element.createElement("a",{href:t.permalink})})),!C&&wp.element.createElement("div",{className:"yoast__redirect-suggestions"},wp.element.createElement("div",null,wp.element.createElement("input",{type:"radio",id:"yoast-redirect-to-homepage",value:i,checked:"yoast-redirect-to-homepage"===N,onChange:U}),wp.element.createElement("label",{htmlFor:"yoast-redirect-to-homepage"},(0,l.__)("Home page:","wordpress-seo-premium")+" ",wp.element.createElement("a",{href:i},i))),_.length>0&&_.map(function(e){return wp.element.createElement("div",{key:"redirect-suggestion-"+e.id},wp.element.createElement("input",{type:"radio",id:"yoast-redirect-to-indexable-"+e.id,value:e.permalink,checked:N==="yoast-redirect-to-indexable-"+e.id,onChange:function(t){v(t.target.value),L("yoast-redirect-to-indexable-"+e.id)}}),wp.element.createElement("label",{htmlFor:"yoast-redirect-to-indexable-"+e.id},(0,l.__)("Related article:","wordpress-seo-premium")+" ",wp.element.createElement("a",{href:e.permalink,target:"_blank",rel:"noopener noreferrer"},e.breadcrumb_title)))}),wp.element.createElement("div",null,wp.element.createElement("input",{type:"radio",id:"yoast-custom-redirect",value:x,checked:"yoast-custom-redirect"===N,onChange:A}),wp.element.createElement("label",{htmlFor:"yoast-custom-redirect"},(0,l.__)("Custom url:","wordpress-seo-premium"),wp.element.createElement("input",{type:"text",onChange:K,value:x}))),wp.element.createElement("br",null),wp.element.createElement(s.Button,{onClick:M,className:"yoast__workout__remove-and-redirect"},(0,l.__)("Remove and redirect","wordpress-seo-premium"))),C&&wp.element.createElement("p",null,wp.element.createElement("em",null,(0,l.__)("Loading redirect options...","wordpress-seo-premium")))))}).propTypes={indexable:i.default.object.isRequired,moveIndexables:i.default.func.isRequired}},2:function(e,t){e.exports=window.wp.i18n},20:function(e,t){e.exports=window.wp.compose},23:function(e,t){e.exports=window.yoast.styleGuide},3:function(e,t){e.exports=window.wp.element},36:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return wp.element.createElement("span",{className:"dashicons dashicons-external",style:{textDecoration:"none",fontSize:"12px",width:"16px",height:"0",lineHeight:"1.4"}})}},37:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removeAndRedirectIndexable=t.getMostLinked=t.search=t.enableCornerstone=t.getCornerstoneData=t.getSuggestions=void 0;t.getSuggestions=function(){var e=l(regeneratorRuntime.mark(function e(t,n){var r,a;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,(0,o.default)({path:"yoast/v1/workouts/link_suggestions?indexableId="+t.id});case 3:return r=e.sent,e.next=6,r.json;case 6:return a=e.sent,n(a),e.abrupt("return",a);case 11:return e.prev=11,e.t0=e.catch(0),n([]),console.error(e.t0.message),e.abrupt("return",!1);case 16:case"end":return e.stop()}},e,this,[[0,11]])}));return function(t,n){return e.apply(this,arguments)}}();var r=t.getCornerstoneData=function(){var e=l(regeneratorRuntime.mark(function e(t){var n,r;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,(0,o.default)({path:"yoast/v1/workouts/cornerstone_data"});case 3:return n=e.sent,e.next=6,n.json;case 6:return r=e.sent,t(r),e.abrupt("return",r);case 11:return e.prev=11,e.t0=e.catch(0),t([]),console.error(e.t0.message),e.abrupt("return",!1);case 16:case"end":return e.stop()}},e,this,[[0,11]])}));return function(t){return e.apply(this,arguments)}}();t.enableCornerstone=function(){var e=l(regeneratorRuntime.mark(function e(t,n,a){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,(0,o.default)({path:"yoast/v1/workouts/enable_cornerstone",method:"POST",data:{object_id:t,object_type:n}});case 3:return e.next=5,r(a);case 5:return e.abrupt("return",e.sent);case 8:return e.prev=8,e.t0=e.catch(0),console.error(e.t0.message),e.abrupt("return",!1);case 12:case"end":return e.stop()}},e,this,[[0,8]])}));return function(t,n,r){return e.apply(this,arguments)}}(),t.search=function(){var e=l(regeneratorRuntime.mark(function e(t,n){var r,a;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,(0,o.default)({path:"wp/v2/search/?search="+t});case 3:return r=e.sent,e.next=6,r;case 6:return a=(a=e.sent).map(function(e){return{value:e.id,label:e.title+" ("+e.url+")",type:e.type}}),n(a),e.abrupt("return",a);case 12:return e.prev=12,e.t0=e.catch(0),n([]),console.error(e.t0.message),e.abrupt("return",!1);case 17:case"end":return e.stop()}},e,this,[[0,12]])}));return function(t,n){return e.apply(this,arguments)}}(),t.getMostLinked=function(){var e=l(regeneratorRuntime.mark(function e(t){var n,r;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,(0,o.default)({path:"yoast/v1/workouts/most_linked"});case 3:return n=e.sent,e.next=6,n.json;case 6:return r=e.sent,t(r),e.abrupt("return",r);case 11:return e.prev=11,e.t0=e.catch(0),t([]),console.error(e.t0.message),e.abrupt("return",!1);case 16:case"end":return e.stop()}},e,this,[[0,11]])}));return function(t){return e.apply(this,arguments)}}(),t.removeAndRedirectIndexable=function(){var e=l(regeneratorRuntime.mark(function e(t,n){var r;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,(0,o.default)({path:"yoast/v1/workouts/remove_redirect",method:"POST",data:{object_id:t.object_id,object_type:t.object_type,object_sub_type:t.object_sub_type,permalink:t.permalink,redirect_url:n}});case 3:return r=e.sent,e.next=6,r.json;case 6:return e.abrupt("return",e.sent);case 9:return e.prev=9,e.t0=e.catch(0),console.error(e.t0.message),e.abrupt("return",!1);case 13:case"end":return e.stop()}},e,this,[[0,9]])}));return function(t,n){return e.apply(this,arguments)}}();t.unescape=function(e){return jQuery("
              ").html(e).text()},t.getIconForScore=function(e){var t={icon:"circle",color:a.colors.$color_grey_disabled};switch(e){case"loading":t.color=a.colors.$color_green_medium_light;break;case"good":t.color=a.colors.$color_green_medium;break;case"ok":t.color=a.colors.$color_ok;break;case"bad":t.color=a.colors.$color_red}return t};var o=function(e){return e&&e.__esModule?e:{default:e}}(n(10)),a=n(23);function l(e){return function(){var t=e.apply(this,arguments);return new Promise(function(e,n){return function r(o,a){try{var l=t[o](a),s=l.value}catch(e){return void n(e)}if(!l.done)return Promise.resolve(s).then(function(e){r("next",e)},function(e){r("throw",e)});e(s)}("next")})}}},4:function(e,t){e.exports=window.yoast.propTypes},42:function(e,t){e.exports=window.wp.a11y},49:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.WORKOUTS={cornerstone:"cornerstone",orphaned:"orphaned"};var r=t.STEPS={cornerstone:{chooseCornerstones:"chooseCornerstones",checkLinks:"checkLinks",addLinks:"addLinks",improved:"improved",skipped:"skipped"},orphaned:{improveRemove:"improveRemove",update:"update",addLinks:"addLinks",removed:"removed",noindexed:"noindexed",improved:"improved",skipped:"skipped"}};t.FINISHABLE_STEPS={cornerstone:[r.cornerstone.chooseCornerstones,r.cornerstone.checkLinks,r.cornerstone.addLinks],orphaned:[r.orphaned.improveRemove,r.orphaned.update,r.orphaned.addLinks]}},5:function(e,t){e.exports=window.wp.data},9:function(e,t){e.exports=window.yoast.analysis}},[[179,0]]]); \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-admin-redirects-2200.min.js b/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-admin-redirects-2200.min.js deleted file mode 100644 index bd4943e9..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-admin-redirects-2200.min.js +++ /dev/null @@ -1 +0,0 @@ -(window.yoastPremiumWebpackJsonp=window.yoastPremiumWebpackJsonp||[]).push([[3],{10:function(e,t){e.exports=window.wp.apiFetch},155:function(e,t,r){"use strict";var i=r(24),o=a(r(156)),n=a(r(157)),s=a(r(158));function a(e){return e&&e.__esModule?e:{default:e}}!function(e){var t=1,r=2,a=0,d=13,l=window.wpseoAdminRedirect.homeUrl||"",c=function(e){return e&&"/"===e.charAt(0)?e.slice(1):e},p=new s.default;e.widget("ui.dialog",e.ui.dialog,{_createOverlay:function(){this._super(),this.options.modal&&this._on(this.overlay,{click:function(e){this.close(e)}})}}),e.fn.wpseoRedirects=function(s){var u=this,h=s.replace("table-",""),g=!1,f=void 0,m=null,w=function(){g=!1,f=null},v=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=e.buttonValue,i=e.className;return{text:r,class:void 0===i?"button":i,click:function(){null!==t&&t(),jQuery(this).dialog("close")}}};this.getButtons=function(e){return"default"===e?[v({buttonValue:wpseoPremiumStrings.button_ok})]:[v({buttonValue:wpseoPremiumStrings.button_cancel},function(){w()}),v({buttonValue:wpseoPremiumStrings.button_save_anyway,className:"button-primary"},function(){g=!0,f(),w()})]},this.rowCells=function(e){var i=e.find(".val");return{origin:i.eq(t),target:i.eq(r),type:i.eq(a)}},this.dialog=function(t,r,i){void 0!==i&&"error"!==i||(i="default");var o=this.getButtons(i);e("#YoastRedirectDialogText").html(r),e("#YoastRedirectDialog").dialog({title:t,width:500,draggable:!1,resizable:!1,position:{at:"center center",my:"center center",of:window},buttons:o,modal:!0,close:function(){m&&m.trigger("focus")}})},this.openDialog=function(e){this.dialog(e.title,e.message)},this.post=function(t,r){e.post(ajaxurl,t,r,"json")},this.editRow=function(t){e("#the-list").find("#inline-edit").length>0?this.dialog(wpseoPremiumStrings.edit_redirect,wpseoPremiumStrings.editing_redirect):(p.setup(t,this.rowCells(t)),p.show(),new o.default(p.quickEditRow).getTypeField().trigger("change"))},this.prepareNewUrl=function(t,r){var i=["val"];return r.isTargetRelative&&"/"!==t||i.push("remove-slashes"),r.hasTrailingSlash&&i.push("has-trailing-slash"),t?e("").addClass(i.join(" ")).attr({href:_.escape(l+c(t)),target:"_blank"}).html(_.escape(t)):e("
              ").addClass("val remove-slashes")},this.createRedirectRow=function(t,r,i,o){var n=e("#the-list tr").length+1;return e("").append(e("").addClass("check-column").attr("scope","row").append(e("
              ").addClass("val type").html(_.escape(i))).append(e("
              ").addClass("row-actions").append(e("").addClass("edit").append(e("").attr({href:"#",role:"button",class:"redirect-edit"}).html(wpseoPremiumStrings.editAction)).append(" | ")).append(e("").addClass("trash").append(e("").attr({href:"#",role:"button",class:"redirect-delete"}).html(wpseoPremiumStrings.deleteAction))))).append(e("").addClass("column-old").append("regex"===h?e("
              ").addClass("val remove-slashes").html(_.escape(t)):e("").addClass("val").attr({href:_.escape(l+c(t)),target:"_blank"}).html(_.escape(t)))).append(e("").addClass("column-new").append(this.prepareNewUrl(r,o)))},this.handleError=function(e,t){e.addValidationError(t.message,t.fields),"warning"===t.type&&u.dialog(wpseoPremiumStrings.error_saving_redirect,t.message,t.type)},this.addRedirect=function(){var t=new o.default(e(".wpseo-new-redirect-form")),r=new n.default(t,h);if(!1===r.validate())return!1;var i=r.getFormValues();return u.post({action:"wpseo_add_redirect_"+h,ajax_nonce:e(".wpseo_redirects_ajax_nonce").val(),redirect:{origin:encodeURIComponent(i.origin),target:encodeURIComponent(i.target),type:i.type},ignore_warning:g},function(i){if(i.error)return u.handleError(r,i.error),!0;t.getOriginField().val(""),t.getTargetField().val(""),u.find(".no-items").remove();var o=u.createRedirectRow(i.origin,i.target,i.type,i.info);e("form#"+h).find("#the-list").prepend(o),u.openDialog(wpseoPremiumStrings.redirect_added)}),!0},this.updateRedirect=function(){var t=new o.default(p.getForm()),r=new n.default(t,h);if(!1===r.validate())return!1;var i=r.getFormValues(),s=p.getRow(),a=this.rowCells(s);return u.post({action:"wpseo_update_redirect_"+h,ajax_nonce:e(".wpseo_redirects_ajax_nonce").val(),old_redirect:{origin:encodeURIComponent(a.origin.html()),target:encodeURIComponent(a.target.html()),type:encodeURIComponent(a.type.html())},new_redirect:{origin:encodeURIComponent(i.origin),target:encodeURIComponent(i.target),type:encodeURIComponent(i.type)},ignore_warning:g},function(t){if(t.error)return u.handleError(r,t.error),!0;if(a.origin.html(_.escape(t.origin)),"regex"!==h&&a.origin.attr("href",_.escape(l+t.origin)),a.target.html(_.escape(t.target)),410===t.type||451===t.type)a.target.replaceWith(e("
              ").addClass("val remove-slashes"));else{var i="/"===t.target?"val remove-slashes":"val";a.target.replaceWith(e("").addClass(i).attr({href:_.escape(l+c(t.target)),target:"_blank"}).html(_.escape(t.target)))}a.type.html(_.escape(t.type)),p.remove(),u.openDialog(wpseoPremiumStrings.redirect_updated)}),!0},this.deleteRedirect=function(t){var r=this,o=this.rowCells(t),n=o.origin.text(),s=o.target.text(),a=o.type.html();(0,i.wpseoDeleteRedirect)(n,s,a,h).then(function(r){t.fadeTo("fast",0).slideUp(function(){e(this).remove()}),u.openDialog(r)}).catch(function(e){r.dialog(e.title,e.message,"error")})},this.setup=function(){var t=void 0;e("body").append('
              '),e(window).on("beforeunload",function(){if(e("#the-list").find("#inline-edit").length>0)return wpseoPremiumStrings.unsaved_redirects}),e(".redirect-table-tab").on("change","select[name=wpseo_redirects_type]",function(t){var r=parseInt(e(t.target).val(),10),o=e(t.target).closest(".wpseo_redirect_form").find(".wpseo_redirect_target_holder");jQuery.inArray(r,i.ALLOW_EMPTY_TARGET)>-1?e(o).hide():e(o).show()}),e(".wpseo-new-redirect-form").on("click",".button-primary",function(){return f=function(){u.addRedirect()},u.addRedirect(),m=e(this),!1}).on("keypress","input",function(e){e.which===d&&(f=function(){u.addRedirect()},e.preventDefault(),u.addRedirect())}),e(".wp-list-table").on("click",".redirect-edit",function(r){t=e(r.target).closest("tr"),r.preventDefault(),u.editRow(t),m=e(this)}).on("click",".redirect-delete",function(r){t=e(r.target).closest("tr"),r.preventDefault(),u.deleteRedirect(t),m=e("#cb-select-all-1")}).on("keypress","input",function(e){e.which===d&&(f=function(){u.updateRedirect()},e.preventDefault(),u.updateRedirect())}).on("click",".save",function(){(f=function(){u.updateRedirect()})()}).on("click",".cancel",function(){f=null,p.remove(),t.find(".redirect-edit").trigger("focus")})},u.setup()},e(function(){e.each(e(".redirect-table-tab"),function(t,r){e(r).wpseoRedirects(e(r).attr("id"))})})}(jQuery)},156:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(e){this.form=e};i.prototype.getOriginField=function(){return this.form.find("input[name=wpseo_redirects_origin]")},i.prototype.getTargetField=function(){return this.form.find("input[name=wpseo_redirects_target]")},i.prototype.getTypeField=function(){return this.form.find("select[name=wpseo_redirects_type]")},i.prototype.clearErrorMessage=function(){this.form.find(".wpseo_redirect_form .form_error").remove()},i.prototype.setErrorMessage=function(e){this.form.find(".wpseo_redirect_form").prepend('

              '+e+"

              ")},i.prototype.removeRowHighlights=function(){this.form.find(".redirect_form_row").removeClass("field_error")},i.prototype.highLightRowErrors=function(e){for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:null;this.form.setErrorMessage(e),void 0!==t&&this.form.highLightRowErrors(t)},o.prototype.getFormValues=function(){var e={origin:this.form.getOriginField().val().toString(),target:this.form.getTargetField().val().toString(),type:this.form.getTypeField().val().toString()};return jQuery.inArray(parseInt(e.type,10),i.ALLOW_EMPTY_TARGET)>-1&&(e.target=""),e},t.default=o},158:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){this.row=null,this.quickEditRow=null,this.templateQuickEdit=wp.template("redirects-inline-edit")};i.prototype.setup=function(e,t){this.row=e,this.quickEditRow=jQuery(this.templateQuickEdit({origin:_.unescape(t.origin.html()),target:_.unescape(t.target.html()),type:parseInt(t.type.html(),10),suffix:jQuery("#the-list").find("tr").index(e)}))},i.prototype.getRow=function(){return this.row},i.prototype.getForm=function(){return this.quickEditRow},i.prototype.show=function(){this.row.addClass("hidden"),this.quickEditRow.insertAfter(this.row).show(400,function(){jQuery(this).find(":input").first().trigger("focus")})},i.prototype.remove=function(){this.row.removeClass("hidden"),this.quickEditRow.remove()},t.default=i},24:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ALLOW_EMPTY_TARGET=void 0,t.wpseoDeleteRedirect=o,t.wpseoUndoRedirectForObject=n,t.wpseoRemoveNotification=s,t.wpseoUndoRedirect=function(e,t,r,i,n){o(e,t,r).then(function(e){!0===e.success&&s(n)})},t.wpseoUndoRedirectByObjectId=function(e,t,r){n(e,t).then(function(e){!0===e.success&&s(r)})},t.wpseoCreateRedirect=function(e,t,r,i){var o="";if(410!==parseInt(t,10)&&""===(o=window.prompt(wpseoPremiumStrings.enter_new_url.replace("%s",e))))return void window.alert(wpseoPremiumStrings.error_new_url);jQuery.post(ajaxurl,{action:"wpseo_add_redirect_plain",ajax_nonce:r,redirect:{origin:e,target:o,type:t}},function(e){var r=jQuery(i).closest(".yoast-notification");if(jQuery(r).removeClass("updated").removeClass("error"),jQuery(r).find(".redirect_error").remove(),e.error)jQuery(r).addClass("error").prepend('

              '+e.error.message+"

              ");else{var o="";o=(o=410===parseInt(t,10)?_.escape(wpseoPremiumStrings.redirect_saved_no_target):wpseoPremiumStrings.redirect_saved.replace("%2$s",""+_.escape(e.target)+"")).replace("%1$s",""+_.escape(e.origin)+""),jQuery(r).addClass("updated").html("

              "+o+"

              ")}},"json")};var i=function(e){return e&&e.__esModule?e:{default:e}}(r(10));t.ALLOW_EMPTY_TARGET=[410,451];function o(e,t,r){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"plain";return(0,i.default)({method:"POST",url:wpApiSettings.root+"yoast/v1/redirects/delete",headers:{"X-WP-Nonce":wpApiSettings.nonce},data:{origin:e,target:t,type:r,format:o}})}function n(e,t){return(0,i.default)({method:"POST",url:wpApiSettings.root+"yoast/v1/redirects/undo-for-object",headers:{"X-WP-Nonce":wpApiSettings.nonce},data:{obj_id:e,obj_type:t}})}function s(e){jQuery(e).closest(".yoast-notification").fadeOut("slow")}}},[[155,0]]]); \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-custom-fields-plugin-2200.min.js b/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-custom-fields-plugin-2200.min.js deleted file mode 100644 index c0c2cec6..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-custom-fields-plugin-2200.min.js +++ /dev/null @@ -1 +0,0 @@ -(window.yoastPremiumWebpackJsonp=window.yoastPremiumWebpackJsonp||[]).push([[4],{159:function(t,s,e){"use strict";!function(){var t=function(){YoastSEO.app.registerPlugin("YoastCustomFieldsPlugin",{status:"loading"}),this.customFields={},this.updateCustomFields(),this.declareReady()};t.prototype.declareReady=function(){YoastSEO.app.pluginReady("YoastCustomFieldsPlugin"),YoastSEO.app.registerModification("content",this.addCustomFields.bind(this),"YoastCustomFieldsPlugin")},t.prototype.declareReloaded=function(){YoastSEO.app.pluginReloaded("YoastCustomFieldsPlugin")},t.prototype.addCustomFields=function(t){for(var s in this.customFields)t+=" ",t+=this.customFields[s];return t},t.prototype.updateCustomFields=function(){var t={};jQuery("#the-list > tr:visible").each(function(s,e){var o=jQuery("#"+e.id+"-key").val();-1!==YoastCustomFieldsPluginL10.custom_field_names.indexOf(o)&&(t[o]=jQuery("#"+e.id+"-value").val())}),this.customFields=t,this.declareReloaded(),this.bindCustomFields()},t.prototype.bindCustomFields=function(){var t=_.debounce(this.updateCustomFields.bind(this),500,!0);jQuery("#the-list .button + .update_meta").off("click.wpseoCustomFields").on("click.wpseoCustomFields",t),jQuery("#the-list").off("wpListDelEnd.wpseoCustomFields").on("wpListDelEnd.wpseoCustomFields",t),jQuery("#the-list").off("wpListAddEnd.wpseoCustomFields").on("wpListAddEnd.wpseoCustomFields",t),jQuery("#the-list textarea").off("input.wpseoCustomFields").on("input.wpseoCustomFields",t)},"undefined"!=typeof YoastSEO&&void 0!==YoastSEO.app?new t:jQuery(window).on("YoastSEO:ready",function(){new t})}()}},[[159,0]]]); \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-draft-js-plugins-2200.min.js b/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-draft-js-plugins-2200.min.js deleted file mode 100644 index c973912b..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-draft-js-plugins-2200.min.js +++ /dev/null @@ -1 +0,0 @@ -(window.yoastPremiumWebpackJsonp=window.yoastPremiumWebpackJsonp||[]).push([[9],{13:function(e,t){e.exports=window.wp.components},168:function(e,t,o){"use strict";var i=o(13),n=o(3),s=o(21),m=function(e){return e&&e.__esModule?e:{default:e}}(o(4));var a=function(e){var t=e.pluginList,o=e.fieldId;if(window.yoast.draftJsEmoji){window.yoast.draftJsEmoji.defaultTheme.customClassesSet||(window.yoast.draftJsEmoji.defaultTheme.emojiSelectButton="emoji-select-button",window.yoast.draftJsEmoji.defaultTheme.emojiSelectButtonPressed="emoji-select-button emoji-select-button-pressed",window.yoast.draftJsEmoji.defaultTheme.emojiSelectPopover+=" emoji-select-popover",window.yoast.draftJsEmoji.defaultTheme.emojiSelectPopoverNav+=" emoji-select-popover-nav",window.yoast.draftJsEmoji.defaultTheme.emojiSuggestionsEntry+=" emoji-suggestion-item-wrapper",window.yoast.draftJsEmoji.defaultTheme.emojiSuggestionsEntryFocused+=" emoji-suggestion-item-wrapper",window.yoast.draftJsEmoji.defaultTheme.emojiSuggestionsEntryText+=" emoji-suggestion-item-text",window.yoast.draftJsEmoji.defaultTheme.emojiSelectPopoverGroupItem+=" single-emoji",window.yoast.draftJsEmoji.defaultTheme.emojiSuggestions+=" emoji-suggestions",window.yoast.draftJsEmoji.defaultTheme.customClassesSet=!0);var s=t.emojiPlugin,m=s.EmojiSelect,a=s.EmojiSuggestions;return wp.element.createElement(n.Fragment,null,wp.element.createElement(i.Fill,{name:"PluginComponent-"+o},wp.element.createElement(m,{closeOnEmojiSelect:!0})),wp.element.createElement(a,null))}return wp.element.createElement(n.Fragment,null)};a.propTypes={pluginList:m.default.object.isRequired,fieldId:m.default.string.isRequired};var r=function(){return wp.element.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"1.5"},wp.element.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14.828 14.828a4 4 0 01-5.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"}))};(0,s.addFilter)("yoast.replacementVariableEditor.additionalPlugins","yoast/yoast-seo-premium/EmojiSelect",function(e,t,o){return wp.element.createElement(a,{key:o+"-emoji",pluginList:t,fieldId:o})},Number.MAX_SAFE_INTEGER),(0,s.addFilter)("yoast.replacementVariableEditor.pluginList","yoast/yoast-seo-premium/EmojiSelectLoad",function(e){return window.yoast.draftJsEmoji&&!e.emojiPlugin&&(e.emojiPlugin=window.yoast.draftJsEmoji.createEmojiPlugin({selectButtonContent:wp.element.createElement(r,null),useNativeArt:!0,theme:window.yoast.draftJsEmoji.defaultTheme})),e},Number.MAX_SAFE_INTEGER)},21:function(e,t){e.exports=window.wp.hooks},3:function(e,t){e.exports=window.wp.element},4:function(e,t){e.exports=window.yoast.propTypes}},[[168,0]]]); \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-elementor-2200.min.js b/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-elementor-2200.min.js deleted file mode 100644 index 29adfb8d..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-elementor-2200.min.js +++ /dev/null @@ -1 +0,0 @@ -(window.yoastPremiumWebpackJsonp=window.yoastPremiumWebpackJsonp||[]).push([[14],[function(e,t){e.exports=React},function(e,t){e.exports=window.lodash},function(e,t){e.exports=window.wp.i18n},function(e,t){e.exports=window.wp.element},function(e,t){e.exports=window.yoast.propTypes},function(e,t){e.exports=window.wp.data},,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.STORE_NAME_EDITOR={free:"yoast-seo/editor",premium:"yoast-seo-premium/editor"},t.ASYNC_ACTION_NAMES={request:"request",success:"success",error:"error"},t.ASYNC_ACTION_STATUS={idle:"idle",loading:"loading",success:"success",error:"error"},t.VIDEO_FLOW={showPlay:"showPlay",askPermission:"askPermission",isPlaying:"isPlaying"}},function(e,t){e.exports=window.yoast.reduxJsToolkit},function(e,t){e.exports=window.yoast.analysis},function(e,t){e.exports=window.wp.apiFetch},function(e,t){e.exports=window.yoast.componentsNew},,function(e,t){e.exports=window.wp.components},function(e,t){e.exports=window.yoast.styledComponents},,function(e,t){e.exports=window.yoast.helpers},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(29);Object.defineProperty(t,"adminUrlActions",{enumerable:!0,get:function(){return r.adminUrlActions}}),Object.defineProperty(t,"adminUrlReducer",{enumerable:!0,get:function(){return r.adminUrlReducer}}),Object.defineProperty(t,"getInitialAdminUrlState",{enumerable:!0,get:function(){return r.getInitialAdminUrlState}}),Object.defineProperty(t,"ADMIN_URL_NAME",{enumerable:!0,get:function(){return r.ADMIN_URL_NAME}}),Object.defineProperty(t,"adminUrlSelectors",{enumerable:!0,get:function(){return r.adminUrlSelectors}});var o=n(30);Object.defineProperty(t,"getInitialHasAiGeneratorConsentState",{enumerable:!0,get:function(){return o.getInitialHasAiGeneratorConsentState}}),Object.defineProperty(t,"hasAiGeneratorConsentReducer",{enumerable:!0,get:function(){return o.hasAiGeneratorConsentReducer}}),Object.defineProperty(t,"hasAiGeneratorConsentActions",{enumerable:!0,get:function(){return o.hasAiGeneratorConsentActions}}),Object.defineProperty(t,"hasAiGeneratorConsentControls",{enumerable:!0,get:function(){return o.hasAiGeneratorConsentControls}}),Object.defineProperty(t,"HAS_AI_GENERATOR_CONSENT_NAME",{enumerable:!0,get:function(){return o.HAS_AI_GENERATOR_CONSENT_NAME}}),Object.defineProperty(t,"hasAiGeneratorConsentSelectors",{enumerable:!0,get:function(){return o.hasAiGeneratorConsentSelectors}});var i=n(31);Object.defineProperty(t,"pluginUrlSelectors",{enumerable:!0,get:function(){return i.pluginUrlSelectors}}),Object.defineProperty(t,"getInitialPluginUrlState",{enumerable:!0,get:function(){return i.getInitialPluginUrlState}}),Object.defineProperty(t,"PLUGIN_URL_NAME",{enumerable:!0,get:function(){return i.PLUGIN_URL_NAME}}),Object.defineProperty(t,"pluginUrlReducer",{enumerable:!0,get:function(){return i.pluginUrlReducer}}),Object.defineProperty(t,"pluginUrlActions",{enumerable:!0,get:function(){return i.pluginUrlActions}});var s=n(32);Object.defineProperty(t,"linkParamsSelectors",{enumerable:!0,get:function(){return s.linkParamsSelectors}}),Object.defineProperty(t,"getInitialLinkParamsState",{enumerable:!0,get:function(){return s.getInitialLinkParamsState}}),Object.defineProperty(t,"LINK_PARAMS_NAME",{enumerable:!0,get:function(){return s.LINK_PARAMS_NAME}}),Object.defineProperty(t,"linkParamsReducer",{enumerable:!0,get:function(){return s.linkParamsReducer}}),Object.defineProperty(t,"linkParamsActions",{enumerable:!0,get:function(){return s.linkParamsActions}});var a=n(33);Object.defineProperty(t,"WISTIA_EMBED_PERMISSION_NAME",{enumerable:!0,get:function(){return a.WISTIA_EMBED_PERMISSION_NAME}}),Object.defineProperty(t,"wistiaEmbedPermissionActions",{enumerable:!0,get:function(){return a.wistiaEmbedPermissionActions}}),Object.defineProperty(t,"getInitialWistiaEmbedPermissionState",{enumerable:!0,get:function(){return a.getInitialWistiaEmbedPermissionState}}),Object.defineProperty(t,"wistiaEmbedPermissionSelectors",{enumerable:!0,get:function(){return a.wistiaEmbedPermissionSelectors}}),Object.defineProperty(t,"wistiaEmbedPermissionControls",{enumerable:!0,get:function(){return a.wistiaEmbedPermissionControls}}),Object.defineProperty(t,"wistiaEmbedPermissionReducer",{enumerable:!0,get:function(){return a.wistiaEmbedPermissionReducer}})},,function(e,t){e.exports=window.wp.url},function(e,t){e.exports=window.wp.compose},function(e,t){e.exports=window.wp.hooks},function(e,t,n){"use strict";function r(e){return function(){return e}}var o=function(){};o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(e){return e},e.exports=o},function(e,t){e.exports=window.yoast.styleGuide},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ALLOW_EMPTY_TARGET=void 0,t.wpseoDeleteRedirect=o,t.wpseoUndoRedirectForObject=i,t.wpseoRemoveNotification=s,t.wpseoUndoRedirect=function(e,t,n,r,i){o(e,t,n).then(function(e){!0===e.success&&s(i)})},t.wpseoUndoRedirectByObjectId=function(e,t,n){i(e,t).then(function(e){!0===e.success&&s(n)})},t.wpseoCreateRedirect=function(e,t,n,r){var o="";if(410!==parseInt(t,10)&&""===(o=window.prompt(wpseoPremiumStrings.enter_new_url.replace("%s",e))))return void window.alert(wpseoPremiumStrings.error_new_url);jQuery.post(ajaxurl,{action:"wpseo_add_redirect_plain",ajax_nonce:n,redirect:{origin:e,target:o,type:t}},function(e){var n=jQuery(r).closest(".yoast-notification");if(jQuery(n).removeClass("updated").removeClass("error"),jQuery(n).find(".redirect_error").remove(),e.error)jQuery(n).addClass("error").prepend('

              '+e.error.message+"

              ");else{var o="";o=(o=410===parseInt(t,10)?_.escape(wpseoPremiumStrings.redirect_saved_no_target):wpseoPremiumStrings.redirect_saved.replace("%2$s",""+_.escape(e.target)+"")).replace("%1$s",""+_.escape(e.origin)+""),jQuery(n).addClass("updated").html("

              "+o+"

              ")}},"json")};var r=function(e){return e&&e.__esModule?e:{default:e}}(n(10));t.ALLOW_EMPTY_TARGET=[410,451];function o(e,t,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"plain";return(0,r.default)({method:"POST",url:wpApiSettings.root+"yoast/v1/redirects/delete",headers:{"X-WP-Nonce":wpApiSettings.nonce},data:{origin:e,target:t,type:n,format:o}})}function i(e,t){return(0,r.default)({method:"POST",url:wpApiSettings.root+"yoast/v1/redirects/undo-for-object",headers:{"X-WP-Nonce":wpApiSettings.nonce},data:{obj_id:e,obj_type:t}})}function s(e){jQuery(e).closest(".yoast-notification").fadeOut("slow")}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=a(n(0)),i=a(n(38)),s=a(n(41));function a(e){return e&&e.__esModule?e:{default:e}}var u=void 0;function l(e,t){var n,s,a,c,d,p,f,m,y=[],g={};for(p=0;p "+u);if("componentClose"===d.type)throw new Error("Missing opening component token: `"+d.value+"`");if("componentOpen"===d.type){n=t[d.value],a=p;break}y.push(t[d.value])}else y.push(d.value);return n&&(c=function(e,t){var n,r,o=t[e],i=0;for(r=e+1;r2&&void 0!==arguments[2]?arguments[2]:"assets/images"},function(e,t){return t}],function(e,t,n){return[(0,o.trimEnd)(e,"/"),(0,o.trim)(t,"/"),(0,o.trimStart)(n,"/")].join("/")});t.pluginUrlActions=s.actions,t.pluginUrlReducer=s.reducer},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.linkParamsReducer=t.linkParamsActions=t.linkParamsSelectors=t.getInitialLinkParamsState=t.LINK_PARAMS_NAME=void 0;var r=n(8),o=n(19),i=n(1),s=t.LINK_PARAMS_NAME="linkParams",a=(0,r.createSlice)({name:s,initialState:{},reducers:{setLinkParams:function(e,t){return t.payload}}}),u=(t.getInitialLinkParamsState=a.getInitialState,t.linkParamsSelectors={selectLinkParam:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return(0,i.get)(e,s+"."+t,n)},selectLinkParams:function(e){return(0,i.get)(e,s,{})}});u.selectLink=(0,r.createSelector)([u.selectLinkParams,function(e,t){return t}],function(e,t){return(0,o.addQueryArgs)(t,e)});t.linkParamsActions=a.actions,t.linkParamsReducer=a.reducer},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.wistiaEmbedPermissionReducer=t.wistiaEmbedPermissionControls=t.wistiaEmbedPermissionActions=t.wistiaEmbedPermissionSelectors=t.getInitialWistiaEmbedPermissionState=t.WISTIA_EMBED_PERMISSION_NAME=void 0;var r=Object.assign||function(e){for(var t=1;t",lasttranslator:"Yoast Translate Team "},repository:{type:"git",url:"https://github.com/Yoast/wordpress-seo-premium"},scripts:{test:"jest",build:"NODE_ENV=production webpack --config ./config/webpack/webpack.config.dev.js --progress --display-error-details","build:css":"cross-env NODE_ENV=production postcss assets/css/dist/*.css --verbose --replace","build:css:dev":"cross-env NODE_ENV=development postcss assets/css/dist/*.css --verbose --replace",start:"webpack-dev-server --config ./config/webpack/webpack.config.dev.js --progress --env.environment=development --port=8081","webpack-analyze-bundle":"cross-env BUNDLE_ANALYZER=1 NODE_ENV=production webpack --config ./config/webpack/webpack.config.prod.js --progress",postinstall:"patch-package"},devDependencies:{"@draft-js-plugins/emoji":"^4.6.1","@tailwindcss/forms":"^0.5.3","@testing-library/jest-dom":"^6.1.3","@testing-library/react":"^14.0.0","@testing-library/react-hooks":"^8.0.1","@types/react":"^18.2.46","@types/wordpress__blocks":"^12.5.13","@wordpress/babel-plugin-makepot":"^2.0.1","@wordpress/block-editor":"^12.16.0","@wordpress/dependency-extraction-webpack-plugin":"^2.9.0","@yoast/components":"link:vendor/yoast/wordpress-seo/packages/components","@yoast/feature-flag":"^0.5.2","@yoast/grunt-plugin-tasks":"^2.4","@yoast/helpers":"link:vendor/yoast/wordpress-seo/packages/helpers","@yoast/postcss-preset":"link:vendor/yoast/wordpress-seo/packages/postcss-preset","@yoast/style-guide":"link:vendor/yoast/wordpress-seo/packages/style-guide","@yoast/tailwindcss-preset":"link:vendor/yoast/wordpress-seo/packages/tailwindcss-preset","babel-cli":"^6.26.0","babel-core":"^6.13.2","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-plugin-transform-react-jsx":"^6.24.1","babel-preset-env":"^1.7.0","babel-preset-es2015":"^6.13.2","babel-preset-react":"^6.11.1","case-sensitive-paths-webpack-plugin":"^2.1.2","cross-env":"^7.0.2","css-loader":"3.6.0",dotenv:"^8.2.0",envify:"^3.4.1",eslint:"^6.6.0","find-with-regex":"~1.0.2","grunt-git":"^1.0.14","grunt-po2json":"^0.3.0","grunt-webpack":"^3.1.3",jest:"^23.3.0","jest-styled-components":"^7.0.3","patch-package":"^6.4.7",postcss:"^8.4.24","postcss-cli":"^10.1.0","postinstall-postinstall":"^2.1.0","prop-types":"^15.7.2","readline-sync":"^1.4.10","style-loader":"2.0.0","styled-components":"^5.3.6",tailwindcss:"^3.3.2","ts-loader":"^8.0.17",typescript:"^4.2.2",webpack:"^4.20.2","webpack-bundle-analyzer":"^4.2.0","webpack-cli":"^3.1.2","webpack-dev-server":"^3.1.14"},dependencies:{"@headlessui/react":"^1.6.5","@heroicons/react":"^1.0.6","@reduxjs/toolkit":"^1.9.5","@yoast/social-metadata-previews":"link:vendor/yoast/wordpress-seo/packages/social-metadata-previews","a11y-speak":"github:yoast/a11y-speak","babel-loader":"^7.1.5","babel-plugin-dynamic-import-webpack":"^1.1.0","babel-polyfill":"^6.16.0",classnames:"^2.3.2","concat-map":"^0.0.1","grunt-glotpress":"https://github.com/Yoast/grunt-glotpress.git#translationspress","interpolate-components":"^1.1.0",lodash:"^4.7.0","react-json-view":"^1.21.3","react-select":"^5.8.0",sassdash:"^0.9.0",yoastseo:"link:vendor/yoast/wordpress-seo/packages/yoastseo"},resolutions:{yoastseo:"link:vendor/yoast/wordpress-seo/packages/yoastseo","../yoastseo":"link:vendor/yoast/wordpress-seo/packages/yoastseo","@yoast/search-metadata-previews":"link:vendor/yoast/wordpress-seo/packages/search-metadata-previews","@yoast/ui-library":"link:vendor/yoast/wordpress-seo/packages/ui-library"},browserslist:["extends @yoast/browserslist-config"],yoast:{pluginVersion:"22.0"}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.compressWordsForLinking=function(e){var t={};return e.forEach(function(e){t[e.getStem()]=e.getOccurrences()}),t}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.determineMorphologyRequestUrl=function(e){var t={en:"v5",de:"v10",es:"v10",fr:"v11",it:"v10",nl:"v9",ru:"v10",id:"v9",pt:"v9",pl:"v9",ar:"v9",sv:"v1",he:"v1",hu:"v2",nb:"v1",tr:"v1",cs:"v1",sk:"v1",el:"v1",ja:"v1"};if(!Object.keys(t).includes(e))return!1;return"https://my.yoast.com/api/downloads/file/morphology-"+e+"-"+t[e]}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return"enabled"===window.wpseoPremiumMetaboxData.data.linkSuggestionsEnabled&&window.wpseoPremiumMetaboxData.data.linkSuggestionsAvailable}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getUnindexedWarning=void 0;var r=Object.assign||function(e){for(var t=1;tn&&(t.length=n),wp.element.createElement(m,null,wp.element.createElement("p",null,g," ",i),wp.element.createElement("p",null,o.metaMessage),t.map(function(e,t){return wp.element.createElement(d.default,r({key:t},e))}))};b.propTypes={suggestions:i.default.array.isRequired,maxSuggestions:i.default.number,customMessages:i.default.object,location:i.default.string},b.defaultProps={maxSuggestions:10,customMessages:{lengthMessage:"",metaMessage:""},location:""};var _=function(){window.open("admin.php?page=wpseo_tools&start-indexation=true","yoastSeoAnalyzeProminentWords")},k=function(e){var t="";return e.hasWordsForLinking||(t=(0,u.__)("Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.","wordpress-seo-premium")),{lengthMessage:t,metaMessage:function(e,t,n){switch(!0){case n&&!t&&""===e:return(0,u.__)("Add a title to your post for the best internal linking suggestions.","wordpress-seo-premium");case!n&&t&&""===e:return(0,u.__)("Add a metadescription to your post for the best internal linking suggestions.","wordpress-seo-premium");case!n&&!t&&""===e:return(0,u.__)("Add a title and a metadescription to your post for the best internal linking suggestions.","wordpress-seo-premium");case n&&!t&&""!==e:return(0,u.__)("Also, add a title to your post for the best internal linking suggestions.","wordpress-seo-premium");case!n&&t&&""!==e:return(0,u.__)("Also, add a metadescription to your post for the best internal linking suggestions.","wordpress-seo-premium");case!n&&!t&&""!==e:return(0,u.__)("Also, add a title and a metadescription to your post for the best internal linking suggestions.","wordpress-seo-premium")}}(t,e.hasTitle,e.hasMetaDescription)}},E=t.getUnindexedWarning=function(){var e=(0,u.__)("We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s","wordpress-seo-premium");return e=(e=(e=(e=(e=e.replace("%1$s","{{a}}")).replace("%2$s","{{/a}}")).replace("%3$s","{{startAnalysis}}")).replace("%4$s","{{/startAnalysis}}")).replace("\n\n","{{br /}}{{br /}}"),e=(0,a.default)({mixedString:e,components:{a:wp.element.createElement("a",{href:wpseoAdminL10n["shortlinks.notification_internal_link"],target:"_blank"}),startAnalysis:wp.element.createElement("button",{type:"button",className:"button",onClick:_}),br:wp.element.createElement("br",null)}}),wp.element.createElement("div",{className:"notice notice-warning notice-alt wpseo-notice-breakout-inside yoast-links-suggestions-notice"},wp.element.createElement("p",null,e))},S=function(e){if((0,o.useEffect)(function(){return e.suggester.subscribe(),function(){e.suggester.unsubscribe()}},[]),e.isLoading)return wp.element.createElement("div",{className:"yoast-link-suggestions"},wp.element.createElement("p",null,(0,u.__)("It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.","wordpress-seo-premium")));w||((w=new ClipboardJS(".yoast-link-suggestion__copy")).on("success",v),w.on("error",h));var t=null;e.showUnindexedWarning&&(t=E());var n=r({},e.messageData,{hasWordsForLinking:Array.isArray(e.wordsForLinking)&&e.wordsForLinking.length>0}),i=k(n);return wp.element.createElement("div",{className:"yoast-link-suggestions"},t,wp.element.createElement(b,{suggestions:e.suggestions,customMessages:i,location:e.location}))};S.propTypes={suggester:i.default.object,suggestions:i.default.array.isRequired,wordsForLinking:i.default.array,messageData:i.default.object,isLoading:i.default.bool.isRequired,showUnindexedWarning:i.default.bool,location:i.default.string},S.defaultProps={suggester:null,showUnindexedWarning:!1,messageData:{hasMetaDescription:!1,hasTitle:!1},wordsForLinking:[],location:""},t.default=S},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});l(n(0));var r=l(n(4)),o=l(n(14)),i=n(2),s=n(23),a=n(11),u=n(16);function l(e){return e&&e.__esModule?e:{default:e}}var c=o.default.div.withConfig({displayName:"LinkSuggestion__LinkSuggestionWrapper",componentId:"sc-1gewdgc-0"})(["display:flex;align-items:normal;min-height:40px;margin:10px 0 5px;"]),d=(0,u.createSvgIconComponent)({copy:{viewbox:"0 0 448 512",path:"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"},check:{viewbox:"0 0 512 512",path:"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"}}),p=o.default.div.withConfig({displayName:"LinkSuggestion__LinkSuggestionDivider",componentId:"sc-1gewdgc-1"})(["background-color:#e5e5e5;width:100%;height:1px;"]),f=o.default.button.withConfig({displayName:"LinkSuggestion__LinkSuggestionIcon",componentId:"sc-1gewdgc-2"})(["box-sizing:border-box;flex:0 0 30px;height:30px;width:30px;background-color:",";border-radius:5px;cursor:pointer;outline:none;border:1px solid ",";margin-left:3px;&:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,0.8);}"],function(e){return e.iconBackground},function(e){return e.iconBorder});f.props={iconBackground:r.default.string,iconBorder:r.default.string},f.defaultProps={iconBackground:s.colors.$color_button,iconBorder:s.colors.$color_button_border};var m=o.default.div.withConfig({displayName:"LinkSuggestion__LinkContainer",componentId:"sc-1gewdgc-3"})(["flex:auto;"]),y=(0,u.makeOutboundLink)(o.default.a.withConfig({displayName:"LinkSuggestion__Link",componentId:"sc-1gewdgc-4"})(["text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;max-height:40px;margin-bottom:4px;-webkit-box-orient:vertical;overflow:hidden;padding:0 0 4px;"])),g=o.default.div.withConfig({displayName:"LinkSuggestion__BadgesWrapper",componentId:"sc-1gewdgc-5"})(["flex-wrap:wrap;display:flex;flex-direction:row;justify-content:unset;margin-top:4px;"]),w=o.default.span.withConfig({displayName:"LinkSuggestion__Badge",componentId:"sc-1gewdgc-6"})(["white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;padding:3px 8px;font-size:0.85em;background-color:#f3f4f5;border-radius:2px;margin-bottom:4px;margin-right:4px;text-transform:lowercase;"]),v=function(e){var t=e.badges;return wp.element.createElement(g,null,t.map(function(e,t){return wp.element.createElement(w,{key:t},e)}))};v.propTypes={badges:r.default.array.isRequired};var h=function(e){var t=e.value,n=e.url,r=e.isActive,o=e.labels,u=(0,i.__)("Copy link","wordpress-seo-premium"),l=(0,i.sprintf)((0,i.__)("Copy link to suggested article: %s","wordpress-seo-premium"),t),g="copy",w=s.colors.$color_black,h=s.colors.$color_button,b="#979797";return r&&(g="check",w=s.colors.$color_alert_success_text,h=s.colors.$color_alert_success_background,b=s.colors.$color_alert_success_background),wp.element.createElement("div",null,wp.element.createElement(p,null),wp.element.createElement(c,{className:"yoast-link-suggestion__wrapper"},wp.element.createElement(m,{className:"yoast-link-suggestion__container"},wp.element.createElement(y,{href:n},t),wp.element.createElement(v,{badges:o})),wp.element.createElement(f,{type:"button",className:"yoast-link-suggestion__copy yoast-tooltip yoast-tooltip-alt yoast-tooltip-s",onBlur:function(e){e.nativeEvent.target.setAttribute("aria-label",l),e.nativeEvent.target.setAttribute("data-label",u)},"data-clipboard-text":n,"aria-label":l,"data-label":u,iconBackground:h,iconBorder:b},wp.element.createElement(d,{icon:g,color:w}),wp.element.createElement(a.ScreenReaderText,null,u))))};h.propTypes={value:r.default.string.isRequired,url:r.default.string.isRequired,isActive:r.default.bool,labels:r.default.array.isRequired},h.defaultProps={isActive:!1},t.default=h},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=t.SET_PROMINENT_WORDS="SET_PROMINENT_WORDS",o=t.SET_TEXT_FORMALITY_LEVEL="SET_TEXT_FORMALITY_LEVEL";t.setProminentWords=function(e){return{type:r,payload:e}},t.setTextFormalityLevel=function(e){return{type:o,payload:e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setRedirectNotification=function(e){return{type:r,redirectData:e}},t.closeRedirectNotification=function(){return{type:o}};var r=t.SET_REDIRECT_NOTIFICATION="SET_REDIRECT_NOTIFICATION",o=t.CLOSE_REDIRECT_NOTIFICATION="CLOSE_REDIRECT_NOTIFICATION"},,,,,,,,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n","
              "),{a:wp.element.createElement("a",{href:t,target:"_blank"})}))))};a.propTypes={link:r.default.string.isRequired},t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return(0,window.yoast.editorModules.analysis.getContentLocale)().split("_")[0]}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("undefined"==typeof YoastSEO||void 0===YoastSEO.analysis||void 0===YoastSEO.analysis.worker)return;var r=YoastSEO.analysis.worker;r.loadScript(e).then(function(){return r.loadScript(t)}).then(function(){return r.sendMessage("initialize",{options:n},"YoastSEOPremium")})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("undefined"==typeof YoastSEO||void 0===YoastSEO.analysis||void 0===YoastSEO.analysis.worker)return;var n=YoastSEO.analysis.worker;n.loadScript(e).then(function(){return n.loadScript(t)}).then((0,r.dispatch)("yoast-seo/editor").runAnalysis)};var r=n(5)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(5),o=n(45),i=n(1),s=n(9);var a=function(){var e=(0,r.dispatch)("yoast-seo-premium/editor"),t=e.setProminentWords,n=e.setTextFormalityLevel,a=(0,i.get)(window,"YoastSEO.analysis.worker.runResearch",i.noop),u=(0,i.get)(window,"YoastSEO.analysis.collectData",!1);return function(){var e=u?s.Paper.parse(u()):null;a("getProminentWordsForInsights",e).then(function(e){var t=e.result;return(0,i.reduce)(t,function(e,t){return[].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t","",e),{span:wp.element.createElement(u,null)})},[e]);return wp.element.createElement("div",null,t.length<50&&wp.element.createElement("div",null,wp.element.createElement("p",null,(0,o.__)("Once you add a bit more copy, we'll be able to tell you the formality level of your text.","wordpress-seo"))),t.length>=50&&wp.element.createElement("div",null,wp.element.createElement("p",null,n)))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(5),o=function(e){return e&&e.__esModule?e:{default:e}}(n(56));t.default=(0,r.withSelect)(function(e){var t=e("yoast-seo-premium/editor"),n=t.getLinkSuggestions,r=t.getWordsForLinking,o=t.getLinkSuggestionsMessageData,i=t.linkSuggestionsAreLoading,s=t.linkSuggestionsAreUnindexed;return{suggestions:n(),wordsForLinking:r(),messageData:o(),isLoading:i(),showUnindexedWarning:s()}})(o.default)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(5),o=function(e){return e&&e.__esModule?e:{default:e}}(n(86));t.default=(0,r.withSelect)(function(e){var t=e("yoast-seo-premium/editor"),n=t.getMetaboxWarningIsLoading,r=t.getMetaboxWarning;return{isLoading:n(),warning:r()}})(o.default)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n191&&t.push((0,o.__)("Your keyphrase is too long. It can be a maximum of 191 characters.","wordpress-seo-premium")),t}(t),N=wp.element.createElement(p,{href:wpseoAdminL10n["shortlinks.focus_keyword_info"],className:"dashicons"},wp.element.createElement("span",{className:"screen-reader-text"},(0,o.__)("Help on choosing the perfect keyphrase","wordpress-seo-premium"))),I=wp.element.createElement(p,{href:wpseoAdminL10n["shortlinks.keyword_synonyms_info"],className:"dashicons"},wp.element.createElement("span",{className:"screen-reader-text"},(0,o.__)("Help on keyphrase synonyms","wordpress-seo-premium")));return wp.element.createElement(y,null,function(e){var s="metabox"===e?w:g;return wp.element.createElement(s,{title:M,subTitle:L,prefixIcon:j,prefixIconCollapsed:j,id:"yoast-additional-keyphrase-collapsible-"+R+"-"+e},wp.element.createElement(v,{id:a?"yoast-keyword-input-add-"+e:"yoast-keyword-input-"+R+"-"+e,keyword:t,onChange:n,onFocusKeyword:_,onRemoveKeyword:a?null:O,onBlurKeyword:k,label:(0,o.__)("Keyphrase","wordpress-seo-premium"),helpLink:N,hasError:T.length>0,errorMessages:T}),!a&&wp.element.createElement(r.Fragment,null,wp.element.createElement(u.SynonymsInput,{id:"yoast-synonyms-input-"+R+"-"+e,showLabel:!0,label:(0,o.__)("Synonyms","wordpress-seo-premium"),onChange:b,onBlur:S,onFocus:E,value:c,helpLink:I}),wp.element.createElement(h,null,(0,o.__)("Analysis results","wordpress-seo-premium")),wp.element.createElement(m,{showLanguageNotice:!1,marksButtonClassName:"yoast-tooltip yoast-tooltip-w",editButtonClassName:"yoast-tooltip yoast-tooltip-w",marksButtonStatus:P,results:i,keywordKey:R,location:e})))})}b.propTypes={keyword:s.default.string.isRequired,onChange:s.default.func.isRequired,synonyms:s.default.string,onChangeSynonyms:s.default.func,onRemoveKeyword:s.default.func.isRequired,onFocusKeyword:s.default.func.isRequired,onBlurKeyword:s.default.func.isRequired,onBlurSynonym:s.default.func.isRequired,onFocusSynonym:s.default.func.isRequired,analysis:s.default.array,isAddKeyword:s.default.bool,score:s.default.number,marksButtonStatus:s.default.string,keywordKey:s.default.string.isRequired},b.defaultProps={synonyms:"",onChangeSynonyms:i.noop,analysis:[],isAddKeyword:!1,score:0,marksButtonStatus:"enabled"}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(5),o=n(20),i=function(e){return e&&e.__esModule?e:{default:e}}(n(92));var s=window.yoast.editorModules.containers.SEMrushRelatedKeyphrases;t.default=(0,o.compose)([(0,r.withSelect)(function(e){return{keyphrase:e("yoast-seo/editor").getFocusKeyphrase(),relatedKeyphrases:e("yoast-seo-premium/editor").getKeywords(),renderAction:function(e,t){return wp.element.createElement(i.default,{relatedKeyphrase:e,relatedKeyphrases:t})}}})])(s)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SEMrushRelatedKeyphraseControls=void 0;var r=function(){function e(e,t){for(var n=0;n=4}},{key:"addKeyphraseToList",value:function(){""===this.getAssociatedKeyphraseKey(this.props.relatedKeyphrases,this.props.relatedKeyphrase)&&this.props.addKeyphrase(this.props.relatedKeyphrase)}},{key:"removeKeyphraseFromList",value:function(){var e=this.getAssociatedKeyphraseKey(this.props.relatedKeyphrases,this.props.relatedKeyphrase);""!==e&&this.props.removeKeyphrase(e)}},{key:"componentDidUpdate",value:function(e){var t=this.keyphraseExists(this.props.relatedKeyphrases,this.props.relatedKeyphrase),n=this.keyphraseExists(e.relatedKeyphrases,e.relatedKeyphrase);t&&!n&&this.removeLinkRef.current.focus(),!t&&n&&this.addButtonRef.current.focus()}},{key:"render",value:function(){var e=this.props.relatedKeyphrase,t=this.props.relatedKeyphrases;return t&&this.keyphraseExists(t,e)?wp.element.createElement(i.Fragment,null,wp.element.createElement("span",{className:"yoast-modal__settings-saved"},(0,s.__)("Added!","wordpress-seo-premium")),wp.element.createElement(l.default,{ref:this.removeLinkRef,onRemove:this.removeKeyphraseFromList})):wp.element.createElement(c.default,{buttonRef:this.addButtonRef,disabled:this.relatedKeyphrasesLimitReached(),onAdd:this.addKeyphraseToList})}}]),t}();p.propTypes={relatedKeyphrase:u.default.string,relatedKeyphrases:u.default.array,addKeyphrase:u.default.func.isRequired,removeKeyphrase:u.default.func.isRequired},p.defaultProps={relatedKeyphrase:"",relatedKeyphrases:[]},t.SEMrushRelatedKeyphraseControls=p,t.default=(0,o.withDispatch)(function(e){var t=e("yoast-seo-premium/editor");return{addKeyphrase:t.addRelatedKeyword,removeKeyphrase:t.removeRelatedKeyword}})(p)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),o=n(3);t.default=(0,o.forwardRef)(function(e,t){return wp.element.createElement("button",{ref:t,className:"yoast-remove",onClick:e.onRemove},(0,r.__)("Remove","wordpress-seo-premium"))})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),o=function(e){return e&&e.__esModule?e:{default:e}}(n(4)),i=n(11);var s=function(e){return wp.element.createElement(i.NewButton,{variant:"secondary",small:!0,buttonRef:e.buttonRef,onClick:e.onAdd,disabled:e.disabled},(0,r.__)("Add as related keyphrase","wordpress-seo-premium"))};s.propTypes={buttonRef:o.default.object,onAdd:o.default.func.isRequired,disabled:o.default.bool},s.defaultProps={buttonRef:null,disabled:!1},t.default=s},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(5),o=n(20),i=n(11);t.default=(0,o.compose)([(0,r.withSelect)(function(e){return{value:(0,e("yoast-seo-premium/editor").getSynonyms)()}}),(0,r.withDispatch)(function(e){var t=e("yoast-seo/editor").setMarkerPauseStatus,n=e("yoast-seo-premium/editor").setSynonyms;return{onChange:function(e){n(e.target.value)},onFocus:function(){t(!0)},onBlur:function(){t(!1)}}})])(i.SynonymsInput)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:[],t=arguments[1],n=t.type,r=t.payload;switch(n){case o.SET_PROMINENT_WORDS:return r;default:return e}},textFormalityLevel:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments[1],n=t.type,r=t.payload;switch(n){case o.SET_TEXT_FORMALITY_LEVEL:return r;default:return e}}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(28),o={suggestions:[],messageData:{hasMetaDescription:!1,hasTitle:!1},wordsForLinking:null,isLoading:!0,showUnindexedWarning:!1};t.default=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o,t=arguments[1];switch(t.type){case r.LOAD_LINK_SUGGESTIONS:return Object.assign({},e,{isLoading:!0});case r.SET_LINK_SUGGESTIONS:return Object.assign({},e,{suggestions:t.linkSuggestions||[],isLoading:!1,showUnindexedWarning:t.showUnindexedWarning});case r.SET_MESSAGE_DATA:return Object.assign({},e,{messageData:{hasMetaDescription:t.messageData.hasMetaDescription,hasTitle:t.messageData.hasTitle},wordsForLinking:t.messageData.prominentWords});case r.SET_WORDS_FOR_LINKING:return Object.assign({},e,{wordsForLinking:t.wordsForLinking});default:return e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(47),o={isLoading:!1,warning:[]};t.default=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o,t=arguments[1];switch(t.type){case r.LOAD_MORPHOLOGY_DATA:return Object.assign({},e,{isLoading:!0});case r.LOAD_MORPHOLOGY_DATA_ERROR:return Object.assign({},e,{isLoading:!1,warning:t.message});default:return e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1);t.default=function(){return arguments.length>0&&void 0!==arguments[0]?arguments[0]:{isProminentWordsAvailable:(0,r.get)(window,"wpseoPremiumMetaboxData.data.isProminentWordsAvailable",!1)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:i,t=arguments[1];switch(t.type){case o.SET_REDIRECT_NOTIFICATION:return r({},e,{redirectData:t.redirectData,isOpen:!0});case o.CLOSE_REDIRECT_NOTIFICATION:return r({},e,{redirectData:{},isOpen:!1});default:return e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];return{availableKeys:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:u,t=arguments[1],n=void 0;switch(t.type){case i.SET_RELATED_KEYWORDS:return n=u.length-t.keywords.length,(0,o.takeRight)(e,n);case i.ADD_RELATED_KEYWORD:return(0,o.tail)(e);case i.REMOVE_RELATED_KEYWORD:return[t.key].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0&&void 0!==arguments[0]?arguments[0]:a,t=arguments[1],n=arguments[2];switch(t.type){case i.SET_RELATED_KEYWORDS:return(0,o.fromPairs)(t.keywords.map(function(e,t){var n=u[t];return[n,r({},e,{key:n})]}));case i.ADD_RELATED_KEYWORD:return r({},e,s({},n,{key:n,keyword:t.keyword}));case i.REMOVE_RELATED_KEYWORD:return(0,o.pickBy)(e,function(e){return e.key!==t.key});case i.CHANGE_RELATED_KEYWORD:return r({},e,s({},t.key,r({},e[t.key],{keyword:t.keyword})));case i.SET_RELATED_KEYWORD_RESULTS:return e[t.key]&&e[t.key].keyword===t.keyword?r({},e,s({},t.key,r({},e[t.key],{results:t.results,score:t.score}))):e;case i.SET_RELATED_KEYWORD_SYNONYMS:return r({},e,s({},t.key,r({},e[t.key],{synonyms:t.synonyms})))}return e}(e.keywords,t,(0,o.head)(e.availableKeys))}};var o=n(1),i=n(35);function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a={},u=["a","b","c","d"]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments[1];if(t.type===r.SET_SYNONYMS)return t.synonyms;return e};var r=n(48)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(107);Object.keys(r).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return r[e]}})});var o=n(108);Object.keys(o).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return o[e]}})});var i=n(109);Object.keys(i).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return i[e]}})});var s=n(110);Object.keys(s).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return s[e]}})});var a=n(111);Object.keys(a).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return a[e]}})});var u=n(112);Object.keys(u).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return u[e]}})});var l=n(113);Object.keys(l).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return l[e]}})})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getTextFormalityLevel=t.getProminentWords=void 0;var r=n(1),o=[];t.getProminentWords=function(e){return(0,r.get)(e,"insights.prominentWords",o)},t.getTextFormalityLevel=function(e){return(0,r.get)(e,"insights.textFormalityLevel",null)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getLinkSuggestions=function(e){return(0,r.get)(e,["linkSuggestions","suggestions"],o)},t.linkSuggestionsAreLoading=function(e){return(0,r.get)(e,["linkSuggestions","isLoading"],!0)},t.linkSuggestionsAreUnindexed=function(e){return(0,r.get)(e,["linkSuggestions","showUnindexedWarning"],!1)},t.getWordsForLinking=function(e){return(0,r.get)(e,["linkSuggestions","wordsForLinking"],null)},t.getLinkSuggestionsMessageData=function(e){return(0,r.get)(e,["linkSuggestions","messageData"],{hasMetaDescription:!1,hasTitle:!1})};var r=n(1),o=[]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getMetaboxWarningIsLoading=function(e){return(0,r.get)(e,"metaboxWarning.isLoading",!0)},t.getMetaboxWarning=function(e){return(0,r.get)(e,"metaboxWarning.warning","")};var r=n(1)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getPreferences=t.getPreference=void 0;var r=n(1);t.getPreference=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return(0,r.get)(e,"preferences."+t,n)},t.getPreferences=function(e){return e.preferences}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getRedirectData=function(e){return(0,r.get)(e,"redirectNotification.redirectData",{})},t.getIsRedirectNotificationOpen=function(e){return(0,r.get)(e,"redirectNotification.isOpen",!1)};var r=n(1)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getKeywordData=function(e,t){return(0,r.get)(e,["relatedKeywords","keywords",t],{keyword:"",analysis:[],score:0,synonyms:""})},t.getKeywords=function(e){return Object.values((0,r.get)(e,["relatedKeywords","keywords"],{}))},t.getFirstAvailableKey=function(e){return(0,r.head)((0,r.get)(e,["relatedKeywords","availableKeys"],[]))||""};var r=n(1)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getSynonyms=function(e){return(0,r.get)(e,["synonyms"],"")};var r=n(1)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=function(){function e(e,t){for(var n=0;n0){var r=e.formatLinkSuggestions(e.linkSuggestions);e.setLinkingSuggestionsOnStore(r)}})}},{key:"markUsedLinks",value:function(e){var t=this.usedLinks||[];return e.forEach(function(e){e.active=t.includes(e.link)}),e}}],[{key:"mapSuggestionsForStore",value:function(e){return e.map(function(e){return{value:e.title,url:e.link,isActive:e.active,labels:e.labels}})}}]),e}();t.default=a},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,n){"use strict";var r=n(5),o=n(21),i=n(45),s=n(1),a=k(n(202)),u=k(n(203)),l=k(n(205)),c=k(n(206)),d=k(n(209)),p=k(n(214)),f=k(n(217)),m=k(n(79)),y=k(n(80)),g=k(n(81)),w=k(n(82)),v=k(n(96)),h=k(n(114)),b=n(17),_=n(218);function k(e){return e&&e.__esModule?e:{default:e}}(0,window.yoast.editorModules.helpers.i18n.setTextdomainL10n)("wordpress-seo-premium","wpseoPremiumJSL10n");(0,o.addAction)("yoast.elementor.loaded","yoast/yoast-seo-premium/initializeElementorIntegration",function e(){if((0,r.dispatch)("yoast-seo/editor"))try{(0,i.enableFeatures)(window.wpseoFeaturesL10n),function(){var e=(0,v.default)();e.dispatch(b.pluginUrlActions.setPluginUrl((0,s.get)(window,"wpseoPremiumMetaboxData.data.pluginUrl","")));var t=(0,a.default)(e);(0,f.default)(e),(0,c.default)(e),(0,l.default)(),(0,d.default)(e,t),(0,u.default)(),(0,p.default)(),(0,w.default)();var n=new h.default;e.subscribe(function(){n.persist(e.getState())})}(),function(e){window.YoastSEO.analysis.worker.initialize({translations:e})}(window.wpseoPremiumJSL10n),(0,i.isFeatureEnabled)("TEXT_FORMALITY")&&(0,g.default)(window.wpseoPremiumMetaboxData.data.commonsScriptUrl,window.wpseoPremiumMetaboxData.data.textFormalityScriptUrl),(0,y.default)(window.wpseoPremiumMetaboxData.data.commonsScriptUrl,window.wpseoPremiumMetaboxData.data.premiumAssessmentsScriptUrl,{isTitleAssessmentAvailable:!0,isTextAlignmentAssessmentAvailable:!1,language:(0,m.default)()}),(0,o.addAction)("yoast.analysis.applyMarks","yoast/yoast-seo-premium/applyMarksElementor",_.applyMarksElementor)}catch(e){console.error(e)}else setTimeout(e,100)})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(!u)return null;var t=e.dispatch.bind(e);return t((0,i.loadLinkSuggestions)()),new s.default({dispatch:t,rootUrl:(0,r.get)(window,"wpseoPremiumMetaboxData.data.restApi.root",""),nonce:(0,r.get)(window,"wpseoPremiumMetaboxData.data.restApi.nonce",""),currentObjectId:(0,r.get)(window,"wpseoPremiumMetaboxData.data.currentObjectId",0),currentObjectType:(0,r.get)(window,"wpseoPremiumMetaboxData.data.currentObjectType","post"),showUnindexedWarning:(0,r.get)(window,"wpseoPremiumMetaboxData.data.linkSuggestionsUnindexed",!1),maxWordsToSave:(0,r.get)(window,"wpseoPremiumMetaboxData.data.perIndexableLimit",20)})};var r=n(1),o=a(n(46)),i=n(28),s=a(n(115));function a(e){return e&&e.__esModule?e:{default:e}}var u=(0,o.default)()},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){var e=a().split("_")[0],t=(0,o.get)(window,"wpseoPremiumMetaboxData.data.licensedURL","");if(!i.helpers.getLanguagesWithWordFormSupport().includes(e))return;if(""===t)return;var n=new s.default({siteUrl:t,language:e,setError:u});(0,r.dispatch)("yoast-seo-premium/editor").loadMorphologyData(),n.injectMorphologyData()};var r=n(5),o=n(1),i=n(9),s=function(e){return e&&e.__esModule?e:{default:e}}(n(204));var a=window.yoast.editorModules.analysis.getContentLocale,u=function(e){(0,r.dispatch)("yoast-seo-premium/editor").setLoadMorphologyDataError(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:[];try{return JSON.parse(e)}catch(e){return t}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n=t&&e.getPositionEnd() "+u);if("componentClose"===d.type)throw new Error("Missing opening component token: `"+d.value+"`");if("componentOpen"===d.type){n=t[d.value],a=p;break}y.push(t[d.value])}else y.push(d.value);return n&&(c=function(e,t){var n,r,o=t[e],s=0;for(r=e+1;r2&&void 0!==arguments[2]?arguments[2]:"assets/images"},function(e,t){return t}],function(e,t,n){return[(0,o.trimEnd)(e,"/"),(0,o.trim)(t,"/"),(0,o.trimStart)(n,"/")].join("/")});t.pluginUrlActions=i.actions,t.pluginUrlReducer=i.reducer},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.linkParamsReducer=t.linkParamsActions=t.linkParamsSelectors=t.getInitialLinkParamsState=t.LINK_PARAMS_NAME=void 0;var r=n(8),o=n(19),s=n(1),i=t.LINK_PARAMS_NAME="linkParams",a=(0,r.createSlice)({name:i,initialState:{},reducers:{setLinkParams:function(e,t){return t.payload}}}),u=(t.getInitialLinkParamsState=a.getInitialState,t.linkParamsSelectors={selectLinkParam:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return(0,s.get)(e,i+"."+t,n)},selectLinkParams:function(e){return(0,s.get)(e,i,{})}});u.selectLink=(0,r.createSelector)([u.selectLinkParams,function(e,t){return t}],function(e,t){return(0,o.addQueryArgs)(t,e)});t.linkParamsActions=a.actions,t.linkParamsReducer=a.reducer},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.wistiaEmbedPermissionReducer=t.wistiaEmbedPermissionControls=t.wistiaEmbedPermissionActions=t.wistiaEmbedPermissionSelectors=t.getInitialWistiaEmbedPermissionState=t.WISTIA_EMBED_PERMISSION_NAME=void 0;var r=Object.assign||function(e){for(var t=1;t",lasttranslator:"Yoast Translate Team "},repository:{type:"git",url:"https://github.com/Yoast/wordpress-seo-premium"},scripts:{test:"jest",build:"NODE_ENV=production webpack --config ./config/webpack/webpack.config.dev.js --progress --display-error-details","build:css":"cross-env NODE_ENV=production postcss assets/css/dist/*.css --verbose --replace","build:css:dev":"cross-env NODE_ENV=development postcss assets/css/dist/*.css --verbose --replace",start:"webpack-dev-server --config ./config/webpack/webpack.config.dev.js --progress --env.environment=development --port=8081","webpack-analyze-bundle":"cross-env BUNDLE_ANALYZER=1 NODE_ENV=production webpack --config ./config/webpack/webpack.config.prod.js --progress",postinstall:"patch-package"},devDependencies:{"@draft-js-plugins/emoji":"^4.6.1","@tailwindcss/forms":"^0.5.3","@testing-library/jest-dom":"^6.1.3","@testing-library/react":"^14.0.0","@testing-library/react-hooks":"^8.0.1","@types/react":"^18.2.46","@types/wordpress__blocks":"^12.5.13","@wordpress/babel-plugin-makepot":"^2.0.1","@wordpress/block-editor":"^12.16.0","@wordpress/dependency-extraction-webpack-plugin":"^2.9.0","@yoast/components":"link:vendor/yoast/wordpress-seo/packages/components","@yoast/feature-flag":"^0.5.2","@yoast/grunt-plugin-tasks":"^2.4","@yoast/helpers":"link:vendor/yoast/wordpress-seo/packages/helpers","@yoast/postcss-preset":"link:vendor/yoast/wordpress-seo/packages/postcss-preset","@yoast/style-guide":"link:vendor/yoast/wordpress-seo/packages/style-guide","@yoast/tailwindcss-preset":"link:vendor/yoast/wordpress-seo/packages/tailwindcss-preset","babel-cli":"^6.26.0","babel-core":"^6.13.2","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-plugin-transform-react-jsx":"^6.24.1","babel-preset-env":"^1.7.0","babel-preset-es2015":"^6.13.2","babel-preset-react":"^6.11.1","case-sensitive-paths-webpack-plugin":"^2.1.2","cross-env":"^7.0.2","css-loader":"3.6.0",dotenv:"^8.2.0",envify:"^3.4.1",eslint:"^6.6.0","find-with-regex":"~1.0.2","grunt-git":"^1.0.14","grunt-po2json":"^0.3.0","grunt-webpack":"^3.1.3",jest:"^23.3.0","jest-styled-components":"^7.0.3","patch-package":"^6.4.7",postcss:"^8.4.24","postcss-cli":"^10.1.0","postinstall-postinstall":"^2.1.0","prop-types":"^15.7.2","readline-sync":"^1.4.10","style-loader":"2.0.0","styled-components":"^5.3.6",tailwindcss:"^3.3.2","ts-loader":"^8.0.17",typescript:"^4.2.2",webpack:"^4.20.2","webpack-bundle-analyzer":"^4.2.0","webpack-cli":"^3.1.2","webpack-dev-server":"^3.1.14"},dependencies:{"@headlessui/react":"^1.6.5","@heroicons/react":"^1.0.6","@reduxjs/toolkit":"^1.9.5","@yoast/social-metadata-previews":"link:vendor/yoast/wordpress-seo/packages/social-metadata-previews","a11y-speak":"github:yoast/a11y-speak","babel-loader":"^7.1.5","babel-plugin-dynamic-import-webpack":"^1.1.0","babel-polyfill":"^6.16.0",classnames:"^2.3.2","concat-map":"^0.0.1","grunt-glotpress":"https://github.com/Yoast/grunt-glotpress.git#translationspress","interpolate-components":"^1.1.0",lodash:"^4.7.0","react-json-view":"^1.21.3","react-select":"^5.8.0",sassdash:"^0.9.0",yoastseo:"link:vendor/yoast/wordpress-seo/packages/yoastseo"},resolutions:{yoastseo:"link:vendor/yoast/wordpress-seo/packages/yoastseo","../yoastseo":"link:vendor/yoast/wordpress-seo/packages/yoastseo","@yoast/search-metadata-previews":"link:vendor/yoast/wordpress-seo/packages/search-metadata-previews","@yoast/ui-library":"link:vendor/yoast/wordpress-seo/packages/ui-library"},browserslist:["extends @yoast/browserslist-config"],yoast:{pluginVersion:"22.0"}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.compressWordsForLinking=function(e){var t={};return e.forEach(function(e){t[e.getStem()]=e.getOccurrences()}),t}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.determineMorphologyRequestUrl=function(e){var t={en:"v5",de:"v10",es:"v10",fr:"v11",it:"v10",nl:"v9",ru:"v10",id:"v9",pt:"v9",pl:"v9",ar:"v9",sv:"v1",he:"v1",hu:"v2",nb:"v1",tr:"v1",cs:"v1",sk:"v1",el:"v1",ja:"v1"};if(!Object.keys(t).includes(e))return!1;return"https://my.yoast.com/api/downloads/file/morphology-"+e+"-"+t[e]}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return"enabled"===window.wpseoPremiumMetaboxData.data.linkSuggestionsEnabled&&window.wpseoPremiumMetaboxData.data.linkSuggestionsAvailable}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getUnindexedWarning=void 0;var r=Object.assign||function(e){for(var t=1;tn&&(t.length=n),wp.element.createElement(m,null,wp.element.createElement("p",null,g," ",s),wp.element.createElement("p",null,o.metaMessage),t.map(function(e,t){return wp.element.createElement(d.default,r({key:t},e))}))};b.propTypes={suggestions:s.default.array.isRequired,maxSuggestions:s.default.number,customMessages:s.default.object,location:s.default.string},b.defaultProps={maxSuggestions:10,customMessages:{lengthMessage:"",metaMessage:""},location:""};var _=function(){window.open("admin.php?page=wpseo_tools&start-indexation=true","yoastSeoAnalyzeProminentWords")},k=function(e){var t="";return e.hasWordsForLinking||(t=(0,u.__)("Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.","wordpress-seo-premium")),{lengthMessage:t,metaMessage:function(e,t,n){switch(!0){case n&&!t&&""===e:return(0,u.__)("Add a title to your post for the best internal linking suggestions.","wordpress-seo-premium");case!n&&t&&""===e:return(0,u.__)("Add a metadescription to your post for the best internal linking suggestions.","wordpress-seo-premium");case!n&&!t&&""===e:return(0,u.__)("Add a title and a metadescription to your post for the best internal linking suggestions.","wordpress-seo-premium");case n&&!t&&""!==e:return(0,u.__)("Also, add a title to your post for the best internal linking suggestions.","wordpress-seo-premium");case!n&&t&&""!==e:return(0,u.__)("Also, add a metadescription to your post for the best internal linking suggestions.","wordpress-seo-premium");case!n&&!t&&""!==e:return(0,u.__)("Also, add a title and a metadescription to your post for the best internal linking suggestions.","wordpress-seo-premium")}}(t,e.hasTitle,e.hasMetaDescription)}},E=t.getUnindexedWarning=function(){var e=(0,u.__)("We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s","wordpress-seo-premium");return e=(e=(e=(e=(e=e.replace("%1$s","{{a}}")).replace("%2$s","{{/a}}")).replace("%3$s","{{startAnalysis}}")).replace("%4$s","{{/startAnalysis}}")).replace("\n\n","{{br /}}{{br /}}"),e=(0,a.default)({mixedString:e,components:{a:wp.element.createElement("a",{href:wpseoAdminL10n["shortlinks.notification_internal_link"],target:"_blank"}),startAnalysis:wp.element.createElement("button",{type:"button",className:"button",onClick:_}),br:wp.element.createElement("br",null)}}),wp.element.createElement("div",{className:"notice notice-warning notice-alt wpseo-notice-breakout-inside yoast-links-suggestions-notice"},wp.element.createElement("p",null,e))},S=function(e){if((0,o.useEffect)(function(){return e.suggester.subscribe(),function(){e.suggester.unsubscribe()}},[]),e.isLoading)return wp.element.createElement("div",{className:"yoast-link-suggestions"},wp.element.createElement("p",null,(0,u.__)("It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.","wordpress-seo-premium")));w||((w=new ClipboardJS(".yoast-link-suggestion__copy")).on("success",v),w.on("error",h));var t=null;e.showUnindexedWarning&&(t=E());var n=r({},e.messageData,{hasWordsForLinking:Array.isArray(e.wordsForLinking)&&e.wordsForLinking.length>0}),s=k(n);return wp.element.createElement("div",{className:"yoast-link-suggestions"},t,wp.element.createElement(b,{suggestions:e.suggestions,customMessages:s,location:e.location}))};S.propTypes={suggester:s.default.object,suggestions:s.default.array.isRequired,wordsForLinking:s.default.array,messageData:s.default.object,isLoading:s.default.bool.isRequired,showUnindexedWarning:s.default.bool,location:s.default.string},S.defaultProps={suggester:null,showUnindexedWarning:!1,messageData:{hasMetaDescription:!1,hasTitle:!1},wordsForLinking:[],location:""},t.default=S},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});l(n(0));var r=l(n(4)),o=l(n(14)),s=n(2),i=n(23),a=n(11),u=n(16);function l(e){return e&&e.__esModule?e:{default:e}}var c=o.default.div.withConfig({displayName:"LinkSuggestion__LinkSuggestionWrapper",componentId:"sc-1gewdgc-0"})(["display:flex;align-items:normal;min-height:40px;margin:10px 0 5px;"]),d=(0,u.createSvgIconComponent)({copy:{viewbox:"0 0 448 512",path:"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"},check:{viewbox:"0 0 512 512",path:"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"}}),p=o.default.div.withConfig({displayName:"LinkSuggestion__LinkSuggestionDivider",componentId:"sc-1gewdgc-1"})(["background-color:#e5e5e5;width:100%;height:1px;"]),f=o.default.button.withConfig({displayName:"LinkSuggestion__LinkSuggestionIcon",componentId:"sc-1gewdgc-2"})(["box-sizing:border-box;flex:0 0 30px;height:30px;width:30px;background-color:",";border-radius:5px;cursor:pointer;outline:none;border:1px solid ",";margin-left:3px;&:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,0.8);}"],function(e){return e.iconBackground},function(e){return e.iconBorder});f.props={iconBackground:r.default.string,iconBorder:r.default.string},f.defaultProps={iconBackground:i.colors.$color_button,iconBorder:i.colors.$color_button_border};var m=o.default.div.withConfig({displayName:"LinkSuggestion__LinkContainer",componentId:"sc-1gewdgc-3"})(["flex:auto;"]),y=(0,u.makeOutboundLink)(o.default.a.withConfig({displayName:"LinkSuggestion__Link",componentId:"sc-1gewdgc-4"})(["text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;max-height:40px;margin-bottom:4px;-webkit-box-orient:vertical;overflow:hidden;padding:0 0 4px;"])),g=o.default.div.withConfig({displayName:"LinkSuggestion__BadgesWrapper",componentId:"sc-1gewdgc-5"})(["flex-wrap:wrap;display:flex;flex-direction:row;justify-content:unset;margin-top:4px;"]),w=o.default.span.withConfig({displayName:"LinkSuggestion__Badge",componentId:"sc-1gewdgc-6"})(["white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;padding:3px 8px;font-size:0.85em;background-color:#f3f4f5;border-radius:2px;margin-bottom:4px;margin-right:4px;text-transform:lowercase;"]),v=function(e){var t=e.badges;return wp.element.createElement(g,null,t.map(function(e,t){return wp.element.createElement(w,{key:t},e)}))};v.propTypes={badges:r.default.array.isRequired};var h=function(e){var t=e.value,n=e.url,r=e.isActive,o=e.labels,u=(0,s.__)("Copy link","wordpress-seo-premium"),l=(0,s.sprintf)((0,s.__)("Copy link to suggested article: %s","wordpress-seo-premium"),t),g="copy",w=i.colors.$color_black,h=i.colors.$color_button,b="#979797";return r&&(g="check",w=i.colors.$color_alert_success_text,h=i.colors.$color_alert_success_background,b=i.colors.$color_alert_success_background),wp.element.createElement("div",null,wp.element.createElement(p,null),wp.element.createElement(c,{className:"yoast-link-suggestion__wrapper"},wp.element.createElement(m,{className:"yoast-link-suggestion__container"},wp.element.createElement(y,{href:n},t),wp.element.createElement(v,{badges:o})),wp.element.createElement(f,{type:"button",className:"yoast-link-suggestion__copy yoast-tooltip yoast-tooltip-alt yoast-tooltip-s",onBlur:function(e){e.nativeEvent.target.setAttribute("aria-label",l),e.nativeEvent.target.setAttribute("data-label",u)},"data-clipboard-text":n,"aria-label":l,"data-label":u,iconBackground:h,iconBorder:b},wp.element.createElement(d,{icon:g,color:w}),wp.element.createElement(a.ScreenReaderText,null,u))))};h.propTypes={value:r.default.string.isRequired,url:r.default.string.isRequired,isActive:r.default.bool,labels:r.default.array.isRequired},h.defaultProps={isActive:!1},t.default=h},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=t.SET_PROMINENT_WORDS="SET_PROMINENT_WORDS",o=t.SET_TEXT_FORMALITY_LEVEL="SET_TEXT_FORMALITY_LEVEL";t.setProminentWords=function(e){return{type:r,payload:e}},t.setTextFormalityLevel=function(e){return{type:o,payload:e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setRedirectNotification=function(e){return{type:r,redirectData:e}},t.closeRedirectNotification=function(){return{type:o}};var r=t.SET_REDIRECT_NOTIFICATION="SET_REDIRECT_NOTIFICATION",o=t.CLOSE_REDIRECT_NOTIFICATION="CLOSE_REDIRECT_NOTIFICATION"},,,,,,,,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n",""),{a:wp.element.createElement("a",{href:t,target:"_blank"})}))))};a.propTypes={link:r.default.string.isRequired},t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return(0,window.yoast.editorModules.analysis.getContentLocale)().split("_")[0]}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("undefined"==typeof YoastSEO||void 0===YoastSEO.analysis||void 0===YoastSEO.analysis.worker)return;var r=YoastSEO.analysis.worker;r.loadScript(e).then(function(){return r.loadScript(t)}).then(function(){return r.sendMessage("initialize",{options:n},"YoastSEOPremium")})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("undefined"==typeof YoastSEO||void 0===YoastSEO.analysis||void 0===YoastSEO.analysis.worker)return;var n=YoastSEO.analysis.worker;n.loadScript(e).then(function(){return n.loadScript(t)}).then((0,r.dispatch)("yoast-seo/editor").runAnalysis)};var r=n(5)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(5),o=n(45),s=n(1),i=n(9);var a=function(){var e=(0,r.dispatch)("yoast-seo-premium/editor"),t=e.setProminentWords,n=e.setTextFormalityLevel,a=(0,s.get)(window,"YoastSEO.analysis.worker.runResearch",s.noop),u=(0,s.get)(window,"YoastSEO.analysis.collectData",!1);return function(){var e=u?i.Paper.parse(u()):null;a("getProminentWordsForInsights",e).then(function(e){var t=e.result;return(0,s.reduce)(t,function(e,t){return[].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t","",e),{span:wp.element.createElement(u,null)})},[e]);return wp.element.createElement("div",null,t.length<50&&wp.element.createElement("div",null,wp.element.createElement("p",null,(0,o.__)("Once you add a bit more copy, we'll be able to tell you the formality level of your text.","wordpress-seo"))),t.length>=50&&wp.element.createElement("div",null,wp.element.createElement("p",null,n)))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(5),o=function(e){return e&&e.__esModule?e:{default:e}}(n(56));t.default=(0,r.withSelect)(function(e){var t=e("yoast-seo-premium/editor"),n=t.getLinkSuggestions,r=t.getWordsForLinking,o=t.getLinkSuggestionsMessageData,s=t.linkSuggestionsAreLoading,i=t.linkSuggestionsAreUnindexed;return{suggestions:n(),wordsForLinking:r(),messageData:o(),isLoading:s(),showUnindexedWarning:i()}})(o.default)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(5),o=function(e){return e&&e.__esModule?e:{default:e}}(n(86));t.default=(0,r.withSelect)(function(e){var t=e("yoast-seo-premium/editor"),n=t.getMetaboxWarningIsLoading,r=t.getMetaboxWarning;return{isLoading:n(),warning:r()}})(o.default)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n191&&t.push((0,o.__)("Your keyphrase is too long. It can be a maximum of 191 characters.","wordpress-seo-premium")),t}(t),x=wp.element.createElement(p,{href:wpseoAdminL10n["shortlinks.focus_keyword_info"],className:"dashicons"},wp.element.createElement("span",{className:"screen-reader-text"},(0,o.__)("Help on choosing the perfect keyphrase","wordpress-seo-premium"))),N=wp.element.createElement(p,{href:wpseoAdminL10n["shortlinks.keyword_synonyms_info"],className:"dashicons"},wp.element.createElement("span",{className:"screen-reader-text"},(0,o.__)("Help on keyphrase synonyms","wordpress-seo-premium")));return wp.element.createElement(y,null,function(e){var i="metabox"===e?w:g;return wp.element.createElement(i,{title:M,subTitle:L,prefixIcon:T,prefixIconCollapsed:T,id:"yoast-additional-keyphrase-collapsible-"+P+"-"+e},wp.element.createElement(v,{id:a?"yoast-keyword-input-add-"+e:"yoast-keyword-input-"+P+"-"+e,keyword:t,onChange:n,onFocusKeyword:_,onRemoveKeyword:a?null:O,onBlurKeyword:k,label:(0,o.__)("Keyphrase","wordpress-seo-premium"),helpLink:x,hasError:j.length>0,errorMessages:j}),!a&&wp.element.createElement(r.Fragment,null,wp.element.createElement(u.SynonymsInput,{id:"yoast-synonyms-input-"+P+"-"+e,showLabel:!0,label:(0,o.__)("Synonyms","wordpress-seo-premium"),onChange:b,onBlur:S,onFocus:E,value:c,helpLink:N}),wp.element.createElement(h,null,(0,o.__)("Analysis results","wordpress-seo-premium")),wp.element.createElement(m,{showLanguageNotice:!1,marksButtonClassName:"yoast-tooltip yoast-tooltip-w",editButtonClassName:"yoast-tooltip yoast-tooltip-w",marksButtonStatus:A,results:s,keywordKey:P,location:e})))})}b.propTypes={keyword:i.default.string.isRequired,onChange:i.default.func.isRequired,synonyms:i.default.string,onChangeSynonyms:i.default.func,onRemoveKeyword:i.default.func.isRequired,onFocusKeyword:i.default.func.isRequired,onBlurKeyword:i.default.func.isRequired,onBlurSynonym:i.default.func.isRequired,onFocusSynonym:i.default.func.isRequired,analysis:i.default.array,isAddKeyword:i.default.bool,score:i.default.number,marksButtonStatus:i.default.string,keywordKey:i.default.string.isRequired},b.defaultProps={synonyms:"",onChangeSynonyms:s.noop,analysis:[],isAddKeyword:!1,score:0,marksButtonStatus:"enabled"}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(5),o=n(20),s=function(e){return e&&e.__esModule?e:{default:e}}(n(92));var i=window.yoast.editorModules.containers.SEMrushRelatedKeyphrases;t.default=(0,o.compose)([(0,r.withSelect)(function(e){return{keyphrase:e("yoast-seo/editor").getFocusKeyphrase(),relatedKeyphrases:e("yoast-seo-premium/editor").getKeywords(),renderAction:function(e,t){return wp.element.createElement(s.default,{relatedKeyphrase:e,relatedKeyphrases:t})}}})])(i)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SEMrushRelatedKeyphraseControls=void 0;var r=function(){function e(e,t){for(var n=0;n=4}},{key:"addKeyphraseToList",value:function(){""===this.getAssociatedKeyphraseKey(this.props.relatedKeyphrases,this.props.relatedKeyphrase)&&this.props.addKeyphrase(this.props.relatedKeyphrase)}},{key:"removeKeyphraseFromList",value:function(){var e=this.getAssociatedKeyphraseKey(this.props.relatedKeyphrases,this.props.relatedKeyphrase);""!==e&&this.props.removeKeyphrase(e)}},{key:"componentDidUpdate",value:function(e){var t=this.keyphraseExists(this.props.relatedKeyphrases,this.props.relatedKeyphrase),n=this.keyphraseExists(e.relatedKeyphrases,e.relatedKeyphrase);t&&!n&&this.removeLinkRef.current.focus(),!t&&n&&this.addButtonRef.current.focus()}},{key:"render",value:function(){var e=this.props.relatedKeyphrase,t=this.props.relatedKeyphrases;return t&&this.keyphraseExists(t,e)?wp.element.createElement(s.Fragment,null,wp.element.createElement("span",{className:"yoast-modal__settings-saved"},(0,i.__)("Added!","wordpress-seo-premium")),wp.element.createElement(l.default,{ref:this.removeLinkRef,onRemove:this.removeKeyphraseFromList})):wp.element.createElement(c.default,{buttonRef:this.addButtonRef,disabled:this.relatedKeyphrasesLimitReached(),onAdd:this.addKeyphraseToList})}}]),t}();p.propTypes={relatedKeyphrase:u.default.string,relatedKeyphrases:u.default.array,addKeyphrase:u.default.func.isRequired,removeKeyphrase:u.default.func.isRequired},p.defaultProps={relatedKeyphrase:"",relatedKeyphrases:[]},t.SEMrushRelatedKeyphraseControls=p,t.default=(0,o.withDispatch)(function(e){var t=e("yoast-seo-premium/editor");return{addKeyphrase:t.addRelatedKeyword,removeKeyphrase:t.removeRelatedKeyword}})(p)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),o=n(3);t.default=(0,o.forwardRef)(function(e,t){return wp.element.createElement("button",{ref:t,className:"yoast-remove",onClick:e.onRemove},(0,r.__)("Remove","wordpress-seo-premium"))})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),o=function(e){return e&&e.__esModule?e:{default:e}}(n(4)),s=n(11);var i=function(e){return wp.element.createElement(s.NewButton,{variant:"secondary",small:!0,buttonRef:e.buttonRef,onClick:e.onAdd,disabled:e.disabled},(0,r.__)("Add as related keyphrase","wordpress-seo-premium"))};i.propTypes={buttonRef:o.default.object,onAdd:o.default.func.isRequired,disabled:o.default.bool},i.defaultProps={buttonRef:null,disabled:!1},t.default=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(5),o=n(20),s=n(11);t.default=(0,o.compose)([(0,r.withSelect)(function(e){return{value:(0,e("yoast-seo-premium/editor").getSynonyms)()}}),(0,r.withDispatch)(function(e){var t=e("yoast-seo/editor").setMarkerPauseStatus,n=e("yoast-seo-premium/editor").setSynonyms;return{onChange:function(e){n(e.target.value)},onFocus:function(){t(!0)},onBlur:function(){t(!1)}}})])(s.SynonymsInput)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:[],t=arguments[1],n=t.type,r=t.payload;switch(n){case o.SET_PROMINENT_WORDS:return r;default:return e}},textFormalityLevel:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments[1],n=t.type,r=t.payload;switch(n){case o.SET_TEXT_FORMALITY_LEVEL:return r;default:return e}}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(28),o={suggestions:[],messageData:{hasMetaDescription:!1,hasTitle:!1},wordsForLinking:null,isLoading:!0,showUnindexedWarning:!1};t.default=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o,t=arguments[1];switch(t.type){case r.LOAD_LINK_SUGGESTIONS:return Object.assign({},e,{isLoading:!0});case r.SET_LINK_SUGGESTIONS:return Object.assign({},e,{suggestions:t.linkSuggestions||[],isLoading:!1,showUnindexedWarning:t.showUnindexedWarning});case r.SET_MESSAGE_DATA:return Object.assign({},e,{messageData:{hasMetaDescription:t.messageData.hasMetaDescription,hasTitle:t.messageData.hasTitle},wordsForLinking:t.messageData.prominentWords});case r.SET_WORDS_FOR_LINKING:return Object.assign({},e,{wordsForLinking:t.wordsForLinking});default:return e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(47),o={isLoading:!1,warning:[]};t.default=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o,t=arguments[1];switch(t.type){case r.LOAD_MORPHOLOGY_DATA:return Object.assign({},e,{isLoading:!0});case r.LOAD_MORPHOLOGY_DATA_ERROR:return Object.assign({},e,{isLoading:!1,warning:t.message});default:return e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1);t.default=function(){return arguments.length>0&&void 0!==arguments[0]?arguments[0]:{isProminentWordsAvailable:(0,r.get)(window,"wpseoPremiumMetaboxData.data.isProminentWordsAvailable",!1)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:s,t=arguments[1];switch(t.type){case o.SET_REDIRECT_NOTIFICATION:return r({},e,{redirectData:t.redirectData,isOpen:!0});case o.CLOSE_REDIRECT_NOTIFICATION:return r({},e,{redirectData:{},isOpen:!1});default:return e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];return{availableKeys:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:u,t=arguments[1],n=void 0;switch(t.type){case s.SET_RELATED_KEYWORDS:return n=u.length-t.keywords.length,(0,o.takeRight)(e,n);case s.ADD_RELATED_KEYWORD:return(0,o.tail)(e);case s.REMOVE_RELATED_KEYWORD:return[t.key].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0&&void 0!==arguments[0]?arguments[0]:a,t=arguments[1],n=arguments[2];switch(t.type){case s.SET_RELATED_KEYWORDS:return(0,o.fromPairs)(t.keywords.map(function(e,t){var n=u[t];return[n,r({},e,{key:n})]}));case s.ADD_RELATED_KEYWORD:return r({},e,i({},n,{key:n,keyword:t.keyword}));case s.REMOVE_RELATED_KEYWORD:return(0,o.pickBy)(e,function(e){return e.key!==t.key});case s.CHANGE_RELATED_KEYWORD:return r({},e,i({},t.key,r({},e[t.key],{keyword:t.keyword})));case s.SET_RELATED_KEYWORD_RESULTS:return e[t.key]&&e[t.key].keyword===t.keyword?r({},e,i({},t.key,r({},e[t.key],{results:t.results,score:t.score}))):e;case s.SET_RELATED_KEYWORD_SYNONYMS:return r({},e,i({},t.key,r({},e[t.key],{synonyms:t.synonyms})))}return e}(e.keywords,t,(0,o.head)(e.availableKeys))}};var o=n(1),s=n(35);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a={},u=["a","b","c","d"]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments[1];if(t.type===r.SET_SYNONYMS)return t.synonyms;return e};var r=n(48)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(107);Object.keys(r).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return r[e]}})});var o=n(108);Object.keys(o).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return o[e]}})});var s=n(109);Object.keys(s).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return s[e]}})});var i=n(110);Object.keys(i).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return i[e]}})});var a=n(111);Object.keys(a).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return a[e]}})});var u=n(112);Object.keys(u).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return u[e]}})});var l=n(113);Object.keys(l).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(t,e,{enumerable:!0,get:function(){return l[e]}})})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getTextFormalityLevel=t.getProminentWords=void 0;var r=n(1),o=[];t.getProminentWords=function(e){return(0,r.get)(e,"insights.prominentWords",o)},t.getTextFormalityLevel=function(e){return(0,r.get)(e,"insights.textFormalityLevel",null)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getLinkSuggestions=function(e){return(0,r.get)(e,["linkSuggestions","suggestions"],o)},t.linkSuggestionsAreLoading=function(e){return(0,r.get)(e,["linkSuggestions","isLoading"],!0)},t.linkSuggestionsAreUnindexed=function(e){return(0,r.get)(e,["linkSuggestions","showUnindexedWarning"],!1)},t.getWordsForLinking=function(e){return(0,r.get)(e,["linkSuggestions","wordsForLinking"],null)},t.getLinkSuggestionsMessageData=function(e){return(0,r.get)(e,["linkSuggestions","messageData"],{hasMetaDescription:!1,hasTitle:!1})};var r=n(1),o=[]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getMetaboxWarningIsLoading=function(e){return(0,r.get)(e,"metaboxWarning.isLoading",!0)},t.getMetaboxWarning=function(e){return(0,r.get)(e,"metaboxWarning.warning","")};var r=n(1)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getPreferences=t.getPreference=void 0;var r=n(1);t.getPreference=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return(0,r.get)(e,"preferences."+t,n)},t.getPreferences=function(e){return e.preferences}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getRedirectData=function(e){return(0,r.get)(e,"redirectNotification.redirectData",{})},t.getIsRedirectNotificationOpen=function(e){return(0,r.get)(e,"redirectNotification.isOpen",!1)};var r=n(1)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getKeywordData=function(e,t){return(0,r.get)(e,["relatedKeywords","keywords",t],{keyword:"",analysis:[],score:0,synonyms:""})},t.getKeywords=function(e){return Object.values((0,r.get)(e,["relatedKeywords","keywords"],{}))},t.getFirstAvailableKey=function(e){return(0,r.head)((0,r.get)(e,["relatedKeywords","availableKeys"],[]))||""};var r=n(1)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getSynonyms=function(e){return(0,r.get)(e,["synonyms"],"")};var r=n(1)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=function(){function e(e,t){for(var n=0;n0){var r=e.formatLinkSuggestions(e.linkSuggestions);e.setLinkingSuggestionsOnStore(r)}})}},{key:"markUsedLinks",value:function(e){var t=this.usedLinks||[];return e.forEach(function(e){e.active=t.includes(e.link)}),e}}],[{key:"mapSuggestionsForStore",value:function(e){return e.map(function(e){return{value:e.title,url:e.link,isActive:e.active,labels:e.labels}})}}]),e}();t.default=a},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,n){"use strict";var r=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,s=void 0;try{for(var i,a=e[Symbol.iterator]();!(r=(i=a.next()).done)&&(n.push(i.value),!t||n.length!==t);r=!0);}catch(e){o=!0,s=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw s}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),o=n(13),s=n(3),i=n(2),a=n(45),u=n(1),l=x(n(4)),c=n(14),d=x(n(78)),p=x(n(46)),f=x(n(79)),m=x(n(80)),y=x(n(81)),g=x(n(82)),w=x(n(83)),v=n(28),h=n(47),b=n(35),_=n(48),k=x(n(84)),E=x(n(85)),S=x(n(87)),O=x(n(91)),A=x(n(95)),P=x(n(96)),R=x(n(114)),M=x(n(115)),L=x(n(167)),T=x(n(70)),j=n(17);function x(e){return e&&e.__esModule?e:{default:e}}var N=window.yoast.editorModules.helpers.isBlockEditor,I=window.yoast.editorModules.helpers.i18n.setTextdomainL10n,D=window.yoast.editorModules.components.SidebarItem,K=window.yoast.editorModules.components.higherorder.withYoastSidebarPriority,C=window.yoast.editorModules.analysis.getL10nObject,U=window.yoast.editorModules.components.HelpLink,F=window.yoast.editorModules.components.TopLevelProviders,W=window.yoast.editorModules.components.SidebarCollapsible,Y=window.yoast.editorModules.components.MetaboxCollapsible,G=(0,u.get)(window,"wpseoPremiumMetaboxData.data",{});I("wordpress-seo-premium","wpseoPremiumJSL10n");var B=function(){return!!wpseoScriptData.isTerm},q=function(){return G.seoAnalysisEnabled},z=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];try{return JSON.parse(e)}catch(e){return t}},V=K(function(e){var t=e.store,n=e.theme,r=e.location;return wp.element.createElement(F,{store:t,theme:n,location:r},wp.element.createElement(S.default,null))});V.propTypes={store:l.default.object.isRequired,theme:l.default.object.isRequired,renderPriority:l.default.number.isRequired};var H=function(e){var t=e.theme,n=wp.element.createElement(U,{href:wpseoAdminL10n["shortlinks.keyword_synonyms_info"],className:"dashicons"},wp.element.createElement("span",{className:"screen-reader-text"},(0,i.__)("Help on keyphrase synonyms","wordpress-seo-premium")));return wp.element.createElement(c.ThemeProvider,{theme:t},wp.element.createElement(s.Fragment,null,wp.element.createElement(o.Fill,{name:"yoast-synonyms-metabox"},wp.element.createElement(A.default,{id:"synonyms-input-metabox",label:(0,i.__)("Keyphrase synonyms","wordpress-seo-premium"),helpLink:n})),wp.element.createElement(o.Fill,{name:"yoast-synonyms-sidebar"},wp.element.createElement(A.default,{id:"synonyms-input-sidebar",label:(0,i.__)("Keyphrase synonyms","wordpress-seo-premium"),helpLink:n}))))};H.propTypes={theme:l.default.object.isRequired};var $=K(function(e){var t=e.theme;return wp.element.createElement(c.ThemeProvider,{theme:t},wp.element.createElement(E.default,null))}),Q=function(e){var t=(0,f.default)();if(yoast.analysis.helpers.getLanguagesWithWordFormSupport().includes(t)){var n=e.dispatch.bind(e);n((0,h.loadMorphologyData)());new L.default({siteUrl:G.licensedURL,language:t,setError:function(e){n((0,h.setLoadMorphologyDataError)(e))}}).injectMorphologyData()}},J=function(e){var t=e.dispatch.bind(e);t((0,v.loadLinkSuggestions)());var n=new M.default({dispatch:t,rootUrl:(0,u.get)(G,"restApi.root",""),nonce:(0,u.get)(G,"restApi.nonce",""),currentObjectId:G.currentObjectId,currentObjectType:G.currentObjectType,showUnindexedWarning:G.linkSuggestionsUnindexed,maxWordsToSave:G.perIndexableLimit});return YoastSEO.analysis.linkSuggester=n,function(e){var t=document.getElementById("yoast_internal_linking");if(t){jQuery(t).addClass("closed");var n=function(e){var n=e.children,o=(0,s.useState)(jQuery(t).hasClass("closed")),i=r(o,2),a=i[0],u=i[1];return(0,s.useEffect)(function(){var e=function(){u(jQuery(t).hasClass("closed"))};return jQuery(t).find("div.postbox-header").on("click",e),function(){jQuery(t).find("div.postbox-header").off("click",e)}},[]),jQuery(t).find("button.handlediv").on("click",function(){u(jQuery(t).hasClass("closed"))}),wp.element.createElement(s.Fragment,null,!a&&n)};n.propTypes={children:l.default.node.isRequired},(0,s.render)(wp.element.createElement(n,null,wp.element.createElement(k.default,{suggester:e,location:"classic-sidebar"})),t.getElementsByClassName("inside")[0])}}(n),n},X=function(){var e=(0,P.default)();e.dispatch(j.pluginUrlActions.setPluginUrl((0,u.get)(window,"wpseoPremiumMetaboxData.data.pluginUrl",""))),function(e){var t=e.dispatch,n=B()?"hidden_wpseo":"yoast_wpseo",r=document.getElementById(n+"_focuskeywords"),o=document.getElementById(n+"_keywordsynonyms"),s=z(r.value),i=z(o.value),a=i.shift()||"",u=s.map(function(e,t){var n=i[t];return{keyword:e.keyword,score:e.score,synonyms:n}});t((0,b.setRelatedKeywords)(u)),t((0,_.setSynonyms)(a))}(e);var t=e.getState(),n=t.synonyms,r=T.default.getRelevantData(t);(0,g.default)();var l=null;(0,p.default)()&&(l=J(e));var c=new R.default,f=new T.default;q()&&jQuery(window).on("YoastSEO:numericScore",function(){f.analyze(e.getState(),e.dispatch)}),e.subscribe(function(){var t=e.getState();n!==t.synonyms&&(n=t.synonyms,YoastSEO.app.refresh()),c.persist(t);var o=T.default.getRelevantData(t);T.default.shouldAnalyze(o,r)&&(r=o,f.analyze(t,e.dispatch))}),YoastSEO.app.registerCustomDataCallback(function(){return{synonyms:e.getState().synonyms}}),function(e,t){var n={isRtl:C().isRtl};N()?(0,wp.plugins.registerPlugin)("yoast-seo-premium",{render:function(){return wp.element.createElement(s.Fragment,null,wp.element.createElement(o.Fill,{name:"YoastSidebar"},wp.element.createElement($,{key:"warning-premium",renderPriority:1,store:e,theme:n}),q()&&wp.element.createElement(V,{key:"related-keywords",renderPriority:22,store:e,theme:n,location:"sidebar"}),(0,p.default)()&&t&&wp.element.createElement(D,{key:"link-suggestions",renderPriority:24},wp.element.createElement(F,{store:e,theme:n,location:"sidebar"},wp.element.createElement(W,{id:"yoast-linking-suggestions-collapsible-sidebar",title:(0,i.__)("Internal linking suggestions","wordpress-seo-premium")},wp.element.createElement(k.default,{suggester:t,location:"block-sidebar"}))))),wp.element.createElement(o.Fill,{name:"YoastMetabox"},q()&&wp.element.createElement(V,{key:"related-keywords",renderPriority:21,store:e,theme:n,location:"metabox"}),wp.element.createElement($,{renderPriority:1,store:e,theme:n}),(0,p.default)()&&t&&wp.element.createElement(D,{key:"link-suggestions",renderPriority:25},wp.element.createElement(F,{store:e,theme:n,location:"metabox"},wp.element.createElement(Y,{id:"yoast-linking-suggestions-collapsible-metabox",title:(0,i.__)("Internal linking suggestions","wordpress-seo-premium")},wp.element.createElement(k.default,{suggester:t,location:"block-metabox"}))))),wp.element.createElement(H,{store:e,theme:n}),wp.element.createElement(o.Fill,{name:"YoastRelatedKeyphrases"},wp.element.createElement(O.default,null)),(0,a.isFeatureEnabled)("TEXT_FORMALITY")&&wp.element.createElement(o.Fill,{name:"YoastTextFormalityMetabox"},wp.element.createElement(w.default,null)),(0,a.isFeatureEnabled)("TEXT_FORMALITY")&&wp.element.createElement(o.Fill,{name:"YoastTextFormalitySidebar"},wp.element.createElement(w.default,null)),!!G.workoutsUrl&&wp.element.createElement(d.default,{link:G.workoutsUrl}))}}):YoastSEO._registerReactComponent("yoast-seo-premium",function(){return wp.element.createElement(s.Fragment,null,wp.element.createElement(o.Fill,{name:"YoastMetabox"},q()&&wp.element.createElement(V,{key:"related-keywords",renderPriority:21,store:e,theme:n,location:"metabox"}),wp.element.createElement($,{key:"warning-premium",renderPriority:1,store:e,theme:n}),(0,p.default)()&&t&&!B()&&wp.element.createElement(D,{key:"link-suggestions",renderPriority:25},wp.element.createElement(F,{store:e,theme:n,location:"metabox"},wp.element.createElement(Y,{id:"yoast-linking-suggestions-collapsible-classic-metabox",title:(0,i.__)("Internal linking suggestions","wordpress-seo-premium")},wp.element.createElement(k.default,{suggester:t,location:"classic-metabox"}))))),wp.element.createElement(H,{store:e,theme:n}),wp.element.createElement(o.Fill,{name:"YoastRelatedKeyphrases"},wp.element.createElement(O.default,{store:e})),(0,a.isFeatureEnabled)("TEXT_FORMALITY")&&wp.element.createElement(o.Fill,{name:"YoastTextFormalityMetabox"},wp.element.createElement(w.default,null)),!!G.workoutsUrl&&wp.element.createElement(d.default,{link:G.workoutsUrl}))})}(e,l),Q(e),YoastSEO.app.refresh()};window.jQuery(function(){window.jQuery(window).on("YoastSEO:ready",function(){if(window.wpseoPremiumMetaboxData)try{X(),function(e){YoastSEO.analysis.worker.initialize({translations:e})}(window.wpseoPremiumJSL10n),(0,a.isFeatureEnabled)("TEXT_FORMALITY")&&(0,y.default)(window.wpseoPremiumMetaboxData.data.commonsScriptUrl,window.wpseoPremiumMetaboxData.data.textFormalityScriptUrl),(0,m.default)(window.wpseoPremiumMetaboxData.data.commonsScriptUrl,window.wpseoPremiumMetaboxData.data.premiumAssessmentsScriptUrl,{isTitleAssessmentAvailable:window.wpseoPremiumMetaboxData.data.isTitleAssessmentAvailable,isTextAlignmentAssessmentAvailable:N(),language:(0,f.default)()})}catch(e){console.error(e)}})})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n-1&&i()})})},24:function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ALLOW_EMPTY_TARGET=void 0,t.wpseoDeleteRedirect=r,t.wpseoUndoRedirectForObject=i,t.wpseoRemoveNotification=d,t.wpseoUndoRedirect=function(e,t,o,n,i){r(e,t,o).then(function(e){!0===e.success&&d(i)})},t.wpseoUndoRedirectByObjectId=function(e,t,o){i(e,t).then(function(e){!0===e.success&&d(o)})},t.wpseoCreateRedirect=function(e,t,o,n){var r="";if(410!==parseInt(t,10)&&""===(r=window.prompt(wpseoPremiumStrings.enter_new_url.replace("%s",e))))return void window.alert(wpseoPremiumStrings.error_new_url);jQuery.post(ajaxurl,{action:"wpseo_add_redirect_plain",ajax_nonce:o,redirect:{origin:e,target:r,type:t}},function(e){var o=jQuery(n).closest(".yoast-notification");if(jQuery(o).removeClass("updated").removeClass("error"),jQuery(o).find(".redirect_error").remove(),e.error)jQuery(o).addClass("error").prepend('

              '+e.error.message+"

              ");else{var r="";r=(r=410===parseInt(t,10)?_.escape(wpseoPremiumStrings.redirect_saved_no_target):wpseoPremiumStrings.redirect_saved.replace("%2$s",""+_.escape(e.target)+"")).replace("%1$s",""+_.escape(e.origin)+""),jQuery(o).addClass("updated").html("

              "+r+"

              ")}},"json")};var n=function(e){return e&&e.__esModule?e:{default:e}}(o(10));t.ALLOW_EMPTY_TARGET=[410,451];function r(e,t,o){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"plain";return(0,n.default)({method:"POST",url:wpApiSettings.root+"yoast/v1/redirects/delete",headers:{"X-WP-Nonce":wpApiSettings.nonce},data:{origin:e,target:t,type:o,format:r}})}function i(e,t){return(0,n.default)({method:"POST",url:wpApiSettings.root+"yoast/v1/redirects/undo-for-object",headers:{"X-WP-Nonce":wpApiSettings.nonce},data:{obj_id:e,obj_type:t}})}function d(e){jQuery(e).closest(".yoast-notification").fadeOut("slow")}}},[[160,0]]]); \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-redirect-notifications-2200.min.js b/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-redirect-notifications-2200.min.js deleted file mode 100644 index 27cccc80..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-redirect-notifications-2200.min.js +++ /dev/null @@ -1 +0,0 @@ -(window.yoastPremiumWebpackJsonp=window.yoastPremiumWebpackJsonp||[]).push([[6],{10:function(e,t){e.exports=window.wp.apiFetch},161:function(e,t,o){"use strict";var r=o(24);window.wpseoUndoRedirect=r.wpseoUndoRedirect,window.wpseoUndoRedirectByObjectId=r.wpseoUndoRedirectByObjectId,window.wpseoCreateRedirect=r.wpseoCreateRedirect,window.wpseoDeleteRedirect=r.wpseoDeleteRedirect,window.wpseoRemoveNotification=r.wpseoRemoveNotification},24:function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ALLOW_EMPTY_TARGET=void 0,t.wpseoDeleteRedirect=i,t.wpseoUndoRedirectForObject=n,t.wpseoRemoveNotification=s,t.wpseoUndoRedirect=function(e,t,o,r,n){i(e,t,o).then(function(e){!0===e.success&&s(n)})},t.wpseoUndoRedirectByObjectId=function(e,t,o){n(e,t).then(function(e){!0===e.success&&s(o)})},t.wpseoCreateRedirect=function(e,t,o,r){var i="";if(410!==parseInt(t,10)&&""===(i=window.prompt(wpseoPremiumStrings.enter_new_url.replace("%s",e))))return void window.alert(wpseoPremiumStrings.error_new_url);jQuery.post(ajaxurl,{action:"wpseo_add_redirect_plain",ajax_nonce:o,redirect:{origin:e,target:i,type:t}},function(e){var o=jQuery(r).closest(".yoast-notification");if(jQuery(o).removeClass("updated").removeClass("error"),jQuery(o).find(".redirect_error").remove(),e.error)jQuery(o).addClass("error").prepend('

              '+e.error.message+"

              ");else{var i="";i=(i=410===parseInt(t,10)?_.escape(wpseoPremiumStrings.redirect_saved_no_target):wpseoPremiumStrings.redirect_saved.replace("%2$s",""+_.escape(e.target)+"")).replace("%1$s",""+_.escape(e.origin)+""),jQuery(o).addClass("updated").html("

              "+i+"

              ")}},"json")};var r=function(e){return e&&e.__esModule?e:{default:e}}(o(10));t.ALLOW_EMPTY_TARGET=[410,451];function i(e,t,o){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"plain";return(0,r.default)({method:"POST",url:wpApiSettings.root+"yoast/v1/redirects/delete",headers:{"X-WP-Nonce":wpApiSettings.nonce},data:{origin:e,target:t,type:o,format:i}})}function n(e,t){return(0,r.default)({method:"POST",url:wpApiSettings.root+"yoast/v1/redirects/undo-for-object",headers:{"X-WP-Nonce":wpApiSettings.nonce},data:{obj_id:e,obj_type:t}})}function s(e){jQuery(e).closest(".yoast-notification").fadeOut("slow")}}},[[161,0]]]); \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-redirect-notifications-gutenberg-2200.min.js b/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-redirect-notifications-gutenberg-2200.min.js deleted file mode 100644 index 6b1a2e73..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/wp-seo-premium-redirect-notifications-gutenberg-2200.min.js +++ /dev/null @@ -1 +0,0 @@ -(window.yoastPremiumWebpackJsonp=window.yoastPremiumWebpackJsonp||[]).push([[7],{0:function(e,t){e.exports=React},10:function(e,t){e.exports=window.wp.apiFetch},13:function(e,t){e.exports=window.wp.components},16:function(e,t){e.exports=window.yoast.helpers},162:function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e:{default:e}}(n(163));wp.plugins.registerPlugin("yoast-redirect-notification",{render:r.default})},163:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n'+e.error.message+"

              ");else{var o="";o=(o=410===parseInt(t,10)?_.escape(wpseoPremiumStrings.redirect_saved_no_target):wpseoPremiumStrings.redirect_saved.replace("%2$s",""+_.escape(e.target)+"")).replace("%1$s",""+_.escape(e.origin)+""),jQuery(n).addClass("updated").html("

              "+o+"

              ")}},"json")};var r=function(e){return e&&e.__esModule?e:{default:e}}(n(10));t.ALLOW_EMPTY_TARGET=[410,451];function o(e,t,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"plain";return(0,r.default)({method:"POST",url:wpApiSettings.root+"yoast/v1/redirects/delete",headers:{"X-WP-Nonce":wpApiSettings.nonce},data:{origin:e,target:t,type:n,format:o}})}function i(e,t){return(0,r.default)({method:"POST",url:wpApiSettings.root+"yoast/v1/redirects/undo-for-object",headers:{"X-WP-Nonce":wpApiSettings.nonce},data:{obj_id:e,obj_type:t}})}function a(e){jQuery(e).closest(".yoast-notification").fadeOut("slow")}},25:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=s(n(0)),i=s(n(38)),a=s(n(41));function s(e){return e&&e.__esModule?e:{default:e}}var c=void 0;function u(e,t){var n,a,s,l,p,d,f,m,h=[],y={};for(d=0;d "+c);if("componentClose"===p.type)throw new Error("Missing opening component token: `"+p.value+"`");if("componentOpen"===p.type){n=t[p.value],s=d;break}h.push(t[p.value])}else h.push(p.value);return n&&(l=function(e,t){var n,r,o=t[e],i=0;for(r=e+1;r",lasttranslator:"Yoast Translate Team "},repository:{type:"git",url:"https://github.com/Yoast/wordpress-seo-premium"},scripts:{test:"jest",build:"NODE_ENV=production webpack --config ./config/webpack/webpack.config.dev.js --progress --display-error-details","build:css":"cross-env NODE_ENV=production postcss assets/css/dist/*.css --verbose --replace","build:css:dev":"cross-env NODE_ENV=development postcss assets/css/dist/*.css --verbose --replace",start:"webpack-dev-server --config ./config/webpack/webpack.config.dev.js --progress --env.environment=development --port=8081","webpack-analyze-bundle":"cross-env BUNDLE_ANALYZER=1 NODE_ENV=production webpack --config ./config/webpack/webpack.config.prod.js --progress",postinstall:"patch-package"},devDependencies:{"@draft-js-plugins/emoji":"^4.6.1","@tailwindcss/forms":"^0.5.3","@testing-library/jest-dom":"^6.1.3","@testing-library/react":"^14.0.0","@testing-library/react-hooks":"^8.0.1","@types/react":"^18.2.46","@types/wordpress__blocks":"^12.5.13","@wordpress/babel-plugin-makepot":"^2.0.1","@wordpress/block-editor":"^12.16.0","@wordpress/dependency-extraction-webpack-plugin":"^2.9.0","@yoast/components":"link:vendor/yoast/wordpress-seo/packages/components","@yoast/feature-flag":"^0.5.2","@yoast/grunt-plugin-tasks":"^2.4","@yoast/helpers":"link:vendor/yoast/wordpress-seo/packages/helpers","@yoast/postcss-preset":"link:vendor/yoast/wordpress-seo/packages/postcss-preset","@yoast/style-guide":"link:vendor/yoast/wordpress-seo/packages/style-guide","@yoast/tailwindcss-preset":"link:vendor/yoast/wordpress-seo/packages/tailwindcss-preset","babel-cli":"^6.26.0","babel-core":"^6.13.2","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-plugin-transform-react-jsx":"^6.24.1","babel-preset-env":"^1.7.0","babel-preset-es2015":"^6.13.2","babel-preset-react":"^6.11.1","case-sensitive-paths-webpack-plugin":"^2.1.2","cross-env":"^7.0.2","css-loader":"3.6.0",dotenv:"^8.2.0",envify:"^3.4.1",eslint:"^6.6.0","find-with-regex":"~1.0.2","grunt-git":"^1.0.14","grunt-po2json":"^0.3.0","grunt-webpack":"^3.1.3",jest:"^23.3.0","jest-styled-components":"^7.0.3","patch-package":"^6.4.7",postcss:"^8.4.24","postcss-cli":"^10.1.0","postinstall-postinstall":"^2.1.0","prop-types":"^15.7.2","readline-sync":"^1.4.10","style-loader":"2.0.0","styled-components":"^5.3.6",tailwindcss:"^3.3.2","ts-loader":"^8.0.17",typescript:"^4.2.2",webpack:"^4.20.2","webpack-bundle-analyzer":"^4.2.0","webpack-cli":"^3.1.2","webpack-dev-server":"^3.1.14"},dependencies:{"@headlessui/react":"^1.6.5","@heroicons/react":"^1.0.6","@reduxjs/toolkit":"^1.9.5","@yoast/social-metadata-previews":"link:vendor/yoast/wordpress-seo/packages/social-metadata-previews","a11y-speak":"github:yoast/a11y-speak","babel-loader":"^7.1.5","babel-plugin-dynamic-import-webpack":"^1.1.0","babel-polyfill":"^6.16.0",classnames:"^2.3.2","concat-map":"^0.0.1","grunt-glotpress":"https://github.com/Yoast/grunt-glotpress.git#translationspress","interpolate-components":"^1.1.0",lodash:"^4.7.0","react-json-view":"^1.21.3","react-select":"^5.8.0",sassdash:"^0.9.0",yoastseo:"link:vendor/yoast/wordpress-seo/packages/yoastseo"},resolutions:{yoastseo:"link:vendor/yoast/wordpress-seo/packages/yoastseo","../yoastseo":"link:vendor/yoast/wordpress-seo/packages/yoastseo","@yoast/search-metadata-previews":"link:vendor/yoast/wordpress-seo/packages/search-metadata-previews","@yoast/ui-library":"link:vendor/yoast/wordpress-seo/packages/ui-library"},browserslist:["extends @yoast/browserslist-config"],yoast:{pluginVersion:"22.0"}}},53:function(e,s,t){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.compressWordsForLinking=function(e){var s={};return e.forEach(function(e){s[e.getStem()]=e.getOccurrences()}),s}},54:function(e,s,t){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.determineMorphologyRequestUrl=function(e){var s={en:"v5",de:"v10",es:"v10",fr:"v11",it:"v10",nl:"v9",ru:"v10",id:"v9",pt:"v9",pl:"v9",ar:"v9",sv:"v1",he:"v1",hu:"v2",nb:"v1",tr:"v1",cs:"v1",sk:"v1",el:"v1",ja:"v1"};if(!Object.keys(s).includes(e))return!1;return"https://my.yoast.com/api/downloads/file/morphology-"+e+"-"+s[e]}},9:function(e,s){e.exports=window.yoast.analysis}},[[149,0]]]); \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/yoast-premium-social-metadata-previews-2200.min.js b/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/yoast-premium-social-metadata-previews-2200.min.js deleted file mode 100644 index 82538c85..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/yoast-premium-social-metadata-previews-2200.min.js +++ /dev/null @@ -1 +0,0 @@ -(window.yoastPremiumWebpackJsonp=window.yoastPremiumWebpackJsonp||[]).push([[2],{13:function(e,a){e.exports=window.wp.components},151:function(e,a,i){"use strict";var t=i(152),l=i(13),r=i(3),n=c(i(153)),o=c(i(154));function c(e){return e&&e.__esModule?e:{default:e}}var s=window.yoast.editorModules.helpers.isBlockEditor,u=function(){return wp.element.createElement(r.Fragment,null,wp.element.createElement(l.Fill,{name:"YoastFacebookPremiumMetabox"},function(e){return wp.element.createElement(n.default,e)}),wp.element.createElement(l.Fill,{name:"YoastFacebookPremiumModal"},function(e){return wp.element.createElement(n.default,e)}),wp.element.createElement(l.Fill,{name:"YoastTwitterPremiumMetabox"},function(e){return wp.element.createElement(o.default,e)}),wp.element.createElement(l.Fill,{name:"YoastTwitterPremiumModal"},function(e){return wp.element.createElement(o.default,e)}))};jQuery(window).on("YoastSEO:ready",function(){s()?(0,t.registerPlugin)("yoast-seo-premium-social-previews",{render:u}):YoastSEO._registerReactComponent("yoast-seo-premium-social-previews",u)})},152:function(e,a){e.exports=window.wp.plugins},153:function(e,a,i){"use strict";Object.defineProperty(a,"__esModule",{value:!0});var t=i(2),l=i(34),r=function(e){return e&&e.__esModule?e:{default:e}}(i(4));var n=window.yoast.editorModules.helpers.replacementVariableHelpers.applyReplaceUsingPlugin,o=function(e){var a=e.recommendedReplacementVariables,i=e.replacementVariables,r=e.description,o=e.descriptionInputPlaceholder,c=e.title,s=e.titleInputPlaceholder,u=e.onSelectImageClick,d=e.onRemoveImageClick,m=e.onDescriptionChange,p=e.onTitleChange,g=e.onReplacementVariableSearchChange,f=e.imageWarnings,w=e.imageUrl,b=e.imageFallbackUrl,P=e.isPremium,h=e.siteUrl,v=e.descriptionPreviewFallback,R=e.titlePreviewFallback,k=e.location,C=e.activeMetaTabId,I=e.alt,F=(0,t.__)("Social share preview","wordpress-seo-premium");return wp.element.createElement(l.SocialPreviewEditor,{socialMediumName:"Social",isPremium:P,recommendedReplacementVariables:a,replacementVariables:i,description:r,descriptionInputPlaceholder:o,descriptionPreviewFallback:v,title:c,titleInputPlaceholder:s,titlePreviewFallback:R,onSelectImageClick:u,onRemoveImageClick:d,onDescriptionChange:m,onTitleChange:p,imageWarnings:f,imageUrl:w,imageFallbackUrl:b,siteUrl:h,applyReplacementVariables:n,onReplacementVariableSearchChange:g,socialPreviewLabel:F,idSuffix:k,activeMetaTabId:C,alt:I})};o.propTypes={recommendedReplacementVariables:r.default.array.isRequired,replacementVariables:r.default.array.isRequired,description:r.default.string,title:r.default.string,onSelectImageClick:r.default.func.isRequired,onRemoveImageClick:r.default.func.isRequired,onDescriptionChange:r.default.func.isRequired,onTitleChange:r.default.func.isRequired,onReplacementVariableSearchChange:r.default.func,imageWarnings:r.default.array,imageUrl:r.default.string.isRequired,imageFallbackUrl:r.default.string.isRequired,isPremium:r.default.bool.isRequired,siteUrl:r.default.string,descriptionInputPlaceholder:r.default.string,titleInputPlaceholder:r.default.string,descriptionPreviewFallback:r.default.string,titlePreviewFallback:r.default.string,location:r.default.string,activeMetaTabId:r.default.string,alt:r.default.string},o.defaultProps={imageWarnings:[],title:null,titleInputPlaceholder:"",description:null,descriptionInputPlaceholder:"",descriptionPreviewFallback:"",titlePreviewFallback:"",siteUrl:"",location:"",activeMetaTabId:"",alt:"",onReplacementVariableSearchChange:null},a.default=o},154:function(e,a,i){"use strict";Object.defineProperty(a,"__esModule",{value:!0});var t=i(2),l=i(34),r=function(e){return e&&e.__esModule?e:{default:e}}(i(4));var n=window.yoast.editorModules.helpers.replacementVariableHelpers.applyReplaceUsingPlugin,o=function(e){var a=e.recommendedReplacementVariables,i=e.replacementVariables,r=e.description,o=e.descriptionInputPlaceholder,c=e.title,s=e.titleInputPlaceholder,u=e.onSelectImageClick,d=e.onRemoveImageClick,m=e.onDescriptionChange,p=e.onTitleChange,g=e.onReplacementVariableSearchChange,f=e.imageWarnings,w=e.imageUrl,b=e.imageFallbackUrl,P=e.isPremium,h=e.isLarge,v=e.siteUrl,R=e.descriptionPreviewFallback,k=e.titlePreviewFallback,C=e.location,I=e.alt,F=(0,t.__)("Twitter share preview","wordpress-seo-premium");return wp.element.createElement(l.SocialPreviewEditor,{socialMediumName:"Twitter",isPremium:P,recommendedReplacementVariables:a,replacementVariables:i,description:r,descriptionInputPlaceholder:o,descriptionPreviewFallback:R,title:c,titleInputPlaceholder:s,titlePreviewFallback:k,onSelectImageClick:u,onRemoveImageClick:d,onDescriptionChange:m,onTitleChange:p,onReplacementVariableSearchChange:g,imageWarnings:f,imageUrl:w,imageFallbackUrl:b,isLarge:h,siteUrl:v,applyReplacementVariables:n,socialPreviewLabel:F,idSuffix:C,alt:I})};o.propTypes={recommendedReplacementVariables:r.default.array.isRequired,replacementVariables:r.default.array.isRequired,description:r.default.string,title:r.default.string,onSelectImageClick:r.default.func.isRequired,onRemoveImageClick:r.default.func.isRequired,onDescriptionChange:r.default.func.isRequired,onTitleChange:r.default.func.isRequired,onReplacementVariableSearchChange:r.default.func,imageWarnings:r.default.array,imageUrl:r.default.string,imageFallbackUrl:r.default.string,isPremium:r.default.bool.isRequired,isLarge:r.default.bool,siteUrl:r.default.string,descriptionInputPlaceholder:r.default.string,titleInputPlaceholder:r.default.string,descriptionPreviewFallback:r.default.string,titlePreviewFallback:r.default.string,location:r.default.string,alt:r.default.string},o.defaultProps={imageWarnings:[],title:null,description:null,isLarge:!0,siteUrl:"",descriptionInputPlaceholder:"",descriptionPreviewFallback:"",titleInputPlaceholder:"",titlePreviewFallback:"",imageUrl:"",imageFallbackUrl:"",location:"",alt:"",onReplacementVariableSearchChange:null},a.default=o},2:function(e,a){e.exports=window.wp.i18n},3:function(e,a){e.exports=window.wp.element},34:function(e,a){e.exports=window.yoast.socialMetadataPreviews},4:function(e,a){e.exports=window.yoast.propTypes}},[[151,0]]]); \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/yoast/social-metadata-previews-2200.min.js b/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/yoast/social-metadata-previews-2200.min.js deleted file mode 100644 index 622a1fe1..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/assets/js/dist/yoast/social-metadata-previews-2200.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){var t={};function i(o){if(t[o])return t[o].exports;var a=t[o]={i:o,l:!1,exports:{}};return e[o].call(a.exports,a,a.exports,i),a.l=!0,a.exports}i.m=e,i.c=t,i.d=function(e,t,o){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(i.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)i.d(o,a,function(t){return e[t]}.bind(null,a));return o},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=10)}([function(e,t){e.exports=window.yoast.styledComponents},function(e,t){e.exports=React},function(e,t){e.exports=window.yoast.propTypes},function(e,t){e.exports=window.yoast.socialMetadataForms},function(e,t){e.exports=window.lodash},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=i(1),a=p(o),r=p(i(2)),n=p(i(0)),s=p(i(12)),l=p(i(13)),d=i(15),c=p(d),u=p(i(16));function p(e){return e&&e.__esModule?e:{default:e}}const h=e=>{switch(e){case"landscape":return"527px";case"square":case"portrait":return"369px";default:return"476px"}},f=n.default.div.withConfig({displayName:"FacebookPreview__FacebookPreviewWrapper",componentId:"sc-1nwbyjh-0"})(["box-sizing:border-box;display:flex;flex-direction:",";background-color:#f2f3f5;max-width:527px;"],e=>"landscape"===e.mode?"column":"row"),m=n.default.div.withConfig({displayName:"FacebookPreview__FacebookTextWrapper",componentId:"sc-1nwbyjh-1"})(["box-sizing:border-box;background-color:#f2f3f5;margin:0;padding:10px 12px;position:relative;border-bottom:",";border-top:",";border-right:",";border:",";display:flex;flex-direction:column;flex-grow:1;justify-content:",";font-size:12px;overflow:hidden;"],e=>"landscape"===e.mode?"":"1px solid #dddfe2",e=>"landscape"===e.mode?"":"1px solid #dddfe2",e=>"landscape"===e.mode?"":"1px solid #dddfe2",e=>"landscape"===e.mode?"1px solid #dddfe2":"",e=>"landscape"===e.mode?"flex-start":"center");class g extends o.Component{constructor(e){super(e),this.state={imageMode:null,maxLineCount:0,descriptionLineCount:0},this.facebookTitleRef=a.default.createRef(),this.onImageLoaded=this.onImageLoaded.bind(this),this.onImageEnter=this.props.onMouseHover.bind(this,"image"),this.onTitleEnter=this.props.onMouseHover.bind(this,"title"),this.onDescriptionEnter=this.props.onMouseHover.bind(this,"description"),this.onLeave=this.props.onMouseHover.bind(this,""),this.onSelectTitle=this.props.onSelect.bind(this,"title"),this.onSelectDescription=this.props.onSelect.bind(this,"description")}onImageLoaded(e){this.setState({imageMode:e})}getTitleLineCount(){return this.facebookTitleRef.current.offsetHeight/d.facebookTitleLineHeight}maybeSetMaxLineCount(){var e=this.state;const t=e.imageMode,i=e.maxLineCount,o="landscape"===t?2:5;o!==i&&this.setState({maxLineCount:o})}maybeSetDescriptionLineCount(){var e=this.state;const t=e.descriptionLineCount,i=e.maxLineCount,o=e.imageMode,a=this.getTitleLineCount();let r=i-a;"portrait"===o&&(r=5===a?0:4),r!==t&&this.setState({descriptionLineCount:r})}componentDidUpdate(){this.maybeSetMaxLineCount(),this.maybeSetDescriptionLineCount()}render(){var e=this.state;const t=e.imageMode,i=e.maxLineCount,o=e.descriptionLineCount;return a.default.createElement(f,{id:"facebookPreview",mode:t},a.default.createElement(l.default,{src:this.props.imageUrl||this.props.imageFallbackUrl,alt:this.props.alt,onImageLoaded:this.onImageLoaded,onImageClick:this.props.onImageClick,onMouseEnter:this.onImageEnter,onMouseLeave:this.onLeave}),a.default.createElement(m,{mode:t},a.default.createElement(s.default,{siteUrl:this.props.siteUrl,mode:t}),a.default.createElement(c.default,{ref:this.facebookTitleRef,onMouseEnter:this.onTitleEnter,onMouseLeave:this.onLeave,onClick:this.onSelectTitle,lineCount:i},this.props.title),o>0&&a.default.createElement(u.default,{maxWidth:h(t),onMouseEnter:this.onDescriptionEnter,onMouseLeave:this.onLeave,onClick:this.onSelectDescription,lineCount:o},this.props.description)))}}g.propTypes={siteUrl:r.default.string.isRequired,title:r.default.string.isRequired,description:r.default.string,imageUrl:r.default.string,imageFallbackUrl:r.default.string,alt:r.default.string,onSelect:r.default.func,onImageClick:r.default.func,onMouseHover:r.default.func},g.defaultProps={description:"",alt:"",imageUrl:"",imageFallbackUrl:"",onSelect:()=>{},onImageClick:()=>{},onMouseHover:()=>{}},t.default=g},function(e,t){e.exports=window.wp.i18n},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SocialImage=void 0;var o=n(i(2)),a=n(i(1)),r=n(i(0));function n(e){return e&&e.__esModule?e:{default:e}}const s=r.default.img.withConfig({displayName:"SocialImage__StyledImage",componentId:"sc-1m76ywa-0"})(["&&{max-width:","px;height:","px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-width:none;}"],e=>e.width,e=>e.height),l=r.default.img.withConfig({displayName:"SocialImage__StyledLandscapeImage",componentId:"sc-1m76ywa-1"})(["&&{height:100%;position:absolute;width:100%;object-fit:cover;}"]),d=r.default.div.withConfig({displayName:"SocialImage__WrapperDiv",componentId:"sc-1m76ywa-2"})(["padding-bottom:","%;"],e=>e.aspectRatio),c=t.SocialImage=(e=>{const t=e.imageProps,i=e.width,o=e.height;return"landscape"===e.imageMode?a.default.createElement(d,{aspectRatio:t.aspectRatio},a.default.createElement(l,{src:t.src,alt:t.alt})):a.default.createElement(s,{src:t.src,alt:t.alt,width:i,height:o,imageProperties:t})});c.propTypes={imageProps:o.default.shape({src:o.default.string.isRequired,alt:o.default.string.isRequired,aspectRatio:o.default.number.isRequired}).isRequired,width:o.default.number.isRequired,height:o.default.number.isRequired,imageMode:o.default.string},c.defaultProps={imageMode:"landscape"}},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.retrieveExpectedDimensions=a,t.calculateImageRatios=r,t.calculateLargestDimensions=n,t.calculateImageDimensions=s,t.determineImageProperties=l,t.handleImage=async function(e,t,i=!1){try{const o=await l(e,t,i);return{imageProperties:o,status:"loaded"}}catch(e){return{imageProperties:null,status:"errored"}}};var o=i(3);function a(e){return"Twitter"===e?o.TWITTER_IMAGE_SIZES:o.FACEBOOK_IMAGE_SIZES}function r(e,t,i){return"landscape"===i?{widthRatio:t.width/e.landscapeWidth,heightRatio:t.height/e.landscapeHeight}:"portrait"===i?{widthRatio:t.width/e.portraitWidth,heightRatio:t.height/e.portraitHeight}:{widthRatio:t.width/e.squareWidth,heightRatio:t.height/e.squareHeight}}function n(e,t){return t.widthRatio<=t.heightRatio?{width:Math.round(e.width/t.widthRatio),height:Math.round(e.height/t.widthRatio)}:{width:Math.round(e.width/t.heightRatio),height:Math.round(e.height/t.heightRatio)}}function s(e,t,i){if("square"===i){if(t.width===t.height)return{width:e.squareWidth,height:e.squareHeight};return n(t,r(e,t,i))}return n(t,r(e,t,i))}async function l(e,t,i=!1){const r=await function(e){return new Promise((t,i)=>{const o=new Image;o.onload=(()=>{t({width:o.width,height:o.height})}),o.onerror=i,o.src=e})}(e);let n=i?"landscape":"square";"Facebook"===t&&(n=(0,o.determineFacebookImageMode)(r));const l=s(a(t),r,n);return{mode:n,height:l.height,width:l.width}}},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=i(1),a=p(o),r=p(i(2)),n=p(i(0)),s=p(i(17)),l=p(i(18)),d=p(i(19)),c=p(i(20)),u=p(i(21));function p(e){return e&&e.__esModule?e:{default:e}}const h=n.default.div.withConfig({displayName:"TwitterPreview__TwitterPreviewWrapper",componentId:"sc-16lhv3o-0"})(['font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Ubuntu,"Helvetica Neue",sans-serif;font-size:15px;font-weight:400;line-height:20px;max-width:507px;border:1px solid #E1E8ED;box-sizing:border-box;border-radius:14px;color:#292F33;background:#FFFFFF;text-overflow:ellipsis;display:flex;&:hover{background:#f5f8fa;border:1px solid rgba(136,153,166,.5);}']),f=(0,n.default)(h).withConfig({displayName:"TwitterPreview__LargeTwitterPreviewWrapper",componentId:"sc-16lhv3o-1"})(["flex-direction:column;max-height:370px;"]),m=(0,n.default)(h).withConfig({displayName:"TwitterPreview__SmallTwitterPreviewWrapper",componentId:"sc-16lhv3o-2"})(["flex-direction:row;height:125px;"]);class g extends o.Component{constructor(e){super(e),this.onImageEnter=this.props.onMouseHover.bind(this,"image"),this.onTitleEnter=this.props.onMouseHover.bind(this,"title"),this.onDescriptionEnter=this.props.onMouseHover.bind(this,"description"),this.onLeave=this.props.onMouseHover.bind(this,""),this.onSelectTitle=this.props.onSelect.bind(this,"title"),this.onSelectDescription=this.props.onSelect.bind(this,"description")}render(){var e=this.props;const t=e.isLarge,i=e.imageUrl,o=e.imageFallbackUrl,r=e.alt,n=e.title,p=e.description,h=e.siteUrl,g=t?f:m;return a.default.createElement(g,{id:"twitterPreview"},a.default.createElement(l.default,{src:i||o,alt:r,isLarge:t,onImageClick:this.props.onImageClick,onMouseEnter:this.onImageEnter,onMouseLeave:this.onLeave}),a.default.createElement(d.default,null,a.default.createElement(s.default,{siteUrl:h}),a.default.createElement(c.default,{onMouseEnter:this.onTitleEnter,onMouseLeave:this.onLeave,onClick:this.onSelectTitle},n),a.default.createElement(u.default,{onMouseEnter:this.onDescriptionEnter,onMouseLeave:this.onLeave,onClick:this.onSelectDescription},p)))}}g.propTypes={siteUrl:r.default.string.isRequired,title:r.default.string.isRequired,description:r.default.string,isLarge:r.default.bool,imageUrl:r.default.string,imageFallbackUrl:r.default.string,alt:r.default.string,onSelect:r.default.func,onImageClick:r.default.func,onMouseHover:r.default.func},g.defaultProps={description:"",alt:"",imageUrl:"",imageFallbackUrl:"",onSelect:()=>{},onImageClick:()=>{},onMouseHover:()=>{},isLarge:!0},t.default=g},function(e,t,i){"use strict";window.yoast=window.yoast||{},window.yoast.socialMetadataPreviews=i(11)},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=i(5);Object.defineProperty(t,"FacebookPreview",{enumerable:!0,get:function(){return s(o).default}});var a=i(9);Object.defineProperty(t,"TwitterPreview",{enumerable:!0,get:function(){return s(a).default}});var r=i(22);Object.defineProperty(t,"SocialPreviewEditor",{enumerable:!0,get:function(){return s(r).default}});var n=i(25);function s(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"TWITTER_IMAGE_SIZES",{enumerable:!0,get:function(){return n.TWITTER_IMAGE_SIZES}}),Object.defineProperty(t,"FACEBOOK_IMAGE_SIZES",{enumerable:!0,get:function(){return n.FACEBOOK_IMAGE_SIZES}}),Object.defineProperty(t,"determineFacebookImageMode",{enumerable:!0,get:function(){return n.determineFacebookImageMode}})},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=i(1),a=s(o),r=s(i(0)),n=s(i(2));function s(e){return e&&e.__esModule?e:{default:e}}const l=r.default.p.withConfig({displayName:"FacebookSiteUrl__FacebookSiteUrlWrapper",componentId:"sc-109exs2-0"})(["color:#606770;flex-shrink:0;font-size:12px;line-height:16px;overflow:hidden;padding:0;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap;margin:0;position:",";"],e=>"landscape"===e.mode?"relative":"static"),d=e=>{const t=e.siteUrl;return a.default.createElement(o.Fragment,null,a.default.createElement("span",{className:"screen-reader-text"},t),a.default.createElement(l,{"aria-hidden":"true"},a.default.createElement("span",null,t)))};d.propTypes={siteUrl:n.default.string.isRequired},t.default=d},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=i(1),a=h(o),r=h(i(0)),n=h(i(2)),s=i(6),l=i(4),d=i(3),c=i(14),u=i(7),p=i(8);function h(e){return e&&e.__esModule?e:{default:e}}const f=r.default.div.withConfig({displayName:"FacebookImage__FacebookImageContainer",componentId:"sc-n8g3py-0"})(["position:relative;",";overflow:hidden;background-color:",";"],e=>"landscape"===e.mode?`max-width: ${e.dimensions.width}`:`min-width: ${e.dimensions.width}; height: ${e.dimensions.height}`,c.colors.$color_white),m=r.default.div.withConfig({displayName:"FacebookImage__PlaceholderImage",componentId:"sc-n8g3py-1"})(["box-sizing:border-box;max-width:","px;height:","px;background-color:",";border-style:dashed;border-width:1px;color:#006DAC;background-color:#f1f1f1;display:flex;justify-content:center;align-items:center;text-decoration:underline;font-size:14px;cursor:pointer;"],d.FACEBOOK_IMAGE_SIZES.landscapeWidth,d.FACEBOOK_IMAGE_SIZES.landscapeHeight,c.colors.$color_grey);class g extends o.Component{constructor(e){super(e),this.state={imageProperties:null,status:"loading"},this.socialMedium="Facebook",this.handleFacebookImage=this.handleFacebookImage.bind(this),this.setState=this.setState.bind(this)}async handleFacebookImage(){try{const e=await(0,p.handleImage)(this.props.src,this.socialMedium);this.setState(e),this.props.onImageLoaded(e.imageProperties.mode||"landscape")}catch(e){this.setState(e),this.props.onImageLoaded("landscape")}}componentDidUpdate(e){e.src!==this.props.src&&this.handleFacebookImage()}componentDidMount(){this.handleFacebookImage()}retrieveContainerDimensions(e){switch(e){case"square":return{height:d.FACEBOOK_IMAGE_SIZES.squareHeight+"px",width:d.FACEBOOK_IMAGE_SIZES.squareWidth+"px"};case"portrait":return{height:d.FACEBOOK_IMAGE_SIZES.portraitHeight+"px",width:d.FACEBOOK_IMAGE_SIZES.portraitWidth+"px"};case"landscape":return{height:d.FACEBOOK_IMAGE_SIZES.landscapeHeight+"px",width:d.FACEBOOK_IMAGE_SIZES.landscapeWidth+"px"}}}render(){var e=this.state;const t=e.imageProperties,i=e.status;if("loading"===i||""===this.props.src||"errored"===i)return a.default.createElement(m,{onClick:this.props.onImageClick,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave},(0,s.__)("Select image","wordpress-seo"));const o=this.retrieveContainerDimensions(t.mode);return a.default.createElement(f,{mode:t.mode,dimensions:o,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave,onClick:this.props.onImageClick},a.default.createElement(u.SocialImage,{imageProps:{src:this.props.src,alt:this.props.alt,aspectRatio:d.FACEBOOK_IMAGE_SIZES.aspectRatio},width:t.width,height:t.height,imageMode:t.mode}))}}g.propTypes={src:n.default.string,alt:n.default.string,onImageLoaded:n.default.func,onImageClick:n.default.func,onMouseEnter:n.default.func,onMouseLeave:n.default.func},g.defaultProps={src:"",alt:"",onImageLoaded:l.noop,onImageClick:l.noop,onMouseEnter:l.noop,onMouseLeave:l.noop},t.default=g},function(e,t){e.exports=window.yoast.styleGuide},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.facebookTitleLineHeight=void 0;var o=function(e){return e&&e.__esModule?e:{default:e}}(i(0));const a=t.facebookTitleLineHeight=20,r=o.default.span.withConfig({displayName:"FacebookTitle",componentId:"sc-1cm5c6b-0"})(["line-height:","px;min-height:","px;color:#1d2129;font-weight:600;overflow:hidden;font-size:16px;margin:3px 0 0;letter-spacing:normal;white-space:normal;flex-shrink:0;cursor:pointer;display:-webkit-box;-webkit-line-clamp:",";-webkit-box-orient:vertical;overflow:hidden;"],a,a,e=>e.lineCount);t.default=r},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=function(e){return e&&e.__esModule?e:{default:e}}(i(0)).default.p.withConfig({displayName:"FacebookDescription",componentId:"sc-ulm5bh-0"})(["line-height:","px;min-height:","px;color:#606770;font-size:14px;padding:0;text-overflow:ellipsis;margin:3px 0 0 0;display:-webkit-box;cursor:pointer;-webkit-line-clamp:",";-webkit-box-orient:vertical;overflow:hidden;@media all and ( max-width:"," ){display:none;}"],16,16,e=>e.lineCount,e=>e.maxWidth);t.default=o},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(i(1)),a=n(i(0)),r=n(i(2));function n(e){return e&&e.__esModule?e:{default:e}}const s=a.default.div.withConfig({displayName:"TwitterSiteUrl__TwitterSiteUrlWrapper",componentId:"sc-y2m51b-0"})(["text-transform:lowercase;color:rgb(83,100,113);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0;fill:currentcolor;display:flex;flex-direction:row;align-items:flex-end;"]),l=e=>o.default.createElement(s,null,o.default.createElement("span",null,e.siteUrl));l.propTypes={siteUrl:r.default.string.isRequired},t.default=l},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=i(6),a=i(3),r=i(4),n=u(i(2)),s=u(i(1)),l=u(i(0)),d=i(8),c=i(7);function u(e){return e&&e.__esModule?e:{default:e}}const p=(e,t=!0)=>e?`\n\t\t\tmax-width: ${a.TWITTER_IMAGE_SIZES.landscapeWidth}px;\n\t\t\t${t?"border-bottom: 1px solid #E1E8ED;":""}\n\t\t\tborder-radius: 14px 14px 0 0;\n\t\t\t`:`\n\t\twidth: ${a.TWITTER_IMAGE_SIZES.squareWidth}px;\n\t\t${t?"border-right: 1px solid #E1E8ED;":""}\n\t\tborder-radius: 14px 0 0 14px;\n\t\t`,h=l.default.div.withConfig({displayName:"TwitterImage__TwitterImageContainer",componentId:"sc-y3dnut-0"})(["position:relative;box-sizing:content-box;overflow:hidden;background-color:#e1e8ed;flex-shrink:0;",""],e=>p(e.isLarge)),f=l.default.div.withConfig({displayName:"TwitterImage__BaseImage",componentId:"sc-y3dnut-1"})(["display:flex;justify-content:center;align-items:center;box-sizing:border-box;max-width:100%;margin:0;padding:1em;text-align:center;font-size:1rem;",""],e=>p(e.isLarge,!1)),m=(0,l.default)(f).withConfig({displayName:"TwitterImage__PlaceholderImage",componentId:"sc-y3dnut-2"})([""," border-top-left-radius:14px;",":14px;border-style:dashed;border-width:1px;color:#006DAC;background-color:#f1f1f1;text-decoration:underline;font-size:14px;cursor:pointer;"],e=>e.isLarge&&`height: ${a.TWITTER_IMAGE_SIZES.landscapeHeight}px;`,e=>e.isLarge?"border-top-right-radius":"border-bottom-left-radius");class g extends s.default.Component{constructor(e){super(e),this.state={status:"loading"},this.socialMedium="Twitter",this.handleTwitterImage=this.handleTwitterImage.bind(this),this.setState=this.setState.bind(this)}async handleTwitterImage(){if(null===this.props.src)return;const e=await(0,d.handleImage)(this.props.src,this.socialMedium,this.props.isLarge);this.setState(e)}componentDidUpdate(e){e.src!==this.props.src&&this.handleTwitterImage()}componentDidMount(){this.handleTwitterImage()}render(){var e=this.state;const t=e.status,i=e.imageProperties;return"loading"===t||""===this.props.src||"errored"===t?s.default.createElement(m,{isLarge:this.props.isLarge,onClick:this.props.onImageClick,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave},(0,o.__)("Select image","wordpress-seo")):s.default.createElement(h,{isLarge:this.props.isLarge,onClick:this.props.onImageClick,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave},s.default.createElement(c.SocialImage,{imageProps:{src:this.props.src,alt:this.props.alt,aspectRatio:a.TWITTER_IMAGE_SIZES.aspectRatio},width:i.width,height:i.height,imageMode:i.mode}))}}t.default=g,g.propTypes={isLarge:n.default.bool.isRequired,src:n.default.string,alt:n.default.string,onImageClick:n.default.func,onMouseEnter:n.default.func,onMouseLeave:n.default.func},g.defaultProps={src:"",alt:"",onMouseEnter:r.noop,onImageClick:r.noop,onMouseLeave:r.noop}},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(i(1)),a=n(i(0)),r=n(i(2));function n(e){return e&&e.__esModule?e:{default:e}}const s=a.default.div.withConfig({displayName:"TwitterTextWrapper__Wrapper",componentId:"sc-nrtc3w-0"})(["display:flex;flex-direction:column;padding:12px;justify-content:center;margin:0;box-sizing:border-box;flex:auto;min-width:0px;gap:2px;> *{line-height:20px;min-height:20px;font-size:15px;}"]),l=e=>o.default.createElement(s,null,e.children);l.propTypes={children:r.default.array.isRequired},t.default=l},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=function(e){return e&&e.__esModule?e:{default:e}}(i(0)).default.p.withConfig({displayName:"TwitterTitle",componentId:"sc-2h4g0v-0"})(["white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0;color:rgb(15,20,25);cursor:pointer;"]);t.default=o},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=i(3);const a=function(e){return e&&e.__esModule?e:{default:e}}(i(0)).default.p.withConfig({displayName:"TwitterDescription",componentId:"sc-1kv12fr-0"})(["max-height:55px;overflow:hidden;text-overflow:ellipsis;margin:0;color:rgb(83,100,113);display:-webkit-box;cursor:pointer;-webkit-line-clamp:2;-webkit-box-orient:vertical;@media all and ( max-width:","px ){display:none;}"],o.TWITTER_IMAGE_SIZES.landscapeWidth);t.default=a},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=i(23),a=i(1),r=u(a),n=u(i(2)),s=i(3),l=u(i(5)),d=u(i(9)),c=i(24);function u(e){return e&&e.__esModule?e:{default:e}}class p extends a.Component{constructor(e){super(e),this.state={activeField:"",hoveredField:""},this.SocialPreview="Social"===e.socialMediumName?l.default:d.default,this.setHoveredField=this.setHoveredField.bind(this),this.setActiveField=this.setActiveField.bind(this),this.setEditorRef=this.setEditorRef.bind(this),this.setEditorFocus=this.setEditorFocus.bind(this)}setHoveredField(e){e!==this.state.hoveredField&&this.setState({hoveredField:e})}setActiveField(e){e!==this.state.activeField&&this.setState({activeField:e},()=>this.setEditorFocus(e))}setEditorFocus(e){switch(e){case"title":this.titleEditorRef.focus();break;case"description":this.descriptionEditorRef.focus()}}setEditorRef(e,t){switch(e){case"title":this.titleEditorRef=t;break;case"description":this.descriptionEditorRef=t}}render(){var e=this.props;const t=e.onDescriptionChange,i=e.onTitleChange,a=e.onSelectImageClick,n=e.onRemoveImageClick,l=e.socialMediumName,d=e.imageWarnings,c=e.siteUrl,u=e.description,p=e.descriptionInputPlaceholder,h=e.descriptionPreviewFallback,f=e.imageUrl,m=e.imageFallbackUrl,g=e.alt,b=e.title,w=e.titleInputPlaceholder,v=e.titlePreviewFallback,I=e.replacementVariables,E=e.recommendedReplacementVariables,x=e.applyReplacementVariables,_=e.onReplacementVariableSearchChange,M=e.isPremium,y=e.isLarge,S=e.socialPreviewLabel,C=e.idSuffix,k=e.activeMetaTabId,T=x({title:b||v,description:u||h});return r.default.createElement(r.default.Fragment,null,S&&r.default.createElement(o.SimulatedLabel,null,S),r.default.createElement(this.SocialPreview,{onMouseHover:this.setHoveredField,onSelect:this.setActiveField,onImageClick:a,siteUrl:c,title:T.title,description:T.description,imageUrl:f,imageFallbackUrl:m,alt:g,isLarge:y,activeMetaTabId:k}),r.default.createElement(s.SocialMetadataPreviewForm,{onDescriptionChange:t,socialMediumName:l,title:b,titleInputPlaceholder:w,onRemoveImageClick:n,imageSelected:!!f,imageUrl:f,onTitleChange:i,onSelectImageClick:a,description:u,descriptionInputPlaceholder:p,imageWarnings:d,replacementVariables:I,recommendedReplacementVariables:E,onReplacementVariableSearchChange:_,onMouseHover:this.setHoveredField,hoveredField:this.state.hoveredField,onSelect:this.setActiveField,activeField:this.state.activeField,isPremium:M,setEditorRef:this.setEditorRef,idSuffix:C}))}}p.propTypes={title:n.default.string.isRequired,onTitleChange:n.default.func.isRequired,description:n.default.string.isRequired,onDescriptionChange:n.default.func.isRequired,imageUrl:n.default.string.isRequired,imageFallbackUrl:n.default.string.isRequired,onSelectImageClick:n.default.func.isRequired,onRemoveImageClick:n.default.func.isRequired,socialMediumName:n.default.string.isRequired,alt:n.default.string,isPremium:n.default.bool,imageWarnings:n.default.array,isLarge:n.default.bool,siteUrl:n.default.string,descriptionInputPlaceholder:n.default.string,titleInputPlaceholder:n.default.string,descriptionPreviewFallback:n.default.string,titlePreviewFallback:n.default.string,replacementVariables:c.replacementVariablesShape,recommendedReplacementVariables:c.recommendedReplacementVariablesShape,applyReplacementVariables:n.default.func,onReplacementVariableSearchChange:n.default.func,socialPreviewLabel:n.default.string,idSuffix:n.default.string,activeMetaTabId:n.default.string},p.defaultProps={imageWarnings:[],recommendedReplacementVariables:[],replacementVariables:[],isPremium:!1,isLarge:!0,siteUrl:"",descriptionInputPlaceholder:"",titleInputPlaceholder:"",descriptionPreviewFallback:"",titlePreviewFallback:"",alt:"",applyReplacementVariables:e=>e,onReplacementVariableSearchChange:null,socialPreviewLabel:"",idSuffix:"",activeMetaTabId:""},t.default=p},function(e,t){e.exports=window.yoast.componentsNew},function(e,t){e.exports=window.yoast.replacementVariableEditor},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FACEBOOK_IMAGE_SIZES=t.TWITTER_IMAGE_SIZES=void 0,t.determineFacebookImageMode=function(e){(0,o.logOnce)("@yoast/social-metadata-previews/determineFacebookImageMode","[@yoast/social-metadata-previews] 'determineFacebookImageMode' is deprecated and will be removed in the future, please use this from @yoast/social-metadata-forms instead.");const t=a.largeThreshold;if(e.height>e.width)return"portrait";if(e.width(0,o.logOnce)(`@yoast/social-metadata-previews/TWITTER_IMAGE_SIZES/${e}/${t}`,`[@yoast/social-metadata-previews] "TWITTER_IMAGE_SIZES.${t}" is deprecated and will be removed in the future, `+"please use this from @yoast/social-metadata-forms instead."));const a=t.FACEBOOK_IMAGE_SIZES=(0,o.createObjectWrapper)({squareWidth:158,squareHeight:158,landscapeWidth:527,landscapeHeight:273,portraitWidth:158,portraitHeight:237,aspectRatio:52.2,largeThreshold:{width:446,height:233}},(e,t)=>(0,o.logOnce)(`@yoast/social-metadata-previews/FACEBOOK_IMAGE_SIZES/${e}/${t}`,`[@yoast/social-metadata-previews] "FACEBOOK_IMAGE_SIZES.${t}" is deprecated and will be removed in the future, `+"please use this from @yoast/social-metadata-forms instead."))},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createObjectWrapper=t.logOnce=void 0;var o=i(4);const a={};t.logOnce=((e,t,{log:i=console.warn}={})=>{a[e]||(a[e]=!0,i(t))}),t.createObjectWrapper=((e,t=o.noop)=>{const i={};for(const o in e)Object.hasOwn(e,o)&&Object.defineProperty(i,o,{set:i=>{e[o]=i,t("set",o,i)},get:()=>(t("get",o),e[o])});return i})}]); \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/blocks/siblings-block.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/blocks/siblings-block.php deleted file mode 100644 index 26636271..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/blocks/siblings-block.php +++ /dev/null @@ -1,84 +0,0 @@ -indexable_repository = $indexable_repository; - } - - /** - * Presents the block output. - * - * @param array $attributes The block attributes. - * - * @return string The block output. - */ - public function present( $attributes ) { - $post_parent_id = \wp_get_post_parent_id( null ); - if ( $post_parent_id === false || $post_parent_id === 0 ) { - return ''; - } - $indexables = $this->indexable_repository->get_subpages_by_post_parent( - $post_parent_id, - [ \get_the_ID() ] - ); - - $links = \array_map( - static function ( Indexable $indexable ) { - return [ - 'title' => $indexable->breadcrumb_title, - 'permalink' => $indexable->permalink, - ]; - }, - $indexables - ); - - if ( empty( $links ) ) { - return ''; - } - - $class_name = 'yoast-url-list'; - if ( ! empty( $attributes['className'] ) ) { - $class_name .= ' ' . \esc_attr( $attributes['className'] ); - } - - $presenter = new Url_List_Presenter( $links, $class_name ); - - return $presenter->present(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/blocks/subpages-block.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/blocks/subpages-block.php deleted file mode 100644 index cb886ae9..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/blocks/subpages-block.php +++ /dev/null @@ -1,77 +0,0 @@ -indexable_repository = $indexable_repository; - } - - /** - * Presents the block output. - * - * @param array $attributes The block attributes. - * - * @return string The block output. - */ - public function present( $attributes ) { - $indexables = $this->indexable_repository->get_subpages_by_post_parent( \get_the_ID() ); - - $links = \array_map( - static function ( Indexable $indexable ) { - return [ - 'title' => $indexable->breadcrumb_title, - 'permalink' => $indexable->permalink, - ]; - }, - $indexables - ); - - if ( empty( $links ) ) { - return ''; - } - - $class_name = 'yoast-url-list'; - if ( ! empty( $attributes['className'] ) ) { - $class_name .= ' ' . \esc_attr( $attributes['className'] ); - } - - $presenter = new Url_List_Presenter( $links, $class_name ); - - return $presenter->present(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/custom-fields-plugin.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/custom-fields-plugin.php deleted file mode 100644 index bc02110e..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/custom-fields-plugin.php +++ /dev/null @@ -1,115 +0,0 @@ -localize_script() ); - } - - /** - * Loads the custom fields translations. - * - * @return array The fields to localize. - */ - public function localize_script() { - return [ - 'custom_field_names' => $this->get_custom_field_names(), - ]; - } - - /** - * Retrieve all custom field names set in SEO -> - * - * @return array The custom field names. - */ - protected function get_custom_field_names() { - $custom_field_names = []; - - $post = $this->get_post(); - - if ( ! is_object( $post ) ) { - return $custom_field_names; - } - - $options = $this->get_titles_from_options(); - $target_option = 'page-analyse-extra-' . $post->post_type; - - if ( array_key_exists( $target_option, $options ) ) { - $custom_field_names = explode( ',', $options[ $target_option ] ); - } - - return $custom_field_names; - } - - /** - * Retrieves post data given a post ID or the global. - * - * @codeCoverageIgnore Method relies on dependencies. - * - * @return WP_Post|array|null Returns a post if found, otherwise returns an empty array. - */ - protected function get_post() { - // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Reason: We are not controlling the request. - if ( isset( $_GET['post'] ) && is_string( $_GET['post'] ) ) { - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are casting the unsafe value to an integer. - $post_id = (int) wp_unslash( $_GET['post'] ); - if ( $post_id > 0 ) { - return get_post( $post_id ); - } - } - // phpcs:enable WordPress.Security.NonceVerification.Recommended - - if ( isset( $GLOBALS['post'] ) ) { - return $GLOBALS['post']; - } - - return []; - } - - /** - * Retrieves the value of the WPSEO_Titles option. - * - * @codeCoverageIgnore Method relies on the options. - * - * @return array The value from WPSEO_Titles option. - */ - protected function get_titles_from_options() { - $option_name = WPSEO_Options::get_option_instance( 'wpseo_titles' )->option_name; - - return get_option( $option_name, [] ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-csv.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-csv.php deleted file mode 100644 index e50c0965..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-csv.php +++ /dev/null @@ -1,228 +0,0 @@ -columns = array_filter( $columns, 'is_string' ); - } - - /** - * Echoes the CSV headers - * - * @return void - */ - public function print_headers() { - // phpcs:ignore WordPress.Security.EscapeOutput -- Correctly escaped in get_headers() method below. - echo $this->get_headers(); - } - - /** - * Echoes a formatted row. - * - * @param array $row Row to add to the export. - * - * @return void - */ - public function print_row( $row ) { - echo $this->format( $row ); - } - - /** - * Returns the CSV headers based on the queried columns. - * - * @return string The headers in CSV format. - */ - protected function get_headers() { - $header_columns = [ - 'title' => esc_html__( 'title', 'wordpress-seo-premium' ), - 'url' => esc_html__( 'url', 'wordpress-seo-premium' ), - 'readability_score' => esc_html__( 'readability score', 'wordpress-seo-premium' ), - 'keywords' => esc_html__( 'keyphrase', 'wordpress-seo-premium' ), - 'keywords_score' => esc_html__( 'keyphrase score', 'wordpress-seo-premium' ), - 'seo_title' => esc_html__( 'seo title', 'wordpress-seo-premium' ), - 'meta_description' => esc_html__( 'meta description', 'wordpress-seo-premium' ), - ]; - - $csv = $this->sanitize_csv_column( esc_html__( 'ID', 'wordpress-seo-premium' ) ); - $csv .= ',' . $this->sanitize_csv_column( esc_html_x( 'type', 'post_type of a post or the taxonomy of a term', 'wordpress-seo-premium' ) ); - - foreach ( $this->columns as $column ) { - if ( array_key_exists( $column, $header_columns ) ) { - $csv .= ',' . $this->sanitize_csv_column( $header_columns[ $column ] ); - } - } - - return $csv . PHP_EOL; - } - - /** - * Formats a WPSEO_Export_Keywords_Query result as a CSV line. - * In case of multiple keywords it will return multiple lines. - * - * @param array $result A result as returned from WPSEO_Export_Keywords_Query::get_data. - * - * @return string A line of CSV, beginning with EOL. - */ - protected function format( array $result ) { - // If our input is malformed return an empty string. - if ( ! array_key_exists( 'ID', $result ) || ! array_key_exists( 'type', $result ) ) { - return ''; - } - - // Ensure we have arrays in the keywords. - $result['keywords'] = $this->get_array_from_result( $result, 'keywords' ); - $result['keywords_score'] = $this->get_array_from_result( $result, 'keywords_score' ); - - $csv = ''; - - // Add at least one row plus additional ones if we have more keywords. - $keywords = max( 1, count( $result['keywords'] ) ); - for ( $keywords_index = 0; $keywords_index < $keywords; $keywords_index++ ) { - // Add static columns. - $csv .= $this->sanitize_csv_column( $result['ID'] ); - $csv .= ',' . $this->sanitize_csv_column( $result['type'] ); - - // Add dynamic columns. - foreach ( $this->columns as $column ) { - $csv .= $this->get_csv_column_from_result( $result, $column, $keywords_index ); - } - - $csv .= PHP_EOL; - } - - return $csv; - } - - /** - * Returns a CSV column, including comma, from the result object based on the specified key - * - * @param array $result The result object. - * @param string $key The key of the value to get the CSV column for. - * @param int $keywords_index The number keyword to output. - * - * @return string CSV formatted column. - */ - protected function get_csv_column_from_result( array $result, $key, $keywords_index ) { - if ( in_array( $key, [ 'title', 'url', 'seo_title', 'meta_description', 'readability_score' ], true ) ) { - return $this->get_csv_string_column_from_result( $result, $key ); - } - - if ( in_array( $key, [ 'keywords', 'keywords_score' ], true ) ) { - return $this->get_csv_array_column_from_result( $result, $key, $keywords_index ); - } - - return ''; - } - - /** - * Returns an array from the result object. - * - * @param array $result The result object. - * @param string $key The key of the array to retrieve. - * - * @return array Contents of the key in the object. - */ - protected function get_array_from_result( array $result, $key ) { - if ( array_key_exists( $key, $result ) && is_array( $result[ $key ] ) ) { - return $result[ $key ]; - } - - return []; - } - - /** - * Returns a CSV column, including comma, from the result object by the specified key. - * Expects the value to be a string. - * - * @param array $result The result object to get the CSV column from. - * @param string $key The key of the value to get the CSV column for. - * - * @return string A CSV formatted column. - */ - protected function get_csv_string_column_from_result( array $result, $key ) { - if ( array_key_exists( $key, $result ) ) { - return ',' . $this->sanitize_csv_column( $result[ $key ] ); - } - - return ','; - } - - /** - * Returns a CSV column, including comma, from the result object by the specified key. - * Expects the value to be inside an array. - * - * @param array $result The result object to get the CSV column from. - * @param string $key The key of the array to get the CSV column for. - * @param int $index The index of the value in the array. - * - * @return string A CSV formatted column. - */ - protected function get_csv_array_column_from_result( array $result, $key, $index ) { - // If the array has an element at $index. - if ( $index < count( $result[ $key ] ) ) { - return ',' . $this->sanitize_csv_column( $result[ $key ][ $index ] ); - } - - return ','; - } - - /** - * Sanitizes a value to be output as a CSV value. - * - * @param string $value The value to sanitize. - * - * @return string The sanitized value. - */ - protected function sanitize_csv_column( $value ) { - // Return an empty string if value is null. - if ( $value === null ) { - return ''; - } - - // Convert non-string values to strings. - if ( ! is_string( $value ) ) { - $value = var_export( $value, true ); - } - - // Replace all whitespace with spaces because Excel can't deal with newlines and tabs even if escaped. - $value = preg_replace( '/\s/', ' ', $value ); - - // Escape double quotes. - $value = str_replace( '"', '""', $value ); - - // Return the value enclosed in double quotes. - return '"' . $value . '"'; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-post-presenter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-post-presenter.php deleted file mode 100644 index f415c2d5..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-post-presenter.php +++ /dev/null @@ -1,230 +0,0 @@ -columns = array_filter( $columns, 'is_string' ); - } - - /** - * Creates a presentable result by modifying and adding the requested fields. - * - * @param array $result The result to modify. - * - * @return array The modified result or an empty array if the result is considered invalid. - */ - public function present( array $result ) { - if ( ! $this->validate_result( $result ) ) { - return []; - } - - foreach ( $this->columns as $column ) { - $result = $this->prepare_column_result( $result, $column ); - } - - $result['type'] = $result['post_type']; - unset( $result['post_type'] ); - - return $result; - } - - /** - * Prepares the passed result to make it more presentable. - * - * @param array $result The result to modify. - * @param string $column The requested column. - * - * @return array The prepared result. - */ - protected function prepare_column_result( array $result, $column ) { - switch ( $column ) { - case 'title': - // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Using WP native filter. - $result['title'] = apply_filters( 'the_title', $result['post_title'], $result['ID'] ); - unset( $result['post_title'] ); - break; - case 'url': - $result['url'] = get_permalink( $result['ID'] ); - break; - case 'readability_score': - $result['readability_score'] = WPSEO_Rank::from_numeric_score( (int) $result['readability_score'] )->get_label(); - break; - case 'keywords': - $result = $this->convert_result_keywords( $result ); - break; - } - - return $result; - } - - /** - * Returns whether a result to present is a valid result. - * - * @param array $result The result to validate. - * - * @return bool True for a value valid result. - */ - protected function validate_result( array $result ) { - // If there is no ID then it's not valid. - if ( ! array_key_exists( 'ID', $result ) ) { - return false; - } - - // If a title is requested but not present then it's not valid. - if ( $this->column_is_present( 'title' ) && $this->has_title( $result ) === false ) { - return false; - } - - return true; - } - - /** - * Determines if the result contains a valid title. - * - * @param array $result The result array to check for a title. - * - * @return bool Whether or not a title is valid. - */ - protected function has_title( $result ) { - if ( ! is_array( $result ) || ! array_key_exists( 'post_title', $result ) ) { - return false; - } - - return is_string( $result['post_title'] ); - } - - /** - * Determines if the wanted column exists within the $this->columns class variable. - * - * @param string $column The column to search for. - * - * @return bool Whether or not the column exists. - */ - protected function column_is_present( $column ) { - if ( ! is_string( $column ) ) { - return false; - } - - return in_array( $column, $this->columns, true ); - } - - /** - * Converts the results of the query from strings and JSON string to keyword arrays. - * - * @param array $result The result to convert. - * - * @return array The converted result. - */ - protected function convert_result_keywords( array $result ) { - $result['keywords'] = []; - - if ( $this->column_is_present( 'keywords_score' ) ) { - $result['keywords_score'] = []; - } - - if ( $this->has_primary_keyword( $result ) ) { - $result['keywords'][] = $result['primary_keyword']; - - // Convert multiple keywords from the Premium plugin from json to string arrays. - $keywords = $this->parse_result_keywords_json( $result, 'other_keywords' ); - - $other_keywords = wp_list_pluck( $keywords, 'keyword' ); - $result['keywords'] = array_merge( $result['keywords'], $other_keywords ); - - if ( $this->column_is_present( 'keywords_score' ) ) { - $result['keywords_score'] = $this->get_result_keywords_scores( $result, $keywords ); - } - } - - // Unset all old variables, if they do not exist nothing will happen. - unset( $result['primary_keyword'], $result['primary_keyword_score'], $result['other_keywords'] ); - - return $result; - } - - /** - * Determines whether there's a valid primary keyword present in the result array. - * - * @param array $result The result array to check for the primary_keyword key. - * - * @return bool Whether or not a valid primary keyword is present. - */ - protected function has_primary_keyword( $result ) { - if ( ! is_array( $result ) || ! array_key_exists( 'primary_keyword', $result ) ) { - return false; - } - - return is_string( $result['primary_keyword'] ) && ! empty( $result['primary_keyword'] ); - } - - /** - * Parses then keywords JSON string in the result object for the specified key. - * - * @param array $result The result object. - * @param string $key The key containing the JSON. - * - * @return array The parsed keywords. - */ - protected function parse_result_keywords_json( array $result, $key ) { - if ( empty( $result[ $key ] ) ) { - return []; - } - - $parsed = json_decode( $result[ $key ], true ); - - if ( ! $parsed ) { - return []; - } - - return $parsed; - } - - /** - * Returns an array of all scores from the result object and the parsed keywords JSON. - * - * @param array $result The result object. - * @param array $keywords The parsed keywords. - * - * @return array The keyword scores. - */ - protected function get_result_keywords_scores( array $result, $keywords ) { - $scores = []; - - $rank = WPSEO_Rank::from_numeric_score( (int) $result['primary_keyword_score'] ); - $scores[] = $rank->get_label(); - - foreach ( $keywords as $keyword ) { - if ( isset( $keyword['score'] ) ) { - $rank = new WPSEO_Rank( $keyword['score'] ); - $scores[] = $rank->get_label(); - } - } - - return $scores; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-post-query.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-post-query.php deleted file mode 100644 index c1dfabd7..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-post-query.php +++ /dev/null @@ -1,183 +0,0 @@ -page_size = max( 1, (int) $page_size ); - - $this->set_columns( $columns ); - } - - /** - * Constructs the query and executes it, returning an array of objects containing the columns this object was - * constructed with. Every object will always contain the ID column. - * - * @param int $page Paginated page to retrieve. - * - * @return array An array of associative arrays containing the keys as requested in the constructor. - */ - public function get_data( $page = 1 ) { - global $wpdb; - - if ( $this->columns === [] ) { - return []; - } - - $post_types = WPSEO_Post_Type::get_accessible_post_types(); - if ( empty( $post_types ) ) { - return []; - } - - // Pages have a starting index of 1, we need to convert to a 0 based offset. - $offset_multiplier = max( 0, ( $page - 1 ) ); - - $replacements = []; - $replacements[] = $wpdb->posts; - $replacements[] = 'post_status'; - $replacements[] = 'post_type'; - $replacements = array_merge( $replacements, $post_types ); - $replacements[] = $this->page_size; - $replacements[] = ( $offset_multiplier * $this->page_size ); - - // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.PreparedSQLPlaceholders.UnsupportedPlaceholder,WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Already prepared, and no cache applicable. - return $wpdb->get_results( - $wpdb->prepare( - 'SELECT ' . implode( ', ', $this->selects ) - . ' FROM %i AS posts ' - . implode( ' ', $this->joins ) - . ' WHERE posts.%i = "publish" AND posts.%i IN (' - . implode( ',', array_fill( 0, count( $post_types ), '%s' ) ) . ')' - . ' LIMIT %d OFFSET %d', - $replacements - ), - ARRAY_A - ); - // phpcs:enable - } - - /** - * Prepares the necessary selects and joins to get all data in a single query. - * - * @param array $columns The columns we want our query to return. - * - * @return void - */ - public function set_columns( array $columns ) { - $this->columns = $columns; - - $this->joins = []; - $this->selects = [ 'posts.ID', 'posts.post_type' ]; - - if ( in_array( 'title', $this->columns, true ) ) { - $this->selects[] = 'posts.post_title'; - } - - // If we're selecting keywords_score then we always want the keywords as well. - if ( in_array( 'keywords', $this->columns, true ) || in_array( 'keywords_score', $this->columns, true ) ) { - $this->add_meta_join( 'primary_keyword', WPSEO_Meta::$meta_prefix . 'focuskw' ); - $this->add_meta_join( 'other_keywords', WPSEO_Meta::$meta_prefix . 'focuskeywords' ); - } - - if ( in_array( 'readability_score', $this->columns, true ) ) { - $this->add_meta_join( 'readability_score', WPSEO_Meta::$meta_prefix . 'content_score' ); - } - - if ( in_array( 'keywords_score', $this->columns, true ) ) { - // Score for other keywords is already in the other_keywords select so only join for the primary_keyword_score. - $this->add_meta_join( 'primary_keyword_score', WPSEO_Meta::$meta_prefix . 'linkdex' ); - } - - if ( in_array( 'seo_title', $this->columns, true ) ) { - $this->add_meta_join( 'seo_title', WPSEO_Meta::$meta_prefix . 'title' ); - } - - if ( in_array( 'meta_description', $this->columns, true ) ) { - $this->add_meta_join( 'meta_description', WPSEO_Meta::$meta_prefix . 'metadesc' ); - } - } - - /** - * Returns the page size for the query. - * - * @return int Page size that is being used. - */ - public function get_page_size() { - return $this->page_size; - } - - /** - * Adds an aliased join to the $wpdb->postmeta table so that multiple meta values can be selected in a single row. - * - * While this function should never be used with user input, - * all non-word non-digit characters are removed from both params for increased robustness. - * - * @param string $alias The alias to use in our query output. - * @param string $key The meta_key to select. - * - * @return void - */ - protected function add_meta_join( $alias, $key ) { - global $wpdb; - $alias = preg_replace( '/[^\w\d]/', '', $alias ); - $key = preg_replace( '/[^\w\d]/', '', $key ); - - $this->selects[] = $alias . '_join.meta_value AS ' . $alias; - $this->joins[] = 'LEFT OUTER JOIN ' . $wpdb->prefix . 'postmeta AS ' . $alias . '_join ' - . 'ON ' . $alias . '_join.post_id = posts.ID ' - . 'AND ' . $alias . '_join.meta_key = "' . $key . '"'; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-presenter-interface.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-presenter-interface.php deleted file mode 100644 index 9d1e1865..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-presenter-interface.php +++ /dev/null @@ -1,33 +0,0 @@ -columns = array_filter( $columns, 'is_string' ); - } - - /** - * Creates a presentable result by modifying and adding the requested fields. - * - * @param array $result The result to modify. - * - * @return array The modified result or an empty array if the result is considered invalid. - */ - public function present( array $result ) { - if ( ! $this->validate_result( $result ) ) { - return []; - } - - $result['ID'] = (int) $result['term_id']; - unset( $result['term_id'] ); - - foreach ( $this->columns as $column ) { - $result = $this->prepare_column_result( $result, $column ); - } - - $result['type'] = $result['taxonomy']; - unset( $result['taxonomy'] ); - - return $result; - } - - /** - * Prepares the passed result to make it more presentable. - * - * @param array $result The result to modify. - * @param string $column The requested column. - * - * @return array The prepared result. - */ - protected function prepare_column_result( array $result, $column ) { - switch ( $column ) { - case 'keywords': - $result['keywords'] = $this->get_result_keywords( $result ); - break; - case 'keywords_score': - $result['keywords_score'] = $this->get_result_keywords_score( $result ); - break; - case 'url': - $result['url'] = get_term_link( $result['ID'], $result['taxonomy'] ); - break; - case 'title': - $result['title'] = $result['name']; - unset( $result['name'] ); - break; - case 'seo_title': - $result['seo_title'] = WPSEO_Taxonomy_Meta::get_term_meta( $result['ID'], $result['taxonomy'], 'title' ); - break; - case 'meta_description': - $result['meta_description'] = WPSEO_Taxonomy_Meta::get_term_meta( $result['ID'], $result['taxonomy'], 'desc' ); - break; - case 'readability_score': - $content_score = WPSEO_Taxonomy_Meta::get_term_meta( $result['ID'], $result['taxonomy'], 'content_score' ); - $result['readability_score'] = WPSEO_Rank::from_numeric_score( (int) $content_score )->get_label(); - break; - } - - return $result; - } - - /** - * Returns whether a result to present is a valid result. - * - * @param array $result The result to validate. - * - * @return bool True if the result is validated. - */ - protected function validate_result( array $result ) { - // If there is no ID then it's not valid. - if ( ! array_key_exists( 'term_id', $result ) ) { - return false; - } - - // If a title is requested but not present then it's not valid. - if ( $this->column_is_present( 'title' ) && $this->has_title( $result ) === false ) { - return false; - } - - return true; - } - - /** - * Determines if the result contains a valid title. - * - * @param array $result The result array to check for a title. - * - * @return bool Whether or not a title is valid. - */ - protected function has_title( $result ) { - if ( ! is_array( $result ) || ! array_key_exists( 'name', $result ) ) { - return false; - } - - return is_string( $result['name'] ); - } - - /** - * Determines if the wanted column exists within the $this->columns class variable. - * - * @param string $column The column to search for. - * - * @return bool Whether or not the column exists. - */ - protected function column_is_present( $column ) { - if ( ! is_string( $column ) ) { - return false; - } - - return in_array( $column, $this->columns, true ); - } - - /** - * Gets the result keywords from WPSEO_Taxonomy_Meta. - * - * @param array $result The result to get the keywords for. - * - * @return array The keywords. - */ - protected function get_result_keywords( array $result ) { - $keyword = WPSEO_Taxonomy_Meta::get_term_meta( $result['ID'], $result['taxonomy'], 'focuskw' ); - - if ( $keyword === false || empty( $keyword ) ) { - return []; - } - - return [ (string) $keyword ]; - } - - /** - * Gets the result keyword scores from WPSEO_Taxonomy_Meta. - * - * @param array $result The result to get the keyword scores for. - * - * @return array The keyword scores. - */ - protected function get_result_keywords_score( array $result ) { - $keyword_score = WPSEO_Taxonomy_Meta::get_term_meta( $result['ID'], $result['taxonomy'], 'linkdex' ); - - if ( $keyword_score === false || empty( $keyword_score ) ) { - return []; - } - - $keyword_score_label = WPSEO_Rank::from_numeric_score( (int) $keyword_score )->get_label(); - - return [ $keyword_score_label ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-term-query.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-term-query.php deleted file mode 100644 index 8377a01f..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/export/export-keywords-term-query.php +++ /dev/null @@ -1,132 +0,0 @@ -page_size = max( 1, (int) $page_size ); - $this->set_columns( $columns ); - } - - /** - * Returns the page size for the query. - * - * @return int Page size that is being used. - */ - public function get_page_size() { - return $this->page_size; - } - - /** - * Constructs the query and executes it, returning an array of objects containing the columns this object was constructed with. - * Every object will always contain the ID column. - * - * @param int $page Paginated page to retrieve. - * - * @return array An array of associative arrays containing the keys as requested in the constructor. - */ - public function get_data( $page = 1 ) { - - global $wpdb; - - if ( $this->columns === [] ) { - return []; - } - - $taxonomies = get_taxonomies( - [ - 'public' => true, - 'show_ui' => true, - ], - 'names' - ); - - if ( empty( $taxonomies ) ) { - return []; - } - - // Pages have a starting index of 1, we need to convert to a 0 based offset. - $offset_multiplier = max( 0, ( $page - 1 ) ); - - $replacements = []; - $replacements[] = $wpdb->terms; - $replacements[] = $wpdb->term_taxonomy; - $replacements[] = 'term_id'; - $replacements[] = 'term_id'; - $replacements[] = 'taxonomy'; - $replacements = array_merge( $replacements, $taxonomies ); - $replacements[] = $this->page_size; - $replacements[] = ( $offset_multiplier * $this->page_size ); - - // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.PreparedSQLPlaceholders.UnsupportedPlaceholder,WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Already prepared, and no cache applicable. - return $wpdb->get_results( - $wpdb->prepare( - 'SELECT ' . implode( ', ', $this->selects ) - . ' FROM %i AS terms' - . ' INNER JOIN %i AS taxonomies' - . ' ON terms.%i = taxonomies.%i AND taxonomies.%i IN (' - . implode( ',', array_fill( 0, count( $taxonomies ), '%s' ) ) . ')' - . ' LIMIT %d OFFSET %d', - $replacements - ), - ARRAY_A - ); - // phpcs:enable - } - - /** - * Prepares the necessary selects and joins to get all data in a single query. - * - * @param array $columns The columns we want our query to return. - * - * @return void - */ - public function set_columns( array $columns ) { - $this->columns = $columns; - - $this->selects = [ 'terms.term_id', 'taxonomies.taxonomy' ]; - - if ( in_array( 'title', $this->columns, true ) ) { - $this->selects[] = 'terms.name'; - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/metabox-link-suggestions.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/metabox-link-suggestions.php deleted file mode 100644 index 1b6d1d03..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/metabox-link-suggestions.php +++ /dev/null @@ -1,115 +0,0 @@ -is_block_editor() ) { - return; - } - - $post_types = $this->get_post_types(); - - array_map( [ $this, 'add_meta_box' ], $post_types ); - } - - /** - * Returns whether the link suggestions are available for the given post type. - * - * @param string $post_type The post type for which to check if the link suggestions are available. - * - * @return bool Whether the link suggestions are available for the given post type. - */ - public function is_available( $post_type ) { - $allowed_post_types = $this->get_post_types(); - - return in_array( $post_type, $allowed_post_types, true ); - } - - /** - * Renders the content for the metabox. We leave this empty because we render with React. - * - * @return void - */ - public function render_metabox_content() { - echo ''; - } - - /** - * Returns all the public post types. - * - * @return array The supported post types. - */ - protected function get_post_types() { - $prominent_words_support = new WPSEO_Premium_Prominent_Words_Support(); - - return $prominent_words_support->get_supported_post_types(); - } - - /** - * Returns whether or not the Link Suggestions are enabled. - * - * @return bool Whether or not the link suggestions are enabled. - */ - public function is_enabled() { - return WPSEO_Options::get( 'enable_link_suggestions', false ); - } - - /** - * Adds a meta box for the given post type. - * - * @param string $post_type The post type to add a meta box for. - * - * @return void - */ - protected function add_meta_box( $post_type ) { - if ( ! $this->is_available( $post_type ) || ! $this->is_enabled() ) { - return; - } - - if ( ! WPSEO_Premium_Metabox::are_content_endpoints_available() ) { - return; - } - - add_meta_box( - 'yoast_internal_linking', - sprintf( - /* translators: %s expands to Yoast */ - __( '%s internal linking', 'wordpress-seo-premium' ), - 'Yoast' - ), - [ $this, 'render_metabox_content' ], - $post_type, - 'side', - 'low', - [ - '__block_editor_compatible_meta_box' => true, - ] - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/multi-keyword.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/multi-keyword.php deleted file mode 100644 index 1b9d7d74..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/multi-keyword.php +++ /dev/null @@ -1,118 +0,0 @@ - 'hidden', - 'title' => 'focuskeywords', - ]; - } - - return $field_defs; - } - - /** - * Add field in which we can save multiple keyword synonyms. - * - * @param array $field_defs The current fields definitions. - * - * @return array Field definitions with our added field. - */ - public function add_keyword_synonyms_input( $field_defs ) { - if ( is_array( $field_defs ) ) { - $field_defs['keywordsynonyms'] = [ - 'type' => 'hidden', - 'title' => 'keywordsynonyms', - ]; - } - - return $field_defs; - } - - /** - * Adds a field to the taxonomy metabox in which we can save multiple keywords. - * - * @param array $fields The current fields. - * - * @return array Fields including our added field. - */ - public function add_focus_keywords_taxonomy_input( $fields ) { - if ( is_array( $fields ) ) { - $fields['focuskeywords'] = [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - ]; - } - - return $fields; - } - - /** - * Adds a field in which we can save multiple keyword synonyms. - * - * @param array $fields The current fields. - * - * @return array Fields including our added field. - */ - public function add_keyword_synonyms_taxonomy_input( $fields ) { - if ( is_array( $fields ) ) { - $fields['keywordsynonyms'] = [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - ]; - } - - return $fields; - } - - /** - * Extends the taxonomy defaults. - * - * @param array $defaults The defaults to extend. - * - * @return array The extended defaults. - */ - public function register_taxonomy_metafields( $defaults ) { - $defaults['wpseo_focuskeywords'] = ''; - $defaults['wpseo_keywordsynonyms'] = ''; - - return $defaults; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/post-watcher.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/post-watcher.php deleted file mode 100644 index b99e1663..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/post-watcher.php +++ /dev/null @@ -1,603 +0,0 @@ -is_rest_request() && ! $this->post_redirect_can_be_made( $pagenow ) ) { - return; - } - - // Detect a post slug change. - add_action( 'post_updated', [ $this, 'detect_slug_change' ], 12, 3 ); - - // Detect a post trash. - add_action( 'wp_trash_post', [ $this, 'detect_post_trash' ] ); - - // Detect a post untrash. - add_action( 'untrashed_post', [ $this, 'detect_post_untrash' ] ); - - // Detect a post delete. - add_action( 'before_delete_post', [ $this, 'detect_post_delete' ] ); - } - - /** - * Registers the page scripts. - * - * @codeCoverageIgnore Method used WordPress functions. - * - * @param string $current_page The page that is opened at the moment. - * - * @return void - */ - public function page_scripts( $current_page ) { - // Register the scripts. - parent::page_scripts( $current_page ); - - /** - * If in Gutenberg, always load these scripts. - */ - if ( WPSEO_Metabox::is_post_edit( $current_page ) && wp_script_is( 'wp-editor', 'enqueued' ) ) { - /** - * Filter: 'Yoast\WP\SEO\show_post_redirect_slug_change_notification' - Allows to suppress the block editor notification - * about automatic redirect creation when the post slug is changed. - * - * The middleware used to intercept the redirect creation and trigger the notice can interfere with the API - * call since it passes the full response on instead of its content. Using this filter, it can be disabled. - * Notice that this doesn't prevent the actual redirect from being created. - * - * @since 21.9 - * - * @param bool $show_notification Determines if the notification should be displayed. - */ - $show_notification = apply_filters( 'Yoast\WP\SEO\show_post_redirect_slug_change_notification', true ); - - if ( $show_notification ) { - wp_enqueue_script( 'wp-seo-premium-redirect-notifications' ); - wp_enqueue_script( 'wp-seo-premium-redirect-notifications-gutenberg' ); - } - return; - } - - if ( ! $this->post_redirect_can_be_made( $current_page ) ) { - return; - } - - if ( WPSEO_Metabox::is_post_overview( $current_page ) ) { - wp_enqueue_script( 'wp-seo-premium-quickedit-notification' ); - } - - if ( WPSEO_Metabox::is_post_edit( $current_page ) ) { - wp_enqueue_script( 'wp-seo-premium-redirect-notifications' ); - } - } - - /** - * Detect if the slug changed, hooked into 'post_updated'. - * - * @param int $post_id The ID of the post. - * @param WP_Post $post The post with the new values. - * @param WP_Post $post_before The post with the previous values. - * - * @return bool - */ - public function detect_slug_change( $post_id, $post, $post_before ) { - // Bail if this is a multisite installation and the site has been switched. - if ( is_multisite() && ms_is_switched() ) { - return false; - } - - if ( ! $this->is_redirect_relevant( $post, $post_before ) ) { - return false; - } - - $this->remove_colliding_redirect( $post, $post_before ); - - /** - * Filter: 'Yoast\WP\SEO\post_redirect_slug_change' - Check if a redirect should be created - * on post slug change. - * - * Note: This is a Premium plugin-only hook. - * - * @since 12.9.0 - * - * @param bool $create_redirect Determines if a redirect should be created for this post slug change. - * @param int $post_id The ID of the post. - * @param WP_Post $post The current post object. - * @param WP_Post $previous_post The previous post object. - */ - $create_redirect = apply_filters( 'Yoast\WP\SEO\post_redirect_slug_change', false, $post_id, $post, $post_before ); - - if ( $create_redirect === true ) { - return true; - } - - $old_url = $this->get_target_url( $post_before ); - if ( ! $old_url ) { - return false; - } - - // If the post URL wasn't public before, or isn't public now, don't even check if we have to redirect. - if ( ! $this->check_public_post_status( $post_before ) || ! $this->check_public_post_status( $post ) ) { - return false; - } - - // Get the new URL. - $new_url = $this->get_target_url( $post_id ); - - // Maybe we can undo the created redirect. - $created_redirect = $this->notify_undo_slug_redirect( $old_url, $new_url, $post_id, 'post' ); - - if ( $created_redirect ) { - $redirect_info = [ - 'origin' => $created_redirect->get_origin(), - 'target' => $created_redirect->get_target(), - 'type' => $created_redirect->get_type(), - 'format' => $created_redirect->get_format(), - ]; - update_post_meta( $post_id, '_yoast_post_redirect_info', $redirect_info ); - } - } - - /** - * Removes a colliding redirect if it is found. - * - * @param WP_Post $post The post with the new values. - * @param WP_Post $post_before The post with the previous values. - * - * @return void - */ - protected function remove_colliding_redirect( $post, $post_before ) { - $redirect = $this->get_redirect_manager()->get_redirect( $this->get_target_url( $post ) ); - if ( $redirect === false ) { - return; - } - - if ( $redirect->get_target() !== trim( $this->get_target_url( $post_before ), '/' ) ) { - return; - } - - $this->get_redirect_manager()->delete_redirects( [ $redirect ] ); - } - - /** - * Determines if redirect is relevant for the provided post. - * - * @param WP_Post $post The post with the new values. - * @param WP_Post $post_before The post with the previous values. - * - * @return bool True if a redirect might be relevant. - */ - protected function is_redirect_relevant( $post, $post_before ) { - // Check if the post type is enabled for redirects. - $post_type = get_post_type( $post ); - - /** - * Filter: 'Yoast\WP\SEO\redirect_post_type' - Check if a redirect should be created - * on post slug change for specified post type. - * - * Note: This is a Premium plugin-only hook. - * - * @since 12.9.0 - * - * @param bool $create_redirect Determines if a redirect should be created for this post type. - * @param string $post_type The post type that is being checked for. - */ - $post_type_accessible = apply_filters( 'Yoast\WP\SEO\redirect_post_type', WPSEO_Post_Type::is_post_type_accessible( $post_type ), $post_type ); - - if ( ! $post_type_accessible ) { - return false; - } - - // If post is a revision do not create redirect. - if ( wp_is_post_revision( $post_before ) !== false && wp_is_post_revision( $post ) !== false ) { - return false; - } - - // There is no slug change. - if ( $this->get_target_url( $post ) === $this->get_target_url( $post_before ) ) { - return false; - } - - return true; - } - - /** - * Checks whether the given post is public or not. - * - * @param int|WP_Post $post Post ID or post object. - * - * @return bool - */ - private function check_public_post_status( $post ) { - $public_post_statuses = [ - 'publish', - 'static', - 'private', - ]; - - // Need to set $post_id for backward compatibility with the filter, as $post can also be an object now. - if ( is_int( $post ) ) { - $post_id = $post; - } - else { - $post_id = $post->ID; - } - - /** - * Filter: 'Yoast\WP\SEO\public_post_statuses' - Allow changing the statuses that are expected - * to have caused a URL to be public. - * - * Note: This is a Premium plugin-only hook. - * - * @since 12.9.0 - * - * @param array $published_post_statuses The statuses that'll be treated as published. - * @param object $post The post object we're doing the published check for. - */ - $public_post_statuses = apply_filters( 'Yoast\WP\SEO\public_post_statuses', $public_post_statuses, $post_id ); - - return ( in_array( get_post_status( $post ), $public_post_statuses, true ) ); - } - - /** - * Offer to create a redirect from the post that is about to get trashed. - * - * @param int $post_id The current post ID. - * - * @return void - */ - public function detect_post_trash( $post_id ) { - - $url = $this->check_if_redirect_needed( $post_id ); - if ( ! empty( $url ) ) { - - $id = 'wpseo_redirect_' . md5( $url ); - - // Format the message. - $message = sprintf( - /* translators: %1$s: Yoast SEO Premium, %2$s: List with actions, %3$s: , %4$s: , %5$s: Slug to post */ - __( '%1$s detected that you moved a post (%5$s) to the trash. You can either: %2$s Don\'t know what to do? %3$sRead this post%4$s.', 'wordpress-seo-premium' ), - 'Yoast SEO Premium', - $this->get_delete_action_list( $url, $id ), - '', - '', - '' . $url . '' - ); - - $this->create_notification( $message, 'trash' ); - } - } - - /** - * Offer to create a redirect from the post that is about to get restored from the trash. - * - * @param int $post_id The current post ID. - * - * @return void - */ - public function detect_post_untrash( $post_id ) { - $redirect = $this->check_if_redirect_needed( $post_id, true ); - - if ( $redirect ) { - - $id = 'wpseo_undo_redirect_' . md5( $redirect->get_origin() ); - - // Format the message. - $message = sprintf( - /* translators: %1$s: Yoast SEO Premium, %2$s: , %3$s: , %4$s: Slug to post */ - __( '%1$s detected that you restored a post (%4$s) from the trash, for which a redirect was created. %2$sClick here to remove the redirect%3$s', 'wordpress-seo-premium' ), - 'Yoast SEO Premium', - '', - '' . $redirect->get_origin() . '' - ); - - $this->create_notification( $message, 'untrash' ); - } - } - - /** - * Offer to create a redirect from the post that is about to get deleted. - * - * @param int $post_id The current post ID. - * - * @return void - */ - public function detect_post_delete( $post_id ) { - - // We don't want to redirect menu items. - if ( is_nav_menu_item( $post_id ) ) { - return; - } - - // When the post comes from the trash or if the post is a revision then skip further execution. - if ( get_post_status( $post_id ) === 'trash' || wp_is_post_revision( $post_id ) ) { - return; - } - - // Is a redirect needed. - $url = $this->check_if_redirect_needed( $post_id ); - if ( ! empty( $url ) ) { - $this->set_delete_notification( $url ); - } - } - - /** - * Look up if URL does exists in the current redirects. - * - * @param string $url URL to search for. - * - * @return bool - */ - protected function get_redirect( $url ) { - return $this->get_redirect_manager()->get_redirect( $url ); - } - - /** - * This method checks if a redirect is needed. - * - * This method will check if URL as redirect already exists. - * - * @param int $post_id The current post ID. - * @param bool $should_exist Boolean to determine if the URL should be exist as a redirect. - * - * @return WPSEO_Redirect|string|bool - */ - protected function check_if_redirect_needed( $post_id, $should_exist = false ) { - // If the post type is not public, don't redirect. - $post_type = get_post_type_object( get_post_type( $post_id ) ); - - if ( ! $post_type ) { - return false; - } - - if ( ! in_array( $post_type->name, $this->get_included_automatic_redirection_post_types(), true ) ) { - return false; - } - - // The post types should be a public one. - if ( $this->check_public_post_status( $post_id ) ) { - // Get the right URL. - $url = $this->get_target_url( $post_id ); - - // If $url is not a single /, there may be the option to create a redirect. - if ( $url !== '/' ) { - // Message should only be shown if there isn't already a redirect. - $redirect = $this->get_redirect( $url ); - - if ( is_a( $redirect, 'WPSEO_Redirect' ) && $should_exist ) { - return $redirect; - } - if ( ! is_a( $redirect, 'WPSEO_Redirect' ) && ! $should_exist ) { - return $url; - } - } - } - return false; - } - - /** - * Retrieves the post types to create automatic redirects for. - * - * @return array Post types to include to create automatic redirects for. - */ - protected function get_included_automatic_redirection_post_types() { - $post_types = WPSEO_Post_Type::get_accessible_post_types(); - - /** - * Filter: 'Yoast\WP\SEO\automatic_redirection_post_types' - Post types to create - * automatic redirects for. - * - * Note: This is a Premium plugin-only hook. - * - * @since 12.9.0 - * - * @param array $included_post_types Array with the post type names to include to automatic redirection. - */ - $included_post_types = apply_filters( 'Yoast\WP\SEO\automatic_redirection_post_types', $post_types ); - - if ( ! is_array( $included_post_types ) ) { - $included_post_types = []; - } - - return $included_post_types; - } - - /** - * Retrieves the path of the URL for the supplied post. - * - * @param int|WP_Post $post The current post ID. - * - * @return string The URL for the supplied post. - */ - protected function get_target_url( $post ) { - // Use the correct URL path. - $url = wp_parse_url( get_permalink( $post ) ); - if ( is_array( $url ) && isset( $url['path'] ) ) { - return $url['path']; - } - - return ''; - } - - /** - * Get the old URL. - * - * @param object $post The post object with the new values. - * @param object $post_before The post object with the old values. - * - * @return bool|string - */ - protected function get_old_url( $post, $post_before ) { - $wpseo_old_post_url = $this->get_post_old_post_url(); - - if ( ! empty( $wpseo_old_post_url ) ) { - return $wpseo_old_post_url; - } - - // Check if request is inline action and new slug is not old slug, if so set wpseo_post_old_url. - $action = $this->get_post_action(); - - $url_before = $this->get_target_url( $post_before ); - if ( ! empty( $action ) && $action === 'inline-save' && $this->get_target_url( $post ) !== $url_before ) { - return $url_before; - } - - return false; - } - - /** - * Determines whether we're dealing with a REST request or not. - * - * @return bool Whether or not the current request is a REST request. - */ - private function is_rest_request() { - return defined( 'REST_REQUEST' ) && REST_REQUEST === true; - } - - /** - * Returns the undo message for the post. - * - * @return string - */ - protected function get_undo_slug_notification() { - /* translators: %1$s: Yoast SEO Premium, %2$s and %3$s expand to a link to the admin page. */ - return __( - '%1$s created a %2$sredirect%3$s from the old post URL to the new post URL.', - 'wordpress-seo-premium' - ); - } - - /** - * Returns the delete message for the post. - * - * @return string - */ - protected function get_delete_notification() { - /* translators: %1$s: Yoast SEO Premium, %2$s: List with actions, %3$s: , %4$s: , %5%s: The removed url. */ - return __( - '%1$s detected that you deleted a post (%5$s). You can either: %2$s Don\'t know what to do? %3$sRead this post %4$s.', - 'wordpress-seo-premium' - ); - } - - /** - * Is the current page valid to make a redirect from. - * - * @param string $current_page The currently opened page. - * - * @return bool True when a redirect can be made on this page. - */ - protected function post_redirect_can_be_made( $current_page ) { - return $this->is_post_page( $current_page ) || $this->is_action_inline_save() || $this->is_nested_pages( $current_page ); - } - - /** - * Is the current page related to a post (edit/overview). - * - * @param string $current_page The current opened page. - * - * @return bool True when page is a post edit/overview page. - */ - protected function is_post_page( $current_page ) { - return ( in_array( $current_page, [ 'edit.php', 'post.php' ], true ) ); - } - - /** - * Is the page in an AJAX-request and is the action "inline save". - * - * @return bool True when in an AJAX-request and the action is inline-save. - */ - protected function is_action_inline_save() { - return ( wp_doing_ajax() && $this->get_post_action() === 'inline-save' ); - } - - /** - * Checks if current page is loaded by nested pages. - * - * @param string $current_page The current page. - * - * @return bool True when the current page is nested pages. - */ - protected function is_nested_pages( $current_page ) { - // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Reason: We are not controlling the request. - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are strictly comparing only. - return ( $current_page === 'admin.php' && isset( $_GET['page'] ) && is_string( $_GET['page'] ) && wp_unslash( $_GET['page'] ) === 'nestedpages' ); - // phpcs:enable WordPress.Security.NonceVerification.Recommended. - } - - /** - * Retrieves wpseo_old_post_url field from the post. - * - * @return string|bool - */ - protected function get_post_old_post_url() { - // phpcs:disable WordPress.Security.NonceVerification.Missing -- Reason: Seems to be only used in tests. - if ( isset( $_POST['wpseo_old_post_url'] ) && is_string( $_POST['wpseo_old_post_url'] ) ) { - return sanitize_text_field( wp_unslash( $_POST['wpseo_old_post_url'] ) ); - } - // phpcs:enable WordPress.Security.NonceVerification.Missing. - return false; - } - - /** - * Retrieves action field from the post. - * - * @return string|bool - */ - protected function get_post_action() { - // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Reason: We are not controlling the request. - if ( isset( $_POST['action'] ) && is_string( $_POST['action'] ) ) { - return sanitize_text_field( wp_unslash( $_POST['action'] ) ); - } - // phpcs:enable WordPress.Security.NonceVerification.Recommended. - return false; - } - - /** - * Display the undo redirect notification - * - * @param WPSEO_Redirect $redirect The old URL to the post. - * @param int $object_id The post or term ID. - * @param string $object_type The object type: post or term. - * - * @return void - */ - protected function set_undo_slug_notification( WPSEO_Redirect $redirect, $object_id, $object_type ) { - - if ( ! $this->is_rest_request() && ! wp_doing_ajax() ) { - parent::set_undo_slug_notification( $redirect, $object_id, $object_type ); - - return; - } - - header( 'X-Yoast-Redirect-Created: 1; origin=' . $redirect->get_origin() . '; target=' . $redirect->get_target() . '; type=' . $redirect->get_type() . '; objectId=' . $object_id . '; objectType=' . $object_type ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-asset-js-l10n.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-asset-js-l10n.php deleted file mode 100644 index f5a63afb..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-asset-js-l10n.php +++ /dev/null @@ -1,47 +0,0 @@ - $this->get_translations( 'wordpress-seo-premiumjs' ), - ]; - wp_localize_script( $script_handle, 'wpseoPremiumJSL10n', $translations ); - } - - /** - * Returns translations necessary for JS files. - * - * @param string $component The component to retrieve the translations for. - * @return object|null The translations in a Jed format for JS files or null - * if the translation file could not be found. - */ - protected function get_translations( $component ) { - $locale = get_user_locale(); - - $file = plugin_dir_path( WPSEO_PREMIUM_FILE ) . '/languages/' . $component . '-' . $locale . '.json'; - if ( file_exists( $file ) ) { - $file = file_get_contents( $file ); - if ( is_string( $file ) && $file !== '' ) { - return json_decode( $file, true ); - } - } - - return null; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-assets.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-assets.php deleted file mode 100644 index 0cc68e85..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-assets.php +++ /dev/null @@ -1,503 +0,0 @@ -get_version(); - $scripts = $this->get_scripts( $version ); - $styles = $this->get_styles( $version ); - - array_walk( $scripts, [ $this, 'register_script' ] ); - array_walk( $styles, [ $this, 'register_style' ] ); - } - - /** - * Registers the assets for premium. - * - * @return void - */ - public function register_frontend_assets() { - $version = $this->get_version(); - $scripts = $this->get_frontend_scripts( $version ); - - array_walk( $scripts, [ $this, 'register_script' ] ); - } - - /** - * Retrieves a flatten version. - * - * @codeCoverageIgnore Method uses a dependency. - * - * @return string The flatten version. - */ - protected function get_version() { - $asset_manager = new WPSEO_Admin_Asset_Manager(); - - return $asset_manager->flatten_version( WPSEO_PREMIUM_VERSION ); - } - - /** - * Retrieves an array of script to register. - * - * @codeCoverageIgnore Returns a simple dataset. - * - * @param string $version Current version number. - * - * @return array The scripts. - */ - protected function get_frontend_scripts( $version ) { - return [ - [ - 'name' => 'yoast-seo-premium-commons', - 'path' => 'assets/js/dist/', - 'filename' => 'commons-premium-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [], - ], - [ - 'name' => 'yoast-seo-premium-frontend-inspector', - 'path' => 'assets/js/dist/', - 'filename' => 'frontend-inspector-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'lodash', - 'react', - 'react-dom', - 'wp-data', - 'wp-dom-ready', - 'wp-element', - 'wp-i18n', - 'yoast-seo-premium-commons', - WPSEO_Admin_Asset_Manager::PREFIX . 'frontend-inspector-resources', - WPSEO_Admin_Asset_Manager::PREFIX . 'prop-types-package', - WPSEO_Admin_Asset_Manager::PREFIX . 'style-guide', - WPSEO_Admin_Asset_Manager::PREFIX . 'yoast-components', - ], - 'in_footer' => true, - ], - ]; - } - - /** - * Retrieves an array of script to register. - * - * @codeCoverageIgnore Returns a simple dataset. - * - * @param string $version Current version number. - * - * @return array The scripts. - */ - protected function get_scripts( $version ) { - return [ - [ - 'name' => 'yoast-seo-premium-commons', - 'path' => 'assets/js/dist/', - 'filename' => 'commons-premium-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [], - ], - [ - 'name' => 'yoast-seo-premium-metabox', - 'path' => 'assets/js/dist/', - 'filename' => 'wp-seo-premium-metabox-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'clipboard', - 'jquery', - 'regenerator-runtime', - 'underscore', - 'wp-api-fetch', - 'wp-components', - 'wp-data', - 'wp-element', - 'wp-i18n', - 'wp-util', - 'yoast-seo-premium-commons', - WPSEO_Admin_Asset_Manager::PREFIX . 'analysis', - WPSEO_Admin_Asset_Manager::PREFIX . 'editor-modules', - WPSEO_Admin_Asset_Manager::PREFIX . 'help-scout-beacon', - WPSEO_Admin_Asset_Manager::PREFIX . 'search-metadata-previews', - WPSEO_Admin_Asset_Manager::PREFIX . 'social-metadata-forms', - WPSEO_Admin_Asset_Manager::PREFIX . 'social-metadata-previews-package', - WPSEO_Admin_Asset_Manager::PREFIX . 'yoast-components', - ], - ], - [ - 'name' => 'yoast-seo-premium-draft-js-plugins', - 'path' => 'assets/js/dist/', - 'filename' => 'wp-seo-premium-draft-js-plugins-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'in_footer' => true, - 'dependencies' => [ - 'yoast-seo-premium-commons', - WPSEO_Admin_Asset_Manager::PREFIX . 'search-metadata-previews', - ], - ], - [ - 'name' => 'yoast-seo-premium-workouts', - 'path' => 'assets/js/dist/', - 'filename' => 'workouts-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'clipboard', - 'lodash', - 'regenerator-runtime', - 'wp-api-fetch', - 'wp-a11y', - 'wp-components', - 'wp-compose', - 'wp-data', - 'wp-dom-ready', - 'wp-element', - 'wp-i18n', - 'yoast-seo-premium-commons', - WPSEO_Admin_Asset_Manager::PREFIX . 'analysis', - WPSEO_Admin_Asset_Manager::PREFIX . 'admin-modules', - WPSEO_Admin_Asset_Manager::PREFIX . 'react-select', - WPSEO_Admin_Asset_Manager::PREFIX . 'yoast-components', - ], - ], - [ - 'name' => 'yoast-seo-social-metadata-previews-package', - 'path' => 'assets/js/dist/yoast/', - 'filename' => 'social-metadata-previews-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'in_footer' => true, - 'dependencies' => [ - 'lodash', - 'wp-a11y', - 'wp-components', - 'wp-element', - 'wp-i18n', - WPSEO_Admin_Asset_Manager::PREFIX . 'analysis', - WPSEO_Admin_Asset_Manager::PREFIX . 'draft-js', - WPSEO_Admin_Asset_Manager::PREFIX . 'editor-modules', - WPSEO_Admin_Asset_Manager::PREFIX . 'helpers', - WPSEO_Admin_Asset_Manager::PREFIX . 'replacement-variable-editor', - WPSEO_Admin_Asset_Manager::PREFIX . 'social-metadata-forms', - WPSEO_Admin_Asset_Manager::PREFIX . 'style-guide', - WPSEO_Admin_Asset_Manager::PREFIX . 'styled-components', - WPSEO_Admin_Asset_Manager::PREFIX . 'yoast-components', - ], - ], - [ - 'name' => 'yoast-social-metadata-previews', - 'path' => 'assets/js/dist/', - 'filename' => 'yoast-premium-social-metadata-previews-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'in_footer' => true, - 'dependencies' => [ - 'wp-components', - 'wp-element', - 'wp-plugins', - WPSEO_Admin_Asset_Manager::PREFIX . 'editor-modules', - WPSEO_Admin_Asset_Manager::PREFIX . 'search-metadata-previews', - WPSEO_Admin_Asset_Manager::PREFIX . 'social-metadata-previews-package', - ], - ], - [ - 'name' => 'wp-seo-premium-custom-fields-plugin', - 'path' => 'assets/js/dist/', - 'filename' => 'wp-seo-premium-custom-fields-plugin-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'jquery', - 'yoast-seo-premium-commons', - ], - ], - [ - 'name' => 'wp-seo-premium-quickedit-notification', - 'path' => 'assets/js/dist/', - 'filename' => 'wp-seo-premium-quickedit-notification-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'jquery', - 'wp-api', - 'wp-api-fetch', - 'yoast-seo-premium-commons', - ], - ], - [ - 'name' => 'wp-seo-premium-redirect-notifications', - 'path' => 'assets/js/dist/', - 'filename' => 'wp-seo-premium-redirect-notifications-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'jquery', - 'wp-api', - 'wp-api-fetch', - 'yoast-seo-premium-commons', - ], - ], - [ - 'name' => 'wp-seo-premium-redirect-notifications-gutenberg', - 'path' => 'assets/js/dist/', - 'filename' => 'wp-seo-premium-redirect-notifications-gutenberg-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'wp-api-fetch', - 'wp-components', - 'wp-element', - 'wp-i18n', - 'wp-plugins', - WPSEO_Admin_Asset_Manager::PREFIX . 'yoast-components', - ], - ], - [ - 'name' => 'wp-seo-premium-dynamic-blocks', - 'path' => 'assets/js/dist/', - 'filename' => 'dynamic-blocks-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'lodash', - 'wp-blocks', - 'wp-data', - 'wp-dom-ready', - 'wp-hooks', - 'wp-server-side-render', - ], - ], - [ - 'name' => 'wp-seo-premium-blocks', - 'path' => 'assets/js/dist/', - 'filename' => 'blocks-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'wp-block-editor', - 'wp-blocks', - 'wp-components', - 'wp-data', - 'wp-dom-ready', - 'wp-element', - 'wp-i18n', - 'yoast-seo-premium-metabox', - WPSEO_Admin_Asset_Manager::PREFIX . 'editor-modules', - WPSEO_Admin_Asset_Manager::PREFIX . 'yoast-components', - ], - ], - [ - 'name' => 'yoast-premium-prominent-words-indexation', - 'path' => 'assets/js/dist/', - 'filename' => 'yoast-premium-prominent-words-indexation-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'regenerator-runtime', - 'yoast-seo-premium-commons', - WPSEO_Admin_Asset_Manager::PREFIX . 'analysis', - WPSEO_Admin_Asset_Manager::PREFIX . 'editor-modules', - WPSEO_Admin_Asset_Manager::PREFIX . 'indexation', - ], - ], - [ - 'name' => 'elementor-premium', - 'path' => 'assets/js/dist/', - 'filename' => 'wp-seo-premium-elementor-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'clipboard', - 'jquery', - 'regenerator-runtime', - 'underscore', - 'wp-api-fetch', - 'wp-components', - 'wp-data', - 'wp-element', - 'wp-hooks', - 'wp-i18n', - 'wp-util', - 'yoast-seo-premium-commons', - WPSEO_Admin_Asset_Manager::PREFIX . 'analysis', - WPSEO_Admin_Asset_Manager::PREFIX . 'editor-modules', - WPSEO_Admin_Asset_Manager::PREFIX . 'help-scout-beacon', - WPSEO_Admin_Asset_Manager::PREFIX . 'search-metadata-previews', - WPSEO_Admin_Asset_Manager::PREFIX . 'social-metadata-forms', - WPSEO_Admin_Asset_Manager::PREFIX . 'social-metadata-previews-package', - WPSEO_Admin_Asset_Manager::PREFIX . 'yoast-components', - ], - 'footer' => true, - ], - [ - 'name' => 'wp-seo-premium-ai-generator', - 'path' => 'assets/js/dist/', - 'filename' => 'ai-generator-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'lodash', - 'regenerator-runtime', - 'wp-api-fetch', - 'wp-components', - 'wp-data', - 'wp-dom-ready', - 'wp-element', - 'wp-hooks', - 'wp-i18n', - 'yoast-seo-premium-commons', - WPSEO_Admin_Asset_Manager::PREFIX . 'analysis', - WPSEO_Admin_Asset_Manager::PREFIX . 'editor-modules', - WPSEO_Admin_Asset_Manager::PREFIX . 'ui-library-package', - WPSEO_Admin_Asset_Manager::PREFIX . 'react-helmet-package', - ], - ], - [ - 'name' => 'wp-seo-premium-manage-ai-consent-button', - 'path' => 'assets/js/dist/', - 'filename' => 'manage-ai-consent-button-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'lodash', - 'regenerator-runtime', - 'wp-api-fetch', - 'wp-components', - 'wp-data', - 'wp-dom-ready', - 'wp-element', - 'wp-hooks', - 'wp-i18n', - 'yoast-seo-premium-commons', - WPSEO_Admin_Asset_Manager::PREFIX . 'ui-library-package', - WPSEO_Admin_Asset_Manager::PREFIX . 'react-helmet-package', - ], - ], - [ - 'name' => 'wp-seo-premium-introductions', - 'path' => 'assets/js/dist/', - 'filename' => 'introductions-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - 'dependencies' => [ - 'lodash', - 'regenerator-runtime', - 'wp-api-fetch', - 'wp-components', - 'wp-data', - 'wp-dom-ready', - 'wp-element', - 'wp-hooks', - 'wp-i18n', - 'yoast-seo-premium-commons', - WPSEO_Admin_Asset_Manager::PREFIX . 'introductions', - WPSEO_Admin_Asset_Manager::PREFIX . 'ui-library-package', - WPSEO_Admin_Asset_Manager::PREFIX . 'react-helmet-package', - ], - ], - ]; - } - - /** - * Retrieves an array of styles to register. - * - * @codeCoverageIgnore Returns a simple dataset. - * - * @param string $version Current version number. - * - * @return array The styles. - */ - protected function get_styles( $version ) { - $rtl_suffix = ( is_rtl() ) ? '-rtl' : ''; - - return [ - [ - 'name' => WPSEO_Admin_Asset_Manager::PREFIX . 'premium-metabox', - 'source' => 'assets/css/dist/premium-metabox-' . $version . '.css', - 'dependencies' => [], - ], - [ - 'name' => WPSEO_Admin_Asset_Manager::PREFIX . 'premium-workouts', - 'source' => 'assets/css/dist/premium-workouts-' . $version . '.css', - 'dependencies' => [ - 'wp-components', - ], - ], - [ - 'name' => 'elementor-premium', - 'source' => 'assets/css/dist/premium-elementor-' . $version . '.css', - 'dependencies' => [ - WPSEO_Admin_Asset_Manager::PREFIX . 'premium-metabox', - ], - ], - [ - 'name' => WPSEO_Admin_Asset_Manager::PREFIX . 'premium-draft-js-plugins', - 'source' => 'assets/css/dist/premium-draft-js-plugins-' . $version . '.css', - 'dependencies' => [], - ], - [ - 'name' => WPSEO_Admin_Asset_Manager::PREFIX . 'premium-thank-you', - 'source' => 'assets/css/dist/premium-thank-you-' . $version . '.css', - 'dependencies' => [], - ], - [ - 'name' => WPSEO_Admin_Asset_Manager::PREFIX . 'premium-settings', - 'source' => 'assets/css/dist/premium-settings-' . $version . '.css', - 'dependencies' => [], - ], - [ - 'name' => WPSEO_Admin_Asset_Manager::PREFIX . 'premium-post-overview', - 'source' => 'assets/css/dist/premium-post-overview-' . $version . '.css', - 'dependencies' => [], - ], - [ - 'name' => WPSEO_Admin_Asset_Manager::PREFIX . 'premium-tailwind', - 'source' => 'assets/css/dist/premium-tailwind-' . $version . $rtl_suffix . '.css', - 'dependencies' => [], - ], - [ - 'name' => WPSEO_Admin_Asset_Manager::PREFIX . 'premium-ai-generator', - 'source' => 'assets/css/dist/premium-ai-generator-' . $version . $rtl_suffix . '.css', - 'dependencies' => [ - WPSEO_Admin_Asset_Manager::PREFIX . 'premium-tailwind', - WPSEO_Admin_Asset_Manager::PREFIX . 'monorepo', - ], - ], - ]; - } - - /** - * Registers the given script to WordPress. - * - * @codeCoverageIgnore Method calls a WordPress function. - * - * @param array $script The script to register. - * - * @return void - */ - protected function register_script( $script ) { - $url = plugin_dir_url( WPSEO_PREMIUM_FILE ) . $script['path'] . $script['filename']; - - if ( defined( 'YOAST_SEO_PREMIUM_DEV_SERVER' ) && YOAST_SEO_PREMIUM_DEV_SERVER ) { - $url = 'http://localhost:8081/' . $script['filename']; - } - - $in_footer = ( $script['in_footer'] ?? false ); - - wp_register_script( - $script['name'], - $url, - $script['dependencies'], - WPSEO_PREMIUM_VERSION, - $in_footer - ); - } - - /** - * Registers the given style to WordPress. - * - * @codeCoverageIgnore Method calls a WordPress function. - * - * @param array $style The style to register. - * - * @return void - */ - protected function register_style( $style ) { - wp_register_style( - $style['name'], - plugin_dir_url( WPSEO_PREMIUM_FILE ) . $style['source'], - $style['dependencies'], - WPSEO_PREMIUM_VERSION - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-expose-shortlinks.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-expose-shortlinks.php deleted file mode 100644 index 2f2a2f2d..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-expose-shortlinks.php +++ /dev/null @@ -1,36 +0,0 @@ - '', - 'success' => false, - 'status' => null, - ]; - } - - $this->import = $import; - $this->htaccess_import(); - $this->do_plugin_imports(); - $this->do_csv_imports(); - - return $this->import; - } - - /** - * Outputs a tab header for the htaccess import block. - * - * @return void - */ - public function redirects_import_header() { - /* translators: %s: '.htaccess' file name */ - echo '' . esc_html__( 'Import redirects', 'wordpress-seo-premium' ) . ''; - } - - /** - * Adding the import block for redirects. - * - * @return void - */ - public function add_redirect_import_block() { - $import = $this->import; - - // Display the forms. - require WPSEO_PREMIUM_PATH . 'classes/views/import-redirects.php'; - } - - /** - * Do .htaccess file import. - * - * @return void - */ - protected function htaccess_import() { - $htaccess = $this->get_posted_htaccess(); - - if ( ! $htaccess || $htaccess === '' ) { - return; - } - - try { - $loader = new WPSEO_Redirect_HTAccess_Loader( $htaccess ); - $result = $this->import_redirects_from_loader( $loader ); - - $this->set_import_success( $result ); - } - catch ( WPSEO_Redirect_Import_Exception $e ) { - $this->set_import_message( $e->getMessage() ); - } - } - - /** - * Handles plugin imports. - * - * @return void - */ - protected function do_plugin_imports() { - $import_plugin = $this->get_posted_import_plugin(); - - if ( ! $import_plugin ) { - return; - } - - try { - $loader = $this->get_plugin_loader( $import_plugin ); - $result = $this->import_redirects_from_loader( $loader ); - - $this->set_import_success( $result ); - } - catch ( WPSEO_Redirect_Import_Exception $e ) { - $this->set_import_message( $e->getMessage() ); - } - } - - /** - * Processes a CSV import. - * - * @return void - */ - protected function do_csv_imports() { - $redirects_csv_file = $this->get_posted_csv_file(); - - if ( ! $redirects_csv_file ) { - return; - } - - try { - $this->validate_uploaded_csv_file( $redirects_csv_file ); - - // Load the redirects from the uploaded file. - $loader = new WPSEO_Redirect_CSV_Loader( $redirects_csv_file['tmp_name'] ); - $result = $this->import_redirects_from_loader( $loader ); - - $this->set_import_success( $result ); - } - catch ( WPSEO_Redirect_Import_Exception $e ) { - $this->set_import_message( $e->getMessage() ); - } - } - - /** - * Sets the import message. - * - * @param string $import_message The message. - * - * @return void - */ - protected function set_import_message( $import_message ) { - $this->import->msg .= $import_message; - } - - /** - * Sets the import success state to true. - * - * @param array $result The import result. - * - * @return void - */ - protected function set_import_success( array $result ) { - $this->import->success = true; - - $this->set_import_message( - $this->get_success_message( $result['total_imported'], $result['total_redirects'] ) - ); - } - - /** - * Retrieves the success message when import has been successful. - * - * @param int $total_imported The number of imported redirects. - * @param int $total_redirects The total amount of redirects. - * - * @return string The generated message. - */ - protected function get_success_message( $total_imported, $total_redirects ) { - if ( $total_imported === $total_redirects ) { - return sprintf( - /* translators: 1: link to redirects overview, 2: closing link tag */ - __( 'All redirects have been imported successfully. Go to the %1$sredirects overview%2$s to see the imported redirects.', 'wordpress-seo-premium' ), - '', - '' - ); - } - - if ( $total_imported === 0 ) { - return sprintf( - /* translators: 1: link to redirects overview, 2: closing link tag */ - __( 'No redirects have been imported. Probably they already exist as a redirect. Go to the %1$sredirects overview%2$s to see the existing redirects.', 'wordpress-seo-premium' ), - '', - '' - ); - } - - return sprintf( - /* translators: 1: amount of imported redirects, 2: total amount of redirects, 3: link to redirects overview, 4: closing link tag */ - _n( - 'Imported %1$s/%2$s redirects successfully. Go to the %3$sredirects overview%4$s to see the imported redirect.', - 'Imported %1$s/%2$s redirects successfully. Go to the %3$sredirects overview%4$s to see the imported redirects.', - $total_imported, - 'wordpress-seo-premium' - ), - $total_imported, - $total_redirects, - '', - '' - ); - } - - /** - * Returns a loader for the given plugin. - * - * @codeCoverageIgnore - * - * @param string $plugin_name The plugin we want to load redirects from. - * - * @return bool|WPSEO_Redirect_Abstract_Loader The redirect loader. - * - * @throws WPSEO_Redirect_Import_Exception When the plugin is not installed or activated. - */ - protected function get_plugin_loader( $plugin_name ) { - global $wpdb; - - switch ( $plugin_name ) { - case 'redirection': - // Only do import if Redirections is active. - if ( ! defined( 'REDIRECTION_VERSION' ) ) { - throw new WPSEO_Redirect_Import_Exception( - __( 'Redirect import failed: the Redirection plugin is not installed or activated.', 'wordpress-seo-premium' ) - ); - } - return new WPSEO_Redirect_Redirection_Loader( $wpdb ); - case 'safe_redirect_manager': - return new WPSEO_Redirect_Safe_Redirect_Loader(); - case 'simple-301-redirects': - return new WPSEO_Redirect_Simple_301_Redirect_Loader(); - default: - throw new WPSEO_Redirect_Import_Exception( - __( 'Redirect import failed: the selected redirect plugin is not installed or activated.', 'wordpress-seo-premium' ) - ); - } - } - - /** - * Validates an uploaded CSV file. - * - * @param array $csv_file The file to upload, from the $_FILES object. - * - * @return void - * - * @throws WPSEO_Redirect_Import_Exception When the given file is invalid. - */ - protected function validate_uploaded_csv_file( $csv_file ) { - - // If no file is selected. - if ( array_key_exists( 'name', $csv_file ) && $csv_file['name'] === '' ) { - $error_message = __( 'CSV import failed: No file selected.', 'wordpress-seo-premium' ); - throw new WPSEO_Redirect_Import_Exception( $error_message ); - } - - // If the file upload failed for any other reason. - if ( array_key_exists( 'error', $csv_file ) && $csv_file['error'] !== UPLOAD_ERR_OK ) { - $error_message = __( 'CSV import failed: the provided file could not be parsed using a CSV parser.', 'wordpress-seo-premium' ); - throw new WPSEO_Redirect_Import_Exception( $error_message ); - } - - // If somehow the file is larger than it should be. - if ( $csv_file['size'] > wp_max_upload_size() ) { - $max_size_formatted = size_format( wp_max_upload_size() ); - /* translators: 1: The maximum file size */ - $error_message = sprintf( __( 'CSV import failed: the provided file is larger than %1$s.', 'wordpress-seo-premium' ), $max_size_formatted ); - throw new WPSEO_Redirect_Import_Exception( $error_message ); - } - - // If it's not a CSV file (send the csv mimetype along for multisite installations). - $filetype = wp_check_filetype( $csv_file['name'], [ 'csv' => 'text/csv' ] ); - if ( strtolower( $filetype['ext'] ) !== 'csv' ) { - $error_message = __( 'CSV import failed: the provided file is not a CSV file.', 'wordpress-seo-premium' ); - throw new WPSEO_Redirect_Import_Exception( $error_message ); - } - } - - /** - * Imports all redirects from the loader. - * - * @codeCoverageIgnore - * - * @param WPSEO_Redirect_Loader $loader The loader to import redirects from. - * - * @return array The result of the import. - * - * @throws WPSEO_Redirect_Import_Exception When there is no loader given or when there are no redirects. - */ - protected function import_redirects_from_loader( WPSEO_Redirect_Loader $loader ) { - if ( ! $loader ) { - throw new WPSEO_Redirect_Import_Exception( - __( 'Redirect import failed: we can\'t recognize this type of import.', 'wordpress-seo-premium' ) - ); - } - - $redirects = $loader->load(); - - if ( count( $redirects ) === 0 ) { - throw new WPSEO_Redirect_Import_Exception( - __( 'Redirect import failed: no redirects found.', 'wordpress-seo-premium' ) - ); - } - - $importer = new WPSEO_Redirect_Importer(); - return $importer->import( $redirects ); - } - - /** - * Retrieves the posted htaccess. - * - * @codeCoverageIgnore - * - * @return string The posted htaccess. - */ - protected function get_posted_htaccess() { - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are validating a nonce here. - if ( isset( $_POST['_wpnonce'] ) && wp_verify_nonce( $_POST['_wpnonce'], 'wpseo-import' ) - && isset( $_POST['htaccess'] ) && is_string( $_POST['htaccess'] ) ) { - return sanitize_text_field( wp_unslash( $_POST['htaccess'] ) ); - } - - return ''; - } - - /** - * Retrieves the posted import plugin. - * - * @codeCoverageIgnore - * - * @return string|null The posted import plugin. - */ - protected function get_posted_import_plugin() { - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are validating a nonce here. - if ( isset( $_POST['_wpnonce'] ) && wp_verify_nonce( $_POST['_wpnonce'], 'wpseo-import' ) - && isset( $_POST['wpseo'] ) && is_array( $_POST['wpseo'] ) - && isset( $_POST['wpseo']['import_plugin'] ) && is_string( $_POST['wpseo']['import_plugin'] ) ) { - return sanitize_text_field( wp_unslash( $_POST['wpseo']['import_plugin'] ) ); - } - - return null; - } - - /** - * Retrieves the posted CSV file. - * - * @codeCoverageIgnore - * - * @return array|null The posted CSV file. - */ - protected function get_posted_csv_file() { - if ( ! isset( $_FILES['redirects_csv_file'] ) ) { - return null; - } - - return $_FILES['redirects_csv_file']; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-javascript-strings.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-javascript-strings.php deleted file mode 100644 index 62878a0c..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-javascript-strings.php +++ /dev/null @@ -1,80 +0,0 @@ - __( 'You can\'t redirect a URL to itself.', 'wordpress-seo-premium' ), - 'error_old_url' => __( 'The old URL field can\'t be empty.', 'wordpress-seo-premium' ), - 'error_regex' => __( 'The Regular Expression field can\'t be empty.', 'wordpress-seo-premium' ), - 'error_new_url' => __( 'The new URL field can\'t be empty.', 'wordpress-seo-premium' ), - 'error_saving_redirect' => __( 'Error while saving this redirect', 'wordpress-seo-premium' ), - 'error_new_type' => __( 'New type can\'t be empty.', 'wordpress-seo-premium' ), - 'unsaved_redirects' => __( 'You have unsaved redirects, are you sure you want to leave?', 'wordpress-seo-premium' ), - - /* translators: %s is replaced with the URL that will be deleted. */ - 'enter_new_url' => __( 'Please enter the new URL for %s', 'wordpress-seo-premium' ), - /* translators: variables will be replaced with from and to URLs. */ - 'redirect_saved' => __( 'Redirect created from %1$s to %2$s!', 'wordpress-seo-premium' ), - /* translators: %1$s will be replaced with the from URL. */ - 'redirect_saved_no_target' => __( '410 Redirect created from %1$s!', 'wordpress-seo-premium' ), - - 'redirect_added' => [ - 'title' => __( 'Redirect added.', 'wordpress-seo-premium' ), - 'message' => __( 'The redirect was added successfully.', 'wordpress-seo-premium' ), - ], - 'redirect_updated' => [ - 'title' => __( 'Redirect updated.', 'wordpress-seo-premium' ), - 'message' => __( 'The redirect was updated successfully.', 'wordpress-seo-premium' ), - ], - 'redirect_deleted' => [ - 'title' => __( 'Redirect deleted.', 'wordpress-seo-premium' ), - 'message' => __( 'The redirect was deleted successfully.', 'wordpress-seo-premium' ), - ], - - 'button_ok' => __( 'OK', 'wordpress-seo-premium' ), - 'button_cancel' => __( 'Cancel', 'wordpress-seo-premium' ), - 'button_save' => __( 'Save', 'wordpress-seo-premium' ), - 'button_save_anyway' => __( 'Save anyway', 'wordpress-seo-premium' ), - - 'edit_redirect' => __( 'Edit redirect', 'wordpress-seo-premium' ), - 'editing_redirect' => __( 'You are already editing a redirect, please finish this one first', 'wordpress-seo-premium' ), - - 'editAction' => __( 'Edit', 'wordpress-seo-premium' ), - 'deleteAction' => __( 'Delete', 'wordpress-seo-premium' ), - ]; - } - - /** - * Returns an array with all the translated strings. - * - * @return string[] - */ - public static function strings() { - if ( self::$strings === null ) { - self::fill(); - } - - return self::$strings; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-keyword-export-manager.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-keyword-export-manager.php deleted file mode 100644 index e766f6b1..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-keyword-export-manager.php +++ /dev/null @@ -1,209 +0,0 @@ -' - . esc_html__( 'Export keyphrases', 'wordpress-seo-premium' ) - . ''; - } - } - - /** - * Adds the export block for CSV. Makes it able to export redirects to CSV. - * - * @return void - */ - public function add_keyword_export_tab_block() { - // Display the forms. - if ( current_user_can( 'export' ) ) { - $yform = Yoast_Form::get_instance(); - require WPSEO_PREMIUM_PATH . 'classes/views/export-keywords.php'; - } - } - - /** - * Hooks into the request and returns a CSV file if we're on the right page with the right method and the right capabilities. - * - * @return void - */ - public function keywords_csv_export() { - - if ( ! $this->is_valid_csv_export_request() || ! current_user_can( 'export' ) ) { - return; - } - - // Check if we have a valid nonce. - check_admin_referer( 'wpseo-export' ); - - // Clean any content that has been already outputted, for example by other plugins or faulty PHP files. - if ( ob_get_contents() ) { - ob_clean(); - } - - // Make sure we don't time out during the collection of items. - set_time_limit( 0 ); - - // Set CSV headers and content. - $this->set_csv_headers(); - - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- This is controlled output. - echo $this->get_csv_contents(); - - // And exit so we don't start appending HTML to our CSV file. - // NOTE: this makes this entire class untestable as it will exit all tests but WordPress seems to have no elegant way of handling this. - exit; - } - - /** - * Returns whether this is a POST request for a CSV export of posts and keywords. - * - * @return bool True if this is a valid CSV export request. - */ - protected function is_valid_csv_export_request() { - // phpcs:disable WordPress.Security.NonceVerification -- Reason: Nonce is checked in export. - // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are strictly comparing only or ignoring the value. - return ( isset( $_GET['page'] ) && is_string( $_GET['page'] ) && wp_unslash( $_GET['page'] ) === 'wpseo_tools' ) - && ( isset( $_GET['tool'] ) && is_string( $_GET['tool'] ) && wp_unslash( $_GET['tool'] ) === 'import-export' ) - && ( isset( $_POST['export-posts'] ) && ! empty( $_POST['export-posts'] ) ); - // phpcs:enable - } - - /** - * Sets the headers to trigger a CSV download in the browser. - * - * @return void - */ - protected function set_csv_headers() { - header( 'Content-type: text/csv' ); - header( 'Content-Disposition: attachment; filename=' . gmdate( 'Y-m-d' ) . '-yoast-seo-keywords.csv' ); - header( 'Pragma: no-cache' ); - header( 'Expires: 0' ); - } - - /** - * Generates the CSV to be exported. - * - * @return void - */ - protected function get_csv_contents() { - $columns = [ 'keywords' ]; - - $post_wpseo = filter_input( INPUT_POST, 'wpseo', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY ); - - if ( is_array( $post_wpseo ) ) { - $columns = array_merge( $columns, $this->get_export_columns( $post_wpseo ) ); - } - - $builder = new WPSEO_Export_Keywords_CSV( $columns ); - $builder->print_headers(); - $this->prepare_export( $builder, $columns ); - } - - /** - * Returns an array of the requested columns. - * - * @param array $post_object An associative array with the post data. - * - * @return array List of export columns. - */ - protected function get_export_columns( array $post_object ) { - $exportable_columns = [ - 'export-keywords-score' => 'keywords_score', - 'export-url' => 'url', - 'export-title' => 'title', - 'export-seo-title' => 'seo_title', - 'export-meta-description' => 'meta_description', - 'export-readability-score' => 'readability_score', - ]; - - // Need to call array_values to ensure that we get a numerical key back. - return array_values( array_intersect_key( $exportable_columns, $post_object ) ); - } - - /** - * Feeds post and term items to the CSV builder. - * - * @param WPSEO_Export_Keywords_CSV $builder The builder to use. - * @param array $columns The columns that need to be exported. - * - * @return void - */ - protected function prepare_export( WPSEO_Export_Keywords_CSV $builder, array $columns ) { - $this->feed_to_builder( - $builder, - new WPSEO_Export_Keywords_Post_Query( $columns, 1000 ), - new WPSEO_Export_Keywords_Post_Presenter( $columns ) - ); - - $this->feed_to_builder( - $builder, - new WPSEO_Export_Keywords_Term_Query( $columns, 1000 ), - new WPSEO_Export_Keywords_Term_Presenter( $columns ) - ); - } - - /** - * Fetches the items and feeds them to the builder. - * - * @param WPSEO_Export_Keywords_CSV $builder Builder to feed the items to. - * @param WPSEO_Export_Keywords_Query $export_query Query to use to get the items. - * @param WPSEO_Export_Keywords_Presenter $presenter Presenter to present the items in the builder format. - * - * @return void - */ - protected function feed_to_builder( WPSEO_Export_Keywords_CSV $builder, WPSEO_Export_Keywords_Query $export_query, WPSEO_Export_Keywords_Presenter $presenter ) { - $page_size = $export_query->get_page_size(); - - $page = 1; - do { - $results = $export_query->get_data( $page ); - - if ( ! is_array( $results ) ) { - break; - } - - $result_count = count( $results ); - - // Present the result. - $presented = array_map( [ $presenter, 'present' ], $results ); - - // Feed presented item to the builder. - array_walk( $presented, [ $builder, 'print_row' ] ); - - ++$page; - - // If we have the number of items per page, there will be more items ahead. - } while ( $result_count === $page_size ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-metabox.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-metabox.php deleted file mode 100644 index dbe2cbb7..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-metabox.php +++ /dev/null @@ -1,392 +0,0 @@ -prominent_words_helper = $prominent_words_helper; - $this->current_page_helper = $current_page_helper; - $this->link_suggestions = $link_suggestions; - } - - /** - * Registers relevant hooks to WordPress. - * - * @codeCoverageIgnore Method uses dependencies. - * - * @return void - */ - public function register_hooks() { - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - add_action( 'admin_init', [ $this, 'initialize' ] ); - - $this->link_suggestions->register_hooks(); - } - - /** - * Checks if the content endpoints are available. - * - * @return bool Returns true if the content endpoints are available - */ - public static function are_content_endpoints_available() { - if ( function_exists( 'rest_get_server' ) ) { - $namespaces = rest_get_server()->get_namespaces(); - - return in_array( 'wp/v2', $namespaces, true ); - } - - return false; - } - - /** - * Initializes the metabox by loading the register_hooks for the dependencies. - * - * @return void - */ - public function initialize() { - if ( ! $this->load_metabox( $this->get_current_page() ) ) { - return; - } - - foreach ( $this->get_metabox_integrations() as $integration ) { - $integration->register_hooks(); - } - } - - /** - * Enqueues assets when relevant. - * - * @codeCoverageIgnore Method uses dependencies. - * - * @return void - */ - public function enqueue_assets() { - if ( ! $this->load_metabox( $this->get_current_page() ) ) { - return; - } - - wp_enqueue_script( WPSEO_Admin_Asset_Manager::PREFIX . 'premium-metabox' ); - wp_enqueue_style( WPSEO_Admin_Asset_Manager::PREFIX . 'premium-metabox' ); - - $premium_localization = new WPSEO_Premium_Asset_JS_L10n(); - $premium_localization->localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'premium-metabox' ); - - $this->send_data_to_assets(); - } - - /** - * Send data to assets by using wp_localize_script. - * Also localizes the Table of Contents heading title to the wp-seo-premium-blocks asset. - * - * @return void - */ - public function send_data_to_assets() { - $analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - $content_analysis = new WPSEO_Metabox_Analysis_Readability(); - $assets_manager = new WPSEO_Admin_Asset_Manager(); - - /** - * Filters the parameter to disable Table of Content block. - * - * Note: Used to prevent auto-generation of HTML anchors for headings when TOC block is registered. - * - * @since 21.5 - * - * @param bool $disable_table_of_content The value of the `autoload` parameter. Default: false. - * - * @return bool The filtered value of the `disable_table_of_content` parameter. - */ - $disable_table_of_content = apply_filters( 'Yoast\WP\SEO\disable_table_of_content_block', false ); - - $data = [ - 'restApi' => $this->get_rest_api_config(), - 'seoAnalysisEnabled' => $analysis_seo->is_enabled(), - 'contentAnalysisEnabled' => $content_analysis->is_enabled(), - 'licensedURL' => WPSEO_Utils::get_home_url(), - 'settingsPageUrl' => admin_url( 'admin.php?page=wpseo_page_settings#/site-features#card-wpseo-enable_link_suggestions' ), - 'integrationsTabURL' => admin_url( 'admin.php?page=wpseo_integrations' ), - 'commonsScriptUrl' => plugins_url( - 'assets/js/dist/commons-premium-' . $assets_manager->flatten_version( WPSEO_PREMIUM_VERSION ) . WPSEO_CSSJS_SUFFIX . '.js', - WPSEO_PREMIUM_FILE - ), - 'premiumAssessmentsScriptUrl' => plugins_url( - 'assets/js/dist/register-premium-assessments-' . $assets_manager->flatten_version( WPSEO_PREMIUM_VERSION ) . WPSEO_CSSJS_SUFFIX . '.js', - WPSEO_PREMIUM_FILE - ), - 'pluginUrl' => plugins_url( '', WPSEO_PREMIUM_FILE ), - ]; - - if ( defined( 'YOAST_SEO_TEXT_FORMALITY' ) && YOAST_SEO_TEXT_FORMALITY === true ) { - $data['textFormalityScriptUrl'] = plugins_url( - 'assets/js/dist/register-text-formality-' . $assets_manager->flatten_version( WPSEO_PREMIUM_VERSION ) . WPSEO_CSSJS_SUFFIX . '.js', - WPSEO_PREMIUM_FILE - ); - } - - if ( WPSEO_Metabox::is_post_edit( $this->get_current_page() ) ) { - $data = array_merge( $data, $this->get_post_metabox_config() ); - } - elseif ( WPSEO_Taxonomy::is_term_edit( $this->get_current_page() ) ) { - $data = array_merge( $data, $this->get_term_metabox_config() ); - } - - if ( current_user_can( 'edit_others_posts' ) ) { - $data['workoutsUrl'] = admin_url( 'admin.php?page=wpseo_workouts' ); - } - - // Use an extra level in the array to preserve booleans. WordPress sanitizes scalar values in the first level of the array. - wp_localize_script( 'yoast-seo-premium-metabox', 'wpseoPremiumMetaboxData', [ 'data' => $data ] ); - - // Localize the title of the Table of Contents block: the translation needs to be based on the site language instead of the user language. - wp_localize_script( - 'wp-seo-premium-blocks', - 'wpseoTOCData', - [ - 'data' => [ - 'TOCTitle' => __( 'Table of contents', 'wordpress-seo-premium' ), - 'disableTableOfContents' => $disable_table_of_content, - ], - ] - ); - } - - /** - * Retrieves the metabox config for a post. - * - * @return array The config. - */ - protected function get_post_metabox_config() { - $link_suggestions_enabled = WPSEO_Options::get( 'enable_link_suggestions', false ); - - $post = $this->get_post(); - - $prominent_words_support = new WPSEO_Premium_Prominent_Words_Support(); - $is_prominent_words_available = $prominent_words_support->is_post_type_supported( $post->post_type ); - - $site_locale = get_locale(); - $language = WPSEO_Language_Utils::get_language( $site_locale ); - - return [ - 'currentObjectId' => $this->get_post_ID(), - 'currentObjectType' => 'post', - 'linkSuggestionsEnabled' => ( $link_suggestions_enabled ) ? 'enabled' : 'disabled', - 'linkSuggestionsAvailable' => $is_prominent_words_available, - 'linkSuggestionsUnindexed' => ! $this->is_prominent_words_indexing_completed() && WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ), - 'perIndexableLimit' => $this->per_indexable_limit( $language ), - 'isProminentWordsAvailable' => $is_prominent_words_available, - 'isTitleAssessmentAvailable' => true, - ]; - } - - /** - * Retrieves the metabox config for a term. - * - * @return array The config. - */ - protected function get_term_metabox_config() { - $term = null; - if ( isset( $GLOBALS['tag_ID'], $GLOBALS['taxonomy'] ) ) { - $term = get_term( $GLOBALS['tag_ID'], $GLOBALS['taxonomy'] ); - } - - if ( $term === null || is_wp_error( $term ) ) { - return [ - 'insightsEnabled' => 'disabled', - 'linkSuggestionsEnabled' => 'disabled', - 'linkSuggestionsAvailable' => false, - 'linkSuggestionsUnindexed' => false, - ]; - } - - $link_suggestions_enabled = WPSEO_Options::get( 'enable_link_suggestions', false ); - - $prominent_words_support = new WPSEO_Premium_Prominent_Words_Support(); - $is_prominent_words_available = $prominent_words_support->is_taxonomy_supported( $term->taxonomy ); - - $site_locale = get_locale(); - $language = WPSEO_Language_Utils::get_language( $site_locale ); - - return [ - 'currentObjectId' => $term->term_id, - 'currentObjectType' => 'term', - 'linkSuggestionsEnabled' => ( $link_suggestions_enabled ) ? 'enabled' : 'disabled', - 'linkSuggestionsAvailable' => $is_prominent_words_available, - 'linkSuggestionsUnindexed' => ! $this->is_prominent_words_indexing_completed() && WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ), - 'perIndexableLimit' => $this->per_indexable_limit( $language ), - 'isProminentWordsAvailable' => $is_prominent_words_available, - 'isTitleAssessmentAvailable' => false, - ]; - } - - /** - * Retrieves the REST API configuration. - * - * @return array The configuration. - */ - protected function get_rest_api_config() { - return [ - 'available' => WPSEO_Utils::is_api_available(), - 'contentEndpointsAvailable' => self::are_content_endpoints_available(), - 'root' => esc_url_raw( rest_url() ), - 'nonce' => wp_create_nonce( 'wp_rest' ), - ]; - } - - /** - * Returns the post for the current admin page. - * - * @codeCoverageIgnore - * - * @return WP_Post The post for the current admin page. - */ - protected function get_post() { - return get_post( $this->get_post_ID() ); - } - - /** - * Retrieves the post ID from the globals. - * - * @codeCoverageIgnore - * - * @return int The post ID. - */ - protected function get_post_ID() { - if ( ! isset( $GLOBALS['post_ID'] ) ) { - return 0; - } - - return $GLOBALS['post_ID']; - } - - /** - * Retrieves the metabox specific integrations. - * - * @codeCoverageIgnore - * - * @return WPSEO_WordPress_Integration[] The metabox integrations. - */ - protected function get_metabox_integrations() { - return [ - 'social-previews' => new WPSEO_Social_Previews(), - - // Add custom fields plugin to post and page edit pages. - 'premium-custom-fields' => new WPSEO_Custom_Fields_Plugin(), - ]; - } - - /** - * Checks whether or not the metabox related scripts should be loaded. - * - * @codeCoverageIgnore - * - * @param string $current_page The page we are on. - * - * @return bool True when it should be loaded. - */ - protected function load_metabox( $current_page ) { - // When the current page is a term related one. - if ( WPSEO_Taxonomy::is_term_edit( $current_page ) || WPSEO_Taxonomy::is_term_overview( $current_page ) ) { - return WPSEO_Options::get( 'display-metabox-tax-' . $this->current_page_helper->get_current_taxonomy() ); - } - - // When the current page isn't a post related one. - if ( WPSEO_Metabox::is_post_edit( $current_page ) || WPSEO_Metabox::is_post_overview( $current_page ) ) { - return WPSEO_Post_Type::has_metabox_enabled( $this->current_page_helper->get_current_post_type() ); - } - - // Make sure ajax integrations are loaded. - return wp_doing_ajax(); - } - - /** - * Retrieves the value of the pagenow variable. - * - * @codeCoverageIgnore - * - * @return string The value of pagenow. - */ - private function get_current_page() { - global $pagenow; - - return $pagenow; - } - - /** - * Returns whether or not we need to index more posts for correct link suggestion functionality. - * - * @return bool Whether or not we need to index more posts. - */ - protected function is_prominent_words_indexing_completed() { - $is_indexing_completed = $this->prominent_words_helper->is_indexing_completed(); - if ( $is_indexing_completed === null ) { - $indexation_integration = YoastSEOPremium()->classes->get( Indexing_Integration::class ); - $is_indexing_completed = $indexation_integration->get_unindexed_count( 0 ) === 0; - - $this->prominent_words_helper->set_indexing_completed( $is_indexing_completed ); - } - - return $is_indexing_completed; - } - - /** - * Returns the number of prominent words to store for content written in the given language. - * - * @param string $language The current language. - * - * @return int The number of words to store. - */ - protected function per_indexable_limit( $language ) { - if ( YoastSEO()->helpers->language->has_function_word_support( $language ) ) { - return Indexing_Integration::PER_INDEXABLE_LIMIT; - } - - return Indexing_Integration::PER_INDEXABLE_LIMIT_NO_FUNCTION_WORD_SUPPORT; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-option.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-option.php deleted file mode 100644 index 217e57a0..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-option.php +++ /dev/null @@ -1,102 +0,0 @@ -get_defaults();}} - * - * @var array - */ - protected $defaults = [ - // Form fields. - 'prominent_words_indexing_completed' => null, - 'workouts' => [ 'cornerstone' => [ 'finishedSteps' => [] ] ], - 'should_redirect_after_install' => false, - 'activation_redirect_timestamp' => 0, - 'dismiss_update_premium_notification' => '0', - ]; - - /** - * Registers the option to the WPSEO Options framework. - * - * @return void - */ - public static function register_option() { - WPSEO_Options::register_option( static::get_instance() ); - } - - /** - * Get the singleton instance of this class. - * - * @return static Returns instance of itself. - */ - public static function get_instance() { - if ( ! ( static::$instance instanceof static ) ) { - static::$instance = new static(); - } - - return static::$instance; - } - - /** - * All concrete classes must contain a validate_option() method which validates all - * values within the option. - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array The clean option value. - */ - protected function validate_option( $dirty, $clean, $old ) { - foreach ( $clean as $key => $value ) { - switch ( $key ) { - case 'prominent_words_indexing_completed': - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== null ) { - $clean[ $key ] = WPSEO_Utils::validate_bool( $dirty[ $key ] ); - } - - break; - case 'workouts': - if ( isset( $dirty[ $key ] ) && is_array( $dirty[ $key ] ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - case 'should_redirect_after_install': - if ( isset( $dirty[ $key ] ) && is_bool( $dirty[ $key ] ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - case 'activation_redirect_timestamp': - if ( isset( $dirty[ $key ] ) && is_int( $dirty[ $key ] ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - case 'dismiss_update_premium_notification': - if ( isset( $dirty[ $key ] ) && is_string( $dirty[ $key ] ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - } - } - - return $clean; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-orphaned-content-support.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-orphaned-content-support.php deleted file mode 100644 index 85e96a3a..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-orphaned-content-support.php +++ /dev/null @@ -1,47 +0,0 @@ -get_supported_post_types(), true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-orphaned-content-utils.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-orphaned-content-utils.php deleted file mode 100644 index 804acaf2..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-orphaned-content-utils.php +++ /dev/null @@ -1,44 +0,0 @@ -classes->get( Migration_Status::class )->is_version( 'free', WPSEO_VERSION ) ) { - return false; - } - - return WPSEO_Options::get( 'enable_text_link_counter', false ); - } - - /** - * Checks if there are unprocessed objects. - * - * @return bool True when there are unprocessed objects. - */ - public static function has_unprocessed_content() { - static $has_unprocessed_posts; - - if ( $has_unprocessed_posts === null ) { - $post_link_action = YoastSEO()->classes->get( Post_Link_Indexing_Action::class ); - $has_unprocessed_posts = $post_link_action->get_total_unindexed(); - } - - return $has_unprocessed_posts; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-orphaned-post-filter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-orphaned-post-filter.php deleted file mode 100644 index 371727ae..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-orphaned-post-filter.php +++ /dev/null @@ -1,196 +0,0 @@ -classes->get( Migration_Status::class )->is_version( 'free', WPSEO_VERSION ) ) { - return; - } - - if ( WPSEO_Premium_Orphaned_Content_Utils::is_feature_enabled() ) { - parent::register_hooks(); - } - } - - /** - * Returns a text explaining this filter. - * - * @return string|null The explanation or null if the current post stype is unknown. - */ - protected function get_explanation() { - $post_type_object = get_post_type_object( $this->get_current_post_type() ); - - if ( $post_type_object === null ) { - return null; - } - - $unprocessed = WPSEO_Premium_Orphaned_Content_Utils::has_unprocessed_content(); - $can_recalculate = WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ); - - $learn_more = sprintf( - /* translators: %1$s expands to the link to an article to read more about orphaned content, %2$s expands to */ - __( '%1$sLearn more about orphaned content%2$s.', 'wordpress-seo-premium' ), - '', - '' - ); - - if ( $unprocessed && ! $can_recalculate ) { - return sprintf( - /* translators: %1$s: plural form of the current post type, %2$s: a Learn more about link */ - __( 'Ask your SEO Manager or Site Administrator to count links in all texts, so we can identify orphaned %1$s. %2$s', 'wordpress-seo-premium' ), - strtolower( $post_type_object->labels->name ), - $learn_more - ); - } - - if ( $unprocessed ) { - return sprintf( - /* translators: %1$s expands to link to the recalculation option, %2$s: anchor closing, %3$s: plural form of the current post type, %4$s: a Learn more about link */ - __( '%1$sClick here%2$s to index your links, so we can identify orphaned %3$s. %4$s', 'wordpress-seo-premium' ), - '', - '', - strtolower( $post_type_object->labels->name ), - $learn_more - ); - } - - return sprintf( - /* translators: %1$s: plural form of the current post type, %2$s: a Learn more about link */ - __( '\'Orphaned content\' refers to %1$s that have no inbound links, consider adding links towards these %1$s. %2$s', 'wordpress-seo-premium' ), - strtolower( $post_type_object->labels->name ), - $learn_more - ); - } - - /** - * Modifies the query based on the seo_filter variable in $_GET. - * - * @param string $where Query variables. - * - * @return string The modified query. - */ - public function filter_posts( $where ) { - if ( $this->is_filter_active() ) { - $where .= $this->get_where_filter(); - $where .= $this->filter_published_posts(); - } - - return $where; - } - - /** - * Returns the where clause to use. - * - * @return string The where clause. - */ - protected function get_where_filter() { - global $wpdb; - - if ( WPSEO_Premium_Orphaned_Content_Utils::has_unprocessed_content() ) { - // Hide all posts, because we cannot tell anything for certain. - return 'AND 1 = 0'; - } - - $subquery = WPSEO_Premium_Orphaned_Post_Query::get_orphaned_content_query(); - return ' AND ' . $wpdb->posts . '.ID IN ( ' . $subquery . ' ) '; - } - - /** - * Adds a published posts filter so we don't show unpublished posts in the orphaned pages results. - * - * @return string A published posts filter. - */ - protected function filter_published_posts() { - global $wpdb; - - return " AND {$wpdb->posts}.post_status = 'publish' AND {$wpdb->posts}.post_password = ''"; - } - - /** - * Returns the label for this filter. - * - * @return string The label for this filter. - */ - protected function get_label() { - static $label; - - if ( $label === null ) { - $label = __( 'Orphaned content', 'wordpress-seo-premium' ); - } - - return $label; - } - - /** - * Returns the total amount of articles that are orphaned content. - * - * @return int - */ - protected function get_post_total() { - global $wpdb; - - static $count; - - if ( WPSEO_Premium_Orphaned_Content_Utils::has_unprocessed_content() ) { - return '?'; - } - - if ( $count === null ) { - $subquery = WPSEO_Premium_Orphaned_Post_Query::get_orphaned_content_query(); - $count = $wpdb->get_var( - $wpdb->prepare( - "SELECT COUNT(ID) - FROM %i - WHERE ID IN ( $subquery ) - AND %i = 'publish' - AND %i = '' - AND %i = %s", - $wpdb->posts, - 'post_status', - 'post_password', - 'post_type', - $this->get_current_post_type() - ) - ); - - $count = (int) $count; - } - - return $count; - } - - /** - * Returns the post types to which this filter should be added. - * - * @return array The post types to which this filter should be added. - */ - protected function get_post_types() { - $orphaned_content_support = new WPSEO_Premium_Orphaned_Content_Support(); - - return $orphaned_content_support->get_supported_post_types(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-orphaned-post-query.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-orphaned-post-query.php deleted file mode 100644 index 3ef7397b..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-orphaned-post-query.php +++ /dev/null @@ -1,122 +0,0 @@ -classes->get( Indexable_Repository::class ); - $query = $repository->query() - ->select( 'object_id' ) - ->where( 'object_type', 'post' ) - ->where_any_is( - [ - [ 'incoming_link_count' => 0 ], - [ 'incoming_link_count' => null ], - ] - ); - - $frontpage_id = self::get_frontpage_id(); - if ( $frontpage_id ) { - $query = $query->where_not_equal( 'object_id', $frontpage_id ); - } - - $query = sprintf( $query->get_sql(), '\'post\'', 0, $frontpage_id ); - } - - return $query; - } - - /** - * Returns all the object ids from the records with an incoming link count of 0. - * - * @return array Array with the object ids. - */ - public static function get_orphaned_object_ids() { - $repository = YoastSEO()->classes->get( Indexable_Repository::class ); - $results = $repository->query() - ->select( 'object_id' ) - ->where( 'object_type', 'post' ) - ->where( 'incoming_link_count', 0 ) - ->find_array(); - - $object_ids = wp_list_pluck( $results, 'object_id' ); - $object_ids = self::remove_frontpage_id( $object_ids ); - - return $object_ids; - } - - /** - * Removes the frontpage id from orphaned id's when the frontpage is a static page. - * - * @param array $object_ids The orphaned object ids. - * - * @return array The orphaned object ids, without frontpage id. - */ - protected static function remove_frontpage_id( $object_ids ) { - // When the frontpage is a static page, remove it from the object ids. - if ( get_option( 'show_on_front' ) !== 'page' ) { - return $object_ids; - } - - $frontpage_id = get_option( 'page_on_front' ); - - // If the frontpage ID exists in the list, remove it. - $object_id_key = array_search( $frontpage_id, $object_ids, true ); - if ( $object_id_key !== false ) { - unset( $object_ids[ $object_id_key ] ); - } - - return $object_ids; - } - - /** - * Retrieves the frontpage id when set, otherwise null. - * - * @return int|null The frontpage id when set. - */ - protected static function get_frontpage_id() { - if ( get_option( 'show_on_front' ) !== 'page' ) { - return null; - } - - $page_on_front = get_option( 'page_on_front', null ); - if ( empty( $page_on_front ) ) { - return null; - } - - return (int) $page_on_front; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-prominent-words-support.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-prominent-words-support.php deleted file mode 100644 index f41e3897..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-prominent-words-support.php +++ /dev/null @@ -1,113 +0,0 @@ - `post` - * `page` => `page` - * ] - * - * This can result in problems downstream when trying to array_merge this twice. - * array_values prevents this issue by ensuring numeric keys. - */ - $prominent_words_post_types = array_values( $prominent_words_post_types ); - - return $prominent_words_post_types; - } - - /** - * Checks if the post type is supported. - * - * @param string $post_type The post type to look up. - * - * @return bool True when post type is supported. - */ - public function is_post_type_supported( $post_type ) { - return in_array( $post_type, $this->get_supported_post_types(), true ); - } - - /** - * Retrieves a list of taxonomies that are public, viewable and have the metabox enabled. - * - * @return array The supported taxonomies. - */ - public function get_supported_taxonomies() { - $taxonomies = get_taxonomies( [ 'public' => true ] ); - $taxonomies = array_filter( $taxonomies, 'is_taxonomy_viewable' ); - - /** - * Filter: 'Yoast\WP\SEO\prominent_words_taxonomies' - Allows to filter from which taxonomies terms are eligible for generating prominent words. - * - * Note: This is a Premium plugin-only hook. - * - * @since 14.7.0 - * - * @param array $taxonomies The accessible taxonomies. - */ - $prominent_words_taxonomies = apply_filters( - 'Yoast\WP\SEO\prominent_words_taxonomies', - $taxonomies - ); - - if ( ! is_array( $prominent_words_taxonomies ) || empty( $prominent_words_taxonomies ) ) { - return []; - } - - $prominent_words_taxonomies = array_filter( - $prominent_words_taxonomies, - static function ( $taxonomy ) { - return (bool) WPSEO_Options::get( 'display-metabox-tax-' . $taxonomy, true ); - } - ); - - return array_values( $prominent_words_taxonomies ); - } - - /** - * Checks if the taxonomy is supported. - * - * @param string $taxonomy The taxonomy to look up. - * - * @return bool True when taxonomy is supported. - */ - public function is_taxonomy_supported( $taxonomy ) { - return in_array( $taxonomy, $this->get_supported_taxonomies(), true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-prominent-words-unindexed-post-query.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-prominent-words-unindexed-post-query.php deleted file mode 100644 index d2ef0d96..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-prominent-words-unindexed-post-query.php +++ /dev/null @@ -1,190 +0,0 @@ -get_unindexed_post_ids( $this->get_post_types(), ( $limit + 1 ) ); - return count( $unindexed_post_ids ) > $limit; - } - - /** - * Returns the total unindexed posts for given post type. - * - * @since 4.6.0 - * - * @param string $post_type The posttype to fetch. - * - * @return int The total amount of unindexed posts. - */ - public function get_total( $post_type ) { - if ( ! array_key_exists( $post_type, $this->totals ) ) { - $totals = $this->get_totals( $this->get_post_types() ); - - foreach ( $totals as $total_post_type => $total ) { - $this->totals[ $total_post_type ] = $total; - } - } - - if ( ! array_key_exists( $post_type, $this->totals ) ) { - $this->totals[ $post_type ] = 0; - } - - return $this->totals[ $post_type ]; - } - - /** - * Returns the totals for each posttype by counting them. - * - * @since 4.6.0 - * - * @param array $post_types The posttype to limit the resultset for. - * - * @return array Array with the totals for the requested posttypes. - */ - public function get_totals( $post_types ) { - global $wpdb; - - if ( $post_types === [] ) { - return $post_types; - } - - $replacements = [ - WPSEO_Premium_Prominent_Words_Versioning::POST_META_NAME, - WPSEO_Premium_Prominent_Words_Versioning::get_version_number(), - ]; - $replacements = array_merge( $replacements, $post_types ); - - $results = $wpdb->get_results( - $wpdb->prepare( - ' - SELECT COUNT( ID ) as total, post_type - FROM ' . $wpdb->posts . ' - WHERE ID NOT IN( SELECT post_id FROM ' . $wpdb->postmeta . ' WHERE meta_key = %s AND meta_value = %s ) - AND post_status IN( "future", "draft", "pending", "private", "publish" ) - AND post_type IN( ' . implode( ',', array_fill( 0, count( $post_types ), '%s' ) ) . ' ) - GROUP BY post_type - ', - $replacements - ) - ); - - $totals = []; - - foreach ( $results as $result ) { - $totals[ $this->determine_rest_endpoint_for_post_type( $result->post_type ) ] = (int) $result->total; - } - - return $totals; - } - - /** - * Determines the REST endpoint for the given post type. - * - * @param string $post_type The post type to determine the endpoint for. - * - * @return string The endpoint. Returns empty string if post type doesn't exist. - */ - protected function determine_rest_endpoint_for_post_type( $post_type ) { - $post_type_object = get_post_type_object( $post_type ); - - if ( is_null( $post_type_object ) ) { - return ''; - } - - if ( isset( $post_type_object->rest_base ) && ! empty( $post_type_object->rest_base ) ) { - return $post_type_object->rest_base; - } - - return $post_type_object->name; - } - - /** - * Returns the array with supported posttypes. - * - * @return array The supported posttypes. - */ - protected function get_post_types() { - $prominent_words_support = new WPSEO_Premium_Prominent_Words_Support(); - - return array_filter( $prominent_words_support->get_supported_post_types(), [ 'WPSEO_Post_Type', 'is_rest_enabled' ] ); - } - - /** - * Gets the Post IDs of un-indexed objects. - * - * @param array|string $post_types The post type(s) to fetch. - * @param int $limit Limit the number of results. - * - * @return int[] Post IDs found which are un-indexed. - */ - public function get_unindexed_post_ids( $post_types, $limit ) { - global $wpdb; - - if ( is_string( $post_types ) ) { - $post_types = (array) $post_types; - } - - if ( $post_types === [] ) { - return $post_types; - } - - $replacements = [ - WPSEO_Premium_Prominent_Words_Versioning::POST_META_NAME, - WPSEO_Premium_Prominent_Words_Versioning::get_version_number(), - ]; - $replacements = array_merge( $replacements, $post_types ); - $replacements[] = $limit; - - $results = $wpdb->get_results( - $wpdb->prepare( - ' - SELECT ID - FROM ' . $wpdb->posts . ' - WHERE ID NOT IN( SELECT post_id FROM ' . $wpdb->postmeta . ' WHERE meta_key = %s AND meta_value = %s ) - AND post_status IN( "future", "draft", "pending", "private", "publish" ) - AND post_type IN( ' . implode( ',', array_fill( 0, count( $post_types ), '%s' ) ) . ' ) - LIMIT %d', - $replacements - ), - ARRAY_A - ); - - // Make sure we return a list of IDs. - $results = wp_list_pluck( $results, 'ID' ); - - return $results; - } - - /** - * Returns the array with supported post statuses. - * - * @return string[] The supported post statuses. - */ - public function get_supported_post_statuses() { - return [ 'future', 'draft', 'pending', 'private', 'publish' ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-prominent-words-versioning.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-prominent-words-versioning.php deleted file mode 100644 index 00a0a59e..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-prominent-words-versioning.php +++ /dev/null @@ -1,67 +0,0 @@ -query( - $wpdb->prepare( - 'UPDATE ' . $wpdb->postmeta . ' SET meta_key = %s WHERE meta_key = "yst_prominent_words_version"', - self::POST_META_NAME - ) - ); - } - - /** - * Removes the meta key for the prominent words version for the unsupported languages that might have this value - * set. - * - * @return void - */ - public static function upgrade_4_8() { - $supported_languages = [ 'en', 'de', 'nl', 'es', 'fr', 'it', 'pt', 'ru', 'pl', 'sv', 'id' ]; - - if ( in_array( WPSEO_Language_Utils::get_language( get_locale() ), $supported_languages, true ) ) { - return; - } - - global $wpdb; - - // The remove all post metas. - $wpdb->query( - $wpdb->prepare( - 'DELETE FROM ' . $wpdb->postmeta . ' WHERE meta_key = %s', - self::POST_META_NAME - ) - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-redirect-endpoint.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-redirect-endpoint.php deleted file mode 100644 index 002f35b6..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-redirect-endpoint.php +++ /dev/null @@ -1,120 +0,0 @@ -service = $service; - } - - /** - * Registers all hooks to WordPress. - * - * @return void - */ - public function register_hooks() { - add_action( 'rest_api_init', [ $this, 'register' ] ); - } - - /** - * Register the REST endpoint to WordPress. - * - * @return void - */ - public function register() { - $args = [ - 'origin' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The origin to redirect', - ], - 'target' => [ - 'required' => false, - 'type' => 'string', - 'description' => 'The redirect target', - ], - 'type' => [ - 'required' => true, - 'type' => 'integer', - 'description' => 'The redirect type', - ], - ]; - - register_rest_route( - self::REST_NAMESPACE, - self::ENDPOINT_QUERY, - [ - 'methods' => 'POST', - 'args' => $args, - 'callback' => [ - $this->service, - 'save', - ], - 'permission_callback' => [ - $this, - 'can_save_data', - ], - ] - ); - - register_rest_route( - self::REST_NAMESPACE, - self::ENDPOINT_UNDO, - [ - 'methods' => 'POST', - 'args' => array_merge( - $args, - [ - 'type' => [ - 'required' => false, - 'type' => 'string', - 'description' => 'The redirect format', - ], - ] - ), - 'callback' => [ - $this->service, - 'delete', - ], - 'permission_callback' => [ - $this, - 'can_save_data', - ], - ] - ); - } - - /** - * Determines if the current user is allowed to use this endpoint. - * - * @return bool True user is allowed to use this endpoint. - */ - public function can_save_data() { - return current_user_can( self::CAPABILITY_STORE ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-redirect-export-manager.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-redirect-export-manager.php deleted file mode 100644 index ae6a0757..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-redirect-export-manager.php +++ /dev/null @@ -1,116 +0,0 @@ -' - . esc_html__( 'Export redirects', 'wordpress-seo-premium' ) - . ''; - } - } - - /** - * Adding the export block for CSV. Makes it able to export redirects to CSV. - * - * @return void - */ - public function add_redirect_export_block() { - // Display the forms. - if ( current_user_can( 'export' ) ) { - require WPSEO_PREMIUM_PATH . 'classes/views/export-redirects.php'; - } - } - - /** - * Hijacks the request and returns a CSV file if we're on the right page with the right method and the right capabilities. - * - * @return void - */ - public function redirects_csv_export() { - if ( $this->is_valid_csv_export_request() && current_user_can( 'export' ) ) { - // Check if we have a valid nonce. - check_admin_referer( 'wpseo-export' ); - - // Clean any content that has been already outputted, for example by other plugins or faulty PHP files. - if ( ob_get_contents() ) { - ob_clean(); - } - - // Set CSV headers and content. - $this->set_csv_headers(); - echo $this->get_csv_contents(); - - // And exit so we don't start appending HTML to our CSV file. - // NOTE: this makes this entire class untestable as it will exit all tests but WordPress seems to have no elegant way of handling this. - exit(); - } - } - - /** - * Are we on the wpseo_tools page in the import-export tool and have we received an export post request? - * - * @return bool - */ - protected function is_valid_csv_export_request() { - // phpcs:disable WordPress.Security.NonceVerification -- Reason: Nonce is checked in export. - // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are strictly comparing only or ignoring the value. - return ( isset( $_GET['page'] ) && is_string( $_GET['page'] ) && wp_unslash( $_GET['page'] ) === 'wpseo_tools' ) - && ( isset( $_GET['tool'] ) && is_string( $_GET['tool'] ) && wp_unslash( $_GET['tool'] ) === 'import-export' ) - && ( isset( $_POST['export'] ) && ! empty( $_POST['export'] ) ); - // phpcs:enable - } - - /** - * Sets the headers to trigger an CSV download in the browser. - * - * @return void - */ - protected function set_csv_headers() { - header( 'Content-type: text/csv' ); - header( 'Content-Disposition: attachment; filename=wordpress-seo-redirects.csv' ); - header( 'Pragma: no-cache' ); - header( 'Expires: 0' ); - } - - /** - * Generates CSV from all redirects. - * - * @return string - */ - protected function get_csv_contents() { - // Grab all our redirects. - $redirect_manager = new WPSEO_Redirect_Manager(); - $redirects = $redirect_manager->get_all_redirects(); - - $csv_exporter = new WPSEO_Redirect_CSV_Exporter(); - return $csv_exporter->export( $redirects ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-redirect-option.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-redirect-option.php deleted file mode 100644 index e7efff38..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-redirect-option.php +++ /dev/null @@ -1,80 +0,0 @@ -get_defaults();}} - * - * @var array - */ - protected $defaults = [ - // Form fields. - 'disable_php_redirect' => 'off', - 'separate_file' => 'off', - ]; - - /** - * Registers the option to the WPSEO Options framework. - * - * @return void - */ - public static function register_option() { - WPSEO_Options::register_option( static::get_instance() ); - } - - /** - * Get the singleton instance of this class. - * - * @return static Returns instance of itself. - */ - public static function get_instance() { - if ( ! ( static::$instance instanceof static ) ) { - static::$instance = new static(); - } - - return static::$instance; - } - - /** - * All concrete classes must contain a validate_option() method which validates all - * values within the option. - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array The clean option with the saved value. - */ - protected function validate_option( $dirty, $clean, $old ) { - - foreach ( $clean as $key => $value ) { - switch ( $key ) { - case 'disable_php_redirect': - case 'separate_file': - if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], [ 'on', 'off' ], true ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - } - } - - return $clean; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-redirect-service.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-redirect-service.php deleted file mode 100644 index 1af790f0..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-redirect-service.php +++ /dev/null @@ -1,94 +0,0 @@ -map_request_to_redirect( $request ); - - if ( $this->get_redirect_manager()->create_redirect( $redirect ) ) { - return new WP_REST_Response( 'true' ); - } - - return new WP_REST_Response( 'false' ); - } - - /** - * Deletes the redirect from the redirects. - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response The response to send back. - */ - public function delete( WP_REST_Request $request ) { - $redirect = $this->map_request_to_redirect( $request ); - $redirects = [ $redirect ]; - - $redirect_format = $request->get_param( 'format' ); - if ( ! $redirect_format ) { - $redirect_format = WPSEO_Redirect_Formats::PLAIN; - } - - if ( $this->get_redirect_manager( $redirect_format )->delete_redirects( $redirects ) ) { - return new WP_REST_Response( - [ - 'title' => __( 'Redirect deleted.', 'wordpress-seo-premium' ), - 'message' => __( 'The redirect was deleted successfully.', 'wordpress-seo-premium' ), - 'success' => true, - ] - ); - } - - return new WP_REST_Response( - [ - 'title' => __( 'Redirect not deleted.', 'wordpress-seo-premium' ), - 'message' => __( 'Something went wrong when deleting this redirect.', 'wordpress-seo-premium' ), - 'success' => false, - ], - 400 - ); - } - - /** - * Creates and returns an instance of the redirect manager. - * - * @param string $format The redirect format. - * - * @return WPSEO_Redirect_Manager The redirect maanger. - */ - protected function get_redirect_manager( $format = WPSEO_Redirect_Formats::PLAIN ) { - return new WPSEO_Redirect_Manager( $format ); - } - - /** - * Maps the given request to an instance of the WPSEO_Redirect. - * - * @param WP_REST_Request $request The request object. - * - * @return WPSEO_Redirect Redirect instance. - */ - protected function map_request_to_redirect( WP_REST_Request $request ) { - $origin = $request->get_param( 'origin' ); - $target = $request->get_param( 'target' ); - $type = $request->get_param( 'type' ); - $format = $request->get_param( 'format' ); - - return new WPSEO_Redirect( $origin, $target, $type, $format ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-register-capabilities.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-register-capabilities.php deleted file mode 100644 index 8a901828..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-register-capabilities.php +++ /dev/null @@ -1,32 +0,0 @@ -register( 'wpseo_manage_redirects', [ 'administrator', 'editor', 'wpseo_editor', 'wpseo_manager' ] ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-stale-cornerstone-content-filter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-stale-cornerstone-content-filter.php deleted file mode 100644 index 8194a5ee..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/premium-stale-cornerstone-content-filter.php +++ /dev/null @@ -1,121 +0,0 @@ -is_filter_active() ) { - return $where; - } - - global $wpdb; - - $where .= sprintf( - ' AND ' . $wpdb->posts . '.ID IN( SELECT post_id FROM ' . $wpdb->postmeta . ' WHERE meta_key = "%s" AND meta_value = "1" ) AND ' . $wpdb->posts . '.post_modified < "%s" ', - WPSEO_Meta::$meta_prefix . 'is_cornerstone', - $this->date_threshold() - ); - - return $where; - } - - /** - * Returns the label for this filter. - * - * @return string The label for this filter. - */ - protected function get_label() { - return __( 'Stale cornerstone content', 'wordpress-seo-premium' ); - } - - /** - * Returns a text explaining this filter. - * - * @return string|null The explanation for this filter. - */ - protected function get_explanation() { - $post_type_object = get_post_type_object( $this->get_current_post_type() ); - - if ( $post_type_object === null ) { - return null; - } - - return sprintf( - /* translators: %1$s expands to dynamic post type label, %2$s expands anchor to blog post about cornerstone content, %3$s expands to */ - __( 'Stale cornerstone content refers to cornerstone content that hasn’t been updated in the last 6 months. Make sure to keep these %1$s up-to-date. %2$sLearn more about cornerstone content%3$s.', 'wordpress-seo-premium' ), - strtolower( $post_type_object->labels->name ), - '', - '' - ); - } - - /** - * Returns the total amount of stale cornerstone content. - * - * @return int The total amount of stale cornerstone content. - */ - protected function get_post_total() { - global $wpdb; - - return (int) $wpdb->get_var( - $wpdb->prepare( - ' - SELECT COUNT( 1 ) - FROM ' . $wpdb->postmeta . ' - WHERE post_id IN( SELECT ID FROM ' . $wpdb->posts . ' WHERE post_type = %s && post_modified < %s ) && - meta_value = "1" AND meta_key = %s - ', - $this->get_current_post_type(), - $this->date_threshold(), - WPSEO_Meta::$meta_prefix . 'is_cornerstone' - ) - ); - } - - /** - * Returns the post types to which this filter should be added. - * - * @return array The post types to which this filter should be added. - */ - protected function get_post_types() { - // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- Using YoastSEO hook. - $post_types = apply_filters( 'wpseo_cornerstone_post_types', parent::get_post_types() ); - if ( ! is_array( $post_types ) ) { - return []; - } - - return $post_types; - } - - /** - * Returns the date 6 months ago. - * - * @return string The formatted date. - */ - protected function date_threshold() { - return gmdate( 'Y-m-d', strtotime( '-6months' ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/product-premium.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/product-premium.php deleted file mode 100644 index 682f4262..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/product-premium.php +++ /dev/null @@ -1,60 +0,0 @@ -set_extension_url( 'https://my.yoast.com/licenses/' ); - } - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect-undo-endpoint.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect-undo-endpoint.php deleted file mode 100644 index 4c9a3cbd..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect-undo-endpoint.php +++ /dev/null @@ -1,176 +0,0 @@ -manager = $manager; - } - - /** - * Registers all hooks to WordPress. - * - * @return void - */ - public function register_hooks() { - add_action( 'rest_api_init', [ $this, 'register' ] ); - } - - /** - * Register the REST endpoint to WordPress. - * - * @return void - */ - public function register() { - register_rest_route( - self::REST_NAMESPACE, - self::ENDPOINT_UNDO, - [ - 'methods' => 'POST', - 'args' => [ - 'obj_id' => [ - 'required' => true, - 'type' => 'int', - 'description' => 'The id of the post or term', - ], - 'obj_type' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The object type: post or term', - ], - ], - 'callback' => [ $this, 'undo_redirect' ], - 'permission_callback' => [ $this, 'can_save_data' ], - ] - ); - } - - /** - * Deletes the latest redirect to the post or term referenced in the request. - * - * @param WP_REST_Request $request The request. - * - * @return WP_REST_Response The response. - */ - public function undo_redirect( WP_REST_Request $request ) { - $object_id = $request->get_param( 'obj_id' ); - $object_type = $request->get_param( 'obj_type' ); - - $redirect_info = $this->retrieve_post_or_term_redirect_info( $object_type, $object_id ); - $redirect = $this->map_redirect_info_to_redirect( $redirect_info ); - - if ( ! $redirect->get_origin() ) { - return new WP_REST_Response( - [ - 'title' => __( 'Redirect not deleted.', 'wordpress-seo-premium' ), - 'message' => __( 'Something went wrong when deleting this redirect.', 'wordpress-seo-premium' ), - 'success' => false, - ], - 400 - ); - } - - if ( $this->manager->delete_redirects( [ $redirect ] ) ) { - return new WP_REST_Response( - [ - 'title' => __( 'Redirect deleted.', 'wordpress-seo-premium' ), - 'message' => __( 'The redirect was deleted successfully.', 'wordpress-seo-premium' ), - 'success' => true, - ] - ); - } - - return new WP_REST_Response( - [ - 'title' => __( 'Redirect not deleted.', 'wordpress-seo-premium' ), - 'message' => __( 'Something went wrong when deleting this redirect.', 'wordpress-seo-premium' ), - 'success' => false, - ], - 400 - ); - } - - /** - * Maps the given redirect info to an instance of the WPSEO_Redirect. - * - * @param array $redirect_info The redirect info array. - * - * @return WPSEO_Redirect Redirect instance. - */ - protected function map_redirect_info_to_redirect( $redirect_info ) { - $origin = ( $redirect_info['origin'] ?? null ); - $target = ( $redirect_info['target'] ?? null ); - $type = ( $redirect_info['type'] ?? null ); - $format = ( $redirect_info['format'] ?? null ); - - return new WPSEO_Redirect( $origin, $target, $type, $format ); - } - - /** - * Retrieve the redirect info from the meta for the specified object and id. - * - * @param string $object_type The type of object: post or term. - * @param int $object_id The post or term ID. - * - * @return array - */ - private function retrieve_post_or_term_redirect_info( $object_type, $object_id ) { - if ( $object_type === 'post' ) { - $redirect_info = get_post_meta( $object_id, '_yoast_post_redirect_info', true ); - delete_post_meta( $object_id, '_yoast_post_redirect_info' ); - return $redirect_info; - } - - if ( $object_type === 'term' ) { - $redirect_info = get_term_meta( $object_id, '_yoast_term_redirect_info', true ); - delete_term_meta( $object_id, '_yoast_term_redirect_info' ); - return $redirect_info; - } - - return []; - } - - /** - * Determines if the current user is allowed to use this endpoint. - * - * @param WP_REST_Request $request The request. - * - * @return bool True user is allowed to use this endpoint. - */ - public function can_save_data( WP_REST_Request $request ) { - $object_id = $request->get_param( 'obj_id' ); - $object_type = $request->get_param( 'obj_type' ); - - if ( $object_type === 'post' ) { - return current_user_can( 'edit_post', $object_id ); - } - - if ( $object_type === 'term' ) { - return current_user_can( 'edit_term', $object_id ); - } - - return false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/executable-redirect.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/executable-redirect.php deleted file mode 100644 index 0afcccb6..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/executable-redirect.php +++ /dev/null @@ -1,104 +0,0 @@ -origin = $origin; - $this->target = $target; - $this->type = $type; - $this->format = $format; - } - - /** - * Creates an instance based on the given data. - * - * @param array $data The redirect data. - * - * @return WPSEO_Executable_Redirect The created object. - */ - public static function from_array( $data ) { - return new self( $data['origin'], $data['target'], $data['type'], $data['format'] ); - } - - /** - * Retrieves the origin. - * - * @return string The origin. - */ - public function get_origin() { - return $this->origin; - } - - /** - * Retrieves the target. - * - * @return string The target. - */ - public function get_target() { - return $this->target; - } - - /** - * Retrieves the type. - * - * @return int The redirect type. - */ - public function get_type() { - return $this->type; - } - - /** - * Retrieves the redirect format. - * - * @return string The redirect format. - */ - public function get_format() { - return $this->format; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-apache-exporter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-apache-exporter.php deleted file mode 100644 index 382c71a1..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-apache-exporter.php +++ /dev/null @@ -1,138 +0,0 @@ -get_type() ); - if ( $redirect_type >= 400 && $redirect_type < 500 ) { - return $this->format_non_target( $redirect ); - } - - $origin = $redirect->get_origin(); - - if ( $redirect->get_format() === WPSEO_Redirect_Formats::PLAIN ) { - $origin = $this->format_url( $redirect->get_origin() ); - } - - return sprintf( - $this->get_format( $redirect->get_format() ), - $origin, - $this->format_url( $redirect->get_target() ), - $redirect->get_type() - ); - } - - /** - * Format the URL before it is added to the redirects. - * - * @param string $url The URL. - * - * @return string Formatted URL. - */ - protected function format_url( $url ) { - return $this->add_url_slash( $url ); - } - - /** - * Build the redirect output for non-target status codes (4xx) - * - * @param WPSEO_Redirect $redirect The redirect data. - * - * @return string - */ - public function format_non_target( WPSEO_Redirect $redirect ) { - - $target = $redirect->get_origin(); - if ( $redirect->get_format() === WPSEO_Redirect_Formats::PLAIN ) { - $target = $this->add_url_slash( $target ); - } - - return sprintf( - $this->get_non_target_format( $redirect->get_format() ), - $target, - $redirect->get_type() - ); - } - - /** - * Get the format the redirect needs to output - * - * @param string $redirect_format The format of the redirect. - * - * @return string - */ - public function get_non_target_format( $redirect_format ) { - if ( $redirect_format === WPSEO_Redirect_Formats::PLAIN ) { - return $this->url_non_target_format; - } - - return $this->regex_non_target_format; - } - - /** - * Check if first character is a slash, adds a slash if it ain't so - * - * @param string $url The URL add the slashes to. - * - * @return string mixed - */ - private function add_url_slash( $url ) { - $scheme = wp_parse_url( $url, PHP_URL_SCHEME ); - if ( substr( $url, 0, 1 ) !== '/' && empty( $scheme ) ) { - $url = '/' . $url; - } - - return $url; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-csv-exporter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-csv-exporter.php deleted file mode 100644 index 6c2299d4..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-csv-exporter.php +++ /dev/null @@ -1,93 +0,0 @@ -get_headers(); - - if ( ! empty( $redirects ) ) { - foreach ( $redirects as $redirect ) { - if ( $redirect instanceof WPSEO_Redirect ) { - $csv .= PHP_EOL . $this->format( $redirect ); - } - } - } - - return $csv; - } - - /** - * Formats a redirect for use in the export, returns a line of CSV. - * - * @param WPSEO_Redirect $redirect The redirect to format. - * - * @return string CSV line of the redirect for format. - */ - public function format( WPSEO_Redirect $redirect ) { - $target = $redirect->get_target(); - if ( WPSEO_Redirect_Util::is_relative_url( $target ) ) { - $target = '/' . $target; - } - if ( WPSEO_Redirect_Util::requires_trailing_slash( $target ) ) { - $target = trailingslashit( $target ); - } - - $origin = $redirect->get_origin(); - if ( $redirect->get_format() === WPSEO_Redirect_Formats::PLAIN && WPSEO_Redirect_Util::is_relative_url( $origin ) ) { - $origin = '/' . $origin; - } - - $redirect_details = [ - $this->format_csv_column( $origin ), - $this->format_csv_column( $target ), - $this->format_csv_column( $redirect->get_type() ), - $this->format_csv_column( $redirect->get_format() ), - ]; - - return implode( ',', $redirect_details ); - } - - /** - * Returns the headers to add to the first line of the generated CSV. - * - * @return string CSV line of the headers. - */ - protected function get_headers() { - $headers = [ - __( 'Origin', 'wordpress-seo-premium' ), - __( 'Target', 'wordpress-seo-premium' ), - __( 'Type', 'wordpress-seo-premium' ), - __( 'Format', 'wordpress-seo-premium' ), - ]; - - return implode( ',', $headers ); - } - - /** - * Surrounds a value with double quotes and escapes existing double quotes. - * - * @param string $value The value to sanitize. - * - * @return string The sanitized value. - */ - protected function format_csv_column( $value ) { - return '"' . str_replace( '"', '""', (string) $value ) . '"'; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-exporter-interface.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-exporter-interface.php deleted file mode 100644 index 8c7e712b..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-exporter-interface.php +++ /dev/null @@ -1,28 +0,0 @@ -format( $redirect ) . PHP_EOL; - } - } - // Check if the file content isset. - return $this->save( $file_content ); - } - - /** - * Formats a redirect for use in the export. - * - * @param WPSEO_Redirect $redirect The redirect to format. - * - * @return string - */ - public function format( WPSEO_Redirect $redirect ) { - return sprintf( - $this->get_format( $redirect->get_format() ), - $redirect->get_origin(), - $redirect->get_target(), - $redirect->get_type() - ); - } - - /** - * Returns the needed format for the redirect. - * - * @param string $redirect_format The format of the redirect. - * - * @return string - */ - protected function get_format( $redirect_format ) { - if ( $redirect_format === WPSEO_Redirect_Formats::PLAIN ) { - return $this->url_format; - } - - return $this->regex_format; - } - - /** - * Save the redirect file. - * - * @param string $file_content The file content that will be saved. - * - * @return bool - */ - protected function save( $file_content ) { - // Save the actual file. - if ( is_writable( WPSEO_Redirect_File_Util::get_file_path() ) ) { - WPSEO_Redirect_File_Util::write_file( WPSEO_Redirect_File_Util::get_file_path(), $file_content ); - } - - return true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-htaccess-exporter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-htaccess-exporter.php deleted file mode 100644 index 40ab6048..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-htaccess-exporter.php +++ /dev/null @@ -1,101 +0,0 @@ -get_htaccess_content( $file_path, $file_content ); - $return = (bool) WPSEO_Redirect_File_Util::write_file( $file_path, $htaccess ); - - // Make sure defines are created. - WP_Filesystem(); - chmod( $file_path, FS_CHMOD_FILE ); - - return $return; - } - - return false; - } - - /** - * Getting the content from current .htaccess - * - * @param string $file_path The location of the htaccess file. - * @param string $file_content THe content to save in the htaccess file. - * - * @return string - */ - private function get_htaccess_content( $file_path, $file_content ) { - // Read current htaccess. - $htaccess = ''; - if ( file_exists( $file_path ) ) { - $htaccess = file_get_contents( $file_path ); - } - - $htaccess = preg_replace( '`# BEGIN YOAST REDIRECTS.*# END YOAST REDIRECTS' . PHP_EOL . '`is', '', $htaccess ); - - // Only add redirect code when redirects are present. - if ( ! empty( $file_content ) ) { - $file_content = '# BEGIN YOAST REDIRECTS' . PHP_EOL . '' . PHP_EOL . 'RewriteEngine On' . PHP_EOL . $file_content . '' . PHP_EOL . '# END YOAST REDIRECTS' . PHP_EOL; - - // Prepend our redirects to htaccess file. - $htaccess = $file_content . $htaccess; - } - - return $htaccess; - } - - /** - * Escape special characters in the URL that will cause problems in .htaccess. - * - * Overrides WPSEO_Redirect_Apache_Exporter::format_url. - * - * @param string $url The URL. - * - * @return string The escaped URL. - */ - protected function format_url( $url ) { - $url = parent::format_url( $url ); - - return $this->sanitize( $url ); - } - - /** - * Escape special characters that will cause problems in .htaccess. - * - * @param string $unsanitized The unsanitized value. - * - * @return string The sanitized value. - */ - private function sanitize( $unsanitized ) { - return str_replace( - [ - '\\', - '"', - ], - [ - '/', - '\"', - ], - $unsanitized - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-nginx-exporter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-nginx-exporter.php deleted file mode 100644 index d303d529..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-nginx-exporter.php +++ /dev/null @@ -1,72 +0,0 @@ -get_format( $redirect->get_format() ), - $redirect->get_origin(), - $redirect->get_target(), - $redirect->get_type(), - $this->add_x_redirect_header() - ); - } - - /** - * Adds an X-Redirect-By header if allowed by the filter. - * - * @return string - */ - private function add_x_redirect_header() { - /** - * Filter: 'Yoast\WP\SEO\add_x_redirect' - can be used to remove the X-Redirect-By header - * Yoast SEO Premium creates (defaults to true, which is adding it) - * - * Note: This is a Premium plugin-only hook. - * - * @since 12.9.0 - * - * @param bool $add_xredirect - */ - if ( apply_filters( 'Yoast\WP\SEO\add_x_redirect', true ) === true ) { - return 'add_header X-Redirect-By "Yoast SEO Premium";'; - } - - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-option-exporter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-option-exporter.php deleted file mode 100644 index 4f8a89f9..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/exporters/redirect-option-exporter.php +++ /dev/null @@ -1,66 +0,0 @@ - [], - WPSEO_Redirect_Formats::REGEX => [], - ]; - - foreach ( $redirects as $redirect ) { - $formatted_redirects[ $redirect->get_format() ][ $redirect->get_origin() ] = $this->format( $redirect ); - } - - /** - * Filters the parameter to save the redirect options as autoloaded. - * - * Note that the `autoload` value in the database will change only if the option value changes (i.e. a redirect is added, edited or deleted). - * Otherwise you will need to change the `autoload` value directly in the DB. - * - * @since 20.13 - * - * @param bool $autoload The value of the `autoload` parameter. Default: true. - * @param string $type The type of redirects, either `plain` or `regex`. - * @param array $formatted_redirects The redirects to be written in the options, already formatted. - * - * @return bool The filtered value of the `autoload` parameter. - */ - $autoload_options_plain = apply_filters( 'Yoast\WP\SEO\redirects_options_autoload', true, 'plain', $formatted_redirects ); - $autoload_options_regex = apply_filters( 'Yoast\WP\SEO\redirects_options_autoload', true, 'regex', $formatted_redirects ); - - update_option( WPSEO_Redirect_Option::OPTION_PLAIN, $formatted_redirects[ WPSEO_Redirect_Formats::PLAIN ], $autoload_options_plain ); - update_option( WPSEO_Redirect_Option::OPTION_REGEX, $formatted_redirects[ WPSEO_Redirect_Formats::REGEX ], $autoload_options_regex ); - - return true; - } - - /** - * Formats a redirect for use in the export. - * - * @param WPSEO_Redirect $redirect The redirect to format. - * - * @return array - */ - public function format( WPSEO_Redirect $redirect ) { - return [ - 'url' => $redirect->get_target(), - 'type' => $redirect->get_type(), - ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-abstract-loader.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-abstract-loader.php deleted file mode 100644 index 872b2b23..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-abstract-loader.php +++ /dev/null @@ -1,45 +0,0 @@ -has( $status_code ); - } - - /** - * Validates if the given value is a redirect format. - * - * @param string $format The format to validate. - * - * @return bool Whether or not the format is valid. - */ - protected function validate_format( $format ) { - $redirect_formats = new WPSEO_Redirect_Formats(); - - return $redirect_formats->has( $format ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-csv-loader.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-csv-loader.php deleted file mode 100644 index f11b5aac..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-csv-loader.php +++ /dev/null @@ -1,78 +0,0 @@ -csv_file = $csv_file; - } - - /** - * Loads all redirects from the CSV file. - * - * @return WPSEO_Redirect[] The redirects loaded from the CSV file. - */ - public function load() { - $handle = fopen( $this->csv_file, 'r' ); - - if ( ! $handle ) { - return []; - } - - $redirects = []; - while ( $item = fgetcsv( $handle, 10000 ) ) { - if ( ! $this->validate_item( $item ) ) { - continue; - } - - $redirects[] = new WPSEO_Redirect( $item[0], $item[1], $item[2], $item[3] ); - } - - return $redirects; - } - - /** - * Checks if a parsed CSV row is has a valid redirect format. - * It should have exactly 4 values. - * The third value should be a http status code. - * The last value should be a redirect format. - * - * @param array $item The parsed CSV row. - * - * @return bool Whether or not the parsed CSV row is valid. - */ - protected function validate_item( $item ) { - if ( count( $item ) !== 4 ) { - return false; - } - - if ( ! $this->validate_status_code( $item[2] ) ) { - return false; - } - - if ( ! $this->validate_format( $item[3] ) ) { - return false; - } - - return true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-htaccess-loader.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-htaccess-loader.php deleted file mode 100644 index d945b126..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-htaccess-loader.php +++ /dev/null @@ -1,145 +0,0 @@ -htaccess = $htaccess; - } - - /** - * Loads redirects as WPSEO_Redirects from the .htaccess file given to the constructor. - * - * @return WPSEO_Redirect[] The loaded redirects. - */ - public function load() { - $redirects = []; - - // Loop through patterns. - foreach ( self::regex_patterns() as $regex ) { - $matches = $this->match_redirects( $regex['pattern'] ); - - if ( is_array( $matches ) ) { - $redirects = array_merge( $redirects, $this->convert_redirects_from_matches( $matches, $regex['type'] ) ); - } - } - - return $redirects; - } - - /** - * Matches the string (containing redirects) for the given regex. - * - * @param string $pattern The regular expression to match redirects. - * - * @return array[] - */ - protected function match_redirects( $pattern ) { - preg_match_all( $pattern, $this->htaccess, $matches, PREG_SET_ORDER ); - - return $matches; - } - - /** - * Converts matches to WPSEO_Redirect objects. - * - * @param array[] $matches The redirects to save. - * @param string $format The format for the redirects. - * - * @return WPSEO_Redirect[] The redirects. - */ - protected function convert_redirects_from_matches( $matches, $format ) { - $redirects = []; - - foreach ( $matches as $match ) { - $type = trim( $match[1] ); - $source = trim( $match[2] ); - $target = $this->parse_target( $type, $match ); - - if ( $target === false || $source === '' || ! $this->validate_status_code( $type ) ) { - continue; - } - - $redirects[] = new WPSEO_Redirect( $source, $target, $type, $format ); - } - - return $redirects; - } - - /** - * Parses the target from a match. - * - * @param string $type The status code of the redirect. - * @param string[] $matched The match. - * - * @return bool|string The status code, false if no status code could be parsed. - */ - protected function parse_target( $type, $matched ) { - // If it's a gone status code that doesn't need a target. - if ( $type === '410' ) { - return ''; - } - - $target = trim( $matched[3] ); - - // There is no target, skip it. - if ( $target === '' ) { - return false; - } - - return $target; - } - - /** - * Returns regex patterns to match redirects in .htaccess files. - * - * @return array[] The regex patterns to test against. - */ - protected static function regex_patterns() { - return [ - [ - 'type' => WPSEO_Redirect_Formats::PLAIN, - 'pattern' => '`^Redirect ([0-9]{3}) ([^"\s]+) ([a-z0-9-_+/.:%&?=#\][]+)`im', - ], - [ - 'type' => WPSEO_Redirect_Formats::PLAIN, - 'pattern' => '`^Redirect ([0-9]{3}) "([^"]+)" ([a-z0-9-_+/.:%&?=#\][]+)`im', - ], - [ - 'type' => WPSEO_Redirect_Formats::PLAIN, - 'pattern' => '`^Redirect (410) ([^"\s]+)`im', // Matches a redirect without a target. - ], - [ - 'type' => WPSEO_Redirect_Formats::PLAIN, - 'pattern' => '`^Redirect (410) "([^"]+)"`im', // Matches a redirect without a target. - ], - [ - 'type' => WPSEO_Redirect_Formats::REGEX, - 'pattern' => '`^RedirectMatch ([0-9]{3}) ([^"\s]+) ([^\s]+)`im', - ], - [ - 'type' => WPSEO_Redirect_Formats::REGEX, - 'pattern' => '`^RedirectMatch ([0-9]{3}) "([^"]+)" ([^\s]+)`im', - ], - ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-loader-interface.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-loader-interface.php deleted file mode 100644 index de118c69..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-loader-interface.php +++ /dev/null @@ -1,19 +0,0 @@ -wpdb = $wpdb; - } - - /** - * Loads redirects as WPSEO_Redirects from the Redirection plugin. - * - * @return WPSEO_Redirect[] The loaded redirects. - */ - public function load() { - // Get redirects. - // phpcs:disable WordPress.DB.PreparedSQLPlaceholders.UnsupportedPlaceholder,WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber,WordPress.DB.PreparedSQL.NotPrepared - $items = $this->wpdb->get_results( - $this->wpdb->prepare( - "SELECT `url`, `action_data`, `regex`, `action_code` - FROM %i - WHERE %i = 'enabled' AND %i = 'url'", - $this->wpdb->prefix . 'redirection_items', - 'status', - 'action_type' - ) - ); - // phpcs:enable - - $redirects = []; - - foreach ( $items as $item ) { - $format = WPSEO_Redirect_Formats::PLAIN; - if ( (int) $item->regex === 1 ) { - $format = WPSEO_Redirect_Formats::REGEX; - } - - if ( ! $this->validate_status_code( $item->action_code ) ) { - continue; - } - - $redirects[] = new WPSEO_Redirect( $item->url, $item->action_data, $item->action_code, $format ); - } - - return $redirects; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-safe-redirect-loader.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-safe-redirect-loader.php deleted file mode 100644 index 7b3060df..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-safe-redirect-loader.php +++ /dev/null @@ -1,83 +0,0 @@ -convert_wildcards( $item ); - - $format = WPSEO_Redirect_Formats::PLAIN; - if ( (int) $item['enable_regex'] === 1 ) { - $format = WPSEO_Redirect_Formats::REGEX; - } - - $status_code = $this->convert_status_code( $item['status_code'] ); - - if ( ! $this->validate_status_code( $status_code ) ) { - continue; - } - - $redirects[] = new WPSEO_Redirect( $item['redirect_from'], $item['redirect_to'], $status_code, $format ); - } - - return $redirects; - } - - /** - * Converts unsupported 404 and 403 status codes to a 410 status code. - * Also converts unsupported 303 status codes to a 302 status code. - * - * @param int $status_code The original status code. - * - * @return int A status code Yoast supports. - */ - protected function convert_status_code( $status_code ) { - switch ( $status_code ) { - case 303: - return 302; - case 403: - case 404: - return 410; - default: - return (int) $status_code; - } - } - - /** - * Converts unsupported wildcard format to supported regex format. - * - * @param array $item A Safe Redirect Manager redirect. - * - * @return array A converted redirect. - */ - protected function convert_wildcards( $item ) { - if ( substr( $item['redirect_from'], -1, 1 ) === '*' ) { - $item['redirect_from'] = preg_replace( '/(\*)$/', '.*', $item['redirect_from'] ); - $item['enable_regex'] = 1; - } - - return $item; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-simple-301-redirect-loader.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-simple-301-redirect-loader.php deleted file mode 100644 index ab410087..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/loaders/redirect-simple-301-redirect-loader.php +++ /dev/null @@ -1,44 +0,0 @@ - $target ) { - $format = WPSEO_Redirect_Formats::PLAIN; - - // If wildcard redirects had been used, and this is one, flip it. - if ( $uses_wildcards && strpos( $origin, '*' ) !== false ) { - $format = WPSEO_Redirect_Formats::REGEX; - $origin = str_replace( '*', '(.*)', $origin ); - $target = str_replace( '*', '$1', $target ); - } - - $redirects[] = new WPSEO_Redirect( $origin, $target, 301, $format ); - } - - return $redirects; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-form-presenter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-form-presenter.php deleted file mode 100644 index f8d00d5a..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-form-presenter.php +++ /dev/null @@ -1,57 +0,0 @@ -view_vars = $view_vars; - - $this->view_vars['redirect_types'] = $this->get_redirect_types(); - } - - /** - * Display the form. - * - * @param array $display Additional display variables. - * - * @return void - */ - public function display( array $display = [] ) { - $display_vars = $this->view_vars; - if ( ! empty( $display ) ) { - $display_vars = array_merge_recursive( $display_vars, $display ); - } - - require WPSEO_PREMIUM_PATH . 'classes/redirect/views/redirects-form.php'; - } - - /** - * Getting array with the available redirect types. - * - * @return array Array with the redirect types. - */ - private function get_redirect_types() { - $types = new WPSEO_Redirect_Types(); - - return $types->get(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-page-presenter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-page-presenter.php deleted file mode 100644 index 856592ef..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-page-presenter.php +++ /dev/null @@ -1,89 +0,0 @@ -get_tab_presenter( $current_tab ); - $redirect_tabs = $this->navigation_tabs( $current_tab ); - - include WPSEO_PREMIUM_PATH . 'classes/redirect/views/redirects.php'; - } - - /** - * Returns a tab presenter. - * - * @param string $tab_to_display The tab that will be shown. - * - * @return WPSEO_Redirect_Tab_Presenter|null Tab presenter instance, or null if invalid tab given. - */ - private function get_tab_presenter( $tab_to_display ) { - $tab_presenter = null; - switch ( $tab_to_display ) { - case WPSEO_Redirect_Formats::PLAIN: - case WPSEO_Redirect_Formats::REGEX: - $tab_presenter = new WPSEO_Redirect_Table_Presenter( $tab_to_display ); - break; - case 'settings': - if ( current_user_can( 'wpseo_manage_options' ) ) { - $tab_presenter = new WPSEO_Redirect_Settings_Presenter( $tab_to_display ); - } - break; - } - - return $tab_presenter; - } - - /** - * Returning the anchors html for the tabs - * - * @param string $current_tab The tab that will be active. - * - * @return array { - * Associative array of navigation tabs data. - * - * @type array $tabs Array of $tab_slug => $tab_label pairs. - * @type string $current_tab The currently active tab slug. - * @type string $page_url Base URL of the current page, to append the tab slug to. - * } - */ - private function navigation_tabs( $current_tab ) { - $tabs = $this->get_redirect_formats(); - - if ( current_user_can( 'wpseo_manage_options' ) ) { - $tabs['settings'] = __( 'Settings', 'wordpress-seo-premium' ); - } - - return [ - 'tabs' => $tabs, - 'current_tab' => $current_tab, - 'page_url' => admin_url( 'admin.php?page=wpseo_redirects&tab=' ), - ]; - } - - /** - * Gets the available redirect formats. - * - * @return array Redirect formats as $slug => $label pairs. - */ - protected function get_redirect_formats() { - $redirect_formats = new WPSEO_Redirect_Formats(); - - return $redirect_formats->get(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-presenter-interface.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-presenter-interface.php deleted file mode 100644 index 6bb03324..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-presenter-interface.php +++ /dev/null @@ -1,21 +0,0 @@ - WPSEO_Redirect_File_Util::get_file_path(), - 'redirect_file' => $this->writable_redirect_file(), - ] - ); - } - - /** - * Check if it is possible to write to the files - * - * @return false|string - */ - private function writable_redirect_file() { - if ( WPSEO_Options::get( 'disable_php_redirect' ) !== 'on' ) { - return false; - } - - // Do file checks. - $file_exists = file_exists( WPSEO_Redirect_File_Util::get_file_path() ); - - if ( WPSEO_Utils::is_apache() ) { - $separate_file = ( WPSEO_Options::get( 'separate_file' ) === 'on' ); - - if ( $separate_file && $file_exists ) { - return 'apache_include_file'; - } - - if ( ! $separate_file ) { - // Everything is as expected. - if ( is_writable( WPSEO_Redirect_Htaccess_Util::get_htaccess_file_path() ) ) { - return false; - } - } - - return 'cannot_write_htaccess'; - } - - if ( WPSEO_Utils::is_nginx() ) { - if ( $file_exists ) { - return 'nginx_include_file'; - } - - return 'cannot_write_file'; - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-tab-presenter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-tab-presenter.php deleted file mode 100644 index a7d489a6..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-tab-presenter.php +++ /dev/null @@ -1,51 +0,0 @@ -view = $view; - } - - /** - * Displaying the table URL or regex. Depends on the current active tab. - * - * @param array $display Contextual display data. - * - * @return void - */ - public function display( array $display = [] ) { - $view_vars = $this->get_view_vars( $display ); - include WPSEO_PREMIUM_PATH . 'classes/redirect/views/redirects-tab-' . $this->view . '.php'; - } - - /** - * The method to get the variables for the view. This method should return an array, because this will be extracted. - * - * @param array $passed_vars Optional. View data manually passed. Default empty array. - * - * @return array Contextual variables to pass to the view. - */ - abstract protected function get_view_vars( array $passed_vars = [] ); -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-table-presenter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-table-presenter.php deleted file mode 100644 index 79fd6700..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/presenters/redirect-table-presenter.php +++ /dev/null @@ -1,73 +0,0 @@ -view ); - - return array_merge( - $passed_vars, - [ - 'redirect_table' => new WPSEO_Redirect_Table( - $this->view, - $this->get_first_column_value(), - $redirect_manager->get_redirects() - ), - 'origin_from_url' => $this->get_old_url(), - 'quick_edit_table' => new WPSEO_Redirect_Quick_Edit_Presenter(), - 'form_presenter' => new WPSEO_Redirect_Form_Presenter( - [ - 'origin_label_value' => $this->get_first_column_value(), - ] - ), - ] - ); - } - - /** - * Get the old URL from the URL. - * - * @return string The old URL. - */ - private function get_old_url() { - if ( isset( $_GET['old_url'] ) && is_string( $_GET['old_url'] ) ) { - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We decode it before sanitization to keep encoded characters. - $old_url = sanitize_text_field( rawurldecode( wp_unslash( $_GET['old_url'] ) ) ); - if ( ! empty( $old_url ) ) { - check_admin_referer( 'wpseo_redirects-old-url', 'wpseo_premium_redirects_nonce' ); - - return esc_attr( $old_url ); - } - } - - return ''; - } - - /** - * Return the value of the first column based on the table type. - * - * @return string The value of the first column. - */ - private function get_first_column_value() { - if ( $this->view === 'regex' ) { - return __( 'Regular Expression', 'wordpress-seo-premium' ); - } - - return __( 'Old URL', 'wordpress-seo-premium' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-ajax.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-ajax.php deleted file mode 100644 index ff3d264f..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-ajax.php +++ /dev/null @@ -1,218 +0,0 @@ -redirect_manager = new WPSEO_Redirect_Manager( $redirect_format ); - $this->redirect_format = $redirect_format; - - $this->set_hooks( $redirect_format ); - } - - /** - * Function that handles the AJAX 'wpseo_add_redirect' action. - * - * @return void - */ - public function ajax_add_redirect() { - $this->valid_ajax_check(); - - // Save the redirect. - $redirect = $this->get_redirect_from_post( 'redirect' ); - $this->validate( $redirect ); - - // The method always returns the added redirect. - if ( $this->redirect_manager->create_redirect( $redirect ) ) { - $response = [ - 'origin' => $redirect->get_origin(), - 'target' => $redirect->get_target(), - 'type' => $redirect->get_type(), - 'info' => [ - 'hasTrailingSlash' => WPSEO_Redirect_Util::requires_trailing_slash( $redirect->get_target() ), - 'isTargetRelative' => WPSEO_Redirect_Util::is_relative_url( $redirect->get_target() ), - ], - ]; - } - else { - // Set the value error. - $error = [ - 'type' => 'error', - 'message' => __( 'Unknown error. Failed to create redirect.', 'wordpress-seo-premium' ), - ]; - - $response = [ 'error' => $error ]; - } - - // Response. - // phpcs:ignore WordPress.Security.EscapeOutput -- WPCS bug/methods can't be whitelisted yet. - wp_die( WPSEO_Utils::format_json_encode( $response ) ); - } - - /** - * Function that handles the AJAX 'wpseo_update_redirect' action. - * - * @return void - */ - public function ajax_update_redirect() { - - $this->valid_ajax_check(); - - $current_redirect = $this->get_redirect_from_post( 'old_redirect' ); - $new_redirect = $this->get_redirect_from_post( 'new_redirect' ); - $this->validate( $new_redirect, $current_redirect ); - - // The method always returns the added redirect. - if ( $this->redirect_manager->update_redirect( $current_redirect, $new_redirect ) ) { - $response = [ - 'origin' => $new_redirect->get_origin(), - 'target' => $new_redirect->get_target(), - 'type' => $new_redirect->get_type(), - ]; - } - else { - // Set the value error. - $error = [ - 'type' => 'error', - 'message' => __( 'Unknown error. Failed to update redirect.', 'wordpress-seo-premium' ), - ]; - - $response = [ 'error' => $error ]; - } - - // Response. - // phpcs:ignore WordPress.Security.EscapeOutput -- WPCS bug/methods can't be whitelisted yet. - wp_die( WPSEO_Utils::format_json_encode( $response ) ); - } - - /** - * Run the validation. - * - * @param WPSEO_Redirect $redirect The redirect to save. - * @param WPSEO_Redirect|null $current_redirect The current redirect. - * - * @return void - */ - private function validate( WPSEO_Redirect $redirect, ?WPSEO_Redirect $current_redirect = null ) { - $validator = new WPSEO_Redirect_Validator(); - - if ( $validator->validate( $redirect, $current_redirect ) === true ) { - return; - } - - $ignore_warning = filter_input( INPUT_POST, 'ignore_warning' ); - - $error = $validator->get_error(); - - if ( $error->get_type() === 'error' || ( $error->get_type() === 'warning' && $ignore_warning === 'false' ) ) { - wp_die( - // phpcs:ignore WordPress.Security.EscapeOutput -- WPCS bug/methods can't be whitelisted yet. - WPSEO_Utils::format_json_encode( [ 'error' => $error->to_array() ] ) - ); - } - } - - /** - * Setting the AJAX hooks. - * - * @param string $hook_suffix The piece that will be stitched after the hooknames. - * - * @return void - */ - private function set_hooks( $hook_suffix ) { - // Add the new redirect. - add_action( 'wp_ajax_wpseo_add_redirect_' . $hook_suffix, [ $this, 'ajax_add_redirect' ] ); - - // Update an existing redirect. - add_action( 'wp_ajax_wpseo_update_redirect_' . $hook_suffix, [ $this, 'ajax_update_redirect' ] ); - - // Add URL response code check AJAX. - if ( ! has_action( 'wp_ajax_wpseo_check_url' ) ) { - add_action( 'wp_ajax_wpseo_check_url', [ $this, 'ajax_check_url' ] ); - } - } - - /** - * Check if the posted nonce is valid and if the user has the needed rights. - * - * @return void - */ - private function valid_ajax_check() { - // Check nonce. - check_ajax_referer( 'wpseo-redirects-ajax-security', 'ajax_nonce' ); - - $this->permission_check(); - } - - /** - * Checks whether the current user is allowed to do what he's doing. - * - * @return void - */ - private function permission_check() { - if ( ! current_user_can( 'edit_posts' ) ) { - wp_die( '0' ); - } - } - - /** - * Get the redirect from the post values. - * - * @param string $post_value The key where the post values are located in the $_POST. - * - * @return WPSEO_Redirect - */ - private function get_redirect_from_post( $post_value ) { - // phpcs:ignore WordPress.Security.NonceVerification -- Reason: nonce is verified in ajax_update_redirect and ajax_add_redirect. - if ( isset( $_POST[ $post_value ] ) && is_array( $_POST[ $post_value ] ) ) { - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized,WordPress.Security.NonceVerification -- Reason: we want to stick to sanitize_url function, while the nonce has been already checked. - $post_values = wp_unslash( $_POST[ $post_value ] ); - - return new WPSEO_Redirect( - $this->sanitize_url( $post_values['origin'] ), - $this->sanitize_url( $post_values['target'] ), - urldecode( $post_values['type'] ), - $this->redirect_format - ); - } - - return new WPSEO_Redirect( '', '', '', '' ); - } - - /** - * Sanitize the URL for displaying on the window. - * - * @param string $url The URL to sanitize. - * - * @return string - */ - private function sanitize_url( $url ) { - return trim( htmlspecialchars_decode( rawurldecode( $url ) ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-file-util.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-file-util.php deleted file mode 100644 index 537a896d..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-file-util.php +++ /dev/null @@ -1,122 +0,0 @@ -add_notification( - new Yoast_Notification( - /* translators: %s expands to the file path that we tried to write to */ - sprintf( __( "We're unable to create the directory %s", 'wordpress-seo-premium' ), $basedir ), - [ 'type' => 'error' ] - ) - ); - - return; - } - - // Create the .htaccess file. - if ( ! file_exists( $basedir . '/.htaccess' ) ) { - self::write_file( $basedir . '/.htaccess', "Options -Indexes\ndeny from all" ); - } - - // Create an empty index.php file. - if ( ! file_exists( $basedir . '/index.php' ) ) { - self::write_file( $basedir . '/index.php', 'add_notification( - new Yoast_Notification( - /* translators: %s expands to the file path that we tried to write to */ - sprintf( __( "We're unable to write data to the file %s", 'wordpress-seo-premium' ), $file_path ), - [ 'type' => 'error' ] - ) - ); - - return false; - } - - return true; - } - - /** - * Getting the object which will save the redirects file - * - * @param string $separate_file Saving the redirects in an separate apache file. - * - * @return WPSEO_Redirect_File_Exporter|null - */ - public static function get_file_exporter( $separate_file ) { - // Create the correct file object. - if ( WPSEO_Utils::is_apache() ) { - if ( $separate_file === 'on' ) { - return new WPSEO_Redirect_Apache_Exporter(); - } - - return new WPSEO_Redirect_Htaccess_Exporter(); - } - - if ( WPSEO_Utils::is_nginx() ) { - return new WPSEO_Redirect_Nginx_Exporter(); - } - - return null; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-formats.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-formats.php deleted file mode 100644 index 04f910ad..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-formats.php +++ /dev/null @@ -1,40 +0,0 @@ - __( 'Redirects', 'wordpress-seo-premium' ), - self::REGEX => __( 'Regex Redirects', 'wordpress-seo-premium' ), - ]; - } - - /** - * Checks whether the given value is a valid redirect format. - * - * @param string $value Value to check. - * - * @return bool True if a redirect format, false otherwise. - */ - public function has( $value ) { - $formats = $this->get(); - - return isset( $formats[ $value ] ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-formatter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-formatter.php deleted file mode 100644 index 6b78d0f8..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-formatter.php +++ /dev/null @@ -1,28 +0,0 @@ -get_origin(), - $redirect->get_target(), - $redirect->get_type(), - $redirect->get_format() - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-htaccess-util.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-htaccess-util.php deleted file mode 100644 index e43201f9..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-htaccess-util.php +++ /dev/null @@ -1,46 +0,0 @@ -redirect_option = $redirect_option; - } - - /** - * Imports the redirects and retrieves the import statistics. - * - * @param WPSEO_Redirect[] $redirects The redirects to import. - * - * @return int[] The import statistics. - */ - public function import( array $redirects ) { - array_walk( $redirects, [ $this, 'add_redirect' ] ); - - if ( $this->total_imported > 0 ) { - $this->save_import(); - } - - return [ - 'total_redirects' => count( $redirects ), - 'total_imported' => $this->total_imported, - ]; - } - - /** - * Saves the redirects to the database and exports them to the necessary configuration file. - * - * @codeCoverageIgnore Because it contains dependencies - * - * @return void - */ - protected function save_import() { - $this->redirect_option->save(); - - // Export the redirects to .htaccess, Apache or NGinx configuration files depending on plugin settings. - $redirect_manager = new WPSEO_Redirect_Manager(); - $redirect_manager->export_redirects(); - } - - /** - * Adds a redirect to the option. - * - * @param WPSEO_Redirect $redirect The redirect to add. - * - * @return void - */ - protected function add_redirect( $redirect ) { - if ( ! $this->redirect_option->add( $redirect ) ) { - return; - } - - ++$this->total_imported; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-manager.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-manager.php deleted file mode 100644 index 5c57d168..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-manager.php +++ /dev/null @@ -1,197 +0,0 @@ -redirect_option = $option; - $this->redirect_format = $redirect_format; - $this->exporters = $exporters; - } - - /** - * Get the redirects. - * - * @return WPSEO_Redirect[] - */ - public function get_redirects() { - // Filter the redirect for the current format. - return array_filter( $this->redirect_option->get_all(), [ $this, 'filter_redirects_by_format' ] ); - } - - /** - * Returns all redirects. - * - * @return WPSEO_Redirect[] - */ - public function get_all_redirects() { - return $this->redirect_option->get_all(); - } - - /** - * Export the redirects to the specified sources. - * - * @return void - */ - public function export_redirects() { - $redirects = $this->redirect_option->get_all(); - $exporters = $this->exporters; - - if ( ! $exporters ) { - $exporters = self::default_exporters(); - } - - foreach ( $exporters as $exporter ) { - $exporter->export( $redirects ); - } - } - - /** - * Create a new redirect. - * - * @param WPSEO_Redirect $redirect The redirect object to add. - * - * @return bool - */ - public function create_redirect( WPSEO_Redirect $redirect ) { - if ( $this->redirect_option->add( $redirect ) ) { - $this->save_redirects(); - - return true; - } - - return false; - } - - /** - * Save the redirect. - * - * @param WPSEO_Redirect $current_redirect The old redirect, the value is a key in the redirects array. - * @param WPSEO_Redirect $redirect New redirect object. - * - * @return bool - */ - public function update_redirect( WPSEO_Redirect $current_redirect, WPSEO_Redirect $redirect ) { - if ( $this->redirect_option->update( $current_redirect, $redirect ) ) { - $this->save_redirects(); - - return true; - } - - return false; - } - - /** - * Delete the redirects. - * - * @param WPSEO_Redirect[] $delete_redirects Array with the redirects to remove. - * - * @return bool - */ - public function delete_redirects( $delete_redirects ) { - $deleted = false; - foreach ( $delete_redirects as $delete_redirect ) { - if ( $this->redirect_option->delete( $delete_redirect ) ) { - $deleted = true; - } - } - - if ( $deleted === true ) { - $this->save_redirects(); - } - - return $deleted; - } - - /** - * Returns the redirect when it's found, otherwise it will return false. - * - * @param string $origin The origin to search for. - * - * @return bool|WPSEO_Redirect - */ - public function get_redirect( $origin ) { - return $this->redirect_option->get( $origin ); - } - - /** - * This method will save the redirect option and if necessary the redirect file. - * - * @return void - */ - public function save_redirects() { - // Update the database option. - $this->redirect_option->save(); - - // Save the redirect file. - $this->export_redirects(); - } - - /** - * Filter the redirects that don't match the needed format. - * - * @param WPSEO_Redirect $redirect The redirect to filter. - * - * @return bool - */ - private function filter_redirects_by_format( WPSEO_Redirect $redirect ) { - return $redirect->get_format() === $this->redirect_format; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-option.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-option.php deleted file mode 100644 index ffad7751..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-option.php +++ /dev/null @@ -1,278 +0,0 @@ -redirects = $this->get_all(); - } - } - - /** - * Getting the array with all the redirects. - * - * @return WPSEO_Redirect[] - */ - public function get_all() { - $redirects = $this->get_from_option(); - - array_walk( $redirects, [ $this, 'map_option_to_object' ] ); - - return $redirects; - } - - /** - * Check if the old redirect doesn't exist already, if not it will be added. - * - * @param WPSEO_Redirect $redirect The redirect object to save. - * - * @return bool - */ - public function add( WPSEO_Redirect $redirect ) { - if ( $this->search( $redirect->get_origin() ) === false ) { - $this->run_redirects_modified_action( $redirect ); - - $this->redirects[] = $redirect; - - return true; - } - - return false; - } - - /** - * Check if the $current_redirect exists and remove it if so. - * - * @param WPSEO_Redirect $current_redirect The current redirect value. - * @param WPSEO_Redirect $redirect The redirect object to save. - * - * @return bool - */ - public function update( WPSEO_Redirect $current_redirect, WPSEO_Redirect $redirect ) { - $found = $this->search( $current_redirect->get_origin() ); - if ( $found !== false ) { - $this->run_redirects_modified_action( $redirect ); - - $this->redirects[ $found ] = $redirect; - - return true; - } - - return false; - } - - /** - * Deletes the given redirect from the array. - * - * @param WPSEO_Redirect $current_redirect The redirect that will be removed. - * - * @return bool - */ - public function delete( WPSEO_Redirect $current_redirect ) { - $found = $this->search( $current_redirect->get_origin() ); - if ( $found !== false ) { - $this->run_redirects_modified_action( $current_redirect ); - - unset( $this->redirects[ $found ] ); - - return true; - } - - return false; - } - - /** - * Get a redirect from the array. - * - * @param string $origin The redirects origin to search for. - * - * @return WPSEO_Redirect|bool - */ - public function get( $origin ) { - $found = $this->search( $origin ); - if ( $found !== false ) { - return $this->redirects[ $found ]; - } - - return false; - } - - /** - * Check if the $origin already exists as a key in the array. - * - * @param string $origin The redirect to search for. - * - * @return int|bool - */ - public function search( $origin ) { - foreach ( $this->redirects as $redirect_key => $redirect ) { - if ( $redirect->origin_is( $origin ) ) { - return $redirect_key; - } - } - - return false; - } - - /** - * Saving the redirects. - * - * @param bool $retry_upgrade Whether or not to retry the 3.1 upgrade. Used to prevent infinite recursion. - * - * @return void - */ - public function save( $retry_upgrade = true ) { - $redirects = $this->redirects; - - // Retry the 3.1 upgrade routine to make sure we're always dealing with valid redirects. - $upgrade_manager = new WPSEO_Upgrade_Manager(); - if ( $retry_upgrade && $upgrade_manager->should_retry_upgrade_31() ) { - $upgrade_manager->retry_upgrade_31( true ); - $redirects = array_merge( $redirects, $this->get_all() ); - } - - array_walk( $redirects, [ $this, 'map_object_to_option' ] ); - - /** - * Filter: 'Yoast\WP\SEO\save_redirects' - can be used to filter the redirects before saving. - * - * Note: This is a Premium plugin-only hook. - * - * @since 12.9.0 - * - * @param array $redirects - */ - $redirects = apply_filters( 'Yoast\WP\SEO\save_redirects', $redirects ); - - // Update the database option. - update_option( self::OPTION, $redirects, false ); - } - - /** - * Setting the redirects property. - * - * @param string $option_name The target option name. - * - * @return array - */ - public function get_from_option( $option_name = self::OPTION ) { - $redirects = get_option( $option_name ); - - /** - * Filter: 'Yoast\WP\SEO\get_redirects' - can be used to filter the redirects on option retrieval. - * - * Note: This is a Premium plugin-only hook. - * - * @since 12.9.0 - * - * @param array $redirects - */ - $redirects = apply_filters( 'Yoast\WP\SEO\get_redirects', $redirects ); - - if ( ! is_array( $redirects ) ) { - $redirects = []; - } - - return $redirects; - } - - /** - * Runs the redirects modified hook with the altered redirect as input. - * - * @param WPSEO_Redirect $redirect The redirect that has been altered. - * - * @return void - */ - protected function run_redirects_modified_action( WPSEO_Redirect $redirect ) { - /** - * Filter: Yoast\WP\SEO\redirects_modified - Allow developers to run actions when the redirects are modified. - * - * Note: This is a Premium plugin-only hook. - * - * @since 12.9.0 - * - * @param string $origin The redirect origin. - * @param string $target The redirect target. - * @param int $type The redirect type (301, 404, 410, etc). - */ - do_action( 'Yoast\WP\SEO\redirects_modified', $redirect->get_origin(), $redirect->get_target(), $redirect->get_type() ); - } - - /** - * Maps the array values to a redirect object. - * - * @param array $redirect_values The data for the redirect option. - * - * @return void - */ - private function map_option_to_object( array &$redirect_values ) { - $redirect_values = new WPSEO_Redirect( $redirect_values['origin'], $redirect_values['url'], $redirect_values['type'], $redirect_values['format'] ); - } - - /** - * Maps a redirect object to an array option. - * - * @param WPSEO_Redirect $redirect The redirect to map. - * - * @return void - */ - private function map_object_to_option( WPSEO_Redirect &$redirect ) { - $redirect = [ - 'origin' => $redirect->get_origin(), - 'url' => $redirect->get_target(), - 'type' => $redirect->get_type(), - 'format' => $redirect->get_format(), - ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-page.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-page.php deleted file mode 100644 index d036a3cb..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-page.php +++ /dev/null @@ -1,355 +0,0 @@ -initialize_admin(); - } - - // Only initialize the ajax for all tabs except settings. - if ( wp_doing_ajax() ) { - $this->initialize_ajax(); - } - } - - /** - * Display the presenter. - * - * @return void - */ - public function display() { - $display_args = [ 'current_tab' => $this->get_current_tab() ]; - - $redirect_presenter = new WPSEO_Redirect_Page_Presenter(); - $redirect_presenter->display( $display_args ); - } - - /** - * Catches possible posted filter values and redirects it to a GET-request. - * - * It catches: - * A search post. - * A redirect-type filter. - * - * @return void - */ - public function list_table_search() { - if ( ! isset( $_SERVER['REQUEST_URI'] ) ) { - return; - } - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Variable is used in a strict comparison and sanitized by wp_safe_redirect anyway. - $url = wp_unslash( $_SERVER['REQUEST_URI'] ); - $new_url = $this->extract_redirect_type_from_url( $url ); - $new_url = $this->extract_search_string_from_url( $new_url ); - - if ( $url !== $new_url ) { - // Do the redirect. - wp_safe_redirect( $new_url ); - exit; - } - } - - /** - * Extracts the redirect type from the passed URL. - * - * @param string $url The URL to try and extract the redirect type from. - * - * @return string The newly formatted URL. Returns original URL if filter is null. - */ - protected function extract_redirect_type_from_url( $url ) { - if ( ( ! isset( $_POST['redirect-type'] ) ) || ( ! is_string( $_POST['redirect-type'] ) ) - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized in wp_verify_none. - || ! isset( $_POST['wpseo_redirects_ajax_nonce'] ) || ! wp_verify_nonce( wp_unslash( $_POST['wpseo_redirects_ajax_nonce'] ), 'wpseo-redirects-ajax-security' ) ) { - return $url; - } - - $filter = sanitize_text_field( wp_unslash( $_POST['redirect-type'] ) ); - - $new_url = remove_query_arg( 'redirect-type', $url ); - - if ( $filter !== '0' ) { - $new_url = add_query_arg( 'redirect-type', rawurlencode( $filter ), $new_url ); - } - - return $new_url; - } - - /** - * Extracts the search string from the passed URL. - * - * @param string $url The URL to try and extract the search string from. - * - * @return string The newly formatted URL. Returns original URL if search string is null. - */ - protected function extract_search_string_from_url( $url ) { - if ( ( ! isset( $_POST['s'] ) ) || ( ! is_string( $_POST['s'] ) ) - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized in wp_verify_none. - || ! isset( $_POST['wpseo_redirects_ajax_nonce'] ) || ! wp_verify_nonce( wp_unslash( $_POST['wpseo_redirects_ajax_nonce'] ), 'wpseo-redirects-ajax-security' ) ) { - return $url; - } - - $search_string = sanitize_text_field( wp_unslash( $_POST['s'] ) ); - - $new_url = remove_query_arg( 's', $url ); - - if ( $search_string !== '' ) { - $new_url = add_query_arg( 's', rawurlencode( $search_string ), $new_url ); - } - - return $new_url; - } - - /** - * Load the admin redirects scripts. - * - * @return void - */ - public function enqueue_assets() { - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $version = $asset_manager->flatten_version( WPSEO_PREMIUM_VERSION ); - - $dependencies = [ - 'jquery', - 'jquery-ui-dialog', - 'wp-util', - 'underscore', - 'yoast-seo-premium-commons', - 'wp-api', - 'wp-api-fetch', - ]; - - wp_enqueue_script( - 'wp-seo-premium-admin-redirects', - plugin_dir_url( WPSEO_PREMIUM_FILE ) - . 'assets/js/dist/wp-seo-premium-admin-redirects-' . $version . WPSEO_CSSJS_SUFFIX . '.js', - $dependencies, - WPSEO_PREMIUM_VERSION, - true - ); - wp_localize_script( 'wp-seo-premium-admin-redirects', 'wpseoPremiumStrings', WPSEO_Premium_Javascript_Strings::strings() ); - wp_localize_script( 'wp-seo-premium-admin-redirects', 'wpseoUserLocale', [ 'code' => substr( get_user_locale(), 0, 2 ) ] ); - wp_localize_script( 'wp-seo-premium-admin-redirects', 'wpseoAdminRedirect', [ 'homeUrl' => home_url( '/' ) ] ); - wp_enqueue_style( 'wpseo-premium-redirects', plugin_dir_url( WPSEO_PREMIUM_FILE ) . 'assets/css/dist/premium-redirects-' . $version . '.css', [], WPSEO_PREMIUM_VERSION ); - - wp_enqueue_style( 'wp-jquery-ui-dialog' ); - - $screen_option_args = [ - 'label' => __( 'Redirects per page', 'wordpress-seo-premium' ), - 'default' => 25, - 'option' => 'redirects_per_page', - ]; - add_screen_option( 'per_page', $screen_option_args ); - } - - /** - * Catch redirects_per_page. - * - * @param string|false $status The value to save instead of the option value. - * Default false (to skip saving the current option). - * @param string $option The option name where the value is set for. - * @param string $value The new value for the screen option. - * - * @return string|false - */ - public function set_screen_option( $status, $option, $value ) { - if ( $option === 'redirects_per_page' ) { - return $value; - } - - return $status; - } - - /** - * Hook that runs after the 'wpseo_redirect' option is updated. - * - * @param array $old_value Unused. - * @param array $value The new saved values. - * - * @return void - */ - public function save_redirect_files( $old_value, $value ) { - - $is_php = ( empty( $value['disable_php_redirect'] ) || $value['disable_php_redirect'] !== 'on' ); - - $was_separate_file = ( ! empty( $old_value['separate_file'] ) && $old_value['separate_file'] === 'on' ); - $is_separate_file = ( ! empty( $value['separate_file'] ) && $value['separate_file'] === 'on' ); - - // Check if the 'disable_php_redirect' option set to true/on. - if ( ! $is_php ) { - // The 'disable_php_redirect' option is set to true(on) so we need to generate a file. - // The Redirect Manager will figure out what file needs to be created. - $redirect_manager = new WPSEO_Redirect_Manager(); - $redirect_manager->export_redirects(); - } - - // Check if we need to remove the .htaccess redirect entries. - if ( WPSEO_Utils::is_apache() ) { - if ( $is_php || ( ! $was_separate_file && $is_separate_file ) ) { - // Remove the apache redirect entries. - WPSEO_Redirect_Htaccess_Util::clear_htaccess_entries(); - } - - if ( $is_php || ( $was_separate_file && ! $is_separate_file ) ) { - // Remove the apache separate file redirect entries. - WPSEO_Redirect_File_Util::write_file( WPSEO_Redirect_File_Util::get_file_path(), '' ); - } - } - - if ( WPSEO_Utils::is_nginx() && $is_php ) { - // Remove the nginx redirect entries. - $this->clear_nginx_redirects(); - } - } - - /** - * The server should always be apache. And the php redirects have to be enabled or in case of a separate - * file it should be disabled. - * - * @param bool $disable_php_redirect Are the php redirects disabled. - * @param bool $separate_file Value of the separate file. - * - * @return bool - */ - private function remove_htaccess_entries( $disable_php_redirect, $separate_file ) { - return ( WPSEO_Utils::is_apache() && ( ! $disable_php_redirect || ( $disable_php_redirect && $separate_file ) ) ); - } - - /** - * Clears the redirects from the nginx config. - * - * @return void - */ - private function clear_nginx_redirects() { - $redirect_file = WPSEO_Redirect_File_Util::get_file_path(); - if ( is_writable( $redirect_file ) ) { - WPSEO_Redirect_File_Util::write_file( $redirect_file, '' ); - } - } - - /** - * Initialize admin hooks. - * - * @return void - */ - private function initialize_admin() { - $this->fetch_bulk_action(); - - // Check if we need to save files after updating options. - add_action( 'update_option_wpseo_redirect', [ $this, 'save_redirect_files' ], 10, 2 ); - - // Convert post into get on search and loading the page scripts. - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized,WordPress.Security.NonceVerification.Recommended -- We're not manipulating the value. - if ( isset( $_GET['page'] ) && is_string( $_GET['page'] ) && wp_unslash( $_GET['page'] ) === 'wpseo_redirects' ) { - $upgrade_manager = new WPSEO_Upgrade_Manager(); - $upgrade_manager->retry_upgrade_31(); - - add_action( 'admin_init', [ $this, 'list_table_search' ] ); - - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - add_filter( 'set-screen-option', [ $this, 'set_screen_option' ], 11, 3 ); - } - } - - /** - * Initialize the AJAX redirect files. - * - * @return void - */ - private function initialize_ajax() { - // Normal Redirect AJAX. - new WPSEO_Redirect_Ajax( WPSEO_Redirect_Formats::PLAIN ); - - // Regex Redirect AJAX. - new WPSEO_Redirect_Ajax( WPSEO_Redirect_Formats::REGEX ); - } - - /** - * Getting the current active tab. - * - * @return string - */ - private function get_current_tab() { - static $current_tab; - - if ( $current_tab === null ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We're not manipulating the value. - if ( isset( $_GET['tab'] ) && is_string( $_GET['tab'] ) - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized,WordPress.Security.NonceVerification.Recommended -- value sanitized in the if body, regex filters unwanted values. - && in_array( wp_unslash( $_GET['tab'] ), [ WPSEO_Redirect_Formats::PLAIN, WPSEO_Redirect_Formats::REGEX, 'settings' ], true ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- the regex takes care of filtering out unwanted values. - $current_tab = sanitize_text_field( wp_unslash( $_GET['tab'] ) ); - } - else { - $current_tab = WPSEO_Redirect_Formats::PLAIN; - } - } - - return $current_tab; - } - - /** - * Setting redirect manager, based on the current active tab. - * - * @return WPSEO_Redirect_Manager - */ - private function get_redirect_manager() { - static $redirect_manager; - - if ( $redirect_manager === null ) { - $redirects_format = WPSEO_Redirect_Formats::PLAIN; - if ( $this->get_current_tab() === WPSEO_Redirect_Formats::REGEX ) { - $redirects_format = WPSEO_Redirect_Formats::REGEX; - } - - $redirect_manager = new WPSEO_Redirect_Manager( $redirects_format ); - } - - return $redirect_manager; - } - - /** - * Fetches the bulk action for removing redirects. - * - * @return void - */ - private function fetch_bulk_action() { - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized in wp_verify_none. - if ( ! isset( $_POST['wpseo_redirects_ajax_nonce'] ) || ! wp_verify_nonce( wp_unslash( $_POST['wpseo_redirects_ajax_nonce'] ), 'wpseo-redirects-ajax-security' ) ) { - return; - } - - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We're just strictly comparing the value. - if ( ( ! isset( $_POST['action'] ) || ! is_string( $_POST['action'] ) || ! wp_unslash( $_POST['action'] ) === 'delete' ) - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We're just strictly comparing the value. - && ( ! isset( $_POST['action2'] ) || ! is_string( $_POST['action2'] ) || ! wp_unslash( $_POST['action2'] ) === 'delete' ) ) { - return; - } - - if ( ! isset( $_POST['wpseo_redirects_bulk_delete'] ) || ! is_array( $_POST['wpseo_redirects_bulk_delete'] ) ) { - return; - } - - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Array elements are sanitized one by one in the foreach loop. - $bulk_delete = wp_unslash( $_POST['wpseo_redirects_bulk_delete'] ); - $redirects = []; - foreach ( $bulk_delete as $origin ) { - $redirect = $this->get_redirect_manager()->get_redirect( $origin ); - if ( $redirect !== false ) { - $redirects[] = $redirect; - } - } - $this->get_redirect_manager()->delete_redirects( $redirects ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-sitemap-filter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-sitemap-filter.php deleted file mode 100644 index 58b974ce..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-sitemap-filter.php +++ /dev/null @@ -1,85 +0,0 @@ -home_url = $home_url; - } - - /** - * Registers the hooks. - * - * @return void - */ - public function register_hooks() { - add_filter( 'wpseo_sitemap_entry', [ $this, 'filter_sitemap_entry' ] ); - add_action( 'Yoast\WP\SEO\redirects_modified', [ $this, 'clear_sitemap_cache' ] ); - } - - /** - * Prevents a redirected URL from being added to the sitemap. - * - * @param array $url The url data. - * - * @return bool|array False when entry will be redirected. - */ - public function filter_sitemap_entry( $url ) { - if ( empty( $url['loc'] ) ) { - return $url; - } - - $entry_location = str_replace( $this->home_url, '', $url['loc'] ); - - if ( $this->is_redirect( $entry_location ) !== false ) { - return false; - } - - return $url; - } - - /** - * Clears the sitemap cache. - * - * @return void - */ - public function clear_sitemap_cache() { - WPSEO_Sitemaps_Cache::clear(); - } - - /** - * Checks if the given entry location already exists as a redirect. - * - * @param string $entry_location The entry location. - * - * @return bool Whether the entry location exists as a redirect. - */ - protected function is_redirect( $entry_location ) { - static $redirects = null; - - if ( $redirects === null ) { - $redirects = new WPSEO_Redirect_Option(); - } - - return $redirects->search( $entry_location ) !== false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-table.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-table.php deleted file mode 100644 index ccec4173..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-table.php +++ /dev/null @@ -1,492 +0,0 @@ - null, - 'search_string' => null, - ]; - - /** - * The name of the first column. - * - * @var string - */ - private $current_column; - - /** - * The primary column. - * - * @var string - */ - private $primary_column = 'type'; - - /** - * Caches the WPSEO_Redirect_Types::get() result. - * - * @var string[] - */ - private $redirect_types; - - /** - * Holds the orderby. - * - * @var string - */ - private $orderby = 'old'; - - /** - * Holds the order. - * - * @var string - */ - private $order = 'asc'; - - /** - * WPSEO_Redirect_Table constructor. - * - * @param array|string $type Type of the redirects that is opened. - * @param string $current_column The value of the first column. - * @param WPSEO_Redirect[] $redirects The redirects. - */ - public function __construct( $type, $current_column, $redirects ) { - parent::__construct( [ 'plural' => $type ] ); - - $this->current_column = $current_column; - - // Cache used in filter_items and extra_tablenav. - $wpseo_redirect_types = new WPSEO_Redirect_Types(); - $this->redirect_types = $wpseo_redirect_types->get(); - - $this->set_items( $redirects ); - - add_filter( 'list_table_primary_column', [ $this, 'redirect_list_table_primary_column' ], 10, 2 ); - } - - /** - * Renders the extra table navigation. - * - * @param string $which Which tablenav is called. - * - * @return void - */ - public function extra_tablenav( $which ) { - if ( $which !== 'top' ) { - return; - } - - $selected = $this->filter['redirect_type']; - if ( $selected === null ) { - $selected = 0; - } - ?> -
              - - - 'post-query-submit' ] ); ?> -
              - '', - 'type' => _x( 'Type', 'noun', 'wordpress-seo-premium' ), - 'old' => $this->current_column, - 'new' => __( 'New URL', 'wordpress-seo-premium' ), - ]; - } - - /** - * Counts the total columns for the table. - * - * @return int The total amount of columns. - */ - public function count_columns() { - return count( $this->get_columns() ); - } - - /** - * Filter for setting the primary table column. - * - * @param string $column The current column. - * @param string $screen The current opened window. - * - * @return string The primary table column. - */ - public function redirect_list_table_primary_column( $column, $screen ) { - if ( $screen === 'seo_page_wpseo_redirects' ) { - $column = $this->primary_column; - } - - return $column; - } - - /** - * Sets up the table variables, fetch the items from the database, search, sort and format the items. - * Sets the items as the WPSEO_Redirect_Table items variable. - * - * @return void - */ - public function prepare_items() { - // Setup the columns. - $this->_column_headers = [ $this->get_columns(), [], $this->get_sortable_columns() ]; - - // Get variables needed for pagination. - $per_page = $this->get_items_per_page( 'redirects_per_page', 25 ); - $total_items = count( $this->items ); - $pagination_args = [ - 'total_items' => $total_items, - 'total_pages' => ceil( $total_items / $per_page ), - 'per_page' => $per_page, - ]; - - // Set pagination. - $this->set_pagination_args( $pagination_args ); - - $current_page = $this->get_pagenum(); - - // Setting the starting point. If starting point is below 1, overwrite it with value 0, otherwise it will be sliced of at the back. - $slice_start = ( $current_page - 1 ); - if ( $slice_start < 0 ) { - $slice_start = 0; - } - - // Apply 'pagination'. - $formatted_items = array_slice( $this->items, ( $slice_start * $per_page ), $per_page ); - - // Set items. - $this->items = $formatted_items; - } - - /** - * Returns the columns that are sortable. - * - * @return array[] An array containing the sortable columns. - */ - public function get_sortable_columns() { - return [ - 'old' => [ 'old', false ], - 'new' => [ 'new', false ], - 'type' => [ 'type', false ], - ]; - } - - /** - * Reorders the items based on user input. - * - * @param array $a The current sort direction. - * @param array $b The new sort direction. - * - * @return int The order that should be used. - */ - public function do_reorder( $a, $b ) { - // Determine sort order. - $result = strcmp( $a[ $this->orderby ], $b[ $this->orderby ] ); - - // Send final sort direction to usort. - return ( $this->order === 'asc' ) ? $result : ( -$result ); - } - - /** - * Creates a column for a checkbox. - * - * @param array $item Array with the row data. - * - * @return string The column with a checkbox. - */ - public function column_cb( $item ) { - return sprintf( - ' ', - esc_attr( $item['old'] ), - $item['row_number'], - /* translators: Hidden accessibility text. */ - esc_html( __( 'Select this redirect', 'wordpress-seo-premium' ) ) - ); - } - - /** - * Displays a default column. - * - * @param array $item Array with the row data. - * @param string $column_name The name of the needed column. - * - * @return string The default column. - */ - public function column_default( $item, $column_name ) { - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - $is_regex = isset( $_GET['tab'] ) && is_string( $_GET['tab'] ) && sanitize_text_field( wp_unslash( $_GET['tab'] ) ) === 'regex'; - $row_actions = $this->get_row_actions( $column_name ); - - switch ( $column_name ) { - case 'new': - $classes = [ 'val' ]; - $new_url = $item['new']; - $new_full_url = home_url( $new_url ); - if ( ! $is_regex && WPSEO_Redirect_Util::requires_trailing_slash( $new_url ) ) { - $classes[] = 'has-trailing-slash'; - } - - if ( - $new_url === '' - || $new_url === '/' - || ! WPSEO_Redirect_Util::is_relative_url( $new_url ) - ) { - $classes[] = 'remove-slashes'; - } - - if ( $new_url ) { - return '' . esc_html( $new_url ) . '' . $row_actions; - } - return '
              ' . $row_actions; - - case 'old': - $classes = ''; - $old_full_url = home_url( $item['old'] ); - if ( $is_regex === true ) { - return '
              ' . esc_html( $item['old'] ) . '
              ' . $row_actions; - } - - return '' . esc_html( $item['old'] ) . '' . $row_actions; - - case 'type': - return '
              ' . esc_html( $item['type'] ) . '
              ' . $row_actions; - - default: - return $item[ $column_name ]; - } - } - - /** - * Returns the available bulk actions. - * - * @return string[] Array containing the available bulk actions. - */ - public function get_bulk_actions() { - return [ - 'delete' => __( 'Delete', 'wordpress-seo-premium' ), - ]; - } - - /** - * Sets the items and orders them. - * - * @param array $items The data that will be showed. - * - * @return void - */ - private function set_items( $items ) { - // Getting the items. - $this->items = $this->filter_items( $items ); - - $this->format_items(); - - // Sort the results. - if ( count( $this->items ) > 0 ) { - $this->orderby = $this->get_orderby(); - $this->order = $this->get_order(); - usort( $this->items, [ $this, 'do_reorder' ] ); - } - } - - /** - * Filters the given items. - * - * @param WPSEO_Redirect[] $items The items to filter. - * - * @return array The filtered items. - */ - private function filter_items( array $items ) { - $search_string = ''; - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We come from our own redirect in a simple search form, let's not overcomplicate. - if ( isset( $_GET['s'] ) && is_string( $_GET['s'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: Same as above. - $search_string = trim( sanitize_text_field( wp_unslash( $_GET['s'] ) ), '/' ); - } - if ( $search_string !== '' ) { - $this->filter['search_string'] = $search_string; - - $items = array_filter( $items, [ $this, 'filter_by_search_string' ] ); - } - - $redirect_type = 0; - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We come from our own redirect in a simple filter form, let's not overcomplicate. - if ( isset( $_GET['redirect-type'] ) && is_string( $_GET['redirect-type'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: Cast to an integer and strictly compared against known keys. - $redirect_type = (int) wp_unslash( $_GET['redirect-type'] ); - $redirect_type = array_key_exists( $redirect_type, $this->redirect_types ) ? $redirect_type : 0; - } - if ( $redirect_type !== 0 ) { - $this->filter['redirect_type'] = $redirect_type; - - $items = array_filter( $items, [ $this, 'filter_by_type' ] ); - } - - return $items; - } - - /** - * Formats the items. - * - * @return void - */ - private function format_items() { - // Format the data. - $formatted_items = []; - - $counter = 1; - - foreach ( $this->items as $redirect ) { - $formatted_items[] = [ - 'old' => $redirect->get_origin(), - 'new' => $redirect->get_target(), - 'type' => $redirect->get_type(), - 'row_number' => $counter, - ]; - - ++$counter; - } - - $this->items = $formatted_items; - } - - /** - * Filters the redirect by entered search string. - * - * @param WPSEO_Redirect $redirect The redirect to filter. - * - * @return bool True when the search strings match. - */ - private function filter_by_search_string( WPSEO_Redirect $redirect ) { - return ( stripos( $redirect->get_origin(), $this->filter['search_string'] ) !== false || stripos( $redirect->get_target(), $this->filter['search_string'] ) !== false ); - } - - /** - * Filters the redirect by redirect type. - * - * @param WPSEO_Redirect $redirect The redirect to filter. - * - * @return bool True when type matches redirect type. - */ - private function filter_by_type( WPSEO_Redirect $redirect ) { - return $redirect->get_type() === $this->filter['redirect_type']; - } - - /** - * The old column actions. - * - * @param string $column The column name to verify. - * - * @return string - */ - private function get_row_actions( $column ) { - if ( $column === $this->primary_column ) { - $actions = [ - 'edit' => '' . __( 'Edit', 'wordpress-seo-premium' ) . '', - 'trash' => '' . __( 'Delete', 'wordpress-seo-premium' ) . '', - ]; - - return $this->row_actions( $actions ); - } - - return ''; - } - - /** - * Generates and display row actions links for the list table. - * - * We override the parent class method to avoid doubled buttons to be printed out. - * - * @param object $item The item being acted upon. - * @param string $column_name Current column name. - * @param string $primary Primary column name. - * - * @return string Empty string. - */ - protected function handle_row_actions( $item, $column_name, $primary ) { - return ''; - } - - /** - * Retrieves the orderby from the request. - * - * @return string The orderby value. - */ - private function get_orderby() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: WP list table is not using a nonce. - if ( isset( $_GET['orderby'] ) && is_string( $_GET['orderby'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: same as above and we are strictly comparing the values. - $orderby = wp_unslash( $_GET['orderby'] ); - if ( array_key_exists( $orderby, $this->get_sortable_columns() ) ) { - return $orderby; - } - } - - return 'old'; - } - - /** - * Retrieves the order from the request. - * - * @return string The order value. - */ - private function get_order() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: WP list table is not using a nonce. - if ( isset( $_GET['order'] ) && is_string( $_GET['order'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: same as above and we are strictly comparing the values. - $order = wp_unslash( $_GET['order'] ); - if ( in_array( $order, [ 'asc', 'desc' ], true ) ) { - return $order; - } - } - - return 'asc'; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-types.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-types.php deleted file mode 100644 index 840d8935..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-types.php +++ /dev/null @@ -1,57 +0,0 @@ - __( '301 Moved Permanently', 'wordpress-seo-premium' ), - '302' => __( '302 Found', 'wordpress-seo-premium' ), - '307' => __( '307 Temporary Redirect', 'wordpress-seo-premium' ), - '410' => __( '410 Content Deleted', 'wordpress-seo-premium' ), - '451' => __( '451 Unavailable For Legal Reasons', 'wordpress-seo-premium' ), - ]; - - /** - * Filter: 'Yoast\WP\SEO\redirect_types' - can be used to filter the redirect types. - * - * Note: This is a Premium plugin-only hook. - * - * @since 12.9.0 - * - * @param array $redirect_types - */ - return apply_filters( 'Yoast\WP\SEO\redirect_types', $redirect_types ); - } - - /** - * Checks whether the given value is a valid redirect type. - * - * @param string $value Value to check. - * - * @return bool True if a redirect type, false otherwise. - */ - public function has( $value ) { - $types = $this->get(); - - return isset( $types[ $value ] ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-upgrade.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-upgrade.php deleted file mode 100644 index 14f37084..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-upgrade.php +++ /dev/null @@ -1,147 +0,0 @@ - WPSEO_Redirect_Formats::PLAIN, - WPSEO_Redirect_Option::OLD_OPTION_REGEX => WPSEO_Redirect_Formats::REGEX, - ]; - - /** - * Upgrade routine from Yoast SEO premium 1.2.0. - * - * @return void - */ - public static function upgrade_1_2_0() { - $redirect_option = self::get_redirect_option(); - $redirects = []; - - foreach ( self::$redirect_option_names as $redirect_option_name => $redirect_format ) { - $old_redirects = $redirect_option->get_from_option( $redirect_option_name ); - - foreach ( $old_redirects as $origin => $redirect ) { - // Check if the redirect is not an array yet. - if ( ! is_array( $redirect ) ) { - $redirects[] = new WPSEO_Redirect( $origin, $redirect['url'], $redirect['type'], $redirect_format ); - } - } - } - - self::import_redirects( $redirects ); - } - - /** - * Check if redirects should be imported from the free version. - * - * @since 2.3 - * - * @return void - */ - public static function import_redirects_2_3() { - // phpcs:ignore WordPress.DB.SlowDBQuery -- Upgrade routine, so rarely used, therefore not an issue. - $wp_query = new WP_Query( 'post_type=any&meta_key=_yoast_wpseo_redirect&order=ASC' ); - - if ( ! empty( $wp_query->posts ) ) { - $redirects = []; - - foreach ( $wp_query->posts as $post ) { - - $old_url = '/' . $post->post_name . '/'; - $new_url = get_post_meta( $post->ID, '_yoast_wpseo_redirect', true ); - - // Create redirect. - $redirects[] = new WPSEO_Redirect( $old_url, $new_url, 301, WPSEO_Redirect_Formats::PLAIN ); - - // Remove post meta value. - delete_post_meta( $post->ID, '_yoast_wpseo_redirect' ); - } - - self::import_redirects( $redirects ); - } - } - - /** - * Upgrade routine to merge plain and regex redirects in a single option. - * - * @return void - */ - public static function upgrade_3_1() { - $redirects = []; - - foreach ( self::$redirect_option_names as $redirect_option_name => $redirect_format ) { - $old_redirects = get_option( $redirect_option_name, [] ); - - foreach ( $old_redirects as $origin => $redirect ) { - // Only when URL and type is set. - if ( array_key_exists( 'url', $redirect ) && array_key_exists( 'type', $redirect ) ) { - $redirects[] = new WPSEO_Redirect( $origin, $redirect['url'], $redirect['type'], $redirect_format ); - } - } - } - - // Saving the redirects to the option. - self::import_redirects( $redirects, [ new WPSEO_Redirect_Option_Exporter() ] ); - } - - /** - * Exports the redirects to htaccess or nginx file if needed. - * - * @return void - */ - public static function upgrade_13_0() { - $redirect_manager = new WPSEO_Redirect_Manager(); - $redirect_manager->export_redirects(); - } - - /** - * Imports an array of redirect objects. - * - * @param WPSEO_Redirect[] $redirects The redirects. - * @param WPSEO_Redirect_Exporter[]|null $exporters The exporters. - * - * @return void - */ - private static function import_redirects( $redirects, $exporters = null ) { - if ( empty( $redirects ) ) { - return; - } - - $redirect_option = self::get_redirect_option(); - $redirect_manager = new WPSEO_Redirect_Manager( null, $exporters, $redirect_option ); - - foreach ( $redirects as $redirect ) { - $redirect_option->add( $redirect ); - } - - $redirect_option->save( false ); - $redirect_manager->export_redirects(); - } - - /** - * Gets and caches the redirect option. - * - * @return WPSEO_Redirect_Option - */ - private static function get_redirect_option() { - static $redirect_option; - - if ( empty( $redirect_option ) ) { - $redirect_option = new WPSEO_Redirect_Option( false ); - } - - return $redirect_option; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-url-formatter.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-url-formatter.php deleted file mode 100644 index b7f56538..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-url-formatter.php +++ /dev/null @@ -1,76 +0,0 @@ -url = $this->sanitize_url( $url ); - } - - /** - * We want to strip the subdirectory from the redirect url. - * - * @param string $home_url The URL to use as the base. - * - * @return string - */ - public function format_without_subdirectory( $home_url ) { - $subdirectory = $this->get_subdirectory( $home_url ); - - if ( ! empty( $subdirectory ) ) { - $subdirectory = trailingslashit( $subdirectory ); - $path_position = strpos( $this->url, $subdirectory ); - if ( $path_position === 0 ) { - return '/' . $this->sanitize_url( substr( $this->url, strlen( $subdirectory ) ) ); - } - } - - return '/' . $this->url; - } - - /** - * Removes the slashes at the beginning of an url. - * - * @param string $url The URL to sanitize. - * - * @return string - */ - protected function sanitize_url( $url ) { - return ltrim( $url, '/' ); - } - - /** - * Returns the subdirectory from the given URL. - * - * @param string $url The URL to get the subdirectory for. - * - * @return string - */ - protected function get_subdirectory( $url ) { - $path = wp_parse_url( $url, PHP_URL_PATH ); - if ( is_string( $path ) ) { - return $this->sanitize_url( $path ); - } - - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-util.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-util.php deleted file mode 100644 index 832ad3a8..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect-util.php +++ /dev/null @@ -1,131 +0,0 @@ - [ - 'validation_class' => 'WPSEO_Redirect_Relative_Origin_Validation', - 'exclude_types' => [], - 'exclude_format' => [ WPSEO_Redirect_Formats::REGEX ], - ], - 'self-redirect' => [ - 'validation_class' => 'WPSEO_Redirect_Self_Redirect_Validation', - 'exclude_types' => [], - 'exclude_format' => [ WPSEO_Redirect_Formats::REGEX ], - ], - 'uniqueness' => [ - 'validation_class' => 'WPSEO_Redirect_Uniqueness_Validation', - 'exclude_types' => [], - 'exclude_format' => [], - ], - 'presence' => [ - 'validation_class' => 'WPSEO_Redirect_Presence_Validation', - 'exclude_types' => [], - 'exclude_format' => [], - ], - 'subdirectory-presence' => [ - 'validation_class' => 'WPSEO_Redirect_Subdirectory_Validation', - 'exclude_types' => [], - 'exclude_format' => [], - ], - 'accessible' => [ - 'validation_class' => 'WPSEO_Redirect_Accessible_Validation', - 'exclude_types' => [ WPSEO_Redirect_Types::DELETED, WPSEO_Redirect_Types::UNAVAILABLE ], - 'exclude_format' => [ WPSEO_Redirect_Formats::REGEX ], - ], - 'endpoint' => [ - 'validation_class' => 'WPSEO_Redirect_Endpoint_Validation', - 'exclude_types' => [ WPSEO_Redirect_Types::DELETED, WPSEO_Redirect_Types::UNAVAILABLE ], - 'exclude_format' => [ WPSEO_Redirect_Formats::REGEX ], - ], - ]; - - /** - * A string holding a possible redirect validation error. - * - * @var bool|string The validation error. - */ - protected $validation_error = false; - - /** - * Validates the old and the new URL. - * - * @param WPSEO_Redirect $redirect The redirect that will be saved. - * @param WPSEO_Redirect|null $current_redirect Redirect that will be used for comparison. - * - * @return bool|string - */ - public function validate( WPSEO_Redirect $redirect, ?WPSEO_Redirect $current_redirect = null ) { - - $validators = $this->get_validations( $this->get_filtered_validation_rules( $this->validation_rules, $redirect ) ); - $redirects = $this->get_redirects( $redirect->get_format() ); - - $this->validation_error = ''; - foreach ( $validators as $validator ) { - if ( ! $validator->run( $redirect, $current_redirect, $redirects ) ) { - $this->validation_error = $validator->get_error(); - - return false; - } - } - - return true; - } - - /** - * Returns the validation error. - * - * @return WPSEO_Validation_Result - */ - public function get_error() { - return $this->validation_error; - } - - /** - * Removes a rule from the validations. - * - * @param array $validations Array with the validations. - * @param string $rule_to_remove The rule that will be removed. - * - * @return void - */ - protected function remove_rule( &$validations, $rule_to_remove ) { - if ( array_key_exists( $rule_to_remove, $validations ) ) { - unset( $validations[ $rule_to_remove ] ); - } - } - - /** - * Filters the validation rules. - * - * @param array $validations Array with validation rules. - * @param WPSEO_Redirect $redirect The redirect that will be saved. - * - * @return array - */ - protected function get_filtered_validation_rules( array $validations, WPSEO_Redirect $redirect ) { - foreach ( $validations as $validation => $validation_rules ) { - $exclude_format = in_array( $redirect->get_format(), $validation_rules['exclude_format'], true ); - $exclude_type = in_array( $redirect->get_type(), $validation_rules['exclude_types'], true ); - - if ( $exclude_format || $exclude_type ) { - $this->remove_rule( $validations, $validation ); - } - } - - return $validations; - } - - /** - * Getting the validations based on the set validation rules. - * - * @param array $validation_rules The rules for the validations that will be run. - * - * @return WPSEO_Redirect_Validation[] - */ - protected function get_validations( $validation_rules ) { - $validations = []; - foreach ( $validation_rules as $validation_rule ) { - $validations[] = new $validation_rule['validation_class'](); - } - - return $validations; - } - - /** - * Fill the redirect property. - * - * @param string $format The format for the redirects. - * - * @return array - */ - protected function get_redirects( $format ) { - $redirect_manager = new WPSEO_Redirect_Manager( $format ); - - // Format the redirects. - $redirects = []; - foreach ( $redirect_manager->get_all_redirects() as $redirect ) { - $redirects[ $redirect->get_origin() ] = $redirect->get_target(); - } - - return $redirects; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect.php deleted file mode 100644 index fd89423a..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/redirect.php +++ /dev/null @@ -1,349 +0,0 @@ -origin = ( $format === WPSEO_Redirect_Formats::PLAIN ) ? $this->sanitize_origin_url( $origin ) : $origin; - $this->target = $this->sanitize_target_url( $target ); - $this->format = $format; - $this->type = (int) $type; - } - - /** - * Returns the origin. - * - * @return string The set origin. - */ - public function get_origin() { - return $this->origin; - } - - /** - * Returns the target - * - * @return string The set target. - */ - public function get_target() { - return $this->target; - } - - /** - * Returns the type - * - * @return int The set type. - */ - public function get_type() { - return $this->type; - } - - /** - * Returns the format - * - * @return string The set format. - */ - public function get_format() { - return $this->format; - } - - /** - * Whether a offset exists. - * - * @link http://php.net/manual/en/arrayaccess.offsetexists.php - * - * @param string $offset An offset to check for. - * - * @return bool True on success or false on failure. - * The return value will be cast to boolean if non-boolean was returned. - */ - #[ReturnTypeWillChange] - public function offsetExists( $offset ) { - return in_array( $offset, [ 'url', 'type' ], true ); - } - - /** - * Offset to retrieve. - * - * @link http://php.net/manual/en/arrayaccess.offsetget.php - * - * @param string $offset The offset to retrieve. - * - * @return mixed Can return all value types. - */ - #[ReturnTypeWillChange] - public function offsetGet( $offset ) { - switch ( $offset ) { - case 'old': - return $this->origin; - - case 'url': - return $this->target; - - case 'type': - return $this->type; - } - - return null; - } - - /** - * Offset to set. - * - * @link http://php.net/manual/en/arrayaccess.offsetset.php - * - * @param string $offset The offset to assign the value to. - * @param string $value The value to set. - * - * @return void - */ - #[ReturnTypeWillChange] - public function offsetSet( $offset, $value ) { - switch ( $offset ) { - case 'url': - $this->target = $value; - break; - case 'type': - $this->type = $value; - break; - } - } - - /** - * Offset to unset. - * - * @link http://php.net/manual/en/arrayaccess.offsetunset.php - * - * @codeCoverageIgnore - * - * @param string $offset The offset to unset. - * - * @return void - */ - #[ReturnTypeWillChange] - public function offsetUnset( $offset ) { - } - - /** - * Compares an URL with the origin of the redirect. - * - * @param string $url The URL to compare. - * - * @return bool True when url matches the origin. - */ - public function origin_is( $url ) { - // Sanitize the slash in case of plain redirect. - if ( $this->format === WPSEO_Redirect_Formats::PLAIN ) { - $url = $this->sanitize_slash( $url, $this->parse_url( $url ) ); - } - - return (string) $this->origin === (string) $url; - } - - /** - * Strip the trailing slashes for relative URLs. - * - * @param string $url_to_sanitize The URL to sanitize. - * @param array $url_pieces The url pieces. - * - * @return string The sanitized url. - */ - private function sanitize_slash( $url_to_sanitize, array $url_pieces = [] ) { - $url = $url_to_sanitize; - if ( $url !== '/' && ! isset( $url_pieces['scheme'] ) ) { - return trim( $url_to_sanitize, '/' ); - } - - return $url; - } - - /** - * Strip the protocol from the URL. - * - * @param string $scheme The scheme to strip. - * @param string $url The URL to remove the scheme from. - * - * @return string The url without the scheme. - */ - private function strip_scheme_from_url( $scheme, $url ) { - return str_replace( $scheme . '://', '', $url ); - } - - /** - * Remove the home URL from the redirect to ensure that relative URLs are created. - * - * @param string $url The URL to sanitize. - * - * @return string The sanitized url. - */ - private function sanitize_origin_url( $url ) { - $home_url = static::$home_url->get(); - $home_url_pieces = static::$home_url->get_parsed(); - $url_pieces = $this->parse_url( $url ); - - if ( $this->match_home_url( $home_url_pieces, $url_pieces ) ) { - $url = substr( - $this->strip_scheme_from_url( $url_pieces['scheme'], $url ), - strlen( $this->strip_scheme_from_url( $home_url_pieces['scheme'], $home_url ) ) - ); - - $url_pieces['scheme'] = null; - } - - return $this->sanitize_slash( $url, $url_pieces ); - } - - /** - * Sanitizes the target url. - * - * @param string $url The url to sanitize. - * - * @return string The sanitized url. - */ - private function sanitize_target_url( $url ) { - $home_url_pieces = static::$home_url->get_parsed(); - $url_pieces = $this->parse_url( $url ); - - if ( $this->match_home_url( $home_url_pieces, $url_pieces ) ) { - $url = substr( - $this->strip_scheme_from_url( $url_pieces['scheme'], $url ), - strlen( $home_url_pieces['host'] ) - ); - - $url_pieces['scheme'] = null; - } - - return $this->sanitize_slash( $url, $url_pieces ); - } - - /** - * Checks if the URL matches the home URL. - * - * @param array $home_url_pieces The pieces (wp_parse_url) from the home_url. - * @param array $url_pieces The pieces (wp_parse_url) from the url to match. - * - * @return bool True when the URL matches the home URL. - */ - private function match_home_url( $home_url_pieces, $url_pieces ) { - if ( ! isset( $url_pieces['scheme'] ) ) { - return false; - } - - if ( ! isset( $url_pieces['host'] ) || ! $this->match_home_url_host( $home_url_pieces['host'], $url_pieces['host'] ) ) { - return false; - } - - if ( ! isset( $home_url_pieces['path'] ) ) { - return true; - } - - return isset( $url_pieces['path'] ) && $this->match_home_url_path( $home_url_pieces['path'], $url_pieces['path'] ); - } - - /** - * Checks if the URL matches the home URL by comparing their host. - * - * @param string $home_url_host The home URL host. - * @param string $url_host The URL host. - * - * @return bool True when both hosts are equal. - */ - private function match_home_url_host( $home_url_host, $url_host ) { - return $url_host === $home_url_host; - } - - /** - * Checks if the URL matches the home URL by comparing their path. - * - * @param string $home_url_path The home URL path. - * @param string $url_path The URL path. - * - * @return bool True when the home URL path is empty or when the URL path begins with the home URL path. - */ - private function match_home_url_path( $home_url_path, $url_path ) { - $home_url_path = trim( $home_url_path, '/' ); - if ( empty( $home_url_path ) ) { - return true; - } - - return strpos( trim( $url_path, '/' ), $home_url_path ) === 0; - } - - /** - * Parses the URL into separate pieces. - * - * @param string $url The URL string. - * - * @return array Array of URL pieces. - */ - private function parse_url( $url ) { - $parsed_url = wp_parse_url( $url ); - if ( is_array( $parsed_url ) ) { - return $parsed_url; - } - - return []; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-abstract-validation.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-abstract-validation.php deleted file mode 100644 index 607e91fc..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-abstract-validation.php +++ /dev/null @@ -1,39 +0,0 @@ -error; - } - - /** - * Sets the validation error. - * - * @param WPSEO_Validation_Result $error Validation error or warning. - * - * @return void - */ - protected function set_error( WPSEO_Validation_Result $error ) { - $this->error = $error; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-accessible-validation.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-accessible-validation.php deleted file mode 100644 index 77d8a4ad..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-accessible-validation.php +++ /dev/null @@ -1,138 +0,0 @@ -parse_target( $redirect->get_target() ); - $decoded_url = rawurldecode( $target ); - $response = $this->remote_head( $decoded_url, [ 'sslverify' => false ] ); - - if ( is_wp_error( $response ) ) { - $error = __( 'The URL you entered could not be resolved.', 'wordpress-seo-premium' ); - $this->set_error( new WPSEO_Validation_Warning( $error, 'target' ) ); - - return false; - } - - $response_code = $this->retrieve_response_code( $response ); - - // Check if the target is a temporary location. - if ( $this->is_temporary( $response_code ) ) { - /* translators: %1$s expands to the returned http code */ - $error = __( 'The URL you are redirecting to seems to return a %1$s status. You might want to check if the target can be reached manually before saving.', 'wordpress-seo-premium' ); - $error = sprintf( $error, $response_code ); - $this->set_error( new WPSEO_Validation_Warning( $error, 'target' ) ); - - return false; - } - - // Check if the response code is 301. - if ( $response_code === 301 ) { - $error = __( 'You\'re redirecting to a target that returns a 301 HTTP code (permanently moved). Make sure the target you specify is directly reachable.', 'wordpress-seo-premium' ); - $this->set_error( new WPSEO_Validation_Warning( $error, 'target' ) ); - - return false; - } - - if ( $response_code !== 200 ) { - /* translators: %1$s expands to the returned http code */ - $error = __( 'The URL you entered returned a HTTP code different than 200(OK). The received HTTP code is %1$s.', 'wordpress-seo-premium' ); - $error = sprintf( $error, $response_code ); - $this->set_error( new WPSEO_Validation_Warning( $error, 'target' ) ); - - return false; - } - - return true; - } - - /** - * Retrieves the response code from the response array. - * - * @param array $response The response. - * - * @return int The response code. - */ - protected function retrieve_response_code( $response ) { - return wp_remote_retrieve_response_code( $response ); - } - - /** - * Sends a HEAD request to the passed remote URL. - * - * @param string $url The URL to send the request to. - * @param array $options The options to send along with the request. - * - * @return array|WP_Error The response or WP_Error if something goes wrong. - */ - protected function remote_head( $url, $options = [] ) { - return wp_remote_head( $url, $options ); - } - - /** - * Check if the given response code is a temporary one. - * - * @param int $response_code The response code to check. - * - * @return bool - */ - protected function is_temporary( $response_code ) { - return in_array( $response_code, [ 302, 307 ], true ) || in_array( substr( $response_code, 0, 2 ), [ '40', '50' ], true ); - } - - /** - * Check if the target is relative, if so just parse a full URL. - * - * @param string $target The target to parse. - * - * @return string - */ - protected function parse_target( $target ) { - $scheme = wp_parse_url( $target, PHP_URL_SCHEME ); - - // If we have an absolute url return it. - if ( ! empty( $scheme ) ) { - return $target; - } - - // Removes the installation directory if present. - $target = WPSEO_Redirect_Util::strip_base_url_path_from_url( $this->get_home_url(), $target ); - - // If we have a relative url make it absolute. - $absolute = get_home_url( null, $target ); - - // If the path does not end with an extension then add a trailing slash. - if ( WPSEO_Redirect_Util::requires_trailing_slash( $target ) ) { - return trailingslashit( $absolute ); - } - - return $absolute; - } - - /** - * Returns the home url. - * - * @return string The home url. - */ - protected function get_home_url() { - return home_url(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-endpoint-validation.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-endpoint-validation.php deleted file mode 100644 index 4c03f5da..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-endpoint-validation.php +++ /dev/null @@ -1,99 +0,0 @@ -redirects = $redirects; - - $origin = $redirect->get_origin(); - $target = $redirect->get_target(); - $endpoint = $this->search_end_point( $target, $origin ); - - // Check for a redirect loop. - if ( is_string( $endpoint ) && in_array( $endpoint, [ $origin, $target ], true ) ) { - $error = __( 'The redirect you are trying to save will create a redirect loop. This means there probably already exists a redirect that points to the origin of the redirect you are trying to save', 'wordpress-seo-premium' ); - $this->set_error( new WPSEO_Validation_Error( $error, [ 'origin', 'target' ] ) ); - - return false; - } - - if ( is_string( $endpoint ) && $target !== $endpoint ) { - /* translators: %1$s: will be the target, %2$s: will be the found endpoint. */ - $error = __( '%1$s will be redirected to %2$s. Maybe it\'s worth considering to create a direct redirect to %2$s.', 'wordpress-seo-premium' ); - $error = sprintf( $error, $target, $endpoint ); - $this->set_error( new WPSEO_Validation_Warning( $error, 'target' ) ); - - return false; - } - - return true; - } - - /** - * Will check if the $new_url is redirected also and follows the trace of this redirect - * - * @param string $new_url The new URL to search for. - * @param string $old_url The current URL that is redirected. - * - * @return bool|string - */ - private function search_end_point( $new_url, $old_url ) { - $new_target = $this->find_url( $new_url ); - if ( $new_target !== false ) { - // Unset the redirects, because it was found already. - unset( $this->redirects[ $new_url ] ); - - if ( $new_url !== $old_url ) { - $traced_target = $this->search_end_point( $new_target, $old_url ); - if ( $traced_target !== false ) { - return $traced_target; - } - } - - return $new_target; - } - - return false; - } - - /** - * Search for the given $url and returns it target - * - * @param string $url The URL to search for. - * - * @return bool - */ - private function find_url( $url ) { - if ( ! empty( $this->redirects[ $url ] ) ) { - return $this->redirects[ $url ]; - } - - return false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-presence-validation.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-presence-validation.php deleted file mode 100644 index 9d40097b..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-presence-validation.php +++ /dev/null @@ -1,52 +0,0 @@ -allow_empty_target( $redirect->get_type() ) && $redirect->get_origin() !== '' ) { - return true; - } - - if ( ( $redirect->get_origin() !== '' && $redirect->get_target() !== '' && $redirect->get_type() !== '' ) ) { - return true; - } - - $error = __( 'Not all the required fields are filled.', 'wordpress-seo-premium' ); - $this->set_error( new WPSEO_Validation_Error( $error ) ); - - return false; - } - - /** - * Allows an empty target when the given redirect type matches one of the values in the array. - * - * @param string $redirect_type The type to match. - * - * @return bool - */ - private function allow_empty_target( $redirect_type ) { - $allowed_redirect_types = [ WPSEO_Redirect_Types::DELETED, WPSEO_Redirect_Types::UNAVAILABLE ]; - - return in_array( (int) $redirect_type, $allowed_redirect_types, true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-relative-origin-validation.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-relative-origin-validation.php deleted file mode 100644 index 359ca9e7..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-relative-origin-validation.php +++ /dev/null @@ -1,31 +0,0 @@ -get_origin() ) ) { - return true; - } - - $error = __( 'The old URL for your redirect is not relative. Only the new URL is allowed to be absolute. Make sure to provide a relative old URL.', 'wordpress-seo-premium' ); - $this->set_error( new WPSEO_Validation_Warning( $error, 'origin' ) ); - return false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-self-redirect-validation.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-self-redirect-validation.php deleted file mode 100644 index 491c29f7..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-self-redirect-validation.php +++ /dev/null @@ -1,33 +0,0 @@ -get_origin() === $redirect->get_target() ) { - $error = __( 'You are attempting to redirect to the same URL as the origin. Please choose a different URL to redirect to.', 'wordpress-seo-premium' ); - $this->set_error( new WPSEO_Validation_Error( $error, 'origin' ) ); - - return false; - } - - return true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-subdirectory-validation.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-subdirectory-validation.php deleted file mode 100644 index 3cdf9c46..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-subdirectory-validation.php +++ /dev/null @@ -1,82 +0,0 @@ -get_subdirectory(); - - // When there is no subdirectory, there is nothing to validate. - if ( $subdirectory === '' ) { - return true; - } - - // When the origin starts with subdirectory, it is okay. - if ( $this->origin_starts_with_subdirectory( $subdirectory, $redirect->get_origin() ) ) { - return true; - } - - /* translators: %1$s expands to the subdirectory WordPress is installed. */ - $error = __( 'Your redirect is missing the subdirectory where WordPress is installed in. This will result in a redirect that won\'t work. Make sure the redirect starts with %1$s', 'wordpress-seo-premium' ); - $error = sprintf( $error, '' . $subdirectory . '' ); - $this->set_error( new WPSEO_Validation_Warning( $error, 'origin' ) ); - - return false; - } - - /** - * Returns the subdirectory if applicable. - * - * Calculates the difference between the home and site url. It strips of the site_url from the home_url and returns - * the part that remains. - * - * @return string - */ - protected function get_subdirectory() { - $home_url = untrailingslashit( home_url() ); - $site_url = untrailingslashit( site_url() ); - if ( $home_url === $site_url ) { - return ''; - } - - // Strips the site_url from the home_url. substr is used because we want it from the start. - $encoding = get_bloginfo( 'charset' ); - return mb_substr( $home_url, mb_strlen( $site_url, $encoding ), null, $encoding ); - } - - /** - * Checks if the origin starts with the given subdirectory. If so, the origin must start with the subdirectory. - * - * @param string $subdirectory The subdirectory that should be present. - * @param string $origin The origin to check for. - * - * @return bool - */ - protected function origin_starts_with_subdirectory( $subdirectory, $origin ) { - // Strip slashes at the beginning because the origin doesn't start with a slash. - $subdirectory = ltrim( $subdirectory, '/' ); - - if ( strstr( $origin, $subdirectory ) ) { - return substr( $origin, 0, strlen( $subdirectory ) ) === $subdirectory; - } - - return false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-uniqueness-validation.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-uniqueness-validation.php deleted file mode 100644 index df4bb77e..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-uniqueness-validation.php +++ /dev/null @@ -1,42 +0,0 @@ -get_origin() === $old_redirect->get_origin() ) { - return true; - } - - if ( array_key_exists( $redirect->get_origin(), $redirects ) ) { - $this->set_error( - new WPSEO_Validation_Error( - __( 'The old URL already exists as a redirect.', 'wordpress-seo-premium' ), - 'origin' - ) - ); - - return false; - } - - return true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-validation-interface.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-validation-interface.php deleted file mode 100644 index 76e44b47..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/validation/redirect-validation-interface.php +++ /dev/null @@ -1,30 +0,0 @@ - -
              - - -
              - -

              - ', - '' - ); - ?> -

              - -
              - - ' value='' /> -
              -
              - -
              - - ' value='' /> -
              -
              diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects-quick-edit.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects-quick-edit.php deleted file mode 100644 index a6dc5a79..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects-quick-edit.php +++ /dev/null @@ -1,47 +0,0 @@ - - diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects-tab-plain.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects-tab-plain.php deleted file mode 100644 index 0adc9137..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects-tab-plain.php +++ /dev/null @@ -1,65 +0,0 @@ - - -
              -' . esc_html__( 'Plain redirects', 'wordpress-seo-premium' ) . ''; ?> -
              -
              -display( - [ - 'input_suffix' => '', - 'values' => [ - 'origin' => $yoast_seo_origin_from_url, - 'target' => '', - 'type' => '', - ], - ] -); -?> - - -
              -
              - -

               

              - - display( - [ - 'form_presenter' => $yoast_seo_form_presenter, - 'total_columns' => $yoast_seo_redirect_table->count_columns(), - ] - ); - ?> - -
              - - prepare_items(); - $yoast_seo_redirect_table->search_box( __( 'Search', 'wordpress-seo-premium' ), 'wpseo-redirect-search' ); - $yoast_seo_redirect_table->display(); - ?> -
              -
              diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects-tab-regex.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects-tab-regex.php deleted file mode 100644 index e3d03709..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects-tab-regex.php +++ /dev/null @@ -1,76 +0,0 @@ - - -
              -' . esc_html__( 'Regular Expression redirects', 'wordpress-seo-premium' ) . ''; ?> -

              - ', - '' - ); - ?> -

              - -
              -
              -display( - [ - 'input_suffix' => '', - 'values' => [ - 'origin' => $yoast_seo_origin_from_url, - 'target' => '', - 'type' => '', - ], - ] -); -?> - - -
              -
              - -

               

              - - display( - [ - 'form_presenter' => $yoast_seo_form_presenter, - 'total_columns' => $yoast_seo_redirect_table->count_columns(), - ] - ); - ?> - -
              - - prepare_items(); - $yoast_seo_redirect_table->search_box( __( 'Search', 'wordpress-seo-premium' ), 'wpseo-redirect-search' ); - $yoast_seo_redirect_table->display(); - ?> -
              -
              diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects-tab-settings.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects-tab-settings.php deleted file mode 100644 index 4e382c0b..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects-tab-settings.php +++ /dev/null @@ -1,125 +0,0 @@ - -
              -

              - -
              Include -

              -
              - -
              -

              - .htaccess' - ); - ?> -

              -
              - - -
              -

              - -
              include -

              -
              - -
              -

              - -

              -
              - - -
              -' . esc_html__( 'Redirects settings', 'wordpress-seo-premium' ) . ''; ?> - -' - . esc_html__( 'Read more about why web server redirect methods have been disabled on a multisite.', 'wordpress-seo-premium' ) - . ''; - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in Alert_Presenter. - echo new Alert_Presenter( $yoast_seo_disable_htaccess_message, 'info' ); -} -?> - -
              - set_option( 'wpseo_redirect' ); - - $yoast_seo_toggle_values = [ - 'off' => 'PHP', - 'on' => ( WPSEO_Utils::is_apache() ) ? '.htaccess' : __( 'Web server', 'wordpress-seo-premium' ), - ]; - $yoast_seo_form->toggle_switch( 'disable_php_redirect', $yoast_seo_toggle_values, __( 'Redirect method', 'wordpress-seo-premium' ), '', [ 'disabled' => $yoast_seo_disable_toggles ] ); - - $yoast_seo_opening_p = ( $yoast_seo_disable_toggles ) ? '

              ' : '

              '; - - if ( WPSEO_Utils::is_apache() ) { - /* translators: 1: '.htaccess' file name */ - echo $yoast_seo_opening_p . sprintf( esc_html__( 'Write redirects to the %1$s file. Make sure the %1$s file is writable.', 'wordpress-seo-premium' ), '.htaccess' ) . '

              '; - - $yoast_seo_form->light_switch( 'separate_file', __( 'Generate a separate redirect file', 'wordpress-seo-premium' ), [], true, '', false, [ 'disabled' => $yoast_seo_disable_toggles ] ); - - /* translators: %s: '.htaccess' file name */ - echo $yoast_seo_opening_p . sprintf( esc_html__( 'By default we write the redirects to your %s file, check this if you want the redirects written to a separate file. Only check this option if you know what you are doing!', 'wordpress-seo-premium' ), '.htaccess' ) . '

              '; - } - else { - /* translators: %s: 'Yoast SEO Premium' */ - echo $yoast_seo_opening_p . sprintf( esc_html__( '%s can generate redirect files that can be included in your website web server configuration. If you choose this option the PHP redirects will be disabled. Only check this option if you know what you are doing!', 'wordpress-seo-premium' ), 'Yoast SEO Premium' ) . '

              '; - } - ?> -

              - -

              -
              -
              diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects.php deleted file mode 100644 index 3696e7e0..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/redirect/views/redirects.php +++ /dev/null @@ -1,36 +0,0 @@ -admin_header( false, 'wpseo_redirects', false, 'yoast_wpseo_redirects_options' ); -?> - - - display( - [ - 'nonce' => wp_create_nonce( 'wpseo-redirects-ajax-security' ), - ] - ); - } - ?> - -
              -admin_footer( false ); diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/social-previews.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/social-previews.php deleted file mode 100644 index 69f1fbd2..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/social-previews.php +++ /dev/null @@ -1,34 +0,0 @@ -term_redirect_can_be_made( $pagenow ) ) { - return; - } - - add_action( 'admin_enqueue_scripts', [ $this, 'page_scripts' ] ); - - // Get all taxonomies. - $taxonomies = get_taxonomies(); - - // Loop through all taxonomies. - if ( count( $taxonomies ) > 0 ) { - foreach ( $taxonomies as $taxonomy ) { - // Add old URL field to term edit screen. - add_action( $taxonomy . '_edit_form_fields', [ $this, 'old_url_field' ], 10, 2 ); - } - } - - add_action( 'wp_ajax_inline-save-tax', [ $this, 'set_old_url_quick_edit' ], 1 ); - - // Detect the term slug change. - add_action( 'edited_term', [ $this, 'detect_slug_change' ], 10, 3 ); - - // Detect a term delete. - add_action( 'delete_term_taxonomy', [ $this, 'detect_term_delete' ] ); - } - - /** - * Registers the page scripts. - * - * @param string $current_page The page that is opened at the moment. - * - * @return void - */ - public function page_scripts( $current_page ) { - if ( ! $this->term_redirect_can_be_made( $current_page ) ) { - return; - } - - parent::page_scripts( $current_page ); - - if ( $current_page === 'edit-tags.php' ) { - wp_enqueue_script( 'wp-seo-premium-quickedit-notification' ); - } - if ( $current_page === 'term.php' ) { - wp_enqueue_script( 'wp-seo-premium-redirect-notifications' ); - } - } - - /** - * Add an extra field to term edit screen. - * - * @param string $tag The current tag name. - * @param string $taxonomy The name of the current taxonomy. - * - * @return void - */ - public function old_url_field( $tag, $taxonomy ) { - $url = $this->get_target_url( $tag, $taxonomy ); - - // phpcs:ignore WordPress.Security.EscapeOutput -- Correctly escaped in parse_url_field() method. - echo $this->parse_url_field( $url, 'term' ); - } - - /** - * Set old URL when the quick edit is used for taxonomies. - * - * @return void - */ - public function set_old_url_quick_edit() { - check_ajax_referer( 'taxinlineeditnonce', '_inline_edit' ); - - $permalink = $this->get_taxonomy_permalink(); - - if ( ! is_wp_error( $permalink ) ) { - $this->old_url = str_replace( home_url(), '', $permalink ); - } - } - - /** - * Detect if the slug changed, hooked into 'post_updated'. - * - * @param int $term_id The term id. - * @param int $tt_id The term taxonomy id. - * @param stdClass $taxonomy Object with the values of the taxonomy. - * - * @return bool - */ - public function detect_slug_change( $term_id, $tt_id, $taxonomy ) { - /** - * Filter: 'Yoast\WP\SEO\term_redirect_slug_change' - Check if a redirect should be created - * on term slug change. - * - * Note: This is a Premium plugin-only hook. - * - * @since 12.9.0 - * - * @param bool $create_redirect Whether a redirect should be created. - */ - if ( apply_filters( 'Yoast\WP\SEO\term_redirect_slug_change', false ) === true ) { - return true; - } - - /** - * Certain plugins use multisite context switching when saving terms. This can lead to incorrect redirects being - * created. - * - * See https://github.com/Yoast/bugreports/issues/437. - */ - if ( is_multisite() && ms_is_switched() ) { - return false; - } - - $old_url = $this->get_old_url(); - - if ( ! $old_url ) { - return false; - } - - // Get the new URL. - $new_url = $this->get_target_url( $term_id, $taxonomy ); - - // Maybe we can undo the created redirect. - $created_redirect = $this->notify_undo_slug_redirect( $old_url, $new_url, $term_id, 'term' ); - - if ( $created_redirect ) { - $redirect_info = [ - 'origin' => $created_redirect->get_origin(), - 'target' => $created_redirect->get_target(), - 'type' => $created_redirect->get_type(), - 'format' => $created_redirect->get_format(), - ]; - update_term_meta( $term_id, '_yoast_term_redirect_info', $redirect_info ); - } - } - - /** - * Offer to create a redirect from the term that is about to get deleted. - * - * @param int $term_taxonomy_id The term taxonomy id that will be deleted. - * - * @return void - */ - public function detect_term_delete( $term_taxonomy_id ) { - $term = get_term_by( 'term_taxonomy_id', (int) $term_taxonomy_id ); - - if ( ! $term || is_wp_error( $term ) ) { - return; - } - - $url = $this->get_target_url( $term, $term->taxonomy ); - if ( $this->is_redirect_needed( $term, $url ) ) { - $this->set_delete_notification( $url ); - } - } - - /** - * Checks if a redirect is needed for the term with the given ID. - * - * @param WP_Term $term The term to check. - * @param string $url The target url. - * - * @return bool If a redirect is needed. - */ - protected function is_redirect_needed( $term, $url ) { - $redirect_manager = new WPSEO_Redirect_Manager( 'plain' ); - $redirect = $redirect_manager->get_redirect( $url ); - return ! $redirect || ( ! is_nav_menu( $term->term_id ) && is_taxonomy_viewable( $term->taxonomy ) ); - } - - /** - * Parses the hidden field with the old URL to show in the form. - * - * @param string $url The old URL. - * @param string $type The type of the URL. - * - * @return string The parsed hidden input field. - */ - protected function parse_url_field( $url, $type ) { - - // Output the hidden field. - return ''; - } - - /** - * Gets the URL to the term and returns its path. - * - * @param string $tag The current tag name. - * @param string $taxonomy The name of the current taxonomy. - * - * @return string - */ - protected function get_target_url( $tag, $taxonomy ) { - // Get the term link. - $term_link = get_term_link( $tag, $taxonomy ); - - // Return early if the term link is not a string, i.e. a WP_Error Object. - if ( ! is_string( $term_link ) ) { - return ''; - } - - // Use the correct URL path. - $url = wp_parse_url( $term_link ); - if ( is_array( $url ) && isset( $url['path'] ) ) { - return $url['path']; - } - - return ''; - } - - /** - * Get permalink for taxonomy. - * - * @return string|WP_Error - */ - protected function get_taxonomy_permalink() { - // phpcs:disable WordPress.Security.NonceVerification.Missing -- Reason: We verify the nonce before coming here. - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We do sanitize by casting to int. - $term_id = isset( $_POST['tax_ID'] ) ? (int) wp_unslash( $_POST['tax_ID'] ) : 0; - $taxonomy = isset( $_POST['taxonomy'] ) ? sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) ) : null; - // phpcs:enable - - return get_term_link( get_term( $term_id, $taxonomy ), $taxonomy ); - } - - /** - * Get the old URL. - * - * @return bool|string - */ - protected function get_old_url() { - // phpcs:disable WordPress.Security.NonceVerification.Missing -- Reason: This is used while hooked in an action thus we don't control the nonce creation. - // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: This data looks like it's being used only with WP functions later on. - $wpseo_old_term_url = isset( $_POST['wpseo_old_term_url'] ) ? wp_unslash( $_POST['wpseo_old_term_url'] ) : null; - // phpcs:enable - - if ( empty( $wpseo_old_term_url ) ) { - if ( ! empty( $this->old_url ) ) { - return $this->old_url; - } - - return false; - } - return $wpseo_old_term_url; - } - - /** - * Returns the undo message for the term. - * - * @return string - */ - protected function get_undo_slug_notification() { - /* translators: %1$s: Yoast SEO Premium, %2$s and %3$s expand to a link to the admin page. */ - return __( - '%1$s created a %2$sredirect%3$s from the old term URL to the new term URL.', - 'wordpress-seo-premium' - ); - } - - /** - * Returns the delete message for the term. - * - * @return string - */ - protected function get_delete_notification() { - /* translators: %1$s: Yoast SEO Premium, %2$s: List with actions, %3$s: , %4$s: , %5%s: The removed url. */ - return __( - '%1$s detected that you deleted a term (%5$s). You can either: %2$s Don\'t know what to do? %3$sRead this post %4$s.', - 'wordpress-seo-premium' - ); - } - - /** - * Is the current page valid to make a redirect from. - * - * @param string $current_page The currently opened page. - * - * @return bool True when a redirect can be made on this page. - */ - protected function term_redirect_can_be_made( $current_page ) { - return $this->is_term_page( $current_page ) || $this->is_action_inline_save_tax() || $this->is_action_delete_tag(); - } - - /** - * Is the current page related to a term (edit/overview). - * - * @param string $current_page The current opened page. - * - * @return bool True when page is a term edit/overview page. - */ - protected function is_term_page( $current_page ) { - return ( in_array( $current_page, [ 'edit-tags.php', 'term.php' ], true ) ); - } - - /** - * Is the page in an AJAX-request and is the action "inline save". - * - * @return bool True when in an AJAX-request and the action is inline-save. - */ - protected function is_action_inline_save_tax() { - if ( ! wp_doing_ajax() ) { - return false; - } - - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: We don't control the nonce creation. - $action = isset( $_POST['action'] ) ? sanitize_text_field( wp_unslash( $_POST['action'] ) ) : null; - return $action === 'inline-save-tax'; - } - - /** - * Is the page in an AJAX-request and is the action "delete-tag". - * - * @return bool True when in an AJAX-request and the action is delete-tag. - */ - protected function is_action_delete_tag() { - if ( ! wp_doing_ajax() ) { - return false; - } - - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: We don't control the nonce creation. - $action = isset( $_POST['action'] ) ? sanitize_text_field( wp_unslash( $_POST['action'] ) ) : null; - return $action === 'delete-tag'; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/upgrade-manager.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/upgrade-manager.php deleted file mode 100644 index 2fcbc4c1..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/upgrade-manager.php +++ /dev/null @@ -1,365 +0,0 @@ -check_update( $saved_version ); - - update_option( self::VERSION_OPTION_KEY, $current_version ); - - add_action( 'shutdown', 'flush_rewrite_rules' ); - } - } - - /** - * Runs the specific updates when it is necessary. - * - * @param string $version_number The version number that will be compared. - * - * @return void - */ - public function check_update( $version_number ) { - // Get current version. - $current_version = get_site_option( WPSEO_Premium::OPTION_CURRENT_VERSION, 1 ); - - // Check if update is required. - if ( WPSEO_Premium::PLUGIN_VERSION_CODE > $current_version ) { - - // Do update. - $this->do_update( $current_version ); - - // Update version code. - $this->update_current_version_code(); - } - - if ( version_compare( $version_number, '2.3', '<' ) ) { - add_action( 'wp', [ 'WPSEO_Redirect_Upgrade', 'import_redirects_2_3' ], 11 ); - add_action( 'admin_head', [ 'WPSEO_Redirect_Upgrade', 'import_redirects_2_3' ], 11 ); - } - - if ( version_compare( $version_number, '3.1', '<' ) ) { - add_action( 'wp', [ 'WPSEO_Redirect_Upgrade', 'upgrade_3_1' ], 12 ); - add_action( 'admin_head', [ 'WPSEO_Redirect_Upgrade', 'upgrade_3_1' ], 12 ); - } - - if ( version_compare( $version_number, '4.7', '<' ) ) { - add_action( 'wp', [ 'WPSEO_Premium_Prominent_Words_Versioning', 'upgrade_4_7' ], 12 ); - add_action( 'admin_head', [ 'WPSEO_Premium_Prominent_Words_Versioning', 'upgrade_4_7' ], 12 ); - } - - if ( version_compare( $version_number, '4.8', '<' ) ) { - add_action( 'wp', [ 'WPSEO_Premium_Prominent_Words_Versioning', 'upgrade_4_8' ], 12 ); - add_action( 'admin_head', [ 'WPSEO_Premium_Prominent_Words_Versioning', 'upgrade_4_8' ], 12 ); - } - - if ( version_compare( $version_number, '9.8-RC0', '<' ) ) { - add_action( 'init', [ $this, 'upgrade_9_8' ], 12 ); - } - - if ( version_compare( $version_number, '10.3', '<' ) ) { - add_action( 'init', [ $this, 'upgrade_11' ], 12 ); - } - - if ( version_compare( $version_number, '13.0-RC0', '<' ) ) { - add_action( 'init', [ 'WPSEO_Redirect_Upgrade', 'upgrade_13_0' ], 12 ); - } - - if ( version_compare( $version_number, '15.3-RC0', '<' ) ) { - add_action( 'init', [ $this, 'upgrade_15_3' ], 12 ); - } - - if ( version_compare( $version_number, '16.2-RC0', '<' ) ) { - add_action( 'init', [ $this, 'upgrade_16_2' ], 12 ); - } - - if ( version_compare( $version_number, '16.3-beta2', '<' ) ) { - add_action( 'init', [ $this, 'upgrade_16_3' ], 12 ); - } - - if ( version_compare( $version_number, '17.2-RC0', '<' ) ) { - add_action( 'init', [ $this, 'upgrade_17_2' ], 12 ); - } - - if ( version_compare( $version_number, '17.3-RC4', '<' ) ) { - add_action( 'init', [ $this, 'upgrade_17_3' ], 12 ); - } - - if ( version_compare( $version_number, '17.4-RC0', '<' ) ) { - add_action( 'init', [ $this, 'upgrade_17_4' ], 12 ); - } - - if ( version_compare( $version_number, '17.7-RC0', '<' ) ) { - add_action( 'init', [ $this, 'upgrade_17_7' ], 12 ); - } - - if ( version_compare( $version_number, '19.3-RC0', '<' ) ) { - add_action( 'init', [ $this, 'upgrade_19_3' ], 12 ); - } - - if ( version_compare( $version_number, '21.6-RC0', '<' ) ) { - add_action( 'init', [ $this, 'upgrade_21_6' ], 12 ); - } - } - - /** - * Enables the AI feature if it was not enabled before. - * - * @return void - */ - public function upgrade_21_6() { - - if ( ! empty( WPSEO_Options::get( 'activation_redirect_timestamp' ) ) ) { - $is_ai_enabled = WPSEO_Options::get( 'enable_ai_generator' ); - - if ( $is_ai_enabled ) { - WPSEO_Options::set( 'ai_enabled_pre_default', true ); - - return; - } - WPSEO_Options::set( 'enable_ai_generator', true ); - } - } - - /** - * Removes the inclusive language feature notification from the Notification center. - * - * @return void - */ - public function upgrade_19_3() { - Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-inclusive-language-notice' ); - } - - /** - * Make sure our options autoload. - * - * @return void - */ - public function upgrade_17_7() { - global $wpdb; - - foreach ( [ WPSEO_Redirect_Option::OPTION_PLAIN, WPSEO_Redirect_Option::OPTION_REGEX ] as $option ) { - // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- Normal methods only work if the option value has changed. - $wpdb->update( $wpdb->options, [ 'autoload' => 'yes' ], [ 'option_name' => $option ] ); - } - - // Make sure we don't autoload the non-exported option. - $wpdb->update( $wpdb->options, [ 'autoload' => 'no' ], [ 'option_name' => WPSEO_Redirect_Option::OPTION ] ); - } - - /** - * Schedules the cleanup integration if it's no already scheduled. - * - * @return void - */ - public function upgrade_17_4() { - $this->retrigger_cleanup(); - } - - /** - * Clears the first step of the orphaned workout. - * - * @return void - */ - public function upgrade_17_3() { - $workouts_option = WPSEO_Options::get( 'workouts' ); - - if ( isset( $workouts_option['orphaned'] ) - && isset( $workouts_option['orphaned']['indexablesByStep'] ) - && is_array( $workouts_option['orphaned']['indexablesByStep'] ) - ) { - $workouts_option['orphaned']['indexablesByStep']['improveRemove'] = []; - WPSEO_Options::set( 'workouts', $workouts_option ); - } - } - - /** - * Schedules the cleanup integration if it's no already scheduled. - * - * @return void - */ - public function upgrade_17_2() { - $this->retrigger_cleanup(); - } - - /** - * Re-triggers the cleanup of old things from the database. - * - * @return void - */ - protected function retrigger_cleanup() { - // If Yoast SEO hasn't been upgraded to 17.2 the cleanup integration has not been implemented in the current way. - if ( ! defined( '\Yoast\WP\SEO\Integrations\Cleanup_Integration::START_HOOK' ) ) { - return; - } - // If Yoast SEO premium was upgraded after Yoast SEO, reschedule the task to clean out orphaned prominent words. - if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) { - wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK ); - } - } - - /** - * Runs the language pack upgrader to migrate to TranslationsPress. - * - * @return void - */ - public function upgrade_16_3() { - require_once ABSPATH . 'wp-admin/includes/admin.php'; - require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; - $upgrader = new WP_Upgrader(); - $upgrader->skin = new Automatic_Upgrader_Skin(); - Language_Pack_Upgrader::async_upgrade( $upgrader ); - } - - /** - * Makes sure the Premium capabilities exist. - * - * @return void - */ - public function upgrade_16_2() { - do_action( 'wpseo_register_capabilities_premium' ); - WPSEO_Capability_Manager_Factory::get( 'premium' )->add(); - } - - /** - * Renames the `prominent_words_indexation_completed` option. - * - * @return void - */ - public function upgrade_15_3() { - $old_value = WPSEO_Options::get( 'prominent_words_indexation_completed' ); - WPSEO_Options::set( 'prominent_words_indexing_completed', $old_value ); - } - - /** - * Removes the orphaned content notification. - * - * @return void - */ - public function upgrade_11() { - $orphaned_content_support = new WPSEO_Premium_Orphaned_Content_Support(); - $notification_manager = Yoast_Notification_Center::get(); - - foreach ( $orphaned_content_support->get_supported_post_types() as $post_type ) { - // We need to remove the dismissal first, to clean up better but also as otherwise the remove won't work. - delete_metadata( 'user', false, 'wpseo-premium-orphaned-content-' . $post_type, '', true ); - $notification_manager->remove_notification_by_id( 'wpseo-premium-orphaned-content-' . $post_type, true ); - } - - // Remove the cronjob if present. - wp_clear_scheduled_hook( 'wpseo-premium-orphaned-content' ); - } - - /** - * Removes the stale cornerstone content beta notification. - * - * @return void - */ - public function upgrade_9_8() { - $notification_manager = Yoast_Notification_Center::get(); - $notification_manager->remove_notification_by_id( 'wpseo-stale-content-notification' ); - - // Delete the user meta data that tracks whether the user has seen the notification. - delete_metadata( 'user', false, 'wp_wpseo-stale-content-notification', '', true ); - } - - /** - * Returns whether or not we should retry the 31 upgrade. - * - * @return bool - */ - public function should_retry_upgrade_31() { - $retry = false; - - $new_redirects = get_option( WPSEO_Redirect_Option::OPTION, null ); - if ( $new_redirects === null ) { - $old_plain_redirects = get_option( WPSEO_Redirect_Option::OLD_OPTION_PLAIN, [] ); - $old_regex_redirects = get_option( WPSEO_Redirect_Option::OLD_OPTION_REGEX, [] ); - - if ( ! empty( $old_plain_redirects ) || ! empty( $old_regex_redirects ) ) { - $retry = true; - } - } - - return $retry; - } - - /** - * Validates if the 31 upgrade routine has correctly run and if not retries to run it - * - * @param bool $immediately Whether to do the upgrade immediately when this function is called. - * - * @return void - */ - public function retry_upgrade_31( $immediately = false ) { - /* - * If we detect that the new redirect option doesn't exist but there are redirects in the old option we try the - * upgrade routine again. This brings the redirects back for people if the upgrade routine failed the first - * time. - */ - if ( $this->should_retry_upgrade_31() ) { - if ( $immediately ) { - WPSEO_Redirect_Upgrade::upgrade_3_1(); - - return; - } - add_action( 'wp', [ 'WPSEO_Redirect_Upgrade', 'upgrade_3_1' ], 12 ); - add_action( 'admin_head', [ 'WPSEO_Redirect_Upgrade', 'upgrade_3_1' ], 12 ); - } - } - - /** - * An update is required, do it - * - * @param string $current_version The current version number of the installation. - * - * @return void - */ - private function do_update( $current_version ) { - // Upgrade to version 1.2.0. - if ( $current_version < 15 ) { - /** - * Upgrade redirects - */ - add_action( 'wp', [ 'WPSEO_Redirect_Upgrade', 'upgrade_1_2_0' ], 10 ); - add_action( 'admin_head', [ 'WPSEO_Redirect_Upgrade', 'upgrade_1_2_0' ], 10 ); - } - } - - /** - * Update the current version code - * - * @return void - */ - private function update_current_version_code() { - update_site_option( WPSEO_Premium::OPTION_CURRENT_VERSION, WPSEO_Premium::PLUGIN_VERSION_CODE ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/validation-error.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/validation-error.php deleted file mode 100644 index 70a2ddca..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/validation-error.php +++ /dev/null @@ -1,21 +0,0 @@ -message = $message; - $this->set_fields( $fields ); - } - - /** - * Gets the validation result message. - * - * @return string - */ - public function get_message() { - return $this->message; - } - - /** - * Returns an Array representation of the validation result. - * - * @return array - */ - public function to_array() { - return [ - 'type' => $this->get_type(), - 'message' => $this->message, - 'fields' => $this->fields, - ]; - } - - /** - * Setting the fields with errors. - * - * @param string $fields The fields with errors on it. - * - * @return void - */ - protected function set_fields( $fields = '' ) { - if ( ! is_array( $fields ) && is_string( $fields ) ) { - $fields = [ $fields ]; - } - - $this->fields = $fields; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/validation-warning.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/validation-warning.php deleted file mode 100644 index 3f5ba361..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/validation-warning.php +++ /dev/null @@ -1,21 +0,0 @@ -%s', esc_html( $yoast_seo_button_label ) ) -); - -?> -
              -

              -

              -

              - -
              - __( 'Export keyphrase scores', 'wordpress-seo-premium' ), - 'export-url' => __( 'Export URL', 'wordpress-seo-premium' ), - 'export-title' => __( 'Export title', 'wordpress-seo-premium' ), - 'export-seo-title' => __( 'Export SEO title', 'wordpress-seo-premium' ), - 'export-meta-description' => __( 'Export meta description', 'wordpress-seo-premium' ), - 'export-readability-score' => __( 'Export readability score', 'wordpress-seo-premium' ), - ]; - - foreach ( $yoast_seo_export_fields as $yoast_seo_export_field_name => $yoast_seo_export_field_label ) { - echo ''; - $yform->label( esc_html( $yoast_seo_export_field_label ), [ 'for' => $yoast_seo_export_field_name ] ); - echo '
              '; - } - - ?> -
              - -
              - -

              -
                -
              • -
              • -
              -
              diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/views/export-redirects.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/views/export-redirects.php deleted file mode 100644 index 331b020f..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/views/export-redirects.php +++ /dev/null @@ -1,17 +0,0 @@ - -
              -

              -

              -

              -
              - - -
              -
              diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/views/import-redirects.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/views/import-redirects.php deleted file mode 100644 index 1c4c1c6d..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/views/import-redirects.php +++ /dev/null @@ -1,82 +0,0 @@ -.htaccess' -); - -$yoast_seo_i18n_import_redirects_explain = sprintf( - /* translators: %1$s: '.htaccess' file name, %2$s: plugin name */ - __( 'You can copy the contents of any %1$s file in here, and it will import the redirects into %2$s.', 'wordpress-seo-premium' ), - '.htaccess', - 'Yoast SEO Premium' -); - -// The plugins we have import functions for. -$yoast_seo_plugins = [ - 'redirection' => __( 'Redirection', 'wordpress-seo-premium' ) . '
              ', - 'safe_redirect_manager' => __( 'Safe Redirect Manager', 'wordpress-seo-premium' ) . '
              ', - 'simple-301-redirects' => __( 'Simple 301 Redirects', 'wordpress-seo-premium' ) . '
              ', -]; - -?> -
              -
              - msg ) ) : ?> -
              -

              msg; ?>

              -
              - -

              -
              - - radio( 'import_plugin', $yoast_seo_plugins, __( 'Import from:', 'wordpress-seo-premium' ) ); - ?> -
              - -
              -
              - -
              - -
              -

              -
              - -

              -
              - -

              - -
              -
              - -
              - -
              -

              [] ] ); ?>

              -

              - [] ] ); ?> -

              -
              - - -
              - -
              -
              -
              diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/views/thank-you.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/views/thank-you.php deleted file mode 100644 index 31e62342..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/views/thank-you.php +++ /dev/null @@ -1,107 +0,0 @@ - - -

              -

              - -

              -
              -
              -

              - -

              - Cornerstone -

              - , %2$s: */ - esc_html__( - '%1$sCornerstone content%2$s is the content on your site that’s most important. You want to rank highest in Google with these articles. Make sure your internal linking structure reflects what pages are most important. Want to know how?', - 'wordpress-seo-premium' - ), - '', - '' - ); - ?> -

              - - - -
              -
              -

              - -

              - Analysis -

              - , %2$s: */ - esc_html__( - 'Different people search with different search terms. With our %1$spremium analysis%2$s, you are free to use variations and synonyms of your keywords in your content, which will make your writing style far more natural.', - 'wordpress-seo-premium' - ), - '', - '' - ); - ?> -

              - - - -
              -
              -

              - -

              - redirect-manager -

              - , %3$s: */ - esc_html__( - 'The %1$s %2$sRedirect Manager%3$s automatically prevents visitors from reaching a dead end whenever you move or delete content. It also makes managing your existing redirects easy.', - 'wordpress-seo-premium' - ), - 'Yoast SEO', - '', - '' - ); - ?> -

              - - - -
              -
              -

              - -

              - Academy -

              - , %3$s: Yoast SEO, %4$s: */ - esc_html__( - '%1$s grants you direct access to %2$sall premium %3$s academy courses%4$s. Learn all the ins and outs of holistic SEO from industry experts.', - 'wordpress-seo-premium' - ), - 'Yoast SEO Premium', - '', - 'Yoast SEO', - '' - ); - ?> - -

              - - - -
              -
              diff --git a/wp/wp-content/plugins/wordpress-seo-premium/classes/watcher.php b/wp/wp-content/plugins/wordpress-seo-premium/classes/watcher.php deleted file mode 100644 index 979aaf65..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/classes/watcher.php +++ /dev/null @@ -1,314 +0,0 @@ -watch_type . '_' . $notification_type, - $show_notification - ); - - if ( $show_notification ) { - // Add the message to the notifications center. - $arguments = [ 'type' => 'updated' ]; - if ( ! empty( $id ) ) { - $arguments['id'] = $id; - } - - Yoast_Notification_Center::get()->add_notification( new Yoast_Notification( $message, $arguments ) ); - } - } - - /** - * Display the delete notification. - * - * @param string $url The redirect that will be deleted. - * - * @return void - */ - protected function set_delete_notification( $url ) { - $id = 'wpseo_delete_redirect_' . md5( $url ); - - // Format the message. - $message = sprintf( - $this->get_delete_notification(), - 'Yoast SEO Premium', - $this->get_delete_action_list( $url, $id ), - '', - '', - '' . esc_url( trim( $url ) ) . '' - ); - - $this->create_notification( $message, 'delete' ); - } - - /** - * Returns the string to the javascript method from where the added redirect can be undone - * - * @param int $object_id The post or term ID. - * @param string $object_type The object type: post or term. - * - * @return string - */ - protected function javascript_undo_redirect( $object_id, $object_type ) { - return sprintf( - 'wpseoUndoRedirectByObjectId( "%1$s", "%2$s", this );return false;', - esc_js( $object_id ), - esc_js( $object_type ) - ); - } - - /** - * Opens the redirect manager and create the redirect - * - * @param string $old_url The URL that will be redirected. - * @param string $new_url The URL where the old_url redirects to. - * @param int $header_code The redirect type. - * - * @return WPSEO_Redirect - */ - protected function create_redirect( $old_url, $new_url, $header_code = 301 ) { - // The URL redirect manager. - $redirect = new WPSEO_Redirect( $old_url, $new_url, $header_code ); - - // Create the redirect. - $this->get_redirect_manager()->create_redirect( $redirect ); - - return $redirect; - } - - /** - * Returns the string to the javascript method from where a new redirect can be added - * - * @param string $url The URL that can be redirected. - * @param string $id ID of the notice that is displayed. - * @param int $type The redirect type. Default is 301. - * - * @return string - */ - protected function javascript_create_redirect( $url, $id, $type = WPSEO_Redirect_Types::PERMANENT ) { - return sprintf( - 'wpseoCreateRedirect( "%1$s", "%2$s", "%3$s", this );', - esc_js( $url ), - $type, - wp_create_nonce( 'wpseo-redirects-ajax-security' ) - ); - } - - /** - * Return the URL to the admin page where the just added redirect can be found - * - * @param string $old_url String that filters the wpseo_redirect table to the just added redirect. - * - * @return string - */ - protected function admin_redirect_url( $old_url ) { - return admin_url( 'admin.php?page=wpseo_redirects&s=' . urlencode( $old_url ) ); - } - - /** - * There might be the possibility to undo the redirect, if it is so, we have to notify the user. - * - * @param string $old_url The origin URL. - * @param string $new_url The target URL. - * @param int $object_id The post or term ID. - * @param string $object_type The object type: post or term. - * - * @return WPSEO_Redirect|null The created redirect. - */ - protected function notify_undo_slug_redirect( $old_url, $new_url, $object_id, $object_type ) { - // Check if we should create a redirect. - if ( $this->should_create_redirect( $old_url, $new_url ) ) { - $redirect = $this->create_redirect( $old_url, $new_url ); - - $this->set_undo_slug_notification( $redirect, $object_id, $object_type ); - - return $redirect; - } - } - - /** - * Display the undo notification - * - * @param WPSEO_Redirect $redirect The old URL to the post. - * @param int $object_id The post or term ID. - * @param string $object_type The object type: post or term. - * - * @return void - */ - protected function set_undo_slug_notification( WPSEO_Redirect $redirect, $object_id, $object_type ) { - $old_url = $this->format_redirect_url( $redirect->get_origin() ); - $new_url = $this->format_redirect_url( $redirect->get_target() ); - - // Format the message. - $message = sprintf( - $this->get_undo_slug_notification(), - 'Yoast SEO Premium', - '', - '' - ); - - $message .= '
              '; - $message .= esc_html__( 'Old URL:', 'wordpress-seo-premium' ) . ' ' . $this->create_hyperlink_from_url( $old_url ); - $message .= '
              '; - $message .= esc_html__( 'New URL:', 'wordpress-seo-premium' ) . ' ' . $this->create_hyperlink_from_url( $new_url ); - $message .= '

              '; - - $message .= sprintf( - '', - esc_html__( 'Ok', 'wordpress-seo-premium' ) - ); - - $message .= sprintf( - '%2$s', - $this->javascript_undo_redirect( $object_id, $object_type ), - esc_html__( 'Undo', 'wordpress-seo-premium' ) - ); - - // Only set notification when the slug change was not saved through quick edit. - $this->create_notification( $message, 'slug_change' ); - } - - /** - * Returns a list with the actions that the user can do on deleting a post/term - * - * @param string $url The URL that will be redirected. - * @param string $id The ID of the element. - * - * @return string - */ - protected function get_delete_action_list( $url, $id ) { - return sprintf( - '
                %1$s %2$s
              ', - '
            • ', - '
            • ' - ); - } - - /** - * Returns the passed url in hyperlink form. Both the target and the text of the hyperlink is the passed url. - * - * @param string $url The url in string form to convert to a hyperlink. - * - * @return string - */ - protected function create_hyperlink_from_url( $url ) { - return '' . esc_html( $url ) . ''; - } - - /** - * Formats the redirect url. - * - * @param string $url The url to format. - * - * @return string - */ - protected function format_redirect_url( $url ) { - $redirect_url_format = new WPSEO_Redirect_Url_Formatter( $url ); - - return home_url( $redirect_url_format->format_without_subdirectory( get_home_url() ) ); - } - - /** - * Retrieves an instance of the redirect manager. - * - * @return WPSEO_Redirect_Manager The redirect manager. - */ - protected function get_redirect_manager() { - static $redirect_manager; - - if ( $redirect_manager === null ) { - $redirect_manager = new WPSEO_Redirect_Manager(); - } - - return $redirect_manager; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-premium-requirement.php b/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-premium-requirement.php deleted file mode 100644 index 8a0ab3c1..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-premium-requirement.php +++ /dev/null @@ -1,29 +0,0 @@ -helpers->product->is_premium() ) { - return; - } - - // No premium commands allowed. - WP_CLI::error( - 'This command can only be run with an active Yoast SEO Premium license.' - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-base-command.php b/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-base-command.php deleted file mode 100644 index da490e03..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-base-command.php +++ /dev/null @@ -1,152 +0,0 @@ -redirect_manager = new WPSEO_Redirect_Manager(); - } - - /** - * Creates a new redirect. - * - * @param string $origin Origin of the redirect. - * @param string $target Target of the redirect. - * @param string $type Type of the redirect. - * @param string $format Format of the redirect. - * - * @return bool Whether creation was successful. - */ - protected function create_redirect( $origin, $target, $type, $format ) { - $redirect = new WPSEO_Redirect( $origin, $target, $type, $format ); - - return $this->redirect_manager->create_redirect( $redirect ); - } - - /** - * Updates an existing redirect. - * - * @param string $old_origin Origin of the redirect. - * @param string $new_origin Origin of the redirect. - * @param string $target Target of the redirect. - * @param string $type Type of the redirect. - * @param string $format Format of the redirect. - * - * @return bool Whether updating was successful. - */ - protected function update_redirect( $old_origin, $new_origin, $target, $type, $format ) { - $old_redirect = new WPSEO_Redirect( $old_origin ); - $new_redirect = new WPSEO_Redirect( $new_origin, $target, $type, $format ); - - return $this->redirect_manager->update_redirect( $old_redirect, $new_redirect ); - } - - /** - * Deletes an existing redirect. - * - * @param string $origin Origin of the redirect. - * - * @return bool Whether deletion was successful. - */ - protected function delete_redirect( $origin ) { - $redirect = new WPSEO_Redirect( $origin ); - - return $this->redirect_manager->delete_redirects( [ $redirect ] ); - } - - /** - * Gets the redirect for a given origin. - * - * @param string $origin Origin to check for. - * - * @return WPSEO_Redirect|false Redirect value object, or false if not found. - */ - protected function get_redirect( $origin ) { - return $this->redirect_manager->get_redirect( $origin ); - } - - /** - * Checks whether a redirect for a given origin already exists. - * - * @param string $origin Origin to check for. - * - * @return bool Whether a redirect for the given origin was found. - */ - protected function has_redirect( $origin ) { - return $this->get_redirect( $origin ) !== false; - } - - /** - * Checks whether a given redirect is valid. - * - * @param string $new_origin New origin of the redirect. - * @param string $target Target of the redirect. - * @param int $type Type of the redirect. - * @param string $format Format of the redirect. - * @param string|null $old_origin Optional. Old origin of the redirect to update. - * - * @return void - */ - protected function validate( $new_origin, $target, $type, $format, $old_origin = null ) { - $new_redirect = new WPSEO_Redirect( $new_origin, $target, $type, $format ); - - $old_redirect = null; - - if ( $old_origin !== null ) { - $old_redirect = $this->get_redirect( $old_origin ); - } - - $validator = new WPSEO_Redirect_Validator(); - - if ( $validator->validate( $new_redirect, $old_redirect ) === true ) { - return; - } - - $error = $validator->get_error(); - - $message = sprintf( - 'Failed to validate redirect \'%s\' => \'%s\': %s', - $new_redirect->get_origin(), - $new_redirect->get_target(), - $this->reformat_error( $error->get_message() ) - ); - - if ( $error->get_type() === 'warning' ) { - WP_CLI::warning( $message ); - } - - if ( $error->get_type() === 'error' ) { - WP_CLI::error( $message ); - } - } - - /** - * Reformats error messages by removing excessive whitespace. - * - * @param string $message Error message to reformat. - * - * @return string Reformatted error message. - */ - protected function reformat_error( $message ) { - $message = preg_replace( '/\s+/', ' ', $message ); - return trim( $message ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-command-namespace.php b/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-command-namespace.php deleted file mode 100644 index cbe5d455..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-command-namespace.php +++ /dev/null @@ -1,16 +0,0 @@ - - * : Origin of the redirect. - * - * - * : Target of the redirect. - * - * [--type=] - * : Type of the redirect. - * --- - * default: 301 - * options: - * - 301 - * - 302 - * - 307 - * - 410 - * - 451 - * --- - * - * [--format=] - * : Format of the redirect. - * --- - * default: plain - * options: - * - plain - * - regex - * --- - * - * [--force] - * : Force creation of the redirect, bypassing any validation. - * --- - * default: false - * --- - * - * @param array $args Array of positional arguments. - * @param array $assoc_args Associative array of associative arguments. - * - * @return void - */ - public function __invoke( $args, $assoc_args ) { - list( $origin, $target ) = $args; - - $type = (int) Utils\get_flag_value( $assoc_args, 'type', '301' ); - $format = Utils\get_flag_value( $assoc_args, 'format', 'plain' ); - $force = Utils\get_flag_value( $assoc_args, 'force', false ); - - $exists = $this->has_redirect( $origin ); - - if ( $exists && ! $force ) { - WP_CLI::error( "Redirect already exists for '{$origin}'." ); - } - - if ( ! $force ) { - $this->validate( $origin, $target, $type, $format ); - } - - if ( $exists ) { - $success = $this->update_redirect( $origin, $origin, $target, $type, $format ); - } - - if ( ! $exists ) { - $success = $this->create_redirect( $origin, $target, $type, $format ); - } - - if ( ! $success ) { - WP_CLI::error( "Could not create redirect: '{$origin}' => '{$target}'." ); - } - - WP_CLI::success( "Redirect created: '{$origin}' => '{$target}'." ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-delete-command.php b/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-delete-command.php deleted file mode 100644 index 561ea9e2..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-delete-command.php +++ /dev/null @@ -1,41 +0,0 @@ - - * : Origin of the redirect. - * - * @param array $args Array of positional arguments. - * @param array $assoc_args Associative array of associative arguments. - * - * @return void - */ - public function __invoke( $args, $assoc_args ) { - list( $origin ) = $args; - - if ( ! $this->has_redirect( $origin ) ) { - WP_CLI::error( "Redirect does not exist for '{$origin}'." ); - } - - $success = $this->delete_redirect( $origin ); - - if ( ! $success ) { - WP_CLI::error( "Could not delete redirect: '{$origin}'." ); - } - - WP_CLI::success( "Redirect delete: '{$origin}'." ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-follow-command.php b/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-follow-command.php deleted file mode 100644 index 722f0f9b..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-follow-command.php +++ /dev/null @@ -1,118 +0,0 @@ - - * : Origin of the redirect. - * - * [--trace] - * : Show a trace of all intermediary steps. - * - * [--limit=] - * : Limit the number of jumps to follow the redirect chain. '0' means unlimited. - * --- - * default: 0 - * --- - * - * @param array $args Array of positional arguments. - * @param array $assoc_args Associative array of associative arguments. - * - * @return void - */ - public function __invoke( $args, $assoc_args ) { - list( $origin ) = $args; - $trace = (bool) Utils\get_flag_value( $assoc_args, 'trace', false ); - $limit = (int) Utils\get_flag_value( $assoc_args, 'limit', '0' ); - - $redirect = $this->get_redirect( $origin ); - - if ( $redirect === false ) { - WP_CLI::error( "Redirect does not exist for '{$origin}'." ); - } - - $stack = $this->get_stack( $redirect, $limit ); - - if ( ! $trace ) { - $stack = (array) array_pop( $stack ); - } - - array_map( 'WP_CLI::line', $stack ); - - if ( $this->detected_loop ) { - WP_CLI::error( "Detected redirect loop for redirect: '{$origin}'." ); - } - } - - /** - * Gets the stack of redirect targets for a given starting redirect. - * - * @param WPSEO_Redirect $redirect Redirect to get the stack for. - * @param int $limit Number of steps to limit the stack to. - * - * @return array Array of target URL steps. - */ - private function get_stack( WPSEO_Redirect $redirect, $limit ) { - $steps = 0; - - while ( ! $this->detected_loop && $redirect !== false ) { - ++$steps; - if ( $limit > 0 && $steps >= $limit ) { - break; - } - - $target = $redirect->get_target(); - - $this->add_to_stack( $target ); - - $redirect = $this->get_redirect( $target ); - } - - return array_keys( $this->stack ); - } - - /** - * Adds a new target to the stack. - * - * @param string $target Target to add to the stack. - * - * @return void - */ - private function add_to_stack( $target ) { - if ( array_key_exists( $target, $this->stack ) ) { - $this->detected_loop = true; - - return; - } - - $this->stack[ $target ] = true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-has-command.php b/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-has-command.php deleted file mode 100644 index 15a1131d..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-has-command.php +++ /dev/null @@ -1,31 +0,0 @@ - - * : Origin of the redirect. - * - * @param array $args Array of positional arguments. - * @param array $assoc_args Associative array of associative arguments. - * - * @return void - */ - public function __invoke( $args, $assoc_args ) { - list( $origin ) = $args; - - exit( $this->has_redirect( $origin ) ? 0 : 1 ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-list-command.php b/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-list-command.php deleted file mode 100644 index 034bccae..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-list-command.php +++ /dev/null @@ -1,185 +0,0 @@ -=] - * : Filter the list to only show specific values for a given field. - * - * [--field=] - * : Prints the value of a single field for each redirect. - * - * [--fields=] - * : Limit the output to specific object fields. - * --- - * default: origin,target,type,format - * --- - * - * [--output=] - * : Render output in a particular format. - * --- - * default: table - * options: - * - table - * - csv - * - json - * - yaml - * - count - * --- - * - * ## AVAILABLE FIELDS - * - * These fields will be displayed by default for each redirect: - * - * * origin - * * target - * * type - * * format - * - * @param array $args Array of positional arguments. - * @param array $assoc_args Associative array of associative arguments. - * - * @return void - */ - public function __invoke( $args, $assoc_args ) { - $this->filter = $this->get_filter( $assoc_args ); - - /* - * By default, WP-CLI uses `--format=` to define the output - * format for lists. As we also have a `format` field here and want to - * be able to easily filter the list by a given format, we use - * `--output=` to define the format. - * We need to rename it back again here to be able to use the default - * format handling provided by WP-CLI. - */ - $assoc_args['format'] = $assoc_args['output']; - - $formatter = new Formatter( - $assoc_args, - $this->get_fields( $assoc_args ) - ); - - $redirects = array_filter( - $this->get_redirects(), - [ $this, 'filter_redirect' ] - ); - - $formatter->display_items( $redirects ); - } - - /** - * Gets the filtered list of redirects. - * - * @return array Associative array of redirects. - */ - private function get_redirects() { - $redirect_objects = $this->redirect_manager->get_all_redirects(); - - return array_map( - [ $this, 'adapt_redirect_data' ], - $redirect_objects - ); - } - - /** - * Filters the redirects based on whether they match the provided filter - * array. - * - * @param array $redirect Array data for an individual redirect. - * - * @return bool Whether to include the redirect or not. - */ - private function filter_redirect( $redirect ) { - foreach ( $this->filter as $key => $value ) { - /* - * Loose comparison to ignore type, as CLI arguments are always - * strings. - */ - if ( $value != $redirect[ $key ] ) { - return false; - } - } - - return true; - } - - /** - * Adapts redirect data fetched from the redirect manager to fit WP_CLI - * requirements. - * - * @param WPSEO_Redirect $redirect Redirection value object. - * - * @return array Associative array of redirects. - */ - private function adapt_redirect_data( $redirect ) { - return [ - 'origin' => $redirect->get_origin(), - 'target' => $redirect->get_target(), - 'type' => $redirect->get_type(), - 'format' => $redirect->get_format(), - ]; - } - - /** - * Gets the array of field names to use for formatting the table columns. - * - * @param array $assoc_args Parameters passed to command. Determines - * formatting. - * - * @return array Array of fields to use. - */ - private function get_fields( $assoc_args ) { - if ( empty( $assoc_args['fields'] ) ) { - return explode( ',', self::ALL_FIELDS ); - } - - if ( is_string( $assoc_args['fields'] ) ) { - return explode( ',', $assoc_args['fields'] ); - } - - return $assoc_args['fields']; - } - - /** - * Gets the filter array to filter values against. - * - * @param array $assoc_args Parameters passed to command. Determines - * formatting. - * - * @return array Associative array of filter values. - */ - private function get_filter( $assoc_args ) { - $filter = []; - - foreach ( [ 'origin', 'target', 'type', 'format' ] as $type ) { - if ( isset( $assoc_args[ $type ] ) ) { - $filter[ $type ] = $assoc_args[ $type ]; - } - } - - return $filter; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-update-command.php b/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-update-command.php deleted file mode 100644 index 584f1d92..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/cli/cli-redirect-update-command.php +++ /dev/null @@ -1,86 +0,0 @@ - - * : Origin of the redirect to update. - * - * - * : New origin of the redirect. - * - * - * : Target of the redirect. - * - * [--type=] - * : Type of the redirect. - * --- - * default: 301 - * options: - * - 301 - * - 302 - * - 307 - * - 410 - * - 451 - * --- - * - * [--format=] - * : Format of the redirect. - * --- - * default: plain - * options: - * - plain - * - regex - * --- - * - * [--force] - * : Force updating of the redirect, bypassing any validation. - * --- - * default: false - * --- - * - * @param array $args Array of positional arguments. - * @param array $assoc_args Associative array of associative arguments. - * - * @return void - */ - public function __invoke( $args, $assoc_args ) { - list( $origin, $new_origin, $target ) = $args; - - $type = (int) Utils\get_flag_value( $assoc_args, 'type', '301' ); - $format = Utils\get_flag_value( $assoc_args, 'format', 'plain' ); - $force = Utils\get_flag_value( $assoc_args, 'force', false ); - - $exists = $this->has_redirect( $origin ); - - if ( ! $exists && ! $force ) { - WP_CLI::error( "Redirect does not exist for '{$origin}'." ); - } - - if ( ! $force ) { - $this->validate( $new_origin, $target, $type, $format, $origin ); - } - - $success = $this->update_redirect( $origin, $new_origin, $target, $type, $format ); - - if ( ! $success ) { - WP_CLI::error( "Could not update redirect: '{$new_origin}' => '{$target}'." ); - } - - WP_CLI::success( "Redirect updated: '{$new_origin}' => '{$target}'." ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/index.php b/wp/wp-content/plugins/wordpress-seo-premium/index.php deleted file mode 100644 index e94d9a42..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/index.php +++ /dev/null @@ -1,4 +0,0 @@ -Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Settings"],"OK":["OK"],"Close":["Close"],"Type":["Type"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ar.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ar.json deleted file mode 100644 index 743a51d1..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ar.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;","lang":"ar"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["للŮصŮŮ„ إلى هذه الميزة، تحتاج إلى اشتراŮات %2$s Ů%3$s نشطة. يرجى %5$s تنشيط الاشتراŮات٠خلال %1$s%6$s ŘŁŮ %7$sاحصل على %4$s%8$s جديد. بعد ذلŮŘŚ يرجى ŘŞŘ­ŘŻŮŠŘ« هذه الصŮŘ­Ř© حتى تعمل الميزة بشŮŮ„ صحيح، الأمر الذي قد يستغرق ما يصل إلى 30 ثانية."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["يتطلب منشئ عنŮان AI ŘŞŮ…Ůين تحليل تحسين محرŮات البحث (SEO) قبل الاستخدام. لتمŮينه، يرجى الانتقال إلى ميزات المŮقع %2$s لـ %1$s%3$sŘŚ Ůتشغيل تحليل تحسين محرŮات البحث (SEO)ŘŚ ثم النقر ŮŮŮ‚ \"Ř­Ůظ التغييرات\". إذا ŘŞŮ… تعطيل تحليل تحسين محرŮات البحث (SEO) ŮŮŠ المل٠الشخصي لمستخدم WordPress الخاص بŮŘŚ Ůادخل إلى Ů…Ů„Ů٠الشخصي Ůقم بتمŮينه هناŮ. يرجى الاتصال بالمسؤŮŮ„ الخاص ب٠إذا لم ŘŞŘŞŮ…Ůن من الدخŮŮ„ إلى هذه الإعدادات."],"Social share preview":["معاينة المشارŮŘ© الاجتماعية"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["لمŮاصلة استخدام ميزة الذŮاء الاصطناعي Ů„YoastŘŚ يرجى تقليل ŘŞŮرار طلباتŮ. ŘŞŮŮر %1$sمقالة المساعدة%2$s الخاصة بنا إرشادات Ř­ŮŮ„ التخطيط الŮعال لطلبات٠Ůتنظيمها من أجل سير عمل محسّن."],"You've reached the Yoast AI rate limit.":["لقد Ůصلت إلى الحد الأقصى لمعدل الذŮاء الاصطناعي Ů„Yoast."],"Allow":["سماح"],"Deny":["رŮض"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["لمشاهدة هذا الŮŮŠŘŻŮŠŮ ŘŚ تحتاج إلى السماح لـ %1$s بتحميل مقاطع الŮيدي٠المضمنة من %2$s."],"Text generated by AI may be offensive or inaccurate.":["قد ŮŠŮŮن النص الناتج عن الذŮاء الاصطناعي مسيئًا أ٠غير دقيق."],"(Opens in a new browser tab)":["(ŮŠŮŘŞŘ­ ŮŮŠ علامة تبŮيب متصŮŘ­ جديدة)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["قم بتسريع سير عمل٠باستخدام الذŮاء الاصطناعي التŮليدي. احصل على اقتراحات عالية الجŮŘŻŘ© للعناŮين ŮالŮص٠لبحث٠Ůمظهر٠الاجتماعي. %1$sتعر٠على المزيد%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["قم بإنشاء العناŮين ŮالأŮصا٠باستخدام الذŮاء الاصطناعي Ů„Yoast!"],"New to %1$s":["جديد ŮŮŠ %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["ŘŁŮاŮŮ‚ على %1$sشرŮŘ· الخدمة%2$s Ů%3$sسياسة الخصŮصية%4$s لخدمة الذŮاء الاصطناعي Ů„Yoast. يتضمن ذل٠المŮاŮقة على جمع البيانات Ůاستخدامها لتحسين تجربة المستخدم."],"Start generating":["ابدأ بالتŮليد"],"Yes, revoke consent":["نعم، إلغاء المŮاŮقة"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["من خلال إلغاء Ů…ŮاŮقتŮŘŚ لن ŘŞŘŞŮ…Ůن بعد الآن من الŮصŮŮ„ إلى ميزات الذŮاء الاصطناعي Ů„Yoast. هل أنت Ů…ŘŞŘŁŮŘŻ أن٠تريد إلغاء Ů…ŮاŮقتŮŘź"],"Something went wrong, please try again later.":["Ř­ŘŻŘ« خطأ ما، يرجى المحاŮلة Ůى Ůقت لاحق."],"Revoke AI consent":["إلغاء Ů…ŮاŮقة الذŮاء الاصطناعي"],"Please enter a focus keyphrase first to use AI.":["الرجاء إدخال عبارة الترŮيز المŮتاحية ŘŁŮلاً لاستخدام الذŮاء الاصطناعي."],"AI title generator":["Ů…Ůلد عنŮان الذŮاء الاصطناعي"],"AI description generator":["Ů…Ůلد Ůص٠الذŮاء الاصطناعي"],"AI Twitter title generator":["Ů…Ůلد عنŮان الذŮاء الاصطناعي لتŮيتر"],"AI Twitter description generator":["Ů…Ůلد Ůص٠الذŮاء الاصطناعي لتŮيتر"],"AI social title generator":["Ů…Ůلد الذŮاء الاصطناعي للعنŮان الاجتماعي"],"AI social description generator":["Ů…Ůلد الذŮاء الاصطناعي للŮص٠الاجتماعي"],"Twitter preview":["معاينة Twitter"],"Dismiss":["تجاهُل"],"Don’t show again":["لا تظهر مرة أخرى"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sنصيحة%2$s: قم بتحسين دقة Ů…Ůلد الذŮاء الاصطناعي لعناŮين٠عن طريق Ůتابة المزيد من المحتŮى ŮŮŠ صŮŘ­ŘŞŮ."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sنصيحة%2$s: قم بتحسين دقة ŘŁŮصا٠مŮلد الذŮاء الاصطناعي عن طريق Ůتابة المزيد من المحتŮى ŮŮŠ صŮŘ­ŘŞŮ."],"Try again":["حاŮŮ„ مجدداً"],"Social preview":["معاينة اجتماعية"],"Desktop result":["نتيجة سطح المŮتب"],"Mobile result":["نتيجة الجŮال"],"Apply AI description":["تطبيق Ůص٠الذŮاء الاصطناعي"],"Apply AI title":["تطبيق عنŮان الذŮاء الاصطناعي"],"Next":["التالي"],"Previous":["السابق"],"Generate 5 more":["ŘŞŮليد 5 آخرين"],"Google preview":["معاينة Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["نظرًا لإرشادات OpenAI الأخلاقية الصارمة Ů %1$sسياسات الاستخدام%2$sŘŚ لا ŮŠŮ…Ůننا ŘŞŮليد عناŮين تحسين محرŮات البحث(SEO) لصŮŘ­ŘŞŮ. إذا Ůنت تنŮŮŠ استخدام الذŮاء الاصطناعي، Ůيرجى تجنب استخدام Ů…Ř­ŘŞŮى العن٠الصريح أ٠الجنسي الصريح. %3$sاقرأ المزيد Ř­ŮŮ„ ŮŮŠŮŮŠŘ© ŘŞŮŮين صŮحت٠للتأŮŘŻ من حصŮل٠على ŘŁŮضل النتائج باستخدام الذŮاء الاصطناعي%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["نظرًا لإرشادات OpenAI الأخلاقية الصارمة Ů%1$sسياسات الاستخدام%2$sŘŚ لا ŮŠŮ…Ůننا ŘŞŮليد ŘŁŮصا٠تعريŮŮŠŘ© لصŮŘ­ŘŞŮ. إذا Ůنت تنŮŮŠ استخدام الذŮاء الاصطناعي، Ůيرجى تجنب استخدام Ů…Ř­ŘŞŮى العن٠الصريح أ٠الجنسي الصريح. %3$sاقرأ المزيد Ř­ŮŮ„ ŮŮŠŮŮŠŘ© ŘŞŮŮين صŮحت٠للتأŮŘŻ من حصŮل٠على ŘŁŮضل النتائج باستخدام الذŮاء الاصطناعي %4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["للŮصŮŮ„ إلى هذه الميزة، تحتاج إلى اشترا٠%1$s نشط. يرجى %3$sتنشيط اشتراŮ٠خلال %2$s%4$s ŘŁŮ %5$sاحصل على %1$s اشترا٠جديد%6$s. بعد ذلŮŘŚ انقر على الزر لتحديث هذه الصŮŘ­Ř© حتى تعمل الميزة بشŮŮ„ صحيح Ůالذي قد يستغرق ما يصل إلى 30 ثانية."],"Refresh page":["بتحديث الصŮŘ­Ř©"],"Not enough content":["Ů…Ř­ŘŞŮى غير ŮاŮŮŠ"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["الرجاء اعادة المحاŮلة ŮŮŠ Ůقت لاحق. إذا استمرت المشŮلة، يرجى %1$sالاتصال بŮريق الدعم%2$s!"],"Something went wrong":["هنا٠خطأ ما"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["يبد٠أن مهلة الاتصال قد انتهت. يرجى التحقق من اتصال٠بالإنترنت ŮالمحاŮلة مرة أخرى لاحقًا. إذا استمرت المشŮلة، يرجى %1$sالاتصال بŮريق الدعم%2$s"],"Connection timeout":["انتهى الاتصال"],"Use AI":["استخدم الذŮاء الاصطناعي"],"Close modal":["اغلاق الŮسائط"],"Learn more about AI (Opens in a new browser tab)":["تعر٠على المزيد Ř­ŮŮ„ الذŮاء الاصطناعي (ŮŠŮŘŞŘ­ ŮŮŠ علامة تبŮيب متصŮŘ­ جديدة)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sالعنŮان%3$s: صŮحت٠ليس لها عنŮان حتى الآن. %2$sأض٠عنŮانا%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sالعنŮان%2$s: صŮحت٠لها عنŮان. أحسنت!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sŘŞŮزيع العبارة الرئيسية%3$s: %2$sقم بتضمين العبارة الرئيسية أ٠مرادŮاتها ŮŮŠ النص حتى نتمŮن من التحقق من ŘŞŮزيع العبارة الرئيسية%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sŘŞŮزيع العبارة الرئيسية%2$s: عمل جيد!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$s ŘŞŮزيع العبارة الرئيسية%3$s: غير متساŮ. لا ŘŞŘ­ŘŞŮŮŠ بعض أجزاء النص الخاص ب٠على العبارة الرئيسية أ٠مرادŮاتها. %2$s Ůزعهم بشŮŮ„ متساŮŮŤ%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sŘŞŮزيع العبارة الرئيسية%3$s: غير متساŮŮŤ للغاية. لا ŘŞŘ­ŘŞŮŮŠ الأجزاء الŮبيرة من النص على العبارة الرئيسية أ٠مرادŮاتها. %2$sŮزعهم بشŮŮ„ متساŮŮŤ%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: أنت لا تستخدم الŮثير من الŮلمات المعقدة ŘŚ مما يجعل نص٠سهل القراءة. أحسنت!"],"Word complexity":["تعقيد الŮلمات"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s من الŮلمات ŮŮŠ النص الخاص ب٠تعتبر معقدة. %3$s حاŮŮ„ استخدام Ůلمات أقصر ŮŘŁŮثر Ř´ŮŠŮعًا لتحسين سهŮلة القراءة %4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$s محاذاة %3$s: هنا٠قسم Ř·ŮŮŠŮ„ من النص المحاذي للŮسط. %2$s نŮصي بجعله محاذيًا إلى اليسار%3$s.","%1$s محاذاة %3$s: هنا٠قسم Ř·ŮŮŠŮ„ من النص المحاذي للŮسط. %2$s نŮصي بجعله محاذيًا إلى اليسار%3$s.","%1$s محاذاة %3$s: هنا٠%4$s أقسام من النص المحاذي للŮسط. %2$s نŮصي بجعله محاذيًا إلى اليسار%3$s.","%1$s محاذاة %3$s: هنا٠%4$s أقسام من النص المحاذي للŮسط. %2$s نŮصي بجعله محاذيًا إلى اليسار%3$s.","%1$s محاذاة %3$s: هنا٠%4$s أقسام من النص المحاذي للŮسط. %2$s نŮصي بجعله محاذيًا إلى اليسار%3$s.","%1$s محاذاة %3$s: هنا٠%4$s أقسام من النص المحاذي للŮسط. %2$s نŮصي بجعله محاذيًا إلى اليسار%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$s محاذاة %3$s: هنا٠قسم Ř·ŮŮŠŮ„ من النص المحاذي للŮسط. %2$s نŮصي بجعله محاذيًا إلى اليمين%3$s.","%1$s محاذاة %3$s: هنا٠قسم Ř·ŮŮŠŮ„ من النص المحاذي للŮسط. %2$s نŮصي بجعله محاذيًا إلى اليمين%3$s.","%1$s محاذاة %3$s: هنا٠%4$s أقسام من النص المحاذي للŮسط. %2$s نŮصي بجعله محاذيًا إلى اليمين%3$s.","%1$s محاذاة %3$s: هنا٠%4$s أقسام من النص المحاذي للŮسط. %2$s نŮصي بجعله محاذيًا إلى اليمين%3$s.","%1$s محاذاة %3$s: هنا٠%4$s أقسام من النص المحاذي للŮسط. %2$s نŮصي بجعله محاذيًا إلى اليمين%3$s.","%1$s محاذاة %3$s: هنا٠%4$s أقسام من النص المحاذي للŮسط. %2$s نŮصي بجعله محاذيًا إلى اليمين%3$s."],"Select image":["ŘŞŘ­ŘŻŮŠŘŻ صŮرة"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["حان الŮقت لإضاŮŘ© بعض الرŮابط! أدناه ŘŚ ترى قائمة بالأساسي الخاصة بŮ. ŘŞŘ­ŘŞ ŮŮ„ أساسي ŘŚ ŘŞŮجد اقتراحات لمقالات ŮŠŮ…Ůن٠إضاŮŘ© رابط منها. عند إضاŮŘ© الارتباط ŘŚ ŘŞŘŁŮŘŻ من إدراجه ŮŮŠ الجملة ذات الصلة المتعلقة بالمقال الأساسي الخاص بŮ. استمر ŮŮŠ إضاŮŘ© رŮابط من ŘŁŮŠ عدد تريده من المقالات ذات الصلة ŘŚ حتى ŘŞŘ­ŘŞŮŮŠ أساسيات الخاصة ب٠على معظم الرŮابط الداخلية التي تشير إليها."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["بعض المقالات على Ů…ŮقعŮ%1$s هي الأŮثر أهمية%2$s. يجيبŮن على أسئلة الناس ŮŮŠŘ­Ů„Ůن مشاŮلهم. لذا Ůهم يستحقŮن أن ŮŠŮŮنŮا ŮŮŠ مرتبة جيدة! ŮŮŠ%3$s ŘŚ نطلق على هذه المقالات الأساسية. تتمثل إحدى طرق الحصŮŮ„ على ترتيب جيد لهم هي بتŮجيه رŮابط ŮاŮŮŠŘ© اليهم. تشير المزيد من الرŮابط لمحرŮات البحث إلى أن هذه المقالات مهمة Ůقيمة. ŮŮŠ هذا التمرين ŘŚ سنساعد٠ŮŮŠ إضاŮŘ© رŮابط إلى مقالات٠الأساسية!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["بمجرد إضاŮŘ© المزيد من المحتŮى ŘŚ سنتمŮن من إخبار٠بالمستŮى الشŮلي للنص الخاص بŮ."],"Overall, your text appears to be %1$s%3$s%2$s.":["بشŮŮ„ عام ŘŚ يبد٠أن النص الخاص ب٠هŮ%1$s%3$s%2$s."],"Heading %d":["العنŮان %d"],"Maximum heading level":["الحد الأقصى لمستŮى العنŮان"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["لقد قمت بتعطيل اقتراحات الارتباط ŘŚ Ůه٠أمر ضرŮري حتى تعمل الارتباطات ذات الصلة. إذا Ůنت تريد إضاŮŘ© الارتباطات ذات الصلة ŘŚ Ůالرجاء الانتقال إلى ميزات المŮقع ŮŘŞŮعيل اقتراحات الارتباط."],"Schema":["مخطط Schema"],"Meta tags":["الŮŘłŮŮ… الŮصŮŮŠŘ©"],"Not available":["غير Ů…ŘŞŮŮر"],"Checks":["الŮŘ­Ůصات"],"Focus Keyphrase":["الترŮيز على العبارة الرئيسية"],"Good":["جيدة"],"No index":["لا ŮŠŮجد Ůهرس"],"Front-end SEO inspector":["Ů…ŮŘŞŘ´ SEO للŮاجهة الأمامية"],"Focus keyphrase not set":["لم ŮŠŘŞŮ… تعيين ترŮيز العبارة الرئيسية."],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["يرجى ملاحظة: Ů„ŮŮŠ يعمل هذا التمرين بشŮŮ„ جيد ŘŚ تحتاج إلى تشغيل أداة تحسين بيانات تحسين محرŮات البحث (SEO). ŮŠŮ…Ůن للمسؤŮلين تشغيل هذا ضمن%1$s تحسين محرŮات البحث (SEO)> الأدŮات%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["لقد أضŮŘŞ رŮابط إلى مقالات٠المعزŮلة ŘŚ Ůأزلت تل٠التي لم تعد ذات صلة. عمل عظيم! ألق نظرة على الملخص أدناه ŮاحتŮŮ„ بما أنجزته!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["قم بŮحص المحتŮى ŮŮŠ هذه القائمة بشŮŮ„ نقدي Ůقم بإجراء التحديثات اللازمة. إذا Ůنت بحاجة إلى مساعدة ŮŮŠ التحديث ŘŚ Ůلدينا%1$s مقالة Ů…ŘŻŮنة Ů…ŮŮŠŘŻ للغاية ŮŠŮ…Ůنها إرشاد٠طŮال الطريق%2$s (انقر Ů„Ůتحه ŮŮŠ علامة تبŮيب جديدة)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$s هل تحتاج إلى مزيد من الإرشادات؟ لقد تناŮلنا ŮŮ„ خطŮŘ© بمزيد من التŮصيل ŮŮŠ الدليل التالي:%2$s ŮŮŠŮŮŠŘ© استخدام تمرين%7$s للمحتŮى المعزŮŮ„ %3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["لقد جعلت للت٠أŮضل Ů…Ř­ŘŞŮى لدي٠من السهل العثŮر عليه ŘŚ Ůيزيد احتمال ترتيبه! أحسنت! من Ůقت لآخر ŘŚ تذŮر أن تتحقق مما إذا Ůانت أحجار الزاŮŮŠŘ© لدي٠تحصل على رŮابط ŮاŮŮŠŘ©!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["ألق نظرة على القائمة أدناه. هل أحجار الزاŮŮŠŘ© الخاصة ب٠(المميزة بـ%1$s) ŘŞŘ­ŘŞŮŮŠ على معظم الارتباطات الداخلية التي تشير إليها؟ انقر ŮŮŮ‚ الزر تحسين (Optimize) إذا Ůنت تعتقد أن حجر الأساس يحتاج إلى مزيد من الرŮابط. سيؤدي ذل٠إلى نقل المقالة إلى الخطŮŘ© التالية."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["هل ŮŮ„ من الأساسات الخاصة ب٠لها علامة خضراء؟ للحصŮŮ„ على ŘŁŮضل النتائج، ŮŮر ŮŮŠ تحرير تل٠التي ليست ŮذلŮ!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["ما هي المقالات التي تريد أن ŘŞŘ­ŘŞŮ„ المرتبة الأŮلى Ůيها؟ ŘŁŮŠ منها سيجد جمهŮر٠أŮثر Ůائدة ŮاŮتمالًا؟ انقر ŮŮŮ‚ السهم الذي يشير لأسŮŮ„ Ůابحث عن المقالات التي تناسب تل٠المعايير. سنقŮŮ… تلقائيًا بŮضع علامة على المقالات التي تحددها من القائمة Ůحجر زاŮŮŠŘ©."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$s هل تحتاج إلى مزيد من الإرشادات؟ لقد تناŮلنا ŮŮ„ خطŮŘ© بمزيد من التŮصيل ŮŮŠ: %2$s ŮŮŠŮŮŠŘ© استخدام تمرين حجر الزاŮŮŠŘ© %7$s %3$s%4$s%5$s.%6$s"],"Yoast Subpages":["الصŮحات الŮرعية Yoast"],"Yoast Siblings":["ŘŁŘ®ŮŘ© Yoast"],"Yoast Table of Contents":["جدŮŮ„ المحتŮيات Yoast"],"Yoast Related Links":["رŮابط ذات صلة بYoast"],"Finish optimizing":["ŘŁŘŞŮ…Ů… التحسين"],"You've finished adding links to this article.":["لقد ŘŁŘŞŮ…Ů…ŘŞ إضاŮŘ© الرŮابط إلى هذا المقال"],"Optimize":["تحسين "],"Added to next step":["ŘŞŮ…ŘŞ الإضاŮŘ© للخطŮŘ© التالية"],"Choose cornerstone articles...":["اختر المقالات الأساس..."],"Loading data...":["جارٍ ŘŞŘ­Ů…ŮŠŮ„ البيانات ..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["لم تقم بتنظي٠أ٠تحديث ŘŁŮŠ مقالات حتى الآن باستخدام هذا التدريب. بمجرد القيام بذل٠، سيظهر هنا ملخص لعملŮ."],"Skipped":["ŘŞŮ… تخطي"],"Hidden from search engines.":["Ů…Ř®ŮŮŠŘ© عن محرŮات البحث."],"Removed":["ŘŞŮ…ŘŞ الإزالة"],"Improved":["محسّن"],"Resolution":["القرار"],"Loading redirect options...":["جارٍ ŘŞŘ­Ů…ŮŠŮ„ خيارات إعادة التŮجيه ..."],"Remove and redirect":["إزالة Ůإعادة التŮجيه"],"Custom url:":["رابط مخصص:"],"Related article:":["مقالة ذات صلة:"],"Home page:":["الصŮŘ­Ř© الرئيسية:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["أنت على Ůش٠إزالة%1$s%2$s%3$s. لمنع ظهŮر أخطاء 404 على Ů…ŮقعŮŘŚ يجب إعادة ŘŞŮجيهها إلى صŮŘ­Ř© أخرى على Ů…ŮقعŮ. إلى أين تريد إعادة ŘŞŮجيهها؟"],"SEO Workout: Remove article":["تدريب تحسين محرŮات البحث: إزالة المقالة"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["ŮŮ„ شيء يبد٠على ما يرام! لم نعثر على ŘŁŮŠ مقالات على Ů…Ůقع٠مضى عليها ŘŁŮثر من ستة أشهر Ůلا تتلقى ŘłŮى عدد قليل جدًا من الرŮابط على Ů…ŮقعŮ. تحقق مرة أخرى هنا لاحقًا للحصŮŮ„ على اقتراحات تنظي٠جديدة!"],"Hide from search engines":["ŘĄŘ®Ůاء من محرŮات البحث"],"Improve":["حسن"],"Are you sure you wish to hide this article from search engines?":["هل أنت Ů…ŘŞŘŁŮŘŻ أن٠ترغب ŮŮŠ ŘĄŘ®Ůاء هذه المقالة من محرŮات البحث؟"],"Action":["إجراء"],"You've hidden this article from search engines.":["لقد قمت بإخŮاء هذه المقالة من محرŮات البحث."],"You've removed this article.":["لقد قمت بإزالة هذه المقالة."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["لم تقم حاليًا بتحديد ŘŁŮŠ مقالات لتحسينها. Ř­ŘŻŘŻ بعض المقالات ŮŮŠ الخطŮات السابقة لإضاŮŘ© رŮابط إليها Ůسنعرض ل٠هنا مقترحات الارتباط."],"Loading link suggestions...":["جارٍ ŘŞŘ­Ů…ŮŠŮ„ اقتراحات الارتباط ..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["لم نعثر على ŘŁŮŠ اقتراحات لهذه المقالة، ŮŮ„Ůن بالطبع لا يزال بإمŮان٠إضاŮŘ© رŮابط إلى المقالات التي تعتقد أنها ذات صلة."],"Skip":["تخطي"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["لم تقم بتحديد ŘŁŮŠ مقالات لهذه الخطŮŘ© حتى الآن. ŮŠŮ…Ůن٠القيام بذل٠ŮŮŠ الخطŮŘ© السابقة."],"Is it up-to-date?":["هل ه٠محدث؟"],"Last Updated":["التحديث الاخير"],"You've moved this article to the next step.":["لقد قمت بنقل هذه المقالة إلى الخطŮŘ© التالية."],"Unknown":["غير معرŮŮ"],"Clear summary":["ملخص Ůاضح"],"Add internal links towards your orphaned articles.":["أض٠رŮابط داخلية لمقالات٠المعزŮلة."],"Should you update your article?":["هل يجب علي٠تحديث مقالتŮŘź"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["غالبًا ما ŮŠŘ­ŘŞŮŮŠ Ů…Ůقع٠على الŮثير من المحتŮى الذي ŘŞŮ… إنشاؤه مرة Ůاحدة Ůلم ŮŠŘŞŮ… الرجŮŘą إليه بعد ذلŮ. من المهم المراجعة Ůاسأل نŮس٠ما إذا Ůان هذا المحتŮى لا يزال ذ٠صلة بمŮقعŮ. هل يجب علي تحسينه ŘŁŮ… إزالته؟"],"Start: Love it or leave it?":["ابدأ: أحبها ŘŁŮ… اترŮها؟"],"Clean up your unlinked content to make sure people can find it":["نظ٠المحتŮى غير المرتبط حتى ŮŠŘŞŮ…Ůن المستخدمŮن من العثŮر عليه"],"I've finished this workout":["لقد أنهيت هذا التمرين"],"Reset this workout":["إعادة تعيين هذا التمرين"],"Well done!":["أحسنت!"],"Add internal links towards your cornerstones":["أض٠رŮابط داخلية نح٠الأساس الخاصة بŮ"],"Check the number of incoming internal links of your cornerstones":["تحقق من عدد الرŮابط الداخلية الŮاردة للأساس الخاص بŮ"],"Start: Choose your cornerstones!":["ابدأ: اختر الأساس الخاص بŮ!"],"The cornerstone approach":["نهج الأساس"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["يرجى ملاحظة: Ů„ŮŮŠ يعمل هذا التمرين بشŮŮ„ جيد Ůلتقديم اقتراحات ربط Ů„ŮŘŚ تحتاج إلى تشغيل أداة تحسين بيانات تحسين محرŮات البحث (SEO). ŮŠŮ…Ůن المديرين تشغيل هذا ضمن تحسين محرŮات البحث SEO > ŘŁŘŻŮات Tools ."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["لقد انتهيت من هذه الخطŮŘ©"],"Revise this step":["تعديل هذه الخطŮŘ©"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["لم نتمŮن من العثŮر على رŮابط داخلية على صŮحاتŮ. إما أن٠لم تقم بإضاŮŘ© ŘŁŮŠ رŮابط داخلية إلى المحتŮى الخاص ب٠حتى الآن، أ٠أن Yoast SEO لم يقم بŮهرستها. ŮŠŮ…Ůن٠ل Yoast SEO Ůهرسة الرŮابط الخاصة ب٠عن طريق تشغيل تحسين بيانات SEO ضمن SEO تحسين محر٠البحث > ŘŁŘŻŮات Tools."],"Incoming links":["رŮابط Ůاردة"],"Edit to add link":["تحرير لإضاŮŘ© ارتباط"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["ليس لدي٠حاليا ŘŁŮŠ مقالات Ůضعت لها علامة Ůأساس. عندما تضع علامة على مقالات٠Ůأساس، ŘłŮ٠يظهرŮن هنا."],"Focus keyphrase":["عبارة رئيسية Ů…Ůتاحية"],"Article":["مقالة"],"Readability score":["درجة قابلية القراءة"],"SEO score":["نتيجة SEO"],"Copy failed":["ŮŘ´Ů„ النسخ"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Ř­ŘłŮّن تصنيŮات جميع الأساس لدي٠باستخدام هذا التمرين%1$sخطŮŘ© بخطŮŘ©!%2$s"],"Rank with articles you want to rank with":["احتل مراتب جيدة Ů…Řą المقالات التي تريد الترتيب لها"],"Descriptive text":["النص الŮصŮŮŠ"],"Show the descriptive text":["عرض النص الŮصŮŮŠ"],"Show icon":["عرض الايقŮنة"],"Yoast Estimated Reading Time":["Ůقت القراءة المقدر من قبل yoast"],"Shows an estimated reading time based on the content length.":["يظهر Ůقت القراءة المقدرة بناء على Ř·ŮŮ„ المحتŮى"],"reading time":["Ůقت القراءة"],"content length":["Ř·ŮŮ„ المحتŮى"],"Estimated reading time:":["الŮقت المقدر للقراءة"],"minute":["دقيقة","دقيقة","دقائق","دقائق","دقائق","دقائق"],"Settings":["الإعدادات"],"OK":["مقبŮلة"],"Close":["إغلاق"],"Type":["نŮŘą"],"Orphaned content":["Ů…Ř­ŘŞŮى خص بالايتام"],"Synonyms":["مرادŮات"],"Internal linking suggestions":["اقتراحات الربط الداخلية"],"Enter a related keyphrase to calculate the SEO score":["ادخل عبارة Ů…Ůتاحية ذات صلة لحساب نقاط SEO"],"Related keyphrase":["عبارة رئيسية ذات صلة"],"Add related keyphrase":["إدخال Ůلمات دليلية ذات صلة"],"Analysis results":["نتائج التحليل"],"Help on choosing the perfect keyphrase":["المساعدة ŮŮŠ اختيار اŮضل عبارة Ů…Ůتاحية"],"Help on keyphrase synonyms":["مساعدة ŮŮŠ مرادŮات العبارة المŮتاحية"],"Keyphrase":["العبارة الرئيسية"],"New URL: {{link}}%s{{/link}}":["URL جديد: {{link}}%s{{/link}}"],"Undo":["تراجع"],"Redirect created":["ŘŞŮ… انشاء التحŮŮŠŮ„"],"%s just created a redirect from the old URL to the new URL.":["%s ŘŞŮ… انشاء ŘŞŘ­ŮŮŠŮ„ من URL قديم الى URL جديد"],"Old URL: {{link}}%s{{/link}}":["URL قديم: {{link}}%s{{/link}}"],"Keyphrase synonyms":["مرادŮات الŮلمة الرئيسية"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["معاينة مشارŮŘ© Twitter"],"Adds a list of internal links to sibling pages which share the same parent.":["يضي٠قائمة بالارتباطات الداخلية لصŮحات المشابهة التي تشتر٠ŮŮŠ نŮŘł الأصل."],"siblings":["تشابه"],"sibling pages":["الصŮحات المشابهة"],"Adds a list of internal links to subpages of this page.":["اضاŮŘ© قائمة الرŮابط الداخلية للصŮحات الŮرعية لهذه الصŮŘ­Ř©."],"seo":["seo"],"subpages":["صŮŘ­Ř© Ůرعية"],"childpages":["الصŮحات الŮرعية"],"children":["ŘŁŮرع"],"internal linking":["الرŮابط الداخلية"],"site structure":["بنية المŮقع"],"We could not find any relevant articles on your website that you could link to from your post.":["لم نتمŮن من العثŮر على ŘŁŮŠ مقالات ذات صلة على Ů…Ůقع الŮيب الخاص ب٠Ůالتي ŮŠŮ…Ůن٠الارتباط بها من مقالتŮ."],"Load suggestions":["ŘŞŘ­Ů…ŮŠŮ„ اقتراحات"],"Refresh suggestions":["ŘŞŘ­ŘŻŮŠŘ« الاقتراحات"],"Write list…":["قائمة الŮتابة ..."],"Adds a list of links related to this page.":["يضي٠قائمة الرŮابط المتعلقة بهذه الصŮŘ­Ř©."],"related posts":["المقالات ذات الصلة"],"related pages":["الصŮحات ذات الصلة"],"Adds a table of contents to this page.":["يضي٠جدŮŮ„ المحتŮيات إلى هذه الصŮŘ­Ř©."],"links":["رŮابط"],"toc":["جدŮŮ„ المحتŮيات"],"Copy link":["نسخ الرابط"],"Copy link to suggested article: %s":["نسخ رابط المقالة المقترحة: %s"],"Add a title to your post for the best internal linking suggestions.":["أض٠عنŮانًا إلى مشارŮت٠للحصŮŮ„ على ŘŁŮضل اقتراحات الارتباط الداخلية."],"Add a metadescription to your post for the best internal linking suggestions.":["أض٠ŮصŮًا تعريŮيًا لمنشŮر٠للحصŮŮ„ على ŘŁŮضل اقتراحات الارتباط الداخلية"],"Add a title and a metadescription to your post for the best internal linking suggestions.":["أض٠عنŮانًا ŮŮصŮًا تعريŮيًا لمنشŮر٠للحصŮŮ„ على ŘŁŮضل اقتراحات الارتباط الداخلية."],"Also, add a title to your post for the best internal linking suggestions.":["أض٠أيضًا عنŮانًا إلى مشارŮت٠للحصŮŮ„ على ŘŁŮضل اقتراحات الارتباط الداخلية."],"Also, add a metadescription to your post for the best internal linking suggestions.":["أض٠أيضًا ŮصŮًا تعريŮيًا لمنشŮر٠للحصŮŮ„ على ŘŁŮضل اقتراحات الارتباط الداخلية."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["أض٠أيضًا عنŮانًا ŮŮصŮًا تعريŮيًا لمنشŮر٠للحصŮŮ„ على ŘŁŮضل اقتراحات الارتباط الداخلية"],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["بمجرد إضاŮŘ© نسخة ŘŁŮثر قليلاً ŘŚ سنقدم ل٠قائمة بالمحتŮى ذي الصلة هنا Ůالذي ŮŠŮ…Ůن٠الارتباط به ŮŮŠ منشŮرŮ."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["لتحسين هيŮŮ„ Ů…Ůقع٠، ضع ŮŮŠ اعتبار٠إنشاء رŮابط إلى منشŮرات أ٠صŮحات أخرى ذات صلة على Ů…Ůقع٠على الŮيب."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["يستغرق الأمر بضع Ř«Ůانٍ لتظهر ل٠قائمة بالمحتŮى ذي الصلة الذي ŮŠŮ…Ůن٠الارتباط به. سيتم عرض الاقتراحات هنا بمجرد الحصŮŮ„ عليها."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}} اقرأ دليلنا Ř­ŮŮ„ الربط الداخلي لتحسين محرŮات البحث {{/a}} لمعرŮŘ© المزيد."],"Copied!":["ŘŞŮ… النسخ!"],"Not supported!":["غير Ů…ŘŻŘąŮŮ…!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["هل تحاŮŮ„ استخدام جمل Ů…Ůاتيح متعددة ذات صلة؟ يجب علي٠إضاŮتهم بشŮŮ„ منŮصل"],"Your keyphrase is too long. It can be a maximum of 191 characters.":["العبارة الرئيسية الخاصة ب٠طŮيلة جدًا. ŮŠŮ…Ůن أن ŮŠŮŮن الحد الأقصى لعدد الأحر٠191 حرŮًا."],"Add as related keyphrase":["أض٠عبارة Ů…Ůتاح ذات صلة"],"Added!":["ŘŞŮ…ŘŞ اضاŮته!"],"Remove":["حذŮ"],"Table of contents":["جدŮŮ„ المحتŮيات"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["نحتاج إلى تحسين بيانات SEO ŮŮŠ Ů…Ůقع٠حتى نتمŮن من تقديم ŘŁŮضل %1$sربط للاقتراحات%2$s.\n%3$sابدأ تحسين بيانات SEO%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-bg_BG.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-bg_BG.json deleted file mode 100644 index 9cc948b5..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-bg_BG.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"bg"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["ЗавърŃих тази тренировка"],"Reset this workout":["ĐťŃлиране на тази тренировка"],"Well done!":["Отлична работа!"],"Add internal links towards your cornerstones":["Добавяне на вътреŃни връзки към ваŃите ключови текŃтове"],"Check the number of incoming internal links of your cornerstones":["Проверете броя на входящите вътреŃни връзки на ваŃите ключови текŃтове"],"Start: Choose your cornerstones!":["Започнете: Đзберете ключовите Ńи елементи!"],"The cornerstone approach":["Подходът крайъгълен камък"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Приключих тази Ńтъпка"],"Revise this step":["Преразгледайте тази Ńтъпка"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Не ŃŃпяхме да открием вътреŃни връзки във ваŃите Ńтраници. Đли вŃе още не Ńте добавили вътреŃни връзки към Ńъдържанието Ńи, или Yoast SEO не ги е индекŃирал. Можете да възложите на Yoast SEO да индекŃира връзките ви, като Ńтартирате оптимизацията на SEO данни в менюто SEO > ĐĐ˝ŃтрŃменти."],"Incoming links":["Входящи връзки"],"Edit to add link":["Редактирайте, за да добавите връзка"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Đ’ момента нямате Ńтатии, отбелязани като ключови. Когато маркирате Ńтатиите Ńи като ключови, те ще Ńе появят Ń‚ŃĐş."],"Focus keyphrase":["ФокŃŃираща ключова фраза"],"Article":["Статия"],"Readability score":["РезŃлтат за четливоŃŃ‚"],"SEO score":["SEO резŃлтат"],"Copy failed":["Копирането е неŃŃпеŃно"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Подобрете клаŃирането на вŃичките Ńи крайъгълни камъни Ń ĐżĐľĐĽĐľŃ‰Ń‚Đ° на тази %1$sтренировка Ńтъпка по Ńтъпка!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["НаŃтройки"],"OK":["OK"],"Close":["Затваряне"],"Type":["Тип"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Свързана ключова фраза"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Ключова Đ´Ńма"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["ПренаŃочване е Ńъздадено"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Копирано!"],"Not supported!":["Не Ńе поддържа!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Премахване"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-bn_BD.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-bn_BD.json deleted file mode 100644 index 1bbc2e51..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-bn_BD.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"bn_BD"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["বর্ণনামূলক লেখা"],"Show the descriptive text":["বর্ণনামূলক লেখা প্রদর্শন করŕ§ŕ¦¨"],"Show icon":["আইকন দেখান"],"Yoast Estimated Reading Time":["Yoast আনŕ§ŕ¦®ŕ¦ľŕ¦¨ŕ¦żŕ¦• পড়ার সময়"],"Shows an estimated reading time based on the content length.":["লেখার দŕ§ŕ¦°ŕ§Ťŕ¦ŕ§Ťŕ¦Żŕ§‡ŕ¦° ওপর ভিত্তি করে একটি আনŕ§ŕ¦®ŕ¦ľŕ¦¨ŕ¦żŕ¦• পড়ার সময় দেখান।"],"reading time":["পড়তে সময় লাগবে"],"content length":["লেখার দŕ§ŕ¦°ŕ§Ťŕ¦ŕ§Ťŕ¦Ż"],"Estimated reading time:":["আনŕ§ŕ¦®ŕ¦ľŕ¦¨ŕ¦żŕ¦• সময় লাগবে পড়তে:"],"minute":["মিনিট","মিনিট"],"Settings":["সেটিংস "],"OK":["ঠিক আছে"],"Close":["বন্ধ"],"Type":["প্রকার"],"Orphaned content":["সংযোগহীন লেখা"],"Synonyms":["সমার্থক শব্দ"],"Internal linking suggestions":["অভ্যন্তরীণ লিংক পরামর্শ"],"Enter a related keyphrase to calculate the SEO score":["এসইও স্কোর হিসাব করতে একটি প্রাসঙ্গিক কিফ্রেইজ দিন।"],"Related keyphrase":["প্রাসঙ্গিক মূলশব্দ"],"Add related keyphrase":["প্রাসঙ্গিক কিফ্রেইজ যŕ§ŕ¦•্ত করŕ§ŕ¦¨"],"Analysis results":["বিশ্লেষণের ফলাফল"],"Help on choosing the perfect keyphrase":["যথাযথ কিফ্রেইজ নির্ধারণ করতে সহায়তা করŕ§ŕ¦¨"],"Help on keyphrase synonyms":["মূলশব্দের সমার্থক শব্দের জন্য সহায়তা করŕ§ŕ¦¨"],"Keyphrase":["মূলশব্দ"],"New URL: {{link}}%s{{/link}}":["নতŕ§ŕ¦¨ ইউআরএল: {{link}}%s{{/link}}"],"Undo":["পূর্বাবস্থায় নিন"],"Redirect created":["পŕ§ŕ¦¨ŕ¦ŕ¦¨ŕ¦żŕ¦°ŕ§Ťŕ¦¦ŕ§‡ŕ¦¶ তŕ§ŕ¦°ŕ¦ż করা হয়েছে"],"%s just created a redirect from the old URL to the new URL.":["%s পŕ§ŕ¦°ŕ¦¨ŕ§‹ ইউআরএল থেকে নতŕ§ŕ¦¨ ইউআরএল-এর পŕ§ŕ¦¨ŕ¦ŕ¦¨ŕ¦żŕ¦°ŕ§Ťŕ¦¦ŕ§‡ŕ¦¶ তŕ§ŕ¦°ŕ¦ż করা হয়েছে।"],"Old URL: {{link}}%s{{/link}}":["পŕ§ŕ¦°ŕ¦¨ŕ§‹ ইউআরএল: {{link}}%s{{/link}}"],"Keyphrase synonyms":["মূলশব্দের সমার্থক শব্দসমূহ"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["সহযোগী পŕ§ŕ¦·ŕ§Ťŕ¦ ŕ¦ľŕ§ź অভ্যন্তরীণ সংযোগের একটি তালিকা যŕ§ŕ¦•্ত করŕ§ŕ¦¨ যেটি একই ধরনের বিষয় শেয়ার করবে।"],"siblings":["সহযোগী"],"sibling pages":["সহযোগী পŕ§ŕ¦·ŕ§Ťŕ¦ ŕ¦ľŕ¦¸ŕ¦®ŕ§‚হ"],"Adds a list of internal links to subpages of this page.":["এই পŕ§ŕ¦·ŕ§Ťŕ¦ ŕ¦ľŕ¦° উপপŕ§ŕ¦·ŕ§Ťŕ¦ ŕ¦ľŕ§ź অভ্যন্তরীণ সংযোগের একটি তালিকা যŕ§ŕ¦•্ত করŕ§ŕ¦¨ŕĄ¤"],"seo":["এসইও"],"subpages":["উপপŕ§ŕ¦·ŕ§Ťŕ¦ ŕ¦ľŕ¦¸ŕ¦®ŕ§‚হ"],"childpages":["চাইল্ডপŕ§ŕ¦·ŕ§Ťŕ¦ ŕ¦ľŕ¦¸ŕ¦®ŕ§‚হ"],"children":["শিশŕ§ŕ¦°ŕ¦ľ"],"internal linking":["অভ্যন্তরীণ সংযোগ"],"site structure":["সাইট কাঠামো"],"We could not find any relevant articles on your website that you could link to from your post.":["আমরা আপনার ওয়েবসাইটে এমন কোনো প্রাসঙ্গিক লেখা খŕ§ŕ¦ŕ¦śŕ§‡ পাইনি যা এই লেখায় লিংক হিসেবে ব্যবহার করা যায়।"],"Load suggestions":["পরামর্শসমূহ চালৠকরŕ§ŕ¦¨"],"Refresh suggestions":["পরামর্শসমূহ রিফ্রেশ করŕ§ŕ¦¨"],"Write list…":["তালিকা তŕ§ŕ¦°ŕ¦ż করŕ§ŕ¦¨..."],"Adds a list of links related to this page.":["এই পŕ§ŕ¦·ŕ§Ťŕ¦ ŕ¦ľŕ¦° সাথে সম্পর্কিত লিংকসমূহের তালিকা যোগ করŕ§ŕ¦¨ŕĄ¤"],"related posts":["এই সম্পর্কিত লেখাসমূহ"],"related pages":["এই সম্পর্কিত পŕ§ŕ¦·ŕ§Ťŕ¦ ŕ¦ľŕ¦¸ŕ¦®ŕ§‚হ"],"Adds a table of contents to this page.":["এই পŕ§ŕ¦·ŕ§Ťŕ¦ ŕ¦ľŕ§ź সূচিপত্র যোগ করŕ§ŕ¦¨ŕĄ¤"],"links":["লিংকসমূহ"],"toc":["টিওসি"],"Copy link":["লিংক কপি করŕ§ŕ¦¨"],"Copy link to suggested article: %s":["পরামর্শকŕ§ŕ¦¤ লেখায় সংযোগ কপি করŕ§ŕ¦¨: %s"],"Add a title to your post for the best internal linking suggestions.":["সবচেয়ে ভালো সংযোগ পরামর্শের জন্য আপনি একটি শিরোনাম আপনার লেখায় যŕ§ŕ¦•্ত করŕ§ŕ¦¨ŕĄ¤"],"Add a metadescription to your post for the best internal linking suggestions.":["সবচেয়ে ভালো সংযোগ পরামর্শের জন্য আপনি মেটাতথ্য আপনার লেখায় যŕ§ŕ¦•্ত করŕ§ŕ¦¨ŕĄ¤"],"Add a title and a metadescription to your post for the best internal linking suggestions.":["পাশাপাশি, সবচেয়ে ভালো সংযোগ পরামর্শের জন্য আপনি একটি শিরোনাম ও মেটাতথ্য আপনার লেখায় যŕ§ŕ¦•্ত করŕ§ŕ¦¨ŕĄ¤"],"Also, add a title to your post for the best internal linking suggestions.":["পাশাপাশি, সবচেয়ে ভালো সংযোগ পরামর্শের জন্য আপনি একটি শিরোনাম আপনার লেখায় যŕ§ŕ¦•্ত করŕ§ŕ¦¨ŕĄ¤"],"Also, add a metadescription to your post for the best internal linking suggestions.":["পাশাপাশি, সবচেয়ে ভালো সংযোগ পরামর্শের জন্য আপনি মেটাতথ্য আপনার লেখায় যŕ§ŕ¦•্ত করŕ§ŕ¦¨ŕĄ¤"],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["পাশাপাশি, সবচেয়ে ভালো সংযোগ পরামর্শের জন্য আপনি মেটাতথ্য আপনার লেখায় যŕ§ŕ¦•্ত করŕ§ŕ¦¨ŕĄ¤"],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["আপনি যদি আরও কিছৠঅংশ কপি করেন তাহলে আমরা এই লেখার সম্পর্কিত অন্যান্য লেখার তালিকা দিতে পারবো যা আপনি আপনার লেখায় যŕ§ŕ¦•্ত করতে পারবেন।"],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["আপনার ওয়েবসাইটের কাঠামোর উন্নতির জন্য আপনার ওয়েবসাইটের অন্যান্য প্রাসঙ্গিক লেখা বা পŕ§ŕ¦·ŕ§Ťŕ¦ ŕ¦ľŕ¦•ে সংযŕ§ŕ¦•্ত করŕ§ŕ¦¨ŕĄ¤"],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["আপনি যেখানে লিংক করেছেন সেখানে প্রাসঙ্গিক লেখার তালিকা দেখাতে কয়েক মিনিট সময় লাগতে পারে। যতো দ্রŕ§ŕ¦¤ সম্ভব সŕ§ŕ¦Şŕ¦ľŕ¦°ŕ¦żŕ¦¶ŕ¦—ŕ§ŕ¦˛ŕ§‹ এখানে দেখানো হবে। "],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["বিস্তারিত জানার জন্য {{a}}আমাদের এসইওর অভ্যন্তরীণ সংযোগ গাইডটি পড়ŕ§ŕ¦¨{{/a}}।"],"Copied!":["কপি করা হয়েছে!"],"Not supported!":["সমর্থন করে না!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["আপনি কি একাধিক প্রাসঙ্গিক কিফ্রেইজ ব্যবহার করতে চেষ্টা করছেন? সেগŕ§ŕ¦˛ŕ§‹ŕ¦•ে আলাদা আলাদা করে দেখাতে হবে।"],"Your keyphrase is too long. It can be a maximum of 191 characters.":["আপনার কিফ্রেইজ অনেক বড়। এটি সর্বোচ্চ ŕ§§ŕ§Żŕ§§ ক্যারেক্টার হবে।"],"Add as related keyphrase":["প্রাসঙ্গিক কিফ্রেইজ হিসেবে যŕ§ŕ¦•্ত করŕ§ŕ¦¨"],"Added!":["যŕ§ŕ¦•্ত করা হয়েছে!"],"Remove":["মŕ§ŕ¦›ŕ§ŕ¦¨"],"Table of contents":["সূচিপত্র"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["আপনাকে সর্বোচ্চটŕ§ŕ¦•ৠসহায়তা করতে আপনার সাইটের এসইও তথ্য অপটিমাইজ করতে হবে আমাদের। %1$sলিংকের সŕ§ŕ¦Şŕ¦ľŕ¦°ŕ¦żŕ¦¶%2$s।\n\n%3$sএসইও ডেটা অপটিমাইজেশন শŕ§ŕ¦°ŕ§ করŕ§ŕ¦¨%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ca.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ca.json deleted file mode 100644 index f774c679..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ca.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"ca"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Per accedir a aquesta funciĂł, necessiteu una subscripciĂł activa a %2$s i %3$s. %5$sActiveu la vostra subscripciĂł a %1$s%6$s o %7$sobtingueu una nova subscripciĂł %4$s%8$s. DesprĂ©s, actualitzeu aquesta pĂ gina perquè la caracterĂ­stica funcioni correctament, la qual cosa pot trigar fins a 30 segons."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["El generador de tĂ­tols d'IA requereix que l'anĂ lisi SEO estigui habilitat abans d'utilitzar-lo. Per activar-lo, navegueu a les %2$sfuncions del lloc a %1$s%3$s, habiliteu l'anĂ lisi SEO i feu clic a \"Desa els canvis\". Si l'anĂ lisi SEO estĂ  desactivat a travĂ©s del vostre perfil d'usuari, navegueu fins al vostre perfil i activeu-lo allĂ . Contacteu amb l'administrador si no teniu accĂ©s a aquests parĂ metres."],"Social share preview":["Vista prèvia de la comparticiĂł social"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Per a continuar utilitzant la caracterĂ­stica IA del Yoast, reduĂŻu la freqüència de les vostres peticions. El nostre %1$sarticle d'ajuda%2$s proporciona orientaciĂł sobre la planificaciĂł efectiva i l'ajust de les vostres peticions per a un flux de treball optimitzat."],"You've reached the Yoast AI rate limit.":["Heu arribat al lĂ­mit de la taxa d'intel·ligència artificial del Yoast."],"Allow":["Permet"],"Deny":["Denega"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Per veure aquest vĂ­deo, heu de permetre que %1$s carregui vĂ­deos incrustats de %2$s."],"Text generated by AI may be offensive or inaccurate.":["El text generat per la IA pot ser ofensiu o inexacte."],"(Opens in a new browser tab)":["(S'obre en una nova pestanya del navegador)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Accelereu el flux de treball amb IA generativa. Obteniu suggeriments de descripciĂł i tĂ­tol d'alta qualitat per a la vostra cerca i aparença social. %1$sMĂ©s informaciĂł%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Genera descripcions de tĂ­tols amb Yoast AI!"],"New to %1$s":["Nou a %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Aprovo les %1$sPolĂ­tiques de Servei%2$s %3$sPolĂ­tica de Privadesa%4$s del servei d'intel·ligència artificial de Yoast. Això inclou el consentiment per a la recopilaciĂł i l'Ăşs de dades per millorar l'experiència de l'usuari."],"Start generating":["Inicia la generaciĂł"],"Yes, revoke consent":["SĂ­, revoca el consentiment"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Revocant el vostre consentiment, ja no tindreu accĂ©s a les funcions d'IA del Yoast. Segur que voleu revocar el vostre consentiment?"],"Something went wrong, please try again later.":["Alguna cosa ha anat malament, torneu-ho a provar mĂ©s tard."],"Revoke AI consent":["Revoca el consentiment de la IA"],"Please enter a focus keyphrase first to use AI.":["Si us plau, primer introduĂŻu una frase clau per a utilitzar la IA."],"AI title generator":["Generador del tĂ­tol per IA"],"AI description generator":["Generador de la descripciĂł per IA"],"AI Twitter title generator":["Generador de tĂ­tols de Twitter per IA"],"AI Twitter description generator":["Generador de descripcions de Twitter per IA"],"AI social title generator":["Generador de tĂ­tols socials per IA"],"AI social description generator":["Generador de la descripciĂł social per IA"],"Twitter preview":["Vista prèvia del Twitter"],"Dismiss":["Descarta"],"Don’t show again":["No tornis a mostrar"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sRecomanaciĂł%2$s: Milloreu la precisiĂł dels tĂ­tols generats per IA escrivint mĂ©s contingut a la pĂ gina."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sRecomanaciĂł%2$s: Milloreu la precisiĂł de les descripcions d'IA generades escrivint mĂ©s contingut a la pĂ gina."],"Try again":["Prova de nou"],"Social preview":["PrevisualitzaciĂł social"],"Desktop result":["Resultat a l'escriptori"],"Mobile result":["Resultat al mòbil"],"Apply AI description":["Aplica la descripciĂł de la IA"],"Apply AI title":["Aplica el tĂ­tol de la IA"],"Next":["SegĂĽent"],"Previous":["Anterior"],"Generate 5 more":["Genera 5 mĂ©s"],"Google preview":["Vista prèvia del Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["A causa de les estrictes directrius ètiques de l'OpenAI i les %1$spolĂ­tiques d'Ăşs%2$s, no podem generar tĂ­tols SEO per a la vostra pĂ gina. Si teniu la intenciĂł d'utilitzar IA, eviteu l'Ăşs de contingut explĂ­cit, violent o sexualment explĂ­cit. %3$sLlegiu mĂ©s sobre com configurar la pĂ gina per assegurar-vos que obteniu els millors resultats amb la IA%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["A causa de les estrictes directrius ètiques de l'OpenAI i les %1$spolĂ­tiques d'Ăşs%2$s, no podem generar metadescripcions per a la vostra pĂ gina. Si teniu la intenciĂł d'utilitzar IA, eviteu l'Ăşs de contingut explĂ­cit, violent o sexualment explĂ­cit. %3$sLlegiu mĂ©s sobre com configurar la pĂ gina per assegurar-vos que obteniu els millors resultats amb la IA%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Per accedir a aquesta funciĂł, necessiteu una subscripciĂł activa %1$s. %3$sactiveu la vostra subscripciĂł a %2$s%4$s o %5$sobtingueu una nova subscripciĂł %1$s%6$s. DesprĂ©s, feu clic al botĂł per actualitzar aquesta pĂ gina perquè la caracterĂ­stica funcioni correctament, el qual pot trigar fins a 30 segons."],"Refresh page":["Actualitza la pĂ gina"],"Not enough content":["No hi ha prou contingut"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Torneu-ho a provar mĂ©s tard. Si la incidència persisteix, %1$scontacteu el nostre equip de suport%2$s!"],"Something went wrong":["Alguna cosa ha anat malament"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Sembla que s'ha esgotat el temps d'espera de la connexiĂł. Comproveu la connexiĂł a Internet i torneu-ho a provar mĂ©s tard. Si la incidència persisteix, %1$scontacteu el nostre equip de suport%2$s"],"Connection timeout":["Temps d'espera de la connexiĂł"],"Use AI":["Utilitza la IA"],"Close modal":["Tanca la finestra"],"Learn more about AI (Opens in a new browser tab)":["MĂ©s informaciĂł sobre la IA (s'obre en una pestanya nova del navegador)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTĂ­tol%3$s: La pĂ gina encara no tĂ© tĂ­tol. %2$sAfegiu-ne un%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTĂ­tol%2$s: La pĂ gina tĂ© tĂ­tol. Ben fet!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sDistribuciĂł de la frase clau%3$s %2$sIncloeu la vostra frase clau o sinònims al text de manera que puguem comprovar la distribuciĂł de frases clau%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sDistribuciĂł de la frase clau%2$s: bona feina!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuciĂł de la frase clau%3$s: Desigual. Algunes parts del text no contenen la frase clau ni els seus sinònims. %2$sDistribuĂŻu-los de manera mĂ©s uniforme%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuciĂł de frases clau%3$s: Molt desigual. Grans parts del text no contenen la frase clau o els seus sinònims. %2$sDistribuĂŻu-les de manera mĂ©s uniforme%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: No utilitzeu massa paraules complexes, el qual facilita la lectura del text. Bona feina!"],"Word complexity":["Complexitat de les paraules"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s de les paraules del text es consideren complexes. %3$sFeu servir paraules mĂ©s curtes i familiars per millorar la llegibilitat%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sAlineament%3$s: Hi ha una secciĂł llarga amb text centrat. %2$sRecomanem alinear-lo a l'esquerra%3$s.","%1$sAlineament%3$s: Hi ha %4$s seccions llargues amb text centrat. %2$sRecomanem alinear-lo a l'esquerra%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sAlineament%3$s: Hi ha una secciĂł llarga amb text centrat. %2$sRecomanem alinear-lo a la dreta%3$s.","%1$sAlineament%3$s: Hi ha %4$s seccions llargues amb text centrat. %2$sRecomanem alinear-les a la dreta%3$s."],"Select image":["Seleccioneu una imatge"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["És l'hora d'afegir enllaços! Baix podeu veure una llista amb el contingut fonamental. Baix de cada peça de contingut, hi ha suggeriments per a articles dels quals podrĂ­eu afegir un enllaç. Quan l'afegiu, assegureu-vos de fer-ho en una frase rellevant a l'article fonamental. Continueu afegint enllaços des de tants articles relacionats com vulgueu, fins que els articles fonamentals tinguen la majoria d'enllaços interns apuntant a ells."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Alguns articles al vostre lloc web sĂłn %1$sels%2$smĂ©s importants. Responen a les preguntes de la gent i solucionen els seus problemes. Aleshores, mereixen estar ben posicionats! A %3$s, els anomenem articles fonamentals. Una de les maneres de posicionar-los Ă©s apuntar-los amb prou enllaços. MĂ©s enllaços indiquen als motors de cerca que els articles sĂłn importants i valuosos. En aquesta tasca, us ajudarem a afegir articles fonamentals."],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Quan afegiu una mica mĂ©s de contingut, serem capaços d'informar-vos del nivell de formalitat del text."],"Overall, your text appears to be %1$s%3$s%2$s.":["En resum, el text pareix %1$s%3$s%2$s."],"Heading %d":["Capçalera %d"],"Maximum heading level":["Nivell mĂ xim de capçalera"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Heu deshabilitat els suggeriments dels enllaços, que Ă©s necessari perquè funcionin els enllaços relacionats. Si voleu afegir enllaços relacionats, aneu a Funcionalitats del lloc i habiliteu els suggeriments d'enllaços."],"Schema":["Esquema"],"Meta tags":["Etiquetes meta"],"Not available":["No estĂ  disponible"],"Checks":["Comprovacions"],"Focus Keyphrase":["Frase clau objectiu"],"Good":["Bo"],"No index":["No index"],"Front-end SEO inspector":["Inspector SEO de la interfĂ­cie"],"Focus keyphrase not set":["No s'ha definit la frase clau objectiu"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Tingueu en compte: Perquè aquest entrenament funcioni bĂ©, heu d'executar l'eina d'optimitzaciĂł de dades SEO. Els administradors poden executar això sota %1$sSEO > Eines%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Heu afegit enllaços als vostres articles orfes i heu netejat els que no eren rellevants. Bona feina! Ara doneu ullada al resum que hi ha a continuaciĂł i celebra l'aconseguit!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Examineu de forma crĂ­tica el contingut d'aquesta llista i feu les actualitzacions necessĂ ries. Si necessiteu ajuda actualitzant, tenim una %1$sentrada al blog molt Ăştil que pot guiar-vos completament%2$s (feu clic per a obrir-lo en una pestanya nova)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNecessiteu mĂ©s orientaciĂł? Hem cobert cada pas amb mĂ©s detalls a la guia %2$sCom utilitzar %7$s per exercicis de contingut orfe%3$s%4$s%5$s%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Acabeu de fer el millor contingut fĂ cil de trobar, i mĂ©s probable d'indexar-se bĂ©! AixĂ­ Ă©s! De tant en tant, recordeu comprovar si el vostre contingut fonamental tĂ© prou enllaços!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Mireu la llista inferior. TĂ© el vostre contingut fonamental (marcat amb %1$s) la quantitat mĂ©s gran d'enllaços interns apuntant cap a ell? Feu clic al botĂł \"Optimitza\" si penseu que algun article necessita mĂ©s enllaços. Això mourĂ  l'article al pròxim pas."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Tenen la bombeta verda tots els articles de contingut fonamental? Per a obtenir els millors resultats, considereu editar els que no."],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Amb quins articles voleu situar-vos al mĂ©s alt? Quins sĂłn els que la vostra audiència trobarĂ  mĂ©s complets i Ăştils? Feu clic a la fletxa apuntant cap avall i cerqueu articles que encaixen amb eixe criteri. Marcarem automĂ ticament els articles que seleccioneu com a contingut fonamental."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNecessiteu mĂ©s ajuda? Hem cobert cada pas en mĂ©s detall a %2$sCom utilitzar l'exercici de contingut fonamental del %7$s%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["SubpĂ gines del Yoast"],"Yoast Siblings":["Germans del Yoast"],"Yoast Table of Contents":["Taula de continguts del Yoast"],"Yoast Related Links":["Enllaços relacionats del Yoast"],"Finish optimizing":["Acabeu l'optimitzaciĂł"],"You've finished adding links to this article.":["Heu acabat d'afegir enllaços a aquest article."],"Optimize":["Optimitza"],"Added to next step":["Afegit al segĂĽent pas"],"Choose cornerstone articles...":["Trieu els articles fonamentals..."],"Loading data...":["S'estan carregant les dades..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Encara no heu netejat ni actualitzat cap article utilitzant aquest resum. Un cop ho feu, apareixerĂ  un resum del vostre treball aquĂ­."],"Skipped":["Omesos"],"Hidden from search engines.":["Ocult dels motors de cerca."],"Removed":["Eliminada"],"Improved":["Millorat"],"Resolution":["ResoluciĂł"],"Loading redirect options...":["S'estan carregant les opcions de redirecciĂł..."],"Remove and redirect":["Suprimeix i redirecciona"],"Custom url:":["URL personalitzat:"],"Related article:":["Article relacionat:"],"Home page:":["PĂ gina d'inici:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Esteu a punt d'eliminar %1$s%2$s%3$s. Per evitar 404 al vostre lloc, heu de redirigir-lo a una altra pĂ gina. On voleu redirigir-la?"],"SEO Workout: Remove article":["Treball SEO: Elimina l'article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Tot estĂ  molt bĂ©! No hem trobat cap article al vostre lloc que tingui mĂ©s de sis mesos i que rebi massa pocs enllaços. Torneu aquĂ­ mĂ©s tard per a obtenir suggeriments de neteja nous!"],"Hide from search engines":["Oculta dels motors de cerca"],"Improve":["Millora"],"Are you sure you wish to hide this article from search engines?":["Esteu segur que voleu amagar aquest article dels motors de cerca?"],"Action":["AcciĂł"],"You've hidden this article from search engines.":["Heu amagat aquest article als motors de cerca."],"You've removed this article.":["Heu eliminat aquest article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Actualment no heu seleccionat cap article per millorar. Seleccioneu alguns articles orfes en els passos anteriors per afegir enllaços i us mostrarem suggeriments d'enllaç aquĂ­."],"Loading link suggestions...":["S'estan carregant els suggeriments d'enllaços..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["No hem trobat cap suggeriment per a aquest article, però, per descomptat, encara podeu afegir enllaços a articles que penseu que estan relacionats."],"Skip":["Salta"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Encara no heu seleccionat cap article per a aquest pas. Pot fer-ho en el pas anterior."],"Is it up-to-date?":["EstĂ  actualitzat?"],"Last Updated":["Darrera actualitzaciĂł"],"You've moved this article to the next step.":["Heu mogut aquest article al segĂĽent pas."],"Unknown":["Desconegut"],"Clear summary":["Neteja el resum"],"Add internal links towards your orphaned articles.":["Afegiu enllaços interns als vostres articles orfes."],"Should you update your article?":["HaurĂ­eu d'actualitzar el vostre article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["El vostre lloc pot contenir molts continguts que s'han creat una vegada i mai s'han tornat a mirar des d'aquell moment. És important revisar-los i preguntar-vos si aquest contingut encara Ă©s rellevant per al vostre lloc. Hauria de millorar-la o eliminar-la?"],"Start: Love it or leave it?":["Comença: l'estimeu o l'abandoneu?"],"Clean up your unlinked content to make sure people can find it":["Neteja el contingut no enllaçat per assegurar-vos que la gent el pot trobar"],"I've finished this workout":["He acabat la feina"],"Reset this workout":["Restableix aquesta feina"],"Well done!":["Ben fet!"],"Add internal links towards your cornerstones":["Afegeix enllaços interns als articles fonamentals."],"Check the number of incoming internal links of your cornerstones":["Comproveu el nombre d'enllaços interns entrants als articles fonamentals"],"Start: Choose your cornerstones!":["Inici: Trieu el vostre contingut fonamental!"],"The cornerstone approach":["L'enfocament de la pedra angular"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Tingueu en compte: Perquè aquest entrenament funcioni bĂ© i per oferir-vos enllaçar suggeriments, heu d'executar l'eina d'optimitzaciĂł de dades SEO. Els administradors poden executar això sota %1$sSEO > Eines%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["He acabat aquest pas"],"Revise this step":["Revisa aquest pas"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["No hem pogut trobar enllaços interns a les vostres pĂ gines. O encara no heu afegit cap enllaç intern al vostre contingut, o Yoast SEO no els ha indexat. Podeu fer que Yoast SEO indexi els vostres enllaços executant l'optimitzaciĂł de dades SEO sota les SEO > Eines."],"Incoming links":["Enllaços entrants"],"Edit to add link":["Editeu per afegir un enllaç"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Actualment no teniu cap article marcat com a fonamental. Quan marqueu els articles com a contingut fonamental, es mostraran aquĂ­."],"Focus keyphrase":["Frase clau objectiu"],"Article":["Article"],"Readability score":["PuntuaciĂł de llegibilitat"],"SEO score":["PuntuaciĂł SEO"],"Copy failed":["La còpia ha fallat"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Millora la classificaciĂł per a tot el contingut fonamental mitjançant l'Ăşs d'aquest %1$stasca gradual!%2$s"],"Rank with articles you want to rank with":["Ordena amb articles amb els quals voleu classificar"],"Descriptive text":["Text descriptiu"],"Show the descriptive text":["Mostra el text descriptiu"],"Show icon":["Mostra la icona"],"Yoast Estimated Reading Time":["Temps de lectura estimat de Yoast"],"Shows an estimated reading time based on the content length.":["Mostra un temps de lectura estimat basat en la longitud del contingut."],"reading time":["temps de lectura"],"content length":["longitud del contingut"],"Estimated reading time:":["Temps de lectura estimat:"],"minute":["minut","minuts"],"Settings":["ParĂ metres"],"OK":["D'acord"],"Close":["Tanca"],"Type":["Tipus"],"Orphaned content":["Contingut orfe"],"Synonyms":["Sinònims"],"Internal linking suggestions":["suggeriments d'enllaços interns"],"Enter a related keyphrase to calculate the SEO score":["IntroduĂŻu una frase clau per a calcular la puntuaciĂł SEO"],"Related keyphrase":["Paraula clau relacionada"],"Add related keyphrase":["Afegeix una frase clau relacionada"],"Analysis results":["Resultats de l'anĂ lisi:"],"Help on choosing the perfect keyphrase":["Ajuda triant la frase clau perfecta"],"Help on keyphrase synonyms":["Ajuda amb els sinònims de frases clau"],"Keyphrase":["Frase clau"],"New URL: {{link}}%s{{/link}}":["URL nou:{{link}}%s{{/link}}"],"Undo":["DesfĂ©s"],"Redirect created":["S'ha creat una redirecciĂł"],"%s just created a redirect from the old URL to the new URL.":["%s acaba de crear una redirecciĂł des de l'URL vell cap a l'URL nou."],"Old URL: {{link}}%s{{/link}}":["URL vell: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Sinònims de frases clau"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["PrevisualitzaciĂł de la comparticiĂł a Twitter"],"Adds a list of internal links to sibling pages which share the same parent.":["Afegeix una llista d'enllaços interns a pĂ gines \"germanes\" que comparteixen la mateixa mare."],"siblings":["germans"],"sibling pages":["pĂ gines germanes"],"Adds a list of internal links to subpages of this page.":["Afegeix una llista d'enllaços interns a les subpĂ gines d'aquesta pĂ gina."],"seo":["seo"],"subpages":["subpĂ gines"],"childpages":["pĂ gines filles"],"children":["fills"],"internal linking":["enllaç intern"],"site structure":["estructura del lloc"],"We could not find any relevant articles on your website that you could link to from your post.":["No hem pogut trobar cap article rellevant a la pĂ gina web que pugui enllaçar des de l'entrada."],"Load suggestions":["Carrega els suggeriments"],"Refresh suggestions":["Refresca els suggeriments"],"Write list…":["Escriviu la llista..."],"Adds a list of links related to this page.":["Afegeix una llista d'enllaços relacionats amb aquesta pĂ gina."],"related posts":["entrades relacionades"],"related pages":["pĂ gines relacionades"],"Adds a table of contents to this page.":["Afegeix una taula de continguts a aquesta pĂ gina."],"links":["enllaços"],"toc":["taula de continguts"],"Copy link":["Copia l'enllaç"],"Copy link to suggested article: %s":["Copia l'enllaç a l'article suggerit: %s"],"Add a title to your post for the best internal linking suggestions.":["Afegiu un tĂ­tol a la vostra entrada per als millors suggeriments d'enllaços interns."],"Add a metadescription to your post for the best internal linking suggestions.":["Afegiu una descripciĂł de la vostra entrada per als millors suggeriments d'enllaços interns."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Afegiu un tĂ­tol i una descripciĂł de la vostra entrada per als millors suggeriments d'enllaços interns."],"Also, add a title to your post for the best internal linking suggestions.":["A mĂ©s, afegiu un tĂ­tol a la vostra entrada per als millors suggeriments d'enllaços interns."],"Also, add a metadescription to your post for the best internal linking suggestions.":["A mĂ©s, afegiu una descripciĂł de la vostra entrada per als millors suggeriments d'enllaços interns."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["A mĂ©s, afegiu un tĂ­tol i una descripciĂł de la vostra entrada per als millors suggeriments d'enllaços interns."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Una vegada afegiu una mica mĂ©s de text, us donarem una llista de continguts relacionats als quals podeu enllaçar a la vostra entrada."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Per millorar l'estructura del vostre lloc web, considereu enllaçar altres entrades o pĂ gines rellevants."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Tarda uns pocs segons a mostrar-vos una llista de contingut relacionat que podrĂ­eu enllaçar. Els suggeriments es mostraran aquĂ­ tan aviat com els tinguem."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Llegiu la nostra guia sobre els enllaços interns per a SEO{{/a}} per aprendre mĂ©s."],"Copied!":["S'ha copiat!"],"Not supported!":["No Ă©s compatible!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Esteu intentant utilitzar mĂşltiples frases clau relacionades? Heu d'afegir-les per separat."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["La frase clau Ă©s massa llarga. NomĂ©s pot tenir fins a 191 carĂ cters."],"Add as related keyphrase":["Afegeix com a frase clau relacionada"],"Added!":["S'ha afegit!"],"Remove":["Elimina"],"Table of contents":["Taula de continguts"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Hem d'optimitzar les dades SEO del vostre lloc web per poder oferir-vos els millors %1$ssuggeriments d'enllaços%2$s. %3$sComença l'optimitzaciĂł de dades SEO%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-cs_CZ.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-cs_CZ.json deleted file mode 100644 index bc34bb89..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-cs_CZ.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;","lang":"cs_CZ"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Pro přístup k tĂ©to funkci potĹ™ebujete aktivnĂ­ pĹ™edplatnĂ© %2$s a %3$s. ProsĂ­m %5$saktivujte si pĹ™edplatnĂ© v %1$s%6$s nebo %7$szĂ­skejte novĂ© %4$s%8$s. PotĂ© obnovte tuto stránku, aby funkce správnÄ› fungovala, coĹľ mĹŻĹľe trvat aĹľ 30 sekund."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["Generátor názvĹŻ AI vyĹľaduje, aby byla pĹ™ed pouĹľitĂ­m povolena analĂ˝za SEO. Chcete-li ji povolit, pĹ™ejdÄ›te do %2$sFunkce stránky %1$s%3$s, zapnÄ›te SEO analĂ˝zu a kliknÄ›te na tlaÄŤĂ­tko \"UloĹľit zmÄ›ny\". Pokud je SEO analĂ˝za ve vašem uĹľivatelskĂ©m profilu ve WordPressu zakázána, pĹ™istupte do svĂ©ho profilu a povolte ji tam. Pokud nemáte přístup k tÄ›mto nastavenĂ­m, obraĹĄte se na svĂ©ho správce."],"Social share preview":["Náhled sdĂ­lenĂ­ v sociálnĂ­ch sĂ­tĂ­ch"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Chcete-li funkci Yoast AI používat i nadále, sniĹľte frekvenci svĂ˝ch poĹľadavkĹŻ. Náš ÄŤlánek %1$sposkytuje návod%2$s, jak efektivnÄ› plánovat a rozvrhovat poĹľadavky pro optimalizaci pracovnĂ­ho postupu."],"You've reached the Yoast AI rate limit.":["Dosáhli jste limitu rychlosti Yoast AI."],"Allow":["Povolit"],"Deny":["OdmĂ­tnout"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Chcete-li zobrazit toto video, musĂ­te povolit %1$s naÄŤĂ­tat vloĹľená videa z %2$s."],"Text generated by AI may be offensive or inaccurate.":["Text generovanĂ˝ AI mĹŻĹľe bĂ˝t urážlivĂ˝ nebo nepĹ™esnĂ˝."],"(Opens in a new browser tab)":["(OtevĹ™enĂ­ v novĂ© záloĹľce)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Zrychlete svĹŻj pracovnĂ­ postup pomocĂ­ generativnĂ­ AI. ZĂ­skejte vysoce kvalitnĂ­ návrhy názvĹŻ a popisĹŻ pro vyhledávánĂ­ a vzhled na sociálnĂ­ch sĂ­tĂ­ch. %1$sZjistÄ›te vĂ­ce%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Generujte názvy a popisy pomocĂ­ Yoast AI!"],"New to %1$s":["Novinka na %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["SouhlasĂ­m s %1$spodmĂ­nky sluĹľby%2$s & %3$szásady ochrany osobnĂ­ch ĂşdajĹŻ%4$s sluĹľby Yoast AI. To zahrnuje souhlas se shromažďovánĂ­m a používánĂ­m ĂşdajĹŻ za účelem zlepšenĂ­ uĹľivatelskĂ©ho komfortu."],"Start generating":["ZaÄŤnÄ›te generovat"],"Yes, revoke consent":["Ano, odvolánĂ­ souhlasu"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["OdvolánĂ­m souhlasu jiĹľ nebudete mĂ­t přístup k funkcĂ­m Yoast AI. Jste si jisti, Ĺľe chcete svĹŻj souhlas odvolat?"],"Something went wrong, please try again later.":["NÄ›co se pokazilo, zkuste to pozdÄ›ji."],"Revoke AI consent":["OdvolánĂ­ souhlasu AI"],"Please enter a focus keyphrase first to use AI.":["Chcete-li použít AI, zadejte nejprve klĂ­ÄŤovou frázi."],"AI title generator":["Generátor názvĹŻ AI"],"AI description generator":["Generátor popisu AI"],"AI Twitter title generator":["Generátor AI názvĹŻ na Twitteru"],"AI Twitter description generator":["Generátor AI popisĹŻ na Twitteru"],"AI social title generator":["Generátor sociálnĂ­ch názvĹŻ pĹ™es AI"],"AI social description generator":["Generátor sociálnĂ­ch popisĹŻ pĹ™es AI"],"Twitter preview":["Náhled na Twitteru"],"Dismiss":["Zavřít"],"Don’t show again":["Znovu se neukázat"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sTip%2$s: Zlepšete pĹ™esnost vygenerovanĂ˝ch názvĹŻ AI tĂ­m, Ĺľe na stránku napíšete vĂ­ce obsahu."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sTip%2$s: Zlepšete pĹ™esnost vygenerovanĂ˝ch popisĹŻ AI tĂ­m, Ĺľe na stránku napíšete vĂ­ce obsahu."],"Try again":["Zkus to znovu"],"Social preview":["SociálnĂ­ náhled"],"Desktop result":["na poÄŤĂ­taÄŤi"],"Mobile result":["na mobilu"],"Apply AI description":["Použít popis AI"],"Apply AI title":["Použít název AI"],"Next":["Další"],"Previous":["PĹ™edchozĂ­"],"Generate 5 more":["VytvoĹ™it dalších 5"],"Google preview":["Náhled příspÄ›vku v Googlu"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Vzhledem k přísnĂ˝m etickĂ˝m pravidlĹŻm a zásadám %1$spoužívánĂ­%2$s agentury OpenAI nemĹŻĹľeme pro vaši stránku generovat SEO titulky. Pokud máte v Ăşmyslu používat UI, vyvarujte se používánĂ­ explicitnĂ­ho, násilnĂ©ho nebo sexuálnÄ› explicitnĂ­ho obsahu. %3$sPĹ™eÄŤtÄ›te si další informace o tom, jak stránku nakonfigurovat, abyste s AI%4$s dosáhli co nejlepších vĂ˝sledkĹŻ."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Vzhledem k přísnĂ˝m etickĂ˝m pravidlĹŻm a zásadám %1$spoužívánĂ­%2$s agentury OpenAI nemĹŻĹľeme generovat meta popisy pro vaši stránku. Pokud máte v Ăşmyslu používat UI, vyvarujte se používánĂ­ explicitnĂ­ho, násilnĂ©ho nebo sexuálnÄ› explicitnĂ­ho obsahu. %3$sPĹ™eÄŤtÄ›te si další informace o tom, jak stránku nakonfigurovat, abyste s AI%4$s dosáhli co nejlepších vĂ˝sledkĹŻ."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Pro přístup k tĂ©to funkci potĹ™ebujete aktivnĂ­ pĹ™edplatnĂ© %1$s. ProsĂ­m %3$saktivujte svĂ© pĹ™edplatnĂ© v %2$s%4$s nebo %5$szĂ­skejte novĂ© pĹ™edplatnĂ© %1$s%6$s. PotĂ© kliknÄ›te na tlaÄŤĂ­tko pro obnovenĂ­ tĂ©to stránky, aby funkce správnÄ› fungovala, coĹľ mĹŻĹľe trvat aĹľ 30 sekund."],"Refresh page":["Obnovit stránku"],"Not enough content":["NedostateÄŤnĂ˝ obsah"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Zkuste to pozdÄ›ji. Pokud problĂ©m pĹ™etrvává, %1$skontaktujte náš tĂ˝m podpory%2$s!"],"Something went wrong":["NÄ›co se pokazilo"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Zdá se, Ĺľe došlo k ÄŤasovĂ©mu limitu pĹ™ipojenĂ­. Zkontrolujte svĂ© internetovĂ© pĹ™ipojenĂ­ a zkuste to pozdÄ›ji. Pokud problĂ©m pĹ™etrvává, %1$skontaktujte náš tĂ˝m podpory%2$s"],"Connection timeout":["ÄŚasovĂ˝ limit pĹ™ipojenĂ­"],"Use AI":["Použít umÄ›lou inteligneci"],"Close modal":["Zavřít modálnĂ­"],"Learn more about AI (Opens in a new browser tab)":["Další informace o AI (OtevĹ™e se v novĂ© záloĹľce prohlĂ­ĹľeÄŤe)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sNázev%3$s: Vaše stránka zatĂ­m nemá název. %2$sPĹ™idejte%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sNázev%2$s: Vaše stránka má název. Dobrá práce!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sVĂ˝skyt klĂ­ÄŤovĂ˝ch frázĂ­%3$s: %2$sVloĹľte vaše klĂ­ÄŤovĂ© fráze nebo synonyma do textu abychom mohli zkontrolovat ÄŤetnost vĂ˝skytu fráze%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sRozmĂ­stÄ›nĂ­ klĂ­ÄŤovĂ© fráze%2$s: Dobrá práce!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sRozmĂ­stÄ›nĂ­ klĂ­ÄŤovĂ© fráze%3$s: NerovnomÄ›rnĂ©. NÄ›kterĂ© části textu neobsahujĂ­ klĂ­ÄŤová slova nebo jejich synonyma. %2$sRozmĂ­stÄ›te je rovnomÄ›rnÄ›ji%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sRozmĂ­stÄ›nĂ­ klĂ­ÄŤovĂ© fráze%3$s: Velmi nerovnomÄ›rnĂ©. VelkĂ© části textu neobsahujĂ­ klĂ­ÄŤová slova nebo jejich synonyma. %2$sRozmĂ­stÄ›te je rovnomÄ›rnÄ›ji%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: Nepoužíváte příliš mnoho sloĹľitĂ˝ch slov, coĹľ usnadĹuje ÄŤtenĂ­ textu. Dobrá práce!"],"Word complexity":["SlovnĂ­ sloĹľitost"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s slov ve vašem textu jsou povaĹľována za sloĹľitá. %3$sZkuste používat kratší a známÄ›jší slova ke zlepšenĂ­ ÄŤitelnosti%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sZarovnánĂ­%3$s: Je zde dlouhĂ˝ Ăşsek textu zarovnanĂ©ho na stĹ™ed. %2$sDoporuÄŤujeme zarovnat vlevo%3$s.","%1$sZarovnánĂ­%3$s: Jsou zde %4$s dlouhĂ© Ăşseky textu zarovnanĂ© na stĹ™ed. %2$sDoporuÄŤujeme je zarovnat vlevo%3$s.","%1$sZarovnánĂ­%3$s: Jsou zde %4$s dlouhĂ© Ăşseky textu zarovnanĂ© na stĹ™ed. %2$sDoporuÄŤujeme je zarovnat vlevo%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sZarovnánĂ­%3$s: Je zde dlouhĂ˝ Ăşsek textu zarovnanĂ©ho na stĹ™ed. %2$sDoporuÄŤujeme jej zarovnat doprava%3$s.","%1$sZarovnánĂ­%3$s: Jsou zde %4$s dlouhĂ© Ăşseky textu zarovnanĂ© na stĹ™ed. %2$sDoporuÄŤujeme je zarovnat doprava%3$s.","%1$sZarovnánĂ­%3$s: Jsou zde %4$s dlouhĂ© Ăşseky textu zarovnanĂ© na stĹ™ed. %2$sDoporuÄŤujeme je zarovnat doprava%3$s."],"Select image":["Vybrat obrázek"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Je ÄŤas pĹ™idat nÄ›jakĂ© odkazy! NĂ­Ĺľe vidĂ­te seznam s vašimi základnĂ­mi kameny. Pod kaĹľdĂ˝m základnĂ­m kamenem jsou uvedeny návrhy ÄŤlánkĹŻ, ze kterĂ˝ch byste mohli pĹ™idat odkaz. PĹ™i pĹ™idávánĂ­ odkazu se ujistÄ›te, Ĺľe jste ho vloĹľili do relevantnĂ­ vÄ›ty vztahujĂ­cĂ­ se k vašemu stěžejnĂ­mu ÄŤlánku. PĹ™idávejte odkazy z tolika souvisejĂ­cĂ­ch ÄŤlánkĹŻ, kolik potĹ™ebujete, dokud na vaše základnĂ­ kameny nebude směřovat co nejvĂ­ce internĂ­ch odkazĹŻ."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["NÄ›kterĂ© ÄŤlánky na vašem webu jsou %1$snejdĹŻleĹľitÄ›jší%2$s. OdpovĂ­dajĂ­ lidem na otázky a Ĺ™eší jejich problĂ©my. TakĹľe si zaslouží hodnocenĂ­! V %3$s nazĂ˝váme tyto základnĂ­ ÄŤlánky. JednĂ­m ze zpĹŻsobĹŻ, jak je zaĹ™adit, je umĂ­stit na nÄ› dostatek odkazĹŻ. VĂ­ce odkazĹŻ signalizuje vyhledávaÄŤĹŻm, Ĺľe tyto ÄŤlánky jsou dĹŻleĹľitĂ© a cennĂ©. V tomto cviÄŤenĂ­ vám pomĹŻĹľeme pĹ™idat odkazy na vaše základnĂ­ ÄŤlánky!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Jakmile pĹ™idáte trochu vĂ­ce kopiĂ­, budeme schopni urÄŤit ĂşroveĹ formálnosti vašeho textu."],"Overall, your text appears to be %1$s%3$s%2$s.":["CelkovÄ› váš text vypadá jako %1$s%3$s%2$s."],"Heading %d":["Nadpis %d"],"Maximum heading level":["MaximálnĂ­ ĂşroveĹ smÄ›ru"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Máte zakázanĂ© návrhy odkazĹŻ, kterĂ© jsou nutnĂ© pro fungovánĂ­ SouvisejĂ­cĂ­ch odkazĹŻ. Pokud chcete pĹ™idat SouvisejĂ­cĂ­ odkazy, pĹ™ejdÄ›te na Funkce webu a povolte Návrhy odkazĹŻ."],"Schema":["SchĂ©ma"],"Meta tags":["Meta štĂ­tky"],"Not available":["NenĂ­ dostupnĂ˝"],"Checks":["Kontroly"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["DobrĂ©"],"No index":["ŽádnĂ˝ index"],"Front-end SEO inspector":["Front-end SEO inspektor"],"Focus keyphrase not set":["KlĂ­ÄŤová fráze ostĹ™enĂ­ nenĂ­ nastavena"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Poznámka: Aby toto cviÄŤenĂ­ dobĹ™e fungovalo, musĂ­te spustit nástroj pro optimalizaci dat SEO. Správci to mohou spustit pod %1$sSEO > Nástroje%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["PĹ™idali jste odkazy na svĂ© osiĹ™elĂ© ÄŤlánky a vyÄŤistili jste ty, kterĂ© jiĹľ nebyly relevantnĂ­. Dobrá práce! PodĂ­vejte se na shrnutĂ­ nĂ­Ĺľe a oslavte, co jste dokázali!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Kriticky prozkoumejte obsah tohoto seznamu a proveÄŹte potĹ™ebnĂ© aktualizace. Pokud potĹ™ebujete pomoc s aktualizacĂ­, máme velmi %1$suĹľiteÄŤnĂ˝ blogovĂ˝ příspÄ›vek, kterĂ˝ vás mĹŻĹľe vĂ©st %2$s (kliknutĂ­m otevĹ™ete na novĂ© kartÄ›)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sPotĹ™ebujete další pokyny? KaĹľdĂ˝ krok jsme podrobnÄ›ji probrali v následujĂ­cĂ­m prĹŻvodci: %2$sJak používat %7$s cviÄŤenĂ­ se osiĹ™elĂ˝m obsahem%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["PrávÄ› jste usnadnili nalezenĂ­ svĂ©ho nejlepšího obsahu a s vyšší pravdÄ›podobnostĂ­ hodnocenĂ­! Dobrá práce! ÄŚas od ÄŤasu nezapomeĹte zkontrolovat, zda vaše základnĂ­ kameny dostávajĂ­ dostatek odkazĹŻ!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["PodĂ­vejte se na nĂ­Ĺľe uvedenĂ˝ seznam. MajĂ­ vaše základnĂ­ kameny (oznaÄŤenĂ© %1$s) nejvĂ­ce internĂ­ch odkazĹŻ, kterĂ© na nÄ› směřujĂ­? Pokud si myslĂ­te, Ĺľe základnĂ­ kámen potĹ™ebuje vĂ­ce odkazĹŻ, kliknÄ›te na tlaÄŤĂ­tko Optimalizovat. TĂ­m se ÄŤlánek posune k dalšímu kroku."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["MajĂ­ všechny vaše základnĂ­ kameny zelenĂ© odrážky? Pro dosaĹľenĂ­ nejlepších vĂ˝sledkĹŻ zvaĹľte Ăşpravu tÄ›ch, kterĂ© ne!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["KterĂ© ÄŤlánky chcete umĂ­stit nejvýše? KterĂ© z nich by vaše publikum povaĹľovalo za nejuĹľiteÄŤnÄ›jší a nejĂşplnÄ›jší? KliknÄ›te na šipku směřujĂ­cĂ­ dolĹŻ a vyhledejte ÄŤlánky, kterĂ© splĹujĂ­ tato kritĂ©ria. ÄŚlánky, kterĂ© vyberete ze seznamu, automaticky oznaÄŤĂ­me jako základnĂ­ kámen."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sPotĹ™ebujete další pokyny? KaĹľdĂ˝ krok jsme podrobnÄ›ji probrali v: %2$sJak používat základnĂ­ cviÄŤenĂ­ %7$s%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Podstránky Yoast"],"Yoast Siblings":["Sourozenci Yoastovi"],"Yoast Table of Contents":["Obsah Yoast"],"Yoast Related Links":["Yoast souvisejĂ­cĂ­ odkazy"],"Finish optimizing":["DokonÄŤete optimalizaci"],"You've finished adding links to this article.":["DokonÄŤili jste pĹ™idávánĂ­ odkazĹŻ do tohoto ÄŤlánku."],"Optimize":["Optimalizovat"],"Added to next step":["PĹ™idáno k dalšímu kroku"],"Choose cornerstone articles...":["Vyberte základnĂ­ ÄŤlánky..."],"Loading data...":["NaÄŤĂ­tánĂ­ dat..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["TĂ­mto cviÄŤenĂ­m jste zatĂ­m nevyÄŤistili ani neaktualizovali žádnĂ© ÄŤlánky. Jakmile to udÄ›láte, zobrazĂ­ se zde souhrn vaší práce."],"Skipped":["PĹ™eskoÄŤeno"],"Hidden from search engines.":["SkrytĂ© pĹ™ed vyhledávaÄŤi."],"Removed":["OdstranÄ›no"],"Improved":["Vylepšeno"],"Resolution":["ĹešenĂ­"],"Loading redirect options...":["NaÄŤĂ­tánĂ­ moĹľnostĂ­ pĹ™esmÄ›rovánĂ­..."],"Remove and redirect":["Odebrat a pĹ™esmÄ›rovat"],"Custom url:":["VlastnĂ­ adresa URL:"],"Related article:":["SouvisejĂ­cĂ­ ÄŤlánek:"],"Home page:":["Domovská stránka:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Chystáte se odebrat %1$s%2$s%3$s. Chcete -li zabránit 404 na vašem webu, mÄ›li byste jej pĹ™esmÄ›rovat na jinou stránku na vašem webu. Kam byste jej chtÄ›li pĹ™esmÄ›rovat?"],"SEO Workout: Remove article":["SEO cviÄŤenĂ­: Odstranit ÄŤlánek"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Všechno vypadá dobĹ™e! Na vašem webu jsme nenašli žádnĂ© ÄŤlánky starší neĹľ šest mÄ›sĂ­cĹŻ a neobdrĹľelo na váš web příliš málo odkazĹŻ. VraĹĄte se sem pozdÄ›ji a zĂ­skejte novĂ© návrhy na vyÄŤištÄ›nĂ­!"],"Hide from search engines":["SkrĂ˝t pĹ™ed vyhledávaÄŤi"],"Improve":["Zlepšit"],"Are you sure you wish to hide this article from search engines?":["Opravdu chcete skrĂ˝t tento ÄŤlánek pĹ™ed vyhledávaÄŤi?"],"Action":["Akce"],"You've hidden this article from search engines.":["Tento ÄŤlánek jste skryli pĹ™ed vyhledávaÄŤi."],"You've removed this article.":["Tento ÄŤlánek jste odstranili."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["AktuálnÄ› jste nevybrali žádnĂ© ÄŤlánky ke zlepšenĂ­. Vyberte nÄ›kolik osiĹ™elĂ˝ch ÄŤlánkĹŻ v pĹ™edchozĂ­ch krocĂ­ch, na kterĂ© chcete pĹ™idat odkazy, a my vám zde ukážeme návrhy odkazĹŻ."],"Loading link suggestions...":["NaÄŤĂ­tánĂ­ návrhĹŻ odkazĹŻ..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["K tomuto ÄŤlánku jsme nenašli žádnĂ© návrhy, ale samozĹ™ejmÄ› stále mĹŻĹľete pĹ™idávat odkazy na ÄŤlánky, kterĂ© si myslĂ­te, Ĺľe spolu souvisejĂ­."],"Skip":["PĹ™eskoÄŤit"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Pro tento krok jste ještÄ› nevybrali žádnĂ© ÄŤlánky. MĹŻĹľete to udÄ›lat v pĹ™edchozĂ­m kroku."],"Is it up-to-date?":["Je to aktuálnĂ­?"],"Last Updated":["Naposledy aktualizováno"],"You've moved this article to the next step.":["Tento ÄŤlánek jste pĹ™esunuli na další krok."],"Unknown":["NeznámĂ©"],"Clear summary":["JasnĂ© shrnutĂ­"],"Add internal links towards your orphaned articles.":["PĹ™idejte do svĂ˝ch osiĹ™elĂ˝ch ÄŤlánkĹŻ internĂ­ odkazy."],"Should you update your article?":["MÄ›li byste svĹŻj ÄŤlánek aktualizovat?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Váš web ÄŤasto obsahuje spoustu obsahu, kterĂ˝ je vytvoĹ™en jednou a na kterĂ˝ se jiĹľ potom nikdo neohlíží. Je dĹŻleĹľitĂ© si je projĂ­t a poloĹľit si otázku, zda je tento obsah pro váš web stále relevantnĂ­. Mám to vylepšit nebo odstranit?"],"Start: Love it or leave it?":["ZaÄŤĂ­t: Milujete to, nebo toho necháte?"],"Clean up your unlinked content to make sure people can find it":["VyÄŤistÄ›te svĹŻj nepropojenĂ˝ obsah, aby jej lidĂ© mohli najĂ­t"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Resetujte toto cviÄŤenĂ­"],"Well done!":["VĂ˝bornÄ›!"],"Add internal links towards your cornerstones":["PĹ™idejte internĂ­ odkazy k základnĂ­m kamenĹŻm"],"Check the number of incoming internal links of your cornerstones":["Zkontrolujte poÄŤet příchozĂ­ch internĂ­ch odkazĹŻ vašich základnĂ­ch kamenĹŻ"],"Start: Choose your cornerstones!":["ZaÄŤnÄ›te: Vyberte si základnĂ­ kameny!"],"The cornerstone approach":["ZákladnĂ­ přístup"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["VezmÄ›te prosĂ­m na vÄ›domĂ­: Aby toto cviÄŤenĂ­ fungovalo dobĹ™e a aby vám nabĂ­dlo návrhy propojenĂ­, musĂ­te spustit nástroj pro optimalizaci dat SEO. Správci to mohou spustit v části %1$sSEO> Nástroje%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Tento krok jsem dokonÄŤil"],"Revise this step":["Zrevidujte tento krok"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["NepodaĹ™ilo se nám najĂ­t internĂ­ odkazy na vašich stránkách. BuÄŹ jste dosud nepĹ™idali žádnĂ© internĂ­ odkazy na svĹŻj obsah, nebo Yoast SEO je neindexoval. Yoast SEO mĹŻĹľete nechat indexovat svĂ© odkazy spuštÄ›nĂ­m optimalizace dat SEO v části SEO> Nástroje."],"Incoming links":["PříchozĂ­ odkazy"],"Edit to add link":["Upravit a pĹ™idat odkaz"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["MomentálnÄ› nemáte žádnĂ© ÄŤlánky oznaÄŤenĂ© jako základnĂ­ kámen. KdyĹľ svĂ© ÄŤlánky oznaÄŤĂ­te jako základnĂ­ kámen, zobrazĂ­ se zde."],"Focus keyphrase":["HlavnĂ­ klĂ­ÄŤovĂ© slovo"],"Article":["ÄŚlánek"],"Readability score":["SkĂłre ÄŤitelnosti"],"SEO score":["SEO skĂłre"],"Copy failed":["KopĂ­rovánĂ­ se nezdaĹ™ilo"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Vylepšete hodnocenĂ­ všech svĂ˝ch základnĂ­ch kamenĹŻ pomocĂ­ tohoto cviÄŤenĂ­ %1$skrok za krokem!%2$s"],"Rank with articles you want to rank with":["OhodnoĹĄte ÄŤlánky, kterĂ© chcete ohodnotit"],"Descriptive text":["Text popisu"],"Show the descriptive text":["Zobrazit text popisnĂ˝ text"],"Show icon":["Zobrazit ikonu"],"Yoast Estimated Reading Time":["PĹ™edpokládaná doba ÄŤtenĂ­"],"Shows an estimated reading time based on the content length.":["Zobrazuje odhadovanou dobu ÄŤtenĂ­ na základÄ› dĂ©lky obsahu."],"reading time":["ÄŤas na ÄŤtenĂ­"],"content length":["dĂ©lka obsahu"],"Estimated reading time:":["PĹ™edpokládaná doba ÄŤtenĂ­:"],"minute":["minuta","minuty","minut"],"Settings":["NastavenĂ­"],"OK":["OK"],"Close":["Zavřít"],"Type":["Typ"],"Orphaned content":["NepropojenĂ˝ obsah"],"Synonyms":["Synonyma"],"Internal linking suggestions":["Návrhy internĂ­ch odkazĹŻ"],"Enter a related keyphrase to calculate the SEO score":["Chcete-li vypoÄŤĂ­tat skĂłre SEO, zadejte souvisejĂ­cĂ­ klĂ­ÄŤovou frázi"],"Related keyphrase":["SouvisejĂ­cĂ­ klĂ­ÄŤová fráze"],"Add related keyphrase":["PĹ™idejte souvisĂ­cĂ­ klĂ­ÄŤovĂ© slovo/frázi"],"Analysis results":["VĂ˝sledky analĂ˝zy"],"Help on choosing the perfect keyphrase":["Pomoc pĹ™i hledánĂ­ tĂ© nejlepší klĂ­ÄŤovĂ© fráze"],"Help on keyphrase synonyms":["Pomoc pĹ™i hledánĂ­ synonym klĂ­ÄŤovĂ˝ch frázĂ­"],"Keyphrase":["KlĂ­ÄŤovĂ© slovo"],"New URL: {{link}}%s{{/link}}":["Nová URL: {{link}}%s{{/link}}"],"Undo":["ZpÄ›t"],"Redirect created":["PĹ™esmÄ›rovánĂ­ vytvoĹ™eno"],"%s just created a redirect from the old URL to the new URL.":["%s vytvoĹ™il pĹ™esmÄ›rovánĂ­ ze starĂ© URL na novou."],"Old URL: {{link}}%s{{/link}}":["Stará URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Synonyma klĂ­ÄŤovĂ© fráze"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Náhled stránky pĹ™i sdĂ­lenĂ­ na Twitteru"],"Adds a list of internal links to sibling pages which share the same parent.":["PĹ™idá seznam internĂ­ch odkazĹŻ na sourozeneckĂ© stránky, kterĂ© sdĂ­lejĂ­ stejnĂ©ho rodiÄŤe."],"siblings":["sourozenci"],"sibling pages":["sourozeneckĂ© stránky"],"Adds a list of internal links to subpages of this page.":["PĹ™idá seznam internĂ­ch odkazĹŻ na podstránky tĂ©to stránky."],"seo":["seo"],"subpages":["podstránky"],"childpages":["odvozenĂ© stránky"],"children":["odvozenĂ˝"],"internal linking":["internĂ­ propojenĂ­"],"site structure":["struktura stránek"],"We could not find any relevant articles on your website that you could link to from your post.":["Na vašem webu jsme nenašli žádnĂ© relevantnĂ­ ÄŤlánky, na kterĂ© byste mohli odkazovat z vašeho příspÄ›vku."],"Load suggestions":["NaÄŤĂ­st návrhy"],"Refresh suggestions":["Aktualizovat návrhy"],"Write list…":["Napsat seznam…"],"Adds a list of links related to this page.":["PĹ™idá seznam odkazĹŻ souvisejĂ­cĂ­ch s touto stránkou."],"related posts":["SouvisejĂ­cĂ­ příspÄ›vky"],"related pages":["SouvisejĂ­cĂ­ stránky"],"Adds a table of contents to this page.":["PĹ™idá na tuto stránku obsah."],"links":["odkazy"],"toc":["pata"],"Copy link":["KopĂ­rovat odkaz"],"Copy link to suggested article: %s":["ZkopĂ­rovat odkaz na navrĹľenĂ˝ ÄŤlánek: %s"],"Add a title to your post for the best internal linking suggestions.":["Chcete-li zĂ­skat nejlepší návrhy internĂ­ch odkazĹŻ, pĹ™idejte do svĂ©ho příspÄ›vku název."],"Add a metadescription to your post for the best internal linking suggestions.":["Chcete-li zĂ­skat nejlepší návrhy internĂ­ch odkazĹŻ, pĹ™idejte ke svĂ©mu příspÄ›vku metapopis."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Chcete-li zĂ­skat nejlepší návrhy internĂ­ch odkazĹŻ, pĹ™idejte do svĂ©ho příspÄ›vku nadpis a popis."],"Also, add a title to your post for the best internal linking suggestions.":["K příspÄ›vku takĂ© pĹ™idejte nadpis, kterĂ˝ obsahuje nejlepší návrhy internĂ­ch odkazĹŻ."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Chcete-li zĂ­skat nejlepší návrhy internĂ­ch odkazĹŻ, do svĂ©ho příspÄ›vku takĂ© pĹ™idejte popis."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Chcete-li zĂ­skat nejlepší návrhy internĂ­ch odkazĹŻ, pĹ™idejte do svĂ©ho příspÄ›vku takĂ© nadpis a popis."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Jakmile pĹ™idáte trochu vĂ­ce kopiĂ­, dáme vám zde seznam souvisejĂ­cĂ­ho obsahu, na kterĂ˝ mĹŻĹľete ve svĂ©m příspÄ›vku odkazovat."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Chcete-li vylepšit strukturu svĂ©ho webu, zvaĹľte propojenĂ­ s dalšími relevantnĂ­mi příspÄ›vky nebo stránkami na vašem webu."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["ZobrazenĂ­ seznamu souvisejĂ­cĂ­ho obsahu, na kterĂ˝ mĹŻĹľete odkazovat, trvá nÄ›kolik sekund. Návrhy se zde zobrazĂ­, jakmile je budeme mĂ­t."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}} PĹ™eÄŤtÄ›te si našeho prĹŻvodce internĂ­m propojovánĂ­m pro SEO {{/a}} a dozvĂ­te se vĂ­ce."],"Copied!":["ZkopĂ­rováno!"],"Not supported!":["NenĂ­ podpováno!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Pokoušíte se použít vĂ­ce souvisejĂ­cĂ­ch frázĂ­? MÄ›li byste je pĹ™idat samostatnÄ›."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["KlĂ­ÄŤová fráze je příliš dlouhá. Maximum je 191 znakĹŻ."],"Add as related keyphrase":["PĹ™idat jako souvisejĂ­cĂ­ frázi"],"Added!":["PĹ™idáno!"],"Remove":["Odstranit"],"Table of contents":["Tabule s obsahem"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["PotĹ™ebujeme optimalizovat SEO data vašeho webu, abychom vám mohli nabĂ­dnout nejlepší %1$sĂşhlednĂ© návrhy%2$s. %3$sStart SEO Optimalizace dat%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-da_DK.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-da_DK.json deleted file mode 100644 index b77120af..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-da_DK.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"da_DK"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["For at fĂĄ adgang til denne funktion, sĂĄ skal du have aktive %2$s og %3$s abennementer. SĂĄ %5$saktiver venligst dine abonnementer i %1$s%6$s eller %7$sfĂĄ et nyt %4$s%8$s. Bagefter, sĂĄ genindlæs venligst denne side for at fĂĄ denne funktion til at fungere efter hensigten, hvilket kan tage op til 30 sekunder."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["AI-titelgeneratoren kræver, at SEO-analysen er aktiveret før brug. For at aktivere det skal du navigere til %2$swebstedsfunktioner for s%1$s%3$s, slĂĄ SEO-analysen til og vælge \"Gem ændringer\". Hvis SEO-analysen er deaktiveret i din brugerprofil, skal du gĂĄ til din profil og aktivere den der. Kontakt din administrator, hvis du ikke har adgang til disse indstillinger."],"Social share preview":["ForhĂĄndsvisning af deling pĂĄ sociale medier"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["For at fortsætte med at bruge Yoast AI-funktionen skal du reducere hyppigheden af dine anmodninger. Vores %1$shjælpeartikel%2$s giver vejledning i, hvordan du effektivt planlægger og fĂĄr tempo pĂĄ dine anmodninger om en optimeret arbejdsgang."],"You've reached the Yoast AI rate limit.":["Du har nĂĄet Yoast AI-grænsen."],"Allow":["Tillad"],"Deny":["Afvis"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["For at se denne video skal du tillade %1$s at indlæse indlejrede videoer fra %2$s."],"Text generated by AI may be offensive or inaccurate.":["Tekst, der genereres af AI, kan være stødende eller unøjagtig."],"(Opens in a new browser tab)":["(Ă…bner i en ny browserfane)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Fremskynd din arbejdsgang med generativ AI. FĂĄ forslag til titler og beskrivelser af høj kvalitet til din søgning og dit sociale udseende. %1$sFĂĄ flere oplysninger%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Generer titler og beskrivelser med Yoast AI!"],"New to %1$s":["Ny i forhold til %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Jeg godkender %1$sServicevilkĂĄr%2$s og %3$sFortrolighedspolitik%4$s for Yoast AI-tjenesten. Dette omfatter samtykke til indsamling og brug af data for at forbedre brugeroplevelsen."],"Start generating":["Begynd at generere"],"Yes, revoke consent":["Ja, tilbagekald samtykke"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Ved at tilbagekalde dit samtykke har du ikke længere adgang til Yoast AI-funktioner. Er du sikker pĂĄ, at du vil tilbagekalde dit samtykke?"],"Something went wrong, please try again later.":["Noget gik galt, prøv igen senere."],"Revoke AI consent":["Tilbagekald AI-samtykke"],"Please enter a focus keyphrase first to use AI.":["Indtast først en fokusnøglesætning for at bruge AI."],"AI title generator":["AI titelgenerator"],"AI description generator":["AI beskrivelsesgenerator"],"AI Twitter title generator":["AI Twitter titelgenerator"],"AI Twitter description generator":["AI Twitter beskrivelsesgenerator"],"AI social title generator":["AI social titelgenerator"],"AI social description generator":["AI social beskrivelsesgenerator"],"Twitter preview":["Twitter forhĂĄndsvisning"],"Dismiss":["Ignorer"],"Don’t show again":["Vis ikke igen"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sTip%2$s: Ăg nøjagtigheden af dine genererede AI-titler ved at skrive mere indhold pĂĄ din side."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sTip%2$s: Gør dine genererede AI-beskrivelser mere nøjagtige ved at skrive mere indhold pĂĄ din side."],"Try again":["Prøv igen"],"Social preview":["Social forhĂĄndsvisning"],"Desktop result":["Resultat computer"],"Mobile result":["Mobilresultat"],"Apply AI description":["Anvend AI-beskrivelse"],"Apply AI title":["Anvend AI-titel"],"Next":["Næste"],"Previous":["Forrige"],"Generate 5 more":["Generer 5 mere"],"Google preview":["Google forhĂĄndsvisning"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["PĂĄ grund af OpenAIs strenge etiske retningslinjer og %1$sbrugspolitikker%2$s kan vi ikke generere SEO-titler til din side. Hvis du har til hensigt at bruge AI, skal du undgĂĄ brugen af eksplicit voldeligt eller seksuelt eksplicit indhold. %3$sLæs mere om, hvordan du konfigurerer din side for at sikre, at du fĂĄr de bedste resultater med AI%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["PĂĄ grund af OpenAIs strenge etiske retningslinjer og %1$sbrugspolitikker%2$s kan vi ikke generere metabeskrivelser til din side. Hvis du har til hensigt at bruge AI, skal du undgĂĄ brugen af eksplicit, voldeligt eller seksuelt eksplicit indhold. %3$sLæs mere om, hvordan du konfigurerer din side for at sikre, at du fĂĄr de bedste resultater med AI%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["For at fĂĄ adgang til denne funktion skal du have et aktivt %1$s abonnement. %3$saktiver dit abonnement i %2$s%4$s eller %5$sfĂĄ et nyt %1$s abonnement%6$s. Klik derefter pĂĄ knappen for at opdatere denne side, sĂĄ funktionen fungerer korrekt, hvilket kan tage op til 30 sekunder."],"Refresh page":["Opdater side"],"Not enough content":["Ikke nok indhold"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Prøv igen senere. Hvis problemet fortsætter, bedes du %1$skontakte vores supportteam%2$s!"],"Something went wrong":["Noget gik galt"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Det ser ud til, at der er opstĂĄet en timeout for forbindelsen. Kontroller din internetforbindelse, og prøv igen senere. Hvis problemet fortsætter, skal du %1$skontakte vores supportteam%2$s"],"Connection timeout":["Timeout for forbindelse"],"Use AI":["Brug AI"],"Close modal":["Luk modal"],"Learn more about AI (Opens in a new browser tab)":["FĂĄ mere at vide om AI (ĂĄbner i en ny browserfane)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTitel%3$s: Din side har endnu ikke en titel. %2$sTilføj en%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$s Titel%2$s: Din side har en titel. Godt gĂĄet!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sSøgefrasefordeling%3$s:%2$sInkluder din søgefrase eller dens synonymer i teksten, sĂĄ vi kan kontrollere søgefrasefordeling%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sSøgefrasefordeling%2$s: Flot arbejde!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sSøgefrasefordeling%3$s: Ujævn. Nogle dele af din tekst indeholder ikke søgefrase eller synonymer. %2$sDistribuer dem mere jævnt%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sSøgefrasefordeling%3$s: Meget ujævn. Store dele af din tekst indeholder ikke søgefrase eller synonymer. %2$sFordel dem mere jævnt%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: Du bruger ikke for mange komplekse ord, hvilket gør din tekst let at læse. Godt gĂĄet!"],"Word complexity":["Ordkompleksitet"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s af ordene i din tekst betragtes som komplekse. %3$s Prøv at bruge kortere og mere velkendte ord for at forbedre læsbarheden%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sJustering%3$s: Der er et langt afsnit med centreret tekst. %2$sVi anbefaler, at du gør den venstrejusteret%3$s.","%1$sJustering%3$s: Der er %4$s lange afsnit med centreret tekst. %2$sVi anbefaler, at du gør dem venstrejusterede%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sJustering%3$s: Der er et langt afsnit med centreret tekst. %2$sVi anbefaler, at du gør den højrejusteret%3$s.","%1$sJustering%3$s: Der er %4$s lange afsnit med centreret tekst. %2$sVi anbefaler, at du gør dem højrejusterede%3$s."],"Select image":["Vælg billede"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Tid til at tilføje nogle links! Nedenfor ser du en liste med dine hjørnesten. Under hver hjørnesten er der forslag til artikler, du kan tilføje et link fra. NĂĄr du tilføjer linket, skal du sørge for at indsætte det i en relevant sætning relateret til din hjørnestensartikel. Bliv ved med at tilføje links fra sĂĄ mange relaterede artikler, som du har brug for, indtil dine hjørnesten har de mest interne links, der peger mod dem."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Nogle artikler pĂĄ dit websted er de %1$s%2$s vigtigste. De besvarer folks spørgsmĂĄl og løser deres problemer. SĂĄ de fortjener at rangere! Hos %3$s kalder vi disse hjørnestensartikler. En af mĂĄderne at fĂĄ dem til at rangere er at pege nok links til dem. Flere links signalerer til søgemaskiner, at disse artikler er vigtige og værdifulde. I denne træning hjælper vi dig med at tilføje links til dine hjørnestensartikler!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["NĂĄr du har tilføjet lidt mere tekst, kan vi fortælle dig formalitetsniveauet for din tekst."],"Overall, your text appears to be %1$s%3$s%2$s.":["Samlet set ser din tekst ud til at være %1$s%3$s%2$s."],"Heading %d":["Overskrift %d"],"Maximum heading level":["Maksimalt overskriftsniveau"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Du har deaktiveret funktionen til at foreslĂĄ link, som er nødvendigt for at relaterede links virker. Hvis du vil tilføje relaterede links, sĂĄ aktiver venligst funktionen til at foreslĂĄ links i Webstedsfunktioner."],"Schema":["Skema"],"Meta tags":["Metatags"],"Not available":["Ikke tilgængelig"],"Checks":["Kontrol"],"Focus Keyphrase":["Fokussøgeordsfrase"],"Good":["God"],"No index":["Intet indeks"],"Front-end SEO inspector":["Seo-inspektør i frontend"],"Focus keyphrase not set":["Fokusnøglefrase ikke indstillet"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Bemærk venligst: For at denne træning skal fungere godt, skal du køre SEO-dataoptimeringsværktøjet. Administratorer kan køre dette under %1$sSEO > Værktøjer%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Du har tilføjet links til dine forældreløse artikler, og du har ryddet op i dem, der ikke længere var relevante. Godt arbejde! Tag et kig pĂĄ oversigten nedenfor og fejr det, du har opnĂĄet!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Undersøg kritisk indholdet i denne liste og foretag de nødvendige opdateringer. Hvis du har brug for hjælp til at opdatere, har vi et meget %1$sbrugbart blogindlæg, der kan guide dig hele vejen%2$s (klik for at ĂĄbne i en ny fane)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sHar du brug for mere vejledning? Vi har dækket hvert trin mere detaljeret i den følgende guide: %2$sSĂĄdan bruger du %7$s forældreløst indhold- træning%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Du har lige gjort dit bedste indhold nemt at finde, og det er mere sandsynligt, at du rangerer! Godt gĂĄet! Husk fra tid til anden at tjekke, om dine hjørnesten fĂĄr nok links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Tag et kig pĂĄ listen nedenfor. Har dine hjørnesten (markeret med %1$s) de fleste interne links, der peger mod dem? Klik pĂĄ knappen Optimer, hvis du mener, at en hjørnesten har brug for flere links. Det vil flytte artiklen til næste trin."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Har alle dine hjørnesten grønne kugler? For de bedste resultater, overvej at redigere dem, der ikke gør det!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Hvilke artikler vil du rangere højest med? Hvilke ville dit publikum finde de mest nyttige og komplette? Klik pĂĄ den nedadgĂĄende pil, og se efter artikler, der passer til disse kriterier. Vi markerer automatisk de artikler, du vælger fra listen, som hjørnesten."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sHar du brug for mere vejledning? Vi har dækket hvert trin mere detaljeret i: %2$sSĂĄdan bruger du %7$s hjørnestenstræning%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast Underside"],"Yoast Siblings":["Yoast Søskende"],"Yoast Table of Contents":["Yoast Indholdsfortegnelse"],"Yoast Related Links":["Yoast relaterede links"],"Finish optimizing":["Afslut optimering"],"You've finished adding links to this article.":["Du er færdig med at tilføje links til denne artikel."],"Optimize":["Optimer"],"Added to next step":["Tilføjet til næste trin"],"Choose cornerstone articles...":["Vælg hjørnestensartikler..."],"Loading data...":["Indlæser data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Du har ikke ryddet op eller opdateret nogen artikler endnu ved hjælp af denne træning. NĂĄr du gør det, vil en oversigt over dit arbejde dukke op her."],"Skipped":["Sprunget over"],"Hidden from search engines.":["Skjult for søgemaskiner."],"Removed":["Fjernet"],"Improved":["Forbedret"],"Resolution":["Opløsning"],"Loading redirect options...":["Indlæser omdirigeringsindstillinger..."],"Remove and redirect":["Fjerne og omdirigere"],"Custom url:":["Brugerdefineret URL-adresse:"],"Related article:":["Relateret artikel:"],"Home page:":["Forside:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Du er ved at fjerne %1$s%2$s%3$s. Hvis du vil forhindre 404'ere pĂĄ dit websted, skal du omdirigere det til en anden side pĂĄ dit websted. Hvor vil du omdirigere den til?"],"SEO Workout: Remove article":["SEO træning: Fjern artikel"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Alt ser godt ud! Vi har ikke fundet nogen artikler pĂĄ dit websted, der er ældre end seks mĂĄneder og modtager for fĂĄ links pĂĄ dit websted. Vend tilbage her til senere for at finde nye oprydningsforslag!"],"Hide from search engines":["Skjul fra søgemaskiner"],"Improve":["Optimer"],"Are you sure you wish to hide this article from search engines?":["Er du sikker pĂĄ, at du ønsker at skjule denne artikel for søgemaskiner?"],"Action":["Handling"],"You've hidden this article from search engines.":["Du har skjult denne artikel for søgemaskiner."],"You've removed this article.":["Du har fjernet denne artikel."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Du har i øjeblikket ikke valgt nogen artikler, der skal forbedres. Vælg et par artikler i de foregĂĄende trin, som du vil føje links til, sĂĄ viser vi dig linkforslag her."],"Loading link suggestions...":["Indlæser linkforslag..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Vi fandt ikke nogen forslag til denne artikel, men selvfølgelig kan du stadig tilføje links til artikler, som du mener er relaterede."],"Skip":["Spring over"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Du har endnu ikke valgt nogen artikler til dette trin. Det kan du gøre i forrige trin."],"Is it up-to-date?":["Er det up-to-date?"],"Last Updated":["Sidst opdateret"],"You've moved this article to the next step.":["Du har flyttet denne artikel til næste trin."],"Unknown":["Ubekendt"],"Clear summary":["Ryd resume"],"Add internal links towards your orphaned articles.":["Tilføj interne links til dine forældreløse artikler."],"Should you update your article?":["Bør du opdatere din artikel?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Dit websted indeholder ofte masser af indhold, der er oprettet Ă©n gang, og som du aldrig er vendt tilbage til. Det er vigtigt at gennemgĂĄ dette og spørge dig selv, om dette indhold stadig er relevant for dit websted. Skal du forbedre det eller fjerne det?"],"Start: Love it or leave it?":["Start: Er vild med det eller sig farvel til det?"],"Clean up your unlinked content to make sure people can find it":["Ryd op i det indhold, der ikke er sammenkædet, for at sikre, at andre kan finde det"],"I've finished this workout":["Jeg er færdig med denne workout"],"Reset this workout":["Nulstil denne øvelse"],"Well done!":["Godt klaret!"],"Add internal links towards your cornerstones":["Tilføj interne links som henviser til dine cornerstones"],"Check the number of incoming internal links of your cornerstones":["Tjek nummeret af interne links til dine cornerstones"],"Start: Choose your cornerstones!":["Start: Vælg dine hjørnesten!"],"The cornerstone approach":["Hjørnestenstilgang"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Bemærk: For at denne øvelse skal fungere godt og tilbyde dig forslag til links, sĂĄ skal du køre SEO-dataoptimeringsværktøjet. Administratorer kan køre dette under %1$sSEO > Værktøjer%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Jeg er færdig med dette trin"],"Revise this step":["Revider dette trin"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Vi kunne ikke finde interne links pĂĄ dine sider. Enten har du ikke tilføjet nogen interne links til dit indhold endnu, eller ogsĂĄ har Yoast SEO ikke indekseret dem. Du kan fĂĄ Yoast SEO til at indeksere dine links ved at køre SEO-dataoptimeringen under SEO > Værktøjer."],"Incoming links":["Indkommende links"],"Edit to add link":["Rediger for at tilføje link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Du har i øjeblikket ingen artikler markeret som hjørnesten. NĂĄr du markerer dine artikler som hjørnesten, vil de dukke op her."],"Focus keyphrase":["Fokus-søgeordsfrase"],"Article":["Artikel"],"Readability score":["Læsbarheds-score"],"SEO score":["SEO-score"],"Copy failed":["Kopiering mislykkedes"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Du kan forbedre placeringen for alle dine hjørnesten ved at bruge denne %1$strin-for-trin øvelse! %2$s"],"Rank with articles you want to rank with":["Ranger med artikler, du vil rangere med"],"Descriptive text":["Beskrivende tekst"],"Show the descriptive text":["Vis den beskrivende tekst"],"Show icon":["Vis ikon"],"Yoast Estimated Reading Time":["Yoast anslĂĄet læsetid"],"Shows an estimated reading time based on the content length.":["Viser en anslĂĄet læsetid baseret pĂĄ indholdslængden."],"reading time":["læsetid"],"content length":["indholdslængde"],"Estimated reading time:":["AnslĂĄet læsetid:"],"minute":["Minut","Minutter"],"Settings":["Indstillinger"],"OK":["OK"],"Close":["Luk"],"Type":["Type"],"Orphaned content":["Forældreløst (orphaned) indhold"],"Synonyms":["Synonymer"],"Internal linking suggestions":["Forslag til interne links"],"Enter a related keyphrase to calculate the SEO score":["Indtast en lignende nøglefrase for at beregne SEO-scoren"],"Related keyphrase":["Relateret søgeordsfrase"],"Add related keyphrase":["Tilføj relateret søgefrase"],"Analysis results":["Analyseresultat:"],"Help on choosing the perfect keyphrase":["Hjælp til at vælge den perfekte nøglefrase"],"Help on keyphrase synonyms":["Hjælp til nøglefrase-synonymer"],"Keyphrase":["Søgefrase"],"New URL: {{link}}%s{{/link}}":["Ny URL: {{link}}%s{{/link}}"],"Undo":["Fortryd"],"Redirect created":["redirect oprettet"],"%s just created a redirect from the old URL to the new URL.":["%s har lige oprettet et redirect fra den gamle URL til den nye."],"Old URL: {{link}}%s{{/link}}":["Gammel URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Søgeord synonymer"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["ForhĂĄndsvisning af Twitter-deling"],"Adds a list of internal links to sibling pages which share the same parent.":["Føjer en liste over interne hyperlinks til sidestillede sider, der deler den samme overordnede side."],"siblings":["sidestillede"],"sibling pages":["sidestillede sider"],"Adds a list of internal links to subpages of this page.":["Føjer en liste over interne hyperlinks til undersider pĂĄ denne side."],"seo":["seo"],"subpages":["Undersider"],"childpages":["underordnede sider"],"children":["underordnede"],"internal linking":["Interne links"],"site structure":["sidestruktur"],"We could not find any relevant articles on your website that you could link to from your post.":["Vi kunne ikke finde nogen relevante artikler pĂĄ dit websted, som du kan linke til i dit indlæg."],"Load suggestions":["Indlæs foreslag"],"Refresh suggestions":["Genopfrisk foreslag"],"Write list…":["Skriv liste..."],"Adds a list of links related to this page.":["Tilføjer en liste af links relaterede til denne side."],"related posts":["relaterede indlæg"],"related pages":["relaterede sider"],"Adds a table of contents to this page.":["Tilføjer en indholdsfortegnelse til denne side."],"links":["links"],"toc":["indholdsfortegnelse"],"Copy link":["KopiĂ©r link"],"Copy link to suggested article: %s":["KopiĂ©r link til foreslĂĄet artikel: %s"],"Add a title to your post for the best internal linking suggestions.":["Føj en titel til dit indlæg for at fĂĄ de bedste interne linkforslag."],"Add a metadescription to your post for the best internal linking suggestions.":["Tilføj en metabeskrivelse til dit indlæg for at fĂĄ de bedste interne linkforslag."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Tilføj en titel og en metabeskrivelse til dit indlæg for at fĂĄ de bedste interne linkforslag."],"Also, add a title to your post for the best internal linking suggestions.":["Tilføj ogsĂĄ en titel til dit indlæg for at fĂĄ de bedste interne linkforslag."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Tilføj ogsĂĄ en metabeskrivelse til dit indlæg for at fĂĄ de bedste interne linkforslag."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Tilføj ogsĂĄ en titel og en metabeskrivelse til dit indlæg for at fĂĄ de bedste interne linkforslag."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["NĂĄr du har tilføjet lidt mere tekst, giver vi dig en liste over relateret indhold her, som du kan linke til i dit indlæg."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Hvis du vil forbedre din webstedsstruktur, kan du overveje at linke til andre relevante indlæg eller sider pĂĄ dit websted."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Det tager et par sekunder at vise dig en liste over relateret indhold, som du kan linke til. Forslagene vil blive vist her, sĂĄ snart vi har dem."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}} Læs vores vejledning om intern linkning for SEO{{/a}} for at fĂĄ mere at vide."],"Copied!":["Kopieret!"],"Not supported!":["Ikke understøttet!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Forsøger du at bruge flere relaterede søgeord? Du bør tilføje dem separat."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Din søgefrase er for lang. Den kan højst være pĂĄ 191 tegn."],"Add as related keyphrase":["Tilføj som relateret søgeord"],"Added!":["Tilføjet!"],"Remove":["Fjern"],"Table of contents":["Indholdsfortegnelse"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Vi er nødt til at optimere dit websteds SEO-data, sĂĄ vi kan tilbyde dig de bedste %1$slinkforslag%2$s.\n\n%3$s Start SEO-dataoptimering%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-de_DE.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-de_DE.json deleted file mode 100644 index 26fe826d..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-de_DE.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Um diese Funktion nutzen zu können, benötigst du aktive %2$s und %3$s Abonnements. Bitte %5$saktiviere deine Abonnements in %1$s%6$s oder %7$serhalte ein neues %4$s%8$s. Bitte aktualisiere anschlieĂźend diese Seite, damit die Funktion korrekt funktioniert. Dies kann bis zu 30 Sekunden dauern."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["FĂĽr den KI-Titelgenerator muss die SEO-Analyse vor der Verwendung aktiviert werden. Um sie zu aktivieren, navigiere bitte zu den %2$sWebsite-Funktionen von %1$s%3$s, aktiviere die SEO-Analyse und klicke auf 'Ă„nderungen speichern'. Wenn die SEO-Analyse in deinem WordPress-Benutzerprofil deaktiviert ist, ruf dein Profil auf und aktiviere sie dort. Wende dich bitte an deinen Administrator, wenn du keinen Zugang zu diesen Einstellungen hast."],"Social share preview":["Vorschau fĂĽr soziale Netzwerke"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Wenn du die KI-Funktion von Yoast weiterhin nutzen möchtest, solltest du die Häufigkeit deiner Anfragen reduzieren. In unserem %1$sHilfe-Artikel%2$s findest du eine Anleitung zur effektiven Planung und Taktung deiner Anfragen fĂĽr einen optimierten Arbeitsablauf."],"You've reached the Yoast AI rate limit.":["Du hast das Limit der KI-Anfragen in Yoast erreicht."],"Allow":["Zulassen"],"Deny":["Ablehnen"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Um dieses Video anzusehen, musst du %1$s erlauben, eingebettete Videos von %2$s zu laden."],"Text generated by AI may be offensive or inaccurate.":["Von der KI generierter Text kann beleidigend oder unpassend sein."],"(Opens in a new browser tab)":["(Ă–ffnet in einem neuen Browser Tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Beschleunige deinen Workflow mit generativer KI. Erhalte hochwertige Titel- und Beschreibungsvorschläge fĂĽr deine Suche und deinen sozialen Auftritt. %1$sWeitere Informationen%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Generiere Titel und Beschreibungen mit Yoast-KI!"],"New to %1$s":["Neu bei %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Ich stimme den %1$sAllgemeinen Geschäftsbedingungen%2$s und den %3$sDatenschutzbestimmungen%4$s des KI-Dienstes von Yoast zu. Dies beinhaltet die Zustimmung zur Sammlung und Verwendung von Daten zur Verbesserung der Benutzererfahrung."],"Start generating":["Mit der Erzeugung beginnen"],"Yes, revoke consent":["Ja, Zustimmung widerrufen"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Wenn du deine Zustimmung widerrufst, hast du keinen Zugriff mehr auf die Funktionen der Yoast-KI. Bist du sicher, dass du deine Zustimmung widerrufen möchtest?"],"Something went wrong, please try again later.":["Etwas ist schiefgelaufen, bitte versuche es später erneut."],"Revoke AI consent":["KI-Zustimmung widerrufen"],"Please enter a focus keyphrase first to use AI.":["Bitte gib zuerst eine Keyphrase ein, um die KI zu verwenden."],"AI title generator":["KI-Titel-Generator"],"AI description generator":["KI-Beschreibungsgenerator"],"AI Twitter title generator":["KI-Twitter-Titelgenerator"],"AI Twitter description generator":["KI-Twitter-Beschreibungsgenerator"],"AI social title generator":["KI-Generator fĂĽr soziale Titel"],"AI social description generator":["KI-Generator fĂĽr soziale Beschreibungen"],"Twitter preview":["Twitter-Vorschau"],"Dismiss":["Verwerfen"],"Don’t show again":["Nicht mehr anzeigen"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sTipp%2$s: Verbessere die Genauigkeit der von dir generierten KI-Titel, indem du mehr Inhalt auf deiner Seite schreibst."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sTipp%2$s: Verbessere die Genauigkeit der von dir generierten KI-Beschreibungen, indem du mehr Inhalt auf deiner Seite schreibst."],"Try again":["Erneut versuchen"],"Social preview":["Voransicht sozialer Medien"],"Desktop result":["Ergebnis fĂĽr den Desktop"],"Mobile result":["Ergebnis fĂĽr die mobilen Geräte"],"Apply AI description":["KI-Beschreibung anwenden"],"Apply AI title":["KI-Titel anwenden"],"Next":["Weiter"],"Previous":["ZurĂĽck"],"Generate 5 more":["5 weitere generieren"],"Google preview":["Google-Vorschau"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Aufgrund der strengen ethischen Richtlinien und %1$sNutzungsrichtlinien%2$s von OpenAI können wir keine SEO-Titel fĂĽr deine Seite erstellen. Wenn du beabsichtigst, KI zu nutzen, vermeide bitte die Verwendung von expliziten, gewalttätigen oder sexuell eindeutigen Inhalten. %3$sMehr darĂĽber erfahren, wie du deine Seite konfigurierst, um sicherzustellen, dass du mit KI die besten Ergebnisse erzielst%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Aufgrund der strengen ethischen Richtlinien und %1$sNutzungsrichtlinien%2$s von OpenAI können wir keine Meta-Beschreibungen fĂĽr deine Seite erstellen. Wenn du beabsichtigst, KI zu nutzen, vermeide bitte die Verwendung von expliziten, gewalttätigen oder sexuell eindeutigen Inhalten. %3$sMehr darĂĽber erfahren, wie du deine Seite konfigurierst, um sicherzustellen, dass du mit KI die besten Ergebnisse erzielst%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Um diese Funktion nutzen zu können, benötigst du ein aktives Abonnement von %1$s. Bitte %3$saktiviere dein Abonnement in %2$s%4$s oder %5$serhalte ein neues %1$s Abonnement%6$s. Klicke anschlieĂźend auf den Button zum Aktualisieren dieser Seite, damit die Funktion korrekt funktioniert. Dies kann bis zu 30 Sekunden dauern."],"Refresh page":["Seite aktualisieren"],"Not enough content":["Nicht genug Inhalt"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Bitte versuche es später erneut. Wenn das Problem weiterhin besteht, %1$skontaktiere bitte unser Support-Team%2$s!"],"Something went wrong":["Etwas ist schiefgelaufen"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Es scheint, dass bei der Verbindung eine ZeitĂĽberschreitung aufgetreten ist. Bitte ĂĽberprĂĽfe deine Internetverbindung und versuche es später erneut. Sollte das Problem weiterhin bestehen, %1$skontaktiere bitte unser Support-Team%2$s"],"Connection timeout":["ZeitĂĽberschreitung der Verbindung"],"Use AI":["KI verwenden"],"Close modal":["Modal schlieĂźen"],"Learn more about AI (Opens in a new browser tab)":["Mehr ĂĽber KI erfahren (Ă–ffnet in einem neuen Browser-Tab)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTitel%3$s: Deine Seite hat noch keinen Titel. %2$sFĂĽge einen hinzu%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTitel%2$s: Deine Seite hat einen Titel. Gut gemacht!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sVerteilung der Keyphrase%3$s: %2$sVerwende deine Keyphrase oder deren Synonyme im Text, damit wir die Verteilung der Keyphrase prĂĽfen können%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sVerteilung der Keyphrase%2$s: Gut gemacht!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sVerteilung der Keyphrase%3$s: Ungleichmäßig. Einige Textabschnitte enthalten weder die Keyphrase noch deren Synonyme. %2$sVerteile diese gleichmäßiger%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sVerteilung der Keyphrase%3$s: Sehr ungleichmäßig. Viele Textabschnitte enthalten weder die Keyphrase noch deren Synonyme. %2$sVerteile diese gleichmäßiger%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: Du nutzt nicht zu viele komplexe Worte, was deinen Text leicht zu lesen macht. Gute Arbeit!"],"Word complexity":["Komplexität der Wörter"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s der Worte in deinem Text werden als komplex eingestuft. %3$sVersuche, kĂĽrzere und gebräuchlichere Wörter zu verwenden, um die Lesbarkeit zu erhöhen%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sAusrichtung%3$s: Es gibt einen langen Abschnitt mit mittig ausgerichtetem Text. %2$sWir empfehlen, ihn linksbĂĽndig auszurichten%3$s.","%1$sAusrichtung%3$s: Es gibt %4$s lange Abschnitte mit mittig ausgerichtetem Text. %2$sWir empfehlen, sie linksbĂĽndig auszurichten%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sAusrichtung%3$s: Es gibt einen langen Abschnitt mit mittig ausgerichtetem Text. %2$sWir empfehlen, ihn rechtsbĂĽndig auszurichten%3$s.","%1$sAusrichtung%3$s: Es gibt %4$s lange Abschnitte mit mittig ausgerichtetem Text. %2$sWir empfehlen, sie rechtsbĂĽndig auszurichten.%3$s"],"Select image":["Bild auswählen"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Es ist Zeit, ein paar Links hinzuzufĂĽgen! Unten siehst du eine Liste mit deinen Cornerstone-Inhalten. Unter jedem Cornerstone-Inhalt findest du Vorschläge fĂĽr Artikel, von denen aus du einen Link hinzufĂĽgen kannst. Wenn du den Link hinzufĂĽgst, achte darauf, dass du ihn in einen relevanten Satz einfĂĽgst, der mit deinem Cornerstone-Artikel zusammenhängt. FĂĽge so viele Links aus verwandten Artikeln hinzu, bis die meisten internen Links auf deine Cornerstone-Inhalte verweisen."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Einige Artikel auf deiner Website sind %1$sdie%2$s wichtigsten. Sie beantworten die Fragen der Besucher und lösen ihre Probleme. Sie verdienen es also, zu ranken! In %3$s nennen wir diese Cornerstone-Artikel. Eine der Möglichkeiten, sie hoch zu platzieren, besteht darin, dass genĂĽgend Links auf sie verweisen. Mehr Links signalisieren den Suchmaschinen, dass diese Artikel wichtig und wertvoll sind. In diesem Training helfen wir dir, deinen Cornerstone-Artikel Links hinzuzufĂĽgen!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Sobald du ein wenig mehr Text hinzugefĂĽgt hast, können wir den Formalitätsgrad deines Textes bewerten."],"Overall, your text appears to be %1$s%3$s%2$s.":["Insgesamt scheint dein Text %1$s%3$s%2$s zu sein."],"Heading %d":["Ăśberschrift %d"],"Maximum heading level":["Maximale Ăśberschriftenebene"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Du hast die Link-Vorschläge deaktiviert, die erforderlich sind, damit Relevante Links funktionieren. Wenn du Relevante Links hinzufĂĽgen möchtest, gehe bitte zu Seitenfunktionen und aktiviere Link-Vorschläge."],"Schema":["Schema"],"Meta tags":["Meta-Tags"],"Not available":["Nicht verfĂĽgbar"],"Checks":["PrĂĽfungen"],"Focus Keyphrase":["Fokus-Keyphrase"],"Good":["Gut"],"No index":["Nicht indexieren"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Fokus-Keyphrase nicht gesetzt"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Bitte beachte: Damit dieses Training gut funktioniert, musst du das SEO-Datenoptimierungstool ausfĂĽhren. Administratoren können dies ausfĂĽhren unter %1$sSEO > Werkzeuge%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Du hast Links zu deinen verwaisten Artikeln hinzugefĂĽgt und die nicht mehr relevanten Artikel bereinigt. Gute Arbeit! Wirf einen Blick auf die folgende Zusammenfassung und freu dich ĂĽber das, was du erreicht hast!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["PrĂĽfe die Inhalte in dieser Liste kritisch und nimm die notwendigen Aktualisierungen vor. Wenn du Hilfe bei der Aktualisierung benötigst, haben wir einen sehr %1$snĂĽtzlichen Blogbeitrag, der dich auf dem ganzen Weg begleiten kann%2$s (Anklicken, um ihn in einem neuen Tab zu öffnen)"],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sDu benötigst mehr UnterstĂĽtzung? Im folgenden Leitfaden haben wir jeden Schritt detailliert beschrieben: %2$sSo benutzt du das %7$s Training fĂĽr verwaiste Inhalte%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Du hast soeben dafĂĽr gesorgt, dass deine besten Inhalte leicht auffindbar sind und mit größerer Wahrscheinlichkeit gefunden werden! Weiter so! Vergiss nicht, von Zeit zu Zeit zu ĂĽberprĂĽfen, ob deine Cornerstone-Inhalte genĂĽgend Links erhalten!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Wirf einen Blick auf die folgende Liste. Haben deine Cornerstone-Inhalte (markiert mit %1$s) die meisten internen Links, die auf sie zeigen? Klicke auf den Button Optimieren, wenn du der Meinung bist, dass ein Cornerstone-Inhalt mehr Links benötigt. Dadurch wird der Beitrag zum nächsten Schritt gebracht."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Haben alle deine Cornerstone-Inhalte grĂĽne Punkte? Um die besten Ergebnisse zu erzielen, solltest du diejenigen bearbeiten, die keine haben!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Welche Artikel möchtest du am höchsten platzieren? Welche wĂĽrden deine Leser am nĂĽtzlichsten und vollständigsten finden? Klicke auf den nach unten zeigenden Pfeil und suche nach Artikeln, die diese Kriterien erfĂĽllen. Die von dir ausgewählten Artikel werden von uns automatisch als Cornerstone-Inhalte markiert."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sBenörigst du mehr UnterstĂĽtzung? Wir haben jeden Schritt detailliert beschrieben: %2$sSo verwendest du das %7$sCornerstone-Training%3$s%4$s%5$s verwenden.%6$s"],"Yoast Subpages":["Yoast Unterseiten"],"Yoast Siblings":["Yoast Geschwister"],"Yoast Table of Contents":["Yoast Inhaltsverzeichnis"],"Yoast Related Links":["Yoast Relevante Links"],"Finish optimizing":["Optimierung abschlieĂźen"],"You've finished adding links to this article.":["Sie haben das HinzufĂĽgen von Links zu diesem Artikel abgeschlossen."],"Optimize":["Optimieren"],"Added to next step":["Zum nächsten Schritt hinzugefĂĽgt"],"Choose cornerstone articles...":["Wähle die Cornerstone-Artikel ..."],"Loading data...":["Lade Daten …"],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Du hast bisher keine Beiträge innerhalb dieses Workouts aufgeräumt oder aktualisiert. Sobald du das tust, wird hier eine Zusammenfassung deiner Arbeit erscheinen."],"Skipped":["Ăśbersprungen"],"Hidden from search engines.":["Vor Suchmaschinen verborgen."],"Removed":["Entfernt"],"Improved":["Verbessert"],"Resolution":["Auflösung"],"Loading redirect options...":["Umleitungs-Optionen laden..."],"Remove and redirect":["Entfernen und umleiten"],"Custom url:":["Individuelle URL:"],"Related article:":["Verwandter Beitrag:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Du bist dabei, %1$s%2$s%3$s zu entfernen. Um 404-Fehler auf deiner Website zu vermeiden, solltest du es auf eine andere Seite deiner Website umleiten. Wohin möchtest du umleiten?"],"SEO Workout: Remove article":["SEO-Workout: Beitrag entfernen"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Das sieht alles gut aus! Wir haben keine Beiträge auf deiner Website gefunden, die älter als 6 Monate sind und zu wenige Links auf deine Website erhalten. Komm später wieder fĂĽr neue Vorschläge zum Aufräumen!"],"Hide from search engines":["Vor Suchmaschinen verbergen"],"Improve":["Verbessern"],"Are you sure you wish to hide this article from search engines?":["Bist du sicher, dass du diesen Beitrag vor Suchmaschinen verbergen willst?"],"Action":["Aktion"],"You've hidden this article from search engines.":["Du hast diesen Beitrag vor Suchmaschinen verborgen."],"You've removed this article.":["Du hast diesen Beitrag entfernt."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Du hast momentan keine Beiträge zum Verbessern ausgewählt. Wähle in den vorherigen Schritten ein paar verwaiste Beiträge aus, um Links hinzuzufĂĽgen und wir werden dir hier Vorschläge fĂĽr Links anzeigen."],"Loading link suggestions...":["Link-Vorschläge laden..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Wir haben keine Vorschläge fĂĽr diesen Beitrag gefunden, aber du kannst natĂĽrlich trotzdem Links zu Beiträgen hinzufĂĽgen, die du fĂĽr relevant hältst."],"Skip":["Ăśberspringen"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Du hast keine Beiträge fĂĽr diesem Schritt ausgewählt. Du kannst das im vorherigen Schritt tun."],"Is it up-to-date?":["Ist das der neueste Stand?"],"Last Updated":["Zuletzt aktualisiert"],"You've moved this article to the next step.":["Du hast diesen Beitrag zu dem nächsten Schritt verschoben."],"Unknown":["Unbekannt"],"Clear summary":["Zusammenfassung leeren"],"Add internal links towards your orphaned articles.":["FĂĽge interne Links auf deine verwaisten Beiträge hinzu."],"Should you update your article?":["Solltest du deinen Beitrag aktualisieren?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Ihre Website enthält oft viele Inhalte, die einmal erstellt wurden und auf die du danach nie wieder zurĂĽckblickst. Es ist wichtig, dass Sie diese durchgehen und sich fragen, ob diese Inhalte noch relevant fĂĽr Ihre Website sind. Sollte ich sie verbessern oder entfernen?"],"Start: Love it or leave it?":["Start: Love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Räume deine nicht verlinkten Inhalte auf, um sicherzustellen, dass jeder sie finden kann"],"I've finished this workout":["Ich habe dieses Training beendet"],"Reset this workout":["Dieses Training zurĂĽcksetzen"],"Well done!":["Gut gemacht!"],"Add internal links towards your cornerstones":["FĂĽge interne Links zu deinen Cornerstone-Inhalten hinzu"],"Check the number of incoming internal links of your cornerstones":["ĂśberprĂĽfe die Anzahl der eingehenden internen Links deiner Cornerstone-Inhalte"],"Start: Choose your cornerstones!":["Start: Wähle deine Cornerstone-Inhalte!"],"The cornerstone approach":["Der Cornerstone-Ansatz"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Bitte beachte: Damit dieses Training gut funktioniert und dir Verlinkungsvorschläge anbieten kann, musst du das SEO-Datenoptimierungstool ausfĂĽhren. Administratoren können dies unter %1$sSEO > Werkzeuge%2$s ausfĂĽhren."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Ich habe diesen Schritt abgeschlossen"],"Revise this step":["Diesen Schritt ĂĽberarbeiten"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Wir konnten keine internen Links auf Ihren Seiten finden. Entweder haben Sie noch keine internen Links zu Ihren Inhalten hinzugefĂĽgt oder Yoast SEO hat sie nicht indiziert. Sie können Yoast SEO Ihre Links indizieren lassen, indem Sie die SEO-Datenoptimierung unter SEO > Werkzeuge ausfĂĽhren."],"Incoming links":["Eingehende Links"],"Edit to add link":["Bearbeiten, um Link hinzuzufĂĽgen"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Du hast derzeit keine Artikel als Cornerstone-Inhalt markiert. Wenn du deine Artikel als Cornerstone markierst, werden sie hier angezeigt."],"Focus keyphrase":["Fokus-Keyphrase"],"Article":["Artikel"],"Readability score":["Lesbarkeitsbewertung"],"SEO score":["SEO-Wert"],"Copy failed":["Kopieren fehlgeschlagen"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Verbessere die Rankings all deiner Cornerstone-Inhalte mit diesem %1$sSchritt-fĂĽr-Schritt-Training!%2$s"],"Rank with articles you want to rank with":["Erziele ein gutes Ranking mit Artikeln, mit denen du auch ranken willst"],"Descriptive text":["Beschreibungstext"],"Show the descriptive text":["Beschreibungstext anzeigen"],"Show icon":["Icon anzeigen"],"Yoast Estimated Reading Time":["Yoast Voraussichtliche Lesedauer"],"Shows an estimated reading time based on the content length.":["Zeit die voraussichtliche Lesedauer basierend auf der Länge des Inhalts an."],"reading time":["Lesezeit"],"content length":["Länge des Inhalts"],"Estimated reading time:":["Voraussichtliche Lesedauer:"],"minute":["Minute","Minuten"],"Settings":["Einstellungen"],"OK":["OK"],"Close":["schliessen"],"Type":["Typ"],"Orphaned content":["Verwaister Inhalt"],"Synonyms":["Synonyme"],"Internal linking suggestions":["Vorschläge zur internen Verlinkung"],"Enter a related keyphrase to calculate the SEO score":["Gib eine relevante Keyphrase ein, um den SEO-Wert zu berechnen"],"Related keyphrase":["Ă„hnliche Keyphrase"],"Add related keyphrase":["Relevante Keyphrase hinzufĂĽgen"],"Analysis results":["Analyse-Ergebnisse"],"Help on choosing the perfect keyphrase":["Hilfe bei der Wahl einer perfekten Keyphrase"],"Help on keyphrase synonyms":["Hilfe bei Synonymen zur Keyphrase"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["Neue URL: {{link}}%s{{/link}}"],"Undo":["RĂĽckgängig"],"Redirect created":["Umleitung angelegt"],"%s just created a redirect from the old URL to the new URL.":["%s hat gerade eine Umleitung von der alten URL zur neuen URL erstellt."],"Old URL: {{link}}%s{{/link}}":["Alte URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase-Synonyme"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter-Vorschau"],"Adds a list of internal links to sibling pages which share the same parent.":["FĂĽgt eine Liste interner Links auf verwandte Seiten hinzu, die dieselbe Elternseite haben."],"siblings":["Verwandte"],"sibling pages":["Verwandte Seiten"],"Adds a list of internal links to subpages of this page.":["FĂĽgt eine Liste interner Links auf Unterseiten dieser Seite hinzu."],"seo":["SEO"],"subpages":["Unterseiten"],"childpages":["Kind-Seiten"],"children":["Kinder"],"internal linking":["Interne Verlinkung"],"site structure":["Website-Struktur"],"We could not find any relevant articles on your website that you could link to from your post.":["Wir konnten keine relevanten Beiträge auf deiner Website finden, auf die du von deinem Beitrag aus verlinken könntet."],"Load suggestions":["Vorschläge laden"],"Refresh suggestions":["Vorschläge neu laden"],"Write list…":["Schreibe eine Liste…"],"Adds a list of links related to this page.":["FĂĽgt eine Liste von mit dieser Seite verwandten Links hinzu."],"related posts":["Verwandte Beiträge"],"related pages":["Verwandte Seiten"],"Adds a table of contents to this page.":["FĂĽgt dieser Seite ein Inhaltsverzeichnis hinzu."],"links":["Links"],"toc":["Inhaltsverzeichnis"],"Copy link":["Link kopieren"],"Copy link to suggested article: %s":["Link zum vorgeschlagenen Artikel kopieren: %s"],"Add a title to your post for the best internal linking suggestions.":["FĂĽge deinem Beitrag eine Ăśberschrift hinzu, fĂĽr die besten internen Link-Vorschläge."],"Add a metadescription to your post for the best internal linking suggestions.":["FĂĽge deinem Beitrag eine Meta-Beschreibung hinzu, fĂĽr die besten internen Link-Vorschläge."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["FĂĽge deinem Beitrag eine Ăśberschrift und eine Meta-Beschreibung hinzu, fĂĽr die besten internen Link-Vorschläge."],"Also, add a title to your post for the best internal linking suggestions.":["FĂĽge deinem Beitrag auch eine Ăśberschrift hinzu, fĂĽr die besten internen Link-Vorschläge."],"Also, add a metadescription to your post for the best internal linking suggestions.":["FĂĽge deinem Beitrag auch eine Meta-Beschreibung hinzu, fĂĽr die besten internen Link-Vorschläge."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["FĂĽge deinem Beitrag auch eine Ăśberschrift und eine Meta-Beschreibung hinzu, fĂĽr die besten internen Link-Vorschläge."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Hast du deiner Seite einmal etwas mehr Inhalt hinzugefĂĽgt, werden wir dir hier eine Liste mit verwandten Inhalten anzeigen, die du in deinem Beitrag verlinken kannst."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Um die Struktur deiner Website zu verbessern, denk darĂĽber nach, andere relevante Beiträge oder Seiten auf deiner Website zu verlinken."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Es dauert ein paar Sekunden, um die eine Liste verwandter Inhalte anzuzeigen, die du verlinken kannst. Die Vorschläge werden hier angezeigt, sobald sie uns vorliegen."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Lies unsere Anleitung ĂĽber interne Verlinkung fĂĽr SEO{{/a}}, um mehr zu erfahren."],"Copied!":["Kopiert!"],"Not supported!":["Nicht unterstĂĽtzt!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Versuchst du, mehrere verwandte Keyphrasen zu benutzen? Du solltest sie separat hinzufĂĽgen."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Deine Keyphrase ist zu lang. Die Länge kann maximal 191 Zeichen betragen."],"Add as related keyphrase":["Verwandte Keyphrase hinzufĂĽgen"],"Added!":["HinzugefĂĽgt!"],"Remove":["Entfernen"],"Table of contents":["Inhaltsverzeichnis"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Wir mĂĽssen die SEO-Daten deiner Website optimieren, damit wir die die besten %1$sLink-Vorschläge%2$s anbieten können. %3$sSEO-Datenoptimierung starten%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-el.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-el.json deleted file mode 100644 index f8da5621..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-el.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"el_GR"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Για να αποκτήĎετε Ď€ĎĎŚĎβαĎη Ďε αυτήν τη δυνατότητα, χĎειάζεĎτε ενεĎγές ĎυνδĎομές %2$s και %3$s. %5$sαπενεĎγοποιήĎτε τις ĎυνδĎομές Ďας Ďτο %1$s%6$s ή %7$s αποκτήĎτε μια νέα %4$s%8$s. Στη Ďυνέχεια, ανανεώĎτε αυτήν τη Ďελίδα για να λειτουĎγεί ĎωĎτά η λειτουĎγία, κάτι που μποĎεί να διαĎκέĎει έως και 30 δευτεĎόλεπτα."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["Η δημιουĎγία τίτλων TN απαιτεί να ενεĎγοποιηθεί η ανάλυĎη SEO Ď€Ďιν από τη χĎήĎη. Για να το ενεĎγοποιήĎετε, μεταβείτε Ďτις %2$sδυνατότητες του ÎąĎτότοπου%1$s%3$s, ενεĎγοποιήĎτε την ανάλυĎη SEO και κάντε κλικ Ďτην 'ΑποθήκευĎη αλλαγών'. Εάν η ανάλυĎη SEO είναι απενεĎγοποιημένη Ďτο Ď€Ďοφίλ χĎήĎτη του WordPress, αποκτήĎτε Ď€ĎĎŚĎβαĎη Ďτο Ď€Ďοφίλ Ďας και ενεĎγοποιήĎτε το εκεί. ΕπικοινωνήĎτε με τον διαχειĎÎąĎτή Ďας εάν δεν έχετε Ď€ĎĎŚĎβαĎη Ďε αυτές τις ĎυθμίĎεις."],"Social share preview":["ΠĎοεπιĎκόπηĎη διαμοιĎαĎμού κοινωνικών δικτύων"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Για να ĎυνεχίĎετε να χĎηĎιμοποιείτε τη λειτουĎγία Yoast AI, μειώĎτε τη Ďυχνότητα των αιτημάτων Ďας. Το %1$sάĎθĎÎż βοήθειας%2$s μας παĎέχει οδηγίες για τον αποτελεĎματικό ĎχεδιαĎÎĽĎŚ και τον Ďυθμό των αιτημάτων Ďας για μια βελτιĎτοποιημένη Ďοή εĎγαĎίας."],"You've reached the Yoast AI rate limit.":["Îχετε φτάĎει το ĎŚĎιο ποĎÎżĎτού Yoast AI."],"Allow":["ΕπιτĎέπεται"],"Deny":["ΆĎνηĎη"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Για να δείτε το βίντεο, χĎειάζεται να επιτĎέĎετε το %1$s να φοĎτώĎει τα ενĎωματωμένα βίντεο από %2$s."],"Text generated by AI may be offensive or inaccurate.":["Το κείμενο που δημιουĎγείται από ΤΝ μποĎεί να είναι Ď€ĎÎżĎβλητικό ή ανακĎιβές."],"(Opens in a new browser tab)":["(Ανοίγει Ďε νέα καĎτέλα)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Επιταχύνετε τη Ďοή εĎγαĎίας Ďας με τη δημιουĎγική Τεχνητή ΝοημοĎύνη. ΑποκτήĎτε Ď€ĎοτάĎεις τίτλων και πεĎιγĎαφών Ď…Ďηλής ποιότητας για την αναζήτηĎη και την Ď€Ďοβολή Ďτα κοινωνική δίκτυα. %1$sΜάθετε πεĎÎąĎĎότεĎα%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["ΔημιουĎγήĎτε τίτλους και πεĎιγĎαφές με το Yoast ΤΝ!"],"New to %1$s":["Νέο Ďτο %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["ΕγκĎίνω τους %1$sÎŚĎους των ΥπηĎεĎιών%2$s & %3$sΠολιτική ΑποĎĎήτου%4$s της υπηĎεĎίας Yoast ΤΝ. Αυτό πεĎιλαμβάνει τη ĎυναίνεĎη Ďτη Ďυλλογή και χĎήĎη δεδομένων για τη βελτίωĎη της εμπειĎίας χĎήĎτη."],"Start generating":["ΞεκινήĎτε τη δημιουĎγία"],"Yes, revoke consent":["Ναι, ανάκληĎη ĎυγκατάθεĎης"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Με την ανάκληĎη της ĎυγκατάθεĎή Ďας, δεν θα έχετε πλέον Ď€ĎĎŚĎβαĎη Ďτις λειτουĎγίες Yoast AI. ΕίĎτε βέβαιοι ότι θέλετε να ανακαλέĎετε τη ĎυγκατάθεĎή Ďας;"],"Something went wrong, please try again later.":["Κάτι πήγε ĎĎ„Ďαβά, παĎακαλούμε δοκιμάĎτε ξανά αĎγότεĎα."],"Revoke AI consent":["ΑνάκληĎη ĎυγκατάθεĎης ΤΝ"],"Please enter a focus keyphrase first to use AI.":["ΠαĎακαλούμε ειĎαγάγετε Ď€Ďώτα μια βαĎική φĎάĎη εĎτίαĎης για να χĎηĎιμοποιήĎετε την ΤΝ."],"AI title generator":["ΓεννήτĎια τίτλου TN"],"AI description generator":["ΓεννήτĎια πεĎιγĎαφής TN"],"AI Twitter title generator":["ΓεννήτĎια τίτλου ΤΝ Twitter"],"AI Twitter description generator":["ΓεννήτĎια πεĎιγĎαφής ΤΝ Twitter"],"AI social title generator":["ΓεννήτĎια τίτλου ΤΝ για κοινωνικά δίκτυα"],"AI social description generator":["ΓεννήτĎια πεĎιγĎαφής ΤΝ για κοινωνικά δίκτυα"],"Twitter preview":["ΠĎοεπιĎκόπηĎη Twitter"],"Dismiss":["ΑπόĎĎÎąĎη"],"Don’t show again":["Να μην εμφανιĎτεί ξανά"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sΣυμβουλή%2$s: ΒελτιώĎτε την ακĎίβεια των τίτλων ΤΝ που δημιουĎγείτε ÎłĎάφοντας πεĎÎąĎĎότεĎÎż πεĎιεχόμενο Ďτη Ďελίδα Ďας."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sΣυμβουλή%2$s: ΒελτιώĎτε την ακĎίβεια των πεĎιγĎαφών ΤΝ που δημιουĎγείτε ÎłĎάφοντας πεĎÎąĎĎότεĎÎż πεĎιεχόμενο Ďτη Ďελίδα Ďας."],"Try again":["ΠĎÎżĎπαθήĎτε ξανά"],"Social preview":["ΠĎοεπιĎκόπηĎη κοινωνικής δικτύωĎης"],"Desktop result":["ΑποτέλεĎμα επιτĎαπέζιου"],"Mobile result":["Mobile αποτέλεĎμα"],"Apply AI description":["ΕφαĎμογή πεĎιγĎαφής ΤΝ"],"Apply AI title":["ΕφαĎμογή τίτλου TN"],"Next":["Επόμενο"],"Previous":["ΠĎοηγούμενο"],"Generate 5 more":["ΔημιουĎγήĎτε άλλα 5"],"Google preview":["ΠĎοεπιĎκόπηĎη Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Λόγω των αυĎτηĎών δεοντολογικών οδηγιών του OpenAI και των %1$sπολιτικών χĎήĎης%2$s, δεν μποĎούμε να δημιουĎγήĎουμε τίτλους SEO για τη Ďελίδα Ďας. Εάν Ďκοπεύετε να χĎηĎιμοποιήĎετε τεχνητή νοημοĎύνη, αποφύγετε τη χĎήĎη άĎεμνου, βίαιου ή Ďεξουαλικού πεĎιεχομένου. %3$sΔιαβάĎτε πεĎÎąĎĎότεĎα Ďχετικά με τον Ď„Ďόπο διαμόĎφωĎης της Ďελίδας Ďας για να βεβαιωθείτε ότι έχετε τα καλύτεĎα αποτελέĎματα με την ΤΝ%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Λόγω των αυĎτηĎών δεοντολογικών οδηγιών του OpenAI και των %1$sπολιτικών χĎήĎης%2$s, δεν μποĎούμε να δημιουĎγήĎουμε μετα-πεĎιγĎαφές για τη Ďελίδα Ďας. Εάν Ďκοπεύετε να χĎηĎιμοποιήĎετε τεχνητή νοημοĎύνη, αποφύγετε τη χĎήĎη άĎεμνου, βίαιου ή Ďεξουαλικού πεĎιεχομένου. %3$sΔιαβάĎτε πεĎÎąĎĎότεĎα Ďχετικά με τον Ď„Ďόπο διαμόĎφωĎης της Ďελίδας Ďας για να βεβαιωθείτε ότι έχετε τα καλύτεĎα αποτελέĎματα με την ΤΝ%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Για να αποκτήĎετε Ď€ĎĎŚĎβαĎη Ďε αυτήν τη δυνατότητα, χĎειάζεĎτε μια ενεĎγή ĎυνδĎομή %1$s. %3$sενεĎγοποιήĎτε τη ĎυνδĎομή Ďας Ďτο %2$s%4$s ή %5$s αποκτήĎτε μια νέα ĎυνδĎομή %1$s%6$s. Στη Ďυνέχεια, κάντε κλικ Ďτο κουμπί για να ανανεώĎετε αυτήν τη Ďελίδα για να λειτουĎγήĎει ĎωĎτά η λειτουĎγία, κάτι που μποĎεί να διαĎκέĎει έως και 30 δευτεĎόλεπτα."],"Refresh page":["ΑνανέωĎη Ďελίδας"],"Not enough content":["ΧωĎÎŻĎ‚ αĎκετό πεĎιεχόμενο"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["ΠαĎακαλούμε δοκιμάĎτε ξανά αĎγότεĎα. Εάν το Ď€Ďόβλημα παĎαμένει, %1$sεπικοινωνήĎτε με την ομάδα υποĎτήĎιξης%2$s!"],"Something went wrong":["ΠαĎουĎιάĎτηκε κάποιο Ďφάλμα"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Φαίνεται ότι Ď€ĎοέκυĎε ένα χĎονικό ĎŚĎιο ĎύνδεĎης. Ελέγξτε τη ĎύνδεĎή Ďας Ďτο διαδίκτυο και δοκιμάĎτε ξανά αĎγότεĎα. Εάν το Ď€Ďόβλημα παĎαμένει, %1$sεπικοινωνήĎτε με την ομάδα υποĎτήĎιξης%2$s"],"Connection timeout":["ΧĎονικό ĎŚĎιο ĎύνδεĎης"],"Use AI":["ΧĎήĎη ΤΝ"],"Close modal":["ΚλείĎιμο παĎαθύĎου"],"Learn more about AI (Opens in a new browser tab)":["Μάθετε πεĎÎąĎĎότεĎα για την Τεχνητή ΝοημοĎύνη (Ανοίγει Ďε νέα καĎτέλα του Ď€ĎογĎάμματος πεĎιήγηĎης)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sΤίτλος%3$s: Η Ďελίδα Ďας δεν έχει ακόμη τίτλο. %2$sΠĎÎżĎθέĎτε έναν%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sΤίτλος%2$s: Η Ďελίδα Ďας έχει τίτλο. ΜπĎάβο!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sΚατανομή φĎάĎης-κλειδί%3$s: %2$sΣυμπεĎιλάβετε τη φĎάĎη-κλειδί ή Ďυνώνυμά της Ďτο κείμενο ĎŽĎτε να αναλύĎουμε την κατανομή της φĎάĎης-κλειδί%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sΚατανομή φĎάĎης-κλειδιού%2$s: Καλή δουλειά!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sΚατανομή φĎάĎης-κλειδιού%3$s: ΆνιĎη. ÎźĎÎąĎμένα μέĎη του κειμένου Ďας δεν πεĎιέχουν τη φĎάĎη-κλειδί ή τα Ďυνώνυμά της. %2$sΚατανείμετε τα πιο ομοιόμοĎφα%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sΚατανομή φĎάĎης-κλειδιού%3$s: Πολύ άνιĎη. Μεγάλα μέĎη του κειμένου Ďας δεν πεĎιέχουν τη φĎάĎη-κλειδί ή Ďυνώνυμά της. %2$sΚατανείμετε τα πιο ομοιόμοĎφα%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: Δεν χĎηĎιμοποιείτε πάĎα πολλές Ďύνθετες λέξεις, γεγονός που καθιĎτά το κείμενό Ďας εύκολο Ďτην ανάγνωĎη. Καλή δουλειά!"],"Word complexity":["Πολυπλοκότητα λέξεων"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s από τις λέξεις Ďτο κείμενό Ďας θεωĎούνται Ďύνθετες. %3$sΠĎÎżĎπαθήĎτε να χĎηĎιμοποιήĎετε μικĎότεĎες και πιο οικείες λέξεις για να βελτιώĎετε την αναγνωĎιμότητα%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sΣτοίχιĎη%3$s: ΥπάĎχει μια μεγάλη ενότητα κειμένου με ĎτοίχιĎη Ďτο κέντĎÎż. %2$sΣυνιĎτούμε να την κάνετε με αĎÎąĎτεĎή ĎτοίχιĎη%3$s.","%1$sΣτοίχιĎη%3$s: ΥπάĎχουν %4$s μεγάλες ενότητες κειμένου με ĎτοίχιĎη Ďτο κέντĎÎż. %2$sΣυνιĎτούμε να τις κάνετε αĎÎąĎτεĎή ĎτοίχιĎη%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sΣτοίχιĎη%3$s: ΥπάĎχει μια μεγάλη ενότητα κειμένου με ĎτοίχιĎη Ďτο κέντĎÎż. %2$sΣυνιĎτούμε να την κάνετε δεξιά ĎτοίχιĎη%3$s.","%1$sΣτοίχιĎη%3$s: ΥπάĎχουν %4$s μεγάλες ενότητες κειμένου με ĎτοίχιĎη Ďτο κέντĎÎż. %2$sΣυνιĎτούμε να τις κάνετε δεξιά ĎτοίχιĎη%3$s."],"Select image":["Επιλέξτε εικόνα"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["ÎŹĎα να Ď€ĎÎżĎθέĎετε μεĎικούς ĎυνδέĎμους! ΠαĎακάτω, βλέπετε μια λίĎτα με βαĎικό πεĎιεχόμενο Ďας. Κάτω από κάθε βαĎικό πεĎιεχόμενο, υπάĎχουν Ď€ĎοτάĎεις για άĎθĎα από τα οποία θα μποĎούĎατε να Ď€ĎÎżĎθέĎετε έναν ĎύνδεĎÎĽÎż. Κατά την Ď€ĎÎżĎθήκη του ĎυνδέĎμου, φĎοντίĎτε να τον ειĎαγάγετε Ďε μια Ďχετική Ď€ĎόταĎη που Ďχετίζεται με το άĎθĎÎż βαĎικό πεĎιεχόμενο Ďας. ΣυνεχίĎτε να Ď€ĎÎżĎθέτετε ĎυνδέĎμους από ĎŚĎα Ďχετικά άĎθĎα χĎειάζεĎτε, έως ότου τα βαĎικά Ďας πεĎιεχόμενα έχουν τους πεĎÎąĎĎότεĎους εĎωτεĎικούς ĎυνδέĎμους που δείχνουν Ď€Ďος αυτά."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["ÎźĎÎąĎμένα άĎθĎα Ďτον ÎąĎτότοπό Ďας είναι %1$sτα%2$s πιο Ďημαντικά. Απαντούν Ďτις εĎωτήĎεις των ανθĎώπων και λύνουν τα Ď€Ďοβλήματά τους. ΆĎα, τους αξίζει η κατάταξη! Στο %3$s, ονομάζουμε αυτά τα άĎθĎα βαĎικό πεĎιεχόμενο. Îνας από τους Ď„Ďόπους για να τα κατατάξετε είναι να τους υποδείξετε αĎκετούς ĎυνδέĎμους. ΠεĎÎąĎĎότεĎοι ĎύνδεĎμοι Ďηματοδοτούν Ďτις μηχανές αναζήτηĎης ότι αυτά τα άĎθĎα είναι Ďημαντικά και πολύτιμα. Σε αυτήν την Ď€ĎοπόνηĎη, θα Ďας βοηθήĎουμε να Ď€ĎÎżĎθέĎετε ĎυνδέĎμους Ďτα άĎθĎα με το βαĎικό Ďας πεĎιεχόμενο!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Μόλις Ď€ĎÎżĎθέĎετε λίγο πεĎÎąĎĎότεĎÎż κείμενο, θα μποĎούμε να Ďας πούμε το επίπεδο τυπικότητας του κειμένου Ďας."],"Overall, your text appears to be %1$s%3$s%2$s.":["Συνολικά, το κείμενό Ďας φαίνεται να είναι %1$s%3$s%2$s."],"Heading %d":["Επικεφαλίδα %d"],"Maximum heading level":["ΜέγιĎτο επίπεδο επικεφαλίδας"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Îχετε απενεĎγοποιήĎει τις Ď€ĎοτάĎεις ĎυνδέĎμων, οι οποίες είναι απαĎαίτητες για να λειτουĎγήĎουν οι Ďχετικοί ĎύνδεĎμοι. Εάν θέλετε να Ď€ĎÎżĎθέĎετε Σχετικούς ĎυνδέĎμους, μεταβείτε Ďτις ΛειτουĎγίες ÎąĎτότοπου και ενεĎγοποιήĎτε τις Ď€ĎοτάĎεις ĎυνδέĎμων."],"Schema":["Schema"],"Meta tags":["Μέτα ετικέτες"],"Not available":["Μη διαθέĎιμο"],"Checks":["Îλεγχοι"],"Focus Keyphrase":["Λέξη-κλειδί εĎτίαĎης"],"Good":["Καλό"],"No index":["No index"],"Front-end SEO inspector":["ΕπιθεωĎητής SEO Front-end"],"Focus keyphrase not set":["Δεν έχει ÎżĎÎąĎτεί φĎάĎη κλειδί"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["ΣημείωĎη: Για να λειτουĎγήĎει καλά αυτή η άĎκηĎη, Ď€Ďέπει να εκτελέĎετε το εĎγαλείο βελτιĎτοποίηĎης δεδομένων SEO. Οι διαχειĎÎąĎτές μποĎούν να το εκτελέĎουν κάτω από %1$sSEO > ΕĎγαλεία%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Îχετε Ď€ĎÎżĎθέĎει ĎυνδέĎμους Ďτα ÎżĎφανά άĎθĎα Ďας και έχετε καθαĎÎŻĎει αυτά που δεν ήταν πλέον Ďχετικά. Καλή δουλειά! Ρίξτε μια ματιά Ďτην παĎακάτω πεĎίληĎη και γιοĎτάĎτε ĎŚĎα καταφέĎατε!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["ΕξετάĎτε ÎşĎιτικά το πεĎιεχόμενο αυτής της λίĎτας και κάντε τις απαĎαίτητες ενημεĎĎŽĎεις. Εάν χĎειάζεĎτε βοήθεια για την ενημέĎωĎη, έχουμε ένα πολύ %1$sχĎήĎιμο άĎθĎÎż ÎąĎτολογίου που μποĎεί να Ďας καθοδηγήĎει Ďε όλη τη διαδĎομή%2$s (κάντε κλικ για άνοιγμα Ďε νέα καĎτέλα)"],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sΧĎειάζεĎτε πεĎÎąĎĎότεĎη καθοδήγηĎη; Îχουμε καλύĎει κάθε βήμα με πεĎÎąĎĎότεĎες λεπτομέĎειες Ďτον ακόλουθο οδηγό: %2$sΠώς να χĎηĎιμοποιήĎετε την άĎκηĎη%7$s ÎżĎφανού πεĎιεχομένου%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Μόλις κάνατε το καλύτεĎÎż πεĎιεχόμενό Ďας να είναι εύκολο να βĎεθεί και πιο πιθανό να ταξινομηθεί! ΜπĎάβο! Από καιĎĎŚ Ďε καιĎĎŚ, θυμηθείτε να ελέγχετε εάν το βαĎικό Ďας πεĎιεχόεμνο λαμβάνει αĎκετούς ĎυνδέĎμους!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Ρίξτε μια ματιά Ďτην παĎακάτω λίĎτα. Το βαĎικό Ďας πεĎιεχόμενο (που επιĎημαίνονται με %1$s) έχουν τους πεĎÎąĎĎότεĎους εĎωτεĎικούς ĎυνδέĎμους που δείχνουν Ď€Ďος αυτούς; Κάντε κλικ Ďτο κουμπί ΒελτιĎτοποίηĎη εάν πιĎτεύετε ότι ένα βαĎικό πεĎιεχόμενο χĎειάζεται πεĎÎąĎĎότεĎους ĎυνδέĎμους. Αυτό θα μετακινήĎει το άĎθĎÎż Ďτο επόμενο βήμα."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Îχουν όλα τα βαĎικά Ďας πεĎιεχόμενα έχουν Ď€ĎάĎινες ĎφαίĎες; Για καλύτεĎα αποτελέĎματα, Ďκεφτείτε να επεξεĎγαĎτείτε αυτά που δεν το έχουν!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Ποια άĎθĎα θέλετε να κατατάξετε την Ď…ĎηλότεĎη βαθμολογία; Ποια θα έβĎÎąĎκε το κοινό Ďας πιο χĎήĎιμα και ολοκληĎωμένα; Κάντε κλικ Ďτο βέλος που δείχνει Ď€Ďος τα κάτω και αναζητήĎτε άĎθĎα που ταιĎιάζουν Ďε αυτά τα ÎşĎιτήĎια. Îα επιĎημάνουμε αυτόματα τα άĎθĎα που επιλέγετε από τη λίĎτα ως βαĎικό πεĎιεχόμενο."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sΧĎειάζεĎτε πεĎÎąĎĎότεĎη καθοδήγηĎη; ΚαλύĎαμε κάθε βήμα με πεĎÎąĎĎότεĎες λεπτομέĎειες Ďτο: %2$sΤĎόπος χĎήĎης της άĎκηĎης%7$s βαĎικού πεĎιεχομένου%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["ΥποĎελίδες Yoast"],"Yoast Siblings":["Αδέλφια Yoast"],"Yoast Table of Contents":["Πίνακας πεĎιεχομένων Yoast"],"Yoast Related Links":["Σχετικοί ĎύνδεĎμοι με Yoast"],"Finish optimizing":["ΟλοκληĎĎŽĎτε την βελτιĎτοποίηĎη"],"You've finished adding links to this article.":["ΟλοκληĎĎŽĎατε την Ď€ĎÎżĎθήκη ĎυνδέĎμων Ďε αυτό το άĎθĎÎż."],"Optimize":["ΒελτιĎτοποίηĎη"],"Added to next step":["ΠĎÎżĎτέθηκε Ďτο επόμενο βήμα"],"Choose cornerstone articles...":["Επιλέξτε τα ακĎογωνιαία άĎθĎα Ďας..."],"Loading data...":["ΦόĎτωĎη δεδομένων..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Δεν έχετε καθαĎÎŻĎει ή ενημεĎĎŽĎει κάποια άĎθĎα Ďας ακόμη χĎηĎιμοποιώντας αυτή την άĎκηĎη. Μόλις το κάνετε, μια ĎύνοĎη της δουλειάς Ďας θα εμφανιĎτεί εδώ."],"Skipped":["ΠαĎακάμφθηκε"],"Hidden from search engines.":["ΚĎυφό από τις μηχανές αναζήτηĎης."],"Removed":["ΑφαιĎέθηκε"],"Improved":["Βελτιώθηκε"],"Resolution":["ΑνάλυĎη"],"Loading redirect options...":["ΦόĎτωĎη επιλογών ανακατεύθυνĎης..."],"Remove and redirect":["ΑφαιĎέθηκε και ανακατευθύνθηκε"],"Custom url:":["ΠĎÎżĎαĎÎĽÎżĎμένο url:"],"Related article:":["Σχετικό άĎθĎÎż:"],"Home page:":["ΑĎχική Ďελίδα:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["ΠĎόκειται να αφαιĎέĎετε %1$s%2$s%3$s. Για να αποφύγετε τα 404 Ďτον ÎąĎτότοπο Ďας, θα Ď€Ďέπει να το ανακετευθύνετε Ďε άλλη Ďελίδα του ÎąĎτότοπου Ďας. Που θέλετε να το ανακατευθείνετε;"],"SEO Workout: Remove article":["ΕξάĎκηĎη SEO: ΑφαίĎεĎη άĎθĎου"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Τα πάντα δείχνουν καλά! Δεν βĎήκαμε κάποια άĎθĎα Ďτον ÎąĎτότοπο Ďας τα οποία είναι παλιότεĎα από έξι μήνες και λαμβάνουν λίγους ĎυνδέĎμους Ďτον ÎąĎτότοπο Ďας. Επανέλθετε αĎγότεĎα για νέες Ď€ĎοτάĎεις βελτίωĎης!"],"Hide from search engines":["ΑπόκĎĎ…Ďη από τις μηχανές αναζήτηĎης"],"Improve":["ΒελτίωĎη"],"Are you sure you wish to hide this article from search engines?":["ΕίĎτε ĎίγουĎοι ότι θέλετε να ÎşĎĎŤĎετε αυτό το άĎθĎÎż από τις μηχανές αναζήτηĎης;"],"Action":["ΕνέĎγεια"],"You've hidden this article from search engines.":["Îχετε ÎşĎĎŤĎει αυτό το άĎθĎÎż από τις μηχανές αναζήτηĎης."],"You've removed this article.":["Îχετε αφαιĎέĎει αυτό το άĎθĎÎż."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Δεν έχετε επιλέξει κανένα άĎθĎÎż για βελτίωĎη. Επιλέξτε μεĎικά άĎθĎα Ďτα Ď€Ďηγούμενα βήματα ĎŽĎτε να Ď€ĎÎżĎθέĎετε ĎυνδέĎμους και να Ďας Ď€Ďοβάλουμε Ď€ĎοτάĎεις ĎυνδέĎμων εδώ."],"Loading link suggestions...":["ΦόĎτωĎη Ď€ĎοτάĎεων ĎυνδέĎμων..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Δεν βĎήκαμε καμία Ď€ĎόταĎη για αυτό το άĎθĎÎż, αλλά μποĎείτε να Ď€ĎÎżĎθέĎετε ĎυνδέĎμους άĎθĎων που πιĎτεύετε ότι είναι Ďχετικά."],"Skip":["ΠαĎάλειĎη"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Δεν έχετε επιλέξει κανένα άĎθĎÎż για αυτό το βήμα ακόμη. ΜποĎεί να το κάνετε Ďτο Ď€Ďοηγούμενο βήμα."],"Is it up-to-date?":["Είναι ενημεĎωμένο;"],"Last Updated":["Τελευταία ενημέĎωĎη"],"You've moved this article to the next step.":["Îχετε μετακινήĎεις αυτό το άĎθĎÎż Ďτο επόμενο βήμα."],"Unknown":["ΆγνωĎτο"],"Clear summary":["ΚαθαĎÎąĎÎĽĎŚĎ‚ πεĎίληĎης"],"Add internal links towards your orphaned articles.":["ΠĎÎżĎθέĎτε εĎωτεĎικούς ĎυνδέĎμους Ď€Ďος τα ÎżĎφανά άĎθĎα Ďας"],"Should you update your article?":["ΠĎέπει να ενημεĎĎŽĎετε το άĎθĎÎż Ďας;"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Îź ÎąĎτότοπός Ďας μποĎεί να πεĎιλαμβάνει αĎκετό πεĎιεχόμενο που δημιουĎγήĎατε μια φοĎά και δεν το ξανακοίταξα έκτοτε. Είναι Ďημαντικό να πεĎάĎετε από αυτές τις Ďελίδες και να αναĎωτηθείτε εάν αυτό το πεĎιεχόμενο εξακολουθεί να είναι Ďχετικό με τον ÎąĎτότοπό Ďας. Αν Ď€Ďέπει να το βελτιώĎετε ή να το αφαιĎέĎετε;"],"Start: Love it or leave it?":["ÎναĎξη: ΑγάπηĎε το ή άφηĎε το"],"Clean up your unlinked content to make sure people can find it":["ΚαθαĎÎŻĎτε το αĎύνδετο πεĎιεχόμενο Ďας ĎŽĎτε να ĎιγουĎευτείται ότι οι επιĎκέπτες μποĎούν τα το βĎούν."],"I've finished this workout":["ΟλοκλήĎωĎα αυτή την εξάĎκηĎη"],"Reset this workout":["Κάνε επαναφοĎά της εξάĎκηĎης"],"Well done!":["ΣυγχαĎητήĎια!"],"Add internal links towards your cornerstones":["ΠĎÎżĎθέĎτε εĎωτεĎικούς ĎυνδέĎμους Ď€Ďος τα βαĎικά άĎθĎα Ďας"],"Check the number of incoming internal links of your cornerstones":["Ελέγξτε τον αĎιθμό των ειĎεĎχομένων εĎωτεĎικών ĎυνδέĎμων των βαĎικών πεĎιεχομένων άĎθĎων Ďας"],"Start: Choose your cornerstones!":["Επιλέξτε τα βαĎικά πεĎιεχόμενα κείμενα Ďας (cornerstones)!"],"The cornerstone approach":["ΠĎÎżĎέγγιĎη βαĎικού πεĎιεχομένου"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["ΠαĎακαλούμε λάβετε υπόĎιν ότι: για να λειτουĎγήĎει ĎωĎτά αυτή η άĎκηĎη και να Ďας Ď€ĎÎżĎφέĎει Ď€ĎοτάĎεις ĎυνδέĎμων, Ď€Ďέπει Ď€Ďώτα να Ď„Ďέξετε το εĎγαλείο βελτιĎτοποίηĎης δεδομένων SEO. Οι διαχειĎÎąĎτές μποĎούν να το Ď„Ďέξουν Ďτο μενού %1$sSEO > ΕĎγαλεία%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Îχω ολοκληĎĎŽĎει αυτό το βήμα"],"Revise this step":["ΑναθεωĎείĎτε αυτό το βήμα"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Δεν μποĎέĎαμε να βĎούμε εĎωτεĎικούς ĎυνδέĎμους Ďτις Ďελίδες Ďας. Είτε δεν έχετε Ď€ĎÎżĎθέĎει ακόμη κανένα εĎωτεĎικό ĎύνδεĎÎĽÎż Ďτο πεĎιεχόμενο Ďας, ή η Yoast SEO δεν τους ενέταξε Ďτο ευĎετήĎιο. ΜποĎείτε να ζητήĎετε απο τη Yoast SEO να εντάξει Ďτο ευĎετήĎιο τους ĎυνδέĎμους Ďας, Ď„Ďέχοντας το εĎγαλείο βελτιĎτοποίηĎης δεδομένων SEO Ďτο μενού SEO > ΕĎγαλεία."],"Incoming links":["ΕιĎεĎχόμενοι ĎύνδεĎμοι"],"Edit to add link":["ΕπεξεĎγαĎία για Ď€ĎÎżĎθήκη ĎύνδεĎμου"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Επί του παĎόντος δεν έχετε ĎημειώĎει άĎθĎα ως Ďημαντικού πεĎιεχομένου. Όταν ĎημειώĎετε τα άĎθĎα που θέλετε ως Ďημαντικά άĎθĎα, θα εμφανιĎτούν εδώ."],"Focus keyphrase":["ΕĎτιάĎτε Ďτη φĎάĎη - κλειδί"],"Article":["ΆĎθĎÎż"],"Readability score":["Βαθμολογία αναγνωĎιμότητας"],"SEO score":["SEO ĎκόĎ"],"Copy failed":["Η αντιγĎαφή απέτυχε"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["ΒελτιώĎτε την κατάταξη για όλα τα βαĎικού πεĎιεχομένου άĎθĎα Ďας, χĎηĎιμοποιώντας αυτή τη %1$sβήμα-Ď€Ďος-βήμα άĎκηĎη!%2$s"],"Rank with articles you want to rank with":["Ανεβείτε Ďτην κατάταξη με τα άĎθĎα που Ď€Ďαγματικά επιθυμείτε. "],"Descriptive text":["ΠεĎιγĎαφικό κείμενο"],"Show the descriptive text":["ΕμφάνιĎε το πεĎιγĎαφικό κείμενο"],"Show icon":["ΕμφάνιĎε το εικονίδιο"],"Yoast Estimated Reading Time":["Yoast Εκτιμώμενος ΧĎόνος ΑνάγνωĎης"],"Shows an estimated reading time based on the content length.":["Εμφανίζει έναν εκτιμώμενο χĎόνο ανάγνωĎης με βάĎη το μήκος του πεĎιεχομένου."],"reading time":["χĎόνος ανάγνωĎης"],"content length":["μήκος πεĎιεχομένου"],"Estimated reading time:":["Εκτιμώμενος χĎόνος ανάγνωĎης:"],"minute":["λεπτό","λεπτά"],"Settings":["ΡυθμίĎεις"],"OK":["OK"],"Close":["ΚλείĎιμο"],"Type":["Τύπος"],"Orphaned content":["ÎźĎφανό πεĎιεχόμενο"],"Synonyms":["Συνώνυμα"],"Internal linking suggestions":["ΠĎοτάĎεις εĎωτεĎικών ĎυνδέĎεων"],"Enter a related keyphrase to calculate the SEO score":["ΕιĎάγετε μία Ďχετική φĎάĎη-κλειδί για να υπολογιĎτεί η SEO βαθμολογία"],"Related keyphrase":["Σχετική φĎάĎη-κλειδί"],"Add related keyphrase":["ΠĎÎżĎθέĎτε Ďχετική φĎάĎη-κλειδί"],"Analysis results":["ΑποτελέĎματα ανάλυĎης"],"Help on choosing the perfect keyphrase":["Βοήθεια για την επιλογή της τέλειας φĎάĎης-κλειδί"],"Help on keyphrase synonyms":["Βοήθεια για τα Ďυνώνυμα των φĎάĎεων-κλειδιών"],"Keyphrase":["ΦĎάĎη κλειδί"],"New URL: {{link}}%s{{/link}}":["Νέα διεύθυνĎη URL: {{link}}%s{{/link}}"],"Undo":["ΑναίĎεĎη"],"Redirect created":["ΔημιουĎγήθηκε η ανακατεύθυνĎη"],"%s just created a redirect from the old URL to the new URL.":["%s μόλις δημιουĎγήθηκε μια ανακατεύθυνĎη από την παλιά διεύθυνĎη URL Ďτη νέα διεύθυνĎη URL."],"Old URL: {{link}}%s{{/link}}":["Παλιά διεύθυνĎη URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Συνώνυμα φĎάĎης-κλειδί"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["ΠĎοεπιĎκόπηĎη κοινοποίηĎης Ďτο Twitter"],"Adds a list of internal links to sibling pages which share the same parent.":["ΠĎÎżĎθέτει μία λίĎτα εĎωτεĎικών ĎυνδέĎμων Ďτις αδελφικές Ďελίδες οι οποίες έχουν κοινή γονική Ďελίδα."],"siblings":["αδέλφια"],"sibling pages":["αδελφές Ďελίδες"],"Adds a list of internal links to subpages of this page.":["ΠĎÎżĎθέτει μία λίĎτα εĎωτεĎικών ĎυνδέĎμων Ďε υποĎελίδες αυτής της Ďελίδας."],"seo":["SEO"],"subpages":["υποĎελίδες"],"childpages":["θυγατĎικές Ďελίδες"],"children":["τέκνα"],"internal linking":["εĎωτεĎική ĎύνδεĎη"],"site structure":["Δομή ÎąĎτοτόπου"],"We could not find any relevant articles on your website that you could link to from your post.":["Δεν ήταν δυνατή η εύĎεĎη Ďχετικών άĎθĎων Ďτον ÎąĎτότοπό Ďας που θα μποĎούĎατε να ĎυνδέĎετε την ανάĎτηĎη Ďας."],"Load suggestions":["ΦόĎτωĎη Ď€ĎοτάĎεων"],"Refresh suggestions":["ΑνανέωĎη Ď€ĎοτάĎεων"],"Write list…":["ΕγγĎαφή λίĎτας..."],"Adds a list of links related to this page.":["ΠĎÎżĎθέτει μία λίĎτα ĎυνδέĎμων Ďχετικών με αυτή τη Ďελίδα."],"related posts":["Ďχετικές δημοĎιεύĎεις"],"related pages":["Ďχετικές Ďελίδες"],"Adds a table of contents to this page.":["ΠĎÎżĎθέτει ένα πίνακα πεĎιεχομένων Ďε αυτή τη Ďελίδα."],"links":["ĎύνδεĎμοι"],"toc":["πίνακας πεĎιεχομένων"],"Copy link":["ΑντιγĎαφή ĎυνδέĎμου"],"Copy link to suggested article: %s":["ΑντιγĎαφή ĎυνδέĎμου Ďτο Ď€Ďοτεινόμενο άĎθĎÎż: %s"],"Add a title to your post for the best internal linking suggestions.":["ΠĎÎżĎθέĎτε ένα τίτλο Ďτην δημοĎίευĎη Ďας για να λάβετε τις καλύτεĎες Ď€ĎοτάĎεις εĎωτεĎικής ĎύνδεĎης."],"Add a metadescription to your post for the best internal linking suggestions.":["ΠĎÎżĎθέĎτε μία μέτα πεĎιγĎαφή Ďτην ανάĎτηĎη Ďας για να λάβετε τις καλύτεĎες Ď€ĎοτάĎεις εĎωτεĎικής ĎύνδεĎης."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["ΠĎÎżĎθέĎτε ένα τίτλο και μία μέτα πεĎιγĎαφή Ďτην ανάĎτηĎη Ďας για να λάβετε τις καλύτεĎες Ď€ĎοτάĎεις εĎωτεĎικής ĎύνδεĎης."],"Also, add a title to your post for the best internal linking suggestions.":["ΕπίĎης, Ď€ĎÎżĎθέĎτε ένα τίτλο Ďτην δημοĎίευĎη Ďας για να λάβετε τις καλύτεĎες Ď€ĎοτάĎεις εĎωτεĎικής ĎύνδεĎης."],"Also, add a metadescription to your post for the best internal linking suggestions.":["ΕπίĎης, Ď€ĎÎżĎθέĎτε μία μέτα πεĎιγĎαφή Ďτην δημοĎίευĎη Ďας για να λάβετε τις καλύτεĎες Ď€ĎοτάĎεις εĎωτεĎικής ĎύνδεĎης."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["ΕπίĎης, Ď€ĎÎżĎθέĎτε ένα τίτλο και μία μέτα πεĎιγĎαφή Ďτην δημοĎίευĎη Ďας για να λάβετε τις καλύτεĎες Ď€ĎοτάĎεις εĎωτεĎικής ĎύνδεĎης."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Μόλις Ď€ĎÎżĎθέĎετε λίγο πεĎÎąĎĎότεĎÎż κείμενο, θα Ďας παĎέχουμε εδώ μία λίĎτα με Ďχετικό πεĎιεχόμενο το οποίο θα μποĎούĎατε να ĎυνδέĎετε Ďτην δημοĎίευĎη Ďας."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Για να βελτιώĎετε τη δομή του ÎąĎτοτόπου Ďας, εξετάĎτε το ενδεχόμενο να χĎηĎιμοποιήĎετε ĎυνδέĎεις Ď€Ďος άλλες Ďχετικές δημοĎιεύĎεις ή Ďελίδες Ďτον ÎąĎτότοπο Ďας."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["ΧĎειάζονται μεĎικά δευτεĎόλεπτα μέχĎÎą να εμφανιĎτεί μία λίĎτα με Ďχετικό πεĎιεχόμενο με το οποίο θα μποĎούĎατε να Ď€ĎαγματοποιήĎετε ĎύνδεĎη. Οι Ď€ĎοτάĎεις θα εμφανιĎτούν εδώ μόλις τις έχουμε."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}ΔιαβάĎτε τον οδηγό μας Ďχετικά με την εĎωτεĎική ĎύνδεĎη για SEO{{/a}} για να μάθετε πεĎÎąĎĎότεĎα."],"Copied!":["ΑντιγĎάφηκε!"],"Not supported!":["Δεν υποĎτηĎίζεται!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Μήπως Ď€ĎÎżĎπαθείτε να χĎηĎιμοποιήĎετε πολλαπλές Ďχετικές φĎάĎεις-κλειδιά; Îα Ď€Ďέπει να τις Ď€ĎÎżĎθέĎετε ξεχωĎÎąĎτά."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Η φĎάĎη κλειδί που ειĎάγατε είναι πολύ μεγάλη. Το ανώτατο επιτĎεπόμενο ĎŚĎιο ÎżĎίζεται έως 191 χαĎακτήĎες."],"Add as related keyphrase":["ΠĎÎżĎθήκη ως Ďχετική φĎάĎη-κλειδί"],"Added!":["ΠĎÎżĎτέθηκε!"],"Remove":["ΑφαίĎεĎη"],"Table of contents":["Πίνακας πεĎιεχομένων (TOC)"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["ΠĎέπει να βελτιώĎουμε τα δεδομένα SEO του ÎąĎτοτόπου Ďας για να Ďας Ď€ĎÎżĎφέĎουμε τις καλύτεĎες %1$sĎ€ĎοτάĎεις ĎυνδέĎμων%2$s. %3$sΕκκίνηĎη βελτιĎτοποιήĎης δεδομένων SEO%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-en_AU.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-en_AU.json deleted file mode 100644 index 63b573fb..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-en_AU.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_AU"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings."],"Social share preview":["Social share preview"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimised workflow."],"You've reached the Yoast AI rate limit.":["You've reached the Yoast AI rate limit."],"Allow":["Allow"],"Deny":["Deny"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["To see this video, you need to allow %1$s to load embedded videos from %2$s."],"Text generated by AI may be offensive or inaccurate.":["Text generated by AI may be offensive or inaccurate."],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Generate titles & descriptions with Yoast AI!"],"New to %1$s":["New to %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience."],"Start generating":["Start generating"],"Yes, revoke consent":["Yes, revoke consent"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?"],"Something went wrong, please try again later.":["Something went wrong, please try again later."],"Revoke AI consent":["Revoke AI consent"],"Please enter a focus keyphrase first to use AI.":["Please enter a focus keyphrase first to use AI."],"AI title generator":["AI title generator"],"AI description generator":["AI description generator"],"AI Twitter title generator":["AI Twitter title generator"],"AI Twitter description generator":["AI Twitter description generator"],"AI social title generator":["AI social title generator"],"AI social description generator":["AI social description generator"],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":["Don’t show again"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page."],"Try again":["Try again"],"Social preview":["Social preview"],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":["Apply AI description"],"Apply AI title":["Apply AI title"],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":["Generate 5 more"],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, click the button to refresh this page for the feature to function correctly, which may take up to 30 seconds."],"Refresh page":["Refresh page"],"Not enough content":["Not enough content"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Please try again later. If the issue persists, please %1$scontact our support team%2$s!"],"Something went wrong":["Something went wrong"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s"],"Connection timeout":["Connection timeout"],"Use AI":["Use AI"],"Close modal":["Close modal"],"Learn more about AI (Opens in a new browser tab)":["Learn more about AI (Opens in a new browser tab)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTitle%2$s: Your page has a title. Well done!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sAlignment%3$s: There is a long section of centre-aligned text. %2$sWe recommend making it left-aligned%3$s.","%1$sAlignment%3$s: There are %4$s long sections of centre-aligned text. %2$sWe recommend making them left-aligned%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sAlignment%3$s: There is a long section of centre-aligned text. %2$sWe recommend making it right-aligned%3$s.","%1$sAlignment%3$s: There are %4$s long sections of centre-aligned text. %2$sWe recommend making them right-aligned%3$s."],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Once you add a bit more copy, we'll be able to tell you the formality level of your text."],"Overall, your text appears to be %1$s%3$s%2$s.":["Overall, your text appears to be %1$s%3$s%2$s."],"Heading %d":["Heading %d"],"Maximum heading level":["Maximum heading level"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions."],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Not available"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: For this to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you've accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You've just made your best content easy to find, and more likely to rank! Way to go Cobber! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more help? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast Subpages"],"Yoast Siblings":["Yoast Siblings"],"Yoast Table of Contents":["Yoast Table of Contents"],"Yoast Related Links":["Yoast Related Links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles…"],"Loading data...":["Loading data…"],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Home page:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: Remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few orphaned articles in the previous steps to add links to and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up-to-date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site often contains lots of content that's created once and never looked back to afterwards. It's important to go through these and ask yourself if this content is still relevant to your site. Should I improve it or remove it?"],"Start: Love it or leave it?":["Start: Love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: Choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find any internal links on your pages. Either you haven't added any, or Yoast SEO failed to index them. However, you can have them indexed by running the SEO data optimization under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve your cornerstones rankings by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles you want to rank with"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on content length"],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Settings"],"OK":["OK"],"Close":["Close"],"Type":["Type"],"Orphaned content":["Orphaned content"],"Synonyms":["Synonyms"],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":["seo"],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a metadescription to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a metadescription to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a metadescription to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a metadescription to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to build a list of related content that you could link. suggestions will show here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["If you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-en_CA.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-en_CA.json deleted file mode 100644 index 2400ad13..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-en_CA.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_CA"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Settings"],"OK":["OK"],"Close":["Close"],"Type":["Type"],"Orphaned content":["Orphaned content"],"Synonyms":["Synonyms"],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-en_GB.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-en_GB.json deleted file mode 100644 index d851b66c..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-en_GB.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings."],"Social share preview":["Social share preview"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimised workflow."],"You've reached the Yoast AI rate limit.":["You've reached the Yoast AI rate limit."],"Allow":["Allow"],"Deny":["Deny"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["To see this video, you need to allow %1$s to load embedded videos from %2$s."],"Text generated by AI may be offensive or inaccurate.":["Text generated by AI may be offensive or inaccurate."],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Generate titles & descriptions with Yoast AI!"],"New to %1$s":["New to %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience."],"Start generating":["Start generating"],"Yes, revoke consent":["Yes, revoke consent"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?"],"Something went wrong, please try again later.":["Something went wrong, please try again later."],"Revoke AI consent":["Revoke AI consent"],"Please enter a focus keyphrase first to use AI.":["Please enter a focus keyphrase first to use AI."],"AI title generator":["AI title generator"],"AI description generator":["AI description generator"],"AI Twitter title generator":["AI Twitter title generator"],"AI Twitter description generator":["AI Twitter description generator"],"AI social title generator":["AI social title generator"],"AI social description generator":["AI social description generator"],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":["Don’t show again"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page."],"Try again":["Try again"],"Social preview":["Social preview"],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":["Apply AI description"],"Apply AI title":["Apply AI title"],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":["Generate 5 more"],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, click the button to refresh this page for the feature to function correctly, which may take up to 30 seconds."],"Refresh page":["Refresh page"],"Not enough content":["Not enough content"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Please try again later. If the issue persists, please %1$scontact our support team%2$s!"],"Something went wrong":["Something went wrong"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s"],"Connection timeout":["Connection timeout"],"Use AI":["Use AI"],"Close modal":["Close modal"],"Learn more about AI (Opens in a new browser tab)":["Learn more about AI (Opens in a new browser tab)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTitle%2$s: Your page has a title. Well done!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.","%1$sAlignment%3$s: There are %4$s long sections of center-aligned text. %2$sWe recommend making them left-aligned%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.","%1$sAlignment%3$s: There are %4$s long sections of center-aligned text. %2$sWe recommend making them right-aligned%3$s."],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Once you add a bit more copy, we'll be able to tell you the formality level of your text."],"Overall, your text appears to be %1$s%3$s%2$s.":["Overall, your text appears to be %1$s%3$s%2$s."],"Heading %d":["Heading %d"],"Maximum heading level":["Maximum heading level"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions."],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Settings"],"OK":["OK"],"Close":["Close"],"Type":["Type"],"Orphaned content":["Orphaned content"],"Synonyms":["Synonyms "],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":["SEO"],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-en_NZ.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-en_NZ.json deleted file mode 100644 index cf8feae2..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-en_NZ.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_NZ"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions."],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Not available"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: For this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast Subpages"],"Yoast Siblings":["Yoast Siblings"],"Yoast Table of Contents":["Yoast Table of Contents"],"Yoast Related Links":["Yoast Related Links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom url:"],"Related article:":["Related article:"],"Home page:":["Home page:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: Remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up-to-date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: Love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: Choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles you want to rank with"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Settings"],"OK":["OK"],"Close":["Close"],"Type":["Type"],"Orphaned content":["Orphaned content"],"Synonyms":["Synonyms"],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":["seo"],"subpages":["subpages"],"childpages":["childpages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a metadescription to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a metadescription to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a metadescription to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a metadescription to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-es_CO.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-es_CO.json deleted file mode 100644 index f1184107..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-es_CO.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"es_CO"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Configuraciones"],"OK":["OK"],"Close":["Close"],"Type":["Tipo"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-es_ES.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-es_ES.json deleted file mode 100644 index b006cfe7..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-es_ES.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Para acceder a esta funciĂłn, necesitas suscripciones activas a %2$s y %3$s. Por favor, %5$sactiva tus suscripciones en %1$s%6$s u %7$sobtĂ©n una nueva %4$s%8$s. DespuĂ©s, actualiza esta página para que la funciĂłn funcione correctamente, lo que puede tardar hasta 30 segundos."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["El generador de tĂ­tulos AI requiere que el análisis SEO estĂ© activado antes de su uso. Para activarlo, ve a %2$sCaracterĂ­sticas del sitio de %1$s%3$s, activa el análisis SEO y haz clic en \"Guardar cambios\". Si el análisis SEO está desactivado en tu perfil de usuario de WordPress, accede a tu perfil y actĂ­valo allĂ­. Ponte en contacto con tu administrador si no tienes acceso a esta configuraciĂłn."],"Social share preview":["Vista previa para compartir en redes sociales"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Para seguir utilizando la funciĂłn Yoast AI, reduce la frecuencia de tus solicitudes. Nuestro %1$sartĂ­culo de ayuda%2$s proporciona orientaciĂłn sobre cĂłmo planificar y espaciar eficazmente tus solicitudes para un flujo de trabajo optimizado."],"You've reached the Yoast AI rate limit.":["Has alcanzado el lĂ­mite de la IA de Yoast."],"Allow":["Permitir"],"Deny":["Denegar"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Para ver este vĂ­deo tienes que permitir a %1$s cargar vĂ­deos incrustados desde %2$s."],"Text generated by AI may be offensive or inaccurate.":["El texto generado por la IA puede ser ofensivo o inexacto."],"(Opens in a new browser tab)":["(Se abre en una nueva pestaña del navegador)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Acelera tu flujo de trabajo con la IA generativa. Consigue sugerencias de tĂ­tulo y descripciĂłn de alta calidad para tu apariencia social y en el buscador. %1$sSaber más%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["¡Genera tĂ­tulos y descripciones con la IA de Yoast!"],"New to %1$s":["Nuevo en %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Acepto las %1$sCondiciones del servicio%2$s y la %3$sPolĂ­tica de privacidad%4$s del servicio Yoast AI. Esto incluye dar mi consentimiento a la recopilaciĂłn y uso de datos para mejorar la experiencia del usuario."],"Start generating":["Empieza a generar"],"Yes, revoke consent":["SĂ­, revoca el consentimiento"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Al revocar tu consentimiento, dejarás de tener acceso a las funciones de la IA de Yoast. ÂżEstás seguro de que quieres revocar tu consentimiento?"],"Something went wrong, please try again later.":["Algo saliĂł mal. Vuelve a intentarlo más tarde."],"Revoke AI consent":["Revocar el consentimiento de la IA"],"Please enter a focus keyphrase first to use AI.":["Introduce primero una frase clave de enfoque para utilizar la IA."],"AI title generator":["Generador de tĂ­tulos con IA"],"AI description generator":["Generador de descripciones con IA"],"AI Twitter title generator":["Generador de tĂ­tulos de Twitter con IA"],"AI Twitter description generator":["Generador de descripciones con IA para Twitter"],"AI social title generator":["Generador de tĂ­tulos sociales con AI"],"AI social description generator":["Generador de descripciones sociales con IA"],"Twitter preview":["Vista previa de Twitter"],"Dismiss":["Descartar"],"Don’t show again":["No volver a mostrar"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sConsejo%2$s: Mejora la precisiĂłn de los tĂ­tulos generados por la IA escribiendo más contenido en tu página."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sConsejo%2$s: Mejora la precisiĂłn de las descripciones generadas por la IA escribiendo más contenido en tu página."],"Try again":["IntĂ©ntalo de nuevo"],"Social preview":["Vista previa en medios sociales"],"Desktop result":["Resultado en escritorio"],"Mobile result":["Resultado mĂłvil"],"Apply AI description":["Aplicar la descripciĂłn de la IA"],"Apply AI title":["Aplicar el tĂ­tulo de IA"],"Next":["Siguiente"],"Previous":["Anterior"],"Generate 5 more":["Genera 5 más"],"Google preview":["Vista previa de Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Debido a las estrictas directrices Ă©ticas de OpenAI y a sus %1$spolĂ­ticas de uso%2$s, no podemos generar tĂ­tulos SEO para tu página. Si tienes intenciĂłn de utilizar la IA, por favor, evita el uso de contenido explĂ­cito, violento o sexualmente explĂ­cito. %3$sLee más sobre cĂłmo configurar tu página para asegurarte de que obtienes los mejores resultados con la IA%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Debido a las estrictas directrices Ă©ticas y polĂ­ticas de uso de %1$sOpenAI%2$s, no podemos generar meta descripciones para tu página. Si tienes intenciĂłn de utilizar la IA, por favor, evita el uso de contenido explĂ­cito, violento o sexualmente explĂ­cito. %3$sLee más sobre cĂłmo configurar tu página para asegurarte de que obtienes los mejores resultados con la IA%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Para acceder a esta caracterĂ­stica, necesitas una suscripciĂłn activa de %1$s. Por favor, %3$sactiva tu suscripciĂłn en %2$s%4$s u %5$sobtĂ©n una nueva suscripciĂłn %1$s%6$s. DespuĂ©s, haz clic en el botĂłn para actualizar esta página para que la funciĂłn funcione correctamente, lo que puede tardar hasta 30 segundos."],"Refresh page":["Recarga la página"],"Not enough content":["Contenido insuficiente"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Vuelve a intentarlo más tarde. Si el problema persiste, ponte %1$sen contacto con nuestro equipo de asistencia%2$s!"],"Something went wrong":["Algo saliĂł mal"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Parece que se ha agotado el tiempo de conexiĂłn. Comprueba tu conexiĂłn a Internet y vuelve a intentarlo más tarde. Si el problema persiste, ponte %1$sen contacto con nuestro equipo de asistencia%2$s"],"Connection timeout":["Tiempo de espera de conexiĂłn"],"Use AI":["Usa la IA"],"Close modal":["Cerrar modal"],"Learn more about AI (Opens in a new browser tab)":["Más informaciĂłn sobre la IA (Se abre en una nueva pestaña del navegador)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTĂ­tulo%3$s: Tu página todavĂ­a no tiene tĂ­tulo. ¡%2$sAñade uno%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTĂ­tulo%2$s: Tu página tiene tĂ­tulo. ¡Bien hecho!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sDistribuciĂłn de frase clave%3$s: %2$sIncluye tu frase clave o sus sinĂłnimos en el texto para que podamos comprobar la distribuciĂłn de la frase clave%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sDistribuciĂłn de frase clave%2$s: ¡Buen trabajo!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuciĂłn de frase clave%3$s: Desigual. Algunas partes de tu texto no contienen la frase clave o sus sinĂłnimos. %2$sDistribĂşyelas de manera más uniforme%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuciĂłn de frase clave%3$s: Muy desigual. Grandes partes de tu texto no contienen la frase clave o sus sinĂłnimos. %2$sDistribĂşyelas de manera más uniforme%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: No estás usando demasiadas palabras complejas, lo que hace que tu texto sea fácil de leer. ¡Buen trabajo!"],"Word complexity":["Complejidad de palabras"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: El %2$s de las palabras de tu texto se consideran complejas. %3$sIntenta usar palabras más familiares para mejorar la legibilidad%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sAlineaciĂłn%3$s: Hay una secciĂłn muy larga con texto alineado al centro. %2$sRecomendamos alinearla a la izquierda%3$s.","%1$sAlineaciĂłn%3$s: Hay %4$s secciones muy largas con texto alineado al centro. %2$sRecomendamos alinearlas a la izquierda%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sAlineaciĂłn%3$s: Hay una secciĂłn muy larga con texto alineado al centro. %2$sRecomendamos alinearla a la derecha%3$s.","%1$sAlineaciĂłn%3$s: Hay %4$s secciones muy largas con texto alineado al centro. %2$sRecomendamos alinearlas a la derecha%3$s."],"Select image":["Seleccionar imagen"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["Puede que no lo sepas, pero podrĂ­a haber páginas en tu sitio que no tengan ningĂşn enlace. Eso es un problema de SEO, porque es difĂ­cil para los motores de bĂşsqueda encontrar páginas que no tengan ningĂşn enlace. Por lo que es más difĂ­cil que las posicionen. Llamamos a estas páginas contenido huĂ©rfano. En este ejercicio encontraremos el contenido huĂ©rfano de tu sitio y te guiaremos a que le añadas enlaces rápidamente, ¡para que tengan la posibilidad de posicionar!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["¡Es momento de añadir algunos enlaces! Abajo verás una lista de tus artĂ­culos huĂ©rfanos. Debajo de cada uno hay sugerencias de páginas relacionadas desde las que podrĂ­as añadir un enlace. Cuando añadas el enlace asegĂşrate de insertar una frase relevante relacionada con tu artĂ­culo huĂ©rfano. Sigue añadiendo enlaces a cada uno de los artĂ­culos huĂ©rfanos hasta que estĂ©s satisfecho con la cantidad de enlaces que les apunten."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["¡Es momento de añadir algunos enlaces! Abajo verás una lista de tus contenidos esenciales. Debajo de cada contenido esencial hay sugerencias de artĂ­culos relacionados desde las que podrĂ­as añadir un enlace. Cuando añadas el enlace asegĂşrate de insertar una frase relevante relacionada con tu contenido esencial. Sigue añadiendo enlaces a cada uno de los contenidos esenciales hasta que tus contenidos esenciales tengan la mayorĂ­a de los enlaces internos apuntando hacia ellos."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Algunos artĂ­culos de tu sitio son %1$slos%2$s más importantes. Responden a preguntas de la gente y resuelven sus problemas. ¡AsĂ­ que merecen posicionar!. En %3$s los llamamos artĂ­culos de contenido esencial. Uno de los mĂ©todos para hacer que posicionen es apuntar enlaces hacia ellos. Cuantos más enlaces haya se indica a los motores de bĂşsqueda que esos artĂ­culos son importantes y valiosos. ¡En este ejercicio te ayudaremos a añadir enlaces a tus artĂ­culos de contenido esencial!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Una vez añadas algo más de texto podremos decirte el nivel de formalidad de tu texto."],"Overall, your text appears to be %1$s%3$s%2$s.":["En conjunto, tu texto parece ser %1$s%3$s%2$s."],"Heading %d":["Encabezado %d"],"Maximum heading level":["Nivel máximo de encabezado"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Has desactivado las sugerencias de enlaces, que son necesarias para que funcionen los enlaces relacionados. Si quieres añadir enlaces relacionados, por favor, ve a caracterĂ­sticas del sitio y activa las sugerencias de enlaces."],"Schema":["Schema"],"Meta tags":["Etiquetas meta"],"Not available":["No disponible"],"Checks":["Comprobaciones"],"Focus Keyphrase":["Frase clave objetivo"],"Good":["Bien"],"No index":["No indexar"],"Front-end SEO inspector":["Inspector SEO en portada"],"Focus keyphrase not set":["La frase clave objetivo no está establecida"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Nota: Para que este ejercicio funcione bien tienes que ejecutar la herramienta de optimizaciĂłn de datos SEO. Los administradores pueden ejecutarla en %1$sEsSEO > Herramientas%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Has añadido enlaces a tus artĂ­culos huĂ©rfanos, y has limpiado los que ya no eran relevantes. ¡Gran trabajo! ¡Echa un vistazo al resumen de abajo y celebra lo que has logrado!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Examina crĂ­ticamente el contenido de esta lista y haz los cambios necesarios. Si necesitas ayuda tenemos una %1$sentrada de blog muy Ăştil que puede ayudarte en todo el proceso%2$s (clic para abrir en una pestaña nueva)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sÂżNecesitas más orientaciĂłn? Hemos cubierto cada paso en más detalle en la siguiente guĂ­a: %2$sEjercicio de cĂłmo usar el %7$s contenido huĂ©rfano%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["¡Has hecho que tu mejor contenido sea fácil de encontrar, y con más posibilidades de posicionar! ¡Bien hecho! ¡De vez en cuando, recuerda revisar si tus contenidos esenciales están recibiendo suficientes enlaces!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Echa un vistazo a la lista de abajo. ÂżTienen tus contenidos esenciales (marcados con %1$s) la mayor parte de enlaces internos apuntando hacia ellos? Haz clic en el botĂłn de optimizar si crees que un contenido esencial necesita más enlaces. Eso moverá el artĂ­culo al siguiente paso."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["ÂżTienen todos tus contenidos esenciales bolitas verdes? ¡Para obtener los mejores resultados posibles plantĂ©ate editar los que no las tengan!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["ÂżCon quĂ© artĂ­culos quieres posicionar más? ÂżCuáles serĂ­an los más Ăştiles y completos para tu audiencia? Haz clic en la flecha hacia abajo y busca artĂ­culos que coincidan con estos criterios. Marcaremos automáticamente los artĂ­culos que selecciones de la lista como esenciales."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sÂżNecesitas más orientaciĂłn? Hemos cubierto cada paso en más detalle en: %2$sEjercicio de cĂłmo usar el %7$s contenido esencial%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Subpáginas de Yoast"],"Yoast Siblings":["Hermanos de Yoast"],"Yoast Table of Contents":["Tabla de contenidos de Yoast"],"Yoast Related Links":["Enlaces relacionados de Yoast"],"Finish optimizing":["Terminar de optimizar"],"You've finished adding links to this article.":["Has terminado de añadir enlaces a este artĂ­culo."],"Optimize":["Optimizar"],"Added to next step":["Añadido al siguiente paso"],"Choose cornerstone articles...":["Elige artĂ­culos esenciales…"],"Loading data...":["Cargando datos…"],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["TodavĂ­a no has realizado o actualizado ningĂşn artĂ­culo usando este ejercicio. Cuando lo hagas, se mostrará aquĂ­ un resumen de tu ejercicio."],"Skipped":["Omitidas"],"Hidden from search engines.":["Oculto de los motores de bĂşsqueda."],"Removed":["Eliminado"],"Improved":["Mejorado"],"Resolution":["ResoluciĂłn"],"Loading redirect options...":["Cargando las opciones de redirecciĂłn…"],"Remove and redirect":["Eliminar y redirigir"],"Custom url:":["URL personalizada:"],"Related article:":["ArtĂ­culo relacionado:"],"Home page:":["Página de inicio:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Estás a punto de eliminar %1$s%2$s%3$s. Para evitar 404s en tu sitio deberĂ­as redirigir a otra página en tu sitio. ÂżA dĂłnde te gustarĂ­a redirigir?"],"SEO Workout: Remove article":["Ejercicio SEO: Eliminar artĂ­culo"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["¡Todo parece estar bien! No hemos encontrado ningĂşn artĂ­culo en tu sitio de más de seis meses y que reciba demasiados pocos enlaces. ¡Vuelve a comprobar esto más tarde para más sugerencias de limpieza!"],"Hide from search engines":["Ocultar de los motores de bĂşsqueda"],"Improve":["Mejorar"],"Are you sure you wish to hide this article from search engines?":["ÂżSeguro que quieres ocultar este artĂ­culo de los motores de bĂşsqueda?"],"Action":["AcciĂłn"],"You've hidden this article from search engines.":["Has ocultado este artĂ­culo de los motores de bĂşsqueda."],"You've removed this article.":["Has eliminado este artĂ­culo."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["En este momento no has seleccionado ningĂşn artĂ­culo para mejorarlo. Selecciona unos cuantos artĂ­culos en los pasos anteriores para añadirles enlaces y te mostraremos aquĂ­ tus sugerencias de enlaces."],"Loading link suggestions...":["Cargando sugerencias de enlaces…"],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["No hemos encontrado ninguna sugerencia de enlaces para este artĂ­culo, pero, por supuesto, todavĂ­a puedes añadir enlaces a los artĂ­culos que creas que estĂ©n relacionados."],"Skip":["Saltar"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["TodavĂ­a no has seleccionado ningĂşn artĂ­culo para este paso. Puedes hacerlo en el paso anterior."],"Is it up-to-date?":["ÂżEstá al dĂ­a?"],"Last Updated":["Ăšltima actualizaciĂłn"],"You've moved this article to the next step.":["Has movido este artĂ­culo al siguiente paso."],"Unknown":["Desconocido"],"Clear summary":["Vaciar resumen"],"Add internal links towards your orphaned articles.":["Añade enlaces internos hacia tus artĂ­culos huĂ©rfanos."],"Should you update your article?":["ÂżDeberĂ­as actualizar tu artĂ­culo?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Tu sitio puede que contenga mucho contenido que creaste una vez y nunca volviste a mirar. Es importante revisar esas páginas y preguntarte si ese contenido sigue siendo relevante para tu sitio. ÂżDeberĂ­as mejorarlo o eliminarlo?"],"Start: Love it or leave it?":["Inicio: ÂżAmarlo o dejarlo?"],"Clean up your unlinked content to make sure people can find it":["Actualiza tu contenido sin enlazar para asegurarte de que la gente puede encontrarlo"],"I've finished this workout":["He terminado este ejercicio"],"Reset this workout":["Restablecer este ejercicio"],"Well done!":["¡Bien hecho!"],"Add internal links towards your cornerstones":["Añade enlaces internos hacia tus contenidos esenciales"],"Check the number of incoming internal links of your cornerstones":["Comprueba la cantidad de enlaces internos entrantes de tus contenidos esenciales"],"Start: Choose your cornerstones!":["Empieza: ¡Elige tus contenidos esenciales!"],"The cornerstone approach":["El enfoque en el contenido esencial"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Nota: Para que este ejercicio funcione bien y te ofrezca sugerencias de enlaces, necesitas ejecutar la herramienta de optimizaciĂłn de datos SEO. Los administradores pueden ejecutarla en %1$sEsSEO > Herramientas%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Por favor, ten en cuenta lo siguiente: Tu administrador ha desactivado la funcionalidad de contenido esencial en los ajustes de SEO. Si quieres utilizar este ejercicio deberĂ­a estar activada."],"I've finished this step":["He terminado este paso"],"Revise this step":["Revisar este paso"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["No hemos sido capaces de encontrar enlaces internos en tus páginas. O no has añadido aĂşn ningĂşn enlace interno a tu contenido o Yoast SEO no los ha indexado. Puedes hacer que Yoast SEO indexe tus enlaces ejecutando la optimizaciĂłn de datos SEO en SEO > Herramientas."],"Incoming links":["Enlaces entrantes"],"Edit to add link":["Editar para añadir enlace"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Actualmente no tienes ningĂşn artĂ­culo marcado como esencial. Cuando marques tus artĂ­culos como esenciales se mostrarán aquĂ­."],"Focus keyphrase":["Frase clave objetivo"],"Article":["ArtĂ­culo"],"Readability score":["PuntuaciĂłn de legibilidad"],"SEO score":["PuntuaciĂłn SEO"],"Copy failed":["La copia ha fallado"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["¡Mejora el posicionamiento de tus contenidos esenciales usando este %1$sejercicio paso a paso!%2$s"],"Rank with articles you want to rank with":["Posiciona con los artĂ­culos con los que quieres posicionar"],"Descriptive text":["Texto descriptivo"],"Show the descriptive text":["Mostrar el texto descriptivo"],"Show icon":["Mostrar icono"],"Yoast Estimated Reading Time":["Tiempo de lectura estimado de Yoast"],"Shows an estimated reading time based on the content length.":["Muestra un tiempo de lectura estimado basado en la longitud del contenido."],"reading time":["tiempo de lectura"],"content length":["longitud del contenido"],"Estimated reading time:":["Tiempo de lectura estimado:"],"minute":["minuto","minutos"],"Settings":["Ajustes"],"OK":["Aceptable"],"Close":["Cerrar"],"Type":["Tipo"],"Orphaned content":["Contenido huĂ©rfano"],"Synonyms":["SinĂłnimos"],"Internal linking suggestions":["Sugerencias de enlaces internos"],"Enter a related keyphrase to calculate the SEO score":["Introduce una frase clave relacionada para calcular la puntuaciĂłn SEO"],"Related keyphrase":["Frase clave relacionada"],"Add related keyphrase":["Añadir frase clave relacionada"],"Analysis results":["Resultados del análisis"],"Help on choosing the perfect keyphrase":["Ayuda sobre cĂłmo elegir la frase clave perfecta"],"Help on keyphrase synonyms":["Ayuda sobre sinĂłnimos de frases clave"],"Keyphrase":["Frase clave"],"New URL: {{link}}%s{{/link}}":["Nueva URL: {{link}}%s{{/link}}"],"Undo":["Deshacer"],"Redirect created":["RedirecciĂłn creada"],"%s just created a redirect from the old URL to the new URL.":["%s acaba de crear una redirecciĂłn de la URL antigua a la nueva."],"Old URL: {{link}}%s{{/link}}":["URL antigua: {{link}}%s{{/link}}"],"Keyphrase synonyms":["SinĂłnimos de la frase clave"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["Ha ocurrido un error: el análisis Premium SEO no está funcionando como se esperaba. Por favor, asegĂşrate de que has {{activateLink}}activado tu suscripciĂłn en MyYoast{{/activateLink}} y luego {{reloadButton}}recarga esta página{{/reloadButton}} para que funcione correctamente."],"Twitter share preview":["Vista previa de compartir en Twitter"],"Adds a list of internal links to sibling pages which share the same parent.":["Añade una lista de enlaces internos a páginas hermanas que comparten la misma superior."],"siblings":["hermanas"],"sibling pages":["páginas hermanas"],"Adds a list of internal links to subpages of this page.":["Añade una lista de enlaces internos a las subpáginas de esta página."],"seo":["seo"],"subpages":["subpáginas"],"childpages":["páginas hijas"],"children":["hijas"],"internal linking":["enlaces internos"],"site structure":["estructura del sitio"],"We could not find any relevant articles on your website that you could link to from your post.":["No hemos podido encontrar ningĂşn artĂ­culo relevante en tu web al que puedas enlazar desde tu entrada."],"Load suggestions":["Cargar sugerencias"],"Refresh suggestions":["Recargar sugerencias"],"Write list…":["Escribe una lista…"],"Adds a list of links related to this page.":["Añade una lista de enlaces relacionados con esta página."],"related posts":["entradas relacionadas"],"related pages":["páginas relacionadas"],"Adds a table of contents to this page.":["Añade una tabla de contenidos a esta página."],"links":["enlaces"],"toc":["toc"],"Copy link":["Copiar enlace"],"Copy link to suggested article: %s":["Copiar enlace al artĂ­culo sugerido: %s"],"Add a title to your post for the best internal linking suggestions.":["Añade un tĂ­tulo a tu entrada para obtener mejores sugerencias de enlazado interno."],"Add a metadescription to your post for the best internal linking suggestions.":["Añade una metadescription a tu entrada para obtener mejores sugerencias de enlazado interno."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Añade un tĂ­tulo y una metadescription a tu entrada para obtener mejores sugerencias de enlazado interno."],"Also, add a title to your post for the best internal linking suggestions.":["TambiĂ©n, añade un tĂ­tulo a tu entrada para obtener mejores sugerencias de enlazado interno."],"Also, add a metadescription to your post for the best internal linking suggestions.":["TambiĂ©n, añade una metadescripciĂłn a tu entrada para obtener mejores sugerencias de enlazado interno."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["TambiĂ©n, añade un tĂ­tulo y una metadescripciĂłn a tu entrada para obtener mejores sugerencias de enlazado interno."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["En cuanto añadas algo más de texto te daremos aquĂ­ una lista de contenido relacionado con el que podrĂ­as enlazar en tu entrada."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["PlantĂ©ate enlazar a otras entradas o páginas relevantes de tu web para mejorar la estructura de tu sitio ."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Mostrarte una lista de contenido relacionado al cual podrĂ­as enlazar tarda unos segundos. Las sugerencias se mostrarán aquĂ­ en cuanto las tengamos."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Lee nuestra guĂ­a sobre enlazado interno para SEO{{/a}} para aprender más."],"Copied!":["¡Copiado!"],"Not supported!":["¡No compatible!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["ÂżEstas tratando de usar varias frases claves relacionadas? DeberĂ­as añadirlas por separado."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Tu frase clave es demasiado larga. Puede tener un máximo de 191 caracteres."],"Add as related keyphrase":["Añadir como frase clave relacionada"],"Added!":["¡Añadida!"],"Remove":["Quitar"],"Table of contents":["Tabla de contenidos"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Necesitamos optimizar los datos SEO de tu sitio para poder ofrecerte las mejores %1$ssugerencias de enlaces%2$s.\n\n%3$sIniciar la optimizaciĂłn de datos SEO%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-es_MX.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-es_MX.json deleted file mode 100644 index fd33413a..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-es_MX.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"es_MX"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Para acceder a esta funciĂłn, necesitas suscripciones activas a %2$s y %3$s. Por favor, %5$sactiva tus suscripciones en %1$s%6$s u %7$sobtĂ©n una nueva %4$s%8$s. DespuĂ©s, actualiza esta página para que la funciĂłn funcione correctamente, lo que puede tardar hasta 30 segundos."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["El generador de tĂ­tulos de IA requiere que el análisis SEO estĂ© activado antes de su uso. Para activarlo, ve a %2$sCaracterĂ­sticas del sitio de %1$s%3$s, activa el análisis SEO y haz clic en \"Guardar cambios\". Si el análisis SEO está desactivado en tu perfil de usuario de WordPress, accede a tu perfil y actĂ­valo allĂ­. Ponte en contacto con tu administrador si no tienes acceso a esta configuraciĂłn."],"Social share preview":["Vista previa para compartir en redes sociales"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Para seguir utilizando la funciĂłn Yoast AI, reduce la frecuencia de tus solicitudes. Nuestro %1$sartĂ­culo de ayuda%2$s proporciona orientaciĂłn sobre cĂłmo planificar y espaciar eficazmente tus solicitudes para un flujo de trabajo optimizado."],"You've reached the Yoast AI rate limit.":["Has alcanzado el lĂ­mite de la IA de Yoast."],"Allow":["Permitir"],"Deny":["Denegar"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Para ver este video tienes que permitir a %1$s cargar videos incrustados desde %2$s."],"Text generated by AI may be offensive or inaccurate.":["El texto generado por la IA puede ser ofensivo o inexacto."],"(Opens in a new browser tab)":["Abrir en nueva pestaña de buscador"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Acelera tu flujo de trabajo con la IA generativa. Consigue sugerencias de tĂ­tulo y descripciĂłn de alta calidad para tu apariencia social y en el buscador. %1$sSaber más%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["¡Genera tĂ­tulos y descripciones con la IA de Yoast!"],"New to %1$s":["Nuevo en %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Acepto las %1$sCondiciones del servicio%2$s y la %3$sPolĂ­tica de privacidad%4$s del servicio Yoast AI. Esto incluye dar mi consentimiento a la recopilaciĂłn y uso de datos para mejorar la experiencia del usuario."],"Start generating":["Empieza a generar"],"Yes, revoke consent":["SĂ­, revoca el consentimiento"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Al revocar tu consentimiento, dejarás de tener acceso a las funciones de la IA de Yoast. ÂżEstás seguro de que quieres revocar tu consentimiento?"],"Something went wrong, please try again later.":["Algo saliĂł mal. Vuelve a intentarlo más tarde."],"Revoke AI consent":["Revocar el consentimiento de la IA"],"Please enter a focus keyphrase first to use AI.":["Introduce primero una frase clave de enfoque para utilizar la IA."],"AI title generator":["Generador de tĂ­tulos con IA"],"AI description generator":["Generador de descripciones con IA"],"AI Twitter title generator":["Generador de tĂ­tulos de Twitter con IA"],"AI Twitter description generator":["Generador de descripciones con IA para Twitter"],"AI social title generator":["Generador de tĂ­tulos sociales con AI"],"AI social description generator":["Generador de descripciones sociales con IA"],"Twitter preview":["Vista previa de Twitter"],"Dismiss":["Descartar"],"Don’t show again":["No volver a mostrar"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sConsejo%2$s: Mejora la precisiĂłn de los tĂ­tulos generados por la IA escribiendo más contenido en tu página."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sConsejo%2$s: Mejora la precisiĂłn de las descripciones generadas por la IA escribiendo más contenido en tu página."],"Try again":["IntĂ©ntalo de nuevo"],"Social preview":["Vista previa en medios sociales"],"Desktop result":["Resultado en escritorio"],"Mobile result":["Resultado mĂłvil"],"Apply AI description":["Aplicar la descripciĂłn de la IA"],"Apply AI title":["Aplicar el tĂ­tulo de IA"],"Next":["Siguiente"],"Previous":["Anterior"],"Generate 5 more":["Genera 5 más"],"Google preview":["Vista previa de Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Debido a las estrictas directrices Ă©ticas de OpenAI y a sus %1$spolĂ­ticas de uso%2$s, no podemos generar tĂ­tulos SEO para tu página. Si tienes intenciĂłn de utilizar la IA, por favor, evita el uso de contenido explĂ­cito, violento o sexualmente explĂ­cito. %3$sLee más sobre cĂłmo configurar tu página para asegurarte de que obtienes los mejores resultados con la IA%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Debido a las estrictas directrices Ă©ticas y polĂ­ticas de uso de %1$sOpenAI%2$s, no podemos generar meta descripciones para tu página. Si tienes intenciĂłn de utilizar la IA, por favor, evita el uso de contenido explĂ­cito, violento o sexualmente explĂ­cito. %3$sLee más sobre cĂłmo configurar tu página para asegurarte de que obtienes los mejores resultados con la IA%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Para acceder a esta caracterĂ­stica, necesitas una suscripciĂłn activa de %1$s. Por favor, %3$sactiva tu suscripciĂłn en %2$s%4$s u %5$sobtĂ©n una nueva suscripciĂłn %1$s%6$s. DespuĂ©s, haz clic en el botĂłn para actualizar esta página para que la funciĂłn funcione correctamente, lo que puede tardar hasta 30 segundos."],"Refresh page":["Actualiza la página"],"Not enough content":["Contenido insuficiente"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Vuelve a intentarlo más tarde. Si el problema persiste, %1$sponte en contacto con nuestro equipo de asistencia%2$s"],"Something went wrong":["Algo saliĂł mal"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Parece que se ha agotado el tiempo de conexiĂłn. Comprueba tu conexiĂłn a Internet y vuelve a intentarlo más tarde. Si el problema persiste, ponte %1$sen contacto con nuestro equipo de asistencia%2$s"],"Connection timeout":["La conexiĂłn superĂł el tiempo de espera"],"Use AI":["Usar la IA"],"Close modal":["Cerrar modal"],"Learn more about AI (Opens in a new browser tab)":["Más informaciĂłn sobre la IA (Se abre en una nueva pestaña del navegador)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTĂ­tulo%3$s: Tu página todavĂ­a no tiene tĂ­tulo. ¡%2$sAñade uno%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTĂ­tulo%2$s: Tu página tiene tĂ­tulo. ¡Bien hecho!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sDistribuciĂłn de frase clave%3$s: %2$sIncluye tu frase clave o sus sinĂłnimos en el texto para que podamos checar la distribuciĂłn de la frase clave%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sLongitud de frase clave%2$s: ¡Buen trabajo!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuciĂłn de frase clave%3$s: Desigual. Algunas partes de tu texto no contiene la frase clave o sus sinĂłnimos. %2$sDistribĂşyelos de manera más equitativa%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuciĂłn de frase clave%3$s: Muy desigual. Piezas grandes de su texto no contienen la frase clave o sus sinĂłnimos. %2$sDistribĂşyelos de manera más equitativa%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: No estás usando demasiadas palabras complejas, lo que hace que tu texto sea fácil de leer. ¡Buen trabajo!"],"Word complexity":["Complejidad de palabras"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: El %2$s de las palabras de tu texto se consideran complejas. %3$sIntenta usar palabras más familiares para mejorar la legibilidad%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sAlineaciĂłn%3$s: Hay una secciĂłn muy larga con texto alineado al centro. %2$sRecomendamos alinearla a la izquierda%3$s.","%1$sAlineaciĂłn%3$s: Hay %4$s secciones muy largas con texto alineado al centro. %2$sRecomendamos alinearlas a la izquierda%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sAlineaciĂłn%3$s: Hay una secciĂłn muy larga con texto alineado al centro. %2$sRecomendamos alinearla a la derecha%3$s.","%1$sAlineaciĂłn%3$s: Hay %4$s secciones muy largas con texto alineado al centro. %2$sRecomendamos alinearlas a la derecha%3$s."],"Select image":["Seleccionar imagen"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["¡Es momento de añadir algunos enlaces! Abajo verás una lista de tus contenidos esenciales. Debajo de cada contenido esencial hay sugerencias de artĂ­culos relacionados desde las que podrĂ­as añadir un enlace. Cuando añadas el enlace asegĂşrate de insertar una frase relevante relacionada con tu contenido esencial. Sigue añadiendo enlaces a cada uno de los contenidos esenciales hasta que tus contenidos esenciales tengan la mayorĂ­a de los enlaces internos apuntando hacia ellos."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Algunos artĂ­culos de tu sitio son %1$slos%2$s más importantes. Responden a preguntas de la gente y resuelven sus problemas. ¡AsĂ­ que merecen posicionar!. En %3$s los llamamos artĂ­culos de contenido esencial. Uno de los mĂ©todos para hacer que posicionen es apuntar enlaces hacia ellos. Cuantos más enlaces haya se indica a los motores de bĂşsqueda que esos artĂ­culos son importantes y valiosos. ¡En este ejercicio te ayudaremos a añadir enlaces a tus artĂ­culos de contenido esencial!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Una vez añadas algo más de texto podremos decirte el nivel de formalidad de tu texto."],"Overall, your text appears to be %1$s%3$s%2$s.":["En conjunto, tu texto parece ser %1$s%3$s%2$s."],"Heading %d":["Encabezado %d"],"Maximum heading level":["Nivel máximo de encabezado"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Has desactivado las sugerencias de enlaces, que son necesarias para que funcionen los enlaces relacionados. Si quieres añadir enlaces relacionados, por favor, ve a CaracterĂ­sticas del Sitio y activa las Sugerencias de Enlaces."],"Schema":["Esquema"],"Meta tags":["Etiquetas meta"],"Not available":["No disponible"],"Checks":["Comprobaciones"],"Focus Keyphrase":["Frase clave objetivo"],"Good":["Bueno"],"No index":["No indexar"],"Front-end SEO inspector":["Inspector SEO en portada"],"Focus keyphrase not set":["La frase clave objetivo no está establecida"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Nota: Para que este ejercicio funcione bien tienes que ejecutar la herramienta de optimizaciĂłn de datos SEO. Los administradores pueden ejecutarla en %1$sEsSEO > Herramientas%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Has añadido enlaces a tus artĂ­culos huĂ©rfanos, y has limpiado los que ya no eran relevantes. ¡Gran trabajo! ¡Echa un vistazo al resumen de abajo y celebra lo que has logrado!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Examina crĂ­ticamente el contenido de esta lista y haz los cambios necesarios. Si necesitas ayuda tenemos una %1$sentrada de blog muy Ăştil que puede ayudarte en todo el proceso%2$s (clic para abrir en una pestaña nueva)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sÂżNecesitas más orientaciĂłn? Hemos cubierto cada paso en más detalle en la siguiente guĂ­a: %2$sEjercicio de cĂłmo usar el %7$s contenido huĂ©rfano%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["¡Has hecho que tu mejor contenido sea fácil de encontrar, y con más posibilidades de posicionar! ¡Bien hecho! ¡De vez en cuando, recuerda revisar si tus contenidos esenciales están recibiendo suficientes enlaces!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Echa un vistazo a la lista de abajo. ÂżTienen tus contenidos esenciales (marcados con %1$s) la mayor parte de enlaces internos apuntando hacia ellos? Haz clic en el botĂłn de optimizar si crees que un contenido esencial necesita más enlaces. Eso moverá el artĂ­culo al siguiente paso."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["ÂżTienen todos tus contenidos esenciales bolitas verdes? ¡Para obtener los mejores resultados posibles plantĂ©ate editar los que no las tengan!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["ÂżCon quĂ© artĂ­culos quieres posicionar más? ÂżCuáles serĂ­an los más Ăştiles y completos para tu audiencia? Haz clic en la flecha hacia abajo y busca artĂ­culos que coincidan con estos criterios. Marcaremos automáticamente los artĂ­culos que selecciones de la lista como esenciales."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sÂżNecesitas más orientaciĂłn? Hemos cubierto cada paso en más detalle en: %2$sEjercicio de cĂłmo usar el %7$s contenido esencial%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Subpáginas de Yoast"],"Yoast Siblings":["Yoast Páginas hermanas"],"Yoast Table of Contents":["Tabla de contenidos de Yoast"],"Yoast Related Links":["Enlaces relacionados de Yoast"],"Finish optimizing":["Terminar de optimizar"],"You've finished adding links to this article.":["Has terminado de agregar enlaces a este artĂ­culo."],"Optimize":["Optimizar"],"Added to next step":["Añadido al siguiente paso"],"Choose cornerstone articles...":["Elije artĂ­culos fundamentales..."],"Loading data...":["Cargando datos..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["TodavĂ­a no has realizado o actualizado ningĂşn artĂ­culo usando este ejercicio. Cuando lo hagas, se mostrará aquĂ­ un resumen de tu ejercicio."],"Skipped":["Omitidas"],"Hidden from search engines.":["Oculto de los motores de bĂşsqueda."],"Removed":["Eliminado"],"Improved":["Mejorado"],"Resolution":["ResoluciĂłn"],"Loading redirect options...":["Cargando las opciones de redirecciĂłn…"],"Remove and redirect":["Eliminar y redirigir"],"Custom url:":["URL personalizada:"],"Related article:":["ArtĂ­culo relacionado:"],"Home page:":["Página de inicio:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Estás a punto de eliminar %1$s%2$s%3$s. Para evitar 404s en tu sitio deberĂ­as redirigir a otra página en tu sitio. ÂżA dĂłnde te gustarĂ­a redirigir?"],"SEO Workout: Remove article":["Ejercicio SEO: Eliminar artĂ­culo"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["¡Todo parece estar bien! No hemos encontrado ningĂşn artĂ­culo en tu sitio de más de seis meses y que reciba demasiados pocos enlaces. ¡Vuelve a comprobar esto más tarde para más sugerencias de limpieza!"],"Hide from search engines":["Ocultar de los motores de bĂşsqueda"],"Improve":["Mejorar"],"Are you sure you wish to hide this article from search engines?":["ÂżSeguro que quieres ocultar este artĂ­culo de los motores de bĂşsqueda?"],"Action":["AcciĂłn"],"You've hidden this article from search engines.":["Has ocultado este artĂ­culo de los motores de bĂşsqueda."],"You've removed this article.":["Has eliminado este artĂ­culo."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["En este momento no has seleccionado ningĂşn artĂ­culo para mejorarlo. Selecciona unos cuantos artĂ­culos en los pasos anteriores para añadirles enlaces y te mostraremos aquĂ­ tus sugerencias de enlaces."],"Loading link suggestions...":["Cargando sugerencias de enlaces…"],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["No hemos encontrado ninguna sugerencia de enlaces para este artĂ­culo, pero, por supuesto, todavĂ­a puedes añadir enlaces a los artĂ­culos que creas que estĂ©n relacionados."],"Skip":["Saltar"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["TodavĂ­a no has seleccionado ningĂşn artĂ­culo para este paso. Puedes hacerlo en el paso anterior."],"Is it up-to-date?":["ÂżEstá al dĂ­a?"],"Last Updated":["Ăšltima actualizaciĂłn"],"You've moved this article to the next step.":["Has movido este artĂ­culo al siguiente paso."],"Unknown":["Desconocido"],"Clear summary":["Vaciar resumen"],"Add internal links towards your orphaned articles.":["Añade enlaces internos hacia tus artĂ­culos huĂ©rfanos."],"Should you update your article?":["ÂżDeberĂ­as actualizar tu artĂ­culo?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Tu sitio puede que contenga mucho contenido que creaste una vez y nunca volviste a mirar. Es importante revisar esas páginas y preguntarte si ese contenido sigue siendo relevante para tu sitio. ÂżDeberĂ­as mejorarlo o eliminarlo?"],"Start: Love it or leave it?":["Inicia: ÂżAmarlo o dejarlo?"],"Clean up your unlinked content to make sure people can find it":["Actualiza tu contenido sin enlazar para asegurarte de que la gente puede encontrarlo"],"I've finished this workout":["He terminado este ejercicio"],"Reset this workout":["Restablecer este ejercicio"],"Well done!":["¡Bien hecho!"],"Add internal links towards your cornerstones":["Añade enlaces internos hacia tus contenidos esenciales"],"Check the number of incoming internal links of your cornerstones":["Comprueba la cantidad de enlaces internos entrantes de tus contenidos esenciales"],"Start: Choose your cornerstones!":["Empieza: ¡Elige tus contenidos esenciales!"],"The cornerstone approach":["El enfoque en el contenido esencial"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Nota: Para que este ejercicio funcione bien y te ofrezca sugerencias de enlaces, necesitas ejecutar la herramienta de optimizaciĂłn de datos SEO. Los administradores pueden ejecutarla en %1$sEsSEO > Herramientas%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["He terminado este paso"],"Revise this step":["Revisar este paso"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["No hemos sido capaces de encontrar enlaces internos en tus páginas. O no has añadido aĂşn ningĂşn enlace interno a tu contenido o Yoast SEO no los ha indexado. Puedes hacer que Yoast SEO indexe tus enlaces ejecutando la optimizaciĂłn de datos SEO en SEO > Herramientas."],"Incoming links":["Enlaces entrantes"],"Edit to add link":["Editar para añadir enlace"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Actualmente no tienes ningĂşn artĂ­culo marcado como esencial. Cuando marques tus artĂ­culos como esenciales se mostrarán aquĂ­. "],"Focus keyphrase":["Frase clave de enfoque"],"Article":["ArtĂ­culo"],"Readability score":["Puntaje de legibilidad"],"SEO score":["PuntuaciĂłn SEO"],"Copy failed":["La copia ha fallado"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["¡Mejora el posicionamiento de tus contenidos esenciales usando este %1$sejercicio paso a paso!%2$s"],"Rank with articles you want to rank with":["Posiciona con los artĂ­culos con los que quieres posicionar"],"Descriptive text":["Texto descriptivo"],"Show the descriptive text":["Mostrar el texto descriptivo"],"Show icon":["Mostrar icono"],"Yoast Estimated Reading Time":["Tiempo de lectura estimado de Yoast"],"Shows an estimated reading time based on the content length.":["Muestra un tiempo de lectura estimado basado en la longitud del contenido."],"reading time":["tiempo de lectura"],"content length":["longitud del contenido"],"Estimated reading time:":["Tiempo de lectura estimado:"],"minute":["minuto","minutos"],"Settings":["Ajustes"],"OK":["Bien"],"Close":["Cerrar"],"Type":["Tipo"],"Orphaned content":["Contenido huĂ©rfano"],"Synonyms":["SinĂłnimos"],"Internal linking suggestions":["Sugerencias de enlaces internos"],"Enter a related keyphrase to calculate the SEO score":["Introduce una frase clave relacionada para calcular la puntuaciĂłn SEO"],"Related keyphrase":["Frase clave relacionada"],"Add related keyphrase":["Agregar palabra clave relacionada "],"Analysis results":["Resultado del análisis:"],"Help on choosing the perfect keyphrase":["Ayuda sobre cĂłmo elegir la frase clave perfecta"],"Help on keyphrase synonyms":["Ayuda sobre sinĂłnimos de frases clave"],"Keyphrase":["Frase clave"],"New URL: {{link}}%s{{/link}}":["Nueva URL: {{link}}%s{{/link}}"],"Undo":["Deshacer"],"Redirect created":["RedirecciĂłn creada"],"%s just created a redirect from the old URL to the new URL.":["%s acaba de crear una redirecciĂłn de la URL antigua a la nueva."],"Old URL: {{link}}%s{{/link}}":["URL antigua: {{link}}%s{{/link}}"],"Keyphrase synonyms":["SinĂłnimos de la frase clave"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Vista previa de compartir en Twitter"],"Adds a list of internal links to sibling pages which share the same parent.":["Añade una lista de enlaces internos a páginas hermanas que comparten la misma superior."],"siblings":["hermanas"],"sibling pages":["páginas hermanas"],"Adds a list of internal links to subpages of this page.":["Añade una lista de enlaces internos a las subpáginas de esta página."],"seo":["seo"],"subpages":["subpáginas"],"childpages":["páginas hijas"],"children":["hijas"],"internal linking":["enlaces internos"],"site structure":["estructura del sitio"],"We could not find any relevant articles on your website that you could link to from your post.":["No pudimos encontrar ningĂşn artĂ­culo relevante en su sitio web que pudiera vincular desde su publicaciĂłn."],"Load suggestions":["Cargar sugerencias"],"Refresh suggestions":["Recargar sugerencias"],"Write list…":["Escribe una lista…"],"Adds a list of links related to this page.":["Añade una lista de enlaces relacionados con esta página."],"related posts":["entradas relacionadas"],"related pages":["páginas relacionadas"],"Adds a table of contents to this page.":["Añade una tabla de contenidos a esta página."],"links":["enlaces"],"toc":["toc"],"Copy link":["Copiar enlace"],"Copy link to suggested article: %s":["Copiar enlace al artĂ­culo sugerido: %s"],"Add a title to your post for the best internal linking suggestions.":["Añade un tĂ­tulo a tu entrada para obtener mejores sugerencias de enlazado interno."],"Add a metadescription to your post for the best internal linking suggestions.":["Añade una metadescription a tu entrada para obtener mejores sugerencias de enlazado interno."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Añade un tĂ­tulo y una metadescription a tu entrada para obtener mejores sugerencias de enlazado interno."],"Also, add a title to your post for the best internal linking suggestions.":["TambiĂ©n, añade un tĂ­tulo a tu entrada para obtener mejores sugerencias de enlazado interno."],"Also, add a metadescription to your post for the best internal linking suggestions.":["TambiĂ©n, añade una metadescripciĂłn a tu entrada para obtener mejores sugerencias de enlazado interno."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["TambiĂ©n, añade un tĂ­tulo y una metadescripciĂłn a tu entrada para obtener mejores sugerencias de enlazado interno."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["En cuanto añadas algo más de texto te daremos aquĂ­ una lista de contenido relacionado con el que podrĂ­as enlazar en tu entrada."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["PlantĂ©ate enlazar a otras entradas o páginas relevantes de tu web para mejorar la estructura de tu sitio ."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Mostrarte una lista de contenido relacionado al cual podrĂ­as enlazar tarda unos segundos. Las sugerencias se mostrarán aquĂ­ en cuanto las tengamos."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Lee nuestra guĂ­a sobre enlazado interno para SEO{{/a}} para aprender más."],"Copied!":["Copiado!"],"Not supported!":["No soportado!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["ÂżEstas tratando de usar varias frases claves relacionadas? DeberĂ­as añadirlas por separado."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Tu frase clave es demasiado larga. Puede tener un máximo de 191 caracteres."],"Add as related keyphrase":["Añadir como frase clave relacionada"],"Added!":["¡Añadida!"],"Remove":["Eliminar"],"Table of contents":["Tabla de contenidos"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Necesitamos optimizar los datos SEO de tu sitio para poder ofrecerte las mejores %1$ssugerencias de enlaces%2$s.\n\n%3$sIniciar la optimizaciĂłn de datos SEO%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-es_VE.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-es_VE.json deleted file mode 100644 index e3acb67b..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-es_VE.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"es_VE"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Ajustes"],"OK":["OK"],"Close":["Close"],"Type":["Type"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-et.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-et.json deleted file mode 100644 index 03190ba6..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-et.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"et_EE"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Näita ikooni"],"Yoast Estimated Reading Time":["Yoast eeldatav lugemisaeg"],"Shows an estimated reading time based on the content length.":["Näitab hinnangulist lugemisaega sisupikkuse põhjal."],"reading time":["lugemise aeg"],"content length":["sisu pikkus"],"Estimated reading time:":["Eeldatav lugemise aeg: "],"minute":["minut","minutit"],"Settings":["Seaded"],"OK":["OK"],"Close":["Sulge"],"Type":["Type"],"Orphaned content":["Maha jäetud sisu"],"Synonyms":["SĂĽnonĂĽĂĽmid"],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Seotud võtmefraas"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["AnalĂĽĂĽsi tulemused"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Aita võtmesõnade sĂĽnonĂĽĂĽmidega"],"Keyphrase":["Võtmesõna"],"New URL: {{link}}%s{{/link}}":["Uus URL: {{link}}%s{{/link}}"],"Undo":["Võta tagasi"],"Redirect created":["Ăśmbersuunamine loodud"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Vana URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Võmesõnade sĂĽnonĂĽĂĽmid"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["sisemine linkimine"],"site structure":["veebilehe struktuur"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Lae ettepanekuid"],"Refresh suggestions":["Värskenda ettepanekuid"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["seotud postitused"],"related pages":["seotud lehed"],"Adds a table of contents to this page.":["Lisab sellele lehele sisukorra"],"links":["viited"],"toc":["toc"],"Copy link":["Kopeeri viide"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Parimate sisemise linkimise soovituste saamiseks lisage oma postitusele pealkiri."],"Add a metadescription to your post for the best internal linking suggestions.":["Parimate sisemise linkimise soovituste saamiseks lisage oma postitusele metakirjeldus."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Parimate sisemiste linkimisettepanekute saamiseks lisage oma postitusele pealkiri ja metakirjeldus."],"Also, add a title to your post for the best internal linking suggestions.":["Parimate sisemiste linkimis ettepanekute saamiseks lisage oma postitusele ka pealkiri."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Parimate sisemiste linkimis ettepanekute saamiseks lisage oma postitusele ka metakirjeldus."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Parimate sisemiste linkimis ettepanekute saamiseks lisage oma postitusele ka pealkiri ja metakirjeldus."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Kui lisate natuke rohkem teksti, anname teile seotud sisu loendi, kuhu saate oma postituse linkida."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Kopeeritud!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Eemalda"],"Table of contents":["Sisukord"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-fa_IR.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-fa_IR.json deleted file mode 100644 index c287e815..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-fa_IR.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=1; plural=0;","lang":"fa"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["پیش نمایش ŘŞŮئیتر"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["بعدی"],"Previous":["قبلی"],"Generate 5 more":[],"Google preview":["پیش نمایش ÚŻŮÚŻŮ„"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["انتخاب تصŮیر"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["برچسب های متا"],"Not available":["در دسترس نیست"],"Checks":["برسی ها"],"Focus Keyphrase":["عبارت کلیدی کانŮنی"],"Good":["Ř®Ůب"],"No index":["ایندکس نشده"],"Front-end SEO inspector":["بازرس سئŮŰŚ ظاهر"],"Focus keyphrase not set":["عبارت کلیدی کانŮنی تنظیم نشده است"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["لطŮا ŘŞŮجه داشته باشید: برای اینکه این تمرین به Ř®Ůبی کار کند، باید ابزار بهینه سازی داده سئ٠را اجرا کنید. مدیران می‌تŮانند این را در %1$sSEO > Tools%2$s اجرا کنند."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["شما پیŮندهایی را به مقالات ŰŚŘŞŰŚŮ… Ř®ŮŘŻ اضاŮه کرده اید، Ů Ů…Ůاردی را که دیگر مرتبط نبŮدند پاکسازی کرده اید. کارت عالی بŮŘŻ! به خلاصه زیر نگاهی بیندازید ٠آنچه را که به دست آŮرده اید جشن بگیرید"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Ů…Ř­ŘŞŮای این لیست را به صŮرت انتقادی بررسی کنید ٠به رŮز رسانی های لازم را انجام دهید. اگر برای به رŮز رسانی به Ú©Ů…Ú© نیاز دارید، ما ŰŚÚ© پست Ůبلاگ بسیار Ů…ŮŰŚŘŻ %1$s داریم که Ů…ŰŚ ŘŞŮاند شما را راهنمایی%2$s کند (برای باز کردن در ŰŚÚ© برگه جدید کلیک کنید)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sبه راهنمایی بیشتری نیاز دارید؟ ما همه مراحل را با جزئیات بیشتری در راهنمای زیر ŮľŮŘ´Ř´ داده‌ایم: %2$sنحŮه استŮاده از %7$s تمرین Ů…Ř­ŘŞŮای ŰŚŘŞŰŚŮ…%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["شما Ůقط پیدا کردن بهترین Ů…Ř­ŘŞŮای Ř®ŮŘŻ را آسان کرده‌اید ٠احتمال رتبه‌بندی را اŮزایش می‌دهید! Ů…ŮŮŮ‚ باشی! هر از گاهی، به یاد داشته باشید که بررسی کنید که آیا سنگ بنای شما به اندازه کاŮŰŚ لینک دریاŮŘŞ Ů…ŰŚ کند یا خیر!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["به لیست زیر نگاهی بیندازید. آیا سنگ بنای شما (که با %1$s مشخص شده است) بیشترین پیŮندهای داخلی را دارند که به سمت آنها اشاره Ů…ŰŚ کنند؟ اگر Ůکر می‌کنید که سنگ بنا به پیŮندهای بیشتری نیاز دارد، رŮŰŚ دکمه Optimize کلیک کنید. که مقاله را به مرحله بعدی منتقل Ů…ŰŚ کند."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["آیا همه سنگ بنای شما دارای ŘŞŰŚÚ© سبز هستند؟ برای بهترین نتیجه، Ůیرایش هایی را که انجام نمی دهند در نظر بگیرید"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["کدام مقالات را Ů…ŰŚ Ř®Ůاهید بالاترین رتبه را کسب کنند؟ کدام ŰŚÚ© از مخاطبان شما Ů…Ůیدتر ٠کامل تر هستند؟ رŮŰŚ Ůلش ر٠به پایین کلیک کنید ٠به دنبال مقالاتی بگردید که با این معیارها مطابقت دارند. مقالاتی را که از Ůهرست انتخاب می‌کنید به‌طŮر Ř®Ůدکار به‌عنŮان سنگ بنا علامت‌گذاری می‌کنیم."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sبه راهنمایی بیشتری نیاز دارید؟ ما هر مرحله را با جزئیات بیشتری در این Ů…Ůرد ŮľŮŘ´Ř´ داده‌ایم: %2$sنحŮه استŮاده از %7$s تمرین سنگ بنای%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["زیرصŮحه های Yoast"],"Yoast Siblings":["هم نÚاد های ŰŚŮآست"],"Yoast Table of Contents":["Ůهرست Ů…Ř­ŘŞŮای Yoast"],"Yoast Related Links":["پیŮندهای مرتبط با Yoast"],"Finish optimizing":["پایان بهینه سازی"],"You've finished adding links to this article.":["شما اŮزŮدن پیŮندها به این مقاله را به پایان رسانده اید."],"Optimize":["بهینه سازی"],"Added to next step":["به مرحله بعد اضاŮه Ř´ŘŻ"],"Choose cornerstone articles...":["مقالات سنگ بنا را انتخاب کنید..."],"Loading data...":["در حال بارگذاری..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["با استŮاده از این تمرین هنŮز هیچ مقاله ای را پاک یا به رŮز نکرده اید. پس از انجام این کار، خلاصه ای از کار شما در اینجا نشان داده Ů…ŰŚ Ř´ŮŘŻ."],"Skipped":["صر٠نظر Ř´ŘŻ"],"Hidden from search engines.":["از Ů…ŮŘŞŮرهای جستج٠مخŮŰŚ شده است"],"Removed":["حذ٠شد"],"Improved":["بهبŮŘŻ یاŮŘŞ"],"Resolution":["ŮضŮŘ­ تصŮیر"],"Loading redirect options...":["در حال بارگیری گزینه های تغییر مسیر..."],"Remove and redirect":["حذ٠٠تغییر مسیر دهید"],"Custom url:":["لینک دلخŮاه:"],"Related article:":["مقاله های مرتبط:"],"Home page:":["صŮحه اصلی:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["شما در شر٠حذ٠%1$s%2$s%3$s هستید. برای جلŮگیری از 404 در سایت Ř®ŮŘŻŘŚ باید آن را به صŮحه دیگری در سایت Ř®ŮŘŻ هدایت کنید. به کجا Ů…ŰŚ Ř®Ůاهید آن را تغییر مسیر دهید؟"],"SEO Workout: Remove article":["تمرین سئŮ: حذ٠مقاله"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["همه چیز Ř®Ůب به نظر Ů…ŰŚ رسد! ما هیچ مقاله ای در سایت شما پیدا نکردیم که بیش از Ř´Ř´ ماه قدمت داشته باشد ٠لینک های بسیار Ú©Ů…ŰŚ در سایت شما دریاŮŘŞ کند. برای پیشنهادات پاکسازی جدید بعداً اینجا را بررسی کنید!"],"Hide from search engines":["پنهان کردن از Ů…ŮŘŞŮرهای جستجŮ"],"Improve":["بهبŮŘŻ"],"Are you sure you wish to hide this article from search engines?":["آیا مطمئنید Ů…ŰŚŘ®Ůاهید این مقاله را از Ů…ŮŘŞŮرهای جستج٠مخŮŰŚ کنید؟"],"Action":["اقدام"],"You've hidden this article from search engines.":["شما این مقاله را از Ů…ŮŘŞŮرهای جستج٠پنهان کرده اید."],"You've removed this article.":["شما این مقاله را حذ٠کرده اید."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["شما در حال حاضر هیچ مقاله ای را برای بهبŮŘŻ انتخاب نکرده اید. چند مقاله را در مراحل قبلی برای اŮزŮدن پیŮند انتخاب کنید ٠ما پیشنهادات پیŮند را در اینجا به شما نشان Ř®Ůاهیم داد."],"Loading link suggestions...":["در حال بارگیری پیشنهادات پیŮند..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["ما هیچ پیشنهادی برای این مقاله پیدا نکردیم، اما البته همچنان می‌تŮانید به مقالاتی که Ůکر می‌کنید مرتبط هستند، پیŮند اضاŮه کنید."],"Skip":["بیخیال شدن"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["شما هنŮز هیچ مقاله ای را برای این مرحله انتخاب نکرده اید. در مرحله قبل Ů…ŰŚ ŘŞŮانید این کار را انجام دهید."],"Is it up-to-date?":["آیا به رŮز است؟"],"Last Updated":["اخرین به رŮز رسانی"],"You've moved this article to the next step.":["شما این مقاله را به مرحله بعدی منتقل کرده اید."],"Unknown":["ناشناخته"],"Clear summary":["پاک کردن خلاصه"],"Add internal links towards your orphaned articles.":["پیŮندهای داخلی را به مقالات ŰŚŘŞŰŚŮ… Ř®ŮŘŻ اضاŮه کنید."],"Should you update your article?":["آیا باید مقاله Ř®ŮŘŻ را به رŮز کنید؟"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["سایت شما ممکن است حاŮŰŚ Ů…Ř­ŘŞŮای زیادی باشد که ŰŚÚ© بار ایجاد کرده اید ٠از آن زمان به بعد هرگز به آن نگاه نکرده اید. مهم است که از طریق آن صŮحات مرŮر کنید ٠از Ř®ŮŘŻ بپرسید که آیا آن Ů…Ř­ŘŞŮا همچنان به سایت شما مرتبط است یا خیر. آیا باید آن را بهبŮŘŻ بخشید یا حذ٠کنید؟"],"Start: Love it or leave it?":["شرŮŘą کنید: آن را ŘŻŮست داشته باشید یا ترک کنید؟"],"Clean up your unlinked content to make sure people can find it":["Ů…Ř­ŘŞŮای بدŮن پیŮند Ř®ŮŘŻ را پاک کنید تا مطمئن Ř´ŮŰŚŘŻ اŮراد Ů…ŰŚ ŘŞŮانند آن را پیدا کنند"],"I've finished this workout":["من این تمرین را تمام کردم"],"Reset this workout":["این تمرین را بازنشانی کنید"],"Well done!":["آŮرین!"],"Add internal links towards your cornerstones":["پیŮندهای داخلی را به سنگ بنای Ř®ŮŘŻ اضاŮه کنید"],"Check the number of incoming internal links of your cornerstones":["تعداد پیŮندهای داخلی ŮرŮŘŻŰŚ سنگ بنای Ř®ŮŘŻ را بررسی کنید"],"Start: Choose your cornerstones!":["شرŮŘą: سنگ بنای Ř®ŮŘŻ را انتخاب کنید!"],"The cornerstone approach":["رŮیکرد سنگ بنا"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["لطŮاً ŘŞŮجه داشته باشید: برای اینکه این تمرین به Ř®Ůبی کار کند ٠به شما پیشنهادهای پیŮند ارائه دهد، باید ابزار بهینه سازی داده سئ٠را اجرا کنید. مدیران می‌تŮانند این را در %1$sSEO > Tools%2$s اجرا کنند."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["من این مرحله را تمام کردم"],"Revise this step":["این مرحله را اصلاح کنید"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["ما نتŮانستیم پیŮندهای داخلی را در صŮحات شما پیدا کنیم. یا هنŮز هیچ لینک داخلی به Ů…Ř­ŘŞŮای Ř®ŮŘŻ اضاŮه نکرده اید یا Yoast SEO آنها را ایندکس نکرده است. می‌تŮانید با اجرای بهینه‌سازی داده‌های SEO در زیر SEO > ToolsŘŚ پیŮندهای Ř®ŮŘŻ را Yoast SEO ایندکس کنید."],"Incoming links":["لینک های ŮرŮŘŻŰŚ"],"Edit to add link":["برای اŮزŮدن پیŮند Ůیرایش کنید"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["شما در حال حاضر هیچ مقاله ای ندارید که به عنŮان سنگ بنا علامت گذاری شده باشد. Ůقتی مقالات Ř®ŮŘŻ را به عنŮان سنگ بنا علامت گذاری Ů…ŰŚ کنید، در اینجا نشان داده Ů…ŰŚ Ř´Ůند."],"Focus keyphrase":["کلیدŮاÚه کانŮنی"],"Article":["مقاله"],"Readability score":["امتیاز Ř®Ůانایی"],"SEO score":["امتیاز سئŮ"],"Copy failed":["کپی نامŮŮŮ‚ بŮŘŻ"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["با استŮاده از این %1$s تمرین گام به گام، رتبه‌بندی همه پایه‌های Ř®ŮŘŻ را بهبŮŘŻ بخشید!%2$s"],"Rank with articles you want to rank with":["رتبه با مقالاتی که Ů…ŰŚ Ř®Ůاهید با آنها رتبه بندی کنید"],"Descriptive text":["متن ŘŞŮصیŮŰŚ"],"Show the descriptive text":["متن ŘŞŮصیŮŰŚ را نشان دهید"],"Show icon":["نمایش نماد"],"Yoast Estimated Reading Time":["زمان Ř®Ůاندن تخمینی Yoast"],"Shows an estimated reading time based on the content length.":["زمان تخمینی Ř®Ůاندن را بر اساس Ř·ŮŮ„ Ů…Ř­ŘŞŮا نشان Ů…ŰŚ دهد."],"reading time":["زمان Ř®Ůاندن"],"content length":["Ř·ŮŮ„ Ů…Ř­ŘŞŮا"],"Estimated reading time:":["زمان تخمینی مطالعه:"],"minute":["دقیقه"],"Settings":["تنظیمات"],"OK":["قابل قبŮŮ„"],"Close":["بستن"],"Type":["نŮŘą"],"Orphaned content":["Ů…Ř­ŘŞŮای ŰŚŘŞŰŚŮ…"],"Synonyms":["متراد٠ها"],"Internal linking suggestions":["پیشنهادات پیŮند داخلی"],"Enter a related keyphrase to calculate the SEO score":["ŰŚÚ© عبارت کلیدی مرتبط را برای محاسبه امتیاز سئ٠Ůارد کنید"],"Related keyphrase":["عبارت کلیدی مرتبط"],"Add related keyphrase":["عبارت کلیدی مرتبط را اضاŮه کنید"],"Analysis results":["نتایج آنالیز"],"Help on choosing the perfect keyphrase":["در انتخاب عبارت کلیدی عالی Ú©Ů…Ú© کنید"],"Help on keyphrase synonyms":["Ú©Ů…Ú© به متراد٠عبارات کلیدی"],"Keyphrase":["کلیدŮاÚه"],"New URL: {{link}}%s{{/link}}":["نشانی Ůب جدید: {{link}}%s{{/link}}"],"Undo":["بازگشت"],"Redirect created":["ریدایرکت ایجاد Ř´ŘŻ"],"%s just created a redirect from the old URL to the new URL.":["%s Ůقط ŰŚÚ© تغییر مسیر از URL قدیمی به URL جدید ایجاد کرد."],"Old URL: {{link}}%s{{/link}}":["آدرس قدیمی: {{link}}%s{{/link}}"],"Keyphrase synonyms":["متراد٠عبارات کلیدی"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["پیش نمایش اشتراک گذاری ŘŞŮییتر"],"Adds a list of internal links to sibling pages which share the same parent.":["Ůهرستی از پیŮندهای داخلی را به صŮحات Ř®Ůاهر ٠برادری که Ůالدین مشترک دارند اضاŮه Ů…ŰŚ کند."],"siblings":["هم نÚاد"],"sibling pages":["صŮحات هم نÚاد"],"Adds a list of internal links to subpages of this page.":["لیستی از پیŮندهای داخلی را به صŮحات Ůرعی این صŮحه اضاŮه Ů…ŰŚ کند."],"seo":["سئŮ"],"subpages":["صŮحات Ůرعی"],"childpages":["صŮحات Ůرزند"],"children":["Ůرزندان"],"internal linking":["لینک‌های داخلی"],"site structure":["ساختار سایت"],"We could not find any relevant articles on your website that you could link to from your post.":["ما نمی‌تŮانیم مقالات مرتبط با سایت شما برای پیŮند به نŮشته پیدا کنیم."],"Load suggestions":["بارگیری پیشنهادات"],"Refresh suggestions":["پیشنهادات را به رŮز کنید"],"Write list…":["نŮشتن لیست…"],"Adds a list of links related to this page.":["لیستی از پیŮندهای مربŮŘ· به این صŮحه را اضاŮه Ů…ŰŚ کند."],"related posts":["نŮشته‌های مرتبط"],"related pages":["برگه‌های مرتبط"],"Adds a table of contents to this page.":["اŮزŮدن جدŮŮ„ Ů…Ř­ŘŞŮا به این برگه."],"links":["لینک‌ها"],"toc":["toc"],"Copy link":["کپی لینک"],"Copy link to suggested article: %s":["کپی لینک به مقاله پیشنهادی: %s"],"Add a title to your post for the best internal linking suggestions.":["برای بهترین پیشنهادهای پیŮند داخلی، عنŮانی را به پست Ř®ŮŘŻ اضاŮه کنید."],"Add a metadescription to your post for the best internal linking suggestions.":["برای بهترین پیشنهادات پیŮند داخلی، ŰŚÚ© متا ŘŞŮصی٠به پست Ř®ŮŘŻ اضاŮه کنید."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["برای بهترین پیشنهادات پیŮند داخلی، ŰŚÚ© عنŮان Ů ŰŚÚ© متا ŘŞŮصی٠به پست Ř®ŮŘŻ اضاŮه کنید."],"Also, add a title to your post for the best internal linking suggestions.":["همچنین، برای بهترین پیشنهادات پیŮند داخلی، عنŮانی به پست Ř®ŮŘŻ اضاŮه کنید."],"Also, add a metadescription to your post for the best internal linking suggestions.":["همچنین، برای بهترین پیشنهادات پیŮند داخلی، ŰŚÚ© متا ŘŞŮصی٠به پست Ř®ŮŘŻ اضاŮه کنید."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["همچنین، برای بهترین پیشنهادات پیŮند داخلی، ŰŚÚ© عنŮان Ů ŰŚÚ© متا ŘŞŮصی٠به پست Ř®ŮŘŻ اضاŮه کنید."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["هنگامی که Ú©Ů…ŰŚ کپی اضاŮه کردید، لیستی از Ů…Ř­ŘŞŮای مرتبط را در اینجا به شما Ů…ŰŚ دهیم که Ů…ŰŚ ŘŞŮانید در پست Ř®ŮŘŻ به آن پیŮند دهید."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["برای بهبŮŘŻ ساختار سایت Ř®ŮŘŻŘŚ پیŮند دادن به سایر پست ها یا صŮحات مرتبط در Ůب سایت Ř®ŮŘŻ را در نظر بگیرید."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["چند ثانیه Ř·ŮŮ„ Ů…ŰŚ Ú©Ř´ŘŻ تا لیستی از Ů…Ř­ŘŞŮای مرتبط را به شما نشان دهد که Ů…ŰŚ ŘŞŮانید به آن پیŮند دهید. به محض اینکه پیشنهادات را دریاŮŘŞ کنیم، اینجا نشان داده Ů…ŰŚ Ř´ŮŘŻ."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["برای کسب اطلاعات بیشتر، {{a}}راهنمای ما در Ů…Ůرد پیŮندهای داخلی برای SEO را بخŮانید{{/a}}."],"Copied!":["کپی Ř´ŘŻ!"],"Not supported!":["پشتیبانی نمی‌شŮŘŻ!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["آیا سعی Ů…ŰŚ کنید از چند عبارت کلیدی مرتبط استŮاده کنید؟ شما باید آنها را جداگانه اضاŮه کنید."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["کلیدŮاÚه شما بسیار Ř·Ůلانی است. بیشترین Ř­ŘŻ آن Ů…ŰŚ ŘŞŮاند 191 کاراکتر باشد."],"Add as related keyphrase":["عبارت کلیدی مرتبط را اضاŮه کنید"],"Added!":["اضاŮه Ř´ŘŻ"],"Remove":["پاک کردن"],"Table of contents":["جدŮŮ„ Ů…Ř­ŘŞŮا"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["ما باید داده‌های SEO سایت شما را بهینه کنیم تا بتŮانیم بهترین %1$slinking پیشنهادات%2$s را به شما ارائه دهیم. %3$sبهینه سازی داده های SEO%4$s را شرŮŘą کنید"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-fi.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-fi.json deleted file mode 100644 index 1eed159d..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-fi.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"fi"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":["Salli"],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Avataan uudessa välilehdessä)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter-esikatselu"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Yritä uudelleen"],"Social preview":[],"Desktop result":["Tietokonetulokset"],"Mobile result":["Mobiilitulokset"],"Apply AI description":[],"Apply AI title":[],"Next":["Seuraava"],"Previous":["Edellinen"],"Generate 5 more":[],"Google preview":["Google-esikatselu"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sAvainfraasin jakauma%3$s: %2$sSisällytä tekstiin avainfraasisi tai synonyymeja, jotta voimme tarkistaa niiden jakauman%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sAvainfraasin jakauma%2$s: Hyvin toimittu!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sAvainfraasin jakauma%3$s: Epätasainen. Jotkut osat tekstistäsi eivät sisällä avainfraasia tai synonyymeja. %2$sJaa ne tasaisemmin%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sAvainfraasin jakauma%3$s: Hyvin epätasainen. Huomattava osa tekstistäsi eivät sisällä avainfraasia tai synonyymeja. %2$sJaa ne tasaisemmin%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Valitse kuva"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Otsikko %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Ei saatavilla"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Hyvä"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Et ole siivonnut tai päivittänyt yhtään artikkelia tämän harjoitteen aikana. Kun teet niin, yhteenveto toimistasi ilmestyy tänne."],"Skipped":["Ohitettu"],"Hidden from search engines.":["Kätketty hakukoneilta."],"Removed":["Poistettu"],"Improved":["Parannettu"],"Resolution":["Tarkkuus"],"Loading redirect options...":["Ladataan uudelleenohjauksien valintoja..."],"Remove and redirect":["Poista ja edelleenohjaa"],"Custom url:":["Mukautettu URL:"],"Related article:":["Liittyvä artikkeli:"],"Home page:":["Etusivu:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Olet aikeissa poistaa %1$s%2$s%3$s. Estääksesi 404-virheet sivustollasi, sinun kannattaa edelleenohjata se toiselle sivulle sivustollasi. Minne tahtoisit sen ohjata?"],"SEO Workout: Remove article":["SEO-harjoite: poista artikkeli"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Kaikki näyttää hyvältä! Emme löytäneet yhtään artikkelia sivustollasi, joka olisi kuutta kuukautta vanhempi ja jolle osoittaisi liian vähän linkkejä. Palaa tänne uudelleen saadaksesi siivousehdotuksia."],"Hide from search engines":["Kätke hakukoneilta"],"Improve":["Paranna"],"Are you sure you wish to hide this article from search engines?":["Haluatko varmasti kätkeä tämän artikkelin hakukoneilta?"],"Action":["Toiminto"],"You've hidden this article from search engines.":["Tämä artikkeli on kätketty hakukoneilta."],"You've removed this article.":["Olet poistanut tämän artikkelin."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Et ole toistaiseksi merkinnyt yhtään artikkelia parannettavaksi. Valitse jokunen artikkeli ilman viitteitä ja me esitämme sinulle linkkiehdotuksia tässä."],"Loading link suggestions...":["Ladataan linkkiehdotuksia..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Emme löytäneet yhtään ehdotusta tälle artikkelilla, mutta voit toki silti lisätä linkkejä artikkeleihin, joiden katsot liittyvän aiheeseen."],"Skip":["Ohita"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Et ole vielä valinnut yhtään artikkelia tähän vaiheeseen. Voit tehdä sen edellisessä vaiheessa."],"Is it up-to-date?":["Onko se ajan tasalla?"],"Last Updated":["Viimeksi päivitetty"],"You've moved this article to the next step.":["Olet siirtänyt tämän artikkelin seuraavaan vaiheeseen."],"Unknown":["Tuntematon"],"Clear summary":["Pyyhi yhteenveto"],"Add internal links towards your orphaned articles.":["Lisää sisäisiä linkkejä viitteettömiin artikkeleihisi."],"Should you update your article?":["Kannattaisiko sinun päivittää artikkeliasi?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Sivustosi sisältää paljon sisältöä, johon ei koskaan palata sen luomisen jälkeen. On tärkeää käydä näitä läpi ja kysyä itseltäsi vieläkö tämä sisältö on relevanttia sivustollesi. Pitäisikö minun parantaa niitä vai poistaa ne?"],"Start: Love it or leave it?":["Aloita: Rakasta vai hylkää?"],"Clean up your unlinked content to make sure people can find it":["Siivoa linkittämätön sisältösi ja varmista, että se on ihmisten löydettävissä"],"I've finished this workout":["Olen päättänyt tämän harjoitteen"],"Reset this workout":["Nollaa tämä harjoite"],"Well done!":["Hyvin tehty!"],"Add internal links towards your cornerstones":["Lisää sisäisiä linkkejä keskeiseen sisältöösi"],"Check the number of incoming internal links of your cornerstones":["Tarkistaa keskeiseen sisältöösi osoittavien sisäisten linkkien lukumäärä"],"Start: Choose your cornerstones!":["Aloita: valitse kulmakivesi"],"The cornerstone approach":["Kulmakivi-lähestymistapa"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Olen käynyt tämän askeleen läpi"],"Revise this step":["Muokkaa tätä askelta"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Emme löytäneet sisäisiä linkkejä sivustoltasi. Joko et ole vielä lisännyt yhtään, tai Yoast SEO ei ole indeksoinut niitä. Voit suorittaa linkkiesi indeksoinnin SEO datan optimointityökalun avulla kohdassa SEO > Työkalut."],"Incoming links":["Sisääntulevat linkit"],"Edit to add link":["Muokkaa lisätäksesi linkki"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Et ole toistaiseksi merkinnyt yhtään artikkelia kulmakiveksi. Kun olet tehnyt niin, ne näkyvät täällä."],"Focus keyphrase":["Kohdennettu avainfraasi"],"Article":["Artikkeli"],"Readability score":["Luettavuuspisteet"],"SEO score":["SEO-pisteet"],"Copy failed":["Kopiointi epäonnistui"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Paranna kulmakiviesi hakutuloksia tämän %1$sharjoitteen avulla!%2$s"],"Rank with articles you want to rank with":["Erotu artikkeleilla, joilla haluat erottua"],"Descriptive text":["Kuvaava teksti"],"Show the descriptive text":["Näytä kuvaava teksti"],"Show icon":["Näytä kuvake"],"Yoast Estimated Reading Time":["Yoastin arvioitu lukuaika"],"Shows an estimated reading time based on the content length.":["Näyttää arvioidun lukuajan sisällön pituuden perusteella."],"reading time":["lukuaika"],"content length":["sisällön pituus"],"Estimated reading time:":["Arvioitu lukuaika:"],"minute":["minuutti","minuuttia"],"Settings":["Asetukset"],"OK":["OK"],"Close":["Sulje"],"Type":["Tyyppi"],"Orphaned content":["Hylätty sisältö"],"Synonyms":["Synonyymit"],"Internal linking suggestions":["Sisäisten linkkien ehdotukset"],"Enter a related keyphrase to calculate the SEO score":["Lisää asiaan liittyvä hakulause laskeaksesi SEO-pisteesi"],"Related keyphrase":["Liittyvä avainfraasi"],"Add related keyphrase":["LIsää liittyvä avainfraasi"],"Analysis results":["Analyysin tulokset"],"Help on choosing the perfect keyphrase":["Apua täydellisen hakulauseen valitsemiseen"],"Help on keyphrase synonyms":["Apua hakulauseen synonyymeihin"],"Keyphrase":["Avainfraasi"],"New URL: {{link}}%s{{/link}}":["Uusi osoite: {{link}}%s{{/link}}"],"Undo":["Kumoa"],"Redirect created":["Uudelleenohjaus luotu"],"%s just created a redirect from the old URL to the new URL.":["%s loi juuri uudelleenohjauksen vanhasta osoitteesta uuteen. "],"Old URL: {{link}}%s{{/link}}":["Vanha osoite: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Hakulauseen synonyymit"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter-jaon esikatselu"],"Adds a list of internal links to sibling pages which share the same parent.":["Lisää listan sisäisiä linkkejä sisarussivuille joilla on yhteinen vanhempi."],"siblings":["sisarukset"],"sibling pages":["sisarussivut"],"Adds a list of internal links to subpages of this page.":["Lisää lista sisäisiä linkkejä tämän sivun alasivuille."],"seo":["SEO"],"subpages":["alasivut"],"childpages":["lapsisivut"],"children":["lapset"],"internal linking":["sisäiset linkit"],"site structure":["sivuston rakenne"],"We could not find any relevant articles on your website that you could link to from your post.":["Emme löytäneet yhtään relevanttia artikkelia sivustollasi johon voisit linkata."],"Load suggestions":["Lataa suosituksia"],"Refresh suggestions":["Päivitä suositukset"],"Write list…":["Kirjoita luettelo..."],"Adds a list of links related to this page.":["Lisää listan linkkejä, jotka liittyvät tähän sivuun."],"related posts":["liittyvät artikkelit"],"related pages":["liittyvät sivut"],"Adds a table of contents to this page.":["Lisää hakemiston tälle sivulle."],"links":["linkit"],"toc":["hakemisto"],"Copy link":["Kopioi linkki"],"Copy link to suggested article: %s":["Kopioi linkki ehdotettuun artikkeliin: %s"],"Add a title to your post for the best internal linking suggestions.":["Lisää otsikko viestiisi, niin saat parhaat sisäiset linkitysehdotukset."],"Add a metadescription to your post for the best internal linking suggestions.":["Lisää metakuvaus viestiisi, jotta saat parhaat sisäiset linkitysehdotukset."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Lisää otsikko ja metakuvaus viestiisi saadaksesi parhaat sisäiset linkitysehdotukset."],"Also, add a title to your post for the best internal linking suggestions.":["Lisää myös viestiisi otsikko, niin saat parhaat sisäiset linkitysehdotukset."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Lisää myös metakuvaus viestiisi, jotta saat parhaat sisäiset linkitysehdotukset."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Lisää myös viestiisi otsikko ja metakuvaus, jotta saat parhaat sisäiset linkitysehdotukset."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Kunhan lisäät hieman tekstisisältöä, tarjoamme sinulle tässä listan liittyvästä sisällöstä, johon voit artikkelissasi linkittää."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Parantaaksesi sivustosi rakennetta, harkitse linkittämistä muihin asiaankuuluviin viesteihin tai sivuihin verkkosivustollasi."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Muutaman sekunnin kuluttua näet luettelon asiaan liittyvästä sisällöstä, johon voit linkittää. Ehdotukset näytetään täällä heti, kun meillä on niitä."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Lue oppaamme sisäisistä linkeistä SEO:n kannalta{{/a}} oppiaksesi lisää."],"Copied!":["Kopioitu!"],"Not supported!":["Ei tuettu!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Yritätkö käyttää useita asiaan liittyviä avainsanoja? Sinun tulisi lisätä ne erikseen."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Avainfraasisi on liian pitkä. Sen enimmäispituus on 191 merkkiä."],"Add as related keyphrase":["LIsää liittyvänä avainfraasina"],"Added!":["Lisätty!"],"Remove":["Poista"],"Table of contents":["Sisällysluettelo"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Meidän on optimoitava sivustosi SEO-data, jotta voimme tarjota sinulle parhaat %1$slinkkisuositukset%2$s. %3$sAloita SEO-datan optimointi%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-fr_FR.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-fr_FR.json deleted file mode 100644 index 8dc345ad..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-fr_FR.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Pour accĂ©der Ă  cette fonctionnalitĂ©, vous devez disposer dâ€abonnements %2$s et %3$s activĂ©s. Veuillez %5$sactiver vos abonnements dans %1$s%6$s ou %7$sobtenir un nouveau %4$s%8$s. Veuillez ensuite actualiser cette page pour que la fonctionnalitĂ© fonctionne correctement, ce qui pourra prendre jusquâ€Ă  30 secondes."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["Le gĂ©nĂ©rateur de titres IA nĂ©cessite lâ€activation de lâ€analyse SEO avant dâ€ĂŞtre utilisĂ©. Pour lâ€activer, veuillez vous rendre dans les %2$sFonctionnalitĂ©s du site de %1$s%3$s, activer lâ€analyse SEO et cliquer sur « Enregistrer les modifications » . Si lâ€analyse SEO est dĂ©sactivĂ©e dans votre profil WordPress, accĂ©dez Ă  votre profil et activez-la. Veuillez contacter votre administrateur ou administratrice si vous nâ€avez pas accès Ă  ces rĂ©glages."],"Social share preview":["Aperçu des partages sociaux"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Pour continuer Ă  utiliser la fonctionnalitĂ© Yoast IA, veuillez rĂ©duire la frĂ©quence de vos demandes. Notre %1$sarticle d’aide%2$s fournit des conseils pour planifier et rythmer efficacement vos demandes afin d’optimiser le flux de travail."],"You've reached the Yoast AI rate limit.":["Vous avez atteint la limite de taux de Yoast IA."],"Allow":["Autoriser"],"Deny":["Refuser"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Pour consulter cette vidĂ©o, vous devez autoriser %1$s Ă  charger des vidĂ©os embarquĂ©es depuis %2$s."],"Text generated by AI may be offensive or inaccurate.":["Le texte gĂ©nĂ©rĂ© par l’IA peut ĂŞtre offensant ou inexact."],"(Opens in a new browser tab)":["(S’ouvre dans un nouvel onglet)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["AccĂ©lĂ©rez vos processus avec l’IA gĂ©nĂ©rative. Obtenez des suggestions qualitatives de titres et descriptions pour vos rĂ©glages SEO. %1$sEn savoir plus%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["GĂ©nĂ©rez les titres et descriptions avec Yoast AI !"],"New to %1$s":["Vous dĂ©couvrez %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["J’approuve les %1$sConditions d’utilisation%2$s et la %3$sPolitique de confidentialitĂ©%4$s du service Yoast IA. Cela inclut le consentement Ă  la collecte et Ă  l’utilisation des donnĂ©es pour amĂ©liorer l’expĂ©rience utilisateur."],"Start generating":["Commencer Ă  gĂ©nĂ©rer"],"Yes, revoke consent":["Oui, rĂ©voquer le consentement"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["En rĂ©voquant votre consentement, vous n’aurez plus accès aux fonctionnalitĂ©s de Yoast IA. Confirmez-vous vouloir rĂ©voquer votre consentement ?"],"Something went wrong, please try again later.":["Quelque chose c’est mal passĂ©, veuillez rĂ©essayer ultĂ©rieurement."],"Revoke AI consent":["RĂ©voquer le consentement Ă  l’IA"],"Please enter a focus keyphrase first to use AI.":["Veuillez d’abord saisir une phrase-clĂ© ciblĂ©e pour utiliser l’IA."],"AI title generator":["GĂ©nĂ©rateur IA de titre"],"AI description generator":["GĂ©nĂ©rateur IA de description"],"AI Twitter title generator":["GĂ©nĂ©rateur IA de titre Twitter"],"AI Twitter description generator":["GĂ©nĂ©rateur IA de description Twitter"],"AI social title generator":["GĂ©nĂ©rateur IA de titres sociaux"],"AI social description generator":["GĂ©nĂ©rateur IA de descriptions sociales"],"Twitter preview":["Aperçu Twitter"],"Dismiss":["Ignorer"],"Don’t show again":["Ne plus afficher"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sConseil%2$s : AmĂ©liorez la prĂ©cision des titres gĂ©nĂ©rĂ©s par l’IA en rĂ©digeant davantage de contenu dans votre page."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sConseil%2$s : AmĂ©liorez la prĂ©cision des descriptions gĂ©nĂ©rĂ©es par l’IA en rĂ©digeant davantage de contenu dans votre page."],"Try again":["RĂ©essayer"],"Social preview":["Aperçu social"],"Desktop result":["RĂ©sultat bureau"],"Mobile result":["RĂ©sultat mobile"],"Apply AI description":["Appliquer la description IA"],"Apply AI title":["Appliquer le titre IA"],"Next":["Suivant"],"Previous":["PrĂ©cĂ©dent"],"Generate 5 more":["GĂ©nĂ©rer 5 autres"],"Google preview":["Aperçu Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["En raison des directives Ă©thiques strictes dâ€OpenAI et des %1$suspensions dâ€utilisation%2$s, nous ne sommes pas en mesure de gĂ©nĂ©rer de titre SEO pour votre page. Si vous avez lâ€intention dâ€utiliser lâ€IA, veuillez Ă©viter tout contenu explicite, violent ou sexuellement explicite. %3$sPour en savoir plus sur la manière de configurer votre page afin dâ€obtenir les meilleurs rĂ©sultats avec lâ€IA%4$s"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["En raison des directives Ă©thiques strictes de l’OpenAI et des %1$spolitiques d’utilisation%2$s, nous ne sommes pas en mesure de gĂ©nĂ©rer des mĂ©ta-descriptions pour votre page. Si vous avez l’intention d’utiliser l’IA, veuillez Ă©viter tout contenu explicite, violent ou sexuellement explicite. %3$sEn savoir plus sur la manière de configurer votre page afin d’obtenir les meilleurs rĂ©sultats avec l’IA%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Pour accĂ©der Ă  cette fonctionnalitĂ©, vous devez disposer d’un abonnement %1$s actif. Veuillez %3$sactiver votre abonnement dans %2$s%4$s ou %5$ssouscrire un nouvel abonnement %1$s%6$s. Ensuite, cliquez sur le bouton pour actualiser cette page pour que cela fonctionne correctement, ce qui peut prendre jusqu’à 30 secondes."],"Refresh page":["Actualiser la page"],"Not enough content":["Pas assez de contenu"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Veuillez rĂ©essayer ultĂ©rieurement. Si le problème persiste, veuillez %1$scontacter notre Ă©quipe de support%2$s !"],"Something went wrong":["Quelque chose s’est mal passĂ©"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Il semble que le dĂ©lai de connexion soit dĂ©passĂ©. Veuillez vĂ©rifier votre connexion internet et rĂ©essayer ultĂ©rieurement. Si le problème persiste, veuillez %1$scontacter notre Ă©quipe de support%2$s"],"Connection timeout":["DĂ©lai de connexion dĂ©passĂ©"],"Use AI":["Utiliser l’IA"],"Close modal":["Fermer la modale"],"Learn more about AI (Opens in a new browser tab)":["En savoir plus sur l’IA (s’ouvre dans un nouvel onglet du navigateur)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTitre%3$s : Votre page n’a pas encore de titre. %2$sAjoutez-en un%3$s !"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTitre%2$s : Votre page a un titre. Bien joué !"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sDistribution de requĂŞte%3$s : %2$sÉcrivez votre requĂŞte ou ses synonymes dans le texte afin que nous puissions calculer leur distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sDistribution de la requĂŞte%2$s : Bon travail !"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribution de la requĂŞte%3$s : inĂ©gale. Certaines parties de votre texte ne contiennent ni la requĂŞte, ni ses synonymes. %2$sDistribuez-les plus Ă©quitablement%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribution de la requĂŞte%3$s : très inĂ©gale. De grandes parties de votre texte ne contiennent ni votre requĂŞte, ni ses synonymes. %2$sDistribuez-les plus Ă©quitablement%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s : Vous n’utilisez pas trop de mots complexes, ce qui rend votre texte facilement lisible. Bon travail !"],"Word complexity":["ComplexitĂ© des mots"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s : %2$s des mots utilisĂ©s sont considĂ©rĂ©s comme complexes. %3$sEssayez d’utilisez des mots moins longs et plus courants pour amĂ©liorer la lisibilitĂ©%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sAlignement%3$s : Il y a une longue section de texte alignĂ©e au centre. %2$sNous recommandons de l’aligner Ă  gauche%3$s.","%1$sAlignement%3$s : Il y a %4$s longues sections de texte alignĂ©es au centre. %2$sNous recommandons de les aligner Ă  gauche%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sAlignement%3$s : Il y a une longue section de texte alignĂ© au centre. %2$sNous recommandons de l’aligner Ă  droite%3$s.","%1$sAlignement%3$s : Il y a %4$s longues sections de texte alignĂ©es au centre. %2$sNous recommandons de les aligner Ă  droite%3$s."],"Select image":["SĂ©lectionner une image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["Vous ne le savez peut-ĂŞtre mĂŞme pas, mais certaines pages de votre site ne reçoivent aucun lien. Câ€est un problème de rĂ©fĂ©rencement, car il est difficile pour les moteurs de recherche de trouver des pages qui nâ€ont pas de liens. Il est donc plus difficile de les classer. Nous appelons ces pages des contenus orphelins. Dans cette atelier, nous trouvons les contenus orphelins de votre site et nous vous aidons Ă  ajouter rapidement des liens vers ces contenus, afin quâ€ils aient une chance dâ€ĂŞtre classé !"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Il est temps dâ€ajouter des liens ! Vous trouverez ci-dessous une liste de vos articles orphelins. Sous chacun dâ€eux, vous trouverez des suggestions de pages connexes Ă  partir desquelles vous pouvez ajouter un lien. Lorsque vous ajoutez un lien, veillez Ă  â€'insĂ©rer dans une phrase pertinente en rapport avec lâ€article orphelin. Continuez Ă  ajouter des liens vers chacun des articles orphelins jusquâ€Ă  ce que vous soyez satisfait du nombre de liens pointant vers eux."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Il est temps d'ajouter des liens ! Vous trouverez ci-dessous une liste de vos piliers. Sous chaque pilier, vous trouverez des suggestions de publications pour lesquels vous pouvez ajouter un lien. Quand vous ajoutez un lien, assurez-vous de l’insĂ©rer dans une phrase pertinente et similaire Ă  la publication de votre pilier. Continuez Ă  ajouter des liens Ă  partir d’autant de publications similaires que nĂ©cessaire, jusqu'Ă  ce que vos piliers aient le plus grand nombre de liens internes pointant vers eux."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Certaines publications de votre site sont %1$sles%2$s plus importants. Ils rĂ©pondent aux questions des internautes et rĂ©solvent leurs problèmes. Ils mĂ©ritent donc d’être classĂ©s ! Chez %3$s, nous appelons ces articles des piliers. L’un des moyens de les classer est de faire pointer suffisamment de liens vers eux. Un plus grand nombre de liens indique aux moteurs de recherche que ces publications sont importantes et prĂ©cieuses. Dans cet atelier, nous vous aiderons Ă  ajouter des liens Ă  vos contenus piliers !"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Une fois que vous aurez ajoutĂ© un peu plus de texte, nous pourrons vous indiquer le niveau de formalitĂ© de votre texte."],"Overall, your text appears to be %1$s%3$s%2$s.":["Dans l'ensemble, votre texte semble ĂŞtre %1$s%3$s%2$s."],"Heading %d":["Titre %d"],"Maximum heading level":["Niveau maximum de titre"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Vous avez dĂ©sactivĂ© les suggestions de liens, qui sont nĂ©cessaires pour que les liens similaires fonctionnent. Si vous souhaitez ajouter des liens similaires, allez dans FonctionnalitĂ©s du site et activez les suggestions de liens."],"Schema":["SchĂ©ma"],"Meta tags":["Balises mĂ©ta"],"Not available":["Non disponible"],"Checks":["VĂ©rifications"],"Focus Keyphrase":["RequĂŞte cible"],"Good":["Bon"],"No index":["Aucun index"],"Front-end SEO inspector":["Inspecteur SEO de lâ€interface publique"],"Focus keyphrase not set":["RequĂŞte cible non dĂ©finie"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Veuillez noter : pour que cet atelier fonctionne correctement, vous devez exĂ©cuter l’outil d’optimisation des donnĂ©es SEO. Les administrateurs peuvent l’exĂ©cuter sous %1$sSEO > Outils%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Vous avez ajoutĂ© des liens vers vos articles orphelins, et vous avez nettoyĂ© ceux qui n’étaient plus pertinents. Excellent travail ! Jetez un coup d’œil au rĂ©sumĂ© ci-dessous et cĂ©lĂ©brez ce que vous avez accompli !"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Examinez d’un Ĺ“il critique le contenu de cette liste et effectuez les mises Ă  jour nĂ©cessaires. Si vous avez besoin d’aide pour effectuer les mises Ă  jour, nous avons un %1$sarticle de blog très utile qui peut vous guider tout au long du processus%2$s (cliquez pour ouvrir un nouvel onglet)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sBesoin de plus dâ€aide ? Nous avons dĂ©taillĂ© chaque Ă©tape plus en dĂ©tail dans le guide suivant : %2$sComment utiliser l’atelier liĂ© contenu orphelin %7$s %3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Vous venez de rendre votre meilleur contenu facile Ă  trouver, et plus susceptible d’être classé ! Bravo ! De temps en temps, n’oubliez pas de vĂ©rifier si vos piliers reçoivent suffisamment de liens !"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Jetez un coup d’œil Ă  la liste ci-dessous. Vos piliers (marquĂ©es avec %1$s) ont-elles le plus de liens internes pointant vers elles ? Cliquez sur le bouton Optimiser si vous pensez qu’un contenu pilier a besoin de plus de liens. L’article passera alors Ă  l’étape suivante."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Tous vos contenus piliers ont-ils des puces vertes ? Pour obtenir les meilleurs rĂ©sultats, pensez Ă  modifier ceux qui n’en ont pas !"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Quels sont les articles que vous voulez classer le plus haut ? Quels sont ceux que votre public trouverait les plus utiles et les plus complets ? Cliquez sur la flèche pointant vers le bas et recherchez les articles qui rĂ©pondent Ă  ces critères. Nous marquerons automatiquement les articles que vous sĂ©lectionnez dans la liste comme pilier."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sBesoin de plus dâ€aide ? Nous avons dĂ©taillĂ© chaque Ă©tape plus en dĂ©tail dans : %2$sComment utiliser l’atelier des piliers %7$s %3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast Sous-pages"],"Yoast Siblings":["Yoast Siblings"],"Yoast Table of Contents":["Table des matières Yoast"],"Yoast Related Links":["Liens en relations Yoast"],"Finish optimizing":["Terminez lâ€optimisation"],"You've finished adding links to this article.":["Vous avez fini d'ajouter des liens Ă  cet article"],"Optimize":["Optimiser"],"Added to next step":["Nouvelle Ă©tape ajoutĂ©e"],"Choose cornerstone articles...":["Choisir vos articles piliers…"],"Loading data...":["Chargement des donnĂ©es..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Vous n’avez pas encore nettoyĂ© ou mis Ă  jour d’articles en utilisant cet atelier. Une fois que vous l’aurez fait, un rĂ©sumĂ© de votre travail sera affichĂ© ici."],"Skipped":["IgnorĂ©"],"Hidden from search engines.":["MasquĂ© des moteurs de recherche."],"Removed":["RetirĂ©"],"Improved":["AmĂ©liorĂ©"],"Resolution":["RĂ©solution"],"Loading redirect options...":["Chargement des options de redirection…"],"Remove and redirect":["Supprimer et rediriger"],"Custom url:":["URL personnalisĂ©e :"],"Related article:":["Article similaire :"],"Home page:":["Page d’accueil :"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Vous ĂŞtes sur le point de supprimer %1$s%2$s%3$s. Pour Ă©viter les 404 sur votre site, vous devez le rediriger vers une autre page de votre site. OĂą voulez-vous le rediriger ?"],"SEO Workout: Remove article":["Atelier SEO : Supprimer un article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Tout semble bon ! Nous n’avons trouvĂ© aucun article sur votre site de plus de six mois recevant trop peu de liens sur votre site. Nâ€hĂ©sitez pas Ă  revenir ici plus tard pour de nouvelles suggestions de nettoyage !"],"Hide from search engines":["Masquer dans les moteurs de recherche"],"Improve":["AmĂ©liorer"],"Are you sure you wish to hide this article from search engines?":["Confirmez-vous vouloir masquer cet article aux moteurs de recherche ?"],"Action":["Action"],"You've hidden this article from search engines.":["Vous avez masquĂ© cet article aux moteurs de recherche."],"You've removed this article.":["Vous avez supprimĂ© cet article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Vous n’avez actuellement sĂ©lectionnĂ© aucun article Ă  amĂ©liorer. SĂ©lectionnez quelques publications dans les Ă©tapes prĂ©cĂ©dentes pour y ajouter des liens et nous vous afficherons des suggestions de liens ici."],"Loading link suggestions...":["Chargement des suggestions de liens…"],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Nous n’avons pas trouvĂ© de suggestions pour cet article, mais vous pouvez bien sĂ»r ajouter des liens vers des articles que vous pensez ĂŞtre liĂ©s."],"Skip":["Passer"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Vous n’avez pas encore sĂ©lectionnĂ© d’articles pour cette Ă©tape. Vous pouvez le faire dans l’étape prĂ©cĂ©dente."],"Is it up-to-date?":["Est-il Ă  jour ?"],"Last Updated":["Dernière mise Ă  jour"],"You've moved this article to the next step.":["Vous avez passĂ© cet article Ă  l’étape suivante."],"Unknown":["Inconnu"],"Clear summary":["Effacer le rĂ©sumĂ©"],"Add internal links towards your orphaned articles.":["Ajoutez des liens internes vers vos articles orphelins."],"Should you update your article?":["Devriez-vous mettre Ă  jour votre article ?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Votre site contient souvent beaucoup de contenu créé une fois et auquel on ne revient jamais par la suite. Il est important de les passer en revue et de se demander si ces contenus sont toujours pertinents pour votre site. Devez-vous les amĂ©liorer ou les supprimer ?"],"Start: Love it or leave it?":["Commencer : Vous aimez ou vous arrĂŞtez ?"],"Clean up your unlinked content to make sure people can find it":["Nettoyez votre contenu non liĂ© pour vous assurer que les internautes puissent le trouver."],"I've finished this workout":["J’ai terminĂ© cet atelier"],"Reset this workout":["RĂ©initialiser cet atelier"],"Well done!":["Bien joué !"],"Add internal links towards your cornerstones":["Ajoutez des liens internes vers vos contenus piliers"],"Check the number of incoming internal links of your cornerstones":["VĂ©rifiez le nombre de liens internes entrants de vos contenus piliers"],"Start: Choose your cornerstones!":["DĂ©but : Choisissez vos piliers !"],"The cornerstone approach":["L’approche pilier"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Veuillez noter : pour que cet atelier fonctionne correctement et vous propose des suggestions de liens, vous devez exĂ©cuter l’outil d’optimisation des donnĂ©es SEO. Les administrateurs peuvent l’exĂ©cuter sous %1$sSEO > Outils%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Veuillez noter : votre admin a dĂ©sactivĂ© la fonctionnalitĂ© pilier dans les rĂ©glages SEO. Si vous souhaitez utiliser cet atelier, elle doit ĂŞtre activĂ©e."],"I've finished this step":["J’ai fini cette Ă©tape"],"Revise this step":["Revoir cette Ă©tape"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Nous n’avons pas pu trouver de liens internes sur vos pages. Soit vous n’avez pas encore ajoutĂ© de liens internes Ă  votre contenu, soit Yoast SEO ne les a pas indexĂ©s. Vous pouvez demander Ă  Yoast SEO d’indexer vos liens en exĂ©cutant l’optimisation des donnĂ©es SEO sous SEO > Outils."],"Incoming links":["Liens entrants"],"Edit to add link":["Modifier pour ajouter un lien"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Vous n’avez actuellement aucun article marquĂ© comme article pilier. Lorsque vous marquerez vos articles en tant qu’articles piliers, ils apparaĂ®tront ici."],"Focus keyphrase":["RequĂŞte cible"],"Article":["Article"],"Readability score":["Score de lisibilitĂ©"],"SEO score":["Score SEO"],"Copy failed":["La copie a Ă©chouĂ©"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["AmĂ©liorez le classement de tous vos contenus piliers en utilisant cet %1$satelier Ă©tape par Ă©tape !%2$s"],"Rank with articles you want to rank with":["Soyez visibles avec les articles souhaitĂ©s"],"Descriptive text":["Texte descriptif"],"Show the descriptive text":["Afficher le texte descriptif"],"Show icon":["Afficher l’icĂ´ne"],"Yoast Estimated Reading Time":["Temps de lecture estimĂ© par Yoast"],"Shows an estimated reading time based on the content length.":["Affiche une estimation du temps de lecture en fonction de la longueur du contenu."],"reading time":["Temps de lecture"],"content length":["longueur du contenu"],"Estimated reading time:":["Temps de lecture estimé : "],"minute":["minute","minutes"],"Settings":["RĂ©glages"],"OK":["OK"],"Close":["Fermer"],"Type":["Type"],"Orphaned content":["Contenu orphelin"],"Synonyms":["Synonymes"],"Internal linking suggestions":["Suggestions de liens internes"],"Enter a related keyphrase to calculate the SEO score":["Saisissez une phrase clĂ© associĂ©e pour calculer le score de rĂ©fĂ©rencement"],"Related keyphrase":["RequĂŞte cible liĂ©e"],"Add related keyphrase":["Ajouter une variante"],"Analysis results":["RĂ©sultats de l’analyse"],"Help on choosing the perfect keyphrase":["Aide sur le choix de la phrase clĂ© idĂ©ale"],"Help on keyphrase synonyms":["Aide sur les synonymes de phrase clĂ©"],"Keyphrase":["RequĂŞte"],"New URL: {{link}}%s{{/link}}":["nouvelle URL:{{link}}%s{{/link}}"],"Undo":["RĂ©tablir"],"Redirect created":["Redirection créée"],"%s just created a redirect from the old URL to the new URL.":["%s vient de crĂ©er une redirection de l’ancienne URL vers la nouvelle URL."],"Old URL: {{link}}%s{{/link}}":["Ancienne URL :{{link}}%s{{/link}}"],"Keyphrase synonyms":["Synonymes de la phrase clĂ©"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Aperçu du partage sur Twitter"],"Adds a list of internal links to sibling pages which share the same parent.":["Ajoute une liste de liens internes vers des pages sĹ“urs (qui partagent le mĂŞme parent)."],"siblings":["pages sĹ“urs"],"sibling pages":["pages sĹ“urs"],"Adds a list of internal links to subpages of this page.":["Ajoute une liste de liens internes vers les pages filles de cette page."],"seo":["seo"],"subpages":["sous-pages"],"childpages":["pages enfants"],"children":["enfants"],"internal linking":["maillage interne"],"site structure":["structure de site"],"We could not find any relevant articles on your website that you could link to from your post.":["Nous n’avons pas trouvĂ© d’article pertinent sur votre site vers lequel vous pourriez faire un lien."],"Load suggestions":["Chargement des suggestions"],"Refresh suggestions":["RafraĂ®chir les suggestions"],"Write list…":["RĂ©digez une liste…"],"Adds a list of links related to this page.":["Ajoute une liste de liens en relation avec cette page."],"related posts":["articles en relation"],"related pages":["pages en relation"],"Adds a table of contents to this page.":["Ajoute une table des matières Ă  cette page."],"links":["liens"],"toc":["tdm"],"Copy link":["Copier le lien"],"Copy link to suggested article: %s":["Copier le lien de l’article suggĂ©ré : %s"],"Add a title to your post for the best internal linking suggestions.":["Ajoutez un titre Ă  votre article pour obtenir des meilleures suggestions de maillage interne."],"Add a metadescription to your post for the best internal linking suggestions.":["Ajouter une mĂ©ta-description Ă  votre article pour obtenir de meilleures suggestions de liens."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Ajoutez un titre et une mĂ©ta-description Ă  votre article pour obtenir de meilleures suggestions de maillage interne."],"Also, add a title to your post for the best internal linking suggestions.":["Ajoutez Ă©galement un titre Ă  votre article pour obtenir de meilleures suggestions de maillage interne."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Ajoutez Ă©galement une mĂ©ta-description Ă  votre article pour obtenir de meilleures suggestions de maillage interne."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Ajoutez Ă©galement un titre et une mĂ©ta-description Ă  votre article pour obtenir de meilleures suggestions de maillage interne."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Lorsque vous aurez rĂ©digĂ© plus de contenus, nous vous proposerons une liste d’articles en relation que vous pourrez ajouter en lien dans votre publication."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Pour amĂ©liorer la structure de votre site, pensez au maillage interne en ajoutant des liens vers des articles ou pages de votre site."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["L’affichage de la liste des contenus en relation vers lesquels vous pourriez faire des liens prend quelques secondes. Les propositions apparaĂ®tront ici dès que possible."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Lisez notre guide sur le maillage interne en SEO{{/a}} pour en savoir plus."],"Copied!":["Copié !"],"Not supported!":["Non compatible !"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Essayez-vous d’utiliser des requĂŞtes cibles multiples ? Vous devriez les ajouter sĂ©parĂ©ment."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Votre requĂŞte cible est trop longue. Elle peut ĂŞtre composĂ©e de 191 caractères au maximum."],"Add as related keyphrase":["Ajouter en tant que requĂŞte cible"],"Added!":["Ajouté !"],"Remove":["Supprimer"],"Table of contents":["Table des matières"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Nous avons besoin d’optimiser les donnĂ©es SEO pour vous proposer les meilleures %1$ssuggestions de liens%2$s.\n\n%3$sDĂ©marrage de l’optimisation des donnĂ©es SEO%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-hat.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-hat.json deleted file mode 100644 index ed1ec294..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-hat.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"ht"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Settings"],"OK":["OK"],"Close":["Close"],"Type":["Type"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-he_IL.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-he_IL.json deleted file mode 100644 index e89765a3..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-he_IL.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"he_IL"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":["להרשות"],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["כדי לר×ות סר×ון ×–×”, עליך ל×פשר ל-%1$s ל×עון סר×ונים מו×מעים מ-%2$s."],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(פתח ב××ב חדש בדפדפן)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["תצוגה מקדימה של ×ווי×ר"],"Dismiss":["סגור"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["לנסות שוב"],"Social preview":[],"Desktop result":["תוצ×ות דסק×ופ"],"Mobile result":["תוצ×ות מובייל"],"Apply AI description":[],"Apply AI title":[],"Next":["הב×"],"Previous":["קודם"],"Generate 5 more":[],"Google preview":["תצוגת גוגל"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sפיזור בי×ויי מפתח%3$s: %2$sיש לכלול בי×וי מפתח ×ו ×ת המילים הנרדפות שלו בתוכן כדי שנוכל לבדוק ×ת פיזור בי×ויי המפתח%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sפיזור בי×ויי מפתח%2$s: עבודה ×ובה!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sפיזור בי×ויי מפתח%3$s: ×ś× ×חיד. חלקים מסוימים בתוכן ×ינם מכילים בי×וי מפתח ×ו ×ת המילים הנרדפות שלו. %2$sיש לפזר ×ותם ב×ופן שווה יותר%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sפיזור בי×ויי מפתח%3$s: מ×וד ×ś× ×חיד. חלקים גדולים בתוכן ×ינם מכילים בי×וי מפתח ×ו ×ת המילים הנרדפות שלו. %2$sיש לפזר ×ותם ב×ופן שווה יותר%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: ×ינך משתמש ביותר מדי מילים מורכבות, מה שהופך ×ת ×”××§×ˇ× ×ś×§×¨×™× ×™×•×Ş×¨. עבודה ×ובה!"],"Word complexity":["מורכבות מילים"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s:%2$s מהמילים בנוסח נחשבות כמסובכות. %3$s תנסו להשתמש במילים קצרות יותר, ×ו יותר מוכרות כדי לשפר ×ת רמת הקרי×ות %4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["בחירת תמונה"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["כותרת ברמה %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["סכימה"],"Meta tags":["Meta tags"],"Not available":["×ś× ×–×ž×™×ź"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["×וב"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["נמחק"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["פעולה"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["דלג"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["עדכון ×חרון"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["×ś× ×™×“×•×˘"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["× ×§×” ×ת הקישורים השבורים כדי להקל על הגולשים ×ś×ž×¦×•× ×ת התוכן הנדרש."],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["בי×וי מפתח למיקוד"],"Article":["מ×מר"],"Readability score":["ציון קרי×ות"],"SEO score":["ציון SEO"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["××§×ˇ× ×Ş×™×ורי"],"Show the descriptive text":["הצג ×ת ×”××§×ˇ× ×”×Ş×™×ורי"],"Show icon":["הצג ×ייקון"],"Yoast Estimated Reading Time":["זמן קרי××” משוער על ידי Yoast"],"Shows an estimated reading time based on the content length.":["מציג זמן קרי××” משוער בהתבסס על ×ורך התוכן."],"reading time":["זמן קרי××”"],"content length":["×ורך התוכן"],"Estimated reading time:":["זמן קרי××” משוער:"],"minute":["דקה","דקות"],"Settings":["הגדרות"],"OK":["תקין"],"Close":["סגור"],"Type":["סוג"],"Orphaned content":["תוכן יתום"],"Synonyms":["מילים נרדפות"],"Internal linking suggestions":["הצעות לקישור פנימי"],"Enter a related keyphrase to calculate the SEO score":["הזן בי×וי מפתח כדי לחשב ×ת ציון ×”-SEO"],"Related keyphrase":["בי×וי מפתח קשור"],"Add related keyphrase":["הוסף בי×וי מפתח רלוונ×יים"],"Analysis results":["תוצ×ות ניתוח"],"Help on choosing the perfect keyphrase":["עזרה בבחירת בי×וי מפתח מושלמים"],"Help on keyphrase synonyms":["עזרה על משפ××™ מפתח נרדפים"],"Keyphrase":["בי×וי מפתח"],"New URL: {{link}}%s{{/link}}":["כתובת חדשה: {{קישור}}%s{{/קישור}}"],"Undo":["ב×ל"],"Redirect created":["נוצרה הפניה"],"%s just created a redirect from the old URL to the new URL.":["%s יצר הפניה מכתובת ×”×תר הישנה לכתובת ×”×תר החדשה."],"Old URL: {{link}}%s{{/link}}":["כתובת ישנה: {{link}}%s{{/link}}"],"Keyphrase synonyms":["מילים נרדפות לבי×ויי מפתח"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["תצוגת שיתוף ב×ווי×ר"],"Adds a list of internal links to sibling pages which share the same parent.":["מוסיף רשימה של קישורים פנימיים לעמודים ×חים ×שר חולקים ×ת ×ותו ההורה."],"siblings":["×חים"],"sibling pages":["עמודים ×חים"],"Adds a list of internal links to subpages of this page.":["מוסיף רשימה של קישורים פנימיים לדפי משנה של עמוד ×–×”."],"seo":["seo"],"subpages":["עמודי משנה"],"childpages":["עמודי משנה"],"children":["ילדים"],"internal linking":["קישורים פנימיים"],"site structure":["מבנה ×תר"],"We could not find any relevant articles on your website that you could link to from your post.":["×ś× × ×ž×¦×ו מ×מרים רלוונ×יים ב×תר ש×ליהם ניתן לקשר מהפוס×."],"Load suggestions":["×ען הצעות"],"Refresh suggestions":["רענן הצעות"],"Write list…":["הוספת רשימה…"],"Adds a list of links related to this page.":["מוסיף רשימה של קישורים הקשורים לעמוד ×–×”."],"related posts":["פוס×ים קשורים"],"related pages":["עמודים קשורים"],"Adds a table of contents to this page.":["מוסיף תוכן עניינים לעמוד ×–×”."],"links":["קישורים"],"toc":["תוכן עניינים"],"Copy link":["העתק קישור"],"Copy link to suggested article: %s":["העתק קישור למ×מר מוצע: %s"],"Add a title to your post for the best internal linking suggestions.":["הוסף כותרת ×ś×¤×•×ˇ× ×›×“×™ לקבל ×ת הצעות ×”×ובות ביותר לקישורים פנימיים."],"Add a metadescription to your post for the best internal linking suggestions.":["הוסף תי×ור ×ś×¤×•×ˇ× ×›×“×™ לקבל ×ת ההצעות ×”×ובות ביותר לקישורים פנימיים."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["הוסף כותרת ותי×ור ×ś×¤×•×ˇ× ×›×“×™ לקבל ×ת ההצעות ×”×ובות ביותר לקישורים פנימיים."],"Also, add a title to your post for the best internal linking suggestions.":["כמו כן, הוסף כותרת ×ś×¤×•×ˇ× ×›×“×™ לקבל ×ת ההצעות ×”×ובות ביותר לקישורים פנימיים."],"Also, add a metadescription to your post for the best internal linking suggestions.":["כמו כן, הוסף תי×ור ×ś×¤×•×ˇ× ×›×“×™ לקבל ×ת ההצעות ×”×ובות ביותר לקישורים פנימיים."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["כמו כן, הוסף כותרת ותי×ור ×ś×¤×•×ˇ× ×›×“×™ לקבל ×ת ההצעות ×”×ובות ביותר לקישורים פנימיים."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["ל×חר הוספת תוכן נוסף, תוצג רשימה של תוכן קשור ש×ליו ניתן ×™×”×™×” לקשר ×ž×”×¤×•×ˇ× ×”×–×”."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["כדי לשפר ×ת מבנה ×”×תר, יש לשקול להוסיף קישור לפוס×ים ×ו עמודים רלוונ×יים ×חרים ב×תר."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["×–×” ×™×§×— כמה שניות להר×ות רשימה של תוכן קשור ש×ליו ×תה יכול לקשר. ההצעות יוצגו ×›×ן ברגע שנקבל ×ותן."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["למידע נוסף, {{a}}כד××™ ×ś×§×¨×•× ×ת המדריך שלנו ×‘× ×•×©× ×§×™×©×•×¨ פנימי למ×רת SEO.\n{{/a}}"],"Copied!":["הועתק!"],"Not supported!":["×ś× × ×Ş×ž×š!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["×”×ם ×תה מנסה להשתמש בבי×ויי מפתח מרובים קשורים? כד××™ להוסיף ×ותם בנפרד."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["בי×וי המפתח שלך ×רוך מדי. ×”×•× ×™×›×•×ś להכיל עד 191 תווים לכל היותר."],"Add as related keyphrase":["הוסף כבי×וי מפתח רלוונ××™"],"Added!":["נוסף!"],"Remove":["הסר"],"Table of contents":["תוכן עניינים"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["%2$s%1$sעלינו למ×ב ×ת נתוני ×”-SEO של ×”×תר כדי שנוכל להציע לך ×ת ×פשרויות הקישור ×”×ובות ביותר.\n\n\n%3$sלהתחלת מי×וב של נתוני SEO %4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-hi_IN.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-hi_IN.json deleted file mode 100644 index 96c28653..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-hi_IN.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"hi_IN"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["इस सŕĄŕ¤µŕ¤żŕ¤§ŕ¤ľ तक पहŕĄŕ¤‚चने के लिए, आपको सक्रिय %2$s और %3$s सदस्यता की आवश्यकता हŕĄŕĄ¤ कŕĄŕ¤Şŕ¤Żŕ¤ľ %5$sअपनी सदस्यताएठ%1$s में सक्रिय करें%6$s या %7$sनया %4$s प्राप्त करें%8$s। बाद में, सŕĄŕ¤µŕ¤żŕ¤§ŕ¤ľ के सही ढंग से काम करने के लिए कŕĄŕ¤Şŕ¤Żŕ¤ľ इस पेज को रीफ्रेश करें, जिसमें 30 सेकंड तक का समय लग सकता हŕĄŕĄ¤"],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["एआठशीर्षक जनरेटर को उपयोग से पहले एसŕ¤ŕ¤“ विश्लेषण को सक्षम करने की आवश्यकता होती हŕĄŕĄ¤ इसे सक्षम करने के लिए, कŕĄŕ¤Şŕ¤Żŕ¤ľ %1$s%3$s की %2$sसाइट सŕĄŕ¤µŕ¤żŕ¤§ŕ¤ľŕ¤“ं पर जाएŕ¤, एसŕ¤ŕ¤“ विश्लेषण चालू करें, और 'परिवर्तन सहेजें' पर क्लिक करें। यदि आपके वर्डप्रेस उपयोगकर्ता प्रोफ़ाइल में एसŕ¤ŕ¤“ विश्लेषण अक्षम हŕĄ, तो अपनी प्रोफ़ाइल तक पहŕĄŕ¤‚चें और इसे वहां सक्षम करें। यदि आपके पास इन सेटिंग्स तक पहŕĄŕ¤‚च नहीं हॠतो कŕĄŕ¤Şŕ¤Żŕ¤ľ अपने व्यवस्थापक से संपर्क करें।"],"Social share preview":["सामाजिक शेयर पूर्वावलोकन"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["योस्ट एआठसŕĄŕ¤µŕ¤żŕ¤§ŕ¤ľ का उपयोग जारी रखने के लिए, कŕĄŕ¤Şŕ¤Żŕ¤ľ अपने अनŕĄŕ¤°ŕĄ‹ŕ¤§ŕĄ‹ŕ¤‚ की आवŕĄŕ¤¤ŕĄŤŕ¤¤ŕ¤ż कम करें। हमारा %1$sसहायता आलेख%2$s एक अनŕĄŕ¤•ूलित वर्कफ़्लो के लिए आपके अनŕĄŕ¤°ŕĄ‹ŕ¤§ŕĄ‹ŕ¤‚ को प्रभावी ढंग से योजना बनाने और गति देने पर मार्गदर्शन प्रदान करता हŕĄŕĄ¤"],"You've reached the Yoast AI rate limit.":["आप योस्ट एआठदर सीमा तक पहŕĄŕ¤‚च गए हŕĄŕ¤‚।"],"Allow":["अनŕĄŕ¤®ŕ¤¤ŕ¤ż दें"],"Deny":["अस्वीकार करना"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["इस वीडियो को देखने के लिए, आपको %1$s को %2$s से एम्बेड किए गए वीडियो लोड करने की अनŕĄŕ¤®ŕ¤¤ŕ¤ż देनी होगी।"],"Text generated by AI may be offensive or inaccurate.":["एआठद्वारा उत्पन्न पाठ आपत्तिजनक या गलत हो सकता हŕĄŕĄ¤"],"(Opens in a new browser tab)":["(नए ब्राउज़र टŕĄŕ¤¬ में खŕĄŕ¤˛ŕ¤¤ŕ¤ľ हŕĄ)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["जेनरेटिव एआठके साथ अपने वर्कफ़्लो को तेज़ करें। अपनी खोज और सामाजिक उपस्थिति के लिए उच्च गŕĄŕ¤Łŕ¤µŕ¤¤ŕĄŤŕ¤¤ŕ¤ľ वाले शीर्षक और विवरण सŕĄŕ¤ťŕ¤ľŕ¤µ प्राप्त करें। %1$sऔर अधिक जानें%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["योस्ट एआठके साथ शीर्षक और विवरण तŕĄŕ¤Żŕ¤ľŕ¤° करें!"],"New to %1$s":["%1$s पर नया"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["मŕĄŕ¤‚ योस्ट एआठसेवा की %1$sसेवा की शर्तों%2$s और %3$sगोपनीयता नीति%4$s को मंजूरी देता हूं। इसमें उपयोगकर्ता अनŕĄŕ¤­ŕ¤µ को बेहतर बनाने के लिए डेटा के संग्रह और उपयोग के लिए सहमति शामिल हŕĄŕĄ¤"],"Start generating":["उत्पन्न करना प्रारंभ करें"],"Yes, revoke consent":["हां, सहमति रद्द करें"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["अपनी सहमति रद्द करने से, अब आपको योस्ट एआठसŕĄŕ¤µŕ¤żŕ¤§ŕ¤ľŕ¤“ं तक पहŕĄŕ¤‚च नहीं मिलेगी। क्या आप वाकठअपनी सहमति रद्द करना चाहते हŕĄŕ¤‚?"],"Something went wrong, please try again later.":["कŕĄŕ¤› गलत हो गया हŕĄŕĄ¤ कŕĄŕ¤Şŕ¤Żŕ¤ľ बाद में दोबारा प्रयास करें।"],"Revoke AI consent":["एआठसहमति रद्द करें"],"Please enter a focus keyphrase first to use AI.":["एआठका उपयोग करने के लिए कŕĄŕ¤Şŕ¤Żŕ¤ľ पहले फोकस कीफ़्रेज़ दर्ज करें।"],"AI title generator":["एआठशीर्षक जनरेटर"],"AI description generator":["एआठविवरण जनरेटर"],"AI Twitter title generator":["एआठट्विटर शीर्षक जनरेटर"],"AI Twitter description generator":["एआठट्विटर विवरण जनरेटर"],"AI social title generator":["एआठसामाजिक शीर्षक जनरेटर"],"AI social description generator":["एआठसामाजिक विवरण जनरेटर"],"Twitter preview":["ट्विटर प्रीव्यू"],"Dismiss":["खारिज"],"Don’t show again":["दोबारा मत दिखाओ"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sयŕĄŕ¤•्ति%2$s: अपने पŕĄŕ¤·ŕĄŤŕ¤  में अधिक सामग्री लिखकर अपने जेनरेट किए गए एआठशीर्षकों की सटीकता में सŕĄŕ¤§ŕ¤ľŕ¤° करें।"],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sयŕĄŕ¤•्ति%2$s: अपने पŕĄŕ¤·ŕĄŤŕ¤  में अधिक सामग्री लिखकर अपने जेनरेट किए गए एआठविवरणों की सटीकता में सŕĄŕ¤§ŕ¤ľŕ¤° करें।"],"Try again":["पŕĄŕ¤¨ŕ¤ कोशिश करें"],"Social preview":["सामाजिक पूर्वावलोकन"],"Desktop result":["डेस्कटॉप परिणाम"],"Mobile result":["मोबाइल परिणाम"],"Apply AI description":["एआठविवरण लागू करें"],"Apply AI title":["एआठशीर्षक लागू करें"],"Next":["अगला"],"Previous":["पिछला "],"Generate 5 more":["5 और उत्पन्न करें"],"Google preview":["गूगल पूर्वावलोकन"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["OpenAI के सख्त नŕĄŕ¤¤ŕ¤żŕ¤• दिशानिर्देशों और %1$sउपयोग नीतियों%2$s के कारण, हम आपके पेज के लिए SEO शीर्षक उत्पन्न करने में असमर्थ हŕĄŕ¤‚। यदि आप एआठका उपयोग करने का इरादा रखते हŕĄŕ¤‚, तो कŕĄŕ¤Şŕ¤Żŕ¤ľ स्पष्ट, हिंसक या स्पष्ट यौन सामग्री के उपयोग से बचें। %3$sयह सŕĄŕ¤¨ŕ¤żŕ¤¶ŕĄŤŕ¤šŕ¤żŕ¤¤ करने के लिए कि आपको एआठके साथ सर्वोत्तम परिणाम प्राप्त हों, अपने पेज को कॉन्फ़िगर करने के तरीके के बारे में और पढ़ें%4$s।"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["OpenAI के सख्त नŕĄŕ¤¤ŕ¤żŕ¤• दिशानिर्देशों और %1$sउपयोग नीतियों%2$s के कारण, हम आपके पेज के लिए मेटा विवरण तŕĄŕ¤Żŕ¤ľŕ¤° करने में असमर्थ हŕĄŕ¤‚। यदि आप एआठका उपयोग करने का इरादा रखते हŕĄŕ¤‚, तो कŕĄŕ¤Şŕ¤Żŕ¤ľ स्पष्ट, हिंसक या स्पष्ट यौन सामग्री के उपयोग से बचें। %3$sयह सŕĄŕ¤¨ŕ¤żŕ¤¶ŕĄŤŕ¤šŕ¤żŕ¤¤ करने के लिए कि आपको एआठके साथ सर्वोत्तम परिणाम प्राप्त हों, अपने पेज को कॉन्फ़िगर करने के तरीके के बारे में और पढ़ें%4$s।"],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["इस सŕĄŕ¤µŕ¤żŕ¤§ŕ¤ľ तक पहŕĄŕ¤‚चने के लिए, आपको एक सक्रिय %1$s सदस्यता की आवश्यकता हŕĄŕĄ¤ कŕĄŕ¤Şŕ¤Żŕ¤ľ %3$sअपनी सदस्यता %2$s%4$s में सक्रिय करें या %5$sएक नठ%1$s सदस्यता प्राप्त करें%6$s। इसके बाद, सŕĄŕ¤µŕ¤żŕ¤§ŕ¤ľ के सही ढंग से काम करने के लिए इस पेज को रीफ्रेश करने के लिए बटन पर क्लिक करें, जिसमें 30 सेकंड तक का समय लग सकता हŕĄŕĄ¤"],"Refresh page":["Addons रिफ्रेश करें"],"Not enough content":["पर्याप्त सामग्री नहीं"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["कŕĄŕ¤Şŕ¤Żŕ¤ľ बाद में पŕĄŕ¤¨: प्रयास करें। यदि समस्या बनी रहती हŕĄ, तो कŕĄŕ¤Şŕ¤Żŕ¤ľ %1$sहमारी सहायता टीम से संपर्क करें%2$s!"],"Something went wrong":["कŕĄŕ¤› गलत हो गया"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["ŕ¤ŕ¤¸ŕ¤ľ लगता हॠकि कनेक्शन टाइमआउट हो गया हŕĄ. कŕĄŕ¤Şŕ¤Żŕ¤ľ अपना इंटरनेट कनेक्शन जांचें और बाद में पŕĄŕ¤¨ŕ¤ प्रयास करें। यदि समस्या बनी रहती हŕĄ, तो कŕĄŕ¤Şŕ¤Żŕ¤ľ %1$sहमारी सहायता टीम से संपर्क करें%2$s"],"Connection timeout":["कनेक्शन समय समाप्त"],"Use AI":["एआठका प्रयोग करें"],"Close modal":["मोडल बंद करें"],"Learn more about AI (Opens in a new browser tab)":["एआठके बारे में और जानें (एक नए ब्राउज़र टŕĄŕ¤¬ में खŕĄŕ¤˛ŕ¤¤ŕ¤ľ हŕĄ)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sशीर्षक%3$s: आपके पेज का अभी तक कोठशीर्षक नहीं हŕĄŕĄ¤ %2$sएक जोड़ें%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sशीर्षक%2$s: आपके पŕĄŕ¤·ŕĄŤŕ¤  का शीर्षक हŕĄŕĄ¤ बहŕĄŕ¤¤ अच्छा!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sकीफ्रेज वितरण%3$s: %2$sपाठ में अपने कीफ्रेज या इसके पर्यायवाची को शामिल करें ताकि हम कीफ्रेज वितरण की जांच कर सकें%3$s।"],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sकीफ्रेज़ वितरण%2$s: अच्छा काम!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sकीफ्रेज वितरण%3$s: असमान। आपके पाठ के कŕĄŕ¤› हिस्सों में कीफ़्रेज़ या इसके पर्यायवाची शब्द नहीं हŕĄŕ¤‚। %2$sउन्हें समान रूप से वितरित करें%3$s।"],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sकीफ्रेज़ वितरण%3$s: बहŕĄŕ¤¤ असमान। आपके पाठ के बड़े हिस्से में कीफ़्रेज़ या इसके पर्यायवाची शब्द नहीं हŕĄŕ¤‚। %2$sउन्हें समान रूप से वितरित करें%3$s।"],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: आप बहŕĄŕ¤¤ अधिक जटिल शब्दों का उपयोग नहीं कर रहे हŕĄŕ¤‚, जिससे आपके पाठ को पढ़ना आसान हो जाता हŕĄŕĄ¤ अच्छी नौकरी!"],"Word complexity":["शब्द जटिलता"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: आपके टेक्स्ट के %2$s शब्दों को जटिल माना जाता हŕĄŕĄ¤ %3$sपठनीयता में सŕĄŕ¤§ŕ¤ľŕ¤° के लिए छोटे और अधिक परिचित शब्दों का उपयोग करने का प्रयास करें%4$s।"],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sसंरेखण%3$s: केंद्र-संरेखित पाठ का एक लंबा खंड हŕĄŕĄ¤ %2$sहम अनŕĄŕ¤¶ŕ¤‚सा करते हŕĄŕ¤‚ कि इसे वाम-संरेखित करें%3$s।","%1$sसंरेखण%3$s: केंद्र-संरेखित पाठ के %4$s लंबे खंड हŕĄŕ¤‚। %2$sहम उन्हें वाम-संरेखित बनाने की सलाह देते हŕĄŕ¤‚%3$s।"],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sसंरेखण%3$s: केंद्र-संरेखित पाठ का एक लंबा खंड हŕĄŕĄ¤ %2$sहम इसे सही-संरेखित करने की सलाह देते हŕĄŕ¤‚%3$s।","%1$sसंरेखण%3$s: केंद्र-संरेखित पाठ के %4$s लंबे खंड हŕĄŕ¤‚। %2$sहम उन्हें सही-संरेखित करने की सलाह देते हŕĄŕ¤‚%3$s।"],"Select image":["छवि चŕĄŕ¤¨ŕĄ‡"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["कŕĄŕ¤› लिंक जोड़ने का समय! नीचे, आप अपने आधारशिलाओं के साथ एक सूची देखते हŕĄŕ¤‚। प्रत्येक आधारशिला के नीचे, उन लेखों के लिए सŕĄŕ¤ťŕ¤ľŕ¤µ दिए गए हŕĄŕ¤‚ जिनसे आप लिंक जोड़ सकते हŕĄŕ¤‚। लिंक जोड़ते समय, इसे अपने आधारशिला लेख से संबंधित प्रासंगिक वाक्य में सम्मिलित करना सŕĄŕ¤¨ŕ¤żŕ¤¶ŕĄŤŕ¤šŕ¤żŕ¤¤ करें। जब तक आपके कोने के पत्थरों में सबसे अधिक आंतरिक लिंक उनकी ओर इशारा करते हŕĄŕ¤‚, तब तक जितने आवश्यक हो उतने संबंधित लेखों से लिंक जोड़ते रहें।"],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["आपकी साइट पर कŕĄŕ¤› लेख %1$sसबसे%2$s महत्वपूर्ण हŕĄŕ¤‚। वे लोगों के सवालों का जवाब देते हŕĄŕ¤‚ और उनकी समस्याओं का समाधान करते हŕĄŕ¤‚। तो, वे रŕĄŕ¤‚क के पात्र हŕĄŕ¤‚! %3$s पर, हम इन आधारशिला लेखों को कहते हŕĄŕ¤‚। उन्हें रŕĄŕ¤‚क दिलाने का एक तरीका यह हॠकि उनसे पर्याप्त लिंक्स जोड़े जाएं। अधिक लिंक खोज इंजनों को संकेत देते हŕĄŕ¤‚ कि वे लेख महत्वपूर्ण और मूल्यवान हŕĄŕ¤‚। इस कसरत में, हम आपके आधारशिला लेखों के लिंक जोड़ने में आपकी सहायता करेंगे!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["जब आप थोड़ी और प्रतिलिपि जोड़ देंगे, तो हम आपको आपके पाठ के औपचारिकता स्तर के बारे में बता सकेंगे।"],"Overall, your text appears to be %1$s%3$s%2$s.":["कŕĄŕ¤˛ मिलाकर, आपका टेक्स्ट %1$s%3$s%2$s प्रतीत होता हŕĄŕĄ¤"],"Heading %d":["शीर्षक %d"],"Maximum heading level":["अधिकतम शीर्षक स्तर"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["आपने लिंक सŕĄŕ¤ťŕ¤ľŕ¤µŕĄ‹ŕ¤‚ को अक्षम कर दिया हŕĄ, जो कार्य करने के लिए संबंधित लिंक के लिए आवश्यक हŕĄŕĄ¤ यदि आप संबंधित लिंक जोड़ना चाहते हŕĄŕ¤‚, तो कŕĄŕ¤Şŕ¤Żŕ¤ľ साइट की विशेषताएं पर जाएं और लिंक सŕĄŕ¤ťŕ¤ľŕ¤µŕĄ‹ŕ¤‚ को सक्षम करें।"],"Schema":["स्कीमा"],"Meta tags":["मेटा टŕĄŕ¤—"],"Not available":["उपलब्ध नही हॠ|"],"Checks":["चेक"],"Focus Keyphrase":["फोकस कीफ्रेज"],"Good":["अच्छा"],"No index":["कोठसूचकांक नहीं"],"Front-end SEO inspector":["फ्रंट-एंड एसŕ¤ŕ¤“ इंस्पेक्टर"],"Focus keyphrase not set":["फ़ोकस कीफ़्रेज़ सेट नहीं हŕĄ"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["कŕĄŕ¤Şŕ¤Żŕ¤ľ ध्यान दें: इस कसरत को अच्छी तरह से काम करने के लिए, आपको एसŕ¤ŕ¤“ डेटा ऑप्टिमाइजेशन टूल चलाने की आवश्यकता हŕĄŕĄ¤ व्यवस्थापक इसे %1$sएसŕ¤ŕ¤“ > टूल्स%2$s के अंतर्गत चला सकते हŕĄŕ¤‚।"],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["आपने अपने अनाथ लेखों में लिंक जोड़ दिए हŕĄŕ¤‚, और आपने उन लेखों को साफ कर दिया हॠजो अब प्रासंगिक नहीं थे। अच्छा काम! नीचे दिए गए सारांश पर एक नज़र डालें और जो आपने पूरा किया उसका जश्न मनाएं!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["इस सूची की सामग्री का समालोचनात्मक परीक्षण करें और आवश्यक अद्यतन करें। यदि आपको अद्यतन करने में सहायता की आवश्यकता हŕĄ, तो हमारे पास एक बहŕĄŕ¤¤ ही %1$sउपयोगी ब्लॉग पोस्ट हॠजो आपको हर तरह से मार्गदर्शन कर सकती हŕĄ%2$s (नए टŕĄŕ¤¬ में खोलने के लिए क्लिक करें)।"],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sअधिक मार्गदर्शन की आवश्यकता हŕĄ? हमने निम्नलिखित मार्गदर्शिका में प्रत्येक चरण को अधिक विस्तार से कवर किया हŕĄ: %2$s %7$s अनाथ सामग्री कसरत का उपयोग कŕĄŕ¤¸ŕĄ‡ करें%3$s%4$s%5$s।%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["आपने अभी-अभी अपनी सर्वश्रेष्ठ सामग्री को ढूंढना आसान बना दिया हŕĄ, और रŕĄŕ¤‚क करने की अधिक संभावना हŕĄ! जाने के लिए रास्ता! समय-समय पर, यह जांचना याद रखें कि क्या आपके कॉर्नरस्टोन को पर्याप्त लिंक मिल रहे हŕĄŕ¤‚!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["नीचे दी गठसूची पर एक नज़र डालें। क्या आपके आधारशिला (%1$s के साथ चिह्नित) में सबसे अधिक आंतरिक लिंक हŕĄŕ¤‚ जो उनकी ओर इशारा करते हŕĄŕ¤‚? ऑप्टिमाइज़ बटन पर क्लिक करें यदि आपको लगता हॠकि आधारशिला को अधिक लिंक की आवश्यकता हŕĄŕĄ¤ यह लेख को अगले चरण में ले जाएगा।"],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["क्या आपके सभी कोने के पत्थरों में हरे बŕĄŕ¤˛ŕĄ‡ŕ¤źŕĄŤŕ¤¸ हŕĄŕ¤‚? सर्वोत्तम परिणामों के लिए, उन परिणामों को संपादित करने पर विचार करें जो नहीं करते हŕĄŕ¤‚!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["आप किन लेखों को सर्वोच्च रŕĄŕ¤‚क देना चाहते हŕĄŕ¤‚? आपके दर्शकों को कौन सा सबसे उपयोगी और संपूर्ण लगेगा? नीचे की ओर इंगित करने वाले तीर पर क्लिक करें और उन मानदंडों को पूरा करने वाले लेखों की तलाश करें। हम सूची से आपके द्वारा चŕĄŕ¤¨ŕĄ‡ गए लेखों को आधारशिला के रूप में स्वतठचिह्नित कर देंगे।"],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sअधिक मार्गदर्शन की आवश्यकता हŕĄ? हमने प्रत्येक चरण को अधिक विस्तार से इसमें शामिल किया हŕĄ: %2$s %7$s आधारशिला कसरत का उपयोग कŕĄŕ¤¸ŕĄ‡ करें%3$s%4$s%5$s।%6$s"],"Yoast Subpages":["योस्ट उपपŕĄŕ¤·ŕĄŤŕ¤ "],"Yoast Siblings":["योस्ट सहोदर"],"Yoast Table of Contents":["योस्ट सामग्री तालिका"],"Yoast Related Links":["योस्ट संबंधित कड़ियाŕ¤"],"Finish optimizing":["अनŕĄŕ¤•ूलन समाप्त करें"],"You've finished adding links to this article.":["आपने इस लेख में लिंक जोड़ना समाप्त कर लिया हŕĄŕĄ¤"],"Optimize":["अनŕĄŕ¤•ूलन"],"Added to next step":["अगले चरण में जोड़ा गया"],"Choose cornerstone articles...":["आधारशिला लेख चŕĄŕ¤¨ŕĄ‡ŕ¤‚..."],"Loading data...":["डेटा लोड हो रहा हŕĄ..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["आपने अभी तक इस कसरत का उपयोग करके किसी भी लेख को साफ़ या अपडेट नहीं किया हŕĄŕĄ¤ एक बार ŕ¤ŕ¤¸ŕ¤ľ करने के बाद, आपके काम का सारांश यहां दिखाठदेगा।"],"Skipped":["छोड़ा गया"],"Hidden from search engines.":["सर्च इंजन से छिपा हŕĄŕ¤† हŕĄŕĄ¤"],"Removed":["निकाला गया"],"Improved":["सŕĄŕ¤§ŕ¤ľŕ¤°ŕ¤ľ हŕĄŕ¤†"],"Resolution":["स्थिरता"],"Loading redirect options...":["रीडायरेक्ट विकल्प लोड हो रहे हŕĄŕ¤‚..."],"Remove and redirect":["हटाएं और रीडायरेक्ट करें"],"Custom url:":["कस्टम यूआरएल:"],"Related article:":["संबंधित लेख:"],"Home page:":["मŕĄŕ¤– पŕĄŕ¤·ŕĄŤŕ¤ :"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["आप %1$s%2$s%3$s को निकालने वाले हŕĄŕ¤‚। अपनी साइट पर 404 को रोकने के लिए, आपको इसे अपनी साइट के किसी अन्य पŕĄŕ¤·ŕĄŤŕ¤  पर पŕĄŕ¤¨ŕ¤°ŕĄŤŕ¤¨ŕ¤żŕ¤°ŕĄŤŕ¤¦ŕĄ‡ŕ¤¶ŕ¤żŕ¤¤ करना चाहिए। आप इसे कहाठपŕĄŕ¤¨ŕ¤°ŕĄŤŕ¤¨ŕ¤żŕ¤°ŕĄŤŕ¤¦ŕĄ‡ŕ¤¶ŕ¤żŕ¤¤ करना चाहेंगे?"],"SEO Workout: Remove article":["एसŕ¤ŕ¤“ वर्कआउट: लेख हटाएं"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["सब कŕĄŕ¤› अच्छा लग रहा हŕĄ! हमें आपकी साइट पर ŕ¤ŕ¤¸ŕ¤ľ कोठलेख नहीं मिला हॠजो छह महीने से अधिक पŕĄŕ¤°ŕ¤ľŕ¤¨ŕ¤ľ हो और आपकी साइट पर बहŕĄŕ¤¤ कम लिंक प्राप्त करता हो। नए सफाठसŕĄŕ¤ťŕ¤ľŕ¤µŕĄ‹ŕ¤‚ के लिए बाद में यहां देखें!"],"Hide from search engines":["सर्च इंजन से छŕĄŕ¤Şŕ¤ľŕ¤Źŕ¤‚"],"Improve":["सŕĄŕ¤§ŕ¤ľŕ¤°ŕĄ‡ŕ¤‚"],"Are you sure you wish to hide this article from search engines?":["क्या आप वाकठइस लेख को सर्च इंजन से छिपाना चाहते हŕĄŕ¤‚?"],"Action":["Aksi"],"You've hidden this article from search engines.":["आपने इस लेख को सर्च इंजन से छŕĄŕ¤Şŕ¤ľŕ¤Żŕ¤ľ हŕĄŕĄ¤"],"You've removed this article.":["आपने यह लेख हटा दिया हŕĄ."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["आपने वर्तमान में सŕĄŕ¤§ŕ¤ľŕ¤° के लिए किसी लेख का चयन नहीं किया हŕĄŕĄ¤ लिंक जोड़ने के लिए पिछले चरणों में कŕĄŕ¤› लेखों का चयन करें और हम आपको यहां लिंक सŕĄŕ¤ťŕ¤ľŕ¤µ दिखाएंगे।"],"Loading link suggestions...":["लिंक सŕĄŕ¤ťŕ¤ľŕ¤µ लोड हो रहे हŕĄŕ¤‚..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["हमें इस लेख के लिए कोठसŕĄŕ¤ťŕ¤ľŕ¤µ नहीं मिला, लेकिन निश्चित रूप से आप अभी भी उन लेखों के लिंक जोड़ सकते हŕĄŕ¤‚ जो आपको लगता हॠकि संबंधित हŕĄŕ¤‚।"],"Skip":["छोड़ें"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["आपने अभी तक इस चरण के लिए किसी लेख का चयन नहीं किया हŕĄŕĄ¤ आप इसे पिछले चरण में कर सकते हŕĄŕ¤‚।"],"Is it up-to-date?":["क्या यह अप-टू-डेट हŕĄ?"],"Last Updated":["अंतिम बार अपडेट"],"You've moved this article to the next step.":["आपने इस लेख को अगले चरण पर ले जाया हŕĄŕĄ¤"],"Unknown":["अज्ञात"],"Clear summary":["सारांश साफ़ करें"],"Add internal links towards your orphaned articles.":["अपने अनाथ लेखों के लिए आंतरिक लिंक जोड़ें।"],"Should you update your article?":["क्या आपको अपना लेख अपडेट करना चाहिए?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["आपकी साइट में बहŕĄŕ¤¤ सारी सामग्री हो सकती हॠजिसे आपने एक बार बनाया था और उसके बाद कभी पीछे मŕĄŕ¤ˇŕ¤Ľŕ¤•र नहीं देखा। उन पŕĄŕ¤·ŕĄŤŕ¤ ŕĄ‹ŕ¤‚ को देखना और स्वयं से पूछना महत्वपूर्ण हॠकि क्या वह सामग्री अभी भी आपकी साइट के लिए प्रासंगिक हŕĄŕĄ¤ क्या आपको इसे सŕĄŕ¤§ŕ¤ľŕ¤°ŕ¤¨ŕ¤ľ चाहिए या इसे हटा देना चाहिए?"],"Start: Love it or leave it?":["प्रारंभ करें: इसे प्यार करें या छोड़ दें?"],"Clean up your unlinked content to make sure people can find it":["लोगों को यह सŕĄŕ¤¨ŕ¤żŕ¤¶ŕĄŤŕ¤šŕ¤żŕ¤¤ करने के लिए अपनी अनलिंक की गठसामग्री को साफ़ करें"],"I've finished this workout":["मŕĄŕ¤‚ने यह कसरत पूरी कर ली हŕĄ"],"Reset this workout":["इस कसरत को रीसेट करें"],"Well done!":["बहŕĄŕ¤¤ बढ़िया!"],"Add internal links towards your cornerstones":["अपने आधारशिलाओं की ओर आंतरिक लिंक जोड़ें"],"Check the number of incoming internal links of your cornerstones":["अपने आधारशिला के आने वाले आंतरिक लिंक की संख्या की जाŕ¤ŕ¤š करें"],"Start: Choose your cornerstones!":["प्रारंभ करें: अपने आधारशिला चŕĄŕ¤¨ŕĄ‡ŕ¤‚!"],"The cornerstone approach":["कार्नरस्टोन दŕĄŕ¤·ŕĄŤŕ¤źŕ¤żŕ¤•ोण"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["कŕĄŕ¤Şŕ¤Żŕ¤ľ ध्यान दें: इस कसरत के लिए अच्छी तरह से काम करने के लिए और आपको जोड़ने के सŕĄŕ¤ťŕ¤ľŕ¤µ देने के लिए, आपको एसŕ¤ŕ¤“ डेटा ऑप्टिमाइज़ेशन टूल चलाने की आवश्यकता हŕĄŕĄ¤ व्यवस्थापक इसे %1$sएसŕ¤ŕ¤“ > टूल्स%2$s के अंतर्गत चला सकते हŕĄŕ¤‚।"],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["मŕĄŕ¤‚ने यह चरण पूरा कर लिया हŕĄ"],"Revise this step":["इस चरण को संशोधित करें"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["हम आपके पŕĄŕ¤·ŕĄŤŕ¤ ŕĄ‹ŕ¤‚ पर आंतरिक लिंक नहीं खोज सके। या तो आपने अभी तक अपनी सामग्री में कोठआंतरिक लिंक नहीं जोड़ा हŕĄ, या योस्ट एसŕ¤ŕ¤“ ने उन्हें अनŕĄŕ¤•्रमित नहीं किया हŕĄŕĄ¤ आप एसŕ¤ŕ¤“ > टूल्स के अंतर्गत एसŕ¤ŕ¤“ डेटा ऑप्टिमाइजेशन चलाकर योस्ट एसŕ¤ŕ¤“ को अपने लिंक्स को इंडेक्स कर सकते हŕĄŕ¤‚।"],"Incoming links":["आने वाले लिंक"],"Edit to add link":["लिंक जोड़ने के लिए संपादित करें"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["वर्तमान में आपके पास कार्नरस्टोन के रूप में चिह्नित कोठलेख नहीं हŕĄŕĄ¤ जब आप अपने लेखों को कार्नरस्टोन के रूप में चिह्नित करते हŕĄŕ¤‚, तो वे यहां दिखाठदेंगे।"],"Focus keyphrase":["Frasa kunci utama"],"Article":["Artikel"],"Readability score":["Skor keterbacaan"],"SEO score":["Skor SEO"],"Copy failed":["कॉपी विफल"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["इस %1$sचरण-दर-चरण कसरत%2$s का उपयोग करके अपने सभी आधारशिलाओं के लिए रŕĄŕ¤‚किंग में सŕĄŕ¤§ŕ¤ľŕ¤° करें!"],"Rank with articles you want to rank with":["उन लेखों के साथ रŕĄŕ¤‚क करें जिनके साथ आप रŕĄŕ¤‚क करना चाहते हŕĄŕ¤‚"],"Descriptive text":["स्पष्ट टेक्स्ट"],"Show the descriptive text":["स्पष्ट टेक्स्ट दिखाएं"],"Show icon":["आइकन दिखाएं"],"Yoast Estimated Reading Time":["योस्ट अनŕĄŕ¤®ŕ¤ľŕ¤¨ŕ¤żŕ¤¤ पढ़ने का समय"],"Shows an estimated reading time based on the content length.":["सामग्री की लंबाठके आधार पर अनŕĄŕ¤®ŕ¤ľŕ¤¨ŕ¤żŕ¤¤ पढ़ने का समय दिखाता हŕĄŕĄ¤"],"reading time":["पढ़ने का समय"],"content length":["सामग्री की लंबाŕ¤"],"Estimated reading time:":["अनŕĄŕ¤®ŕ¤ľŕ¤¨ŕ¤żŕ¤¤ पढ़ने का समय:"],"minute":["मिनट","मिनटों"],"Settings":["सेटिंग"],"OK":["OK"],"Close":["पास"],"Type":["प्रकार"],"Orphaned content":["अनाथ सामग्री"],"Synonyms":["समानार्थक शब्द"],"Internal linking suggestions":["आंतरिक लिंकिंग सŕĄŕ¤ťŕ¤ľŕ¤µ"],"Enter a related keyphrase to calculate the SEO score":["एसŕ¤ŕ¤“ स्कोर की गणना करने के लिए संबंधित कीफ़्रेज़ दर्ज करें"],"Related keyphrase":["Frasa kunci terkait"],"Add related keyphrase":["Tambahkan frasa kunci terkait"],"Analysis results":["Hasil analisis"],"Help on choosing the perfect keyphrase":["सही कीफ्रेज़ चŕĄŕ¤¨ŕ¤¨ŕĄ‡ में मदद करें"],"Help on keyphrase synonyms":["कीफ्रेज समानार्थी शब्द पर मदद करें"],"Keyphrase":["Frasa-kunci"],"New URL: {{link}}%s{{/link}}":["नया यूआरएल: {{link}}%s{{/link}}"],"Undo":["पहले जŕĄŕ¤¸ŕ¤ľ"],"Redirect created":["पŕĄŕ¤¨ŕ¤°ŕĄŤŕ¤¨ŕ¤żŕ¤°ŕĄŤŕ¤¦ŕĄ‡ŕ¤¶ŕ¤żŕ¤¤ बनाया गया"],"%s just created a redirect from the old URL to the new URL.":["%s ने पŕĄŕ¤°ŕ¤ľŕ¤¨ŕĄ‡ यूआरएल से नए यूआरएल पर पŕĄŕ¤¨ŕ¤°ŕĄŤŕ¤¨ŕ¤żŕ¤°ŕĄŤŕ¤¦ŕĄ‡ŕ¤¶ŕ¤żŕ¤¤ किया।"],"Old URL: {{link}}%s{{/link}}":["पŕĄŕ¤°ŕ¤ľŕ¤¨ŕ¤ľ यूआरएल: {{link}}%s{{/link}}"],"Keyphrase synonyms":["कीफ्रेज पर्यायवाची"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["ट्विटर शेयर प्रीव्यू"],"Adds a list of internal links to sibling pages which share the same parent.":["एक ही जनक को साझा करने वाले सहोदर पŕĄŕ¤·ŕĄŤŕ¤ ŕĄ‹ŕ¤‚ के लिए आंतरिक लिंक की सूची जोड़ता हŕĄŕĄ¤"],"siblings":["सहोदर"],"sibling pages":["सहोदर पŕĄŕ¤·ŕĄŤŕ¤ "],"Adds a list of internal links to subpages of this page.":["इस पŕĄŕ¤·ŕĄŤŕ¤  के उपपŕĄŕ¤·ŕĄŤŕ¤ ŕĄ‹ŕ¤‚ में आंतरिक लिंक की एक सूची जोड़ता हŕĄŕĄ¤"],"seo":["seo"],"subpages":["उपपŕĄŕ¤·ŕĄŤŕ¤ "],"childpages":["बाल पŕĄŕ¤·ŕĄŤŕ¤ "],"children":["शिशŕĄ"],"internal linking":["Tautan internal"],"site structure":["struktur situs"],"We could not find any relevant articles on your website that you could link to from your post.":["Kami tidak dapat menemukan artikel yang relevan pada situs web Anda yang bisa dijadikan tautan dari artikel ini."],"Load suggestions":["सŕĄŕ¤ťŕ¤ľŕ¤µ लोड करें"],"Refresh suggestions":["सŕĄŕ¤ťŕ¤ľŕ¤µŕĄ‹ŕ¤‚ को रिफ्रेश करें"],"Write list…":["लिस्ट लिखें ..."],"Adds a list of links related to this page.":["इस पŕĄŕ¤·ŕĄŤŕ¤  से संबंधित लिंक की एक सूची जोड़ता हŕĄŕĄ¤"],"related posts":["संबंधित पोस्ट"],"related pages":["संबंधित पŕĄŕ¤·ŕĄŤŕ¤ "],"Adds a table of contents to this page.":["इस पŕĄŕ¤·ŕĄŤŕ¤  पर सामग्री की एक तालिका जोड़ता हŕĄŕĄ¤"],"links":["लिंक"],"toc":["toc"],"Copy link":["Salin tautan"],"Copy link to suggested article: %s":["Salin tautan ke artikel yang disarankan: %s"],"Add a title to your post for the best internal linking suggestions.":["सर्वोत्तम आंतरिक लिंकिंग सŕĄŕ¤ťŕ¤ľŕ¤µŕĄ‹ŕ¤‚ के लिए अपनी पोस्ट में एक शीर्षक जोड़ें।"],"Add a metadescription to your post for the best internal linking suggestions.":["सर्वोत्तम आंतरिक लिंकिंग सŕĄŕ¤ťŕ¤ľŕ¤µŕĄ‹ŕ¤‚ के लिए अपनी पोस्ट में एक metadescription जोड़ें।"],"Add a title and a metadescription to your post for the best internal linking suggestions.":["सर्वोत्तम आंतरिक लिंकिंग सŕĄŕ¤ťŕ¤ľŕ¤µŕĄ‹ŕ¤‚ के लिए अपनी पोस्ट में एक शीर्षक और एक metadescription जोड़ें।"],"Also, add a title to your post for the best internal linking suggestions.":["इसके अलावा, सर्वोत्तम आंतरिक लिंकिंग सŕĄŕ¤ťŕ¤ľŕ¤µŕĄ‹ŕ¤‚ के लिए अपनी पोस्ट में एक शीर्षक जोड़ें।"],"Also, add a metadescription to your post for the best internal linking suggestions.":["साथ ही, बेहतरीन आंतरिक लिंकिंग सŕĄŕ¤ťŕ¤ľŕ¤µŕĄ‹ŕ¤‚ के लिए अपनी पोस्ट में एक metadescription जोड़ें।"],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["इसके अलावा, सर्वोत्तम आंतरिक लिंकिंग सŕĄŕ¤ťŕ¤ľŕ¤µŕĄ‹ŕ¤‚ के लिए अपनी पोस्ट में एक शीर्षक और एक metadescription जोड़ें।"],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["एक बार जब आप थोड़ी और कॉपी जोड़ लेते हŕĄŕ¤‚, तो हम आपको यहां संबंधित सामग्री की एक सूची देंगे, जिसे आप अपनी पोस्ट में लिंक कर सकते हŕĄŕ¤‚।"],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["अपनी साइट संरचना में सŕĄŕ¤§ŕ¤ľŕ¤° करने के लिए, अपनी वेबसाइट पर अन्य प्रासंगिक पोस्ट या पŕĄŕ¤·ŕĄŤŕ¤  से लिंक करने पर विचार करें।"],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["आपको संबंधित सामग्री की एक सूची दिखाने में कŕĄŕ¤› सेकंड लगते हŕĄŕ¤‚ जिससे आप लिंक कर सकते हŕĄŕ¤‚। जŕĄŕ¤¸ŕĄ‡ ही हम उनके पास होंगे वŕĄŕ¤¸ŕĄ‡ ही सŕĄŕ¤ťŕ¤ľŕ¤µ यहाठदिखाए जाएŕ¤ŕ¤—े।"],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["अधिक जानने के लिए {{a}}एसŕ¤ŕ¤“ के लिए इंटरनल लिंकिंग पर हमारे गाइड को पढ़ें{{/a}}।"],"Copied!":["Disalin!"],"Not supported!":["Tidak didukung!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["क्या आप कठसंबंधित कीफ़्रेज़ का उपयोग करने का प्रयास कर रहे हŕĄŕ¤‚? आपको उन्हें अलग से जोड़ना चाहिए।"],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Frasa kunci Anda terlalu panjang. Maksimal 191 karakter."],"Add as related keyphrase":["संबंधित कीफ्रेज़ के रूप में जोड़ें"],"Added!":["जोड़ा गया!"],"Remove":["हटायें"],"Table of contents":["विषयसूची"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["हमें आपकी साइट के एसŕ¤ŕ¤“ डेटा को अनŕĄŕ¤•ूलित करने की आवश्यकता हॠताकि हम आपको सर्वोत्तम %1$sलिंकिंग सŕĄŕ¤ťŕ¤ľŕ¤µ%2$s दे सकें। %3$sएसŕ¤ŕ¤“ डेटा अनŕĄŕ¤•ूलन शŕĄŕ¤°ŕĄ‚ करें%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-hr.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-hr.json deleted file mode 100644 index d05615e5..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-hr.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);","lang":"hr"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Postavke"],"OK":["u redu"],"Close":["Zatvori"],"Type":["Vrsta"],"Orphaned content":["Napušteni sadrĹľaj"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-hu_HU.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-hu_HU.json deleted file mode 100644 index 89319fc8..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-hu_HU.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"hu"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":["Enged"],"Deny":["Tilt"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["sĂ©ma"],"Meta tags":["meta leĂ­rás"],"Not available":["Nem támogatott"],"Checks":["EllenĹ‘rzĂ©sek"],"Focus Keyphrase":["KapcsolĂłdĂł kulcsszĂł"],"Good":["JĂł"],"No index":["Nincs index cĂ­m"],"Front-end SEO inspector":["FelhasználĂłi SEO ellenĹ‘rzĹ‘"],"Focus keyphrase not set":["KapcsolĂłdĂł kulcsszĂł nincs beállĂ­tva"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["perc","percek"],"Settings":["BeállĂ­tások"],"OK":["OK"],"Close":["Bezár"],"Type":["TĂ­pus"],"Orphaned content":["Elárvult tartalom"],"Synonyms":["SzinonĂ­mák:"],"Internal linking suggestions":["BelsĹ‘ linkelĂ©si javaslatok"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["KapcsolĂłdĂł kulcsszĂł"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["ElemzĂ©si eredmĂ©nyek"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["SegĂ­tsĂ©g egy kulcskifejezĂ©s szinonĂ­mához"],"Keyphrase":["KulcskifejezĂ©s"],"New URL: {{link}}%s{{/link}}":["Ăšj URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["ĂtirányĂ­tás lĂ©trehozva"],"%s just created a redirect from the old URL to the new URL.":["%s csak egy átirányĂ­tást hozott lĂ©tre a rĂ©gi URL-rĹ‘l az Ăşj URL-re."],"Old URL: {{link}}%s{{/link}}":["RĂ©gi URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Kulcs kifejezĂ©s szinonĂ­ma"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["BelsĹ‘ hivatkozások listájának hozzáadása az testvĂ©roldalakhoz, amelyek azonos szĂĽlĹ‘höz tartoznak."],"siblings":["testvĂ©rek"],"sibling pages":["testtvĂ©r oldalak"],"Adds a list of internal links to subpages of this page.":["BelsĹ‘ hivatkozások listájának hozzáadása az aloldalakhoz."],"seo":["seo"],"subpages":["aloldalak"],"childpages":["gyerekoldalak"],"children":["gyerek"],"internal linking":["belsĹ‘ hivatkozások"],"site structure":["webhely szerkezete"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Javaslatok betöltĂ©se"],"Refresh suggestions":["Javaslatok frissĂ­tĂ©se"],"Write list…":["Lista Ă­rás..."],"Adds a list of links related to this page.":["Az oldalhoz kapcsolĂłdĂł hivatkozások listájának lĂ©trehozása."],"related posts":["kapcsolĂłdĂł bejegyzĂ©sek"],"related pages":["kapcsolĂłdĂł oldalak"],"Adds a table of contents to this page.":["TartalomjegyzĂ©k hozzáadása az oldalhoz"],"links":["hivatkozások"],"toc":["toc"],"Copy link":["Hivatkozás másolása"],"Copy link to suggested article: %s":["KapcsolĂłdĂł cikk hivatkozás másolása: %s"],"Add a title to your post for the best internal linking suggestions.":["Adjunk cĂ­met a bejegyzĂ©snek a pontosabb belsĹ‘ hivatkozási javaslatokhoz."],"Add a metadescription to your post for the best internal linking suggestions.":["Adjunk meta leĂ­rást a bejegyzĂ©snek a pontosabb belsĹ‘ hivatkozási javaslatokhoz."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Adjunk cĂ­met Ă©s meta leĂ­rást a bejegyzĂ©snek a pontosabb belsĹ‘ hivatkozási javaslatokhoz."],"Also, add a title to your post for the best internal linking suggestions.":["Továbbá, adjunk cĂ­met a bejegyzĂ©snek a pontosabb belsĹ‘ hivatkozási javaslatokhoz."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Továbbá, adjunk meta leĂ­rást a bejegyzĂ©snek a pontosabb belsĹ‘ hivatkozási javaslatokhoz."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Továbbá, adjunk cĂ­met Ă©s meta leĂ­rást a bejegyzĂ©snek a pontosabb belsĹ‘ hivatkozási javaslatokhoz."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Ha mĂ©g többet adunk hozzá, akkor a kapcsolĂłdĂł tartalmakrĂłl kapunk egy listát, amit felhasználhatunk a bejegyzĂ©sben."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["További informáciĂłkĂ©rt {{a}}Olvassuk el a belsĹ‘ hivatkozási ĂştmutatĂłt{{/a}}."],"Copied!":["Másolva!"],"Not supported!":["Nem támogatott"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["TartalomjegyzĂ©k"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-id_ID.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-id_ID.json deleted file mode 100644 index 16dc9e02..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-id_ID.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n > 1;","lang":"id"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":["Pratinjau di media sosial"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Untuk melanjutkan menggunakan fitur Yoast AI, harap kurangi frekuensi permintaan Anda. %1$sArtikel bantuan%2$s kami menyediakan panduan tentang merencanakan dan mempertahankan alur kerja yang optimal secara efektif."],"You've reached the Yoast AI rate limit.":["Anda telah melewati batas rasio Yoast AI."],"Allow":["Izinkan"],"Deny":["Abaikan"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Untuk melihat video ini, Anda harus mengizinkan %1$s untuk memuat sematan video dari %2$s."],"Text generated by AI may be offensive or inaccurate.":["Teks yang dihasilkan oleh AI mungkin menyinggung atau tidak akurat."],"(Opens in a new browser tab)":["(Buka di tab peramban baru)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Tingkatkan kecepatan alur kerja Anda dengan AI generatif. Dapatkan judul berkualitas tinggi dan saran deskripsi untuk pencarian dan tampilan di media sosial Anda. %1$sPelajari lebih lanjut%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Buat judul & deskripsi dengan Yoast AI"],"New to %1$s":["Baru di %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Saya menyetujui %1$sKetentuan Layanan%2$s & %3$sKebijakan Privasi%4$s layanan Yoast AI. Hal ini termasuk menyetujui pengumpulan dan penggunaan data untuk meningkatkan pengalaman pengguna."],"Start generating":["Mulai membuat"],"Yes, revoke consent":["Ya, cabut persetujuan"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Dengan mencabut persetujuan Anda, Anda tidak lagi memiliki akses ke fitur Yoast AI. Apakah Anda yakin ingin mencabut persetujuan Anda?"],"Something went wrong, please try again later.":["Terjadi kendala, mohon coba lagi."],"Revoke AI consent":["Cabut persetujuan AI"],"Please enter a focus keyphrase first to use AI.":["Mohon masukkan frasa kunci utama terlebih dahulu untuk menggunakan AI."],"AI title generator":["Pembuat judul AI"],"AI description generator":["AI pembuat deskripsi"],"AI Twitter title generator":["AI pembuat judul Twitter"],"AI Twitter description generator":["AI pembuat deskripsi Twitter"],"AI social title generator":["Pembuat judul media sosial AI"],"AI social description generator":["AI pembuat deskripsi media sosial"],"Twitter preview":["Tampilan Twitter"],"Dismiss":["Tutup"],"Don’t show again":["Jangan tampilkan lagi"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sTip%2$s: Tingkatkan akurasi judul AI yang Anda buat dengan menulis lebih banyak konten di halaman Anda."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sTip%2$s: Tingkatkan akurasi deskripsi AI yang Anda buat dengan menulis lebih banyak konten di halaman Anda."],"Try again":["Coba lagi"],"Social preview":["Pratinjau sosial"],"Desktop result":["Hasil desktop"],"Mobile result":["Hasil seluler"],"Apply AI description":["Gunakan deskripsi AI"],"Apply AI title":["Gunakan judul AI"],"Next":["Selanjutnya"],"Previous":["Sebelumnya"],"Generate 5 more":["Buat 5 lagi"],"Google preview":["Pratinjau Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Karena pedoman etika OpenAI yang ketat dan %1$skebijakan penggunaan%2$s, kami tidak dapat membuat judul SEO untuk halaman Anda. Jika Anda berniat menggunakan AI, harap hindari penggunaan konten eksplisit, kekerasan, atau seksual eksplisit. %3$sBaca selengkapnya tentang cara mengonfigurasi halaman Anda untuk memastikan Anda mendapatkan hasil terbaik dengan AI%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Karena pedoman etika OpenAI yang ketat dan %1$skebijakan penggunaan%2$s, kami tidak dapat membuat deskripsi meta untuk halaman Anda. Jika Anda berniat menggunakan AI, harap hindari penggunaan konten eksplisit, kekerasan, atau seksual eksplisit. %3$sBaca selengkapnya tentang cara mengonfigurasi halaman Anda untuk memastikan Anda mendapatkan hasil terbaik dengan AI%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Untuk mengakses fitur ini, Anda memerlukan langganan %1$s yang aktif. Mohon %3$saktifkan langganan Anda di %2$s%4$s atau %5$sdapatkan %1$s langganan baru%6$s. Setelah itu, klik tombol untuk menyegarkan halaman ini agar fitur berfungsi dengan benar, yang mana mungkin memerlukan waktu hingga 30 detik."],"Refresh page":["Segarkan halaman"],"Not enough content":["Konten tidak cukup"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Mohon coba lagi nanti. Jika kendala masih terjadi, mohon %1$shubungi tim bantuan kami%2$s!"],"Something went wrong":["Terjadi kendala"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Tampaknya telah terjadi timeout koneksi. Mohon periksa koneksi internet Anda dan coba lagi nanti. Jika masalah terus berlanjut, harap %1$shubungi tim bantuan kami%2$s"],"Connection timeout":["Koneksi timeout"],"Use AI":["Gunakan AI"],"Close modal":["Tutup modal"],"Learn more about AI (Opens in a new browser tab)":["Pelajari lebih lanjut tentang AI (Buka di tab browser baru)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sJudul%3$s: Artikel Anda belum memiliki judul. %2$sTambahkan judul%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sJudul%2$s: Artikel Anda memiliki judul. Bagus!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sSebaran frasa kunci%3$s: %2$sMasukkan frasa kunci atau sinonimnya ke dalam teks, sehingga kami dapat memeriksa sebaran frasa kunci%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sSebaran frasa kunci%2$s: Bagus!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sSebaran frasa kunci%3$s: Tidak merata. Beberapa bagian dari artikel Anda tidak berisi frasa kunci maupun sinonimnya. %2$sLetakkan frasa kunci secara lebih merata%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sSebaran frasa kunci%3$s: Sangat tidak merata. Sebagian besar artikel Anda tidak mengandung frasa kunci maupun sinonimnya. %2$sLetakkan frasa kunci secara lebih merata%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: Anda tidak menggunakan terlalu banyak kata kompleks, yang membuat teks Anda mudah dibaca. Kerja yang bagus!"],"Word complexity":["Kompleksitas kata"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s kata dalam teks Anda tergolong kompleks. %3$sCoba gunakan kata-kata yang lebih pendek dan lebih familiar untuk meningkatkan keterbacaan%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sPerataan%3$s: Ada bagian teks yang panjang dengan format rata tengah. %2$sKami sarankan untuk mengubahnya ke rata kiri%3$s.","%1$sPerataan%3$s: Ada %4$s bagian teks yang panjang dengan format rata tengah. %2$sKami sarankan untuk mengubahnya ke rata kiri%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sPerataan%3$s: Ada bagian teks yang panjang dengan format rata tengah. %2$sKami sarankan untuk mengubahnya ke rata kanan%3$s.","%1$sPerataan%3$s: Ada %4$s bagian teks yang panjang dengan format rata tengah. %2$sKami sarankan untuk mengubahnya ke rata kanan%3$s."],"Select image":["Pilih gambar"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Ayo tambahkan tautan! Berikut daftar landasan Anda. Pada masing-masing landasan, terdapat saran tautan artikel yang dapat Anda pilih. Saat menambahkan tautan, harap tambahkan dalam kalimat yang relevan dengan artikel landasan Anda. Tambahkan terus tautan dari artikel terkait sebanyak yang Anda inginkan, hingga landasan Anda memiliki tautan internal paling banyak yang mengarah ke sana."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Beberapa artikel di situs Anda %1$ssangat%2$s penting. Artikel tersebut memberi solusi dan memecahkan kendala banyak orang. Jadi, artikel tersebut pantas mendapat ranking! Di %3$s, kami menyebutnya sebagai artikel landasan. Salah satu cara untuk menaikkan ranking adalah dengan mengarahkan tautan yang cukup padanya. Lebih banyak tautan memberi sinyal pada mesin pencari bahwa artikel tersebut penting dan bermakna. Pada latihan ini, kami akan membantu Anda menambahkan tautan ke artikel landasan Anda!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Setelah menambahkan lebih banyak kata, kami akan dapat memberi tahu Anda tingkat formalitas teks Anda."],"Overall, your text appears to be %1$s%3$s%2$s.":["Secara umum, teks Anda terlihat %1$s%3$s%2$s."],"Heading %d":["Judul %d"],"Maximum heading level":["Level judul maksimum"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Anda telah menonaktifkan Saran Tautan, yang diperlukan untuk Tautan Berhubungan dapat berfungsi. Jika Anda ingin menambahkan Tautan Berhubungan, mohon menuju Fitur situs dan aktifkan Saran Tautan."],"Schema":["Skema"],"Meta tags":["Tag meta"],"Not available":["Tidak tersedia"],"Checks":["Periksa"],"Focus Keyphrase":["Frasa kunci utama"],"Good":["Bagus"],"No index":["No index"],"Front-end SEO inspector":["Inspector Front-end SEO"],"Focus keyphrase not set":["Frasa kunci utama tidak diatur"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Harap diperhatikan: Agar latihan berikut berfungsi dengan baik, Anda perlu menjalankan alat pengoptimalan data SEO. Admin dapat menjalankannya dari menu %1$sSEO > Alat%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Anda telah menambahkan tautan ke artikel terbengkalai Anda, dan Anda telah membersihkan yang tidak lagi relevan. Kerja bagus! Lihatlah ringkasan berikut dan rayakan apa yang telah Anda capai!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Periksa secara kritis konten dalam daftar ini dan buat pembaruan yang diperlukan. Jika Anda memerlukan bantuan untuk memperbarui, kami memiliki %1$sartikel blog yang sangat berguna yang dapat memandu Anda sepenuhnya%2$s (klik untuk membuka di tab baru)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sPerlu panduan lebih lanjut? Kami telah membahas setiap langkah secara lebih mendetail dalam panduan berikut: %2$sCara menggunakan %7$s latihan konten yang terbengkalai%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Anda baru saja membuat konten terbaik Anda yang mudah ditemukan, dan kemungkinan besar akan mendapat peringkat! Bagus! Ingatlah selalu untuk memeriksa apakah landasan Anda memiliki tautan yang cukup!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Lihatlah daftar berikut. Apakah landasan Anda (ditandai dengan %1$s) memiliki tautan internal paling banyak yang mengarah ke sana? Klik tombol Optimalkan jika menurut Anda landasan membutuhkan lebih banyak tautan. Proses tersebut akan memindahkan artikel ke langkah berikutnya."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Apakah semua landasan Anda mendapatkan bulatan hijau? Untuk hasil terbaik, edit mana yang tidak ada bulatan hijau!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Artikel mana yang ingin Anda targetkan mendapatkan peringkatkan tertinggi? Mana yang menurut audiens Anda paling berguna dan lengkap? Klik panah yang mengarah ke bawah dan cari artikel yang sesuai dengan kriteria tersebut. Kami akan secara otomatis menandai artikel yang Anda pilih sebagai landasan."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sPerlu panduan lebih lanjut? Kami telah membahas setiap langkah secara lebih mendetail di: %2$sCara menggunakan latihan dasar %7$s%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Subhalaman Yoast"],"Yoast Siblings":["Yoast Siblings"],"Yoast Table of Contents":["Yoast Table of Contents"],"Yoast Related Links":["Tautan Terkait Yoast"],"Finish optimizing":["Selesaikan pengoptimalan"],"You've finished adding links to this article.":["Anda telah selesai menambahkan tautan ke artikel berikut."],"Optimize":["Optimalkan"],"Added to next step":["Ditambahkan ke langkah selanjutnya"],"Choose cornerstone articles...":["Pilih artikel landasan..."],"Loading data...":["Memuat data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Anda belum membersihkan atau memperbarui artikel menggunakan latihan ini. Setelah Anda melakukannya, rangkuman kerja Anda akan tampil di sini."],"Skipped":["Dilewati"],"Hidden from search engines.":["Disembunyikan dari mesin pencari."],"Removed":["Dihapus"],"Improved":["Ditingkatkan"],"Resolution":["Resolusi"],"Loading redirect options...":["Memuat pilihan pengalihan..."],"Remove and redirect":["Hapus dan alihkan"],"Custom url:":["Url khusus:"],"Related article:":["Artikel terkait:"],"Home page:":["Halaman beranda:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Anda akan menghapus %1$s%2$s%3$s. Untuk mencegah 404 di situs Anda, Anda harus mengalihkannya ke halaman lain di situs Anda. Ke mana Anda akan mengalihkannya?"],"SEO Workout: Remove article":["Latihan SEO: Hapus artikel"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Semuanya tampak bagus! Kami belum menemukan artikel apa pun di situs Anda lebih lama dari 6 bulan dan kami menemukan situs Anda terdapat terlalu sedikit tautan. Cek lagi nanti untuk saran pembersihan baru!"],"Hide from search engines":["Sembunyikan dari mesin pencari"],"Improve":["Tingkatkan"],"Are you sure you wish to hide this article from search engines?":["Apakah Anda yakin ingin menyembunyikan artikel dari mesin pencari?"],"Action":["Aksi"],"You've hidden this article from search engines.":["Anda telah menyembunyikan artikel ini dari mesin pencari."],"You've removed this article.":["Anda telah menghapus artikel ini."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Anda belum memilih artikel untuk ditingkatkan. Pilih beberapa artikel pada langkah sebelumnya untuk menambahkan tautan dan kami akan menampilkan saran tautan untuk Anda di sini."],"Loading link suggestions...":["Memuat saran tautan..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Kami tidak menemukan saran apa pun untuk artikel ini, namun tentu Anda tetap dapat menambahkan tautan ke artikel yang menurut Anda cocok."],"Skip":["Lewati"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Anda belum memilih artikel mana pun di langkah ini. Anda dapat melakukannya di langkah sebelumnya."],"Is it up-to-date?":["Apakah ini terbaru?"],"Last Updated":["Pembaruan Terakhir"],"You've moved this article to the next step.":["Anda telah memindahkan artikel ini ke langkah selanjutnya."],"Unknown":["Tak dikenal"],"Clear summary":["Hapus ringkasan"],"Add internal links towards your orphaned articles.":["Tambahkan tautan internal ke artikel yang terbengkalai Anda."],"Should you update your article?":["Apakah Anda harus memperbarui artikel Anda?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Situs Anda banyak mengandung konten yang sekali dibuat tidak pernah dilihat kembali setelahnya. Sangat penting untuk mengeceknya dan tanyakan ke diri Anda apakah konten tersebut masih relevan untuk situs Anda. Haruskah Anda meningkatkannya atau menghapusnya?"],"Start: Love it or leave it?":["Mulai: Suka atau tinggalkan?"],"Clean up your unlinked content to make sure people can find it":["Bersihkan konten Anda yang tidak ditautkan supaya dapat ditemukan pengunjung"],"I've finished this workout":["Saya telah menyelesaikan latihan ini"],"Reset this workout":["Reset latihan ini"],"Well done!":["Bagus sekali!"],"Add internal links towards your cornerstones":["Tambahkan tautan internal menuju landasan Anda"],"Check the number of incoming internal links of your cornerstones":["Periksa jumlah tautan internal yang masuk dari landasan Anda"],"Start: Choose your cornerstones!":["Mulai: Pilih landasan Anda!"],"The cornerstone approach":["Pendekatan landasan"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Mohon diperhatikan: Agar latihan ini berfungsi dengan baik dan menawarkan saran penautan, Anda perlu menjalankan alat pengoptimalan data SEO. Admin dapat menjalankan ini di bawah %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Saya telah menyelesaikan tahap ini"],"Revise this step":["Perbaiki tahap ini"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Kami tidak dapat menemukan tautan internal di halaman Anda. Mungkin Anda belum menambahkan tautan internal apa pun ke konten Anda, atau Yoast SEO tidak mengindeksnya. Anda dapat meminta Yoast SEO mengindeks tautan Anda dengan menjalankan pengoptimalan data SEO di menu SEO > Peralatan."],"Incoming links":["Tautan masuk"],"Edit to add link":["Edit untuk menambahkan tautan"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Saat ini Anda tidak memiliki artikel yang ditandai sebagai landasan. Ketika Anda menandai artikel Anda sebagai landasan, mereka akan muncul di sini."],"Focus keyphrase":["Frasa kunci utama"],"Article":["Artikel"],"Readability score":["Skor keterbacaan"],"SEO score":["Skor SEO"],"Copy failed":["Gagal menyalin"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Tingkatkan peringkat untuk semua landasan Anda dengan menggunakan %1$slangkah-demi-langkah latihan!%2$s"],"Rank with articles you want to rank with":["Peringkatkan dengan artikel yang Anda inginkan"],"Descriptive text":["Teks deskriptif"],"Show the descriptive text":["Tampilkan teks deskriptif"],"Show icon":["Tampilkan ikon"],"Yoast Estimated Reading Time":["Estimasi Waktu Baca Yoast"],"Shows an estimated reading time based on the content length.":["Tampilkan estimasi waktu baca berdasarkan panjang konten."],"reading time":["waktu baca"],"content length":["panjang konten"],"Estimated reading time:":["Estimasi waktu baca:"],"minute":["menit","menit"],"Settings":["Pengaturan"],"OK":["OK"],"Close":["Tutup"],"Type":["Tipe"],"Orphaned content":["Orphaned content"],"Synonyms":["Sinonim"],"Internal linking suggestions":["Saran penautan internal"],"Enter a related keyphrase to calculate the SEO score":["Masukkan frasa kunci terkait untuk menampilkan skor SEO"],"Related keyphrase":["Frasa kunci terkait"],"Add related keyphrase":["Tambahkan frasa kunci terkait"],"Analysis results":["Hasil analisis"],"Help on choosing the perfect keyphrase":["Bantuan memilih frasa kunci yang tepat"],"Help on keyphrase synonyms":["Bantuan memilih sinonim untuk frasa kunci"],"Keyphrase":["Frasa-kunci"],"New URL: {{link}}%s{{/link}}":["URL baru: {{link}}%s{{/link}}"],"Undo":["Batalkan"],"Redirect created":["Pengalihan telah dibuat"],"%s just created a redirect from the old URL to the new URL.":["%s baru saja membuat pengalihan dari URL lama ke URL baru."],"Old URL: {{link}}%s{{/link}}":["URL lama: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Sinonim frasa kunci"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Pratinjau Twitter share"],"Adds a list of internal links to sibling pages which share the same parent.":["Tambahkan daftar tautan internal ke halaman terkait (sibling) dengan konten yang sama."],"siblings":["sibling"],"sibling pages":["halaman sibling"],"Adds a list of internal links to subpages of this page.":["Tambahkan daftar tautan internal ke sub halaman dari halaman ini."],"seo":["seo"],"subpages":["sub halaman"],"childpages":["halaman turunan"],"children":["turunan"],"internal linking":["Tautan internal"],"site structure":["struktur situs"],"We could not find any relevant articles on your website that you could link to from your post.":["Kami tidak dapat menemukan artikel yang relevan pada situs web Anda yang bisa dijadikan tautan dari artikel ini."],"Load suggestions":["Menambahkan daftar link yang terkait dengan halaman ini."],"Refresh suggestions":["Refresh saran"],"Write list…":["Tulis daftar..."],"Adds a list of links related to this page.":["Tambahkan daftar tautan terkait ke halaman ini."],"related posts":["artikel terkait"],"related pages":["halaman terkait"],"Adds a table of contents to this page.":["Tambahkan tabel daftar isi pada halaman ini."],"links":["tautan"],"toc":["toc"],"Copy link":["Salin tautan"],"Copy link to suggested article: %s":["Salin tautan ke artikel yang disarankan: %s"],"Add a title to your post for the best internal linking suggestions.":["Tambahkan judul ke pos untuk saran internal linking terbaik."],"Add a metadescription to your post for the best internal linking suggestions.":["Tambahkan metadescription ke pos Anda untuk saran internal linking terbaik."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Tambahkan judul dan metadescription ke pos Anda untuk saran internal linking terbaik."],"Also, add a title to your post for the best internal linking suggestions.":["Serta, tambahkan judul ke pos Anda untuk saran internal linking terbaik."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Serta, tambahkan metadescription ke pos Anda untuk saran internal linking terbaik Anda."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Serta, tambahkan judul dan metadescription ke pos Anda untuk saran internal linking terbaik."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Ketika Anda menambahkan sejumlah tulisan, kami akan menyajikan daftar konten terkait di sini yang dapat Anda tautkan dalam pos Anda."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Untuk meningkatkan struktur situs, tentukan penautan ke pos atau halaman lain yang relevan pada situs web Anda."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Dibutuhkan beberapa detik untuk menampilkan daftar konten terkait yang mana dapat Anda kaitkan. Saran akan ditampilkan di sini segera setelah ditemukan."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Baca panduan internal linking kami untuk SEO{{/a}} untuk mempelajari selengkapnya."],"Copied!":["Disalin!"],"Not supported!":["Tidak didukung!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Apakah Anda mencoba menggunakan banyak frasa kunci terkait? Anda harus menambahkannya secara terpisah."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Frasa kunci Anda terlalu panjang. Maksimal 191 karakter."],"Add as related keyphrase":["Tambahkan sebagai frasa kunci terkait"],"Added!":["Ditambahkan!"],"Remove":["Hapus"],"Table of contents":["Daftar isi"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Kami perlu mengoptimalkan data SEO Anda supaya kami dapat menawarkan %1$slinking suggestions%2$s. %3$sMulai optimasi Data SEO%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-is_IS.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-is_IS.json deleted file mode 100644 index 222bbb40..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-is_IS.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=(n % 100 != 1 && n % 100 != 21 && n % 100 != 31 && n % 100 != 41 && n % 100 != 51 && n % 100 != 61 && n % 100 != 71 && n % 100 != 81 && n % 100 != 91);","lang":"is"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Stillingar"],"OK":["OK"],"Close":["Close"],"Type":["Tegund"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-it_IT.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-it_IT.json deleted file mode 100644 index 06778203..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-it_IT.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"it"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Per accedere a questa funzionalitĂ  devi attivare gli abbonamenti %2$s e %3$s. %5$sAttiva il tuo abbonamento in %1$s%6$s o %7$scomprane un nuovo %4$s%8$s. Dopo, aggiorna la pagina affinchĂ© la funzionalitĂ  funzioni correttamente. Questo può richiedere fino a 30 secondi."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["Il generatore di titoli con l'IA richiede l'attivazione dell'analisi SEO prima di essere abilitato. Per attivarlo, vai all sezione %2$sCaratteristiche del sito di %1$s%3$s, attiva l'analisi SEO e fai clic su 'Salva le modifiche'. Se l'analisi SEO è disattivata tramite il tuo profilo WordPress, vai sul tuo profilo e attivala. Se non hai accesso a queste impostazioni, contatta il tuo amministratore."],"Social share preview":["Anteprima di condivisione sui social"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Per continuare a usare la funzione Yoast AI, riduci la frequenza delle richieste. Il %1$snostro articolo di supporto%2$s fornisce indicazioni su come pianificare e cadenzare efficacemente le richieste per ottimizzare il flusso di lavoro."],"You've reached the Yoast AI rate limit.":["Hai raggiunto il limite di velocitĂ  di Yoast AI."],"Allow":["Permetti"],"Deny":["Rifiuta"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Per vedere questo video, devi permettere a %1$s di caricare video incorporati da %2$s."],"Text generated by AI may be offensive or inaccurate.":["Il testo generato dall'intelligenza artificiale può essere offensivo o impreciso."],"(Opens in a new browser tab)":["(Si apre in una nuova scheda del browser)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Velocizzate il tuo flusso di lavoro con l'intelligenza artificiale generativa. Ottieni suggerimenti per titoli e descrizioni di alta qualitĂ  per le tue ricerche e per il modo in cui appari sui social. %1$sMaggiori informazioni%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Genera titoli e descrizioni con Yoast AI!"],"New to %1$s":["Nuovo in %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Approvo i %1$sTermini di servizio%2$s e la %3$sPrivacy Policy%4$s del servizio Yoast AI. Questo include il consenso alla raccolta e all'utilizzo dei dati per migliorare l'esperienza utente."],"Start generating":["Inizia con la generazione"],"Yes, revoke consent":["Sì, revoca il consenso"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Se revochi il consenso non avrai piĂą accesso alle funzioni di Yoast AI. Confermi di voler revocare il tuo consenso?"],"Something went wrong, please try again later.":["Qualcosa è andato storto, riprova piĂą tardi."],"Revoke AI consent":["Revoca il consenso all'IA"],"Please enter a focus keyphrase first to use AI.":["Per usare l'AI, inserisci prima una frase chiave."],"AI title generator":["Generatore IA di titoli"],"AI description generator":["Generatore IA di descrizioni"],"AI Twitter title generator":["Generatore IA di titoli Twitter"],"AI Twitter description generator":["Generatore IA di descrizioni per Twitter"],"AI social title generator":["Generatore IA di titoli social"],"AI social description generator":["Generatore IA di descrizioni social"],"Twitter preview":["Anteprima di Twitter"],"Dismiss":["Ignora"],"Don’t show again":["Non mostrare di nuovo"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sSuggerimento%2$s: Migliora l'accuratezza dei titoli IA scrivendo piĂą contenuti nella tua pagina."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sSuggerimento%2$s: Migliora l'accuratezza delle descrizioni IA scrivendo piĂą contenuti nella tua pagina."],"Try again":["Riprova"],"Social preview":["Anteprima social"],"Desktop result":["Risultato per il desktop"],"Mobile result":["Risultato per i dispositivi mobili"],"Apply AI description":["Applica la descrizione IA"],"Apply AI title":["Applica il titolo IA"],"Next":["Successivo"],"Previous":["Precedente"],"Generate 5 more":["Generane altre 5"],"Google preview":["Anteprima di Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["A causa delle rigide linee guida etiche di OpenAI e delle %1$spolitiche di utilizzo%2$s, non possiamo generare titoli SEO per la tua pagina. Se vuoi usare l'intelligenza artificiale, evita i contenuti violenti o sessualmente espliciti. %3$sLeggi qui per saperne di piĂą su come configurare la tua pagina e ottenere i migliori risultati con l'intelligenza artificiale%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["A causa delle rigide linee guida etiche di OpenAI e delle %1$spolitiche di utilizzo%2$s, non possiamo generare descrizioni SEO per la tua pagina. Se vuoi usare l'intelligenza artificiale, evita i contenuti violenti o sessualmente espliciti. %3$sLeggi qui per saperne di piĂą su come configurare la tua pagina e ottenere i migliori risultati con l'intelligenza artificiale%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Per accedere a questa funzione, è necessario un abbonamento %1$s attivo. %3$sAttiva il tuo abbonamento in %2$s%4$s o %5$sottieni un nuovo abbonamento a %1$s%6$s. Dopo fai clic sul pulsante per aggiornare la pagina affinchĂ© questa caratteristica funzioni correttamente, il che potrebbe richiedere fino a 30 secondi."],"Refresh page":["Aggiorna la pagina"],"Not enough content":["Non c'è abbastanza contenuto"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Riprova piĂą tardi. Se il problema persiste, %1$scontatta il nostro team di supporto%2$s!"],"Something went wrong":["Qualcosa è andato storto"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Sembra che si sia verificato un timeout della connessione. Controlla la connessione a Internet e riprova piĂą tardi. Se il problema persiste, %1$scontratta il nostro team di supporto%2$s."],"Connection timeout":["Timeout della connessione"],"Use AI":["Usa la IA"],"Close modal":["Chiudi modal"],"Learn more about AI (Opens in a new browser tab)":["Per saperne di piĂą sull'IA (apre una nuova scheda del browser)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTitolo%3$s: La tua pagina non ha ancora un titolo. %2$sAggiungine uno%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTitolo%2$s: La tua pagina ha un titolo, ottimo lavoro!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sDistribuzione della frase chiave%3$s: %2$sincludi la parola chiave o i suoi sinonimi nel testo così è possibile calcolarne la distribuzione%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sDistribuzione della frase chiave%2$s: ottimo lavoro!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuzione della frase chiave%3$s: irregolare. Alcune parti del tuo testo non contengono la frase chiave o i suoi sinonimi. %2$sTi suggeriamo di distribuirli in modo piĂą regolare%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuzione della frase chiave%3$s: molto irregolare. Molte parti del tuo testo non contengono la frase chiave o i suoi sinonimi. %2$sTi suggeriamo di distribuirli in modo piĂą regolare%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: non stai usando troppe parole complesse, il che rende il testo facile da leggere. Ottimo lavoro!"],"Word complexity":["ComplessitĂ  della parola"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s delle parole del testo sono considerate complesse. %3$sProva a usare parole piĂą brevi e familiari per migliorare la leggibilitĂ %4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sAllineamento%3$s: C'è una lunga sezione di testo allineata al centro. %2$sTi raccomandiamo di allinearla a sinistra%3$s.","%1$sAllineamento%3$s: Ci sono %4$s lunghe sezioni di testo allineate al centro. %2$sTi raccomandiamo di allinearle a sinistra%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sAllineamento%3$s: C'è una lunga sezione di testo allineata al centro. %2$sTi raccomandiamo di allinearla a destra.%3$s","%1$sAllineamento%3$s: Ci sono %4$s lunghe sezioni di testo allineate al centro. %2$sTi raccomandiamo di allinearle a destra.%3$s"],"Select image":["Seleziona un'immagine"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Ă ora di aggiungere alcuni link! Qui di seguito trovi un elenco con i tuoi contenuti centrali (cornerstone). Sotto ognuno di loro, ci sono dei suggerimenti di articoli da cui potresti aggiungere un link. Quando aggiungi il link, inseriscilo in una frase che sia pertinente all'articolo di riferimento. Continua ad aggiungere link da tutti gli articoli correlati di cui hai bisogno, fino a che i tuoi contenuti centrali (cornerstone) non avranno il maggior numero di link interni che puntano verso di loro."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Alcuni articoli del tuo sito sono %1$spiĂą importanti di altri%2$s: rispondono alle domande delle persone e risolvono i loro problemi. Per questo meritano di posizionarsi nella SERP! Noi di %3$s li chiamiamo articoli cornerstone o articoli centrali. Uno dei modi per farli posizionare bene è quello di puntare su di essi un numero sufficiente di link. La presenza di piĂą link segnala ai motori di ricerca che quegli articoli sono importanti e di valore. In questo workout ti aiutiamo ad aggiungere link ai tuoi articoli centrali!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Una volta che aggiungerai un po' di testo potremo dirti qualcosa sul livello di formalitĂ  del tuo testo."],"Overall, your text appears to be %1$s%3$s%2$s.":["Nel complesso, il tuo testo sembra essere %1$s%3$s%2$s."],"Heading %d":["Intestazione %d"],"Maximum heading level":["Livello massimo di intestazione"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Hai disattivato i suggerimenti di link, che sono necessari per il funzionamento dei link correlati. Se vuoi aggiungere i link correlati, vai su FunzionalitĂ  del sito e attiva la funzione Link suggeriti."],"Schema":["Schema"],"Meta tags":["Meta tag"],"Not available":["Non disponibile"],"Checks":["Controlli"],"Focus Keyphrase":["Frase chiave"],"Good":["Buona"],"No index":["Noindex"],"Front-end SEO inspector":["Tool di ispezione SEO nel front-end"],"Focus keyphrase not set":["La frase chiave non è stata impostata"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Nota bene: affinchĂ© questo workout funzioni bene, devi eseguire lo strumento di ottimizzazione dei dati SEO. Se sei admin puoi eseguirlo in %1$sYoast SEO > Strumenti%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Hai aggiunto i link agli articoli orfani e hai ripulito quelli che non erano piĂą rilevanti. Ottimo lavoro! Dai un'occhiata al riepilogo qui sotto e festeggia i risultati ottenuti!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Esamina criticamente i contenuti di questo elenco e apporta gli aggiornamenti necessari. Se hai bisogno di aiuto per l'aggiornamento, c'è %1$sun articolo del blog molto utile che può guidarti lungo tutto il percorso%2$s (fai clic per aprire una nuova scheda)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sTi serve una guida? Abbiamo scritto un articolo che ti spiega come fare passo a passo: %2$sCome usare%7$s il workout per i contenuti orfani (in inglese)%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Hai appena reso i tuoi contenuti migliori facili da trovare e con maggiori probabilitĂ  di posizionamento: complimenti! Di tanto in tanto, ricordati di controllare se i tuoi contenuti Cornerstone ricevono abbastanza link!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Dai un'occhiata all'elenco qui sotto. I tuoi contenuti Cornerstone (contrassegnati con %1$s) ricevono il maggior numero di link interni? Fai clic sul pulsante Ottimizza se pensi che un contenuto Cornerstone abbia bisogno di piĂą link. L'articolo passerĂ  alla fase successiva."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Tutti i tuoi contenuti Cornerstone hanno il pallino verde? Per ottenere risultati migliori, puoi modificare quelli che non ce l'hanno!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Quali sono gli articoli che vuoi posizionare piĂą in alto? Quali sono quelli che il tuo pubblico troverebbe piĂą utili e completi? Fai clic sulla freccia rivolta verso il basso e cerca gli articoli che corrispondono a questi criteri. Gli articoli selezionati dall'elenco saranno automaticamente classificati come \"Cornerstone\"."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sHai bisogno di una guida piĂą dettagliata? Abbiamo descritto ogni passo in dettaglio nella %2$sguida pratica%7$s al workout dei contenuti Cornerstone%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Blocco per le sottopagine di Yoast"],"Yoast Siblings":["Blocco delle sottopagine di stesso livello di Yoast"],"Yoast Table of Contents":["Blocco per creare un indice di Yoast"],"Yoast Related Links":["Blocco per i Link correlati di Yoast"],"Finish optimizing":["Termina l'ottimizzazione"],"You've finished adding links to this article.":["Hai finito di aggiungere link a questo articolo."],"Optimize":["Ottimizza"],"Added to next step":["Aggiunto alla fase successiva"],"Choose cornerstone articles...":["Scegli gli articoli Cornerstone..."],"Loading data...":["Caricamento dei dati in corso..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Non hai ancora ripulito o aggiornato nessun articolo dopo questo workout. Una volta fatto, qui apparirĂ  un riassunto del tuo lavoro."],"Skipped":["Saltata "],"Hidden from search engines.":["Nascosto ai motori di ricerca."],"Removed":["Rimosso"],"Improved":["Migliorato"],"Resolution":["Risoluzione"],"Loading redirect options...":["Caricamento delle opzioni di reindirizzamento..."],"Remove and redirect":["Rimuovi e reindirizza"],"Custom url:":["URL personalizzato:"],"Related article:":["Articolo correlato:"],"Home page:":["Homapage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Stai per eliminare %1$s%2$s%3$s. Per evitare i 404 sul tuo sito, dovresti reindirizzarlo a un'altra pagina del tuo sito. Dove vorresti reindirizzarlo?"],"SEO Workout: Remove article":["Workout SEO: Rimuovi l'articolo"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Sembra tutto a posto! Non abbiamo trovato nessun articolo sul tuo sito che sia piĂą vecchio di sei mesi e che riceva troppi pochi link sul tuo sito. Torna piĂą tardi per nuovi suggerimenti di miglioramento!"],"Hide from search engines":["Nascondi ai motori di ricerca"],"Improve":["Migliora"],"Are you sure you wish to hide this article from search engines?":["Confermi di voler nascondere questo articolo ai motori di ricerca?"],"Action":["Azione"],"You've hidden this article from search engines.":["Hai nascosto questo articolo dai motori di ricerca."],"You've removed this article.":["Hai rimosso questo articolo."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Al momento non hai selezionato nessun articolo da migliorare. Seleziona alcuni articoli orfani dei passi precedenti a cui aggiungere link e ti mostreremo dei suggerimenti di link."],"Loading link suggestions...":["Caricamento dei suggerimenti di link..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Non abbiamo trovato nessun suggerimento per questo articolo, ma naturalmente puoi ancora aggiungere link ad articoli che pensi siano correlati."],"Skip":["Salta"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Non hai ancora selezionato nessun articolo per questo passaggio. Puoi farlo nel passaggio precedente."],"Is it up-to-date?":["Ă aggiornato?"],"Last Updated":["Ultimo aggiornamento"],"You've moved this article to the next step.":["Hai spostato questo articolo al passo successivo."],"Unknown":["Sconosciuto"],"Clear summary":["Cancella il riepilogo"],"Add internal links towards your orphaned articles.":["Aggiungi dei link interni verso i tuoi articoli orfani."],"Should you update your article?":["Dovresti aggiornare il tuo articolo?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Il tuo sito spesso contiene molti contenuti creati una volta e mai piĂą rivisti in seguito. Ă importante esaminarli e chiederti se questi contenuti sono ancora rilevanti per il tuo sito. Chiediti: dovrei migliorarlo o rimuoverlo?"],"Start: Love it or leave it?":["Inizio: rimuovere o tenere?"],"Clean up your unlinked content to make sure people can find it":["Pulisci il tuo contenuto non collegato per assicurarti che le persone possano trovarlo"],"I've finished this workout":["Ho finito questo workout"],"Reset this workout":["Reimposta questo workout"],"Well done!":["Ottimo!"],"Add internal links towards your cornerstones":["Aggiungi link interni verso i tuoi contenuti Cornerstone"],"Check the number of incoming internal links of your cornerstones":["Verifica il numero di link interni in entrata dei tuoi contenuti Cornerstone"],"Start: Choose your cornerstones!":["Inizia: scegli i tuoi contenuti Cornerstone!"],"The cornerstone approach":["L'approccio Cornerstone"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Nota bene: affinchĂ© questo workout funzioni bene e ti offra buoni suggerimenti per i link, devi avviare lo strumento di ottimizzazione dei dati SEO. Gli amministratori possono avviarlo dal menu %1$sYoastSEO > Strumenti%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Ho terminato questo passaggio"],"Revise this step":["Rivedi questo passaggio"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Non siamo riusciti a trovare i link interni sulle tue pagine. O non hai ancora aggiunto alcun link interno al tuo contenuto, oppure Yoast SEO non li ha indicizzati. Puoi fare in modo che Yoast SEO indicizzi i tuoi link eseguendo l'ottimizzazione dei dati SEO sotto SEO > Strumenti."],"Incoming links":["Link in entrata"],"Edit to add link":["Modifica per aggiungere un link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Al momento non hai articoli contrassegnati come contenuti Cornerstone. Quando contrassegnerai i tuoi articoli come Cornerstone, li troverai elencati qui."],"Focus keyphrase":["Frase chiave"],"Article":["Articolo"],"Readability score":["Punteggio di leggibilitĂ "],"SEO score":["Punteggio SEO"],"Copy failed":["Copia non riuscita"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Migliora il posizionamento di tutti i tuoi contenuti Cornerstone seguendo questi %1$sworkout passo a passo!%2$s"],"Rank with articles you want to rank with":["Posizionati meglio con gli articoli che vuoi che vengano mostrati per primi"],"Descriptive text":["Testo descrittivo"],"Show the descriptive text":["Mostra il testo descrittivo"],"Show icon":["Mostra l'icona"],"Yoast Estimated Reading Time":["Tempo di lettura stimato di Yoast"],"Shows an estimated reading time based on the content length.":["Mostra il tempo di lettura stimato in base alla lunghezza del testo."],"reading time":["tempo di lettura"],"content length":["lunghezza del testo"],"Estimated reading time:":["Tempo di lettura stimato:"],"minute":["% minuto","minuti"],"Settings":["Impostazioni"],"OK":["OK"],"Close":["Chiudi"],"Type":["Tipo"],"Orphaned content":["Contenuti orfani"],"Synonyms":["Sinonimi:"],"Internal linking suggestions":["Suggerimenti di link interni"],"Enter a related keyphrase to calculate the SEO score":["Inserisci una frase chiave per calcolare il punteggio SEO"],"Related keyphrase":["Frase chiave correlata"],"Add related keyphrase":["Aggiungi una frase chiave correlata"],"Analysis results":["Risultati dell'analisi"],"Help on choosing the perfect keyphrase":["Aiuto per scegliere le frase chiave perfetta"],"Help on keyphrase synonyms":["Aiuto per i sinonimi delle frasi chiave"],"Keyphrase":["Frase chiave"],"New URL: {{link}}%s{{/link}}":["Nuova URL: {{link}}%s{{/link}}"],"Undo":["Annulla"],"Redirect created":["Reindirizzamento creato"],"%s just created a redirect from the old URL to the new URL.":["%s appena creato un reindirizzamento dalla vecchia URL alla nuova URL."],"Old URL: {{link}}%s{{/link}}":["Vecchia URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Sinonimi della keyphrase"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["Si è verificato un errore: l'analisi SEO Premium non sta funzionando. Assicurati {{activateLink}}di aver attivato il tuo abbonamento in MyYoast{{/activateLink}} e poi {{reloadButton}}ricarica questa pagina{{/reloadButton}} in modo che funzioni in modo corretto."],"Twitter share preview":["Anteprima della condivisione su Twitter"],"Adds a list of internal links to sibling pages which share the same parent.":["Aggiunge una lista di link interni a pagine di pari livello che condividono la stessa pagina principale. "],"siblings":["di pari livello"],"sibling pages":["pagine di pari livello"],"Adds a list of internal links to subpages of this page.":["Aggiunge una lista di link interni a sottopagine di questa pagina."],"seo":["seo"],"subpages":["sottopagine"],"childpages":["pagine figlie"],"children":["figlie"],"internal linking":["link interni"],"site structure":["struttura del sito"],"We could not find any relevant articles on your website that you could link to from your post.":["Non troviamo nessun articolo rilevante sul tuo sito che possa essere inserito come link nel tuo articolo."],"Load suggestions":["Carica i suggerimenti"],"Refresh suggestions":["Aggiorna i suggerimenti"],"Write list…":["Scrivi una lista..."],"Adds a list of links related to this page.":["Aggiunge un elenco di link correlati a questa pagina."],"related posts":["articoli correlati"],"related pages":["pagine correlate"],"Adds a table of contents to this page.":["Aggiunge un indice a questa pagina."],"links":["link"],"toc":["Indice"],"Copy link":["Copia il link"],"Copy link to suggested article: %s":["Copia il link all'articolo suggerito: %s"],"Add a title to your post for the best internal linking suggestions.":["Aggiungi un titolo al tuo articolo per ottenere i migliori suggerimenti di collegamenti interni."],"Add a metadescription to your post for the best internal linking suggestions.":["Aggiungi una metadescrizione al tuo articolo per ottenere i migliori suggerimenti di collegamenti interni."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Aggiungi un titolo e una metadescrizione al tuo articolo per ottenere i migliori suggerimenti di collegamenti interni."],"Also, add a title to your post for the best internal linking suggestions.":["Inoltre, aggiungi un titolo al tuo articolo per ottenere i migliori suggerimenti di collegamenti interni."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Inoltre, aggiungi una metadescrizione al tuo articolo per ottenere i migliori suggerimenti di collegamenti interni."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Inoltre, aggiungi un titolo e una metadescrizione al tuo articolo per ottenere i migliori suggerimenti di collegamenti interni."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Una volta che hai aggiunto un po' piĂą di testo, ti daremo qui un elenco di contenuti correlati che puoi inserire nel tuo articolo."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Per migliorare la struttura del tuo sito, prendi in considerazione di aggiungere link ad altri articoli o pagine correlate del tuo sito."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Ci vogliono alcuni secondi per mostrarti un elenco di contenuti correlati a cui puoi collegare i tuoi contenuti. I suggerimenti saranno mostrati qui non appena li avremo individuati."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Leggi la nostra guida sui Link interni per la SEO{{/a}} per saperne di piĂą."],"Copied!":["Copiato!"],"Not supported!":["Non supportato!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Stai cercando di usare piĂą frasi chiave correlate? Dovresti aggiungerle separatamente."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["La tua frase chiave è troppo lunga. Può contenere un massimo di 191 caratteri."],"Add as related keyphrase":["Aggiungi come frase chiave correlata"],"Added!":["Aggiunto!"],"Remove":["Rimuovi"],"Table of contents":["Indice"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Dobbiamo ottimizzare i tuoi dati SEO per offrirti i migliori %1$ssuggerimenti di link%2$s.\n\n%3$sInizia l'ottimizzazione dei tuoi dati SEO%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ja.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ja.json deleted file mode 100644 index 29ac5d16..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ja.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=1; plural=0;","lang":"ja_JP"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["ă“ă®ć©źč˝ă«ă‚˘ă‚Żă‚»ă‚ąă™ă‚‹ă«ăŻă€ćś‰ĺŠąĺŚ–ăŞ %2$s ăŠă‚ăł %3$s 購読ăŚĺż…č¦ă§ă™ă€‚%5$s %1$s%6$s ă§čłĽčŞ­ă‚’ćś‰ĺŠąĺŚ–ă™ă‚‹ă‹ă€%7$sć–°ă—ă„ %4$s%8$s を取得ă—ă¦ăŹă ă•ă„。ăťă®ĺľŚă€ć©źč˝ăŚć­Łă—ăŹć©źč˝ă™ă‚‹ăźă‚ă«ă“ă®ăšăĽă‚¸ă‚’ć›´ć–°ă—ă¦ăŹă ă•ă„。ă“れă«ăŻćś€ĺ¤§ 30 ç§’ă‹ă‹ă‚‹ĺ ´ĺăŚă‚りăľă™ă€‚"],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["AI タイă㫠ジェăŤă¬ăĽă‚żăĽă‚’使用ă™ă‚‹ă«ăŻă€ä˝żç”¨ĺ‰Ťă« SEO ĺ†ćžă‚’有効ă«ă™ă‚‹ĺż…č¦ăŚă‚りăľă™ă€‚ă“れを有効ă«ă™ă‚‹ă«ăŻă€%2$s%1$s ă®ă‚µă‚¤ă機č˝%3$să«ç§»ĺ‹•ă—ă€SEO ĺ†ćžă‚’オăłă«ă—ă¦ă€ă€Śĺ¤‰ć›´ă‚’äżťĺ­ă€Ťă‚’クăŞăクă—ă¦ăŹă ă•ă„。WordPress ă¦ăĽă‚¶ăĽă—ă­ă•ァイă«ă§ SEO ĺ†ćžăŚç„ˇĺŠąă«ăŞăŁă¦ă„ă‚‹ĺ ´ĺăŻă€ă—ă­ă•ァイă«ă«ă‚˘ă‚Żă‚»ă‚ąă—ă¦ćś‰ĺŠąă«ă—ăľă™ă€‚ă“れらă®č¨­ĺ®šă«ă‚˘ă‚Żă‚»ă‚ąă§ăŤăŞă„ĺ ´ĺăŻă€ç®ˇç†č€…ă«ĺ•Źă„ĺわă›ă¦ăŹă ă•ă„。"],"Social share preview":["ă‚˝ăĽă‚·ăŁă«ă‚·ă‚§ă‚˘ă®ă—ă¬ă“ăĄăĽ"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Yoast AI 機č˝ă‚’引ăŤç¶šăŤä˝żç”¨ă™ă‚‹ă«ăŻă€ăŞă‚Żă‚¨ă‚ąăă®é »ĺş¦ă‚’減らă—ă¦ăŹă ă•ă„。 %1$săă«ă—č¨äş‹%2$să§ăŻă€ăŻăĽă‚Żă•ă­ăĽă‚’最é©ĺŚ–ă™ă‚‹ăźă‚ă«ăŞă‚Żă‚¨ă‚ąăを効果的ă«č¨ç”»ă—ă€ăšăĽă‚ąă‚’調整ă™ă‚‹ăźă‚ă®ă‚¬ă‚¤ă€ăłă‚ąă‚’ćŹäľ›ă—ăľă™ă€‚"],"You've reached the Yoast AI rate limit.":["Yoast AI ă®ă¬ăĽăĺ¶é™ă«é”ă—ăľă—ăźă€‚"],"Allow":["許可"],"Deny":["ć‹’ă‚€"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["ă“ă®ĺ‹•画を表示ă™ă‚‹ă«ăŻă€%1$s ㌠%2$s ă‹ă‚‰ĺź‹ă‚込ăżĺ‹•画を読ăżčľĽă‚ă‚‹ă‚ă†ă«ă™ă‚‹ĺż…č¦ăŚă‚りăľă™ă€‚"],"Text generated by AI may be offensive or inaccurate.":["AI ă«ă‚ăŁă¦ç”źćă•れăźă†ă‚­ă‚ąăăŻć”»ć’çš„ăľăźăŻä¸Ťć­Łç˘şă§ă‚る可č˝ć€§ăŚă‚りăľă™ă€‚"],"(Opens in a new browser tab)":["(ć–°ă—ă„ă–ă©ă‚¦ă‚¶ăĽă‚żă–ă§é–‹ăŹ)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["生ć AI ă§ăŻăĽă‚Żă•ă­ăĽă‚’スă”ăĽă‰ă‚˘ăă—ă—ăľă™ă€‚ 検索や社会的外観ă«ĺわă›ă¦ă€é«ĺ“質ă®ă‚żă‚¤ăă«ă¨čެćŽă®ćŹćˇă‚’取得ă—ăľă™ă€‚ %1$s詳細ă«ă¤ă„ă¦ăŻă€ă“ă“をクăŞăクă—ă¦ăŹă ă•ă„%2$s%3$s。"],"Generate titles & descriptions with Yoast AI!":["Yoast AI ă§ă‚żă‚¤ăă«ă¨čެćŽă‚’生ć!"],"New to %1$s":["%1$s ăŻĺťă‚ă¦ă§ă™"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Yoast AI サăĽă“ス㮠%1$sĺ©ç”¨č¦Źç´„%2$s ăŠă‚ăł %3$să—ă©ă‚¤ăシ㼠ăťăŞă‚·ăĽ%4$s を承認ă—ăľă™ă€‚ ă“れă«ăŻă€ă¦ăĽă‚¶ăĽ エクスăšăŞă‚¨ăłă‚ąă‚’ĺ‘上ă•ă›ă‚‹ăźă‚ă®ă‡ăĽă‚żă®ĺŹŽé›†ă¨ä˝żç”¨ă¸ă®ĺŚć„ŹăŚĺ«ăľă‚Śăľă™ă€‚"],"Start generating":["生ćă‚’é–‹ĺ§‹"],"Yes, revoke consent":["ăŻă„ă€ĺŚć„Źă‚’取りć¶ă—ăľă™"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["ĺŚć„Źă‚’取りć¶ă™ă¨ă€Yoast AI ă®ć©źč˝ă«ă‚˘ă‚Żă‚»ă‚ąă§ăŤăŞăŹăŞă‚Šăľă™ă€‚ ĺŚć„Źă‚’取りć¶ă—ă¦ă‚‚ă‚ろă—ă„ă§ă™ă‹?"],"Something went wrong, please try again later.":["何ă‹ăŚé–“é•ăŁă¦ă„ăľă™ă€‚後ă§ă‚‚ă†ä¸€ĺş¦č©¦ă—ă¦ăŹă ă•ă„。"],"Revoke AI consent":["AI ă®ĺŚć„Źă‚’取りć¶ă™"],"Please enter a focus keyphrase first to use AI.":["AI を使用ă™ă‚‹ă«ăŻă€ćś€ĺťă«ă•ă‚©ăĽă‚«ă‚ą ă‚­ăĽă•ă¬ăĽă‚şă‚’入力ă—ă¦ăŹă ă•ă„。"],"AI title generator":["AI タイăă«ă‚¸ă‚§ăŤă¬ăĽă‚żăĽ"],"AI description generator":["AI 説ćŽă‚¸ă‚§ăŤă¬ăĽă‚żăĽ"],"AI Twitter title generator":["AI Twitter タイăă«ă‚¸ă‚§ăŤă¬ăĽă‚żăĽ"],"AI Twitter description generator":["AI Twitter 説ćŽă‚¸ă‚§ăŤă¬ăĽă‚żăĽ"],"AI social title generator":["AI ソシアă«ă®ă‚żă‚¤ăă«ă‚¸ă‚§ăŤă¬ăĽă‚żăĽ"],"AI social description generator":["AI ソシアă«ă®čެćŽă‚¸ă‚§ăŤă¬ăĽă‚żăĽ"],"Twitter preview":["Twitter ă—ă¬ă“ăĄăĽ"],"Dismiss":["非表示"],"Don’t show again":["二度ă¨čˇ¨ç¤şă—ăŞă„ă§"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$să’ăłă%2$s: ăšăĽă‚¸ă«ă•らă«ĺ¤šăŹă®ă‚łăłă†ăłă„を書ăŤčľĽă‚€ă“ă¨ă§ă€ç”źćă•れ㟠AI タイăă«ă®ç˛ľĺş¦ăŚĺ‘上ă—ăľă™ă€‚"],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$să’ăłă%2$s: ăšăĽă‚¸ă«ă•らă«ĺ¤šăŹă®ă‚łăłă†ăłă„ă‚’č¨čż°ă™ă‚‹ă“ă¨ă§ă€ç”źćă•れ㟠AI ă®čެćŽă®ç˛ľĺş¦ăŚĺ‘上ă—ăľă™ă€‚"],"Try again":["再試行"],"Social preview":["ă‚˝ăĽă‚·ăŁă«ă—ă¬ă“ăĄăĽ"],"Desktop result":["ă‡ă‚ąă‚Żăăă—ă®çµćžś"],"Mobile result":["ă˘ăイă«ă®çµćžś"],"Apply AI description":["AI ă®čެćŽă‚’追加"],"Apply AI title":["AI タイăă«ă‚’追加"],"Next":["次"],"Previous":["前"],"Generate 5 more":["ă•ら㫠5 ă¤ç”źćă™ă‚‹"],"Google preview":["Google ă—ă¬ă“ăĄăĽ"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["OpenAI ă®ĺŽłć ĽăŞĺ€«ç†ă‚¬ă‚¤ă‰ă©ă‚¤ăłă¨%1$s使用ăťăŞă‚·ăĽ%2$să®ăźă‚ă€ăšăĽă‚¸ă® SEO タイăă«ă‚’生ćă§ăŤăľă›ă‚“。AI を使用ă™ă‚‹ĺ ´ĺăŻă€éś˛éިă€ćš´ĺŠ›çš„ă€ăľăźăŻć€§çš„ă«éś˛éިăŞă‚łăłă†ăłă„ă®ä˝żç”¨ăŻéżă‘ă¦ăŹă ă•ă„。%3$s AI ă§ćś€č‰Żă®çµćžśă‚’確実ă«ĺľ—ă‚‹ăźă‚ă«ăšăĽă‚¸ă‚’ć§‹ćă™ă‚‹ć–ąćł•ă«ă¤ă„ă¦č©łă—ăŹčŞ­ă‚“ă§ăŹă ă•ă„%4$s。"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["OpenAI ă®ĺŽłć ĽăŞĺ€«ç†ă‚¬ă‚¤ă‰ă©ă‚¤ăłă¨%1$s使用ăťăŞă‚·ăĽ%2$să®ăźă‚ă€ăšăĽă‚¸ă® SEO ăˇă‚żčެćŽă‚’生ćă§ăŤăľă›ă‚“。AI を使用ă™ă‚‹ĺ ´ĺăŻă€éś˛éިă€ćš´ĺŠ›çš„ă€ăľăźăŻć€§çš„ă«éś˛éިăŞă‚łăłă†ăłă„ă®ä˝żç”¨ăŻéżă‘ă¦ăŹă ă•ă„。%3$s AI ă§ćś€č‰Żă®çµćžśă‚’確実ă«ĺľ—ă‚‹ăźă‚ă«ăšăĽă‚¸ă‚’ć§‹ćă™ă‚‹ć–ąćł•ă«ă¤ă„ă¦č©łă—ăŹčŞ­ă‚“ă§ăŹă ă•ă„%4$s。"],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["ă“ă®ć©źč˝ă«ă‚˘ă‚Żă‚»ă‚ąă™ă‚‹ă«ăŻă€ćś‰ĺŠąăŞ %1$s 購読ăŚĺż…č¦ă§ă™ă€‚%3$s%2$s ă§čłĽčŞ­ă‚’ćś‰ĺŠąĺŚ–ă™ă‚‹%4$să‹ă€%5$sć–°ă—ă„ %1$s 購読を取得ă—ă¦ăŹă ă•ă„%6$s。ăťă®ĺľŚă€ć©źč˝ăŚć­Łă—ăŹć©źč˝ă™ă‚‹ăźă‚ă«ăśă‚żăłă‚’クăŞăクă—ă¦ă“ă®ăšăĽă‚¸ă‚’ć›´ć–°ă—ăľă™ă€‚ă“れă«ăŻćś€ĺ¤§ 30 ç§’ă‹ă‹ă‚‹ĺ ´ĺăŚă‚りăľă™ă€‚"],"Refresh page":["ăšăĽă‚¸ă®ć›´ć–°"],"Not enough content":["コăłă†ăłă„ăŚä¸ŤĺŤĺ†ă§ă™"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["ă‚‚ă†ä¸€ĺş¦ăŠč©¦ă—ăŹă ă•ă„。 問題ăŚč§Łć±şă—ăŞă„ĺ ´ĺăŻă€%1$sサăťăĽă ăăĽă ă«ă”連絡ăŹă ă•ă„%2$s!"],"Something went wrong":["問題ăŚç™şç”źă—ăľă—ăźă€‚"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["接続タイă ă‚˘ă‚¦ăăŚç™şç”źă—ăźă‚ă†ă§ă™ă€‚ イăłă‚żăĽăŤăă接続を確認ă—ă€ĺľŚă§ă‚‚ă†ä¸€ĺş¦č©¦ă—ă¦ăŹă ă•ă„。 問題ăŚč§Łć±şă—ăŞă„ĺ ´ĺăŻă€%1$sサăťăĽă ăăĽă ă«ăŠĺ•Źă„ĺわă›ăŹă ă•ă„%2$s"],"Connection timeout":["接続タイă ă‚˘ă‚¦ă"],"Use AI":["AIを活用"],"Close modal":["ă˘ăĽă€ă«ă‚’é–‰ăă‚‹"],"Learn more about AI (Opens in a new browser tab)":["AI ă«ă¤ă„ă¦č©łă—ăŹč¦‹ă‚‹ (ć–°ă—ă„ă–ă©ă‚¦ă‚¶ăĽ タă–ă§é–‹ăŤăľă™)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sタイăă«%3$s: ăšăĽă‚¸ă«ăŻăľă ă‚żă‚¤ăă«ăŚă‚りăľă›ă‚“。%2$s1ă¤čż˝ĺŠ ă—ă¦ăŹă ă•ă„%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sタイăă«%2$s: ăšăĽă‚¸ă«ăŻă‚żă‚¤ăă«ăŚă‚りăľă™ă€‚ 素晴らă—ă„ďĽ"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$să‚­ăĽă•ă¬ăĽă‚şĺ†ĺ¸%3$s: %2$să‚­ăĽă•ă¬ăĽă‚şăľăźăŻĺŚçľ©čŞžă‚’ă†ă‚­ă‚ąăă«ĺ«ă‚€ă¨ă€ă‚­ăĽă•ă¬ăĽă‚şĺ†ĺ¸ă‚’ăă‚§ăクă™ă‚‹ă“ă¨ăŚă§ăŤăľă™%3$s。"],"%1$sKeyphrase distribution%2$s: Good job!":["%1$să‚­ăĽă•ă¬ăĽă‚şĺ†ĺ¸%2$s: ă„ă„ă§ă™ă­ !"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$să‚­ăĽă•ă¬ăĽă‚şĺ†ĺ¸%3$s: 均一ă§ăŻă‚りăľă›ă‚“。一é¨ă®ă†ă‚­ă‚ąăăŻă‚­ăĽă•ă¬ăĽă‚şă‚„ĺŚçľ©čŞžă‚’ĺ«ă‚“ă§ă„ăľă›ă‚“。%2$sĺ†ĺ¸ă‚’均一ă«ă—ăľă—ょă†%3$s。"],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$să‚­ăĽă•ă¬ăĽă‚şĺ†ĺ¸%3$s: ă¨ă¦ă‚‚均一ă¨ăŻč¨€ăăľă›ă‚“。大é¨ĺ†ă®ă†ă‚­ă‚ąăăŻă‚­ăĽă•ă¬ăĽă‚şă‚„ĺŚçľ©čŞžă‚’ĺ«ă‚“ă§ă„ăľă›ă‚“。%2$sĺ†ĺ¸ă‚’均一ă«ă—ăľă—ょă†%3$s。"],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: 複雑ăŞĺŤčŞžă‚’ă‚ăľă‚Šä˝żç”¨ă—ă¦ă„ăŞă„ăźă‚ă€ă†ă‚­ă‚ąăăŚčŞ­ăżă‚„ă™ăŹăŞăŁă¦ă„ăľă™ă€‚ ă‚ăŹă§ăŤăźďĽ"],"Word complexity":["ĺŤčŞžă®č¤‡é›‘ă•"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: ă†ă‚­ă‚ąăă®ĺŤčŞžă®ă†ăˇ%2$să¤ăŻč¤‡é›‘ă¨č¦‹ăŞă•れăľă™ă€‚ %3$s読ăżă‚„ă™ăŹă™ă‚‹ăźă‚ă«ă€ă‚り短ăŹă€ă‚り親ă—ăżă‚„ă™ă„言葉を使用ă™ă‚‹ă‚ă†ă«ă—ă¦ăŹă ă•ă„%4$s。"],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$s位置ĺわă›%3$s: %4$s ă®ä¸­ĺ¤®ćŹăă®ă†ă‚­ă‚ąăă®é•·ă„セクシă§ăłăŚă‚りăľă™ă€‚%2$sĺ·¦ćŹăă«ă™ă‚‹ă“ă¨ă‚’ăŠĺ‹§ă‚ă—ăľă™%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$s位置ĺわă›%3$s: %4$s ă®ä¸­ĺ¤®ćŹăă®ă†ă‚­ă‚ąăă®é•·ă„セクシă§ăłăŚă‚りăľă™ă€‚%2$s右ćŹăă«ă™ă‚‹ă“ă¨ă‚’ăŠĺ‹§ă‚ă—ăľă™%3$s."],"Select image":["ç”»ĺŹă‚’é¸ćŠž"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["ăŞăłă‚Żă‚’追加ă—ăľă—ょă†ă€‚以下ă«ă€ĺźşç¤Žă¨ăŞă‚‹č¦ç´ ă®ăŞă‚ąăăŚčˇ¨ç¤şă•れăľă™ă€‚ĺ„コăĽăŠăĽă‚ąăăĽăłă‚łăłă†ăłă„ă®ä¸‹ă«ăŻă€ăŞăłă‚Żă‚’追加ă§ăŤă‚‹ćŠ•ç¨żă®ćŹćˇăŚčˇ¨ç¤şă•れăľă™ă€‚ăŞăłă‚Żă‚’追加ă™ă‚‹ă¨ăŤăŻă€ĺż…ăšĺźşç¤ŽćŠ•ç¨żă«é–˘é€Łă™ă‚‹é–˘é€Łć–‡ă«ăŞăłă‚Żă‚’挿入ă—ă¦ăŹă ă•ă„。基礎ă¨ăŞă‚‹ĺ†…é¨ăŞăłă‚ŻăŚăťă®ćŠ•ç¨żă«ĺ‘ă‘られるăľă§ă€ĺż…č¦ăŞć•°ă®é–˘é€ŁćŠ•ç¨żă‹ă‚‰ă®ăŞăłă‚Żă‚’追加ă—ç¶šă‘ăľă™ă€‚"],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["サイă上ă®ă„ăŹă¤ă‹ă®ćŠ•ç¨żăŻ%1$s最も%2$s重č¦ă§ă™ă€‚ ă“ă®ă‚łăłă†ăłă„ăŻäşşă€…ă®čłŞĺ•Źă«ç­”ăă€ĺ•ŹéˇŚă‚’解決ă—ăľă™ă€‚ ă—ăźăŚăŁă¦ă€ă“れらă®ćŠ•ç¨żăŻă©ăłă‚Żä»ă‘ă«ĺ€¤ă—ăľă™ă€‚%3$s ă§ăŻă€ă“れらă®ćŠ•ç¨żă‚’ă‚łăĽăŠăĽă‚ąăăĽăłă‚łăłă†ăłă„ă¨ĺ‘Ľăłăľă™ă€‚ăťă‚Śă‚‰ă‚’ă©ăłă‚Żä»ă‘ă™ă‚‹ć–ąćł•ă® 1 ă¤ăŻă€ăťă‚Śă‚‰ă¸ă®ĺŤĺ†ăŞăŞăłă‚Żă‚’ăťă‚¤ăłăă™ă‚‹ă“ă¨ă§ă™ă€‚ăŞăłă‚ŻăŚĺ˘—ăă‚‹ă¨ă€ăťă‚Śă‚‰ă®ćŠ•ç¨żăŚé‡Ťč¦ă§äľˇĺ€¤ăŚă‚ă‚‹ă¨ă„ă†ă“ă¨ăŚć¤śç´˘ă‚¨ăłă‚¸ăłă«äĽťă‚Źă‚Šăľă™ă€‚ă“ă®ăŻăĽă‚Żă‚˘ă‚¦ăă§ăŻă€ă‚łăĽăŠăĽă‚ąăăĽăłă‚łăłă†ăłă„ă«ăŞăłă‚Żă‚’追加ă™ă‚‹ă®ă‚’ăŠć‰‹äĽťă„ă—ăľă™ă€‚"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["ă‚‚ă†ĺ°‘ă—ă†ă‚­ă‚ąăを追加ă™ă‚‹ă¨ă€ă†ă‚­ă‚ąăă®ĺ˝˘ĺĽŹă¬ă™ă«ăŚă‚Źă‹ă‚Šăľă™ă€‚"],"Overall, your text appears to be %1$s%3$s%2$s.":["全体ă¨ă—ă¦ă€ă†ă‚­ă‚ąă㯠%1$s%3$s%2$s ă®ă‚ă†ă«č¦‹ăăľă™ă€‚"],"Heading %d":["見出ă—%d"],"Maximum heading level":["最大見出ă—ă¬ă™ă«"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["「関連ăŞăłă‚Żă€ŤăŚć©źč˝ă™ă‚‹ăźă‚ă«ĺż…č¦ăŞă€ŚăŞăłă‚Żă®ćŹćˇă€ŤăŚç„ˇĺŠąă«ăŞăŁă¦ă„ăľă™ă€‚関連ăŞăłă‚Żă‚’追加ă—ăźă„ĺ ´ĺăŻă€ă€Śă‚µă‚¤ăă®ć©źč˝ă€Ťă«ç§»ĺ‹•ă—ă€ă€ŚăŞăłă‚Żă®ćŹćˇă€Ťă‚’有効ă«ă—ă¦ăŹă ă•ă„。"],"Schema":["スキăĽăž"],"Meta tags":["ăˇă‚żă‚żă‚°"],"Not available":["ĺ©ç”¨ă§ăŤăľă›ă‚“"],"Checks":["ăă‚§ăク"],"Focus Keyphrase":["ă•ă‚©ăĽă‚«ă‚ąă‚­ăĽă•ă¬ăĽă‚ş"],"Good":["良好"],"No index":["No index"],"Front-end SEO inspector":["ă•ă­ăłăエăłă‰ SEO イăłă‚ąăšă‚Żă‚żăĽ"],"Focus keyphrase not set":["ă•ă‚©ăĽă‚«ă‚ą ă‚­ăĽă•ă¬ăĽă‚şăŚč¨­ĺ®šă•れă¦ă„ăľă›ă‚“"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["注意:ă“ă®ăă¬ăĽă‹ăłă‚°ăŚă†ăľăŹć©źč˝ă—ă€SEO ă‡ăĽă‚żćś€é©ĺŚ–ă„ăĽă«ă‚’実行ă™ă‚‹ĺż…č¦ăŚă‚りăľă™ă€‚ 管ç†č€…ăŻă“れを %1$sSEO > ă„ăĽă«%2$s ă§ĺ®źčˇŚă§ăŤăľă™ă€‚"],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["孤立ă—ăźćŠ•ç¨żă¸ă®ăŞăłă‚Żă‚’追加ă—ă€é–˘é€Łć€§ăŚăŞăŹăŞăŁăźćŠ•ç¨żă‚’ă‚ŻăŞăĽăłă‚˘ăă—ă—ăľă—ăźă€‚ ă‚ăŹă‚„ăŁăźďĽ 以下ă®ć¦‚č¦ă‚’見ă¦ă€é”ćă—ăźă“ă¨ă‚’祝ă„ăľă—ょă†!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["ă“ă®ăŞă‚ąăă®ĺ†…容を批ĺ¤çš„ă«čŞżăąă€ĺż…č¦ăŞć›´ć–°ă‚’行ăŁă¦ăŹă ă•ă„。 ć›´ć–°ă«ă¤ă„ă¦ă‚µăťăĽăăŚĺż…č¦ăŞĺ ´ĺăŻă€%1$s非常ă«äľżĺ©ăŞă–ă­ă‚°ćŠ•ç¨żă‚’ă”ĺ©ç”¨ăŹă ă•ă„%2$s。ă™ăąă¦ă®ć‰‹é †ă‚’ă”ćˇĺ†…ă—ăľă™ (クăŞăクă—ă¦ć–°ă—ă„タă–ă§é–‹ăŤăľă™)。"],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$să•らă«ă‚¬ă‚¤ă€ăłă‚ąăŚĺż…č¦ă§ă™ă‹? 次ă®ă‚¬ă‚¤ă‰ă§ăŻă€ă™ăąă¦ă®ă‚ąă†ăă—ă«ă¤ă„ă¦č©łă—ăŹčެćŽă—ă¦ă„ăľă™ă€‚%2$s%7$s ă®ĺ­¤ç«‹ă—ăźă‚łăłă†ăłă„ăă¬ăĽă‹ăłă‚°ă®ä˝żç”¨ć–ąćł•%3$s%4$s%5$s。%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["最é«ă®ă‚łăłă†ăłă„を見ă¤ă‘ă‚„ă™ăŹă—ă€ă©ăłă‚Żä»ă‘ă™ă‚‹ĺŹŻč˝ć€§ă‚’é«ă‚ăľă—ăź! ă¨ăŤă©ăŤă€ă‚łăĽăŠăĽă‚ąăăĽăłăŚĺŤĺ†ăŞăŞăłă‚Żă‚’獲得ă—ă¦ă„ă‚‹ă‹ă©ă†ă‹ă‚’確認ă™ă‚‹ă“ă¨ă‚’ĺżă‚ŚăŞă„ă§ăŹă ă•ă„!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["以下ă®ăŞă‚ąăを見ă¦ăŹă ă•ă„。 コăĽăŠăĽă‚ąăăĽăł (%1$să§ăžăĽă‚Żă•れă¦ă„ă‚‹) ă«ăŻă€ăťă‚Śă‚‰ă‚’指ă™ĺ†…é¨ăŞăłă‚ŻăŚćś€ă‚‚多ăŹă‚りăľă™ă‹? コăĽăŠăĽă‚ąăăĽăłă«ă•らă«ăŞăłă‚ŻăŚĺż…č¦ă ă¨ć€ťă‚Źă‚Śă‚‹ĺ ´ĺăŻă€ă€Śćś€é©ĺŚ–ă€Ť ăśă‚żăłă‚’クăŞăクă—ăľă™ă€‚ ă“れă«ă‚りă€ćŠ•ç¨żăŻć¬ˇă®ă‚ąă†ăă—ă«é€˛ăżăľă™ă€‚"],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["ă™ăąă¦ă®ă‚łăĽăŠăĽă‚ąăăĽăłă«ç·‘ă®ç®‡ćťˇć›¸ăŤăŚă‚りăľă™ă‹? 最良ă®çµćžśă‚’ĺľ—ă‚‹ă«ăŻă€ăťă†ă§ăŞă„ă‚‚ă®ă‚’編集ă™ă‚‹ă“ă¨ă‚’検討ă—ă¦ăŹă ă•ă„!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["ă©ă®ćŠ•ç¨żă‚’ćś€é«ă«ă©ăłă‚Żä»ă‘ă—ăźă„ă§ă™ă‹?č´čˇ†ăŚćś€ă‚‚有用ă§ĺ®Śĺ…¨ă ă¨ć€ťă†ă‚‚ă®ăŻă©ă‚Śă§ă™ă‹?下ĺ‘ăŤçź˘ĺŤ°ă‚’クăŞăクă—ă¦ă€ăťă®ĺźşćş–ă«é©ĺă™ă‚‹ă‚’探ă—ăľă™ă€‚ăŞă‚ąăă‹ă‚‰é¸ćŠžă—ăźćŠ•ç¨żăŻč‡Şĺ‹•çš„ă«ă€Śă‚łăĽăŠăĽă‚ąăăĽăłă€Ťă¨ă—ă¦ăžăĽă‚Żă•れăľă™ă€‚"],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$să•らă«ă‚¬ă‚¤ă€ăłă‚ąăŚĺż…č¦ă§ă™ă‹? ă™ăąă¦ă®ă‚ąă†ăă—ă«ă¤ă„ă¦ăŻă€ć¬ˇă§č©łă—ăŹčެćŽă—ă¦ă„ăľă™ă€‚%2$s%7$s コăĽăŠăĽă‚ąăăĽăłăă¬ăĽă‹ăłă‚°ă®ä˝żă„ć–ą%3$s%4$s%5$s。%6$s"],"Yoast Subpages":["Yoast サă–ăšăĽă‚¸"],"Yoast Siblings":["Yoast 兄弟"],"Yoast Table of Contents":["Yoast 目次"],"Yoast Related Links":["Yoast 関連ăŞăłă‚Ż"],"Finish optimizing":["最é©ĺŚ–ă‚’çµ‚äş†"],"You've finished adding links to this article.":["ă“ă®ćŠ•ç¨żă¸ă®ăŞăłă‚Żă®čż˝ĺŠ ăŚĺ®Śäş†ă—ăľă—ăźă€‚"],"Optimize":["最é©ĺŚ–"],"Added to next step":["次ă®ă‚ąă†ăă—ă«čż˝ĺŠ "],"Choose cornerstone articles...":["コăĽăŠăĽă‚ąăăĽăłćŠ•ç¨żă®é¸ćŠž..."],"Loading data...":["ă‡ăĽă‚żă‚’ă­ăĽă‰ä¸­"],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["ă“ă®ăă¬ăĽă‹ăłă‚°ă‚’使用ă—ă¦ă€ăľă č¨äş‹ă‚’クăŞăĽăłă‚˘ăă—ăľăźăŻć›´ć–°ă—ă¦ă„ăľă›ă‚“。実行ă™ă‚‹ă¨ă€ä˝śćĄ­ă®ć¦‚č¦ăŚă“ă“ă«čˇ¨ç¤şă•れăľă™ă€‚"],"Skipped":["スキăă—ă—ăľă—ăź"],"Hidden from search engines.":["検索エăłă‚¸ăłă‹ă‚‰éš ă•れă¦ă„ăľă™ă€‚"],"Removed":["削除"],"Improved":["改善"],"Resolution":[" 解決"],"Loading redirect options...":["ăŞă€ă‚¤ă¬ă‚Żăオă—ă‚·ă§ăłă‚’読ăżčľĽă‚“ă§ă„ăľă™..."],"Remove and redirect":["削除ă—ă¦ăŞă€ă‚¤ă¬ă‚Żă"],"Custom url:":["ă‚«ă‚ąă‚żă  URL:"],"Related article:":["関連投稿:"],"Home page:":["ă›ăĽă ăšăĽă‚¸ďĽš"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":[" %1$s%2$s%3$s を削除ă—ă‚ă†ă¨ă—ă¦ă„ăľă™ă€‚サイăă§ 404 ă‚’é˛ăă«ăŻă€ă‚µă‚¤ăă®ĺĄă®ăšăĽă‚¸ă«ăŞă€ă‚¤ă¬ă‚Żăă™ă‚‹ĺż…č¦ăŚă‚りăľă™ă€‚ă©ă“ă«ăŞă€ă‚¤ă¬ă‚Żăă—ăľă™ă‹ďĽź"],"SEO Workout: Remove article":["SEO ăă¬ăĽă‹ăłă‚°ďĽšćŠ•ç¨żă‚’ĺ‰Šé™¤"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["ă™ăąă¦ăŚă‚ă•ăťă†ă ďĽ6 ă‹ćśä»Ąä¸ŠçµŚéŽă—ă¦ă„ă¦ă€ă‚µă‚¤ă上ă®ăŞăłă‚ŻăŚĺ°‘ăŞă™ăŽă‚‹č¨äş‹ăŻč¦‹ă¤ă‹ă‚Šăľă›ă‚“ă§ă—ăźă€‚ć–°ă—ă„クăŞăĽăłă‚˘ăă—ă®ćŹćˇă«ă¤ă„ă¦ăŻă€ĺľŚă§ă“ă“ă«ć»ăŁă¦ç˘şčŞŤă—ă¦ăŹă ă•ă„。"],"Hide from search engines":["検索エăłă‚¸ăłă‹ă‚‰éš ă™"],"Improve":["改良ă™ă‚‹"],"Are you sure you wish to hide this article from search engines?":["ă“ă®ćŠ•ç¨żă‚’ć¤śç´˘ă‚¨ăłă‚¸ăłă‹ă‚‰éš ă—ă¦ă‚‚ă‚ろă—ă„ă§ă™ă‹ďĽź"],"Action":["操作"],"You've hidden this article from search engines.":["ă“ă®ćŠ•ç¨żă‚’ć¤śç´˘ă‚¨ăłă‚¸ăłă‹ă‚‰éš ă—ăľă—ăźă€‚"],"You've removed this article.":["ă“ă®ćŠ•ç¨żă‚’ĺ‰Šé™¤ă—ăľă—ăźă€‚"],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["現在ă€ć”ąĺ–„ă™ă‚‹ćŠ•ç¨żă‚’é¸ćŠžă—ă¦ă„ăľă›ă‚“。前ă®ć‰‹é †ă§ćŠ•ç¨żă‚’ă„ăŹă¤ă‹é¸ćŠžă—ă¦ăŞăłă‚Żă‚’追加ă™ă‚‹ă¨ă€ă“ă“ă«ăŞăłă‚Żă®ćŹćˇăŚčˇ¨ç¤şă•れăľă™ă€‚"],"Loading link suggestions...":["ăŞăłă‚Żă®ćŹćˇă‚’読ăżčľĽă‚“ă§ă„ăľă™..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["ă“ă®ćŠ•ç¨żă«ĺŻľă™ă‚‹ćŹćˇăŻč¦‹ă¤ă‹ă‚Šăľă›ă‚“ă§ă—ăźăŚă€ă‚‚ăˇă‚Ťă‚“ă€é–˘é€Łă—ă¦ă„ă‚‹ă¨ć€ťă‚Źă‚Śă‚‹ćŠ•ç¨żă¸ă®ăŞăłă‚Żă‚’追加ă™ă‚‹ă“ă¨ăŻă§ăŤăľă™ă€‚"],"Skip":["スキăă—"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["ă“ă®ă‚ąă†ăă—ă®ćŠ•ç¨żăŻăľă é¸ćŠžă—ă¦ă„ăľă›ă‚“。前ă®ă‚ąă†ăă—ă§ă“れを行ă†ă“ă¨ăŚă§ăŤăľă™ă€‚"],"Is it up-to-date?":["最新ă§ă™ă‹ďĽź"],"Last Updated":["最終更新日時"],"You've moved this article to the next step.":["ă“ă®ćŠ•ç¨żă‚’ć¬ˇă®ă‚ąă†ăă—ă«ç§»ĺ‹•ă—ăľă—ăźă€‚"],"Unknown":["不ćŽ"],"Clear summary":["č¦ç´„をクăŞă‚˘ă—ăľă™"],"Add internal links towards your orphaned articles.":["孤立ă—ăźćŠ•ç¨żă¸ă®ĺ†…é¨ăŞăłă‚Żă‚’追加ă—ăľă™ă€‚"],"Should you update your article?":["投稿を更新ă™ă‚‹ĺż…č¦ăŚă‚りăľă™ă‹ďĽź"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["サイăă«ăŻă€ä¸€ĺş¦ä˝śćă—ă¦ä»ĄćťĄă€ä¸€ĺş¦ă‚‚見ăźă“ă¨ă®ăŞă„多ăŹă®ă‚łăłă†ăłă„ăŚĺ«ăľă‚Śă¦ă„る可č˝ć€§ăŚă‚りăľă™ă€‚ ă“れらă®ăšăĽă‚¸ă«ç›®ă‚’通ă—ă¦ă€ăťă®ă‚łăłă†ăłă„ăŚăľă ă‚µă‚¤ăă«é–˘é€Łă—ă¦ă„ă‚‹ă‹ă©ă†ă‹ă‚’自問ă™ă‚‹ă“ă¨ăŚé‡Ťč¦ă§ă™ă€‚改善ă—ăźă„ă§ă™ă‹ă€ăťă‚Śă¨ă‚‚削除ă—ăľă™ă‹ďĽź"],"Start: Love it or leave it?":["開始:ăťă‚Śă‚’ć„›ă™ă‚‹ă‹ă€ăťă‚Śă¨ă‚‚残ă™ă‹ďĽź"],"Clean up your unlinked content to make sure people can find it":["ăŞăłă‚Żă•れă¦ă„ăŞă„コăłă†ăłă„をクăŞăĽăłă‚˘ăă—ă—ă¦ă€ä»–ă®äşşăŚč¦‹ă¤ă‘られるă‚ă†ă«ă—ăľă™"],"I've finished this workout":["ă“ă®ăă¬ăĽă‹ăłă‚°ă‚’終ăăľă—ăź"],"Reset this workout":["ăă¬ăĽă‹ăłă‚°ă‚’ăŞă‚»ăă"],"Well done!":["ă‚ăŹă‚„ăŁăźďĽ"],"Add internal links towards your cornerstones":["コăĽăŠăĽă‚ąăăĽăłă®ćŠ•ç¨żă¸ă®ĺ†…é¨ăŞăłă‚Żă‚’追加"],"Check the number of incoming internal links of your cornerstones":["コăĽăŠăĽă‚ąăăĽăłćŠ•ç¨żă®ĺŹ—äżˇĺ†…é¨ăŞăłă‚Żă®ć•°ă‚’確認ă—ăľă™"],"Start: Choose your cornerstones!":["開始:コăĽăŠăĽă‚ąăăĽăłă‚’é¸ćŠžă—ă¦ă­ďĽ"],"The cornerstone approach":["コăĽăŠăĽă‚ąăăĽăłă®ă‚˘ă—ă­ăĽă"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["注意:ă“ă®ăă¬ăĽă‹ăłă‚°ăŚă†ăľăŹć©źč˝ă—ă€ăŞăłă‚Żă®ćŹćˇă‚’ćŹäľ›ă™ă‚‹ă«ăŻă€SEO ă‡ăĽă‚żćś€é©ĺŚ–ă„ăĽă«ă‚’実行ă™ă‚‹ĺż…č¦ăŚă‚りăľă™ă€‚ 管ç†č€…ăŻă“れを %1$sSEO > ă„ăĽă«%2$să§ĺ®źčˇŚă§ăŤăľă™ă€‚"],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["ă“ă®ă‚ąă†ăă—を終了ă—ăľă—ăź"],"Revise this step":["ă“ă®ă‚ąă†ăă—を修正ă—ăľă™"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["ăšăĽă‚¸ă«ĺ†…é¨ăŞăłă‚ŻăŚč¦‹ă¤ă‹ă‚Šăľă›ă‚“ă§ă—ăźă€‚ コăłă†ăłă„ă«ĺ†…é¨ăŞăłă‚Żă‚’ăľă čż˝ĺŠ ă—ă¦ă„ăŞă„ă‹ă€Yoast SEO ăŚăťă‚Śă‚‰ă‚’イăłă‡ăクスă«ç™»éڞă—ă¦ă„ăľă›ă‚“。SEO > ă„ăĽă«ă§ SEO ă‡ăĽă‚żćś€é©ĺŚ–ă‚’ĺ®źčˇŚă™ă‚‹ă¨ă€Yoast SEO ă«ăŞăłă‚Żă®ă‚¤ăłă‡ăクスを作ćă•ă›ă‚‹ă“ă¨ăŚă§ăŤăľă™ă€‚"],"Incoming links":["着信ăŞăłă‚Ż"],"Edit to add link":["ăŞăłă‚Żă‚’追加ă™ă‚‹ăźă‚ă«ç·¨é›†"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["現在ă€ă‚łăĽăŠăĽă‚ąăăĽăłă¨ăžăĽă‚Żă•れăźćŠ•ç¨żăŻă‚りăľă›ă‚“。 投稿をコăĽăŠăĽă‚ąăăĽăłă¨ă—ă¦ăžăĽă‚Żă™ă‚‹ă¨ă€ă“ă“ă«čˇ¨ç¤şă•れăľă™ă€‚ "],"Focus keyphrase":["ă•ă‚©ăĽă‚«ă‚ąă‚­ăĽă•ă¬ăĽă‚ş"],"Article":["投稿"],"Readability score":["可読性スコア"],"SEO score":["SEO スコア"],"Copy failed":["コă”ăĽă«ĺ¤±ć•—ă—ăľă—ăź"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["ă“ă®%1$sスă†ăă—ăイスă†ăă—%2$să®ăă¬ăĽă‹ăłă‚°ă‚’使用ă—ă¦ă€ă™ăąă¦ă®ă‚łăĽăŠăĽă‚ąăăĽăłă®ă©ăłă‚­ăłă‚°ă‚’ĺ‘上ă•ă›ă¦ă­ďĽ"],"Rank with articles you want to rank with":["ăŠć°—ă«ĺ…Ąă‚Šă®ćŠ•ç¨żă§ă©ăłă‚­ăłă‚°ă‚’é”ć"],"Descriptive text":["説ćŽć–‡"],"Show the descriptive text":["説ćŽă†ă‚­ă‚ąăを表示"],"Show icon":["アイコăłă‚’表示"],"Yoast Estimated Reading Time":["Yoast 推定読書時間"],"Shows an estimated reading time based on the content length.":["コăłă†ăłă„ă®é•·ă•ă«ĺźşăĄă„ăźćŽ¨ĺ®ščŞ­ăżĺŹ–ă‚Šć™‚é–“ă‚’čˇ¨ç¤şă—ăľă™ă€‚"],"reading time":["読書時間"],"content length":["コăłă†ăłă„ă®é•·ă•"],"Estimated reading time:":["推定読書時間:"],"minute":["ĺ†"],"Settings":["設定"],"OK":["OK"],"Close":["é–‰ăă‚‹"],"Type":["タイă—"],"Orphaned content":["孤立ă—ăźă‚łăłă†ăłă„"],"Synonyms":["類義語"],"Internal linking suggestions":["内é¨ăŞăłă‚Żă®ćŹćˇ"],"Enter a related keyphrase to calculate the SEO score":["関連ă™ă‚‹ă‚­ăĽă•ă¬ăĽă‚şă‚’入力ă—ă¦ă€SEO スコアをč¨ç®—ă—ăľă™"],"Related keyphrase":["関連性ă®ă‚ă‚‹ă‚­ăĽă•ă¬ăĽă‚ş"],"Add related keyphrase":["関連キăĽă•ă¬ăĽă‚şă‚’追加"],"Analysis results":["č§Łćžçµćžś"],"Help on choosing the perfect keyphrase":["完璧ăŞă‚­ăĽă•ă¬ăĽă‚şă‚’é¸ă¶ă«ăŻ"],"Help on keyphrase synonyms":["ă‚­ăĽă•ă¬ăĽă‚şă®ĺŚçľ©čŞžă«é–˘ă™ă‚‹ăă«ă—"],"Keyphrase":["ă‚­ăĽă•ă¬ăĽă‚ş"],"New URL: {{link}}%s{{/link}}":["ć–°ă—ă„URL:{{link}}%s{{/link}}"],"Undo":["ĺ…ă«ć»ă™"],"Redirect created":["ăŞă€ă‚¤ă¬ă‚ŻăăŚä˝śćă•れăľă—ăź"],"%s just created a redirect from the old URL to the new URL.":["%să«ă‚りă€ĺʤă„URLă‹ă‚‰ć–°ă—ă„URLă¸ă®ăŞă€ă‚¤ă¬ă‚ŻăăŚä˝śćă•れăľă—ăźă€‚"],"Old URL: {{link}}%s{{/link}}":["古ㄠURL:{{link}}%s{{/link}}"],"Keyphrase synonyms":["ă‚­ăĽă•ă¬ăĽă‚şă®ĺŚçľ©čŞž"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter 共有ă—ă¬ă“ăĄăĽ "],"Adds a list of internal links to sibling pages which share the same parent.":["ĺŚă親ăšăĽă‚¸ă‚’共有ă™ă‚‹ĺ…„弟ăšăĽă‚¸ă¸ă®ĺ†…é¨ăŞăłă‚Żă®ăŞă‚ąăを追加ă—ăľă™ă€‚ "],"siblings":["兄弟"],"sibling pages":["兄弟ăšăĽă‚¸"],"Adds a list of internal links to subpages of this page.":["ă“ă®ăšăĽă‚¸ă®ă‚µă–ăšăĽă‚¸ă¸ă®ĺ†…é¨ăŞăłă‚Żă®ăŞă‚ąăを追加ă—ăľă™ă€‚ "],"seo":["seo"],"subpages":["サă–ăšăĽă‚¸"],"childpages":["ĺ­ăšăĽă‚¸"],"children":["ĺ­"],"internal linking":["内é¨ăŞăłă‚Ż"],"site structure":["サイă構造"],"We could not find any relevant articles on your website that you could link to from your post.":["投稿ă‹ă‚‰ăŞăłă‚Żă§ăŤă‚‹é–˘é€Łč¨äş‹ă‚’サイă内ă«č¦‹ă¤ă‘ă‚‹ă“ă¨ăŚă§ăŤăľă›ă‚“ă§ă—ăźă€‚"],"Load suggestions":["ćŹćˇă‚’ă­ăĽă‰"],"Refresh suggestions":["ćŹćˇă‚’ć›´ć–°"],"Write list…":["ăŞă‚ąăを入力..."],"Adds a list of links related to this page.":["ă“ă®ăšăĽă‚¸ă«é–˘é€Łă™ă‚‹ăŞăłă‚Żă®ăŞă‚ąăを追加ă—ăľă™ă€‚"],"related posts":["関連投稿"],"related pages":["関連ăšăĽă‚¸"],"Adds a table of contents to this page.":["ă“ă®ăšăĽă‚¸ă«ç›®ć¬ˇă‚’追加ă—ăľă™ă€‚"],"links":["ăŞăłă‚Ż"],"toc":["目次"],"Copy link":["ăŞăłă‚Żă‚’コă”ăĽ"],"Copy link to suggested article: %s":["ćŹćˇč¨äş‹ă¸ă®ăŞăłă‚Żă‚’コă”ăĽ: %s"],"Add a title to your post for the best internal linking suggestions.":["最é«ă®ĺ†…é¨ăŞăłă‚Żă®ćŹćˇă®ăźă‚ă«ă‚ăŞăźă®ćŠ•ç¨żă«ă‚żă‚¤ăă«ă‚’追加ă—ă¦ăŹă ă•ă„。"],"Add a metadescription to your post for the best internal linking suggestions.":["最良ă®ĺ†…é¨ăŞăłă‚Żă®ćŹćˇă®ăźă‚ă«ă€ăˇă‚żčެćŽă‚’投稿ă«čż˝ĺŠ ă—ă¦ăŹă ă•ă„。"],"Add a title and a metadescription to your post for the best internal linking suggestions.":["最良ă®ĺ†…é¨ăŞăłă‚Żă®ćŹćˇă®ăźă‚ă«ă€ćŠ•ç¨żă«ă‚żă‚¤ăă«ă¨ăˇă‚żčެćŽă‚’追加ă—ă¦ăŹă ă•ă„。"],"Also, add a title to your post for the best internal linking suggestions.":["ăľăźă€ćś€é«ă®ĺ†…é¨ăŞăłă‚Żă®ćŹćˇă®ăźă‚ă«ćŠ•ç¨żă«ă‚żă‚¤ăă«ă‚’追加ă—ă¦ăŹă ă•ă„。"],"Also, add a metadescription to your post for the best internal linking suggestions.":["ăľăźă€ćś€č‰Żă®ĺ†…é¨ăŞăłă‚Żă®ćŹćˇă®ăźă‚ă«ă€ćŠ•ç¨żă«ăˇă‚żčެćŽă‚’追加ă—ă¦ăŹă ă•ă„。"],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["ăľăźă€ćś€é«ă®ĺ†…é¨ăŞăłă‚Żă®ćŹćˇă®ăźă‚ă«ă€ćŠ•ç¨żă«ă‚żă‚¤ăă«ă¨ăˇă‚żčެćŽă‚’追加ă—ă¦ăŹă ă•ă„。"],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["ă†ă‚­ă‚ąăを追加ă™ă‚‹ă¨ă™ăă«ă€ćŠ•ç¨żă«ăŞăłă‚Żă§ăŤă‚‹é–˘é€Łă‚łăłă†ăłă„ă®ăŞă‚ąăăŚčˇ¨ç¤şă•れăľă™ă€‚"],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["サイăă®ć§‹é€ ă‚’改善ă™ă‚‹ă«ăŻă€ă‚µă‚¤ă上ă®ä»–ă®é–˘é€Łă™ă‚‹ćŠ•ç¨żăľăźăŻăšăĽă‚¸ă«ăŞăłă‚Żă™ă‚‹ă“ă¨ă‚’検討ă—ă¦ăŹă ă•ă„。 "],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["ăŞăłă‚Żă§ăŤă‚‹é–˘é€Łă‚łăłă†ăłă„ă®ăŞă‚ąăăŚčˇ¨ç¤şă•れるăľă§ă«ć•°ç§’ă‹ă‹ă‚Šăľă™ă€‚ ćŹćˇăŚă‚り次第ă€ă“ă“ă«čˇ¨ç¤şă•れăľă™ă€‚"],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}詳細ă«ă¤ă„ă¦ăŻă€SEO{{/a}} ă®ĺ†…é¨ăŞăłă‚Żă«é–˘ă™ă‚‹ă‚¬ă‚¤ă‰ă‚’ă”覧ăŹă ă•ă„。"],"Copied!":["コă”ăĽă—ăľă—ăźă€‚"],"Not supported!":["サăťăĽă対象外ă§ă™ă€‚"],"Are you trying to use multiple related keyphrases? You should add them separately.":["関連ă™ă‚‹č¤‡ć•°ă®ă‚­ăĽă•ă¬ăĽă‚şă‚’使用ă—ă‚ă†ă¨ă—ă¦ă„ăľă™ă‹ďĽź 個ĺĄă«čż˝ĺŠ ă™ă‚‹ĺż…č¦ăŚă‚りăľă™ă€‚"],"Your keyphrase is too long. It can be a maximum of 191 characters.":["ă‚­ăĽă•ă¬ăĽă‚şăŚé•·ă™ăŽăľă™ă€‚最大191文字ă«ă™ă‚‹ă“ă¨ăŚă§ăŤăľă™ă€‚"],"Add as related keyphrase":["関連ă™ă‚‹ă‚­ăĽă•ă¬ăĽă‚şă¨ă—ă¦čż˝ĺŠ "],"Added!":["追加!"],"Remove":["削除"],"Table of contents":["目次"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["最é©ăŞ%1$săŞăłă‚Żă®ćŹćˇ%2$să‚’ćŹäľ›ă§ăŤă‚‹ă‚ă†ă«ă€ă‚µă‚¤ăă®SEOă‡ăĽă‚żă‚’最é©ĺŚ–ă™ă‚‹ĺż…č¦ăŚă‚りăľă™ă€‚%3$sSEO ă‡ăĽă‚żă®ćś€é©ĺŚ–ă‚’é–‹ĺ§‹ă™ă‚‹%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-km.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-km.json deleted file mode 100644 index 7e8a8975..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-km.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=1; plural=0;","lang":"km_KH"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute"],"Settings":["ការកំណត់"],"OK":["យល់ព្រáž"],"Close":["បិទ"],"Type":["ប្រភáźáž‘"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-kmr.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-kmr.json deleted file mode 100644 index b6a1eb54..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-kmr.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"ku_TR"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Settings"],"OK":["OK"],"Close":["Close"],"Type":["Type"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ko_KR.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ko_KR.json deleted file mode 100644 index 4eb90be2..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ko_KR.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=1; plural=0;","lang":"ko_KR"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute"],"Settings":["설정"],"OK":["승인"],"Close":["닫기"],"Type":["í€ěž…"],"Orphaned content":["연결ëě§€ 않은 컨í…츠"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-lt_LT.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-lt_LT.json deleted file mode 100644 index 41be7e2e..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-lt_LT.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);","lang":"lt"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Nustatymai"],"OK":["OK"],"Close":["Close"],"Type":["Tipas"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["RaktaĹľodĹľio sinonimai"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ms_MY.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ms_MY.json deleted file mode 100644 index 16d835be..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ms_MY.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=1; plural=0;","lang":"ms"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute"],"Settings":["Tetapan"],"OK":["OK"],"Close":["Tutup"],"Type":["Jenis"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-nb_NO.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-nb_NO.json deleted file mode 100644 index 71e8446e..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-nb_NO.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"nb_NO"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Merk: For at denne øvelsen skal fungere godt, mĂĄ du kjøre SEO-dataoptimaliseringsverktøyet. Administratorer kan kjøre dette under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Du har lagt til koblinger til foreldreløse artikler, og du har ryddet opp i de som ikke lenger var relevante. Flott jobb! Ta en titt pĂĄ sammendraget nedenfor og du kan feire det du har oppnĂĄdd!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Undersøk innholdet i denne listen nøye, og foreta de nødvendige oppdateringene. Hvis du trenger hjelp med ĂĄ oppdatere, har vi et godt %1$s blogginnlegg som kan veilede deg hele veien%2$s (klikk for ĂĄ ĂĄpne i en ny fane)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$s Trenger du mer veiledning? Vi har dekket hvert eneste trinn detaljert i følgende guide: %2$sHvordan bruke den %7$s foreldreløse-innholdstreningen%3$s%4$s%5$s. %6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Du har nettopp gjort ditt aller beste innhold enkelt ĂĄ finne, og mer sannsynlig ĂĄ rangere høyt! SĂĄnn skal det gjøres! Fra tid til annen sĂĄ mĂĄ du huske ĂĄ sjekke om hjørnesteinene dine fĂĄr nok lenker!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Ta en titt pĂĄ listen nedenfor. Har hjørnesteinene dine (merket med %1$s) flest interne koblingene som leder til de? Klikk pĂĄ Optimaliser-knappen hvis du tror en hjørnestein trenger flere koblinger. Det vil ta artikkelen din til nye høyder."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Har alle hjørnesteinene dine grønne punkter? For ĂĄ oppnĂĄ det beste resultatet, vurder ĂĄ redigere de som ikke har det!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Hvilke artikler vil du at skal rangere høyest? Hvilke artikler vil publikum finne nyttigst og mest komplette? Klikk pilen som peker nedover, og se etter artikler som oppfyller disse vilkĂĄrene. Vi merker automatisk de artiklene som du velger fra listen som hjørnesteinsinnhold."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$s Trenger du mer veiledning? Vi har dekket hvert trinn mer detaljert i: %2$sHvordan bruke %7$s hjørnesteinstrening%3$s%4$s%5$s. %6$s"],"Yoast Subpages":["Yoast-undersider"],"Yoast Siblings":["Yoast Søsken"],"Yoast Table of Contents":["Yoast innholdsfortegnelse"],"Yoast Related Links":["Yoast relaterte lenker"],"Finish optimizing":["Fullfør optimalisering"],"You've finished adding links to this article.":["Du er ferdig med ĂĄ legge til lenker i denne artikkelen."],"Optimize":["Optimaliser"],"Added to next step":["Lagt til i neste trinn"],"Choose cornerstone articles...":["Velg hjørnesteinsartikler..."],"Loading data...":["Laster inn data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Du har ikke ryddet opp eller oppdatert noen artikler ennĂĄ ved hjelp av denne treningsøkten. NĂĄr du har gjort det, vises et sammendrag av arbeidet ditt her."],"Skipped":["Hoppet over"],"Hidden from search engines.":["Skjult for søkemotorer."],"Removed":["Fjernet"],"Improved":["Forbedret"],"Resolution":["Oppløsning"],"Loading redirect options...":["Laster inn alternativer for omadressering..."],"Remove and redirect":["Fjern og omadresser"],"Custom url:":["Egendefinert URL-adresse:"],"Related article:":["Relatert artikkel:"],"Home page:":["Hjemmeside:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Du er i ferd med ĂĄ fjerne %1$s%2$s%3$s. For ĂĄ forhindre 404s pĂĄ nettstedet ditt, bør du omdirigere den til en annen side pĂĄ nettstedet ditt. Hvor vil du omdirigere den?"],"SEO Workout: Remove article":["SEO-trening: Fjern artikkel"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Alt ser bra ut! Vi har ikke funnet noen artikler pĂĄ nettstedet ditt som er eldre enn seks mĂĄneder og mottar for fĂĄ lenker pĂĄ nettstedet ditt. Kom tilbake hit senere for nye forslag til opprydding!"],"Hide from search engines":["Skjul fra søkemotorer"],"Improve":["Forbedre"],"Are you sure you wish to hide this article from search engines?":["Er du sikker pĂĄ at du vil skjule denne artikkelen fra søkemotorer?"],"Action":["Handling"],"You've hidden this article from search engines.":["Du har skjult denne artikkelen for søkemotorer."],"You've removed this article.":["Du har fjernet denne artikkelen."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Du har for øyeblikket ikke valgt noen artikler som skal forbedres. Velg noen artikler i de forrige trinnene for ĂĄ legge til koblinger, sĂĄ viser vi deg koblingsforslag her."],"Loading link suggestions...":["Laster inn koblingsforslag..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Vi fant ingen forslag til denne artikkelen, men selvfølgelig kan du fortsatt legge til lenker til artikler du tror er relatert."],"Skip":["Hopp over"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Du har ikke valgt noen artikler for dette trinnet ennĂĄ. Du kan gjøre det i forrige trinn."],"Is it up-to-date?":["Er det oppdatert?"],"Last Updated":["Sist oppdatert"],"You've moved this article to the next step.":["Du har flyttet denne artikkelen til neste trinn."],"Unknown":["Ukjent"],"Clear summary":["Fjern sammendrag"],"Add internal links towards your orphaned articles.":["Legg til interne lenker til foreldreløse artikler."],"Should you update your article?":["Bør du oppdatere artikkelen?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Nettsiden kan inneholde mye innhold som du har opprettet Ă©n gang, og som du aldri har sett tilbake pĂĄ siden. Det er viktig ĂĄ gĂĄ gjennom disse sidene og spørre deg selv om innholdet fortsatt er relevant for nettstedet ditt. Bør du forbedre den eller fjerne den?"],"Start: Love it or leave it?":["Start: Elsk det eller forlat det?"],"Clean up your unlinked content to make sure people can find it":["Rydd opp i innhold uten koblinger for ĂĄ sikre at andre kan finne det"],"I've finished this workout":["Jeg er ferdig med denne treningsøkten"],"Reset this workout":["Tilbakestill denne treningsøkten"],"Well done!":["Godt gjort!"],"Add internal links towards your cornerstones":["Legg til interne koblinger mot hjørnesteinene dine"],"Check the number of incoming internal links of your cornerstones":["Sjekk antall innkommende interne koblinger til hjørnesteinene dine"],"Start: Choose your cornerstones!":["Start: Velg dine hjørnesteiner!"],"The cornerstone approach":["Hjørnestein tilnærming"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Merk: For at denne treningsøkten skal fungere bra og for ĂĄ tilby deg koblingsforslag, mĂĄ du kjøre SEO-dataoptimaliseringsverktøyet. Administratorer kan kjøre dette under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Jeg er ferdig med dette trinnet"],"Revise this step":["Revider dette trinnet"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Finner ikke interne koblinger pĂĄ sidene dine. Enten har du ikke lagt til noen interne lenker til innholdet ditt ennĂĄ, eller Yoast SEO indeksert dem ikke. Du kan fĂĄ Yoast SEO til ĂĄ indeksere koblingene dine ved ĂĄ kjøre SEO-dataoptimalisering under SEO > Tools."],"Incoming links":["Innkommende lenker"],"Edit to add link":["Rediger for ĂĄ legge til kobling"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Du har for øyeblikket ingen artikler merket som hjørnestein. NĂĄr du merker artiklene dine som hjørnestein, vil de dukke opp her."],"Focus keyphrase":["Nøkkelfrase for fokus"],"Article":["Artikkel"],"Readability score":["Lesbarhetspoeng"],"SEO score":["Alle SEO-resultater"],"Copy failed":["Kopiering mislyktes"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Forbedre rangeringen for alle hjørnesteinene dine ved ĂĄ bruke denne %1$strinn-for-steg-treningen! %2$s"],"Rank with articles you want to rank with":["Ranger med artikler du vil rangere med"],"Descriptive text":["Beskrivende tekst"],"Show the descriptive text":["Vis den beskrivende teksten"],"Show icon":["Vis ikon"],"Yoast Estimated Reading Time":["Yoast beregnet lesetid"],"Shows an estimated reading time based on the content length.":["Viser en beregnet lesetid basert pĂĄ innholdslengde."],"reading time":["lesetid"],"content length":["innholdslengde"],"Estimated reading time:":["Bergenet lesetid:"],"minute":["minutt","minutter"],"Settings":["Innstillinger"],"OK":["OK"],"Close":["Lukk"],"Type":["Type"],"Orphaned content":["Foreldreløst innhold"],"Synonyms":["Synonymer"],"Internal linking suggestions":["Forslag til interne lenker"],"Enter a related keyphrase to calculate the SEO score":["Angi en relatert nøkkelfrase for ĂĄ beregne SEO-poengsummen"],"Related keyphrase":["Relatert nøkkelfrase"],"Add related keyphrase":["Legg til beslektet nøkkelfrase"],"Analysis results":["Analyseresultater"],"Help on choosing the perfect keyphrase":["Hjelp til ĂĄ velge den perfekte nøkkelfrasen"],"Help on keyphrase synonyms":["Hjelp for synonymer til nøkkelfrase"],"Keyphrase":["Nøkkelfrase"],"New URL: {{link}}%s{{/link}}":["Ny URL: {{link}}%s{{/link}}"],"Undo":["Angre"],"Redirect created":["Omdirigering opprettet"],"%s just created a redirect from the old URL to the new URL.":["%s lagde akkurat en omdirigering fra den gamle URLen til den nye URLen."],"Old URL: {{link}}%s{{/link}}":["Gammel URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Nøkkelord-synonymer"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["ForhĂĄndsvisning av Twitter-deling"],"Adds a list of internal links to sibling pages which share the same parent.":["Legger til en liste over interne lenker til søsken sider som deler samme forelder."],"siblings":["søsken"],"sibling pages":["søskensider"],"Adds a list of internal links to subpages of this page.":["Legger til en liste over interne lenker til undersider for denne siden."],"seo":["seo"],"subpages":["undersider"],"childpages":["barnesider"],"children":["barn"],"internal linking":["Internlenking"],"site structure":["nettstedstruktur"],"We could not find any relevant articles on your website that you could link to from your post.":["Vi kunne ikke finne noen relevante artikler pĂĄ nettstedet ditt som du kan lenke til fra innlegget ditt."],"Load suggestions":["Last forslag"],"Refresh suggestions":["Gjenoppfrisk forslag"],"Write list…":["Skriv liste..."],"Adds a list of links related to this page.":["Legger til en liste over lenker relatert til denne siden."],"related posts":["relaterte innlegg"],"related pages":["relaterte sider"],"Adds a table of contents to this page.":["Legger til en innholdstabell til denne siden."],"links":["lenker"],"toc":["ift"],"Copy link":["Kopier lenke"],"Copy link to suggested article: %s":["Kopier lenke til foreslĂĄtt artikkel: %s"],"Add a title to your post for the best internal linking suggestions.":["Legg til en tittel til ditt innlegg for ĂĄ fĂĄ de beste internlenkeforslagene."],"Add a metadescription to your post for the best internal linking suggestions.":["Leg til en metabeskrivelse til ditt innlegg for ĂĄ fĂĄ de beste forslagene tii interne lenker."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Legg til en tittel og metabeskrivelse til ditt innlegg for ĂĄ fĂĄ de beste forslagene for interne lenker."],"Also, add a title to your post for the best internal linking suggestions.":["Legg dessuten til en metabeskrivele til ditt innlegg for de beste interne lenkeforslagene."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Legg dessuten til en metabeskrivel for ditt innlegg for de beste interne lenkeforslagene."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Legg dessuten til tittel og en metabeskrivelse for ditt innlegg for ĂĄ fĂĄ de beste interene lenkeforslagene."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Straks du legger til litt mer brødtekst vil vi her gi deg en liste over relatert innhold som du kan lenke til i ditt innlegg."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Hvis du vil forbedre nettstedstrukturen, kan du vurdere ĂĄ koble til andre relevante innlegg eller sider pĂĄ nettstedet ditt."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Det tar noen sekunder ĂĄ vise deg en liste over relatert innhold som du kan koble til. Forslagene vil bli vist her sĂĄ snart vi har dem."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Les vĂĄr veileder om internlenking for SEO{{/a}} for ĂĄ lære mer."],"Copied!":["Kopiert!"],"Not supported!":["Ikke støttet!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Prøver du ĂĄ bruke flere beslektede nøkkelfraser? Du bør legge dem til separat."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Nøkkelfrasen er for lang. Det kan maksimalt være 191 tegn."],"Add as related keyphrase":["Legg til som beslektet nøkkelfrase"],"Added!":["Lagt til!"],"Remove":["Fjern"],"Table of contents":["Innholdsfortegnelse"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Vi mĂĄ optimalisere nettstedets SEO-data slik at vi kan tilby deg de beste %1$skoblingsforslag%2$s.\n\n%3$s Start SEO-dataoptimalisering%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-nl_BE.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-nl_BE.json deleted file mode 100644 index 5ffa8a22..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-nl_BE.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"nl_BE"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Om toegang te krijgen tot deze functie heb je actieve %2$s en %3$s abonnementen nodig. %5$sActiveer je abonnementen in %1$s%6$s of %7$svraag een nieuwe aan %4$s%8$s. Vernieuw daarna deze pagina zodat de functie correct werkt. Dit kan tot 30 seconden duren."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["De AI titelgenerator vereist dat de SEO analyse is ingeschakeld voor gebruik. Om deze in te schakelen, navigeer je naar %2$sSite functies van %1$s%3$s, schakel je de SEO analyse in en klik je op 'Wijzigingen opslaan'. Als de SEO analyse is uitgeschakeld in je WordPress gebruikersprofiel, ga dan naar je profiel en schakel het daar in. Neem contact op met je beheerder als je geen toegang hebt tot deze instellingen."],"Social share preview":["Voorbeeld social delen"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Om de Yoast AI functie te kunnen blijven gebruiken, aanvragen we je om de frequentie van je aanvragen te verlagen. Ons %1$shulpartikel%2$s biedt richtlijnen voor het effectief abonnementen en abonnementen van je aanvragen voor een geoptimaliseerde workflow."],"You've reached the Yoast AI rate limit.":["Je hebt de Yoast AI rate limiet bereikt."],"Allow":["Toestaan"],"Deny":["Weigeren"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Om deze video te zien, moet je %1$s toestaan om ingesloten video's van %2$s te laden."],"Text generated by AI may be offensive or inaccurate.":["Door AI gegenereerde tekst kan beledigend of onnauwkeurig zijn."],"(Opens in a new browser tab)":["(Opent in een nieuwe browsertab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Versnel je workflow met generatieve AI. Ontvang titel- en beschrijvingssuggesties van hoge kwaliteit voor je zoekopdracht en sociale uitstraling. %1$sMeer informatie%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Genereer titels en beschrijvingen met Yoast AI!"],"New to %1$s":["Nieuw bij %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Ik ga akkoord met de %1$sDienstvoorwaarden%2$s & %3$s Privacybeleid%4$s van de Yoast AI dienst. Dit houdt ook in dat ik toestemming geef voor het verzamelen en gebruiken van gegevens om de gebruikerservaring te verbeteren."],"Start generating":["Begin met genereren"],"Yes, revoke consent":["Ja, toestemming intrekken"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Als je je toestemming intrekt, heb je geen toegang meer tot de Yoast AI functies. Weet je zeker dat je je toestemming wil intrekken?"],"Something went wrong, please try again later.":["Er is iets misgegaan, probeer het later nog eens."],"Revoke AI consent":["AI toestemming intrekken"],"Please enter a focus keyphrase first to use AI.":["Voer eerst een focus keyphrase in om AI te gebruiken."],"AI title generator":["AI titel generator"],"AI description generator":["AI beschrijving generator"],"AI Twitter title generator":["AI Twitter titel generator"],"AI Twitter description generator":["AI Twitter beschrijving generator"],"AI social title generator":["AI social titelgenerator"],"AI social description generator":["AI social beschrijving generator"],"Twitter preview":["Twitter voorbeeld"],"Dismiss":["Negeren"],"Don’t show again":["Niet meer laten zien"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sTip%2$s: Verbeter de nauwkeurigheid van je gegenereerde AI titels door meer inhoud op je pagina te schrijven."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sTip%2$s: Verbeter de nauwkeurigheid van je gegenereerde AI beschrijvingen door meer inhoud te schrijven op je pagina."],"Try again":["Opnieuw proberen"],"Social preview":["Sociaal voorbeeld"],"Desktop result":["Desktop resultaat"],"Mobile result":["Resultaat op mobiel"],"Apply AI description":["AI beschrijving toepassen"],"Apply AI title":["AI titel toepassen"],"Next":["Volgende"],"Previous":["Vorige"],"Generate 5 more":["Genereer nog 5"],"Google preview":["Google voorbeeld"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Vanwege de strenge ethische richtlijnen van OpenAI en het %1$sgebruiksbeleid%2$s kunnen we geen SEO titels voor je pagina genereren. Als je van plan bent om AI te gebruiken, vermijd dan het gebruik van expliciete, gewelddadige of seksueel expliciete inhoud. %3$sLees meer over hoe je je pagina kunt configureren om de beste resultaten met AI te behalen%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Vanwege de strenge ethische richtlijnen van OpenAI en het beleid voor %1$sgebruik%2$s kunnen we geen metabeschrijvingen voor je pagina genereren. Als je van plan bent AI te gebruiken, vermijd dan expliciete, gewelddadige of seksueel expliciete inhoud. %3$sLees meer over hoe je je pagina kunt configureren om de beste resultaten met AI te behalen%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Om toegang te krijgen tot deze functie heb je een actief %1$s abonnement nodig. Gelieve %3$sje abonnement te activeren in %2$s%4$s of %5$seen nieuw %1$s abonnement te nemen%6$s. Klik daarna op de knop om deze pagina te verversen zodat de functie correct werkt. Dit kan tot 30 seconden duren."],"Refresh page":["Pagina vernieuwen"],"Not enough content":["Niet genoeg inhoud"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Probeer het later nog eens. Als het probleem zich blijft voordoen, neem dan %1$scontact op met ons ondersteuningsteam%2$s!"],"Something went wrong":["Er ging iets mis"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Er lijkt een time-out van de verbinding te zijn opgetreden. Controleer je internetverbinding en probeer het later nog eens. Als het probleem zich blijft voordoen, neem dan %1$scontact op met ons ondersteuningsteam.%2$s"],"Connection timeout":["Time-out verbinding"],"Use AI":["Gebruik AI"],"Close modal":["Modal sluiten"],"Learn more about AI (Opens in a new browser tab)":["Meer informatie over AI (Opent in een nieuw browserscherm)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTitle%3$s: je pagina heeft nog geen titel. %2$sVoeg er een toe%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTitle%2$s: je pagina heeft een titel. Goed gedaan!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase verdeling%3$s: %2$sGebruik je keyphrases of synoniemen in de tekst zodat we de keyphrase dichtheid kunnen bepalen%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase verdeling%2$s: Goed gedaan!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase verdeling%3$s: Slecht verdeeld. In sommige delen van je tekst komen de keyphrase of synoniemen niet voor. %2$sVerdeel ze beter over de tekst%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase verdeling%3$s: Zeer slecht verdeeld. In sommige delen van je tekst komen de keyphrase of synoniemen niet voor. %2$sVerdeel ze beter over de tekst%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: je gebruikt niet te veel ingewikkelde woorden, waardoor je tekst makkelijk te lezen is. Goed gedaan!"],"Word complexity":["Woord complexiteit"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s van de woorden in je tekst wordt als complex beschouwd. %3$sProbeer om kortere en meer bekende woorden te gebruiken om de leesbaarheid te verbeteren%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sUitlijning%3$s: er is een lange sectie met tekst die uitgelijnd is in het midden. %2$sWe raden aan deze links uit te lijnen%3$s.","%1$sUitlijning%3$s: er zijn %4$s lange secties met tekst die uit het midden zijn uitgelijnd. %2$sWe raden aan deze links uit te lijnen%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sUitlijning%3$s: er is een lange sectie met tekst die uitgelijnd is in het midden. %2$sWe raden aan deze rechts uit te lijnen%3$s.","%1$sUitlijning%3$s: er zijn %4$s lange secties tekst die uit het midden zijn uitgelijnd. %2$sWe raden aan om ze rechts uit te lijnen%3$s."],"Select image":["Selecteer afbeelding"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Tijd om wat links toe te voegen! Hieronder zie je een lijst met je cornerstone. Onder elke cornerstone staan suggesties voor artikelen waar je een link van zou kunnen toevoegen. Wanneer je de link toevoegt, zorg er dan voor dat je hem in een relevante zin plaatst die gerelateerd is aan je cornerstone artikel. Blijf links toevoegen van zoveel gerelateerde artikelen als je nodig hebt, totdat je cornerstones de meeste interne links hebben die ernaar verwijzen."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Sommige artikelen op je site zijn %1$sde%2$s belangrijkste. Ze beantwoorden vragen van mensen en lossen hun problemen op. Ze verdienen het dus om te worden gerangschikt! Bij %3$s noemen we deze artikelen cornerstones. Een van de manieren om ze te laten scoren is om er voldoende links naar te laten verwijzen. Meer links geven zoekmachines het signaal dat deze artikelen belangrijk en waardevol zijn. In deze training helpen we je om links toe te voegen aan je cornerstone artikelen!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Zodra je wat meer tekst hebt toegevoegd, kunnen we je vertellen wat het formaliteit niveau van je tekst is."],"Overall, your text appears to be %1$s%3$s%2$s.":["Over het algemeen lijkt je tekst %1$s%3$s%2$s."],"Heading %d":["Koptekst %d"],"Maximum heading level":["Maximum koptekst niveau"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Je hebt Link suggesties uitgeschakeld, wat nodig is om gerelateerde links te laten werken. Als je gerelateerde links wil toevoegen, ga dan naar Website eigenschappen en schakel Link suggesties in."],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Niet beschikbaar"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Goed"],"No index":["Noindex"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase niet ingevuld"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Let op: Om deze workout goed te laten werken, moet je je SEO gegevens optimaliseren. Beheerders kunnen dit doen via %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Je hebt links toegevoegd naar je verweesde artikelen, en je hebt de artikelen opgeruimd die niet langer relevant waren. Goed gedaan! Bekijk de samenvatting hieronder en vier wat je hebt bereikt!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Kijk kritisch naar de inhoud van deze lijst en breng de nodige updates aan. Als je hulp nodig hebt bij het bijwerken, hebben we een heel %1$snuttig blogbericht dat je helemaal op weg kan helpen%2$s (klik om te openen in een nieuwe tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sMeer begeleiding nodig? we hebben elke stap in meer detail behandeld in de volgende gids: %2$sHoe gebruik je de %7$s verweesde inhoud workout%3$s%4$s %5$s .%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Je hebt zojuist je beste inhoud makkelijk vindbaar gemaakt, en meer kans om te scoren! Goed gedaan! Van tijd tot tijd, vergeet niet om te controleren of je cornerstones genoeg links krijgen!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Kijk eens naar de lijst hieronder. Hebben je cornerstones (gemarkeerd met %1$s) de meeste interne links die ernaartoe wijzen? Klik op de optimaliseren knop als je denkt dat een cornerstone meer links nodig heeft. Dat zal het artikel naar de volgende stap brengen."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Hebben al je cornerstones groene kogels? Voor het beste resultaat kun je overwegen degene die dat niet hebben te bewerken!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Met welke artikelen wil je het hoogst ranken? Welke artikelen zou je publiek het meest nuttig en compleet vinden? Klik op het pijltje en selecteer de artikelen die aan die criteria voldoen. De artikelen die je op deze manier selecteert, markeren we automatisch als cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sMeer hulp nodig? We lichten elke stap uitgebreid toe in: %2$sHoe gebruik je de %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpagina's"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast inhoudsopgave"],"Yoast Related Links":["Yoast gerelateerde links"],"Finish optimizing":["Optimaliseren afronden"],"You've finished adding links to this article.":["Je bent klaar met het toevoegen van links aan dit artikel."],"Optimize":["Optimaliseer"],"Added to next step":["Toegevoegd aan volgende stap"],"Choose cornerstone articles...":["Kies cornerstone artikelen..."],"Loading data...":["Gegevens laden..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Je hebt nog geen artikelen opgeschoond of bijgewerkt met deze workout. Zodra je dit hebt gedaan, wordt hier een samenvatting van je werk weergegeven."],"Skipped":["Overgeslagen"],"Hidden from search engines.":["Verborgen voor zoekmachines."],"Removed":["Verwijderd"],"Improved":["Verbeterd"],"Resolution":["Oplossing"],"Loading redirect options...":["Redirect opties aan het laden ..."],"Remove and redirect":["Verwijder en redirect"],"Custom url:":["Aangepaste URL:"],"Related article:":["Gerelateerd artikel:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Je staat op het punt om %1$s%2$s%3$s te verwijderen. Om 404s te voorkomen, zou je het moeten redirecten naar een andere pagina op je site. Waar wil je het naartoe redirecten?"],"SEO Workout: Remove article":["SEO Workout: Verwijder artikel"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Alles ziet er goed uit! We hebben geen artikelen op je website gevonden die ouder zijn dan zes maanden en die te weinig links op je website ontvangen. Kom hier later terug voor nieuwe suggesties!"],"Hide from search engines":["Verberg voor zoekmachines"],"Improve":["Verbeter"],"Are you sure you wish to hide this article from search engines?":["Weet je zeker dat je dit artikel voor zoekmachines wilt verbergen?"],"Action":["Actie"],"You've hidden this article from search engines.":["Je hebt dit artikel verborgen voor zoekmachines."],"You've removed this article.":["Je hebt dit artikel verwijderd."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Je hebt op dit moment nog geen artikelen geselecteerd om te verbeteren. Selecteer een paar artikelen in de vorige stappen om links aan toe te voegen en wij zullen je link suggesties hier laten zien."],"Loading link suggestions...":["Linksuggesties aan het laden ..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We hebben geen suggesties voor dit artikel gevonden, maar je kan natuurlijk nog steeds links toevoegen naar artikelen waarvan je denkt dat ze gerelateerd zijn."],"Skip":["Overslaan"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Je hebt nog geen artikelen geselecteerd voor deze stap. Dat kan in de vorige stap."],"Is it up-to-date?":["Is het actueel?"],"Last Updated":["Laatst GeĂĽpdatet"],"You've moved this article to the next step.":["Je hebt dit artikel verplaatst naar de volgende stap."],"Unknown":["Onbekend"],"Clear summary":["Samenvatting leegmaken"],"Add internal links towards your orphaned articles.":["Voeg interne links toe naar je orphaned artikelen."],"Should you update your article?":["Moet je je artikel bijwerken?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Je website kan veel inhoud bevatten die je ooit hebt gemaakt en sindsdien nooit meer hebt bekeken. Het is belangrijk om die pagina's door te nemen en je af te vragen of die inhoud nog relevant is voor je website. Moet je het verbeteren of verwijderen?"],"Start: Love it or leave it?":["Start: Houden of laten?"],"Clean up your unlinked content to make sure people can find it":["Ruim je niet-gelinkte inhoud op om ervoor te zorgen dat mensen deze kunnen vinden"],"I've finished this workout":["Ik heb deze workout afgerond"],"Reset this workout":["De workout resetten"],"Well done!":["Goed gedaan! "],"Add internal links towards your cornerstones":["Voeg interne links naar je cornerstones toe"],"Check the number of incoming internal links of your cornerstones":["Controleer het aantal inkomende interne links van je cornerstones"],"Start: Choose your cornerstones!":["Start: kies je cornerstones!"],"The cornerstone approach":["De cornerstone aanpak"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Let op: om deze training goed te laten werken en om je linksuggesties te geven, moet je de SEO-tool voor gegevensoptimalisatie gebruiken. Beheerders kunnen dit uitvoeren onder %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Ik heb deze stap voltooid"],"Revise this step":["Herzie deze stap"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We hebben geen interne links op je pagina's kunnen vinden. Of je hebt nog geen interne links aan je inhoud toegevoegd, of Yoast SEO heeft ze niet geĂŻndexeerd. Je kan Yoast SEO je links laten indexeren door de SEO-gegevensoptimalisatie onder SEO > Tools uit te voeren."],"Incoming links":["Inkomende links"],"Edit to add link":["Bewerk om een link toe te voegen"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Je hebt momenteel geen artikelen gemarkeerd als cornerstone. Wanneer je je artikelen als cornerstone markeert, worden ze hier weergegeven."],"Focus keyphrase":["Focus keyphrase"],"Article":["Artikel"],"Readability score":["Leesbaarheidsscore"],"SEO score":["SEO score"],"Copy failed":["KopiĂ«ren mislukt"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Verbeter je ranking voor al je cornerstones door deze %1$sstapsgewijze workout te gebruiken!%2$s"],"Rank with articles you want to rank with":["Rank met artikelen waarmee je wilt ranken"],"Descriptive text":["Beschrijvende tekst"],"Show the descriptive text":["Laat de beschrijvende tekst zien"],"Show icon":["Toon icoon"],"Yoast Estimated Reading Time":["Yoast geschatte leestijd"],"Shows an estimated reading time based on the content length.":["Toont een geschatte leestijd op basis van de inhoudslengte."],"reading time":["leestijd"],"content length":["inhoudslengte"],"Estimated reading time:":["Geschatte leestijd:"],"minute":["minuut","minuten"],"Settings":["Instellingen"],"OK":["OK"],"Close":["Sluit"],"Type":["Type"],"Orphaned content":["Verweesde inhoud"],"Synonyms":["Synoniemen"],"Internal linking suggestions":["Interne link suggesties"],"Enter a related keyphrase to calculate the SEO score":["Vul een focus keyphrase in om de SEO score te berekenen"],"Related keyphrase":["Gerelateerde keyphrase"],"Add related keyphrase":["Voeg een gerelateerde keyphrase toe"],"Analysis results":["Analyse-resultaten"],"Help on choosing the perfect keyphrase":["Hulp bij het kiezen van de perfecte focus keyphrase"],"Help on keyphrase synonyms":["Hulp met keyphrase synoniemen"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["Nieuwe URL: {{link}}%s{{/link}}"],"Undo":["Ongedaan maken"],"Redirect created":["Redirect aangemaakt"],"%s just created a redirect from the old URL to the new URL.":["%s heeft een redirect gemaakt van de oude URL naar de nieuwe URL."],"Old URL: {{link}}%s{{/link}}":["Oude URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synoniemen"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter-preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Voegt een lijst interne links toe naar pagina's met dezelfde hoofdpagina."],"siblings":["pagina's met dezelfde hoofdpagina"],"sibling pages":["pagina's met dezelfde hoofdpagina"],"Adds a list of internal links to subpages of this page.":["Toont een lijst van subpagina's van deze pagina."],"seo":["seo"],"subpages":["subpagina's"],"childpages":["onderpagina's"],"children":["onderpagina's"],"internal linking":["intern linken"],"site structure":["websitestructuur"],"We could not find any relevant articles on your website that you could link to from your post.":["We hebben geen relevante artikelen gevonden op je website waar je naartoe kan linken vanuit je bericht."],"Load suggestions":["Laad suggesties"],"Refresh suggestions":["Ververs suggesties"],"Write list…":["Maak lijst..."],"Adds a list of links related to this page.":["Voegt een lijst met links toe gerelateerd aan deze pagina."],"related posts":["gerelateerde berichten"],"related pages":["gerelateerde pagina's"],"Adds a table of contents to this page.":["Voegt een inhoudsopgave toe aan deze pagina."],"links":["links"],"toc":["toc"],"Copy link":["Link kopieĂ«ren"],"Copy link to suggested article: %s":["Kopieer de link naar het voorgestelde artikel: %s"],"Add a title to your post for the best internal linking suggestions.":["Voeg een titel toe aan je bericht om de beste suggesties voor interne links te krijgen."],"Add a metadescription to your post for the best internal linking suggestions.":["Voeg een metabeschrijving toe aan je bericht om de beste suggesties voor interne links te krijgen."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Voeg een titel en een metabeschrijving toe aan je bericht om de beste suggesties voor interne links te krijgen."],"Also, add a title to your post for the best internal linking suggestions.":["Voeg ook een titel toe aan je bericht om de beste suggesties voor interne links te krijgen."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Voeg ook een metabeschrijving toe aan je bericht om de beste suggesties voor interne links te krijgen."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Voeg ook een titel en metabeschrijving toe aan je bericht om de beste suggesties voor interne links te krijgen."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Zodra je wat meer inhoud hebt toegevoegd, geven we je hier een lijst met gerelateerde content waarnaar je zou kunnen linken in je bericht."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Overweeg om naar andere relevante berichten of pagina's op je website te linken om de structuur van je site te verbeteren."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Het duurt een paar seconden om je een lijst met gerelateerde inhoud te tonen waarnaar je kan linken. De suggesties worden hier weergegeven zodra we ze hebben."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Lees onze gids over interne links voor SEO{{/a}} voor meer informatie."],"Copied!":["Gekopieerd!"],"Not supported!":["Niet ondersteund!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Probeer je meerdere gerelateerde keyphrases te gebruiken? Je zou ze apart moeten toevoegen."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Je sleutelzin is te lang. Het kan maximaal 191 tekens lang zijn."],"Add as related keyphrase":["Toevoegen als gerelateerde keyphrase"],"Added!":["Toegevoegd!"],"Remove":["Verwijderen"],"Table of contents":["Inhoudsopgave"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We moeten de SEO-gegevens van je site optimaliseren, zodat we je de beste %1$sinterne linksuggesties%2$s kunnen tonen. %3$sStart SEO-gegevensoptimalisatie%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-nl_NL.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-nl_NL.json deleted file mode 100644 index 4bfb5770..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-nl_NL.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"nl"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Om toegang te krijgen tot deze functie heb je actieve %2$s en %3$s abonnementen nodig. %5$sactiveer je abonnementen in %1$s%6$s of %7$svraag een nieuwe aan%4$s%8$s. Vernieuw daarna deze pagina zodat de functie correct werkt. Dit kan tot 30 seconden duren."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["De AI titelgenerator vereist dat de SEO analyse is ingeschakeld voor gebruik. Om deze in te schakelen, navigeer je naar %2$sSite functies van %1$s%3$s, schakel je de SEO analyse in en klik je op 'Wijzigingen opslaan'. Als de SEO analyse is uitgeschakeld in je WordPress gebruikersprofiel, ga dan naar je profiel en schakel het daar in. Neem contact op met je beheerder als je geen toegang hebt tot deze instellingen."],"Social share preview":["Voorbeeld social delen"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Om de Yoast AI functie te kunnen blijven gebruiken, aanvragen we je om de frequentie van je aanvragen te verlagen. Ons %1$shulpartikel%2$s biedt richtlijnen voor het effectief abonnementen en abonnementen van je aanvragen voor een geoptimaliseerde workflow."],"You've reached the Yoast AI rate limit.":["Je hebt de Yoast AI rate limiet bereikt."],"Allow":["Toestaan"],"Deny":["Weigeren"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Om deze video te zien, moet je %1$s toestaan om ingesloten video's van %2$s te laden."],"Text generated by AI may be offensive or inaccurate.":["Door AI gegenereerde tekst kan beledigend of onnauwkeurig zijn."],"(Opens in a new browser tab)":["(Opent in een nieuwe browsertab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Versnel je workflow met generatieve AI. Krijg hoogwaardige titel en beschrijving suggesties voor je zoekopdracht en sociale weergave. %1$sMeer informatie%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Genereer titels & beschrijvingen met Yoast AI!"],"New to %1$s":["Nieuw bij %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Ik ga akkoord met de %1$sDienstvoorwaarden%2$s & %3$s Privacybeleid%4$s van de Yoast AI dienst. Dit houdt ook in dat ik toestemming geef voor het verzamelen en gebruiken van gegevens om de gebruikerservaring te verbeteren."],"Start generating":["Begin met genereren"],"Yes, revoke consent":["Ja, toestemming intrekken"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Als je je toestemming intrekt, heb je geen toegang meer tot de Yoast AI functies. Weet je zeker dat je je toestemming wil intrekken?"],"Something went wrong, please try again later.":["Er is iets misgegaan, probeer het later nog eens."],"Revoke AI consent":["AI toestemming intrekken"],"Please enter a focus keyphrase first to use AI.":["Voer eerst een keyword in om AI te gebruiken."],"AI title generator":["AI titel generator"],"AI description generator":["AI beschrijving generator"],"AI Twitter title generator":["AI Twitter titel generator"],"AI Twitter description generator":["AI Twitter beschrijving generator"],"AI social title generator":["AI social titelgenerator"],"AI social description generator":["AI social beschrijving generator"],"Twitter preview":["Twitter voorbeeld"],"Dismiss":["Negeren"],"Don’t show again":["Niet meer laten zien"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sTip%2$s: Verbeter de nauwkeurigheid van je gegenereerde AI titels door meer inhoud op je pagina te schrijven."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sTip%2$s: Verbeter de nauwkeurigheid van je gegenereerde AI beschrijvingen door meer inhoud te schrijven op je pagina."],"Try again":["Probeer het opnieuw"],"Social preview":["Sociaal voorbeeld"],"Desktop result":["Desktop resultaat"],"Mobile result":["Resultaat op mobiel"],"Apply AI description":["AI beschrijving toepassen"],"Apply AI title":["AI titel toepassen"],"Next":["Volgende"],"Previous":["Vorige"],"Generate 5 more":["Genereer nog 5"],"Google preview":["Google voorbeeld"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Vanwege de strenge ethische richtlijnen van OpenAI en het %1$sgebruiksbeleid%2$s kunnen we geen SEO titels voor je pagina genereren. Als je van plan bent om AI te gebruiken, vermijd dan het gebruik van expliciete, gewelddadige of seksueel expliciete inhoud. %3$sLees meer over hoe je je pagina kunt configureren om de beste resultaten met AI te behalen%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Vanwege de strenge ethische richtlijnen van OpenAI en het beleid voor %1$sgebruik%2$s kunnen we geen metabeschrijvingen voor je pagina genereren. Als je van plan bent AI te gebruiken, vermijd dan expliciete, gewelddadige of seksueel expliciete inhoud. %3$sLees meer over hoe je je pagina kunt configureren om de beste resultaten met AI te behalen%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Om toegang te krijgen tot deze functie heb je een actief %1$s abonnement nodig. Gelieve %3$sje abonnement te activeren in %2$s%4$s of %5$seen nieuw %1$s abonnement te nemen%6$s. Klik daarna op de knop om deze pagina te verversen zodat de functie correct werkt. Dit kan tot 30 seconden duren."],"Refresh page":["Pagina vernieuwen"],"Not enough content":["Niet genoeg inhoud"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Probeer het later nog eens. Als het probleem zich blijft voordoen, neem dan %1$scontact op met ons ondersteuningsteam%2$s!"],"Something went wrong":["Er ging iets mis"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Er lijkt een time-out van de verbinding te zijn opgetreden. Controleer je internetverbinding en probeer het later nog eens. Als het probleem zich blijft voordoen, neem dan %1$scontact op met ons ondersteuningsteam.%2$s"],"Connection timeout":["Time-out verbinding"],"Use AI":["Gebruik AI"],"Close modal":["Modal sluiten"],"Learn more about AI (Opens in a new browser tab)":["Meer informatie over AI (Opent in een nieuw browserscherm)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTitle%3$s: je pagina heeft nog geen titel. %2$sVoeg er een toe%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTitle%2$s: je pagina heeft een titel. Goed gedaan!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase verdeling%3$s: %2$sGebruik je keyphrases of synoniemen in de tekst zodat we de keyphrase dichtheid kunnen bepalen%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase verdeling%2$s: Goed gedaan!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase verdeling%3$s: Slecht verdeeld. In sommige delen van je tekst komen de keyphrase of synoniemen niet voor. %2$sVerdeel ze beter over de tekst%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase verdeling%3$s: Zeer slecht verdeeld. In sommige delen van je tekst komen de keyphrase of synoniemen niet voor. %2$sVerdeel ze beter over de tekst%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: je gebruikt niet te veel moeilijke woorden, waardoor je tekst makkelijk te lezen is. Goed gedaan!"],"Word complexity":["Woord complexiteit"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s van de woorden in je tekst wordt als moeilijk beschouwd. %3$sGebruik kortere en meer bekende woorden om de leesbaarheid te verbeteren%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sUitlijning%3$s: Er is een lange sectie met tekst die uitgelijnd is in het midden. %2$sWe raden aan deze links uit te lijnen%3$s.","%1$sUitlijning%3$s: er zijn %4$s lange secties met tekst die uit het midden zijn uitgelijnd. %2$sWe raden aan deze links uit te lijnen%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sUitlijning%3$s: er is een lange sectie met tekst die uitgelijnd is in het midden. %2$sWe raden aan deze rechts uit te lijnen%3$s.","%1$sUitlijning%3$s: er zijn %4$s lange secties met tekst die uit het midden zijn uitgelijnd. %2$sWe raden aan om ze rechts uit te lijnen%3$s."],"Select image":["Selecteer afbeelding"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Tijd om wat links toe te voegen! Hieronder zie je een lijst met je cornerstone. Onder elke cornerstone staan suggesties voor artikelen waar je een link van zou kunnen toevoegen. Wanneer je de link toevoegt, zorg er dan voor dat je hem in een relevante zin plaatst die gerelateerd is aan je cornerstone artikel. Blijf links toevoegen van zoveel gerelateerde artikelen als je nodig hebt, totdat je cornerstones de meeste interne links hebben die ernaar verwijzen."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Sommige artikelen op je site zijn %1$sde%2$s belangrijkste. Ze beantwoorden vragen van mensen en lossen hun problemen op. Ze verdienen het dus om te worden gerangschikt! Bij %3$s noemen we deze artikelen cornerstones. Een van de manieren om ze te laten scoren is om er voldoende links naar te laten verwijzen. Meer links geven zoekmachines het signaal dat deze artikelen belangrijk en waardevol zijn. In deze training helpen we je om links toe te voegen aan je cornerstone artikelen!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Zodra je wat meer tekst hebt toegevoegd, kunnen we je vertellen wat het formaliteit niveau van je tekst is."],"Overall, your text appears to be %1$s%3$s%2$s.":["Over het algemeen lijkt je tekst %1$s%3$s%2$s."],"Heading %d":["Heading %d"],"Maximum heading level":["Maximum koptekst niveau"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Je hebt Link suggesties uitgeschakeld, wat nodig is om gerelateerde links te laten werken. Als je gerelateerde links wil toevoegen, ga dan naar Site eigenschappen en schakel Link suggesties in."],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Niet beschikbaar"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Goed"],"No index":["Noindex"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase niet ingevuld"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Let op: Om deze workout goed te laten werken, moet je je SEO-gegevens optimaliseren. Beheerders kunnen dit doen via %1$sSEO > Gereedschap%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Je hebt links toegevoegd naar je verweesde artikelen, en je hebt de artikelen opgeruimd die niet langer relevant waren. Goed gedaan! Bekijk de samenvatting hieronder en vier wat je hebt bereikt!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Kijk kritisch naar de inhoud van deze lijst en breng de nodige updates aan. Als je hulp nodig hebt bij het updaten, hebben we een heel %1$snuttig blogbericht dat je helemaal op weg kan helpen%2$s (klik om te openen in een nieuwe tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sMeer begeleiding nodig? we hebben elke stap in meer detail behandeld in de volgende gids: %2$sHoe gebruik je de %7$s verweesde inhoud workout%3$s%4$s %5$s .%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Je hebt zojuist je beste inhoud makkelijk vindbaar gemaakt, en meer kans om te scoren! Goed gedaan! Van tijd tot tijd, vergeet niet om te controleren of je cornerstones genoeg links krijgen!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Bekijk de lijst hieronder. Ontvangen je cornerstones (aangegeven met %1$s) de meeste interne links? Klik op de knop Optimize als je denkt dat een cornerstone meer links nodig heeft. Het artikel wordt dan verplaatst naar de volgende stap. "],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Hebben al je cornerstones groene bolletjes? Voor de beste resultaten kijk je of je de artikelen zonder groene bolletjes nog kunt verbeteren."],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Met welke artikelen wil je het hoogst ranken? Welke artikelen zou je publiek het meest nuttig en compleet vinden? Klik op het pijltje en selecteer de artikelen die aan die criteria voldoen. De artikelen die je op deze manier selecteert, markeren we automatisch als cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sMeer hulp nodig? We lichten elke stap uitgebreid toe in: %2$sHoe gebruik je de %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpagina's"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast inhoudsopgave"],"Yoast Related Links":["Yoast gerelateerde links"],"Finish optimizing":["Optimaliseren afronden"],"You've finished adding links to this article.":["Je bent klaar met het toevoegen van links aan dit artikel."],"Optimize":["Optimaliseer"],"Added to next step":["Toegevoegd aan volgende stap"],"Choose cornerstone articles...":["Kies cornerstone artikelen..."],"Loading data...":["Gegevens laden..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Je hebt nog geen artikelen opgeschoond of bijgewerkt met deze workout. Zodra je dit hebt gedaan, wordt hier een samenvatting van je werk weergegeven."],"Skipped":["Overgeslagen"],"Hidden from search engines.":["Verborgen voor zoekmachines."],"Removed":["Verwijderd"],"Improved":["Verbeterd"],"Resolution":["Oplossing"],"Loading redirect options...":["Redirect opties aan het laden ..."],"Remove and redirect":["Verwijder en redirect"],"Custom url:":["Aangepaste URL:"],"Related article:":["Gerelateerd artikel:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Je staat op het punt om %1$s%2$s%3$s te verwijderen. Om 404s te voorkomen, zou je het moeten redirecten naar een andere pagina op je site. Waar wil je het naartoe redirecten?"],"SEO Workout: Remove article":["SEO Workout: Verwijder artikel"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Alles ziet er goed uit! We hebben geen artikelen op je site gevonden die ouder zijn dan zes maanden en die te weinig links op je site ontvangen. Kom hier later terug voor nieuwe suggesties!"],"Hide from search engines":["Verberg voor zoekmachines"],"Improve":["Verbeter"],"Are you sure you wish to hide this article from search engines?":["Weet je zeker dat je dit artikel voor zoekmachines wilt verbergen?"],"Action":["Actie"],"You've hidden this article from search engines.":["Je hebt dit artikel verborgen voor zoekmachines."],"You've removed this article.":["Je hebt dit artikel verwijderd."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Je hebt op dit moment nog geen artikelen geselecteerd om te verbeteren. Selecteer een paar artikelen in de vorige stappen om links aan toe te voegen en wij zullen je link suggesties hier laten zien."],"Loading link suggestions...":["Linksuggesties aan het laden ..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We hebben geen suggesties voor dit artikel gevonden, maar je kan natuurlijk nog steeds links toevoegen naar artikelen waarvan je denkt dat ze gerelateerd zijn."],"Skip":["Overslaan"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Je hebt nog geen artikelen geselecteerd voor deze stap. Dat kan in de vorige stap."],"Is it up-to-date?":["Is het actueel?"],"Last Updated":["Laatst bijgewerkt"],"You've moved this article to the next step.":["Je hebt dit artikel verplaatst naar de volgende stap."],"Unknown":["Onbekend"],"Clear summary":["Samenvatting leegmaken"],"Add internal links towards your orphaned articles.":["Voeg interne links toe naar je orphaned artikelen."],"Should you update your article?":["Moet je je artikel bijwerken?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Je site kan veel inhoud bevatten die je ooit hebt gemaakt en sindsdien nooit meer hebt bekeken. Het is belangrijk om die pagina's door te nemen en je af te vragen of die inhoud nog relevant is voor je site. Moet je het verbeteren of verwijderen?"],"Start: Love it or leave it?":["Start: Houden of laten?"],"Clean up your unlinked content to make sure people can find it":["Ruim je niet-gelinkte inhoud op om ervoor te zorgen dat mensen deze kunnen vinden"],"I've finished this workout":["Ik heb deze workout afgerond"],"Reset this workout":["De workout resetten"],"Well done!":["Goed gedaan! "],"Add internal links towards your cornerstones":["Voeg interne links naar je cornerstones toe"],"Check the number of incoming internal links of your cornerstones":["Controleer het aantal inkomende interne links van je cornerstones"],"Start: Choose your cornerstones!":["Begin: kies je cornerstones!"],"The cornerstone approach":["De cornerstone aanpak"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Let op: om deze workout goed te laten werken en je linking suggesties te laten doen, moet je de SEO gegevens optimalisatie tool draaien. Beheerders kunnen deze uitvoeren onder %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Ik heb deze stap voltooid"],"Revise this step":["Herzie deze stap"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We hebben geen interne links op je pagina's kunnen vinden. Of je hebt nog geen interne links aan je inhoud toegevoegd, of Yoast SEO heeft ze niet geĂŻndexeerd. Je kan Yoast SEO je links laten indexeren door de SEO gegevensoptimalisatie onder SEO > Tools uit te voeren."],"Incoming links":["Inkomende links"],"Edit to add link":["Bewerk om een link toe te voegen"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Je hebt momenteel geen artikelen gemarkeerd als cornerstone. Wanneer je je artikelen als cornerstone markeert, worden ze hier weergegeven."],"Focus keyphrase":["Focus keyphrase"],"Article":["Artikel"],"Readability score":["Leesbaarheidsscore"],"SEO score":["SEO score"],"Copy failed":["KopiĂ«ren mislukt"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Verbeter je ranking voor al je cornerstones door deze %1$sstapsgewijze workout te gebruiken!%2$s"],"Rank with articles you want to rank with":["Rank met artikelen waarmee je wilt ranken"],"Descriptive text":["Beschrijvende tekst"],"Show the descriptive text":["Laat de beschrijvende tekst zien"],"Show icon":["Toon icoon"],"Yoast Estimated Reading Time":["Yoast geschatte leestijd"],"Shows an estimated reading time based on the content length.":["Toont een geschatte leestijd op basis van de inhoudslengte."],"reading time":["leestijd"],"content length":["inhoudslengte"],"Estimated reading time:":["Geschatte leestijd:"],"minute":["minuut","minuten"],"Settings":["Instellingen"],"OK":["OK"],"Close":["Sluit"],"Type":["Type"],"Orphaned content":["Verweesde content"],"Synonyms":["Synoniemen"],"Internal linking suggestions":["Interne link suggesties"],"Enter a related keyphrase to calculate the SEO score":["Vul een focus keyphrase in om de SEO score te berekenen"],"Related keyphrase":["Gerelateerde keyphrase"],"Add related keyphrase":["Voeg een gerelateerde keyphrase toe"],"Analysis results":["Analyse-resultaten"],"Help on choosing the perfect keyphrase":["Hulp bij het kiezen van de perfecte focus keyphrase"],"Help on keyphrase synonyms":["Hulp met keyphrase synoniemen"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["Nieuwe URL: {{link}}%s{{/link}}"],"Undo":["Ongedaan maken"],"Redirect created":["Redirect aangemaakt"],"%s just created a redirect from the old URL to the new URL.":["%s heeft een redirect gemaakt van de oude URL naar de nieuwe URL."],"Old URL: {{link}}%s{{/link}}":["Oude URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synoniemen"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter-preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Voegt een lijst interne links toe naar pagina's met dezelfde hoofdpagina."],"siblings":["pagina's met dezelfde hoofdpagina"],"sibling pages":["pagina's met dezelfde hoofdpagina"],"Adds a list of internal links to subpages of this page.":["Toont een lijst van subpagina's van deze pagina."],"seo":["seo"],"subpages":["subpagina's"],"childpages":["onderpagina's"],"children":["onderpagina's"],"internal linking":["intern linken"],"site structure":["sitestructuur"],"We could not find any relevant articles on your website that you could link to from your post.":["We hebben geen relevante artikelen gevonden op je website waar je naartoe kan linken vanuit je bericht."],"Load suggestions":["Laad suggesties"],"Refresh suggestions":["Ververs suggesties"],"Write list…":["Maak lijst..."],"Adds a list of links related to this page.":["Voegt een lijst met links toe gerelateerd aan deze pagina."],"related posts":["gerelateerde berichten"],"related pages":["gerelateerde pagina's"],"Adds a table of contents to this page.":["Voegt een inhoudsopgave toe aan deze pagina."],"links":["links"],"toc":["toc"],"Copy link":["Link kopieĂ«ren"],"Copy link to suggested article: %s":["Kopieer de link naar het voorgestelde artikel: %s"],"Add a title to your post for the best internal linking suggestions.":["Voeg een titel toe aan je bericht om de beste suggesties voor interne links te krijgen."],"Add a metadescription to your post for the best internal linking suggestions.":["Voeg een metabeschrijving toe aan je bericht om de beste suggesties voor interne links te krijgen."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Voeg een titel en een metabeschrijving toe aan je bericht om de beste suggesties voor interne links te krijgen."],"Also, add a title to your post for the best internal linking suggestions.":["Voeg ook een titel toe aan je bericht om de beste suggesties voor interne links te krijgen."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Voeg ook een metabeschrijving toe aan je bericht om de beste suggesties voor interne links te krijgen."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Voeg ook een titel en metabeschrijving toe aan je bericht om de beste suggesties voor interne links te krijgen."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Zodra je wat meer inhoud hebt toegevoegd, geven we je hier een lijst met gerelateerde content waarnaar je zou kunnen linken in je bericht."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Overweeg om naar andere relevante berichten of pagina's op je website te linken om de structuur van je site te verbeteren."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Het duurt een paar seconden om je een lijst met gerelateerde inhoud te tonen waarnaar je kan linken. De suggesties worden hier weergegeven zodra we ze hebben."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Lees onze gids over interne links voor SEO{{/a}} voor meer informatie."],"Copied!":["Gekopieerd!"],"Not supported!":["Niet ondersteund!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Probeer je meerdere gerelateerde keyphrases te gebruiken? Je zou ze apart moeten toevoegen."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Je keyphrase is te lang. Het kan maximaal 191 tekens lang zijn."],"Add as related keyphrase":["Toevoegen als gerelateerde keyphrase"],"Added!":["Toegevoegd!"],"Remove":["Verwijderen"],"Table of contents":["Inhoudsopgave"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We moeten de SEO-gegevens van je site optimaliseren, zodat we je de beste %1$sinterne linksuggesties%2$s kunnen tonen. %3$sStart SEO-gegevensoptimalisatie%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-pl_PL.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-pl_PL.json deleted file mode 100644 index 5ec8d05c..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-pl_PL.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);","lang":"pl"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Aby uzyskać dostÄ™p do tej funkcji, wymagane sÄ… aktywne subskrypcje %2$s i %3$s. Prosimy o %5$saktywacjÄ™ subskrypcji w %1$s%6$s lub %7$skupienie nowej %4$s%8$s. NastÄ™pnie odĹ›wieĹĽ tÄ™ stronÄ™, aby funkcja dziaĹ‚aĹ‚a poprawnie, co moĹĽe potrwać do 30 sekund."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["Generator tytułów AI wymaga włączenia analizy SEO. Aby jÄ… włączyć, przejdĹş do %2$sfunkcji witryny %1$s%3$s, włącz analizÄ™ SEO i kliknij \"zapisz zmiany\". JeĹ›li analiza SEO jest wyłączona w profilu uĹĽytkownika WordPress, przejdĹş do swojego profilu i włącz jÄ… tam. JeĹ›li nie masz dostÄ™pu do tych ustawieĹ„, skontaktuj siÄ™ z administratorem."],"Social share preview":["PodglÄ…d udostÄ™pniania w mediach spoĹ‚ecznoĹ›ciowych"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Aby nadal korzystać z funkcji Yoast AI, uprzejmie prosimy o zmniejszenie czÄ™stotliwoĹ›ci ĹĽÄ…daĹ„. Nasz %1$sartykuĹ‚ pomocy%2$s zawiera wskazĂłwki dotyczÄ…ce skutecznego planowania i planowania ĹĽÄ…daĹ„ w celu zoptymalizowania przepĹ‚ywu pracy."],"You've reached the Yoast AI rate limit.":["OsiÄ…gnÄ…Ĺ‚eĹ› limit stawki Yoast AI."],"Allow":["ZezwĂłl"],"Deny":["Odrzuć"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Aby zobaczyć ten film, musisz zezwolić %1$s na Ĺ‚adowanie osadzonych filmĂłw z %2$s."],"Text generated by AI may be offensive or inaccurate.":["Tekst generowany przez sztucznÄ… inteligencjÄ™ moĹĽe być obraĹşliwy lub niedokĹ‚adny."],"(Opens in a new browser tab)":["(Otworzy siÄ™ w nowej zakĹ‚adce)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Przyspiesz swĂłj przepĹ‚yw pracy dziÄ™ki generatywnej sztucznej inteligencji. Uzyskaj wysokiej jakoĹ›ci sugestie dotyczÄ…ce tytułów i opisĂłw dla wyszukiwania i wyglÄ…du spoĹ‚ecznoĹ›ciowego. %1$sDowiedz siÄ™ wiÄ™cej%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Generuj tytuĹ‚y i opisy za pomocÄ… Yoast AI!"],"New to %1$s":["Nowy w %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["AkceptujÄ™ %1$sWarunki korzystania z usĹ‚ugi%2$s i %3$sPolitykÄ™ prywatnoĹ›ci%4$s usĹ‚ugi Yoast AI. Obejmuje to zgodÄ™ na gromadzenie i wykorzystywanie danych w celu poprawy komfortu uĹĽytkowania."],"Start generating":["Rozpocznij generowanie"],"Yes, revoke consent":["Tak, cofnij zgodÄ™"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["CofniÄ™cie zgody spowoduje utratÄ™ dostÄ™pu do funkcji Yoast AI. Czy na pewno chcesz cofnąć swojÄ… zgodÄ™?"],"Something went wrong, please try again later.":["CoĹ› poszĹ‚o nie tak, sprĂłbuj ponownie później."],"Revoke AI consent":["CofniÄ™cie zgody AI"],"Please enter a focus keyphrase first to use AI.":["Aby uĹĽyć AI, wprowadĹş najpierw frazÄ™ kluczowÄ…."],"AI title generator":["Generator tytułów AI"],"AI description generator":["Generator opisĂłw AI"],"AI Twitter title generator":["Generator tytułów AI na Twitterze"],"AI Twitter description generator":["Generator opisĂłw AI na Twitterze"],"AI social title generator":["Generator tytułów spoĹ‚ecznoĹ›ciowych AI"],"AI social description generator":["Generator opisĂłw spoĹ‚ecznoĹ›ciowych AI"],"Twitter preview":["PodglÄ…d dla Twittera"],"Dismiss":["Ukryj"],"Don’t show again":["Nie pokazuj tego ponownie"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sWskazĂłwka%2$s: ZwiÄ™ksz dokĹ‚adność generowanych tytułów AI, piszÄ…c wiÄ™cej treĹ›ci na swojej stronie."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sWskazĂłwka%2$s: Popraw dokĹ‚adność wygenerowanych opisĂłw AI, piszÄ…c wiÄ™cej treĹ›ci na swojej stronie."],"Try again":["SprĂłbuj ponownie"],"Social preview":["PodglÄ…d spoĹ‚ecznoĹ›ciowy"],"Desktop result":["Wynik na komputerze"],"Mobile result":["Wynik na urzÄ…dzeniach mobilnych"],"Apply AI description":["Zastosuj opis AI"],"Apply AI title":["Zastosuj tytuĹ‚ AI"],"Next":["Dalej"],"Previous":["Poprzedni"],"Generate 5 more":["Wygeneruj 5 kolejnych"],"Google preview":["PodglÄ…d Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Ze wzglÄ™du na Ĺ›cisĹ‚e wytyczne etyczne OpenAI i %1$szasady uĹĽytkowania%2$s, nie jesteĹ›my w stanie wygenerować tytułów SEO dla tej strony. JeĹ›li zamierzasz korzystać ze sztucznej inteligencji, uprzejmie unikaj uĹĽywania treĹ›ci o charakterze jednoznacznym, brutalnym lub seksualnym. %3$sPrzeczytaj wiÄ™cej o tym, jak skonfigurować swojÄ… stronÄ™, aby uzyskać najlepsze wyniki z AI%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Ze wzglÄ™du na Ĺ›cisĹ‚e wytyczne etyczne OpenAI i %1$szasady uĹĽytkowania%2$s, nie jesteĹ›my w stanie wygenerować meta opisĂłw dla tej strony. JeĹ›li zamierzasz korzystać ze sztucznej inteligencji, uprzejmie unikaj uĹĽywania treĹ›ci o charakterze jednoznacznym, brutalnym lub seksualnym. %3$sPrzeczytaj wiÄ™cej o tym, jak skonfigurować swojÄ… stronÄ™, aby uzyskać najlepsze wyniki z AI%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Aby uzyskać dostÄ™p do tej funkcji, wymagana jest aktywna subskrypcja %1$s. NaleĹĽy %3$saktywować subskrypcjÄ™ w %2$s%4$s lub %5$suzyskać nowÄ… %1$s subskrypcjÄ™%6$s. NastÄ™pnie kliknij przycisk, aby odĹ›wieĹĽyć tÄ™ stronÄ™, aby funkcja dziaĹ‚aĹ‚a poprawnie, co moĹĽe potrwać do 30 sekund."],"Refresh page":["OdĹ›wieĹĽ stronÄ™"],"Not enough content":["Za maĹ‚o treĹ›ci"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["SprĂłbuj ponownie później. JeĹ›li problem nadal wystÄ™puje, %1$sskontaktuj siÄ™ z naszym zespoĹ‚em pomocy technicznej%2$s!"],"Something went wrong":["Ups... CoĹ› poszlo nie tak"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["WyglÄ…da na to, ĹĽe wystÄ…piĹ‚ limit czasu połączenia. SprawdĹş połączenie internetowe i sprĂłbuj ponownie później. JeĹ›li problem nie ustÄ…pi, %1$sskontaktuj siÄ™ z naszym zespoĹ‚em pomocy technicznej%2$s"],"Connection timeout":["Limit czasu połączenia"],"Use AI":["UĹĽyj AI"],"Close modal":["Zamknij modal"],"Learn more about AI (Opens in a new browser tab)":["Dowiedz siÄ™ wiÄ™cej o sztucznej inteligencji (Otwiera siÄ™ w nowej karcie przeglÄ…darki)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTitle%3$s: Twoja strona nie ma jeszcze tytuĹ‚u. %2$sDodaj tytuĹ‚%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTytuĹ‚%2$s: Twoja strona ma tytuĹ‚. Dobra robota!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sRozkĹ‚ad fraz kluczowych%3$s: %2$sUwzglÄ™dnij frazÄ™ kluczowÄ… lub jej synonimy w tekĹ›cie, aby sprawdzić jej rozkĹ‚ad%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sRozkĹ‚ad frazy kluczowej%2$s: Dobra robota!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sRozkĹ‚ad frazy kluczowej%3$s: NierĂłwny. NiektĂłre partie tekstu nie zawierajÄ… fraz kluczowych lub ich synonimĂłw. %2$sRozłóż je rĂłwnomiernie%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sRozkĹ‚ad frazy kluczowej%3$s: Bardzo nierĂłwny. DuĹĽe części tekstu nie zawierajÄ… frazy kluczowej lub jej synonimĂłw. %2$sRozłóż je rĂłwnomiernie%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: Nie uĹĽywasz zbyt wielu skomplikowanych słów, co sprawia, ĹĽe tekst jest Ĺ‚atwy do odczytania. Dobra robota!"],"Word complexity":["ZĹ‚oĹĽoność słów"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$ssĹ‚owa w tekĹ›cie sÄ… uwaĹĽane za zĹ‚oĹĽone. %3$sStaraj siÄ™ uĹĽywać krĂłtszych i bardziej znanych słów, aby poprawić czytelność%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sWyrĂłwnanie%3$s: Istnieje dĹ‚uga sekcja tekstu wyrĂłwnanego do Ĺ›rodka. %2$sZalecamy wyrĂłwnanie do lewej%3$s.","%1$sWyrĂłwnanie%3$s: IstniejÄ… %4$s dĹ‚ugie sekcje tekstu wyrĂłwnanego do Ĺ›rodka. %2$sZalecamy wyrĂłwnanie do lewej%3$s.","%1$sWyrĂłwnanie%3$s: Istnieje %4$s dĹ‚ugich sekcji tekstu wyrĂłwnanego do Ĺ›rodka. %2$sZalecamy wyrĂłwnanie do lewej%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sWyrĂłwnanie%3$s: Istnieje dĹ‚uga sekcja tekstu wyrĂłwnanego do Ĺ›rodka. %2$sZalecamy wyrĂłwnanie do prawej%3$s.","%1$sWyrĂłwnanie%3$s: IstniejÄ… %4$s dĹ‚ugie sekcje tekstu wyrĂłwnanego do Ĺ›rodka. %2$sZalecamy wyrĂłwnanie do prawej%3$s.","%1$sWyrĂłwnanie%3$s: Istnieje %4$s dĹ‚ugich sekcji tekstu wyrĂłwnanego do Ĺ›rodka. %2$sZalecamy wyrĂłwnanie do prawej%3$s."],"Select image":["Wybierz obrazek"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Czas dodać kilka linkĂłw! PoniĹĽej znajduje siÄ™ lista z kluczowymi treĹ›ciami. Pod kaĹĽdÄ… z nich znajdujÄ… siÄ™ sugestie dotyczÄ…ce artykułów, do ktĂłrych moĹĽna dodać link. DodajÄ…c link, upewnij siÄ™, ĹĽe wstawiasz go w odpowiednim zdaniu zwiÄ…zanym z artykuĹ‚em. Dodawaj linki z tylu powiÄ…zanych artykułów, ile potrzebujesz, aĹĽ kluczowe treĹ›ci miaĹ‚y najwiÄ™cej wewnÄ™trznych linkĂłw kierujÄ…cych do nich."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["NiektĂłre artykuĹ‚y na sÄ… %1$snajwaĹĽniejsze%2$s. OdpowiadajÄ… na pytania uĹĽytkownikĂłw i rozwiÄ…zujÄ… ich problemy. ZasĹ‚ugujÄ… wiÄ™c na wysokie pozycje! W %3$s nazywamy je kluczowymi treĹ›ciami. Jednym ze sposobĂłw na ich pozycje jest skierowanie do nich wystarczajÄ…cej liczby linkĂłw. WiÄ™cej linkĂłw sygnalizuje wyszukiwarkom, ĹĽe te artykuĹ‚y sÄ… waĹĽne i wartoĹ›ciowe. W tym treningu pomoĹĽemy ci dodać linki do twoich najwaĹĽniejszych artykułów!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Gdy dodasz nieco wiÄ™cej tekstu, bÄ™dziemy w stanie okreĹ›lić poziom jego formalnoĹ›ci."],"Overall, your text appears to be %1$s%3$s%2$s.":["OgĂłlnie rzecz biorÄ…c, tekst wyglÄ…da na %1$s%3$s%2$s."],"Heading %d":["Nagłówek %d"],"Maximum heading level":["Maksymalny poziom nagłówka"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Sugestie linkĂłw, ktĂłre sÄ… niezbÄ™dne do dziaĹ‚ania linkĂłw powiÄ…zanych, zostaĹ‚y wyłączone. JeĹ›li chcesz dodać powiÄ…zane linki, przejdĹş do funkcji witryny i włącz sugestie linkĂłw."],"Schema":["Schemat"],"Meta tags":["Meta tagi"],"Not available":["NiedostÄ™pne"],"Checks":["Sprawdzanie"],"Focus Keyphrase":["Fraza kluczowa"],"Good":["Dobre"],"No index":["No index"],"Front-end SEO inspector":["Inspektor SEO front-end"],"Focus keyphrase not set":["Nie ustawiono frazy kluczowej"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Uwaga: Aby ten trening dziaĹ‚aĹ‚ dobrze, musisz uruchomić narzÄ™dzie do optymalizacji danych SEO. Administratorzy mogÄ… je uruchomić w zakĹ‚adce %1$sSEO > NarzÄ™dzia%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Dodano linki do osieroconych artykułów i wyczyszczono te, ktĂłre nie miaĹ‚y juĹĽ znaczenia. Ĺšwietna robota! PoniĹĽej znajdziesz podsumowanie."],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Przeanalizuj zawartość tej listy i dokonaj niezbÄ™dnych aktualizacji. JeĹ›li potrzebujesz pomocy w aktualizacji, mamy bardzo %1$suĹĽyteczny wpis na blogu, ktĂłry moĹĽe poprowadzić ciÄ™ przez całą drogÄ™%2$s (kliknij, aby otworzyć w nowej karcie)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sPotrzebujesz wiÄ™cej wskazĂłwek? KaĹĽdy krok omĂłwiliĹ›my bardziej szczegółowo w poniĹĽszym przewodniku: %2$sJak wykorzystać trening %7$s osieroconych treĹ›ci%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["WĹ‚aĹ›nie sprawiĹ‚eĹ›, ĹĽe twoje najlepsze treĹ›ci sÄ… Ĺ‚atwe do znalezienia i wyĹĽej w rankingu! Brawo! Od czasu do czasu pamiÄ™taj, aby sprawdzić, czy treĹ›ci kluczowe zdobywajÄ… wystarczajÄ…cÄ… ilość linkĂłw!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Przyjrzyj siÄ™ poniĹĽszej liĹ›cie. Czy treĹ›ci kluczowe (oznaczone symbolem %1$s) majÄ… najwiÄ™cej linkĂłw wewnÄ™trznych skierowanych w ich stronÄ™? Kliknij przycisk Optymalizuj, jeĹ›li uwaĹĽasz, ĹĽe dana treść kluczowa potrzebuje wiÄ™cej linkĂłw. DziÄ™ki temu artykuĹ‚ zostanie przeniesiony do kolejnego kroku."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Czy wszystkie treĹ›ci kluczowe majÄ… zielone oznaczenie? Aby uzyskać najlepsze wyniki, rozwaĹĽ edycjÄ™ tych, ktĂłre nie majÄ…!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["KtĂłre artykuĹ‚y chcesz mieć najwyĹĽej w rankingu? KtĂłre z nich odbiorcy uznaliby za najbardziej przydatne i kompletne? Kliknij strzaĹ‚kÄ™ skierowanÄ… w dół i poszukaj artykułów, ktĂłre speĹ‚niajÄ… te kryteria. ArtykuĹ‚y, ktĂłre wybierzesz z listy, automatycznie oznaczymy jako treĹ›ci kluczowe."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sPotrzebujesz wiÄ™cej wskazĂłwek? KaĹĽdy krok omĂłwiliĹ›my bardziej szczegółowo w: %2$sJak korzystać z treningu %7$s treĹ›ci kluczowe%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Podstrony Yoast"],"Yoast Siblings":["RodzeĹ„stwo Yoast"],"Yoast Table of Contents":["Spis TreĹ›ci Yoast"],"Yoast Related Links":["Linki powiÄ…zane Yoast"],"Finish optimizing":["ZakoĹ„cz optymalizacjÄ™"],"You've finished adding links to this article.":["ZakoĹ„czono dodawanie linkĂłw do tego artykuĹ‚u."],"Optimize":["Optymalizuj"],"Added to next step":["Dodano do nastÄ™pnego kroku"],"Choose cornerstone articles...":["Wybierz treĹ›ci kluczowe…"],"Loading data...":["Ĺadowanie danych…"],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Nie wyczyĹ›ciĹ‚eĹ› jeszcze ani nie zaktualizowaĹ‚eĹ› ĹĽadnych artykułów za pomocÄ… tego treningu. Kiedy to zrobisz, pojawi siÄ™ tutaj podsumowanie pracy."],"Skipped":["PominiÄ™to"],"Hidden from search engines.":["Ukryte przed wyszukiwarkami."],"Removed":["UsuniÄ™to"],"Improved":["Ulepszone"],"Resolution":["Rozdzielczość"],"Loading redirect options...":["Ĺadowanie opcji przekierowania..."],"Remove and redirect":["UsuĹ„ i przekieruj"],"Custom url:":["WĹ‚asny adres url:"],"Related article:":["PowiÄ…zany artykuĹ‚:"],"Home page:":["Strona główna:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Zamierzasz usunąć %1$s%2$s%3$s. Aby zapobiec błędom 404 w witrynie, trzeba przekierować go na innÄ… stronÄ™. Gdzie chcesz jÄ… przekierować?"],"SEO Workout: Remove article":["Trening SEO: UsuĹ„ artykuĹ‚"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Wszystko wyglÄ…da dobrze! Nie znaleĹşliĹ›my ĹĽadnych artykułów, ktĂłre sÄ… starsze niĹĽ sześć miesiÄ™cy i otrzymujÄ… zbyt maĹ‚o linkĂłw. Wróć tu później po nowe sugestie!"],"Hide from search engines":["Ukryj siÄ™ przed wyszukiwarkami"],"Improve":["Ulepsz"],"Are you sure you wish to hide this article from search engines?":["Czy na pewno chcesz ukryć ten artykuĹ‚ przed wyszukiwarkami?"],"Action":["Akcja"],"You've hidden this article from search engines.":["Ukryto ten artykuĹ‚ przed wyszukiwarkami."],"You've removed this article.":["UsuniÄ™to ten artykuĹ‚."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Nie wybrano jeszcze ĹĽadnych artykułów do poprawy. Wybierz kilka artykułów w poprzednich krokach, do ktĂłrych chcesz dodać linki, a my pokaĹĽemy propozycje linkĂłw."],"Loading link suggestions...":["Ĺadowanie propozycji linkĂłw..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Nie znaleĹşliĹ›my ĹĽadnych sugestii dotyczÄ…cych tego artykuĹ‚u, ale oczywiĹ›cie moĹĽesz dodać linki do artykułów, ktĂłre sÄ… z nim powiÄ…zane."],"Skip":["PomiĹ„"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Nie wybrano jeszcze ĹĽadnych artykułów do tego kroku. MoĹĽesz to zrobić w poprzednim kroku."],"Is it up-to-date?":["Czy jest on aktualny?"],"Last Updated":["Ostatnia aktualizacja"],"You've moved this article to the next step.":["Przeniesiono ten artykuĹ‚ do nastÄ™pnego kroku."],"Unknown":["Nieznany"],"Clear summary":["Wyczyść podsumowanie"],"Add internal links towards your orphaned articles.":["Dodaj wewnÄ™trzne linki do osieroconych artykułów."],"Should you update your article?":["Czy trzeba zaktualizować artykuĹ‚?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Witryna zawiera wiele treĹ›ci, ktĂłre zostaĹ‚y stworzone raz i nigdy później do nich nie wracano. WaĹĽne jest, aby przejrzeć je i zadać sobie pytanie, czy te treĹ›ci sÄ… nadal istotne. Czy trzeba jÄ… poprawić, czy usunąć?"],"Start: Love it or leave it?":["Start: Zostawić czy usunąć?"],"Clean up your unlinked content to make sure people can find it":["UporzÄ…dkuj swoje niepowiÄ…zane treĹ›ci, aby upewnić siÄ™, ĹĽe ludzie mogÄ… je znaleźć"],"I've finished this workout":["SkoĹ„czyĹ‚em ten trening"],"Reset this workout":["Zresetuj ten trening"],"Well done!":["Ĺšwietnie!"],"Add internal links towards your cornerstones":["Dodaj linki wewnÄ™trzne do kluczowych treĹ›ci"],"Check the number of incoming internal links of your cornerstones":["SprawdĹş liczbÄ™ przychodzÄ…cych linkĂłw wewnÄ™trznych swoich kluczowych treĹ›ci"],"Start: Choose your cornerstones!":["Zacznij: Wybierz swoje kluczowe treĹ›ci!"],"The cornerstone approach":["PodejĹ›cie oparte na kluczowych treĹ›ciach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Uwaga: Aby ten trening dziaĹ‚aĹ‚ dobrze i mĂłgĹ‚ zaoferować sugestie dotyczÄ…ce linkowania, musisz uruchomić narzÄ™dzie do optymalizacji danych SEO. Administratorzy mogÄ… je uruchomić w %1$sSEO > NarzÄ™dzia%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Etap zakoĹ„czony"],"Revise this step":["PowtĂłrz ten krok"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Nie udaĹ‚o nam siÄ™ znaleźć linkĂłw wewnÄ™trznych. Albo nie dodano jeszcze ĹĽadnych linkĂłw wewnÄ™trznych do treĹ›ci, albo Yoast SEO ich nie zaindeksowaĹ‚o. MoĹĽesz zlecić Yoast SEO indeksowanie linkĂłw, uruchamiajÄ…c optymalizacjÄ™ danych SEO w sekcji SEO > NarzÄ™dzia."],"Incoming links":["Linki przychodzÄ…ce"],"Edit to add link":["Edytuj, aby dodać link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Obecnie nie masz ĹĽadnych artykułów oznaczonych jako kluczowe treĹ›ci. Kiedy oznaczysz swoje artykuĹ‚y jako kluczowe treĹ›ci, pojawiÄ… siÄ™ one tutaj."],"Focus keyphrase":["Fraza kluczowa"],"Article":["ArtykuĹ‚"],"Readability score":["Ocena czytelnoĹ›ci"],"SEO score":["Ocena SEO"],"Copy failed":["Kopiowanie nie powiodĹ‚o siÄ™"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Poprawiaj rankingi dla wszystkich swoich kluczowych treĹ›ci, korzystajÄ…c z tego %1$streningu krok po kroku%2$s!"],"Rank with articles you want to rank with":["Pozycjonuj artykuĹ‚y, ktĂłre sÄ… najwaĹĽniejsze"],"Descriptive text":["Opis"],"Show the descriptive text":["PokaĹĽ opis"],"Show icon":["PokaĹĽ ikonÄ™"],"Yoast Estimated Reading Time":["Szacowany Czas Czytania Yoast"],"Shows an estimated reading time based on the content length.":["Pokazuje szacowany czas czytania na podstawie dĹ‚ugoĹ›ci zawartoĹ›ci."],"reading time":["czas czytania"],"content length":["dĹ‚ugość zawartoĹ›ci"],"Estimated reading time:":["Szacowany czas czytania:"],"minute":["minuta","minuty","minut"],"Settings":["Ustawienia"],"OK":["OK"],"Close":["Zamknij"],"Type":["Rodzaj"],"Orphaned content":["Osierocone treĹ›ci"],"Synonyms":["Synonimy"],"Internal linking suggestions":["Sugestie linkowania wewnÄ™trznego"],"Enter a related keyphrase to calculate the SEO score":["WprowadĹş powiÄ…zanÄ… frazÄ™ kluczowÄ… do kalkulacji oceny SEO"],"Related keyphrase":["PowiÄ…zana fraza kluczowa"],"Add related keyphrase":["Dodaj podobnÄ… frazÄ™ kluczowÄ…"],"Analysis results":["Wyniki analizy"],"Help on choosing the perfect keyphrase":["Pomoc w wyborze najlepszej frazy kluczowej"],"Help on keyphrase synonyms":["Pomoc w doborze frazy kluczowej synonimĂłw"],"Keyphrase":["Fraza kluczowa"],"New URL: {{link}}%s{{/link}}":["Nowy URL: {{link}}%s{{/link}}"],"Undo":["Cofnij"],"Redirect created":["Przekierowanie utworzone"],"%s just created a redirect from the old URL to the new URL.":["%s przekierowanie ze starego adresu URL do nowego, zostaĹ‚o utworzone pomyĹ›lnie."],"Old URL: {{link}}%s{{/link}}":["Stary URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Synonimy frazy kluczowej"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["PodglÄ…d udostÄ™pnieĹ„ na Twitterze"],"Adds a list of internal links to sibling pages which share the same parent.":["Dodaje listÄ™ wewnÄ™trznych linkĂłw do stron podrzÄ™dnych, ktĂłre majÄ… tÄ™ samÄ… stronÄ™ nadrzÄ™dnÄ…."],"siblings":["pokrewne"],"sibling pages":["strony pokrewne"],"Adds a list of internal links to subpages of this page.":["Dodaje listÄ™ linkĂłw wewnÄ™trznych do podstron tej strony."],"seo":["seo"],"subpages":["podstrony"],"childpages":["strony podrzÄ™dne"],"children":["podrzÄ™dne"],"internal linking":["WewnÄ™trzne linkowanie"],"site structure":["Struktura witryny"],"We could not find any relevant articles on your website that you could link to from your post.":["Nie mogliĹ›my znaleźć ĹĽadnych istotnych artykułów w twojej witrynie, do ktĂłrych moĹĽna by byĹ‚o wstawić odnoĹ›niki w tym wpisie."],"Load suggestions":["Sugestie dotyczÄ…ce obciÄ…ĹĽenia"],"Refresh suggestions":["Sugestie dotyczÄ…ce odĹ›wieĹĽenia"],"Write list…":["Napisz listÄ™..."],"Adds a list of links related to this page.":["Dodaje listÄ™ linkĂłw zwiÄ…zanych z tÄ… stronÄ…."],"related posts":["posty powiÄ…zane"],"related pages":["strony powiÄ…zane"],"Adds a table of contents to this page.":["Dodaje spis treĹ›ci do tej strony."],"links":["linki"],"toc":["spis treĹ›ci"],"Copy link":["Skopiuj link"],"Copy link to suggested article: %s":["Skopiuj link do sugerowanego artykuĹ‚u: %s"],"Add a title to your post for the best internal linking suggestions.":["Dodaj tytuĹ‚ do swojego postu, aby uzyskać najlepsze sugestie dotyczÄ…ce linkowania wewnÄ™trznego."],"Add a metadescription to your post for the best internal linking suggestions.":["Dodaj metaopis do swojego postu, aby uzyskać najlepsze sugestie dotyczÄ…ce linkowania wewnÄ™trznego."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Dodaj tytuĹ‚ i metaopis do swojego postu, aby uzyskać najlepsze sugestie dotyczÄ…ce linkowania wewnÄ™trznego."],"Also, add a title to your post for the best internal linking suggestions.":["Dodaj rĂłwnieĹĽ tytuĹ‚ do swojego postu, aby uzyskać najlepsze sugestie dotyczÄ…ce linkowania wewnÄ™trznego."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Dodaj rĂłwnieĹĽ metaopis do swojego postu, aby uzyskać najlepsze sugestie dotyczÄ…ce linkowania wewnÄ™trznego."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Dodaj rĂłwnieĹĽ tytuĹ‚ i opis do swojego postu, aby uzyskać najlepsze sugestie dotyczÄ…ce linkowania wewnÄ™trznego."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Kiedy dodasz nieco wiÄ™cej tekstu, otrzymasz listÄ™ powiÄ…zanych treĹ›ci, do ktĂłrych bÄ™dziesz mĂłgĹ‚ zamieĹ›cić link w swoim poĹ›cie."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Aby poprawić strukturÄ™ swojej witryny, rozwaĹĽ linkowanie do innych istotnych postĂłw lub stron na swojej stronie."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["To zajmie kilka sekund, aby pokazać Ci listÄ™ powiÄ…zanych treĹ›ci, do ktĂłrych mĂłgĹ‚byĹ› zamieĹ›cić link. Propozycje zostanÄ… wyĹ›wietlone tutaj, jak tylko bÄ™dziemy je mieli."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Przeczytaj nasz przewodnik na temat wewnÄ™trznego linkowania dla celĂłw SEO{{/a}} aby dowiedzieć siÄ™ wiÄ™cej."],"Copied!":["Skopiowano!"],"Not supported!":["Brak wsparcia!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["PrĂłbujesz uĹĽyć wielu powiÄ…zanych fraz kluczowych? PowinieneĹ› dodać je osobno."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Twoja fraza kluczowa jest za dĹ‚uga. Powinna mieć maksymalnie 191 znakĂłw."],"Add as related keyphrase":["Dodaj jako powiÄ…zanÄ… frazÄ™ kluczowÄ…"],"Added!":["Dodano!"],"Remove":["UsuĹ„"],"Table of contents":["Tabela zawartoĹ›ci"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Musimy zoptymalizować dane SEO Twojej strony, abyĹ›my mogli zaproponować najlepsze %1$spropozycje linkowania%2$s.\n\n%3$sRozpocznij optymalizacjÄ™ danych SEO%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-pt_BR.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-pt_BR.json deleted file mode 100644 index 08e8e30f..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-pt_BR.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=(n > 1);","lang":"pt_BR"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Para acessar esse recurso, vocĂŞ precisa de assinaturas ativas de %2$s e %3$s. Por favor %5$sative suas assinaturas em %1$s%6$s ou %7$sobtenha um novo %4$s%8$s. Depois, atualize esta página para que o recurso funcione corretamente, o que pode levar atĂ© 30 segundos."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["O gerador de tĂ­tulos de IA requer que a análise de SEO seja habilitada antes do uso. Para habilitá-lo, navegue atĂ© %2$sRecursos do site %1$s%3$s, ative a análise de SEO e clique em 'Salvar alterações'. Se a análise SEO estiver desabilitada no seu perfil de usuário do WordPress, acesse o seu perfil e habilite-o lá. Entre em contato com seu administrador se vocĂŞ nĂŁo tiver acesso a essas configurações."],"Social share preview":["Visualização de compartilhamento social"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Para continuar usando o recurso Yoast AI, reduza a frequĂŞncia de suas solicitações. Nosso %1$sartigo de ajuda%2$s fornece orientação sobre como planejar e acompanhar com eficiĂŞncia suas solicitações para um fluxo de trabalho otimizado."],"You've reached the Yoast AI rate limit.":["VocĂŞ atingiu o limite de taxa do Yoast AI."],"Allow":["Permitir"],"Deny":["Negar"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Para ver este vĂ­deo, vocĂŞ precisa permitir que %1$s carregue vĂ­deos incorporados de %2$s."],"Text generated by AI may be offensive or inaccurate.":["O texto gerado pela IA pode ser ofensivo ou impreciso."],"(Opens in a new browser tab)":["(Abre numa nova aba do navegador)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Acelere seu fluxo de trabalho com IA generativa. Obtenha sugestões de tĂ­tulos e descrições de alta qualidade para sua pesquisa e aparĂŞncia social. %1$sSaiba mais%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Gere tĂ­tulos e descrições com Yoast AI!"],"New to %1$s":["Novo em %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Eu aprovo os %1$stermos de serviço%2$s e a %3$spolĂ­tica de privacidade%4$s do serviço Yoast AI. Isto inclui consentir na recolha e utilização de dados para melhorar a experiĂŞncia do utilizador."],"Start generating":["Comece a gerar"],"Yes, revoke consent":["Sim, revogar o consentimento"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Ao revogar seu consentimento, vocĂŞ nĂŁo terá mais acesso aos recursos do Yoast AI. Tem certeza de que deseja revogar seu consentimento?"],"Something went wrong, please try again later.":["Algo deu errado. Tente novamente mais tarde."],"Revoke AI consent":["Revogar o consentimento da IA"],"Please enter a focus keyphrase first to use AI.":["Insira uma frase-chave de foco primeiro para usar IA."],"AI title generator":["Gerador de tĂ­tulos de IA"],"AI description generator":["Gerador de descrição de IA"],"AI Twitter title generator":["Gerador de tĂ­tulos AI para Twitter"],"AI Twitter description generator":["Gerador de descrição AI do Twitter"],"AI social title generator":["Gerador de tĂ­tulos sociais de IA"],"AI social description generator":["Gerador de descrição social de IA"],"Twitter preview":["PrĂ©-visualização do Twitter"],"Dismiss":["Ignorar"],"Don’t show again":["NĂŁo mostre novamente"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sDica%2$s: melhore a precisĂŁo dos tĂ­tulos de IA gerados escrevendo mais conteĂşdo em sua página."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sDica%2$s: melhore a precisĂŁo das descrições de IA geradas escrevendo mais conteĂşdo em sua página."],"Try again":["Tentar novamente"],"Social preview":["Visualização social"],"Desktop result":["Resultado para computadores"],"Mobile result":["Resultado para dispositivos mĂłveis"],"Apply AI description":["Aplicar descrição de IA"],"Apply AI title":["Aplicar tĂ­tulo de IA"],"Next":["PrĂłximo"],"Previous":["Anterior"],"Generate 5 more":["Gere mais 5"],"Google preview":["PrĂ©-visualização no Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Devido Ă s rĂ­gidas diretrizes Ă©ticas da OpenAI e Ă s %1$spolĂ­ticas de uso%2$s, nĂŁo podemos gerar tĂ­tulos SEO para sua página. Se vocĂŞ pretende usar IA, evite o uso de conteĂşdo explĂ­cito, violento ou sexualmente explĂ­cito. %3$sLeia mais sobre como configurar sua página para garantir os melhores resultados com IA%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Devido Ă s rĂ­gidas diretrizes Ă©ticas da OpenAI e Ă s %1$spolĂ­ticas de uso%2$s, nĂŁo podemos gerar meta descrições para sua página. Se vocĂŞ pretende usar IA, evite o uso de conteĂşdo explĂ­cito, violento ou sexualmente explĂ­cito. %3$sLeia mais sobre como configurar sua página para garantir os melhores resultados com IA%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Para acessar esse recurso, vocĂŞ precisa de uma assinatura %1$s ativa. Por favor %3$sative sua assinatura em %2$s%4$s ou %5$sobtenha uma nova assinatura %1$s%6$s. Em seguida, clique no botĂŁo para atualizar esta página para que o recurso funcione corretamente, o que pode levar atĂ© 30 segundos."],"Refresh page":["Atualizar a página"],"Not enough content":["ConteĂşdo insuficiente"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Por favor, tente novamente mais tarde. Se o problema persistir, %1$sentre em contato com nossa equipe de suporte%2$s!"],"Something went wrong":["Algo deu errado"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Parece que ocorreu um tempo limite de conexĂŁo. Verifique sua conexĂŁo com a Internet e tente novamente mais tarde. Se o problema persistir, %1$sentre em contato com nossa equipe de suporte%2$s"],"Connection timeout":["Tempo limite de conexĂŁo"],"Use AI":["Usar IA"],"Close modal":["Fechar modal"],"Learn more about AI (Opens in a new browser tab)":["Saiba mais sobre IA (abre em uma nova guia do navegador)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTĂ­tulo%3$s: Sua página ainda nĂŁo tem um tĂ­tulo. %2$sAdicione um%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTĂ­tulo%2$s: Sua página tem um tĂ­tulo. Bom trabalho!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sDistribuição da frase-chave%3$s: %2$sInclua sua frase-chave, ou sinĂ´nimos dela, no texto para verificar a distribuição da frase-chave%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sDistribuição de frase-chave%2$s: Bom trabalho!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistruibuição de frase-chave%3$s: Desigual. Algumas partes do seu texto nĂŁo contĂ©m a frase-chave ou algum sinĂ´nimo. %2$sMelhore sua distribuição no texto todo%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuição da frase-chave%3$s: Muito desigual. Boa parte do seu texto nĂŁo contĂ©m a frase-chave ou sinĂ´nimos dela. %2$sFaça uma melhor distribuição%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: VocĂŞ nĂŁo está usando muitas palavras complexas, o que facilita a leitura do seu texto. Bom trabalho!"],"Word complexity":["Complexidade da palavra"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s das palavras em seu texto sĂŁo consideradas complexas. %3$sTente usar palavras mais curtas e familiares para melhorar a legibilidade%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sAlinhamento%3$s: Há uma longa seção de texto centralizado. %2$sRecomendamos deixá-lo alinhado Ă  esquerda%3$s.","%1$sAlinhamento%3$s: Há %4$s longas seções de texto alinhado ao centro. %2$sRecomendamos deixá-los alinhados Ă  esquerda%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sAlinhamento%3$s: Há uma longa seção de texto centralizado. %2$sRecomendamos deixá-lo alinhado Ă  direita%3$s.","%1$sAlinhamento%3$s: Há %4$s longas seções de texto alinhado ao centro. %2$sRecomendamos deixá-los alinhados Ă  direita%3$s."],"Select image":["Selecione a imagem"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Hora de adicionar alguns links! Abaixo, vocĂŞ vĂŞ uma lista com seus pilares. Sob cada pedra angular, há sugestões de artigos dos quais vocĂŞ pode adicionar um link. Ao adicionar o link, certifique-se de inseri-lo em uma frase relevante relacionada ao seu artigo fundamental. Continue adicionando links de quantos artigos relacionados vocĂŞ precisar, atĂ© que seus pilares tenham o máximo de links internos apontando para eles."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Alguns artigos do seu site sĂŁo %1$sos%2$s mais importantes. Eles respondem Ă s perguntas das pessoas e resolvem seus problemas. EntĂŁo, eles merecem classificação! Em %3$s, chamamos esses artigos fundamentais. Uma das maneiras de classificá-los Ă© apontar links suficientes para eles. Mais links sinalizam para os mecanismos de pesquisa que esses artigos sĂŁo importantes e valiosos. Neste exercĂ­cio, ajudaremos vocĂŞ a adicionar links aos seus artigos fundamentais!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Depois de adicionar um pouco mais de texto, poderemos informar o nĂ­vel de formalidade do seu texto."],"Overall, your text appears to be %1$s%3$s%2$s.":["No geral, seu texto parece ser %1$s%3$s%2$s."],"Heading %d":["TĂ­tulo %d"],"Maximum heading level":["NĂ­vel máximo de tĂ­tulo"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["VocĂŞ desativou as sugestões de links, necessárias para que os links relacionados funcionem. Se vocĂŞ deseja adicionar links relacionados, acesse Recursos do site e ative as sugestões de links."],"Schema":["Esquema"],"Meta tags":["Meta tags"],"Not available":["IndisponĂ­vel"],"Checks":["Marcações"],"Focus Keyphrase":["Frase-chave de foco"],"Good":["Bom"],"No index":["NĂŁo indexar"],"Front-end SEO inspector":["Inspetor SEO"],"Focus keyphrase not set":["Frase-chave em foco nĂŁo definida."],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Observação: para que este treino funcione bem, vocĂŞ precisa executar a ferramenta de otimização de dados de SEO. Os administradores podem executar isso em %1$sSEO > Ferramentas%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["VocĂŞ adicionou links aos seus artigos ĂłrfĂŁos e limpou os que nĂŁo eram mais relevantes. Bom trabalho! DĂŞ uma olhada no resumo abaixo e comemore o que vocĂŞ realizou!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sPrecisa de mais orientação? Cobrimos cada etapa com mais detalhes no guia a seguir: %2$sComo usar o %7$s treino de conteĂşdo ĂłrfĂŁo%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["VocĂŞ acabou de tornar seu melhor conteĂşdo fácil de encontrar e com maior probabilidade de classificação! Caminho a percorrer! De tempos em tempos, lembre-se de verificar se seus pilares estĂŁo recebendo links suficientes!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["DĂŞ uma olhada na lista abaixo. Seus pilares (marcados com %1$s) tĂŞm mais links internos apontando para eles? Clique no botĂŁo Otimizar se achar que uma base precisa de mais links. Isso moverá o artigo para a prĂłxima etapa."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Todas as suas pedras angulares tĂŞm balas verdes? Para obter os melhores resultados, considere editar os que nĂŁo funcionam!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Quais artigos vocĂŞ deseja classificar mais alto? Quais seriam os mais Ăşteis e completos para o seu pĂşblico ? Clique na seta apontando para baixo e procure artigos que atendam a esses critĂ©rios. Marcaremos automaticamente os artigos que vocĂŞ selecionar na lista como base."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sPrecisa de mais orientação? Cobrimos cada etapa com mais detalhes em: %2$sComo usar o treino básico do %7$s%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Subpáginas Yoast"],"Yoast Siblings":["IrmĂŁos Yoast"],"Yoast Table of Contents":["ĂŤndice Yoast"],"Yoast Related Links":["Links Relacionados Yoast"],"Finish optimizing":["Otimização Finalizada"],"You've finished adding links to this article.":["VocĂŞ terminou de adicionar links a este artigo."],"Optimize":["Otimize"],"Added to next step":["Adicionado ao prĂłximo passo."],"Choose cornerstone articles...":["Escolha os artigos fundamentais..."],"Loading data...":["Carregando dados..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["VocĂŞ ainda nĂŁo limpou ou atualizou nenhum artigo usando este exercĂ­cio. Depois de fazer isso, um resumo do seu trabalho aparecerá aqui."],"Skipped":["Pulou"],"Hidden from search engines.":["Oculto nos motores de busca."],"Removed":["Removido"],"Improved":["Aperfeiçoado"],"Resolution":["Resolução"],"Loading redirect options...":["Carregando opções de redirecionamento..."],"Remove and redirect":["Remover e redirecionar"],"Custom url:":["URL personalizado:"],"Related article:":["Artigo relacionado:"],"Home page:":["Pagina inicial:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["VocĂŞ está prestes a remover %1$s%2$s%3$s. Para evitar erros 404 em seu site, vocĂŞ deve redirecioná-lo para outra página em seu site. Para onde vocĂŞ gostaria de redirecioná-lo?"],"SEO Workout: Remove article":["ExercĂ­cio de SEO: Remover artigo"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Está tudo bem! NĂŁo encontramos nenhum artigo em seu site com mais de seis meses e recebemos poucos links em seu site. Volte aqui mais tarde para novas sugestões de limpeza!"],"Hide from search engines":["Esconder dos motores de busca"],"Improve":["Aperfeiçoar"],"Are you sure you wish to hide this article from search engines?":["Tem certeza de que deseja ocultar este artigo dos mecanismos de pesquisa?"],"Action":["Ação"],"You've hidden this article from search engines.":["VocĂŞ escondeu este artigo dos motores de busca."],"You've removed this article.":["VocĂŞ removeu este artigo."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["No momento , vocĂŞ nĂŁo selecionou nenhum artigo para melhorar. Selecione alguns artigos nas etapas anteriores para adicionar links e mostraremos sugestões de links aqui."],"Loading link suggestions...":["Carregando sugestões de links..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["NĂŁo encontramos nenhuma sugestĂŁo para este artigo, mas Ă© claro que vocĂŞ ainda pode adicionar links para artigos que vocĂŞ acha que estĂŁo relacionados."],"Skip":["Pular"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["VocĂŞ ainda nĂŁo selecionou nenhum artigo para esta etapa. VocĂŞ pode fazer isso na etapa anterior."],"Is it up-to-date?":["Está atualizado?"],"Last Updated":["Ăšltima atualização"],"You've moved this article to the next step.":["VocĂŞ moveu este artigo para a prĂłxima etapa."],"Unknown":["Desconhecido"],"Clear summary":["Resumo claro"],"Add internal links towards your orphaned articles.":["Adicione links internos para seus artigos ĂłrfĂŁos."],"Should you update your article?":["VocĂŞ deve atualizar seu artigo?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Seu site pode conter muito conteĂşdo que vocĂŞ criou uma vez e nunca mais olhou para ele desde entĂŁo. É importante passar por essas páginas e se perguntar se esse conteĂşdo ainda Ă© relevante para o seu site. VocĂŞ deve melhorá-lo ou removĂŞ-lo?"],"Start: Love it or leave it?":["Iniciar: amou ou abandonou?"],"Clean up your unlinked content to make sure people can find it":["Limpe seu conteĂşdo desvinculado para garantir que as pessoas possam encontrá-lo"],"I've finished this workout":["Eu terminei este treino"],"Reset this workout":["Reinicie este treino"],"Well done!":["Bem feito!"],"Add internal links towards your cornerstones":["Adicione links internos para seus cornerstones"],"Check the number of incoming internal links of your cornerstones":["Verifique o nĂşmero de links internos de entrada de seus cornerstones"],"Start: Choose your cornerstones!":["Comece: escolha seus cornerstones!"],"The cornerstone approach":["A abordagem da pedra angular"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Observação : para que este treino funcione bem e ofereça sugestões de links, vocĂŞ precisa executar a ferramenta de otimização de dados de SEO . Os administradores podem executar isso em %1$sSEO > Ferramentas%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Eu terminei esta etapa"],"Revise this step":["Revise esta etapa"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["NĂŁo foi possĂ­vel encontrar links internos em suas páginas. Ou vocĂŞ ainda nĂŁo adicionou links internos ao seu conteĂşdo ou o Yoast SEO nĂŁo os indexou. VocĂŞ pode fazer com que o Yoast SEO indexe seus links executando a otimização de dados de SEO em SEO > Ferramentas."],"Incoming links":["Links de entrada"],"Edit to add link":["Edite para adicionar link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["No momento, vocĂŞ nĂŁo tem artigos marcados como pedra angular. Quando vocĂŞ marca seus artigos como pedra angular, eles aparecerĂŁo aqui."],"Focus keyphrase":["Frase-chave de foco"],"Article":["Artigo"],"Readability score":["Pontuação de legibilidade"],"SEO score":["Pontuação de SEO"],"Copy failed":["CĂłpia falhou"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Melhore as classificações de todos os seus pilares usando este %1$streino passo a passo!%2$s"],"Rank with articles you want to rank with":["Classifique com os artigos que vocĂŞ deseja classificar"],"Descriptive text":["Texto descritivo"],"Show the descriptive text":["Mostra o texto descritivo"],"Show icon":["Mostrar ĂŤcone"],"Yoast Estimated Reading Time":["Tempo estimado de leitura do Yoast"],"Shows an estimated reading time based on the content length.":["Mostra um tempo estimado de leitura com base no comprimento do conteĂşdo."],"reading time":["tempo de leitura"],"content length":["Comprimento do conteĂşdo"],"Estimated reading time:":["Tempo estimado de leitura:"],"minute":["minuto","minutos"],"Settings":["Configurações"],"OK":["OK"],"Close":["Fechar"],"Type":["Tipo"],"Orphaned content":["ConteĂşdo ĂłrfĂŁo "],"Synonyms":["SinĂ´nimos"],"Internal linking suggestions":["SugestĂŁo de links internos"],"Enter a related keyphrase to calculate the SEO score":["Digite uma palavra-chave relacionado para calcular a pontuação de SEO"],"Related keyphrase":["Frase-chave relacionada"],"Add related keyphrase":["Adicionar frase-chave relacionada"],"Analysis results":["Resultado da análise"],"Help on choosing the perfect keyphrase":["Ajude a escolher as palavras-chave perfeitas"],"Help on keyphrase synonyms":["Ajude em sinĂ´nimos de palavras-chave"],"Keyphrase":["Frase-chave"],"New URL: {{link}}%s{{/link}}":["Nova URL: {{link}}%s{{/link}}"],"Undo":["Desfazer"],"Redirect created":["Redirecionamento criado"],"%s just created a redirect from the old URL to the new URL.":["%s acabou de criar um redirecionamento da URL antigo para uma nova URL."],"Old URL: {{link}}%s{{/link}}":["URL antigo: {{link}}%s{{/link}}"],"Keyphrase synonyms":["SinĂłnimos da frase chave"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Visualização de compartilhamento do Twitter"],"Adds a list of internal links to sibling pages which share the same parent.":["Adiciona uma lista de links internos para páginas irmĂŁs que compartilham a página pai."],"siblings":["irmĂŁs"],"sibling pages":["Páginas irmĂŁs"],"Adds a list of internal links to subpages of this page.":["Adiciona uma lista de links internos Ă s subpáginas desta página."],"seo":["SEO"],"subpages":["subpáginas"],"childpages":["páginas filho"],"children":["filhos"],"internal linking":["linkagem interna"],"site structure":["estrutura do site"],"We could not find any relevant articles on your website that you could link to from your post.":["NĂŁo foi possĂ­vel encontrar nenhum artigo relevante no seu website que vocĂŞ possa vincular a partir de sua postagem."],"Load suggestions":["Carregar sugestões"],"Refresh suggestions":["Atualizar sugestões"],"Write list…":["Escrever lista..."],"Adds a list of links related to this page.":["Adiciona uma lista de links relacionados a essa página"],"related posts":["publicações relacionadas"],"related pages":["páginas relacionads"],"Adds a table of contents to this page.":["Adiciona uma tabela de conteĂşdo a esta página."],"links":["links"],"toc":["toc"],"Copy link":["Copiar link"],"Copy link to suggested article: %s":["Copiar link para artigos sugeridos: %s"],"Add a title to your post for the best internal linking suggestions.":["Adicione um tĂ­tulo ao seu post para obter as melhores sugestões de links internos."],"Add a metadescription to your post for the best internal linking suggestions.":["Adicione uma meta descrição ao seu post para obter as melhores sugestões de links internos."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Adicione um tĂ­tulo e uma meta descrição Ă  sua postagem para obter as melhores sugestões de links internos."],"Also, add a title to your post for the best internal linking suggestions.":["AlĂ©m disso, adicione um tĂ­tulo ao seu post para obter as melhores sugestões de links internos."],"Also, add a metadescription to your post for the best internal linking suggestions.":["AlĂ©m disso, adicione uma meta descrição Ă  sua postagem para obter as melhores sugestões de links internos."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["AlĂ©m disso, adicione um tĂ­tulo e uma meta descrição Ă  sua postagem para obter as melhores sugestões de links internos."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Depois de adicionar um pouco mais de cĂłpia, forneceremos uma lista de conteĂşdo relacionado aqui para o qual vocĂŞ pode criar um link em sua postagem."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Para melhorar a estrutura do seu site, considere linkar para outros posts ou páginas erlevantes no seu website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Leva alguns segundos para mostrar uma lista de conteĂşdo relacionado ao qual vocĂŞ pode criar um link. As sugestões serĂŁo mostradas aqui assim que as tivermos."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}} Leia nosso guia sobre links internos para SEO {{/ a}} para saber mais."],"Copied!":["Copiado!"],"Not supported!":["NĂŁo suportado!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Está tentando usar mĂşltiplas palavras-frase relacionadas? VocĂŞ deve adicionar elas separadamente."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Sua frase-chave Ă© muito longa. Pode ter no máximo 191 caracteres."],"Add as related keyphrase":["Adicionar como uma palavra chave relacionada"],"Added!":["Adicionado!"],"Remove":["Remover"],"Table of contents":["Tabela de conteĂşdos"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Precisamos otimizar os dados de SEO do seu site para que possamos oferecer as melhores %1$ssugestões de linking%2$s.\n\n%3$sIniciar otimização de dados SEO%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-pt_PT.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-pt_PT.json deleted file mode 100644 index e94e6121..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-pt_PT.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"pt"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Para aceder a esta funcionalidade, precisa das subscrições %2$s e %3$s activas. Por favor, %5$sactive as suas subscrições em %1$s%6$s ou %7$sobtenha uma nova %4$s%8$s. De seguida, actualize esta página para que funcione correctamente, o que poderá demorar atĂ© 30 segundos."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["O gerador de tĂ­tulos AI requer que a análise SEO seja activada antes de ser utilizada. Para a activar, navegue atĂ© Ă s %2$sFuncionalidades do site de %1$s%3$s, active a análise de SEO e clique em \"Guardar alterações\". Se a análise de SEO estiver desactivada no seu perfil de utilizador do WordPress, aceda ao seu perfil e active-a aĂ­. Contacte o seu administrador se nĂŁo tiver acesso a estas definições."],"Social share preview":["PrĂ©-visualização de partilha social"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Para continuar a usar a funcionalidade de IA do Yoast, reduza a frequĂŞncia dos seus pedidos. O nosso %1$sartigo de ajuda%2$s fornece orientações sobre como planear e definir o ritmo dos seus pedidos de forma eficaz para um fluxo de trabalho optimizado."],"You've reached the Yoast AI rate limit.":["Atingiu o limite da taxa de IA do Yoast."],"Allow":["Permitir"],"Deny":["Recusar"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Para ver este vĂ­deo, o %1$s precisa de permissĂŁo para carregar vĂ­deos incorporados a partir de %2$s."],"Text generated by AI may be offensive or inaccurate.":["O texto gerado pela IA pode ser ofensivo ou impreciso."],"(Opens in a new browser tab)":["(Abrir num novo separador)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Acelere o seu fluxo de trabalho com IA generativa. Obtenha sugestões de tĂ­tulos e descrições de alta qualidade para a sua apresentação da pesquisa e nas redes sociais. %1$sSaiba mais%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Gere tĂ­tulos e descrições com a IA do Yoast!"],"New to %1$s":["Novo no %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Aprovo os %1$sTermos do serviço%2$s e %3$sPolĂ­tica de privacidade%4$s do serviço de IA do Yoast. Isto inclui o consentimento para a recolha e utilização de dados para melhorar a experiĂŞncia do utilizador."],"Start generating":["Começar a gerar"],"Yes, revoke consent":["Sim, revogar o consentimento"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Ao revogar o seu consentimento, deixará de ter acesso Ă s funcionalidades de IA do Yoast. De certeza que quer revogar o seu consentimento?"],"Something went wrong, please try again later.":["Algo correu mal, por favor tente de novo mais tarde."],"Revoke AI consent":["Revogar consentimento da IA"],"Please enter a focus keyphrase first to use AI.":["Digite primeiro uma frase-chave principal para utilizar a IA."],"AI title generator":["Gerador de tĂ­tulos de IA"],"AI description generator":["Gerador de descrição de IA"],"AI Twitter title generator":["Gerador de tĂ­tulos do Twitter com IA"],"AI Twitter description generator":["Gerador de descrições do Twitter com IA"],"AI social title generator":["Gerador de tĂ­tulos para redes sociais com IA"],"AI social description generator":["Gerador de descrições para redes sociais com IA"],"Twitter preview":["PrĂ©-visualização do Twitter"],"Dismiss":["Ignorar"],"Don’t show again":["NĂŁo mostrar de novo"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sDica%2$s: Melhore a precisĂŁo dos seus tĂ­tulos gerados por IA ao escrever mais conteĂşdo na sua página."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sDica%2$s: Melhore a precisĂŁo das suas descrições geradas por IA ao escrever mais conteĂşdo na sua página."],"Try again":["Tentar de novo"],"Social preview":["PrĂ©-visualização nas redes sociais"],"Desktop result":["Resultado em computador"],"Mobile result":["Resultado em dispositivos mĂłveis"],"Apply AI description":["Aplicar descrição de IA"],"Apply AI title":["Aplicar tĂ­tulo de IA"],"Next":["Seguinte"],"Previous":["Anterior"],"Generate 5 more":["Gerar mais 5"],"Google preview":["PrĂ©-visualização do Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Devido Ă s directrizes Ă©ticas rigorosas do OpenAI e Ă s %1$spolĂ­ticas de utilização%2$s, nĂŁo nos Ă© possĂ­vel gerar tĂ­tulos SEO para a sua página. Se tenciona utilizar a IA, evite a utilização de conteĂşdos explĂ­citos, violentos ou sexualmente explĂ­citos. %3$sLeia mais sobre como configurar a sua página para garantir que obtĂ©m os melhores resultados com a IA%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Devido Ă s directrizes Ă©ticas rigorosas do OpenAI e Ă s %1$spolĂ­ticas de utilização%2$s, nĂŁo nos Ă© possĂ­vel gerar descrições SEO para a sua página. Se tenciona utilizar a IA, evite a utilização de conteĂşdos explĂ­citos, violentos ou sexualmente explĂ­citos. %3$sLeia mais sobre como configurar a sua página para garantir que obtĂ©m os melhores resultados com a IA%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Para aceder a esta funcionalidade Ă© necessária uma subscrição activa de %1$s. Por favor, %3$sactive a sua subscrição em %2$s%4$s ou %5$sobtenha uma nova subscrição de %1$s%6$s. Depois disso, clique no botĂŁo para actualizar esta página para que a funcionalidade trabalhe correctamente, o que pode demorar atĂ© 30 segundos."],"Refresh page":["Actualizar a página"],"Not enough content":["ConteĂşdo insuficiente"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Tente de novo mais tarde. Se o problema persistir, %1$scontacte a nossa equipa de suporte%2$s!"],"Something went wrong":["Algo correu mal"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Parece que atingiu o limite de tempo da ligação. Verifique a sua ligação Ă  Internet e tente de novo mais tarde. Se o problema persistir, %1$scontacte a nossa equipa de suporte%2$s"],"Connection timeout":["Tempo limite da ligação"],"Use AI":["Utilizar a IA"],"Close modal":["Fechar janela"],"Learn more about AI (Opens in a new browser tab)":["Saiba mais sobre a IA (abre num novo separador do navegador)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTitle%3$s: A sua página ainda nĂŁo tem um tĂ­tulo. %2$sAdicione um%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTitle%2$s: A sua página tem um tĂ­tulo. Muito bem!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sDistribuição da frase-chave%3$s: %2$sInclua a sua frase-chave, ou sinĂłnimos dela, no texto para ser possĂ­vel verificar a distribuição da frase-chave%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sDistribuição da frase-chave%2$s: Bom trabalho!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuição da frase-chave%3$s: Irregular. Algumas partes do seu texto nĂŁo contĂ©m a frase-chave ou qualquer sinĂłnimo. %2$sDistribua-as com maior regularidade%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuição da frase-chave%3$s: Muito irregular. Grandes partes do seu texto nĂŁo contĂ©m a frase-chave ou qualquer sinĂłnimo. %2$sDistribua-as com maior regularidade%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: NĂŁo está a usar demasiadas palavras complexas, o que torna o seu texto fácil de ler. Bom trabalho!"],"Word complexity":["Complexidade das palavras"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s das palavras do seu texto sĂŁo consideradas complexas. %3$sTente usar palavras mais curtas e familiares para melhorar a legibilidade%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sAlinhamento%3$s: Existe uma longa secção de texto alinhado ao centro. %2$sRecomendamos que seja alinhado Ă  esquerda%3$s.","%1$sAlinhamento%3$s: Existem %4$s longas secções de texto alinhado ao centro. %2$sRecomendamos que sejam alinhados Ă  esquerda%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sAlinhamento%3$s: Existe uma longa secção de texto alinhado ao centro. %2$sRecomendamos que seja alinhado Ă  direita%3$s.","%1$sAlinhamento%3$s: Existem %4$s longas secções de texto alinhado ao centro. %2$sRecomendamos que sejam alinhados Ă  direita%3$s."],"Select image":["Seleccionar imagem"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Chegou o momento de adicionar algumas ligações! Veja abaixo uma lista dos seus conteĂşdos principais. Por baixo de cada conteĂşdo principal, há sugestões de artigos aos quais pode adicionar uma ligação. Ao adicionar a ligação, certifique-se de que a insere numa frase relevante relacionada com o conteĂşdo principal. Continue a adicionar ligações de tantos conteĂşdos relacionados quantos forem necessários, atĂ© que os seus conteĂşdos principais tenham o maior nĂşmero de ligações internas a apontar para si."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Alguns conteĂşdos do seu site sĂŁo %1$sos%2$s mais importantes. Respondem Ă s perguntas das pessoas e resolvem os seus problemas. Por isso, merecem ser mostrados nos resultados de pesquisas! Na %3$s, chamamos-lhes conteĂşdos principais. Uma das formas de fazer com que sejam mostrados nos resultados de pesquisas Ă© apontar para si um nĂşmero suficiente de ligações. Mais ligações indicam aos motores de pesquisa que esses conteĂşdos sĂŁo importantes e valiosos. Neste exercĂ­cio, vamos ajudar a adicionar ligações aos seus conteĂşdos principais!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Assim que adicionar um pouco mais de texto, poderemos indicar-lhe o respectivo nĂ­vel de formalidade."],"Overall, your text appears to be %1$s%3$s%2$s.":["No geral, o seu texto parece ser %1$s%3$s%2$s."],"Heading %d":["TĂ­tulo %d"],"Maximum heading level":["NĂ­vel máximo de tĂ­tulo"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Desactivou as sugestões de ligações, que sĂŁo necessárias para o funcionamento das ligações relacionadas. Se quiser adicionar ligações relacionadas, vá a Funcionalidades do site e active as sugestões de ligações."],"Schema":["Schema"],"Meta tags":["Elementos meta"],"Not available":["NĂŁo disponĂ­vel"],"Checks":["Verificações"],"Focus Keyphrase":["Frase-chave principal"],"Good":["Bom"],"No index":["NĂŁo indexar"],"Front-end SEO inspector":["Inspector de SEO no site"],"Focus keyphrase not set":["Frase-chave principal nĂŁo definida"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Atenção: Para este exercĂ­cio funcionar bem, tem de executar a ferramenta de optimização de dados de SEO. Os administradores podem executar isto em %1$sSEO > Ferramentas%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Adicionou ligações a conteĂşdos ĂłrfĂŁos, e limpou as que já nĂŁo eram relevantes. Bom trabalho! Consulte o resumo abaixo e veja o que conseguiu!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Examine cuidadosamente o conteĂşdo desta lista e faça as correcções necessárias. Se precisar de ajuda na sua correcção, temos um %1$sartigo muito Ăştil que pode guiar do princĂ­pio ao fim%2$s (clique para abrir num novo separador)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sPrecisa de mais ajuda? Descrevemos em detalhe todos os passos neste guia: %2$sExercĂ­cio do %7$s sobre como usar os conteĂşdos ĂłrfĂŁos%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Acabou de tornar o seu melhor conteĂşdo fácil de encontrar, e mais susceptĂ­vel de ser classificado! É assim mesmo! De vez em quando, verifique se os conteĂşdos principais estĂŁo a receber ligações suficientes!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Veja a lista abaixo. Os seus conteĂşdos principais (marcados com %1$s) tĂŞm a maioria das ligações a apontar para si? Clique no botĂŁo Optimizar se achar que um conteĂşdo principal precisa de mais ligações, e este será incluĂ­do no passo seguinte."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Todos os seus conteĂşdos principais tĂŞm indicadores verdes? Para obter os melhores resultados, considere editar os que ainda nĂŁo tĂŞm!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Quais os conteĂşdos que pretende que tenham melhor classificação? Quais sĂŁo os que o seu pĂşblico considerará mais Ăşteis e completos? Clique na seta para baixo e procure os conteĂşdos que pretende. Os conteĂşdos da lista que seleccionar serĂŁo automaticamente marcados como principais."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sPrecisa de mais ajuda? Descrevemos em detalhe todos os passos aqui: %2$sExercĂ­cio do %7$s sobre como usar conteĂşdos principais%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Subpáginas do Yoast"],"Yoast Siblings":["Páginas dependentes da mesma página superior do Yoast"],"Yoast Table of Contents":["ĂŤndice do Yoast"],"Yoast Related Links":["Ligações relacionadas do Yoast"],"Finish optimizing":["Terminar optimização"],"You've finished adding links to this article.":["Terminou o processo de adicionar ligações a este conteĂşdo."],"Optimize":["Optimizar"],"Added to next step":["Adicionado ao prĂłximo passo"],"Choose cornerstone articles...":["Escolha os seus conteĂşdos principais..."],"Loading data...":["A carregar dados..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Ainda nĂŁo limpou ou actualizou nenhum artigo com este exercĂ­cio. Quando o fizer, será mostrado aqui um resumo do seu trabalho."],"Skipped":["Ignorado"],"Hidden from search engines.":["Escondido dos motores de pesquisa."],"Removed":["Removido"],"Improved":["Melhorado"],"Resolution":["Resolução"],"Loading redirect options...":["A carregar opções de redireccionamento..."],"Remove and redirect":["Remover e redireccionar"],"Custom url:":["URL personalizado:"],"Related article:":["ConteĂşdo relacionado:"],"Home page:":["Página inicial:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Está prestes a remover %1$s%2$s%3$s. Para evitar erros 404 no seu site, deverá redireccionar para outra página no seu site. Para onde gostaria de redireccionar?"],"SEO Workout: Remove article":["ExercĂ­cio de SEO: Remover artigo"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Está tudo com bom aspecto! NĂŁo encontrámos no seu site quaisquer artigos com mais de seis meses e que recebam muito poucas ligações. Volte aqui mais tarde para novas sugestões de limpeza!"],"Hide from search engines":["Esconder dos motores de pesquisa"],"Improve":["Melhorar"],"Are you sure you wish to hide this article from search engines?":["De certeza que quer esconder este conteĂşdo dos motores de pesquisa?"],"Action":["Acção"],"You've hidden this article from search engines.":["Escondeu este conteĂşdo dos motores de pesquisa."],"You've removed this article.":["Removeu este conteĂşdo."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["De momento nĂŁo seleccionou nenhum conteĂşdo a melhorar. Nos passos anteriores, seleccione alguns conteĂşdos ĂłrfĂŁos para os quais deve haver ligações, para que possamos sugeri-las aqui."],"Loading link suggestions...":["A carregar as sugestões de ligações..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["NĂŁo encontrámos quaisquer sugestões para este conteĂşdo, mas pode adicionar ligações a conteĂşdos que considere estarem relacionados."],"Skip":["Saltar"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Ainda nĂŁo seleccionou nenhum conteĂşdo para este passo. Pode fazĂŞ-lo no passo anterior."],"Is it up-to-date?":["Está actualizado?"],"Last Updated":["Ăšltima actualização"],"You've moved this article to the next step.":["Moveu este conteĂşdo para o passo seguinte."],"Unknown":["Desconhecido"],"Clear summary":["Limpar resumo"],"Add internal links towards your orphaned articles.":["Adicione ligações internas para os seus conteĂşdos ĂłrfĂŁos."],"Should you update your article?":["Deve actualizar o seu conteĂşdo?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["O seu site pode ter muitos conteĂşdos que foram criados uma vez e para os quais nĂŁo voltou a olhar. É importante revĂŞ-los e interrogar-se se estes conteĂşdos ainda sĂŁo relevantes para o seu site. Devo melhorá-los ou removĂŞ-los?"],"Start: Love it or leave it?":["InĂ­cio: Gosto ou abandono?"],"Clean up your unlinked content to make sure people can find it":["Crie ligações para os seus conteĂşdos ĂłrfĂŁos para garantir que as pessoas os encontram"],"I've finished this workout":["Terminei este exercĂ­cio"],"Reset this workout":["Recomeçar este exercĂ­cio"],"Well done!":["Muito bem!"],"Add internal links towards your cornerstones":["Adicione ligações internas para os seus conteĂşdos principais"],"Check the number of incoming internal links of your cornerstones":["Verifique o nĂşmero de ligações internas recebidas pelos seus conteĂşdos principais"],"Start: Choose your cornerstones!":["InĂ­cio: Marque os seus conteĂşdos principais!"],"The cornerstone approach":["A abordagem dos conteĂşdos principais"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Atenção: Para este exercĂ­cio funcionar bem e para lhe indicar sugestões de ligações, tem de executar a ferramenta de optimização de dados de SEO. Os administradores podem executar isto em %1$sSEO > Ferramentas%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Terminei este passo"],"Revise this step":["Rever este passo"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["NĂŁo foi possĂ­vel encontrar ligações internas nas suas páginas. Ou nĂŁo criou nenhuma ligação interna, ou o Yoast SEO nĂŁo indexou. O Yoast SEO pode indexar as suas ligações ao executar a optimização de dados de SEO em SEO > Ferramentas."],"Incoming links":["Ligações recebidas"],"Edit to add link":["Edite para adicionar ligação"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["De momento nĂŁo tem conteĂşdos marcados como principais. Os conteĂşdos marcados como principais sĂŁo mostrados aqui."],"Focus keyphrase":["Frase-chave principal"],"Article":["Artigo"],"Readability score":["Classificação de legibilidade"],"SEO score":["Classificação de SEO"],"Copy failed":["Falhou ao copiar"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Melhore a classificação de todos os seus conteĂşdos principais ao usar este %1$sexercĂ­cio passo-a-passo%2$s!"],"Rank with articles you want to rank with":["Obtenha boa classificação com os conteĂşdos que quer"],"Descriptive text":["Texto descritivo"],"Show the descriptive text":["Mostrar o texto descritivo"],"Show icon":["Mostrar Ă­cone"],"Yoast Estimated Reading Time":["Tempo estimado de leitura do Yoast"],"Shows an estimated reading time based on the content length.":["Mostra um tempo estimado de leitura com base no tamanho do conteĂşdo."],"reading time":["tempo de leitura"],"content length":["tamanho do conteĂşdo"],"Estimated reading time:":["Tempo estimado de leitura:"],"minute":["minuto","minutos"],"Settings":["Definições"],"OK":["Razoável"],"Close":["Fechar"],"Type":["Tipo"],"Orphaned content":["ConteĂşdo ĂłrfĂŁo"],"Synonyms":["SinĂłnimos"],"Internal linking suggestions":["Sugestões de ligações internas"],"Enter a related keyphrase to calculate the SEO score":["Insira uma frase-chave relacionada para calcular a classificação SEO"],"Related keyphrase":["Frase-chave relacionada"],"Add related keyphrase":["Adicionar frase-chave relacionada"],"Analysis results":["Resultados da análise"],"Help on choosing the perfect keyphrase":["Ajuda sobre como escolher a frase-chave perfeita"],"Help on keyphrase synonyms":["Ajuda sobre sinĂłnimos de frases-chave"],"Keyphrase":["Frase-chave"],"New URL: {{link}}%s{{/link}}":["Novo URL: {{link}}%s{{/link}}"],"Undo":["Anular"],"Redirect created":["Redireccionamento criado"],"%s just created a redirect from the old URL to the new URL.":["O %s criou um redireccionamento do antigo URL para o novo URL."],"Old URL: {{link}}%s{{/link}}":["Antigo URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["SinĂłnimos da frase-chave"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["PrĂ©-visualização de partilha no Twitter"],"Adds a list of internal links to sibling pages which share the same parent.":["Adiciona uma lista de ligações internas a páginas dependentes que partilham a mesma página superior."],"siblings":["dependentes da mesma página superior"],"sibling pages":["páginas dependentes da mesma página superior"],"Adds a list of internal links to subpages of this page.":["Adiciona uma lista de ligações internas a subpáginas desta página."],"seo":["seo"],"subpages":["subpáginas"],"childpages":["páginas dependentes"],"children":["dependente"],"internal linking":["ligações internas"],"site structure":["estrutura do site"],"We could not find any relevant articles on your website that you could link to from your post.":["NĂŁo foram encontrados artigos relevantes no seu site para os quais possa ligar a partir do seu conteĂşdo."],"Load suggestions":["Carregar sugestões"],"Refresh suggestions":["Actualizar sugestões"],"Write list…":["Escreva uma lista..."],"Adds a list of links related to this page.":["Adiciona uma lista de ligações relacionadas a esta página."],"related posts":["artigos relacionados"],"related pages":["páginas relacionadas"],"Adds a table of contents to this page.":["Adiciona um Ă­ndice a esta página."],"links":["ligações"],"toc":["Ă­ndice"],"Copy link":["Copiar ligação"],"Copy link to suggested article: %s":["Copiar ligação para o artigo sugerido: %s"],"Add a title to your post for the best internal linking suggestions.":["Adicione um tĂ­tulo ao seu conteĂşdo para melhorar as ligações internas."],"Add a metadescription to your post for the best internal linking suggestions.":["Adicione uma descrição ao seu conteĂşdo para melhorar as ligações internas."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Adicione um tĂ­tulo e uma descrição ao seu conteĂşdo para melhorar as ligações internas."],"Also, add a title to your post for the best internal linking suggestions.":["Adicione tambĂ©m um tĂ­tulo ao seu conteĂşdo para melhorar a sugestĂŁo de ligações internas."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Adicione tambĂ©m uma descrição ao seu conteĂşdo para melhorar a sugestĂŁo de ligações internas."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Adicione tambĂ©m um tĂ­tulo e uma descrição ao seu conteĂşdo para melhorar a sugestĂŁo de ligações internas."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Ao adicionar mais algum texto, será mostrada aqui uma lista de conteĂşdos relacionados, para os quais poderá adicionar ligações no seu conteĂşdo."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Para melhorar a estrutura do seu site, considere criar ligações para outros artigos ou páginas relevantes no seu site."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Demora alguns segundos a mostrar uma lista de conteĂşdos relacionados a que pode criar ligações. As sugestões serĂŁo mostradas assim que forem obtidas."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Leia o nosso guia sobre ligações internas para SEO{{/a}} para saber mais."],"Copied!":["Copiado!"],"Not supported!":["NĂŁo suportado!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Está a tentar utilizar mĂşltiplas frases-chave relacionadas? Deverá adicioná-las separadamente."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["A sua frase-chave Ă© demasiado longa. SĂł pode ter no máximo 191 caracteres."],"Add as related keyphrase":["Adicionar como frase-chave relacionada"],"Added!":["Adicionada!"],"Remove":["Remover"],"Table of contents":["ĂŤndice"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["É necessário optimizar os dados de SEO do seu site para podermos oferecer as melhores %1$ssugestões de ligações%2$s. %3$sIniciar optimização de dados de SEO%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ro_RO.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ro_RO.json deleted file mode 100644 index b2161a2b..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ro_RO.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);","lang":"ro"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Pentru a accesa aceastÄ funcČ›ionalitate, ai nevoie de abonamentele %2$s Č™i %3$s active. Te rugÄm sÄ-Č›i %5$sactivezi abonamentele Ă®n %1$s%6$s sau %7$sobČ›ine un nou %4$s%8$s. DupÄ aceea, te rugÄm sÄ reĂ®mprospÄtezi aceastÄ paginÄ pentru ca funcČ›ionalitatea sÄ funcČ›ioneze corect, ceea ce poate dura pânÄ la 30 de secunde."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["Generatorul de titluri AI necesitÄ ca analiza SEO sÄ fie activatÄ Ă®nainte de utilizare. Pentru a o activa, navigheazÄ la %2$sFuncČ›ionalitÄČ›ile site-ului %1$s%3$s, activeazÄ analiza SEO Č™i dÄ clic pe „SalveazÄ modificÄri”. DacÄ analiza SEO este dezactivatÄ Ă®n profilul tÄu de utilizator WordPress, acceseazÄ profilul tÄu Č™i activeaz-o acolo. Te rugÄm sÄ contactezi administratorul dacÄ nu ai acces la aceste setÄri."],"Social share preview":["Previzualizare partajare socialÄ"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Pentru a continua sÄ utilizezi funcČ›ia Yoast AI, te rugÄm sÄ reduci frecvenČ›a solicitÄrilor tale. Articolul nostru %1$sde ajutor%2$s oferÄ Ă®ndrumÄri privind planificarea Č™i ritmul eficient al solicitÄrilor tale pentru un flux de lucru optimizat."],"You've reached the Yoast AI rate limit.":["Ai atins limit ratei Yoast AI."],"Allow":["Permite"],"Deny":["RefuzÄ"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Pentru a vedea acest video, trebuie sÄ permiČ›i ca %1$s sÄ Ă®ncarce videoclipuri Ă®nglobate din %2$s."],"Text generated by AI may be offensive or inaccurate.":["Textul generat de AI poate fi ofensator sau inexact."],"(Opens in a new browser tab)":["(Se deschide Ă®ntr-o filÄ nouÄ a navigatorului)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["ĂŽČ›i accelerezi fluxul de lucru cu un AI generativ. PrimeČ™ti sugestii pentru titluri Č™i descrieri de foarte bunÄ calitate pentru Aspect Ă®n cÄutare Č™i Social. %1$sAflÄ mai multe%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Cu Yoast AI, generezi titluri Č™i descrieri!"],"New to %1$s":["Nou la %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Aprob %1$sTermenii Č™i condiČ›iile%2$s Č™i %3$sPolitica de confidenČ›ialitate%4$s ale serviciului Yoast AI. Aceasta include consimČ›Ämântul pentru colectarea Č™i utilizarea datelor pentru a Ă®mbunÄtÄČ›i experienČ›a utilizatorului."],"Start generating":["ĂŽncepe generarea"],"Yes, revoke consent":["Da, revocÄ consimČ›Ämântul"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Prin revocarea consimČ›Ämântului tÄu, nu vei mai avea acces la funcČ›ionalitÄČ›ile Yoast AI. Sigur vrei sÄ-Č›i revoci consimČ›Ämântul?"],"Something went wrong, please try again later.":["Ceva nu a mers bine, te rog reĂ®ncearcÄ mai târziu."],"Revoke AI consent":["RevocÄ consimČ›Ämântul AI"],"Please enter a focus keyphrase first to use AI.":["Te rugÄm sÄ introduci mai Ă®ntâi o expresie cheie pentru a utiliza AI."],"AI title generator":["Generator AI de titluri"],"AI description generator":["Generator AI de descrieri"],"AI Twitter title generator":["Generator AI de titluri Twitter"],"AI Twitter description generator":["Generator AI de descrieri Twitter"],"AI social title generator":["Generator AI de titluri sociale"],"AI social description generator":["Generator AI de descrieri sociale"],"Twitter preview":["Previzualizare Twitter"],"Dismiss":["Respinge"],"Don’t show again":["Nu mai afiČ™a"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sSfat%2$s: ĂŽmbunÄtÄČ›eČ™ti acurateČ›ea titlurilor tale generate AI scriind mai mult conČ›inut Ă®n pagina ta."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sSfat%2$s: ĂŽmbunÄtÄČ›eČ™ti acurateČ›ea descrierilor tale generate AI scriind mai mult conČ›inut Ă®n pagina ta."],"Try again":["ĂŽncearcÄ din nou"],"Social preview":["Previzualizare socialÄ"],"Desktop result":["Rezultat pe desktop"],"Mobile result":["Rezultat pe mobil"],"Apply AI description":["AplicÄ descrierea AI"],"Apply AI title":["AplicÄ titlul AI"],"Next":["UrmÄtor"],"Previous":["Anterior"],"Generate 5 more":["GenereazÄ Ă®ncÄ 5"],"Google preview":["Previzualizare Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Din cauza ghidurilor etice stricte ale OpenAI Č™i a %1$spoliticilor de utilizare%2$s, nu putem genera titluri SEO pentru pagina ta. DacÄ intenČ›ionezi sÄ foloseČ™ti AI, te rugÄm sÄ eviČ›i utilizarea conČ›inutului explicit, violent sau sexual explicit. %3$sCiteČ™te mai multe despre cum sÄ Ă®Č›i configurezi pagina pentru a te asigura cÄ obČ›ii cele mai bune rezultate cu AI%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Din cauza regulilor etice stricte ale OpenAI Č™i a %1$spoliticilor de utilizare%2$s, nu putem genera meta descrieri pentru pagina ta. DacÄ intenČ›ionezi sÄ foloseČ™ti inteligenČ›a artificialÄ, te rugÄm sÄ eviČ›i utilizarea conČ›inutului explicit, violent sau sexual explicit. %3$sCiteČ™te mai multe despre cum sÄ Ă®Č›i configurezi pagina pentru a te asigura cÄ obČ›ii cele mai bune rezultate cu AI%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Pentru a accesa aceastÄ funcČ›ionalitate, ai nevoie de un abonament activ %1$s. Te rugÄm sÄ %3$sactivezi abonamentul Ă®n %2$s%4$s sau %5$s obČ›ine un nou abonament %1$s%6$s. Apoi, dÄ clic pe buton pentru a reĂ®mprospÄta aceastÄ paginÄ pentru ca funcČ›ionalitatea sÄ funcČ›ioneze corect, ceea ce poate dura pânÄ la 30 de secunde."],"Refresh page":["ReĂ®mprospÄteazÄ paginÄ"],"Not enough content":["ConČ›inut insuficient"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Te rog reĂ®ncearcÄ mai târziu. DacÄ problema persistÄ, te rog %1$scontacteazÄ echipa noastrÄ de suport%2$s!"],"Something went wrong":["Ceva nu a mers bine"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Se pare cÄ a avut loc o expirare a conexiunii. Te rugÄm sÄ Ă®Č›i verifici conexiunea la internet Č™i sÄ Ă®ncerci din nou mai târziu. DacÄ problema persistÄ, %1$scontacteazÄ echipa noastrÄ de asistenČ›Ä%2$s"],"Connection timeout":["Timp de conexiune expirat"],"Use AI":["FoloseČ™ti AI"],"Close modal":["ĂŽnchide modal"],"Learn more about AI (Opens in a new browser tab)":["AflÄ mai multe despre AI (se deschide Ă®ntr-o filÄ nouÄ de navigator)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTitlu%3$s: Pagina ta Ă®ncÄ nu are un titlu. %2$sAdaugÄ unul%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sTitlu%2$s: Pagina ta are un titlu. Foarte bine!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sDistribuČ›ie frazÄ cheie%3$s: %2$sinclude fraza cheie sau sinonimele ei Ă®n text ca sÄ putem verifica distribuČ›ia ei (lor)%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sDistribuČ›ie frazÄ cheie%2$s: foarte bine!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuČ›ie frazÄ cheie%3$s: inegalÄ. Unele pÄrČ›i ale textului nu conČ›in fraza cheie sau sinonimele ei. %2$sDistribuie fraza cheie uniform%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuČ›ie frazÄ cheie%3$s: inegalÄ. PÄrČ›i mari de text nu conČ›in fraza cheie sau sinonimele ei. %2$sDistribuie fraza cheie uniform%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: nu foloseČ™ti multe cuvinte greu de Ă®nČ›eles, deci textul tÄu este uČ™or de citit. Foarte bine!"],"Word complexity":["Complexitatea cuvintelor"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s dintre cuvintele din textul tÄu sunt considerate greu de Ă®nČ›eles. %3$sĂŽncearcÄ sÄ foloseČ™ti cuvinte mai scurte Č™i mai familiare pentru a Ă®mbunÄtÄČ›i lizibilitatea%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sAliniere%3$s: existÄ o secČ›iune lungÄ cu text aliniat central. %2$sĂŽČ›i recomandÄm sÄ Ă®l aliniezi la stânga%3$s.","%1$sAliniere%3$s: existÄ %4$s secČ›iuni lungi cu text aliniat central. %2$sĂŽČ›i recomandÄm sÄ le aliniezi la stânga%3$s.","%1$sAliniere%3$s: existÄ %4$s de secČ›iuni lungi cu text aliniat central. %2$sĂŽČ›i recomandÄm sÄ le aliniezi la stânga%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sAliniere%3$s: existÄ o secČ›iune lungÄ cu text aliniat central. %2$sĂŽČ›i recomandÄm sÄ le aliniezi la dreapta%3$s.","%1$sAliniere%3$s: existÄ %4$s secČ›iuni lungi cu text aliniat central. %2$sĂŽČ›i recomandÄm sÄ le aliniezi la dreapta%3$s.","%1$sAliniere%3$s: existÄ %4$s de secČ›iuni lungi cu text aliniat central. %2$sĂŽČ›i recomandÄm sÄ le aliniezi la dreapta%3$s."],"Select image":["SelecteazÄ o imagine"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Este timpul sÄ adaugi câteva legÄturi! Mai jos, vezi o listÄ de conČ›inut fundamental. Sub fiecare, existÄ sugestii pentru articole de la care ai putea adÄuga o legÄturÄ. Când adaugi legÄtura, asigurÄ-te cÄ o inserezi Ă®ntr-o propoziČ›ie relevantÄ legatÄ de articolul tÄu principal. ContinuÄ sÄ adaugi legÄturi de la câte articole similare ai nevoie, pânÄ când conČ›inuturile fundamentale au cele mai multe legÄturi interne Ă®ndreptate cÄtre ele."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Unele articole de pe site-ul tÄu sunt %1$scele%2$s mai importante. Ele rÄspund la Ă®ntrebÄrile oamenilor Č™i le rezolvÄ problemele. Deci, meritÄ sÄ fie clasate! La %3$s, le numim aceste articole fundamentale. Una dintre modalitÄČ›ile de a le avea clasate este sÄ ai suficiente legÄturi cÄtre ele. Mai multe legÄturi semnaleazÄ motoarele de cÄutare cÄ acele articole sunt importante Č™i valoroase. ĂŽn acest antrenament, te vom ajuta sÄ adaugi legÄturi cÄtre articolele tale fundamentale!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["DupÄ ce adaugi puČ›in mai multe copii, îți vom putea spune care este nivelul de formalitate al textului tÄu."],"Overall, your text appears to be %1$s%3$s%2$s.":["ĂŽn general, textul tÄu pare a fi %1$s%3$s%2$s."],"Heading %d":["Subtitlu %d"],"Maximum heading level":["Nivel subtitlu maxim"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Ai dezactivat sugestiile de legÄturi, care sunt necesare pentru ca legÄturile similare sÄ funcČ›ioneze. DacÄ vrei sÄ adaugi legÄturi similare, acceseazÄ FuncČ›ionalitÄČ›i site Č™i activeazÄ LegÄturi similare."],"Schema":["Schema"],"Meta tags":["Etichete meta"],"Not available":["Indisponibil"],"Checks":["VerificÄri"],"Focus Keyphrase":["Focus frazÄ cheie"],"Good":["Bun"],"No index":["FÄrÄ indexare"],"Front-end SEO inspector":["Inspector SEO pentru partea din faČ›Ä"],"Focus keyphrase not set":["Focus frazÄ cheie nesetat"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Te rog reČ›ine: pentru ca acest antrenament sÄ funcČ›ioneze bine, trebuie sÄ rulezi instrumentul de optimizare a datelor SEO. Administratorii Ă®l pot rula sub %1$sSEO > Utile%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Ai adÄugat legÄturi cÄtre articolele orfane Č™i le-ai curÄČ›at pe cele care nu mai erau relevante. BunÄ treabÄ! AruncÄ o privire la rezumatul de mai jos Č™i sÄrbÄtoreČ™te ceea ce ai realizat!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["ExamineazÄ critic conČ›inutul din aceastÄ listÄ Č™i fÄ actualizÄrile necesare. DacÄ ai nevoie de ajutor pentru actualizare, avem un %1$sarticol de blog foarte util, care te poate ghida pe tot parcursul%2$s (dÄ clic pentru a deschide Ă®ntr-o filÄ nouÄ)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sAi nevoie de mai mult ajutor? Am acoperit fiecare pas mai detaliat Ă®n urmÄtorul ghid: %2$sCum sÄ foloseČ™ti conČ›inutul orfan de antrenament %7$s%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Tocmai Č›i-ai fÄcut cel mai bun conČ›inut uČ™or de gÄsit Č™i mai probabil sÄ fie clasat! Mai departe! Din când Ă®n când, nu uita sÄ verifici dacÄ pietrele de temelie primesc suficiente legÄturi!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["AruncÄ o privire la lista de mai jos. Pietrele tale de temelie (marcate cu %1$s) au cele mai multe legÄturi interne care Ă®ndreaptÄ cÄtre ele? DÄ clic pe butonul Optimizare dacÄ crezi cÄ o piatrÄ de temelie are nevoie de mai multe legÄturi. Acest lucru va muta articolul la pasul urmÄtor."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Toate pietrele tale de temelie au buline verzi? Pentru cele mai bune rezultate, ia Ă®n considerare editarea celor care nu au!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Ce articole vrei sÄ clasezi cel mai bine? Pe care publicul tÄu le-ar gÄsi cele mai utile Č™i complete? DÄ clic pe sÄgeata orientatÄ Ă®n jos Č™i cauzÄ articole care se potrivesc acestor criterii. Vom marca automat articolele pe care le selectezi din listÄ ca pietre de temelie."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sAi nevoie de mai mult ajutor? Am acoperit fiecare pas mai detaliat Ă®n: %2$sCum sÄ foloseČ™ti conČ›inutul orfan de antrenament %7$s%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Subpagini Yoast"],"Yoast Siblings":["FraČ›i Yoast"],"Yoast Table of Contents":["Cuprins Yoast"],"Yoast Related Links":["LegÄturi similare Yoast"],"Finish optimizing":["TerminÄ optimizarea"],"You've finished adding links to this article.":["Ai terminat de adÄugat legÄturi la acest articol."],"Optimize":["OptimizeazÄ"],"Added to next step":["AdÄugat la urmÄtorul pas"],"Choose cornerstone articles...":["Alege articolele pietre de temelie..."],"Loading data...":["Se Ă®ncarcÄ datele..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["ĂŽncÄ nu Č›i-ai curÄČ›at sau actualizat niciun articol folosind acest antrenament. OdatÄ ce o faci, un rezumat al muncii tale va fi afiČ™at aici."],"Skipped":["SÄrit"],"Hidden from search engines.":["Ascuns de motoarele de cÄutare."],"Removed":["ĂŽnlÄturate"],"Improved":["ĂŽmbunÄtÄČ›it"],"Resolution":["RezoluČ›ie"],"Loading redirect options...":["ĂŽncarcÄ opČ›iuni de redirecČ›ionare..."],"Remove and redirect":["ĂŽnlÄturÄ Č™i redirecČ›ioneazÄ"],"Custom url:":["URL personalizat:"],"Related article:":["Articol similar:"],"Home page:":["Prima paginÄ:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["EČ™ti pe cale sÄ Ă®nlÄturi %1$s%2$s%3$s. Pentru a preveni paginile 404 pe site-ul tÄu, ar trebui sÄ-l redirecČ›ionezi cÄtre altÄ paginÄ de pe site-ul tÄu. Unde ai vrea sÄ-l redirecČ›ionezi?"],"SEO Workout: Remove article":["Antrenament SEO: ĂŽnlÄturÄ articol"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Totul aratÄ bine! Nu am gÄsit niciun articol pe site-ul tÄu care sÄ fie mai vechi de Č™ase luni Č™i care sÄ primeascÄ prea puČ›ine legÄturi pe site-ul tÄu. Revino mai târziu pentru sugestii noi de curÄČ›are!"],"Hide from search engines":["Ascunde de motoarele de cÄutare"],"Improve":["ĂŽmbunÄtÄČ›eČ™te"],"Are you sure you wish to hide this article from search engines?":["Sigur vrei sÄ ascunzi acest articol de motoarele de cÄutare?"],"Action":["AcČ›iune"],"You've hidden this article from search engines.":["Ai ascuns acest articol de motoarele de cÄutare."],"You've removed this article.":["Ai Ă®nlÄturat acest articol."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Momentan nu ai selectat niciun articol pentru Ă®mbunÄtÄČ›ire. SelecteazÄ câteva articole orfane din paČ™ii anteriori la care sÄ le adaugi legÄturi Č™i îți vom arÄta aici sugestii de legÄturi."],"Loading link suggestions...":["Se Ă®ncarcÄ sugestiile de legÄturi..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Nu am gÄsit nicio sugestie pentru acest articol, dar, desigur, poČ›i adÄuga Ă®n continuare legÄturi la articole despre care credeČ›i cÄ sunt similare."],"Skip":["Sari"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["ĂŽncÄ nu ai selectat niciun articol pentru acest pas. PoČ›i face asta Ă®n pasul anterior."],"Is it up-to-date?":["Este actualizat?"],"Last Updated":["Ultima actualizare"],"You've moved this article to the next step.":["Ai mutat acest articol Ă®n pasul urmÄtor."],"Unknown":["Necunoscut"],"Clear summary":["CurÄČ›Ä rezumat"],"Add internal links towards your orphaned articles.":["AdaugÄ legÄturi interne cÄtre articolele tale orfane."],"Should you update your article?":["Trebuie sÄ-Č›i actualizezi articolul?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Site-ul tÄu conČ›ine adesea o mulČ›ime de conČ›inut care a fost creat o datÄ Č™i care nu a mai fost revizuit apoi. Este important sÄ-l parcurgi Č™i sÄ te Ă®ntrebi dacÄ acest conČ›inut este Ă®ncÄ relevant pentru site-ul tÄu. Ar trebui sÄ-l Ă®mbunÄtÄČ›esc sau sÄ-l Ă®nlÄtur?"],"Start: Love it or leave it?":["ĂŽncepe: Ă®l iubeČ™ti sau Ă®l pÄrÄseČ™ti?"],"Clean up your unlinked content to make sure people can find it":["CurÄČ›Ä-Č›i conČ›inutul nelegat pentru a te asigura cÄ oamenii Ă®l pot gÄsi"],"I've finished this workout":["Am terminat acest antrenament"],"Reset this workout":["ReseteazÄ acest antrenament"],"Well done!":["Foarte bine!"],"Add internal links towards your cornerstones":["AdaugÄ legÄturi interne cÄtre conČ›inuturile tale de bazÄ"],"Check the number of incoming internal links of your cornerstones":["VerificÄ numÄrul de legÄturi interne de intrare ale conČ›inuturilor tale de bazÄ"],"Start: Choose your cornerstones!":["ĂŽncepe: alege-Č›i conČ›inutul fundamental"],"The cornerstone approach":["Abordarea pentru conČ›inutul fundamental"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Te rog reČ›ine: pentru ca acest antrenament sÄ funcČ›ioneze Č™i sÄ-Č›i ofere sugestii de legÄturi, trebuie sÄ rulezi instrumentul de optimizare date SEO. Administratorii pot rula asta Ă®n %1$sSEO > Unelte%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Am terminat acest pas"],"Revise this step":["RevizuieČ™te acest pas"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Nu am putut gÄsi legÄturi interne pe paginile tale. Fie nu ai adÄugat Ă®ncÄ nicio legÄturÄ internÄ la conČ›inutul tÄu, fie Yoast SEO nu le-a indexat. PoČ›i solicita Yoast SEO sÄ Ă®Č›i indexeze legÄturile rulând optimizarea datelor SEO Ă®n SEO> Unelte."],"Incoming links":["LegÄturi de intrare"],"Edit to add link":["EditeazÄ pentru a adÄuga legÄturÄ"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Momentan nu ai articole marcate ca fiind de bazÄ. Când îți marchezi articolele ca Č™i conČ›inut de bazÄ, vor apÄrea aici."],"Focus keyphrase":["FrazÄ cheie"],"Article":["Articol"],"Readability score":["Punctaj lizibilitate"],"SEO score":["Punctaj SEO"],"Copy failed":["Copiere eČ™uatÄ"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["ĂŽmbunÄtÄČ›eČ™te clasarea pentru toate conČ›inuturile tale de bazÄ folosind acest %1$santrenament pas cu pas!%2$s"],"Rank with articles you want to rank with":["PropulseazÄ Ă®n partea superioarÄ articolele pe care vrei sÄ le evidenČ›iezi Ă®n rezultatele de cÄutare"],"Descriptive text":["Text descriptiv"],"Show the descriptive text":["AratÄ textul descriptiv"],"Show icon":["AratÄ icon"],"Yoast Estimated Reading Time":["Timp de citire estimat Yoast"],"Shows an estimated reading time based on the content length.":["AratÄ un timp de citire estimat bazat pe lungimea conČ›inutului."],"reading time":["timp de citire"],"content length":["lungime conČ›inut"],"Estimated reading time:":["Timp de citire estimat:"],"minute":["minut","minute","de minute"],"Settings":["SetÄri"],"OK":["OK"],"Close":["ĂŽnchide"],"Type":["Tip"],"Orphaned content":["ConČ›inutul orfan"],"Synonyms":["Sinonime"],"Internal linking suggestions":["Sugestii de legÄturi interne"],"Enter a related keyphrase to calculate the SEO score":["Introdu o frazÄ cheie similarÄ pentru a calcula punctajul SEO"],"Related keyphrase":["FrazÄ cheie similarÄ"],"Add related keyphrase":["AdaugÄ fraze cheie similare"],"Analysis results":["Rezultate analizÄ"],"Help on choosing the perfect keyphrase":["Ajutor pentru alegerea frazei cheie perfecte"],"Help on keyphrase synonyms":["Ajutor pentru sinonime frazÄ cheie"],"Keyphrase":["FrazÄ cheie"],"New URL: {{link}}%s{{/link}}":["URL nou: {{link}}%s{{/link}}"],"Undo":["Revenire"],"Redirect created":["RedirecČ›ionarea a fost creatÄ"],"%s just created a redirect from the old URL to the new URL.":["%s tocmai a creat o redirecČ›ionare de la URL-ul vechi la URL-ul nou."],"Old URL: {{link}}%s{{/link}}":["URL vechi: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Sinonime fraza cheie"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Previzualizare Ă®n Twitter"],"Adds a list of internal links to sibling pages which share the same parent.":["AdÄugÄ o listÄ de legÄturi interne paginilor Ă®nfrÄČ›ite care au acelaČ™i pÄrinte."],"siblings":["fraČ›i"],"sibling pages":["pagini Ă®nfrÄČ›ite"],"Adds a list of internal links to subpages of this page.":["AdaugÄ o listÄ cu legÄturile interne sub-paginilor acestei pagini."],"seo":["seo"],"subpages":["sub-pagini"],"childpages":["pagini copil"],"children":["copil"],"internal linking":["legÄturi interne"],"site structure":["structurÄ site"],"We could not find any relevant articles on your website that you could link to from your post.":["Nu am putut gÄsi niciun articol relevant pe site-ul tÄu web pe care sÄ-l poČ›i lega la articolul tÄu."],"Load suggestions":["ĂŽncarcÄ sugestii"],"Refresh suggestions":["ReĂ®mprospÄteazÄ sugestii"],"Write list…":["Scrie lista..."],"Adds a list of links related to this page.":["AdaugÄ o listÄ de legÄturi similare la aceastÄ paginÄ."],"related posts":["articole similare"],"related pages":["pagini similare"],"Adds a table of contents to this page.":["AdaugÄ un tabel de conČ›inut la aceastÄ paginÄ."],"links":["legÄturi"],"toc":["cuprins"],"Copy link":["CopiazÄ legÄtura"],"Copy link to suggested article: %s":["CopiazÄ legÄtura la articolul sugerat: %s"],"Add a title to your post for the best internal linking suggestions.":["AdaugÄ un titlu articolului tÄu pentru cele mai bune sugestii de legÄturi interne."],"Add a metadescription to your post for the best internal linking suggestions.":["AdaugÄ o descriere meta articolului tÄu pentru cele mai bune sugestii de legÄturi interne."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["AdaugÄ un titlu Č™i o descriere meta articolului tÄu pentru cele mai bune sugestii de legÄturi interne."],"Also, add a title to your post for the best internal linking suggestions.":["AdaugÄ Č™i un titlu articolului tÄu pentru cele mai bune sugestii de legÄturi interne."],"Also, add a metadescription to your post for the best internal linking suggestions.":["AdaugÄ Č™i o meta descriere articolului tÄu pentru cele mai bune sugestii de legÄturi interne."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["AdaugÄ Č™i un titlu Č™i o meta descriere articolului tÄu pentru cele mai bune sugestii de legÄturi interne."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["DupÄ ce adaugi mai mult text, îți vom oferi aici o listÄ cu conČ›inut similar la care ai putea sÄ te legi Ă®n articolul tÄu."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Pentru a-Č›i Ă®mbunÄtÄČ›i structura site-ului, considerÄ legarea site-ului tÄu web la alte articole sau pagini relevante."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["DureazÄ câteva secunde sÄ-Č›i arÄtÄm o listÄ de conČ›inut similar pe care l-ai putea lega. Sugestiile vor fi afiČ™ate aici imediat ce le avem."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}CiteČ™te ghidul nostru despre legÄturi interne pentru SEO{{/a}} pentru a afla mai multe."],"Copied!":["CopiatÄ!"],"Not supported!":["NesuportatÄ!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["ĂŽncerci sÄ foloseČ™ti mai multe fraze cheie similare? Ar trebui sÄ le adaugi separat."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Fraza cheie este prea lungÄ. Ea poate avea maxim 191 de caractere."],"Add as related keyphrase":["AdaugÄ ca frazÄ cheie similarÄ"],"Added!":["AdÄugatÄ!"],"Remove":["ĂŽnlÄturÄ"],"Table of contents":["Cuprins"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Trebuie sÄ-Č›i optimizÄm datele SEO ale site-ului pentru a-Č›i oferi cele mai bune %1$ssugestii de legÄturi%2$s. %3$sĂŽncepe optimizarea datelor SEO%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ru_RU.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ru_RU.json deleted file mode 100644 index 2d81f793..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ru_RU.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);","lang":"ru"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Чтобы полŃчить Đ´ĐľŃŃ‚ŃĐż Đş этой Ń„Ńнкции, вам Đ˝Ńжно активировать подпиŃки на %2$s и %3$s. ПожалŃĐąŃта, %5$sактивирŃйте ваŃи подпиŃки в %1$s%6$s или %7$sполŃчите новŃŃŽ %4$s%8$s. ПоŃле этого обновите ŃтраницŃ, чтобы Ń„Ńнкция работала корректно, это может занять Đ´Đľ 30 ŃекŃнд."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["Перед иŃпользованием генератора заголовков ĐРнеобходимо включить SEO-анализ. Чтобы включить его, перейдите в раздел %2$sФŃнкции Ńайта %1$s%3$s, включите SEO-анализ и нажмите \"Сохранить изменения\". Đ•Ńли SEO-анализ отключен в ваŃем профиле пользователя WordPress, зайдите в Ńвой профиль и включите его там. Đ•Ńли Ń Đ˛Đ°Ń Đ˝ĐµŃ‚ Đ´ĐľŃŃ‚Ńпа Đş этим наŃтройкам, обратитеŃŃŚ Đş админиŃтраторŃ."],"Social share preview":["Предварительный проŃмотр раŃпроŃтранения в ŃоцŃетях"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Чтобы продолжать пользоватьŃŃŹ Ń„Ńнкцией ĐĐ Yoast, пожалŃĐąŃта, ŃменьŃите чаŃŃ‚ĐľŃ‚Ń Đ·Đ°ĐżŃ€ĐľŃов. Đ’ наŃей %1$sŃтатье%2$s приведены рекомендации по ŃŤŃ„Ń„ĐµĐşŃ‚Đ¸Đ˛Đ˝ĐľĐĽŃ ĐżĐ»Đ°Đ˝Đ¸Ń€ĐľĐ˛Đ°Đ˝Đ¸ŃŽ и периодичноŃти запроŃов для оптимизации рабочего процеŃŃа."],"You've reached the Yoast AI rate limit.":["Đ’Ń‹ Đ´ĐľŃтигли предела ŃкороŃти ĐĐ Yoast."],"Allow":["РазреŃить"],"Deny":["Отказать"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Чтобы проŃмотреть это видео, вам Đ˝Ńжно разреŃить %1$s загрŃжать вŃтроенные видео из %2$s."],"Text generated by AI may be offensive or inaccurate.":["ТекŃŃ‚, генерирŃемый иŃĐşŃŃŃтвенным интеллектом, может быть ĐľŃкорбительным или неточным."],"(Opens in a new browser tab)":["(ОткроетŃŃŹ в новой вкладке браŃзера)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["ĐŁŃкорьте Ńвой рабочий процеŃŃ Ń ĐżĐľĐĽĐľŃ‰ŃŚŃŽ генеративного ĐĐ. ПолŃчите выŃококачеŃтвенные варианты заголовков и опиŃаний для поиŃка и появления в Ńоциальных Ńетях. %1$sПодробнее%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Создавайте заголовки и опиŃания Ń ĐżĐľĐĽĐľŃ‰ŃŚŃŽ Yoast ĐĐ!"],"New to %1$s":["Новое в %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["ĐŻ принимаю %1$sĐŁŃловия предоŃтавления ŃŃĐ»ŃĐł%2$s и %3$sĐźĐľĐ»Đ¸Ń‚Đ¸ĐşŃ ĐşĐľĐ˝Ń„Đ¸Đ´ĐµĐ˝Ń†Đ¸Đ°Đ»ŃŚĐ˝ĐľŃти%4$s ŃервиŃа ĐĐ Yoast. Это включает в Ńебя ŃоглаŃие на Ńбор и иŃпользование данных для ŃĐ»ŃчŃения пользовательŃкого опыта."],"Start generating":["ЗапŃŃтить генерацию"],"Yes, revoke consent":["Да, отозвать ŃоглаŃие"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Отозвав Ńвое ŃоглаŃие, вы больŃе не бŃдете иметь Đ´ĐľŃŃ‚Ńпа Đş Ń„Ńнкциям ĐĐ Yoast. Đ’Ń‹ Ńверены, что хотите отозвать Ńвое ŃоглаŃие?"],"Something went wrong, please try again later.":["Что-то поŃло не так, пожалŃĐąŃта, повторите ĐżĐľĐżŃ‹Ń‚ĐşŃ ĐżĐľĐ·Đ¶Đµ."],"Revoke AI consent":["Отозвать ŃоглаŃие ĐĐ"],"Please enter a focus keyphrase first to use AI.":["Для иŃпользования ĐĐ Ńначала введите ключевŃŃŽ фразŃ."],"AI title generator":["Генератор заголовков ĐĐ"],"AI description generator":["Генератор опиŃаний ĐĐ"],"AI Twitter title generator":["ĐĐ-генератор заголовков Твиттера"],"AI Twitter description generator":["ĐĐ-генератор опиŃаний для Твиттера"],"AI social title generator":["ĐĐ-генератор заголовков для ŃоцŃетей"],"AI social description generator":["ĐĐ-генератор опиŃаний для ŃоцŃетей"],"Twitter preview":["Предварительный проŃмотр Twitter"],"Dismiss":["Скрыть"],"Don’t show again":["БольŃе не показывать"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sСовет%2$s: ПовыŃьте точноŃть генерирŃемых ĐРзаголовков, напиŃав больŃе Ńодержимого на Ńвоей Ńтранице."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sСовет%2$s: ПовыŃьте точноŃть генерирŃемых ĐРопиŃаний, напиŃав больŃе Ńодержимого на Ńвоей Ńтранице."],"Try again":["ПопробŃйте ещё раз"],"Social preview":["Предварительный проŃмотр ŃоцŃетей"],"Desktop result":["РезŃльтат на ПК"],"Mobile result":["Мобильный резŃльтат"],"Apply AI description":["Применить ĐĐ-опиŃание"],"Apply AI title":["Применить ĐĐ-заголовок"],"Next":["Далее"],"Previous":["Назад"],"Generate 5 more":["Сгенерировать ещё 5"],"Google preview":["ПредпроŃмотр Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Đ’ Ńвязи Ń Ń‚ĐµĐĽ, что OpenAI придерживаетŃŃŹ Ńтрогих этичеŃких принципов и %1$sполитики иŃпользования%2$s, ĐĽŃ‹ не можем генерировать SEO-заголовки для ваŃей Ńтраницы. Đ•Ńли вы планирŃете пользоватьŃŃŹ иŃĐşŃŃŃтвенным интеллектом, пожалŃĐąŃта, избегайте иŃпользования наŃильŃтвенного или ŃекŃŃально откровенного Ńодержимого. %3$sПодробнее Đľ том, как наŃтроить Ńвою ŃтраницŃ, чтобы добитьŃŃŹ наилŃчŃих резŃльтатов при иŃпользовании ĐĐ%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Đ’ Ńвязи Ń Ń‚ĐµĐĽ, что OpenAI придерживаетŃŃŹ Ńтрогих этичеŃких принципов и %1$sполитики иŃпользования%2$s, ĐĽŃ‹ не можем генерировать метаопиŃания для ваŃей Ńтраницы. Đ•Ńли вы ŃобираетеŃŃŚ пользоватьŃŃŹ иŃĐşŃŃŃтвенным интеллектом, пожалŃĐąŃта, избегайте иŃпользования наŃильŃтвенного или ŃекŃŃально откровенного контента. %3$sПодробнее Đľ том, как наŃтроить Ńвою ŃтраницŃ, чтобы добитьŃŃŹ наилŃчŃих резŃльтатов при иŃпользовании ĐĐ%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Чтобы полŃчить Đ´ĐľŃŃ‚ŃĐż Đş этой Ń„Ńнкции, необходимо иметь активнŃŃŽ подпиŃĐşŃ %1$s. ПожалŃĐąŃта, %3$sактивирŃйте подпиŃĐşŃ Đ˛ %2$s%4$s или %5$sполŃчите новŃŃŽ %1$sподпиŃĐşŃ%6$s. ПоŃле этого нажмите кнопкŃ, чтобы обновить ŃŃ‚Ń€Đ°Đ˝Đ¸Ń†Ń Đ´Đ»ŃŹ корректной работы Ń„Ńнкции, что может занять Đ´Đľ 30 ŃекŃнд."],"Refresh page":["Обновить ŃтраницŃ"],"Not enough content":["НедоŃтаточно Ńодержимого"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["ПожалŃĐąŃта, повторите ĐżĐľĐżŃ‹Ń‚ĐşŃ ĐżĐľĐ·Đ¶Đµ. Đ•Ńли проблема не реŃена, %1$sобратитеŃŃŚ в ŃĐ»ŃĐ¶Đ±Ń ĐżĐľĐ´Đ´ĐµŃ€Đ¶ĐşĐ¸%2$s!"],"Something went wrong":["Что-то поŃло не так"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Похоже, время ожидание иŃтекло. ПожалŃĐąŃта, проверьте Ńоединение Ń Đ¸Đ˝Ń‚ĐµŃ€Đ˝ĐµŃ‚ĐľĐĽ и повторите попыткŃ. Đ•Ńли проблема не реŃена, пожалŃĐąŃта, %1$sобратитеŃŃŚ в ŃĐ»ŃĐ¶Đ±Ń ĐżĐľĐ´Đ´ĐµŃ€Đ¶ĐşĐ¸%2$s!"],"Connection timeout":["Время ожидания Ńоединения иŃтекло"],"Use AI":["ĐŃпользŃйте ĐĐ"],"Close modal":["Закрыть модальное окно"],"Learn more about AI (Opens in a new browser tab)":["Подробнее Đľ ĐĐ (Открыть в новой вкладке)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sЗаголовок%3$s: ĐŁ ваŃей Ńтраницы пока нет Заголовка. %2$sДобавьте его%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sЗаголовок%2$s: ĐŁ ваŃей Ńтраницы еŃть заголовок. Отличная работа!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sРаŃпределение ключевой фразы%3$s: %2$sĐŃпользŃйте в текŃте ваŃŃ ĐşĐ»ŃŽŃ‡ĐµĐ˛ŃŃŽ Ń„Ń€Đ°Đ·Ń Đ¸ ее Ńинонимы, чтобы ĐĽŃ‹ могли поŃчитать раŃпределение ключевой фразы%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sРаŃпределение ключевой фразы%2$s: Отлично!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sРаŃпределение ключевой фразы%3$s: Неравномерное. Некоторые чаŃти ваŃего текŃта не Ńодержат ключевой фразы или ее Ńинонимов. %2$sРаŃпределите их более равномерно%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sРаŃпределение ключевой фразы%3$s: Очень неравномерное. БольŃие чаŃти ваŃего текŃта не Ńодержат ключевой фразы или ее Ńинонимов. %2$sРаŃпределите их более равномерно%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: Đ’Ń‹ не иŃпользŃете ŃлиŃком много Ńложных Ńлов, что делает Đ˛Đ°Ń Ń‚ĐµĐşŃŃ‚ легким для чтения. ХороŃая работа!"],"Word complexity":["СложноŃть Ńлов"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s Ńлов в ваŃем текŃте ŃчитаютŃŃŹ Ńложными. %3$sПопробŃйте иŃпользовать более короткие и знакомые Ńлова для ŃĐ»ŃчŃения читабельноŃти%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sВыравнивание%3$s: Đ•Ńть длинный фрагмент текŃта, раŃположенного по центрŃ.%2$sМы рекомендŃем Ńделать выравнивание по Đ»ĐµĐ˛ĐľĐĽŃ ĐşŃ€Đ°ŃŽ.%3$s.","%1$sВыравнивание%3$s: Đ•Ńть %4$s длинных фрагмента текŃта, раŃположенных по центрŃ. %2$sМы рекомендŃем Ńделать выравнивание по Đ»ĐµĐ˛ĐľĐĽŃ ĐşŃ€Đ°ŃŽ.%3$s.","%1$sВыравнивание%3$s: Đ•Ńть %4$s длинных фрагментов текŃта, раŃположенных по центрŃ. %2$sМы рекомендŃем Ńделать выравнивание по Đ»ĐµĐ˛ĐľĐĽŃ ĐşŃ€Đ°ŃŽ.%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sВыравнивание%3$s: Đ•Ńть длинный фрагмент текŃта, раŃположенного по центрŃ.%2$sМы рекомендŃем Ńделать выравнивание по ĐżŃ€Đ°Đ˛ĐľĐĽŃ ĐşŃ€Đ°ŃŽ.%3$s.","%1$sВыравнивание%3$s: Đ•Ńть %4$s длинных фрагмента текŃта, раŃположенных по центрŃ. %2$sМы рекомендŃем Ńделать выравнивание по ĐżŃ€Đ°Đ˛ĐľĐĽŃ ĐşŃ€Đ°ŃŽ.%3$s.","%1$sВыравнивание%3$s: Đ•Ńть %4$s длинных фрагментов текŃта, раŃположенных по центрŃ. %2$sМы рекомендŃем Ńделать выравнивание по ĐżŃ€Đ°Đ˛ĐľĐĽŃ ĐşŃ€Đ°ŃŽ.%3$s."],"Select image":["Выберите изображение"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Пора добавить неŃколько ŃŃылок! Ниже вы видите ŃпиŃок Ń Đ˛Đ°Ńими краеŃгольными камнями. Под каждым из них еŃть предложения Ńтатей, на которые вы можете добавить ŃŃылкŃ. При добавлении ŃŃылки ŃбедитеŃŃŚ, что она вŃтавлена в ŃоответŃтвŃющее предложение, Ńвязанное Ń Đ˛Đ°Ńей краеŃгольной Ńтатьей. Продолжайте добавлять ŃŃылки из Ńтольких Ńтатей, Ńколько вам Đ˝Ńжно, пока ваŃи краеŃгольные камни не бŃĐ´ŃŃ‚ иметь наибольŃее количеŃтво внŃтренних ŃŃылок, Ńказывающих на них."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Некоторые Ńтатьи на ваŃем Ńайте %1$sŃамые%2$s важные. Они отвечают на вопроŃŃ‹ людей и реŃают их проблемы. Значит, они заŃĐ»Ńживают выŃокого меŃта в рейтинге! Đ’ %3$s ĐĽŃ‹ называем их краеŃгольными Ńтатьями. Один из ŃпоŃобов повыŃить их рейтинг - размеŃтить на них Đ´ĐľŃтаточное количеŃтво ŃŃылок. БольŃее количеŃтво ŃŃылок ŃигнализирŃет поиŃковым ŃиŃтемам, что эти Ńтатьи важны и ценны. Đ’ этом тренажёре ĐĽŃ‹ поможем вам добавить ŃŃылки на ваŃи краеŃгольные Ńтатьи!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Когда вы добавите немного больŃе копий, ĐĽŃ‹ Ńможем определить Ńровень формальноŃти ваŃего текŃта."],"Overall, your text appears to be %1$s%3$s%2$s.":["Đ’ целом, Đ˛Đ°Ń Ń‚ĐµĐşŃŃ‚ выглядит, как %1$s%3$s%2$s."],"Heading %d":["Заголовок %d"],"Maximum heading level":["МакŃимальный Ńровень заголовка"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["ĐŁ Đ˛Đ°Ń ĐľŃ‚ĐşĐ»ŃŽŃ‡ĐµĐ˝Ń‹ Предложения ŃŃылок, которые необходимы для работы Ńвязанных ŃŃылок. Đ•Ńли вы хотите добавить Ńвязанные ŃŃылки, пожалŃĐąŃта, перейдите на ФŃнкции Ńайта и включите Предложения ŃŃылок."],"Schema":["Схема"],"Meta tags":["Метатеги"],"Not available":["НедоŃŃ‚Ńпно"],"Checks":["Проверки"],"Focus Keyphrase":["ФокŃŃная ключевая фраза"],"Good":["ХороŃĐľ"],"No index":["Без индекŃа"],"Front-end SEO inspector":["Фронт-енд SEO инŃпектор"],"Focus keyphrase not set":["ФокŃŃная ключевая фраза не ŃŃтановлена"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Обратите внимание: чтобы этот тренажер работал хороŃĐľ, необходимо запŃŃтить инŃтрŃмент оптимизации данных SEO. ĐдминиŃтраторы могŃŃ‚ запŃŃтить его в разделе %1$sSEO > ĐĐ˝ŃтрŃменты%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Đ’Ń‹ добавили ŃŃылки на Ńвои ĐľŃиротевŃие Ńтатьи и очиŃтили те, которые Ńтратили актŃальноŃть. Отличная работа! ПоŃмотрите на ŃĐ˛ĐľĐ´ĐşŃ Đ˝Đ¸Đ¶Đµ и порадŃйтеŃŃŚ томŃ, чего вы Đ´ĐľŃтигли!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["КритичеŃки изŃчите Ńодержимое этого ŃпиŃка и Ńделайте необходимые обновления. Đ•Ńли вам Đ˝Ńжна помощь Ń ĐľĐ±Đ˝ĐľĐ˛Đ»ĐµĐ˝Đ¸ĐµĐĽ, Ń Đ˝Đ°Ń ĐµŃть очень %1$sполезная Ńтатья в блоге, которая поможет вам пройти веŃŃŚ ĐżŃть%2$s (нажмите, чтобы открыть в новой вкладке)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sĐťŃжны дополнительные рекомендации? Мы подробно опиŃали каждый Ńаг в ŃледŃющем Ń€ŃководŃтве: %2$sКак иŃпользовать ĐľŃиротевŃее Ńодержимое %7$s%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Đ’Ń‹ только что облегчили поиŃĐş ваŃего Đ»ŃчŃего контента и повыŃили вероятноŃть его ранжирования! Так держать! Время от времени не забывайте проверять, Đ´ĐľŃтаточно ли ŃŃылок полŃчают ваŃи краеŃгольные камни!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Взгляните на приведенный ниже ŃпиŃок. Đмеют ли ваŃи краеŃгольные камни (отмеченные %1$s) наибольŃее количеŃтво внŃтренних ŃŃылок, Ńказывающих на них? Нажмите на ĐşĐ˝ĐľĐżĐşŃ ĐžĐżŃ‚Đ¸ĐĽĐ¸Đ·Đ¸Ń€ĐľĐ˛Đ°Ń‚ŃŚ, еŃли вы Ńчитаете, что краеŃгольный камень Đ˝ŃждаетŃŃŹ в больŃем количеŃтве ŃŃылок. Это переведет Ńтатью на ŃледŃющий Ńаг."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Đ’Ńе ли ваŃи краеŃгольные камни имеют зеленые значки? Для Đ´ĐľŃтижения наилŃчŃих резŃльтатов отредактирŃйте те, Ń ĐşĐľŃ‚ĐľŃ€Ń‹Ń… их нет!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Какие Ńтатьи вы хотите ранжировать выŃе вŃего? Какие из них ваŃа аŃдитория Ńочтет наиболее полезными и полными? Нажмите на ŃтрелкŃ, ŃказывающŃŃŽ вниз, и найдите Ńтатьи, которые ŃоответŃтвŃŃŽŃ‚ этим критериям. Мы автоматичеŃки пометим Ńтатьи, которые вы выберете из ŃпиŃка, как краеŃгольные."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sĐťŃжны дополнительные рекомендации? Мы подробно опиŃали каждый Ńаг в Ńтатье: %2$sКак иŃпользовать тренажер %7$s по краеŃĐłĐľĐ»ŃŚĐ˝ĐľĐĽŃ ŃодержимомŃ%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["ПодŃтраницы Yoast"],"Yoast Siblings":["Братья и ŃŃ‘Ńтры Yoast"],"Yoast Table of Contents":["Таблица Ńодержания Yoast"],"Yoast Related Links":["Связанные ŃŃылки Yoast"],"Finish optimizing":["ЗаверŃить оптимизацию"],"You've finished adding links to this article.":["Đ’Ń‹ заверŃили добавление ŃŃылок Đş этой Ńтатье."],"Optimize":["Оптимизировать"],"Added to next step":["Добавлено Đş ŃледŃŃŽŃ‰ĐµĐĽŃ ŃагŃ"],"Choose cornerstone articles...":["Выберите краеŃгольные Ńтатьи..."],"Loading data...":["ЗагрŃзка даннных..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Đ’Ń‹ ещё не очиŃтили или не обновили ни одной Ńтатьи Ń ĐżĐľĐĽĐľŃ‰ŃŚŃŽ этого тренажёра. Как только вы это Ńделаете, резŃльтат ваŃей работы появитŃŃŹ здеŃŃŚ. "],"Skipped":["ПропŃщено"],"Hidden from search engines.":["Скрыто от поиŃковых ŃиŃтем."],"Removed":["Удалено"],"Improved":["ĐŁĐ»ŃчŃено"],"Resolution":["РазреŃение"],"Loading redirect options...":["ЗагрŃзка параметров перенаправления..."],"Remove and redirect":["Удалить и перенаправить"],"Custom url:":["ПользовательŃкий url:"],"Related article:":["Связанная Ńтатья:"],"Home page:":["ДомаŃняя Ńтраница:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Đ’Ń‹ ŃобираетеŃŃŚ Ńдалить %1$s%2$s%3$s. Чтобы избежать ĐľŃибок 404 на ваŃем Ńайте, вы должны перенаправить его на Đ´Ń€ŃĐłŃŃŽ ŃтраницŃ. ĐšŃда бы вы хотели его перенаправить?"],"SEO Workout: Remove article":["Тренажёр SEO: Ńдалить Ńтатью"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Đ’ŃŃ‘ выглядит отлично! Мы не наŃли на ваŃем Ńайте ни одной Ńтатьи, ŃтарŃе 6 меŃяцев и в которых мало ŃŃылок на Đ˛Đ°Ń Ńайт. ВернитеŃŃŚ Ńюда позже, чтобы Ńзнать Đľ новых предложениях по очиŃтке!"],"Hide from search engines":["Скрыть от поиŃковых ŃиŃтем"],"Improve":["ĐŁĐ»ŃчŃить"],"Are you sure you wish to hide this article from search engines?":["Đ’Ń‹ Ńверены, что хотите Ńкрыть ŃŤŃ‚Ń Ńтатью от поиŃковых ŃиŃтем?"],"Action":["ДейŃтвие"],"You've hidden this article from search engines.":["Đ’Ń‹ Ńкрыли ŃŤŃ‚Ń Ńтатью от поиŃковых ŃиŃтем."],"You've removed this article.":["Đ’Ń‹ Ńдалили ŃŤŃ‚Ń Ńтатью."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["На данный момент вы не выбрали ни одной Ńтатьи для ŃĐ»ŃчŃения. Выберите неŃколько Ńтатей в предыдŃщем Ńаге, чтобы добавить ŃŃылки на них, и ĐĽŃ‹ покажем вам предложения ŃŃылок здеŃŃŚ."],"Loading link suggestions...":["ЗагрŃзка предложений по ŃŃылкам..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Мы не наŃли предложений по этой Ńтатье, но, конечно же, вы можете добавить ŃŃылки на Ńвязанные, по ваŃĐµĐĽŃ ĐĽĐ˝ĐµĐ˝Đ¸ŃŽ, Ńтатьи."],"Skip":["ПропŃŃтить"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Đ’Ń‹ ещё не выбрали Ńтатьи для этого Ńага. Đ’Ń‹ можете Ńделать это в предыдŃщем Ńаге."],"Is it up-to-date?":["Это актŃально?"],"Last Updated":["ПоŃледнее обновление"],"You've moved this article to the next step.":["Đ’Ń‹ перемеŃтили ŃŤŃ‚Ń Ńтатью в ŃледŃющий Ńаг."],"Unknown":["НеизвеŃтно"],"Clear summary":["ОчиŃтить резŃльтаты"],"Add internal links towards your orphaned articles.":["Добавьте внŃтренние ŃŃылки на Ńтатьи-Ńироты."],"Should you update your article?":["ĐťŃжно ли обновлять Ńтатью?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Đ’Đ°Ń Ńайт может Ńодержать множеŃтво Ńозданной когда-то информации, Đş которой больŃе никогда не возвращаютŃŃŹ. Важно проŃмотреть её и реŃить, являетŃŃŹ ли это Ńодержимое актŃальным для ваŃего Ńайта. ĐŁĐ»ŃчŃить его или Ńдалить?"],"Start: Love it or leave it?":["Начать: или так, или никак"],"Clean up your unlinked content to make sure people can find it":["ОчиŃтите неŃвязанное Ńодержимое, чтобы люди могли его найти"],"I've finished this workout":["ĐŻ закончил тренировкŃ"],"Reset this workout":["СброŃить тренировкŃ"],"Well done!":["Отлично!"],"Add internal links towards your cornerstones":["Добавьте внŃтренние ŃŃылки на краеŃгольнŃŃŽ информацию"],"Check the number of incoming internal links of your cornerstones":["Проверьте количеŃтво входящих внŃтренних ŃŃылок краеŃгольной информации"],"Start: Choose your cornerstones!":["Начать: выберите краеŃгольнŃŃŽ информацию!"],"The cornerstone approach":["КраеŃгольный подход"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Обратите внимание: чтобы этот тренажёр работал правильно и предлагал варианты ŃŃылок, вам ŃледŃет запŃŃтить инŃтрŃмент SEO-оптимизации данных. ĐдминиŃтраторы могŃŃ‚ запŃŃтить этот инŃтрŃмент в разделе %1$sSEO > ĐĐ˝ŃтрŃменты%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["ĐŻ заверŃил этот Ńаг"],"Revise this step":["ПроŃмотреть Ńаг"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Нам не ŃдалоŃŃŚ найти внŃтренние ŃŃылки на ваŃих Ńайтах. Либо вы ещё не добавили внŃтренние ŃŃылки в Ńвое Ńодержимое, либо Yoast SEO не проиндекŃировал их. Чтобы Yoast SEO проиндекŃировал ŃŃылки, запŃŃтите SEO-оптимизацию данных в разделе SEO > ĐĐ˝ŃтрŃменты."],"Incoming links":["Входящие ŃŃылки"],"Edit to add link":["Редактировать, чтобы добавить ŃŃылкŃ"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["На данный момент Ń Đ˛Đ°Ń Đ˝ĐµŃ‚ Ńтатей, отмеченных как краеŃгольные. Когда вы отметите Ńтатьи как краеŃгольные, ĐĽŃ‹ отобразим их здеŃŃŚ."],"Focus keyphrase":["ФокŃŃное ключевое Ńлово"],"Article":["Статья"],"Readability score":["Оценка читабельноŃти"],"SEO score":["Оценка SEO"],"Copy failed":["Не ŃдалоŃŃŚ Ńкопировать"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["ĐŁĐ»ŃчŃите ранжирование для вŃей краеŃгольной информации Ń ĐżĐľĐĽĐľŃ‰ŃŚŃŽ этого %1$sпоŃагового тренажёра!%2$s"],"Rank with articles you want to rank with":["Ранжирование по Ńтатьям, по которым вы хотите ранжировать"],"Descriptive text":["ОпиŃательный текŃŃ‚"],"Show the descriptive text":["Отображать опиŃательный текŃŃ‚"],"Show icon":["Отображать иконкŃ"],"Yoast Estimated Reading Time":["Приблизительное время чтения ŃоглаŃно Yoast"],"Shows an estimated reading time based on the content length.":["Отображает приблизительное время чтения, ĐľŃновываяŃŃŚ на размере Ńодержимого."],"reading time":["время чтения"],"content length":["длина Ńодержимого"],"Estimated reading time:":["Приблизительное время чтения:"],"minute":["минŃта","минŃты","минŃŃ‚"],"Settings":["НаŃтройки"],"OK":["OK"],"Close":["Закрыть"],"Type":["Тип"],"Orphaned content":["БеŃхозный контент"],"Synonyms":["Синонимы"],"Internal linking suggestions":["Предложения по внŃтренней компоновке"],"Enter a related keyphrase to calculate the SEO score":["Введите ŃоответŃтвŃющŃŃŽ ключевŃŃŽ Ń„Ń€Đ°Đ·Ń Đ´Đ»ŃŹ раŃчета оценки SEO"],"Related keyphrase":["Связанная ключевая фраза"],"Add related keyphrase":["Добавить похожее ключевое Ńлово"],"Analysis results":["РезŃльтаты анализа"],"Help on choosing the perfect keyphrase":["Помочь подобрать идеальные ключевые фразы"],"Help on keyphrase synonyms":["Справка по Ńинонимам ключевых фраз"],"Keyphrase":["Ключевая фраза"],"New URL: {{link}}%s{{/link}}":["Новая ŃŃылка: {{link}}%s{{/link}}"],"Undo":["Отменить дейŃтвие"],"Redirect created":["Редирект Ńоздан"],"%s just created a redirect from the old URL to the new URL.":["Только что %s Ńоздал редирект ŃĐľ Ńтарой ŃŃылки на новŃŃŽ."],"Old URL: {{link}}%s{{/link}}":["Старая ŃŃылка: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Синонимы ключевой фразы"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["ПоделитьŃŃŹ в Twitter предварительный проŃмотр"],"Adds a list of internal links to sibling pages which share the same parent.":["Добавляет ŃпиŃок внŃтренних ŃŃылок на подŃтраницы, имеющие ĐľĐ´Đ˝Ń Đ¸ Ń‚Ń Đ¶Đµ родительŃĐşŃŃŽ ŃтраницŃ."],"siblings":["подŃровень"],"sibling pages":["подŃтраницы"],"Adds a list of internal links to subpages of this page.":["Добавляет ŃпиŃок внŃтренних ŃŃылок на подŃтраницы этой Ńтраницы."],"seo":["seo"],"subpages":["подŃтраницы"],"childpages":["дочерние Ńтраницы"],"children":["дочерняя"],"internal linking":["внŃтренние ŃŃылки"],"site structure":["ŃтрŃктŃра Ńайта"],"We could not find any relevant articles on your website that you could link to from your post.":["Мы не Ńмогли найти на ваŃем веб-Ńайте ŃоответŃтвŃющие Ńтатьи, на которые вы могли бы ŃĐľŃлатьŃŃŹ в Ńвоем Ńообщении."],"Load suggestions":["ЗагрŃзить предложения"],"Refresh suggestions":["Обновить предложения"],"Write list…":["НапиŃите ŃпиŃок…"],"Adds a list of links related to this page.":["Добавляет ŃпиŃок ŃŃылок, отноŃящихŃŃŹ Đş этой Ńтранице."],"related posts":["похожие запиŃи"],"related pages":["похожие Ńтраницы"],"Adds a table of contents to this page.":["Добавляет оглавление на ŃŤŃ‚Ń ŃтраницŃ."],"links":["ŃŃылки"],"toc":["Ńодержание"],"Copy link":["Скопировать ŃŃылкŃ"],"Copy link to suggested article: %s":["Скопировать ŃŃŃ‹Đ»ĐşŃ Đ˛ предложеннŃŃŽ Ńтатью: %s"],"Add a title to your post for the best internal linking suggestions.":["Добавьте заголовок Đş ŃĐ˛ĐľĐµĐĽŃ ĐżĐľŃŃ‚Ń, чтобы ŃĐ»ŃчŃить предложения по внŃтренней перелинковке."],"Add a metadescription to your post for the best internal linking suggestions.":["Добавьте метаопиŃание Đş ŃĐ˛ĐľĐµĐĽŃ ĐżĐľŃŃ‚Ń, чтобы ŃĐ»ŃчŃить предложения по внŃтренней перелинковке."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Добавьте заголовок и метаопиŃание Đş ŃĐ˛ĐľĐµĐĽŃ ĐżĐľŃŃ‚Ń, чтобы ŃĐ»ŃчŃить предложения по внŃтренней перелинковке."],"Also, add a title to your post for the best internal linking suggestions.":["Еще добавьте заголовок Đş ŃĐ˛ĐľĐµĐĽŃ ĐżĐľŃŃ‚Ń, чтобы ŃĐ»ŃчŃить предложения по внŃтренним ŃŃылкам."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Еще добавьте метаопиŃание Đş ŃĐ˛ĐľĐµĐĽŃ ĐżĐľŃŃ‚Ń, чтобы ŃĐ»ŃчŃить предложения по внŃтренним ŃŃылкам."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Еще добавьте заголовок и метаопиŃание Đş ŃĐ˛ĐľĐµĐĽŃ ĐżĐľŃŃ‚Ń, чтобы полŃчить Đ»ŃчŃие предложения по внŃтренним ŃŃылкам."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Как только вы добавите немного больŃе копий, ĐĽŃ‹ дадим вам ŃпиŃок Ńвязанного контента здеŃŃŚ, на который вы можете ŃŃылатьŃŃŹ в ваŃем поŃте."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Чтобы ŃĐ»ŃчŃить ŃтрŃктŃŃ€Ń Đ˛Đ°Ńего Ńайта, раŃŃмотрите возможноŃть размещения ŃŃылок на Đ´Ń€Ńгие ŃоответŃтвŃющие поŃты или Ńтраницы на ваŃем Ńайте."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Отображение ŃпиŃка Ńвязанного контента, на который можно ŃŃылатьŃŃŹ, займет неŃколько ŃекŃнд. Предложения бŃĐ´ŃŃ‚ показаны здеŃŃŚ, как только они бŃĐ´ŃŃ‚ полŃчены."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Читайте наŃе Ń€ŃководŃтво по внŃтренним ŃŃылкам для SEO{{a}, чтобы Ńзнать больŃе."],"Copied!":["Скопировано!"],"Not supported!":["Не поддерживаетŃŃŹ!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Đ’Ń‹ пытаетеŃŃŚ иŃпользовать неŃколько Ńвязанных ключевых фраз? Đ’Ń‹ должны добавить их отдельно."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["ВаŃа ключевая фраза ŃлиŃком длинная. Она может быть макŃимŃĐĽ 191 Ńимвол."],"Add as related keyphrase":["Добавить как ŃвязаннŃŃŽ ключевŃŃŽ фразŃ"],"Added!":["Добавлено!"],"Remove":["Убрать"],"Table of contents":["Содержание"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Нам необходимо оптимизировать SEO-данные ваŃего Ńайта, чтобы ĐĽŃ‹ могли предложить вам Đ»ŃчŃŃŃŽ %1$sĐżĐµŃ€ĐµĐ»Đ¸Đ˝ĐşĐľĐ˛ĐşŃ ĐżŃ€ĐµĐ´Đ»ĐľĐ¶ĐµĐ˝Đ¸Đą%2$s.\n\n%3$sНачать оптимизацию SEO-данных%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-sk_SK.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-sk_SK.json deleted file mode 100644 index c061e966..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-sk_SK.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;","lang":"sk"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Nastavenia"],"OK":["OK"],"Close":["ZatvoriĹĄ"],"Type":["Type"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-sl_SI.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-sl_SI.json deleted file mode 100644 index c29c2b27..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-sl_SI.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);","lang":"sl_SI"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Opisno besedilo"],"Show the descriptive text":["PrikaĹľi opisno besedilo"],"Show icon":["PrikaĹľi ikono"],"Yoast Estimated Reading Time":["Yoast predviden ÄŤas branja"],"Shows an estimated reading time based on the content length.":["Prikazuje predviden ÄŤas branja na podlagi dolĹľine besedila"],"reading time":["ÄŤas branja"],"content length":["dolĹľina besedila"],"Estimated reading time:":["Predviden ÄŤas branja"],"minute":["minuta","minuti","minute","minut"],"Settings":["Nastavitve"],"OK":["V redu"],"Close":["Zapri"],"Type":["Tip"],"Orphaned content":["Orphaned content"],"Synonyms":["Sopomenke"],"Internal linking suggestions":["Predlogi za notranje povezave"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Povezana besedna zveza"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Rezultati analize"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["PomoÄŤ pri sopomenkah s kljuÄŤnimi besedami"],"Keyphrase":["KljuÄŤna beseda"],"New URL: {{link}}%s{{/link}}":["Nov URL: {{link}}%s{{/link}}"],"Undo":["Razveljavi"],"Redirect created":["Preusmeritev ustvarjena"],"%s just created a redirect from the old URL to the new URL.":["%s je pravkar ustvaril preusmeritev s starega na nov URL."],"Old URL: {{link}}%s{{/link}}":["Star URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Sinonimi s kljuÄŤnimi besedami"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":["seo"],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["notranje povezave"],"site structure":["struktura strani"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["NaloĹľi predloge"],"Refresh suggestions":["OsveĹľi predloge"],"Write list…":["Napiši seznam..."],"Adds a list of links related to this page.":["Doda seznam povezav povezanih s stranjo."],"related posts":["povezani prispevki"],"related pages":["povezane strani"],"Adds a table of contents to this page.":["Doda vsebinsko kazalo tabeli prispevka na tej strani. "],"links":["linki"],"toc":["toc"],"Copy link":["Kopiraj povezavo"],"Copy link to suggested article: %s":["Kopiraj povezavo do predlaganega ÄŤlanka: %s"],"Add a title to your post for the best internal linking suggestions.":["Dodajte svoji objavi naslov za najboljše predloge notranjih povezav."],"Add a metadescription to your post for the best internal linking suggestions.":["Dodajte objavi meta opis za najboljše predloge notranjih povezav."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Dodajte objavi naslov in meta opis za najboljše predloge notranjih povezav."],"Also, add a title to your post for the best internal linking suggestions.":["V objavo dodajte tudi naslov, da boste našli najboljše predloge za notranje povezave."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Dodajte meta opis za najboljše predloge za notranje povezave."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Dodajte objavi naslov in metaopis za najboljše predloge za notranje povezovanje."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Ko dodate malo veÄŤ besedila, vam bomo omogoÄŤili seznam povezane vsebine, na katero se lahko poveĹľete v svoji objavi."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Preberite naš vodnik o notranjih povezavah za SEO{{/ a}}, ÄŤe Ĺľelite izvedeti veÄŤ."],"Copied!":["Kopirano!"],"Not supported!":["Ne podpira!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Vsebinsko kazalo"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-sr_RS.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-sr_RS.json deleted file mode 100644 index 6223a672..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-sr_RS.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);","lang":"sr_RS"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":["Преглед дељења на Đ´Ń€ŃŃтвеним мрежама"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Како биŃте наŃтавили Ńа кориŃћењем Yoast AI Ń„ŃнкциŃе, молимо Đ˛Đ°Ń Đ´Đ° Ńмањите ŃчеŃталоŃŃ‚ ваŃих захтева. ĐťĐ°Ń %1$sчланак за помоћ%2$s прŃжа Ńмернице Đľ ефикаŃном ĐżĐ»Đ°Đ˝Đ¸Ń€Đ°ŃšŃ Đ¸ раŃĐżĐľŃ€ĐµŃ’Đ¸Đ˛Đ°ŃšŃ Đ˛Đ°Ńих захтева за оптимизован ток рада."],"You've reached the Yoast AI rate limit.":["ДоŃтигли Ńте ограничење брзине Yoast AI."],"Allow":["Дозволи"],"Deny":["ОдбиŃ"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Да биŃте видели ĐľĐ˛Đ°Ń Đ˛Đ¸Đ´ĐµĐľ, морате дозволити %1$s да Ńчитава Ńграђене видео Ńнимке Ńа %2$s."],"Text generated by AI may be offensive or inaccurate.":["ТекŃŃ‚ генериŃан од Ńтране веŃтачке интелигенциŃе може бити Ńвредљив или нетачан."],"(Opens in a new browser tab)":["(Отвара Ńе на Đ˝ĐľĐ˛ĐľŃ ĐşĐ°Ń€Ń‚Đ¸Ń†Đ¸ прегледача)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["УбрзаŃте ток рада ĐżĐľĐĽĐľŃ›Ń ĐłĐµĐ˝ĐµŃ€Đ°Ń‚Đ¸Đ˛Đ˝Đµ веŃтачке интелигенциŃе. ДобиŃте виŃококвалитетне предлоге наŃлова и опиŃа за приказ на претраживачима и Đ´Ń€ŃŃтвеним мрежама. %1$sСазнаŃте виŃе%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["ГенериŃи наŃлове и опиŃе кориŃтећи Yoast AI!"],"New to %1$s":["Ново на %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["ДаŃем одобрење за %1$sĐŁŃлове кориŃћења%2$s и %3$sĐźĐľĐ»Đ¸Ń‚Đ¸ĐşŃ ĐżŃ€Đ¸Đ˛Đ°Ń‚Đ˝ĐľŃти%4$s Yoast AI ŃервиŃа. Ово ŃкљŃчŃŃе ŃаглаŃноŃŃ‚ за прикŃпљање и кориŃћење података ради Ńнапређења кориŃничког иŃĐşŃŃтва."],"Start generating":["Започни генериŃање"],"Yes, revoke consent":["Да, повŃци ŃаглаŃноŃŃ‚"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Повлачењем ŃаглаŃноŃти виŃе нећете имати приŃŃ‚ŃĐż Yoast AI Ń„ŃнкционалноŃтима. Да ли Ńте ŃигŃрни да желите да повŃчете ŃаглаŃноŃŃ‚?"],"Something went wrong, please try again later.":["НеŃто Ńе поŃло наопако, молимо Đ˛Đ°Ń Đ´Đ° покŃŃате каŃниŃе."],"Revoke AI consent":["ПовŃци ŃаглаŃноŃŃ‚ за AI"],"Please enter a focus keyphrase first to use AI.":["Молимо Đ˛Đ°Ń Đ´Đ° ŃнеŃете кљŃŃ‡Đ˝Ń Ń„Ń€Đ°Đ·Ń Đ·Đ° фокŃŃирање пре почетка кориŃћења AI."],"AI title generator":["AI генератор наŃлова"],"AI description generator":["AI генератор опиŃа"],"AI Twitter title generator":["AI генератор наŃлова за Twitter"],"AI Twitter description generator":["AI генератор опиŃа за Twitter"],"AI social title generator":["AI генератор наŃлова за Đ´Ń€ŃŃтвене мреже"],"AI social description generator":["AI генератор опиŃа за Đ´Ń€ŃŃтвене мреже"],"Twitter preview":["Преглед за Твитер"],"Dismiss":["Одбаци"],"Don’t show again":["Не приказŃŃ ĐżĐľĐ˝ĐľĐ˛Đľ"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sСавет%2$s: ПобољŃаŃте тачноŃŃ‚ AI генериŃаних наŃлова тако Ńто ћете напиŃати виŃе ŃадржаŃа на ваŃĐľŃ Ńтраници."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sСавет%2$s: ПобољŃаŃте тачноŃŃ‚ AI генериŃаних опиŃа тако Ńто ћете напиŃати виŃе ŃадржаŃа на ваŃĐľŃ Ńтраници."],"Try again":["ПокŃŃĐ°Ń ĐżĐľĐ˝ĐľĐ˛Đľ"],"Social preview":["Преглед на Đ´Ń€ŃŃтвеним мрежама"],"Desktop result":["ДеŃктоп резŃлтат"],"Mobile result":["Мобилни резŃлтат"],"Apply AI description":["Примени AI опиŃ"],"Apply AI title":["Примени AI наŃлов"],"Next":["Следећа"],"Previous":["Преtходна"],"Generate 5 more":["ГенериŃи ŃĐľŃ 5"],"Google preview":["Google-ов преглед"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Због Ńтриктних етичких Ńмерница компаниŃе OpenAI и %1$sправила Đľ кориŃћењŃ%2$s, ниŃĐĽĐľ Ń ĐĽĐľĐłŃћноŃти да генериŃемо SEO наŃлове за ваŃŃ ŃтраницŃ. Уколико планирате да кориŃтите веŃŃ‚Đ°Ń‡ĐşŃ Đ¸Đ˝Ń‚ĐµĐ»Đ¸ĐłĐµĐ˝Ń†Đ¸ŃŃ, молимо Đ˛Đ°Ń Đ´Đ° избегавате екŃплицитан, наŃилан или ŃекŃŃално екŃплицитан ŃадржаŃ. %3$sПрочитаŃте виŃе Đľ томе како да подеŃите ваŃŃ ŃŃ‚Ń€Đ°Đ˝Đ¸Ń†Ń ĐşĐ°ĐşĐľ биŃте били ŃигŃрни да добиŃате наŃбоље резŃлтате кориŃтећи веŃŃ‚Đ°Ń‡ĐşŃ Đ¸Đ˝Ń‚ĐµĐ»Đ¸ĐłĐµĐ˝Ń†Đ¸ŃŃ%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Због Ńтриктних етичких Ńмерница компаниŃе OpenAI и %1$sправила Đľ кориŃћењŃ%2$s, ниŃĐĽĐľ Ń ĐĽĐľĐłŃћноŃти да генериŃемо мета опиŃе за ваŃŃ ŃтраницŃ. Уколико планирате да кориŃтите веŃŃ‚Đ°Ń‡ĐşŃ Đ¸Đ˝Ń‚ĐµĐ»Đ¸ĐłĐµĐ˝Ń†Đ¸ŃŃ, молимо Đ˛Đ°Ń Đ´Đ° избегавате екŃплицитан, наŃилан или ŃекŃŃално екŃплицитан ŃадржаŃ. %3$sПрочитаŃте виŃе Đľ томе како да подеŃите ŃвоŃŃ ŃŃ‚Ń€Đ°Đ˝Đ¸Ń†Ń ĐşĐ°ĐşĐľ биŃте били ŃигŃрни да добиŃате наŃбоље резŃлтате Ńа веŃтачком интелигенциŃом%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Да биŃте приŃŃ‚Ńпили ĐľĐ˛ĐľŃ Ń„ŃнкционалноŃти, неопходна вам Ńе активна %1$s претплата. Молимо Đ˛Đ°Ń Đ´Đ° %3$sактивирате ваŃŃ ĐżŃ€ĐµŃ‚ĐżĐ»Đ°Ń‚Ń Ń %2$s%4$s или %5$sзатражите Đ˝ĐľĐ˛Ń %1$s претплатŃ%6$s. Затим кликните на Đ´Ńгме за ĐľŃвежавање Ńтранице како биŃте омогŃћили правилан рад Ń„ŃнкциŃе, Ńто може траŃати и Đ´Đľ 30 ŃекŃнди."],"Refresh page":["ĐžŃвежи ŃтраницŃ"],"Not enough content":["Нема довољно ŃадржаŃа"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Молимо Đ˛Đ°Ń ĐżĐľĐşŃŃаŃте каŃниŃе. Уколико Ńе проблем наŃтави, молимо Đ˛Đ°Ń %1$sконтактираŃте Đ˝Đ°Ń Ń‚Đ¸ĐĽ за подрŃĐşŃ%2$s!"],"Something went wrong":["НеŃто Ńе поŃло наопако"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Đзгледа да Ńе Đ´ĐľŃло Đ´Đľ прекида Ń Đ˛ĐµĐ·Đ¸. Молимо Đ˛Đ°Ń ĐżŃ€ĐľĐ˛ĐµŃ€Đ¸Ń‚Đµ ваŃŃ Đ¸Đ˝Ń‚ĐµŃ€Đ˝ĐµŃ‚ конекциŃŃ Đ¸ покŃŃаŃте каŃниŃе поново. Уколико Ńе проблем наŃтави, молимо Đ˛Đ°Ń %1$sконтактираŃте Đ˝Đ°Ń Ń‚Đ¸ĐĽ за подрŃĐşŃ%2$s"],"Connection timeout":["Прекид Ń Đ˛ĐµĐ·Đ¸"],"Use AI":["КориŃти AI"],"Close modal":["Затвори модални прозор"],"Learn more about AI (Opens in a new browser tab)":["ĐˇĐ°Đ·Đ˝Đ°Ń Đ˛Đ¸Ńе Đľ AI (отвара нови Ńезичак за претрагŃ)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sTitle%3$s: Страница ŃĐľŃ Ńвек нема наŃлов. %2$sAdd one%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sНаŃлов%2$s: ВаŃа Ńтраница има наŃлов. Свака чаŃŃ‚!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sРаŃподела кљŃчних израза%3$s: %2$sУбаците ваŃе кљŃчне изразе или Ńинониме Ń Ń‚ĐµĐşŃŃ‚ како би могли да проверимо раŃĐżĐľĐ´ĐµĐ»Ń Đ¸Ńтих%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sРаŃподела кљŃчних израза%2$s: Добро одрађено."],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sРаŃподела кљŃчних израза%3$s: НеŃеднака. Неки делови ваŃег текŃта не Ńадрже кљŃчне изразе или Ńинониме. %2$sРаŃподелите их равномерниŃе%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sРаŃподела кљŃчних израза%3$s: Веома неŃеднака. Велики делови ваŃег текŃта не Ńадрже кљŃчне изразе или Ńинониме. %2$sРаŃподелите их равномерниŃе%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: Не кориŃтите превиŃе Ńложених речи, Ńто чини Đ˛Đ°Ń Ń‚ĐµĐşŃŃ‚ лаким за читање. Добар поŃао!"],"Word complexity":["КомплекŃноŃŃ‚ речи"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s речи Ń Đ˛Đ°Ńем текŃŃ‚Ń Ńе ŃматраŃŃ Ńложеним. %3$sПокŃŃаŃте да кориŃтите краће и познатиŃе речи да биŃте побољŃали читљивоŃŃ‚%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sПоравнање%3$s: ПоŃтоŃи Đ´Ńгачак одељак текŃта коŃи Ńе поравнат по Ńредини. %2$sПрепорŃчŃŃемо да га поравнате по Đ»ĐµĐ˛ĐľŃ Ńтрани%3$s.","%1$sПоравнање%3$s: ПоŃтоŃе %4$s Đ´Ńгачки одељци текŃта коŃи ŃŃ ĐżĐľŃ€Đ°Đ˛Đ˝Đ°Ń‚Đ¸ по Ńредини. %2$sПрепорŃчŃŃемо да их поравнате по Đ»ĐµĐ˛ĐľŃ Ńтрани%3$s.","%1$sПоравнање%3$s: ПоŃтоŃе %4$s Đ´Ńгачки одељци текŃта коŃи ŃŃ ĐżĐľŃ€Đ°Đ˛Đ˝Đ°Ń‚Đ¸ по Ńредини. %2$sПрепорŃчŃŃемо да их поравнате по Đ»ĐµĐ˛ĐľŃ Ńтрани%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sПоравнање%3$s: ПоŃтоŃи Đ´Ńгачак одељак текŃта коŃи Ńе поравнат по Ńредини. %2$sПрепорŃчŃŃемо да га поравнате по деŃĐ˝ĐľŃ Ńтрани%3$s.","%1$sПоравнање%3$s: ПоŃтоŃе %4$s Đ´Ńгачки одељци текŃта коŃи ŃŃ ĐżĐľŃ€Đ°Đ˛Đ˝Đ°Ń‚Đ¸ по Ńредини. %2$sWПрепорŃчŃŃемо да их поравнате по деŃĐ˝ĐľŃ Ńтрани%3$s.","%1$sПоравнање%3$s: ПоŃтоŃе %4$s Đ´Ńгачки одељци текŃта коŃи ŃŃ ĐżĐľŃ€Đ°Đ˛Đ˝Đ°Ń‚Đ¸ по Ńредини. %2$sWПрепорŃчŃŃемо да их поравнате по деŃĐ˝ĐľŃ Ńтрани%3$s."],"Select image":["Одабери ŃликŃ"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["Можда чак и не знате, али поŃтоŃе Ńтранице на ваŃем веб меŃŃ‚Ń ĐşĐľŃе не Ńадрже никакве везе. То Ńе проблем за SEO Ńер Ńе претраживачима теŃко да ĐżŃ€ĐľĐ˝Đ°Ń’Ń Ńтранице коŃе не Ńадрже везе па их Ńе Ńамим тим теже рангирати. То називамо напŃŃтеним ŃадржаŃем. ĐŁ ĐľĐ˛ĐľŃ Đ˛ĐµĐ¶Đ±Đ¸ проналазимо напŃŃтени ŃĐ°Đ´Ń€Đ¶Đ°Ń Đ˝Đ° ваŃем веб меŃŃ‚Ń Đ¸ водимо Đ˛Đ°Ń Ń Đ±Ń€Đ·Đľ додавање веза како би ваŃе веб меŃто добило ĐżŃ€Đ¸Đ»Đ¸ĐşŃ Đ´Đ° Ńе рангира!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Време Ńе да додате неке везе! ĐŃпод можете видети лиŃŃ‚Ń Đ˛Đ°Ńих напŃŃтених чланака. ĐŃпод Ńваког од њих поŃтоŃе предлози за Ńродне Ńтранице Ńа коŃих биŃте могли додати везŃ. Када додаŃете везŃ, Ńверите Ńе да Ńте Ńе Ńбацили Ń Ń€ĐµĐ»ĐµĐ˛Đ°Đ˝Ń‚Đ˝Ń Ń€ĐµŃ‡ĐµĐ˝Đ¸Ń†Ń ĐşĐľŃа Ńе повезана Ńа ваŃим напŃŃтеним чланком. НаŃтавите да додаŃете везе Ńваком од напŃŃтених чланака док не бŃдете задовољни броŃем веза коŃи ŃĐżŃŃ›ŃŃŃ Đ˝Đ° њих."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Време Ńе да додате неке везе! ĐŃпод можете видети лиŃŃ‚Ń Ńа ваŃим кљŃчним ŃадржаŃем. ĐŃпод Ńваког од њих поŃтоŃе предлози за чланке Ńа коŃих можете додати везŃ. Када додаŃете везŃ, Ńверите Ńе да Ńте Ńе Ńбацили Ń Ń€ĐµĐ»ĐµĐ˛Đ°Đ˝Ń‚Đ˝Ń Ń€ĐµŃ‡ĐµĐ˝Đ¸Ń†Ń ĐşĐľŃа Ńе повезана Ńа ваŃим кљŃчним ŃадржаŃем. НаŃтавите да додаŃете везе Ńа Ńто виŃе повезаних чланака док Đ˛Đ°Ń ĐşŃ™Ńчни ŃĐ°Đ´Ń€Đ¶Đ°Ń Đ˝Đµ бŃде имао наŃвиŃе ŃĐ˝ŃтраŃњих веза коŃе на њега ŃĐżŃŃ›ŃŃŃ."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Неки чланци на ваŃем веб меŃŃ‚Ń ŃŃ %1$sнаŃважниŃи%2$s. Они одговараŃŃ Ń™Ńдима на питања и реŃаваŃŃ ŃšĐ¸Ń…ĐľĐ˛Đµ проблеме, Ńто значи да заŃĐ»ŃжŃŃŃ Đ´Đ° Ńе рангираŃŃ! ĐŁ %3$s, ми их називамо кљŃчним чланцима. Đедан од начина да их рангирате ŃеŃте да имате довољно веза коŃи воде ка њима. ВиŃе веза даŃе Ńигнал претраживачима да ŃŃ ĐľĐ˛Đ¸ чланци важни и вредни. ĐŁ ĐľĐ˛ĐľŃ Đ˛ĐµĐ¶Đ±Đ¸, помажемо вам да додате везе ŃвоŃим кљŃчним чланцима."],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Када додате ŃĐľŃ Ń‚ĐµĐşŃта, моћи ћемо да проценимо ниво формалноŃти ваŃег текŃта."],"Overall, your text appears to be %1$s%3$s%2$s.":["Све Ń ŃвемŃ, Đ˛Đ°Ń Ń‚ĐµĐşŃŃ‚ изгледа као %1$s%3$s%2$s."],"Heading %d":["Заглавље %d"],"Maximum heading level":["МакŃимални ниво заглавља"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["ОнемогŃћили Ńте предлоге веза, Ńто Ńе потребно да би повезане везе Ń„ŃнкциониŃале. Уколико желите да додате Ńродне везе, идите на ФŃнкциŃе веб меŃта и омогŃћите предлоге веза."],"Schema":["Шема"],"Meta tags":["Мета ознаке"],"Not available":["НиŃе Đ´ĐľŃŃ‚Ńпно"],"Checks":["Провере"],"Focus Keyphrase":["ФокŃŃни кљŃчни израз"],"Good":["Добар"],"No index":["Нема индекŃа"],"Front-end SEO inspector":["Front-end SEO инŃпектор"],"Focus keyphrase not set":["ФокŃŃни кљŃчни израз ниŃе поŃтављен"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["ĐмаŃте на ŃĐĽŃ: да би ĐľĐ˛Đ°Ń Ń‚Ń€ĐµĐ˝Đ¸Đ˝Đł добро Ń„ŃнкциониŃао, морате покренŃти Đ°Đ»Đ°Ń‚ĐşŃ Đ·Đ° оптимизациŃŃ SEO података. ĐдминиŃтратори ово ĐĽĐľĐłŃ ĐżĐľĐşŃ€ĐµĐ˝Ńти под %1$sSEO > Đлати%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Додали Ńте везе Ń ŃвоŃе напŃŃтене чланке и почиŃтили оне коŃи виŃе ниŃŃ Ń€ĐµĐ»ĐµĐ˛Đ°Đ˝Ń‚Đ˝Đ¸. СŃаŃан поŃао! ПогледаŃте резиме иŃпод и проŃлавите оно Ńто Ńте поŃтигли!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Критички прегледаŃте ŃĐ°Đ´Ń€Đ¶Đ°Ń Đ˝Đ° ĐľĐ˛ĐľŃ Đ»Đ¸Ńти и изврŃите неопходна ажŃрирања. Đко вам Ńе потребна помоћ за ажŃрирање, имамо веома %1$sкориŃтан чланак на Đ±Đ»ĐľĐłŃ ĐşĐľŃи може да Đ˛Đ°Ń Ń€Ńководи Đ´Đľ краŃа%2$s (кликните да биŃте отворили Ń Đ˝ĐľĐ˛ĐľŃ ĐşĐ°Ń€Ń‚Đ¸Ń†Đ¸)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sТреба вам виŃе ŃĐżŃŃ‚Ńтава? Сваки корак ŃĐĽĐľ детаљниŃе покрили Ń Ńледећем водичŃ: %2$sвежба Како кориŃтити %7$s напŃŃтени ŃĐ°Đ´Ń€Đ¶Đ°Ń %3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Управо Ńте олакŃали проналажење Ńвог наŃбољег ŃадржаŃа и обезбедили веће ŃанŃе за рангирање! Свака чаŃŃ‚! С времена на време, не заборавите да проверите да ли Đ˛Đ°Ń ĐşŃ™Ńчни ŃĐ°Đ´Ń€Đ¶Đ°Ń Đ´ĐľĐ±Đ¸Ńа довољно веза!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["ПогледаŃте лиŃŃ‚Ń Đ¸Ńпод. Да ли ваŃи кљŃчни ŃадржаŃŃ (означени Ńа %1$s) имаŃŃ Đ˝Đ°ŃвиŃе ŃĐ˝ŃтраŃњих веза коŃе ŃĐżŃŃ›ŃŃŃ Đ˝Đ° њих? Кликните на Đ´Ńгме ОптимизŃŃ Đ°ĐşĐľ миŃлите да Ńе кљŃчном ŃадржаŃŃ ĐżĐľŃ‚Ń€ĐµĐ±Đ˝Đľ виŃе веза. То ће померити чланак на Ńледећи корак."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Да ли Ńви ваŃи кљŃчни ŃадржаŃи имаŃŃ Đ·ĐµĐ»ĐµĐ˝Đµ Ńтавке? За наŃбоље резŃлтате размиŃлите Đľ ŃŃ€ĐµŃ’Đ¸Đ˛Đ°ŃšŃ ĐľĐ˝Đ¸Ń… коŃи немаŃŃ!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["КоŃе чланке желите да рангирате наŃвиŃе? КоŃе би ваŃа ĐżŃблика Ńматрала наŃкориŃниŃим и наŃпотпŃниŃим? Кликните на ŃŃ‚Ń€ĐµĐ»Đ¸Ń†Ń ĐşĐľŃа показŃŃе надоле и потражите чланке коŃи одговараŃŃ Ń‚Đ¸ĐĽ критериŃŃмима. ĐŃтоматŃки ћемо означити чланке коŃе изаберете Ńа лиŃте као кљŃчни ŃадржаŃ."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sТреба вам виŃе ŃĐżŃŃ‚Ńтава? ДетаљниŃе ŃĐĽĐľ покрили Ńваки корак Ń: %2$sвежба Како кориŃтити %7$s кљŃчни ŃадржаŃ%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast подŃтранице"],"Yoast Siblings":["Yoast Ńродни"],"Yoast Table of Contents":["Yoast преглед ŃадржаŃа"],"Yoast Related Links":["Yoast Ńродне везе"],"Finish optimizing":["ЗаврŃите оптимизациŃŃ"],"You've finished adding links to this article.":["Додали Ńте везе Đ´Đľ овог чланка."],"Optimize":["ОптимизŃŃте"],"Added to next step":["Додато Ń Ńледећи корак"],"Choose cornerstone articles...":["Đзаберите кљŃчне чланке"],"Loading data...":["Учитавање података..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["ĐĐľŃ Đ˝Đ¸Ńте очиŃтили или ажŃрирали ниŃедан чланак кориŃтећи ĐľĐ˛Ń Đ˛ĐµĐ¶Đ±Ń. Када то Ńчините, овде ће Ńе поŃавити кратак преглед ваŃег рада."],"Skipped":["ПреŃкочено"],"Hidden from search engines.":["Скривено од претраживача."],"Removed":["Уклоњено"],"Improved":["ПобољŃано"],"Resolution":["РезолŃциŃа"],"Loading redirect options...":["ОпциŃе преŃŃмеравања Ńе ŃчитаваŃŃ..."],"Remove and redirect":["Уклони и преŃŃмери"],"Custom url:":["Прилагођен url:"],"Related article:":["Сродни чланак:"],"Home page:":["Почетна Ńтраница:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Спремате Ńе да Ńклоните %1$s%2$s%3$s. Да биŃте Ńпречили 404 на ваŃем веб меŃŃ‚Ń, требало би да Ńе преŃŃмерите на Đ´Ń€ŃĐłŃ ŃŃ‚Ń€Đ°Đ˝Đ¸Ń†Ń Đ˝Đ° ваŃем веб меŃŃ‚Ń. Где желите да га преŃŃмерите?"],"SEO Workout: Remove article":["SEO Вежба: Уклоните чланак"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Све изгледа добро! На ваŃем веб меŃŃ‚Ń Đ˝Đ¸ŃĐĽĐľ пронаŃли чланке ŃтариŃе од ŃеŃŃ‚ меŃеци коŃи примаŃŃ ĐżŃ€ĐµĐĽĐ°Đ»Đľ веза на ваŃем веб меŃŃ‚Ń. Вратите Ńе каŃниŃе овде за нове предлоге за чиŃћење!"],"Hide from search engines":["ĐˇĐ°ĐşŃ€Đ¸Ń ĐľĐ´ претраживача"],"Improve":["ПобољŃаŃте"],"Are you sure you wish to hide this article from search engines?":["ĐеŃте ли ŃигŃрни да желите да ŃакриŃете ĐľĐ˛Đ°Ń Ń‡Đ»Đ°Đ˝Đ°Đş од претраживача?"],"Action":["ĐкциŃа"],"You've hidden this article from search engines.":["Сакрили Ńте ĐľĐ˛Đ°Ń Ń‡Đ»Đ°Đ˝Đ°Đş од претраживача."],"You've removed this article.":["Уклонили Ńте ĐľĐ˛Đ°Ń Ń‡Đ»Đ°Đ˝Đ°Đş."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["ТренŃтно ниŃте изабрали ниŃедан чланак за побољŃање. Đзаберите неколико чланака Ń ĐżŃ€ĐµŃ‚Ń…ĐľĐ´Đ˝Đ¸ĐĽ корацима за додавање веза и ми ћемо вам овде показати предлоге веза."],"Loading link suggestions...":["УчитаваŃŃ Ńе предлози веза..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["НиŃĐĽĐľ пронаŃли никакве предлоге за ĐľĐ˛Đ°Ń Ń‡Đ»Đ°Đ˝Đ°Đş, али наравно да и даље можете да додате везе Đ´Đľ чланака за коŃе миŃлите да ŃŃ Ńродни."],"Skip":["ПреŃкочи"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["ĐĐľŃ Đ˝Đ¸Ńте изабрали ниŃедан чланак за ĐľĐ˛Đ°Ń ĐşĐľŃ€Đ°Đş. То можете Ńчинити Ń ĐżŃ€ĐµŃ‚Ń…ĐľĐ´Đ˝ĐľĐĽ коракŃ."],"Is it up-to-date?":["Да ли Ńе ажŃрирано?"],"Last Updated":["ПоŃледњи ĐżŃŃ‚ ажŃрирано"],"You've moved this article to the next step.":["ПремеŃтили Ńте ĐľĐ˛Đ°Ń Ń‡Đ»Đ°Đ˝Đ°Đş на Ńледећи корак."],"Unknown":["Непознато"],"Clear summary":["ĐаŃан резиме"],"Add internal links towards your orphaned articles.":["ДодаŃте интерне везе Đ´Đľ ŃвоŃих напŃŃтених чланака."],"Should you update your article?":["Да ли треба да ажŃрирате ŃĐ˛ĐľŃ Ń‡Đ»Đ°Đ˝Đ°Đş?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["ВаŃе веб меŃто може Ńадржати много ŃадржаŃа коŃи Ńе Ńедном направљен и на коŃи Ńе никада каŃниŃе ниŃе ĐľŃвртано. Важно Ńе да прођете кроз њих и запитате Ńе да ли Ńе ĐľĐ˛Đ°Ń ŃĐ°Đ´Ń€Đ¶Đ°Ń ŃĐľŃ Ńвек релевантан за ваŃе веб меŃто. Да ли треба да га поправим или Ńклоним?"],"Start: Love it or leave it?":["Почетак: Волите или ĐľŃтавите?"],"Clean up your unlinked content to make sure people can find it":["ОчиŃтите неповезани ŃĐ°Đ´Ń€Đ¶Đ°Ń Đ´Đ° биŃте били ŃигŃрни да га Ń™Ńди ĐĽĐľĐłŃ ĐżŃ€ĐľĐ˝Đ°Ń›Đ¸"],"I've finished this workout":["ЗаврŃио Ńам ĐľĐ˛Đ°Ń Ń‚Ń€ĐµĐ˝Đ¸Đ˝Đł"],"Reset this workout":["РеŃетŃŃте ĐľĐ˛Đ°Ń Ń‚Ń€ĐµĐ˝Đ¸Đ˝Đł"],"Well done!":["Добро Ńрађено!"],"Add internal links towards your cornerstones":["ДодаŃте ŃĐ˝ŃтраŃње везе ка кљŃчном ŃадржаŃŃ"],"Check the number of incoming internal links of your cornerstones":["Проверите Đ±Ń€ĐľŃ Đ´ĐľĐ»Đ°Đ·Đ˝Đ¸Ń… интерних веза Đ´Đľ ваŃих кљŃчних чланака"],"Start: Choose your cornerstones!":["Почетак: Одаберите ŃĐ˛ĐľŃ ĐşŃ™Ńчни ŃадржаŃ!"],"The cornerstone approach":["ПриŃŃ‚ŃĐż кљŃчног ŃадржаŃа"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["ĐмаŃте на ŃĐĽŃ: да би ĐľĐ˛Đ°Ń Ń‚Ń€ĐµĐ˝Đ¸Đ˝Đł добро Ń„ŃнкциониŃао и да би вам понŃдио предлоге за повезивање, морате покренŃти Đ°Đ»Đ°Ń‚ĐşŃ Đ·Đ° оптимизациŃŃ SEO података. ĐдминиŃтратори ово ĐĽĐľĐłŃ ĐżĐľĐşŃ€ĐµĐ˝Ńти под %1$sSEO > Đлати%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["ЗаврŃио Ńам ĐľĐ˛Đ°Ń ĐşĐľŃ€Đ°Đş"],"Revise this step":["Đ ĐµĐ˛Đ¸Đ´Đ¸Ń€Đ°Ń ĐľĐ˛Đ°Ń ĐşĐľŃ€Đ°Đş"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["НиŃĐĽĐľ ŃŃпели да пронађемо интерне везе на ваŃим Ńтраницама. Đли ŃĐľŃ Đ˝Đ¸Ńте додали интерне везе Ńвом ŃадржаŃŃ, или их Yoast SEO ниŃе индекŃирао. Yoast SEO може индекŃирати ваŃе везе покретањем оптимизациŃе SEO података Ń ĐľĐşĐ˛Đ¸Ń€Ń SEO > Đлати."],"Incoming links":["Долазне везе"],"Edit to add link":["Уредите да биŃте додали везŃ"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["ТренŃтно немате чланака означених као кљŃчни. Када ŃвоŃе чланке означите као кљŃчне, они ће Ńе поŃавити овде."],"Focus keyphrase":["ФокŃŃни израз (фраза)"],"Article":["Чланак"],"Readability score":["РезŃлтат читљивоŃти"],"SEO score":["SEO резŃлтат"],"Copy failed":["Копирање ниŃе ŃŃпело"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["ПобољŃаŃте рангирање за Ńве ŃĐ˛ĐľŃ ĐşŃ™Ńчни ŃĐ°Đ´Ń€Đ¶Đ°Ń ĐşĐľŃ€Đ¸Ńтећи ĐľĐ˛Đ°Ń %1$sкорак по корак тренинг!%2$s"],"Rank with articles you want to rank with":["РангираŃте чланке Ńа коŃима желите да бŃдете рангирани"],"Descriptive text":["ОпиŃни текŃŃ‚"],"Show the descriptive text":["Прикажи опиŃни текŃŃ‚"],"Show icon":["Прикажи иконицŃ"],"Yoast Estimated Reading Time":["Yoast процењено време читања"],"Shows an estimated reading time based on the content length.":["ПриказŃŃе процењено време читања на ĐľŃĐ˝ĐľĐ˛Ń Đ´Ńжине ŃадржаŃа."],"reading time":["време читања"],"content length":["Đ´Ńжина ŃадржаŃа"],"Estimated reading time:":["Процењено време читања:"],"minute":["минŃŃ‚","минŃта","минŃта"],"Settings":["ПодеŃавања"],"OK":["OK"],"Close":["Zatvori"],"Type":["Тип"],"Orphaned content":["НапŃŃтени ŃадржаŃ"],"Synonyms":["Sinonimi"],"Internal linking suggestions":["Предлози за ŃĐ˝ŃтраŃње повезивање"],"Enter a related keyphrase to calculate the SEO score":["УнеŃите Ńродни кљŃчни израз да биŃте израчŃнали SEO резŃлтат"],"Related keyphrase":["Сродни кљŃчни израз"],"Add related keyphrase":["ДодаŃте кљŃчни израз"],"Analysis results":["РезŃлтати анализе"],"Help on choosing the perfect keyphrase":["Помоћ при Đ¸Đ·Đ±ĐľŃ€Ń ŃаврŃеног кљŃчног израза"],"Help on keyphrase synonyms":["Помоћ Ńа Ńинонимима кљŃчног израза"],"Keyphrase":["КљŃчна фраза"],"New URL: {{link}}%s{{/link}}":["Novi URL: {{link}}%s{{/link}}"],"Undo":["Vrati korak nazad"],"Redirect created":["Redirekcija napravljena"],"%s just created a redirect from the old URL to the new URL.":["%s Ńе Ńправо креирао преŃŃмеравање Ńа Ńтарог на нови URL."],"Old URL: {{link}}%s{{/link}}":["Stari URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Синоними кљŃчних израза"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Преглед за дељење на ТвитерŃ"],"Adds a list of internal links to sibling pages which share the same parent.":["ДодаŃе лиŃŃ‚Ń Đ¸Đ˝Ń‚ĐµŃ€Đ˝Đ¸Ń… веза Đ´Đľ Ńродних Ńтраница коŃе деле иŃтог родитеља."],"siblings":["Ńродници"],"sibling pages":["Ńродне Ńтране"],"Adds a list of internal links to subpages of this page.":["ДодаŃе лиŃŃ‚Ń Đ¸Đ˝Ń‚ĐµŃ€Đ˝Đ¸Ń… веза Đ´Đľ подŃтраница ове Ńтранице."],"seo":["seo"],"subpages":["подŃтранице"],"childpages":["подŃтранице"],"children":["деца"],"internal linking":["интерно повезивање"],"site structure":["ŃтрŃктŃра веб меŃта"],"We could not find any relevant articles on your website that you could link to from your post.":["НиŃĐĽĐľ могли да нађемо релевантне чланке на ваŃем веб меŃŃ‚Ń ĐşĐ° коŃима биŃте могли да Ńтавите Đ˛ĐµĐ·Ń Ń Ń‡Đ»Đ°Đ˝ĐşŃ."],"Load suggestions":["ĐŁŃ‡Đ¸Ń‚Đ°Ń ĐżŃ€ĐµĐ´Đ»ĐľĐłĐµ"],"Refresh suggestions":["ĐžŃвежи предлоге"],"Write list…":["НапиŃите ŃпиŃак…"],"Adds a list of links related to this page.":["ДодаŃе лиŃŃ‚Ń Đ˛ĐµĐ·Đ° Ńродних Ńа овом Ńтраницом."],"related posts":["Ńродни чланци"],"related pages":["Ńродне Ńтранице"],"Adds a table of contents to this page.":["ДодаŃе преглед ŃадржаŃа на ĐľĐ˛Ń ŃтраницŃ."],"links":["везе"],"toc":["toc"],"Copy link":["КопираŃте везŃ"],"Copy link to suggested article: %s":["ĐšĐľĐżĐ¸Ń€Đ°Ń Đ˛ĐµĐ·Ń Đ˝Đ° препорŃченом чланкŃ: %s"],"Add a title to your post for the best internal linking suggestions.":["ДодаŃе наŃлов ваŃем Ń‡Đ»Đ°Đ˝ĐşŃ Đ·Đ° наŃбоље предлоге интерног повезивања."],"Add a metadescription to your post for the best internal linking suggestions.":["ДодаŃе мета ĐľĐżĐ¸Ń Đ˛Đ°Ńем Ń‡Đ»Đ°Đ˝ĐşŃ Đ·Đ° наŃбоље предлоге интерног повезивања."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["ДодаŃе наŃлов и мета ĐľĐżĐ¸Ń Đ˛Đ°Ńем Ń‡Đ»Đ°Đ˝ĐşŃ Đ·Đ° наŃбоље предлоге интерног повезивања."],"Also, add a title to your post for the best internal linking suggestions.":["Такође, додаŃе наŃлов ваŃем Ń‡Đ»Đ°Đ˝ĐşŃ Đ·Đ° наŃбоље предлоге интерног повезивања."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Такође, додаŃе мета ĐľĐżĐ¸Ń Đ˛Đ°Ńем Ń‡Đ»Đ°Đ˝ĐşŃ Đ·Đ° наŃбоље предлоге интерног повезивања."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Такође, додаŃе наŃлов и мета ĐľĐżĐ¸Ń Đ˛Đ°Ńем Ń‡Đ»Đ°Đ˝ĐşŃ Đ·Đ° наŃбоље предлоге интерног повезивања."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Када додате ŃĐľŃ ĐĽĐ°Đ»Đľ текŃта, овде ћемо вам приказати ŃпиŃак Ńродног ŃадржаŃа чиŃе везе можете да додате Ń Ńвом чланкŃ."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Да биŃте побољŃали ŃтрŃктŃŃ€Ń Đ˛ĐµĐ± меŃта, размиŃлите Đľ ĐżĐľĐ˛ĐµĐ·Đ¸Đ˛Đ°ŃšŃ Ńа Đ´Ń€Ńгим релевантним чланцима или Ńтраницама на ваŃем веб меŃŃ‚Ń."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Потребно Ńе неколико ŃекŃнди да вам Ńе прикаже лиŃта Ńродног ŃадржаŃа чиŃе везе биŃте могли да додате. Предлози ће Ńе овде приказати чим их добиŃемо."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}ПрочитаŃте Đ˝Đ°Ń Đ˛ĐľĐ´Đ¸Ń‡ Đľ ŃĐ˝ŃтраŃњем ĐżĐľĐ˛ĐµĐ·Đ¸Đ˛Đ°ŃšŃ Đ·Đ° SEO{{/a}} да биŃте Ńазнали виŃе."],"Copied!":["Копирано."],"Not supported!":["НиŃе подржано"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Да ли покŃŃавате да кориŃтите виŃе Ńродних кљŃчних израза? Требали биŃте их додати одвоŃено."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Đ’Đ°Ń ĐşŃ™Ńчни израз Ńе предŃгачак. Дозвољено Ńе наŃвиŃе 191 карактер."],"Add as related keyphrase":["ДодаŃте као Ńродни кљŃчни израз"],"Added!":["Додато!"],"Remove":["Уклони"],"Table of contents":["Преглед ŃадржаŃа"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Морамо да оптимизŃŃемо SEO податке ваŃег веб меŃта како биŃĐĽĐľ могли понŃдити наŃбоље %1$sпредлоге за повезивање%2$s. %3$sЗапочните SEO података%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-sv_SE.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-sv_SE.json deleted file mode 100644 index ac0ba799..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-sv_SE.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"sv_SE"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["För att kunna använda denna funktion behöver du ha aktiva abonnemang pĂĄ %2$s och %3$s. %5$sAktivera ditt abonnemang i %1$s%6$s eller %7$sskaffa en ny %4$s%8$s. Därefter behöver du ladda om denna sida för att funktionen ska aktiveras. Det kan ta upp till 30 sekunder."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["För att den AI-stödda rubrikgeneratorn ska kunna användas mĂĄste SEO-analys vara aktiverad. Den aktiverar du under %2$sWebbplatsfunktioner i %1$s%3$s. Aktivera SEO-analys och klicka pĂĄ ”Spara ändringar”. Om SEO-analys är inaktiverad för ditt WordPress-konto gĂĄr du till profilsidan för att aktivera den där. Kontakta din administratör om du inte har tillgĂĄng till dessa inställningar."],"Social share preview":["Förhandsvisning av delning i sociala medier"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Om du vill fortsätta använda Yoast AI-funktionen ber vi dig att minska frekvensen pĂĄ dina förfrĂĄgningar. I vĂĄr %1$shjälpartikel%2$s finns riktlinjer för hur du effektivt planerar och anpassar dina förfrĂĄgningar för ett optimerat arbetsflöde."],"You've reached the Yoast AI rate limit.":["Du har nĂĄtt frekvenstaket för Yoast AI."],"Allow":["TillĂĄt"],"Deny":["Neka"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["För att kunna se denna video mĂĄste du tillĂĄta %1$s att ladda in inbäddade videor frĂĄn %2$s."],"Text generated by AI may be offensive or inaccurate.":["Texten som genereras med AI kan vara stötande eller felaktig."],"(Opens in a new browser tab)":["(Ă–ppnas i en ny webbläsarflik)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Snabba upp ditt arbetsflöde med generativ AI. FĂĄ högkvalitativa förslag pĂĄ rubriker och beskrivningar för visning i sökningar och sociala medier. %1$sLäs mer%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Generera rubriker och beskrivningar med Yoast AI!"],"New to %1$s":["Om %1$s är nytt för dig"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Jag godkänner %1$sAnvändarvillkoren%2$s och %3$sIntegritetspolicyn%4$s för tjänsten Yoast AI. Detta inkluderar samtycke till insamling och användning av data för att förbättra användarupplevelsen."],"Start generating":["Börja generera"],"Yes, revoke consent":["Ja, ĂĄterkalla samtycke"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["När du ĂĄterkallar samtycket förlorar du ĂĄtkomsten till funktionerna i Yoast AI. Ă„r du säker pĂĄ att du vill ĂĄterkalla samtycket?"],"Something went wrong, please try again later.":["NĂĄgot gick fel, försök igen senare."],"Revoke AI consent":["Ă…terkalla samtycket avseende AI"],"Please enter a focus keyphrase first to use AI.":["Ange först en nyckelfras för att använda AI-funktionen."],"AI title generator":["AI-generator för rubriker"],"AI description generator":["AI-generator för beskrivningar"],"AI Twitter title generator":["AI-generator för Twitter-rubriker"],"AI Twitter description generator":["AI-generator för beskrivningar i Twitter"],"AI social title generator":["AI-generator för rubriker i sociala nätverk"],"AI social description generator":["AI-generator för beskrivningar i sociala nätverk"],"Twitter preview":["Förhandsgranskning för Twitter"],"Dismiss":["Avfärda"],"Don’t show again":["Visa inte igen"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sTips%2$s: Förbättra noggrannheten i dina genererade AI-rubriker genom att skriva in mer innehĂĄll pĂĄ sidan."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sTips%2$s: Förbättra noggrannheten i dina genererade AI-beskrivningar genom att skriva in mer innehĂĄll pĂĄ sidan."],"Try again":["Försök igen"],"Social preview":["Förhandsvisning av utseende i sociala nätverk"],"Desktop result":["Resultat för stationär dator"],"Mobile result":["Mobilt resultat"],"Apply AI description":["Använd AI-beskrivningen"],"Apply AI title":["Använd AI-rubriken"],"Next":["Nästa"],"Previous":["FöregĂĄende"],"Generate 5 more":["Generera ytterligare 5"],"Google preview":["Google förhandsgranskning"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["PĂĄ grund av de strikta etiska riktlinjerna och %1$sanvändningspolicyerna%2$s för OpenAI kan vi inte generera SEO-rubriker för din sida. Om du vill använda AI bör du undvika stötande, vĂĄldsamt eller sexuellt innehĂĄll. %3$sLäs mer om hur du konfigurerar din sida för fĂĄ bästa resultat med AI%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["PĂĄ grund av de strikta etiska riktlinjerna och %1$sanvändningspolicyerna%2$s för OpenAI kan vi inte generera metabeskrivningar för din sida. Om du vill använda AI bör du undvika stötande, vĂĄldsamt eller sexuellt innehĂĄll. %3$sLäs mer om hur du konfigurerar din sida för fĂĄ bästa resultat med AI%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["För ĂĄtkomst till denna funktion behöver du en aktiv prenumeration pĂĄ %1$s. %3$sAktivera din prenumeration i %2$s%4$s eller %5$sstarta en ny %1$s prenumeration%6$s. Klicka sedan pĂĄ knappen för att ladda om denna sida för att funktionen ska fungera korrekt. Det kan ta upp till 30 sekunder."],"Refresh page":["Uppdatera sida"],"Not enough content":["För lite innehĂĄll"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Försök igen senare. Om problemet kvarstĂĄr ber vi dig %1$skontakta vĂĄrt supportteam%2$s!"],"Something went wrong":["NĂĄgot gick fel"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["En timeout verkar har inträffat i anslutningen. Kontrollera internetanslutningen och försök igen senare. Om problemet kvarstĂĄr ber vi dig %1$skontakta vĂĄrt supportteam%2$s"],"Connection timeout":["Timeout i anslutningen"],"Use AI":["Använd AI"],"Close modal":["Stäng modalfönstret"],"Learn more about AI (Opens in a new browser tab)":["Läs mer om AI (öppnas i en ny flik)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sRubrik%3$s: Din sida har ingen rubrik än. %2$sSkapa en%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sRubrik%2$s: Din sida har en rubrik. Utmärkt!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sFördelning av nyckelordsfras%3$s: %2$sInkludera din nyckelordsfras eller dess synonymer för att vi ska kunna analysera fördelningen%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sFördelning av nyckelordsfras%2$s: Bra jobbat!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sFördelning av nyckelordsfras%3$s: Ojämn. Delar av din text innehĂĄller inte nyckelordsfrasen eller dess synonymer. %2$sFördela nyckelordsfrasen mer jämnt%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sFördelning av nyckelordsfras%3$s: Väldigt ojämn. Stora delar av din text innehĂĄller inte nyckelordsfrasen eller dess synonymer. %2$sFördela nyckelordsfrasen mer jämnt%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: Du använder inte för mĂĄnga svĂĄra ord, vilket gör din text enkel att läsa. Bra jobbat!"],"Word complexity":["Ordkomplexitet"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s av orden i din text bedöms vara komplicerade. %3$sFörsök att använda kortare och vanligare ord för att förbättra läsbarheten%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sTextjustering%3$s: Det finns ett lĂĄngt avsnitt med centrerad text. %2$sVi rekommenderar att du vänsterjusterar det%3$s.","%1$sTextjustering%3$s: Det finns %4$s lĂĄnga avsnitt med centrerad text. %2$sVi rekommenderar att du vänsterjusterar dem%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sTextjustering%3$s: Det finns ett lĂĄngt avsnitt med centrerad text. %2$sVi rekommenderar att du högerjusterar det%3$s.","%1$sTextjustering%3$s: Det finns %4$s lĂĄnga avsnitt med centrerad text. %2$sVi rekommenderar att du högerjusterar dem%3$s."],"Select image":["Välj bild"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Dags att lägga in lite länkar! Nedan ser du en lista med dina hörnstenar. Under varje hörnstensartikel finns det förslag pĂĄ artiklar, frĂĄn vilka du skulle kunna länka till dem. När du lägger till länken, se till att infoga den i en relevant mening som hör samman med hörnstensartikeln. Fortsätt att lägga till länkar frĂĄn sĂĄ mĂĄnga relaterade artiklar som du behöver, tills det är hörnstensartiklarna som har flest inkommande interna länkar."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Vissa artiklar pĂĄ din webbplats är %1$sallra%2$s viktigast. De svarar pĂĄ frĂĄgor människor har och löser deras problem. Därför förtjänar de att ranka väl! Vi pĂĄ %3$s kallar dessa artiklar för hörnstenar. Ett av sätten att fĂĄ dem att ranka högt är att peka tillräckligt mĂĄnga länkar till dem. Fler länkar signalerar till sökmotorerna att artiklarna är viktiga och värdefulla. I det här träningspasset hjälper vi dig att lägga in fler länkar till dina hörnstensartiklar!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["När du har lagt till lite mer text kan vi berätta hur formell din text verkar vara."],"Overall, your text appears to be %1$s%3$s%2$s.":["Ă–verlag verkar din text vara %1$s%3$s%2$s."],"Heading %d":["RubriknivĂĄ %d"],"Maximum heading level":["Maximal rubriknivĂĄ"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Du har inaktiverat funktionen för länkförslag, som behövs för att relaterade länkar ska fungera. Om du vill lägga till relaterade länkar, ska du gĂĄ till webbplatsfunktioner och aktivera länkförslag."],"Schema":["Schema"],"Meta tags":["Metataggar"],"Not available":["Inte tillgängligt"],"Checks":["Kontroller"],"Focus Keyphrase":["Fokusnyckelordsfras"],"Good":["Bra"],"No index":["Inget index"],"Front-end SEO inspector":["SEO-kontroll i front-end"],"Focus keyphrase not set":["Ingen nyckelordsfras har valts"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Obs! För att detta träningspass ska fungera bra mĂĄste du köra optimeringsverktyget för SEO-data. Administratörer kan köra detta via %1$sSEO > verktyg%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Du har skapat länkar till de artiklar som blivit över och rensat bort de som inte längre är relevanta. Bra jobbat! Kolla in sammanfattningen nedan för att fira din bedrift!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Granska kritiskt innehĂĄllet i denna lista och gör de uppdateringar som behövs. Om du behöver hjälp med uppdateringen har vi ett mycket %1$sanvändbart blogginlägg som kan guida dig hela vägen%2$s (öppnas i en ny flik)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sBehöver du mer vägledning? Vi har diskuterat varje steg mer detaljerat i följande guide: %2$sSĂĄ använder du träningsprogrammet för artiklar som blivit över i %7$s%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Nu har du gjort det enklare att hitta ditt bästa innehĂĄll och ökat chansen att rankas bra. Bra jobbat! Kom ihĂĄg att dĂĄ och dĂĄ kontrollera om dina hörnstensartiklar fĂĄr tillräckligt med inkommande länkar!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Studera listan nedan. Har dina hörnstensartiklar (markerade med %1$s) störst antal inkommande interna länkar? Klicka pĂĄ knappen ”Optimera” om du känner att en hörnsten behöver fler länkar. DĂĄ lyfts artikeln över till nästa steg."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Har alla hörnstensartiklar gröna punkter? För bäst resultat bör du överväga att redigera de artiklar som inte har det!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Vilka artiklar vill du ska ranka bäst? Vilka skulle din publik tycka är mest användbara och kompletta? Klicka pĂĄ nedĂĄtpilen och leta efter artiklar som uppfyller dessa kriterier. De artiklar du väljer i listan markerar vi automatiskt som hörnstenar."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sBehöver du mer vägledning? Vi har diskuterat varje steg mer detaljerat i följande guide: %2$sSĂĄ använder du träningsprogrammet för hörnstensartiklar i %7$s%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast underordnade sidor"],"Yoast Siblings":["Yoast syskon"],"Yoast Table of Contents":["Yoast innehĂĄllsförteckning"],"Yoast Related Links":["Yoast Relaterade länkar"],"Finish optimizing":["Avsluta optimeringen"],"You've finished adding links to this article.":["Du är klar med att skapa länkar till denna artikel."],"Optimize":["Optimera"],"Added to next step":["Tillagd för nästa steg"],"Choose cornerstone articles...":["Välj grundstensartiklar …"],"Loading data...":["Laddar in data …"],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Du har ännu inte städat upp eller uppdaterat nĂĄgra artiklar med detta träningspass. Efter att du gör det kommer en sammanfattning av ditt arbete att visas här."],"Skipped":["Hoppat över"],"Hidden from search engines.":["Dold för sökmotorer."],"Removed":["Borttagen"],"Improved":["Förbättrad"],"Resolution":["Resultat"],"Loading redirect options...":["Laddar förslag pĂĄ omdirigeringsmĂĄl …"],"Remove and redirect":["Ta bort och omdirigera"],"Custom url:":["Anpassad URL:"],"Related article:":["Relaterad artikel:"],"Home page:":["Startsida:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Du är pĂĄ väg att ta bort %1$s%2$s%3$s. För att inte fĂĄ felet 404 (saknad sida) pĂĄ webbplatsen behöver du omdirigera till nĂĄgon annan sida pĂĄ din webbplats. Vart vill du omdirigera sidan?"],"SEO Workout: Remove article":["SEO-träningspass: Ta bort artikel"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Allt ser bra ut! Vi hittar inga artiklar pĂĄ webbplatsen som är äldre än sex mĂĄnader eller har för fĂĄ inkommande länkar pĂĄ din webbplats. Kom tillbaka hit senare för nya förslag pĂĄ vad som behöver städas upp!"],"Hide from search engines":["Dölj för sökmotorer"],"Improve":["Förbättra"],"Are you sure you wish to hide this article from search engines?":["Ă„r du säker pĂĄ att du vill dölja denna artikel frĂĄn sökmotorer?"],"Action":["Ă…tgärd"],"You've hidden this article from search engines.":["Du har dolt denna artikel för sökmotorer."],"You've removed this article.":["Du tog bort denna artikel."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Du har inte valt nĂĄgra artiklar att förbättra. Välj nĂĄgra artiklar som behöver fler inkommande länkar i de föregĂĄende stegen, sĂĄ visar vi förslag pĂĄ länkar här."],"Loading link suggestions...":["Laddar in länkförslag …"],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Vi hittade inga förslag pĂĄ denna artikel, men du kan naturligtvis fortfarande lägga till länkar till artiklar som du tror är relaterade."],"Skip":["Hoppa över"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Du har inte valt nĂĄgra artiklar för detta steg än. Du kan göra det i föregĂĄende steg."],"Is it up-to-date?":["Ă„r innehĂĄllet fortfarande aktuellt?"],"Last Updated":["Senast uppdaterat"],"You've moved this article to the next step.":["Du flyttade denna artikel till nästa steg."],"Unknown":["Okänt"],"Clear summary":["Rensa sammanfattning"],"Add internal links towards your orphaned articles.":["Lägg till interna inkommande länkar till dina överblivna artiklar."],"Should you update your article?":["Ska du uppdatera din artikel?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Din webbplats kan innehĂĄlla mycket innehĂĄll som du har skapat en gĂĄng i tiden och som du sedan aldrig tittat tillbaka pĂĄ. Det är viktigt att gĂĄ igenom dessa sidor och tänka över om innehĂĄllet fortfarande är relevant för webbplatsen. Bör du förbättra dem eller ta bort?"],"Start: Love it or leave it?":["Inledning: Ă„lska det eller röja bort?"],"Clean up your unlinked content to make sure people can find it":["Städa upp innehĂĄll som saknar inkommande länkar sĂĄ att besökare kan hitta det"],"I've finished this workout":["Jag har slutfört detta steg"],"Reset this workout":["Ă…terställ detta steg"],"Well done!":["Bra gjort!"],"Add internal links towards your cornerstones":["Lägg till interna länkar till dina grundstensartiklar"],"Check the number of incoming internal links of your cornerstones":["Kontrollera antalet inkommande interna länkar till dina grundstensartiklar"],"Start: Choose your cornerstones!":["Start: Välj dina grundstenar!"],"The cornerstone approach":["Grundstensmetoden"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Obs: För att detta träningspass ska fungera väl och komma med länkförslag behöver du köra verktyget för optimering av SEO-data. Administratörer kan köra detta via %1$sSEO > Verktyg%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Jag har slutfört detta steg"],"Revise this step":["Revidera detta steg"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Vi hittade inga interna länkar pĂĄ dina sidor. Antingen har du inte lagt till nĂĄgra interna länkar till ditt innehĂĄll ännu, eller sĂĄ har Yoast SEO inte indexerat dem. Du kan lĂĄta Yoast SEO indexera dina länkar genom att köra optimering av SEO-data under SEO > Verktyg."],"Incoming links":["Inkommande länkar"],"Edit to add link":["Redigera för att lägga till en länk"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["För närvarande har du inga artiklar markerade som grundstenar. När du markerar en artikel som grundsten kommer den att visas här."],"Focus keyphrase":["Fokusnyckelordsfras"],"Article":["Artikel"],"Readability score":["Läsbarhetspoäng"],"SEO score":["SEO-poäng"],"Copy failed":["Kopiering misslyckades"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Förbättra rankningen för alla dina grundstenar genom att följa %1$sden här stegvisa träningen!%2$s"],"Rank with articles you want to rank with":["Ranka med artiklar du vill ranka med"],"Descriptive text":["Beskrivande text"],"Show the descriptive text":["Visa den beskrivande texten"],"Show icon":["Visa ikon"],"Yoast Estimated Reading Time":["Yoast beräknad läsningstid"],"Shows an estimated reading time based on the content length.":["Visar en beräknad läsningstid baserat pĂĄ innehĂĄllslängden."],"reading time":["läsningstid"],"content length":["innehĂĄllslängd"],"Estimated reading time:":["Beräknad läsningstid:"],"minute":["minut","minuter"],"Settings":["Inställningar"],"OK":["OK"],"Close":["Stäng"],"Type":["Typ"],"Orphaned content":["Föräldralöst innehĂĄll"],"Synonyms":["Synonymer"],"Internal linking suggestions":["Interna länkförslag"],"Enter a related keyphrase to calculate the SEO score":["Ange en relaterad nyckelordsfras för att beräkna SEO-poäng"],"Related keyphrase":["Relaterad nyckelordsfras"],"Add related keyphrase":["Lägg till relaterad nyckelordsfras"],"Analysis results":["Analysresultat"],"Help on choosing the perfect keyphrase":["Hjälp med att välja perfekt nyckelordsfras"],"Help on keyphrase synonyms":["Hjälp med synonymer för nyckelordsfras"],"Keyphrase":["Nyckelordsfras"],"New URL: {{link}}%s{{/link}}":["Ny URL: {{link}}%s{{/link}}"],"Undo":["Ă…ngra"],"Redirect created":["Omdirigering skapad"],"%s just created a redirect from the old URL to the new URL.":["%s skapade precis en omdirigering frĂĄn den gamla URL:en till den nya URL:en."],"Old URL: {{link}}%s{{/link}}":["Gammal URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Synonymer för nyckelordsfraser"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Förhandsgranskning av Twitter-delning"],"Adds a list of internal links to sibling pages which share the same parent.":["Lägger till en lista med interna länkar till syskonssidor som delar samma förälder."],"siblings":["syskon"],"sibling pages":["syskonssidor"],"Adds a list of internal links to subpages of this page.":["Lägger till en lista med interna länkar till undersidorna pĂĄ denna sida."],"seo":["seo"],"subpages":["undersidor"],"childpages":["barnsidor"],"children":["barn"],"internal linking":["intern länkning"],"site structure":["webbplatsstruktur"],"We could not find any relevant articles on your website that you could link to from your post.":["Vi kunde inte hitta nĂĄgra relevanta artiklar pĂĄ din webbplats som du kan länka till frĂĄn ditt inlägg."],"Load suggestions":["Ladda förslag"],"Refresh suggestions":["Uppdatera förslag"],"Write list…":["Skriv lista…"],"Adds a list of links related to this page.":["Lägger till en lista med länkar relaterade till denna sida."],"related posts":["relaterade inlägg"],"related pages":["relaterade sidor"],"Adds a table of contents to this page.":["Lägger till en innehĂĄllsförteckning pĂĄ denna sida."],"links":["länkar"],"toc":["reg"],"Copy link":["Kopiera länk"],"Copy link to suggested article: %s":["Kopiera länk till föreslagen artikel: %s"],"Add a title to your post for the best internal linking suggestions.":["Lägg till en rubrik i ditt inlägg för att fĂĄ de bästa interna länkförslagen."],"Add a metadescription to your post for the best internal linking suggestions.":["Lägg till en metabeskrivning i ditt inlägg för att fĂĄ de bästa interna länkförslagen."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Lägg till en rubrik och en metabeskrivning i ditt inlägg för att fĂĄ de bästa interna länkförslagen."],"Also, add a title to your post for the best internal linking suggestions.":["Lägg ocksĂĄ till en rubrik i ditt inlägg för att fĂĄ de bästa interna länkförslagen."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Lägg ocksĂĄ till en metabeskrivning i ditt inlägg för att fĂĄ de bästa interna länkförslagen."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Lägg ocksĂĄ till en rubrik och en metabeskrivning i ditt inlägg för att fĂĄ de bästa interna länkförslagen."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["När du lagt till lite mer text, ger vi dig en lista med relaterat innehĂĄll som du kan länka till i ditt inlägg."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["För att förbättra din webbplatsstruktur, överväg att länka till andra relevanta inlägg eller sidor pĂĄ din webbplats."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Det tar nĂĄgra sekunder att visa dig en lista med relaterat innehĂĄll som du kan länka till. Förslagen visas här sĂĄ snart vi har dem."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Läs vĂĄr guide om intern länkning för SEO{{/a}} för att lära dig mer."],"Copied!":["Kopierad!"],"Not supported!":["Stöds inte!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Försöker du använda flera relaterade nyckelfraser? Du bör lägga till dem separat."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Din nyckelfras är för lĂĄng. Den fĂĄr maximalt vara 191 tecken."],"Add as related keyphrase":["Lägg till som relaterad nyckelfras"],"Added!":["Tillagt!"],"Remove":["Ta bort"],"Table of contents":["InnehĂĄllsförteckning"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Vi behöver optimera din webbplats SEO-data sĂĄ att vi kan erbjuda dig de bästa %1$slänkförslagen%2$s.\n\n%3$sStarta SEO-dataoptimering%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-th.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-th.json deleted file mode 100644 index 9ba17e66..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-th.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=1; plural=0;","lang":"th"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute"],"Settings":["Settings"],"OK":["OK"],"Close":["Close"],"Type":["Type"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-tr_TR.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-tr_TR.json deleted file mode 100644 index f3f2b222..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-tr_TR.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=(n > 1);","lang":"tr"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Bu özelliÄźe eriĹźmek için aktif %2$s ve %3$s aboneliklerine ihtiyacınız var. LĂĽtfen %5$saboneliklerinizi %1$s%6$s ĂĽzerinde etkinleĹźtirin veya %7$syeni bir %4$s%8$s alın. Daha sonra, özelliÄźin doÄźru çalışması için lĂĽtfen bu sayfayı yenileyin; bu iĹźlem 30 saniye kadar sĂĽrebilir."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["YZ baĹźlık oluĹźturucu, kullanılmadan önce SEO analizinin etkinleĹźtirilmesini gerektirir. EtkinleĹźtirmek için lĂĽtfen %2$s%1$s site özellikleri%3$s bölĂĽmĂĽne gidin, SEO analizini açın ve 'DeÄźiĹźiklikleri kaydet'e tıklayın. SEO analizi WordPress kullanıcı profilinizde devre dışı bırakılmışsa, profilinize eriĹźin ve orada etkinleĹźtirin. Bu ayarlara eriĹźiminiz yoksa lĂĽtfen yöneticinizle iletiĹźime geçin."],"Social share preview":["Sosyal paylaşım önizlemesi"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Yoast AI özelliÄźini kullanmaya devam etmek için lĂĽtfen taleplerinizin sıklığını azaltın. %1$sYardım makalemiz%2$s, optimize edilmiĹź bir iĹź akışı için taleplerinizi etkili bir Ĺźekilde planlama ve hızlandırma konusunda rehberlik saÄźlar."],"You've reached the Yoast AI rate limit.":["Yoast AI kullanım sınırına ulaĹźtınız."],"Allow":["İzin ver"],"Deny":["Reddet"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Bu videoyu görmek için %1$s eklentisine %2$s gömĂĽlĂĽ videolarını yĂĽklemesine izin vermeniz gerekir."],"Text generated by AI may be offensive or inaccurate.":["Yapay zeka tarafından oluĹźturulan metin saldırgan veya yanlış olabilir."],"(Opens in a new browser tab)":["(Yeni sekmede açılır)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["Ăśretken yapay zeka ile iĹź akışınızı hızlandırın. Arama ve sosyal görĂĽnĂĽmĂĽnĂĽz için yĂĽksek kaliteli baĹźlık ve açıklama önerileri alın. %1$sDaha fazla bilgi edinin%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["Yoast AI ile baĹźlıklar ve açıklamalar oluĹźturun!"],"New to %1$s":["%1$s yenilikleri"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["Yoast AI hizmetinin %1$sHizmet Ĺžartlarını%2$s ve %3$sGizlilik Politikasını%4$s onaylıyorum. Bu, kullanıcı deneyimini iyileĹźtirmek için verilerin toplanmasına ve kullanılmasına izin vermeyi de içerir."],"Start generating":["Ăśretmeye baĹźlayın"],"Yes, revoke consent":["Evet, onayı iptal et"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["Onayınızı iptal ettiÄźinizde, Yoast AI özelliklerine artık eriĹźiminiz olmayacaktır. Onayınızı iptal etmek istediÄźinizden emin misiniz?"],"Something went wrong, please try again later.":["Bir Ĺźeyler ters gitti. LĂĽtfen daha sonra tekrar deneyin."],"Revoke AI consent":["Yapay zeka iznini iptal et"],"Please enter a focus keyphrase first to use AI.":["YZ kullanmak için lĂĽtfen önce bir odak anahtar kelime girin."],"AI title generator":["YZ baĹźlık oluĹźturucu"],"AI description generator":["YZ açıklama ĂĽreteci"],"AI Twitter title generator":["YZ Twitter baĹźlık oluĹźturucu"],"AI Twitter description generator":["YZ Twitter açıklama oluĹźturucu"],"AI social title generator":["YZ sosyal baĹźlık oluĹźturucu"],"AI social description generator":["YZ sosyal açıklama oluĹźturucu"],"Twitter preview":["Twitter önizlemesi"],"Dismiss":["Kapat"],"Don’t show again":["Bir daha gösterme"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sİpucu%2$s: Sayfanıza daha fazla içerik yazarak oluĹźturulan YZ baĹźlıklarınızın doÄźruluÄźunu artırın."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sİpucu%2$s: Sayfanıza daha fazla içerik yazarak oluĹźturulan YZ açıklamalarınızın doÄźruluÄźunu artırın."],"Try again":["Tekrar deneyin"],"Social preview":["Sosyal önizleme"],"Desktop result":["MasaĂĽstĂĽ sonucu"],"Mobile result":["Mobil sonucu"],"Apply AI description":["YZ açıklamasını uygulayın"],"Apply AI title":["YZ baĹźlığını uygulayın"],"Next":["Sonraki"],"Previous":["Ă–nceki"],"Generate 5 more":["5 tane daha ĂĽretin"],"Google preview":["Google ön izlemesi"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["OpenAI'nin katı etik kuralları ve %1$skullanım politikaları%2$s nedeniyle, sayfanız için SEO baĹźlıkları oluĹźturamıyoruz. YZ kullanmayı düşünĂĽyorsanız, lĂĽtfen açık, Ĺźiddet içeren veya cinsel içerikli içerik kullanmaktan kaçının. %3$sYZ ile en iyi sonuçları aldığınızdan emin olmak için sayfanızı nasıl yapılandıracağınız hakkında daha fazla bilgi edinin%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["OpenAI'nin katı etik kuralları ve %1$skullanım politikaları%2$s nedeniyle, sayfanız için meta etiketleri oluĹźturamıyoruz. YZ kullanmayı düşünĂĽyorsanız, lĂĽtfen açık, Ĺźiddet içeren veya cinsel içerikli içerik kullanmaktan kaçının. %3$sYZ ile en iyi sonuçları aldığınızdan emin olmak için sayfanızı nasıl yapılandıracağınız hakkında daha fazla bilgi edinin%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Bu özelliÄźe eriĹźmek için etkin bir %1$s aboneliÄźiniz olması gerekir. LĂĽtfen %3$saboneliÄźinizi %2$s ĂĽzerinden etkinleĹźtirin%4$s veya %5$syeni bir %1$s aboneliÄźi satın alın%6$s. Daha sonra, özelliÄźin doÄźru çalışması için bu sayfayı yenilemek ĂĽzere dĂĽÄźmeye tıklayın; bu iĹźlem 30 saniye kadar sĂĽrebilir."],"Refresh page":["Sayfayı yenile"],"Not enough content":["Yeterli içerik yok"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["LĂĽtfen daha sonra tekrar deneyin. Sorun devam ederse, lĂĽtfen %1$sdestek ekibimizle%2$s iletiĹźime geçin!"],"Something went wrong":["Bir terslik çıktı"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Bir baÄźlantı zaman aşımı meydana gelmiĹź gibi görĂĽnĂĽyor. LĂĽtfen internet baÄźlantınızı kontrol edin ve daha sonra tekrar deneyin. Sorun devam ederse, lĂĽtfen %1$sdestek ekibimizle iletiĹźime geçin%2$s"],"Connection timeout":["BaÄźlantı zaman aşımı"],"Use AI":["YZ kullan"],"Close modal":["Pencereyi kapat"],"Learn more about AI (Opens in a new browser tab)":["YZ hakkında daha fazla bilgi edinin (Yeni bir tarayıcı sekmesinde açılır)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sBaĹźlık%3$s: Sayfanızın henĂĽz bir baĹźlığı yok. %2$sBir tane ekleyin%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sBaĹźlık%2$s: Sayfanızın bir baĹźlığı var. Tebrikler!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sAnahtar kelime dağılımı%3$s: %2$sAnahtar kelime dağılımınızı kontrol edebilmemiz için metne anahtar kelimeleri veya eĹź anlamlılarını ekleyin%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sAnahtar kelime dağılımı%2$s: İyi iĹź!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sAnahtar kelime dağılımı%3$s: DĂĽzensiz. Metninizin bazı bölĂĽmleri anahtar kelimeleri veya eĹź anlamlılarını içermiyor. %2$sKelimeleri daha eĹźit dağıtın%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sAnahtar kelime dağılımı%3$s: Çok dĂĽzensiz. Metninizin bĂĽyĂĽk bölĂĽmleri anahtar kelimeleri veya eĹź anlamlılarını içermiyor. %2$sKelimeleri daha eĹźit dağıtın%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: Çok fazla karmaşık kelime kullanmıyorsunuz, bu da metninizin okunmasını kolaylaĹźtırıyor. GĂĽzel iĹź!"],"Word complexity":["Kelime karmaşıklığı"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: Metninizdeki kelimelerin %2$s kadarı karmaşık olarak tespit edildi. %3$sOkunabilirliÄźi artırmak için daha kısa ve daha tanıdık kelimeler kullanmaya çalışın%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sHizalama%3$s: Ortaya hizalanmış uzun bir metin bölĂĽmĂĽ var. %2$sSola hizalı yapmanızı öneririz%3$s.","%1$sHizalama%3$s: Ortaya hizalanmış %4$s uzun metin bölĂĽmĂĽ var. %2$sSola hizalı yapmanızı öneririz%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sHizalama%3$s: Ortaya hizalanmış uzun bir metin bölĂĽmĂĽ var. %2$sSaÄźa hizalı yapmanızı öneririz%3$s.","%1$sHizalama%3$s: Ortaya hizalanmış %4$s uzun metin bölĂĽmĂĽ var. %2$sSaÄźa hizalı yapmanızı öneririz%3$s."],"Select image":["FotoÄźraf seç"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Biraz baÄźlantı ekleme zamanı! AĹźağıda, köşe taşı içeriklerinizi içeren bir liste görĂĽyorsunuz. Her bir köşe taşının altında, bu köşe taşına baÄźlantı ekleyebileceÄźiniz makaleler için öneriler bulunmaktadır. BaÄźlantıyı eklerken, köşe taşı makalenizle ilgili bir cĂĽmleyi ilgili makale içine eklediÄźinizden emin olun. Köşe taĹźlarınız kendilerini iĹźaret eden en fazla iç baÄźlantıya sahip olana kadar, ihtiyaç duyduÄźunuz sayıda ilgili makaleden baÄźlantı eklemeye devam edin."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Sitenizdeki bazı makaleler %1$sen%2$s önemlileridir. İnsanların sorularını yanıtlar ve sorunlarını çözerler. Bu yĂĽzden sıralamada yer almayı hak ederler! %3$s olarak biz bunlara köşe taşı makaleler diyoruz. Sıralamada yer almalarını saÄźlamanın yollarından biri, onlara yeterince baÄźlantı yönlendirmektir. Daha fazla baÄźlantı, arama motorlarına bu makalelerin önemli ve deÄźerli olduÄźu sinyalini verir. Bu çalışmada, köşe taşı makalelerinize baÄźlantı eklemenize yardımcı olacağız!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["Biraz daha metin eklediÄźinizde, metninizin resmiyet dĂĽzeyini size söyleyebileceÄźiz."],"Overall, your text appears to be %1$s%3$s%2$s.":["Genel olarak, metniniz %1$s%3$s%2$s gibi görĂĽnĂĽyor."],"Heading %d":["BaĹźlık %d"],"Maximum heading level":["En fazla baĹźlık seviyesi"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["BaÄźlantı önerilerini etkisizleĹźtirdiniz, fakat bu iliĹźkili baÄźlantıların çalışması için gerekli. EÄźer iliĹźkili baÄźlantılar eklemek isterseniz, lĂĽtfen Site özellikleri bölĂĽmĂĽne gidin ve baÄźlantı önerilerini etkinleĹźtirin."],"Schema":["Ĺžema"],"Meta tags":["Meta etiketleri"],"Not available":["Uygun deÄźil"],"Checks":["Kontroller"],"Focus Keyphrase":["Odak anahtar ifade"],"Good":["İyi"],"No index":["İndeks yok"],"Front-end SEO inspector":["Ă–n yĂĽz SEO denetleyicisi"],"Focus keyphrase not set":["Odak anahtar ifade ayarlanmadı"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["LĂĽtfen dikkat: Bu egzersizin iyi çalışması için SEO veri optimizasyon aracını çalıştırmanız gerekir. Yöneticiler bunu %1$sSEO > Araçları%2$s altında çalıştırabilir."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["BaÄźlantılanmayan makalelerinize baÄźlantılar eklediniz ve artık ilgisiz olanları temizlediniz. Harika iĹź! AĹźağıdaki özete bir göz atın ve baĹźarınızı kutlayın!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Bu listedeki içeriÄźi dikkatle inceleyin ve gerekli gĂĽncellemeleri yapın. GĂĽncelleme konusunda yardıma ihtiyacınız varsa, size %1$stĂĽm yol boyunca rehberlik edebilecek çok kullanışlı bir blog yazımız var%2$s (yeni bir sekmede açmak için tıklayın)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sDaha fazla rehberliÄźe mi ihtiyacınız var? AĹźağıdaki kılavuzda her adımı daha ayrıntılı olarak ele aldık: %2$sBaÄźlantılanmamış içerik egzersizi%7$s nasıl kullanılır%3$s%4$s%5$s. %6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["En iyi içeriÄźinizi bulmayı kolaylaĹźtırdınız ve sıralama olasılığınızı artırdınız! Harika iĹź çıkardınız! Zaman zaman, köşe taĹźlarınızın yeterli baÄźlantı alıp almadığını kontrol etmeyi unutmayın!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["AĹźağıdaki listeye bir göz atın. Köşe taĹźlarınız (%1$s ile iĹźaretlenmiĹź) kendisine iĹźareten eden en çok iç baÄźlantıya sahip mi? Bir köşe taşının daha fazla baÄźlantıya ihtiyacı olduÄźunu düşünĂĽyorsanız Optimize Et dĂĽÄźmesini tıklayın. Bu, makaleyi bir sonraki adıma taşıyacaktır."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["TĂĽm köşe taĹźlarınızın yeĹźil iĹźaretleri var mı? En iyi sonuçlar için, olmayanları dĂĽzenlemeyi düşünĂĽn!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Hangi makaleleri en ĂĽst sıralarda göstermek istiyorsunuz? Hedef kitleniz hangilerini en yararlı ve eksiksiz bulur? AĹźağıyı gösteren oku tıklatın ve bu ölçütlere uyan makaleleri arayın. Listeden seçtiÄźiniz makaleleri otomatik olarak köşe taşı olarak iĹźaretleyeceÄźiz."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$s Daha fazla rehberliÄźe mi ihtiyacınız var? Ĺžurada her adımı daha ayrıntılı olarak ele aldık: %2$s%7$s Köşe taşı egzersizleri nasıl kullanılır%3$s%4$s%5$s. %6$s"],"Yoast Subpages":["Yoast alt sayfalar"],"Yoast Siblings":["Yoast kardeĹź sayfalar"],"Yoast Table of Contents":["Yoast içindekiler"],"Yoast Related Links":["Yoast ilgili baÄźlantılar"],"Finish optimizing":["Optimizasyonu tamamlayın"],"You've finished adding links to this article.":["Bu makaleye baÄźlantı eklemeyi tamamladınız."],"Optimize":["Optimize et"],"Added to next step":["Sonraki adıma eklendi"],"Choose cornerstone articles...":["Köşe taşı makalelerini seçin..."],"Loading data...":["Veri yĂĽkleniyor..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["HenĂĽz bu antrenmanı kullanarak herhangi bir makaleyi temizlemediniz veya gĂĽncellemediniz. Bunu yaptığınızda, çalışmanızın bir özeti burada görĂĽnecektir."],"Skipped":["Atlandı"],"Hidden from search engines.":["Arama motorlarından gizlenmiĹź."],"Removed":["Kaldırıldı"],"Improved":["İyileĹźtirildi"],"Resolution":["ÇözĂĽm"],"Loading redirect options...":["Yönlendirme seçenekleri yĂĽkleniyor..."],"Remove and redirect":["Kaldır ve yeniden yönlendir"],"Custom url:":["Ă–zel baÄźlantı:"],"Related article:":["İliĹźkili makale:"],"Home page:":["Ana sayfa:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["%1$s%2$s%3$s kaldırmak ĂĽzeresiniz. 404 hatalarını sitenizde engellemek için baĹźka bir sayfaya yönlendirmelisiniz. Nereye yönlendirmek istersiniz?"],"SEO Workout: Remove article":["SEO egzersizi: Makaleyi kaldır"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Her Ĺźey iyi görĂĽnĂĽyor! Sitenizde altı aydan eski ve sitenizde çok az baÄźlantı alan makale bulamadık. Yeni temizleme önerileri için burayı daha sonra tekrar kontrol edin!"],"Hide from search engines":["Arama motorlarından gizle"],"Improve":["İyileĹźtir"],"Are you sure you wish to hide this article from search engines?":["Bu makaleyi arama motorlarından gizlemek istediÄźinizden emin misiniz?"],"Action":["Eylem"],"You've hidden this article from search engines.":["Bu makaleyi arama motorlarından gizlediniz."],"You've removed this article.":["Bu makaleyi kaldırdınız."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Ĺžu anda iyileĹźtirmek için herhangi bir makale seçmediniz. BaÄźlantı eklemek için önceki adımlarda birkaç makale seçin, size burada baÄźlantı önerilerini gösterelim."],"Loading link suggestions...":["BaÄźlantı önerileri yĂĽkleniyor..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Bu makale için herhangi bir öneri bulamadık, ancak elbette ilgili olduÄźunu düşündüğünĂĽz makalelere baÄźlantılar ekleyebilirsiniz."],"Skip":["Geç"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Bu adım için henĂĽz herhangi bir makale seçmediniz. Bunu önceki adımda yapabilirsiniz."],"Is it up-to-date?":["GĂĽncel mi?"],"Last Updated":["Son gĂĽncelleme"],"You've moved this article to the next step.":["Bu makaleyi bir sonraki adıma taşıdınız."],"Unknown":["Bilinmiyor"],"Clear summary":["Ă–zeti temizle"],"Add internal links towards your orphaned articles.":["Yetim kalan makalelerinize dahili baÄźlantılar ekleyin."],"Should you update your article?":["Makalenizi gĂĽncellemeli misiniz?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Siteniz, bir kez oluĹźturduÄźunuz ve daha sonra tekrar yĂĽzĂĽne bakmadığınız içeriklere sahip olabilir. Bunları gözden geçirmeniz ve kendinize bu içeriÄźin hâlâ sitenizle alakalı olup olmadığını sormanız önemlidir. İyileĹźtirmeli miyim yoksa kaldırmalı mıyım?"],"Start: Love it or leave it?":["BaĹźlangıç: Sevin ya da terk edin?"],"Clean up your unlinked content to make sure people can find it":["İnsanların bulabileceÄźinden emin olmak için baÄźlantısız içeriÄźinizi temizleyin"],"I've finished this workout":["Bu egzersizi bitirdim"],"Reset this workout":["Bu egzersizi sıfırla"],"Well done!":["Tebrikler!"],"Add internal links towards your cornerstones":["Köşe taĹźlarınıza dahili baÄźlantılar ekleyin"],"Check the number of incoming internal links of your cornerstones":["Köşe taĹźlarınızın gelen dahili baÄźlantılarının sayısını kontrol edin"],"Start: Choose your cornerstones!":["BaĹźlayın: Köşe taĹźlarınızı seçin!"],"The cornerstone approach":["Köşe taşı yaklaşımı"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["LĂĽtfen dikkat: Bu egzersizin iyi çalışması ve size baÄźlantı önerileri sunması için SEO veri optimizasyon aracını çalıştırmanız gerekir. Yöneticiler bunu %1$sSEO > Araçlar%2$s altında çalıştırabilir."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["Bu adımı bitirdim"],"Revise this step":["Bu adımı gözden geçirin"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Sayfalarınızda dahili baÄźlantılar bulamadık. Ya içeriÄźinize henĂĽz herhangi bir dahili baÄźlantı eklemediniz ya da Yoast SEO onları dizine eklemedi. SEO > Araçlar altında SEO veri optimizasyonunu çalıştırarak Yoast SEO’nun baÄźlantılarınızı indekslemesini saÄźlayabilirsiniz."],"Incoming links":["Gelen baÄźlantılar"],"Edit to add link":["BaÄźlantı eklemek için dĂĽzenleyin"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Ĺžu anda köşe taşı olarak iĹźaretlenmiĹź makaleniz yok. Makalelerinizi köşe taşı olarak iĹźaretlediÄźinizde burada görĂĽnĂĽrler."],"Focus keyphrase":["Odak anahtar kelime"],"Article":["Makale"],"Readability score":["Okunabilirlik puanı"],"SEO score":["SEO puanı"],"Copy failed":["Kopyalama baĹźarısız"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Bu %1$sadım adım egzersizi%2$s kullanarak tĂĽm köşe taĹźlarınız için sıralamaları iyileĹźtirin!"],"Rank with articles you want to rank with":["Sıralamaya girmek istediÄźiniz makalelerle sıralayın"],"Descriptive text":["Açıklayıcı metin"],"Show the descriptive text":["Açıklayıcı metni göster"],"Show icon":["Simgeyi göster"],"Yoast Estimated Reading Time":["Yoast tahmini okuma sĂĽresi"],"Shows an estimated reading time based on the content length.":["İçerik uzunluÄźuna göre tahmini bir okuma sĂĽresi gösterir."],"reading time":["okuma sĂĽresi"],"content length":["içerik uzunluÄźu"],"Estimated reading time:":["Tahmini okuma sĂĽresi"],"minute":["dakika","dakika"],"Settings":["Ayarlar"],"OK":["TAMAM"],"Close":["Kapat"],"Type":["Tip"],"Orphaned content":["Sahipsiz içerik"],"Synonyms":["EĹź Anlamlılar"],"Internal linking suggestions":["İç baÄźlantı önerileri"],"Enter a related keyphrase to calculate the SEO score":["SEO puanını hesaplamak için ilgili bir anahtar kelime girin."],"Related keyphrase":["İlgili anahtar kelime"],"Add related keyphrase":["İlgili anahtar kelimeyi ekle"],"Analysis results":["Analiz sonuçları"],"Help on choosing the perfect keyphrase":["MĂĽkemmel anahtar kelimeyi seçme konusunda yardım et"],"Help on keyphrase synonyms":["Anahtar kelime eĹź anlamlıları konusunda yardım et"],"Keyphrase":["Anahtar kelime"],"New URL: {{link}}%s{{/link}}":["Yeni URL: {{link}}%s{{/link}}"],"Undo":["Geri al."],"Redirect created":["Yönlendirme oluĹźturuldu."],"%s just created a redirect from the old URL to the new URL.":["%s eski URL’den yeni URL’ye bir yönlendirme oluĹźturdu."],"Old URL: {{link}}%s{{/link}}":["Eski URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Anahtar kelime eĹź anlamlıları"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter paylaşım önizleme"],"Adds a list of internal links to sibling pages which share the same parent.":["Aynı ebeveyni paylaĹźan kardeĹź sayfalarına dahili baÄźlantıların bir listesini ekler."],"siblings":["kardeĹźler"],"sibling pages":["kardeĹź sayfalar"],"Adds a list of internal links to subpages of this page.":["Bu sayfanın alt sayfalarına dahili baÄźlantıların bir listesini ekler."],"seo":["seo"],"subpages":["alt sayfalar"],"childpages":["child sayfalar"],"children":["çocuklar"],"internal linking":["iç baÄźlantı"],"site structure":["site yapısı"],"We could not find any relevant articles on your website that you could link to from your post.":["Web sitenizde, yazınızdan baÄźlantı verebileceÄźiniz alakalı bir makale bulamadık."],"Load suggestions":["Ă–nerileri yĂĽkle"],"Refresh suggestions":["Ă–nerileri yenile"],"Write list…":["Yazma Listesi..."],"Adds a list of links related to this page.":["Bu sayfayla ilgili bir baÄźlantı listesi ekler."],"related posts":["İlgili Mesajlar"],"related pages":["ilgili sayfalar"],"Adds a table of contents to this page.":["Bu sayfaya içindekiler tablosu ekler."],"links":["baÄźlantılar"],"toc":["toc"],"Copy link":["BaÄźlantıyı kopyala"],"Copy link to suggested article: %s":["Ă–nerilen makelenin baÄźlanısını kopyala: %s"],"Add a title to your post for the best internal linking suggestions.":["En iyi dahili baÄźlantı önerileri için yayınınıza bir baĹźlık ekleyin."],"Add a metadescription to your post for the best internal linking suggestions.":["En iyi dahili baÄźlantı önerileri için yayınınıza bir meta açıklama ekleyin."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["En iyi dahili baÄźlantı önerileri için yayınınıza bir baĹźlık ve meta açıklama ekleyin."],"Also, add a title to your post for the best internal linking suggestions.":["Ayrıca, en iyi dahili baÄźlantı önerileri için yayınınıza bir baĹźlık ekleyin."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Ayrıca, en iyi dahili baÄźlantı önerileri için yayınınıza bir meta açıklama ekleyin."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Ayrıca, en iyi dahili baÄźlantı önerileri için gönderinize bir baĹźlık ve meta açıklama ekleyin."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Biraz daha kopya ekledikten sonra, burada size yayınınızda baÄźlantı kurabileceÄźiniz ilgili içeriÄźin bir listesini vereceÄźiz."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Site yapınızı iyileĹźtirmek için, web sitenizdeki diÄźer ilgili yayınlara veya sayfalara baÄźlantı vermeyi düşünĂĽn."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["BaÄźlayabileceÄźiniz ilgili içeriÄźin bir listesinin size gösterilmesi birkaç saniye sĂĽrer. Ă–neriler, elimize ulaşır ulaĹźmaz burada gösterilecektir."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["Daha fazla bilgi edinmek için {{a}} SEO için dahili baÄźlantı oluĹźturma hakkındaki kılavuzumuzu okuyun {{/ a}}."],"Copied!":["Kopyalandı!"],"Not supported!":["Desteklenmiyor!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Birden çok ilgili anahtar kelime mi kullanmaya çalışıyorsunuz? Bunları ayrı ayrı eklemelisiniz."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Anahtar kelimeniz çok uzun. Azami 191 karakter olabilir."],"Add as related keyphrase":["İlgili anahtar kelime öbeÄźi olarak ekleyin"],"Added!":["EklenmiĹź!"],"Remove":["Kaldır"],"Table of contents":["İçindekiler"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Size en iyi %1$s Ĺźaşırtıcı önerileri %2$s sunabilmemiz için sitenizin SEO verilerini optimize etmemiz gerekiyor.\n\n%3$s SEO Veri optimizasyonunu baĹźlatın %4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-uk.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-uk.json deleted file mode 100644 index df5628a8..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-uk.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);","lang":"uk_UA"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Щоб отримати Đ´ĐľŃŃ‚ŃĐż Đ´Đľ цієї Ń„Ńнкції, вам потрібні активні підпиŃки %2$s та %3$s. Đ‘ŃĐ´ŃŚ лаŃка, %5$sактивŃйте Ńвої підпиŃки в %1$s%6$s або %7$sотримайте Đ˝ĐľĐ˛Ń %4$s%8$s. ПіŃля цього оновіть ŃторінкŃ, щоб Ń„Ńнкція коректно працювала. Це може зайняти Đ´Đľ 30 ŃекŃнд."],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":["ĐźĐµŃ€Ń Đ˝Ń–Đ¶ почати кориŃŃ‚ŃватиŃŃŹ генератором заголовків ĐI, необхідно ŃвімкнŃти SEO-аналіз. Щоб ŃвімкнŃти його, перейдіть Đ´Đľ %2$sŃ„Ńнкцій ŃĐ°ĐąŃ‚Ń %1$s%3$s, Ńвімкніть SEO-аналіз та натиŃніть \"Зберегти зміни\". Якщо SEO-аналіз вимкнений Ń Đ˛Đ°ŃĐľĐĽŃ ĐşĐľŃ€Đ¸ŃŃ‚ŃĐ˛Đ°Ń†ŃŚĐşĐľĐĽŃ ĐżŃ€ĐľŃ„Ń–Đ»Ń– WordPress, Ńвійдіть Ń Đ˛Đ°Ń ĐżŃ€ĐľŃ„Ń–Đ»ŃŚ та ввімкніть його там. Đ‘ŃĐ´ŃŚ лаŃка, звернітьŃŃŹ Đ´Đľ наŃого адмініŃтратора, якщо Ń Đ˛Đ°Ń Đ˝ĐµĐĽĐ°Ń” Đ´ĐľŃŃ‚ŃĐżŃ Đ´Đľ цих налаŃŃ‚Ńвань."],"Social share preview":["Попередній перегляд поŃирення в Ńоцмережах"],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":["Щоб продовжŃвати кориŃŃ‚ŃватиŃŃŹ Ń„Ńнкцією ШІ Yoast, бŃĐ´ŃŚ лаŃка, зменŃіть чаŃŃ‚ĐľŃ‚Ń Đ˛Đ°Ńих запитів. НаŃа %1$sдопоміжна Ńтаття%2$s ĐĽŃ–Ńтить вказівки щодо ефективного планŃвання та Ń€ĐľĐ·ĐżĐľĐ´Ń–Đ»Ń Đ·Đ°ĐżĐ¸Ń‚Ń–Đ˛ для оптимізації робочого процеŃŃ."],"You've reached the Yoast AI rate limit.":["Ви Đ´ĐľŃягли Đ»Ń–ĐĽŃ–Ń‚Ń ŃвидкоŃті ШІ Yoast."],"Allow":["Дозволити"],"Deny":["Відхилити"],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":["Щоб переглянŃти це відео, вам потрібно дозволити %1$s завантажŃвати вбŃдовані відео Đ· %2$s."],"Text generated by AI may be offensive or inaccurate.":["Згенерований ШІ текŃŃ‚ може бŃти образливим чи неточним."],"(Opens in a new browser tab)":["(ВідкриєтьŃŃŹ в новій вкладці браŃзера)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["ПриŃвидŃіть робочий ĐżŃ€ĐľŃ†ĐµŃ Đ·Đ° допомогою генеративного ШІ. ОтримŃйте виŃокоякіŃні пропозиції заголовків та опиŃів для поŃŃків та вигляді в Ńоцмережах. %1$sДізнатиŃŃŹ більŃе%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["ГенерŃйте заголовки та опиŃи за допомогою ШІ Yoast!"],"New to %1$s":["Новачок в %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":["ĐŻ приймаю %1$sУмови надання поŃĐ»ŃĐł%2$s та %3$sĐźĐľĐ»Ń–Ń‚Đ¸ĐşŃ ĐşĐľĐ˝Ń„Ń–Đ´ĐµĐ˝Ń†Ń–ĐąĐ˝ĐľŃті%4$s ŃервіŃŃ \"ШІ Yoast\". Це включає Đ·ĐłĐľĐ´Ń Đ˝Đ° збір та викориŃтання даних для покращення кориŃŃ‚Ńвацького Đ´ĐľŃвідŃ."],"Start generating":["Розпочніть генерацію"],"Yes, revoke consent":["Так, відкликати згодŃ"],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":["ВідкликавŃи згодŃ, ви більŃе не матимете Đ´ĐľŃŃ‚ŃĐżŃ Đ´Đľ Ń„Ńнкцій ШІ Yoast. Ви впевнені, що хочете відкликати згодŃ?"],"Something went wrong, please try again later.":["ЩоŃŃŚ піŃло не так, бŃĐ´ŃŚ лаŃка, ŃпробŃйте пізніŃе."],"Revoke AI consent":["Відкликати Đ·ĐłĐľĐ´Ń Đ¨Đ†"],"Please enter a focus keyphrase first to use AI.":["Đ‘ŃĐ´ŃŚ лаŃка, ŃĐżĐľŃ‡Đ°Ń‚ĐşŃ Đ˛Đ˛ĐµĐ´Ń–Ń‚ŃŚ ĐşĐ»ŃŽŃ‡ĐľĐ˛Ń Ń„Ń€Đ°Đ·Ń, щоб викориŃтовŃвати ШІ."],"AI title generator":["Генератор заголовків ШІ"],"AI description generator":["Генератор опиŃів ШІ"],"AI Twitter title generator":["Генератор заголовків Twitter ШІ"],"AI Twitter description generator":["Генератор опиŃів Twitter ШІ"],"AI social title generator":["Генератор заголовків Ńоцмереж ШІ"],"AI social description generator":["Генератор опиŃів Ńоцмереж ШІ"],"Twitter preview":["Попередній перегляд Twitter"],"Dismiss":["Відхилити"],"Don’t show again":["БільŃе не показŃвати"],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":["%1$sПорада%2$s: Đ’Đ´ĐľŃкональте точніŃть згенерованих ШІ заголовків, напиŃавŃи більŃе вміŃŃ‚Ń Đ˝Đ° ваŃŃ ŃторінкŃ."],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":["%1$sПорада%2$s: Đ’Đ´ĐľŃкональте точніŃть згенерованих ШІ опиŃів, напиŃавŃи більŃе вміŃŃ‚Ń Đ˝Đ° ваŃŃ–Đą Ńторінці."],"Try again":["СпробŃйте ще раз"],"Social preview":["Попередній перегляд Ńоцмереж"],"Desktop result":["РезŃльтат для комп'ютера"],"Mobile result":["Мобільний резŃльтат"],"Apply AI description":["ЗаŃтоŃŃвати ĐľĐżĐ¸Ń Đ¨Đ†"],"Apply AI title":["ЗаŃтоŃŃвати заголовок ШІ"],"Next":["Далі"],"Previous":["Назад"],"Generate 5 more":["ЗгенерŃвати ще 5"],"Google preview":[" Попередній перегляд Google"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Через ŃŃворі етичні правила OpenAI та %1$sĐżĐľĐ»Ń–Ń‚Đ¸ĐşŃ Đ˛Đ¸ĐşĐľŃ€Đ¸Ńтання%2$s, ми не можемо генерŃвати SEO-заголовки для ваŃої Ńторінки. Якщо ви маєте намір викориŃтовŃвати ШІ, бŃĐ´ŃŚ лаŃка, Ńникайте викориŃтання наŃильницького або ŃекŃŃально відвертого вміŃŃ‚Ń. %3$sДізнайтеŃŃŹ більŃе про те, ŃŹĐş налаŃŃ‚Ńвати Ńвою ŃторінкŃ, щоб отримати найкращі резŃльтати за допомогою ŃŃ‚Ńчного інтелектŃ%4$s."],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":["Через ŃŃворі етичні правила OpenAI та %1$sĐżĐľĐ»Ń–Ń‚Đ¸ĐşŃ Đ˛Đ¸ĐşĐľŃ€Đ¸Ńтання%2$s, ми не можемо генерŃвати метаопиŃи для ваŃої Ńторінки. Якщо ви маєте намір викориŃтовŃвати ШІ, бŃĐ´ŃŚ лаŃка, Ńникайте викориŃтання наŃильницького або ŃекŃŃально відвертого вміŃŃ‚Ń. %3$sДізнайтеŃŃŹ більŃе про те, ŃŹĐş налаŃŃ‚Ńвати Ńвою ŃторінкŃ, щоб отримати найкращі резŃльтати Đ· ШІ%4$s."],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":["Для Đ´ĐľŃŃ‚ŃĐżŃ Đ´Đľ цієї Ń„Ńнкції необхідна активна підпиŃка %1$s. Đ‘ŃĐ´ŃŚ лаŃка, %3$sактивŃйте Ńвою підпиŃĐşŃ Đ˛ %2$s%4$s чи %5$sотримайте Đ˝ĐľĐ˛Ń %1$sпідпиŃĐşŃ%6$s. ПіŃля цього натиŃніть на ĐşĐ˝ĐľĐżĐşŃ ĐľĐ˝ĐľĐ˛Đ»ĐµĐ˝Đ˝ŃŹ Ńторінки, щоб ця Ń„Ńнкція працювала коректно. Це займе менŃе 30 ŃекŃнд."],"Refresh page":["Оновіть ŃторінкŃ"],"Not enough content":["НедоŃтатньо вміŃŃ‚Ń"],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":["Đ‘ŃĐ´ŃŚ лаŃка, ŃпробŃйте пізніŃе. Якщо проблема не зникне, %1$sзвернітьŃŃŹ Đ´Đľ наŃої ŃĐ»Ńжби підтримки%2$s!"],"Something went wrong":["ЩоŃŃŚ піŃло не так"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":["Схоже, ŃкінчивŃŃŹ Ń‡Đ°Ń ĐľŃ‡Ń–ĐşŃвання Đ·'єднання. Đ‘ŃĐ´ŃŚ лаŃка, перевірте інтернет-Đ·'єднання та ŃпробŃйте пізніŃе. Якщо проблема не зникне, бŃĐ´ŃŚ лаŃка, %1$sзвернітьŃŃŹ Đ´Đľ наŃої ŃĐ»Ńжби підтримки%2$s"],"Connection timeout":["Đ§Đ°Ń ĐľŃ‡Ń–ĐşŃвання Đ·'єднання вийŃов"],"Use AI":["ВикориŃтайте ШІ"],"Close modal":["Закрити модальне вікно"],"Learn more about AI (Opens in a new browser tab)":["ДізнайтеŃŃŹ більŃе про ШІ (ВідкриваєтьŃŃŹ в новій вкладці)"],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":["%1$sЗаголовок%3$s: ĐŁ ваŃої Ńторінки ще немає заголовка. %2$sДодайте його%3$s!"],"%1$sTitle%2$s: Your page has a title. Well done!":["%1$sЗаголовок%2$s: ĐŁ ваŃої Ńторінки Ń” заголовок. Гарна робота!"],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sРозподілення ключової фрази%3$s: %2$sВикориŃтовŃйте в текŃті ваŃŃ ĐşĐ»ŃŽŃ‡ĐľĐ˛Ń Ń„Ń€Đ°Đ·Ń Ń– Ń—Ń— Ńиноніми, щоб ми могли порахŃвати рівномірніŃть розподілення ключової фрази%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sРозподілення ключової фрази%2$s: ХороŃа робота!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sРозподілення ключової фрази%3$s: Нерівномірне. Деякі чаŃтини ваŃого текŃŃ‚Ń Đ˝Đµ ĐĽŃ–Ńтять ключової фрази або Ń—Ń— Ńинонімів. %2$sРозподіліть Ń—Ń… Đ±Ń–Đ»ŃŚŃ Ń€Ń–Đ˛Đ˝ĐľĐĽŃ–Ń€Đ˝Đľ%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sРозподілення ключової фрази%3$s: Đ”Ńже нерівномірне. Великі чаŃтини ваŃого текŃŃ‚Ń Đ˝Đµ ĐĽŃ–Ńтять ключової фрази або Ń—Ń— Ńинонімів. %2$sРозподіліть Ń—Ń… Đ±Ń–Đ»ŃŚŃ Ń€Ń–Đ˛Đ˝ĐľĐĽŃ–Ń€Đ˝Đľ%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: ви не викориŃтовŃєте забагато Ńкладних Ńлів, що робить Đ˛Đ°Ń Ń‚ĐµĐşŃŃ‚ легким для читання. ХороŃа робота!"],"Word complexity":["СкладніŃть Ńлова"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s Ńлів Ń Đ˛Đ°ŃĐľĐĽŃ Ń‚ĐµĐşŃті вважаютьŃŃŹ Ńкладними. %3$sНамагайтеŃŃŹ викориŃтовŃвати коротŃŃ– та Đ±Ń–Đ»ŃŚŃ Đ·Đ˝Đ°ĐąĐľĐĽŃ– Ńлова, щоб покращити читабельніŃть%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["%1$sВирівнювання%3$s: Đ„ довгий Ńривок текŃŃ‚Ń, вирівняний по центрŃ. %2$sМи рекомендŃємо вирівняти його по Đ»Ń–Đ˛ĐľĐĽŃ ĐşŃ€Đ°ŃŽ%3$s.","%1$sВирівнювання%3$s: Đ„ %4$s довгі Ńривки текŃŃ‚Ń, вирівняні по центрŃ. %2$sМи рекомендŃємо вирівняти Ń—Ń… по Đ»Ń–Đ˛ĐľĐĽŃ ĐşŃ€Đ°ŃŽ%3$s.","%1$sВирівнювання%3$s: Đ„ %4$s довгих Ńривків текŃŃ‚Ń, вирівняних по центрŃ. %2$sМи рекомендŃємо вирівняти Ń—Ń… по Đ»Ń–Đ˛ĐľĐĽŃ ĐşŃ€Đ°ŃŽ%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["%1$sВирівнювання%3$s: Đ„ довгий Ńривок текŃŃ‚Ń, вирівняний по центрŃ. %2$sМи рекомендŃємо вирівняти його по ĐżŃ€Đ°Đ˛ĐľĐĽŃ ĐşŃ€Đ°ŃŽ%3$s.","%1$sВирівнювання%3$s: Đ„ %4$s довгі Ńривки текŃŃ‚Ń, вирівняні по центрŃ. %2$sМи рекомендŃємо вирівняти Ń—Ń… по ĐżŃ€Đ°Đ˛ĐľĐĽŃ ĐşŃ€Đ°ŃŽ%3$s.","%1$sВирівнювання%3$s: Đ„ %4$s довгих Ńривків текŃŃ‚Ń, вирівняних по центрŃ. %2$sМи рекомендŃємо вирівняти Ń—Ń… по ĐżŃ€Đ°Đ˛ĐľĐĽŃ ĐşŃ€Đ°ŃŽ%3$s."],"Select image":["Виберіть зображення"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":["Đ§Đ°Ń Đ´ĐľĐ´Đ°Ń‚Đ¸ кілька поŃилань! Нижче ви бачите ŃпиŃок Đ· ваŃими наріжними каменями. Під кожним Đ· них Ń” пропозиції щодо Ńтатей, Đ· яких ви можете додати поŃилання. Додаючи поŃилання, переконайтеŃŃŹ, що ви вŃтавили його в релевантне речення, пов'язане Đ· ваŃою наріжною Ńтаттею. ПродовжŃйте додавати поŃилання Đ· якомога більŃої кількоŃті пов'язаних Ńтатей, поки ваŃŃ– наріжні камені не отримають якомога більŃе внŃтріŃніх поŃилань, що вказŃють на них."],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":["Деякі Ńтатті на ваŃĐľĐĽŃ Ńайті %1$sĐ´Ńже%2$s важливі. Вони дають відповіді на питання, які Ńтавлять люди, та допомагають виріŃŃвати проблеми. Đ˘ĐľĐĽŃ Đ˛ĐľĐ˝Đ¸ заŃĐ»ŃговŃють на виŃокий рейтинг! Đ’ %3$s ми називаємо такі Ńтатті наріжними. Один Ń–Đ· ŃпоŃобів підвищити їхній рейтинг - це вказати на них Đ´ĐľŃтатню кількіŃть поŃилань. БільŃа кількіŃть поŃилань ŃигналізŃŃ” поŃŃковим ŃиŃтемам, що ці Ńтатті Ń” важливими та цінними. ĐŁ Ń†ŃŚĐľĐĽŃ Ń‚Ń€ĐµĐ˝Đ°Đ¶ĐµŃ€Ń– ми допоможемо вам додати поŃилання на ваŃŃ– наріжні Ńтатті!"],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":["ПіŃля того, ŃŹĐş ви додаŃте трохи більŃе інформації, ми зможемо Ńказати вам, наŃкільки формально оформлений Đ˛Đ°Ń Ń‚ĐµĐşŃŃ‚."],"Overall, your text appears to be %1$s%3$s%2$s.":["Загалом Đ˛Đ°Ń Đ˛Đ¸ĐłĐ»ŃŹĐ´Đ°Ń”, ŃŹĐş %1$s%3$s%2$s."],"Heading %d":["Заголовок %d"],"Maximum heading level":["МакŃимальний рівень заголовка"],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["Ви вимкнŃли Ń„Ńнкцію Пропозиції поŃилань, Đ˝ĐµĐľĐ±Ń…Ń–Đ´Đ˝Ń Đ´Đ»ŃŹ роботи Пов'язаних поŃилань. Якщо ви хочете додати Пов'язані поŃилання, бŃĐ´ŃŚ лаŃка, перейдіть на ФŃнкції ŃĐ°ĐąŃ‚Ń Ń‚Đ° ввімкніть Пропозиції поŃилань."],"Schema":["Схема"],"Meta tags":["Мета позначка"],"Not available":["НедоŃŃ‚Ńпний"],"Checks":["Перевірки"],"Focus Keyphrase":["ФокŃŃні ключові фрази"],"Good":["Добре"],"No index":["Не індекŃŃвати"],"Front-end SEO inspector":["Фронт-енд SEO Ń–Đ˝Ńпектор"],"Focus keyphrase not set":["ФокŃŃна ключова фраза на вŃтановлена"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Đ‘ŃĐ´ŃŚ лаŃка, зверніть ŃвагŃ: щоб цей тренажер працював добре, вам потрібно запŃŃтити Ń–Đ˝ŃтрŃмент, оптимізації даних SEO. ĐдмініŃтратори можŃть зробити це в %1$sSEO > ІнŃтрŃменти%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Ви додали поŃилання на закинŃті Ńтатті та очиŃтили ті, що вже не актŃальні. ЧŃдова робота! Погляньте на підŃŃмок нижче та відзначте, чого ви Đ´ĐľŃягли!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Критично Đ´ĐľŃлідіть вміŃŃ‚ Ń Ń†ŃŚĐľĐĽŃ ŃпиŃĐşŃ Ń‚Đ° зробіть необхідні оновлення. Якщо вам потрібна допомога Đ· оновленням, Ń Đ˝Đ°Ń Ń” %1$sкориŃна Ńтаття в блозі, що допоможе вам Đ· цим%2$s (натиŃніть, щоб відкрити в новій вкладці)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sПотрібні додаткові вказівки? Ми розглянŃли кожен крок Đ±Ń–Đ»ŃŚŃ Đ´ĐµŃ‚Đ°Đ»ŃŚĐ˝Đľ в Ń†ŃŚĐľĐĽŃ ĐżĐľŃібникŃ: %2$sТренажер Đ· викориŃтання закинŃтого вміŃŃ‚Ń %7$s %3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Ви щойно зробили так, щоб Đ˛Đ°Ń Đ˝Đ°ĐąĐşŃ€Đ°Ń‰Đ¸Đą вміŃŃ‚ бŃло легŃе знаходити та підвищŃвати рейтинг! Так тримати! Đ§Đ°Ń Đ˛Ń–Đ´ чаŃŃ Đ˝Đµ забŃвайте перевіряти, чи ваŃŃ– наріжні камені отримŃють Đ´ĐľŃтатньо поŃилань!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["ПодивітьŃŃŹ на ŃпиŃок нижче. Чи ваŃŃ– наріжні камені (позначені %1$s) мають більŃŃ–Ńть внŃтріŃніх поŃилань, які вказŃють на них? НатиŃніть ĐşĐ˝ĐľĐżĐşŃ Â«ĐžĐżŃ‚Đ¸ĐĽŃ–Đ·Ńвати», якщо ви вважаєте, що наріжний камінь потребŃŃ” більŃе поŃилань. Це переведе Ńтаттю на наŃŃ‚Ńпний крок."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Чи вŃŃ– ваŃŃ– наріжні камені позначені зеленими позначками? Для кращого резŃĐ»ŃŚŃ‚Đ°Ń‚Ń Đ˛Ń–Đ´Ń€ĐµĐ´Đ°ĐłŃйте непозначені!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Які Ńтатті ви бажаєте бачити найвище в рейтингŃ? Які ваŃа аŃдиторія вважає Đ˝Đ°ĐąĐ±Ń–Đ»ŃŚŃ ĐşĐľŃ€Đ¸Ńними та заверŃеними? НатиŃніть на ŃтрілочкŃ, що вказŃŃ” вниз, та перегляньте Ńтатті, що відповідають цим критеріям. Ми автоматично позначимо вибрані вами Đ·Ń– ŃпиŃĐşŃ Ńтатті ŃŹĐş наріжні."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sПотрібна допомога? Ми детально опиŃали кожен крок Ń: %2$sĐŻĐş кориŃŃ‚ŃватиŃŃŹ тренажером %7$s Đ·Ń– Ńтворення наріжної інформації%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["ПідŃторінки Yoast"],"Yoast Siblings":["Брати Đą ŃеŃтри Yoast"],"Yoast Table of Contents":["Таблиця Đ·ĐĽŃ–ŃŃ‚Ń Yoast"],"Yoast Related Links":["Пов'язані поŃилання Yoast"],"Finish optimizing":["ЗаверŃити оптимізацію"],"You've finished adding links to this article.":["Ви закінчили додавати поŃилання Đ´Đľ цієї Ńтатті."],"Optimize":["ОптимізŃвати"],"Added to next step":["Додано Đ´Đľ наŃŃ‚Ńпного крокŃ"],"Choose cornerstone articles...":["Вибрати наріжні Ńтатті..."],"Loading data...":["Завантаження даних..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Ви ще не очиŃтили або не оновили Ńтатті за допомогою цього тренŃвання. Щойно ви це зробите - резŃльтат ваŃої роботи Đ·'явитьŃŃŹ Ń‚ŃŃ‚."],"Skipped":["ПропŃщено"],"Hidden from search engines.":["Приховати від поŃŃкових ŃиŃтем."],"Removed":["Видалено"],"Improved":["Покращено"],"Resolution":["Đ Ń–Ńення"],"Loading redirect options...":["Завантаження параметрів перенаправлення..."],"Remove and redirect":["Видалити та перенаправити"],"Custom url:":["КориŃŃ‚Ńвацький url:"],"Related article:":["Пов'язані Ńтатті:"],"Home page:":["ДомаŃня Ńторінка:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Ви збираєтеŃŃŹ видалити %1$s%2$s%3$s. Щоб запобігти помилкам 404 на ваŃĐľĐĽŃ Ńайті, вам Ńлід перенаправляти його на Ń–Đ˝ŃŃ ŃŃ‚ĐľŃ€Ń–Đ˝ĐşŃ Ńвого ŃайтŃ. ĐšŃди б ви хотіли перенаправляти?"],"SEO Workout: Remove article":["ТренŃвання SEO: видалити Ńтаттю"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["ĐŁŃе виглядає чŃдово! На ваŃĐľĐĽŃ Ńайті ми не знайŃли Ńтатей ŃтарŃих ŃеŃти ĐĽŃ–Ńяців Đ· невеликою кількіŃтю поŃилань. Виконайте ĐżĐµŃ€ĐµĐ˛Ń–Ń€ĐşŃ ĐżŃ–Đ·Đ˝Ń–Ńе, щоб отримати рекомендації Đ· очищення!"],"Hide from search engines":["Приховати від поŃŃкових ŃиŃтем"],"Improve":["Покращити"],"Are you sure you wish to hide this article from search engines?":["Ви впевнені, що хочете приховати цю Ńтаттю від поŃŃкових ŃиŃтем?"],"Action":["Дія"],"You've hidden this article from search engines.":["Ви приховали цю Ńтаттю від поŃŃкових ŃиŃтем."],"You've removed this article.":["Ви видалили цю Ńтаттю."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Наразі ви не вибрали жодної Ńтатті для покращення. ĐŁ попередніх кроках виберіть кілька Ńтатей, щоб додати поŃилання на них, Ń– ми покажемо вам пропозиції поŃилань Ń‚ŃŃ‚. "],"Loading link suggestions...":["Завантаження пропозицій поŃилань..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["Ми не знайŃли пропозицій для цієї Ńтатті, але, безперечно, ви можете додати поŃилання на Ńтатті, які ви вважаєте пов'язаними. "],"Skip":["ПропŃŃтити"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Ви не обрали жодної Ńтатті для цього крокŃ. Ви можете зробити це в ĐżĐľĐżĐµŃ€ĐµĐ´Đ˝ŃŚĐľĐĽŃ ĐşŃ€ĐľŃ†Ń–."],"Is it up-to-date?":["Це актŃально?"],"Last Updated":["ĐžŃтаннє оновлення"],"You've moved this article to the next step.":["Ви перенеŃли цю Ńтаттю на наŃŃ‚Ńпний крок."],"Unknown":["Невідомо"],"Clear summary":["ОчиŃтити резŃльтати"],"Add internal links towards your orphaned articles.":["Додайте внŃтріŃні поŃилання Đ´Đľ ваŃих Ńтатей-Ńиріт."],"Should you update your article?":["Чи треба вам оновлювати Ńтаттю?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Đ’Đ°Ń Ńайт можливо ĐĽŃ–Ńтить багато Ńтвореної колиŃŃŚ інформації, Đ´Đľ якої ніколи не звертаютьŃŃŹ. Важливо переглянŃти Ń—Ń— та зрозŃміти, чи цей вміŃŃ‚ вŃе ще релевантний для ваŃого ŃайтŃ. Đ’Đ´ĐľŃконалити його чи видалити?"],"Start: Love it or leave it?":["Почати: або так, або ніяк?"],"Clean up your unlinked content to make sure people can find it":["ОчиŃтіть незв'язаний вміŃŃ‚, щоб переконатиŃŃŹ, що люди можŃть знайти його"],"I've finished this workout":["ĐŻ заверŃив це тренŃвання"],"Reset this workout":["СкинŃти тренŃвання"],"Well done!":["ЧŃдова робота!"],"Add internal links towards your cornerstones":["Đ’Ńтавте внŃтріŃні поŃилання на Đ˝Đ°Ń€Ń–Đ¶Đ˝Ń Ń–Đ˝Ń„ĐľŃ€ĐĽĐ°Ń†Ń–ŃŽ"],"Check the number of incoming internal links of your cornerstones":["Перевірте кількіŃть вхідних внŃтріŃніх поŃилань наріжної інформації"],"Start: Choose your cornerstones!":["Початок: оберіть Ńвій ключовий вміŃŃ‚!"],"The cornerstone approach":["Đ—ĐĽŃ–Ńтовний підхід"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Đ‘ŃĐ´ŃŚ лаŃка, заŃважте: Щоб цей тренажер добре працював Đą надавав пропозиції для розміщення поŃилань, вам потрібно запŃŃтити Ń–Đ˝ŃтрŃмент для SEO-оптимізації даних. ĐдмініŃтратори можŃть запŃŃтити його в %1$sSEO > ІнŃтрŃменти%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["ĐŻ заверŃив цей крок "],"Revise this step":["Перегляньте цей крок"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["Ми не змогли знайти внŃтріŃні поŃилання на ваŃих Ńторінках. Đбо ви ще не додали жодного внŃтріŃнього поŃилання на вміŃŃ‚, або Yoast SEO не проіндекŃŃвав Ń—Ń…. Щоб Yoast SEO проіндекŃŃвав поŃилання, запŃŃтіть SEO-оптимізацію даних Ń Ń€ĐľĐ·Đ´Ń–Đ»Ń– SEO > ІнŃтрŃменти."],"Incoming links":["Вхідні поŃилання"],"Edit to add link":["РедагŃвати, щоб додати поŃилання"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Наразі Ń Đ˛Đ°Ń Đ˝ĐµĐĽĐ°Ń” Ńтатей, позначених ŃŹĐş наріжні. Коли ви позначите Ńтатті ŃŹĐş наріжні, вони Đ·'являтьŃŃŹ Ń‚ŃŃ‚."],"Focus keyphrase":["ФокŃŃне ключове Ńлово"],"Article":["Стаття"],"Readability score":["Оцінка читабельноŃті"],"SEO score":["Оцінка SEO"],"Copy failed":["Не вдалоŃŃŹ Ńкопіювати"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Покращте ранжŃвання для вŃієї наріжної інформації за допомогою цього %1$sпокрокового тренажерŃ!%2$s"],"Rank with articles you want to rank with":["КлаŃифікŃйте Ńтатті, за якими ви хочете оцінити рейтинг"],"Descriptive text":["ОпиŃовий текŃŃ‚"],"Show the descriptive text":["Показати опиŃовий текŃŃ‚"],"Show icon":["Показати іконкŃ"],"Yoast Estimated Reading Time":["Орієнтовний Ń‡Đ°Ń Ń‡Đ¸Ń‚Đ°Đ˝Đ˝ŃŹ Yoast"],"Shows an estimated reading time based on the content length.":["Відображає орієнтовний Ń‡Đ°Ń Ń‡Đ¸Ń‚Đ°Đ˝Đ˝ŃŹ на ĐľŃнові довжини вміŃŃ‚Ń."],"reading time":["Ń‡Đ°Ń Ń‡Đ¸Ń‚Đ°Đ˝Đ˝ŃŹ"],"content length":["довжина вміŃŃ‚Ń"],"Estimated reading time:":["Орієнтовний Ń‡Đ°Ń Ń‡Đ¸Ń‚Đ°Đ˝Đ˝ŃŹ:"],"minute":["хвилина","хвилини","хвилин"],"Settings":["НалаŃŃ‚Ńвання"],"OK":["OK"],"Close":["Закрити"],"Type":["Тип"],"Orphaned content":["СирітŃький вміŃŃ‚"],"Synonyms":["Синоніми"],"Internal linking suggestions":["Пропозиції щодо внŃтріŃнього зв'ŃŹĐ·ĐşŃ"],"Enter a related keyphrase to calculate the SEO score":["Введіть ŃŃ…ĐľĐ¶Ń ĐşĐ»ŃŽŃ‡ĐľĐ˛Ń Ń„Ń€Đ°Đ·Ń Đ´Đ»ŃŹ обчиŃлення оцінки SEO"],"Related keyphrase":["Схожа ключова фраза"],"Add related keyphrase":["Додати Ńхоже ключове Ńлово"],"Analysis results":["РезŃльтати аналізŃ"],"Help on choosing the perfect keyphrase":["Допомога Ń Đ˛Đ¸Đ±ĐľŃ€Ń– бездоганної ключової фрази"],"Help on keyphrase synonyms":["Допомога Ń Đ˛Đ¸Đ±ĐľŃ€Ń– Ńинонімів ключової фрази"],"Keyphrase":["Ключова фраза"],"New URL: {{link}}%s{{/link}}":["Новий URL: {{link}}%s{{/link}}"],"Undo":["СкаŃŃвати"],"Redirect created":["ПереŃпрямŃвання Ńтворено"],"%s just created a redirect from the old URL to the new URL.":["%s щойно Ńтворив переŃпрямŃвання Đ·Ń– Ńтарого URL на новий."],"Old URL: {{link}}%s{{/link}}":["Старий URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Синоніми ключової фрази"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Попередній пергляд Ń Đ˘Đ˛Ń–Ń‚Ń‚ĐµŃ€Ń–"],"Adds a list of internal links to sibling pages which share the same parent.":["Додає ŃпиŃок внŃтріŃніх поŃилань на Ńторінки одного рівня, що мають ŃĐżŃ–Đ»ŃŚĐ˝Ń Đ±Đ°Ń‚ŃŚĐşŃ–Đ˛ŃŃŚĐşŃ ŃторінкŃ. "],"siblings":["однорівневі"],"sibling pages":["однорівневі Ńторінки"],"Adds a list of internal links to subpages of this page.":["Додає перелік внŃтріŃніх поŃилань Đ´Đľ підŃторінок цієї Ńторінки."],"seo":["seo"],"subpages":["підŃторінки"],"childpages":["дочірні Ńторінки"],"children":["дочірні"],"internal linking":["внŃтріŃні поŃилання"],"site structure":["ŃтрŃктŃра ŃайтŃ"],"We could not find any relevant articles on your website that you could link to from your post.":["Ми не змогли знайти на ваŃĐľĐĽŃ Ńайті відповідні Ńтатті, на які ви могли б поŃлатиŃŃŹ в ŃĐ˛ĐľŃ”ĐĽŃ Đ·Đ°ĐżĐ¸ŃŃ–."],"Load suggestions":["Завантажити пропозиції"],"Refresh suggestions":["Оновити пропозиції"],"Write list…":["СклаŃти ŃпиŃок…"],"Adds a list of links related to this page.":["Додає перелік поŃилань, пов'язаних Đ· цією Ńторінкою."],"related posts":["Ńхожі запиŃи"],"related pages":["Ńхожі Ńторінки"],"Adds a table of contents to this page.":["Додає таблицю вміŃŃ‚Ń Đ´Đľ цієї Ńторінки."],"links":["поŃилання"],"toc":["Đ·ĐĽŃ–ŃŃ‚"],"Copy link":["Скопіювати поŃилання"],"Copy link to suggested article: %s":["Скопіюйте поŃилання Đ´Đľ пропонованої Ńтатті: %s"],"Add a title to your post for the best internal linking suggestions.":["Додайте заголовок Đ´Đľ запиŃŃ Đ´Đ»ŃŹ кращих пропозицій внŃтріŃніх поŃилань."],"Add a metadescription to your post for the best internal linking suggestions.":["Додайте ĐĽĐµŃ‚Đ°ĐľĐżĐ¸Ń Đ´Đľ запиŃŃ Đ´Đ»ŃŹ кращих пропозицій внŃтріŃніх поŃилань."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Додайте заголовок та ĐĽĐµŃ‚Đ°ĐľĐżĐ¸Ń Đ´Đľ запиŃŃ Đ´Đ»ŃŹ кращих пропозицій внŃтріŃніх поŃилань."],"Also, add a title to your post for the best internal linking suggestions.":["Також додайте заголовок Đ´Đľ запиŃŃ Đ´Đ»ŃŹ кращих пропозицій внŃтріŃніх поŃилань."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Також додайте ĐĽĐµŃ‚Đ°ĐľĐżĐ¸Ń Đ´Đ»ŃŹ кращої пропозиції внŃтріŃніх поŃилань."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Також додайте заголовок та ĐĽĐµŃ‚Đ°ĐľĐżĐ¸Ń Đ´Đ»ŃŹ кращої пропозиції внŃтріŃніх поŃилань."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Щойно ви додаŃте ще трохи копій, ми надамо вам перелік пов'язаного контентŃ, на який ви зможете поŃилатиŃŃŚ Ń Đ˛Đ°Ńих запиŃах."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Щоб покращити ŃтрŃктŃŃ€Ń ŃайтŃ, подŃмайте над релевантними запиŃами чи Ńторінками на ваŃĐľĐĽŃ Ńайті."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Треба кілька ŃекŃнд, щоб відобразити перелік пов'язаного вміŃŃ‚Ń, на який ви зможете поŃилатиŃŃŹ. Пропозиції відображатимŃтьŃŃŹ Ń‚ŃŃ‚ щойно ми Ń—Ń… отримаємо."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["Щоб дізнатиŃŃŹ більŃе, {{a}}прочитайте Đ˝Đ°Ń ĐżĐľŃібник Đ· внŃтріŃніх поŃилань для SEO{{/a}}."],"Copied!":["Скопійовано!"],"Not supported!":["Не підтримŃєтьŃŃŹ!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["НамагаєтеŃŃŹ викориŃтати кілька пов'язаних ключових фраз? Додавайте Ń—Ń… окремо."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["ВаŃа ключова фраза задовга. Вона не може перевищŃвати 191 Ńимвол."],"Add as related keyphrase":["Додати ŃŹĐş ŃŃ…ĐľĐ¶Ń ĐşĐ»ŃŽŃ‡ĐľĐ˛Ń Ń„Ń€Đ°Đ·Ń"],"Added!":["Додано!"],"Remove":["Видалити"],"Table of contents":["Đ—ĐĽŃ–ŃŃ‚"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["Нам потрібно оптимізŃвати дані SEO ваŃого ŃайтŃ, щоб ми могли запропонŃвати вам найкращі %1$sпропозиції поŃилань%2$s. %3$sРозпочніть оптимізацію даних SEO%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ur.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ur.json deleted file mode 100644 index a7d3c3f2..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-ur.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=2; plural=n != 1;","lang":"ur_PK"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast subpages"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast table of contents"],"Yoast Related Links":["Yoast related links"],"Finish optimizing":["Finish optimising"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["Optimise"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["Skipped"],"Hidden from search engines.":["Hidden from search engines."],"Removed":["Removed"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute","minutes"],"Settings":["Settings"],"OK":["OK"],"Close":["Close"],"Type":["Type"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-vi.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-vi.json deleted file mode 100644 index 5c4ff109..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-vi.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=1; plural=0;","lang":"vi_VN"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schema"],"Meta tags":["Tháş» meta"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Xin lưu Ă˝: Äối vá»›i bĂ i táş­p nĂ y hoạt động tốt, bạn cáş§n chạy cĂ´ng cụ tối ưu hĂła dữ liệu SEO. Quản trị viĂŞn cĂł thá» chạy theo %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["Bạn đã thĂŞm các liĂŞn káşżt đến các bĂ i viáşżt mồ cĂ´i cá»§a bạn vĂ  bạn đã dọn sạch những thứ khĂ´ng còn phĂą hợp. Bạn đã lĂ m rất tốt! HĂŁy xem tĂłm tắt dưới đây vĂ  Än mừng những gì bạn đã hoĂ n thĂ nh!"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Kiá»m tra nghiĂŞm trọng ná»™i dung trong danh sách nĂ y vĂ  thá»±c hiện các bản cáş­p nháş­t cáş§n thiáşżt. Náşżu bạn cáş§n giĂşp cáş­p nháş­t, chĂşng tĂ´i cĂł rất nhiá»u %1$sBĂ i Ä‘Äng blog hữu Ă­ch cĂł thá» hướng dáş«n bạn tất cả các cách%2$s (nhấp đỠmở trong má»™t tab má»›i)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sCáş§n nhiá»u hướng dáş«n? ChĂşng tĂ´i đã bao gồm từng bước chi tiáşżt hơn trong hướng dáş«n sau:%2$s Cách sá»­ dụng bĂ i táş­p vá» ná»™i dung mồ cĂ´i %7$s%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["Bạn vừa lĂ m cho ná»™i dung tốt nhất cá»§a mình dá»… tìm vĂ  cĂł nhiá»u khả nÄng xáşżp hạng hơn! Tốt thĂ´i! Thỉnh thoảng, hĂŁy nhá»› kiá»m tra xem ná»n tảng cá»§a bạn cĂł nháş­n đủ liĂŞn káşżt hay khĂ´ng!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["HĂŁy xem danh sách dưới đây. LĂ m ná»n tảng cá»§a bạn (được đánh dấu báş±ng%1$s) cĂł nhiá»u liĂŞn káşżt ná»™i bá»™ nhất hướng vá» chĂşng khĂ´ng? Nhấp vĂ o nĂşt Tối ưu hĂła náşżu bạn nghÄ© ráş±ng má»™t ná»n tảng cáş§n nhiá»u liĂŞn káşżt hơn. Äiá»u đó sáş˝ chuyá»n bĂ i viáşżt sang bước tiáşżp theo."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["LĂ m tất cả các gĂłc cá»§a bạn cĂł đạn xanh? Äá» cĂł káşżt quả tốt nhất, hĂŁy xem xĂ©t chỉnh sá»­a những người khĂ´ng!"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Những bĂ i viáşżt nĂ o bạn muốn xáşżp hạng cao nhất? Những người khán giả cá»§a bạn sáş˝ tìm thấy sá»± hữu Ă­ch vĂ  đầy đủ nhất? Nhấp vĂ o mĹ©i tĂŞn hướng xuống vĂ  tìm các bĂ i viáşżt phĂą hợp vá»›i các tiĂŞu chĂ­ đó. ChĂşng tĂ´i sáş˝ tá»± động đánh dấu các bĂ i viáşżt bạn chọn từ danh sách dưới dạng ná»n tảng."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sCáş§n thĂŞm hướng dáş«n? ChĂşng tĂ´i đã trình bĂ y chi tiáşżt hơn từng bước trong:%2$s. Cách sá»­ dụng bĂ i táş­p ná»n tảng%7$s%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Các trang con cá»§a Yoast"],"Yoast Siblings":["Yoast anh chị em"],"Yoast Table of Contents":["Mục lục cá»§a Yoast"],"Yoast Related Links":["LiĂŞn káşżt liĂŞn quan đến Yoast."],"Finish optimizing":["HoĂ n tất tối ưu hĂła"],"You've finished adding links to this article.":["Bạn đã hoĂ n tất việc thĂŞm liĂŞn káşżt vĂ o bĂ i viáşżt nĂ y."],"Optimize":["Tối ưu hĂła"],"Added to next step":["ÄĂŁ thĂŞm vĂ o bước tiáşżp theo"],"Choose cornerstone articles...":["Chọn các bĂ i viáşżt quan trọng..."],"Loading data...":["Äang tải dữ liệu..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["Bạn chưa dọn dáşąp hoáş·c cáş­p nháş­t bất kỳ bĂ i viáşżt nĂ o báş±ng cách sá»­ dụng bĂ i táş­p nĂ y. Sau khi bạn thá»±c hiện, bản tĂłm tắt cĂ´ng việc cá»§a bạn sáş˝ hiá»n thị ở đây."],"Skipped":["ÄĂŁ bỏ qua"],"Hidden from search engines.":["Ẩn khỏi cĂ´ng cụ tìm kiáşżm."],"Removed":["ÄĂŁ xĂła"],"Improved":["ÄĂŁ cải thiện"],"Resolution":["Äiá»u quyáşżt định"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["XĂła vĂ  chuyá»n hướng"],"Custom url:":["Url tĂąy chỉnh:"],"Related article:":["BĂ i viáşżt liĂŞn quan:"],"Home page:":["Trang chá»§:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["Bạn sắp xĂła %1$s%2$s%3$s. Äá» ngÄn cháş·n các lá»—i 404 trĂŞn trang web cá»§a bạn, bạn nĂŞn chuyá»n hướng nĂł đến má»™t trang khác trĂŞn trang web cá»§a mình. Bạn muốn chuyá»n hướng nĂł đến đâu?"],"SEO Workout: Remove article":["Táş­p luyện SEO: XĂła bĂ i viáşżt"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Mọi thứ Ä‘á»u tốt! ChĂşng tĂ´i khĂ´ng tìm thấy bất kỳ bĂ i viáşżt nĂ o trĂŞn trang web cá»§a bạn cĹ© hơn sáu tháng vĂ  nháş­n được quá Ă­t liĂŞn káşżt trĂŞn trang web cá»§a bạn. Kiá»m tra lại tại đây sau đỠbiáşżt các đỠxuất dọn dáşąp má»›i!"],"Hide from search engines":["Ẩn khỏi cĂ´ng cụ tìm kiáşżm"],"Improve":["Cải thiện"],"Are you sure you wish to hide this article from search engines?":["Bạn cĂł chắc chắn muốn áş©n bĂ i viáşżt nĂ y khỏi các cĂ´ng cụ tìm kiáşżm khĂ´ng?"],"Action":["HĂ nh động "],"You've hidden this article from search engines.":["Bạn đã áş©n bĂ i viáşżt nĂ y khỏi các cĂ´ng cụ tìm kiáşżm."],"You've removed this article.":["Bạn đã xĂła bĂ i viáşżt nĂ y."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["Bạn hiện chưa chọn bất kỳ bĂ i viáşżt nĂ o đỠcải thiện. Chọn má»™t vĂ i bĂ i viáşżt trong các bước trước đỠthĂŞm liĂŞn káşżt vĂ o vĂ  chĂşng tĂ´i sáş˝ hiá»n thị cho bạn các đỠxuất liĂŞn káşżt tại đây."],"Loading link suggestions...":["Äang tải các đỠxuất liĂŞn káşżt ..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["ChĂşng tĂ´i khĂ´ng tìm thấy bất kỳ đỠxuất nĂ o cho bĂ i viáşżt nĂ y, nhưng tất nhiĂŞn bạn váş«n cĂł thá» thĂŞm liĂŞn káşżt đến các bĂ i viáşżt mĂ  bạn cho lĂ  cĂł liĂŞn quan."],"Skip":["Bỏ qua"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["Bạn chưa chọn bất kỳ bĂ i viáşżt nĂ o cho bước nĂ y. Bạn cĂł thá» lĂ m như váş­y ở bước trước."],"Is it up-to-date?":["NĂł lĂ  má»›i nhất phải khĂ´ng?"],"Last Updated":["Cáş­p nháş­t má»›i nhất"],"You've moved this article to the next step.":["Bạn đã chuyá»n bĂ i viáşżt nĂ y sang bước tiáşżp theo."],"Unknown":["KhĂ´ng xác định"],"Clear summary":["TĂłm tắt rõ rĂ ng"],"Add internal links towards your orphaned articles.":["ThĂŞm liĂŞn káşżt ná»™i bá»™ đến các \"bĂ i viáşżt mồ cĂ´i\" cá»§a bạn."],"Should you update your article?":["CĂł phải bạn nĂŞn cáş­p nháş­t bĂ i viáşżt cá»§a mình?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Trang web cá»§a bạn thường chứa nhiá»u ná»™i dung được tạo má»™t láş§n vĂ  khĂ´ng bao giờ nhìn lại sau đó. Äiá»u quan trọng lĂ  phải xem qua những Ä‘iá»u nĂ y vĂ  tá»± hỏi bản thân xem ná»™i dung nĂ y cĂł còn liĂŞn quan đến trang web cá»§a bạn hay khĂ´ng. TĂ´i nĂŞn cải thiện hay loại bỏ nĂł?"],"Start: Love it or leave it?":["Bắt đầu: YĂŞu thĂ­ch nĂł hay rời bỏ nĂł?"],"Clean up your unlinked content to make sure people can find it":["Dọn dáşąp ná»™i dung khĂ´ng được liĂŞn káşżt cá»§a bạn đỠđảm bảo mọi người cĂł thá» tìm thấy nĂł"],"I've finished this workout":["TĂ´i đã hoĂ n thĂ nh bĂ i táş­p nĂ y"],"Reset this workout":["Äáş·t lại bĂ i táş­p nĂ y"],"Well done!":["Tốt lắm!"],"Add internal links towards your cornerstones":["ThĂŞm liĂŞn káşżt ná»™i bá»™ vĂ o ná»n tảng cá»§a bạn"],"Check the number of incoming internal links of your cornerstones":["Kiá»m tra số lượng các LiĂŞn Káşżt Ná»™i Bá»™ Äáşżn trĂŞn các bĂ i viáşżt quan trọng (cornerstones) cá»§a bạn."],"Start: Choose your cornerstones!":["Bắt đầu: Chọn ná»™i dung quan trọng cá»§a bạn!"],"The cornerstone approach":["Phương pháp tiáşżp cáş­n ná»n tảng"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Xin lưu Ă˝: Äá» bĂ i táş­p nĂ y hoạt động tốt vĂ  cung cấp cho bạn các đỠxuất liĂŞn káşżt, bạn cáş§n chạy cĂ´ng cụ tối ưu hĂła dữ liệu SEO. Quản trị viĂŞn cĂł thá» chạy Ä‘iá»u nĂ y trong %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["TĂ´i đã hoĂ n thĂ nh bước nĂ y"],"Revise this step":["Sá»­a lại bước nĂ y"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["ChĂşng tĂ´i khĂ´ng thá» tìm thấy các liĂŞn káşżt ná»™i bá»™ trĂŞn các trang cá»§a bạn. Hoáş·c bạn chưa thĂŞm bất kỳ liĂŞn káşżt ná»™i bá»™ nĂ o vĂ o ná»™i dung cá»§a bạn hoáş·c Yoast SEO đã khĂ´ng láş­p chỉ mục chĂşng. Bạn cĂł thá» cĂł chỉ mục Yoast SEO liĂŞn káşżt cá»§a mình báş±ng cách chạy tối ưu hĂła dữ liệu SEO theo SEO> CĂ´ng cụ."],"Incoming links":["LiĂŞn káşżt đến."],"Edit to add link":["Chỉnh sá»­a đỠthĂŞm liĂŞn káşżt"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["Bạn hiện khĂ´ng cĂł bĂ i báo nĂ o được đánh dấu lĂ  ná»n tảng. Khi bạn đánh dấu bĂ i viáşżt cá»§a mình lĂ  ná»n tảng, chĂşng sáş˝ hiá»n thị ở đây."],"Focus keyphrase":["BĂ n phĂ­m táş­p trung"],"Article":["BĂ i viáşżt"],"Readability score":["Äiá»m đọc"],"SEO score":["Äiá»m SEO"],"Copy failed":["Sao chĂ©p thất bại"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Cải thiện thứ hạng cho tất cả các ná»n tảng cá»§a bạn báş±ng cách sá»­ dụng bĂ i táş­p %1$s từng bước nĂ y!%2$s"],"Rank with articles you want to rank with":["Xáşżp hạng vá»›i các bĂ i viáşżt bạn muốn xáşżp hạng vá»›i"],"Descriptive text":["Äoạn vÄn mĂ´ tả"],"Show the descriptive text":["Hiá»n thị Ä‘oạn vÄn mĂ´ tả"],"Show icon":["Hiá»n thị icon"],"Yoast Estimated Reading Time":["Thời gian đọc do Yoast ước tĂ­nh"],"Shows an estimated reading time based on the content length.":["Hiá»n thị thời gian đọc ước lượng dá»±a trĂŞn độ dĂ i ná»™i dung."],"reading time":["thời gian đọc"],"content length":["độ dĂ i ná»™i dung"],"Estimated reading time:":["Thời gian đọc ướng tĂ­nh:"],"minute":["phĂşt"],"Settings":["Thiáşżt đặt"],"OK":["OK"],"Close":["ÄĂłng"],"Type":["Loại"],"Orphaned content":["Ná»™i dung đơn láş»"],"Synonyms":["Từ đồng nghÄ©a"],"Internal linking suggestions":["Äá» xuất liĂŞn káşżt ná»™i bá»™"],"Enter a related keyphrase to calculate the SEO score":["Nháş­p cụm từ khĂła cĂł liĂŞn quan đỠtĂ­nh Ä‘iá»m SEO"],"Related keyphrase":["Cụm từ khĂła cĂł liĂŞn quan"],"Add related keyphrase":["ThĂŞm cụm từ khĂła liĂŞn quan"],"Analysis results":["Káşżt quả phân tĂ­ch"],"Help on choosing the perfect keyphrase":["Trợ giĂşp vá» cách chọn cụm từ khĂła hoĂ n hảo"],"Help on keyphrase synonyms":["Trợ giĂşp cụm từ khĂła đồng nghÄ©a"],"Keyphrase":["Cụm từ khĂła"],"New URL: {{link}}%s{{/link}}":["Äường dáş«n má»›i: {{link}}%s{{/link}}"],"Undo":["khĂ´i phục"],"Redirect created":["Äường dáş«n đã được tạo"],"%s just created a redirect from the old URL to the new URL.":["%s vừa tạo ra má»™t chuyá»n hướng từ URL cĹ© đến URL má»›i"],"Old URL: {{link}}%s{{/link}}":["Äường dáş«n cĹ©: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Từ khĂła tương đương"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Xem trước chia sáş» trĂŞn Twitter"],"Adds a list of internal links to sibling pages which share the same parent.":["ThĂŞm má»™t danh sách liĂŞn káşżt ná»™i bá»™ vĂ o các trang lân cáş­n cĂł cĂąng thư mục gốc."],"siblings":["lân cáş­n"],"sibling pages":["các trang lân cáş­n"],"Adds a list of internal links to subpages of this page.":["ThĂŞm má»™t danh sách liĂŞn káşżt ná»™i bá»™ vĂ o các trang phụ cá»§a trang nĂ y."],"seo":["seo"],"subpages":["các trang phụ"],"childpages":["các trang con"],"children":["con"],"internal linking":["liĂŞn káşżt ná»™i bá»™"],"site structure":["cấu trĂşc trang"],"We could not find any relevant articles on your website that you could link to from your post.":["ChĂşng tĂ´i khĂ´ng thá» tìm thấy bất cứ chuyĂŞn mục thĂ­ch hợp nĂ o trĂŞn website đỠbạn cĂł thá» liĂŞn káşżt từ bĂ i viáşżt cá»§a bạn."],"Load suggestions":["Tải gợi Ă˝"],"Refresh suggestions":["LĂ m má»›i các gợi Ă˝"],"Write list…":["Viáşżt danh sách..."],"Adds a list of links related to this page.":["ThĂŞm danh sách những liĂŞn káşżt liĂŞn quan đến trang nĂ y."],"related posts":["bĂ i viáşżt liĂŞn quan"],"related pages":["trang liĂŞn quan"],"Adds a table of contents to this page.":["ThĂŞm mục lục vĂ o trang nĂ y"],"links":["liĂŞn káşżt"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link tá»›i chuyĂŞn mục được đỠxuất: %s"],"Add a title to your post for the best internal linking suggestions.":["ThĂŞm má»™t tiĂŞu đỠcho bĂ i viáşżt dĂ nh cho đỠxuất liĂŞn káşżt liĂŞn quan tốt nhất."],"Add a metadescription to your post for the best internal linking suggestions.":["ThĂŞm má»™t mĂ´ tả meta cho bĂ i viáşżt cá»§a bạn dĂ nh cho đỠxuất liĂŞn káşżt liĂŞn quan tốt nhất."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["ThĂŞm má»™t tiĂŞu đỠvĂ  mĂ´ tả meta cho bĂ i viáşżt cá»§a bạn dĂ nh cho đỠxuất liĂŞn káşżt liĂŞn quan tốt nhất."],"Also, add a title to your post for the best internal linking suggestions.":["Äồng thời, thĂŞm tiĂŞu đỠvĂ o bĂ i viáşżt cá»§a bạn đỠcĂł các gợi Ă˝ liĂŞn káşżt ná»™i bá»™ tốt nhất."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Äồng thời, thĂŞm má»™t mĂ´ tả meta vĂ o bĂ i viáşżt cá»§a bạn dĂ nh cho các gợi Ă˝ liĂŞn káşżt ná»™i bá»™ tốt nhất."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Äồng thời, thĂŞm má»™t tiĂŞu đỠvĂ  mĂ´ tả meta vĂ o bĂ i viáşżt cá»§a bạn dĂ nh cho các gợi Ă˝ liĂŞn káşżt ná»™i bá»™ tốt nhất."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Má»™t khi bạn thĂŞm má»™t lượng copy, chĂşng tĂ´i sáş˝ dĂ nh cho bạn má»™t danh sách ná»™i dung liĂŞn quan tại đây đỠbạn cĂł thá» liĂŞn káşżt vĂ o bĂ i viáşżt."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["Äá» cải thiện cấu trĂşc website, cân nhắc liĂŞn káşżt đến các bĂ i viáşżt hoáş·c trang liĂŞn quan khác trĂŞn website cá»§a bạn."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["Mất vĂ i giây đỠhiá»n thị cho bạn má»™t danh sách ná»™i dung liĂŞn quan đến những gì bạn cĂł thá» liĂŞn káşżt. Những đỠxuất sáş˝ được hiá»n thị tại đây ngay khi chĂşng tĂ´i cĂł."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{a}}Äọc hướng dáş«n vá» liĂŞn káşżt ná»™i bá»™ dĂ nh cho SEO{{/a}} đỠtìm hiá»u thĂŞm."],"Copied!":["ÄĂŁ copy!"],"Not supported!":["KhĂ´ng được há»— trợ!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["CĂł phải bạn Ä‘ang cố sá»­ dụng nhiá»u cụm từ khĂła liĂŞn quan? Bạn nĂŞn thĂŞm chĂşng riĂŞng biệt."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Cụm từ khĂła cá»§a bạn quá dĂ i. Chỉ nĂŞn giá»›i hạn tối Ä‘a 191 kĂ˝ tá»±."],"Add as related keyphrase":["ThĂŞm như cụm từ liĂŞn quan"],"Added!":["ÄĂŁ thĂŞm!"],"Remove":["Gỡ bỏ"],"Table of contents":["Bảng ná»™i dung"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["ChĂşng tĂ´i cáş§n tối ưu hĂła dữ liệu SEO cá»§a trang web cá»§a bạn đỠcĂł thá» cung cấp cho bạn các %1$s đỠxuất liĂŞn káşżt %2$s tốt nhất. %3$s Bắt đầu tối ưu hĂła dữ liệu SEO %4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-zh_CN.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-zh_CN.json deleted file mode 100644 index 6b9ef57a..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-zh_CN.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=1; plural=0;","lang":"zh_CN"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":["ĺ…许"],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["ďĽĺś¨ć–°çš„浏č§ĺ™¨é€‰éˇąĺŤˇä¸­ć‰“开)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":["ĺ©ç”¨ç”źć式人工智č˝ĺŠ ĺż«ĺ·Ąä˝śćµç¨‹ă€‚为您的ćśç´˘ĺ’Śç¤ľäş¤ĺ¤–观获取é«č´¨é‡Źçš„ć ‡é˘ĺ’ŚćŹŹčż°ĺ»şč®®ă€‚%1$s了解更多%2$s%3$s"],"Generate titles & descriptions with Yoast AI!":["使用 Yoast AI 生ćć ‡é˘ĺ’ŚćŹŹčż°ďĽ"],"New to %1$s":["新加入 %1$s"],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter预č§"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["重试"],"Social preview":[],"Desktop result":["桌面结果"],"Mobile result":["移动结果"],"Apply AI description":[],"Apply AI title":[],"Next":["下页"],"Previous":["上页"],"Generate 5 more":[],"Google preview":["谷歌预č§"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":["出了些问é˘"],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":["使用人工智č˝"],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$s关关键词短语ĺ†ĺŹ‘%3$s:%2$s在文本中包ĺ«ć‚¨çš„关关键词短语ć–ĺ…¶ĺŚäą‰čŻŤďĽŚä»Ąäľżć‘们检查关关键词短语ĺ†ĺŹ‘%3$s。"],"%1$sKeyphrase distribution%2$s: Good job!":["%1$s关关键词短语ĺ†ĺŹ‘%2$s:ĺľĺĄ˝ďĽ"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$s关关键词短语ĺ†ĺ¸%3$s:非常不均匀。文本的大é¨ĺ†ä¸ŤĺŚ…ĺ«ĺ…łĺ…łé”®čŻŤć–ĺ…¶ĺŚäą‰čŻŤă€‚%2$s更均匀地ĺ†é…Ťĺ®ä»¬%3$s。"],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$s关关键词短语ĺ†ĺ¸%3$s:非常不均匀。文本的大é¨ĺ†ä¸ŤĺŚ…ĺ«ĺ…łĺ…łé”®čŻŤć–ĺ…¶ĺŚäą‰čŻŤă€‚%2$s更均匀地ĺ†é…Ťĺ®ä»¬%3$s。"],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["选择图ĺŹ"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["ć ‡é˘%d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[],"Schema":["Schemaćž¶ćž„"],"Meta tags":["Meta tags"],"Not available":["不可用"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["äĽč‰Ż"],"No index":["无索引"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["请注意:č¦ä˝żć­¤é”»ç‚Ľć­Łĺ¸¸ĺ·Ąä˝śďĽŚć‚¨éś€č¦čżčˇŚSEO数据äĽĺŚ–ĺ·Ąĺ…·ă€‚ç®ˇç†ĺ‘可以在%1$sSEO >ĺ·Ąĺ…·%2$s下čżčˇŚć­¤ç¨‹ĺşŹă€‚"],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["您已经添加了指ĺ‘孤立文章的链接,并且已经清ç†äş†ä¸Ťĺ†Ťç›¸ĺ…łçš„文章。干得好ďĽçś‹çś‹ä¸‹éť˘çš„ć‘č¦ďĽŚĺş†çĄťä˝ ĺŹ–ĺľ—çš„ćĺ°±ďĽ"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["严格检查此ĺ—表中的内容并进行必č¦çš„更新。如果您需č¦ć›´ć–°ĺ¸®ĺŠ©ďĽŚć‘们有一个非常%1$s有用的博客文章,可以指导您一路走来%2$sďĽĺŤ•击以在新选项卡中打开)。"],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$s需č¦ć›´ĺ¤šćŚ‡ĺŻĽďĽźć‘们在以下指南中更详细地介绍了每个步骤:%2$s如何使用%7$s孤立内容锻炼%3$s%4$s%5$s。%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["您只ćŻä˝żćś€ĺĄ˝çš„内容ć“于查找,并且更有可č˝ćŽ’ĺŤďĽĺĄ˝ďĽä¸Ťć—¶ĺś°ďĽŚč®°ĺľ—检查你的基石ćŻĺ¦ćś‰č¶łĺ¤źçš„链接ďĽ"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["看看下面的ĺ—表。你的基石ďĽć ‡ćś‰%1$s)ćŻĺ¦ĺ…·ćś‰ćڇĺ‘ĺ®ä»¬çš„大多数内é¨é“ľćŽĄďĽźĺ¦‚ćžść‚¨č®¤ä¸şĺźşçźłéś€č¦ć›´ĺ¤šé“ľćŽĄďĽŚčŻ·ĺŤ•ĺ‡»\"äĽĺŚ–\"按钮。这将把文章移ĺ°ä¸‹ä¸€ć­Ąă€‚"],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["你所有的基石é˝ćś‰ç»żč‰˛çš„ĺ­ĺĽąĺ—?为了获得最佳ć•果,请č€č™‘编辑那些没有ć•ćžśçš„ďĽ"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["您希望哪些文章的排ĺŤćś€é«ďĽźć‚¨çš„受众会发现哪些最有用和最完整?单击ĺ‘下箭头,然ĺŽćźĄć‰ľç¬¦ĺ这些条件的文章。ć‘们会自动将您从ĺ—表中选择的文章标记为基石。"],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$s需č¦ć›´ĺ¤šćŚ‡ĺŻĽďĽźć‘们在以下方面更详细地介绍了每个步骤:%2$s如何使用%7$s基石锻炼%3$s%4$s%5$s。%6$s"],"Yoast Subpages":["Yoast ĺ­éˇµéť˘"],"Yoast Siblings":["Yoast ĺŚçş§"],"Yoast Table of Contents":["Yoast 目录"],"Yoast Related Links":["Yoast相关链接"],"Finish optimizing":["完ćäĽĺŚ–"],"You've finished adding links to this article.":["您已完ćĺ‘本文添加链接。"],"Optimize":["äĽĺŚ–"],"Added to next step":["已添加ĺ°ä¸‹ä¸€ć­Ą"],"Choose cornerstone articles...":["选择基石文章..."],"Loading data...":["正在获取数据..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["您尚未使用此锻炼清ç†ć–更新任何文章。完ćĺŽďĽŚć‚¨çš„工作ć‘č¦ĺ°†ćľç¤şĺś¨ć­¤ĺ¤„。"],"Skipped":["跳过"],"Hidden from search engines.":["对ćśç´˘ĺĽ•擎éšč—Źă€‚"],"Removed":["已移除"],"Improved":["改善"],"Resolution":["ĺ†čľ¨çއ"],"Loading redirect options...":["正在加载重定ĺ‘选项..."],"Remove and redirect":["ĺ é™¤ĺ’Śé‡Ťĺ®šĺ‘"],"Custom url:":["自定义URL"],"Related article:":["相关文章:"],"Home page:":["主页"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["您将č¦ĺ é™¤%1$s%2$s%3$s。č¦é˛ć­˘ć‚¨ç˝‘站上出现 404,您应将其重定ĺ‘ĺ°ć‚¨ç˝‘站上的其他网页。您ćłĺ°†ĺ…¶é‡Ťĺ®šĺ‘ĺ°ĺ“Şé‡ŚďĽź"],"SEO Workout: Remove article":["SEO 锻炼:ĺ é™¤ć–‡ç« "],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["一ĺ‡çś‹čµ·ćťĄé˝ĺľĺĄ˝ďĽć‘们在您的网站上没有发现任何超过六个ćśä¸”在您的网站上收ĺ°çš„链接太少的文章。稍ĺŽĺ†Ťčż”回此处查看新的清ç†ĺ»şč®®ďĽ"],"Hide from search engines":["从ćśç´˘ĺĽ•擎中éšč—Ź"],"Improve":["改善"],"Are you sure you wish to hide this article from search engines?":["您确定č¦ĺŻąćśç´˘ĺĽ•擎éšč—Źć­¤ć–‡ç« ĺ—?"],"Action":["ĺŻĺЍ"],"You've hidden this article from search engines.":["您已从ćśç´˘ĺĽ•擎中éšč—Źäş†čż™çŻ‡ć–‡ç« ă€‚"],"You've removed this article.":["您已ĺ é™¤ć­¤ć–‡ç« ă€‚"],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["您当前尚未选择č¦ć”ąčż›çš„任何文章。在前面的步骤中选择一些文章以添加链接,ć‘们将在此处ĺ‘您展示链接建议。"],"Loading link suggestions...":["正在加载链接建议..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["ć‘们没有找ĺ°ćś‰ĺ…łćś¬ć–‡çš„任何建议,但当然您仍然可以添加指ĺ‘您认为相关的文章的链接。"],"Skip":["跳过"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["您尚未为此步骤选择任何文章。您可以在上一步中执行此操作。"],"Is it up-to-date?":["ĺ®ćŻćś€ć–°çš„ĺ—?"],"Last Updated":["上次更新"],"You've moved this article to the next step.":["您已将本文移至下一步。"],"Unknown":["未知"],"Clear summary":["清晰的ć‘č¦"],"Add internal links towards your orphaned articles.":["添加指ĺ‘孤立文章的内é¨é“ľćŽĄă€‚"],"Should you update your article?":["你应该更新你的文章ĺ—?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["您的网站可č˝ĺŚ…ĺ«č®¸ĺ¤šć‚¨ć›ľç»Źĺ›ĺ»şčż‡çš„内容,并且从那以ĺŽĺ†Ťäąźć˛ˇćś‰ĺ›žĺ¤´çś‹čż‡ă€‚请务必浏č§čż™äş›éˇµéť˘ĺą¶čŻ˘é—®č‡Şĺ·±čŻĄĺ†…ĺ®ąćŻĺ¦ä»Ťä¸Žć‚¨çš„网站相关。你应该改进ĺ®čżćŻĺ é™¤ĺ®ďĽź"],"Start: Love it or leave it?":["开始:ç±ĺ®čżćŻç¦»ĺĽ€ĺ®ďĽź"],"Clean up your unlinked content to make sure people can find it":["清ç†ćśŞĺ…łč”的内容,确保用ć·č˝ĺ¤źć‰ľĺ°ĺ®"],"I've finished this workout":["ć‘已完ć此锻炼"],"Reset this workout":["重置此体č˝č®­ç»"],"Well done!":["ĺšĺľ—好ďĽ"],"Add internal links towards your cornerstones":["添加指ĺ‘基石的内é¨é“ľćŽĄ"],"Check the number of incoming internal links of your cornerstones":["检查基石的传入内é¨é“ľćŽĄçš„ć•°é‡Ź"],"Start: Choose your cornerstones!":["开始:选择你的基石ďĽ"],"The cornerstone approach":["ĺźşçźłć–ąćł•"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["请注意:为了使此锻炼正常工作并为您ćŹäľ›é“ľćŽĄĺ»şč®®ďĽŚć‚¨éś€č¦čżčˇŚSEO数据äĽĺŚ–ĺ·Ąĺ…·ă€‚ç®ˇç†ĺ‘可以在%1$sSEO >ĺ·Ąĺ…·%2$s下čżčˇŚć­¤ç¨‹ĺşŹă€‚"],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["ć‘已完ć此步骤"],"Revise this step":["修改此步骤"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["ć‘们无法在您的网页上找ĺ°ĺ†…é¨é“ľćŽĄă€‚č¦äąć‚¨ĺ°šćśŞĺ‘内容添加任何内é¨é“ľćŽĄďĽŚč¦äąYoast SEO尚未将ĺ®ä»¬çĽ–入索引。您可以通过在SEO>工具下čżčˇŚSEO数据äĽĺŚ–ćťĄč®©Yoast SEO索引您的链接。"],"Incoming links":["传入链接"],"Edit to add link":["编辑以添加链接"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["您当前没有标记为基石的文章。当您将文章标记为基石时,ĺ®ä»¬ĺ°†ćľç¤şĺś¨ć­¤ĺ¤„。"],"Focus keyphrase":["焦点关键词"],"Article":["文章"],"Readability score":["可读性ĺ†ć•°"],"SEO score":["SEOĺ†ć•°"],"Copy failed":["复ĺ¶ĺ¤±č´Ą"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["通过使用这个%1$sé€ć­Ąé”»ç‚ĽćťĄćŹé«ć‰€ćś‰ĺźşçźłçš„排ĺŤďĽ%2$s"],"Rank with articles you want to rank with":["与您ćłč¦ćŽ’ĺŤçš„文章排ĺŤ"],"Descriptive text":["描述性文本"],"Show the descriptive text":["ćľç¤şćŹŹčż°ć€§ć–‡ćś¬"],"Show icon":["ćľç¤şĺ›ľć ‡"],"Yoast Estimated Reading Time":["Yoast 估计é…读时间"],"Shows an estimated reading time based on the content length.":["ćľç¤şĺźşäşŽĺ†…容长度的估计é…读时间。"],"reading time":["é…读时间"],"content length":["内容长度"],"Estimated reading time:":["预计é…读时间:"],"minute":["ĺ†é’ź"],"Settings":["设置"],"OK":["好"],"Close":["ĺ…łé—­"],"Type":["类型"],"Orphaned content":["孤立内容"],"Synonyms":["ĺŚäą‰čŻŤ"],"Internal linking suggestions":["内é¨é“ľćŽĄĺ»şč®®"],"Enter a related keyphrase to calculate the SEO score":["输入相关关键短语以计算SEOĺ†ć•°"],"Related keyphrase":["添加相关短语"],"Add related keyphrase":["添加相关短语"],"Analysis results":["ĺ†ćžç»“ćžś"],"Help on choosing the perfect keyphrase":["帮助选择完美的关键短语"],"Help on keyphrase synonyms":["关键字段ĺŚäą‰čŻŤĺ¸®ĺŠ©"],"Keyphrase":["关键词"],"New URL: {{link}}%s{{/link}}":["新链接:{{link}}%s{{/link}}"],"Undo":["撤销"],"Redirect created":["重定ĺ‘已生ć"],"%s just created a redirect from the old URL to the new URL.":["%s 生ć一个从旧链接指ĺ‘新链接的重定ĺ‘"],"Old URL: {{link}}%s{{/link}}":["旧链接:{{link}}%s{{/link}}"],"Keyphrase synonyms":["关键词及ĺŚäą‰čŻŤ"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["推特ĺ†äş«é˘„č§"],"Adds a list of internal links to sibling pages which share the same parent.":["添加内链ĺ—表ĺ°ćś‰ĺŚć ·ç¶éˇµéť˘çš„ĺŚçş§éˇµéť˘ä¸­"],"siblings":["ĺŚçş§çš„"],"sibling pages":["ĺŚçş§éˇµéť˘"],"Adds a list of internal links to subpages of this page.":["添加内链ĺ—表ĺ°ć­¤éˇµéť˘çš„ĺ­éˇµéť˘ä¸­ă€‚"],"seo":["seo"],"subpages":["ĺ­éˇµéť˘"],"childpages":["ĺ­éˇµéť˘"],"children":["儿童"],"internal linking":["内链"],"site structure":["网站结构"],"We could not find any relevant articles on your website that you could link to from your post.":["ć‘们无法在您的网站上找ĺ°ĺŹŻä»Ąä»Žć‚¨çš„ć–‡ç« é“ľćŽĄĺ°çš„任何相关文章。"],"Load suggestions":["加载建议"],"Refresh suggestions":["ĺ·ć–°ĺ»şč®®"],"Write list…":["写入ĺ—表……"],"Adds a list of links related to this page.":["添加此页面的有关链接ĺ—表"],"related posts":["相关文章"],"related pages":["相关页面"],"Adds a table of contents to this page.":["添加内容ĺ°ć­¤éˇµéť˘"],"links":["链接"],"toc":["当有许多文章ă€éˇµéť˘ă€ĺ®šĺ¶ĺŚ–ć–‡ç« ç±»ĺž‹ć–ĺ†ç±»ć—¶ďĽŚĺŻĽĺ‡şć•°ćŤ®äĽščŠ±č´ąĺľé•żć—¶é—´"],"Copy link":["复ĺ¶é“ľćŽĄ"],"Copy link to suggested article: %s":["将链接复ĺ¶ĺ°ĺ»şč®®ć–‡ç« ďĽš%s"],"Add a title to your post for the best internal linking suggestions.":["添加个标é˘ĺ°ä˝ çš„文章以获得最好的内链建议"],"Add a metadescription to your post for the best internal linking suggestions.":["添加一个描述标签ĺ°ä˝ çš„文章以获得最好的内链建议"],"Add a title and a metadescription to your post for the best internal linking suggestions.":["给你的文章添加一个标é˘ĺ’Ść ‡ç­ľćŹŹčż°ä»ĄčŽ·ĺľ—ćś€ĺĄ˝çš„ĺ†…é“ľĺ»şč®®"],"Also, add a title to your post for the best internal linking suggestions.":["ĺŚć ·çš„,为你的文章添加一个标é˘ä»ĄčŽ·ĺľ—ĺľ—ćś€ĺĄ˝çš„ĺ†…é“ľĺ»şč®®ă€‚"],"Also, add a metadescription to your post for the best internal linking suggestions.":["ĺŚć ·çš„,给你的文章添加一个标签描述以获得最好的内链建议。"],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["ĺŚć ·çš„,给你的文章添加一个标é˘ĺ’Ść ‡ç­ľćŹŹčż°ä»ĄčŽ·ĺľ—ćś€ĺĄ˝çš„ĺ†…é“ľĺ»şč®®ă€‚"],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["一旦你再增加一点副本,ć‘们会给你一份相关内容的ĺ—表,你可以在这里链接ĺ°ä˝ çš„帖ĺ­ă€‚"],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["č¦ć”ąĺ–„您的网站结构,请č€č™‘链接ĺ°ć‚¨ç˝‘站上的其他相关帖ĺ­ć–页面。"],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["只需几秒钟即可ĺ‘您ćľç¤şĺŹŻä»Ąé“ľćŽĄĺ°çš„相关内容的ĺ—表。建议一旦ć‘们收ĺ°ďĽŚĺ°±äĽšĺś¨čż™é‡Śćľç¤şă€‚"],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}é…读ć‘们的SEO内链指南{{/a}} 来了解更多。"],"Copied!":["已复ĺ¶ďĽ"],"Not supported!":["获取帮助ďĽ"],"Are you trying to use multiple related keyphrases? You should add them separately.":["您ćŻĺ¦ć­Łĺś¨ĺ°ťčŻ•ä˝żç”¨ĺ¤šä¸Şç›¸ĺ…łçš„ĺ…łé”®çź­čŻ­ďĽźć‚¨ĺş”čŻĄĺŤ•ç‹¬ć·»ĺŠ ĺ®ä»¬ă€‚"],"Your keyphrase is too long. It can be a maximum of 191 characters.":["您的关键词太长。最多可以包ĺ«191个字符。"],"Add as related keyphrase":["添加为相关关键短语"],"Added!":["已添加ďĽ"],"Remove":["移除"],"Table of contents":["内容"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["ć‘们需č¦äĽĺŚ–ć‚¨ç˝‘ç«™çš„SEO数据,以便为您ćŹäľ›ćś€ä˝ł%1$s链接建议%2$s。\n\n%3$s开始 SEO 数据äĽĺŚ–%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-zh_TW.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-zh_TW.json deleted file mode 100644 index 7200aea7..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs-zh_TW.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium","plural-forms":"nplurals=1; plural=0;","lang":"zh_TW"},"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[],"Social share preview":[],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[],"You've reached the Yoast AI rate limit.":[],"Allow":[],"Deny":[],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[],"Text generated by AI may be offensive or inaccurate.":[],"(Opens in a new browser tab)":["(Opens in a new browser tab)"],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[],"Generate titles & descriptions with Yoast AI!":[],"New to %1$s":[],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[],"Start generating":[],"Yes, revoke consent":[],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[],"Something went wrong, please try again later.":[],"Revoke AI consent":[],"Please enter a focus keyphrase first to use AI.":[],"AI title generator":[],"AI description generator":[],"AI Twitter title generator":[],"AI Twitter description generator":[],"AI social title generator":[],"AI social description generator":[],"Twitter preview":["Twitter preview"],"Dismiss":["Dismiss"],"Don’t show again":[],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[],"Try again":["Try again"],"Social preview":[],"Desktop result":["Desktop result"],"Mobile result":["Mobile result"],"Apply AI description":[],"Apply AI title":[],"Next":["Next"],"Previous":["Previous"],"Generate 5 more":[],"Google preview":["Google preview"],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[],"Refresh page":[],"Not enough content":[],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[],"Something went wrong":[],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[],"Connection timeout":[],"Use AI":[],"Close modal":[],"Learn more about AI (Opens in a new browser tab)":[],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[],"%1$sTitle%2$s: Your page has a title. Well done!":[],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sKeyphrase distribution%2$s: Good job!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s."],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":["%1$s: You are not using too many complex words, which makes your text easy to read. Good job!"],"Word complexity":["Word complexity"],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":["%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":[],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":[],"Select image":["Select image"],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":["You might not even know it, but there may be pages on your site that do not get any links. That is an SEO issue because it is difficult for search engines to find pages that don't get any links. It is harder for them to rank. We call these pages orphaned content. In this workout, we will find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!"],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":["Time to add some links! Below, you will see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link. When adding the link, make sure to insert it in a relevant sentence, and related to your orphaned article. Keep adding links to each of the orphaned article's until you are satisfied with the amount of links pointing to them."],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[],"Overall, your text appears to be %1$s%3$s%2$s.":[],"Heading %d":["Heading %d"],"Maximum heading level":[],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":["您已ç¦ç”¨äş†éŹćŽĄĺ»şč­°ĺŠźč˝ďĽŚč€Śç›¸é—śéŹćŽĄéś€č¦ĺ®ć‰Ťč˝ć­Łĺ¸¸ĺ·Ąä˝śă€‚如果您ćłć·»ĺŠ ç›¸é—śéŹćŽĄďĽŚč«‹ĺ‰Ťĺľ€ç¶˛ç«™ĺŠźč˝ĺ•źç”¨éŹćŽĄĺ»şč­°ĺŠźč˝ă€‚"],"Schema":["Schema"],"Meta tags":["Meta tags"],"Not available":["Unavailable"],"Checks":["Checks"],"Focus Keyphrase":["Focus Keyphrase"],"Good":["Good"],"No index":["No index"],"Front-end SEO inspector":["Front-end SEO inspector"],"Focus keyphrase not set":["Focus keyphrase not set"],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":["您已經添加了指ĺ‘孤立文章的éŹćŽĄďĽŚä¸¦ä¸”ĺ·˛ç¶“ć¸…ç†äş†ä¸Ťĺ†Ťç›¸é—śçš„ć–‡ç« ă€‚éťžĺ¸¸ĺĄ˝ďĽ çś‹çś‹ä¸‹éť˘çš„ç¸˝çµďĽŚć…¶çĄťä¸€ä¸‹ä˝ ć‰€ĺŹ–ĺľ—çš„ćĺ°±ďĽ"],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":["Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab)."],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s"],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":["You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!"],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":["Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimise button if you think a cornerstone needs more links. That will move the article to the next step."],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":["你所有的基石é˝ćś‰ç¶ č‰˛ĺś“ç‡ĺ—ŽďĽź 為了獲得最佳ć•果,請č€ć…®ĺ°‡é‚Łäş›ćśŞçŤ˛ĺľ—的再編輯一下ďĽ"],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":["Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone."],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":["%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s"],"Yoast Subpages":["Yoast ĺ­é éť˘"],"Yoast Siblings":["Yoast siblings"],"Yoast Table of Contents":["Yoast 目錄"],"Yoast Related Links":["Yoast 相關éŹćŽĄ"],"Finish optimizing":["最佳化完ć"],"You've finished adding links to this article.":["You've finished adding links to this article."],"Optimize":["最佳化"],"Added to next step":["Added to next step"],"Choose cornerstone articles...":["Choose cornerstone articles..."],"Loading data...":["Loading data..."],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":["You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here."],"Skipped":["č·łéŽ"],"Hidden from search engines.":["ĺľžćśç´˘ĺĽ•擎中隱藏"],"Removed":["移除"],"Improved":["Improved"],"Resolution":["Resolution"],"Loading redirect options...":["Loading redirect options..."],"Remove and redirect":["Remove and redirect"],"Custom url:":["Custom URL:"],"Related article:":["Related article:"],"Home page:":["Homepage:"],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":["You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?"],"SEO Workout: Remove article":["SEO Workout: remove article"],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":["Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!"],"Hide from search engines":["Hide from search engines"],"Improve":["Improve"],"Are you sure you wish to hide this article from search engines?":["Are you sure you wish to hide this article from search engines?"],"Action":["Action"],"You've hidden this article from search engines.":["You've hidden this article from search engines."],"You've removed this article.":["You've removed this article."],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":["You currently haven't selected any articles to improve. Select a few articles in the previous steps to which to add links and we will show you link suggestions here."],"Loading link suggestions...":["Loading link suggestions..."],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":["We didn’t find any suggestions for this article, but, of course, you can still add links to articles that you think are related."],"Skip":["Skip"],"You haven't selected any articles for this step yet. You can do so in the previous step.":["You haven't selected any articles for this step yet. You can do so in the previous step."],"Is it up-to-date?":["Is it up to date?"],"Last Updated":["Last Updated"],"You've moved this article to the next step.":["You've moved this article to the next step."],"Unknown":["Unknown"],"Clear summary":["Clear summary"],"Add internal links towards your orphaned articles.":["Add internal links towards your orphaned articles."],"Should you update your article?":["Should you update your article?"],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":["Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?"],"Start: Love it or leave it?":["Start: love it or leave it?"],"Clean up your unlinked content to make sure people can find it":["Clean up your unlinked content to make sure people can find it"],"I've finished this workout":["I've finished this workout"],"Reset this workout":["Reset this workout"],"Well done!":["Well done!"],"Add internal links towards your cornerstones":["Add internal links towards your cornerstones"],"Check the number of incoming internal links of your cornerstones":["Check the number of incoming internal links of your cornerstones"],"Start: Choose your cornerstones!":["Start: choose your cornerstones!"],"The cornerstone approach":["The cornerstone approach"],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":["Please note: for this workout to work well and to offer you linking suggestions, you need to run the SEO data optimisation tool. Admins can run this under %1$sSEO > Tools%2$s."],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":["Please note: your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, these should be enabled."],"I've finished this step":["I've finished this step"],"Revise this step":["Revise this step"],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":["We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimisation under SEO > Tools."],"Incoming links":["Incoming links"],"Edit to add link":["Edit to add link"],"%s incoming link":[],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":["You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here."],"Focus keyphrase":["Focus keyphrase"],"Article":["Article"],"Readability score":["Readability score"],"SEO score":["SEO score"],"Copy failed":["Copy failed"],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":["Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s"],"Rank with articles you want to rank with":["Rank with articles with which you want to rank"],"Descriptive text":["Descriptive text"],"Show the descriptive text":["Show the descriptive text"],"Show icon":["Show icon"],"Yoast Estimated Reading Time":["Yoast Estimated Reading Time"],"Shows an estimated reading time based on the content length.":["Shows an estimated reading time based on the content length."],"reading time":["reading time"],"content length":["content length"],"Estimated reading time:":["Estimated reading time:"],"minute":["minute"],"Settings":["設定"],"OK":["OK"],"Close":["Close"],"Type":["Type"],"Orphaned content":["Orphaned content"],"Synonyms":[],"Internal linking suggestions":["Internal linking suggestions"],"Enter a related keyphrase to calculate the SEO score":["Enter a related keyphrase in order to calculate the SEO score"],"Related keyphrase":["Related keyphrase"],"Add related keyphrase":["Add related keyphrase"],"Analysis results":["Analysis results"],"Help on choosing the perfect keyphrase":["Help on choosing the perfect keyphrase"],"Help on keyphrase synonyms":["Help on keyphrase synonyms"],"Keyphrase":["Keyphrase"],"New URL: {{link}}%s{{/link}}":["New URL: {{link}}%s{{/link}}"],"Undo":["Undo"],"Redirect created":["Redirect created"],"%s just created a redirect from the old URL to the new URL.":["%s just created a redirect from the old URL to the new URL."],"Old URL: {{link}}%s{{/link}}":["Old URL: {{link}}%s{{/link}}"],"Keyphrase synonyms":["Keyphrase synonyms"],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":["An error occurred: unfortunately our Morphology feature is not working. Please make sure you {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly."],"Twitter share preview":["Twitter share preview"],"Adds a list of internal links to sibling pages which share the same parent.":["Adds a list of internal links to sibling pages which share the same parent."],"siblings":["siblings"],"sibling pages":["sibling pages"],"Adds a list of internal links to subpages of this page.":["Adds a list of internal links to subpages of this page."],"seo":[],"subpages":["subpages"],"childpages":["child pages"],"children":["children"],"internal linking":["internal linking"],"site structure":["site structure"],"We could not find any relevant articles on your website that you could link to from your post.":["We could not find any relevant articles on your website that you could link to from your post."],"Load suggestions":["Load suggestions"],"Refresh suggestions":["Refresh suggestions"],"Write list…":["Write list…"],"Adds a list of links related to this page.":["Adds a list of links related to this page."],"related posts":["related posts"],"related pages":["related pages"],"Adds a table of contents to this page.":["Adds a table of contents to this page."],"links":["links"],"toc":["toc"],"Copy link":["Copy link"],"Copy link to suggested article: %s":["Copy link to suggested article: %s"],"Add a title to your post for the best internal linking suggestions.":["Add a title to your post for the best internal linking suggestions."],"Add a metadescription to your post for the best internal linking suggestions.":["Add a meta description to your post for the best internal linking suggestions."],"Add a title and a metadescription to your post for the best internal linking suggestions.":["Add a title and a meta description to your post for the best internal linking suggestions."],"Also, add a title to your post for the best internal linking suggestions.":["Also, add a title to your post for the best internal linking suggestions."],"Also, add a metadescription to your post for the best internal linking suggestions.":["Also, add a meta description to your post for the best internal linking suggestions."],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":["Also, add a title and a meta description to your post for the best internal linking suggestions."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post."],"To improve your site structure, consider linking to other relevant posts or pages on your website.":["To improve your site structure, consider linking to other relevant posts or pages on your website."],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":["It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them."],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":["{{a}}Read our guide on internal linking for SEO{{/a}} to learn more."],"Copied!":["Copied!"],"Not supported!":["Not supported!"],"Are you trying to use multiple related keyphrases? You should add them separately.":["Are you trying to use multiple related keyphrases? You should add them separately."],"Your keyphrase is too long. It can be a maximum of 191 characters.":["Your keyphrase is too long. It can be a maximum of 191 characters."],"Add as related keyphrase":["Add as related keyphrase"],"Added!":["Added!"],"Remove":["Remove"],"Table of contents":["Table of contents"],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":["We need to optimise your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimisation%4$s"]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs.json b/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs.json deleted file mode 100644 index afe7659a..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/languages/wordpress-seo-premiumjs.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":"wordpress-seo-premium","locale_data":{"wordpress-seo-premium":{"":{"domain":"wordpress-seo-premium"},"Learn more about AI (Opens in a new browser tab)":[""],"Close modal":[""],"Use AI":[""],"Something went wrong":[""],"Please try again later. If the issue persists, please %1$scontact our support team%2$s!":[""],"Not enough content":[""],"You've reached the Yoast AI rate limit.":[""],"To continue using the Yoast AI feature, kindly reduce the frequency of your requests. Our %1$shelp article%2$s provides guidance on effectively planning and pacing your requests for an optimized workflow.":[""],"The AI title generator requires the SEO analysis to be enabled before use. To enable it, please navigate to the %2$sSite features of %1$s%3$s, turn on the SEO analysis, and click 'Save changes'. If the SEO analysis is disabled in your WordPress user profile, access your profile and enable it there. Please contact your administrator if you don't have access to these settings.":[""],"Close":[""],"Refresh page":[""],"To access this feature, you need active %2$s and %3$s subscriptions. Please %5$sactivate your subscriptions in %1$s%6$s or %7$sget a new %4$s%8$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[""],"To access this feature, you need an active %1$s subscription. Please %3$sactivate your subscription in %2$s%4$s or %5$sget a new %1$s subscription%6$s. Afterward, please refresh this page for the feature to function correctly, which may take up to 30 seconds.":[""],"Connection timeout":[""],"It seems that a connection timeout has occurred. Please check your internet connection and try again later. If the issue persists, please %1$scontact our support team%2$s":[""],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate meta descriptions for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[""],"Due to the OpenAI's strict ethical guidelines and %1$susage policies%2$s, we are unable to generate SEO titles for your page. If you intend to use AI, kindly avoid the use of explicit, violent, or sexually explicit content. %3$sRead more on how to configure your page to make sure you get the best results with AI%4$s.":[""],"Google preview":[""],"Generate 5 more":[""],"Previous":[""],"Next":[""],"Apply AI title":[""],"Apply AI description":[""],"Mobile result":[""],"Desktop result":[""],"Social preview":[""],"Try again":[""],"Text generated by AI may be offensive or inaccurate.":[""],"%1$sTip%2$s: Improve the accuracy of your generated AI descriptions by writing more content in your page.":[""],"%1$sTip%2$s: Improve the accuracy of your generated AI titles by writing more content in your page.":[""],"Don’t show again":[""],"Dismiss":[""],"Twitter preview":[""],"AI social description generator":[""],"AI social title generator":[""],"AI Twitter description generator":[""],"AI Twitter title generator":[""],"AI description generator":[""],"AI title generator":[""],"Please enter a focus keyphrase first to use AI.":[""],"Settings":[""],"Descriptive text":[""],"Show the descriptive text":[""],"Show icon":[""],"Estimated reading time:":[""],"Yoast Estimated Reading Time":[""],"Shows an estimated reading time based on the content length.":[""],"seo":[""],"reading time":[""],"content length":[""],"minute":["","minutes"],"We could not find any relevant articles on your website that you could link to from your post.":[""],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":[""],"It takes a few seconds to show you a list of related content to which you could link. The suggestions will be shown here as soon as we have them.":[""],"Load suggestions":[""],"You have disabled Link suggestions, which is needed for Related links to work. If you want to add Related links, please go to Site features and enable Link suggestions.":[""],"Refresh suggestions":[""],"Write list…":[""],"Yoast Related Links":[""],"Adds a list of links related to this page.":[""],"internal linking":[""],"site structure":[""],"related posts":[""],"related pages":[""],"Yoast Table of Contents":[""],"Adds a table of contents to this page.":[""],"links":[""],"toc":[""],"Maximum heading level":[""],"Heading %d":[""],"Table of contents":[""],"Improve rankings for all your cornerstones by using this %1$sstep-by-step workout!%2$s":[""],"Copy link":[""],"Copy link to suggested article: %s":[""],"Add a title to your post for the best internal linking suggestions.":[""],"Add a metadescription to your post for the best internal linking suggestions.":[""],"Add a title and a metadescription to your post for the best internal linking suggestions.":[""],"Also, add a title to your post for the best internal linking suggestions.":[""],"Also, add a metadescription to your post for the best internal linking suggestions.":[""],"Also, add a title and a metadescription to your post for the best internal linking suggestions.":[""],"We need to optimize your site’s SEO data so we can offer you the best %1$slinking suggestions%2$s.\n\n%3$sStart SEO Data optimization%4$s":[""],"To improve your site structure, consider linking to other relevant posts or pages on your website.":[""],"Copied!":[""],"Not supported!":[""],"{{a}}Read our guide on internal linking for SEO{{/a}} to learn more.":[""],"New URL: {{link}}%s{{/link}}":[""],"OK":[""],"Undo":[""],"Redirect created":[""],"%s just created a redirect from the old URL to the new URL.":[""],"Old URL: {{link}}%s{{/link}}":[""],"Help on choosing the perfect keyphrase":[""],"Help on keyphrase synonyms":[""],"Keyphrase":[""],"Synonyms":[""],"Analysis results":[""],"Are you trying to use multiple related keyphrases? You should add them separately.":[""],"Your keyphrase is too long. It can be a maximum of 191 characters.":[""],"Related keyphrase":[""],"Add related keyphrase":[""],"Enter a related keyphrase to calculate the SEO score":[""],"Add as related keyphrase":[""],"Added!":[""],"Remove":[""],"Social share preview":[""],"Twitter share preview":[""],"Yoast Siblings":[""],"Adds a list of internal links to sibling pages which share the same parent.":[""],"siblings":[""],"sibling pages":[""],"Yoast Subpages":[""],"Adds a list of internal links to subpages of this page.":[""],"subpages":[""],"childpages":[""],"children":[""],"Keyphrase synonyms":[""],"Internal linking suggestions":[""],"An error occurred: the Premium SEO analysis isn't working as expected. Please {{activateLink}}activate your subscription in MyYoast{{/activateLink}} and then {{reloadButton}}reload this page{{/reloadButton}} to make it work properly.":[""],"Focus Keyphrase":[""],"Checks":[""],"SEO score":[""],"Readability score":[""],"Not available":[""],"Meta tags":[""],"Schema":[""],"Front-end SEO inspector":[""],"No index":[""],"Focus keyphrase not set":[""],"Good":[""],"Overall, your text appears to be %1$s%3$s%2$s.":[""],"Once you add a bit more copy, we'll be able to tell you the formality level of your text.":[""],"Revoke AI consent":[""],"Something went wrong, please try again later.":[""],"By revoking your consent, you will no longer have access to Yoast AI features. Are you sure you want to revoke your consent?":[""],"Yes, revoke consent":[""],"Start generating":[""],"I approve the %1$sTerms of Service%2$s & %3$sPrivacy Policy%4$s of the Yoast AI service. This includes consenting to the collection and use of data to improve user experience.":[""],"New to %1$s":[""],"Generate titles & descriptions with Yoast AI!":[""],"Speed up your workflow with generative AI. Get high-quality title and description suggestions for your search and social appearance. %1$sLearn more%2$s%3$s":[""],"(Opens in a new browser tab)":[""],"To see this video, you need to allow %1$s to load embedded videos from %2$s.":[""],"Deny":[""],"Allow":[""],"Copy failed":[""],"The cornerstone approach":[""],"Rank with articles you want to rank with":[""],"Some articles on your site are %1$sthe%2$s most important. They answer people's questions and solve their problems. So, they deserve to rank! At %3$s, we call these cornerstone articles. One of the ways to have them rank is to point enough links to them. More links signal to search engines that those articles are important and valuable. In this workout, we'll help you add links to your cornerstone articles!":[""],"%1$sNeed more guidance? We've covered every step in more detail in: %2$sHow to use the %7$s cornerstone workout%3$s%4$s%5$s.%6$s":[""],"Start: Choose your cornerstones!":[""],"Which articles do you want to rank the highest? Which ones would your audience find the most useful and complete? Click the downward pointing arrow and look for articles that fit those criteria. We'll automatically mark the articles you select from the list as cornerstone.":[""],"Do all of your cornerstones have green bullets? For the best results, consider editing the ones that don't!":[""],"Check the number of incoming internal links of your cornerstones":[""],"Take a look at the list below. Do your cornerstones (marked with %1$s) have the most internal links pointing towards them? Click the Optimize button if you think a cornerstone needs more links. That will move the article to the next step.":[""],"Add internal links towards your cornerstones":[""],"Time to add some links! Below, you see a list with your cornerstones. Under each cornerstone, there are suggestions for articles you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your cornerstone article. Keep adding links from as many related articles as you need, until your cornerstones have the most internal links pointing towards them.":[""],"Well done!":[""],"You just made your best content easy to find, and more likely to rank! Way to go! From time to time, remember to check if your cornerstones are getting enough links!":[""],"Reset this workout":[""],"I've finished this workout":[""],"Please note: Your admin has disabled the cornerstone functionality in the SEO settings. If you want to use this workout, it should be enabled.":[""],"Article":[""],"Focus keyphrase":[""],"Choose cornerstone articles...":[""],"Loading data...":[""],"You currently have no articles marked as cornerstone. When you mark your articles as cornerstone, they will show up here.":[""],"Added to next step":[""],"Optimize":[""],"We were unable to find internal links on your pages. Either you haven't added any internal links to your content yet, or Yoast SEO didn't index them. You can have Yoast SEO index your links by running the SEO data optimization under SEO > Tools.":[""],"Incoming links":[""],"Type":[""],"Action":[""],"Revise this step":[""],"I've finished this step":[""],"You've finished adding links to this article.":[""],"Finish optimizing":[""],"Skip":[""],"%s incoming link":["","%s incoming links"],"You currently haven't selected any articles to improve. Select a few articles in the previous steps to add links to and we will show you link suggestions here.":[""],"Edit to add link":[""],"Loading link suggestions...":[""],"We didn’t find any suggestions for this article, but of course you can still add links to articles that you think are related.":[""],"%1$sNeed more guidance? We've covered every step in more detail in the following guide: %2$sHow to use the %7$s orphaned content workout%3$s%4$s%5$s.%6$s":[""],"Start: Love it or leave it?":[""],"Your site may contain lots of content that you created once and never looked back to it since. It's important to go through those pages and ask yourself if that content is still relevant to your site. Should you improve it or remove it?":[""],"Should you update your article?":[""],"Critically examine the content in this list and make the necessary updates. If you need help updating, we have a very %1$suseful blog post that can guide you all the way%2$s (click to open in a new tab).":[""],"Add internal links towards your orphaned articles.":[""],"Time to add some links! Below, you see a list with your orphaned articles. Under each one, there are suggestions for related pages you could add a link from. When adding the link, make sure to insert it in a relevant sentence related to your orphaned article. Keep adding links to each of the orphaned articles until you are satisfied with the amount of links pointing to them.":[""],"You've added links to your orphaned articles, and you’ve cleaned up the ones that were no longer relevant. Great job! Take a look at the summary below and celebrate what you accomplished!":[""],"Clear summary":[""],"Orphaned content":[""],"Clean up your unlinked content to make sure people can find it":[""],"You might not even know it, but there may be pages on your site that don't get any links. That’s an SEO issue, because it’s difficult for search engines to find pages that don't get any links. So, it's harder for them to rank. We call these pages orphaned content. In this workout, we find the orphaned content on your site and guide you in quickly adding links to it, so it can get a chance to rank!":[""],"Last Updated":[""],"Is it up-to-date?":[""],"You haven't selected any articles for this step yet. You can do so in the previous step.":[""],"Unknown":[""],"You've moved this article to the next step.":[""],"Are you sure you wish to hide this article from search engines?":[""],"Improve":[""],"Hide from search engines":[""],"Everything's looking good! We haven't found any articles on your site that are older than six months and receive too few links on your site. Check back here later for new cleanup suggestions!":[""],"You've removed this article.":[""],"You've hidden this article from search engines.":[""],"You are about to remove %1$s%2$s%3$s. To prevent 404s on your site, you should redirect it to another page on your site. Where would you like to redirect it?":[""],"Home page:":[""],"Related article:":[""],"Custom url:":[""],"Remove and redirect":[""],"Loading redirect options...":[""],"SEO Workout: Remove article":[""],"You haven't cleaned up or updated any articles yet using this workout. Once you do, a summary of your work will show up here.":[""],"Resolution":[""],"Improved":[""],"Removed":[""],"Hidden from search engines.":[""],"Skipped":[""],"Please note: For this workout to work well, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":[""],"Please note: For this workout to work well and to offer you linking suggestions, you need to run the SEO data optimization tool. Admins can run this under %1$sSEO > Tools%2$s.":[""],"Select image":[""],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.":["","%1$sAlignment%3$s: There are %4$s long sections of center-aligned text. %2$sWe recommend making them right-aligned%3$s."],"%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s.":["","%1$sAlignment%3$s: There are %4$s long sections of center-aligned text. %2$sWe recommend making them left-aligned%3$s."],"%1$s: %2$s of the words in your text are considered complex. %3$sTry to use shorter and more familiar words to improve readability%4$s.":[""],"Word complexity":[""],"%1$s: You are not using too many complex words, which makes your text easy to read. Good job!":[""],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":[""],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":[""],"%1$sKeyphrase distribution%2$s: Good job!":[""],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":[""],"%1$sTitle%2$s: Your page has a title. Well done!":[""],"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!":[""]}}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo-premium/license.txt b/wp/wp-content/plugins/wordpress-seo-premium/license.txt deleted file mode 100644 index 0ae0def1..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/license.txt +++ /dev/null @@ -1,642 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 18. Additional terms - - In the light of Article 7 of the GPL license, the following additional -terms apply: - - a) You are prohibited to make misrepresentations of the origin of that -material, or to require that modified versions of such material be marked -in reasonable ways as different from the original version; - - b) You are limited in the use for publicity purposes of names of -licensors or authors of the material; - - c) You are declined any grant of rights under trademark law for use of -the trade names, trademarks, or service marks of YOAST B.V.; - - d) You are required to indemnify licensors and authors of that material -by anyone who conveys the material (or modified versions of it) with -contractual assumptions of liability to the recipient, for any liability -that these contractual assumptions directly impose on those licensors and -authors. - -END OF TERMS AND CONDITIONS diff --git a/wp/wp-content/plugins/wordpress-seo-premium/premium.php b/wp/wp-content/plugins/wordpress-seo-premium/premium.php deleted file mode 100644 index b96247fe..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/premium.php +++ /dev/null @@ -1,426 +0,0 @@ -install_yoast_seo_from_repository(); - - // Load the Redirect File Manager. - require_once WPSEO_PREMIUM_PATH . 'classes/redirect/redirect-file-util.php'; - - // Create the upload directory. - WPSEO_Redirect_File_Util::create_upload_dir(); - - // Enable tracking. - if ( class_exists( WPSEO_Options::class ) ) { - WPSEO_Premium_Option::register_option(); - if ( WPSEO_Options::get( 'toggled_tracking' ) !== true ) { - WPSEO_Options::set( 'tracking', true ); - } - WPSEO_Options::set( 'should_redirect_after_install', true ); - } - - if ( class_exists( WPSEO_Capability_Manager_Factory::class ) ) { - do_action( 'wpseo_register_capabilities_premium' ); - WPSEO_Capability_Manager_Factory::get( 'premium' )->add(); - } - } - - /** - * WPSEO_Premium Constructor - */ - public function __construct() { - $this->integrations = [ - 'premium-metabox' => new WPSEO_Premium_Metabox( - YoastSEOPremium()->helpers->prominent_words, - YoastSEOPremium()->helpers->current_page - ), - 'premium-assets' => new WPSEO_Premium_Assets(), - 'link-suggestions' => new WPSEO_Metabox_Link_Suggestions(), - 'redirects-endpoint' => new WPSEO_Premium_Redirect_EndPoint( new WPSEO_Premium_Redirect_Service() ), - 'redirects-undo-endpoint' => new WPSEO_Premium_Redirect_Undo_EndPoint( new WPSEO_Redirect_Manager() ), - 'redirect-export-manager' => new WPSEO_Premium_Redirect_Export_Manager(), - 'keyword-export-manager' => new WPSEO_Premium_Keyword_Export_Manager(), - 'orphaned-post-filter' => new WPSEO_Premium_Orphaned_Post_Filter(), - 'expose-javascript-shortlinks' => new WPSEO_Premium_Expose_Shortlinks(), - 'multi-keyword' => new WPSEO_Multi_Keyword(), - 'siblings-block' => new Siblings_Block( YoastSEO()->classes->get( Indexable_Repository::class ) ), - 'subpages-block' => new Subpages_Block( YoastSEO()->classes->get( Indexable_Repository::class ) ), - ]; - - if ( WPSEO_Options::get( 'enable_cornerstone_content' ) ) { - $this->integrations['stale-cornerstone-content-filter'] = new WPSEO_Premium_Stale_Cornerstone_Content_Filter(); - } - - $this->setup(); - } - - /** - * Sets up the Yoast SEO premium plugin. - * - * @return void - */ - private function setup() { - $this->load_textdomain(); - - $this->redirect_setup(); - - add_action( 'init', [ 'WPSEO_Premium_Option', 'register_option' ] ); - add_action( 'init', [ 'WPSEO_Premium_Redirect_Option', 'register_option' ] ); - - if ( is_admin() ) { - // Make sure priority is below registration of other implementations of the beacon in News, Video, etc. - add_filter( 'wpseo_helpscout_beacon_settings', [ $this, 'filter_helpscout_beacon' ], 1 ); - - add_filter( 'wpseo_enable_tracking', '__return_true', 1 ); - - // Add Sub Menu page and add redirect page to admin page array. - // This should be possible in one method in the future, see #535. - add_filter( 'wpseo_submenu_pages', [ $this, 'add_submenu_pages' ], 9 ); - - // Add input fields to page meta post types. - add_action( - 'Yoast\WP\SEO\admin_post_types_beforearchive_internal', - [ - $this, - 'admin_page_meta_post_types_checkboxes', - ], - 10, - 2 - ); - - // Add page analysis fields to variable array key patterns. - add_filter( - 'wpseo_option_titles_variable_array_key_patterns', - [ $this, 'add_variable_array_key_pattern' ] - ); - - // Settings. - add_action( 'admin_init', [ $this, 'register_settings' ] ); - - // Add Premium imports. - $this->integrations[] = new WPSEO_Premium_Import_Manager(); - } - - // Only activate post and term watcher if permalink structure is enabled. - if ( get_option( 'permalink_structure' ) ) { - add_action( 'admin_init', [ $this, 'init_watchers' ] ); - add_action( 'rest_api_init', [ $this, 'init_watchers' ] ); - } - - if ( ! is_admin() ) { - // Add 404 redirect link to WordPress toolbar. - add_action( 'admin_bar_menu', [ $this, 'admin_bar_menu' ], 96 ); - - add_filter( 'redirect_canonical', [ $this, 'redirect_canonical_fix' ], 1, 2 ); - } - - add_action( 'wpseo_premium_indicator_classes', [ $this, 'change_premium_indicator' ] ); - add_action( 'wpseo_premium_indicator_text', [ $this, 'change_premium_indicator_text' ] ); - - foreach ( $this->integrations as $integration ) { - $integration->register_hooks(); - } - } - - /** - * Checks if the page is a premium page. - * - * @param string $page The page to check. - * - * @return bool - */ - private function is_yoast_seo_premium_page( $page ) { - $premium_pages = [ 'wpseo_redirects' ]; - - return in_array( $page, $premium_pages, true ); - } - - /** - * Sets the autoloader for the redirects and instantiates the redirect page object. - * - * @return void - */ - private function redirect_setup() { - $this->redirects = new WPSEO_Redirect_Page(); - - // Adds integration that filters redirected entries from the sitemap. - $this->integrations['redirect-sitemap-filter'] = new WPSEO_Redirect_Sitemap_Filter( home_url() ); - } - - /** - * Initialize the watchers for the posts and the terms - * - * @return void - */ - public function init_watchers() { - // The Post Watcher. - $post_watcher = new WPSEO_Post_Watcher(); - $post_watcher->register_hooks(); - - // The Term Watcher. - $term_watcher = new WPSEO_Term_Watcher(); - $term_watcher->register_hooks(); - } - - /** - * Hooks into the `redirect_canonical` filter to catch ongoing redirects and move them to the correct spot - * - * @param string $redirect_url The target url where the requested URL will be redirected to. - * @param string $requested_url The current requested URL. - * - * @return string - */ - public function redirect_canonical_fix( $redirect_url, $requested_url ) { - $redirects = new WPSEO_Redirect_Option( false ); - $path = wp_parse_url( $requested_url, PHP_URL_PATH ); - $redirect = $redirects->get( $path ); - if ( $redirect === false ) { - return $redirect_url; - } - - $redirect_url = $redirect->get_origin(); - if ( substr( $redirect_url, 0, 1 ) === '/' ) { - $redirect_url = home_url( $redirect_url ); - } - - wp_redirect( $redirect_url, $redirect->get_type(), 'Yoast SEO Premium' ); - exit; - } - - /** - * Add 'Create Redirect' option to admin bar menu on 404 pages - * - * @return void - */ - public function admin_bar_menu() { - // Prevent function from running if the page is not a 404 page or the user has not the right capabilities to create redirects. - if ( ! is_404() || ! WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ) { - return; - } - - global $wp, $wp_admin_bar; - - $parsed_url = wp_parse_url( home_url( $wp->request ) ); - - if ( ! is_array( $parsed_url ) || empty( $parsed_url['path'] ) ) { - return; - } - - $old_url = WPSEO_Redirect_Util::strip_base_url_path_from_url( home_url(), $parsed_url['path'] ); - - if ( isset( $parsed_url['query'] ) && $parsed_url['query'] !== '' ) { - $old_url .= '?' . $parsed_url['query']; - } - - $old_url = rawurlencode( $old_url ); - - $node = [ - 'id' => 'wpseo-premium-create-redirect', - 'title' => __( 'Create Redirect', 'wordpress-seo-premium' ), - 'href' => wp_nonce_url( admin_url( 'admin.php?page=wpseo_redirects&old_url=' . $old_url ), 'wpseo_redirects-old-url', 'wpseo_premium_redirects_nonce' ), - ]; - $wp_admin_bar->add_menu( $node ); - } - - /** - * Add page analysis to array with variable array key patterns - * - * @param array $patterns Array with patterns for page analysis. - * - * @return array - */ - public function add_variable_array_key_pattern( $patterns ) { - if ( in_array( 'page-analyse-extra-', $patterns, true ) === false ) { - $patterns[] = 'page-analyse-extra-'; - } - - return $patterns; - } - - /** - * This hook will add an input-field for specifying custom fields for page analysis. - * - * The values will be comma-separated and will target the belonging field in the post_meta. Page analysis will - * use the content of it by sticking it to the post_content. - * - * @param Yoast_Form $yform The Yoast_Form object. - * @param string $name The post type name. - * - * @return void - */ - public function admin_page_meta_post_types_checkboxes( $yform, $name ) { - $custom_fields_help_link = new Help_Link_Presenter( - WPSEO_Shortlinker::get( 'https://yoa.st/4cr' ), - __( 'Learn more about including custom fields in the page analysis', 'wordpress-seo-premium' ) - ); - - echo '
              '; - - $yform->textinput_extra_content( - 'page-analyse-extra-' . $name, - esc_html__( 'Custom fields to include in page analysis', 'wordpress-seo-premium' ), - [ - 'extra_content' => $custom_fields_help_link, - ] - ); - echo '
              '; - } - - /** - * Function adds the premium pages to the Yoast SEO menu - * - * @param array $submenu_pages Array with the configuration for the submenu pages. - * - * @return array - */ - public function add_submenu_pages( $submenu_pages ) { - $submenu_pages[] = [ - 'wpseo_dashboard', - '', - __( 'Redirects', 'wordpress-seo-premium' ) . ' ', - 'wpseo_manage_redirects', - 'wpseo_redirects', - [ $this->redirects, 'display' ], - ]; - - return $submenu_pages; - } - - /** - * Change premium indicator to green when premium is enabled - * - * @param string[] $classes The current classes for the indicator. - * - * @return string[] The new classes for the indicator. - */ - public function change_premium_indicator( $classes ) { - $class_no = array_search( 'wpseo-premium-indicator--no', $classes, true ); - - if ( $class_no !== false ) { - unset( $classes[ $class_no ] ); - - $classes[] = 'wpseo-premium-indicator--yes'; - } - - return $classes; - } - - /** - * Replaces the screen reader text for the premium indicator. - * - * @param string $text The original text. - * - * @return string The new text. - */ - public function change_premium_indicator_text( $text ) { - return __( 'Enabled', 'wordpress-seo-premium' ); - } - - /** - * Register the premium settings - * - * @return void - */ - public function register_settings() { - register_setting( 'yoast_wpseo_redirect_options', 'wpseo_redirect' ); - } - - /** - * Output admin css in admin head - * - * @return void - */ - public function admin_css() { - echo ""; - } - - /** - * Load textdomain - * - * @return void - */ - private function load_textdomain() { - load_plugin_textdomain( 'wordpress-seo-premium', false, dirname( WPSEO_PREMIUM_BASENAME ) . '/languages/' ); - } - - /** - * Initializes the HelpScout support modal for WPSEO settings pages. - * - * @param array $helpscout_settings The helpscout settings. - * - * @return array The HelpScout beacon settings array. - */ - public function filter_helpscout_beacon( $helpscout_settings ) { - $beacon_id = '1ae02e91-5865-4f13-b220-7daed946ba25'; - - $helpscout_settings['products'][] = WPSEO_Addon_Manager::PREMIUM_SLUG; - - // Set the beacon to the premium beacon for all pages. - foreach ( $helpscout_settings['pages_ids'] as $page => $beacon ) { - $helpscout_settings['pages_ids'][ $page ] = $beacon_id; - } - // Add the redirects page. - $helpscout_settings['pages_ids']['wpseo_redirects'] = $beacon_id; - - return $helpscout_settings; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/readme.txt b/wp/wp-content/plugins/wordpress-seo-premium/readme.txt deleted file mode 100644 index 445462ef..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/readme.txt +++ /dev/null @@ -1,2 +0,0 @@ -=== Yoast SEO Premium === -Stable tag: 22.0 diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/actions/ai-generator-action.php b/wp/wp-content/plugins/wordpress-seo-premium/src/actions/ai-generator-action.php deleted file mode 100644 index ec58eeaa..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/actions/ai-generator-action.php +++ /dev/null @@ -1,404 +0,0 @@ -ai_generator_helper = $ai_generator_helper; - $this->options_helper = $options_helper; - $this->user_helper = $user_helper; - $this->addon_manager = $addon_manager; - } - - /** - * Requests a new set of JWT tokens. - * - * Requests a new JWT access and refresh token for a user from the Yoast AI Service and stores it in the database - * under usermeta. The storing of the token happens in a HTTP callback that is triggered by this request. - * - * @param WP_User $user The WP user. - * - * @return void - * - * @throws Bad_Request_Exception Bad_Request_Exception. - * @throws Forbidden_Exception Forbidden_Exception. - * @throws Internal_Server_Error_Exception Internal_Server_Error_Exception. - * @throws Not_Found_Exception Not_Found_Exception. - * @throws Payment_Required_Exception Payment_Required_Exception. - * @throws Request_Timeout_Exception Request_Timeout_Exception. - * @throws Service_Unavailable_Exception Service_Unavailable_Exception. - * @throws Too_Many_Requests_Exception Too_Many_Requests_Exception. - * @throws Unauthorized_Exception Unauthorized_Exception. - */ - public function token_request( WP_User $user ): void { - // Ensure the user has given consent. - if ( $this->user_helper->get_meta( $user->ID, '_yoast_wpseo_ai_consent', true ) !== '1' ) { - throw $this->handle_consent_revoked( $user->ID ); - } - - // Generate a verification code and store it in the database. - $code_verifier = $this->ai_generator_helper->generate_code_verifier( $user ); - $this->ai_generator_helper->set_code_verifier( $user->ID, $code_verifier ); - - $request_body = [ - 'service' => 'openai', - 'code_challenge' => \hash( 'sha256', $code_verifier ), - 'license_site_url' => $this->ai_generator_helper->get_license_url(), - 'user_id' => (string) $user->ID, - 'callback_url' => $this->ai_generator_helper->get_callback_url(), - 'refresh_callback_url' => $this->ai_generator_helper->get_refresh_callback_url(), - ]; - - $this->ai_generator_helper->request( '/token/request', $request_body ); - - // The callback saves the metadata. Because that is in another session, we need to delete the current cache here. Or we may get the old token. - \wp_cache_delete( $user->ID, 'user_meta' ); - } - - /** - * Refreshes the JWT access token. - * - * Refreshes a stored JWT access token for a user with the Yoast AI Service and stores it in the database under - * usermeta. The storing of the token happens in a HTTP callback that is triggered by this request. - * - * @param WP_User $user The WP user. - * - * @return void - * - * @throws Bad_Request_Exception Bad_Request_Exception. - * @throws Forbidden_Exception Forbidden_Exception. - * @throws Internal_Server_Error_Exception Internal_Server_Error_Exception. - * @throws Not_Found_Exception Not_Found_Exception. - * @throws Payment_Required_Exception Payment_Required_Exception. - * @throws Request_Timeout_Exception Request_Timeout_Exception. - * @throws Service_Unavailable_Exception Service_Unavailable_Exception. - * @throws Too_Many_Requests_Exception Too_Many_Requests_Exception. - * @throws Unauthorized_Exception Unauthorized_Exception. - * @throws RuntimeException Unable to retrieve the refresh token. - */ - public function token_refresh( WP_User $user ): void { - $refresh_jwt = $this->ai_generator_helper->get_refresh_token( $user->ID ); - - // Generate a verification code and store it in the database. - $code_verifier = $this->ai_generator_helper->generate_code_verifier( $user ); - $this->ai_generator_helper->set_code_verifier( $user->ID, $code_verifier ); - - $request_body = [ - 'code_challenge' => \hash( 'sha256', $code_verifier ), - ]; - $request_headers = [ - 'Authorization' => "Bearer $refresh_jwt", - ]; - - $this->ai_generator_helper->request( '/token/refresh', $request_body, $request_headers ); - - // The callback saves the metadata. Because that is in another session, we need to delete the current cache here. Or we may get the old token. - \wp_cache_delete( $user->ID, 'user_meta' ); - } - - /** - * Callback function that will be invoked by our API. - * - * @param string $access_jwt The access JWT. - * @param string $refresh_jwt The refresh JWT. - * @param string $code_challenge The verification code. - * @param int $user_id The user ID. - * - * @return string The code verifier. - * - * @throws Unauthorized_Exception Unauthorized_Exception. - */ - public function callback( - string $access_jwt, - string $refresh_jwt, - string $code_challenge, - int $user_id - ): string { - try { - $code_verifier = $this->ai_generator_helper->get_code_verifier( $user_id ); - } catch ( RuntimeException $exception ) { - throw new Unauthorized_Exception( 'Unauthorized' ); - } - - if ( $code_challenge !== \hash( 'sha256', $code_verifier ) ) { - throw new Unauthorized_Exception( 'Unauthorized' ); - } - $this->user_helper->update_meta( $user_id, '_yoast_wpseo_ai_generator_access_jwt', $access_jwt ); - $this->user_helper->update_meta( $user_id, '_yoast_wpseo_ai_generator_refresh_jwt', $refresh_jwt ); - $this->ai_generator_helper->delete_code_verifier( $user_id ); - - return $code_verifier; - } - - // phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber -- PHPCS doesn't take into account exceptions thrown in called methods. - - /** - * Action used to generate suggestions through AI. - * - * @param WP_User $user The WP user. - * @param string $suggestion_type The type of the requested suggestion. - * @param string $prompt_content The excerpt taken from the post. - * @param string $focus_keyphrase The focus keyphrase associated to the post. - * @param string $language The language of the post. - * @param string $platform The platform the post is intended for. - * @param bool $retry_on_unauthorized Whether to retry when unauthorized (mechanism to retry once). - * - * @return array The suggestions. - * - * @throws Bad_Request_Exception Bad_Request_Exception. - * @throws Forbidden_Exception Forbidden_Exception. - * @throws Internal_Server_Error_Exception Internal_Server_Error_Exception. - * @throws Not_Found_Exception Not_Found_Exception. - * @throws Payment_Required_Exception Payment_Required_Exception. - * @throws Request_Timeout_Exception Request_Timeout_Exception. - * @throws Service_Unavailable_Exception Service_Unavailable_Exception. - * @throws Too_Many_Requests_Exception Too_Many_Requests_Exception. - * @throws Unauthorized_Exception Unauthorized_Exception. - * @throws RuntimeException Unable to retrieve the access token. - */ - public function get_suggestions( - WP_User $user, - string $suggestion_type, - string $prompt_content, - string $focus_keyphrase, - string $language, - string $platform, - bool $retry_on_unauthorized = true - ): array { - $token = $this->get_or_request_access_token( $user ); - - $request_body = [ - 'service' => 'openai', - 'user_id' => (string) $user->ID, - 'subject' => [ - 'content' => $prompt_content, - 'focus_keyphrase' => $focus_keyphrase, - 'language' => $language, - 'platform' => $platform, - ], - ]; - $request_headers = [ - 'Authorization' => "Bearer $token", - ]; - - try { - $response = $this->ai_generator_helper->request( "/openai/suggestions/$suggestion_type", $request_body, $request_headers ); - } catch ( Unauthorized_Exception $exception ) { - // Delete the stored JWT tokens, as they appear to be no longer valid. - $this->user_helper->delete_meta( $user->ID, '_yoast_wpseo_ai_generator_access_jwt' ); - $this->user_helper->delete_meta( $user->ID, '_yoast_wpseo_ai_generator_refresh_jwt' ); - - if ( ! $retry_on_unauthorized ) { - throw $exception; - } - - // Try again once more by fetching a new set of tokens and trying the suggestions endpoint again. - return $this->get_suggestions( $user, $suggestion_type, $prompt_content, $focus_keyphrase, $language, $platform, false ); - } catch ( Forbidden_Exception $exception ) { - // Follow the API in the consent being revoked (Use case: user sent an e-mail to revoke?). - throw $this->handle_consent_revoked( $user->ID, $exception->getCode() ); - } - - return $this->ai_generator_helper->build_suggestions_array( $response ); - } - - // phpcs:enable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber - - /** - * Stores the consent given or revoked by the user. - * - * @param int $user_id The user ID. - * @param bool $consent Whether the consent has been given. - * - * @return void - * - * @throws Bad_Request_Exception Bad_Request_Exception. - * @throws Internal_Server_Error_Exception Internal_Server_Error_Exception. - * @throws Not_Found_Exception Not_Found_Exception. - * @throws Payment_Required_Exception Payment_Required_Exception. - * @throws Request_Timeout_Exception Request_Timeout_Exception. - * @throws Service_Unavailable_Exception Service_Unavailable_Exception. - * @throws Too_Many_Requests_Exception Too_Many_Requests_Exception. - * @throws RuntimeException Unable to retrieve the access token. - */ - public function consent( int $user_id, bool $consent ): void { - if ( $consent ) { - // Store the consent at user level. - $this->user_helper->update_meta( $user_id, '_yoast_wpseo_ai_consent', true ); - } - else { - $this->token_invalidate( $user_id ); - - // Delete the consent at user level. - $this->user_helper->delete_meta( $user_id, '_yoast_wpseo_ai_consent' ); - } - } - - /** - * Busts the subscription cache. - * - * @return void - */ - public function bust_subscription_cache(): void { - $this->addon_manager->remove_site_information_transients(); - } - - /** - * Retrieves the access token. - * - * @param WP_User $user The WP user. - * - * @return string The access token. - * - * @throws Bad_Request_Exception Bad_Request_Exception. - * @throws Forbidden_Exception Forbidden_Exception. - * @throws Internal_Server_Error_Exception Internal_Server_Error_Exception. - * @throws Not_Found_Exception Not_Found_Exception. - * @throws Payment_Required_Exception Payment_Required_Exception. - * @throws Request_Timeout_Exception Request_Timeout_Exception. - * @throws Service_Unavailable_Exception Service_Unavailable_Exception. - * @throws Too_Many_Requests_Exception Too_Many_Requests_Exception. - * @throws Unauthorized_Exception Unauthorized_Exception. - * @throws RuntimeException Unable to retrieve the access or refresh token. - */ - private function get_or_request_access_token( WP_User $user ): string { - $access_jwt = $this->user_helper->get_meta( $user->ID, '_yoast_wpseo_ai_generator_access_jwt', true ); - if ( ! \is_string( $access_jwt ) || $access_jwt === '' ) { - $this->token_request( $user ); - $access_jwt = $this->ai_generator_helper->get_access_token( $user->ID ); - } - elseif ( $this->ai_generator_helper->has_token_expired( $access_jwt ) ) { - try { - $this->token_refresh( $user ); - } catch ( Unauthorized_Exception $exception ) { - $this->token_request( $user ); - } catch ( Forbidden_Exception $exception ) { - // Follow the API in the consent being revoked (Use case: user sent an e-mail to revoke?). - throw $this->handle_consent_revoked( $user->ID, $exception->getCode() ); - } - $access_jwt = $this->ai_generator_helper->get_access_token( $user->ID ); - } - - return $access_jwt; - } - - /** - * Invalidates the access token. - * - * @param string $user_id The user ID. - * - * @return void - * - * @throws Bad_Request_Exception Bad_Request_Exception. - * @throws Internal_Server_Error_Exception Internal_Server_Error_Exception. - * @throws Not_Found_Exception Not_Found_Exception. - * @throws Payment_Required_Exception Payment_Required_Exception. - * @throws Request_Timeout_Exception Request_Timeout_Exception. - * @throws Service_Unavailable_Exception Service_Unavailable_Exception. - * @throws Too_Many_Requests_Exception Too_Many_Requests_Exception. - * @throws RuntimeException Unable to retrieve the access token. - */ - private function token_invalidate( string $user_id ): void { - try { - $access_jwt = $this->ai_generator_helper->get_access_token( $user_id ); - } catch ( RuntimeException $e ) { - $access_jwt = ''; - } - - $request_body = [ - 'user_id' => (string) $user_id, - ]; - $request_headers = [ - 'Authorization' => "Bearer $access_jwt", - ]; - - try { - $this->ai_generator_helper->request( '/token/invalidate', $request_body, $request_headers ); - } catch ( Unauthorized_Exception | Forbidden_Exception $e ) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedCatch -- Reason: Ignored on purpose. - // We do nothing in this case, we trust nonce verification and try to remove the user data anyway. - // I.e. we fallthrough to the same logic as if we got a 200 OK. - } - - // Delete the stored JWT tokens. - $this->user_helper->delete_meta( $user_id, '_yoast_wpseo_ai_generator_access_jwt' ); - $this->user_helper->delete_meta( $user_id, '_yoast_wpseo_ai_generator_refresh_jwt' ); - } - - /** - * Handles consent revoked. - * - * By deleting the consent user metadata from the database. - * And then throwing a Forbidden_Exception. - * - * @param int $user_id The user ID. - * @param int $status_code The status code. Defaults to 403. - * - * @return Forbidden_Exception The Forbidden_Exception. - */ - private function handle_consent_revoked( int $user_id, int $status_code = 403 ): Forbidden_Exception { - $this->user_helper->delete_meta( $user_id, '_yoast_wpseo_ai_consent' ); - - return new Forbidden_Exception( 'CONSENT_REVOKED', $status_code ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/actions/link-suggestions-action.php b/wp/wp-content/plugins/wordpress-seo-premium/src/actions/link-suggestions-action.php deleted file mode 100644 index ccfab88c..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/actions/link-suggestions-action.php +++ /dev/null @@ -1,607 +0,0 @@ -prominent_words_repository = $prominent_words_repository; - $this->indexable_repository = $indexable_repository; - $this->prominent_words_helper = $prominent_words_helper; - $this->prominent_words_support = $prominent_words_support; - $this->links_repository = $links_repository; - } - - /** - * Suggests a list of links, based on the given array of prominent words. - * - * @param array $words_from_request The prominent words as an array mapping words to weights. - * @param int $limit The maximum number of link suggestions to retrieve. - * @param int $object_id The object id for the current indexable. - * @param string $object_type The object type for the current indexable. - * @param bool $include_existing_links Optional. Whether or not to include existing links, defaults to true. - * @param array $post_type Optional. The list of post types where suggestions may come from. - * @param bool $only_include_public Optional. Only include public indexables, defaults to false. - * - * @return array Links for the post that are suggested. - */ - public function get_suggestions( $words_from_request, $limit, $object_id, $object_type, $include_existing_links = true, $post_type = [], $only_include_public = false ) { - $current_indexable_id = null; - $current_indexable = $this->indexable_repository->find_by_id_and_type( $object_id, $object_type ); - if ( $current_indexable ) { - $current_indexable_id = $current_indexable->id; - } - - /* - * Gets best suggestions (returns a sorted array [$indexable_id => score]). - * The indexables are processed in batches of 1000 indexables each. - */ - $suggestions_scores = $this->retrieve_suggested_indexable_ids( $words_from_request, $limit, self::BATCH_SIZE, $current_indexable_id, $include_existing_links, $post_type, $only_include_public ); - - $indexable_ids = \array_keys( $suggestions_scores ); - - // Return the empty list if no suggestions have been found. - if ( empty( $indexable_ids ) ) { - return []; - } - - // Retrieve indexables for suggestions. - $suggestions_indexables = $this->indexable_repository->query()->where_id_in( $indexable_ids )->find_many(); - - /** - * Filter 'wpseo_link_suggestions_indexables' - Allow filtering link suggestions indexable objects. - * - * @param array $suggestions An array of suggestion indexables that can be filtered. - * @param int $object_id The object id for the current indexable. - * @param string $object_type The object type for the current indexable. - */ - $suggestions_indexables = \apply_filters( 'wpseo_link_suggestions_indexables', $suggestions_indexables, $object_id, $object_type ); - - // Create suggestions objects. - return $this->create_suggestions( $suggestions_indexables, $suggestions_scores ); - } - - /** - * Suggests a list of links, based on the given array of prominent words. - * - * @param int $id The object id for the current indexable. - * @param int $limit The maximum number of link suggestions to retrieve. - * @param bool $include_existing_links Optional. Whether or not to include existing links, defaults to true. - * - * @return array Links for the post that are suggested. - */ - public function get_indexable_suggestions_for_indexable( $id, $limit, $include_existing_links = true ) { - $weighted_words = []; - $prominent_words = $this->prominent_words_repository->query() - ->where( 'indexable_id', $id ) - ->find_array(); - foreach ( $prominent_words as $prominent_word ) { - $weighted_words[ $prominent_word['stem'] ] = $prominent_word['weight']; - } - - /* - * Gets best suggestions (returns a sorted array [$indexable_id => score]). - * The indexables are processed in batches of 1000 indexables each. - */ - $suggestions_scores = $this->retrieve_suggested_indexable_ids( $weighted_words, $limit, self::BATCH_SIZE, $id, $include_existing_links ); - - $indexable_ids = \array_keys( $suggestions_scores ); - - // Return the empty list if no suggestions have been found. - if ( empty( $indexable_ids ) ) { - return []; - } - - // Retrieve indexables for suggestions. - return $this->indexable_repository->query()->where_id_in( $indexable_ids )->find_array(); - } - - /** - * Retrieves the titles of the posts with the given IDs. - * - * @param array $post_ids The IDs of the posts to retrieve the titles of. - * - * @return array An array mapping post ID to title. - */ - protected function retrieve_posts( $post_ids ) { - $query = new WP_Query( - [ - 'post_type' => $this->prominent_words_support->get_supported_post_types(), - 'post__in' => $post_ids, - 'posts_per_page' => \count( $post_ids ), - ] - ); - $posts = $query->get_posts(); - - $post_data = []; - - foreach ( $posts as $post ) { - $post_data[ $post->ID ] = [ - 'title' => $post->post_title, - ]; - } - - return $post_data; - } - - /** - * Retrieves the names of the terms with the given IDs. - * - * @param Indexable[] $indexables The indexables to retrieve titles for. - * - * @return array An array mapping term ID to title. - */ - protected function retrieve_terms( $indexables ) { - $data = []; - foreach ( $indexables as $indexable ) { - if ( $indexable->object_type !== 'term' ) { - continue; - } - - $term = \get_term_by( 'term_id', $indexable->object_id, $indexable->object_sub_type ); - - $data[ $indexable->object_id ] = [ - 'title' => $term->name, - ]; - } - - return $data; - } - - /** - * Retrieves the titles of the given array of indexables. - * - * @param Indexable[] $indexables An array of indexables for which to retrieve the titles. - * - * @return array A two-dimensional array mapping object type and object id to title. - */ - protected function retrieve_object_titles( $indexables ) { - $object_ids = []; - - foreach ( $indexables as $indexable ) { - if ( \array_key_exists( $indexable->object_type, $object_ids ) ) { - $object_ids[ $indexable->object_type ][] = $indexable->object_id; - } - else { - $object_ids[ $indexable->object_type ] = [ $indexable->object_id ]; - } - } - - $objects = [ - 'post' => [], - 'term' => [], - ]; - - // At the moment we only support internal linking for posts, so we only need the post titles. - if ( \array_key_exists( 'post', $object_ids ) ) { - $objects['post'] = $this->retrieve_posts( $object_ids['post'] ); - } - - if ( \array_key_exists( 'term', $object_ids ) ) { - $objects['term'] = $this->retrieve_terms( $indexables ); - } - - return $objects; - } - - /** - * Computes, for a given indexable, its raw matching score on the request words to match. - * In general, higher scores mean better matches. - * - * @param array $request_data The words to match, as an array containing stems, weights and dfs. - * @param array $candidate_data The words to match against, as an array of `Prominent_Words` objects. - * - * @return float A raw score of the indexable. - */ - protected function compute_raw_score( $request_data, $candidate_data ) { - $raw_score = 0; - - foreach ( $candidate_data as $stem => $candidate_word_data ) { - if ( ! \array_key_exists( $stem, $request_data ) ) { - continue; - } - - $word_from_request_weight = $request_data[ $stem ]['weight']; - $word_from_request_df = $request_data[ $stem ]['df']; - $candidate_weight = $candidate_word_data['weight']; - $candidate_df = $candidate_word_data['df']; - - $tf_idf_word_from_request = $this->prominent_words_helper->compute_tf_idf_score( $word_from_request_weight, $word_from_request_df ); - $tf_idf_word_from_database = $this->prominent_words_helper->compute_tf_idf_score( $candidate_weight, $candidate_df ); - - // Score on this word is the product of the tf-idf scores. - $raw_score += ( $tf_idf_word_from_request * $tf_idf_word_from_database ); - } - - return $raw_score; - } - - /** - * Combines weight data of the request words to their document frequencies. This is needed to calculate - * vector length of the request data. - * - * @param array $request_words An array mapping words to weights. - * - * @return array An array mapping stems, weights and dfs. - */ - protected function compose_request_data( $request_words ) { - $request_doc_frequencies = $this->prominent_words_repository->count_document_frequencies( \array_keys( $request_words ) ); - $combined_request_data = []; - foreach ( $request_words as $stem => $weight ) { - if ( ! isset( $request_doc_frequencies[ $stem ] ) ) { - continue; - } - - $combined_request_data[ $stem ] = [ - 'weight' => (int) $weight, - 'df' => $request_doc_frequencies[ $stem ], - ]; - } - - return $combined_request_data; - } - - /** - * Transforms the array of prominent words into an array of objects mapping indexable_id to an array - * of prominent words associated with this indexable_id, with each prominent word's stem as a key. - * - * @param array $words The array of prominent words, with indexable_id as one of the keys. - * - * @return array An array mapping indexable IDs to their prominent words. - */ - protected function group_words_by_indexable_id( $words ) { - $candidates_words_by_indexable_ids = []; - foreach ( $words as $word ) { - $indexable_id = $word->indexable_id; - - $candidates_words_by_indexable_ids[ $indexable_id ][ $word->stem ] = [ - 'weight' => (int) $word->weight, - 'df' => (int) $word->df, - ]; - } - - return $candidates_words_by_indexable_ids; - } - - /** - * Calculates a matching score for one candidate indexable. - * - * @param array $request_data An array matching stems from request to their weights and dfs. - * @param float $request_vector_length The vector length of the request words. - * @param array $candidate_data An array matching stems from the candidate to their weights and dfs. - * - * @return float A matching score for an indexable. - */ - protected function calculate_score_for_indexable( $request_data, $request_vector_length, $candidate_data ) { - $raw_score = $this->compute_raw_score( $request_data, $candidate_data ); - $candidate_vector_length = $this->prominent_words_helper->compute_vector_length( $candidate_data ); - return $this->normalize_score( $raw_score, $candidate_vector_length, $request_vector_length ); - } - - /** - * In the prominent words repository, find a $batch_size of all ProminentWord-IndexableID pairs where - * prominent words match the set of stems we are interested in. - * Request prominent words for indexables in the batch (including the iDF of all words) to calculate - * their vector length later. - * - * @param array $stems The stems in the request. - * @param int $batch_size How many indexables to request in one query. - * @param int $page The start of the current batch (in pages). - * @param int[] $excluded_ids The indexable IDs to exclude. - * @param array $post_type The post types that will be searched. - * @param bool $only_include_public If only public indexables are included. - * - * @return array An array of ProminentWords objects, containing their stem, weight, indexable id, - * and document frequency. - */ - protected function get_candidate_words( $stems, $batch_size, $page, $excluded_ids = [], $post_type = [], $only_include_public = false ) { - - return $this->prominent_words_repository->find_by_list_of_ids( - $this->prominent_words_repository->find_ids_by_stems( $stems, $batch_size, $page, $excluded_ids, $post_type, $only_include_public ) - ); - } - - /** - * For each candidate indexable, computes their matching score related to the request set of prominent words. - * The candidate indexables are analyzed in batches. - * After having computed scores for a batch the function saves the best candidates until now. - * - * @param array $request_words The words to match, as an array mapping words to weights. - * @param int $limit The max number of suggestions that should be returned by the function. - * @param int $batch_size The number of indexables that should be analyzed in every batch. - * @param int|null $current_indexable_id The id for the current indexable. - * @param bool $include_existing_links Optional. Whether or not to include existing links, defaults to true. - * @param array $post_type Optional. The list of post types where suggestions may come from. - * @param bool $only_include_public Optional. Only include public indexables, defaults to false. - * - * @return array An array mapping indexable IDs to scores. Higher scores mean better matches. - */ - protected function retrieve_suggested_indexable_ids( $request_words, $limit, $batch_size, $current_indexable_id, $include_existing_links = true, $post_type = [], $only_include_public = false ) { - // Combine stems, weights and DFs from request. - $request_data = $this->compose_request_data( $request_words ); - - // Calculate vector length of the request set (needed for score normalization later). - $request_vector_length = $this->prominent_words_helper->compute_vector_length( $request_data ); - - // Get all links the post already links to, those shouldn't be suggested. - $excluded_indexable_ids = [ $current_indexable_id ]; - if ( ! $include_existing_links && $current_indexable_id ) { - $links = $this->links_repository->query() - ->distinct() - ->select( 'indexable_id' ) - ->where( 'target_indexable_id', $current_indexable_id ) - ->find_many(); - $excluded_indexable_ids = \array_merge( $excluded_indexable_ids, \wp_list_pluck( $links, 'indexable_id' ) ); - } - $excluded_indexable_ids = \array_filter( $excluded_indexable_ids ); - - $request_stems = \array_keys( $request_data ); - $scores = []; - $page = 1; - - do { - // Retrieve the words of all indexables in this batch that share prominent word stems with request. - $candidates_words = $this->get_candidate_words( $request_stems, $batch_size, $page, $excluded_indexable_ids, $post_type, $only_include_public ); - - // Transform the prominent words table so that it is indexed by indexable_ids. - $candidates_words_by_indexable_ids = $this->group_words_by_indexable_id( $candidates_words ); - - $batch_scores_size = 0; - - foreach ( $candidates_words_by_indexable_ids as $id => $candidate_data ) { - $scores[ $id ] = $this->calculate_score_for_indexable( $request_data, $request_vector_length, $candidate_data ); - ++$batch_scores_size; - } - - // Sort the list of scores and keep only the top $limit of the scores. - $scores = $this->get_top_suggestions( $scores, $limit ); - - ++$page; - } while ( $batch_scores_size === $batch_size ); - - return $scores; - } - - /** - * Normalizes the raw score based on the length of the prominent word vectors. - * - * @param float $raw_score The raw (non-normalized) score. - * @param float $vector_length_candidate The vector lengths of the candidate indexable. - * @param float $vector_length_request The vector length of the words from the request. - * - * @return int|float The score, normalized on vector lengths. - */ - protected function normalize_score( $raw_score, $vector_length_candidate, $vector_length_request ) { - $normalizing_factor = ( $vector_length_request * $vector_length_candidate ); - - if ( $normalizing_factor === 0.0 ) { - // We can't divide by 0, so set the score to 0 instead. - return 0; - } - - return ( $raw_score / $normalizing_factor ); - } - - /** - * Sorts the indexable ids based on the score and returns the top N indexable ids based on a specified limit. - * (Returns all indexable ids if there are less indexable ids than specified by the limit.) - * - * @param array $scores The array matching indexable ids to their scores. - * @param int $limit The maximum number of indexables that should be returned. - * - * @return array The top N indexable ids, sorted from highest to lowest score. - */ - protected function get_top_suggestions( $scores, $limit ) { - // Sort the indexables by descending score. - \uasort( - $scores, - static function ( $score_1, $score_2 ) { - if ( $score_1 === $score_2 ) { - return 0; - } - - return ( ( $score_1 < $score_2 ) ? 1 : -1 ); - } - ); - - // Take the top $limit suggestions, while preserving their ids specified in the keys of the array elements. - return \array_slice( $scores, 0, $limit, true ); - } - - /** - * Gets the singular label of the given combination of object type and sub type. - * - * @param string $object_type An object type. For example 'post' or 'term'. - * @param string $object_sub_type An object sub type. For example 'page' or 'category'. - * - * @return string The singular label of the given combination of object type and sub type, - * or the empty string if the singular label does not exist. - */ - protected function get_sub_type_singular_label( $object_type, $object_sub_type ) { - switch ( $object_type ) { - case 'post': - $post_type = \get_post_type_object( $object_sub_type ); - if ( $post_type ) { - return $post_type->labels->singular_name; - } - break; - case 'term': - $taxonomy = \get_taxonomy( $object_sub_type ); - if ( $taxonomy ) { - return $taxonomy->labels->singular_name; - } - break; - } - - return ''; - } - - /** - * Creates link suggestion data based on the indexables that should be suggested and the scores for these - * indexables. - * - * @param Indexable[] $indexables The indexables for which to create linking suggestions. - * @param array $scores The scores for the linking suggestions. - * - * @return array The internal linking suggestions. - */ - protected function create_suggestions( $indexables, $scores ) { - $objects = $this->retrieve_object_titles( $indexables ); - $link_suggestions = []; - - foreach ( $indexables as $indexable ) { - if ( ! \array_key_exists( $indexable->object_type, $objects ) ) { - continue; - } - - // Object tied to this indexable. E.g. post, page, term. - if ( ! \array_key_exists( $indexable->object_id, $objects[ $indexable->object_type ] ) ) { - continue; - } - - $link_suggestions[] = [ - 'object_type' => $indexable->object_type, - 'id' => (int) ( $indexable->object_id ), - 'title' => $objects[ $indexable->object_type ][ $indexable->object_id ]['title'], - 'link' => $indexable->permalink, - 'isCornerstone' => (bool) $indexable->is_cornerstone, - 'labels' => $this->get_labels( $indexable ), - 'score' => \round( (float) ( $scores[ $indexable->id ] ), 2 ), - ]; - } - - /* - * Because the request to the indexables table messes up with the ordering of the suggestions, - * we have to sort again. - */ - $this->sort_suggestions_by_field( $link_suggestions, 'score' ); - - $cornerstone_suggestions = $this->filter_suggestions( $link_suggestions, true ); - $non_cornerstone_suggestions = $this->filter_suggestions( $link_suggestions, false ); - - return \array_merge_recursive( [], $cornerstone_suggestions, $non_cornerstone_suggestions ); - } - - /** - * Retrieves the labels for the link suggestion. - * - * @param Indexable $indexable The indexable to determine the labels for. - * - * @return array The labels. - */ - protected function get_labels( Indexable $indexable ) { - $labels = []; - if ( $indexable->is_cornerstone ) { - $labels[] = 'cornerstone'; - } - - $labels[] = $this->get_sub_type_singular_label( $indexable->object_type, $indexable->object_sub_type ); - - return $labels; - } - - /** - * Sorts the given link suggestion by field. - * - * @param array $link_suggestions The link suggestions to sort. - * @param string $field The field to sort suggestions by. - * - * @return void - */ - protected function sort_suggestions_by_field( array &$link_suggestions, $field ) { - \usort( - $link_suggestions, - static function ( $suggestion_1, $suggestion_2 ) use ( $field ) { - if ( $suggestion_1[ $field ] === $suggestion_2[ $field ] ) { - return 0; - } - - return ( ( $suggestion_1[ $field ] < $suggestion_2[ $field ] ) ? 1 : -1 ); - } - ); - } - - /** - * Filters the suggestions by cornerstone status. - * - * @param array $link_suggestions The suggestions to filter. - * @param bool $cornerstone Whether or not to include the cornerstone suggestions. - * - * @return array The filtered suggestions. - */ - protected function filter_suggestions( $link_suggestions, $cornerstone ) { - return \array_filter( - $link_suggestions, - static function ( $suggestion ) use ( $cornerstone ) { - return (bool) $suggestion['isCornerstone'] === $cornerstone; - } - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/actions/prominent-words/complete-action.php b/wp/wp-content/plugins/wordpress-seo-premium/src/actions/prominent-words/complete-action.php deleted file mode 100644 index 5949f4be..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/actions/prominent-words/complete-action.php +++ /dev/null @@ -1,36 +0,0 @@ -prominent_words_helper = $prominent_words_helper; - } - - /** - * Sets the indexing state to complete. - * - * @return void - */ - public function complete() { - $this->prominent_words_helper->complete_indexing(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/actions/prominent-words/content-action.php b/wp/wp-content/plugins/wordpress-seo-premium/src/actions/prominent-words/content-action.php deleted file mode 100644 index 0df22689..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/actions/prominent-words/content-action.php +++ /dev/null @@ -1,331 +0,0 @@ -prominent_words_support = $prominent_words_support; - $this->indexable_repository = $indexable_repository; - $this->memoizer = $memoizer; - $this->meta = $meta; - } - - /** - * Returns the number of indexables to be indexed for internal linking suggestions in one batch. - * - * @return int The number of indexables to be indexed in one batch. - */ - public function get_limit() { - /** - * Filter 'wpseo_prominent_words_indexation_limit' - Allow filtering the amount of indexables indexed during each indexing pass. - * - * @param int $max The maximum number of indexables indexed. - */ - $limit = \apply_filters( 'wpseo_prominent_words_indexation_limit', 25 ); - - if ( ! \is_int( $limit ) || $limit < 1 ) { - $limit = 25; - } - - return $limit; - } - - /** - * The total number of indexables without prominent words. - * - * @return int|false The total number of indexables without prominent words. False if the query fails. - */ - public function get_total_unindexed() { - $object_sub_types = $this->get_object_sub_types(); - if ( empty( $object_sub_types ) ) { - return 0; - } - - // This prevents an expensive query. - $total_unindexed = \get_transient( static::TRANSIENT_CACHE_KEY ); - if ( $total_unindexed !== false ) { - return (int) $total_unindexed; - } - - // Try a less expensive query first: check if the indexable table holds any indexables. - // If not, no need to perform a query on the prominent words version and more. - if ( ! $this->at_least_one_indexable() ) { - return 0; - } - - // Run the expensive query to find out the exact number and store it for later use. - $total_unindexed = $this->query()->count(); - \set_transient( static::TRANSIENT_CACHE_KEY, $total_unindexed, \DAY_IN_SECONDS ); - - return $total_unindexed; - } - - /** - * The total number of indexables without prominent words. - * - * @param int $limit Limit the number of unindexed objects that are counted. - * - * @return int|false The total number of indexables without prominent words. False if the query fails. - */ - public function get_limited_unindexed_count( $limit ) { - return $this->get_total_unindexed(); - } - - /** - * Retrieves a batch of indexables, to be indexed for internal linking suggestions. - * - * @return array The indexables data to use for generating prominent words. - */ - public function index() { - $object_sub_types = $this->get_object_sub_types(); - if ( empty( $object_sub_types ) ) { - return []; - } - - $indexables = $this - ->query() - ->limit( $this->get_limit() ) - ->find_many(); - - if ( \count( $indexables ) > 0 ) { - \delete_transient( static::TRANSIENT_CACHE_KEY ); - } - - // If no indexables have been left unindexed, return the empty array. - if ( ! $indexables ) { - return []; - } - - return $this->format_data( $indexables ); - } - - /** - * Creates a query that can find indexables with outdated prominent words. - * - * @return ORM Returns an ORM instance that can be used to execute the query. - */ - protected function query() { - $updated_version = WPSEO_Premium_Prominent_Words_Versioning::get_version_number(); - - return $this->indexable_repository - ->query() - ->where_in( 'object_type', [ 'post', 'term' ] ) - ->where_in( 'object_sub_type', $this->get_object_sub_types() ) - ->where_raw( '(`prominent_words_version` IS NULL OR `prominent_words_version` != ' . $updated_version . ')' ) - ->where_raw( '((`post_status` IS NULL AND `object_type` = \'term\') OR (`post_status` = \'publish\' AND `object_type` = \'post\'))' ); - } - - /** - * Creates a query that checks whether the indexable table holds at least one record. - * - * @return bool true if at the database contains at least one indexable. - */ - protected function at_least_one_indexable() { - return $this->indexable_repository - ->query() - ->select( 'id' ) - ->find_one() !== false; - } - - /** - * Retrieves a list of subtypes to get indexables for. - * - * @return array The array with object subtypes. - */ - protected function get_object_sub_types() { - if ( $this->object_sub_types === null ) { - $this->object_sub_types = \array_merge( - $this->prominent_words_support->get_supported_post_types(), - $this->prominent_words_support->get_supported_taxonomies() - ); - } - - return $this->object_sub_types; - } - - /** - * Formats the data of the given array of indexables, so it can be used to generate prominent words. - * - * @param Indexable[] $indexables The indexables to gather data for. - * - * @return array The data. - */ - protected function format_data( $indexables ) { - $data = []; - foreach ( $indexables as $indexable ) { - // Use the meta context, so we are sure that the data is the same as is output on the frontend. - $context = $this->get_context( $indexable ); - - if ( ! $context ) { - continue; - } - - $data[] = [ - 'object_id' => $indexable->object_id, - 'object_type' => $indexable->object_type, - 'content' => $this->get_content( $context ), - 'meta' => [ - 'primary_focus_keyword' => $context->indexable->primary_focus_keyword, - 'title' => $context->title, - 'description' => $context->description, - 'keyphrase_synonyms' => $this->retrieve_keyphrase_synonyms( $context->indexable ), - ], - ]; - } - - return $data; - } - - /** - * Gets the context for the current indexable. - * - * @param Indexable $indexable The indexable to get context for. - * - * @return Meta_Tags_Context|null The context object. - */ - protected function get_context( $indexable ) { - if ( $indexable->object_type === 'post' ) { - return $this->memoizer->get( $indexable, 'Post_Type' ); - } - - if ( $indexable->object_type === 'term' ) { - return $this->memoizer->get( $indexable, 'Term_Archive' ); - } - - return null; - } - - /** - * Retrieves the keyphrase synonyms for the indexable. - * - * @param Indexable $indexable The indexable to retrieve synonyms for. - * - * @return string[] The keyphrase synonyms. - */ - protected function retrieve_keyphrase_synonyms( $indexable ) { - if ( $indexable->object_type === 'post' ) { - return \json_decode( $this->meta->get_value( 'keywordsynonyms', $indexable->object_id ) ); - } - - if ( $indexable->object_type === 'term' ) { - return \json_decode( $this->meta->get_term_value( $indexable->object_id, $indexable->object_sub_type, 'wpseo_keywordsynonyms' ) ); - } - - return []; - } - - /** - * Determines the content to use. - * - * @param Meta_Tags_Context $context The meta tags context object. - * - * @return string The content associated with the given context. - */ - protected function get_content( Meta_Tags_Context $context ) { - if ( $context->indexable->object_type === 'post' ) { - global $post; - - /* - * Set the global $post to be the post in this iteration. - * This is required for post-specific shortcodes that reference the global post. - */ - - // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- To setup the post we need to do this explicitly. - $post = $context->post; - - // Set up WordPress data for this post, outside of "the_loop". - \setup_postdata( $post ); - - // Wraps in output buffering to prevent shortcodes that echo stuff instead of return from breaking things. - \ob_start(); - $content = \do_shortcode( $post->post_content ); - \ob_end_clean(); - - \wp_reset_postdata(); - - return $content; - } - - if ( $context->indexable->object_type === 'term' ) { - $term = \get_term( $context->indexable->object_id, $context->indexable->object_sub_type ); - if ( $term === null || \is_wp_error( $term ) ) { - return ''; - } - - // Wraps in output buffering to prevent shortcodes that echo stuff instead of return from breaking things. - \ob_start(); - $description = \do_shortcode( $term->description ); - \ob_end_clean(); - - return $description; - } - - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/actions/prominent-words/save-action.php b/wp/wp-content/plugins/wordpress-seo-premium/src/actions/prominent-words/save-action.php deleted file mode 100644 index cc3b8b4f..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/actions/prominent-words/save-action.php +++ /dev/null @@ -1,212 +0,0 @@ -prominent_words_repository = $prominent_words_repository; - $this->indexable_repository = $indexable_repository; - $this->prominent_words_helper = $prominent_words_helper; - } - - /** - * Passes to-be-linked prominent words to the link function, together with the object type and object id of the - * indexable to which they will need to be linked. - * - * @param array $data The data to process. This is an array consisting of associative arrays (1 per indexable) with the keys - * 'object_id', 'object_type' and 'prominent_words' (an array with 'stem' => 'weight' mappings). - * - * @return void - */ - public function save( $data ) { - if ( $data ) { - foreach ( $data as $row ) { - $prominent_words = ( $row['prominent_words'] ?? [] ); - - $this->link( $row['object_type'], $row['object_id'], $prominent_words ); - } - } - } - - /** - * Inserts, updates and removes prominent words that are now, or are no longer, associated with an indexable. - * - * @param string $object_type The object type of the indexable (e.g. `post` or `term`). - * @param int $object_id The object id of the indexable. - * @param array $words The words to link, as a `'stem' => weight` map. - * - * @return void - */ - public function link( $object_type, $object_id, $words ) { - $indexable = $this->indexable_repository->find_by_id_and_type( $object_id, $object_type ); - - if ( $indexable ) { - // Set the prominent words version number on the indexable. - $indexable->prominent_words_version = WPSEO_Premium_Prominent_Words_Versioning::get_version_number(); - - /* - * It is correct to save here, because if the indexable didn't exist yet, - * find_by_id_and_type (in the above 'save' function) will have auto-created an indexable object - * with the correct data. So we are not saving an incomplete indexable. - */ - $indexable->save(); - - // Find the prominent words that were already associated with this indexable. - $old_words = $this->prominent_words_repository->find_by_indexable_id( $indexable->id ); - - // Handle these words. - $words = $this->handle_old_words( $indexable->id, $old_words, $words ); - - // Create database entries for all new words that are not yet in the database. - $this->create_words( $indexable->id, $words ); - } - } - - /** - * Deletes outdated prominent words from the database, and otherwise considers - * whether the old words need to have their weights updated. - * - * @param int $indexable_id The id of the indexable which needs to have its - * old words updated. - * @param Prominent_Words[] $old_words An array with prominent words that were already - * present in the database for a given indexable. - * @param array $words The new prominent words for a given indexable. - * - * @return array The words that need to be created. - */ - protected function handle_old_words( $indexable_id, $old_words, $words ) { - // Return early if the indexable didn't already have any prominent words associated with it. - if ( empty( $old_words ) ) { - return $words; - } - - $outdated_stems = []; - - foreach ( $old_words as $old_word ) { - // If an old prominent word is no longer associated with an indexable, - // add it to the array with outdated stems, so that at a later step - // it can be deleted from the database. - if ( ! \array_key_exists( $old_word->stem, $words ) ) { - $outdated_stems[] = $old_word->stem; - - continue; - } - - // If the old word should still be associated with the indexable, - // update its weight if that has changed. - $this->update_weight_if_changed( $old_word, $words[ $old_word->stem ] ); - - // Remove the key from the array with the new prominent words. - unset( $words[ $old_word->stem ] ); - } - - // Delete all the outdated prominent words in one query. - try { - $this->prominent_words_repository->delete_by_indexable_id_and_stems( $indexable_id, $outdated_stems ); - // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedCatch -- There is nothing to do. - } catch ( Exception $exception ) { - // Do nothing. - } - - return $words; - } - - /** - * Updates the weight of the given prominent word, if the weight has changed significantly. - * - * @param Prominent_Words $word The prominent word of which to update the weight. - * @param float $new_weight The new weight. - * - * @return void - */ - protected function update_weight_if_changed( $word, $new_weight ) { - if ( \abs( $word->weight - $new_weight ) > 0.1 ) { - $word->weight = $new_weight; - $word->save(); - } - } - - /** - * Creates the given words in the database and links them to the indexable with the given id. - * - * @param int $indexable_id The ID of the indexable. - * @param array $words The prominent words to create, as a `'stem'` => weight` map. - * - * @return void - */ - protected function create_words( $indexable_id, $words ) { - // Return early if there are no new words to add to the database. - if ( empty( $words ) ) { - return; - } - - $new_models = []; - - foreach ( $words as $stem => $weight ) { - $new_model = $this->prominent_words_repository->query()->create( - [ - 'indexable_id' => $indexable_id, - 'stem' => $stem, - 'weight' => $weight, - ] - ); - $new_models[] = $new_model; - } - - try { - $this->prominent_words_repository->query()->insert_many( $new_models ); - // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedCatch -- There is nothing to do. - } catch ( Exception $exception ) { - // Do nothing. - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/addon-installer.php b/wp/wp-content/plugins/wordpress-seo-premium/src/addon-installer.php deleted file mode 100644 index eb84f3c9..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/addon-installer.php +++ /dev/null @@ -1,451 +0,0 @@ -base_dir = $base_dir; - } - - /** - * Performs the installer if it hasn't been done yet. - * - * A notice will be shown in the admin if the installer failed. - * - * @return void - */ - public function install_yoast_seo_from_repository() { - \add_action( 'admin_notices', [ $this, 'show_install_yoast_seo_notification' ] ); - \add_action( 'network_admin_notices', [ $this, 'show_install_yoast_seo_notification' ] ); - \add_action( 'plugins_loaded', [ $this, 'validate_installation_status' ] ); - if ( ! $this->get_status() ) { - try { - $this->install(); - } catch ( Exception $e ) { - // Auto installation failed, the notice will be displayed. - return; - } - } - elseif ( $this->get_status() === 'started' ) { - require_once \ABSPATH . 'wp-admin/includes/plugin.php'; - $this->detect_yoast_seo(); - if ( \is_plugin_active( $this->yoast_seo_file ) ) { - // Yoast SEO is active so mark installation as successful. - \update_option( self::OPTION_KEY, 'completed', true ); - // Enable tracking. - if ( \class_exists( WPSEO_Options::class ) ) { - WPSEO_Premium_Option::register_option(); - if ( WPSEO_Options::get( 'toggled_tracking' ) !== true ) { - WPSEO_Options::set( 'tracking', true ); - } - WPSEO_Options::set( 'should_redirect_after_install', true ); - } - - if ( \class_exists( WPSEO_Capability_Manager_Factory::class ) ) { - \do_action( 'wpseo_register_capabilities_premium' ); - WPSEO_Capability_Manager_Factory::get( 'premium' )->add(); - } - } - } - } - - /** - * Performs the installer if it hasn't been done yet. - * Otherwise attempts to load Yoast SEO from the vendor directory. - * - * @deprecated 21.9 - * @codeCoverageIgnore - * - * @return void - */ - public function install_or_load_yoast_seo_from_vendor_directory() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 21.9' ); - } - - /** - * Displays a notification to install Yoast SEO. - * - * @return void - */ - public function show_install_yoast_seo_notification() { - if ( ! $this->should_show_notification() ) { - return; - } - - require_once \ABSPATH . 'wp-admin/includes/plugin.php'; - $this->detect_yoast_seo(); - - $action = $this->get_notification_action(); - - if ( ! $action ) { - return; - } - - echo ( - '
              ' - . '

              ' - . \sprintf( - /* translators: %1$s: Yoast SEO, %2$s: The minimum Yoast SEO version required, %3$s: Yoast SEO Premium. */ - \esc_html__( '%1$s %2$s must be installed and activated in order to use %3$s.', 'wordpress-seo-premium' ), - 'Yoast SEO', - \esc_html( self::MINIMUM_YOAST_SEO_VERSION ), - 'Yoast SEO Premium' - ) - . '

              ' - . '

              ' - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output is escaped above. - . $action - . '

              ' - . '
              ' - ); - } - - /** - * Returns the notification action to display. - * - * @return false|string The notification action or false if no action should be taken. - */ - protected function get_notification_action() { - $minimum_version_met = \version_compare( $this->yoast_seo_version, self::MINIMUM_YOAST_SEO_VERSION . '-RC0', '>=' ); - $network_active = \is_plugin_active_for_network( \WPSEO_PREMIUM_BASENAME ); - $yoast_seo_active = ( $network_active ) ? \is_plugin_active_for_network( $this->yoast_seo_file ) : \is_plugin_active( $this->yoast_seo_file ); - - if ( $minimum_version_met && $yoast_seo_active ) { - return false; - } - - if ( $minimum_version_met ) { - $permission = 'activate_plugins'; - } - elseif ( $this->yoast_seo_version !== '0' ) { - $permission = 'update_plugins'; - } - else { - $permission = 'install_plugins'; - } - - if ( \current_user_can( $permission ) ) { - switch ( $permission ) { - case 'activate_plugins': - if ( $network_active ) { - $base_url = \network_admin_url( 'plugins.php?action=activate&plugin=' . $this->yoast_seo_file ); - /* translators: %1$s: Yoast SEO, %2$s: Link start tag, %3$s: Link end tag. */ - $button_content = \__( '%2$sNetwork Activate %1$s now%3$s', 'wordpress-seo-premium' ); - } - else { - $base_url = \self_admin_url( 'plugins.php?action=activate&plugin=' . $this->yoast_seo_file ); - /* translators: %1$s: Yoast SEO, %2$s: Link start tag, %3$s: Link end tag. */ - $button_content = \__( '%2$sActivate %1$s now%3$s', 'wordpress-seo-premium' ); - } - $url = \wp_nonce_url( $base_url, 'activate-plugin_' . $this->yoast_seo_file ); - break; - case 'update_plugins': - $url = \wp_nonce_url( \self_admin_url( 'update.php?action=upgrade-plugin&plugin=' . $this->yoast_seo_file ), 'upgrade-plugin_' . $this->yoast_seo_file ); - /* translators: %1$s: Yoast SEO, %2$s: Link start tag, %3$s: Link end tag. */ - $button_content = \__( '%2$sUpgrade %1$s now%3$s', 'wordpress-seo-premium' ); - break; - case 'install_plugins': - $url = \wp_nonce_url( \self_admin_url( 'update.php?action=install-plugin&plugin=wordpress-seo' ), 'install-plugin_wordpress-seo' ); - /* translators: %1$s: Yoast SEO, %2$s: Link start tag, %3$s: Link end tag. */ - $button_content = \__( '%2$sInstall %1$s now%3$s', 'wordpress-seo-premium' ); - break; - } - return \sprintf( - \esc_html( $button_content ), - 'Yoast SEO', - '', - '' - ); - } - - if ( \is_multisite() ) { - /* translators: %1$s: Yoast SEO, %2$s: The minimum Yoast SEO version required. */ - $message = \__( 'Please contact a network administrator to install %1$s %2$s.', 'wordpress-seo-premium' ); - } - else { - /* translators: %1$s: Yoast SEO, %2$s: The minimum Yoast SEO version required. */ - $message = \__( 'Please contact an administrator to install %1$s %2$s.', 'wordpress-seo-premium' ); - } - return \sprintf( - \esc_html( $message ), - 'Yoast SEO', - \esc_html( self::MINIMUM_YOAST_SEO_VERSION ) - ); - } - - /** - * Checks if Yoast SEO is at a minimum required version. - * - * @return bool True if Yoast SEO is at a minimal required version - */ - public static function is_yoast_seo_up_to_date() { - return ( \defined( 'WPSEO_VERSION' ) && \version_compare( \WPSEO_VERSION, self::MINIMUM_YOAST_SEO_VERSION . '-RC0', '>=' ) ); - } - - /** - * Resets the installation status if Yoast SEO is not installed or outdated. - * - * @return void - */ - public function validate_installation_status() { - if ( ! self::is_yoast_seo_up_to_date() ) { - \delete_option( self::OPTION_KEY ); - } - } - - /** - * Returns the status of the installer. - * - * This uses a separate option from our options framework as it needs to be available - * before Yoast SEO has been loaded. - * - * @return false|string false if the installer hasn't been started. - * "started" if it has but hasn't completed. - * "completed" if it has been completed. - */ - protected function get_status() { - return \get_option( self::OPTION_KEY ); - } - - /** - * Installs to premium as an addon. - * - * @return void - * - * @throws Exception If the installer failed. - */ - protected function install() { - if ( $this->get_status() ) { - return; - } - // Mark the installer as having been started but not completed. - \update_option( self::OPTION_KEY, 'started', true ); - - require_once \ABSPATH . 'wp-admin/includes/plugin.php'; - - $this->detect_yoast_seo(); - // Either the plugin is not installed or is installed and too old. - if ( \version_compare( $this->yoast_seo_version, self::MINIMUM_YOAST_SEO_VERSION . '-RC0', '<' ) ) { - include_once \ABSPATH . 'wp-includes/pluggable.php'; - include_once \ABSPATH . 'wp-admin/includes/file.php'; - include_once \ABSPATH . 'wp-admin/includes/misc.php'; - require_once \ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; - - // The class is defined inline to avoid problems with the autoloader when extending a WP class. - $skin = new class() extends Plugin_Installer_Skin { - - /** - * Suppresses the header. - * - * @return void - */ - public function header() { - } - - /** - * Suppresses the footer. - * - * @return void - */ - public function footer() { - } - - /** - * Suppresses the errors. - * - * @phpcs:disable VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Flags unused params which are required via the interface. Invalid. - * - * @param string|WP_Error $errors Errors. - * - * @return void - */ - public function error( $errors ) { - } - - /** - * Suppresses the feedback. - * - * @phpcs:disable VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Flags unused params which are required via the interface. Invalid. - * - * @param string $feedback Message data. - * @param array ...$args Optional text replacements. - * - * @return void - */ - public function feedback( $feedback, ...$args ) { - } - }; - - // Check if the minimum version is available, otherwise we'll download the zip from SVN trunk (which should be the latest RC). - $url = 'https://downloads.wordpress.org/plugin/wordpress-seo.' . self::MINIMUM_YOAST_SEO_VERSION . '.zip'; - $check_result = \wp_remote_retrieve_response_code( \wp_remote_head( $url ) ); - if ( $check_result !== 200 ) { - $url = 'https://downloads.wordpress.org/plugin/wordpress-seo.zip'; - } - - $upgrader = new Plugin_Upgrader( $skin ); - $installed = $upgrader->install( $url ); - if ( \is_wp_error( $installed ) || ! $installed ) { - throw new Exception( 'Could not automatically install Yoast SEO' ); - } - } - - $this->ensure_yoast_seo_is_activated(); - $this->transfer_auto_update_settings(); - // Mark the installer as having been completed. - \update_option( self::OPTION_KEY, 'completed', true ); - } - - /** - * Detects the Yoast SEO plugin file and version. - * - * @return void - */ - protected function detect_yoast_seo() { - // Make sure Yoast SEO isn't already installed in another directory. - foreach ( \get_plugins() as $file => $plugin ) { - // Use text domain to identify the plugin as it's the closest thing to a slug. - if ( - isset( $plugin['TextDomain'] ) && $plugin['TextDomain'] === 'wordpress-seo' - && isset( $plugin['Name'] ) && $plugin['Name'] === 'Yoast SEO' - ) { - $this->yoast_seo_file = $file; - $this->yoast_seo_version = ( $plugin['Version'] ?? '0' ); - $this->yoast_seo_dir = \WP_PLUGIN_DIR . '/' . \dirname( $file ); - } - } - } - - /** - * Activates Yoast SEO. - * - * @return void - * - * @throws Exception If Yoast SEO could not be activated. - */ - protected function ensure_yoast_seo_is_activated() { - if ( ! \is_plugin_active( $this->yoast_seo_file ) ) { - $network_active = \is_plugin_active_for_network( \WPSEO_PREMIUM_BASENAME ); - // If we're not active at all it means we're being activated. - if ( ! $network_active && ! \is_plugin_active( \WPSEO_PREMIUM_BASENAME ) ) { - // So set network active to whether or not we're in the network admin. - $network_active = \is_network_admin(); - } - // Activate Yoast SEO. If Yoast SEO Premium is network active then make sure Yoast SEO is as well. - $activation = \activate_plugin( $this->yoast_seo_file, '', $network_active ); - if ( \is_wp_error( $activation ) ) { - throw new Exception( \esc_html( 'Could not activate Yoast SEO: ' . $activation->get_error_message() ) ); - } - } - } - - /** - * Transfers the auto update settings for Yoast SEO Premium to Yoast SEO. - * - * @return void - */ - protected function transfer_auto_update_settings() { - $auto_updates = (array) \get_site_option( 'auto_update_plugins', [] ); - - if ( \in_array( \WPSEO_PREMIUM_BASENAME, $auto_updates, true ) ) { - $auto_updates[] = $this->yoast_seo_file; - $auto_updates = \array_unique( $auto_updates ); - \update_site_option( 'auto_update_plugins', $auto_updates ); - } - } - - /** - * Wether or not the notification to install Yoast SEO should be shown. - * - * This is copied from the Yoast_Admin_And_Dashboard_Conditional which we can't use as Yoast SEO may not be installed. - * - * @return bool - */ - protected function should_show_notification() { - global $pagenow; - - // Do not output on plugin / theme upgrade pages or when WordPress is upgrading. - if ( ( \defined( 'IFRAME_REQUEST' ) && \IFRAME_REQUEST ) || \wp_installing() ) { - return false; - } - - /* - * IFRAME_REQUEST is not defined on these pages, - * though these action pages do show when upgrading themes or plugins. - */ - $actions = [ 'do-theme-upgrade', 'do-plugin-upgrade', 'do-core-upgrade', 'do-core-reinstall' ]; - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['action'] ) && \in_array( $_GET['action'], $actions, true ) ) { - return false; - } - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput -- Reason: We are not processing form information, only a strpos is done in the input. - if ( $pagenow === 'admin.php' && isset( $_GET['page'] ) && \strpos( $_GET['page'], 'wpseo' ) === 0 ) { - return true; - } - - $target_pages = [ - 'index.php', - 'plugins.php', - 'update-core.php', - 'options-permalink.php', - ]; - - return \in_array( $pagenow, $target_pages, true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/ai-editor-conditional.php b/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/ai-editor-conditional.php deleted file mode 100644 index 7bcf42ce..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/ai-editor-conditional.php +++ /dev/null @@ -1,68 +0,0 @@ -post_conditional = $post_conditional; - $this->current_page_helper = $current_page_helper; - } - - /** - * Returns `true` when the AI editor integration should be active. - * - * @return bool `true` when the AI editor integration should be active. - */ - public function is_met() { - return $this->post_conditional->is_met() || $this->is_elementor_editor(); - } - - /** - * Returns `true` when the page is the elementor editor. - * - * @return bool `true` when the page is the elementor editor. - */ - private function is_elementor_editor() { - if ( $this->current_page_helper->get_current_admin_page() !== 'post.php' ) { - return false; - } - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['action'] ) && \is_string( $_GET['action'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, We are only strictly comparing. - if ( \wp_unslash( $_GET['action'] ) === 'elementor' ) { - return true; - } - } - - return false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/algolia-enabled-conditional.php b/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/algolia-enabled-conditional.php deleted file mode 100644 index 396f9488..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/algolia-enabled-conditional.php +++ /dev/null @@ -1,37 +0,0 @@ -options_helper = $options_helper; - } - - /** - * Returns whether or not this conditional is met. - * - * @return bool Whether or not the conditional is met. - */ - public function is_met() { - return $this->options_helper->get( 'algolia_integration_active' ) === true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/cornerstone-enabled-conditional.php b/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/cornerstone-enabled-conditional.php deleted file mode 100644 index 54c9010b..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/cornerstone-enabled-conditional.php +++ /dev/null @@ -1,39 +0,0 @@ -options_helper = $options_helper; - } - - /** - * Returns `true` when the cornerstone content feature is enabled. - * - * @return bool `true` when the cornerstone content feature is enabled. - */ - public function is_met() { - return $this->options_helper->get( 'enable_cornerstone_content' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/edd-conditional.php b/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/edd-conditional.php deleted file mode 100644 index b82d48c3..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/edd-conditional.php +++ /dev/null @@ -1,20 +0,0 @@ -is_enabled(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/term-overview-or-ajax-conditional.php b/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/term-overview-or-ajax-conditional.php deleted file mode 100644 index 90c1dc0e..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/conditionals/term-overview-or-ajax-conditional.php +++ /dev/null @@ -1,23 +0,0 @@ -yoast_admin_conditional = $yoast_admin_conditional; - } - - /** - * Returns whether this conditional is met. - * - * @return bool Whether the conditional is met. - */ - public function is_met() { - if ( $this->yoast_admin_conditional->is_met() ) { - return true; - } - - if ( $this->is_post_request() && $this->is_introductions_rest_request() ) { - return true; - } - - return false; - } - - /** - * Whether the request method is POST. - * - * @return bool - */ - private function is_post_request() { - if ( ! isset( $_SERVER['REQUEST_METHOD'] ) ) { - return false; - } - - return $_SERVER['REQUEST_METHOD'] === 'POST'; - } - - /** - * Whether the request URI starts with the prefix, Yoast API V1 and introductions. - * - * @return bool - */ - private function is_introductions_rest_request() { - if ( ! isset( $_SERVER['REQUEST_URI'] ) ) { - return false; - } - - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- Variable is only used in a case-insensitive comparison. - return \stripos( $_SERVER['REQUEST_URI'], '/' . \rest_get_url_prefix() . '/' . Main::API_V1_NAMESPACE . '/introductions/' ) === 0; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/config/badge-group-names.php b/wp/wp-content/plugins/wordpress-seo-premium/src/config/badge-group-names.php deleted file mode 100644 index 15ea0281..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/config/badge-group-names.php +++ /dev/null @@ -1,37 +0,0 @@ - '16.5-beta0', - ]; - - /** - * Badge_Group_Names constructor. - * - * @param string|null $version Optional. The current version number. - */ - public function __construct( $version = null ) { - parent::__construct( $version ); - - if ( ! $version ) { - $version = \WPSEO_PREMIUM_VERSION; - } - $this->version = $version; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/config/migrations/20190715101200_WpYoastPremiumImprovedInternalLinking.php b/wp/wp-content/plugins/wordpress-seo-premium/src/config/migrations/20190715101200_WpYoastPremiumImprovedInternalLinking.php deleted file mode 100644 index 346d6c57..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/config/migrations/20190715101200_WpYoastPremiumImprovedInternalLinking.php +++ /dev/null @@ -1,97 +0,0 @@ -get_table_name(); - $adapter = $this->get_adapter(); - - if ( ! $adapter->has_table( $table_name ) ) { - $table = $this->create_table( $table_name ); - - $table->column( - 'stem', - 'string', - [ - 'null' => true, - 'limit' => 191, - ] - ); - $table->column( - 'indexable_id', - 'integer', - [ - 'unsigned' => true, - 'null' => true, - 'limit' => 11, - ] - ); - $table->column( 'weight', 'float' ); - - $table->finish(); - } - - if ( ! $adapter->has_index( $table_name, 'stem', [ 'name' => 'stem' ] ) ) { - $this->add_index( - $table_name, - [ - 'stem', - ], - [ - 'name' => 'stem', - ] - ); - } - - if ( ! $adapter->has_index( $table_name, 'indexable_id', [ 'name' => 'indexable_id' ] ) ) { - $this->add_index( - $table_name, - [ - 'indexable_id', - ], - [ - 'name' => 'indexable_id', - ] - ); - } - } - - /** - * Migration down. - */ - public function down() { - $table_name = $this->get_table_name(); - if ( $this->get_adapter()->has_table( $table_name ) ) { - $this->drop_table( $table_name ); - } - } - - /** - * Retrieves the table name to use. - * - * @return string The table name to use. - */ - protected function get_table_name() { - return Model::get_table_name( 'Prominent_Words' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/config/migrations/20210827093024_AddIndexOnIndexableIdAndStem.php b/wp/wp-content/plugins/wordpress-seo-premium/src/config/migrations/20210827093024_AddIndexOnIndexableIdAndStem.php deleted file mode 100644 index b42d7d24..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/config/migrations/20210827093024_AddIndexOnIndexableIdAndStem.php +++ /dev/null @@ -1,85 +0,0 @@ -get_table_name(); - $adapter = $this->get_adapter(); - - if ( ! $adapter->has_table( $table_name ) ) { - return; - } - - // Create the index if it doesn't exist already. - if ( ! $adapter->has_index( $table_name, $this->columns_with_index, [ 'name' => 'indexable_id_and_stem' ] ) ) { - $this->add_index( - $this->get_table_name(), - $this->columns_with_index, - [ 'name' => 'indexable_id_and_stem' ] - ); - } - } - - /** - * Migration down. Removes the combined index on 'indexable_id' and 'stem'. - * - * @return void - */ - public function down() { - $table_name = $this->get_table_name(); - $adapter = $this->get_adapter(); - - if ( ! $adapter->has_table( $table_name ) ) { - return; - } - - // Remove the index if it exists. - if ( $adapter->has_index( $table_name, $this->columns_with_index, [ 'name' => 'indexable_id_and_stem' ] ) ) { - - $this->remove_index( - $this->get_table_name(), - $this->columns_with_index, - [ 'name' => 'indexable_id_and_stem' ] - ); - } - } - - /** - * Retrieves the table name to use for storing prominent words. - * - * @return string The table name to use. - */ - protected function get_table_name() { - return Model::get_table_name( 'Prominent_Words' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/database/migration-runner-premium.php b/wp/wp-content/plugins/wordpress-seo-premium/src/database/migration-runner-premium.php deleted file mode 100644 index 11ba8475..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/database/migration-runner-premium.php +++ /dev/null @@ -1,37 +0,0 @@ -run_premium_migrations(); - - // The below action is used when queries fail, this may happen in a multisite environment when switch_to_blog is used. - \add_action( '_yoast_run_migrations', [ $this, 'run_premium_migrations' ] ); - } - - /** - * Runs the Premium migrations. - * - * @return void - * - * @throws Exception When a migration errored. - */ - public function run_premium_migrations() { - $this->run_migrations( 'premium', \WPSEO_PREMIUM_VERSION ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/actions/zapier-action.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/actions/zapier-action.php deleted file mode 100644 index 5ec00cc4..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/actions/zapier-action.php +++ /dev/null @@ -1,244 +0,0 @@ -zapier_helper = $zapier_helper; - $this->indexable_repository = $indexable_repository; - } - - /** - * Subscribes Zapier and stores the passed URL for later usage. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param string $url The URL to subscribe. - * @param string $api_key The API key from Zapier to check against the one stored in the options. - * - * @return object The response object. - */ - public function subscribe( $url, $api_key ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( ! $this->zapier_helper->is_valid_api_key( $api_key ) ) { - return (object) [ - 'data' => [], - 'message' => 'The API key does not match.', - 'status' => 500, - ]; - } - - if ( $this->zapier_helper->is_connected() ) { - return (object) [ - 'data' => [], - 'message' => 'Subscribing failed. A subscription already exists.', - 'status' => 500, - ]; - } - - $subscription_data = $this->zapier_helper->subscribe_url( $url ); - - if ( ! $subscription_data ) { - return (object) [ - 'data' => [], - 'message' => 'Subscribing failed.', - 'status' => 500, - ]; - } - - return (object) [ - 'data' => $subscription_data, - 'status' => 200, - ]; - } - - /** - * Unsubscribes Zapier based on the passed ID. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param string $id The ID to unsubscribe. - * - * @return object The response object. - */ - public function unsubscribe( $id ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( ! $this->zapier_helper->is_subscribed_id( $id ) ) { - return (object) [ - 'message' => \sprintf( 'Unsubscribing failed. Subscription with ID `%s` does not exist.', $id ), - 'status' => 404, - ]; - } - - if ( ! $this->zapier_helper->unsubscribe_id( $id ) ) { - return (object) [ - 'message' => 'Unsubscribing failed. Unable to delete subscription.', - 'status' => 500, - ]; - } - - return (object) [ - 'message' => \sprintf( 'Successfully unsubscribed subscription with ID `%s`.', $id ), - 'status' => 200, - ]; - } - - /** - * Checks the API key submitted by Zapier. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param string $api_key The API key from Zapier to check against the one - * stored in the options. - * - * @return object The response object. - */ - public function check_api_key( $api_key ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( ! $this->zapier_helper->is_valid_api_key( $api_key ) ) { - return (object) [ - 'data' => [], - 'message' => 'The API key does not match.', - 'status' => 500, - ]; - } - - return (object) [ - 'data' => [], - 'message' => 'The API key is valid.', - 'status' => 200, - ]; - } - - /** - * Sends an array of the last published post URLs. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param string $api_key The API key from Zapier to check against the one - * stored in the options. - * - * @return object The response object. - */ - public function perform_list( $api_key ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( ! $this->zapier_helper->is_valid_api_key( $api_key ) ) { - return (object) [ - 'data' => [], - 'message' => 'The API key does not match.', - 'status' => 500, - ]; - } - - $latest_post = \get_posts( - [ - 'numberposts' => 1, - ] - ); - $zapier_data = []; - foreach ( $latest_post as $item ) { - $indexable = $this->indexable_repository->find_by_id_and_type( $item->ID, 'post' ); - if ( $indexable ) { - $zapier_data[] = (object) $this->zapier_helper->get_data_for_zapier( $indexable ); - } - } - - return (object) [ - 'data' => $zapier_data, - 'status' => 200, - ]; - } - - /** - * Checks if Zapier is connected. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return object The response object. - */ - public function is_connected() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - return (object) [ - 'data' => [ - 'is_connected' => $this->zapier_helper->is_connected(), - ], - 'status' => 200, - ]; - } - - /** - * Resets the API key in the DB. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param string $api_key The API key to be reset. - * - * @return object The response object. - */ - public function reset_api_key( $api_key ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( ! $this->zapier_helper->is_valid_api_key( $api_key ) ) { - return (object) [ - 'data' => [], - 'message' => 'The API key does not match.', - 'status' => 500, - ]; - } - - $this->zapier_helper->reset_api_key_and_subscription(); - $new_api_key = $this->zapier_helper->get_or_generate_zapier_api_key(); - - return (object) [ - 'data' => [ - 'zapier_api_key' => $new_api_key, - ], - ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/classes/facebook-profile.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/classes/facebook-profile.php deleted file mode 100644 index b11660ac..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/classes/facebook-profile.php +++ /dev/null @@ -1,191 +0,0 @@ -get_facebook_profile( $user_id ); - - // Only try to get the name when the user has a profile set. - if ( $facebook_profile !== '' ) { - wp_die( esc_html( $this->get_name( $facebook_profile ) ) ); - } - - wp_die(); - } - } - - /** - * Get the Facebook profile url from the user profile. - * - * @codeCoverageIgnore - * - * @param int $user_id The user to get the Facebook profile field for. - * - * @return string URL or empty string if the field is not set or empty. - */ - private function get_facebook_profile( $user_id ) { - $facebook_profile = get_the_author_meta( 'facebook', $user_id ); - - if ( ! empty( $facebook_profile ) ) { - return $facebook_profile; - } - - return ''; - } - - /** - * Get the name used on Facebook from the transient cache, if the name isn't - * fetched already get it from the Facebook follow widget. - * - * @codeCoverageIgnore - * - * @param string $facebook_profile The profile to get. - * - * @return string - */ - private function get_name( $facebook_profile ) { - $cached_facebook_name = $this->get_cached_name( $facebook_profile ); - if ( $cached_facebook_name !== false ) { - return $cached_facebook_name; - } - - $facebook_name = $this->get_name_from_facebook( $facebook_profile ); - - $this->set_cached_name( $facebook_profile, $facebook_name ); - - return $facebook_name; - } - - /** - * Returns the stored name from the user meta. - * - * @codeCoverageIgnore - * - * @param string $facebook_profile The Facebook profile to look for. - * - * @return string|bool - */ - private function get_cached_name( $facebook_profile ) { - $facebook_profiles = get_transient( self::TRANSIENT_NAME ); - if ( is_array( $facebook_profiles ) && array_key_exists( $facebook_profile, $facebook_profiles ) ) { - return $facebook_profiles[ $facebook_profile ]; - } - - return false; - } - - /** - * Stores the fetched Facebook name to the user meta. - * - * @codeCoverageIgnore - * - * @param string $facebook_profile The Facebook profile belonging to the name. - * @param string $facebook_name The name the user got on Facebook. - * - * @return void - */ - private function set_cached_name( $facebook_profile, $facebook_name ) { - $facebook_profiles = get_transient( self::TRANSIENT_NAME ); - - $facebook_profiles[ $facebook_profile ] = $facebook_name; - - set_transient( self::TRANSIENT_NAME, $facebook_profiles, DAY_IN_SECONDS ); - } - - /** - * Do request to Facebook to get the HTML for the follow widget. - * - * @codeCoverageIgnore - * - * @param string $facebook_profile The profile URL to lookup. - * - * @return string - */ - private function get_name_from_facebook( $facebook_profile ) { - $response = wp_remote_get( - $this->facebook_endpoint . $facebook_profile, - [ - 'headers' => [ 'Accept-Language' => 'en_US' ], - ] - ); - - if ( wp_remote_retrieve_response_code( $response ) === 200 ) { - return $this->extract_name_from_response( - wp_remote_retrieve_body( $response ) - ); - } - - return ''; - } - - /** - * Try to extract the full name from the response. - * - * @codeCoverageIgnore - * - * @param string $response_body The response HTML to lookup for the full name. - * - * @return string - */ - private function extract_name_from_response( $response_body ) { - $full_name_regex = '/
              /i'; - - if ( preg_match( $full_name_regex, $response_body, $matches ) ) { - if ( ! empty( $matches[1] ) ) { - return $matches[1]; - } - } - - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/conditionals/zapier-enabled-conditional.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/conditionals/zapier-enabled-conditional.php deleted file mode 100644 index d7df4190..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/conditionals/zapier-enabled-conditional.php +++ /dev/null @@ -1,50 +0,0 @@ -zapier = $zapier; - } - - /** - * Returns whether or not this conditional is met. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return bool Whether or not the conditional is met. - */ - public function is_met() { - \_deprecated_function( __METHOD__, 'WPSEO Premium 20.7' ); - - return $this->zapier->is_enabled(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/helpers/zapier-helper.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/helpers/zapier-helper.php deleted file mode 100644 index 1d292d3c..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/helpers/zapier-helper.php +++ /dev/null @@ -1,291 +0,0 @@ -options = $options; - $this->meta_surface = $meta_surface; - } - - /** - * Checks if a subscription exists in the database. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return bool Whether a subscription exists in the database. - */ - public function is_connected() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - $subscription = $this->options->get( 'zapier_subscription' ); - - if ( \is_array( $subscription ) - && ! empty( $subscription['id'] ) - && \filter_var( $subscription['url'], \FILTER_VALIDATE_URL ) - ) { - return true; - } - - return false; - } - - /** - * Checks if the Zapier integration is currently enabled. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return bool Whether the integration is enabled. - */ - public function is_enabled() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - return (bool) $this->options->get( 'zapier_integration_active', false ); - } - - /** - * Gets the stored Zapier API Key. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return string The Zapier API Key. - */ - public function get_or_generate_zapier_api_key() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - $zapier_api_key = $this->options->get( 'zapier_api_key' ); - - if ( empty( $zapier_api_key ) ) { - $zapier_api_key = \wp_generate_password( 32, false ); - $this->options->set( 'zapier_api_key', $zapier_api_key ); - } - - return $zapier_api_key; - } - - /** - * Resets the stored Zapier API Key and subscription data. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return void - */ - public function reset_api_key_and_subscription() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - $this->options->set( 'zapier_api_key', '' ); - $this->options->set( 'zapier_subscription', [] ); - } - - /** - * Check if a string matches the API key in the DB, if present. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param string $api_key The API key to test. - * - * @return bool Whether the API key is valid or not. - */ - public function is_valid_api_key( $api_key ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - return ( ! empty( $api_key ) && $this->options->get( 'zapier_api_key' ) === $api_key ); - } - - /** - * Returns the Zapier hook URL of the trigger if present, null otherwise. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return string|null The hook URL, null if not set. - */ - public function get_trigger_url() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( $this->is_connected() ) { - $subscription = $this->options->get( 'zapier_subscription', [] ); - - return $subscription['url']; - } - - return null; - } - - /** - * Returns whether the submitted id is present in the subscriptions. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param string $id The id to be tested. - * - * @return bool Whether the id is present in the subscriptions. - */ - public function is_subscribed_id( $id ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( $this->is_connected() ) { - $subscription = $this->options->get( 'zapier_subscription', [] ); - - return $subscription['id'] === $id; - } - - return false; - } - - /** - * Unsubscribes the submitted id. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param string $id The id to be unsubscribed. - * - * @return bool Whether the unsubscription was successful. - */ - public function unsubscribe_id( $id ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( $this->is_connected() && $this->is_subscribed_id( $id ) ) { - return $this->options->set( 'zapier_subscription', [] ); - } - - return false; - } - - /** - * Creates a new subscription with the submitted URL. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param string $url The URL to be subscribed. - * - * @return array|bool The subscription data (id and URL) if successful, false otherwise. - */ - public function subscribe_url( $url ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( ! $this->is_connected() ) { - $subscription_data = [ - 'id' => \wp_generate_password( 32, false ), - 'url' => \esc_url_raw( $url, [ 'http', 'https' ] ), - ]; - - if ( $this->options->set( 'zapier_subscription', $subscription_data ) ) { - return $subscription_data; - } - } - - return false; - } - - /** - * Builds and returns the data for Zapier. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param Indexable $indexable The indexable from which the data must be extracted. - * - * @return array[] The array of data ready to be sent to Zapier. - */ - public function get_data_for_zapier( Indexable $indexable ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - $post = \get_post( $indexable->object_id ); - if ( ! $post ) { - return []; - } - - $meta = $this->meta_surface->for_indexable( $indexable ); - - $open_graph_image = ''; - if ( \count( $meta->open_graph_images ) > 0 ) { - $open_graph_image_array = \reset( $meta->open_graph_images ); - $open_graph_image = $open_graph_image_array['url']; - } - - return [ - 'url' => $indexable->permalink, - 'post_type' => $post->post_type, - 'post_title' => \html_entity_decode( $post->post_title ), - 'author' => \get_the_author_meta( 'display_name', $post->post_author ), - 'tags' => \html_entity_decode( \implode( ', ', \wp_get_post_tags( $post->ID, [ 'fields' => 'names' ] ) ) ), - 'categories' => \html_entity_decode( \implode( ', ', \wp_get_post_categories( $post->ID, [ 'fields' => 'names' ] ) ) ), - 'primary_category' => \html_entity_decode( \yoast_get_primary_term( 'category', $post ) ), - 'meta_description' => \html_entity_decode( $meta->description ), - 'open_graph_title' => \html_entity_decode( $meta->open_graph_title ), - 'open_graph_description' => \html_entity_decode( $meta->open_graph_description ), - 'open_graph_image' => $open_graph_image, - 'twitter_title' => \html_entity_decode( $meta->twitter_title ), - 'twitter_description' => \html_entity_decode( $meta->twitter_description ), - 'twitter_image' => $meta->twitter_image, - ]; - } - - /** - * Returns whether the post type is supported by the Zapier integration. - * - * The Zapier integration should be visible and working only for post types - * that support the Yoast Metabox. We filter out attachments regardless of - * the Yoast SEO settings, anyway. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param string $post_type The post type to be checked. - * - * @return bool Whether the post type is supported by the Zapier integration. - */ - public function is_post_type_supported( $post_type ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - return $post_type !== 'attachment' && WPSEO_Utils::is_metabox_active( $post_type, 'post_type' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/initializers/crawl-cleanup-permalinks.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/initializers/crawl-cleanup-permalinks.php deleted file mode 100644 index 774153d7..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/initializers/crawl-cleanup-permalinks.php +++ /dev/null @@ -1,317 +0,0 @@ -current_page_helper = $current_page_helper; - $this->options_helper = $options_helper; - $this->url_helper = $url_helper; - } - - /** - * Initializes the integration. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return void - */ - public function initialize() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Initializers\Crawl_Cleanup_Permalinks::initialize()' ); - - // We need to hook after 10 because otherwise our options helper isn't available yet. - \add_action( 'plugins_loaded', [ $this, 'register_hooks' ], 15 ); - } - - /** - * Hooks our required hooks. - * - * This is the place to register hooks and filters. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return void - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Initializers\Crawl_Cleanup_Permalinks::register_hooks()' ); - - if ( $this->options_helper->get( 'clean_campaign_tracking_urls' ) && ! empty( \get_option( 'permalink_structure' ) ) ) { - \add_action( 'template_redirect', [ $this, 'utm_redirect' ], 0 ); - } - if ( $this->options_helper->get( 'clean_permalinks' ) && ! empty( \get_option( 'permalink_structure' ) ) ) { - \add_action( 'template_redirect', [ $this, 'clean_permalinks' ], 1 ); - } - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return array The array of conditionals. - */ - public static function get_conditionals() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Initializers\Crawl_Cleanup_Permalinks::get_conditionals()' ); - - return [ Front_End_Conditional::class ]; - } - - /** - * Redirect utm variables away. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return void - */ - public function utm_redirect() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Initializers\Crawl_Cleanup_Permalinks::utm_redirect()' ); - - // Prevents WP CLI from throwing an error. - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput - if ( ! isset( $_SERVER['REQUEST_URI'] ) || \strpos( $_SERVER['REQUEST_URI'], '?' ) === false ) { - return; - } - - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput - if ( ! \stripos( $_SERVER['REQUEST_URI'], 'utm_' ) ) { - return; - } - - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput - $parsed = \wp_parse_url( $_SERVER['REQUEST_URI'] ); - - $query = \explode( '&', $parsed['query'] ); - $utms = []; - $other_args = []; - - foreach ( $query as $query_arg ) { - if ( \stripos( $query_arg, 'utm_' ) === 0 ) { - $utms[] = $query_arg; - continue; - } - $other_args[] = $query_arg; - } - - if ( empty( $utms ) ) { - return; - } - - $other_args_str = ''; - if ( \count( $other_args ) > 0 ) { - $other_args_str = '?' . \implode( '&', $other_args ); - } - - $new_path = $parsed['path'] . $other_args_str . '#' . \implode( '&', $utms ); - - $message = \sprintf( - /* translators: %1$s: Yoast SEO Premium */ - \__( '%1$s: redirect utm variables to #', 'wordpress-seo-premium' ), - 'Yoast SEO Premium' - ); - - \wp_safe_redirect( \trailingslashit( $this->url_helper->recreate_current_url( false ) ) . \ltrim( $new_path, '/' ), 301, $message ); - exit; - } - - /** - * Removes unneeded query variables from the URL. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return void - */ - public function clean_permalinks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Initializers\Crawl_Cleanup_Permalinks::clean_permalinks()' ); - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We're not processing anything yet... - if ( \is_robots() || \get_query_var( 'sitemap' ) || empty( $_GET ) || \is_user_logged_in() ) { - return; - } - - $current_url = $this->url_helper->recreate_current_url(); - - /** - * Filter: 'Yoast\WP\SEO\allowlist_permalink_vars' - Allows plugins to register their own variables not to clean. - * - * Note: This is a Premium plugin-only hook. - * - * @since 19.2.0 - * - * @param array $allowed_extravars The list of the allowed vars (empty by default). - */ - $allowed_extravars = \apply_filters( 'Yoast\WP\SEO\allowlist_permalink_vars', [] ); - - if ( $this->options_helper->get( 'clean_permalinks_extra_variables' ) !== '' ) { - $allowed_extravars = \array_merge( $allowed_extravars, \explode( ',', $this->options_helper->get( 'clean_permalinks_extra_variables' ) ) ); - } - - $allowed_query = []; - - // @todo parse_str changes spaces in param names into `_`, we should find a better way to support them. - \wp_parse_str( \wp_parse_url( $current_url, \PHP_URL_QUERY ), $query ); - - if ( ! empty( $allowed_extravars ) ) { - foreach ( $allowed_extravars as $get ) { - $get = \trim( $get ); - if ( isset( $query[ $get ] ) ) { - $allowed_query[ $get ] = \rawurlencode_deep( $query[ $get ] ); - unset( $query[ $get ] ); - } - } - } - - // If we had only allowed params, let's just bail out, no further processing needed. - if ( \count( $query ) === 0 ) { - return; - } - - global $wp_query; - - $proper_url = ''; - - if ( \is_singular() ) { - global $post; - $proper_url = \get_permalink( $post->ID ); - - $page = \get_query_var( 'page' ); - if ( $page && $page !== 1 ) { - $the_post = \get_post( $post->ID ); - $page_count = \substr_count( $the_post->post_content, '' ); - $proper_url = \user_trailingslashit( \trailingslashit( $proper_url ) . $page ); - if ( $page > ( $page_count + 1 ) ) { - $proper_url = \user_trailingslashit( \trailingslashit( $proper_url ) . ( $page_count + 1 ) ); - } - } - - // Fix reply to comment links, whoever decided this should be a GET variable? - // phpcs:ignore WordPress.Security -- We know this is scary. - if ( isset( $_SERVER['REQUEST_URI'] ) && \preg_match( '`(\?replytocom=[^&]+)`', \sanitize_text_field( $_SERVER['REQUEST_URI'] ), $matches ) ) { - $proper_url .= \str_replace( '?replytocom=', '#comment-', $matches[0] ); - } - unset( $matches ); - - // Prevent cleaning out posts & page previews for people capable of viewing them. - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We know this is scary. - if ( isset( $_GET['preview'] ) && isset( $_GET['preview_nonce'] ) && \current_user_can( 'edit_post' ) ) { - return; - } - } - elseif ( \is_front_page() ) { - if ( $this->current_page_helper->is_home_posts_page() ) { - $proper_url = \home_url( '/' ); - } - elseif ( $this->current_page_helper->is_home_static_page() ) { - $proper_url = \get_permalink( $GLOBALS['post']->ID ); - } - } - elseif ( $this->current_page_helper->is_posts_page() ) { - $proper_url = \get_permalink( \get_option( 'page_for_posts' ) ); - } - elseif ( \is_category() || \is_tag() || \is_tax() ) { - $term = $wp_query->get_queried_object(); - if ( \is_feed() ) { - $proper_url = \get_term_feed_link( $term->term_id, $term->taxonomy ); - } - else { - $proper_url = \get_term_link( $term, $term->taxonomy ); - } - } - elseif ( \is_search() ) { - $s = \get_search_query(); - $proper_url = \get_bloginfo( 'url' ) . '/?s=' . \rawurlencode( $s ); - } - elseif ( \is_404() ) { - if ( \is_multisite() && ! \is_subdomain_install() && \is_main_site() ) { - if ( $current_url === \get_bloginfo( 'url' ) . '/blog/' || $current_url === \get_bloginfo( 'url' ) . '/blog' ) { - if ( $this->current_page_helper->is_home_static_page() ) { - $proper_url = \get_permalink( \get_option( 'page_for_posts' ) ); - } - else { - $proper_url = \get_bloginfo( 'url' ); - } - } - } - } - if ( ! empty( $proper_url ) && $wp_query->query_vars['paged'] !== 0 && $wp_query->post_count !== 0 ) { - if ( \is_search() ) { - $proper_url = \get_bloginfo( 'url' ) . '/page/' . $wp_query->query_vars['paged'] . '/?s=' . \rawurlencode( \get_search_query() ); - } - else { - $proper_url = \user_trailingslashit( \trailingslashit( $proper_url ) . 'page/' . $wp_query->query_vars['paged'] ); - } - } - - $proper_url = \add_query_arg( $allowed_query, $proper_url ); - - if ( ! empty( $proper_url ) && $current_url !== $proper_url ) { - \header( 'Content-Type: redirect', true ); - \header_remove( 'Content-Type' ); - \header_remove( 'Last-Modified' ); - \header_remove( 'X-Pingback' ); - - $message = \sprintf( - /* translators: %1$s: Yoast SEO Premium */ - \__( '%1$s: unregistered URL parameter removed', 'wordpress-seo-premium' ), - 'Yoast SEO Premium' - ); - - \wp_safe_redirect( $proper_url, 301, $message ); - exit; - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/admin/crawl-settings-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/admin/crawl-settings-integration.php deleted file mode 100644 index c2b2c1f8..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/admin/crawl-settings-integration.php +++ /dev/null @@ -1,421 +0,0 @@ -options_helper = $options_helper; - $this->shortlinker = $shortlinker; - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * In this case: when on an admin page. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return array - */ - public static function get_conditionals() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Admin\Crawl_Settings_Integration::get_conditionals()' ); - - return [ Admin_Conditional::class ]; - } - - /** - * Registers an action to add a new tab to the General page. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return void - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Admin\Crawl_Settings_Integration::register_hooks()' ); - - $this->register_setting_labels(); - - \add_action( 'wpseo_settings_tab_crawl_cleanup_network', [ $this, 'add_crawl_settings_tab_content_network' ] ); - } - - /** - * Enqueue the workouts app. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return void - */ - public function enqueue_assets() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Admin\Crawl_Settings_Integration::enqueue_assets()' ); - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Date is not processed or saved. - if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'wpseo_dashboard' ) { - return; - } - - \wp_enqueue_script( 'wp-seo-premium-crawl-settings' ); - } - - /** - * Adds content to the Crawl Cleanup tab. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @param Yoast_Form $yform The yoast form object. - * - * @return void - */ - public function add_crawl_settings_tab_content( $yform ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4' ); - - $this->add_crawl_settings( $yform, false ); - } - - /** - * Adds content to the Crawl Cleanup network tab. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @param Yoast_Form $yform The yoast form object. - * - * @return void - */ - public function add_crawl_settings_tab_content_network( $yform ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Admin\Crawl_Settings_Integration::add_crawl_settings_tab_content_network( $yform )' ); - - $this->add_crawl_settings( $yform, true ); - } - - /** - * Connects the settings to their labels. - * - * @return void - */ - private function register_setting_labels() { - $this->feed_settings = [ - 'remove_feed_global' => \__( 'Global feed', 'wordpress-seo-premium' ), - 'remove_feed_global_comments' => \__( 'Global comment feeds', 'wordpress-seo-premium' ), - 'remove_feed_post_comments' => \__( 'Post comments feeds', 'wordpress-seo-premium' ), - 'remove_feed_authors' => \__( 'Post authors feeds', 'wordpress-seo-premium' ), - 'remove_feed_post_types' => \__( 'Post type feeds', 'wordpress-seo-premium' ), - 'remove_feed_categories' => \__( 'Category feeds', 'wordpress-seo-premium' ), - 'remove_feed_tags' => \__( 'Tag feeds', 'wordpress-seo-premium' ), - 'remove_feed_custom_taxonomies' => \__( 'Custom taxonomy feeds', 'wordpress-seo-premium' ), - 'remove_feed_search' => \__( 'Search results feeds', 'wordpress-seo-premium' ), - 'remove_atom_rdf_feeds' => \__( 'Atom/RDF feeds', 'wordpress-seo-premium' ), - ]; - - $this->basic_settings = [ - 'remove_shortlinks' => \__( 'Shortlinks', 'wordpress-seo-premium' ), - 'remove_rest_api_links' => \__( 'REST API links', 'wordpress-seo-premium' ), - 'remove_rsd_wlw_links' => \__( 'RSD / WLW links', 'wordpress-seo-premium' ), - 'remove_oembed_links' => \__( 'oEmbed links', 'wordpress-seo-premium' ), - 'remove_generator' => \__( 'Generator tag', 'wordpress-seo-premium' ), - 'remove_pingback_header' => \__( 'Pingback HTTP header', 'wordpress-seo-premium' ), - 'remove_powered_by_header' => \__( 'Powered by HTTP header', 'wordpress-seo-premium' ), - ]; - - $this->permalink_cleanup_settings = [ - 'clean_campaign_tracking_urls' => \__( 'Campaign tracking URL parameters', 'wordpress-seo-premium' ), - 'clean_permalinks' => \__( 'Unregistered URL parameters', 'wordpress-seo-premium' ), - ]; - - $this->search_cleanup_settings = [ - 'search_cleanup' => \__( 'Filter search terms', 'wordpress-seo-premium' ), - 'search_cleanup_emoji' => \__( 'Filter searches with emojis and other special characters', 'wordpress-seo-premium' ), - 'search_cleanup_patterns' => \__( 'Filter searches with common spam patterns', 'wordpress-seo-premium' ), - 'deny_search_crawling' => \__( 'Prevent search engines from crawling site search URLs', 'wordpress-seo-premium' ), - 'redirect_search_pretty_urls' => \__( 'Redirect pretty URLs for search pages to raw format', 'wordpress-seo-premium' ), - ]; - - $this->unused_resources_settings = [ - 'remove_emoji_scripts' => \__( 'Emoji scripts', 'wordpress-seo-premium' ), - 'deny_wp_json_crawling' => \__( 'Prevent search engines from crawling /wp-json/', 'wordpress-seo-premium' ), - ]; - } - - /** - * Print the settings sections. - * - * @param Yoast_Form $yform The Yoast form class. - * @param bool $is_network Whether we're on the network site. - * - * @return void - */ - private function add_crawl_settings( $yform, $is_network ) { - $this->print_toggles( $this->basic_settings, $yform, $is_network, \__( 'Basic crawl settings', 'wordpress-seo-premium' ), \__( 'Remove links added by WordPress to the header and <head>.', 'wordpress-seo-premium' ) ); - - $this->print_toggles( $this->feed_settings, $yform, $is_network, \__( 'Feed crawl settings', 'wordpress-seo-premium' ), \__( "Remove feed links added by WordPress that aren't needed for this site.", 'wordpress-seo-premium' ) ); - $this->print_toggles( $this->unused_resources_settings, $yform, $is_network, \__( 'Remove unused resources', 'wordpress-seo-premium' ), \__( 'WordPress loads lots of resources, some of which your site might not need. If you’re not using these, removing them can speed up your pages and save resources.', 'wordpress-seo-premium' ) ); - - $first_search_setting = \array_slice( $this->search_cleanup_settings, 0, 1 ); - $rest_search_settings = \array_slice( $this->search_cleanup_settings, 1 ); - $search_settings_toggles = [ - 'off' => \__( 'Disabled', 'wordpress-seo-premium' ), - 'on' => \__( 'Enabled', 'wordpress-seo-premium' ), - ]; - - $this->print_toggles( $first_search_setting, $yform, $is_network, \__( 'Search cleanup settings', 'wordpress-seo-premium' ), \__( 'Clean up and filter searches to prevent search spam.', 'wordpress-seo-premium' ), $search_settings_toggles ); - - if ( ! $is_network ) { - echo '
              '; - $yform->number( - 'search_character_limit', - \__( 'Max number of characters to allow in searches', 'wordpress-seo-premium' ), - [ - 'min' => 1, - 'max' => 1000, - ] - ); - echo '
              '; - } - - $this->print_toggles( $rest_search_settings, $yform, $is_network, '', '', $search_settings_toggles ); - - $permalink_warning = \sprintf( - /* Translators: %1$s expands to an opening anchor tag for a link leading to the Yoast SEO page of the Permalink Cleanup features, %2$s expands to a closing anchor tag. */ - \esc_html__( - 'These are expert features, so make sure you know what you\'re doing before removing the parameters. %1$sRead more about how your site can be affected%2$s.', - 'wordpress-seo-premium' - ), - '', - '' - ); - - $this->print_toggles( $this->permalink_cleanup_settings, $yform, $is_network, \__( 'Permalink cleanup settings', 'wordpress-seo-premium' ), \__( 'Remove unwanted URL parameters from your URLs.', 'wordpress-seo-premium' ), [], $permalink_warning ); - - if ( ! $is_network && ! empty( \get_option( 'permalink_structure' ) ) ) { - echo ''; - } - else { - // Also add the original option as hidden, so as not to lose any values if it's disabled and the form is saved. - $yform->hidden( 'clean_permalinks_extra_variables', 'clean_permalinks_extra_variables' ); - } - } - - /** - * Prints a list of toggles for an array of settings with labels. - * - * @param array $settings The settings being displayed. - * @param Yoast_Form $yform The Yoast form class. - * @param bool $is_network Whether we're on the network site. - * @param string $title Optional title for the settings being displayed. - * @param string $description Optional description of the settings being displayed. - * @param array $toggles Optional naming of the toggle buttons. - * @param string $warning Optional warning to be displayed above the toggles. - * - * @return void - */ - private function print_toggles( array $settings, Yoast_Form $yform, $is_network = false, $title = '', $description = '', $toggles = [], $warning = '' ) { - if ( ! empty( $title ) ) { - echo '

              ', \esc_html( $title ), '

              '; - } - if ( ! $is_network && ! empty( $description ) ) { - echo '

              ', \esc_html( $description ), '

              '; - } - - if ( ! empty( $warning ) ) { - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in Alert_Presenter. - echo new Alert_Presenter( $warning, 'warning' ); - } - - if ( empty( $toggles ) ) { - $toggles = [ - 'off' => \__( 'Keep', 'wordpress-seo-premium' ), - 'on' => \__( 'Remove', 'wordpress-seo-premium' ), - ]; - } - $setting_prefix = ''; - - if ( $is_network ) { - $setting_prefix = WPSEO_Option::ALLOW_KEY_PREFIX; - $toggles = [ - // phpcs:ignore WordPress.WP.I18n.TextDomainMismatch -- Reason: text is originally from Yoast SEO. - 'on' => \__( 'Allow Control', 'wordpress-seo' ), - // phpcs:ignore WordPress.WP.I18n.TextDomainMismatch -- Reason: text is originally from Yoast SEO. - 'off' => \__( 'Disable', 'wordpress-seo' ), - ]; - } - - foreach ( $settings as $setting => $label ) { - $attr = []; - $variable = $setting_prefix . $setting; - - if ( $this->should_feature_be_disabled_permalink( $setting, $is_network ) ) { - $attr = [ - 'disabled' => true, - ]; - $variable = $setting_prefix . $setting . '_disabled'; - - // Also add the original option as hidden, so as not to lose any values if it's disabled and the form is saved. - $yform->hidden( $setting_prefix . $setting, $setting_prefix . $setting ); - } - elseif ( $this->should_feature_be_disabled_multisite( $setting ) ) { - $attr = [ - 'disabled' => true, - 'preserve_disabled_value' => false, - ]; - } - - $yform->toggle_switch( - $variable, - $toggles, - $label, - '', - $attr - ); - if ( $setting === 'remove_feed_global_comments' && ! $is_network ) { - echo '

              '; - echo \esc_html__( 'By removing Global comments feed, Post comments feeds will be removed too.', 'wordpress-seo-premium' ); - echo '

              '; - } - if ( $this->should_feature_be_disabled_permalink( $setting, $is_network ) ) { - echo '

              '; - if ( \current_user_can( 'manage_options' ) ) { - \printf( - /* translators: 1: Link start tag to the Permalinks settings page, 2: Link closing tag. */ - \esc_html__( 'This feature is disabled when your site is not using %1$spretty permalinks%2$s.', 'wordpress-seo-premium' ), - '', - '' - ); - } - else { - echo \esc_html__( 'This feature is disabled when your site is not using pretty permalinks.', 'wordpress-seo-premium' ); - } - echo '

              '; - } - elseif ( $this->should_feature_be_disabled_multisite( $setting ) ) { - echo '

              '; - \esc_html_e( 'This feature is not available for multisites.', 'wordpress-seo-premium' ); - echo '

              '; - } - } - } - - /** - * Checks if the feature should be disabled due to non-pretty permalinks. - * - * @param string $setting The setting to be displayed. - * @param bool $is_network Whether we're on the network site. - * - * @return bool - */ - protected function should_feature_be_disabled_permalink( $setting, $is_network ) { - return ( - \in_array( $setting, [ 'clean_permalinks', 'clean_campaign_tracking_urls' ], true ) - && ! $is_network - && empty( \get_option( 'permalink_structure' ) ) - && ! $this->is_control_disabled( $setting ) - ); - } - - /** - * Checks if the feature should be disabled due to the site being a multisite. - * - * @param string $setting The setting to be displayed. - * - * @return bool - */ - protected function should_feature_be_disabled_multisite( $setting ) { - return ( - \in_array( $setting, [ 'deny_search_crawling', 'deny_wp_json_crawling' ], true ) - && \is_multisite() - ); - } - - /** - * Checks whether a given control should be disabled, because of the network admin. - * - * @param string $variable The variable within the option to check whether its control should be disabled. - * - * @return bool True if control should be disabled, false otherwise. - */ - protected function is_control_disabled( $variable ) { - return ! $this->options_helper->get( 'allow_' . $variable, true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/admin/integrations-page.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/admin/integrations-page.php deleted file mode 100644 index 14a35c62..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/admin/integrations-page.php +++ /dev/null @@ -1,71 +0,0 @@ -options_helper = $options_helper; - } - - /** - * {@inheritDoc} - * - * @deprecated 20.7 - * @codeCoverageIgnore - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - } - - /** - * Enqueue the workouts app. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return void - */ - public function enqueue_assets() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/admin/zapier-notification-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/admin/zapier-notification-integration.php deleted file mode 100644 index a7ad58ed..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/admin/zapier-notification-integration.php +++ /dev/null @@ -1,190 +0,0 @@ -admin_asset_manager = $admin_asset_manager; - $this->capability_helper = $capability_helper; - $this->zapier_enable_conditional = $zapier_enable_conditional; - } - - /** - * {@inheritDoc} - * - * @deprecated 20.7 - * @codeCoverageIgnore - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - \add_action( 'admin_notices', [ $this, 'zapier_notice' ] ); - \add_action( 'wp_ajax_dismiss_zapier_notice', [ $this, 'dismiss_zapier_notice' ] ); - } - - /** - * Shows a notice if zapier is enabled and it's not being dismissed before. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return void - */ - public function zapier_notice() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( ! $this->capability_helper->current_user_can( 'wpseo_manage_options' ) ) { - return; - } - - if ( $this->is_notice_dismissed() ) { - return; - } - - $is_zapier_connected = WPSEO_Options::get( 'zapier_subscription', [] ); - - if ( $is_zapier_connected ) { - $this->admin_asset_manager->enqueue_style( 'monorepo' ); - - /* translators: %1$s for Yoast SEO */ - $title = \sprintf( \__( 'Zapier integration will be removed from %1$s', 'wordpress-seo-premium' ), 'Yoast SEO' ); - $content = \sprintf( - /* translators: %1$s and %2$s expands to the link to https://yoast.com/features/zapier, %3$s for Yoast SEO, %4$s for support email. */ - \esc_html__( 'The %1$sZapier integration%2$s (on the Integrations page) will be removed from %3$s in 20.7 (release date May 9th). If you have any questions, please reach out to %4$s.', 'wordpress-seo-premium' ), - '', - '', - 'Yoast SEO', - 'support@yoast.com' - ); - - // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped -- Output of the title escaped in the Notice_Presenter. - echo new Notice_Presenter( - $title, - $content, - null, - null, - true, - 'yoast-zapier-notice' - ); - // phpcs:enable - - // Enable permanently dismissing the notice. - echo ''; - } - } - - /** - * Was the notice dismissed by the user. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return bool - */ - protected function is_notice_dismissed() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - return \get_user_meta( \get_current_user_id(), self::USER_META_DISMISSED, true ) === '1'; - } - - /** - * Dismisses the notice. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return bool - */ - public function dismiss_zapier_notice() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( ! \check_ajax_referer( 'dismiss_zapier_notice', 'nonce', false ) || ! $this->capability_helper->current_user_can( 'wpseo_manage_options' ) ) { - return; - } - \update_user_meta( \get_current_user_id(), self::USER_META_DISMISSED, true ); - return WPSEO_Options::set( 'is_dismissed_zapier_notice', true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/blocks/block-patterns.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/blocks/block-patterns.php deleted file mode 100644 index 56d4c37b..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/blocks/block-patterns.php +++ /dev/null @@ -1,76 +0,0 @@ -block_patterns = $block_patterns; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @deprecated 20.5 - * @codeCoverageIgnore - * - * @return void - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.5' ); - } - - /** - * Registers the block patterns with WordPress. - * - * @deprecated 20.5 - * @codeCoverageIgnore - * - * @return void - */ - public function register_block_patterns() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.5' ); - } - - /** - * Registers the block pattern category with WordPress. - * - * @deprecated 20.5 - * @codeCoverageIgnore - * - * @return void - */ - public function register_block_pattern_category() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.5' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/blocks/job-posting-block.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/blocks/job-posting-block.php deleted file mode 100644 index bf17fcda..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/blocks/job-posting-block.php +++ /dev/null @@ -1,65 +0,0 @@ -wordpress_helper = $wordpress_helper; - } - - /** - * Registers the hooks. - * - * @deprecated 20.5 - * @codeCoverageIgnore - * - * @return void - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.5' ); - } - - /** - * Adds Yoast block categories. - * - * @deprecated 20.5 - * @codeCoverageIgnore - * - * @param array $categories The categories to filter. - * - * @return array The filtered categories. - */ - public function add_block_categories( $categories ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.5' ); - return $categories; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/blocks/schema-blocks.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/blocks/schema-blocks.php deleted file mode 100644 index b5ebd41c..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/blocks/schema-blocks.php +++ /dev/null @@ -1,72 +0,0 @@ -options_helper = $options_helper; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return void - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Basic::register_hooks()' ); - - // Remove HTTP headers we don't want. - \add_action( 'wp', [ $this, 'clean_headers' ], 0 ); - - if ( $this->is_true( 'remove_shortlinks' ) ) { - // Remove shortlinks. - \remove_action( 'wp_head', 'wp_shortlink_wp_head' ); - \remove_action( 'template_redirect', 'wp_shortlink_header', 11 ); - } - - if ( $this->is_true( 'remove_rest_api_links' ) ) { - // Remove REST API links. - \remove_action( 'wp_head', 'rest_output_link_wp_head' ); - \remove_action( 'template_redirect', 'rest_output_link_header', 11 ); - } - - if ( $this->is_true( 'remove_rsd_wlw_links' ) ) { - // Remove RSD and WLW Manifest links. - \remove_action( 'wp_head', 'rsd_link' ); - \remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' ); - \remove_action( 'wp_head', 'wlwmanifest_link' ); - } - - if ( $this->is_true( 'remove_oembed_links' ) ) { - // Remove JSON+XML oEmbed links. - \remove_action( 'wp_head', 'wp_oembed_add_discovery_links' ); - } - - if ( $this->is_true( 'remove_generator' ) ) { - \remove_action( 'wp_head', 'wp_generator' ); - } - - if ( $this->is_true( 'remove_emoji_scripts' ) ) { - // Remove emoji scripts and additional stuff they cause. - \remove_action( 'wp_head', 'print_emoji_detection_script', 7 ); - \remove_action( 'wp_print_styles', 'print_emoji_styles' ); - \remove_action( 'admin_print_scripts', 'print_emoji_detection_script' ); - \remove_action( 'admin_print_styles', 'print_emoji_styles' ); - \add_filter( 'wp_resource_hints', [ $this, 'resource_hints_plain_cleanup' ], 1 ); - } - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return array The array of conditionals. - */ - public static function get_conditionals() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Basic::get_conditionals()' ); - - return [ Front_End_Conditional::class ]; - } - - /** - * Removes X-Pingback and X-Powered-By headers as they're unneeded. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return void - */ - public function clean_headers() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Basic::clean_headers()' ); - - if ( \headers_sent() ) { - return; - } - - if ( $this->is_true( 'remove_powered_by_header' ) ) { - \header_remove( 'X-Powered-By' ); - } - if ( $this->is_true( 'remove_pingback_header' ) ) { - \header_remove( 'X-Pingback' ); - } - } - - /** - * Remove the core s.w.org hint as it's only used for emoji stuff we don't use. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @param array $hints The hints we're adding to. - * - * @return array - */ - public function resource_hints_plain_cleanup( $hints ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Basic::resource_hints_plain_cleanup( $hints )' ); - - foreach ( $hints as $key => $hint ) { - if ( \strpos( $hint, '//s.w.org' ) !== false ) { - unset( $hints[ $key ] ); - } - } - - return $hints; - } - - /** - * Checks if the value of an option is set to true. - * - * @param string $option_name The option name. - * - * @return bool - */ - private function is_true( $option_name ) { - return $this->options_helper->get( $option_name ) === true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/front-end/crawl-cleanup-rss.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/front-end/crawl-cleanup-rss.php deleted file mode 100644 index d81c550f..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/front-end/crawl-cleanup-rss.php +++ /dev/null @@ -1,233 +0,0 @@ -options_helper = $options_helper; - } - - /** - * Returns the conditionals based on which this loadable should be active. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return array The conditionals. - */ - public static function get_conditionals() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Rss::get_conditionals()' ); - - return [ Front_End_Conditional::class ]; - } - - /** - * Register our RSS related hooks. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return void - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Rss::register_hooks()' ); - - if ( $this->is_true( 'remove_feed_global' ) ) { - \add_action( 'feed_links_show_posts_feed', '__return_false' ); - } - - if ( $this->is_true( 'remove_feed_global_comments' ) ) { - \add_action( 'feed_links_show_comments_feed', '__return_false' ); - } - - \add_action( 'wp', [ $this, 'maybe_disable_feeds' ] ); - \add_action( 'wp', [ $this, 'maybe_redirect_feeds' ], -10000 ); - } - - /** - * Disable feeds on selected cases. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return void - */ - public function maybe_disable_feeds() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Rss::maybe_disable_feeds()' ); - - if ( \is_singular() && $this->is_true( 'remove_feed_post_comments' ) - || ( \is_author() && $this->is_true( 'remove_feed_authors' ) ) - || ( \is_category() && $this->is_true( 'remove_feed_categories' ) ) - || ( \is_tag() && $this->is_true( 'remove_feed_tags' ) ) - || ( \is_tax() && $this->is_true( 'remove_feed_custom_taxonomies' ) ) - || ( \is_post_type_archive() && $this->is_true( 'remove_feed_post_types' ) ) - || ( \is_search() && $this->is_true( 'remove_feed_search' ) ) ) { - \remove_action( 'wp_head', 'feed_links_extra', 3 ); - } - } - - /** - * Redirect feeds we don't want away. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return void - */ - public function maybe_redirect_feeds() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Rss::maybe_redirect_feeds()' ); - - global $wp_query; - - if ( ! \is_feed() ) { - return; - } - - if ( \in_array( \get_query_var( 'feed' ), [ 'atom', 'rdf' ], true ) && $this->is_true( 'remove_atom_rdf_feeds' ) ) { - $this->redirect_feed( \home_url(), 'We disable Atom/RDF feeds for performance reasons.' ); - } - - // Only if we're on the global feed, the query is _just_ `'feed' => 'feed'`, hence this check. - if ( ( $wp_query->query === [ 'feed' => 'feed' ] - || $wp_query->query === [ 'feed' => 'atom' ] - || $wp_query->query === [ 'feed' => 'rdf' ] ) - && $this->is_true( 'remove_feed_global' ) ) { - $this->redirect_feed( \home_url(), 'We disable the RSS feed for performance reasons.' ); - } - - if ( \is_comment_feed() && ! ( \is_singular() || \is_attachment() ) && $this->is_true( 'remove_feed_global_comments' ) ) { - $this->redirect_feed( \home_url(), 'We disable comment feeds for performance reasons.' ); - } - elseif ( \is_comment_feed() - && \is_singular() - && ( $this->is_true( 'remove_feed_post_comments' ) || $this->is_true( 'remove_feed_global_comments' ) ) ) { - $url = \get_permalink( \get_queried_object() ); - $this->redirect_feed( $url, 'We disable post comment feeds for performance reasons.' ); - } - - if ( \is_author() && $this->is_true( 'remove_feed_authors' ) ) { - $author_id = (int) \get_query_var( 'author' ); - $url = \get_author_posts_url( $author_id ); - $this->redirect_feed( $url, 'We disable author feeds for performance reasons.' ); - } - - if ( ( \is_category() && $this->is_true( 'remove_feed_categories' ) ) - || ( \is_tag() && $this->is_true( 'remove_feed_tags' ) ) - || ( \is_tax() && $this->is_true( 'remove_feed_custom_taxonomies' ) ) ) { - $term = \get_queried_object(); - $url = \get_term_link( $term, $term->taxonomy ); - if ( \is_wp_error( $url ) ) { - $url = \home_url(); - } - $this->redirect_feed( $url, 'We disable taxonomy feeds for performance reasons.' ); - } - - if ( ( \is_post_type_archive() ) && $this->is_true( 'remove_feed_post_types' ) ) { - $url = \get_post_type_archive_link( $this->get_queried_post_type() ); - $this->redirect_feed( $url, 'We disable post type feeds for performance reasons.' ); - } - - if ( \is_search() && $this->is_true( 'remove_feed_search' ) ) { - $url = \trailingslashit( \home_url() ) . '?s=' . \get_search_query(); - $this->redirect_feed( $url, 'We disable search RSS feeds for performance reasons.' ); - } - } - - /** - * Sends a cache control header. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @param int $expiration The expiration time. - * - * @return void - */ - public function cache_control_header( $expiration ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Rss::cache_control_header( $expiration )' ); - - \header_remove( 'Expires' ); - - // The cacheability of the current request. 'public' allows caching, 'private' would not allow caching by proxies like CloudFlare. - $cacheability = 'public'; - $format = '%1$s, max-age=%2$d, s-maxage=%2$d, stale-while-revalidate=120, stale-if-error=14400'; - - if ( \is_user_logged_in() ) { - $expiration = 0; - $cacheability = 'private'; - $format = '%1$s, max-age=%2$d'; - } - - \header( \sprintf( 'Cache-Control: ' . $format, $cacheability, $expiration ), true ); - } - - /** - * Redirect a feed result to somewhere else. - * - * @param string $url The location we're redirecting to. - * @param string $reason The reason we're redirecting. - * - * @return void - */ - private function redirect_feed( $url, $reason ) { - \header_remove( 'Content-Type' ); - \header_remove( 'Last-Modified' ); - - $this->cache_control_header( 7 * \DAY_IN_SECONDS ); - - \wp_safe_redirect( $url, 301, 'Yoast SEO: ' . $reason ); - exit; - } - - /** - * Retrieves the queried post type. - * - * @return string The queried post type. - */ - private function get_queried_post_type() { - $post_type = \get_query_var( 'post_type' ); - if ( \is_array( $post_type ) ) { - $post_type = \reset( $post_type ); - } - return $post_type; - } - - /** - * Checks if the value of an option is set to true. - * - * @param string $option_name The option name. - * - * @return bool - */ - private function is_true( $option_name ) { - return $this->options_helper->get( $option_name ) === true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/front-end/crawl-cleanup-searches.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/front-end/crawl-cleanup-searches.php deleted file mode 100644 index 5d13b499..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/front-end/crawl-cleanup-searches.php +++ /dev/null @@ -1,234 +0,0 @@ -options_helper = $options_helper; - $this->redirect_helper = $redirect_helper; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return void - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Searches::register_hooks()' ); - - if ( $this->options_helper->get( 'search_cleanup' ) ) { - \add_filter( 'pre_get_posts', [ $this, 'validate_search' ] ); - } - if ( $this->options_helper->get( 'redirect_search_pretty_urls' ) && ! empty( \get_option( 'permalink_structure' ) ) ) { - \add_action( 'template_redirect', [ $this, 'maybe_redirect_searches' ], 2 ); - } - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return array The array of conditionals. - */ - public static function get_conditionals() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Searches::get_conditionals()' ); - - return [ Front_End_Conditional::class ]; - } - - /** - * Check if we want to allow this search to happen. - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @param WP_Query $query The main query. - * - * @return WP_Query - */ - public function validate_search( WP_Query $query ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Searches::validate_search( WP_Query $query )' ); - - if ( ! $query->is_search() ) { - return $query; - } - // First check against emoji and patterns we might not want. - $this->check_unwanted_patterns( $query ); - - // Then limit characters if still needed. - $this->limit_characters(); - - return $query; - } - - /** - * Redirect pretty search URLs to the "raw" equivalent - * - * @deprecated 20.4 - * @codeCoverageIgnore - * - * @return void - */ - public function maybe_redirect_searches() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.4', 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Searches::maybe_redirect_searches()' ); - - if ( ! \is_search() ) { - return; - } - - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput - if ( isset( $_SERVER['REQUEST_URI'] ) && \stripos( $_SERVER['REQUEST_URI'], '/search/' ) === 0 ) { - $args = []; - - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput - $parsed = \wp_parse_url( $_SERVER['REQUEST_URI'] ); - - if ( ! empty( $parsed['query'] ) ) { - \wp_parse_str( $parsed['query'], $args ); - } - - $args['s'] = \get_search_query(); - - $proper_url = \home_url( '/' ); - - if ( \intval( \get_query_var( 'paged' ) ) > 1 ) { - $proper_url .= \sprintf( 'page/%s/', \get_query_var( 'paged' ) ); - unset( $args['paged'] ); - } - - $proper_url = \add_query_arg( \array_map( 'rawurlencode_deep', $args ), $proper_url ); - - if ( ! empty( $parsed['fragment'] ) ) { - $proper_url .= '#' . \rawurlencode( $parsed['fragment'] ); - } - - $this->redirect_away( 'We redirect pretty URLs to the raw format.', $proper_url ); - } - } - - /** - * Check query against unwanted search patterns. - * - * @param WP_Query $query The main WordPress query. - * - * @return void - */ - private function check_unwanted_patterns( WP_Query $query ) { - $s = \rawurldecode( $query->query_vars['s'] ); - if ( $this->options_helper->get( 'search_cleanup_emoji' ) && $this->has_emoji( $s ) ) { - $this->redirect_away( 'We don\'t allow searches with emojis and other special characters.' ); - } - - if ( ! $this->options_helper->get( 'search_cleanup_patterns' ) ) { - return; - } - foreach ( $this->patterns as $pattern ) { - $outcome = \preg_match( $pattern, $s, $matches ); - if ( $outcome && $matches !== [] ) { - $this->redirect_away( 'Your search matched a common spam pattern.' ); - } - } - } - - /** - * Redirect to the homepage for invalid searches. - * - * @param string $reason The reason for redirecting away. - * @param string $to_url The URL to redirect to. - * - * @return void - */ - private function redirect_away( $reason, $to_url = '' ) { - if ( empty( $to_url ) ) { - $to_url = \get_home_url(); - } - - $this->redirect_helper->do_safe_redirect( $to_url, 301, 'Yoast Search Filtering: ' . $reason ); - } - - /** - * Limits the number of characters in the search query. - * - * @return void - */ - private function limit_characters() { - // We retrieve the search term unescaped because we want to count the characters properly. We make sure to escape it afterwards, if we do something with it. - $unescaped_s = \get_search_query( false ); - - // We then unslash the search term, again because we want to count the characters properly. We make sure to slash it afterwards, if we do something with it. - $raw_s = \wp_unslash( $unescaped_s ); - if ( \mb_strlen( $raw_s, 'UTF-8' ) > $this->options_helper->get( 'search_character_limit' ) ) { - $new_s = \mb_substr( $raw_s, 0, $this->options_helper->get( 'search_character_limit' ), 'UTF-8' ); - \set_query_var( 's', \wp_slash( \esc_attr( $new_s ) ) ); - } - } - - /** - * Determines if a text string contains an emoji or not. - * - * @param string $text The text string to detect emoji in. - * - * @return bool - */ - private function has_emoji( $text ) { - $emojis_regex = '/([^-\p{L}\x00-\x7F]+)/u'; - \preg_match( $emojis_regex, $text, $matches ); - - return ! empty( $matches ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/third-party/zapier-classic-editor.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/third-party/zapier-classic-editor.php deleted file mode 100644 index 8431c575..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/third-party/zapier-classic-editor.php +++ /dev/null @@ -1,122 +0,0 @@ -zapier_helper = $zapier_helper; - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return array - */ - public static function get_conditionals() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - return [ Zapier_Enabled_Conditional::class ]; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return void - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - \add_action( 'wpseo_publishbox_misc_actions', [ $this, 'add_publishbox_text' ] ); - } - - /** - * Adds the Zapier text to the Classic Editor publish box. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param WP_Post $post The current post object. - * - * @return void - */ - public function add_publishbox_text( $post ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( ! \is_a( $post, 'WP_Post' ) ) { - return; - } - - if ( ! $this->zapier_helper->is_post_type_supported( $post->post_type ) ) { - return; - } - ?> -
              - - - zapier_helper->is_connected() ) { - \printf( - /* translators: 1: Zapier, 2: Link start tag, 3: Zapier, 4: Link closing tag. */ - \esc_html__( 'You’re successfully connected to %1$s. Publishing a post will trigger automated actions based on your Zap’s configuration. %2$sManage your Zap in %3$s%4$s.', 'wordpress-seo-premium' ), - 'Zapier', - '', - 'Zapier', - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- The content is already escaped. - WPSEO_Admin_Utils::get_new_tab_message() . '' - ); - } - else { - \printf( - /* translators: 1: Link start tag, 2: Yoast SEO, 3: Zapier, 4: Link closing tag. */ - \esc_html__( '%1$sConnect %2$s with %3$s%4$s to instantly share your published posts with 2000+ destinations such as Twitter, Facebook and more.', 'wordpress-seo-premium' ), - '', - 'Yoast SEO', - 'Zapier', - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- The content is already escaped. - WPSEO_Admin_Utils::get_new_tab_message() . '' - ); - } - ?> - -
              - meta_helper = $meta_helper; - $this->zapier_helper = $zapier_helper; - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return array - */ - public static function get_conditionals() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - return [ Zapier_Enabled_Conditional::class ]; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return void - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - \add_action( 'wpseo_save_indexable', [ $this, 'maybe_call_zapier' ] ); - } - - /** - * Decides if Zapier should be triggered. - * - * Zapier should be triggered only if: - * - we have a connection established - * - the item is a post (in the Indexable sense, as opposed to taxonomies etc.) - * - the item status is 'publish' - * - we are not serving a REST request (to avoid triggering on the first request by the block editor) - * - if the item hasn't been sent before - * - if the post_date is recent (so we are not just updating a post published before enabling Zapier) - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param Indexable $indexable The indexable. - * - * @return void - */ - public function maybe_call_zapier( Indexable $indexable ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( ! $this->zapier_helper->is_connected() - || $indexable->object_type !== 'post' - || $indexable->post_status !== 'publish' - || \defined( 'REST_REQUEST' ) && \REST_REQUEST - || $this->meta_helper->get_value( 'zapier_trigger_sent', $indexable->object_id ) === '1' ) { - return; - } - - // All dates are GMT to prevent failing checks due to timezone differences. - $post = \get_post( $indexable->object_id ); - $published_datetime_gmt = \strtotime( $post->post_date_gmt . ' +0000' ); - $half_an_hour_ago_datetime_gmt = ( \time() - ( \MINUTE_IN_SECONDS * 30 ) ); - if ( ! $this->zapier_helper->is_post_type_supported( $post->post_type ) - || $published_datetime_gmt < $half_an_hour_ago_datetime_gmt ) { - return; - } - - $this->call_zapier( $indexable ); - } - - /** - * Sends a request to the Zapier trigger hook. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param Indexable $indexable The indexable. - * - * @return void - */ - public function call_zapier( Indexable $indexable ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - $trigger_url = $this->zapier_helper->get_trigger_url(); - $zapier_data = $this->zapier_helper->get_data_for_zapier( $indexable ); - - $response = \wp_remote_post( - $trigger_url, - [ - 'body' => $zapier_data, - ] - ); - - if ( ! $response instanceof WP_Error ) { - // Need to cast the new value to a string as booleans aren't supported. - $this->meta_helper->set_value( 'zapier_trigger_sent', '1', $indexable->object_id ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/third-party/zapier.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/third-party/zapier.php deleted file mode 100644 index c0ab4c65..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/third-party/zapier.php +++ /dev/null @@ -1,246 +0,0 @@ -asset_manager = $asset_manager; - $this->zapier_helper = $zapier_helper; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return void - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - // Add the Zapier toggle to the Integrations tab in the admin. - \add_action( 'Yoast\WP\SEO\admin_integration_after', [ $this, 'toggle_after' ] ); - \add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - \add_filter( 'wpseo_premium_integrations_page_data', [ $this, 'enhance_integrations_page_data' ] ); - } - - /** - * Enqueues the required assets. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return void - */ - public function enqueue_assets() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Date is not processed or saved. - if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'wpseo_integrations' ) { - return; - } - - $this->asset_manager->enqueue_style( 'monorepo' ); - } - - /** - * Returns additional content to be displayed after the Zapier toggle. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param Yoast_Feature_Toggle $integration The integration feature we've shown the toggle for. - * - * @return void - */ - public function toggle_after( $integration ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( $integration->setting !== 'zapier_integration_active' ) { - return; - } - if ( $this->zapier_helper->is_connected() ) { - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output is already escaped in function. - echo $this->get_connected_content(); - return; - } - - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output is already escaped in function. - echo $this->get_not_connected_content(); - } - - /** - * Returns additional content to be displayed when Zapier is connected. - * - * @return string The additional content. - */ - private function get_connected_content() { - $alert = new Alert_Presenter( - \sprintf( - /* translators: 1: Yoast SEO, 2: Zapier. */ - \esc_html__( '%1$s is successfully connected to %2$s!', 'wordpress-seo-premium' ), - 'Yoast SEO', - 'Zapier' - ), - 'success' - ); - - $output = '
              '; - $output .= $alert->present(); - $output .= '

              ' . \sprintf( - /* translators: %s: Zapier. */ - \esc_html__( 'Go to your %s Dashboard', 'wordpress-seo-premium' ), - 'Zapier' - ) . WPSEO_Admin_Utils::get_new_tab_message() . '

              '; - $output .= '

              ' . \sprintf( - /* translators: 1: Zapier, 2: The Zapier API Key. */ - \esc_html__( '%1$s uses this API Key: %2$s', 'wordpress-seo-premium' ), - 'Zapier', - '' . $this->zapier_helper->get_or_generate_zapier_api_key() . '' - ) . '

              '; - $output .= '

              '; - $output .= '
              '; - - return $output; - } - - /** - * Returns additional content to be displayed when Zapier is not connected. - * - * @return string The additional content. - */ - private function get_not_connected_content() { - $content = \sprintf( - /* translators: 1: Yoast SEO, 2: Zapier, 3: Emphasis open tag, 4: Emphasis close tag. */ - \esc_html__( '%1$s is not connected to %2$s. To set up a connection, make sure you click %3$sSave changes%4$s first, then copy the given API key below and use it to %3$screate%4$s and %3$sturn on%4$s a Zap within your %2$s account.', 'wordpress-seo-premium' ), - 'Yoast SEO', - 'Zapier', - '', - '' - ); - - $content .= '

              '; - $content .= ' ' . \sprintf( - /* translators: 1: Yoast SEO. */ - \esc_html__( 'Please note that you can only create 1 Zap with a trigger event from %1$s. Within this Zap you can choose one or more actions.', 'wordpress-seo-premium' ), - 'Yoast SEO' - ); - - $alert = new Alert_Presenter( - $content, - 'info' - ); - - $output = '
              '; - $output .= $alert->present(); - $output .= '
              '; - $output .= '
              '; - $output .= ''; - $output .= '
              '; - $output .= '
              '; - $output .= ''; - $output .= '
              '; - $output .= '
              '; - $output .= '
              '; - $output .= '

              ' . \sprintf( - /* translators: %s: Zapier. */ - \esc_html__( 'Create a Zap in %s', 'wordpress-seo-premium' ), - 'Zapier' - ) . WPSEO_Admin_Utils::get_new_tab_message() . '

              '; - $output .= '
              '; - - return $output; - } - - /** - * Enhances the array for the integrations page script with additional data. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param array $data The array to add data to. - * - * @return array The enhances data. - */ - public function enhance_integrations_page_data( $data ) { - \_deprecated_function( __METHOD__, 'WPSEO Premium 20.7' ); - - if ( ! \is_array( $data ) ) { - $data = [ $data ]; - } - - $data['zapierKey'] = $this->zapier_helper->get_or_generate_zapier_api_key(); - $data['zapierUrl'] = self::ZAPIER_DASHBOARD_URL; - $data['zapierIsConnected'] = $this->zapier_helper->is_connected(); - - return $data; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/watchers/premium-option-wpseo-watcher.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/watchers/premium-option-wpseo-watcher.php deleted file mode 100644 index b41ff557..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/watchers/premium-option-wpseo-watcher.php +++ /dev/null @@ -1,81 +0,0 @@ -options = $options; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return void - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - \add_action( 'update_option_wpseo', [ $this, 'check_zapier_option_disabled' ], 10, 2 ); - } - - /** - * Checks if the Zapier integration is disabled; if so, deletes the data. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param array $old_value The old value of the option. - * @param array $new_value The new value of the option. - * - * @return bool Whether the Zapier data has been deleted or not. - */ - public function check_zapier_option_disabled( $old_value, $new_value ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - if ( \array_key_exists( 'zapier_integration_active', $new_value ) - && $old_value['zapier_integration_active'] === true - && $new_value['zapier_integration_active'] === false ) { - $this->options->set( 'zapier_subscription', [] ); - $this->options->set( 'zapier_api_key', '' ); - return true; - } - return false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/watchers/zapier-apikey-reset-watcher.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/watchers/zapier-apikey-reset-watcher.php deleted file mode 100644 index 4daea920..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/integrations/watchers/zapier-apikey-reset-watcher.php +++ /dev/null @@ -1,89 +0,0 @@ -options = $options; - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * @deprecated 20.5 - * @codeCoverageIgnore - * - * @return array - */ - public static function get_conditionals() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.5' ); - - return [ Zapier_Enabled_Conditional::class ]; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @deprecated 20.5 - * @codeCoverageIgnore - * - * @return void - */ - public function register_hooks() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.5' ); - } - - /** - * Checks if the Zapier API key must be reset; if so, deletes the data. - * - * @deprecated 20.5 - * @codeCoverageIgnore - * - * @return bool Whether the Zapier data has been deleted or not. - */ - public function zapier_api_key_reset() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.5' ); - - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- The nonce is already validated. - if ( \current_user_can( 'manage_options' ) && isset( $_POST['zapier_api_key_reset'] ) && $_POST['zapier_api_key_reset'] === '1' ) { - $this->options->set( 'zapier_api_key', '' ); - $this->options->set( 'zapier_subscription', [] ); - - return true; - } - - return false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/routes/zapier-route.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/routes/zapier-route.php deleted file mode 100644 index 44d98ab9..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/routes/zapier-route.php +++ /dev/null @@ -1,323 +0,0 @@ -zapier_action = $zapier_action; - } - - /** - * Registers routes with WordPress. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return void - */ - public function register_routes() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - $subscribe_route_args = [ - 'methods' => 'POST', - 'args' => [ - 'url' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The callback URL to use.', - ], - 'api_key' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The API key to validate.', - ], - ], - 'callback' => [ $this, 'subscribe' ], - 'permission_callback' => '__return_true', - ]; - \register_rest_route( Main::API_V1_NAMESPACE, self::SUBSCRIBE_ROUTE, $subscribe_route_args ); - - $unsubscribe_route_args = [ - 'methods' => 'DELETE', - 'args' => [ - 'id' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The ID of the subscription to unsubscribe.', - ], - ], - 'callback' => [ $this, 'unsubscribe' ], - 'permission_callback' => '__return_true', - ]; - \register_rest_route( Main::API_V1_NAMESPACE, self::UNSUBSCRIBE_ROUTE, $unsubscribe_route_args ); - - $check_api_key_route_args = [ - 'methods' => 'POST', - 'args' => [ - 'api_key' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The API key to validate.', - ], - ], - 'callback' => [ $this, 'check_api_key' ], - 'permission_callback' => '__return_true', - ]; - \register_rest_route( Main::API_V1_NAMESPACE, self::CHECK_API_KEY_ROUTE, $check_api_key_route_args ); - - $perform_list_route_args = [ - 'methods' => 'GET', - 'args' => [ - 'api_key' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The API key to validate.', - ], - ], - 'callback' => [ $this, 'perform_list' ], - 'permission_callback' => '__return_true', - ]; - \register_rest_route( Main::API_V1_NAMESPACE, self::PERFORM_LIST, $perform_list_route_args ); - - $is_connected_route_args = [ - 'methods' => 'GET', - 'args' => [], - 'callback' => [ $this, 'is_connected' ], - 'permission_callback' => [ $this, 'check_permissions' ], - ]; - \register_rest_route( Main::API_V1_NAMESPACE, self::IS_CONNECTED, $is_connected_route_args ); - - $reset_api_key_route_args = [ - 'methods' => 'POST', - 'args' => [ - 'api_key' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The API key to reset.', - ], - ], - 'callback' => [ $this, 'reset_api_key' ], - 'permission_callback' => [ $this, 'check_permissions' ], - ]; - \register_rest_route( Main::API_V1_NAMESPACE, self::RESET_API_KEY, $reset_api_key_route_args ); - } - - /** - * Runs the subscribe action. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response The response of the subscribe action. - */ - public function subscribe( WP_REST_Request $request ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - $subscription = $this->zapier_action->subscribe( $request['url'], $request['api_key'] ); - $response = $subscription->data; - - if ( empty( $response ) && \property_exists( $subscription, 'message' ) ) { - $response = $subscription->message; - } - - return new WP_REST_Response( $response, $subscription->status ); - } - - /** - * Runs the unsubscribe action. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response The response of the unsubscribe action. - */ - public function unsubscribe( WP_REST_Request $request ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - $subscription = $this->zapier_action->unsubscribe( $request['id'] ); - - return new WP_REST_Response( $subscription->message, $subscription->status ); - } - - /** - * Runs the check_api_key action. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response The response of the check_api_key action. - */ - public function check_api_key( WP_REST_Request $request ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - $check = $this->zapier_action->check_api_key( $request['api_key'] ); - - return new WP_REST_Response( $check->message, $check->status ); - } - - /** - * Runs the perform_list action. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response The response of the perform_list action. - */ - public function perform_list( WP_REST_Request $request ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - $response = $this->zapier_action->perform_list( $request['api_key'] ); - - return new WP_REST_Response( $response->data, $response->status ); - } - - /** - * Runs the is_connected action. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return WP_REST_Response The response of the is_connected action. - */ - public function is_connected() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - $response = $this->zapier_action->is_connected(); - - return new WP_REST_Response( [ 'json' => $response->data ] ); - } - - /** - * Runs the reset_api_key action. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response The response of the reset_api_key action. - */ - public function reset_api_key( WP_REST_Request $request ) { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - $result = $this->zapier_action->reset_api_key( $request['api_key'] ); - - return new WP_REST_Response( [ 'json' => $result->data ] ); - } - - /** - * Checks if the user is authorised to query the connection status or reset the key. - * - * @deprecated 20.7 - * @codeCoverageIgnore Just a wrapper for a WordPress function. - * - * @return bool Whether the user is authorised to query the connection status or reset the key. - */ - public function check_permissions() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - return \current_user_can( 'wpseo_manage_options' ); - } - - /** - * Returns the conditionals based in which these routes should be active. - * - * @deprecated 20.7 - * @codeCoverageIgnore - * - * @return array The list of conditionals. - */ - public static function get_conditionals() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 20.7' ); - - return [ Zapier_Enabled_Conditional::class ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/schema-templates/block-patterns/block-pattern-categories.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/schema-templates/block-patterns/block-pattern-categories.php deleted file mode 100644 index 875f2d03..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/schema-templates/block-patterns/block-pattern-categories.php +++ /dev/null @@ -1,14 +0,0 @@ - '', - 'content' => '', - 'categories' => [], - 'keywords' => [], - ]; - } - - /** - * Gets the name of this block pattern. - * - * @deprecated 20.5 - * @codeCoverageIgnore - * - * @return string The name of this block pattern. - */ - abstract public function get_name(); - - /** - * Gets the title of this block pattern. - * - * @deprecated 20.5 - * @codeCoverageIgnore - * - * @return string The title of this block pattern. - */ - abstract public function get_title(); - - /** - * Gets the contents of this block pattern. - * - * @deprecated 20.5 - * @codeCoverageIgnore - * - * @return string The contents of this block pattern. - */ - abstract public function get_content(); - - /** - * Gets the categories of this block pattern. - * - * @deprecated 20.5 - * @codeCoverageIgnore - * - * @return string[] The categories of this block pattern. - */ - abstract public function get_categories(); - - /** - * Gets the keywords of this block pattern. - * - * @deprecated 20.5 - * @codeCoverageIgnore - * - * @return string[] The keywords of this block pattern. - */ - abstract public function get_keywords(); -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/schema-templates/block-patterns/job-posting-base-pattern.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/schema-templates/block-patterns/job-posting-base-pattern.php deleted file mode 100644 index eb77af6d..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/schema-templates/block-patterns/job-posting-base-pattern.php +++ /dev/null @@ -1,38 +0,0 @@ - -
              -
              - Employment - - - -
              Full time
              -
              - - - -
              - Base salary - - - -
              -
              USD 4000 / month
              -
              -
              -
              - - - -
              - - - -
              -
              -

              Our company is growing! And we’re searching for an ambitious employee! Do you believe that a hard work is fundamental for your business? If you do, we’re probably looking for you!

              - - - -

              About the job

              - - - -

              You’ll be part of an interdisciplinary team and together you’ll work on challenging, varied projects. You’ll get the freedom and responsibility to reach your full potential!

              - - - -

              About you

              - - - -

              Do you you have a passion for your job? Are you aware of current trends in your field? Do you love diving into details?

              - - - -

              We’re looking for someone who is proactive, patient and smart, has an eye for details, and is a great communicator and motivator. If you also have a sense of humor and an enthusiasm for participating in discussions, you’re probably a fit!

              - - - -

              To summarize

              • You enjoy working in a fast-paced team environment.
              • You don’t ever think “good enough” is good enough.
              • You are available for 40 hours per week.
              • You speak and write English fluently (preferably with at least proficiency level C1).
              - - - -

              What we’re offering

              • A challenging job in a fast-growing, dynamic, ambitious and international atmosphere.
              • 25 vacation days (on the base of 40 hours).
              • You’ll be able to spend 10% of your salary on education.
              • We have a really fun company culture with lots of team building activities.
              • Are you interested? Then please send your application to this@emailaddress.com before January 1, 2022. Do you have any questions? We’ll be happy to answer them.
              - - - -
              Apply before 
              -
              - - - -
              -
              -
              -
              350 5th Avenue
              - - - -
              New York
              - - - -
              NY 10118
              - - - -
              United States of America
              -
              -
              -
              -
              - '; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/schema-templates/block-patterns/job-posting-two-columns.php b/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/schema-templates/block-patterns/job-posting-two-columns.php deleted file mode 100644 index de334b04..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/deprecated/schema-templates/block-patterns/job-posting-two-columns.php +++ /dev/null @@ -1,155 +0,0 @@ - -
              -
              - Employment - - - -
              Full time
              -
              - - - -
              - Salary range - - - -
              -
              USD 1000 - 2000 / month
              -
              -
              - - - -
              - Location - - - -
              -
              -
              350 5th Avenue
              - - - -
              10118
              - - - -
              New York
              - - - -
              NY
              - - - -
              United States of America
              -
              -
              -
              -
              - - - -
              - - - -

              Our company is growing! And we’re searching for an ambitious employee! Do you believe that a hard work is fundamental for your business? If you do, we’re probably looking for you!

              - - - -

              About the job

              - - - -

              You’ll be part of a interdisciplinary team and together you’ll work on challenging, varied projects. You’ll get the freedom and responsibility to reach your full potential!

              - - - -

              About you

              - - - -

              Do you you have a passion for your job? Are you aware of current trends in your field? Do you love diving into details?

              - - - -

              We’re looking for someone who is proactive, patient and smart, has an eye for details, and is a great communicator and motivator. If you also have a sense of humor and an enthusiasm for participating in discussions, you’re probably a fit!

              - - - -

              Requirements

              • You enjoy working in a fast-paced team environment.
              • You don’t ever think “good enough” is good enough.
              • You are available for 40 hours per week.
              • You speak and write English fluently (preferably with at least proficiency level C1).
              - - - -

              Benefits

              • A challenging job in a fast-growing, dynamic, ambitious and international atmosphere.
              • 25 vacation days (on the base of 40 hours).
              • You’ll be able to spend 10% of your salary on education.
              • We have a really fun company culture with lots of team building activities.
              - - - -

              Are you interested? Then please send your application to this@emailaddress.com before January 1, 2022. Do you have any questions? We’ll be happy to answer them.

              - - - -
              Apply before 
              - - - -
              - - - -

              - '; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/exceptions/forbidden-property-mutation-exception.php b/wp/wp-content/plugins/wordpress-seo-premium/src/exceptions/forbidden-property-mutation-exception.php deleted file mode 100644 index 84f48592..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/exceptions/forbidden-property-mutation-exception.php +++ /dev/null @@ -1,34 +0,0 @@ -missing_licenses = $missing_licenses; - parent::__construct( $message, $code, $previous ); - } - - /** - * Gets the missing plugin licences. - * - * @return array The missing plugin licenses. - */ - public function get_missing_licenses() { - return $this->missing_licenses; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/exceptions/remote-request/remote-request-exception.php b/wp/wp-content/plugins/wordpress-seo-premium/src/exceptions/remote-request/remote-request-exception.php deleted file mode 100644 index cfae9cb0..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/exceptions/remote-request/remote-request-exception.php +++ /dev/null @@ -1,12 +0,0 @@ -load(); - } - } - else { - add_action( 'wpseo_loaded', 'YoastSEOPremium' ); - } - - return $main; -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/generated/container.php b/wp/wp-content/plugins/wordpress-seo-premium/src/generated/container.php deleted file mode 100644 index 4ace3372..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/generated/container.php +++ /dev/null @@ -1,1724 +0,0 @@ -services = []; - $this->normalizedIds = [ - 'wpseo_addon_manager' => 'WPSEO_Addon_Manager', - 'wpseo_admin_asset_manager' => 'WPSEO_Admin_Asset_Manager', - 'wpseo_premium_prominent_words_support' => 'WPSEO_Premium_Prominent_Words_Support', - 'wpseo_premium_prominent_words_unindexed_post_query' => 'WPSEO_Premium_Prominent_Words_Unindexed_Post_Query', - 'wpseo_shortlinker' => 'WPSEO_Shortlinker', - 'yoast\\wp\\lib\\migrations\\adapter' => 'Yoast\\WP\\Lib\\Migrations\\Adapter', - 'yoast\\wp\\seo\\actions\\indexing\\indexable_general_indexation_action' => 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action', - 'yoast\\wp\\seo\\actions\\indexing\\indexable_post_indexation_action' => 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action', - 'yoast\\wp\\seo\\actions\\indexing\\indexable_post_type_archive_indexation_action' => 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action', - 'yoast\\wp\\seo\\actions\\indexing\\indexable_term_indexation_action' => 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action', - 'yoast\\wp\\seo\\builders\\indexable_term_builder' => 'Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder', - 'yoast\\wp\\seo\\conditionals\\admin\\post_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional', - 'yoast\\wp\\seo\\conditionals\\admin\\posts_overview_or_ajax_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Posts_Overview_Or_Ajax_Conditional', - 'yoast\\wp\\seo\\conditionals\\admin\\yoast_admin_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Yoast_Admin_Conditional', - 'yoast\\wp\\seo\\conditionals\\admin_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Admin_Conditional', - 'yoast\\wp\\seo\\conditionals\\front_end_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Front_End_Conditional', - 'yoast\\wp\\seo\\conditionals\\migrations_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Migrations_Conditional', - 'yoast\\wp\\seo\\conditionals\\open_graph_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Open_Graph_Conditional', - 'yoast\\wp\\seo\\conditionals\\robots_txt_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Robots_Txt_Conditional', - 'yoast\\wp\\seo\\conditionals\\settings_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Settings_Conditional', - 'yoast\\wp\\seo\\conditionals\\third_party\\elementor_activated_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Activated_Conditional', - 'yoast\\wp\\seo\\conditionals\\third_party\\elementor_edit_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Edit_Conditional', - 'yoast\\wp\\seo\\conditionals\\user_profile_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\User_Profile_Conditional', - 'yoast\\wp\\seo\\conditionals\\wincher_enabled_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Wincher_Enabled_Conditional', - 'yoast\\wp\\seo\\config\\migration_status' => 'Yoast\\WP\\SEO\\Config\\Migration_Status', - 'yoast\\wp\\seo\\config\\migrations\\wpyoastpremiumimprovedinternallinking' => 'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastPremiumImprovedInternalLinking', - 'yoast\\wp\\seo\\helpers\\capability_helper' => 'Yoast\\WP\\SEO\\Helpers\\Capability_Helper', - 'yoast\\wp\\seo\\helpers\\current_page_helper' => 'Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper', - 'yoast\\wp\\seo\\helpers\\date_helper' => 'Yoast\\WP\\SEO\\Helpers\\Date_Helper', - 'yoast\\wp\\seo\\helpers\\indexable_helper' => 'Yoast\\WP\\SEO\\Helpers\\Indexable_Helper', - 'yoast\\wp\\seo\\helpers\\indexing_helper' => 'Yoast\\WP\\SEO\\Helpers\\Indexing_Helper', - 'yoast\\wp\\seo\\helpers\\language_helper' => 'Yoast\\WP\\SEO\\Helpers\\Language_Helper', - 'yoast\\wp\\seo\\helpers\\meta_helper' => 'Yoast\\WP\\SEO\\Helpers\\Meta_Helper', - 'yoast\\wp\\seo\\helpers\\options_helper' => 'Yoast\\WP\\SEO\\Helpers\\Options_Helper', - 'yoast\\wp\\seo\\helpers\\post_type_helper' => 'Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper', - 'yoast\\wp\\seo\\helpers\\request_helper' => 'Yoast\\WP\\SEO\\Helpers\\Request_Helper', - 'yoast\\wp\\seo\\helpers\\robots_helper' => 'Yoast\\WP\\SEO\\Helpers\\Robots_Helper', - 'yoast\\wp\\seo\\helpers\\score_icon_helper' => 'Yoast\\WP\\SEO\\Helpers\\Score_Icon_Helper', - 'yoast\\wp\\seo\\helpers\\social_profiles_helper' => 'Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper', - 'yoast\\wp\\seo\\helpers\\url_helper' => 'Yoast\\WP\\SEO\\Helpers\\Url_Helper', - 'yoast\\wp\\seo\\helpers\\user_helper' => 'Yoast\\WP\\SEO\\Helpers\\User_Helper', - 'yoast\\wp\\seo\\integrations\\admin\\admin_columns_cache_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration', - 'yoast\\wp\\seo\\integrations\\third_party\\translationspress' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\TranslationsPress', - 'yoast\\wp\\seo\\integrations\\third_party\\wincher_keyphrases' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher_Keyphrases', - 'yoast\\wp\\seo\\introductions\\infrastructure\\wistia_embed_permission_repository' => 'Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository', - 'yoast\\wp\\seo\\loader' => 'Yoast\\WP\\SEO\\Loader', - 'yoast\\wp\\seo\\memoizers\\meta_tags_context_memoizer' => 'Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer', - 'yoast\\wp\\seo\\premium\\actions\\ai_generator_action' => 'Yoast\\WP\\SEO\\Premium\\Actions\\AI_Generator_Action', - 'yoast\\wp\\seo\\premium\\actions\\link_suggestions_action' => 'Yoast\\WP\\SEO\\Premium\\Actions\\Link_Suggestions_Action', - 'yoast\\wp\\seo\\premium\\actions\\prominent_words\\complete_action' => 'Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Complete_Action', - 'yoast\\wp\\seo\\premium\\actions\\prominent_words\\content_action' => 'Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Content_Action', - 'yoast\\wp\\seo\\premium\\actions\\prominent_words\\save_action' => 'Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Save_Action', - 'yoast\\wp\\seo\\premium\\conditionals\\ai_editor_conditional' => 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Ai_Editor_Conditional', - 'yoast\\wp\\seo\\premium\\conditionals\\algolia_enabled_conditional' => 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Algolia_Enabled_Conditional', - 'yoast\\wp\\seo\\premium\\conditionals\\cornerstone_enabled_conditional' => 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Cornerstone_Enabled_Conditional', - 'yoast\\wp\\seo\\premium\\conditionals\\edd_conditional' => 'Yoast\\WP\\SEO\\Premium\\Conditionals\\EDD_Conditional', - 'yoast\\wp\\seo\\premium\\conditionals\\inclusive_language_enabled_conditional' => 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Inclusive_Language_Enabled_Conditional', - 'yoast\\wp\\seo\\premium\\conditionals\\term_overview_or_ajax_conditional' => 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Term_Overview_Or_Ajax_Conditional', - 'yoast\\wp\\seo\\premium\\conditionals\\yoast_admin_or_introductions_route_conditional' => 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Yoast_Admin_Or_Introductions_Route_Conditional', - 'yoast\\wp\\seo\\premium\\config\\badge_group_names' => 'Yoast\\WP\\SEO\\Premium\\Config\\Badge_Group_Names', - 'yoast\\wp\\seo\\premium\\config\\migrations\\addindexonindexableidandstem' => 'Yoast\\WP\\SEO\\Premium\\Config\\Migrations\\AddIndexOnIndexableIdAndStem', - 'yoast\\wp\\seo\\premium\\database\\migration_runner_premium' => 'Yoast\\WP\\SEO\\Premium\\Database\\Migration_Runner_Premium', - 'yoast\\wp\\seo\\premium\\helpers\\ai_generator_helper' => 'Yoast\\WP\\SEO\\Premium\\Helpers\\AI_Generator_Helper', - 'yoast\\wp\\seo\\premium\\helpers\\current_page_helper' => 'Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper', - 'yoast\\wp\\seo\\premium\\helpers\\prominent_words_helper' => 'Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper', - 'yoast\\wp\\seo\\premium\\helpers\\version_helper' => 'Yoast\\WP\\SEO\\Premium\\Helpers\\Version_Helper', - 'yoast\\wp\\seo\\premium\\initializers\\index_now_key' => 'Yoast\\WP\\SEO\\Premium\\Initializers\\Index_Now_Key', - 'yoast\\wp\\seo\\premium\\initializers\\introductions_initializer' => 'Yoast\\WP\\SEO\\Premium\\Initializers\\Introductions_Initializer', - 'yoast\\wp\\seo\\premium\\initializers\\plugin' => 'Yoast\\WP\\SEO\\Premium\\Initializers\\Plugin', - 'yoast\\wp\\seo\\premium\\initializers\\redirect_handler' => 'Yoast\\WP\\SEO\\Premium\\Initializers\\Redirect_Handler', - 'yoast\\wp\\seo\\premium\\initializers\\woocommerce' => 'Yoast\\WP\\SEO\\Premium\\Initializers\\Woocommerce', - 'yoast\\wp\\seo\\premium\\initializers\\wp_cli_initializer' => 'Yoast\\WP\\SEO\\Premium\\Initializers\\Wp_Cli_Initializer', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\ai_consent_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Ai_Consent_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\ai_generator_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Ai_Generator_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\cornerstone_column_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Cornerstone_Column_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\cornerstone_taxonomy_column_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Cornerstone_Taxonomy_Column_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\inclusive_language_column_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Column_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\inclusive_language_filter_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Filter_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\inclusive_language_taxonomy_column_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Taxonomy_Column_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\keyword_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Keyword_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\metabox_formatter_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Metabox_Formatter_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\plugin_links_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Plugin_Links_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\prominent_words\\indexing_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Prominent_Words\\Indexing_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\prominent_words\\metabox_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Prominent_Words\\Metabox_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\related_keyphrase_filter_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Related_Keyphrase_Filter_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\replacement_variables_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Replacement_Variables_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\settings_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Settings_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\thank_you_page_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Thank_You_Page_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\update_premium_notification' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Update_Premium_Notification', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\user_profile_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\User_Profile_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\admin\\workouts_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Workouts_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\alerts\\ai_generator_tip_notification' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Alerts\\Ai_Generator_Tip_Notification', - 'yoast\\wp\\seo\\premium\\integrations\\blocks\\estimated_reading_time_block' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Estimated_Reading_Time_Block', - 'yoast\\wp\\seo\\premium\\integrations\\blocks\\related_links_block' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Related_Links_Block', - 'yoast\\wp\\seo\\premium\\integrations\\cleanup_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Cleanup_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\front_end\\robots_txt_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Front_End\\Robots_Txt_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\frontend_inspector' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Frontend_Inspector', - 'yoast\\wp\\seo\\premium\\integrations\\index_now_ping' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Index_Now_Ping', - 'yoast\\wp\\seo\\premium\\integrations\\missing_indexables_count_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Missing_Indexables_Count_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\opengraph_author_archive' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Author_Archive', - 'yoast\\wp\\seo\\premium\\integrations\\opengraph_date_archive' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Date_Archive', - 'yoast\\wp\\seo\\premium\\integrations\\opengraph_post_type' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Post_Type', - 'yoast\\wp\\seo\\premium\\integrations\\opengraph_posttype_archive' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_PostType_Archive', - 'yoast\\wp\\seo\\premium\\integrations\\opengraph_term_archive' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Term_Archive', - 'yoast\\wp\\seo\\premium\\integrations\\organization_schema_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Organization_Schema_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\publishing_principles_schema_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Publishing_Principles_Schema_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\routes\\ai_generator_route' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Routes\\AI_Generator_Route', - 'yoast\\wp\\seo\\premium\\integrations\\routes\\workouts_routes_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Routes\\Workouts_Routes_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\third_party\\algolia' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Algolia', - 'yoast\\wp\\seo\\premium\\integrations\\third_party\\edd' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\EDD', - 'yoast\\wp\\seo\\premium\\integrations\\third_party\\elementor_premium' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Elementor_Premium', - 'yoast\\wp\\seo\\premium\\integrations\\third_party\\elementor_preview' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Elementor_Preview', - 'yoast\\wp\\seo\\premium\\integrations\\third_party\\mastodon' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Mastodon', - 'yoast\\wp\\seo\\premium\\integrations\\upgrade_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Upgrade_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\user_profile_integration' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\User_Profile_Integration', - 'yoast\\wp\\seo\\premium\\integrations\\watchers\\prominent_words_watcher' => 'Yoast\\WP\\SEO\\Premium\\Integrations\\Watchers\\Prominent_Words_Watcher', - 'yoast\\wp\\seo\\premium\\introductions\\application\\ai_generate_titles_and_descriptions_introduction' => 'Yoast\\WP\\SEO\\Premium\\Introductions\\Application\\Ai_Generate_Titles_And_Descriptions_Introduction', - 'yoast\\wp\\seo\\premium\\main' => 'Yoast\\WP\\SEO\\Premium\\Main', - 'yoast\\wp\\seo\\premium\\repositories\\prominent_words_repository' => 'Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository', - 'yoast\\wp\\seo\\premium\\routes\\link_suggestions_route' => 'Yoast\\WP\\SEO\\Premium\\Routes\\Link_Suggestions_Route', - 'yoast\\wp\\seo\\premium\\routes\\prominent_words_route' => 'Yoast\\WP\\SEO\\Premium\\Routes\\Prominent_Words_Route', - 'yoast\\wp\\seo\\premium\\routes\\workouts_route' => 'Yoast\\WP\\SEO\\Premium\\Routes\\Workouts_Route', - 'yoast\\wp\\seo\\premium\\surfaces\\helpers_surface' => 'Yoast\\WP\\SEO\\Premium\\Surfaces\\Helpers_Surface', - 'yoast\\wp\\seo\\repositories\\indexable_cleanup_repository' => 'Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository', - 'yoast\\wp\\seo\\repositories\\indexable_repository' => 'Yoast\\WP\\SEO\\Repositories\\Indexable_Repository', - 'yoast\\wp\\seo\\repositories\\seo_links_repository' => 'Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository', - 'yoast\\wp\\seo\\surfaces\\classes_surface' => 'Yoast\\WP\\SEO\\Surfaces\\Classes_Surface', - 'yoast\\wp\\seo\\surfaces\\helpers_surface' => 'Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface', - 'yoast\\wp\\seo\\surfaces\\meta_surface' => 'Yoast\\WP\\SEO\\Surfaces\\Meta_Surface', - 'yoast\\wp\\seo\\surfaces\\open_graph_helpers_surface' => 'Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface', - 'yoast\\wp\\seo\\surfaces\\schema_helpers_surface' => 'Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface', - 'yoast\\wp\\seo\\surfaces\\twitter_helpers_surface' => 'Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface', - 'yoastseo_vendor\\symfony\\component\\dependencyinjection\\containerinterface' => 'YoastSEO_Vendor\\YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface', - ]; - $this->methodMap = [ - 'WPSEO_Addon_Manager' => 'getWPSEOAddonManagerService', - 'WPSEO_Admin_Asset_Manager' => 'getWPSEOAdminAssetManagerService', - 'WPSEO_Premium_Prominent_Words_Support' => 'getWPSEOPremiumProminentWordsSupportService', - 'WPSEO_Premium_Prominent_Words_Unindexed_Post_Query' => 'getWPSEOPremiumProminentWordsUnindexedPostQueryService', - 'WPSEO_Shortlinker' => 'getWPSEOShortlinkerService', - 'Yoast\\WP\\Lib\\Migrations\\Adapter' => 'getAdapterService', - 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action' => 'getIndexableGeneralIndexationActionService', - 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action' => 'getIndexablePostIndexationActionService', - 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action' => 'getIndexablePostTypeArchiveIndexationActionService', - 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action' => 'getIndexableTermIndexationActionService', - 'Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder' => 'getIndexableTermBuilderService', - 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional' => 'getPostConditionalService', - 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Posts_Overview_Or_Ajax_Conditional' => 'getPostsOverviewOrAjaxConditionalService', - 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Yoast_Admin_Conditional' => 'getYoastAdminConditionalService', - 'Yoast\\WP\\SEO\\Conditionals\\Admin_Conditional' => 'getAdminConditionalService', - 'Yoast\\WP\\SEO\\Conditionals\\Front_End_Conditional' => 'getFrontEndConditionalService', - 'Yoast\\WP\\SEO\\Conditionals\\Migrations_Conditional' => 'getMigrationsConditionalService', - 'Yoast\\WP\\SEO\\Conditionals\\Open_Graph_Conditional' => 'getOpenGraphConditionalService', - 'Yoast\\WP\\SEO\\Conditionals\\Robots_Txt_Conditional' => 'getRobotsTxtConditionalService', - 'Yoast\\WP\\SEO\\Conditionals\\Settings_Conditional' => 'getSettingsConditionalService', - 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Activated_Conditional' => 'getElementorActivatedConditionalService', - 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Edit_Conditional' => 'getElementorEditConditionalService', - 'Yoast\\WP\\SEO\\Conditionals\\User_Profile_Conditional' => 'getUserProfileConditionalService', - 'Yoast\\WP\\SEO\\Conditionals\\Wincher_Enabled_Conditional' => 'getWincherEnabledConditionalService', - 'Yoast\\WP\\SEO\\Config\\Migration_Status' => 'getMigrationStatusService', - 'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastPremiumImprovedInternalLinking' => 'getWpYoastPremiumImprovedInternalLinkingService', - 'Yoast\\WP\\SEO\\Helpers\\Capability_Helper' => 'getCapabilityHelperService', - 'Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper' => 'getCurrentPageHelperService', - 'Yoast\\WP\\SEO\\Helpers\\Date_Helper' => 'getDateHelperService', - 'Yoast\\WP\\SEO\\Helpers\\Indexable_Helper' => 'getIndexableHelperService', - 'Yoast\\WP\\SEO\\Helpers\\Indexing_Helper' => 'getIndexingHelperService', - 'Yoast\\WP\\SEO\\Helpers\\Language_Helper' => 'getLanguageHelperService', - 'Yoast\\WP\\SEO\\Helpers\\Meta_Helper' => 'getMetaHelperService', - 'Yoast\\WP\\SEO\\Helpers\\Options_Helper' => 'getOptionsHelperService', - 'Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper' => 'getPostTypeHelperService', - 'Yoast\\WP\\SEO\\Helpers\\Request_Helper' => 'getRequestHelperService', - 'Yoast\\WP\\SEO\\Helpers\\Robots_Helper' => 'getRobotsHelperService', - 'Yoast\\WP\\SEO\\Helpers\\Score_Icon_Helper' => 'getScoreIconHelperService', - 'Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper' => 'getSocialProfilesHelperService', - 'Yoast\\WP\\SEO\\Helpers\\Url_Helper' => 'getUrlHelperService', - 'Yoast\\WP\\SEO\\Helpers\\User_Helper' => 'getUserHelperService', - 'Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration' => 'getAdminColumnsCacheIntegrationService', - 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\TranslationsPress' => 'getTranslationsPressService', - 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher_Keyphrases' => 'getWincherKeyphrasesService', - 'Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository' => 'getWistiaEmbedPermissionRepositoryService', - 'Yoast\\WP\\SEO\\Loader' => 'getLoaderService', - 'Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer' => 'getMetaTagsContextMemoizerService', - 'Yoast\\WP\\SEO\\Premium\\Actions\\AI_Generator_Action' => 'getAIGeneratorActionService', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Link_Suggestions_Action' => 'getLinkSuggestionsActionService', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Complete_Action' => 'getCompleteActionService', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Content_Action' => 'getContentActionService', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Save_Action' => 'getSaveActionService', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Ai_Editor_Conditional' => 'getAiEditorConditionalService', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Algolia_Enabled_Conditional' => 'getAlgoliaEnabledConditionalService', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Cornerstone_Enabled_Conditional' => 'getCornerstoneEnabledConditionalService', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\EDD_Conditional' => 'getEDDConditionalService', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Inclusive_Language_Enabled_Conditional' => 'getInclusiveLanguageEnabledConditionalService', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Term_Overview_Or_Ajax_Conditional' => 'getTermOverviewOrAjaxConditionalService', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Yoast_Admin_Or_Introductions_Route_Conditional' => 'getYoastAdminOrIntroductionsRouteConditionalService', - 'Yoast\\WP\\SEO\\Premium\\Config\\Badge_Group_Names' => 'getBadgeGroupNamesService', - 'Yoast\\WP\\SEO\\Premium\\Config\\Migrations\\AddIndexOnIndexableIdAndStem' => 'getAddIndexOnIndexableIdAndStemService', - 'Yoast\\WP\\SEO\\Premium\\Database\\Migration_Runner_Premium' => 'getMigrationRunnerPremiumService', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\AI_Generator_Helper' => 'getAIGeneratorHelperService', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper' => 'getCurrentPageHelper2Service', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper' => 'getProminentWordsHelperService', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\Version_Helper' => 'getVersionHelperService', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Index_Now_Key' => 'getIndexNowKeyService', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Introductions_Initializer' => 'getIntroductionsInitializerService', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Plugin' => 'getPluginService', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Redirect_Handler' => 'getRedirectHandlerService', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Woocommerce' => 'getWoocommerceService', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Wp_Cli_Initializer' => 'getWpCliInitializerService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Ai_Consent_Integration' => 'getAiConsentIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Ai_Generator_Integration' => 'getAiGeneratorIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Cornerstone_Column_Integration' => 'getCornerstoneColumnIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Cornerstone_Taxonomy_Column_Integration' => 'getCornerstoneTaxonomyColumnIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Column_Integration' => 'getInclusiveLanguageColumnIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Filter_Integration' => 'getInclusiveLanguageFilterIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Taxonomy_Column_Integration' => 'getInclusiveLanguageTaxonomyColumnIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Keyword_Integration' => 'getKeywordIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Metabox_Formatter_Integration' => 'getMetaboxFormatterIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Plugin_Links_Integration' => 'getPluginLinksIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Prominent_Words\\Indexing_Integration' => 'getIndexingIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Prominent_Words\\Metabox_Integration' => 'getMetaboxIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Related_Keyphrase_Filter_Integration' => 'getRelatedKeyphraseFilterIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Replacement_Variables_Integration' => 'getReplacementVariablesIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Settings_Integration' => 'getSettingsIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Thank_You_Page_Integration' => 'getThankYouPageIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Update_Premium_Notification' => 'getUpdatePremiumNotificationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\User_Profile_Integration' => 'getUserProfileIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Workouts_Integration' => 'getWorkoutsIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Alerts\\Ai_Generator_Tip_Notification' => 'getAiGeneratorTipNotificationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Estimated_Reading_Time_Block' => 'getEstimatedReadingTimeBlockService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Related_Links_Block' => 'getRelatedLinksBlockService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Cleanup_Integration' => 'getCleanupIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Front_End\\Robots_Txt_Integration' => 'getRobotsTxtIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Frontend_Inspector' => 'getFrontendInspectorService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Index_Now_Ping' => 'getIndexNowPingService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Missing_Indexables_Count_Integration' => 'getMissingIndexablesCountIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Author_Archive' => 'getOpenGraphAuthorArchiveService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Date_Archive' => 'getOpenGraphDateArchiveService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_PostType_Archive' => 'getOpenGraphPostTypeArchiveService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Post_Type' => 'getOpenGraphPostTypeService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Term_Archive' => 'getOpenGraphTermArchiveService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Organization_Schema_Integration' => 'getOrganizationSchemaIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Publishing_Principles_Schema_Integration' => 'getPublishingPrinciplesSchemaIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Routes\\AI_Generator_Route' => 'getAIGeneratorRouteService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Routes\\Workouts_Routes_Integration' => 'getWorkoutsRoutesIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Algolia' => 'getAlgoliaService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\EDD' => 'getEDDService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Elementor_Premium' => 'getElementorPremiumService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Elementor_Preview' => 'getElementorPreviewService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Mastodon' => 'getMastodonService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Upgrade_Integration' => 'getUpgradeIntegrationService', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\User_Profile_Integration' => 'getUserProfileIntegration2Service', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Watchers\\Prominent_Words_Watcher' => 'getProminentWordsWatcherService', - 'Yoast\\WP\\SEO\\Premium\\Introductions\\Application\\Ai_Generate_Titles_And_Descriptions_Introduction' => 'getAiGenerateTitlesAndDescriptionsIntroductionService', - 'Yoast\\WP\\SEO\\Premium\\Main' => 'getMainService', - 'Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository' => 'getProminentWordsRepositoryService', - 'Yoast\\WP\\SEO\\Premium\\Routes\\Link_Suggestions_Route' => 'getLinkSuggestionsRouteService', - 'Yoast\\WP\\SEO\\Premium\\Routes\\Prominent_Words_Route' => 'getProminentWordsRouteService', - 'Yoast\\WP\\SEO\\Premium\\Routes\\Workouts_Route' => 'getWorkoutsRouteService', - 'Yoast\\WP\\SEO\\Premium\\Surfaces\\Helpers_Surface' => 'getHelpersSurfaceService', - 'Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository' => 'getIndexableCleanupRepositoryService', - 'Yoast\\WP\\SEO\\Repositories\\Indexable_Repository' => 'getIndexableRepositoryService', - 'Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository' => 'getSEOLinksRepositoryService', - 'Yoast\\WP\\SEO\\Surfaces\\Classes_Surface' => 'getClassesSurfaceService', - 'Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface' => 'getHelpersSurface2Service', - 'Yoast\\WP\\SEO\\Surfaces\\Meta_Surface' => 'getMetaSurfaceService', - 'Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface' => 'getOpenGraphHelpersSurfaceService', - 'Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface' => 'getSchemaHelpersSurfaceService', - 'Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface' => 'getTwitterHelpersSurfaceService', - 'wpdb' => 'getWpdbService', - ]; - $this->privates = [ - 'YoastSEO_Vendor\\YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => true, - ]; - $this->aliases = [ - 'YoastSEO_Vendor\\YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => 'service_container', - ]; - } - - public function getRemovedIds() - { - return [ - 'Psr\\Container\\ContainerInterface' => true, - 'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => true, - 'YoastSEO_Vendor\\YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => true, - 'autowired.Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Introductions_Seen_Repository' => true, - ]; - } - - public function compile() - { - throw new LogicException('You cannot compile a dumped container that was already compiled.'); - } - - public function isCompiled() - { - return true; - } - - public function isFrozen() - { - @trigger_error(sprintf('The %s() method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the isCompiled() method instead.', __METHOD__), E_USER_DEPRECATED); - - return true; - } - - /** - * Gets the public 'WPSEO_Addon_Manager' shared service. - * - * @return \WPSEO_Addon_Manager - */ - protected function getWPSEOAddonManagerService() - { - return $this->services['WPSEO_Addon_Manager'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'WPSEO_Addon_Manager'); - } - - /** - * Gets the public 'WPSEO_Admin_Asset_Manager' shared service. - * - * @return \WPSEO_Admin_Asset_Manager - */ - protected function getWPSEOAdminAssetManagerService() - { - return $this->services['WPSEO_Admin_Asset_Manager'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'WPSEO_Admin_Asset_Manager'); - } - - /** - * Gets the public 'WPSEO_Premium_Prominent_Words_Support' shared service. - * - * @return \WPSEO_Premium_Prominent_Words_Support - */ - protected function getWPSEOPremiumProminentWordsSupportService() - { - return $this->services['WPSEO_Premium_Prominent_Words_Support'] = \Yoast\WP\SEO\Premium\WordPress\Wrapper::get_prominent_words_support(); - } - - /** - * Gets the public 'WPSEO_Premium_Prominent_Words_Unindexed_Post_Query' shared service. - * - * @return \WPSEO_Premium_Prominent_Words_Unindexed_Post_Query - */ - protected function getWPSEOPremiumProminentWordsUnindexedPostQueryService() - { - return $this->services['WPSEO_Premium_Prominent_Words_Unindexed_Post_Query'] = \Yoast\WP\SEO\Premium\WordPress\Wrapper::get_prominent_words_unindex_post_query(); - } - - /** - * Gets the public 'WPSEO_Shortlinker' shared service. - * - * @return \WPSEO_Shortlinker - */ - protected function getWPSEOShortlinkerService() - { - return $this->services['WPSEO_Shortlinker'] = \Yoast\WP\SEO\Premium\WordPress\Wrapper::get_shortlinker(); - } - - /** - * Gets the public 'Yoast\WP\Lib\Migrations\Adapter' shared service. - * - * @return \Yoast\WP\Lib\Migrations\Adapter - */ - protected function getAdapterService() - { - return $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\Lib\\Migrations\\Adapter'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Actions\Indexing\Indexable_General_Indexation_Action' shared service. - * - * @return \Yoast\WP\SEO\Actions\Indexing\Indexable_General_Indexation_Action - */ - protected function getIndexableGeneralIndexationActionService() - { - return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Indexation_Action' shared service. - * - * @return \Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Indexation_Action - */ - protected function getIndexablePostIndexationActionService() - { - return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Type_Archive_Indexation_Action' shared service. - * - * @return \Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Type_Archive_Indexation_Action - */ - protected function getIndexablePostTypeArchiveIndexationActionService() - { - return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Actions\Indexing\Indexable_Term_Indexation_Action' shared service. - * - * @return \Yoast\WP\SEO\Actions\Indexing\Indexable_Term_Indexation_Action - */ - protected function getIndexableTermIndexationActionService() - { - return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Builders\Indexable_Term_Builder' shared service. - * - * @return \Yoast\WP\SEO\Builders\Indexable_Term_Builder - */ - protected function getIndexableTermBuilderService() - { - return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Conditionals\Admin\Post_Conditional' shared service. - * - * @return \Yoast\WP\SEO\Conditionals\Admin\Post_Conditional - */ - protected function getPostConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Conditionals\Admin\Posts_Overview_Or_Ajax_Conditional' shared service. - * - * @return \Yoast\WP\SEO\Conditionals\Admin\Posts_Overview_Or_Ajax_Conditional - */ - protected function getPostsOverviewOrAjaxConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Posts_Overview_Or_Ajax_Conditional'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Posts_Overview_Or_Ajax_Conditional'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Conditionals\Admin\Yoast_Admin_Conditional' shared service. - * - * @return \Yoast\WP\SEO\Conditionals\Admin\Yoast_Admin_Conditional - */ - protected function getYoastAdminConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Yoast_Admin_Conditional'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Yoast_Admin_Conditional'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Conditionals\Admin_Conditional' shared service. - * - * @return \Yoast\WP\SEO\Conditionals\Admin_Conditional - */ - protected function getAdminConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin_Conditional'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Conditionals\\Admin_Conditional'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Conditionals\Front_End_Conditional' shared service. - * - * @return \Yoast\WP\SEO\Conditionals\Front_End_Conditional - */ - protected function getFrontEndConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Conditionals\\Front_End_Conditional'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Conditionals\\Front_End_Conditional'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Conditionals\Migrations_Conditional' shared service. - * - * @return \Yoast\WP\SEO\Conditionals\Migrations_Conditional - */ - protected function getMigrationsConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Conditionals\\Migrations_Conditional'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Conditionals\\Migrations_Conditional'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Conditionals\Open_Graph_Conditional' shared service. - * - * @return \Yoast\WP\SEO\Conditionals\Open_Graph_Conditional - */ - protected function getOpenGraphConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Conditionals\\Open_Graph_Conditional'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Conditionals\\Open_Graph_Conditional'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Conditionals\Robots_Txt_Conditional' shared service. - * - * @return \Yoast\WP\SEO\Conditionals\Robots_Txt_Conditional - */ - protected function getRobotsTxtConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Conditionals\\Robots_Txt_Conditional'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Conditionals\\Robots_Txt_Conditional'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Conditionals\Settings_Conditional' shared service. - * - * @return \Yoast\WP\SEO\Conditionals\Settings_Conditional - */ - protected function getSettingsConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Conditionals\\Settings_Conditional'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Conditionals\\Settings_Conditional'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Conditionals\Third_Party\Elementor_Activated_Conditional' shared service. - * - * @return \Yoast\WP\SEO\Conditionals\Third_Party\Elementor_Activated_Conditional - */ - protected function getElementorActivatedConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Activated_Conditional'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Activated_Conditional'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Conditionals\Third_Party\Elementor_Edit_Conditional' shared service. - * - * @return \Yoast\WP\SEO\Conditionals\Third_Party\Elementor_Edit_Conditional - */ - protected function getElementorEditConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Edit_Conditional'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Edit_Conditional'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Conditionals\User_Profile_Conditional' shared service. - * - * @return \Yoast\WP\SEO\Conditionals\User_Profile_Conditional - */ - protected function getUserProfileConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Conditionals\\User_Profile_Conditional'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Conditionals\\User_Profile_Conditional'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Conditionals\Wincher_Enabled_Conditional' shared service. - * - * @return \Yoast\WP\SEO\Conditionals\Wincher_Enabled_Conditional - */ - protected function getWincherEnabledConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Conditionals\\Wincher_Enabled_Conditional'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Conditionals\\Wincher_Enabled_Conditional'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Config\Migration_Status' shared service. - * - * @return \Yoast\WP\SEO\Config\Migration_Status - */ - protected function getMigrationStatusService() - { - return $this->services['Yoast\\WP\\SEO\\Config\\Migration_Status'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Config\\Migration_Status'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Config\Migrations\WpYoastPremiumImprovedInternalLinking' shared autowired service. - * - * @return \Yoast\WP\SEO\Config\Migrations\WpYoastPremiumImprovedInternalLinking - */ - protected function getWpYoastPremiumImprovedInternalLinkingService() - { - return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastPremiumImprovedInternalLinking'] = new \Yoast\WP\SEO\Config\Migrations\WpYoastPremiumImprovedInternalLinking(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : $this->getAdapterService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Capability_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Capability_Helper - */ - protected function getCapabilityHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Capability_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Capability_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Current_Page_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Current_Page_Helper - */ - protected function getCurrentPageHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Date_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Date_Helper - */ - protected function getDateHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Date_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Indexable_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Indexable_Helper - */ - protected function getIndexableHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Indexing_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Indexing_Helper - */ - protected function getIndexingHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Language_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Language_Helper - */ - protected function getLanguageHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Language_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Language_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Meta_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Meta_Helper - */ - protected function getMetaHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Meta_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Options_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Options_Helper - */ - protected function getOptionsHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Options_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Post_Type_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Post_Type_Helper - */ - protected function getPostTypeHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Request_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Request_Helper - */ - protected function getRequestHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Request_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Request_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Robots_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Robots_Helper - */ - protected function getRobotsHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Robots_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Score_Icon_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Score_Icon_Helper - */ - protected function getScoreIconHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Score_Icon_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Score_Icon_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Social_Profiles_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Social_Profiles_Helper - */ - protected function getSocialProfilesHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\Url_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\Url_Helper - */ - protected function getUrlHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\Url_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Helpers\User_Helper' shared service. - * - * @return \Yoast\WP\SEO\Helpers\User_Helper - */ - protected function getUserHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Helpers\\User_Helper'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Admin_Columns_Cache_Integration' shared service. - * - * @return \Yoast\WP\SEO\Integrations\Admin\Admin_Columns_Cache_Integration - */ - protected function getAdminColumnsCacheIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\TranslationsPress' shared autowired service. - * - * @return \Yoast\WP\SEO\Integrations\Third_Party\TranslationsPress - */ - protected function getTranslationsPressService() - { - return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\TranslationsPress'] = new \Yoast\WP\SEO\Integrations\Third_Party\TranslationsPress(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] : $this->getDateHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\Wincher_Keyphrases' shared autowired service. - * - * @return \Yoast\WP\SEO\Integrations\Third_Party\Wincher_Keyphrases - */ - protected function getWincherKeyphrasesService() - { - return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher_Keyphrases'] = new \Yoast\WP\SEO\Integrations\Third_Party\Wincher_Keyphrases(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Introductions\Infrastructure\Wistia_Embed_Permission_Repository' shared service. - * - * @return \Yoast\WP\SEO\Introductions\Infrastructure\Wistia_Embed_Permission_Repository - */ - protected function getWistiaEmbedPermissionRepositoryService() - { - return $this->services['Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Loader' shared autowired service. - * - * @return \Yoast\WP\SEO\Loader - */ - protected function getLoaderService() - { - $this->services['Yoast\\WP\\SEO\\Loader'] = $instance = new \Yoast\WP\SEO\Loader($this); - - $instance->register_migration('premium', '20190715101200', 'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastPremiumImprovedInternalLinking'); - $instance->register_migration('premium', '20210827093024', 'Yoast\\WP\\SEO\\Premium\\Config\\Migrations\\AddIndexOnIndexableIdAndStem'); - $instance->register_initializer('Yoast\\WP\\SEO\\Premium\\Database\\Migration_Runner_Premium'); - $instance->register_initializer('Yoast\\WP\\SEO\\Premium\\Initializers\\Index_Now_Key'); - $instance->register_initializer('Yoast\\WP\\SEO\\Premium\\Initializers\\Introductions_Initializer'); - $instance->register_initializer('Yoast\\WP\\SEO\\Premium\\Initializers\\Plugin'); - $instance->register_initializer('Yoast\\WP\\SEO\\Premium\\Initializers\\Redirect_Handler'); - $instance->register_initializer('Yoast\\WP\\SEO\\Premium\\Initializers\\Woocommerce'); - $instance->register_initializer('Yoast\\WP\\SEO\\Premium\\Initializers\\Wp_Cli_Initializer'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Ai_Consent_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Ai_Generator_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Cornerstone_Column_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Cornerstone_Taxonomy_Column_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Column_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Filter_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Taxonomy_Column_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Keyword_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Metabox_Formatter_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Plugin_Links_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Prominent_Words\\Indexing_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Prominent_Words\\Metabox_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Related_Keyphrase_Filter_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Replacement_Variables_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Settings_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Thank_You_Page_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Update_Premium_Notification'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\User_Profile_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Workouts_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Alerts\\Ai_Generator_Tip_Notification'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Estimated_Reading_Time_Block'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Related_Links_Block'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Cleanup_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Front_End\\Robots_Txt_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Frontend_Inspector'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Index_Now_Ping'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Missing_Indexables_Count_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Author_Archive'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Date_Archive'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Post_Type'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_PostType_Archive'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Term_Archive'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Organization_Schema_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Publishing_Principles_Schema_Integration'); - $instance->register_route('Yoast\\WP\\SEO\\Premium\\Integrations\\Routes\\AI_Generator_Route'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Routes\\Workouts_Routes_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Algolia'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\EDD'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Elementor_Premium'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Elementor_Preview'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Mastodon'); - $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\TranslationsPress'); - $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher_Keyphrases'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Upgrade_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\User_Profile_Integration'); - $instance->register_integration('Yoast\\WP\\SEO\\Premium\\Integrations\\Watchers\\Prominent_Words_Watcher'); - $instance->register_route('Yoast\\WP\\SEO\\Premium\\Routes\\Link_Suggestions_Route'); - $instance->register_route('Yoast\\WP\\SEO\\Premium\\Routes\\Prominent_Words_Route'); - $instance->register_route('Yoast\\WP\\SEO\\Premium\\Routes\\Workouts_Route'); - - return $instance; - } - - /** - * Gets the public 'Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer' shared service. - * - * @return \Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer - */ - protected function getMetaTagsContextMemoizerService() - { - return $this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Actions\AI_Generator_Action' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Actions\AI_Generator_Action - */ - protected function getAIGeneratorActionService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\AI_Generator_Action'] = new \Yoast\WP\SEO\Premium\Actions\AI_Generator_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\AI_Generator_Helper']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\AI_Generator_Helper'] : $this->getAIGeneratorHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : $this->getUserHelperService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Addon_Manager']) ? $this->services['WPSEO_Addon_Manager'] : $this->getWPSEOAddonManagerService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Actions\Link_Suggestions_Action' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Actions\Link_Suggestions_Action - */ - protected function getLinkSuggestionsActionService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Link_Suggestions_Action'] = new \Yoast\WP\SEO\Premium\Actions\Link_Suggestions_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository'] : ($this->services['Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository'] = new \Yoast\WP\SEO\Premium\Repositories\Prominent_Words_Repository())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper'] : $this->getProminentWordsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Premium_Prominent_Words_Support']) ? $this->services['WPSEO_Premium_Prominent_Words_Support'] : $this->getWPSEOPremiumProminentWordsSupportService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository'] : $this->getSEOLinksRepositoryService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Actions\Prominent_Words\Complete_Action' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Actions\Prominent_Words\Complete_Action - */ - protected function getCompleteActionService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Complete_Action'] = new \Yoast\WP\SEO\Premium\Actions\Prominent_Words\Complete_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper'] : $this->getProminentWordsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Actions\Prominent_Words\Content_Action' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Actions\Prominent_Words\Content_Action - */ - protected function getContentActionService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Content_Action'] = new \Yoast\WP\SEO\Premium\Actions\Prominent_Words\Content_Action(${($_ = isset($this->services['WPSEO_Premium_Prominent_Words_Support']) ? $this->services['WPSEO_Premium_Prominent_Words_Support'] : $this->getWPSEOPremiumProminentWordsSupportService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer']) ? $this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer'] : $this->getMetaTagsContextMemoizerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper'] : $this->getMetaHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Actions\Prominent_Words\Save_Action' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Actions\Prominent_Words\Save_Action - */ - protected function getSaveActionService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Save_Action'] = new \Yoast\WP\SEO\Premium\Actions\Prominent_Words\Save_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository'] : ($this->services['Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository'] = new \Yoast\WP\SEO\Premium\Repositories\Prominent_Words_Repository())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper'] : $this->getProminentWordsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Conditionals\Ai_Editor_Conditional' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Conditionals\Ai_Editor_Conditional - */ - protected function getAiEditorConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Conditionals\\Ai_Editor_Conditional'] = new \Yoast\WP\SEO\Premium\Conditionals\Ai_Editor_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional'] : $this->getPostConditionalService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Conditionals\Algolia_Enabled_Conditional' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Conditionals\Algolia_Enabled_Conditional - */ - protected function getAlgoliaEnabledConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Conditionals\\Algolia_Enabled_Conditional'] = new \Yoast\WP\SEO\Premium\Conditionals\Algolia_Enabled_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Conditionals\Cornerstone_Enabled_Conditional' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Conditionals\Cornerstone_Enabled_Conditional - */ - protected function getCornerstoneEnabledConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Conditionals\\Cornerstone_Enabled_Conditional'] = new \Yoast\WP\SEO\Premium\Conditionals\Cornerstone_Enabled_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Conditionals\EDD_Conditional' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Conditionals\EDD_Conditional - */ - protected function getEDDConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Conditionals\\EDD_Conditional'] = new \Yoast\WP\SEO\Premium\Conditionals\EDD_Conditional(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Conditionals\Inclusive_Language_Enabled_Conditional' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Conditionals\Inclusive_Language_Enabled_Conditional - */ - protected function getInclusiveLanguageEnabledConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Conditionals\\Inclusive_Language_Enabled_Conditional'] = new \Yoast\WP\SEO\Premium\Conditionals\Inclusive_Language_Enabled_Conditional(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Conditionals\Term_Overview_Or_Ajax_Conditional' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Conditionals\Term_Overview_Or_Ajax_Conditional - */ - protected function getTermOverviewOrAjaxConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Conditionals\\Term_Overview_Or_Ajax_Conditional'] = new \Yoast\WP\SEO\Premium\Conditionals\Term_Overview_Or_Ajax_Conditional(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Conditionals\Yoast_Admin_Or_Introductions_Route_Conditional' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Conditionals\Yoast_Admin_Or_Introductions_Route_Conditional - */ - protected function getYoastAdminOrIntroductionsRouteConditionalService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Conditionals\\Yoast_Admin_Or_Introductions_Route_Conditional'] = new \Yoast\WP\SEO\Premium\Conditionals\Yoast_Admin_Or_Introductions_Route_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Yoast_Admin_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Yoast_Admin_Conditional'] : $this->getYoastAdminConditionalService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Config\Badge_Group_Names' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Config\Badge_Group_Names - */ - protected function getBadgeGroupNamesService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Config\\Badge_Group_Names'] = new \Yoast\WP\SEO\Premium\Config\Badge_Group_Names(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Config\Migrations\AddIndexOnIndexableIdAndStem' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Config\Migrations\AddIndexOnIndexableIdAndStem - */ - protected function getAddIndexOnIndexableIdAndStemService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Config\\Migrations\\AddIndexOnIndexableIdAndStem'] = new \Yoast\WP\SEO\Premium\Config\Migrations\AddIndexOnIndexableIdAndStem(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : $this->getAdapterService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Database\Migration_Runner_Premium' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Database\Migration_Runner_Premium - */ - protected function getMigrationRunnerPremiumService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Database\\Migration_Runner_Premium'] = new \Yoast\WP\SEO\Premium\Database\Migration_Runner_Premium(${($_ = isset($this->services['Yoast\\WP\\SEO\\Config\\Migration_Status']) ? $this->services['Yoast\\WP\\SEO\\Config\\Migration_Status'] : $this->getMigrationStatusService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Loader']) ? $this->services['Yoast\\WP\\SEO\\Loader'] : $this->getLoaderService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : $this->getAdapterService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Helpers\AI_Generator_Helper' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Helpers\AI_Generator_Helper - */ - protected function getAIGeneratorHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\AI_Generator_Helper'] = new \Yoast\WP\SEO\Premium\Helpers\AI_Generator_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : $this->getUserHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Helpers\Current_Page_Helper' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Helpers\Current_Page_Helper - */ - protected function getCurrentPageHelper2Service() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper'] = new \Yoast\WP\SEO\Premium\Helpers\Current_Page_Helper(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Helpers\Prominent_Words_Helper' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Helpers\Prominent_Words_Helper - */ - protected function getProminentWordsHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper'] = new \Yoast\WP\SEO\Premium\Helpers\Prominent_Words_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Helpers\Version_Helper' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Helpers\Version_Helper - */ - protected function getVersionHelperService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Version_Helper'] = new \Yoast\WP\SEO\Premium\Helpers\Version_Helper(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Initializers\Index_Now_Key' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Initializers\Index_Now_Key - */ - protected function getIndexNowKeyService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Initializers\\Index_Now_Key'] = new \Yoast\WP\SEO\Premium\Initializers\Index_Now_Key(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Initializers\Introductions_Initializer' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Initializers\Introductions_Initializer - */ - protected function getIntroductionsInitializerService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Initializers\\Introductions_Initializer'] = new \Yoast\WP\SEO\Premium\Initializers\Introductions_Initializer(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Introductions\\Application\\Ai_Generate_Titles_And_Descriptions_Introduction']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Introductions\\Application\\Ai_Generate_Titles_And_Descriptions_Introduction'] : $this->getAiGenerateTitlesAndDescriptionsIntroductionService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Initializers\Plugin' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Initializers\Plugin - */ - protected function getPluginService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Initializers\\Plugin'] = new \Yoast\WP\SEO\Premium\Initializers\Plugin(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Initializers\Redirect_Handler' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Initializers\Redirect_Handler - */ - protected function getRedirectHandlerService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Initializers\\Redirect_Handler'] = new \Yoast\WP\SEO\Premium\Initializers\Redirect_Handler(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Initializers\Woocommerce' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Initializers\Woocommerce - */ - protected function getWoocommerceService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Initializers\\Woocommerce'] = new \Yoast\WP\SEO\Premium\Initializers\Woocommerce(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Initializers\Wp_Cli_Initializer' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Initializers\Wp_Cli_Initializer - */ - protected function getWpCliInitializerService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Initializers\\Wp_Cli_Initializer'] = new \Yoast\WP\SEO\Premium\Initializers\Wp_Cli_Initializer(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Ai_Consent_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Ai_Consent_Integration - */ - protected function getAiConsentIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Ai_Consent_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Ai_Consent_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Addon_Manager']) ? $this->services['WPSEO_Addon_Manager'] : $this->getWPSEOAddonManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : $this->getUserHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository']) ? $this->services['Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository'] : $this->getWistiaEmbedPermissionRepositoryService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Ai_Generator_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Ai_Generator_Integration - */ - protected function getAiGeneratorIntegrationService() - { - $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : $this->getUserHelperService()) && false ?: '_'}; - - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Ai_Generator_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Ai_Generator_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Addon_Manager']) ? $this->services['WPSEO_Addon_Manager'] : $this->getWPSEOAddonManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}, $a, new \Yoast\WP\SEO\Introductions\Infrastructure\Introductions_Seen_Repository($a)); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Cornerstone_Column_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Cornerstone_Column_Integration - */ - protected function getCornerstoneColumnIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Cornerstone_Column_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Cornerstone_Column_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['wpdb']) ? $this->services['wpdb'] : $this->getWpdbService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration']) ? $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration'] : $this->getAdminColumnsCacheIntegrationService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Cornerstone_Taxonomy_Column_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Cornerstone_Taxonomy_Column_Integration - */ - protected function getCornerstoneTaxonomyColumnIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Cornerstone_Taxonomy_Column_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Cornerstone_Taxonomy_Column_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper'] : ($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper'] = new \Yoast\WP\SEO\Premium\Helpers\Current_Page_Helper())) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Inclusive_Language_Column_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Inclusive_Language_Column_Integration - */ - protected function getInclusiveLanguageColumnIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Column_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Inclusive_Language_Column_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Score_Icon_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Score_Icon_Helper'] : $this->getScoreIconHelperService()) && false ?: '_'}, ${($_ = isset($this->services['wpdb']) ? $this->services['wpdb'] : $this->getWpdbService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration']) ? $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration'] : $this->getAdminColumnsCacheIntegrationService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Inclusive_Language_Filter_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Inclusive_Language_Filter_Integration - */ - protected function getInclusiveLanguageFilterIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Filter_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Inclusive_Language_Filter_Integration(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Inclusive_Language_Taxonomy_Column_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Inclusive_Language_Taxonomy_Column_Integration - */ - protected function getInclusiveLanguageTaxonomyColumnIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Taxonomy_Column_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Inclusive_Language_Taxonomy_Column_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Score_Icon_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Score_Icon_Helper'] : $this->getScoreIconHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper'] : ($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper'] = new \Yoast\WP\SEO\Premium\Helpers\Current_Page_Helper())) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Keyword_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Keyword_Integration - */ - protected function getKeywordIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Keyword_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Keyword_Integration(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Metabox_Formatter_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Metabox_Formatter_Integration - */ - protected function getMetaboxFormatterIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Metabox_Formatter_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Metabox_Formatter_Integration(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Plugin_Links_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Plugin_Links_Integration - */ - protected function getPluginLinksIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Plugin_Links_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Plugin_Links_Integration(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Prominent_Words\Indexing_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Prominent_Words\Indexing_Integration - */ - protected function getIndexingIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Prominent_Words\\Indexing_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Prominent_Words\Indexing_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Content_Action']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Content_Action'] : $this->getContentActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action'] : $this->getIndexablePostIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action'] : $this->getIndexableTermIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action'] : $this->getIndexableGeneralIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action'] : $this->getIndexablePostTypeArchiveIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Language_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Language_Helper'] : $this->getLanguageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : $this->getUrlHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper'] : $this->getProminentWordsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Prominent_Words\Metabox_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Prominent_Words\Metabox_Integration - */ - protected function getMetaboxIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Prominent_Words\\Metabox_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Prominent_Words\Metabox_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Save_Action']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Save_Action'] : $this->getSaveActionService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Related_Keyphrase_Filter_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Related_Keyphrase_Filter_Integration - */ - protected function getRelatedKeyphraseFilterIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Related_Keyphrase_Filter_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Related_Keyphrase_Filter_Integration(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Replacement_Variables_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Replacement_Variables_Integration - */ - protected function getReplacementVariablesIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Replacement_Variables_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Replacement_Variables_Integration(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Settings_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Settings_Integration - */ - protected function getSettingsIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Settings_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Settings_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Thank_You_Page_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Thank_You_Page_Integration - */ - protected function getThankYouPageIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Thank_You_Page_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Thank_You_Page_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Update_Premium_Notification' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Update_Premium_Notification - */ - protected function getUpdatePremiumNotificationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Update_Premium_Notification'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Update_Premium_Notification(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Version_Helper']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Version_Helper'] : ($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Version_Helper'] = new \Yoast\WP\SEO\Premium\Helpers\Version_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Capability_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Capability_Helper'] : $this->getCapabilityHelperService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\User_Profile_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\User_Profile_Integration - */ - protected function getUserProfileIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\User_Profile_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\User_Profile_Integration(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Admin\Workouts_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Admin\Workouts_Integration - */ - protected function getWorkoutsIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Workouts_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Admin\Workouts_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Shortlinker']) ? $this->services['WPSEO_Shortlinker'] : $this->getWPSEOShortlinkerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper'] : $this->getProminentWordsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Alerts\Ai_Generator_Tip_Notification' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Alerts\Ai_Generator_Tip_Notification - */ - protected function getAiGeneratorTipNotificationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Alerts\\Ai_Generator_Tip_Notification'] = new \Yoast\WP\SEO\Premium\Integrations\Alerts\Ai_Generator_Tip_Notification(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Blocks\Estimated_Reading_Time_Block' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Blocks\Estimated_Reading_Time_Block - */ - protected function getEstimatedReadingTimeBlockService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Estimated_Reading_Time_Block'] = new \Yoast\WP\SEO\Premium\Integrations\Blocks\Estimated_Reading_Time_Block(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Blocks\Related_Links_Block' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Blocks\Related_Links_Block - */ - protected function getRelatedLinksBlockService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Related_Links_Block'] = new \Yoast\WP\SEO\Premium\Integrations\Blocks\Related_Links_Block(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Cleanup_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Cleanup_Integration - */ - protected function getCleanupIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Cleanup_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Cleanup_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository'] : $this->getIndexableCleanupRepositoryService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Front_End\Robots_Txt_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Front_End\Robots_Txt_Integration - */ - protected function getRobotsTxtIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Front_End\\Robots_Txt_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Front_End\Robots_Txt_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Frontend_Inspector' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Frontend_Inspector - */ - protected function getFrontendInspectorService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Frontend_Inspector'] = new \Yoast\WP\SEO\Premium\Integrations\Frontend_Inspector(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Helper'] : $this->getRobotsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Index_Now_Ping' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Index_Now_Ping - */ - protected function getIndexNowPingService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Index_Now_Ping'] = new \Yoast\WP\SEO\Premium\Integrations\Index_Now_Ping(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Request_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Request_Helper'] : $this->getRequestHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Missing_Indexables_Count_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Missing_Indexables_Count_Integration - */ - protected function getMissingIndexablesCountIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Missing_Indexables_Count_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Missing_Indexables_Count_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Content_Action']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Content_Action'] : $this->getContentActionService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\OpenGraph_Author_Archive' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\OpenGraph_Author_Archive - */ - protected function getOpenGraphAuthorArchiveService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Author_Archive'] = new \Yoast\WP\SEO\Premium\Integrations\OpenGraph_Author_Archive(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\OpenGraph_Date_Archive' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\OpenGraph_Date_Archive - */ - protected function getOpenGraphDateArchiveService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Date_Archive'] = new \Yoast\WP\SEO\Premium\Integrations\OpenGraph_Date_Archive(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\OpenGraph_PostType_Archive' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\OpenGraph_PostType_Archive - */ - protected function getOpenGraphPostTypeArchiveService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_PostType_Archive'] = new \Yoast\WP\SEO\Premium\Integrations\OpenGraph_PostType_Archive(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\OpenGraph_Post_Type' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\OpenGraph_Post_Type - */ - protected function getOpenGraphPostTypeService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Post_Type'] = new \Yoast\WP\SEO\Premium\Integrations\OpenGraph_Post_Type(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\OpenGraph_Term_Archive' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\OpenGraph_Term_Archive - */ - protected function getOpenGraphTermArchiveService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Term_Archive'] = new \Yoast\WP\SEO\Premium\Integrations\OpenGraph_Term_Archive(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Organization_Schema_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Organization_Schema_Integration - */ - protected function getOrganizationSchemaIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Organization_Schema_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Organization_Schema_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Publishing_Principles_Schema_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Publishing_Principles_Schema_Integration - */ - protected function getPublishingPrinciplesSchemaIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Publishing_Principles_Schema_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Publishing_Principles_Schema_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Routes\AI_Generator_Route' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Routes\AI_Generator_Route - */ - protected function getAIGeneratorRouteService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Routes\\AI_Generator_Route'] = new \Yoast\WP\SEO\Premium\Integrations\Routes\AI_Generator_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Actions\\AI_Generator_Action']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\AI_Generator_Action'] : $this->getAIGeneratorActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\AI_Generator_Helper']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\AI_Generator_Helper'] : $this->getAIGeneratorHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Routes\Workouts_Routes_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Routes\Workouts_Routes_Integration - */ - protected function getWorkoutsRoutesIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Routes\\Workouts_Routes_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Routes\Workouts_Routes_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Link_Suggestions_Action']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Link_Suggestions_Action'] : $this->getLinkSuggestionsActionService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Shortlinker']) ? $this->services['WPSEO_Shortlinker'] : $this->getWPSEOShortlinkerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper'] : $this->getProminentWordsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Third_Party\Algolia' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Third_Party\Algolia - */ - protected function getAlgoliaService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Algolia'] = new \Yoast\WP\SEO\Premium\Integrations\Third_Party\Algolia(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface'] : $this->getMetaSurfaceService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Third_Party\EDD' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Third_Party\EDD - */ - protected function getEDDService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\EDD'] = new \Yoast\WP\SEO\Premium\Integrations\Third_Party\EDD(${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface'] : $this->getMetaSurfaceService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Third_Party\Elementor_Premium' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Third_Party\Elementor_Premium - */ - protected function getElementorPremiumService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Elementor_Premium'] = new \Yoast\WP\SEO\Premium\Integrations\Third_Party\Elementor_Premium(${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper'] : $this->getProminentWordsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper'] : ($this->services['Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper'] = new \Yoast\WP\SEO\Premium\Helpers\Current_Page_Helper())) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Third_Party\Elementor_Preview' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Third_Party\Elementor_Preview - */ - protected function getElementorPreviewService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Elementor_Preview'] = new \Yoast\WP\SEO\Premium\Integrations\Third_Party\Elementor_Preview(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Third_Party\Mastodon' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Third_Party\Mastodon - */ - protected function getMastodonService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Mastodon'] = new \Yoast\WP\SEO\Premium\Integrations\Third_Party\Mastodon(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper'] : $this->getSocialProfilesHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Upgrade_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Upgrade_Integration - */ - protected function getUpgradeIntegrationService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Upgrade_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\Upgrade_Integration(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\User_Profile_Integration' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\User_Profile_Integration - */ - protected function getUserProfileIntegration2Service() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\User_Profile_Integration'] = new \Yoast\WP\SEO\Premium\Integrations\User_Profile_Integration(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Integrations\Watchers\Prominent_Words_Watcher' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Integrations\Watchers\Prominent_Words_Watcher - */ - protected function getProminentWordsWatcherService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Integrations\\Watchers\\Prominent_Words_Watcher'] = new \Yoast\WP\SEO\Premium\Integrations\Watchers\Prominent_Words_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository'] : ($this->services['Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository'] = new \Yoast\WP\SEO\Premium\Repositories\Prominent_Words_Repository())) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Introductions\Application\Ai_Generate_Titles_And_Descriptions_Introduction' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Introductions\Application\Ai_Generate_Titles_And_Descriptions_Introduction - */ - protected function getAiGenerateTitlesAndDescriptionsIntroductionService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Introductions\\Application\\Ai_Generate_Titles_And_Descriptions_Introduction'] = new \Yoast\WP\SEO\Premium\Introductions\Application\Ai_Generate_Titles_And_Descriptions_Introduction(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : $this->getOptionsHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : $this->getUserHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Main' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Main - */ - protected function getMainService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Main'] = new \Yoast\WP\SEO\Premium\Main(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Repositories\Prominent_Words_Repository' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Repositories\Prominent_Words_Repository - */ - protected function getProminentWordsRepositoryService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository'] = new \Yoast\WP\SEO\Premium\Repositories\Prominent_Words_Repository(); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Routes\Link_Suggestions_Route' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Routes\Link_Suggestions_Route - */ - protected function getLinkSuggestionsRouteService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Routes\\Link_Suggestions_Route'] = new \Yoast\WP\SEO\Premium\Routes\Link_Suggestions_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Link_Suggestions_Action']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Link_Suggestions_Action'] : $this->getLinkSuggestionsActionService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Routes\Prominent_Words_Route' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Routes\Prominent_Words_Route - */ - protected function getProminentWordsRouteService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Routes\\Prominent_Words_Route'] = new \Yoast\WP\SEO\Premium\Routes\Prominent_Words_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Content_Action']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Content_Action'] : $this->getContentActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Save_Action']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Save_Action'] : $this->getSaveActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Complete_Action']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Complete_Action'] : $this->getCompleteActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] : $this->getIndexingHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Routes\Workouts_Route' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Routes\Workouts_Route - */ - protected function getWorkoutsRouteService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Routes\\Workouts_Route'] = new \Yoast\WP\SEO\Premium\Routes\Workouts_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Link_Suggestions_Action']) ? $this->services['Yoast\\WP\\SEO\\Premium\\Actions\\Link_Suggestions_Action'] : $this->getLinkSuggestionsActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder'] : $this->getIndexableTermBuilderService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Premium\Surfaces\Helpers_Surface' shared autowired service. - * - * @return \Yoast\WP\SEO\Premium\Surfaces\Helpers_Surface - */ - protected function getHelpersSurfaceService() - { - return $this->services['Yoast\\WP\\SEO\\Premium\\Surfaces\\Helpers_Surface'] = new \Yoast\WP\SEO\Premium\Surfaces\Helpers_Surface($this); - } - - /** - * Gets the public 'Yoast\WP\SEO\Repositories\Indexable_Cleanup_Repository' shared service. - * - * @return \Yoast\WP\SEO\Repositories\Indexable_Cleanup_Repository - */ - protected function getIndexableCleanupRepositoryService() - { - return $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Repositories\Indexable_Repository' shared service. - * - * @return \Yoast\WP\SEO\Repositories\Indexable_Repository - */ - protected function getIndexableRepositoryService() - { - return $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Repositories\SEO_Links_Repository' shared service. - * - * @return \Yoast\WP\SEO\Repositories\SEO_Links_Repository - */ - protected function getSEOLinksRepositoryService() - { - return $this->services['Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Surfaces\Classes_Surface' shared autowired service. - * - * @return \Yoast\WP\SEO\Surfaces\Classes_Surface - */ - protected function getClassesSurfaceService() - { - return $this->services['Yoast\\WP\\SEO\\Surfaces\\Classes_Surface'] = new \Yoast\WP\SEO\Surfaces\Classes_Surface($this); - } - - /** - * Gets the public 'Yoast\WP\SEO\Surfaces\Helpers_Surface' shared autowired service. - * - * @return \Yoast\WP\SEO\Surfaces\Helpers_Surface - */ - protected function getHelpersSurface2Service() - { - return $this->services['Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface'] = new \Yoast\WP\SEO\Surfaces\Helpers_Surface($this, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface'] : $this->getOpenGraphHelpersSurfaceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface'] : $this->getSchemaHelpersSurfaceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface'] : $this->getTwitterHelpersSurfaceService()) && false ?: '_'}); - } - - /** - * Gets the public 'Yoast\WP\SEO\Surfaces\Meta_Surface' shared service. - * - * @return \Yoast\WP\SEO\Surfaces\Meta_Surface - */ - protected function getMetaSurfaceService() - { - return $this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Surfaces\\Meta_Surface'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Surfaces\Open_Graph_Helpers_Surface' shared service. - * - * @return \Yoast\WP\SEO\Surfaces\Open_Graph_Helpers_Surface - */ - protected function getOpenGraphHelpersSurfaceService() - { - return $this->services['Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Surfaces\Schema_Helpers_Surface' shared service. - * - * @return \Yoast\WP\SEO\Surfaces\Schema_Helpers_Surface - */ - protected function getSchemaHelpersSurfaceService() - { - return $this->services['Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface'); - } - - /** - * Gets the public 'Yoast\WP\SEO\Surfaces\Twitter_Helpers_Surface' shared service. - * - * @return \Yoast\WP\SEO\Surfaces\Twitter_Helpers_Surface - */ - protected function getTwitterHelpersSurfaceService() - { - return $this->services['Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface'); - } - - /** - * Gets the public 'wpdb' shared service. - * - * @return \wpdb - */ - protected function getWpdbService() - { - return $this->services['wpdb'] = \Yoast\WP\Lib\Dependency_Injection\Container_Registry::get('yoast-seo', 'wpdb'); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/helpers/ai-generator-helper.php b/wp/wp-content/plugins/wordpress-seo-premium/src/helpers/ai-generator-helper.php deleted file mode 100644 index db28c4d8..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/helpers/ai-generator-helper.php +++ /dev/null @@ -1,357 +0,0 @@ -options_helper = $options; - $this->user_helper = $user_helper; - } - - /** - * Generates a random code verifier for a user. The code verifier is used in communication with the Yoast AI API - * to ensure that the callback that is sent for both the token and refresh request are handled by the same site that requested the tokens. - * Each code verifier should only be used once. - * This all helps with preventing access tokens from one site to be sent to another and it makes a mitm attack more difficult to execute. - * - * @param WP_User $user The WP user. - * - * @return string The code verifier. - */ - public function generate_code_verifier( WP_User $user ) { - $random_string = \substr( \str_shuffle( '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ), 1, 10 ); - - return \hash( 'sha256', $user->user_email . $random_string ); - } - - /** - * Temporarily stores the code verifier. We expect the callback that consumes this verifier to reach us within a couple of seconds. - * So, we throw away the code after 5 minutes: when we know the callback isn't coming. - * - * @param int $user_id The user ID. - * @param string $code_verifier The code verifier. - * - * @return void - */ - public function set_code_verifier( int $user_id, string $code_verifier ): void { - $user_id_string = (string) $user_id; - \set_transient( "yoast_wpseo_ai_generator_code_verifier_$user_id_string", $code_verifier, ( \MINUTE_IN_SECONDS * 5 ) ); - } - - /** - * Retrieves the code verifier. - * - * @param int $user_id The user ID. - * - * @return string The code verifier. - * - * @throws RuntimeException Unable to retrieve the code verifier. - */ - public function get_code_verifier( int $user_id ): string { - $user_id_string = (string) $user_id; - $code_verifier = \get_transient( "yoast_wpseo_ai_generator_code_verifier_$user_id_string" ); - if ( ! \is_string( $code_verifier ) || $code_verifier === '' ) { - throw new RuntimeException( 'Unable to retrieve the code verifier.' ); - } - - return $code_verifier; - } - - /** - * Deletes the code verifier. - * - * @param int $user_id The user ID. - * - * @return void - */ - public function delete_code_verifier( int $user_id ): void { - $user_id_string = (string) $user_id; - \delete_transient( "yoast_wpseo_ai_generator_code_verifier_$user_id_string" ); - } - - /** - * Gets the licence URL. - * - * @return string The licence URL. - */ - public function get_license_url() { - return WPSEO_Utils::get_home_url(); - } - - /** - * Gets the callback URL to be used by the API to send back the access token, refresh token and code challenge. - * - * @return array The callbacks URLs. - */ - public function get_callback_url() { - return \get_rest_url( null, 'yoast/v1/ai_generator/callback' ); - } - - /** - * Gets the callback URL to be used by the API to send back the refreshed JWTs once they expire. - * - * @return array The callbacks URLs. - */ - public function get_refresh_callback_url() { - return \get_rest_url( null, 'yoast/v1/ai_generator/refresh_callback' ); - } - - /** - * Performs the request using WordPress internals. - * - * @param string $action_path The path to the desired action. - * @param array $request_body The request body. - * @param array $request_headers The request headers. - * - * @return object The response object. - * - * @throws Bad_Request_Exception When the request fails for any other reason. - * @throws Forbidden_Exception When the response code is 403. - * @throws Internal_Server_Error_Exception When the response code is 500. - * @throws Not_Found_Exception When the response code is 404. - * @throws Payment_Required_Exception When the response code is 402. - * @throws Request_Timeout_Exception When the response code is 408. - * @throws Service_Unavailable_Exception When the response code is 503. - * @throws Too_Many_Requests_Exception When the response code is 429. - * @throws Unauthorized_Exception When the response code is 401. - */ - public function request( $action_path, $request_body = [], $request_headers = [] ) { - // Our API expects JSON. - // The request times out after 30 seconds. - $request_headers = \array_merge( $request_headers, [ 'Content-Type' => 'application/json' ] ); - $request_arguments = [ - 'timeout' => 30, - // phpcs:ignore Yoast.Yoast.JsonEncodeAlternative.Found -- Reason: We don't want the debug/pretty possibility. - 'body' => \wp_json_encode( $request_body ), - 'headers' => $request_headers, - ]; - - /** - * Filter: 'Yoast\WP\SEO\ai_api_url' - Replaces the default URL for the AI API with a custom one. - * - * Note: This is a Premium plugin-only hook. - * - * @since 21.0 - * @internal - * - * @param string $url The default URL for the AI API. - */ - $api_url = \apply_filters( 'Yoast\WP\SEO\ai_api_url', $this->base_url ); - $response = \wp_remote_post( $api_url . $action_path, $request_arguments ); - - if ( \is_wp_error( $response ) ) { - throw new Bad_Request_Exception( $response->get_error_message(), $response->get_error_code() ); - } - - [ $response_code, $response_message, $missing_licenses ] = $this->parse_response( $response ); - - switch ( $response_code ) { - case 200: - return (object) $response; - case 401: - throw new Unauthorized_Exception( $response_message, $response_code ); - case 402: - throw new Payment_Required_Exception( $response_message, $response_code, null, $missing_licenses ); - case 403: - throw new Forbidden_Exception( $response_message, $response_code ); - case 404: - throw new Not_Found_Exception( $response_message, $response_code ); - case 408: - throw new Request_Timeout_Exception( $response_message, $response_code ); - case 429: - throw new Too_Many_Requests_Exception( $response_message, $response_code ); - case 500: - throw new Internal_Server_Error_Exception( $response_message, $response_code ); - case 503: - throw new Service_Unavailable_Exception( $response_message, $response_code ); - default: - throw new Bad_Request_Exception( $response_message, $response_code ); - } - } - - /** - * Generates the list of 5 suggestions to return. - * - * @param object $response The response from the API. - * - * @return array The array of suggestions. - */ - public function build_suggestions_array( $response ): array { - $suggestions = []; - $json = \json_decode( $response->body ); - if ( $json === null || ! isset( $json->choices ) ) { - return $suggestions; - } - foreach ( $json->choices as $suggestion ) { - $suggestions[] = $suggestion->text; - } - - return $suggestions; - } - - /** - * Parses the response from the API. - * - * @param array|WP_Error $response The response from the API. - * - * @return array The response code and message. - */ - public function parse_response( $response ) { - $response_code = ( \wp_remote_retrieve_response_code( $response ) !== '' ) ? \wp_remote_retrieve_response_code( $response ) : 0; - $response_message = \esc_html( \wp_remote_retrieve_response_message( $response ) ); - $missing_licenses = []; - - if ( $response_code !== 200 && $response_code !== 0 ) { - $json_body = \json_decode( \wp_remote_retrieve_body( $response ) ); - if ( $json_body !== null ) { - $response_message = ( $json_body->error_code ?? $this->map_message_to_code( $json_body->message ) ); - if ( $response_code === 402 ) { - $missing_licenses = isset( $json_body->missing_licenses ) ? (array) $json_body->missing_licenses : []; - } - } - } - - return [ $response_code, $response_message, $missing_licenses ]; - } - - /** - * Checks whether the token has expired. - * - * @param string $jwt The JWT. - * - * @return bool Whether the token has expired. - */ - public function has_token_expired( string $jwt ): bool { - $parts = \explode( '.', $jwt ); - if ( \count( $parts ) !== 3 ) { - // Headers, payload and signature parts are not detected. - return true; - } - - // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode -- Reason: Decoding the payload of the JWT. - $payload = \base64_decode( $parts[1] ); - $json = \json_decode( $payload ); - if ( $json === null || ! isset( $json->exp ) ) { - return true; - } - - return $json->exp < \time(); - } - - /** - * Retrieves the access JWT. - * - * @param string $user_id The user ID. - * - * @return string The access JWT. - * - * @throws RuntimeException Unable to retrieve the access token. - */ - public function get_access_token( string $user_id ): string { - $access_jwt = $this->user_helper->get_meta( $user_id, '_yoast_wpseo_ai_generator_access_jwt', true ); - if ( ! \is_string( $access_jwt ) || $access_jwt === '' ) { - throw new RuntimeException( 'Unable to retrieve the access token.' ); - } - - return $access_jwt; - } - - /** - * Retrieves the refresh JWT. - * - * @param string $user_id The user ID. - * - * @return string The access JWT. - * - * @throws RuntimeException Unable to retrieve the refresh token. - */ - public function get_refresh_token( $user_id ) { - $refresh_jwt = $this->user_helper->get_meta( $user_id, '_yoast_wpseo_ai_generator_refresh_jwt', true ); - if ( ! \is_string( $refresh_jwt ) || $refresh_jwt === '' ) { - throw new RuntimeException( 'Unable to retrieve the refresh token.' ); - } - - return $refresh_jwt; - } - - /** - * Checks if the AI Generator feature is active. - * - * @return bool Whether the feature is active. - */ - public function is_ai_generator_enabled() { - return $this->options_helper->get( 'enable_ai_generator', false ); - } - - /** - * Maps the message to a code. - * - * @param string $message The message. - * - * @return string The code. - */ - private function map_message_to_code( $message ) { - if ( \strpos( $message, 'must NOT have fewer than 1 characters' ) !== false ) { - return 'NOT_ENOUGH_CONTENT'; - } - if ( \strpos( $message, 'Client timeout' ) !== false ) { - return 'CLIENT_TIMEOUT'; - } - if ( \strpos( $message, 'Server timeout' ) !== false ) { - return 'SERVER_TIMEOUT'; - } - - return $message; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/helpers/current-page-helper.php b/wp/wp-content/plugins/wordpress-seo-premium/src/helpers/current-page-helper.php deleted file mode 100644 index 1601c700..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/helpers/current-page-helper.php +++ /dev/null @@ -1,107 +0,0 @@ - 0 ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, We are casting to an integer, also this is a helper function. - return (int) \wp_unslash( $_GET['post'] ); - } - return 0; - } - - /** - * Retrieves the current post type. - * - * @return string The post type. - */ - public function get_current_post_type() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['post_type'] ) && \is_string( $_GET['post_type'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - return \sanitize_text_field( \wp_unslash( $_GET['post_type'] ) ); - } - - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: should be done outside the helper function. - if ( isset( $_POST['post_type'] ) && \is_string( $_POST['post_type'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: should be done outside the helper function. - return \sanitize_text_field( \wp_unslash( $_POST['post_type'] ) ); - } - - $post_id = $this->get_current_post_id(); - - if ( $post_id ) { - return \get_post_type( $post_id ); - } - - return 'post'; - } - - /** - * Retrieves the current taxonomy. - * - * @return string The taxonomy. - */ - public function get_current_taxonomy() { - if ( ! isset( $_SERVER['REQUEST_METHOD'] ) || ! \in_array( $_SERVER['REQUEST_METHOD'], [ 'GET', 'POST' ], true ) ) { - return ''; - } - - // phpcs:ignore WordPress.Security.NonceVerification -- Reason: We are not processing form information. - if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) { - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: should be done outside the helper function. - if ( isset( $_POST['taxonomy'] ) && \is_string( $_POST['taxonomy'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: should be done outside the helper function. - return \sanitize_text_field( \wp_unslash( $_POST['taxonomy'] ) ); - } - return ''; - } - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['taxonomy'] ) && \is_string( $_GET['taxonomy'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - return \sanitize_text_field( \wp_unslash( $_GET['taxonomy'] ) ); - } - - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/helpers/prominent-words-helper.php b/wp/wp-content/plugins/wordpress-seo-premium/src/helpers/prominent-words-helper.php deleted file mode 100644 index d4efeb5f..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/helpers/prominent-words-helper.php +++ /dev/null @@ -1,96 +0,0 @@ -options_helper = $options_helper; - } - - /** - * Computes the tf-idf (term frequency - inverse document frequency) score of a prominent word in a document. - * The document frequency should be 1 or higher, if it is not, it is assumed to be 1. - * - * @param int $term_frequency How many times the word occurs in the document. - * @param int $doc_frequency In how many documents this word occurs. - * - * @return float The tf-idf score of a prominent word. - */ - public function compute_tf_idf_score( $term_frequency, $doc_frequency ) { - // Set doc frequency to a minimum of 1, to avoid division by 0. - $doc_frequency = \max( 1, $doc_frequency ); - - return ( $term_frequency * ( 1 / $doc_frequency ) ); - } - - /** - * Computes the vector length for the given prominent words, applying Pythagoras's Theorem on the weights. - * - * @param array $prominent_words The prominent words, as an array mapping stems to `weight` and `df` (document frequency). - * - * @return float Vector length for the prominent words. - */ - public function compute_vector_length( $prominent_words ) { - $sum_of_squares = 0; - - foreach ( $prominent_words as $stem => $word ) { - $doc_frequency = 1; - if ( \array_key_exists( 'df', $word ) ) { - $doc_frequency = $word['df']; - } - - $tf_idf = $this->compute_tf_idf_score( $word['weight'], $doc_frequency ); - $sum_of_squares += ( $tf_idf ** 2 ); - } - - return \sqrt( $sum_of_squares ); - } - - /** - * Completes the prominent words indexing. - * - * @return void - */ - public function complete_indexing() { - $this->set_indexing_completed( true ); - \set_transient( 'total_unindexed_prominent_words', '0' ); - } - - /** - * Sets the prominent_words_indexing_completed option. - * - * @param bool $indexing_completed Whether or not the prominent words indexing has completed. - * - * @return void - */ - public function set_indexing_completed( $indexing_completed ) { - $this->options_helper->set( 'prominent_words_indexing_completed', $indexing_completed ); - } - - /** - * Gets a boolean that indicates whether the prominent words indexing has completed. - * - * @return bool Whether the prominent words indexing has completed. - */ - public function is_indexing_completed() { - return $this->options_helper->get( 'prominent_words_indexing_completed' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/helpers/version-helper.php b/wp/wp-content/plugins/wordpress-seo-premium/src/helpers/version-helper.php deleted file mode 100644 index 7f61c147..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/helpers/version-helper.php +++ /dev/null @@ -1,30 +0,0 @@ -' ) ); - } - - /** - * Checks whether a new update is available for Premium. - * - * @return bool - */ - public function is_premium_update_available() { - $plugin_updates = \get_plugin_updates(); - return isset( $plugin_updates[ \WPSEO_PREMIUM_BASENAME ] ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/index-now-key.php b/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/index-now-key.php deleted file mode 100644 index 26fab0aa..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/index-now-key.php +++ /dev/null @@ -1,123 +0,0 @@ -options_helper = $options_helper; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function initialize() { - \add_action( 'init', [ $this, 'add_rewrite_rule' ], 1 ); - \add_action( 'plugins_loaded', [ $this, 'load' ], 15 ); - } - - /** - * Loads the integration. - * - * @return void - */ - public function load() { - if ( $this->options_helper->get( 'enable_index_now' ) === false ) { - return; - } - - $this->key = $this->options_helper->get( 'index_now_key' ); - if ( $this->key === '' ) { - $this->generate_key(); - } - \add_action( 'wp', [ $this, 'output_key' ], 0 ); - } - - /** - * Adds the rewrite rule for the IndexNow key txt file. - * - * @return void - */ - public function add_rewrite_rule() { - if ( $this->options_helper->get( 'enable_index_now' ) !== true ) { - return; - } - global $wp; - - $wp->add_query_var( 'yoast_index_now_key' ); - \add_rewrite_rule( '^yoast-index-now-([a-zA-Z0-9-]+)\.txt$', 'index.php?yoast_index_now_key=$matches[1]', 'top' ); - } - - /** - * Outputs the key when it matches the key in the database. - * - * @return void - */ - public function output_key() { - $key_in_url = \get_query_var( 'yoast_index_now_key' ); - if ( empty( $key_in_url ) ) { - return; - } - - if ( $key_in_url === $this->key ) { - // Remove all headers. - \header_remove(); - // Only send plain text header. - \header( 'Content-Type: text/plain;charset=UTF-8' ); - echo \esc_html( $this->key ); - die; - } - - // Trying keys? Good luck. - global $wp_query; - $wp_query->set_404(); - } - - /** - * Generates an IndexNow key. - * - * Adapted from wp_generate_password to include dash (-) and not be filtered. - * - * @return void - */ - private function generate_key() { - $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-'; - - for ( $i = 0; $i < 100; $i++ ) { - $this->key .= \substr( $chars, \wp_rand( 0, ( \strlen( $chars ) - 1 ) ), 1 ); - } - $this->options_helper->set( 'index_now_key', $this->key ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/introductions-initializer.php b/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/introductions-initializer.php deleted file mode 100644 index 9af0f04d..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/introductions-initializer.php +++ /dev/null @@ -1,101 +0,0 @@ -current_page_helper = $current_page_helper; - $this->introductions = $introductions; - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * In this case: when on an admin page. - * - * @return array - */ - public static function get_conditionals() { - return [ Yoast_Admin_Or_Introductions_Route_Conditional::class ]; - } - - /** - * Registers the action to enqueue the needed script(s). - * - * @return void - */ - public function initialize() { - if ( $this->is_on_installation_page() ) { - return; - } - - \add_filter( 'wpseo_introductions', [ $this, 'add_introductions' ] ); - \add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - } - - /** - * Adds the Premium introductions. - * - * @param Introduction_Interface[] $introductions The introductions. - * - * @return array The merged introductions. - */ - public function add_introductions( $introductions ) { - // Safety check and bail. - if ( ! \is_array( $introductions ) ) { - return $introductions; - } - - return \array_merge( $introductions, $this->introductions ); - } - - /** - * Enqueue the workouts app. - * - * @return void - */ - public function enqueue_assets() { - \wp_enqueue_script( self::SCRIPT_HANDLE ); - \wp_localize_script( - self::SCRIPT_HANDLE, - 'wpseoPremiumIntroductions', - [ - 'pluginUrl' => \plugins_url( '', \WPSEO_PREMIUM_FILE ), - ] - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/plugin.php b/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/plugin.php deleted file mode 100644 index 45550a42..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/plugin.php +++ /dev/null @@ -1,70 +0,0 @@ -options_helper = $options_helper; - } - - /** - * Loads the redirect handler. - * - * @return void - */ - public function initialize() { - \add_action( 'plugins_loaded', [ $this, 'load' ], 15 ); - - $wpseo_premium_capabilities = new WPSEO_Premium_Register_Capabilities(); - $wpseo_premium_capabilities->register_hooks(); - - \register_deactivation_hook( \WPSEO_PREMIUM_FILE, [ $this, 'wpseo_premium_deactivate' ] ); - } - - /** - * The premium setup - * - * @return void - */ - public function load() { - new WPSEO_Premium(); - } - - /** - * Cleans up Premium on deactivation. - * - * @return void - */ - public function wpseo_premium_deactivate() { - \do_action( 'wpseo_register_capabilities_premium' ); - WPSEO_Capability_Manager_Factory::get( 'premium' )->remove(); - if ( $this->options_helper->get( 'toggled_tracking' ) !== true ) { - $this->options_helper->set( 'tracking', false ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/redirect-handler.php b/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/redirect-handler.php deleted file mode 100644 index d4130853..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/redirect-handler.php +++ /dev/null @@ -1,675 +0,0 @@ -load_php_redirects() ) { - return; - } - - if ( ! \function_exists( 'is_plugin_active_for_network' ) ) { - require_once \ABSPATH . 'wp-admin/includes/plugin.php'; - } - // If the plugin is network activated, we wait for the plugins to be loaded before initializing. - if ( \is_plugin_active_for_network( \WPSEO_PREMIUM_BASENAME ) ) { - \add_action( 'plugins_loaded', [ $this, 'handle_redirects' ], 16 ); - } - else { - $this->handle_redirects(); - } - } - - /** - * Handles the 410 status code. - * - * @return void - */ - public function do_410() { - $is_include_hook_set = $this->set_template_include_hook( '410' ); - - if ( ! $is_include_hook_set ) { - $this->set_404(); - } - - $this->status_header( 410 ); - } - - /** - * Handles the 451 status code. - * - * @return void - */ - public function do_451() { - $is_include_hook_set = $this->set_template_include_hook( '451' ); - - if ( ! $is_include_hook_set ) { - $this->set_404(); - } - - $this->status_header( 451, 'Unavailable For Legal Reasons' ); - } - - /** - * Returns the template that should be included. - * - * @param string $template The template that will included before executing hook. - * - * @return string Returns the template that should be included. - */ - public function set_template_include( $template ) { - if ( ! empty( $this->template_file_path ) ) { - return $this->template_file_path; - } - - return $template; - } - - /** - * Replaces the $regex vars with URL matches. - * - * @param string[] $matches Array with the matches from the matching redirect. - * - * @return string The replaced URL. - */ - public function format_regex_redirect_url( $matches ) { - $arr_key = \substr( $matches[0], 1 ); - - if ( isset( $this->url_matches[ $arr_key ] ) ) { - return $this->url_matches[ $arr_key ]; - } - - return ''; - } - - /** - * Sets the wp_query to 404 when this is an object. - * - * @return void - */ - public function set_404() { - $wp_query = $this->get_wp_query(); - $wp_query->is_404 = true; - } - - /** - * Checks if the current URL matches a normal redirect. - * - * @param string $request_url The request url to look for. - * - * @return void - */ - protected function handle_normal_redirects( $request_url ) { - // Setting the redirects. - $redirects = $this->get_redirects( WPSEO_Redirect_Option::OPTION_PLAIN ); - $this->redirects = $this->normalize_redirects( $redirects ); - - $request_url = $this->normalize_url( $request_url ); - - // Get the URL and doing the redirect. - $redirect_url = $this->find_url( $request_url ); - - if ( empty( $redirect_url ) ) { - return; - } - - if ( $this->normalize_url( $redirect_url['url'] ) === $request_url ) { - return; - } - - $this->is_redirected = true; - $this->do_redirect( $redirect_url['url'], $redirect_url['type'] ); - } - - /** - * Normalizes the url by trimming the slashes. If the given URL is a slash only, - * it will do nothing. By normalizing the URL there is a basis for matching multiple - * variants (Like: url, /url, /url/, url/). - * - * @param string $url The URL to normalize. - * - * @return string The modified url. - */ - protected function normalize_url( $url ) { - if ( $url === '/' ) { - return $url; - } - - return \trim( $url, '/' ); - } - - /** - * Checks if the current URL matches a regex. - * - * @return void - */ - protected function handle_regex_redirects() { - // Setting the redirects. - $this->redirects = $this->get_redirects( WPSEO_Redirect_Option::OPTION_REGEX ); - - foreach ( $this->redirects as $regex => $redirect ) { - // Check if the URL matches the $regex. - $this->match_regex_redirect( $regex, $redirect ); - } - } - - /** - * Check if request URL matches one of the regex redirects. - * - * @param string $regex The reqular expression to match. - * @param array $redirect The URL that might be matched with the regex. - * - * @return void - */ - protected function match_regex_redirect( $regex, array $redirect ) { - /* - * Escape the ` because we use ` to delimit the regex to prevent faulty redirects. - * - * Explicitly chosen not to use `preg_quote` because we need to be able to parse - * user provided regular expression syntax. - */ - $regex = \str_replace( '`', '\\`', $regex ); - - // Suppress warning: a faulty redirect will give a warning and not an exception. So we can't catch it. - // See issue: https://github.com/Yoast/wordpress-seo-premium/issues/662. - // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged - if ( @\preg_match( "`{$regex}`", $this->request_url, $this->url_matches ) === 1 ) { - - // Replace the $regex vars with URL matches. - $redirect_url = \preg_replace_callback( - '/\$[0-9]+/', - [ $this, 'format_regex_redirect_url' ], - $redirect['url'] - ); - - $this->do_redirect( $redirect_url, $redirect['type'] ); - } - - // Reset url_matches. - $this->url_matches = []; - } - - /** - * Gets the redirects from the options. - * - * @param string $option The option name that wil be fetched. - * - * @return array Returns the redirects for the given option. - */ - protected function get_redirects( $option ) { - static $redirects; - - if ( ! isset( $redirects[ $option ] ) ) { - $redirects[ $option ] = \get_option( $option, false ); - } - - if ( ! empty( $redirects[ $option ] ) ) { - return $redirects[ $option ]; - } - - return []; - } - - /** - * Performs the redirect. - * - * @param string $redirect_url The target URL. - * @param string $redirect_type The type of the redirect. - * - * @return void - */ - protected function do_redirect( $redirect_url, $redirect_type ) { - $redirect_url = $this->parse_target_url( $redirect_url ); - - // Prevents redirecting to itself. - if ( $this->home_url( $this->request_url ) === $redirect_url ) { - return; - } - - $redirect_types_without_target = [ 410, 451 ]; - if ( \in_array( $redirect_type, $redirect_types_without_target, true ) ) { - $this->handle_redirect_without_target( $redirect_type ); - - return; - } - - $this->redirect( $redirect_url, $redirect_type ); - } - - /** - * Checks if a redirect has been executed. - * - * @return bool Whether a redirect has been executed. - */ - protected function is_redirected() { - return $this->is_redirected === true; - } - - /** - * Checks if we should load the PHP redirects. - * - * If Apache or NginX configuration is selected, don't load PHP redirects. - * - * @return bool True if PHP redirects should be loaded and used. - */ - protected function load_php_redirects() { - - if ( \defined( 'WPSEO_DISABLE_PHP_REDIRECTS' ) && \WPSEO_DISABLE_PHP_REDIRECTS === true ) { - return false; - } - - if ( \defined( 'WP_CLI' ) && \WP_CLI === true ) { - return false; - } - - $options = \get_option( 'wpseo_redirect', false ); - if ( $options === false ) { - // If the option is not set, save it, to prevent a query for a non-existing option on every page load. - \add_action( 'wp_head', [ $this, 'save_default_redirect_options' ] ); - return false; - } - - // If the PHP redirects are disabled intentionally, return false. - if ( ! empty( $options['disable_php_redirect'] ) && $options['disable_php_redirect'] === 'on' ) { - return false; - } - - // PHP redirects are the enabled method of redirecting. - return true; - } - - /** - * Saves the default redirects options to the DB. - * - * @return void - */ - public function save_default_redirect_options() { - $redirect_option = WPSEO_Premium_Redirect_Option::get_instance(); - \update_option( 'wpseo_redirect', $redirect_option->get_defaults(), true ); - } - - /** - * Gets the request URI. - * - * @return string - */ - protected function get_request_uri() { - $request_uri = ''; - - if ( isset( $_SERVER['REQUEST_URI'] ) ) { - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We sanitize after decoding. - $request_uri = \sanitize_text_field( \rawurldecode( \wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); - } - - return $this->strip_subdirectory( $request_uri ); - } - - /** - * Normalizes the redirects by raw url decoding the origin. - * - * @param array $redirects The redirects to normalize. - * - * @return array The normalized redirects. - */ - protected function normalize_redirects( $redirects ) { - $normalized_redirects = []; - - foreach ( $redirects as $origin => $redirect ) { - $normalized_redirects[ \rawurldecode( $origin ) ] = $redirect; - } - - return $normalized_redirects; - } - - /** - * Sets the request URL and sanitize the slashes for it. - * - * @return void - */ - protected function set_request_url() { - $this->request_url = $this->get_request_uri(); - } - - /** - * Finds the URL in the redirects. - * - * @param string $url The needed URL. - * - * @return bool|string The found url or false if not found. - */ - protected function find_url( $url ) { - $redirect_url = $this->search( $url ); - if ( ! empty( $redirect_url ) ) { - return $redirect_url; - } - - return $this->find_url_fallback( $url ); - } - - /** - * Searches for the given URL in the redirects array. - * - * @param string $url The URL to search for. - * - * @return string|bool The found url or false if not found. - */ - protected function search( $url ) { - if ( ! empty( $this->redirects[ $url ] ) ) { - return $this->redirects[ $url ]; - } - - return false; - } - - /** - * Searches for alternatives with slashes if requested URL isn't found. - * - * This will add a slash if there isn't a slash or it will remove a trailing slash when there isn't one. - * - * @todo Discuss: Maybe we should add slashes to all the values we handle instead of using a fallback. - * - * @param string $url The URL that have to be matched. - * - * @return bool|string The found url or false if not found. - */ - protected function find_url_fallback( $url ) { - $no_trailing_slash = \rtrim( $url, '/' ); - - $checks = [ - 'no_trailing_slash' => $no_trailing_slash, - 'trailing_slash' => $no_trailing_slash . '/', - ]; - - foreach ( $checks as $check ) { - $redirect_url = $this->search( $check ); - if ( ! empty( $redirect_url ) ) { - return $redirect_url; - } - } - - return false; - } - - /** - * Parses the target URL. - * - * @param string $target_url The URL to parse. When there isn't found a scheme, just parse it based on the home URL. - * - * @return string The parsed url. - */ - protected function parse_target_url( $target_url ) { - if ( $this->has_url_scheme( $target_url ) ) { - return $target_url; - } - - $target_url = $this->trailingslashit( $target_url ); - $target_url = $this->format_for_multisite( $target_url ); - - return $this->home_url( $target_url ); - } - - /** - * Checks if given url has a scheme. - * - * @param string $url The url to check. - * - * @return bool True when url has scheme. - */ - protected function has_url_scheme( $url ) { - $scheme = \wp_parse_url( $url, \PHP_URL_SCHEME ); - - return ! empty( $scheme ); - } - - /** - * Determines whether the target URL ends with a slash and adds one if necessary. - * - * @param string $target_url The url to format. - * - * @return string The url with trailing slash. - */ - protected function trailingslashit( $target_url ) { - // Adds slash to target URL when permalink structure ends with a slash. - if ( $this->requires_trailing_slash( $target_url ) ) { - return \trailingslashit( $target_url ); - } - - return $target_url; - } - - /** - * Formats the target url for the multisite if needed. - * - * @param string $target_url The url to format. - * - * @return string The formatted url. - */ - protected function format_for_multisite( $target_url ) { - if ( ! \is_multisite() ) { - return $target_url; - } - - $blog_details = \get_blog_details(); - if ( $blog_details && ! empty( $blog_details->path ) ) { - $blog_path = \ltrim( $blog_details->path, '/' ); - if ( ! empty( $blog_path ) && \strpos( $target_url, $blog_path ) === 0 ) { - $target_url = \substr( $target_url, \strlen( $blog_path ) ); - } - } - - return $target_url; - } - - /** - * Gets the redirect URL by given URL. - * - * @param string $redirect_url The URL that has to be redirected. - * - * @return string The redirect url. - */ - protected function home_url( $redirect_url ) { - $redirect_url = $this->strip_subdirectory( $redirect_url ); - - return \home_url( $redirect_url ); - } - - /** - * Strips the subdirectory from the given url. - * - * @param string $url The url to strip the subdirectory from. - * - * @return string The url with the stripped subdirectory. - */ - protected function strip_subdirectory( $url ) { - return WPSEO_Redirect_Util::strip_base_url_path_from_url( $this->get_home_url(), $url ); - } - - /** - * Returns the URL PATH from the home url. - * - * @return string|null The url path or null if there isn't one. - */ - protected function get_home_url() { - return \home_url(); - } - - /** - * Sets the hook for setting the template include. This is the file that we want to show. - * - * @param string $template_to_set The template to look for. - * - * @return bool True when template should be included. - */ - protected function set_template_include_hook( $template_to_set ) { - $this->template_file_path = $this->get_query_template( $template_to_set ); - if ( ! empty( $this->template_file_path ) ) { - \add_filter( 'template_include', [ $this, 'set_template_include' ] ); - - return true; - } - - return false; - } - - /** - * Wraps the WordPress status_header function. - * - * @param int $code HTTP status code. - * @param string $description Optional. A custom description for the HTTP status. - * - * @return void - */ - protected function status_header( $code, $description = '' ) { - \status_header( $code, $description ); - } - - /** - * Returns instance of WP_Query. - * - * @return WP_Query Instance of WP_Query. - */ - protected function get_wp_query() { - global $wp_query; - - if ( \is_object( $wp_query ) ) { - return $wp_query; - } - - return new WP_Query(); - } - - /** - * Handles the redirects without a target by setting the needed hooks. - * - * @param string $redirect_type The type of the redirect. - * - * @return void - */ - protected function handle_redirect_without_target( $redirect_type ) { - if ( $redirect_type === 410 ) { - \add_action( 'wp', [ $this, 'do_410' ] ); - } - - if ( $redirect_type === 451 ) { - \add_action( 'wp', [ $this, 'do_451' ] ); - } - } - - /** - * Wrapper method for doing the actual redirect. - * - * @param string $location The path to redirect to. - * @param int $status Status code to use. - * - * @return void - */ - protected function redirect( $location, $status = 302 ) { - if ( ! \function_exists( 'wp_redirect' ) ) { - require_once \ABSPATH . 'wp-includes/pluggable.php'; - } - - \wp_redirect( $location, $status, 'Yoast SEO Premium' ); - exit; - } - - /** - * Returns whether or not a target URL requires a trailing slash. - * - * @param string $target_url The target URL to check. - * - * @return bool True when trailing slash is required. - */ - protected function requires_trailing_slash( $target_url ) { - return WPSEO_Redirect_Util::requires_trailing_slash( $target_url ); - } - - /** - * Returns the query template. - * - * @param string $filename Filename without extension. - * - * @return string Full path to template file. - */ - protected function get_query_template( $filename ) { - return \get_query_template( $filename ); - } - - /** - * Actually handles redirects. - * - * @return void - */ - public function handle_redirects() { - // Set the requested URL. - $this->set_request_url(); - - // Check the normal redirects. - $this->handle_normal_redirects( $this->request_url ); - - // Check the regex redirects. - if ( $this->is_redirected() === false ) { - $this->handle_regex_redirects(); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/woocommerce.php b/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/woocommerce.php deleted file mode 100644 index 66d963e8..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/initializers/woocommerce.php +++ /dev/null @@ -1,35 +0,0 @@ - 'WPSEO_CLI_Premium_Requirement::enforce' ] - ); - - WP_CLI::add_command( - 'yoast redirect create', - 'WPSEO_CLI_Redirect_Create_Command', - [ 'before_invoke' => 'WPSEO_CLI_Premium_Requirement::enforce' ] - ); - - WP_CLI::add_command( - 'yoast redirect update', - 'WPSEO_CLI_Redirect_Update_Command', - [ 'before_invoke' => 'WPSEO_CLI_Premium_Requirement::enforce' ] - ); - - WP_CLI::add_command( - 'yoast redirect delete', - 'WPSEO_CLI_Redirect_Delete_Command', - [ 'before_invoke' => 'WPSEO_CLI_Premium_Requirement::enforce' ] - ); - - WP_CLI::add_command( - 'yoast redirect has', - 'WPSEO_CLI_Redirect_Has_Command', - [ 'before_invoke' => 'WPSEO_CLI_Premium_Requirement::enforce' ] - ); - - WP_CLI::add_command( - 'yoast redirect follow', - 'WPSEO_CLI_Redirect_Follow_Command', - [ 'before_invoke' => 'WPSEO_CLI_Premium_Requirement::enforce' ] - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/abstract-opengraph-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/abstract-opengraph-integration.php deleted file mode 100644 index a30c581c..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/abstract-opengraph-integration.php +++ /dev/null @@ -1,206 +0,0 @@ -options = $options; - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * @return array - */ - public static function get_conditionals() { - return [ Open_Graph_Conditional::class ]; - } - - /** - * Retrieves the relevant social title from the options. - * - * @param string $title The default title. - * - * @return mixed|string The filtered value. - */ - public function filter_title( $title ) { - $social_title = $this->options->get( $this::OPTION_TITLES_KEY_TITLE ); - - if ( ! empty( $social_title ) ) { - $title = $social_title; - } - - return $title; - } - - /** - * Retrieves the relevant social description from the options. - * - * @param string $description The default description. - * - * @return mixed|string The filtered value. - */ - public function filter_description( $description ) { - $social_description = $this->options->get( $this::OPTION_TITLES_KEY_DESCRIPTION ); - - if ( ! empty( $social_description ) ) { - $description = $social_description; - } - - return $description; - } - - /** - * Retrieves the relevant social image ID from the options. - * - * @param int $id The default image ID. - * - * @return mixed|int The filtered value. - */ - public function filter_image_id( $id ) { - $social_id = $this->options->get( $this::OPTION_TITLES_KEY_IMAGE_ID ); - - if ( ! empty( $social_id ) ) { - $id = $social_id; - } - - return $id; - } - - /** - * Retrieves the relevant social image URL from the options. - * - * @param string $url The default image URL. - * - * @return mixed|int The filtered value. - */ - public function filter_image( $url ) { - $social_url = $this->options->get( $this::OPTION_TITLES_KEY_IMAGE ); - - if ( ! empty( $social_url ) ) { - $url = $social_url; - } - - return $url; - } - - /** - * Retrieves the relevant social title for the subtype from the options. - * - * @param string $title The default title. - * @param string $object_subtype The subtype of the current indexable. - * - * @return mixed|string The filtered value. - */ - public function filter_title_for_subtype( $title, $object_subtype ) { - $social_title = $this->options->get( $this::OPTION_TITLES_KEY_TITLE . $object_subtype ); - - if ( ! empty( $social_title ) ) { - $title = $social_title; - } - - return $title; - } - - /** - * Retrieves the relevant social description for the subtype from the options. - * - * @param string $description The default description. - * @param string $object_subtype The subtype of the current indexable. - * - * @return mixed|string The filtered value. - */ - public function filter_description_for_subtype( $description, $object_subtype ) { - $social_description = $this->options->get( $this::OPTION_TITLES_KEY_DESCRIPTION . $object_subtype ); - - if ( ! empty( $social_description ) ) { - $description = $social_description; - } - - return $description; - } - - /** - * Retrieves the relevant social image ID for the subtype from the options. - * - * @param int $id The default image ID. - * @param string $object_subtype The subtype of the current indexable. - * - * @return mixed|string The filtered value. - */ - public function filter_image_id_for_subtype( $id, $object_subtype ) { - $social_id = $this->options->get( $this::OPTION_TITLES_KEY_IMAGE_ID . $object_subtype ); - - if ( ! empty( $social_id ) ) { - $id = $social_id; - } - - return $id; - } - - /** - * Retrieves the relevant social image URL for the subtype from the options. - * - * @param string $url The default image URL. - * @param string $object_subtype The subtype of the current indexable. - * - * @return mixed|string The filtered value. - */ - public function filter_image_for_subtype( $url, $object_subtype ) { - $social_url = $this->options->get( $this::OPTION_TITLES_KEY_IMAGE . $object_subtype ); - - if ( ! empty( $social_url ) ) { - $url = $social_url; - } - - return $url; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/ai-consent-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/ai-consent-integration.php deleted file mode 100644 index fdfe0108..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/ai-consent-integration.php +++ /dev/null @@ -1,134 +0,0 @@ -asset_manager = $asset_manager; - $this->addon_manager = $addon_manager; - $this->options_helper = $options_helper; - $this->user_helper = $user_helper; - $this->wistia_embed_permission_repository = $wistia_embed_permission_repository; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - // Hide AI feature option in user profile if the user is not allowed to use it. - if ( \current_user_can( 'edit_posts' ) ) { - \add_action( 'wpseo_user_profile_additions', [ $this, 'render_user_profile' ], 12 ); - } - \add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ], 11 ); - } - - /** - * Enqueues the required assets. - * - * @return void - */ - public function enqueue_assets() { - $this->asset_manager->enqueue_style( 'premium-ai-generator' ); - - \wp_enqueue_script( 'wp-seo-premium-manage-ai-consent-button' ); - $user_id = $this->user_helper->get_current_user_id(); - \wp_localize_script( - 'wp-seo-premium-manage-ai-consent-button', - 'wpseoPremiumManageAiConsentButton', - [ - 'hasConsent' => $this->user_helper->get_meta( $user_id, '_yoast_wpseo_ai_consent', true ), - // Note: this is passing the Free plugin URL! As the image is located in there. - 'pluginUrl' => \plugins_url( '', \WPSEO_FILE ), - 'wistiaEmbedPermission' => $this->wistia_embed_permission_repository->get_value_for_user( $user_id ), - ] - ); - } - - /** - * Renders the AI consent button for the user profile. - * - * @return void - */ - public function render_user_profile() { - echo '', - ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/ai-generator-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/ai-generator-integration.php deleted file mode 100644 index efb2b628..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/ai-generator-integration.php +++ /dev/null @@ -1,138 +0,0 @@ -asset_manager = $asset_manager; - $this->addon_manager = $addon_manager; - $this->options_helper = $options_helper; - $this->user_helper = $user_helper; - $this->introductions_seen_repository = $introductions_seen_repository; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - if ( ! $this->options_helper->get( 'enable_ai_generator', false ) ) { - return; - } - - \add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - // Enqueue after Elementor_Premium integration, which re-registers the assets. - \add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'enqueue_assets' ], 11 ); - } - - /** - * Gets the subscription status for Yoast SEO Premium and Yoast WooCommerce SEO. - * - * @return array - */ - public function get_product_subscriptions() { - return [ - 'premiumSubscription' => $this->addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG ), - 'wooCommerceSubscription' => $this->addon_manager->has_valid_subscription( WPSEO_Addon_Manager::WOOCOMMERCE_SLUG ), - ]; - } - - /** - * Enqueues the required assets. - * - * @return void - */ - public function enqueue_assets() { - $user_id = $this->user_helper->get_current_user_id(); - - \wp_enqueue_script( 'wp-seo-premium-ai-generator' ); - \wp_localize_script( - 'wp-seo-premium-ai-generator', - 'wpseoPremiumAiGenerator', - [ - 'adminUrl' => \admin_url( 'admin.php' ), - 'hasConsent' => $this->user_helper->get_meta( $user_id, '_yoast_wpseo_ai_consent', true ), - 'productSubscriptions' => $this->get_product_subscriptions(), - 'hasSeenIntroduction' => $this->introductions_seen_repository->is_introduction_seen( $user_id, Ai_Generate_Titles_And_Descriptions_Introduction::ID ), - 'pluginUrl' => \plugins_url( '', \WPSEO_PREMIUM_FILE ), - 'postType' => \get_post_type(), - ] - ); - $this->asset_manager->enqueue_style( 'premium-ai-generator' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/cornerstone-column-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/cornerstone-column-integration.php deleted file mode 100644 index ddaf933e..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/cornerstone-column-integration.php +++ /dev/null @@ -1,230 +0,0 @@ -post_type_helper = $post_type_helper; - $this->wpdb = $wpdb; - $this->admin_columns_cache = $admin_columns_cache; - } - - /** - * {@inheritDoc} - */ - public function register_hooks() { - \add_filter( 'posts_clauses', [ $this, 'order_by_cornerstone' ], 1, 2 ); - \add_action( 'admin_init', [ $this, 'register_init_hooks' ] ); - - // Adds a filter to exclude the attachments from the cornerstone column. - \add_filter( 'wpseo_cornerstone_column_post_types', [ 'WPSEO_Post_Type', 'filter_attachment_post_type' ] ); - - \add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - } - - /** - * Register hooks that need to be registered after `init` due to all post types not yet being registered. - * - * @return void - */ - public function register_init_hooks() { - $public_post_types = \apply_filters( 'wpseo_cornerstone_column_post_types', $this->post_type_helper->get_accessible_post_types() ); - - if ( ! \is_array( $public_post_types ) || empty( $public_post_types ) ) { - return; - } - - foreach ( $public_post_types as $post_type ) { - \add_filter( 'manage_' . $post_type . '_posts_columns', [ $this, 'add_cornerstone_column' ] ); - \add_action( 'manage_' . $post_type . '_posts_custom_column', [ $this, 'column_content' ], 10, 2 ); - \add_filter( 'manage_edit-' . $post_type . '_sortable_columns', [ $this, 'column_sort' ] ); - } - } - - /** - * Enqueues the assets needed for the integration to work. - * - * @return void - */ - public function enqueue_assets() { - \wp_enqueue_style( WPSEO_Admin_Asset_Manager::PREFIX . 'premium-post-overview' ); - } - - /** - * Adds the columns for the post overview. - * - * @param array $columns Array with columns. - * - * @return array The extended array with columns. - */ - public function add_cornerstone_column( $columns ) { - if ( ! \is_array( $columns ) ) { - return $columns; - } - - $columns[ self::CORNERSTONE_COLUMN_NAME ] = \sprintf( - '%2$s', - \esc_attr__( 'Is this cornerstone content?', 'wordpress-seo-premium' ), - /* translators: Hidden accessibility text. */ - \esc_html__( 'Cornerstone content', 'wordpress-seo-premium' ) - ); - - return $columns; - } - - /** - * Modifies the query pieces to allow ordering column by cornerstone. - * - * @param array $pieces Array of Query pieces. - * @param WP_Query $query The Query on which to apply. - * - * @return array - */ - public function order_by_cornerstone( $pieces, $query ) { - if ( $query->get( 'orderby' ) !== self::CORNERSTONE_COLUMN_NAME ) { - return $pieces; - } - - return $this->build_sort_query_pieces( $pieces, $query ); - } - - /** - * Builds the pieces for a sorting query. - * - * @param array $pieces Array of Query pieces. - * @param WP_Query $query The Query on which to apply. - * - * @return array Modified Query pieces. - */ - protected function build_sort_query_pieces( $pieces, $query ) { - // We only want our code to run in the main WP query. - if ( ! $query->is_main_query() ) { - return $pieces; - } - - // Get the order query variable - ASC or DESC. - $order = \strtoupper( $query->get( 'order' ) ); - - // Make sure the order setting qualifies. If not, set default as ASC. - if ( ! \in_array( $order, [ 'ASC', 'DESC' ], true ) ) { - $order = 'ASC'; - } - - $table = Model::get_table_name( 'Indexable' ); - - $pieces['join'] .= " LEFT JOIN $table AS yoast_indexable ON yoast_indexable.object_id = {$this->wpdb->posts}.ID AND yoast_indexable.object_type = 'post' "; - $pieces['orderby'] = "yoast_indexable.is_cornerstone $order, FIELD( {$this->wpdb->posts}.post_status, 'publish' ) $order, {$pieces['orderby']}"; - - return $pieces; - } - - /** - * Displays the column content for the given column. - * - * @param string $column_name Column to display the content for. - * @param int $post_id Post to display the column content for. - * - * @return void - */ - public function column_content( $column_name, $post_id ) { - $indexable = $this->admin_columns_cache->get_indexable( $post_id ); - // Nothing to output if we don't have the value. - if ( empty( $indexable ) ) { - return; - } - - // phpcs:disable WordPress.Security.EscapeOutput -- Reason: The Icons contains safe svg. - if ( $column_name === self::CORNERSTONE_COLUMN_NAME ) { - if ( $indexable->is_cornerstone === true ) { - echo new Checkmark_Icon_Presenter( 20 ); - - return; - } - - echo new Cross_Icon_Presenter( 20 ); - } - // phpcs:enable - } - - /** - * Sets the sortable columns. - * - * @param array $columns Array with sortable columns. - * - * @return array The extended array with sortable columns. - */ - public function column_sort( $columns ) { - $columns[ self::CORNERSTONE_COLUMN_NAME ] = self::CORNERSTONE_COLUMN_NAME; - - return $columns; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/cornerstone-taxonomy-column-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/cornerstone-taxonomy-column-integration.php deleted file mode 100644 index 28572a89..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/cornerstone-taxonomy-column-integration.php +++ /dev/null @@ -1,141 +0,0 @@ -current_page_helper = $current_page_helper; - } - - /** - * {@inheritDoc} - */ - public static function get_conditionals() { - return [ - Admin_Conditional::class, - Term_Overview_Or_Ajax_Conditional::class, - Cornerstone_Enabled_Conditional::class, - ]; - } - - /** - * {@inheritDoc} - */ - public function register_hooks() { - \add_action( 'admin_init', [ $this, 'register_init_hooks' ] ); - \add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - } - - /** - * Register hooks that need to be registered after `init` due to all post types not yet being registered. - * - * @return void - */ - public function register_init_hooks() { - $taxonomy = $this->current_page_helper->get_current_taxonomy(); - $is_product = $this->current_page_helper->get_current_post_type() === 'product'; - $is_product_cat = $taxonomy === 'product_cat'; - $is_product_tag = $taxonomy === 'product_tag'; - - if ( ( $is_product && ( $is_product_cat || $is_product_tag ) ) || ( ! $is_product && $taxonomy ) ) { - \add_filter( 'manage_edit-' . $taxonomy . '_columns', [ $this, 'add_cornerstone_column' ] ); - \add_filter( 'manage_' . $taxonomy . '_custom_column', [ $this, 'column_content' ], 10, 3 ); - } - } - - /** - * Enqueues the assets needed for the integration to work. - * - * @return void - */ - public function enqueue_assets() { - \wp_enqueue_style( WPSEO_Admin_Asset_Manager::PREFIX . 'premium-post-overview' ); - } - - /** - * Adds the cornerstone column for the term overview. - * - * @param array $columns Array with columns. - * - * @return array The extended array with columns. - */ - public function add_cornerstone_column( $columns ) { - if ( ! \is_array( $columns ) ) { - return $columns; - } - - $columns[ self::CORNERSTONE_COLUMN_NAME ] = \sprintf( - ' - - %2$s - - ', - \esc_attr__( 'Is this cornerstone content?', 'wordpress-seo-premium' ), - /* translators: Hidden accessibility text. */ - \esc_html__( 'Cornerstone content', 'wordpress-seo-premium' ) - ); - - return $columns; - } - - /** - * Displays the column content for the given column. - * - * @param string $content The current content of the column. - * @param string $column_name The name of the column. - * @param int $term_id ID of requested taxonomy. - * - * @return string - */ - public function column_content( $content, $column_name, $term_id ) { - $is_cornerstone = (int) WPSEO_Taxonomy_Meta::get_term_meta( $term_id, $this->current_page_helper->get_current_taxonomy(), 'is_cornerstone' ); - - if ( $column_name === self::CORNERSTONE_COLUMN_NAME ) { - if ( $is_cornerstone ) { - // phpcs:disable WordPress.Security.EscapeOutput -- Reason: The Icons contains safe svg. - echo new Checkmark_Icon_Presenter( 20 ); - - return; - } - - echo new Cross_Icon_Presenter( 20 ); - } - - return $content; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/inclusive-language-column-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/inclusive-language-column-integration.php deleted file mode 100644 index f5846448..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/inclusive-language-column-integration.php +++ /dev/null @@ -1,233 +0,0 @@ -post_type_helper = $post_type_helper; - $this->score_icon_helper = $score_icon_helper; - $this->wpdb = $wpdb; - $this->admin_columns_cache = $admin_columns_cache; - } - - /** - * {@inheritDoc} - */ - public function register_hooks() { - \add_filter( 'posts_clauses', [ $this, 'order_by_inclusive_language_score' ], 1, 2 ); - \add_action( 'admin_init', [ $this, 'register_init_hooks' ] ); - - // Adds a filter to exclude the attachments from the inclusive language column. - \add_filter( 'wpseo_inclusive_language_column_post_types', [ 'WPSEO_Post_Type', 'filter_attachment_post_type' ] ); - - \add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - } - - /** - * Register hooks that need to be registered after `init` due to all post types not yet being registered. - * - * @return void - */ - public function register_init_hooks() { - $public_post_types = \apply_filters( 'wpseo_inclusive_language_column_post_types', $this->post_type_helper->get_accessible_post_types() ); - - if ( ! \is_array( $public_post_types ) || empty( $public_post_types ) ) { - return; - } - - foreach ( $public_post_types as $post_type ) { - \add_filter( 'manage_' . $post_type . '_posts_columns', [ $this, 'add_inclusive_language_column' ] ); - \add_action( 'manage_' . $post_type . '_posts_custom_column', [ $this, 'column_content' ], 10, 2 ); - \add_filter( 'manage_edit-' . $post_type . '_sortable_columns', [ $this, 'column_sort' ] ); - } - } - - /** - * Enqueues the assets needed for the integration to work. - * - * @return void - */ - public function enqueue_assets() { - \wp_enqueue_style( WPSEO_Admin_Asset_Manager::PREFIX . 'premium-post-overview' ); - } - - /** - * Adds the inclusive language column for the post overview. - * - * @param array $columns Array with columns. - * - * @return array The extended array with columns. - */ - public function add_inclusive_language_column( $columns ) { - if ( ! \is_array( $columns ) ) { - return $columns; - } - - $columns[ self::INCLUSIVE_LANGUAGE_COLUMN_NAME ] = \sprintf( - '%2$s', - \esc_attr__( 'Inclusive language score', 'wordpress-seo-premium' ), - \esc_html__( 'Inclusive language score', 'wordpress-seo-premium' ) - ); - - return $columns; - } - - /** - * Modifies the query pieces to allow ordering column by inclusive language score. - * - * @param array $pieces Array of Query pieces. - * @param WP_Query $query The Query on which to apply. - * - * @return array - */ - public function order_by_inclusive_language_score( $pieces, $query ) { - if ( $query->get( 'orderby' ) !== self::INCLUSIVE_LANGUAGE_COLUMN_NAME ) { - return $pieces; - } - - return $this->build_sort_query_pieces( $pieces, $query ); - } - - /** - * Builds the pieces for a sorting query. - * - * @param array $pieces Array of Query pieces. - * @param WP_Query $query The Query on which to apply. - * - * @return array Modified Query pieces. - */ - protected function build_sort_query_pieces( $pieces, $query ) { - // We only want our code to run in the main WP query. - if ( ! $query->is_main_query() ) { - return $pieces; - } - - // Get the order query variable - ASC or DESC. - $order = \strtoupper( $query->get( 'order' ) ); - - // Make sure the order setting qualifies. If not, set default as ASC. - if ( ! \in_array( $order, [ 'ASC', 'DESC' ], true ) ) { - $order = 'ASC'; - } - - $table = Model::get_table_name( 'Indexable' ); - - $pieces['join'] .= " LEFT JOIN $table AS yoast_indexable ON yoast_indexable.object_id = {$this->wpdb->posts}.ID AND yoast_indexable.object_type = 'post' "; - $pieces['orderby'] = "yoast_indexable.inclusive_language_score $order, {$pieces['orderby']}"; - - return $pieces; - } - - /** - * Displays the column content for the given column. - * - * @param string $column_name Column to display the content for. - * @param int $post_id Post to display the column content for. - * - * @return void - */ - public function column_content( $column_name, $post_id ) { - $indexable = $this->admin_columns_cache->get_indexable( $post_id ); - // Nothing to output if we don't have the value. - if ( empty( $indexable ) ) { - return; - } - - if ( $column_name === self::INCLUSIVE_LANGUAGE_COLUMN_NAME ) { - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Correctly escaped through the Score_Icon_Helper. - echo $this->score_icon_helper->for_inclusive_language( $indexable->inclusive_language_score ); - } - } - - /** - * Sets the sortable columns. - * - * @param array $columns Array with sortable columns. - * - * @return array The extended array with sortable columns. - */ - public function column_sort( $columns ) { - $columns[ self::INCLUSIVE_LANGUAGE_COLUMN_NAME ] = self::INCLUSIVE_LANGUAGE_COLUMN_NAME; - - return $columns; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/inclusive-language-filter-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/inclusive-language-filter-integration.php deleted file mode 100644 index d0da7057..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/inclusive-language-filter-integration.php +++ /dev/null @@ -1,165 +0,0 @@ -' - /* translators: Hidden accessibility text. */ - . \esc_html__( 'Filter by Inclusive Language Score', 'wordpress-seo-premium' ) - . ''; - echo ''; - } - - /** - * Generates an '; - } - - /** - * Retrieves the current inclusive language score filter value from the $_GET variable. - * - * @return string|null The sanitized inclusive language score filter value or null when the variable is not set in $_GET. - */ - public function get_current_inclusive_language_filter() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['inclusive_language_filter'] ) && \is_string( $_GET['inclusive_language_filter'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - return \sanitize_text_field( \wp_unslash( $_GET['inclusive_language_filter'] ) ); - } - return null; - } - - /** - * Determines the inclusive language score filter to the meta query, based on the passed inclusive language filter. - * - * @param string $inclusive_language_filter The inclusive language filter to use to determine what further filter to apply. - * - * @return array The inclusive language score filter. - */ - public function determine_inclusive_language_filters( $inclusive_language_filter ) { - $rank = new WPSEO_Rank( $inclusive_language_filter ); - - return $this->create_inclusive_language_score_filter( $rank->get_starting_score(), $rank->get_end_score() ); - } - - /** - * Creates an inclusive language score filter. - * - * @param number $low The lower boundary of the score. - * @param number $high The higher boundary of the score. - * - * @return array The inclusive language score filter. - */ - protected function create_inclusive_language_score_filter( $low, $high ) { - return [ - [ - 'key' => WPSEO_Meta::$meta_prefix . 'inclusive_language_score', - 'value' => [ $low, $high ], - 'type' => 'numeric', - 'compare' => 'BETWEEN', - ], - ]; - } - - /** - * Adds the inclusive language filter to the list of active filters -- if it has been used for filtering. - * - * @param array $active_filters The currently active filters. - * @return array The active filters, including the inclusive language filter -- if it has been used for filtering. - */ - public function add_inclusive_language_filter( $active_filters ) { - $inclusive_language_filter = $this->get_current_inclusive_language_filter(); - - if ( \is_string( $inclusive_language_filter ) && $inclusive_language_filter !== '' ) { - $active_filters = \array_merge( - $active_filters, - $this->determine_inclusive_language_filters( $inclusive_language_filter ) - ); - } - - return $active_filters; - } - - /** - * Adds the inclusive language score field to the order by part of the query -- if it has been selected during filtering. - * - * @param array $order_by The current order by statement. - * @param string $order_by_column The column to use for ordering. - * @return array The order by. - */ - public function add_inclusive_language_order_by( $order_by, $order_by_column = '' ) { - if ( $order_by === [] && $order_by_column === Inclusive_Language_Column_Integration::INCLUSIVE_LANGUAGE_COLUMN_NAME ) { - return [ - // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: Only used when user requests sorting. - 'meta_key' => WPSEO_Meta::$meta_prefix . 'inclusive_language_score', - 'orderby' => 'meta_value_num', - ]; - } - - return $order_by; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/inclusive-language-taxonomy-column-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/inclusive-language-taxonomy-column-integration.php deleted file mode 100644 index b5cc79f1..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/inclusive-language-taxonomy-column-integration.php +++ /dev/null @@ -1,144 +0,0 @@ -score_icon_helper = $score_icon_helper; - $this->current_page_helper = $current_page_helper; - } - - /** - * {@inheritDoc} - */ - public function register_hooks() { - \add_action( 'admin_init', [ $this, 'register_init_hooks' ] ); - \add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - } - - /** - * Register hooks that need to be registered after `init` due to all post types not yet being registered. - * - * @return void - */ - public function register_init_hooks() { - $taxonomy = $this->current_page_helper->get_current_taxonomy(); - $is_product = $this->current_page_helper->get_current_post_type() === 'product'; - $is_product_cat = $taxonomy === 'product_cat'; - $is_product_tag = $taxonomy === 'product_tag'; - - if ( ( $is_product && ( $is_product_cat || $is_product_tag ) ) || ( ! $is_product && $taxonomy ) ) { - \add_filter( 'manage_edit-' . $taxonomy . '_columns', [ $this, 'add_inclusive_language_column' ] ); - \add_filter( 'manage_' . $taxonomy . '_custom_column', [ $this, 'column_content' ], 10, 3 ); - } - } - - /** - * Enqueues the assets needed for the integration to work. - * - * @return void - */ - public function enqueue_assets() { - \wp_enqueue_style( WPSEO_Admin_Asset_Manager::PREFIX . 'premium-post-overview' ); - } - - /** - * Adds the inclusive language column for the term overview. - * - * @param array $columns Array with columns. - * - * @return array The extended array with columns. - */ - public function add_inclusive_language_column( $columns ) { - if ( ! \is_array( $columns ) ) { - return $columns; - } - - $columns[ self::INCLUSIVE_LANGUAGE_COLUMN_NAME ] = \sprintf( - ' - - %2$s - - ', - \esc_attr__( 'Inclusive language score', 'wordpress-seo-premium' ), - \esc_html__( 'Inclusive language score', 'wordpress-seo-premium' ) - ); - - return $columns; - } - - /** - * Displays the column content for the given column. - * - * @param string $content The current content of the column. - * @param string $column_name The name of the column. - * @param int $term_id ID of requested taxonomy. - * - * @return string - */ - public function column_content( $content, $column_name, $term_id ) { - $score = (int) WPSEO_Taxonomy_Meta::get_term_meta( $term_id, $this->current_page_helper->get_current_taxonomy(), 'inclusive_language_score' ); - - if ( $column_name === self::INCLUSIVE_LANGUAGE_COLUMN_NAME ) { - return $this->score_icon_helper->for_inclusive_language( $score ); - } - - return $content; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/keyword-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/keyword-integration.php deleted file mode 100644 index ce482f59..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/keyword-integration.php +++ /dev/null @@ -1,89 +0,0 @@ - [ - [ - 'key' => '_yoast_wpseo_focuskeywords', - 'value' => \sprintf( '"keyword":"%s"', $keyword ), - 'compare' => 'LIKE', - ], - ], - 'post__not_in' => [ $post_id ], - 'fields' => 'ids', - 'post_type' => 'any', - - /* - * We only need to return zero, one or two results: - * - Zero: keyword hasn't been used before - * - One: Keyword has been used once before - * - Two or more: Keyword has been used twice or more before - */ - 'posts_per_page' => 2, - ]; - $get_posts = new WP_Query( $query ); - return \array_merge( $post_ids, $get_posts->posts ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/metabox-formatter-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/metabox-formatter-integration.php deleted file mode 100644 index 29d6d045..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/metabox-formatter-integration.php +++ /dev/null @@ -1,61 +0,0 @@ -get_upgrade_link(); - return \array_filter( - $links, - static function ( $link ) use ( $link_to_remove ) { - return $link !== $link_to_remove; - } - ); - } - - /** - * Adds the upgrade link to the premium actions. - * - * @param string[] $links The action links. - * - * @return string[] The action link with the upgrade link added. - */ - public function add_yoast_seo_premium_action_link( $links ) { - $addon_manager = new WPSEO_Addon_Manager(); - - if ( ! $addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG ) ) { - \array_unshift( $links, $this->get_upgrade_link() ); - } - - return $links; - } - - /** - * Returns the upgrade link. - * - * @return string The upgrade link. - */ - protected function get_upgrade_link() { - // phpcs:ignore WordPress.WP.I18n.TextDomainMismatch -- Reason: text is originally from Yoast SEO. - return '' . \__( 'Activate your subscription', 'wordpress-seo' ) . ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/prominent-words/indexing-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/prominent-words/indexing-integration.php deleted file mode 100644 index bef533f8..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/prominent-words/indexing-integration.php +++ /dev/null @@ -1,243 +0,0 @@ -language_helper = $language_helper; - $this->url_helper = $url_helper; - $this->prominent_words_helper = $prominent_words_helper; - - // Indexation actions are used to calculate the number of unindexed objects. - $this->indexing_actions = [ - // Get the number of indexables that haven't had their prominent words indexed yet. - $content_indexation_action, - - // Take posts and terms into account that do not have indexables yet. - // These need to be counted again here (in addition to being counted in Free) because them being unindexed - // means that the above prominent words unindexed count couldn't detect these posts/terms for prominent words indexing. - $post_indexation_action, - $term_indexation_action, - $general_indexation_action, - $post_type_archive_indexation_action, - ]; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - \add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); - - \add_filter( 'wpseo_indexing_data', [ $this, 'adapt_indexing_data' ] ); - \add_filter( 'wpseo_indexing_get_unindexed_count', [ $this, 'get_unindexed_count' ] ); - \add_filter( 'wpseo_indexing_get_limited_unindexed_count', [ $this, 'get_limited_unindexed_count' ], 10, 2 ); - \add_filter( 'wpseo_indexing_endpoints', [ $this, 'add_endpoints' ] ); - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * @return array - */ - public static function get_conditionals() { - return [ - Admin_Conditional::class, - Migrations_Conditional::class, - ]; - } - - /** - * Retrieves the endpoints to call. - * - * @param array $endpoints The endpoints to extend. - * - * @return array The endpoints. - */ - public function add_endpoints( $endpoints ) { - $endpoints['get_content'] = Prominent_Words_Route::FULL_GET_CONTENT_ROUTE; - $endpoints['complete_words'] = Prominent_Words_Route::FULL_COMPLETE_ROUTE; - - return $endpoints; - } - - /** - * Adapts the indexing data as sent to the JavaScript side of the - * indexing process. - * - * Adds the appropriate prominent words endpoints and other settings. - * - * @param array $data The data to be adapted. - * - * @return array The adapted indexing data. - */ - public function adapt_indexing_data( $data ) { - $site_locale = \get_locale(); - $language = WPSEO_Language_Utils::get_language( $site_locale ); - - $data['locale'] = $site_locale; - $data['language'] = $language; - - $data['morphologySupported'] = $this->language_helper->is_word_form_recognition_active( $language ); - - $per_indexable_limit = self::PER_INDEXABLE_LIMIT_NO_FUNCTION_WORD_SUPPORT; - if ( $this->language_helper->has_function_word_support( $language ) ) { - $per_indexable_limit = self::PER_INDEXABLE_LIMIT; - } - - $data['prominentWords'] = [ - 'endpoint' => Prominent_Words_Route::FULL_SAVE_ROUTE, - 'perIndexableLimit' => $per_indexable_limit, - ]; - - return $data; - } - - /** - * Enqueues the required scripts. - * - * @return void - */ - public function enqueue_scripts() { - if ( ! isset( $_GET['page'] ) - || ( $_GET['page'] !== 'wpseo_tools' && $_GET['page'] !== 'wpseo_workouts' && $_GET['page'] !== 'wpseo_dashboard' ) - || ( $_GET['page'] === 'wpseo_tools' && isset( $_GET['tool'] ) ) - ) { - return; - } - - $is_completed = ( (int) $this->get_unindexed_count( 0 ) === 0 ); - $this->prominent_words_helper->set_indexing_completed( $is_completed ); - - \wp_enqueue_script( 'yoast-premium-prominent-words-indexation' ); - \wp_localize_script( 'yoast-premium-prominent-words-indexation', 'wpseoPremiumIndexationData', [ 'licensedURL' => $this->url_helper->network_safe_home_url() ] ); - } - - /** - * Returns the total number of unindexed objects. - * - * @param int $unindexed_count The unindexed count. - * - * @return int The total number of indexables to recalculate. - */ - public function get_unindexed_count( $unindexed_count ) { - foreach ( $this->indexing_actions as $indexing_action ) { - $unindexed_count += $indexing_action->get_total_unindexed(); - } - return $unindexed_count; - } - - /** - * Returns a limited number of unindexed objects. - * - * @param int $unindexed_count The unindexed count. - * @param int $limit Limit the number of unindexed objects that are counted. - * - * @return int The total number of unindexed objects. - */ - public function get_limited_unindexed_count( $unindexed_count, $limit ) { - foreach ( $this->indexing_actions as $indexing_action ) { - $unindexed_count += $indexing_action->get_limited_unindexed_count( $limit - $unindexed_count + 1 ); - if ( $unindexed_count > $limit ) { - return $unindexed_count; - } - } - - return $unindexed_count; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/prominent-words/metabox-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/prominent-words/metabox-integration.php deleted file mode 100644 index 8b947ea1..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/prominent-words/metabox-integration.php +++ /dev/null @@ -1,119 +0,0 @@ -save_action = $save_action; - } - - /** - * Implements the register_hooks function of the Integration interface. - * - * @return void - */ - public function register_hooks() { - \add_filter( 'wpseo_metabox_entries_general', [ $this, 'add_words_for_linking_hidden_field' ] ); - \add_filter( 'update_post_metadata', [ $this, 'save_prominent_words_for_post' ], 10, 4 ); - - \add_filter( 'wpseo_taxonomy_content_fields', [ $this, 'add_words_for_linking_hidden_field' ] ); - \add_action( 'edit_term', [ $this, 'save_prominent_words_for_term' ] ); - } - - /** - * Adds a hidden field for the prominent words to the metabox. - * - * @param array $field_defs The definitions for the input fields. - * - * @return array The definitions for the input fields. - */ - public function add_words_for_linking_hidden_field( $field_defs ) { - if ( \is_array( $field_defs ) ) { - $field_defs['words_for_linking'] = [ - 'type' => 'hidden', - 'title' => 'words_for_linking', - 'label' => '', - 'options' => '', - ]; - } - - return $field_defs; - } - - /** - * Saves the value of the _yoast_wpseo_words_for_linking hidden field to the prominent_words table, not postmeta. - * Added to the 'update_post_metadata' filter. - * - * @param false|null $check Whether to allow updating metadata for the given type. - * @param int $object_id The post id. - * @param string $meta_key The key of the metadata. - * @param mixed $meta_value The value of the metadata. - * - * @return false|null Non-null value if meta data should not be updated. - * Null if the metadata should be updated as normal. - */ - public function save_prominent_words_for_post( $check, $object_id, $meta_key, $meta_value ) { - if ( $meta_key !== '_yoast_wpseo_words_for_linking' ) { - return $check; - } - - // If the save was triggered with an empty meta value, don't update the prominent words. - if ( empty( $meta_value ) ) { - return false; - } - - // 1. Decode from stringified JSON. - $words_for_linking = \json_decode( $meta_value, true ); - // 2. Save prominent words using the existing functionality. - $this->save_action->link( 'post', $object_id, $words_for_linking ); - - // 3. Return non-null value so we don't save prominent words to the `post_meta` table. - return false; - } - - /** - * Saves the prominent words for a term. - * - * @param int $term_id The term id to save the words for. - * - * @return void - */ - public function save_prominent_words_for_term( $term_id ) { - // phpcs:disable WordPress.Security.NonceVerification.Missing -- The nonce is already validated. - if ( ! isset( $_POST['wpseo_words_for_linking'] ) ) { - return; - } - - $words_for_linking = []; - if ( ! empty( $_POST['wpseo_words_for_linking'] ) ) { - $prominent_words = \sanitize_text_field( \wp_unslash( $_POST['wpseo_words_for_linking'] ) ); - // phpcs:enable - $words_for_linking = \json_decode( $prominent_words, true ); - } - - $this->save_action->link( 'term', $term_id, $words_for_linking ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/related-keyphrase-filter-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/related-keyphrase-filter-integration.php deleted file mode 100644 index 7729af47..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/related-keyphrase-filter-integration.php +++ /dev/null @@ -1,66 +0,0 @@ - 'OR', - $keyphrase_filter, - $this->get_related_keyphrase_filter( $keyphrase ), - ]; - } - - /** - * Returns the filter to use within the WP Meta Query to filter - * on related keyphrase. - * - * @param string $focus_keyphrase The focus keyphrase to filter on. - * - * @return array The filter. - */ - private function get_related_keyphrase_filter( $focus_keyphrase ) { - return [ - 'post_type' => \get_query_var( 'post_type', 'post' ), - 'key' => WPSEO_Meta::$meta_prefix . 'focuskeywords', - 'value' => '"keyword":"' . \sanitize_text_field( $focus_keyphrase ) . '"', - 'compare' => 'LIKE', - ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/replacement-variables-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/replacement-variables-integration.php deleted file mode 100644 index 18ed75b5..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/replacement-variables-integration.php +++ /dev/null @@ -1,130 +0,0 @@ -load_metabox( $this->get_current_page() ) ) { - return; - } - - \wp_enqueue_script( 'yoast-seo-premium-draft-js-plugins' ); - - \wp_enqueue_style( 'yoast-seo-premium-draft-js-plugins' ); - - $draft_js_external_script_location = 'https://yoast.com/shared-assets/scripts/wp-seo-premium-draft-js-plugins-source-2.0.0.min.js'; - - if ( \file_exists( \WPSEO_PREMIUM_PATH . 'assets/js/external/draft-js-emoji-picker.min.js' ) ) { - $draft_js_external_script_location = \plugins_url( 'wordpress-seo-premium/assets/js/external/draft-js-emoji-picker.min.js' ); - } - - \wp_enqueue_script( - 'yoast-seo-premium-draft-js-plugins-external', - $draft_js_external_script_location, - [ - 'yoast-seo-premium-commons', - WPSEO_Admin_Asset_Manager::PREFIX . 'search-metadata-previews', - ], - \WPSEO_PREMIUM_VERSION, - false - ); - } - - /** - * Checks whether or not the metabox related scripts should be loaded. - * - * @codeCoverageIgnore - * - * @param string $current_page The page we are on. - * - * @return bool True when it should be loaded. - */ - protected function load_metabox( $current_page ) { - $page_helper = new Current_Page_Helper(); - // When the current page is a term related one. - if ( WPSEO_Taxonomy::is_term_edit( $current_page ) || WPSEO_Taxonomy::is_term_overview( $current_page ) ) { - return WPSEO_Options::get( 'display-metabox-tax-' . $page_helper->get_current_taxonomy() ); - } - - // When the current page isn't a post related one. - if ( WPSEO_Metabox::is_post_edit( $current_page ) || WPSEO_Metabox::is_post_overview( $current_page ) ) { - return WPSEO_Post_Type::has_metabox_enabled( $page_helper->get_current_post_type() ); - } - - // Make sure ajax integrations are loaded. - return \wp_doing_ajax(); - } - - /** - * Retrieves the value of the pagenow variable. - * - * @codeCoverageIgnore - * - * @return string The value of pagenow. - */ - private function get_current_page() { - global $pagenow; - - return $pagenow; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/settings-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/settings-integration.php deleted file mode 100644 index 0c761146..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/settings-integration.php +++ /dev/null @@ -1,71 +0,0 @@ -asset_manager = $asset_manager; - $this->current_page_helper = $current_page_helper; - } - - /** - * Returns the conditionals based on which this loadable should be active. - * - * @return array - */ - public static function get_conditionals() { - return [ Settings_Conditional::class ]; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - // Are we on the settings page? - if ( $this->current_page_helper->get_current_yoast_seo_page() === 'wpseo_page_settings' ) { - \add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - } - } - - /** - * Enqueues the assets. - * - * @return void - */ - public function enqueue_assets() { - $this->asset_manager->enqueue_style( 'premium-settings' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/thank-you-page-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/thank-you-page-integration.php deleted file mode 100644 index 9d269cec..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/thank-you-page-integration.php +++ /dev/null @@ -1,114 +0,0 @@ -options_helper = $options_helper; - } - - /** - * {@inheritDoc} - */ - public function register_hooks() { - \add_filter( 'admin_menu', [ $this, 'add_submenu_page' ], 9 ); - \add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - \add_action( 'admin_init', [ $this, 'maybe_redirect' ] ); - } - - /** - * Redirects to the installation success page if an installation has just occured. - * - * @return void - */ - public function maybe_redirect() { - if ( ! $this->options_helper->get( 'should_redirect_after_install' ) ) { - return; - } - $this->options_helper->set( 'should_redirect_after_install', false ); - - if ( ! empty( $this->options_helper->get( 'activation_redirect_timestamp' ) ) ) { - return; - } - $this->options_helper->set( 'activation_redirect_timestamp', \time() ); - - \wp_safe_redirect( \admin_url( 'admin.php?page=wpseo_installation_successful' ), 302, 'Yoast SEO Premium' ); - exit; - } - - /** - * Adds the workouts submenu page. - * - * @param array $submenu_pages The Yoast SEO submenu pages. - * - * @return array the filtered submenu pages. - */ - public function add_submenu_page( $submenu_pages ) { - \add_submenu_page( - '', - \__( 'Installation Successful', 'wordpress-seo-premium' ), - '', - 'manage_options', - 'wpseo_installation_successful', - [ $this, 'render_page' ] - ); - - return $submenu_pages; - } - - /** - * Enqueue assets on the Thank you page. - * - * @return void - */ - public function enqueue_assets() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Date is not processed or saved. - if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'wpseo_installation_successful' ) { - return; - } - - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_style( 'monorepo' ); - \wp_enqueue_style( 'yoast-seo-premium-thank-you' ); - } - - /** - * Renders the thank you page. - * - * @return void - */ - public function render_page() { - require \WPSEO_PREMIUM_PATH . 'classes/views/thank-you.php'; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/update-premium-notification.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/update-premium-notification.php deleted file mode 100644 index a4f49214..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/update-premium-notification.php +++ /dev/null @@ -1,177 +0,0 @@ -options_helper = $options_helper; - $this->version_helper = $version_helper; - $this->capability_helper = $capability_helper; - $this->admin_asset_manager = $admin_asset_manager; - $this->current_page_helper = $current_page_helper; - } - - /** - * {@inheritDoc} - */ - public function register_hooks() { - \add_action( 'admin_notices', [ $this, 'maybe_display_notification' ] ); - \add_action( 'wp_ajax_dismiss_update_premium_notification', [ $this, 'dismiss_update_premium_notification' ] ); - } - - /** - * Shows a notice if Free is newer than the minimum required version and Premium has an update available. - * - * @return void - */ - public function maybe_display_notification() { - if ( $this->current_page_helper->get_current_admin_page() === 'update.php' ) { - return; - } - - if ( $this->notice_was_dismissed_on_current_premium_version() ) { - return; - } - - if ( ! $this->capability_helper->current_user_can( 'wpseo_manage_options' ) ) { - return; - } - - // Check whether Free is set to a version later than the minimum required and a Premium update is a available. - if ( $this->version_helper->is_free_upgraded() && $this->version_helper->is_premium_update_available() ) { - $this->admin_asset_manager->enqueue_style( 'monorepo' ); - - $is_plugins_page = $this->current_page_helper->get_current_admin_page() === 'plugins.php'; - $content = \sprintf( - /* translators: 1: Yoast SEO Premium, 2 and 3: opening and closing anchor tag. */ - \esc_html__( 'Please %2$supdate %1$s to the latest version%3$s to ensure you can fully use all Premium settings and features.', 'wordpress-seo-premium' ), - 'Yoast SEO Premium', - ( $is_plugins_page ) ? '' : '', - ( $is_plugins_page ) ? '' : '' - ); - // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped -- Output of the title escaped in the Notice_Presenter. - echo new Notice_Presenter( - /* translators: 1: Yoast SEO Premium */ - \sprintf( \__( 'Update to the latest version of %1$s!', 'wordpress-seo-premium' ), 'Yoast SEO Premium' ), - $content, - null, - null, - true, - 'yoast-update-premium-notification' - ); - // phpcs:enable - - // Enable permanently dismissing the notice. - echo ""; - } - } - - /** - * Dismisses the old premium notice. - * - * @return bool - */ - public function dismiss_update_premium_notification() { - return $this->options_helper->set( 'dismiss_update_premium_notification', \WPSEO_PREMIUM_VERSION ); - } - - /** - * Returns whether the notification was dismissed in the current Premium version. - * - * @return bool Whether the notification was dismissed in the current Premium version. - */ - protected function notice_was_dismissed_on_current_premium_version() { - $dismissed_notification_version = $this->options_helper->get( 'dismiss_update_premium_notification', '' ); - if ( ! empty( $dismissed_notification_version ) ) { - return \version_compare( $dismissed_notification_version, \WPSEO_PREMIUM_VERSION, '>=' ); - } - - return false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/user-profile-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/user-profile-integration.php deleted file mode 100644 index 2e253c3f..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/user-profile-integration.php +++ /dev/null @@ -1,238 +0,0 @@ -set_fields(); - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - \add_action( 'show_user_profile', [ $this, 'user_profile' ], 5 ); - \add_action( 'edit_user_profile', [ $this, 'user_profile' ], 5 ); - - \add_action( 'personal_options_update', [ $this, 'process_user_option_update' ] ); - \add_action( 'edit_user_profile_update', [ $this, 'process_user_option_update' ] ); - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * @return array - */ - public static function get_conditionals() { - return [ Admin_Conditional::class ]; - } - - /** - * Sets the fields and their labels and descriptions. - * - * @return void - */ - private function set_fields() { - $this->fields = [ - 'basicInfo' => [ - 'label' => \__( 'Basic information', 'wordpress-seo-premium' ), - 'type' => 'group', - ], - 'honorificPrefix' => [ - 'label' => \__( 'Honorific prefix', 'wordpress-seo-premium' ), - /* translators: %1$s is replaced by ``, %2$s by ``. */ - 'description' => \sprintf( \esc_html__( 'E.g. %1$sDr%2$s, %1$sMs%2$s, %1$sMr%2$s', 'wordpress-seo-premium' ), '', '' ), - 'type' => 'string', - ], - 'honorificSuffix' => [ - 'label' => \__( 'Honorific suffix', 'wordpress-seo-premium' ), - /* translators: %1$s is replaced by ``, %2$s by ``. */ - 'description' => \sprintf( \esc_html__( 'E.g. %1$sMD%2$s, %1$sPhD%2$s', 'wordpress-seo-premium' ), '', '' ), - 'type' => 'string', - ], - 'birthDate' => [ - 'label' => \__( 'Birth date', 'wordpress-seo-premium' ), - /* translators: %1$s is replaced by ``, %2$s by ``. */ - 'description' => \sprintf( \esc_html__( 'Use format: %1$sYYYY-MM-DD%2$s', 'wordpress-seo-premium' ), '', '' ), - 'type' => 'date', - ], - 'gender' => [ - 'label' => \__( 'Gender', 'wordpress-seo-premium' ), - /* translators: %1$s is replaced by ``, %2$s by ``. */ - 'description' => \sprintf( \esc_html__( 'E.g. %1$sfemale%2$s, %1$smale%2$s, %1$snon-binary%2$s', 'wordpress-seo-premium' ), '', '' ), - 'type' => 'string', - ], - 'extraInfo' => [ - 'label' => \__( 'Extra information', 'wordpress-seo-premium' ), - 'type' => 'group', - ], - 'award' => [ - 'label' => \__( 'Awards', 'wordpress-seo-premium' ), - /* translators: %1$s is replaced by ``, %2$s by ``. */ - 'description' => \sprintf( \esc_html__( 'Comma separated, e.g. %1$sMost likely to succeed - 1991, Smartest in class - 1990%2$s', 'wordpress-seo-premium' ), '', '' ), - 'type' => 'array', - ], - 'knowsAbout' => [ - 'label' => \__( 'Expertise in', 'wordpress-seo-premium' ), - /* translators: %1$s is replaced by ``, %2$s by ``. */ - 'description' => \sprintf( \esc_html__( 'Comma separated, e.g. %1$sPHP, JavaScript, 90\'s rock music%2$s', 'wordpress-seo-premium' ), '', '' ), - 'type' => 'array', - ], - 'knowsLanguage' => [ - 'label' => \__( 'Language(s) spoken', 'wordpress-seo-premium' ), - /* translators: %1$s is replaced by ``, %2$s by ``. */ - 'description' => \sprintf( \esc_html__( 'Comma separated, e.g. %1$sEnglish, French, Dutch%2$s', 'wordpress-seo-premium' ), '', '' ), - 'type' => 'array', - ], - 'jobInfo' => [ - 'label' => \__( 'Employer information', 'wordpress-seo-premium' ), - 'type' => 'group', - ], - 'jobTitle' => [ - 'label' => \__( 'Job title', 'wordpress-seo-premium' ), - /* translators: %1$s is replaced by ``, %2$s by ``. */ - 'description' => \sprintf( \esc_html__( 'E.g. %1$ssoftware engineer%2$s', 'wordpress-seo-premium' ), '', '' ), - 'type' => 'string', - ], - 'worksFor' => [ - 'label' => \__( 'Employer name', 'wordpress-seo-premium' ), - /* translators: %1$s is replaced by ``, %2$s by ``. */ - 'description' => \sprintf( \esc_html__( 'E.g. %1$sAcme inc%2$s', 'wordpress-seo-premium' ), '', '' ), - 'type' => 'string', - ], - ]; - } - - /** - * Shows a form to add Schema fields to a user. - * - * @param WP_User $user The current page's user. - * - * @return void - */ - public function user_profile( $user ) { - \wp_nonce_field( self::NONCE_FIELD_ACTION, self::NONCE_FIELD_NAME ); - - echo '

              ', \esc_html__( 'Yoast SEO Schema enhancements', 'wordpress-seo-premium' ), '

              '; - echo '

              ', \esc_html__( 'The info you add below is added to the data Yoast SEO outputs in its schema.org output, for instance when you\'re the author of a page. Please only add the info you feel good sharing publicly.', 'wordpress-seo-premium' ), '

              '; - - $user_schema = \get_user_meta( $user->ID, 'wpseo_user_schema', true ); - - echo '
              '; - foreach ( $this->fields as $key => $field ) { - if ( $field['type'] === 'group' ) { - echo '

              ', \esc_html( $field['label'] ), '

              '; - continue; - } - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- False positive, $key is set in the code above, not by a user. - echo ''; - $val = ''; - if ( isset( $user_schema[ $key ] ) ) { - $val = $user_schema[ $key ]; - } - if ( $field['type'] === 'array' && \is_array( $val ) ) { - $val = \implode( ', ', $val ); - } - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- False positive, $key is set in the code above, not by a user. - echo ''; - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- False positive, $field['description'] is set in the code above, not by a user. - echo '

              ', $field['description'], '

              '; - } - echo '
              '; - } - - /** - * Updates the user metas that (might) have been set on the user profile page. - * - * @param int $user_id User ID of the updated user. - * - * @return void - */ - public function process_user_option_update( $user_id ) { - // I'm keeping this to conform to the original logic. - if ( ! isset( $_POST[ self::NONCE_FIELD_NAME ] ) || ! \is_string( $_POST[ self::NONCE_FIELD_NAME ] ) ) { - return; - } - - \check_admin_referer( self::NONCE_FIELD_ACTION, self::NONCE_FIELD_NAME ); - - \update_user_meta( $user_id, 'wpseo_user_schema', $this->get_posted_user_fields() ); - } - - /** - * Gets the posted user fields and sanitizes them. - * - * As we output these values straight from the database both on frontend and backend, this sanitization is quite important. - * - * @return array The posted user fields, restricted to allowed fields. - */ - private function get_posted_user_fields() { - $user_schema = []; - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce is verified in process_user_option_update. - if ( isset( $_POST['wpseo_user_schema'] ) && \is_array( $_POST['wpseo_user_schema'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce is verified in process_user_option_update. - $user_schema = \array_map( 'sanitize_text_field', \wp_unslash( $_POST['wpseo_user_schema'] ) ); - } - - foreach ( $this->fields as $key => $object ) { - switch ( $object['type'] ) { - case 'array': - $user_schema[ $key ] = \explode( ',', $user_schema[ $key ] ); - // Trim each item in the comma separated array. - foreach ( $user_schema[ $key ] as $index => $item ) { - $user_schema[ $key ][ $index ] = \trim( $item ); - } - // Remove empty items. - $user_schema[ $key ] = \array_filter( $user_schema[ $key ] ); - - if ( $user_schema[ $key ] === [] || $user_schema[ $key ][0] === '' ) { - unset( $user_schema[ $key ] ); - } - break; - case 'date': - $date = \explode( '-', $user_schema[ $key ] ); - if ( \count( $date ) !== 3 || ! \checkdate( (int) $date[1], (int) $date[2], (int) $date[0] ) ) { - unset( $user_schema[ $key ] ); - } - break; - default: - if ( empty( $user_schema[ $key ] ) ) { - unset( $user_schema[ $key ] ); - } - // Nothing further to be done for strings. - break; - } - } - - return $user_schema; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/workouts-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/workouts-integration.php deleted file mode 100644 index 05b021ab..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/admin/workouts-integration.php +++ /dev/null @@ -1,182 +0,0 @@ -indexable_repository = $indexable_repository; - $this->shortlinker = $shortlinker; - $this->options_helper = $options_helper; - $this->prominent_words_helper = $prominent_words_helper; - $this->post_type_helper = $post_type_helper; - } - - /** - * {@inheritDoc} - */ - public function register_hooks() { - \add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - } - - /** - * Enqueue the workouts app. - * - * @return void - */ - public function enqueue_assets() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Date is not processed or saved. - if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'wpseo_workouts' ) { - return; - } - - $workouts_option = $this->options_helper->get( 'workouts' ); - - $indexable_ids_in_workouts = [ 0 ]; - if ( isset( $workouts_option['orphaned']['indexablesByStep'] ) - && \is_array( $workouts_option['orphaned']['indexablesByStep'] ) - && isset( $workouts_option['cornerstone']['indexablesByStep'] ) - && \is_array( $workouts_option['cornerstone']['indexablesByStep'] ) - ) { - foreach ( [ 'orphaned', 'cornerstone' ] as $workout ) { - foreach ( $workouts_option[ $workout ]['indexablesByStep'] as $step => $indexables ) { - if ( $step === 'removed' ) { - continue; - } - foreach ( $indexables as $indexable_id ) { - $indexable_ids_in_workouts[] = $indexable_id; - } - } - } - } - - $orphaned = $this->get_orphaned( $indexable_ids_in_workouts ); - - $premium_localization = new WPSEO_Premium_Asset_JS_L10n(); - $premium_localization->localize_script( 'yoast-seo-premium-workouts' ); - \wp_enqueue_script( 'yoast-seo-premium-workouts' ); - \wp_localize_script( - 'yoast-seo-premium-workouts', - 'wpseoPremiumWorkoutsData', - [ - 'cornerstoneGuide' => $this->shortlinker->build_shortlink( 'https://yoa.st/4el' ), - 'orphanedGuide' => $this->shortlinker->build_shortlink( 'https://yoa.st/4fa' ), - 'orphanedUpdateContent' => $this->shortlinker->build_shortlink( 'https://yoa.st/4h9' ), - 'cornerstoneOn' => $this->options_helper->get( 'enable_cornerstone_content' ), - 'seoDataOptimizationNeeded' => ! $this->prominent_words_helper->is_indexing_completed(), - 'orphaned' => $orphaned, - ] - ); - } - - /** - * Retrieves the public indexable sub types. - * - * @return array The sub types. - */ - protected function get_public_sub_types() { - $object_sub_types = \array_values( - \array_merge( - $this->post_type_helper->get_public_post_types(), - \get_taxonomies( [ 'public' => true ] ) - ) - ); - - $excluded_post_types = \apply_filters( 'wpseo_indexable_excluded_post_types', [ 'attachment' ] ); - $object_sub_types = \array_diff( $object_sub_types, $excluded_post_types ); - return $object_sub_types; - } - - /** - * Gets the orphaned indexables. - * - * @param array $indexable_ids_in_orphaned_workout The orphaned indexable ids. - * @param int $limit The limit. - * - * @return array The orphaned indexables. - */ - protected function get_orphaned( array $indexable_ids_in_orphaned_workout, $limit = 10 ) { - $orphaned = $this->indexable_repository->query() - ->where_raw( '( incoming_link_count is NULL OR incoming_link_count < 3 )' ) - ->where_raw( '( post_status = \'publish\' OR post_status IS NULL )' ) - ->where_raw( '( is_robots_noindex = FALSE OR is_robots_noindex IS NULL )' ) - ->where_raw( 'NOT ( object_sub_type = \'page\' AND permalink = %s )', [ \home_url( '/' ) ] ) - ->where_in( 'object_sub_type', $this->get_public_sub_types() ) - ->where_in( 'object_type', [ 'post' ] ) - ->where_not_in( 'id', $indexable_ids_in_orphaned_workout ) - ->order_by_asc( 'created_at' ) - ->limit( $limit ) - ->find_many(); - $orphaned = \array_map( [ $this->indexable_repository, 'ensure_permalink' ], $orphaned ); - return $orphaned; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/alerts/ai-generator-tip-notification.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/alerts/ai-generator-tip-notification.php deleted file mode 100644 index 8f1cb9f5..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/alerts/ai-generator-tip-notification.php +++ /dev/null @@ -1,20 +0,0 @@ -'; - - /** - * The editor script for the block. - * - * @var string - */ - protected $script = 'wp-seo-premium-dynamic-blocks'; - - /** - * Registers the block. - * - * @return void - */ - public function register_block() { - \register_block_type( - 'yoast-seo/' . $this->block_name, - [ - 'editor_script' => $this->script, - 'render_callback' => [ $this, 'present' ], - 'attributes' => [ - 'className' => [ - 'default' => '', - 'type' => 'string', - ], - 'estimatedReadingTime' => [ - 'type' => 'number', - 'default' => 0, - ], - 'descriptiveText' => [ - 'type' => 'string', - 'default' => \__( 'Estimated reading time:', 'wordpress-seo-premium' ) . ' ', - ], - 'showDescriptiveText' => [ - 'type' => 'boolean', - 'default' => true, - ], - 'showIcon' => [ - 'type' => 'boolean', - 'default' => true, - ], - ], - ] - ); - } - - /** - * Presents the block output. - * - * @param array $attributes The block attributes. - * @param string $content The content. - * - * @return string The block output. - */ - public function present( $attributes, $content = '' ) { - - $content = \preg_replace( - '/.*<\/span>/', - ' ' . \sprintf( \_n( 'minute', 'minutes', $attributes['estimatedReadingTime'], 'wordpress-seo-premium' ), $attributes['estimatedReadingTime'] ) . '', - $content, - 1 - ); - if ( $attributes['showIcon'] ) { - // Replace 15.7 icon placeholder. - $content = \preg_replace( - '/ICON_PLACEHOLDER/', - $this->clock_icon, - $content, - 1 - ); - - // Replace the 15.8+ icon placeholder. - return \preg_replace( - '/<\/span>/', - $this->clock_icon, - $content, - 1 - ); - } - - return $content; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/blocks/related-links-block.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/blocks/related-links-block.php deleted file mode 100644 index 7eef61f9..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/blocks/related-links-block.php +++ /dev/null @@ -1,25 +0,0 @@ - 'wp-seo-premium-blocks' ] ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/cleanup-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/cleanup-integration.php deleted file mode 100644 index 1d0c2599..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/cleanup-integration.php +++ /dev/null @@ -1,255 +0,0 @@ -indexable_cleanup_repository = $indexable_cleanup_repository; - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * @return array The array of conditionals. - */ - public static function get_conditionals() { - return []; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - \add_filter( 'wpseo_cleanup_tasks', [ $this, 'add_cleanup_tasks' ] ); - \add_action( 'wpseo_add_cleanup_counts_to_indexable_bucket', [ $this, 'add_cleanup_counts' ] ); - } - - /** - * Adds cleanup tasks for the cleanup integration. - * - * @param array $tasks Array of tasks to be added. - * - * @return array An associative array of tasks to be added to the cleanup integration. - */ - public function add_cleanup_tasks( $tasks ) { - return \array_merge( - $tasks, - [ - 'clean_orphaned_indexables_prominent_words' => function ( $limit ) { - return $this->cleanup_orphaned_from_table( 'Prominent_Words', 'indexable_id', $limit ); - }, - 'clean_old_prominent_word_entries' => function ( $limit ) { - return $this->cleanup_old_prominent_words( $limit ); - }, - 'clean_old_prominent_word_version_numbers' => function ( $limit ) { - return $this->cleanup_old_prominent_word_version_numbers( $limit ); - }, - ] - ); - } - - /** - * Adds cleanup counts to the data bucket object. - * - * @param To_Be_Cleaned_Indexable_Bucket $to_be_cleaned_indexable_bucket The bucket with current indexable count data. - * - * @return void - */ - public function add_cleanup_counts( To_Be_Cleaned_Indexable_Bucket $to_be_cleaned_indexable_bucket ): void { - $to_be_cleaned_indexable_bucket->add_to_be_cleaned_indexable_count( new To_Be_Cleaned_Indexable_Count( 'orphaned_indexables_prominent_words', $this->indexable_cleanup_repository->count_orphaned_from_table( 'Prominent_Words', 'indexable_id' ) ) ); - $to_be_cleaned_indexable_bucket->add_to_be_cleaned_indexable_count( new To_Be_Cleaned_Indexable_Count( 'orphaned_prominent_word_entries', $this->count_old_prominent_words() ) ); - $to_be_cleaned_indexable_bucket->add_to_be_cleaned_indexable_count( new To_Be_Cleaned_Indexable_Count( 'orphaned_prominent_word_version_numbers', $this->count_old_prominent_word_version_numbers() ) ); - } - - /** - * Cleans orphaned rows from a yoast table. - * - * @param string $table The table to cleanup. - * @param string $column The table column the cleanup will rely on. - * @param int $limit The limit we'll apply to the queries. - * - * @return int The number of deleted rows. - */ - public function cleanup_orphaned_from_table( $table, $column, $limit ) { - global $wpdb; - - $table = Model::get_table_name( $table ); - $indexable_table = Model::get_table_name( 'Indexable' ); - - // Warning: If this query is changed, make sure to update the query in cleanup_orphaned_from_table in Free as well. - // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input. - $query = $wpdb->prepare( - " - SELECT table_to_clean.{$column} - FROM {$table} table_to_clean - LEFT JOIN {$indexable_table} AS indexable_table - ON table_to_clean.{$column} = indexable_table.id - WHERE indexable_table.id IS NULL - AND table_to_clean.{$column} IS NOT NULL - LIMIT %d", - $limit - ); - // phpcs:enable - - // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared. - $orphans = $wpdb->get_col( $query ); - - if ( empty( $orphans ) ) { - return 0; - } - - // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared. - return \intval( $wpdb->query( "DELETE FROM $table WHERE {$column} IN( " . \implode( ',', $orphans ) . ' ) ' ) ); - } - - /** - * Cleans up old style prominent words from the database. - * - * @param int $limit The maximum amount of old prominent words to clean up in one go. Defaults to 1000. - * - * @return int The number of deleted rows. - */ - public function cleanup_old_prominent_words( $limit = 1000 ) { - global $wpdb; - - $taxonomy_ids = $this->retrieve_prominent_word_taxonomies( $wpdb, $limit ); - - if ( \count( $taxonomy_ids ) === 0 ) { - return 0; - } - - $nr_of_deleted_rows = $this->delete_prominent_word_taxonomies_and_terms( $wpdb, $taxonomy_ids ); - - if ( $nr_of_deleted_rows === false ) { - // Failed query. - return 0; - } - - return $nr_of_deleted_rows; - } - - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching - - /** - * Count up old style prominent words from the database. - * - * @return int The number of old prominent word rows. - */ - public function count_old_prominent_words() { - global $wpdb; - - $query = $wpdb->prepare( - "SELECT count(term_taxonomy_id) FROM {$wpdb->term_taxonomy} WHERE taxonomy = %s", - [ 'yst_prominent_words' ] - ); - - // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared. - return $wpdb->get_col( $query )[0]; - } - - /** - * Retrieve a list of prominent word taxonomy IDs. - * - * @param wpdb $wpdb The WordPress database object. - * @param int $limit The maximum amount of prominent word taxonomies to retrieve. - * - * @return string[] A list of prominent word taxonomy IDs (of size 'limit'). - */ - protected function retrieve_prominent_word_taxonomies( $wpdb, $limit ) { - return $wpdb->get_col( - $wpdb->prepare( - "SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = %s LIMIT %d", - [ 'yst_prominent_words', $limit ] - ) - ); - } - - /** - * Deletes the given list of taxonomies and their terms. - * - * @param wpdb $wpdb The WordPress database object. - * @param string[] $taxonomy_ids The IDs of the taxonomies to remove and their corresponding terms. - * - * @return bool|int `false` if the query failed, the amount of rows deleted otherwise. - */ - protected function delete_prominent_word_taxonomies_and_terms( $wpdb, $taxonomy_ids ) { - return $wpdb->query( - $wpdb->prepare( - "DELETE t, tr, tt FROM {$wpdb->term_taxonomy} tt - LEFT JOIN {$wpdb->terms} t ON tt.term_id = t.term_id - LEFT JOIN {$wpdb->term_relationships} tr ON tt.term_taxonomy_id = tr.term_taxonomy_id - WHERE tt.term_taxonomy_id IN ( " . \implode( ', ', \array_fill( 0, \count( $taxonomy_ids ), '%s' ) ) . ' )', - $taxonomy_ids - ) - ); - } - - /** - * Cleans up the old prominent word versions from the postmeta table in the database. - * - * @param int $limit The maximum number of prominent word version numbers to clean in one go. - * - * @return bool|int The number of cleaned up prominent word version numbers, or `false` if the query failed. - */ - protected function cleanup_old_prominent_word_version_numbers( $limit ) { - global $wpdb; - - // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input. - $query = $wpdb->prepare( - "DELETE FROM {$wpdb->postmeta} WHERE meta_key = %s LIMIT %d", - [ '_yst_prominent_words_version', $limit ] - ); - // phpcs:enable - - // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared. - return $wpdb->query( $query ); - } - - /** - * Counts up the old prominent word versions from the postmeta table in the database. - * - * @return bool|int The number of prominent word version numbers. - */ - protected function count_old_prominent_word_version_numbers() { - global $wpdb; - - // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input. - $query = $wpdb->prepare( - "SELECT count(*) FROM {$wpdb->postmeta} WHERE meta_key = %s", - [ '_yst_prominent_words_version' ] - ); - // phpcs:enable - - // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared. - return $wpdb->get_col( $query )[0]; - } - - // phpcs:enable -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/front-end/robots-txt-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/front-end/robots-txt-integration.php deleted file mode 100644 index 9b0d3ede..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/front-end/robots-txt-integration.php +++ /dev/null @@ -1,95 +0,0 @@ -options_helper = $options_helper; - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * @return array - */ - public static function get_conditionals() { - return [ Robots_Txt_Conditional::class ]; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - if ( \is_multisite() ) { - return; - } - - if ( $this->options_helper->get( 'deny_ccbot_crawling' ) ) { - \add_action( 'Yoast\WP\SEO\register_robots_rules', [ $this, 'add_disallow_ccbot' ], 10, 1 ); - } - if ( $this->options_helper->get( 'deny_google_extended_crawling' ) ) { - \add_action( 'Yoast\WP\SEO\register_robots_rules', [ $this, 'add_disallow_google_extended_bot' ], 10, 1 ); - } - if ( $this->options_helper->get( 'deny_gptbot_crawling' ) ) { - \add_action( 'Yoast\WP\SEO\register_robots_rules', [ $this, 'add_disallow_gptbot' ], 10, 1 ); - } - } - - /** - * Add a disallow rule for Common Crawl CCBot agents to `robots.txt`. - * - * @param Robots_Txt_Helper $robots_txt_helper The Robots_Txt_Helper. - * - * @return void - */ - public function add_disallow_ccbot( Robots_Txt_Helper $robots_txt_helper ) { - $robots_txt_helper->add_disallow( 'CCBot', '/' ); - } - - /** - * Add a disallow rule for Google-Extended agents to `robots.txt`. - * - * @param Robots_Txt_Helper $robots_txt_helper The Robots_Txt_Helper. - * - * @return void - */ - public function add_disallow_google_extended_bot( Robots_Txt_Helper $robots_txt_helper ) { - $robots_txt_helper->add_disallow( 'Google-Extended', '/' ); - } - - /** - * Add a disallow rule for OpenAI GPTBot agents to `robots.txt`. - * - * @param Robots_Txt_Helper $robots_txt_helper The Robots_Txt_Helper. - * - * @return void - */ - public function add_disallow_gptbot( Robots_Txt_Helper $robots_txt_helper ) { - $robots_txt_helper->add_disallow( 'GPTBot', '/' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/frontend-inspector.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/frontend-inspector.php deleted file mode 100644 index 6fcd9b38..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/frontend-inspector.php +++ /dev/null @@ -1,153 +0,0 @@ -robots_helper = $robots_helper; - } - - /** - * {@inheritDoc} - */ - public static function get_conditionals() { - return [ Front_End_Conditional::class ]; - } - - /** - * {@inheritDoc} - */ - public function register_hooks() { - \add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_assets' ], 11 ); - \add_action( 'wpseo_add_adminbar_submenu', [ $this, 'add_frontend_inspector_submenu' ], 10, 2 ); - } - - /** - * Adds the frontend inspector submenu. - * - * @param WP_Admin_Bar $wp_admin_bar The admin bar. - * @param string $menu_identifier The menu identifier. - * - * @return void - */ - public function add_frontend_inspector_submenu( WP_Admin_Bar $wp_admin_bar, $menu_identifier ) { - if ( ! \is_admin() ) { - $menu_args = [ - 'parent' => $menu_identifier, - 'id' => self::FRONTEND_INSPECTOR_SUBMENU_IDENTIFIER, - 'title' => \sprintf( - '%1$s %2$s', - \__( 'Front-end SEO inspector', 'wordpress-seo-premium' ), - \__( 'Beta', 'wordpress-seo-premium' ) - ), - 'href' => '#wpseo-frontend-inspector', - 'meta' => [ - 'tabindex' => '0', - ], - ]; - $wp_admin_bar->add_menu( $menu_args ); - } - } - - /** - * Enqueue the workouts app. - * - * @return void - */ - public function enqueue_assets() { - if ( ! \is_admin_bar_showing() || ! WPSEO_Options::get( 'enable_admin_bar_menu' ) ) { - return; - } - - // If the current user can't write posts, this is all of no use, so let's not output an admin menu. - if ( ! \current_user_can( 'edit_posts' ) ) { - return; - } - - $analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - $analysis_readability = new WPSEO_Metabox_Analysis_Readability(); - $current_page_meta = \YoastSEO()->meta->for_current_page(); - $indexable = $current_page_meta->indexable; - $page_type = $current_page_meta->page_type; - - $is_seo_analysis_active = $analysis_seo->is_enabled(); - $is_readability_analysis_active = $analysis_readability->is_enabled(); - $display_metabox = true; - - switch ( $page_type ) { - case 'Home_Page': - case 'Post_Type_Archive': - case 'Date_Archive': - case 'Error_Page': - case 'Fallback': - case 'Search_Result_Page': - break; - case 'Static_Home_Page': - case 'Static_Posts_Page': - case 'Post_Type': - $display_metabox = WPSEO_Options::get( 'display-metabox-pt-' . $indexable->object_sub_type ); - break; - case 'Term_Archive': - $display_metabox = WPSEO_Options::get( 'display-metabox-tax-' . $indexable->object_sub_type ); - break; - case 'Author_Archive': - $display_metabox = false; - break; - } - - if ( ! $display_metabox ) { - $is_seo_analysis_active = false; - $is_readability_analysis_active = false; - } - - \wp_enqueue_script( 'yoast-seo-premium-frontend-inspector' ); - \wp_localize_script( - 'yoast-seo-premium-frontend-inspector', - 'wpseoScriptData', - [ - 'frontendInspector' => [ - 'isIndexable' => $this->robots_helper->is_indexable( $indexable ), - 'indexable' => [ - 'is_robots_noindex' => $indexable->is_robots_noindex, - 'primary_focus_keyword' => $indexable->primary_focus_keyword, - 'primary_focus_keyword_score' => $indexable->primary_focus_keyword_score, - 'readability_score' => $indexable->readability_score, - ], - 'contentAnalysisActive' => $is_readability_analysis_active, - 'keywordAnalysisActive' => $is_seo_analysis_active, - ], - ] - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/index-now-ping.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/index-now-ping.php deleted file mode 100644 index 0b96aa42..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/index-now-ping.php +++ /dev/null @@ -1,191 +0,0 @@ -options_helper = $options_helper; - $this->request_helper = $request_helper; - $this->post_type_helper = $post_type_helper; - - /** - * Filter: 'Yoast\WP\SEO\indexnow_endpoint' - Allow changing the Indexnow endpoint. - * - * Note: This is a Premium plugin-only hook. - * - * @since 18.8 - * - * @param string $endpoint The IndexNow endpoint URL. - */ - $this->endpoint = \apply_filters( 'Yoast\WP\SEO\indexnow_endpoint', 'https://api.indexnow.org/indexnow' ); - } - - /** - * Registers the hooks this integration acts on. - * - * @return void - */ - public function register_hooks() { - if ( $this->options_helper->get( 'enable_index_now' ) === false ) { - return; - } - - if ( \wp_get_environment_type() !== 'production' ) { - return; - } - - /** - * Please note that the name transition_post_status is misleading. - * The hook does not only fire on a post status transition but also when a post is updated - * while the status is not changed from one to another at all. - */ - \add_action( 'transition_post_status', [ $this, 'ping_index_now' ], 10, 3 ); - } - - /** - * Pings IndexNow for changes. - * - * @param string $new_status The new status for the post. - * @param string $old_status The old status for the post. - * @param WP_Post $post The post. - * - * @return void - */ - public function ping_index_now( $new_status, $old_status, $post ) { - if ( $new_status !== 'publish' && $old_status !== 'publish' ) { - // If we're not transitioning to or from a published status, do nothing. - return; - } - - // The block editor saves published posts twice, we want to ping only on the first request. - if ( $new_status === 'publish' && $this->request_helper->is_rest_request() ) { - return; - } - - if ( ! $post instanceof WP_Post ) { - return; - } - - if ( ! \in_array( $post->post_type, $this->post_type_helper->get_accessible_post_types(), true ) - || ! $this->post_type_helper->is_indexable( $post->post_type ) ) { - return; - } - - // Bail out if last ping was less than two minutes ago. - $indexnow_last_ping = \get_post_meta( $post->ID, '_yoast_indexnow_last_ping', true ); - if ( \is_numeric( $indexnow_last_ping ) && \abs( \time() - ( (int) $indexnow_last_ping ) ) < 120 ) { - return; - } - - $key = $this->options_helper->get( 'index_now_key' ); - $permalink = $this->get_permalink( $post ); - $urls = [ $permalink ]; - - if ( $post->post_type === 'post' ) { - $urls[] = \get_home_url(); - } - - if ( ! empty( \get_option( 'permalink_structure' ) ) ) { - $key_location = \trailingslashit( \get_home_url() ) . 'yoast-index-now-' . $key . '.txt'; - } - else { - $key_location = \add_query_arg( 'yoast_index_now_key', $key, \trailingslashit( \get_home_url() ) ); - } - - $content = (object) [ - 'host' => \wp_parse_url( \get_home_url(), \PHP_URL_HOST ), - 'key' => $key, - 'keyLocation' => $key_location, - 'urlList' => $urls, - ]; - - // Set a 'content-type' header of 'application/json' and an identifying source header. - // The "false" on the end of the x-source-info header determines whether this is a manual submission or not. - $request_args = [ - 'headers' => [ - 'content-type' => 'application/json; charset=utf-8', - 'x-source-info' => 'https://yoast.com/wordpress/plugins/seo-premium/' . \WPSEO_PREMIUM_VERSION . '/false', - ], - ]; - - $request = new WPSEO_Remote_Request( $this->endpoint, $request_args ); - // phpcs:ignore Yoast.Yoast.JsonEncodeAlternative.Found -- This is being sent to an API, not displayed. - $request->set_body( \wp_json_encode( $content ) ); - $request->send(); - - \update_post_meta( $post->ID, '_yoast_indexnow_last_ping', \time() ); - } - - /** - * Determines the (former) permalink for a post. - * - * @param WP_Post $post Post object. - * - * @return string Permalink. - */ - private function get_permalink( WP_Post $post ) { - if ( \in_array( $post->post_status, [ 'trash', 'draft', 'pending', 'future' ], true ) ) { - if ( $post->post_status === 'trash' ) { - // Fix the post_name. - $post->post_name = \preg_replace( '/__trashed$/', '', $post->post_name ); - } - // Force post_status to publish briefly, so we get the correct URL. - $post->post_status = 'publish'; - } - - return \get_permalink( $post ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/missing-indexables-count-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/missing-indexables-count-integration.php deleted file mode 100644 index 576278a0..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/missing-indexables-count-integration.php +++ /dev/null @@ -1,54 +0,0 @@ -content_action = $content_action; - } - - /** - * Registers hooks with WordPress. - * - * @return void - */ - public function register_hooks() { - \add_filter( 'wpseo_indexable_collector_add_indexation_actions', [ $this, 'add_index_action' ] ); - } - - /** - * Adds the Content_Action to the indexable collector. - * - * @param array $indexation_actions The current indexation actions. - * @return array - */ - public function add_index_action( $indexation_actions ) { - $indexation_actions[] = $this->content_action; - return $indexation_actions; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/opengraph-author-archive.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/opengraph-author-archive.php deleted file mode 100644 index afbc0b60..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/opengraph-author-archive.php +++ /dev/null @@ -1,51 +0,0 @@ - 'description', - 'org-email' => 'email', - 'org-phone' => 'telephone', - 'org-legal-name' => 'legalName', - 'org-founding-date' => 'foundingDate', - 'org-number-employees' => 'numberOfEmployees', - 'org-vat-id' => 'vatID', - 'org-tax-id' => 'taxID', - 'org-iso' => 'iso6523Code', - 'org-duns' => 'duns', - 'org-leicode' => 'leiCode', - 'org-naics' => 'naics', - ]; - - /** - * The options helper. - * - * @var Options_Helper - */ - private $options_helper; - - /** - * Returns the conditionals based on which this loadable should be active. - * - * @return array The conditionals to check. - */ - public static function get_conditionals() { - return [ Front_End_Conditional::class ]; - } - - /** - * Organization_Schema_Integration constructor. - * - * @param Options_Helper $options_helper The options helper. - */ - public function __construct( - Options_Helper $options_helper - ) { - $this->options_helper = $options_helper; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - \add_filter( 'wpseo_schema_organization', [ $this, 'filter_organization_schema' ] ); - } - - /** - * Filters the organization schema. - * - * @param array> $profiles The organization schema data. - * @return array> The filtered organization schema data. - */ - public function filter_organization_schema( $profiles ) { - $options = []; - $exclude = [ 'org-number-employees' ]; - if ( \defined( 'WPSEO_LOCAL_FILE' ) ) { - \array_push( $exclude, 'org-vat-id', 'org-tax-id', 'org-phone', 'org-email' ); - } - foreach ( self::ORGANIZATION_DETAILS_MAPPING as $option_name => $schema_name ) { - $options[ $option_name ] = $this->options_helper->get( $option_name ); - if ( $options[ $option_name ] && ! \in_array( $option_name, $exclude, true ) ) { - $profiles[ $schema_name ] = $options[ $option_name ]; - } - } - - $profiles = $this->add_employees_number( $profiles, $options['org-number-employees'] ); - - return $profiles; - } - - /** - * Adds employees number to the organization schema tree. - * - * @param array> $profiles The organization schema tree. - * @param array> $employees The option for employees number. - * @return array> The modified organization schema tree. - */ - public function add_employees_number( $profiles, $employees ) { - if ( ! $employees ) { - return $profiles; - } - - $profiles['numberOfEmployees'] = [ - '@type' => 'QuantitativeValue', - ]; - - $range = \explode( '-', $employees ); - - if ( \count( $range ) === 2 ) { - $profiles['numberOfEmployees']['minValue'] = $range[0]; - $profiles['numberOfEmployees']['maxValue'] = $range[1]; - } - else { - $profiles['numberOfEmployees']['value'] = $employees; - } - - return $profiles; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/publishing-principles-schema-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/publishing-principles-schema-integration.php deleted file mode 100644 index 0bc2d9cc..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/publishing-principles-schema-integration.php +++ /dev/null @@ -1,199 +0,0 @@ -options_helper = $options_helper; - $this->indexable_repository = $indexable_repository; - $this->indexable_helper = $indexable_helper; - $this->post_type_helper = $post_type_helper; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - \add_filter( 'wpseo_schema_organization', [ $this, 'filter_organization_schema' ] ); - } - - /** - * Make sure the Organization policies are added to the schema output. - * - * @param array $data The organization schema. - * - * @return array - */ - public function filter_organization_schema( $data ) { - $policy_indexables = $this->get_indexables_for_publishing_principle_pages( - self::PRINCIPLES_MAPPING - ); - - foreach ( $policy_indexables as $policy_data ) { - $data = $this->add_schema_piece( $data, $policy_data ); - } - - return $data; - } - - /** - * Adds the data to the schema array. - * - * @param array $schema_graph The current schema graph. - * @param array $policy_data The data present for a policy. - * - * @return array The new schema graph. - */ - private function add_schema_piece( $schema_graph, $policy_data ): array { - if ( ! \is_null( $policy_data['permalink'] ) ) { - $schema_graph[ $policy_data['schema'] ] = $policy_data['permalink']; - } - - return $schema_graph; - } - - /** - * Finds the indexables for all the given principles if they are set. - * - * @param array $principles_data The data for all the principles. - * - * @return array - */ - private function get_indexables_for_publishing_principle_pages( $principles_data ): array { - $principle_ids = []; - $policies = []; - $ids = []; - foreach ( $principles_data as $principle ) { - $option_value = $this->options_helper->get( $principle[0], false ); - if ( $option_value ) { - $principle_ids[ $principle[0] ] = [ - 'value' => $option_value, - 'schema' => $principle[1], - ]; - $ids[] = $option_value; - } - } - - if ( \count( $ids ) === 0 ) { - // Early return to not run an empty query. - return []; - } - - if ( $this->indexable_helper->should_index_indexables() && $this->post_type_helper->is_of_indexable_post_type( 'page' ) ) { - $indexables = $this->indexable_repository->find_by_multiple_ids_and_type( \array_unique( $ids ), 'post' ); - - foreach ( $principle_ids as $key => $principle_id ) { - foreach ( $indexables as $indexable ) { - if ( $indexable && $principle_id['value'] === $indexable->object_id ) { - if ( $indexable->post_status === 'publish' && $indexable->is_protected === false ) { - $policies[ $key ] = [ - 'permalink' => $indexable->permalink, - 'schema' => $principle_id['schema'], - ]; - } - break; - } - } - } - - return $policies; - } - - foreach ( $principle_ids as $key => $principle_id ) { - foreach ( $ids as $post_id ) { - $post = \get_post( (int) $post_id ); - if ( \is_object( $post ) ) { - if ( (int) $principle_id['value'] === (int) $post_id && \get_post_status( $post_id ) === 'publish' && $post->post_password === '' ) { - $policies[ $key ] = [ - 'permalink' => \get_permalink( $post_id ), - 'schema' => $principle_id['schema'], - ]; - break; - } - } - } - } - - return $policies; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/routes/ai-generator-route.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/routes/ai-generator-route.php deleted file mode 100644 index bb14a814..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/routes/ai-generator-route.php +++ /dev/null @@ -1,312 +0,0 @@ -ai_generator_action = $ai_generator_action; - $this->ai_generator_helper = $ai_generator_helper; - } - - /** - * Registers routes with WordPress. - * - * @return void - */ - public function register_routes() { - \register_rest_route( - Main::API_V1_NAMESPACE, - self::CONSENT_ROUTE, - [ - 'methods' => 'POST', - 'args' => [ - 'consent' => [ - 'required' => true, - 'type' => 'boolean', - 'description' => 'Whether the consent to use AI-based services has been given by the user.', - ], - ], - 'callback' => [ $this, 'consent' ], - 'permission_callback' => [ $this, 'check_permissions' ], - ] - ); - - // Avoid registering the other routes if the feature is not enabled. - if ( ! $this->ai_generator_helper->is_ai_generator_enabled() ) { - return; - } - - $callback_route_args = [ - 'methods' => 'POST', - 'args' => [ - 'access_jwt' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The access JWT.', - ], - 'refresh_jwt' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The JWT to be used when the access JWT needs to be refreshed.', - ], - 'code_challenge' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The SHA266 of the verification code used to check the authenticity of a callback call.', - ], - 'user_id' => [ - 'required' => true, - 'type' => 'integer', - 'description' => 'The id of the user associated to the code verifier.', - ], - ], - 'callback' => [ $this, 'callback' ], - 'permission_callback' => '__return_true', - ]; - \register_rest_route( Main::API_V1_NAMESPACE, self::CALLBACK_ROUTE, $callback_route_args ); - \register_rest_route( Main::API_V1_NAMESPACE, self::REFRESH_CALLBACK_ROUTE, $callback_route_args ); - - \register_rest_route( - Main::API_V1_NAMESPACE, - self::GET_SUGGESTIONS_ROUTE, - [ - 'methods' => 'POST', - 'args' => [ - 'type' => [ - 'required' => true, - 'type' => 'string', - 'enum' => [ - 'seo-title', - 'meta-description', - 'product-seo-title', - 'product-meta-description', - ], - 'description' => 'The type of suggestion requested.', - ], - 'prompt_content' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The content needed by the prompt to ask for suggestions.', - ], - 'focus_keyphrase' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The focus keyphrase associated to the post.', - ], - 'language' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The language the post is written in.', - ], - 'platform' => [ - 'required' => true, - 'type' => 'string', - 'enum' => [ - 'Google', - 'Facebook', - 'Twitter', - ], - 'description' => 'The platform the post is intended for.', - ], - ], - 'callback' => [ $this, 'get_suggestions' ], - 'permission_callback' => [ $this, 'check_permissions' ], - ] - ); - - \register_rest_route( - Main::API_V1_NAMESPACE, - self::BUST_SUBSCRIPTION_CACHE_ROUTE, - [ - 'methods' => 'POST', - 'args' => [], - 'callback' => [ $this, 'bust_subscription_cache' ], - 'permission_callback' => [ $this, 'check_permissions' ], - ] - ); - } - - /** - * Runs the callback to store connection credentials and the tokens locally. - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response The response of the callback action. - */ - public function callback( WP_REST_Request $request ) { - try { - $code_verifier = $this->ai_generator_action->callback( $request['access_jwt'], $request['refresh_jwt'], $request['code_challenge'], $request['user_id'] ); - } catch ( Unauthorized_Exception $e ) { - return new WP_REST_Response( 'Unauthorized.', 401 ); - } - - return new WP_REST_Response( - [ - 'message' => 'Tokens successfully stored.', - 'code_verifier' => $code_verifier, - ] - ); - } - - /** - * Runs the callback to get ai-generated suggestions. - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response The response of the get_suggestions action. - */ - public function get_suggestions( WP_REST_Request $request ) { - try { - $user = \wp_get_current_user(); - $data = $this->ai_generator_action->get_suggestions( $user, $request['type'], $request['prompt_content'], $request['focus_keyphrase'], $request['language'], $request['platform'] ); - } catch ( Bad_Request_Exception | Forbidden_Exception | Internal_Server_Error_Exception | Not_Found_Exception | Payment_Required_Exception | Request_Timeout_Exception | Service_Unavailable_Exception | Too_Many_Requests_Exception | Unauthorized_Exception $e ) { - $message = [ - 'message' => $e->getMessage(), - ]; - if ( $e instanceof Payment_Required_Exception ) { - $message['missingLicenses'] = $e->get_missing_licenses(); - } - return new WP_REST_Response( - $message, - $e->getCode() - ); - } catch ( RuntimeException $e ) { - return new WP_REST_Response( 'Failed to get suggestions.', 500 ); - } - - return new WP_REST_Response( $data ); - } - - /** - * Runs the callback to store the consent given by the user to use AI-based services. - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response The response of the callback action. - */ - public function consent( WP_REST_Request $request ) { - $user_id = \get_current_user_id(); - $consent = \boolval( $request['consent'] ); - - try { - $this->ai_generator_action->consent( $user_id, $consent ); - } catch ( Bad_Request_Exception | Forbidden_Exception | Internal_Server_Error_Exception | Not_Found_Exception | Payment_Required_Exception | Request_Timeout_Exception | Service_Unavailable_Exception | Too_Many_Requests_Exception | RuntimeException $e ) { - return new WP_REST_Response( ( $consent ) ? 'Failed to store consent.' : 'Failed to revoke consent.', 500 ); - } - - return new WP_REST_Response( ( $consent ) ? 'Consent successfully stored.' : 'Consent successfully revoked.' ); - } - - /** - * Runs the callback that busts the subscription cache. - * - * @return WP_REST_Response The response of the callback action. - */ - public function bust_subscription_cache() { - $this->ai_generator_action->bust_subscription_cache(); - - return new WP_REST_Response( 'Subscription cache successfully busted.' ); - } - - /** - * Checks: - * - if the user is logged - * - if the user can edit posts - * - * @return bool Whether the user is logged in, can edit posts and the feature is active. - */ - public function check_permissions() { - $user = \wp_get_current_user(); - if ( $user === null || $user->ID < 1 ) { - return false; - } - - return \user_can( $user, 'edit_posts' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/routes/workouts-routes-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/routes/workouts-routes-integration.php deleted file mode 100644 index 44690ba6..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/routes/workouts-routes-integration.php +++ /dev/null @@ -1,311 +0,0 @@ - - */ - public const ALLOWED_CORNERSTONE_STEPS = [ - 'chooseCornerstones', - 'checkLinks', - 'addLinks', - 'improved', - 'skipped', - ]; - - /** - * Allowed orphaned steps. - * - * @var array - */ - public const ALLOWED_ORPHANED_STEPS = [ - 'improveRemove', - 'update', - 'addLinks', - 'removed', - 'noindexed', - 'improved', - 'skipped', - ]; - - /** - * The indexable repository. - * - * @var Indexable_Repository The indexable repository. - */ - private $indexable_repository; - - /** - * The link suggestions action. - * - * @var Link_Suggestions_Action The action. - */ - private $link_suggestions_action; - - /** - * The admin asset manager. - * - * @var WPSEO_Admin_Asset_Manager - */ - private $admin_asset_manager; - - /** - * The shortlinker. - * - * @var WPSEO_Shortlinker - */ - private $shortlinker; - - /** - * The options helper. - * - * @var Options_Helper - */ - private $options_helper; - - /** - * The prominent words helper. - * - * @var Prominent_Words_Helper - */ - private $prominent_words_helper; - - /** - * The post type helper. - * - * @var Post_Type_Helper - */ - private $post_type_helper; - - /** - * Workouts_Integration constructor. - * - * @param Indexable_Repository $indexable_repository The indexables repository. - * @param Link_Suggestions_Action $link_suggestions_action The link suggestions action. - * @param WPSEO_Admin_Asset_Manager $admin_asset_manager The admin asset manager. - * @param WPSEO_Shortlinker $shortlinker The shortlinker. - * @param Options_Helper $options_helper The options helper. - * @param Prominent_Words_Helper $prominent_words_helper The prominent words helper. - * @param Post_Type_Helper $post_type_helper The post type helper. - */ - public function __construct( - Indexable_Repository $indexable_repository, - Link_Suggestions_Action $link_suggestions_action, - WPSEO_Admin_Asset_Manager $admin_asset_manager, - WPSEO_Shortlinker $shortlinker, - Options_Helper $options_helper, - Prominent_Words_Helper $prominent_words_helper, - Post_Type_Helper $post_type_helper - ) { - $this->indexable_repository = $indexable_repository; - $this->link_suggestions_action = $link_suggestions_action; - $this->admin_asset_manager = $admin_asset_manager; - $this->shortlinker = $shortlinker; - $this->options_helper = $options_helper; - $this->prominent_words_helper = $prominent_words_helper; - $this->post_type_helper = $post_type_helper; - } - - /** - * {@inheritDoc} - */ - public function register_hooks() { - \add_filter( 'Yoast\WP\SEO\workouts_route_args', [ $this, 'add_args_to_set_workouts_route' ] ); - \add_filter( 'Yoast\WP\SEO\workouts_route_save', [ $this, 'save_workouts_data' ], 10, 2 ); - \add_filter( 'Yoast\WP\SEO\workouts_options', [ $this, 'get_options' ] ); - } - - /** - * Adds arguments to `set_workouts` route registration. - * - * @param array $args_array The existing array of arguments. - * - * @return array - */ - public function add_args_to_set_workouts_route( $args_array ) { - $premium_args_array = [ - 'cornerstone' => [ - 'validate_callback' => [ $this, 'cornerstone_is_allowed' ], - 'required' => true, - ], - 'orphaned' => [ - 'validate_callback' => [ $this, 'orphaned_is_allowed' ], - 'required' => true, - ], - ]; - - return \array_merge( $args_array, $premium_args_array ); - } - - /** - * Validates the cornerstone attribute. - * - * @param array $workout The cornerstone workout. - * @return bool If the payload is valid or not. - */ - public function cornerstone_is_allowed( $workout ) { - return $this->is_allowed( $workout, self::ALLOWED_CORNERSTONE_STEPS ); - } - - /** - * Validates the orphaned attribute. - * - * @param array $workout The orphaned workout. - * @return bool If the payload is valid or not. - */ - public function orphaned_is_allowed( $workout ) { - return $this->is_allowed( $workout, self::ALLOWED_ORPHANED_STEPS ); - } - - /** - * Validates a workout. - * - * @param array $workout The workout. - * @param array $allowed_steps The allowed steps for this workout. - * @return bool If the payload is valid or not. - */ - public function is_allowed( $workout, $allowed_steps ) { - // Only 3 properties are allowed, the below validated finishedSteps property. - if ( \count( $workout ) !== 3 ) { - return false; - } - - if ( isset( $workout['finishedSteps'] ) && \is_array( $workout['finishedSteps'] ) ) { - foreach ( $workout['finishedSteps'] as $step ) { - if ( ! \in_array( $step, $allowed_steps, true ) ) { - return false; - } - } - return true; - } - return false; - } - - /** - * Saves the Premium workouts data to the database. - * - * @param mixed|null $result The result of the previous save operations. - * @param array $workouts_data The complete workouts data. - * - * @return mixed|null - */ - public function save_workouts_data( $result, $workouts_data ) { - $premium_workouts_data = []; - $premium_workouts_data['cornerstone'] = $workouts_data['cornerstone']; - $premium_workouts_data['orphaned'] = $workouts_data['orphaned']; - - foreach ( $premium_workouts_data as $workout => $data ) { - if ( isset( $data['indexablesByStep'] ) && \is_array( $data['indexablesByStep'] ) ) { - foreach ( $data['indexablesByStep'] as $step => $indexables ) { - if ( $step === 'removed' ) { - continue; - } - $premium_workouts_data[ $workout ]['indexablesByStep'][ $step ] = \wp_list_pluck( $indexables, 'id' ); - } - } - } - - return $this->options_helper->set( 'workouts', $premium_workouts_data ); - } - - /** - * Retrieves the Premium workouts options from the database and adds it to the global array of workouts options. - * - * @param array $workouts_option The previous content of the workouts options. - * - * @return array The workouts options updated with the addition of the Premium workouts data. - */ - public function get_options( $workouts_option ) { - $premium_option = $this->options_helper->get( 'workouts' ); - - if ( ! ( isset( $premium_option['orphaned']['indexablesByStep'] ) - && \is_array( $premium_option['orphaned']['indexablesByStep'] ) - && isset( $premium_option['cornerstone']['indexablesByStep'] ) - && \is_array( $premium_option['cornerstone']['indexablesByStep'] ) ) - ) { - return \array_merge( $workouts_option, $premium_option ); - } - - // Get all indexable ids from all workouts and all steps. - $indexable_ids_in_workouts = [ 0 ]; - foreach ( [ 'orphaned', 'cornerstone' ] as $workout ) { - foreach ( $premium_option[ $workout ]['indexablesByStep'] as $step => $indexables ) { - if ( $step === 'removed' ) { - continue; - } - foreach ( $indexables as $indexable_id ) { - $indexable_ids_in_workouts[] = $indexable_id; - } - } - } - - // Get all indexables corresponding to the indexable ids. - $indexables_in_workouts = $this->indexable_repository->find_by_ids( $indexable_ids_in_workouts ); - - // Extend the workouts option with the indexables data. - foreach ( [ 'orphaned', 'cornerstone' ] as $workout ) { - // Don't add indexables for steps that are not allowed. - $premium_option[ $workout ]['finishedSteps'] = \array_values( - \array_intersect( - $premium_option[ $workout ]['finishedSteps'], - [ - 'orphaned' => self::ALLOWED_ORPHANED_STEPS, - 'cornerstone' => self::ALLOWED_CORNERSTONE_STEPS, - ][ $workout ] - ) - ); - - // Don't add indexables that are not published or are no-indexed. - foreach ( $premium_option[ $workout ]['indexablesByStep'] as $step => $indexables ) { - if ( $step === 'removed' ) { - continue; - } - $premium_option[ $workout ]['indexablesByStep'][ $step ] = \array_values( - \array_filter( - \array_map( - static function ( $indexable_id ) use ( $indexables_in_workouts ) { - foreach ( $indexables_in_workouts as $updated_indexable ) { - if ( \is_array( $indexable_id ) ) { - $indexable_id = $indexable_id['id']; - } - if ( (int) $indexable_id === $updated_indexable->id ) { - if ( $updated_indexable->post_status !== 'publish' && $updated_indexable->post_status !== null ) { - return false; - } - if ( $updated_indexable->is_robots_noindex ) { - return false; - } - return $updated_indexable; - } - } - return false; - }, - $indexables - ) - ) - ); - } - } - - return \array_merge( $workouts_option, $premium_option ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/algolia.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/algolia.php deleted file mode 100644 index 6d269007..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/algolia.php +++ /dev/null @@ -1,191 +0,0 @@ -options = $options; - $this->meta = $meta; - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * @return array - */ - public static function get_conditionals() { - return [ - Algolia_Enabled_Conditional::class, - ]; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - \add_filter( 'algolia_searchable_post_shared_attributes', [ $this, 'add_attributes_post' ], 10, 2 ); - \add_filter( 'algolia_term_record', [ $this, 'add_attributes_term' ] ); - \add_filter( 'algolia_user_record', [ $this, 'add_attributes_user' ] ); - \add_filter( 'algolia_should_index_searchable_post', [ $this, 'blacklist_no_index_posts' ], 10, 2 ); - \add_filter( 'algolia_should_index_term', [ $this, 'blacklist_no_index_terms' ], 10, 2 ); - \add_filter( 'algolia_should_index_user', [ $this, 'blacklist_no_index_users' ], 10, 2 ); - } - - /** - * Adds the search result priority and the number of internal links to an article to Algolia's index. - * - * @param array $attributes The attributes Algolia should index. - * @param WP_Post $post The post object that is being indexed. - * - * @return array The attributes Algolia should index. - */ - public function add_attributes_post( $attributes, $post ) { - $meta = $this->meta->for_post( $post->ID ); - - return $this->add_attributes( $attributes, $meta ); - } - - /** - * Adds the attributes for a term. - * - * @param array $attributes The recorded attributes. - * - * @return array The recorded attributes. - */ - public function add_attributes_term( $attributes ) { - $meta = $this->meta->for_term( $attributes['objectID'] ); - - return $this->add_attributes( $attributes, $meta ); - } - - /** - * Adds the attributes for a term. - * - * @param array $attributes The recorded attributes. - * - * @return array The recorded attributes. - */ - public function add_attributes_user( $attributes ) { - $meta = $this->meta->for_author( $attributes['objectID'] ); - - return $this->add_attributes( $attributes, $meta ); - } - - /** - * Adds the attributes for a searchable object. - * - * @param array $attributes Attributes to update. - * @param Meta $meta Meta value object for the current object. - * - * @return array Attributes for the searchable object. - */ - private function add_attributes( array $attributes, Meta $meta ) { - $attributes['yoast_seo_links'] = (int) $meta->indexable->incoming_link_count; - $attributes['yoast_seo_metadesc'] = $meta->meta_description; - - return $this->add_social_image( $attributes, $meta->open_graph_images ); - } - - /** - * Adds the social image to an attributes array if we have one. - * - * @param array $attributes The array of search attributes for a record. - * @param array $og_images The social images for the current item. - * - * @return array The array of search attributes for a record. - */ - private function add_social_image( $attributes, $og_images ) { - if ( \is_array( $og_images ) && \count( $og_images ) > 0 ) { - $attributes['images']['social'] = \reset( $og_images ); - } - - return $attributes; - } - - /** - * Checks whether a post should be indexed, taking the Yoast SEO no-index state into account. - * - * @param bool $should_index Whether Algolia should index the post or not. - * @param WP_Post $post The post object. - * - * @return bool Whether Algolia should index the post or not. - */ - public function blacklist_no_index_posts( $should_index, $post ) { - if ( $this->meta->for_post( $post->ID )->robots['index'] === 'noindex' ) { - return false; - } - - return $should_index; - } - - /** - * Checks whether a term should be indexed, taking the Yoast SEO no-index state into account. - * - * @param bool $should_index Whether Algolia should index the term or not. - * @param WP_Term $term The term object. - * - * @return bool Whether Algolia should index the term or not. - */ - public function blacklist_no_index_terms( $should_index, $term ) { - if ( $this->meta->for_term( $term->term_id )->robots['index'] === 'noindex' ) { - return false; - } - - return $should_index; - } - - /** - * Checks whether a user should be indexed, taking the Yoast SEO no-index state into account. - * - * @param bool $should_index Whether Algolia should index the user or not. - * @param WP_User $user The user object. - * - * @return bool Whether Algolia should index the user or not. - */ - public function blacklist_no_index_users( $should_index, $user ) { - if ( $this->meta->for_author( $user->ID )->robots['index'] === 'noindex' ) { - return false; - } - - return $should_index; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/edd.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/edd.php deleted file mode 100644 index 3ffabbc3..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/edd.php +++ /dev/null @@ -1,147 +0,0 @@ -meta = $meta; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - \add_filter( 'edd_generate_download_structured_data', [ $this, 'filter_download_schema' ] ); - \add_filter( 'wpseo_schema_organization', [ $this, 'filter_organization_schema' ] ); - \add_filter( 'wpseo_schema_webpage', [ $this, 'filter_webpage_schema' ], 10, 2 ); - } - - /** - * Make sure the Organization is classified as a Brand too. - * - * @param array $data The organization schema. - * - * @return array - */ - public function filter_organization_schema( $data ) { - if ( \is_singular( 'download' ) ) { - $data['@type'] = [ 'Organization', 'Brand' ]; - } - - return $data; - } - - /** - * Make sure the WebPage schema contains reference to the product. - * - * @param array $data The schema Webpage data. - * @param WPSEO_Schema_Context $context Context object. - * - * @return array - */ - public function filter_webpage_schema( $data, $context ) { - if ( \is_singular( [ 'download' ] ) ) { - $data['about'] = [ '@id' => $context->canonical . '#/schema/edd-product/' . \get_the_ID() ]; - $data['mainEntity'] = [ '@id' => $context->canonical . '#/schema/edd-product/' . \get_the_ID() ]; - } - - return $data; - } - - /** - * Filter the structured data output for a download to tie into Yoast SEO's output. - * - * @param array $data Structured data for a download. - * - * @return array - */ - public function filter_download_schema( $data ) { - - $data['@id'] = $this->meta->for_current_page()->canonical . '#/schema/edd-product/' . \get_the_ID(); - $data['sku'] = (string) $data['sku']; - $data['brand'] = $this->return_organization_node(); - $data['offers'] = $this->clean_up_offer( $data['offers'] ); - - if ( ! isset( $data['description'] ) ) { - $data['description'] = $this->meta->for_current_page()->open_graph_description; - } - - return $data; - } - - /** - * Cleans up EDD generated Offers. - * - * @param array $offer The schema array. - * - * @return array - */ - private function clean_up_offer( $offer ) { - // Checking for not isset @type makes sure there are multiple offers in the offer list. It is always an array. - if ( ! isset( $offer['@type'] ) ) { - foreach ( $offer as $key => $o ) { - if ( \array_key_exists( 'priceValidUntil', $o ) && $o['priceValidUntil'] === null ) { - unset( $offer[ $key ]['priceValidUntil'] ); - } - $offer[ $key ]['seller'] = $this->return_organization_node(); - } - } - else { - if ( \array_key_exists( 'priceValidUntil', $offer ) && $offer['priceValidUntil'] === null ) { - unset( $offer['priceValidUntil'] ); - } - $offer['seller'] = $this->return_organization_node(); - } - - return $offer; - } - - /** - * Returns a Schema node for the current site's Organization. - * - * @return string[] - */ - private function return_organization_node() { - return [ - '@type' => [ 'Organization', 'Brand' ], - '@id' => $this->meta->for_home_page()->canonical . '#organization', - ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/elementor-premium.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/elementor-premium.php deleted file mode 100644 index 8e1a4255..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/elementor-premium.php +++ /dev/null @@ -1,332 +0,0 @@ -prominent_words_helper = $prominent_words_helper; - $this->post_watcher = new WPSEO_Post_Watcher(); - $this->current_page_helper = $current_page_helper; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - \add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'enqueue' ] ); - \add_action( 'post_updated', [ $this->post_watcher, 'detect_slug_change' ], 12, 3 ); - } - - /** - * Enqueues all the needed JS and CSS. - * - * @return void - */ - public function enqueue() { - // Check if we should load. - if ( ! $this->load_metabox() ) { - return; - } - - // Re-register assets as Elementor unregister everything. - $asset_manager = new WPSEO_Premium_Assets(); - $asset_manager->register_assets(); - - // Initialize Elementor (replaces premium-metabox). - $this->enqueue_assets(); - - /* - * Re-enqueue the integrations as `admin_enqueue_scripts` is undone. - * Note the register_hooks were not even called (because it doesn't work anyway). - */ - $social_previews = new WPSEO_Social_Previews(); - $social_previews->enqueue_assets(); - $custom_fields = new WPSEO_Custom_Fields_Plugin(); - $custom_fields->enqueue(); - - $replacement_variables = new Replacement_Variables_Integration(); - $replacement_variables->enqueue_assets(); - } - - // Below is mostly copied from `premium-metabox.php`. - - /** - * Enqueues assets when relevant. - * - * @codeCoverageIgnore Method uses dependencies. - * - * @return void - */ - public function enqueue_assets() { - \wp_enqueue_script( static::SCRIPT_HANDLE ); - \wp_enqueue_style( static::SCRIPT_HANDLE ); - - $premium_localization = new WPSEO_Premium_Asset_JS_L10n(); - $premium_localization->localize_script( static::SCRIPT_HANDLE ); - - $this->send_data_to_assets(); - } - - /** - * Send data to assets by using wp_localize_script. - * - * @return void - */ - public function send_data_to_assets() { - $analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - $assets_manager = new WPSEO_Admin_Asset_Manager(); - - $data = [ - 'restApi' => $this->get_rest_api_config(), - 'seoAnalysisEnabled' => $analysis_seo->is_enabled(), - 'licensedURL' => WPSEO_Utils::get_home_url(), - 'settingsPageUrl' => \admin_url( 'admin.php?page=wpseo_page_settings#/site-features#card-wpseo-enable_link_suggestions' ), - 'integrationsTabURL' => \admin_url( 'admin.php?page=wpseo_integrations' ), - 'commonsScriptUrl' => \plugins_url( - 'assets/js/dist/commons-premium-' . $assets_manager->flatten_version( \WPSEO_PREMIUM_VERSION ) . \WPSEO_CSSJS_SUFFIX . '.js', - \WPSEO_PREMIUM_FILE - ), - 'premiumAssessmentsScriptUrl' => \plugins_url( - 'assets/js/dist/register-premium-assessments-' . $assets_manager->flatten_version( \WPSEO_PREMIUM_VERSION ) . \WPSEO_CSSJS_SUFFIX . '.js', - \WPSEO_PREMIUM_FILE - ), - 'pluginUrl' => \plugins_url( '', \WPSEO_PREMIUM_FILE ), - ]; - if ( \defined( 'YOAST_SEO_TEXT_FORMALITY' ) && \YOAST_SEO_TEXT_FORMALITY === true ) { - $data['textFormalityScriptUrl'] = \plugins_url( - 'assets/js/dist/register-text-formality-' . $assets_manager->flatten_version( \WPSEO_PREMIUM_VERSION ) . \WPSEO_CSSJS_SUFFIX . '.js', - \WPSEO_PREMIUM_FILE - ); - } - $data = \array_merge( $data, $this->get_post_metabox_config() ); - - if ( \current_user_can( 'edit_others_posts' ) ) { - $data['workoutsUrl'] = \admin_url( 'admin.php?page=wpseo_workouts' ); - } - - // Use an extra level in the array to preserve booleans. WordPress sanitizes scalar values in the first level of the array. - \wp_localize_script( static::SCRIPT_HANDLE, 'wpseoPremiumMetaboxData', [ 'data' => $data ] ); - } - - /** - * Retrieves the metabox config for a post. - * - * @return array The config. - */ - protected function get_post_metabox_config() { - $link_suggestions_enabled = WPSEO_Options::get( 'enable_link_suggestions', false ); - - $prominent_words_support = new WPSEO_Premium_Prominent_Words_Support(); - $is_prominent_words_available = $prominent_words_support->is_post_type_supported( $this->get_metabox_post()->post_type ); - - $site_locale = \get_locale(); - $language = WPSEO_Language_Utils::get_language( $site_locale ); - - return [ - 'currentObjectId' => $this->get_metabox_post()->ID, - 'currentObjectType' => 'post', - 'linkSuggestionsEnabled' => ( $link_suggestions_enabled ) ? 'enabled' : 'disabled', - 'linkSuggestionsAvailable' => $is_prominent_words_available, - 'linkSuggestionsUnindexed' => ! $this->is_prominent_words_indexing_completed() && WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ), - 'perIndexableLimit' => $this->per_indexable_limit( $language ), - 'isProminentWordsAvailable' => $is_prominent_words_available, - ]; - } - - /** - * Checks if the content endpoints are available. - * - * @return bool Returns true if the content endpoints are available - */ - public static function are_content_endpoints_available() { - if ( \function_exists( 'rest_get_server' ) ) { - $namespaces = \rest_get_server()->get_namespaces(); - return \in_array( 'wp/v2', $namespaces, true ); - } - return false; - } - - /** - * Retrieves the REST API configuration. - * - * @return array The configuration. - */ - protected function get_rest_api_config() { - return [ - 'available' => WPSEO_Utils::is_api_available(), - 'contentEndpointsAvailable' => self::are_content_endpoints_available(), - 'root' => \esc_url_raw( \rest_url() ), - 'nonce' => \wp_create_nonce( 'wp_rest' ), - ]; - } - - /** - * Returns the post for the current admin page. - * - * @codeCoverageIgnore - * - * @return WP_Post|null The post for the current admin page. - */ - protected function get_metabox_post() { - if ( $this->post !== null ) { - return $this->post; - } - - $post_id = $this->current_page_helper->get_current_post_id(); - - if ( $post_id ) { - - $this->post = \get_post( $post_id ); - - return $this->post; - } - - if ( isset( $GLOBALS['post'] ) ) { - $this->post = $GLOBALS['post']; - - return $this->post; - } - - return null; - } - - /** - * Checks whether or not the metabox related scripts should be loaded. - * - * @return bool True when it should be loaded. - */ - protected function load_metabox() { - // When the current page isn't a post related one. - if ( WPSEO_Metabox::is_post_edit( $this->get_current_page() ) ) { - return WPSEO_Post_Type::has_metabox_enabled( $this->current_page_helper->get_current_post_type() ); - } - - // Make sure ajax integrations are loaded. - return \wp_doing_ajax(); - } - - /** - * Retrieves the value of the pagenow variable. - * - * @codeCoverageIgnore - * - * @return string The value of pagenow. - */ - protected function get_current_page() { - global $pagenow; - - return $pagenow; - } - - /** - * Returns whether or not we need to index more posts for correct link suggestion functionality. - * - * @return bool Whether or not we need to index more posts. - */ - protected function is_prominent_words_indexing_completed() { - $is_indexing_completed = $this->prominent_words_helper->is_indexing_completed(); - if ( $is_indexing_completed === null ) { - $indexation_integration = \YoastSEOPremium()->classes->get( Indexing_Integration::class ); - $is_indexing_completed = $indexation_integration->get_unindexed_count( 0 ) === 0; - - $this->prominent_words_helper->set_indexing_completed( $is_indexing_completed ); - } - - return $is_indexing_completed; - } - - /** - * Returns the number of prominent words to store for content written in the given language. - * - * @param string $language The current language. - * - * @return int The number of words to store. - */ - protected function per_indexable_limit( $language ) { - if ( \YoastSEO()->helpers->language->has_function_word_support( $language ) ) { - return Indexing_Integration::PER_INDEXABLE_LIMIT; - } - - return Indexing_Integration::PER_INDEXABLE_LIMIT_NO_FUNCTION_WORD_SUPPORT; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/elementor-preview.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/elementor-preview.php deleted file mode 100644 index 863188d3..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/elementor-preview.php +++ /dev/null @@ -1,61 +0,0 @@ -asset_manager = $asset_manager; - } - - /** - * Returns the conditionals based in which this loadable should be active. - * - * @return string[] - */ - public static function get_conditionals() { - return [ Elementor_Activated_Conditional::class ]; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - \add_action( 'elementor/preview/enqueue_styles', [ $this, 'add_preview_styles' ] ); - } - - /** - * Adds CSS specifically for the Elementor preview. - * - * @return void - */ - public function add_preview_styles() { - $this->asset_manager->register_assets(); - $this->asset_manager->enqueue_style( 'inside-editor' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/mastodon.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/mastodon.php deleted file mode 100644 index 787bf5ae..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/mastodon.php +++ /dev/null @@ -1,175 +0,0 @@ -options_helper = $options_helper; - $this->social_profiles_helper = $social_profiles_helper; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - \add_filter( 'wpseo_frontend_presenter_classes', [ $this, 'add_social_link_tags' ], 10, 2 ); - \add_filter( 'wpseo_person_social_profile_fields', [ $this, 'add_mastodon_to_person_social_profile_fields' ], 11, 1 ); - \add_filter( 'wpseo_organization_social_profile_fields', [ $this, 'add_mastodon_to_organization_social_profile_fields' ], 11, 1 ); - \add_filter( 'wpseo_schema_person_social_profiles', [ $this, 'add_mastodon_to_person_schema' ], 10 ); - \add_filter( 'user_contactmethods', [ $this, 'add_mastodon_to_user_contactmethods' ], 10 ); - \add_filter( 'wpseo_mastodon_active', [ $this, 'check_mastodon_active' ], 10 ); - } - - /** - * Adds the social profiles presenter to the list of presenters to use. - * - * @param array $presenters The list of presenters. - * @param string $page_type The page type for which the presenters have been collected. - * - * @return array - */ - public function add_social_link_tags( $presenters, $page_type ) { - // Bail out early if something's wrong with the presenters, let's not add any more confusion there. - if ( ! \is_array( $presenters ) ) { - return $presenters; - } - - if ( \in_array( $page_type, [ 'Static_Home_Page', 'Home_Page' ], true ) ) { - $presenters = \array_merge( $presenters, [ 'Yoast\WP\SEO\Premium\Presenters\Mastodon_Link_Presenter' ] ); - } - - return $presenters; - } - - /** - * Adds Mastodon to the list of social profiles. - * - * @param array $social_profile_fields The social profiles array. - * - * @return array The updated social profiles array. - */ - public function add_mastodon_to_person_social_profile_fields( $social_profile_fields ) { - // Bail out early if something's wrong with the social profiles, let's not add any more confusion there. - if ( ! \is_array( $social_profile_fields ) ) { - return $social_profile_fields; - } - $social_profile_fields['mastodon'] = 'get_non_valid_url'; - - return $social_profile_fields; - } - - /** - * Adds Mastodon to the list of social profiles. - * - * @param array $social_profile_fields The social profiles array. - * - * @return array The updated social profiles array. - */ - public function add_mastodon_to_organization_social_profile_fields( $social_profile_fields ) { - // Bail out early if something's wrong with the social profiles, let's not add any more confusion there. - if ( ! \is_array( $social_profile_fields ) ) { - return $social_profile_fields; - } - $social_profile_fields['mastodon_url'] = 'get_non_valid_url'; - - return $social_profile_fields; - } - - /** - * Adds Mastodon to the list of social profiles to add to a Person's Schema. - * - * @param array $social_profiles The social profiles array. - * - * @return array - */ - public function add_mastodon_to_person_schema( $social_profiles ) { - // Bail out early if something's wrong with the social profiles, let's not add any more confusion there. - if ( ! \is_array( $social_profiles ) ) { - return $social_profiles; - } - $social_profiles[] = 'mastodon'; - - return $social_profiles; - } - - /** - * Adds Mastodon to the list of contact methods for persons. - * - * @param array $contactmethods Currently set contactmethods. - * - * @return array - */ - public function add_mastodon_to_user_contactmethods( $contactmethods ) { - // Bail out early if something's wrong with the contact methods, let's not add any more confusion there. - if ( ! \is_array( $contactmethods ) ) { - return $contactmethods; - } - - $contactmethods['mastodon'] = \__( 'Mastodon profile URL', 'wordpress-seo-premium' ); - - return $contactmethods; - } - - /** - * Checks if the Mastodon field is filled in. - * - * @param bool $state The current state of the integration. - * - * @return bool - */ - public function check_mastodon_active( $state ) { - switch ( $this->options_helper->get( 'company_or_person', false ) ) { - case 'company': - $social_profiles = $this->social_profiles_helper->get_organization_social_profiles(); - if ( ! empty( $social_profiles['mastodon_url'] ) ) { - return true; - } - break; - - case 'person': - $company_or_person_id = $this->options_helper->get( 'company_or_person_user_id', 0 ); - $social_profiles = $this->social_profiles_helper->get_person_social_profiles( $company_or_person_id ); - if ( ! empty( $social_profiles['mastodon'] ) ) { - return true; - } - break; - } - - return $state; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/translationspress.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/translationspress.php deleted file mode 100644 index d8f34d8f..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/translationspress.php +++ /dev/null @@ -1,208 +0,0 @@ -transient_key = 'yoast_translations_' . $this->slug; - $this->api_url = 'https://packages.translationspress.com/yoast/' . $this->slug . '/packages.json'; - $this->date_helper = $date_helper; - } - - /** - * Initializes the integration. - * - * This is the place to register hooks and filters. - * - * @return void - */ - public function register_hooks() { - \add_action( 'init', [ $this, 'register_clean_translations_cache' ], \PHP_INT_MAX ); - \add_filter( 'translations_api', [ $this, 'translations_api' ], 10, 3 ); - \add_filter( 'site_transient_update_plugins', [ $this, 'site_transient_update_plugins' ] ); - } - - /** - * Short-circuits translations API requests for private projects. - * - * @param bool|array $result The result object. Default false. - * @param string $requested_type The type of translations being requested. - * @param object $args Translation API arguments. - * - * @return bool|array The translations array. False by default. - */ - public function translations_api( $result, $requested_type, $args ) { - if ( $requested_type === 'plugins' && $args['slug'] === $this->slug ) { - return $this->get_translations(); - } - - return $result; - } - - /** - * Filters the translations transients to include the private plugin or theme. - * Caches our own return value to prevent heavy overhead. - * - * @param bool|object $value The transient value. - * - * @return object The filtered transient value. - */ - public function site_transient_update_plugins( $value ) { - if ( ! $value ) { - $value = new stdClass(); - } - - if ( ! isset( $value->translations ) ) { - $value->translations = []; - } - - if ( \is_array( $this->cached_translations ) ) { - $value->translations = \array_merge( $value->translations, $this->cached_translations ); - return $value; - } - - $this->cached_translations = []; - - $translations = $this->get_translations(); - if ( empty( $translations[ $this->slug ]['translations'] ) ) { - return $value; - } - - // The following call is the reason we need to cache the results of this method. - $installed_translations = \wp_get_installed_translations( 'plugins' ); - $available_languages = \get_available_languages(); - foreach ( $translations[ $this->slug ]['translations'] as $translation ) { - if ( ! \in_array( $translation['language'], $available_languages, true ) ) { - continue; - } - - if ( isset( $installed_translations[ $this->slug ][ $translation['language'] ] ) && $translation['updated'] ) { - $local = new DateTime( $installed_translations[ $this->slug ][ $translation['language'] ]['PO-Revision-Date'] ); - $remote = new DateTime( $translation['updated'] ); - - if ( $local >= $remote ) { - continue; - } - } - - $translation['type'] = 'plugin'; - $translation['slug'] = $this->slug; - $translation['autoupdate'] = true; - $value->translations[] = $translation; - $this->cached_translations[] = $translation; - } - - return $value; - } - - /** - * Registers actions for clearing translation caches. - * - * @return void - */ - public function register_clean_translations_cache() { - \add_action( 'set_site_transient_update_plugins', [ $this, 'clean_translations_cache' ] ); - \add_action( 'delete_site_transient_update_plugins', [ $this, 'clean_translations_cache' ] ); - } - - /** - * Clears existing translation cache. - * - * @return void - */ - public function clean_translations_cache() { - $translations = \get_site_transient( $this->transient_key ); - if ( ! \is_array( $translations ) ) { - return; - } - - $cache_lifespan = \DAY_IN_SECONDS; - $time_not_changed = isset( $translations['_last_checked'] ) && ( $this->date_helper->current_time() - $translations['_last_checked'] ) > $cache_lifespan; - - if ( ! $time_not_changed ) { - return; - } - - \delete_site_transient( $this->transient_key ); - } - - /** - * Gets the translations for a given project. - * - * @return array The translation data. - */ - public function get_translations() { - $translations = \get_site_transient( $this->transient_key ); - if ( $translations !== false && \is_array( $translations ) ) { - return $translations; - } - - $translations = []; - - $result = \json_decode( \wp_remote_retrieve_body( \wp_remote_get( $this->api_url ) ), true ); - - // Nothing found. - if ( ! \is_array( $result ) ) { - $result = []; - } - - $translations[ $this->slug ] = $result; - $translations['_last_checked'] = $this->date_helper->current_time(); - - \set_site_transient( $this->transient_key, $translations ); - - return $translations; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/wincher-keyphrases.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/wincher-keyphrases.php deleted file mode 100644 index f6a4e30f..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/third-party/wincher-keyphrases.php +++ /dev/null @@ -1,91 +0,0 @@ -get_results( - $wpdb->prepare( - " - SELECT meta_value - FROM %i pm - JOIN %i p ON p.id = pm.post_id - WHERE %i = %s AND %i != 'trash' - ", - $wpdb->postmeta, - $wpdb->posts, - 'meta_key', - $meta_key, - 'post_status' - ) - ); - - if ( $results ) { - foreach ( $results as $row ) { - $additional_keywords = \json_decode( $row->meta_value, true ); - if ( $additional_keywords !== null ) { - $additional_keywords = \array_column( $additional_keywords, 'keyword' ); - $keyphrases = \array_merge( $keyphrases, $additional_keywords ); - } - } - } - - return $keyphrases; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/upgrade-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/upgrade-integration.php deleted file mode 100644 index 369cb863..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/upgrade-integration.php +++ /dev/null @@ -1,36 +0,0 @@ -run_upgrade( \WPSEO_PREMIUM_VERSION ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/user-profile-integration.php b/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/user-profile-integration.php deleted file mode 100644 index 9e84c344..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/integrations/user-profile-integration.php +++ /dev/null @@ -1,50 +0,0 @@ -prominent_words_repository = $prominent_words_repository; - } - - /** - * Registers the action that triggers when an indexable is deleted. - * - * @return void - */ - public function register_hooks() { - \add_action( 'wpseo_indexable_deleted', [ $this, 'remove_prominent_words_for_indexable' ] ); - } - - /** - * Removes all prominent words for indexables if they are present. - * - * @param Indexable $indexable The indexable that got deleted. - * - * @return void - */ - public function remove_prominent_words_for_indexable( $indexable ) { - - $prominent_words = $this->prominent_words_repository->find_by_indexable_id( $indexable->id ); - - if ( \count( $prominent_words ) > 0 ) { - $this->prominent_words_repository->delete_by_indexable_id( $indexable->id ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/introductions/application/ai-generate-titles-and-descriptions-introduction.php b/wp/wp-content/plugins/wordpress-seo-premium/src/introductions/application/ai-generate-titles-and-descriptions-introduction.php deleted file mode 100644 index cde34f43..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/introductions/application/ai-generate-titles-and-descriptions-introduction.php +++ /dev/null @@ -1,106 +0,0 @@ -options_helper = $options_helper; - $this->user_helper = $user_helper; - } - - /** - * Returns the ID. - * - * @return string - */ - public function get_id() { - return self::ID; - } - - /** - * Returns the unique name. - * - * @deprecated 21.6 - * @codeCoverageIgnore - * - * @return string - */ - public function get_name() { - \_deprecated_function( __METHOD__, 'Yoast SEO Premium 21.6', 'Please use get_id() instead' ); - - return self::ID; - } - - /** - * Returns the requested pagination priority. Lower means earlier. - * - * @return int - */ - public function get_priority() { - return 10; - } - - /** - * Returns whether this introduction should show. - * - * @return bool - */ - public function should_show() { - // Feature was already enabled, no need to introduce it again. - if ( $this->options_helper->get( 'ai_enabled_pre_default', false ) ) { - return false; - } - - // Get the current user ID, if no user is logged in we bail as this is needed for the next checks. - $current_user_id = $this->user_helper->get_current_user_id(); - if ( $current_user_id === 0 ) { - return false; - } - - // Consent was already given, no need to ask again. - if ( $this->user_helper->get_meta( $current_user_id, '_yoast_wpseo_ai_consent', true ) ) { - return false; - } - - if ( ! $this->is_user_allowed( [ 'edit_posts' ] ) ) { - return false; - } - - return true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/main.php b/wp/wp-content/plugins/wordpress-seo-premium/src/main.php deleted file mode 100644 index ec8cb5fb..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/main.php +++ /dev/null @@ -1,63 +0,0 @@ -is_development() - && \class_exists( '\Yoast\WP\SEO\Dependency_Injection\Container_Compiler' ) - && \file_exists( __DIR__ . '/../config/dependency-injection/services.php' ) - ) { - // Exception here is unhandled as it will only occur in development. - Container_Compiler::compile( - $this->is_development(), - __DIR__ . '/generated/container.php', - __DIR__ . '/../config/dependency-injection/services.php', - __DIR__ . '/../vendor/composer/autoload_classmap.php', - 'Yoast\WP\SEO\Premium\Generated' - ); - } - - if ( \file_exists( __DIR__ . '/generated/container.php' ) ) { - require_once __DIR__ . '/generated/container.php'; - - return new Cached_Container(); - } - - return null; - } - - /** - * @inheritDoc - */ - protected function get_surfaces() { - return [ - 'classes' => Classes_Surface::class, - 'helpers' => Helpers_Surface::class, - ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/models/prominent-words.php b/wp/wp-content/plugins/wordpress-seo-premium/src/models/prominent-words.php deleted file mode 100644 index 2958042e..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/models/prominent-words.php +++ /dev/null @@ -1,25 +0,0 @@ -"; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/presenters/icons/cross-icon-presenter.php b/wp/wp-content/plugins/wordpress-seo-premium/src/presenters/icons/cross-icon-presenter.php deleted file mode 100644 index 40dc25c1..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/presenters/icons/cross-icon-presenter.php +++ /dev/null @@ -1,18 +0,0 @@ -"; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/presenters/icons/icon-presenter.php b/wp/wp-content/plugins/wordpress-seo-premium/src/presenters/icons/icon-presenter.php deleted file mode 100644 index 39cc53bc..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/presenters/icons/icon-presenter.php +++ /dev/null @@ -1,77 +0,0 @@ -"; - - /** - * The default height and width of an icon in pixels. - */ - public const SIZE_DEFAULT = 24; - - /** - * The size of the icon in pixels. - * - * @var int - */ - protected $size; - - /** - * Creates a new icon. - * - * @codeCoverageIgnore - * - * @param int $size The size of the icon. - */ - public function __construct( $size ) { - $this->size = $size; - } - - /** - * Generates the SVG based on the given path. - * - * @param string $path The path to generate SVG icon for. - * @param int $svg_size The height and width of the SVG icon. - * - * @return string The generated icon svg. - */ - private static function svg( $path, $svg_size = self::SIZE_DEFAULT ) { - $start = \str_replace( '%SIZE%', $svg_size, self::SVG_START_TAG ); - return $start . $path . ''; - } - - /** - * Returns the icon as a string. - * - * @return string The icon. - */ - public function present() { - return self::svg( $this->get_path(), $this->get_size() ); - } - - /** - * Returns the size of the icon. - * - * @return int The size of the icon. - */ - public function get_size() { - return $this->size; - } - - /** - * Returns the path of the icon. - * - * @return string The path of the icon. - */ - abstract public function get_path(); -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/presenters/mastodon-link-presenter.php b/wp/wp-content/plugins/wordpress-seo-premium/src/presenters/mastodon-link-presenter.php deleted file mode 100644 index 61ee41d2..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/presenters/mastodon-link-presenter.php +++ /dev/null @@ -1,84 +0,0 @@ -` element. - */ - return \apply_filters( 'wpseo_mastodon_link', $output ); - } - - return ''; - } - - /** - * Returns the URL to be presented in the tag. - * - * @return string The URL to be presented in the tag. - */ - public function get() { - switch ( $this->helpers->options->get( 'company_or_person', false ) ) { - case 'company': - $social_profiles = $this->helpers->social_profiles->get_organization_social_profiles(); - break; - - case 'person': - $company_or_person_id = $this->helpers->options->get( 'company_or_person_user_id', 0 ); - $social_profiles = $this->helpers->social_profiles->get_person_social_profiles( $company_or_person_id ); - break; - default: - $social_profiles = []; - } - - // Person case. - if ( ! empty( $social_profiles['mastodon'] ) ) { - return $social_profiles['mastodon']; - } - - // Organization case. - if ( ! empty( $social_profiles['mastodon_url'] ) ) { - return $social_profiles['mastodon_url']; - } - - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/repositories/prominent-words-repository.php b/wp/wp-content/plugins/wordpress-seo-premium/src/repositories/prominent-words-repository.php deleted file mode 100644 index 1d8dbaff..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/repositories/prominent-words-repository.php +++ /dev/null @@ -1,206 +0,0 @@ -query()->where( 'indexable_id', $indexable_id )->find_many(); - } - - /** - * Finds the prominent words based on a list of indexable ids. - * The method also computes the document frequency of each word and adds it as a separate property on the objects. - * - * @param int[] $ids The ids of indexables to get prominent words for. - * - * @return array The list of prominent words items found by indexable ids. - */ - public function find_by_list_of_ids( $ids ) { - if ( empty( $ids ) ) { - return []; - } - - $prominent_words = $this->query()->where_in( 'indexable_id', $ids )->find_many(); - $prominent_stems = \wp_list_pluck( $prominent_words, 'stem' ); - $document_freqs = $this->query() - ->select( 'stem' ) - ->select_expr( 'COUNT(id)', 'count' ) - ->where_in( 'stem', $prominent_stems ) - ->group_by( 'stem' ) - ->find_array(); - - $stem_counts = []; - foreach ( $document_freqs as $document_freq ) { - $stem_counts[ $document_freq['stem'] ] = $document_freq['count']; - } - foreach ( $prominent_words as $prominent_word ) { - if ( ! \array_key_exists( $prominent_word->stem, $stem_counts ) ) { - continue; - } - $prominent_word->df = (int) $stem_counts[ $prominent_word->stem ]; - } - - return $prominent_words; - } - - /** - * Finds all indexable ids which have prominent words with stems from the list. - * - * @param array $stems The stems of prominent words to search for. - * @param int $limit The number of indexable ids to return in 1 call. - * @param int $page From which page (batch) to begin. - * @param int[] $excluded_ids The indexable IDs to exclude. - * @param array $post_type Optional. The list of post types where suggestions may come from. - * @param bool $only_include_public Optional. Only include public indexables, defaults to false. - * - * @return array The list of indexable ids. - */ - public function find_ids_by_stems( $stems, $limit, $page, $excluded_ids = [], $post_type = [], $only_include_public = false ) { - if ( empty( $stems ) ) { - return []; - } - - $offset = ( ( $page - 1 ) * $limit ); - - $stem_placeholders = \implode( ', ', \array_fill( 0, \count( $stems ), '%s' ) ); - - $query = Model::of_type( 'Indexable' ) - ->table_alias( 'i' ) - ->select( 'id' ) - ->where_raw( - 'i.id IN ( SELECT DISTINCT pw.indexable_id FROM ' . Model::get_table_name( 'Prominent_Words' ) . ' pw WHERE pw.stem IN (' . $stem_placeholders . ') )', - $stems - ) - ->where_raw( '( i.post_status NOT IN ( \'draft\', \'auto-draft\', \'trash\' ) OR i.post_status IS NULL )' ) - ->limit( $limit ) - ->offset( $offset ); - - if ( ! empty( $excluded_ids ) ) { - $query = $query->where_not_in( 'id', $excluded_ids ); - } - - if ( ! empty( $post_type ) && \is_array( $post_type ) ) { - $query = $query->where_in( 'object_sub_type', $post_type ); - } - - if ( $only_include_public ) { - $query = $query->where_raw( '(i.is_public = 1 OR i.is_public is null)' ); - } - - $results = $query->find_array(); - - return \wp_list_pluck( $results, 'id' ); - } - - /** - * Deletes multiple prominent words from the database in one query. - * - * @param int $indexable_id The id of the indexable which needs to have - * some of its prominent words deleted. - * @param array $outdated_stems The array with to-be-deleted prominent word stems. - * - * @return bool Whether the delete was successful. - */ - public function delete_by_indexable_id_and_stems( $indexable_id, $outdated_stems ) { - // Check if the data are of the right format. - if ( ( ! $indexable_id ) || empty( $outdated_stems ) || ! \is_array( $outdated_stems ) ) { - return false; - } - - return $this->query() - ->where( 'indexable_id', $indexable_id ) - ->where_in( 'stem', $outdated_stems ) - ->delete_many(); - } - - /** - * Deletes all prominent words for an indexable - * - * @param int $indexable_id The id of the indexable which needs to have - * some of its prominent words deleted. - * - * @return bool Whether the deletion was successful. - */ - public function delete_by_indexable_id( $indexable_id ) { - if ( ! $indexable_id ) { - return false; - } - - return $this->query() - ->where( 'indexable_id', $indexable_id ) - ->delete_many(); - } - - /** - * Counts the number of documents in which each of the given stems occurs. - * - * @param string[] $stems The stems of the words for which to find the document frequencies. - * - * @return array The list of stems and their respective document frequencies. Each entry has a 'stem' and a - * 'document_frequency' parameter. - */ - public function count_document_frequencies( $stems ) { - if ( empty( $stems ) ) { - return []; - } - - /* - * Count in how many documents each stem occurs by querying the database. - * Returns "Prominent_Words" with two properties: 'stem' and 'document_frequency'. - */ - $raw_doc_frequencies = $this->query() - ->select( 'stem' ) - ->select_expr( 'COUNT( stem )', 'document_frequency' ) - ->where_in( 'stem', $stems ) - ->group_by( 'stem' ) - ->find_many(); - - // We want to change the raw document frequencies into a map mapping stems to document frequency. - $stems = \array_map( - static function ( $item ) { - return $item->stem; - }, - $raw_doc_frequencies - ); - - $doc_frequencies = \array_fill_keys( $stems, 0 ); - foreach ( $raw_doc_frequencies as $raw_doc_frequency ) { - $doc_frequencies[ $raw_doc_frequency->stem ] = (int) $raw_doc_frequency->document_frequency; - } - - return $doc_frequencies; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/routes/link-suggestions-route.php b/wp/wp-content/plugins/wordpress-seo-premium/src/routes/link-suggestions-route.php deleted file mode 100644 index fa5eb36e..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/routes/link-suggestions-route.php +++ /dev/null @@ -1,113 +0,0 @@ -link_suggestions_action = $link_suggestions_action; - } - - /** - * Registers routes with WordPress. - * - * @return void - */ - public function register_routes() { - $route_args = [ - 'methods' => 'GET', - 'args' => [ - 'prominent_words' => [ - 'required' => true, - 'type' => 'object', - 'description' => 'Stems of prominent words and their term frequencies we want link suggestions based on', - ], - 'object_id' => [ - 'required' => true, - 'type' => 'integer', - 'description' => 'The object id of the current indexable.', - ], - 'object_type' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The object type of the current indexable.', - ], - 'limit' => [ - 'required' => false, - 'default' => 5, - 'type' => 'integer', - 'description' => 'The maximum number of link suggestions to retrieve', - ], - ], - 'callback' => [ $this, 'run_get_suggestions_action' ], - 'permission_callback' => [ $this, 'can_retrieve_data' ], - ]; - \register_rest_route( Main::API_V1_NAMESPACE, self::ENDPOINT_QUERY, $route_args ); - } - - /** - * Runs the get suggestions action.. - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response The response for the query of link suggestions. - */ - public function run_get_suggestions_action( WP_REST_Request $request ) { - $prominent_words = $request->get_param( 'prominent_words' ); - $limit = $request->get_param( 'limit' ); - $object_id = $request->get_param( 'object_id' ); - $object_type = $request->get_param( 'object_type' ); - $post_type = $request->get_param( 'post_type' ); - - return new WP_REST_Response( - $this->link_suggestions_action->get_suggestions( - $prominent_words, - $limit, - $object_id, - $object_type, - true, - $post_type - ) - ); - } - - /** - * Determines if the current user is allowed to use this endpoint. - * - * @return bool - */ - public function can_retrieve_data() { - return \current_user_can( 'edit_posts' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/routes/prominent-words-route.php b/wp/wp-content/plugins/wordpress-seo-premium/src/routes/prominent-words-route.php deleted file mode 100644 index 1940af20..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/routes/prominent-words-route.php +++ /dev/null @@ -1,245 +0,0 @@ -content_action = $content_action; - $this->save_action = $save_action; - $this->complete_action = $complete_action; - $this->indexing_helper = $indexing_helper; - } - - /** - * Registers routes with WordPress. - * - * @return void - */ - public function register_routes() { - \register_rest_route( - Main::API_V1_NAMESPACE, - self::GET_CONTENT_ROUTE, - [ - 'methods' => 'POST', - 'callback' => [ $this, 'run_content_action' ], - 'permission_callback' => [ $this, 'can_retrieve_data' ], - ] - ); - - \register_rest_route( - Main::API_V1_NAMESPACE, - self::COMPLETE_ROUTE, - [ - 'methods' => 'POST', - 'callback' => [ $this, 'run_complete_action' ], - 'permission_callback' => [ $this, 'can_retrieve_data' ], - ] - ); - - $route_args = [ - 'methods' => 'POST', - 'args' => [ - 'data' => [ - 'type' => 'array', - 'required' => false, - 'items' => [ - 'type' => 'object', - 'properties' => [ - 'object_id' => [ - 'type' => 'number', - 'required' => true, - ], - 'prominent_words' => [ - 'type' => 'object', - 'required' => false, - ], - ], - ], - ], - ], - 'callback' => [ $this, 'run_save_action' ], - 'permission_callback' => [ $this, 'can_retrieve_data' ], - ]; - - \register_rest_route( Main::API_V1_NAMESPACE, self::SAVE_ROUTE, $route_args ); - } - - /** - * Retrieves the content that needs to be analyzed for prominent words. - * - * @return WP_REST_Response Response with the content that needs to be analyzed for prominent words. - */ - public function run_content_action() { - return $this->run_indexation_action( $this->content_action, self::FULL_GET_CONTENT_ROUTE ); - } - - /** - * Marks the indexing of prominent words as completed. - * - * @return WP_REST_Response Response with empty data. - */ - public function run_complete_action() { - $this->complete_action->complete(); - - return $this->respond_with( [], false ); - } - - /** - * Saves the prominent words for the indexables. - * - * The request should have the parameters: - * - **data**: The data array containing: - * - **object_id**: The ID of the object (post-id, term-id, etc.). - * - **prominent_words**: The map of `'stem' => weight` key-value pairs, - * e.g. the stems of the prominent words and their weights. - * Leave this out when the indexable has no prominent words. - * - * @param WP_REST_Request $request The request to handle. - * - * @return WP_REST_Response The response to give. - */ - public function run_save_action( WP_REST_Request $request ) { - $this->save_action->save( $request->get_param( 'data' ) ); - - return new WP_REST_Response( - [ 'message' => 'The words have been successfully saved for the given indexables.' ] - ); - } - - /** - * Determines if the current user is allowed to use this endpoint. - * - * @return bool - */ - public function can_retrieve_data() { - return \current_user_can( 'edit_posts' ); - } - - /** - * Runs an indexing action and returns the response. - * - * @param Indexation_Action_Interface $indexation_action The indexing action. - * @param string $url The url of the indexing route. - * - * @return WP_REST_Response|WP_Error The response, or an error when running the indexing action failed. - */ - protected function run_indexation_action( Indexation_Action_Interface $indexation_action, $url ) { - try { - return parent::run_indexation_action( $indexation_action, $url ); - } catch ( Exception $exception ) { - $this->indexing_helper->set_reason( Indexing_Reasons::REASON_INDEXING_FAILED ); - - return new WP_Error( 'wpseo_error_indexing', $exception->getMessage() ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/routes/workouts-route.php b/wp/wp-content/plugins/wordpress-seo-premium/src/routes/workouts-route.php deleted file mode 100644 index 878f2745..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/routes/workouts-route.php +++ /dev/null @@ -1,465 +0,0 @@ -indexable_repository = $indexable_repository; - $this->link_suggestions_action = $link_suggestions_action; - $this->indexable_term_builder = $indexable_term_builder; - $this->post_type_helper = $post_type_helper; - } - - /** - * Registers routes with WordPress. - * - * @return void - */ - public function register_routes() { - $edit_others_posts = static function () { - return \current_user_can( 'edit_others_posts' ); - }; - - $noindex_route = [ - [ - 'methods' => 'POST', - 'callback' => [ $this, 'noindex' ], - 'permission_callback' => $edit_others_posts, - 'args' => [ - 'object_id' => [ - 'type' => 'integer', - 'required' => true, - ], - 'object_type' => [ - 'type' => 'string', - 'required' => true, - ], - 'object_sub_type' => [ - 'type' => 'string', - 'required' => true, - ], - ], - ], - ]; - - \register_rest_route( Main::API_V1_NAMESPACE, Base_Workouts_Route::WORKOUTS_ROUTE . self::NOINDEX_ROUTE, $noindex_route ); - - $remove_redirect_route = [ - [ - 'methods' => 'POST', - 'callback' => [ $this, 'remove_redirect' ], - 'permission_callback' => $edit_others_posts, - 'args' => [ - 'object_id' => [ - 'type' => 'integer', - 'required' => true, - ], - 'object_type' => [ - 'type' => 'string', - 'required' => true, - ], - 'object_sub_type' => [ - 'type' => 'string', - 'required' => true, - ], - 'permalink' => [ - 'type' => 'string', - 'required' => true, - ], - 'redirect_url' => [ - 'type' => 'string', - 'required' => true, - ], - ], - ], - ]; - - \register_rest_route( Main::API_V1_NAMESPACE, Base_Workouts_Route::WORKOUTS_ROUTE . self::REMOVE_REDIRECT_ROUTE, $remove_redirect_route ); - - $suggestions_route = [ - [ - 'methods' => 'GET', - 'callback' => [ $this, 'get_link_suggestions' ], - 'permission_callback' => $edit_others_posts, - 'args' => [ - 'indexableId' => [ - 'type' => 'integer', - 'required' => true, - ], - ], - ], - ]; - - \register_rest_route( Main::API_V1_NAMESPACE, Base_Workouts_Route::WORKOUTS_ROUTE . self::LINK_SUGGESTIONS_ROUTE, $suggestions_route ); - - $last_updated_route = [ - [ - 'methods' => 'GET', - 'callback' => [ $this, 'get_last_updated' ], - 'permission_callback' => $edit_others_posts, - 'args' => [ - 'postId' => [ - 'type' => 'integer', - 'required' => true, - ], - ], - ], - ]; - - \register_rest_route( Main::API_V1_NAMESPACE, Base_Workouts_Route::WORKOUTS_ROUTE . self::LAST_UPDATED_ROUTE, $last_updated_route ); - - $cornerstone_data_route = [ - [ - 'methods' => 'GET', - 'callback' => [ $this, 'get_cornerstone_data' ], - 'permission_callback' => $edit_others_posts, - ], - ]; - - \register_rest_route( Main::API_V1_NAMESPACE, Base_Workouts_Route::WORKOUTS_ROUTE . self::CORNERSTONE_DATA_ROUTE, $cornerstone_data_route ); - - $enable_cornerstone_route = [ - [ - 'methods' => 'POST', - 'callback' => [ $this, 'enable_cornerstone' ], - 'permission_callback' => $edit_others_posts, - 'args' => [ - 'object_id' => [ - 'type' => 'integer', - 'required' => true, - ], - 'object_type' => [ - 'type' => 'string', - 'required' => true, - ], - ], - ], - ]; - - \register_rest_route( Main::API_V1_NAMESPACE, Base_Workouts_Route::WORKOUTS_ROUTE . self::ENABLE_CORNERSTONE, $enable_cornerstone_route ); - } - - /** - * Sets noindex on an indexable. - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response the configuration of the workouts. - */ - public function noindex( $request ) { - if ( $request['object_type'] === 'post' ) { - WPSEO_Meta::set_value( 'meta-robots-noindex', 1, $request['object_id'] ); - } - elseif ( $request['object_type'] === 'term' ) { - WPSEO_Taxonomy_Meta::set_value( $request['object_id'], $request['object_sub_type'], 'noindex', 'noindex' ); - // Rebuild the indexable as WPSEO_Taxonomy_Meta does not trigger any actions on which term indexables are rebuild. - $indexable = $this->indexable_term_builder->build( $request['object_id'], $this->indexable_repository->find_by_id_and_type( $request['object_id'], $request['object_type'] ) ); - if ( \is_a( $indexable, Indexable::class ) ) { - $indexable->save(); - } - else { - return new WP_REST_Response( - [ 'json' => false ] - ); - } - } - - return new WP_REST_Response( - [ 'json' => true ] - ); - } - - /** - * Enables cornerstone on an indexable. - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response the configuration of the workouts. - */ - public function enable_cornerstone( $request ) { - if ( $request['object_type'] === 'post' ) { - WPSEO_Meta::set_value( 'is_cornerstone', 1, $request['object_id'] ); - } - elseif ( $request['object_type'] === 'term' ) { - $term = \get_term( $request['object_id'] ); - WPSEO_Taxonomy_Meta::set_value( $request['object_id'], $term->taxonomy, 'is_cornerstone', '1' ); - // Rebuild the indexable as WPSEO_Taxonomy_Meta does not trigger any actions on which term indexables are rebuild. - $indexable = $this->indexable_term_builder->build( $request['object_id'], $this->indexable_repository->find_by_id_and_type( $request['object_id'], $request['object_type'] ) ); - if ( \is_a( $indexable, Indexable::class ) ) { - $indexable->save(); - } - else { - return new WP_REST_Response( - [ 'json' => false ] - ); - } - } - - return new WP_REST_Response( - [ 'json' => true ] - ); - } - - /** - * Removes an indexable and redirects it. - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response the configuration of the workouts. - */ - public function remove_redirect( $request ) { - if ( $request['object_type'] === 'post' ) { - \add_filter( 'Yoast\WP\SEO\enable_notification_post_trash', '__return_false' ); - \wp_trash_post( $request['object_id'] ); - \remove_filter( 'Yoast\WP\SEO\enable_notification_post_trash', '__return_false' ); - } - elseif ( $request['object_type'] === 'term' ) { - \add_filter( 'Yoast\WP\SEO\enable_notification_term_delete', '__return_false' ); - \wp_delete_term( $request['object_id'], $request['object_sub_type'] ); - \remove_filter( 'Yoast\WP\SEO\enable_notification_term_delete', '__return_false' ); - } - else { - return new WP_REST_Response( - [ 'json' => false ] - ); - } - - $redirect = new WPSEO_Redirect( - $request['permalink'], - $request['redirect_url'], - '301', - 'plain' - ); - $redirect_manager = new WPSEO_Redirect_Manager( 'plain' ); - $redirect_manager->create_redirect( $redirect ); - return new WP_REST_Response( - [ 'json' => true ] - ); - } - - /** - * Sets noindex on an indexable. - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response the configuration of the workouts. - */ - public function get_link_suggestions( $request ) { - $suggestions = $this->link_suggestions_action->get_indexable_suggestions_for_indexable( - $request['indexableId'], - 5, - false - ); - - foreach ( $suggestions as $index => $suggestion ) { - $suggestions[ $index ]['edit_link'] = ( $suggestion['object_type'] === 'post' ) ? \get_edit_post_link( $suggestion['object_id'] ) : \get_edit_term_link( $suggestion['object_id'] ); - } - - return new WP_REST_Response( - [ 'json' => $suggestions ] - ); - } - - /** - * Gets the cornerstone indexables - * - * @return WP_REST_Response the configuration of the workouts. - */ - public function get_cornerstone_data() { - $cornerstones = $this->indexable_repository->query() - ->where_raw( '( post_status= \'publish\' OR post_status IS NULL ) AND is_cornerstone = 1' ) - ->where_in( 'object_type', [ 'term', 'post' ] ) - ->where_in( 'object_sub_type', $this->get_public_sub_types() ) - ->order_by_asc( 'breadcrumb_title' ) - ->find_many(); - - $cornerstones = \array_map( [ $this->indexable_repository, 'ensure_permalink' ], $cornerstones ); - $cornerstones = \array_map( [ $this, 'map_subtypes_to_singular_name' ], $cornerstones ); - - $most_linked = $this->indexable_repository->query() - ->where_gt( 'incoming_link_count', 0 ) - ->where_not_null( 'incoming_link_count' ) - ->where_raw( '( post_status = \'publish\' OR post_status IS NULL )' ) - ->where_in( 'object_sub_type', $this->get_public_sub_types() ) - ->where_in( 'object_type', [ 'term', 'post' ] ) - ->where_raw( '( is_robots_noindex = 0 OR is_robots_noindex IS NULL )' ) - ->order_by_desc( 'incoming_link_count' ) - ->limit( 20 ) - ->find_many(); - $most_linked = \array_map( [ $this->indexable_repository, 'ensure_permalink' ], $most_linked ); - $most_linked = \array_map( [ $this, 'map_subtypes_to_singular_name' ], $most_linked ); - - return new WP_REST_Response( - [ - 'json' => [ - 'cornerstones' => $cornerstones, - 'mostLinked' => $most_linked, - ], - ] - ); - } - - /** - * Gets the last updated for a particular post Id. - * - * @param WP_REST_Request $request The request object. - * - * @return WP_REST_Response the configuration of the workouts. - */ - public function get_last_updated( $request ) { - $post = \get_post( $request['postId'] ); - - return new WP_REST_Response( - [ 'json' => $post->post_modified ] - ); - } - - /** - * Maps an array of indexables and replaces the object_sub_type with the singular name of that type. - * - * @param Indexable $indexable An Indexable. - * - * @return Indexable The new Indexable with the edited object_sub_type. - */ - public function map_subtypes_to_singular_name( Indexable $indexable ) { - if ( $indexable->object_type === 'post' ) { - $post_type_labels = \get_post_type_labels( \get_post_type_object( \get_post_type( $indexable->object_id ) ) ); - $indexable->object_sub_type = $post_type_labels->singular_name; - } - else { - $taxonomy_labels = \get_taxonomy_labels( \get_taxonomy( $indexable->object_sub_type ) ); - $indexable->object_sub_type = $taxonomy_labels->singular_name; - } - return $indexable; - } - - /** - * Get public sub types. - * - * @return array The subtypes. - */ - protected function get_public_sub_types() { - $object_sub_types = \array_values( - \array_merge( - $this->post_type_helper->get_public_post_types(), - \get_taxonomies( [ 'public' => true ] ) - ) - ); - - $excluded_post_types = \apply_filters( 'wpseo_indexable_excluded_post_types', [ 'attachment' ] ); - $object_sub_types = \array_diff( $object_sub_types, $excluded_post_types ); - return $object_sub_types; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/surfaces/helpers-surface.php b/wp/wp-content/plugins/wordpress-seo-premium/src/surfaces/helpers-surface.php deleted file mode 100644 index 3a61ab58..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/surfaces/helpers-surface.php +++ /dev/null @@ -1,96 +0,0 @@ -container = $container; - } - - /** - * Magic getter for getting helper classes. - * - * @param string $helper The helper to get. - * - * @return mixed The helper class. - */ - public function __get( $helper ) { - return $this->container->get( $this->get_helper_class( $helper ) ); - } - - /** - * Magic isset for ensuring helper exists. - * - * @param string $helper The helper to get. - * - * @return bool Whether the helper exists. - */ - public function __isset( $helper ) { - return $this->container->has( $this->get_helper_class( $helper ) ); - } - - /** - * Prevents setting dynamic properties. - * - * @param string $name The property name. - * @param mixed $value The property value. - * - * @return void - * - * @throws Forbidden_Property_Mutation_Exception Set is never meant to be called. - */ - public function __set( $name, $value ) { - throw Forbidden_Property_Mutation_Exception::cannot_set_because_property_is_immutable( $name ); - } - - /** - * Prevents unsetting dynamic properties. - * - * @param string $name The property name. - * - * @return void - * - * @throws Forbidden_Property_Mutation_Exception Unset is never meant to be called. - */ - public function __unset( $name ) { - throw Forbidden_Property_Mutation_Exception::cannot_unset_because_property_is_immutable( $name ); - } - - /** - * Gets the classname for a premium helper. - * - * @param string $helper The name of the helper. - * - * @return string The classname of the helper - */ - protected function get_helper_class( $helper ) { - $helper = \implode( '_', \array_map( 'ucfirst', \explode( '_', $helper ) ) ); - - return "Yoast\WP\SEO\Premium\Helpers\\{$helper}_Helper"; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/src/wordpress/wrapper.php b/wp/wp-content/plugins/wordpress-seo-premium/src/wordpress/wrapper.php deleted file mode 100644 index 373dfae9..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/src/wordpress/wrapper.php +++ /dev/null @@ -1,76 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see https://www.php-fig.org/psr/psr-0/ - * @see https://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - /** @var ?string */ - private $vendorDir; - - // PSR-4 - /** - * @var array[] - * @psalm-var array> - */ - private $prefixLengthsPsr4 = array(); - /** - * @var array[] - * @psalm-var array> - */ - private $prefixDirsPsr4 = array(); - /** - * @var array[] - * @psalm-var array - */ - private $fallbackDirsPsr4 = array(); - - // PSR-0 - /** - * @var array[] - * @psalm-var array> - */ - private $prefixesPsr0 = array(); - /** - * @var array[] - * @psalm-var array - */ - private $fallbackDirsPsr0 = array(); - - /** @var bool */ - private $useIncludePath = false; - - /** - * @var string[] - * @psalm-var array - */ - private $classMap = array(); - - /** @var bool */ - private $classMapAuthoritative = false; - - /** - * @var bool[] - * @psalm-var array - */ - private $missingClasses = array(); - - /** @var ?string */ - private $apcuPrefix; - - /** - * @var self[] - */ - private static $registeredLoaders = array(); - - /** - * @param ?string $vendorDir - */ - public function __construct($vendorDir = null) - { - $this->vendorDir = $vendorDir; - } - - /** - * @return string[] - */ - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); - } - - return array(); - } - - /** - * @return array[] - * @psalm-return array> - */ - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - /** - * @return array[] - * @psalm-return array - */ - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - /** - * @return array[] - * @psalm-return array - */ - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - /** - * @return string[] Array of classname => path - * @psalm-return array - */ - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param string[] $classMap Class to filename map - * @psalm-param array $classMap - * - * @return void - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - * - * @return void - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - * - * @return void - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 base directories - * - * @return void - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - * - * @return void - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - * - * @return void - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - * - * @return void - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - * - * @return void - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - * - * @return void - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - - if (null === $this->vendorDir) { - return; - } - - if ($prepend) { - self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; - } else { - unset(self::$registeredLoaders[$this->vendorDir]); - self::$registeredLoaders[$this->vendorDir] = $this; - } - } - - /** - * Unregisters this instance as an autoloader. - * - * @return void - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - - if (null !== $this->vendorDir) { - unset(self::$registeredLoaders[$this->vendorDir]); - } - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return true|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - - return null; - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - /** - * Returns the currently registered loaders indexed by their corresponding vendor directories. - * - * @return self[] - */ - public static function getRegisteredLoaders() - { - return self::$registeredLoaders; - } - - /** - * @param string $class - * @param string $ext - * @return string|false - */ - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - * - * @param string $file - * @return void - * @private - */ -function includeFile($file) -{ - include $file; -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/InstalledVersions.php b/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/InstalledVersions.php deleted file mode 100644 index 01581949..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/InstalledVersions.php +++ /dev/null @@ -1,357 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer; - -use Composer\Autoload\ClassLoader; -use Composer\Semver\VersionParser; - -/** - * This class is copied in every Composer installed project and available to all - * - * See also https://getcomposer.org/doc/07-runtime.md#installed-versions - * - * To require its presence, you can require `composer-runtime-api ^2.0` - */ -class InstalledVersions -{ - /** - * @var mixed[]|null - * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array}|array{}|null - */ - private static $installed; - - /** - * @var bool|null - */ - private static $canGetVendors; - - /** - * @var array[] - * @psalm-var array}> - */ - private static $installedByVendor = array(); - - /** - * Returns a list of all package names which are present, either by being installed, replaced or provided - * - * @return string[] - * @psalm-return list - */ - public static function getInstalledPackages() - { - $packages = array(); - foreach (self::getInstalled() as $installed) { - $packages[] = array_keys($installed['versions']); - } - - if (1 === \count($packages)) { - return $packages[0]; - } - - return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); - } - - /** - * Returns a list of all package names with a specific type e.g. 'library' - * - * @param string $type - * @return string[] - * @psalm-return list - */ - public static function getInstalledPackagesByType($type) - { - $packagesByType = array(); - - foreach (self::getInstalled() as $installed) { - foreach ($installed['versions'] as $name => $package) { - if (isset($package['type']) && $package['type'] === $type) { - $packagesByType[] = $name; - } - } - } - - return $packagesByType; - } - - /** - * Checks whether the given package is installed - * - * This also returns true if the package name is provided or replaced by another package - * - * @param string $packageName - * @param bool $includeDevRequirements - * @return bool - */ - public static function isInstalled($packageName, $includeDevRequirements = true) - { - foreach (self::getInstalled() as $installed) { - if (isset($installed['versions'][$packageName])) { - return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); - } - } - - return false; - } - - /** - * Checks whether the given package satisfies a version constraint - * - * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: - * - * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') - * - * @param VersionParser $parser Install composer/semver to have access to this class and functionality - * @param string $packageName - * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package - * @return bool - */ - public static function satisfies(VersionParser $parser, $packageName, $constraint) - { - $constraint = $parser->parseConstraints($constraint); - $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); - - return $provided->matches($constraint); - } - - /** - * Returns a version constraint representing all the range(s) which are installed for a given package - * - * It is easier to use this via isInstalled() with the $constraint argument if you need to check - * whether a given version of a package is installed, and not just whether it exists - * - * @param string $packageName - * @return string Version constraint usable with composer/semver - */ - public static function getVersionRanges($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - $ranges = array(); - if (isset($installed['versions'][$packageName]['pretty_version'])) { - $ranges[] = $installed['versions'][$packageName]['pretty_version']; - } - if (array_key_exists('aliases', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); - } - if (array_key_exists('replaced', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); - } - if (array_key_exists('provided', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); - } - - return implode(' || ', $ranges); - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present - */ - public static function getVersion($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['version'])) { - return null; - } - - return $installed['versions'][$packageName]['version']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present - */ - public static function getPrettyVersion($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['pretty_version'])) { - return null; - } - - return $installed['versions'][$packageName]['pretty_version']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference - */ - public static function getReference($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['reference'])) { - return null; - } - - return $installed['versions'][$packageName]['reference']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. - */ - public static function getInstallPath($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @return array - * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string} - */ - public static function getRootPackage() - { - $installed = self::getInstalled(); - - return $installed[0]['root']; - } - - /** - * Returns the raw installed.php data for custom implementations - * - * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. - * @return array[] - * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} - */ - public static function getRawData() - { - @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); - - if (null === self::$installed) { - // only require the installed.php file if this file is loaded from its dumped location, - // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 - if (substr(__DIR__, -8, 1) !== 'C') { - self::$installed = include __DIR__ . '/installed.php'; - } else { - self::$installed = array(); - } - } - - return self::$installed; - } - - /** - * Returns the raw data of all installed.php which are currently loaded for custom implementations - * - * @return array[] - * @psalm-return list}> - */ - public static function getAllRawData() - { - return self::getInstalled(); - } - - /** - * Lets you reload the static array from another file - * - * This is only useful for complex integrations in which a project needs to use - * this class but then also needs to execute another project's autoloader in process, - * and wants to ensure both projects have access to their version of installed.php. - * - * A typical case would be PHPUnit, where it would need to make sure it reads all - * the data it needs from this class, then call reload() with - * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure - * the project in which it runs can then also use this class safely, without - * interference between PHPUnit's dependencies and the project's dependencies. - * - * @param array[] $data A vendor/composer/installed.php data set - * @return void - * - * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} $data - */ - public static function reload($data) - { - self::$installed = $data; - self::$installedByVendor = array(); - } - - /** - * @return array[] - * @psalm-return list}> - */ - private static function getInstalled() - { - if (null === self::$canGetVendors) { - self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); - } - - $installed = array(); - - if (self::$canGetVendors) { - foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { - if (isset(self::$installedByVendor[$vendorDir])) { - $installed[] = self::$installedByVendor[$vendorDir]; - } elseif (is_file($vendorDir.'/composer/installed.php')) { - /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ - $required = require $vendorDir.'/composer/installed.php'; - $installed[] = self::$installedByVendor[$vendorDir] = $required; - if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { - self::$installed = $installed[count($installed) - 1]; - } - } - } - } - - if (null === self::$installed) { - // only require the installed.php file if this file is loaded from its dumped location, - // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 - if (substr(__DIR__, -8, 1) !== 'C') { - /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ - $required = require __DIR__ . '/installed.php'; - self::$installed = $required; - } else { - self::$installed = array(); - } - } - - if (self::$installed !== array()) { - $installed[] = self::$installed; - } - - return $installed; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/LICENSE b/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/LICENSE deleted file mode 100644 index f27399a0..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) Nils Adermann, Jordi Boggiano - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - diff --git a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/autoload_classmap.php b/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/autoload_classmap.php deleted file mode 100644 index 9784e9d5..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,237 +0,0 @@ - $vendorDir . '/composer/InstalledVersions.php', - 'WPSEO_CLI_Premium_Requirement' => $baseDir . '/cli/cli-premium-requirement.php', - 'WPSEO_CLI_Redirect_Base_Command' => $baseDir . '/cli/cli-redirect-base-command.php', - 'WPSEO_CLI_Redirect_Command_Namespace' => $baseDir . '/cli/cli-redirect-command-namespace.php', - 'WPSEO_CLI_Redirect_Create_Command' => $baseDir . '/cli/cli-redirect-create-command.php', - 'WPSEO_CLI_Redirect_Delete_Command' => $baseDir . '/cli/cli-redirect-delete-command.php', - 'WPSEO_CLI_Redirect_Follow_Command' => $baseDir . '/cli/cli-redirect-follow-command.php', - 'WPSEO_CLI_Redirect_Has_Command' => $baseDir . '/cli/cli-redirect-has-command.php', - 'WPSEO_CLI_Redirect_List_Command' => $baseDir . '/cli/cli-redirect-list-command.php', - 'WPSEO_CLI_Redirect_Update_Command' => $baseDir . '/cli/cli-redirect-update-command.php', - 'WPSEO_Custom_Fields_Plugin' => $baseDir . '/classes/custom-fields-plugin.php', - 'WPSEO_Executable_Redirect' => $baseDir . '/classes/redirect/executable-redirect.php', - 'WPSEO_Export_Keywords_CSV' => $baseDir . '/classes/export/export-keywords-csv.php', - 'WPSEO_Export_Keywords_Post_Presenter' => $baseDir . '/classes/export/export-keywords-post-presenter.php', - 'WPSEO_Export_Keywords_Post_Query' => $baseDir . '/classes/export/export-keywords-post-query.php', - 'WPSEO_Export_Keywords_Presenter' => $baseDir . '/classes/export/export-keywords-presenter-interface.php', - 'WPSEO_Export_Keywords_Query' => $baseDir . '/classes/export/export-keywords-query-interface.php', - 'WPSEO_Export_Keywords_Term_Presenter' => $baseDir . '/classes/export/export-keywords-term-presenter.php', - 'WPSEO_Export_Keywords_Term_Query' => $baseDir . '/classes/export/export-keywords-term-query.php', - 'WPSEO_Facebook_Profile' => $baseDir . '/src/deprecated/classes/facebook-profile.php', - 'WPSEO_Metabox_Link_Suggestions' => $baseDir . '/classes/metabox-link-suggestions.php', - 'WPSEO_Multi_Keyword' => $baseDir . '/classes/multi-keyword.php', - 'WPSEO_Post_Watcher' => $baseDir . '/classes/post-watcher.php', - 'WPSEO_Premium' => $baseDir . '/premium.php', - 'WPSEO_Premium_Asset_JS_L10n' => $baseDir . '/classes/premium-asset-js-l10n.php', - 'WPSEO_Premium_Assets' => $baseDir . '/classes/premium-assets.php', - 'WPSEO_Premium_Expose_Shortlinks' => $baseDir . '/classes/premium-expose-shortlinks.php', - 'WPSEO_Premium_Import_Manager' => $baseDir . '/classes/premium-import-manager.php', - 'WPSEO_Premium_Javascript_Strings' => $baseDir . '/classes/premium-javascript-strings.php', - 'WPSEO_Premium_Keyword_Export_Manager' => $baseDir . '/classes/premium-keyword-export-manager.php', - 'WPSEO_Premium_Metabox' => $baseDir . '/classes/premium-metabox.php', - 'WPSEO_Premium_Option' => $baseDir . '/classes/premium-option.php', - 'WPSEO_Premium_Orphaned_Content_Support' => $baseDir . '/classes/premium-orphaned-content-support.php', - 'WPSEO_Premium_Orphaned_Content_Utils' => $baseDir . '/classes/premium-orphaned-content-utils.php', - 'WPSEO_Premium_Orphaned_Post_Filter' => $baseDir . '/classes/premium-orphaned-post-filter.php', - 'WPSEO_Premium_Orphaned_Post_Query' => $baseDir . '/classes/premium-orphaned-post-query.php', - 'WPSEO_Premium_Prominent_Words_Support' => $baseDir . '/classes/premium-prominent-words-support.php', - 'WPSEO_Premium_Prominent_Words_Unindexed_Post_Query' => $baseDir . '/classes/premium-prominent-words-unindexed-post-query.php', - 'WPSEO_Premium_Prominent_Words_Versioning' => $baseDir . '/classes/premium-prominent-words-versioning.php', - 'WPSEO_Premium_Redirect_EndPoint' => $baseDir . '/classes/premium-redirect-endpoint.php', - 'WPSEO_Premium_Redirect_Export_Manager' => $baseDir . '/classes/premium-redirect-export-manager.php', - 'WPSEO_Premium_Redirect_Option' => $baseDir . '/classes/premium-redirect-option.php', - 'WPSEO_Premium_Redirect_Service' => $baseDir . '/classes/premium-redirect-service.php', - 'WPSEO_Premium_Redirect_Undo_EndPoint' => $baseDir . '/classes/redirect-undo-endpoint.php', - 'WPSEO_Premium_Register_Capabilities' => $baseDir . '/classes/premium-register-capabilities.php', - 'WPSEO_Premium_Stale_Cornerstone_Content_Filter' => $baseDir . '/classes/premium-stale-cornerstone-content-filter.php', - 'WPSEO_Product_Premium' => $baseDir . '/classes/product-premium.php', - 'WPSEO_Redirect' => $baseDir . '/classes/redirect/redirect.php', - 'WPSEO_Redirect_Abstract_Loader' => $baseDir . '/classes/redirect/loaders/redirect-abstract-loader.php', - 'WPSEO_Redirect_Abstract_Validation' => $baseDir . '/classes/redirect/validation/redirect-abstract-validation.php', - 'WPSEO_Redirect_Accessible_Validation' => $baseDir . '/classes/redirect/validation/redirect-accessible-validation.php', - 'WPSEO_Redirect_Ajax' => $baseDir . '/classes/redirect/redirect-ajax.php', - 'WPSEO_Redirect_Apache_Exporter' => $baseDir . '/classes/redirect/exporters/redirect-apache-exporter.php', - 'WPSEO_Redirect_CSV_Exporter' => $baseDir . '/classes/redirect/exporters/redirect-csv-exporter.php', - 'WPSEO_Redirect_CSV_Loader' => $baseDir . '/classes/redirect/loaders/redirect-csv-loader.php', - 'WPSEO_Redirect_Endpoint_Validation' => $baseDir . '/classes/redirect/validation/redirect-endpoint-validation.php', - 'WPSEO_Redirect_Exporter' => $baseDir . '/classes/redirect/exporters/redirect-exporter-interface.php', - 'WPSEO_Redirect_File_Exporter' => $baseDir . '/classes/redirect/exporters/redirect-file-exporter.php', - 'WPSEO_Redirect_File_Util' => $baseDir . '/classes/redirect/redirect-file-util.php', - 'WPSEO_Redirect_Form_Presenter' => $baseDir . '/classes/redirect/presenters/redirect-form-presenter.php', - 'WPSEO_Redirect_Formats' => $baseDir . '/classes/redirect/redirect-formats.php', - 'WPSEO_Redirect_Formatter' => $baseDir . '/classes/redirect/redirect-formatter.php', - 'WPSEO_Redirect_HTAccess_Loader' => $baseDir . '/classes/redirect/loaders/redirect-htaccess-loader.php', - 'WPSEO_Redirect_Htaccess_Exporter' => $baseDir . '/classes/redirect/exporters/redirect-htaccess-exporter.php', - 'WPSEO_Redirect_Htaccess_Util' => $baseDir . '/classes/redirect/redirect-htaccess-util.php', - 'WPSEO_Redirect_Import_Exception' => $baseDir . '/classes/redirect/redirect-import-exception.php', - 'WPSEO_Redirect_Importer' => $baseDir . '/classes/redirect/redirect-importer.php', - 'WPSEO_Redirect_Loader' => $baseDir . '/classes/redirect/loaders/redirect-loader-interface.php', - 'WPSEO_Redirect_Manager' => $baseDir . '/classes/redirect/redirect-manager.php', - 'WPSEO_Redirect_Nginx_Exporter' => $baseDir . '/classes/redirect/exporters/redirect-nginx-exporter.php', - 'WPSEO_Redirect_Option' => $baseDir . '/classes/redirect/redirect-option.php', - 'WPSEO_Redirect_Option_Exporter' => $baseDir . '/classes/redirect/exporters/redirect-option-exporter.php', - 'WPSEO_Redirect_Page' => $baseDir . '/classes/redirect/redirect-page.php', - 'WPSEO_Redirect_Page_Presenter' => $baseDir . '/classes/redirect/presenters/redirect-page-presenter.php', - 'WPSEO_Redirect_Presence_Validation' => $baseDir . '/classes/redirect/validation/redirect-presence-validation.php', - 'WPSEO_Redirect_Presenter' => $baseDir . '/classes/redirect/presenters/redirect-presenter-interface.php', - 'WPSEO_Redirect_Quick_Edit_Presenter' => $baseDir . '/classes/redirect/presenters/redirect-quick-edit-presenter.php', - 'WPSEO_Redirect_Redirection_Loader' => $baseDir . '/classes/redirect/loaders/redirect-redirection-loader.php', - 'WPSEO_Redirect_Relative_Origin_Validation' => $baseDir . '/classes/redirect/validation/redirect-relative-origin-validation.php', - 'WPSEO_Redirect_Safe_Redirect_Loader' => $baseDir . '/classes/redirect/loaders/redirect-safe-redirect-loader.php', - 'WPSEO_Redirect_Self_Redirect_Validation' => $baseDir . '/classes/redirect/validation/redirect-self-redirect-validation.php', - 'WPSEO_Redirect_Settings_Presenter' => $baseDir . '/classes/redirect/presenters/redirect-settings-presenter.php', - 'WPSEO_Redirect_Simple_301_Redirect_Loader' => $baseDir . '/classes/redirect/loaders/redirect-simple-301-redirect-loader.php', - 'WPSEO_Redirect_Sitemap_Filter' => $baseDir . '/classes/redirect/redirect-sitemap-filter.php', - 'WPSEO_Redirect_Subdirectory_Validation' => $baseDir . '/classes/redirect/validation/redirect-subdirectory-validation.php', - 'WPSEO_Redirect_Tab_Presenter' => $baseDir . '/classes/redirect/presenters/redirect-tab-presenter.php', - 'WPSEO_Redirect_Table' => $baseDir . '/classes/redirect/redirect-table.php', - 'WPSEO_Redirect_Table_Presenter' => $baseDir . '/classes/redirect/presenters/redirect-table-presenter.php', - 'WPSEO_Redirect_Types' => $baseDir . '/classes/redirect/redirect-types.php', - 'WPSEO_Redirect_Uniqueness_Validation' => $baseDir . '/classes/redirect/validation/redirect-uniqueness-validation.php', - 'WPSEO_Redirect_Upgrade' => $baseDir . '/classes/redirect/redirect-upgrade.php', - 'WPSEO_Redirect_Url_Formatter' => $baseDir . '/classes/redirect/redirect-url-formatter.php', - 'WPSEO_Redirect_Util' => $baseDir . '/classes/redirect/redirect-util.php', - 'WPSEO_Redirect_Validation' => $baseDir . '/classes/redirect/validation/redirect-validation-interface.php', - 'WPSEO_Redirect_Validator' => $baseDir . '/classes/redirect/redirect-validator.php', - 'WPSEO_Social_Previews' => $baseDir . '/classes/social-previews.php', - 'WPSEO_Term_Watcher' => $baseDir . '/classes/term-watcher.php', - 'WPSEO_Upgrade_Manager' => $baseDir . '/classes/upgrade-manager.php', - 'WPSEO_Validation_Error' => $baseDir . '/classes/validation-error.php', - 'WPSEO_Validation_Result' => $baseDir . '/classes/validation-result.php', - 'WPSEO_Validation_Warning' => $baseDir . '/classes/validation-warning.php', - 'WPSEO_Watcher' => $baseDir . '/classes/watcher.php', - 'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastPremiumImprovedInternalLinking' => $baseDir . '/src/config/migrations/20190715101200_WpYoastPremiumImprovedInternalLinking.php', - 'Yoast\\WP\\SEO\\Integrations\\Blocks\\Block_Patterns' => $baseDir . '/src/deprecated/integrations/blocks/block-patterns.php', - 'Yoast\\WP\\SEO\\Integrations\\Blocks\\Job_Posting_Block' => $baseDir . '/src/deprecated/integrations/blocks/job-posting-block.php', - 'Yoast\\WP\\SEO\\Integrations\\Blocks\\Siblings_Block' => $baseDir . '/classes/blocks/siblings-block.php', - 'Yoast\\WP\\SEO\\Integrations\\Blocks\\Subpages_Block' => $baseDir . '/classes/blocks/subpages-block.php', - 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\TranslationsPress' => $baseDir . '/src/integrations/third-party/translationspress.php', - 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher_Keyphrases' => $baseDir . '/src/integrations/third-party/wincher-keyphrases.php', - 'Yoast\\WP\\SEO\\Models\\Prominent_Words' => $baseDir . '/src/models/prominent-words.php', - 'Yoast\\WP\\SEO\\Premium\\Actions\\AI_Generator_Action' => $baseDir . '/src/actions/ai-generator-action.php', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Link_Suggestions_Action' => $baseDir . '/src/actions/link-suggestions-action.php', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Complete_Action' => $baseDir . '/src/actions/prominent-words/complete-action.php', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Content_Action' => $baseDir . '/src/actions/prominent-words/content-action.php', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Save_Action' => $baseDir . '/src/actions/prominent-words/save-action.php', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Zapier_Action' => $baseDir . '/src/deprecated/actions/zapier-action.php', - 'Yoast\\WP\\SEO\\Premium\\Addon_Installer' => $baseDir . '/src/addon-installer.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Ai_Editor_Conditional' => $baseDir . '/src/conditionals/ai-editor-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Algolia_Enabled_Conditional' => $baseDir . '/src/conditionals/algolia-enabled-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Cornerstone_Enabled_Conditional' => $baseDir . '/src/conditionals/cornerstone-enabled-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\EDD_Conditional' => $baseDir . '/src/conditionals/edd-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Inclusive_Language_Enabled_Conditional' => $baseDir . '/src/conditionals/inclusive-language-enabled-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Term_Overview_Or_Ajax_Conditional' => $baseDir . '/src/conditionals/term-overview-or-ajax-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Yoast_Admin_Or_Introductions_Route_Conditional' => $baseDir . '/src/conditionals/yoast-admin-or-introductions-route-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Zapier_Enabled_Conditional' => $baseDir . '/src/deprecated/conditionals/zapier-enabled-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Config\\Badge_Group_Names' => $baseDir . '/src/config/badge-group-names.php', - 'Yoast\\WP\\SEO\\Premium\\Config\\Migrations\\AddIndexOnIndexableIdAndStem' => $baseDir . '/src/config/migrations/20210827093024_AddIndexOnIndexableIdAndStem.php', - 'Yoast\\WP\\SEO\\Premium\\Database\\Migration_Runner_Premium' => $baseDir . '/src/database/migration-runner-premium.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Forbidden_Property_Mutation_Exception' => $baseDir . '/src/exceptions/forbidden-property-mutation-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Bad_Request_Exception' => $baseDir . '/src/exceptions/remote-request/bad-request-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Forbidden_Exception' => $baseDir . '/src/exceptions/remote-request/forbidden-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Internal_Server_Error_Exception' => $baseDir . '/src/exceptions/remote-request/internal-server-error-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Not_Found_Exception' => $baseDir . '/src/exceptions/remote-request/not-found-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Payment_Required_Exception' => $baseDir . '/src/exceptions/remote-request/payment-required-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Remote_Request_Exception' => $baseDir . '/src/exceptions/remote-request/remote-request-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Request_Timeout_Exception' => $baseDir . '/src/exceptions/remote-request/request-timeout-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Service_Unavailable_Exception' => $baseDir . '/src/exceptions/remote-request/service-unavailable-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Too_Many_Requests_Exception' => $baseDir . '/src/exceptions/remote-request/too-many-requests-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Unauthorized_Exception' => $baseDir . '/src/exceptions/remote-request/unauthorized-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Generated\\Cached_Container' => $baseDir . '/src/generated/container.php', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\AI_Generator_Helper' => $baseDir . '/src/helpers/ai-generator-helper.php', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper' => $baseDir . '/src/helpers/current-page-helper.php', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper' => $baseDir . '/src/helpers/prominent-words-helper.php', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\Version_Helper' => $baseDir . '/src/helpers/version-helper.php', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\Zapier_Helper' => $baseDir . '/src/deprecated/helpers/zapier-helper.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Crawl_Cleanup_Permalinks' => $baseDir . '/src/deprecated/initializers/crawl-cleanup-permalinks.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Index_Now_Key' => $baseDir . '/src/initializers/index-now-key.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Introductions_Initializer' => $baseDir . '/src/initializers/introductions-initializer.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Plugin' => $baseDir . '/src/initializers/plugin.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Redirect_Handler' => $baseDir . '/src/initializers/redirect-handler.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Woocommerce' => $baseDir . '/src/initializers/woocommerce.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Wp_Cli_Initializer' => $baseDir . '/src/initializers/wp-cli-initializer.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Abstract_OpenGraph_Integration' => $baseDir . '/src/integrations/abstract-opengraph-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Ai_Consent_Integration' => $baseDir . '/src/integrations/admin/ai-consent-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Ai_Generator_Integration' => $baseDir . '/src/integrations/admin/ai-generator-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Cornerstone_Column_Integration' => $baseDir . '/src/integrations/admin/cornerstone-column-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Cornerstone_Taxonomy_Column_Integration' => $baseDir . '/src/integrations/admin/cornerstone-taxonomy-column-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Crawl_Settings_Integration' => $baseDir . '/src/deprecated/integrations/admin/crawl-settings-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Column_Integration' => $baseDir . '/src/integrations/admin/inclusive-language-column-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Filter_Integration' => $baseDir . '/src/integrations/admin/inclusive-language-filter-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Taxonomy_Column_Integration' => $baseDir . '/src/integrations/admin/inclusive-language-taxonomy-column-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Integrations_Page' => $baseDir . '/src/deprecated/integrations/admin/integrations-page.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Keyword_Integration' => $baseDir . '/src/integrations/admin/keyword-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Metabox_Formatter_Integration' => $baseDir . '/src/integrations/admin/metabox-formatter-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Plugin_Links_Integration' => $baseDir . '/src/integrations/admin/plugin-links-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Prominent_Words\\Indexing_Integration' => $baseDir . '/src/integrations/admin/prominent-words/indexing-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Prominent_Words\\Metabox_Integration' => $baseDir . '/src/integrations/admin/prominent-words/metabox-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Related_Keyphrase_Filter_Integration' => $baseDir . '/src/integrations/admin/related-keyphrase-filter-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Replacement_Variables_Integration' => $baseDir . '/src/integrations/admin/replacement-variables-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Settings_Integration' => $baseDir . '/src/integrations/admin/settings-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Thank_You_Page_Integration' => $baseDir . '/src/integrations/admin/thank-you-page-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Update_Premium_Notification' => $baseDir . '/src/integrations/admin/update-premium-notification.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\User_Profile_Integration' => $baseDir . '/src/integrations/admin/user-profile-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Workouts_Integration' => $baseDir . '/src/integrations/admin/workouts-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Zapier_Notification_Integration' => $baseDir . '/src/deprecated/integrations/admin/zapier-notification-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Alerts\\Ai_Generator_Tip_Notification' => $baseDir . '/src/integrations/alerts/ai-generator-tip-notification.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Estimated_Reading_Time_Block' => $baseDir . '/src/integrations/blocks/estimated-reading-time-block.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Related_Links_Block' => $baseDir . '/src/integrations/blocks/related-links-block.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Schema_Blocks' => $baseDir . '/src/deprecated/integrations/blocks/schema-blocks.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Cleanup_Integration' => $baseDir . '/src/integrations/cleanup-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Front_End\\Crawl_Cleanup_Basic' => $baseDir . '/src/deprecated/integrations/front-end/crawl-cleanup-basic.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Front_End\\Crawl_Cleanup_Rss' => $baseDir . '/src/deprecated/integrations/front-end/crawl-cleanup-rss.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Front_End\\Crawl_Cleanup_Searches' => $baseDir . '/src/deprecated/integrations/front-end/crawl-cleanup-searches.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Front_End\\Robots_Txt_Integration' => $baseDir . '/src/integrations/front-end/robots-txt-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Frontend_Inspector' => $baseDir . '/src/integrations/frontend-inspector.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Index_Now_Ping' => $baseDir . '/src/integrations/index-now-ping.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Missing_Indexables_Count_Integration' => $baseDir . '/src/integrations/missing-indexables-count-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Author_Archive' => $baseDir . '/src/integrations/opengraph-author-archive.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Date_Archive' => $baseDir . '/src/integrations/opengraph-date-archive.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_PostType_Archive' => $baseDir . '/src/integrations/opengraph-posttype-archive.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Post_Type' => $baseDir . '/src/integrations/opengraph-post-type.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Term_Archive' => $baseDir . '/src/integrations/opengraph-term-archive.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Organization_Schema_Integration' => $baseDir . '/src/integrations/organization-schema-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Publishing_Principles_Schema_Integration' => $baseDir . '/src/integrations/publishing-principles-schema-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Routes\\AI_Generator_Route' => $baseDir . '/src/integrations/routes/ai-generator-route.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Routes\\Workouts_Routes_Integration' => $baseDir . '/src/integrations/routes/workouts-routes-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Algolia' => $baseDir . '/src/integrations/third-party/algolia.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\EDD' => $baseDir . '/src/integrations/third-party/edd.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Elementor_Premium' => $baseDir . '/src/integrations/third-party/elementor-premium.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Elementor_Preview' => $baseDir . '/src/integrations/third-party/elementor-preview.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Mastodon' => $baseDir . '/src/integrations/third-party/mastodon.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Zapier' => $baseDir . '/src/deprecated/integrations/third-party/zapier.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Zapier_Classic_Editor' => $baseDir . '/src/deprecated/integrations/third-party/zapier-classic-editor.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Zapier_Trigger' => $baseDir . '/src/deprecated/integrations/third-party/zapier-trigger.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Upgrade_Integration' => $baseDir . '/src/integrations/upgrade-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\User_Profile_Integration' => $baseDir . '/src/integrations/user-profile-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Watchers\\Premium_Option_Wpseo_Watcher' => $baseDir . '/src/deprecated/integrations/watchers/premium-option-wpseo-watcher.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Watchers\\Prominent_Words_Watcher' => $baseDir . '/src/integrations/watchers/prominent-words-watcher.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Watchers\\Zapier_APIKey_Reset_Watcher' => $baseDir . '/src/deprecated/integrations/watchers/zapier-apikey-reset-watcher.php', - 'Yoast\\WP\\SEO\\Premium\\Introductions\\Application\\Ai_Generate_Titles_And_Descriptions_Introduction' => $baseDir . '/src/introductions/application/ai-generate-titles-and-descriptions-introduction.php', - 'Yoast\\WP\\SEO\\Premium\\Main' => $baseDir . '/src/main.php', - 'Yoast\\WP\\SEO\\Premium\\Presenters\\Icons\\Checkmark_Icon_Presenter' => $baseDir . '/src/presenters/icons/checkmark-icon-presenter.php', - 'Yoast\\WP\\SEO\\Premium\\Presenters\\Icons\\Cross_Icon_Presenter' => $baseDir . '/src/presenters/icons/cross-icon-presenter.php', - 'Yoast\\WP\\SEO\\Premium\\Presenters\\Icons\\Icon_Presenter' => $baseDir . '/src/presenters/icons/icon-presenter.php', - 'Yoast\\WP\\SEO\\Premium\\Presenters\\Mastodon_Link_Presenter' => $baseDir . '/src/presenters/mastodon-link-presenter.php', - 'Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository' => $baseDir . '/src/repositories/prominent-words-repository.php', - 'Yoast\\WP\\SEO\\Premium\\Routes\\Link_Suggestions_Route' => $baseDir . '/src/routes/link-suggestions-route.php', - 'Yoast\\WP\\SEO\\Premium\\Routes\\Prominent_Words_Route' => $baseDir . '/src/routes/prominent-words-route.php', - 'Yoast\\WP\\SEO\\Premium\\Routes\\Workouts_Route' => $baseDir . '/src/routes/workouts-route.php', - 'Yoast\\WP\\SEO\\Premium\\Routes\\Zapier_Route' => $baseDir . '/src/deprecated/routes/zapier-route.php', - 'Yoast\\WP\\SEO\\Premium\\Surfaces\\Helpers_Surface' => $baseDir . '/src/surfaces/helpers-surface.php', - 'Yoast\\WP\\SEO\\Premium\\WordPress\\Wrapper' => $baseDir . '/src/wordpress/wrapper.php', - 'Yoast\\WP\\SEO\\Schema_Templates\\Block_Patterns\\Block_Pattern' => $baseDir . '/src/deprecated/schema-templates/block-patterns/block-pattern.php', - 'Yoast\\WP\\SEO\\Schema_Templates\\Block_Patterns\\Block_Pattern_Categories' => $baseDir . '/src/deprecated/schema-templates/block-patterns/block-pattern-categories.php', - 'Yoast\\WP\\SEO\\Schema_Templates\\Block_Patterns\\Block_Pattern_Keywords' => $baseDir . '/src/deprecated/schema-templates/block-patterns/block-pattern-keywords.php', - 'Yoast\\WP\\SEO\\Schema_Templates\\Block_Patterns\\Job_Posting_Base_Pattern' => $baseDir . '/src/deprecated/schema-templates/block-patterns/job-posting-base-pattern.php', - 'Yoast\\WP\\SEO\\Schema_Templates\\Block_Patterns\\Job_Posting_One_Column' => $baseDir . '/src/deprecated/schema-templates/block-patterns/job-posting-one-column.php', - 'Yoast\\WP\\SEO\\Schema_Templates\\Block_Patterns\\Job_Posting_Two_Columns' => $baseDir . '/src/deprecated/schema-templates/block-patterns/job-posting-two-columns.php', -); diff --git a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/autoload_namespaces.php b/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/autoload_namespaces.php deleted file mode 100644 index b7fc0125..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,9 +0,0 @@ - array($vendorDir . '/composer/installers/src/Composer/Installers'), -); diff --git a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/autoload_real.php b/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/autoload_real.php deleted file mode 100644 index 415b1b05..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/autoload_real.php +++ /dev/null @@ -1,48 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInit528786059f0259c2041ce8c878a7e3c0::getInitializer($loader)); - } else { - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->setClassMapAuthoritative(true); - $loader->register(true); - - return $loader; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/autoload_static.php b/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/autoload_static.php deleted file mode 100644 index 67c84b38..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/autoload_static.php +++ /dev/null @@ -1,263 +0,0 @@ - - array ( - 'Composer\\Installers\\' => 20, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'Composer\\Installers\\' => - array ( - 0 => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers', - ), - ); - - public static $classMap = array ( - 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', - 'WPSEO_CLI_Premium_Requirement' => __DIR__ . '/../..' . '/cli/cli-premium-requirement.php', - 'WPSEO_CLI_Redirect_Base_Command' => __DIR__ . '/../..' . '/cli/cli-redirect-base-command.php', - 'WPSEO_CLI_Redirect_Command_Namespace' => __DIR__ . '/../..' . '/cli/cli-redirect-command-namespace.php', - 'WPSEO_CLI_Redirect_Create_Command' => __DIR__ . '/../..' . '/cli/cli-redirect-create-command.php', - 'WPSEO_CLI_Redirect_Delete_Command' => __DIR__ . '/../..' . '/cli/cli-redirect-delete-command.php', - 'WPSEO_CLI_Redirect_Follow_Command' => __DIR__ . '/../..' . '/cli/cli-redirect-follow-command.php', - 'WPSEO_CLI_Redirect_Has_Command' => __DIR__ . '/../..' . '/cli/cli-redirect-has-command.php', - 'WPSEO_CLI_Redirect_List_Command' => __DIR__ . '/../..' . '/cli/cli-redirect-list-command.php', - 'WPSEO_CLI_Redirect_Update_Command' => __DIR__ . '/../..' . '/cli/cli-redirect-update-command.php', - 'WPSEO_Custom_Fields_Plugin' => __DIR__ . '/../..' . '/classes/custom-fields-plugin.php', - 'WPSEO_Executable_Redirect' => __DIR__ . '/../..' . '/classes/redirect/executable-redirect.php', - 'WPSEO_Export_Keywords_CSV' => __DIR__ . '/../..' . '/classes/export/export-keywords-csv.php', - 'WPSEO_Export_Keywords_Post_Presenter' => __DIR__ . '/../..' . '/classes/export/export-keywords-post-presenter.php', - 'WPSEO_Export_Keywords_Post_Query' => __DIR__ . '/../..' . '/classes/export/export-keywords-post-query.php', - 'WPSEO_Export_Keywords_Presenter' => __DIR__ . '/../..' . '/classes/export/export-keywords-presenter-interface.php', - 'WPSEO_Export_Keywords_Query' => __DIR__ . '/../..' . '/classes/export/export-keywords-query-interface.php', - 'WPSEO_Export_Keywords_Term_Presenter' => __DIR__ . '/../..' . '/classes/export/export-keywords-term-presenter.php', - 'WPSEO_Export_Keywords_Term_Query' => __DIR__ . '/../..' . '/classes/export/export-keywords-term-query.php', - 'WPSEO_Facebook_Profile' => __DIR__ . '/../..' . '/src/deprecated/classes/facebook-profile.php', - 'WPSEO_Metabox_Link_Suggestions' => __DIR__ . '/../..' . '/classes/metabox-link-suggestions.php', - 'WPSEO_Multi_Keyword' => __DIR__ . '/../..' . '/classes/multi-keyword.php', - 'WPSEO_Post_Watcher' => __DIR__ . '/../..' . '/classes/post-watcher.php', - 'WPSEO_Premium' => __DIR__ . '/../..' . '/premium.php', - 'WPSEO_Premium_Asset_JS_L10n' => __DIR__ . '/../..' . '/classes/premium-asset-js-l10n.php', - 'WPSEO_Premium_Assets' => __DIR__ . '/../..' . '/classes/premium-assets.php', - 'WPSEO_Premium_Expose_Shortlinks' => __DIR__ . '/../..' . '/classes/premium-expose-shortlinks.php', - 'WPSEO_Premium_Import_Manager' => __DIR__ . '/../..' . '/classes/premium-import-manager.php', - 'WPSEO_Premium_Javascript_Strings' => __DIR__ . '/../..' . '/classes/premium-javascript-strings.php', - 'WPSEO_Premium_Keyword_Export_Manager' => __DIR__ . '/../..' . '/classes/premium-keyword-export-manager.php', - 'WPSEO_Premium_Metabox' => __DIR__ . '/../..' . '/classes/premium-metabox.php', - 'WPSEO_Premium_Option' => __DIR__ . '/../..' . '/classes/premium-option.php', - 'WPSEO_Premium_Orphaned_Content_Support' => __DIR__ . '/../..' . '/classes/premium-orphaned-content-support.php', - 'WPSEO_Premium_Orphaned_Content_Utils' => __DIR__ . '/../..' . '/classes/premium-orphaned-content-utils.php', - 'WPSEO_Premium_Orphaned_Post_Filter' => __DIR__ . '/../..' . '/classes/premium-orphaned-post-filter.php', - 'WPSEO_Premium_Orphaned_Post_Query' => __DIR__ . '/../..' . '/classes/premium-orphaned-post-query.php', - 'WPSEO_Premium_Prominent_Words_Support' => __DIR__ . '/../..' . '/classes/premium-prominent-words-support.php', - 'WPSEO_Premium_Prominent_Words_Unindexed_Post_Query' => __DIR__ . '/../..' . '/classes/premium-prominent-words-unindexed-post-query.php', - 'WPSEO_Premium_Prominent_Words_Versioning' => __DIR__ . '/../..' . '/classes/premium-prominent-words-versioning.php', - 'WPSEO_Premium_Redirect_EndPoint' => __DIR__ . '/../..' . '/classes/premium-redirect-endpoint.php', - 'WPSEO_Premium_Redirect_Export_Manager' => __DIR__ . '/../..' . '/classes/premium-redirect-export-manager.php', - 'WPSEO_Premium_Redirect_Option' => __DIR__ . '/../..' . '/classes/premium-redirect-option.php', - 'WPSEO_Premium_Redirect_Service' => __DIR__ . '/../..' . '/classes/premium-redirect-service.php', - 'WPSEO_Premium_Redirect_Undo_EndPoint' => __DIR__ . '/../..' . '/classes/redirect-undo-endpoint.php', - 'WPSEO_Premium_Register_Capabilities' => __DIR__ . '/../..' . '/classes/premium-register-capabilities.php', - 'WPSEO_Premium_Stale_Cornerstone_Content_Filter' => __DIR__ . '/../..' . '/classes/premium-stale-cornerstone-content-filter.php', - 'WPSEO_Product_Premium' => __DIR__ . '/../..' . '/classes/product-premium.php', - 'WPSEO_Redirect' => __DIR__ . '/../..' . '/classes/redirect/redirect.php', - 'WPSEO_Redirect_Abstract_Loader' => __DIR__ . '/../..' . '/classes/redirect/loaders/redirect-abstract-loader.php', - 'WPSEO_Redirect_Abstract_Validation' => __DIR__ . '/../..' . '/classes/redirect/validation/redirect-abstract-validation.php', - 'WPSEO_Redirect_Accessible_Validation' => __DIR__ . '/../..' . '/classes/redirect/validation/redirect-accessible-validation.php', - 'WPSEO_Redirect_Ajax' => __DIR__ . '/../..' . '/classes/redirect/redirect-ajax.php', - 'WPSEO_Redirect_Apache_Exporter' => __DIR__ . '/../..' . '/classes/redirect/exporters/redirect-apache-exporter.php', - 'WPSEO_Redirect_CSV_Exporter' => __DIR__ . '/../..' . '/classes/redirect/exporters/redirect-csv-exporter.php', - 'WPSEO_Redirect_CSV_Loader' => __DIR__ . '/../..' . '/classes/redirect/loaders/redirect-csv-loader.php', - 'WPSEO_Redirect_Endpoint_Validation' => __DIR__ . '/../..' . '/classes/redirect/validation/redirect-endpoint-validation.php', - 'WPSEO_Redirect_Exporter' => __DIR__ . '/../..' . '/classes/redirect/exporters/redirect-exporter-interface.php', - 'WPSEO_Redirect_File_Exporter' => __DIR__ . '/../..' . '/classes/redirect/exporters/redirect-file-exporter.php', - 'WPSEO_Redirect_File_Util' => __DIR__ . '/../..' . '/classes/redirect/redirect-file-util.php', - 'WPSEO_Redirect_Form_Presenter' => __DIR__ . '/../..' . '/classes/redirect/presenters/redirect-form-presenter.php', - 'WPSEO_Redirect_Formats' => __DIR__ . '/../..' . '/classes/redirect/redirect-formats.php', - 'WPSEO_Redirect_Formatter' => __DIR__ . '/../..' . '/classes/redirect/redirect-formatter.php', - 'WPSEO_Redirect_HTAccess_Loader' => __DIR__ . '/../..' . '/classes/redirect/loaders/redirect-htaccess-loader.php', - 'WPSEO_Redirect_Htaccess_Exporter' => __DIR__ . '/../..' . '/classes/redirect/exporters/redirect-htaccess-exporter.php', - 'WPSEO_Redirect_Htaccess_Util' => __DIR__ . '/../..' . '/classes/redirect/redirect-htaccess-util.php', - 'WPSEO_Redirect_Import_Exception' => __DIR__ . '/../..' . '/classes/redirect/redirect-import-exception.php', - 'WPSEO_Redirect_Importer' => __DIR__ . '/../..' . '/classes/redirect/redirect-importer.php', - 'WPSEO_Redirect_Loader' => __DIR__ . '/../..' . '/classes/redirect/loaders/redirect-loader-interface.php', - 'WPSEO_Redirect_Manager' => __DIR__ . '/../..' . '/classes/redirect/redirect-manager.php', - 'WPSEO_Redirect_Nginx_Exporter' => __DIR__ . '/../..' . '/classes/redirect/exporters/redirect-nginx-exporter.php', - 'WPSEO_Redirect_Option' => __DIR__ . '/../..' . '/classes/redirect/redirect-option.php', - 'WPSEO_Redirect_Option_Exporter' => __DIR__ . '/../..' . '/classes/redirect/exporters/redirect-option-exporter.php', - 'WPSEO_Redirect_Page' => __DIR__ . '/../..' . '/classes/redirect/redirect-page.php', - 'WPSEO_Redirect_Page_Presenter' => __DIR__ . '/../..' . '/classes/redirect/presenters/redirect-page-presenter.php', - 'WPSEO_Redirect_Presence_Validation' => __DIR__ . '/../..' . '/classes/redirect/validation/redirect-presence-validation.php', - 'WPSEO_Redirect_Presenter' => __DIR__ . '/../..' . '/classes/redirect/presenters/redirect-presenter-interface.php', - 'WPSEO_Redirect_Quick_Edit_Presenter' => __DIR__ . '/../..' . '/classes/redirect/presenters/redirect-quick-edit-presenter.php', - 'WPSEO_Redirect_Redirection_Loader' => __DIR__ . '/../..' . '/classes/redirect/loaders/redirect-redirection-loader.php', - 'WPSEO_Redirect_Relative_Origin_Validation' => __DIR__ . '/../..' . '/classes/redirect/validation/redirect-relative-origin-validation.php', - 'WPSEO_Redirect_Safe_Redirect_Loader' => __DIR__ . '/../..' . '/classes/redirect/loaders/redirect-safe-redirect-loader.php', - 'WPSEO_Redirect_Self_Redirect_Validation' => __DIR__ . '/../..' . '/classes/redirect/validation/redirect-self-redirect-validation.php', - 'WPSEO_Redirect_Settings_Presenter' => __DIR__ . '/../..' . '/classes/redirect/presenters/redirect-settings-presenter.php', - 'WPSEO_Redirect_Simple_301_Redirect_Loader' => __DIR__ . '/../..' . '/classes/redirect/loaders/redirect-simple-301-redirect-loader.php', - 'WPSEO_Redirect_Sitemap_Filter' => __DIR__ . '/../..' . '/classes/redirect/redirect-sitemap-filter.php', - 'WPSEO_Redirect_Subdirectory_Validation' => __DIR__ . '/../..' . '/classes/redirect/validation/redirect-subdirectory-validation.php', - 'WPSEO_Redirect_Tab_Presenter' => __DIR__ . '/../..' . '/classes/redirect/presenters/redirect-tab-presenter.php', - 'WPSEO_Redirect_Table' => __DIR__ . '/../..' . '/classes/redirect/redirect-table.php', - 'WPSEO_Redirect_Table_Presenter' => __DIR__ . '/../..' . '/classes/redirect/presenters/redirect-table-presenter.php', - 'WPSEO_Redirect_Types' => __DIR__ . '/../..' . '/classes/redirect/redirect-types.php', - 'WPSEO_Redirect_Uniqueness_Validation' => __DIR__ . '/../..' . '/classes/redirect/validation/redirect-uniqueness-validation.php', - 'WPSEO_Redirect_Upgrade' => __DIR__ . '/../..' . '/classes/redirect/redirect-upgrade.php', - 'WPSEO_Redirect_Url_Formatter' => __DIR__ . '/../..' . '/classes/redirect/redirect-url-formatter.php', - 'WPSEO_Redirect_Util' => __DIR__ . '/../..' . '/classes/redirect/redirect-util.php', - 'WPSEO_Redirect_Validation' => __DIR__ . '/../..' . '/classes/redirect/validation/redirect-validation-interface.php', - 'WPSEO_Redirect_Validator' => __DIR__ . '/../..' . '/classes/redirect/redirect-validator.php', - 'WPSEO_Social_Previews' => __DIR__ . '/../..' . '/classes/social-previews.php', - 'WPSEO_Term_Watcher' => __DIR__ . '/../..' . '/classes/term-watcher.php', - 'WPSEO_Upgrade_Manager' => __DIR__ . '/../..' . '/classes/upgrade-manager.php', - 'WPSEO_Validation_Error' => __DIR__ . '/../..' . '/classes/validation-error.php', - 'WPSEO_Validation_Result' => __DIR__ . '/../..' . '/classes/validation-result.php', - 'WPSEO_Validation_Warning' => __DIR__ . '/../..' . '/classes/validation-warning.php', - 'WPSEO_Watcher' => __DIR__ . '/../..' . '/classes/watcher.php', - 'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastPremiumImprovedInternalLinking' => __DIR__ . '/../..' . '/src/config/migrations/20190715101200_WpYoastPremiumImprovedInternalLinking.php', - 'Yoast\\WP\\SEO\\Integrations\\Blocks\\Block_Patterns' => __DIR__ . '/../..' . '/src/deprecated/integrations/blocks/block-patterns.php', - 'Yoast\\WP\\SEO\\Integrations\\Blocks\\Job_Posting_Block' => __DIR__ . '/../..' . '/src/deprecated/integrations/blocks/job-posting-block.php', - 'Yoast\\WP\\SEO\\Integrations\\Blocks\\Siblings_Block' => __DIR__ . '/../..' . '/classes/blocks/siblings-block.php', - 'Yoast\\WP\\SEO\\Integrations\\Blocks\\Subpages_Block' => __DIR__ . '/../..' . '/classes/blocks/subpages-block.php', - 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\TranslationsPress' => __DIR__ . '/../..' . '/src/integrations/third-party/translationspress.php', - 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher_Keyphrases' => __DIR__ . '/../..' . '/src/integrations/third-party/wincher-keyphrases.php', - 'Yoast\\WP\\SEO\\Models\\Prominent_Words' => __DIR__ . '/../..' . '/src/models/prominent-words.php', - 'Yoast\\WP\\SEO\\Premium\\Actions\\AI_Generator_Action' => __DIR__ . '/../..' . '/src/actions/ai-generator-action.php', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Link_Suggestions_Action' => __DIR__ . '/../..' . '/src/actions/link-suggestions-action.php', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Complete_Action' => __DIR__ . '/../..' . '/src/actions/prominent-words/complete-action.php', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Content_Action' => __DIR__ . '/../..' . '/src/actions/prominent-words/content-action.php', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Prominent_Words\\Save_Action' => __DIR__ . '/../..' . '/src/actions/prominent-words/save-action.php', - 'Yoast\\WP\\SEO\\Premium\\Actions\\Zapier_Action' => __DIR__ . '/../..' . '/src/deprecated/actions/zapier-action.php', - 'Yoast\\WP\\SEO\\Premium\\Addon_Installer' => __DIR__ . '/../..' . '/src/addon-installer.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Ai_Editor_Conditional' => __DIR__ . '/../..' . '/src/conditionals/ai-editor-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Algolia_Enabled_Conditional' => __DIR__ . '/../..' . '/src/conditionals/algolia-enabled-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Cornerstone_Enabled_Conditional' => __DIR__ . '/../..' . '/src/conditionals/cornerstone-enabled-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\EDD_Conditional' => __DIR__ . '/../..' . '/src/conditionals/edd-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Inclusive_Language_Enabled_Conditional' => __DIR__ . '/../..' . '/src/conditionals/inclusive-language-enabled-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Term_Overview_Or_Ajax_Conditional' => __DIR__ . '/../..' . '/src/conditionals/term-overview-or-ajax-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Yoast_Admin_Or_Introductions_Route_Conditional' => __DIR__ . '/../..' . '/src/conditionals/yoast-admin-or-introductions-route-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Conditionals\\Zapier_Enabled_Conditional' => __DIR__ . '/../..' . '/src/deprecated/conditionals/zapier-enabled-conditional.php', - 'Yoast\\WP\\SEO\\Premium\\Config\\Badge_Group_Names' => __DIR__ . '/../..' . '/src/config/badge-group-names.php', - 'Yoast\\WP\\SEO\\Premium\\Config\\Migrations\\AddIndexOnIndexableIdAndStem' => __DIR__ . '/../..' . '/src/config/migrations/20210827093024_AddIndexOnIndexableIdAndStem.php', - 'Yoast\\WP\\SEO\\Premium\\Database\\Migration_Runner_Premium' => __DIR__ . '/../..' . '/src/database/migration-runner-premium.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Forbidden_Property_Mutation_Exception' => __DIR__ . '/../..' . '/src/exceptions/forbidden-property-mutation-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Bad_Request_Exception' => __DIR__ . '/../..' . '/src/exceptions/remote-request/bad-request-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Forbidden_Exception' => __DIR__ . '/../..' . '/src/exceptions/remote-request/forbidden-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Internal_Server_Error_Exception' => __DIR__ . '/../..' . '/src/exceptions/remote-request/internal-server-error-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Not_Found_Exception' => __DIR__ . '/../..' . '/src/exceptions/remote-request/not-found-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Payment_Required_Exception' => __DIR__ . '/../..' . '/src/exceptions/remote-request/payment-required-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Remote_Request_Exception' => __DIR__ . '/../..' . '/src/exceptions/remote-request/remote-request-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Request_Timeout_Exception' => __DIR__ . '/../..' . '/src/exceptions/remote-request/request-timeout-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Service_Unavailable_Exception' => __DIR__ . '/../..' . '/src/exceptions/remote-request/service-unavailable-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Too_Many_Requests_Exception' => __DIR__ . '/../..' . '/src/exceptions/remote-request/too-many-requests-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Exceptions\\Remote_Request\\Unauthorized_Exception' => __DIR__ . '/../..' . '/src/exceptions/remote-request/unauthorized-exception.php', - 'Yoast\\WP\\SEO\\Premium\\Generated\\Cached_Container' => __DIR__ . '/../..' . '/src/generated/container.php', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\AI_Generator_Helper' => __DIR__ . '/../..' . '/src/helpers/ai-generator-helper.php', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\Current_Page_Helper' => __DIR__ . '/../..' . '/src/helpers/current-page-helper.php', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\Prominent_Words_Helper' => __DIR__ . '/../..' . '/src/helpers/prominent-words-helper.php', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\Version_Helper' => __DIR__ . '/../..' . '/src/helpers/version-helper.php', - 'Yoast\\WP\\SEO\\Premium\\Helpers\\Zapier_Helper' => __DIR__ . '/../..' . '/src/deprecated/helpers/zapier-helper.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Crawl_Cleanup_Permalinks' => __DIR__ . '/../..' . '/src/deprecated/initializers/crawl-cleanup-permalinks.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Index_Now_Key' => __DIR__ . '/../..' . '/src/initializers/index-now-key.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Introductions_Initializer' => __DIR__ . '/../..' . '/src/initializers/introductions-initializer.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Plugin' => __DIR__ . '/../..' . '/src/initializers/plugin.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Redirect_Handler' => __DIR__ . '/../..' . '/src/initializers/redirect-handler.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Woocommerce' => __DIR__ . '/../..' . '/src/initializers/woocommerce.php', - 'Yoast\\WP\\SEO\\Premium\\Initializers\\Wp_Cli_Initializer' => __DIR__ . '/../..' . '/src/initializers/wp-cli-initializer.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Abstract_OpenGraph_Integration' => __DIR__ . '/../..' . '/src/integrations/abstract-opengraph-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Ai_Consent_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/ai-consent-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Ai_Generator_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/ai-generator-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Cornerstone_Column_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/cornerstone-column-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Cornerstone_Taxonomy_Column_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/cornerstone-taxonomy-column-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Crawl_Settings_Integration' => __DIR__ . '/../..' . '/src/deprecated/integrations/admin/crawl-settings-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Column_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/inclusive-language-column-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Filter_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/inclusive-language-filter-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Inclusive_Language_Taxonomy_Column_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/inclusive-language-taxonomy-column-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Integrations_Page' => __DIR__ . '/../..' . '/src/deprecated/integrations/admin/integrations-page.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Keyword_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/keyword-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Metabox_Formatter_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/metabox-formatter-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Plugin_Links_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/plugin-links-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Prominent_Words\\Indexing_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/prominent-words/indexing-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Prominent_Words\\Metabox_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/prominent-words/metabox-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Related_Keyphrase_Filter_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/related-keyphrase-filter-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Replacement_Variables_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/replacement-variables-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Settings_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/settings-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Thank_You_Page_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/thank-you-page-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Update_Premium_Notification' => __DIR__ . '/../..' . '/src/integrations/admin/update-premium-notification.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\User_Profile_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/user-profile-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Workouts_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/workouts-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Admin\\Zapier_Notification_Integration' => __DIR__ . '/../..' . '/src/deprecated/integrations/admin/zapier-notification-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Alerts\\Ai_Generator_Tip_Notification' => __DIR__ . '/../..' . '/src/integrations/alerts/ai-generator-tip-notification.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Estimated_Reading_Time_Block' => __DIR__ . '/../..' . '/src/integrations/blocks/estimated-reading-time-block.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Related_Links_Block' => __DIR__ . '/../..' . '/src/integrations/blocks/related-links-block.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Blocks\\Schema_Blocks' => __DIR__ . '/../..' . '/src/deprecated/integrations/blocks/schema-blocks.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Cleanup_Integration' => __DIR__ . '/../..' . '/src/integrations/cleanup-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Front_End\\Crawl_Cleanup_Basic' => __DIR__ . '/../..' . '/src/deprecated/integrations/front-end/crawl-cleanup-basic.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Front_End\\Crawl_Cleanup_Rss' => __DIR__ . '/../..' . '/src/deprecated/integrations/front-end/crawl-cleanup-rss.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Front_End\\Crawl_Cleanup_Searches' => __DIR__ . '/../..' . '/src/deprecated/integrations/front-end/crawl-cleanup-searches.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Front_End\\Robots_Txt_Integration' => __DIR__ . '/../..' . '/src/integrations/front-end/robots-txt-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Frontend_Inspector' => __DIR__ . '/../..' . '/src/integrations/frontend-inspector.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Index_Now_Ping' => __DIR__ . '/../..' . '/src/integrations/index-now-ping.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Missing_Indexables_Count_Integration' => __DIR__ . '/../..' . '/src/integrations/missing-indexables-count-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Author_Archive' => __DIR__ . '/../..' . '/src/integrations/opengraph-author-archive.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Date_Archive' => __DIR__ . '/../..' . '/src/integrations/opengraph-date-archive.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_PostType_Archive' => __DIR__ . '/../..' . '/src/integrations/opengraph-posttype-archive.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Post_Type' => __DIR__ . '/../..' . '/src/integrations/opengraph-post-type.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\OpenGraph_Term_Archive' => __DIR__ . '/../..' . '/src/integrations/opengraph-term-archive.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Organization_Schema_Integration' => __DIR__ . '/../..' . '/src/integrations/organization-schema-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Publishing_Principles_Schema_Integration' => __DIR__ . '/../..' . '/src/integrations/publishing-principles-schema-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Routes\\AI_Generator_Route' => __DIR__ . '/../..' . '/src/integrations/routes/ai-generator-route.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Routes\\Workouts_Routes_Integration' => __DIR__ . '/../..' . '/src/integrations/routes/workouts-routes-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Algolia' => __DIR__ . '/../..' . '/src/integrations/third-party/algolia.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\EDD' => __DIR__ . '/../..' . '/src/integrations/third-party/edd.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Elementor_Premium' => __DIR__ . '/../..' . '/src/integrations/third-party/elementor-premium.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Elementor_Preview' => __DIR__ . '/../..' . '/src/integrations/third-party/elementor-preview.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Mastodon' => __DIR__ . '/../..' . '/src/integrations/third-party/mastodon.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Zapier' => __DIR__ . '/../..' . '/src/deprecated/integrations/third-party/zapier.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Zapier_Classic_Editor' => __DIR__ . '/../..' . '/src/deprecated/integrations/third-party/zapier-classic-editor.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Third_Party\\Zapier_Trigger' => __DIR__ . '/../..' . '/src/deprecated/integrations/third-party/zapier-trigger.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Upgrade_Integration' => __DIR__ . '/../..' . '/src/integrations/upgrade-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\User_Profile_Integration' => __DIR__ . '/../..' . '/src/integrations/user-profile-integration.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Watchers\\Premium_Option_Wpseo_Watcher' => __DIR__ . '/../..' . '/src/deprecated/integrations/watchers/premium-option-wpseo-watcher.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Watchers\\Prominent_Words_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/prominent-words-watcher.php', - 'Yoast\\WP\\SEO\\Premium\\Integrations\\Watchers\\Zapier_APIKey_Reset_Watcher' => __DIR__ . '/../..' . '/src/deprecated/integrations/watchers/zapier-apikey-reset-watcher.php', - 'Yoast\\WP\\SEO\\Premium\\Introductions\\Application\\Ai_Generate_Titles_And_Descriptions_Introduction' => __DIR__ . '/../..' . '/src/introductions/application/ai-generate-titles-and-descriptions-introduction.php', - 'Yoast\\WP\\SEO\\Premium\\Main' => __DIR__ . '/../..' . '/src/main.php', - 'Yoast\\WP\\SEO\\Premium\\Presenters\\Icons\\Checkmark_Icon_Presenter' => __DIR__ . '/../..' . '/src/presenters/icons/checkmark-icon-presenter.php', - 'Yoast\\WP\\SEO\\Premium\\Presenters\\Icons\\Cross_Icon_Presenter' => __DIR__ . '/../..' . '/src/presenters/icons/cross-icon-presenter.php', - 'Yoast\\WP\\SEO\\Premium\\Presenters\\Icons\\Icon_Presenter' => __DIR__ . '/../..' . '/src/presenters/icons/icon-presenter.php', - 'Yoast\\WP\\SEO\\Premium\\Presenters\\Mastodon_Link_Presenter' => __DIR__ . '/../..' . '/src/presenters/mastodon-link-presenter.php', - 'Yoast\\WP\\SEO\\Premium\\Repositories\\Prominent_Words_Repository' => __DIR__ . '/../..' . '/src/repositories/prominent-words-repository.php', - 'Yoast\\WP\\SEO\\Premium\\Routes\\Link_Suggestions_Route' => __DIR__ . '/../..' . '/src/routes/link-suggestions-route.php', - 'Yoast\\WP\\SEO\\Premium\\Routes\\Prominent_Words_Route' => __DIR__ . '/../..' . '/src/routes/prominent-words-route.php', - 'Yoast\\WP\\SEO\\Premium\\Routes\\Workouts_Route' => __DIR__ . '/../..' . '/src/routes/workouts-route.php', - 'Yoast\\WP\\SEO\\Premium\\Routes\\Zapier_Route' => __DIR__ . '/../..' . '/src/deprecated/routes/zapier-route.php', - 'Yoast\\WP\\SEO\\Premium\\Surfaces\\Helpers_Surface' => __DIR__ . '/../..' . '/src/surfaces/helpers-surface.php', - 'Yoast\\WP\\SEO\\Premium\\WordPress\\Wrapper' => __DIR__ . '/../..' . '/src/wordpress/wrapper.php', - 'Yoast\\WP\\SEO\\Schema_Templates\\Block_Patterns\\Block_Pattern' => __DIR__ . '/../..' . '/src/deprecated/schema-templates/block-patterns/block-pattern.php', - 'Yoast\\WP\\SEO\\Schema_Templates\\Block_Patterns\\Block_Pattern_Categories' => __DIR__ . '/../..' . '/src/deprecated/schema-templates/block-patterns/block-pattern-categories.php', - 'Yoast\\WP\\SEO\\Schema_Templates\\Block_Patterns\\Block_Pattern_Keywords' => __DIR__ . '/../..' . '/src/deprecated/schema-templates/block-patterns/block-pattern-keywords.php', - 'Yoast\\WP\\SEO\\Schema_Templates\\Block_Patterns\\Job_Posting_Base_Pattern' => __DIR__ . '/../..' . '/src/deprecated/schema-templates/block-patterns/job-posting-base-pattern.php', - 'Yoast\\WP\\SEO\\Schema_Templates\\Block_Patterns\\Job_Posting_One_Column' => __DIR__ . '/../..' . '/src/deprecated/schema-templates/block-patterns/job-posting-one-column.php', - 'Yoast\\WP\\SEO\\Schema_Templates\\Block_Patterns\\Job_Posting_Two_Columns' => __DIR__ . '/../..' . '/src/deprecated/schema-templates/block-patterns/job-posting-two-columns.php', - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit528786059f0259c2041ce8c878a7e3c0::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit528786059f0259c2041ce8c878a7e3c0::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit528786059f0259c2041ce8c878a7e3c0::$classMap; - - }, null, ClassLoader::class); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/installed.php b/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/installed.php deleted file mode 100644 index 0495cd2c..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/installed.php +++ /dev/null @@ -1,488 +0,0 @@ - array( - 'pretty_version' => 'dev-main', - 'version' => 'dev-main', - 'type' => 'wordpress-plugin', - 'install_path' => __DIR__ . '/../../', - 'aliases' => array(), - 'reference' => '3b8df64a7d46c7f0d50bba08ca6b6ed5e67765be', - 'name' => 'yoast/wordpress-seo-premium', - 'dev' => true, - ), - 'versions' => array( - 'antecedent/patchwork' => array( - 'pretty_version' => '2.1.27', - 'version' => '2.1.27.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../antecedent/patchwork', - 'aliases' => array(), - 'reference' => '16a1ab81559aabf14acb616141e801b32777f085', - 'dev_requirement' => true, - ), - 'automattic/vipwpcs' => array( - 'pretty_version' => '3.0.0', - 'version' => '3.0.0.0', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../automattic/vipwpcs', - 'aliases' => array(), - 'reference' => '1b8960ebff9ea3eb482258a906ece4d1ee1e25fd', - 'dev_requirement' => true, - ), - 'brain/monkey' => array( - 'pretty_version' => '2.6.1', - 'version' => '2.6.1.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../brain/monkey', - 'aliases' => array(), - 'reference' => 'a31c84515bb0d49be9310f52ef1733980ea8ffbb', - 'dev_requirement' => true, - ), - 'composer/installers' => array( - 'pretty_version' => 'v2.2.0', - 'version' => '2.2.0.0', - 'type' => 'composer-plugin', - 'install_path' => __DIR__ . '/./installers', - 'aliases' => array(), - 'reference' => 'c29dc4b93137acb82734f672c37e029dfbd95b35', - 'dev_requirement' => false, - ), - 'cordoval/hamcrest-php' => array( - 'dev_requirement' => true, - 'replaced' => array( - 0 => '*', - ), - ), - 'davedevelopment/hamcrest-php' => array( - 'dev_requirement' => true, - 'replaced' => array( - 0 => '*', - ), - ), - 'dealerdirect/phpcodesniffer-composer-installer' => array( - 'pretty_version' => 'v1.0.0', - 'version' => '1.0.0.0', - 'type' => 'composer-plugin', - 'install_path' => __DIR__ . '/../dealerdirect/phpcodesniffer-composer-installer', - 'aliases' => array(), - 'reference' => '4be43904336affa5c2f70744a348312336afd0da', - 'dev_requirement' => true, - ), - 'doctrine/instantiator' => array( - 'pretty_version' => '1.5.0', - 'version' => '1.5.0.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../doctrine/instantiator', - 'aliases' => array(), - 'reference' => '0a0fa9780f5d4e507415a065172d26a98d02047b', - 'dev_requirement' => true, - ), - 'grogy/php-parallel-lint' => array( - 'dev_requirement' => true, - 'replaced' => array( - 0 => '*', - ), - ), - 'hamcrest/hamcrest-php' => array( - 'pretty_version' => 'v2.0.1', - 'version' => '2.0.1.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../hamcrest/hamcrest-php', - 'aliases' => array(), - 'reference' => '8c3d0a3f6af734494ad8f6fbbee0ba92422859f3', - 'dev_requirement' => true, - ), - 'jakub-onderka/php-console-color' => array( - 'dev_requirement' => true, - 'replaced' => array( - 0 => '*', - ), - ), - 'jakub-onderka/php-console-highlighter' => array( - 'dev_requirement' => true, - 'replaced' => array( - 0 => '*', - ), - ), - 'jakub-onderka/php-parallel-lint' => array( - 'dev_requirement' => true, - 'replaced' => array( - 0 => '*', - ), - ), - 'kodova/hamcrest-php' => array( - 'dev_requirement' => true, - 'replaced' => array( - 0 => '*', - ), - ), - 'mockery/mockery' => array( - 'pretty_version' => '1.3.6', - 'version' => '1.3.6.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../mockery/mockery', - 'aliases' => array(), - 'reference' => 'dc206df4fa314a50bbb81cf72239a305c5bbd5c0', - 'dev_requirement' => true, - ), - 'myclabs/deep-copy' => array( - 'pretty_version' => '1.11.1', - 'version' => '1.11.1.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../myclabs/deep-copy', - 'aliases' => array(), - 'reference' => '7284c22080590fb39f2ffa3e9057f10a4ddd0e0c', - 'dev_requirement' => true, - ), - 'phar-io/manifest' => array( - 'pretty_version' => '2.0.3', - 'version' => '2.0.3.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phar-io/manifest', - 'aliases' => array(), - 'reference' => '97803eca37d319dfa7826cc2437fc020857acb53', - 'dev_requirement' => true, - ), - 'phar-io/version' => array( - 'pretty_version' => '3.2.1', - 'version' => '3.2.1.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phar-io/version', - 'aliases' => array(), - 'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74', - 'dev_requirement' => true, - ), - 'php-parallel-lint/php-console-color' => array( - 'pretty_version' => 'v1.0.1', - 'version' => '1.0.1.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../php-parallel-lint/php-console-color', - 'aliases' => array(), - 'reference' => '7adfefd530aa2d7570ba87100a99e2483a543b88', - 'dev_requirement' => true, - ), - 'php-parallel-lint/php-console-highlighter' => array( - 'pretty_version' => 'v1.0.0', - 'version' => '1.0.0.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../php-parallel-lint/php-console-highlighter', - 'aliases' => array(), - 'reference' => '5b4803384d3303cf8e84141039ef56c8a123138d', - 'dev_requirement' => true, - ), - 'php-parallel-lint/php-parallel-lint' => array( - 'pretty_version' => 'v1.3.2', - 'version' => '1.3.2.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../php-parallel-lint/php-parallel-lint', - 'aliases' => array(), - 'reference' => '6483c9832e71973ed29cf71bd6b3f4fde438a9de', - 'dev_requirement' => true, - ), - 'phpcompatibility/php-compatibility' => array( - 'pretty_version' => '9.3.5', - 'version' => '9.3.5.0', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../phpcompatibility/php-compatibility', - 'aliases' => array(), - 'reference' => '9fb324479acf6f39452e0655d2429cc0d3914243', - 'dev_requirement' => true, - ), - 'phpcompatibility/phpcompatibility-paragonie' => array( - 'pretty_version' => '1.3.2', - 'version' => '1.3.2.0', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../phpcompatibility/phpcompatibility-paragonie', - 'aliases' => array(), - 'reference' => 'bba5a9dfec7fcfbd679cfaf611d86b4d3759da26', - 'dev_requirement' => true, - ), - 'phpcompatibility/phpcompatibility-wp' => array( - 'pretty_version' => '2.1.4', - 'version' => '2.1.4.0', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../phpcompatibility/phpcompatibility-wp', - 'aliases' => array(), - 'reference' => 'b6c1e3ee1c35de6c41a511d5eb9bd03e447480a5', - 'dev_requirement' => true, - ), - 'phpcsstandards/phpcsextra' => array( - 'pretty_version' => '1.2.1', - 'version' => '1.2.1.0', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../phpcsstandards/phpcsextra', - 'aliases' => array(), - 'reference' => '11d387c6642b6e4acaf0bd9bf5203b8cca1ec489', - 'dev_requirement' => true, - ), - 'phpcsstandards/phpcsutils' => array( - 'pretty_version' => '1.0.9', - 'version' => '1.0.9.0', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../phpcsstandards/phpcsutils', - 'aliases' => array(), - 'reference' => '908247bc65010c7b7541a9551e002db12e9dae70', - 'dev_requirement' => true, - ), - 'phpstan/phpdoc-parser' => array( - 'pretty_version' => '1.24.5', - 'version' => '1.24.5.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', - 'aliases' => array(), - 'reference' => 'fedf211ff14ec8381c9bf5714e33a7a552dd1acc', - 'dev_requirement' => true, - ), - 'phpunit/php-code-coverage' => array( - 'pretty_version' => '7.0.15', - 'version' => '7.0.15.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpunit/php-code-coverage', - 'aliases' => array(), - 'reference' => '819f92bba8b001d4363065928088de22f25a3a48', - 'dev_requirement' => true, - ), - 'phpunit/php-file-iterator' => array( - 'pretty_version' => '2.0.5', - 'version' => '2.0.5.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpunit/php-file-iterator', - 'aliases' => array(), - 'reference' => '42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5', - 'dev_requirement' => true, - ), - 'phpunit/php-text-template' => array( - 'pretty_version' => '1.2.1', - 'version' => '1.2.1.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpunit/php-text-template', - 'aliases' => array(), - 'reference' => '31f8b717e51d9a2afca6c9f046f5d69fc27c8686', - 'dev_requirement' => true, - ), - 'phpunit/php-timer' => array( - 'pretty_version' => '2.1.3', - 'version' => '2.1.3.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpunit/php-timer', - 'aliases' => array(), - 'reference' => '2454ae1765516d20c4ffe103d85a58a9a3bd5662', - 'dev_requirement' => true, - ), - 'phpunit/php-token-stream' => array( - 'pretty_version' => '3.1.3', - 'version' => '3.1.3.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpunit/php-token-stream', - 'aliases' => array(), - 'reference' => '9c1da83261628cb24b6a6df371b6e312b3954768', - 'dev_requirement' => true, - ), - 'phpunit/phpunit' => array( - 'pretty_version' => '8.5.36', - 'version' => '8.5.36.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../phpunit/phpunit', - 'aliases' => array(), - 'reference' => '9652df58e06a681429d8cfdaec3c43d6de581d5a', - 'dev_requirement' => true, - ), - 'sebastian/code-unit-reverse-lookup' => array( - 'pretty_version' => '1.0.2', - 'version' => '1.0.2.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/code-unit-reverse-lookup', - 'aliases' => array(), - 'reference' => '1de8cd5c010cb153fcd68b8d0f64606f523f7619', - 'dev_requirement' => true, - ), - 'sebastian/comparator' => array( - 'pretty_version' => '3.0.5', - 'version' => '3.0.5.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/comparator', - 'aliases' => array(), - 'reference' => '1dc7ceb4a24aede938c7af2a9ed1de09609ca770', - 'dev_requirement' => true, - ), - 'sebastian/diff' => array( - 'pretty_version' => '3.0.4', - 'version' => '3.0.4.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/diff', - 'aliases' => array(), - 'reference' => '6296a0c086dd0117c1b78b059374d7fcbe7545ae', - 'dev_requirement' => true, - ), - 'sebastian/environment' => array( - 'pretty_version' => '4.2.4', - 'version' => '4.2.4.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/environment', - 'aliases' => array(), - 'reference' => 'd47bbbad83711771f167c72d4e3f25f7fcc1f8b0', - 'dev_requirement' => true, - ), - 'sebastian/exporter' => array( - 'pretty_version' => '3.1.5', - 'version' => '3.1.5.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/exporter', - 'aliases' => array(), - 'reference' => '73a9676f2833b9a7c36968f9d882589cd75511e6', - 'dev_requirement' => true, - ), - 'sebastian/global-state' => array( - 'pretty_version' => '3.0.3', - 'version' => '3.0.3.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/global-state', - 'aliases' => array(), - 'reference' => '66783ce213de415b451b904bfef9dda0cf9aeae0', - 'dev_requirement' => true, - ), - 'sebastian/object-enumerator' => array( - 'pretty_version' => '3.0.4', - 'version' => '3.0.4.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/object-enumerator', - 'aliases' => array(), - 'reference' => 'e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2', - 'dev_requirement' => true, - ), - 'sebastian/object-reflector' => array( - 'pretty_version' => '1.1.2', - 'version' => '1.1.2.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/object-reflector', - 'aliases' => array(), - 'reference' => '9b8772b9cbd456ab45d4a598d2dd1a1bced6363d', - 'dev_requirement' => true, - ), - 'sebastian/recursion-context' => array( - 'pretty_version' => '3.0.1', - 'version' => '3.0.1.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/recursion-context', - 'aliases' => array(), - 'reference' => '367dcba38d6e1977be014dc4b22f47a484dac7fb', - 'dev_requirement' => true, - ), - 'sebastian/resource-operations' => array( - 'pretty_version' => '2.0.2', - 'version' => '2.0.2.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/resource-operations', - 'aliases' => array(), - 'reference' => '31d35ca87926450c44eae7e2611d45a7a65ea8b3', - 'dev_requirement' => true, - ), - 'sebastian/type' => array( - 'pretty_version' => '1.1.4', - 'version' => '1.1.4.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/type', - 'aliases' => array(), - 'reference' => '0150cfbc4495ed2df3872fb31b26781e4e077eb4', - 'dev_requirement' => true, - ), - 'sebastian/version' => array( - 'pretty_version' => '2.0.1', - 'version' => '2.0.1.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../sebastian/version', - 'aliases' => array(), - 'reference' => '99732be0ddb3361e16ad77b68ba41efc8e979019', - 'dev_requirement' => true, - ), - 'sirbrillig/phpcs-variable-analysis' => array( - 'pretty_version' => 'v2.11.17', - 'version' => '2.11.17.0', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../sirbrillig/phpcs-variable-analysis', - 'aliases' => array(), - 'reference' => '3b71162a6bf0cde2bff1752e40a1788d8273d049', - 'dev_requirement' => true, - ), - 'slevomat/coding-standard' => array( - 'pretty_version' => '8.14.1', - 'version' => '8.14.1.0', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../slevomat/coding-standard', - 'aliases' => array(), - 'reference' => 'fea1fd6f137cc84f9cba0ae30d549615dbc6a926', - 'dev_requirement' => true, - ), - 'squizlabs/php_codesniffer' => array( - 'pretty_version' => '3.8.0', - 'version' => '3.8.0.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../squizlabs/php_codesniffer', - 'aliases' => array(), - 'reference' => '5805f7a4e4958dbb5e944ef1e6edae0a303765e7', - 'dev_requirement' => true, - ), - 'theseer/tokenizer' => array( - 'pretty_version' => '1.2.2', - 'version' => '1.2.2.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../theseer/tokenizer', - 'aliases' => array(), - 'reference' => 'b2ad5003ca10d4ee50a12da31de12a5774ba6b96', - 'dev_requirement' => true, - ), - 'wp-coding-standards/wpcs' => array( - 'pretty_version' => '3.0.1', - 'version' => '3.0.1.0', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../wp-coding-standards/wpcs', - 'aliases' => array(), - 'reference' => 'b4caf9689f1a0e4a4c632679a44e638c1c67aff1', - 'dev_requirement' => true, - ), - 'yoast/phpunit-polyfills' => array( - 'pretty_version' => '1.1.0', - 'version' => '1.1.0.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../yoast/phpunit-polyfills', - 'aliases' => array(), - 'reference' => '224e4a1329c03d8bad520e3fc4ec980034a4b212', - 'dev_requirement' => true, - ), - 'yoast/wordpress-seo' => array( - 'pretty_version' => '22.0', - 'version' => '22.0.0.0', - 'type' => 'wordpress-plugin', - 'install_path' => __DIR__ . '/../yoast/wordpress-seo', - 'aliases' => array(), - 'reference' => '2bf63444fbf7a9abf2bfcbc5f12d774413b23a91', - 'dev_requirement' => false, - ), - 'yoast/wordpress-seo-premium' => array( - 'pretty_version' => 'dev-main', - 'version' => 'dev-main', - 'type' => 'wordpress-plugin', - 'install_path' => __DIR__ . '/../../', - 'aliases' => array(), - 'reference' => '3b8df64a7d46c7f0d50bba08ca6b6ed5e67765be', - 'dev_requirement' => false, - ), - 'yoast/wp-test-utils' => array( - 'pretty_version' => '1.2.0', - 'version' => '1.2.0.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../yoast/wp-test-utils', - 'aliases' => array(), - 'reference' => '2e0f62e0281e4859707c5f13b7da1422aa1c8f7b', - 'dev_requirement' => true, - ), - 'yoast/yoastcs' => array( - 'pretty_version' => '3.0.0', - 'version' => '3.0.0.0', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../yoast/yoastcs', - 'aliases' => array(), - 'reference' => '2ace63e7ea90a1610fb66279c314b321df029fd3', - 'dev_requirement' => true, - ), - ), -); diff --git a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/platform_check.php b/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/platform_check.php deleted file mode 100644 index a8b98d5c..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/vendor/composer/platform_check.php +++ /dev/null @@ -1,26 +0,0 @@ -= 70205)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.5". You are running ' . PHP_VERSION . '.'; -} - -if ($issues) { - if (!headers_sent()) { - header('HTTP/1.1 500 Internal Server Error'); - } - if (!ini_get('display_errors')) { - if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { - fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); - } elseif (!headers_sent()) { - echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; - } - } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR - ); -} diff --git a/wp/wp-content/plugins/wordpress-seo-premium/wp-seo-premium.php b/wp/wp-content/plugins/wordpress-seo-premium/wp-seo-premium.php deleted file mode 100644 index b2cbd5dc..00000000 --- a/wp/wp-content/plugins/wordpress-seo-premium/wp-seo-premium.php +++ /dev/null @@ -1,81 +0,0 @@ -. - */ - -use Yoast\WP\SEO\Premium\Addon_Installer; - -if ( ! defined( 'WPSEO_PREMIUM_FILE' ) ) { - define( 'WPSEO_PREMIUM_FILE', __FILE__ ); -} - -if ( ! defined( 'WPSEO_PREMIUM_PATH' ) ) { - define( 'WPSEO_PREMIUM_PATH', plugin_dir_path( WPSEO_PREMIUM_FILE ) ); -} - -if ( ! defined( 'WPSEO_PREMIUM_BASENAME' ) ) { - define( 'WPSEO_PREMIUM_BASENAME', plugin_basename( WPSEO_PREMIUM_FILE ) ); -} - -/** - * {@internal Nobody should be able to overrule the real version number as this can cause - * serious issues with the options, so no if ( ! defined() ).}} - */ -define( 'WPSEO_PREMIUM_VERSION', '22.0' ); - -// Initialize Premium autoloader. -$wpseo_premium_dir = WPSEO_PREMIUM_PATH; -$yoast_seo_premium_autoload_file = $wpseo_premium_dir . 'vendor/autoload.php'; - -if ( is_readable( $yoast_seo_premium_autoload_file ) ) { - require $yoast_seo_premium_autoload_file; -} - -// This class has to exist outside of the container as the container requires Yoast SEO to exist. -$wpseo_addon_installer = new Addon_Installer( __DIR__ ); -$wpseo_addon_installer->install_yoast_seo_from_repository(); - -// Load the container. -if ( ! wp_installing() ) { - require_once __DIR__ . '/src/functions.php'; - YoastSEOPremium(); -} - -register_activation_hook( WPSEO_PREMIUM_FILE, [ 'WPSEO_Premium', 'install' ] ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/admin-settings-changed-listener.php b/wp/wp-content/plugins/wordpress-seo/admin/admin-settings-changed-listener.php deleted file mode 100644 index 712c5445..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/admin-settings-changed-listener.php +++ /dev/null @@ -1,89 +0,0 @@ -helpers->current_page->is_yoast_seo_page() ) { - return; - } - - // Variable name is the same as the global that is set by get_settings_errors. - $wp_settings_errors = get_settings_errors(); - - foreach ( $wp_settings_errors as $key => $wp_settings_error ) { - if ( ! $this->is_settings_updated_notification( $wp_settings_error ) ) { - continue; - } - - self::$settings_saved = true; - unset( $wp_settings_errors[ $key ] ); - // phpcs:ignore WordPress.WP.GlobalVariablesOverride -- Overwrite the global with the list excluding the Changed saved message. - $GLOBALS['wp_settings_errors'] = $wp_settings_errors; - break; - } - } - - /** - * Checks whether the settings notification is a settings_updated notification. - * - * @param array $wp_settings_error The settings object. - * - * @return bool Whether this is a settings updated settings notification. - */ - public function is_settings_updated_notification( $wp_settings_error ) { - return ! empty( $wp_settings_error['code'] ) && $wp_settings_error['code'] === 'settings_updated'; - } - - /** - * Get whether the settings have successfully been saved - * - * @return bool Whether the settings have successfully been saved. - */ - public function have_settings_been_saved() { - return self::$settings_saved; - } - - /** - * Renders a success message if the Yoast SEO settings have been saved. - * - * @return void - */ - public function show_success_message() { - if ( $this->have_settings_been_saved() ) { - echo '

              ', - esc_html__( 'Settings saved.', 'wordpress-seo' ), - '

              '; - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/ajax.php b/wp/wp-content/plugins/wordpress-seo/admin/ajax.php deleted file mode 100644 index 34a6f886..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/ajax.php +++ /dev/null @@ -1,419 +0,0 @@ - 'success', - 'post_id' => $post_id, - "new_{$return_key}" => $sanitized_new_meta_value, - "original_{$return_key}" => $orig_meta_value, - ]; - - $the_post = get_post( $post_id ); - if ( empty( $the_post ) ) { - - $upsert_results['status'] = 'failure'; - $upsert_results['results'] = __( 'Post doesn\'t exist.', 'wordpress-seo' ); - - return $upsert_results; - } - - $post_type_object = get_post_type_object( $the_post->post_type ); - if ( ! $post_type_object ) { - - $upsert_results['status'] = 'failure'; - $upsert_results['results'] = sprintf( - /* translators: %s expands to post type. */ - __( 'Post has an invalid Content Type: %s.', 'wordpress-seo' ), - $the_post->post_type - ); - - return $upsert_results; - } - - if ( ! current_user_can( $post_type_object->cap->edit_posts ) ) { - - $upsert_results['status'] = 'failure'; - $upsert_results['results'] = sprintf( - /* translators: %s expands to post type name. */ - __( 'You can\'t edit %s.', 'wordpress-seo' ), - $post_type_object->label - ); - - return $upsert_results; - } - - if ( ! current_user_can( $post_type_object->cap->edit_others_posts ) && (int) $the_post->post_author !== get_current_user_id() ) { - - $upsert_results['status'] = 'failure'; - $upsert_results['results'] = sprintf( - /* translators: %s expands to the name of a post type (plural). */ - __( 'You can\'t edit %s that aren\'t yours.', 'wordpress-seo' ), - $post_type_object->label - ); - - return $upsert_results; - } - - if ( $sanitized_new_meta_value === $orig_meta_value && $sanitized_new_meta_value !== $new_meta_value ) { - $upsert_results['status'] = 'failure'; - $upsert_results['results'] = __( 'You have used HTML in your value which is not allowed.', 'wordpress-seo' ); - - return $upsert_results; - } - - $res = update_post_meta( $post_id, $meta_key, $sanitized_new_meta_value ); - - $upsert_results['status'] = ( $res !== false ) ? 'success' : 'failure'; - $upsert_results['results'] = $res; - - return $upsert_results; -} - -/** - * Save all titles sent from the Bulk Editor. - * - * @return void - */ -function wpseo_save_all_titles() { - wpseo_save_all( 'title' ); -} - -add_action( 'wp_ajax_wpseo_save_all_titles', 'wpseo_save_all_titles' ); - -/** - * Save all description sent from the Bulk Editor. - * - * @return void - */ -function wpseo_save_all_descriptions() { - wpseo_save_all( 'metadesc' ); -} - -add_action( 'wp_ajax_wpseo_save_all_descriptions', 'wpseo_save_all_descriptions' ); - -/** - * Utility function to save values. - * - * @param string $what Type of item so save. - * - * @return void - */ -function wpseo_save_all( $what ) { - check_ajax_referer( 'wpseo-bulk-editor' ); - - $results = []; - if ( ! isset( $_POST['items'], $_POST['existingItems'] ) ) { - wpseo_ajax_json_echo_die( $results ); - } - - $new_values = array_map( [ 'WPSEO_Utils', 'sanitize_text_field' ], wp_unslash( (array) $_POST['items'] ) ); - $original_values = array_map( [ 'WPSEO_Utils', 'sanitize_text_field' ], wp_unslash( (array) $_POST['existingItems'] ) ); - - foreach ( $new_values as $post_id => $new_value ) { - $original_value = $original_values[ $post_id ]; - $results[] = wpseo_upsert_new( $what, $post_id, $new_value, $original_value ); - } - - wpseo_ajax_json_echo_die( $results ); -} - -/** - * Insert a new value. - * - * @param string $what Item type (such as title). - * @param int $post_id Post ID. - * @param string $new_value New value to record. - * @param string $original Original value. - * - * @return string - */ -function wpseo_upsert_new( $what, $post_id, $new_value, $original ) { - $meta_key = WPSEO_Meta::$meta_prefix . $what; - - return wpseo_upsert_meta( $post_id, $new_value, $original, $meta_key, $what ); -} - -/** - * Retrieves the post ids where the keyword is used before as well as the types of those posts. - * - * @return void - */ -function ajax_get_keyword_usage_and_post_types() { - check_ajax_referer( 'wpseo-keyword-usage-and-post-types', 'nonce' ); - - if ( ! isset( $_POST['post_id'], $_POST['keyword'] ) || ! is_string( $_POST['keyword'] ) ) { - die( '-1' ); - } - - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We are casting to an integer. - $post_id = (int) wp_unslash( $_POST['post_id'] ); - - if ( $post_id === 0 || ! current_user_can( 'edit_post', $post_id ) ) { - die( '-1' ); - } - - $keyword = sanitize_text_field( wp_unslash( $_POST['keyword'] ) ); - - $post_ids = WPSEO_Meta::keyword_usage( $keyword, $post_id ); - - if ( ! empty( $post_ids ) ) { - $post_types = WPSEO_Meta::post_types_for_ids( $post_ids ); - } - else { - $post_types = []; - } - - $return_object = [ - 'keyword_usage' => $post_ids, - 'post_types' => $post_types, - ]; - - wp_die( - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe. - WPSEO_Utils::format_json_encode( $return_object ) - ); -} - -add_action( 'wp_ajax_get_focus_keyword_usage_and_post_types', 'ajax_get_keyword_usage_and_post_types' ); - - -/** - * Retrieves the keyword for the keyword doubles of the termpages. - * - * @return void - */ -function ajax_get_term_keyword_usage() { - check_ajax_referer( 'wpseo-keyword-usage', 'nonce' ); - - if ( ! isset( $_POST['post_id'], $_POST['keyword'], $_POST['taxonomy'] ) || ! is_string( $_POST['keyword'] ) || ! is_string( $_POST['taxonomy'] ) ) { - wp_die( -1 ); - } - - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are casting the unsafe input to an integer. - $post_id = (int) wp_unslash( $_POST['post_id'] ); - - if ( $post_id === 0 ) { - wp_die( -1 ); - } - - $keyword = sanitize_text_field( wp_unslash( $_POST['keyword'] ) ); - $taxonomy_name = sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) ); - - $taxonomy = get_taxonomy( $taxonomy_name ); - - if ( ! $taxonomy ) { - wp_die( 0 ); - } - - if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) { - wp_die( -1 ); - } - - $usage = WPSEO_Taxonomy_Meta::get_keyword_usage( $keyword, $post_id, $taxonomy_name ); - - // Normalize the result so it is the same as the post keyword usage AJAX request. - $usage = $usage[ $keyword ]; - - wp_die( - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe. - WPSEO_Utils::format_json_encode( $usage ) - ); -} - -add_action( 'wp_ajax_get_term_keyword_usage', 'ajax_get_term_keyword_usage' ); - -/** - * Registers hooks for all AJAX integrations. - * - * @return void - */ -function wpseo_register_ajax_integrations() { - $integrations = [ new Yoast_Network_Admin() ]; - - foreach ( $integrations as $integration ) { - $integration->register_ajax_hooks(); - } -} - -wpseo_register_ajax_integrations(); - -new WPSEO_Shortcode_Filter(); - -new WPSEO_Taxonomy_Columns(); - -/* ********************* DEPRECATED FUNCTIONS ********************* */ - -/** - * Retrieves the keyword for the keyword doubles. - * - * @return void - */ -function ajax_get_keyword_usage() { - _deprecated_function( __METHOD__, 'WPSEO 20.4' ); - check_ajax_referer( 'wpseo-keyword-usage', 'nonce' ); - - if ( ! isset( $_POST['post_id'], $_POST['keyword'] ) || ! is_string( $_POST['keyword'] ) ) { - die( '-1' ); - } - - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We are casting to an integer. - $post_id = (int) wp_unslash( $_POST['post_id'] ); - - if ( $post_id === 0 || ! current_user_can( 'edit_post', $post_id ) ) { - die( '-1' ); - } - - $keyword = sanitize_text_field( wp_unslash( $_POST['keyword'] ) ); - - wp_die( - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe. - WPSEO_Utils::format_json_encode( WPSEO_Meta::keyword_usage( $keyword, $post_id ) ) - ); -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-shortcode-filter.php b/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-shortcode-filter.php deleted file mode 100644 index c9f5f3db..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-shortcode-filter.php +++ /dev/null @@ -1,54 +0,0 @@ - $shortcode, - 'output' => do_shortcode( $shortcode ), - ]; - } - - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: WPSEO_Utils::format_json_encode is considered safe. - wp_die( WPSEO_Utils::format_json_encode( $parsed_shortcodes ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-dismissable-notice.php b/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-dismissable-notice.php deleted file mode 100644 index c847ba62..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-dismissable-notice.php +++ /dev/null @@ -1,95 +0,0 @@ -notice_name = $notice_name; - $this->notice_type = $notice_type; - - add_action( 'wp_ajax_wpseo_dismiss_' . $notice_name, [ $this, 'dismiss_notice' ] ); - } - - /** - * Handles the dismiss notice request. - * - * @return void - */ - public function dismiss_notice() { - check_ajax_referer( 'wpseo-dismiss-' . $this->notice_name ); - - $this->save_dismissed(); - - wp_die( 'true' ); - } - - /** - * Storing the dismissed value in the database. The target location is based on the set notification type. - * - * @return void - */ - private function save_dismissed() { - if ( $this->notice_type === self::FOR_SITE ) { - update_option( 'wpseo_dismiss_' . $this->notice_name, 1 ); - - return; - } - - if ( $this->notice_type === self::FOR_NETWORK ) { - update_site_option( 'wpseo_dismiss_' . $this->notice_name, 1 ); - - return; - } - - update_user_meta( get_current_user_id(), 'wpseo_dismiss_' . $this->notice_name, 1 ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-plugin-conflict-ajax.php b/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-plugin-conflict-ajax.php deleted file mode 100644 index 9778c5e7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-plugin-conflict-ajax.php +++ /dev/null @@ -1,130 +0,0 @@ - sanitize_text_field( $conflict_data['section'] ), - 'plugins' => sanitize_text_field( $conflict_data['plugins'] ), - ]; - - $this->dismissed_conflicts = $this->get_dismissed_conflicts( $conflict_data['section'] ); - - $this->compare_plugins( $conflict_data['plugins'] ); - - $this->save_dismissed_conflicts( $conflict_data['section'] ); - - wp_die( 'true' ); - } - - /** - * Getting the user option from the database. - * - * @return bool|array - */ - private function get_dismissed_option() { - return get_user_meta( get_current_user_id(), $this->option_name, true ); - } - - /** - * Getting the dismissed conflicts from the database - * - * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap). - * - * @return array - */ - private function get_dismissed_conflicts( $plugin_section ) { - $dismissed_conflicts = $this->get_dismissed_option(); - - if ( is_array( $dismissed_conflicts ) && array_key_exists( $plugin_section, $dismissed_conflicts ) ) { - return $dismissed_conflicts[ $plugin_section ]; - } - - return []; - } - - /** - * Storing the conflicting plugins as an user option in the database. - * - * @param string $plugin_section Plugin conflict type (such as Open Graph or sitemap). - * - * @return void - */ - private function save_dismissed_conflicts( $plugin_section ) { - $dismissed_conflicts = $this->get_dismissed_option(); - - $dismissed_conflicts[ $plugin_section ] = $this->dismissed_conflicts; - - update_user_meta( get_current_user_id(), $this->option_name, $dismissed_conflicts ); - } - - /** - * Loop through the plugins to compare them with the already stored dismissed plugin conflicts. - * - * @param array $posted_plugins Plugin set to check. - * - * @return void - */ - public function compare_plugins( array $posted_plugins ) { - foreach ( $posted_plugins as $posted_plugin ) { - $this->compare_plugin( $posted_plugin ); - } - } - - /** - * Check if plugin is already dismissed, if not store it in the array that will be saved later. - * - * @param string $posted_plugin Plugin to check against dismissed conflicts. - * - * @return void - */ - private function compare_plugin( $posted_plugin ) { - if ( ! in_array( $posted_plugin, $this->dismissed_conflicts, true ) ) { - $this->dismissed_conflicts[] = $posted_plugin; - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-abstract-capability-manager.php b/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-abstract-capability-manager.php deleted file mode 100644 index 8f290d81..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-abstract-capability-manager.php +++ /dev/null @@ -1,91 +0,0 @@ -capabilities[ $capability ] ) ) { - $this->capabilities[ $capability ] = $roles; - - return; - } - - // Combine configurations. - $this->capabilities[ $capability ] = array_merge( $roles, $this->capabilities[ $capability ] ); - - // Remove doubles. - $this->capabilities[ $capability ] = array_unique( $this->capabilities[ $capability ] ); - } - - /** - * Returns the list of registered capabilitities. - * - * @return string[] Registered capabilities. - */ - public function get_capabilities() { - return array_keys( $this->capabilities ); - } - - /** - * Returns a list of WP_Role roles. - * - * The string array of role names are converted to actual WP_Role objects. - * These are needed to be able to use the API on them. - * - * @param array $roles Roles to retrieve the objects for. - * - * @return WP_Role[] List of WP_Role objects. - */ - protected function get_wp_roles( array $roles ) { - $wp_roles = array_map( 'get_role', $roles ); - - return array_filter( $wp_roles ); - } - - /** - * Filter capability roles. - * - * @param string $capability Capability to filter roles for. - * @param array $roles List of roles which can be filtered. - * - * @return array Filtered list of roles for the capability. - */ - protected function filter_roles( $capability, array $roles ) { - /** - * Filter: Allow changing roles that a capability is added to. - * - * @param array $roles The default roles to be filtered. - */ - $filtered = apply_filters( $capability . '_roles', $roles ); - - // Make sure we have the expected type. - if ( ! is_array( $filtered ) ) { - return []; - } - - return $filtered; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-factory.php b/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-factory.php deleted file mode 100644 index e265bee1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-factory.php +++ /dev/null @@ -1,35 +0,0 @@ -manager = $manager; - } - - /** - * Registers the hooks. - * - * @return void - */ - public function register_hooks() { - add_filter( 'members_get_capabilities', [ $this, 'get_capabilities' ] ); - add_action( 'members_register_cap_groups', [ $this, 'action_members_register_cap_group' ] ); - - add_filter( 'ure_capabilities_groups_tree', [ $this, 'filter_ure_capabilities_groups_tree' ] ); - add_filter( 'ure_custom_capability_groups', [ $this, 'filter_ure_custom_capability_groups' ], 10, 2 ); - } - - /** - * Get the Yoast SEO capabilities. - * Optionally append them to an existing array. - * - * @param array $caps Optional existing capability list. - * @return array - */ - public function get_capabilities( array $caps = [] ) { - if ( ! did_action( 'wpseo_register_capabilities' ) ) { - do_action( 'wpseo_register_capabilities' ); - } - - return array_merge( $caps, $this->manager->get_capabilities() ); - } - - /** - * Add capabilities to its own group in the Members plugin. - * - * @see members_register_cap_group() - * - * @return void - */ - public function action_members_register_cap_group() { - if ( ! function_exists( 'members_register_cap_group' ) ) { - return; - } - - // Register the yoast group. - $args = [ - 'label' => esc_html__( 'Yoast SEO', 'wordpress-seo' ), - 'caps' => $this->get_capabilities(), - 'icon' => 'dashicons-admin-plugins', - 'diff_added' => true, - ]; - members_register_cap_group( 'wordpress-seo', $args ); - } - - /** - * Adds Yoast SEO capability group in the User Role Editor plugin. - * - * @see URE_Capabilities_Groups_Manager::get_groups_tree() - * - * @param array $groups Current groups. - * - * @return array Filtered list of capabilty groups. - */ - public function filter_ure_capabilities_groups_tree( $groups = [] ) { - $groups = (array) $groups; - - $groups['wordpress-seo'] = [ - 'caption' => 'Yoast SEO', - 'parent' => 'custom', - 'level' => 3, - ]; - - return $groups; - } - - /** - * Adds capabilities to the Yoast SEO group in the User Role Editor plugin. - * - * @see URE_Capabilities_Groups_Manager::get_cap_groups() - * - * @param array $groups Current capability groups. - * @param string $cap_id Capability identifier. - * - * @return array List of filtered groups. - */ - public function filter_ure_custom_capability_groups( $groups = [], $cap_id = '' ) { - if ( in_array( $cap_id, $this->get_capabilities(), true ) ) { - $groups = (array) $groups; - $groups[] = 'wordpress-seo'; - } - - return $groups; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-vip.php b/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-vip.php deleted file mode 100644 index 4f56e8e4..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-vip.php +++ /dev/null @@ -1,73 +0,0 @@ -capabilities as $capability => $roles ) { - $role_capabilities = $this->get_role_capabilities( $role_capabilities, $capability, $roles ); - } - - foreach ( $role_capabilities as $role => $capabilities ) { - wpcom_vip_add_role_caps( $role, $capabilities ); - } - } - - /** - * Removes the registered capabilities from the system - * - * @return void - */ - public function remove() { - // Remove from any role it has been added to. - $roles = wp_roles()->get_names(); - $roles = array_keys( $roles ); - - $role_capabilities = []; - foreach ( array_keys( $this->capabilities ) as $capability ) { - // Allow filtering of roles. - $role_capabilities = $this->get_role_capabilities( $role_capabilities, $capability, $roles ); - } - - foreach ( $role_capabilities as $role => $capabilities ) { - wpcom_vip_remove_role_caps( $role, $capabilities ); - } - } - - /** - * Returns the roles which the capability is registered on. - * - * @param array $role_capabilities List of all roles with their capabilities. - * @param string $capability Capability to filter roles for. - * @param array $roles List of default roles. - * - * @return array List of capabilities. - */ - protected function get_role_capabilities( $role_capabilities, $capability, $roles ) { - // Allow filtering of roles. - $filtered_roles = $this->filter_roles( $capability, $roles ); - - foreach ( $filtered_roles as $role ) { - if ( ! isset( $add_role_caps[ $role ] ) ) { - $role_capabilities[ $role ] = []; - } - - $role_capabilities[ $role ][] = $capability; - } - - return $role_capabilities; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-wp.php b/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-wp.php deleted file mode 100644 index 18309567..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-wp.php +++ /dev/null @@ -1,51 +0,0 @@ -capabilities as $capability => $roles ) { - $filtered_roles = $this->filter_roles( $capability, $roles ); - - $wp_roles = $this->get_wp_roles( $filtered_roles ); - foreach ( $wp_roles as $wp_role ) { - $wp_role->add_cap( $capability ); - } - } - } - - /** - * Unregisters the capabilities from the system. - * - * @return void - */ - public function remove() { - // Remove from any roles it has been added to. - $roles = wp_roles()->get_names(); - $roles = array_keys( $roles ); - - foreach ( $this->capabilities as $capability => $_roles ) { - $registered_roles = array_unique( array_merge( $roles, $this->capabilities[ $capability ] ) ); - - // Allow filtering of roles. - $filtered_roles = $this->filter_roles( $capability, $registered_roles ); - - $wp_roles = $this->get_wp_roles( $filtered_roles ); - foreach ( $wp_roles as $wp_role ) { - $wp_role->remove_cap( $capability ); - } - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager.php b/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager.php deleted file mode 100644 index 63f6962d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager.php +++ /dev/null @@ -1,38 +0,0 @@ - $applicable_roles ] ); - } - - /** - * Retrieves the roles that have the specified capability. - * - * @param string $capability The name of the capability. - * - * @return array The names of the roles that have the capability. - */ - public static function get_applicable_roles( $capability ) { - $roles = wp_roles(); - $role_names = $roles->get_names(); - - $applicable_roles = []; - foreach ( array_keys( $role_names ) as $role_name ) { - $role = $roles->get_role( $role_name ); - - if ( ! $role ) { - continue; - } - - // Add role if it has the capability. - if ( array_key_exists( $capability, $role->capabilities ) && $role->capabilities[ $capability ] === true ) { - $applicable_roles[] = $role_name; - } - } - - return $applicable_roles; - } - - /** - * Checks if the current user has at least one of the supplied capabilities. - * - * @param array $capabilities Capabilities to check against. - * - * @return bool True if the user has at least one capability. - */ - protected static function has_any( array $capabilities ) { - foreach ( $capabilities as $capability ) { - if ( self::has( $capability ) ) { - return true; - } - } - - return false; - } - - /** - * Checks if the user has a certain capability. - * - * @param string $capability Capability to check against. - * - * @return bool True if the user has the capability. - */ - protected static function has( $capability ) { - return current_user_can( $capability ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-register-capabilities.php b/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-register-capabilities.php deleted file mode 100644 index 6cf248d8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/capabilities/class-register-capabilities.php +++ /dev/null @@ -1,111 +0,0 @@ -register( 'wpseo_bulk_edit', [ 'editor', 'wpseo_editor', 'wpseo_manager' ] ); - $manager->register( 'wpseo_edit_advanced_metadata', [ 'editor', 'wpseo_editor', 'wpseo_manager' ] ); - - $manager->register( 'wpseo_manage_options', [ 'administrator', 'wpseo_manager' ] ); - $manager->register( 'view_site_health_checks', [ 'wpseo_manager' ] ); - } - - /** - * Revokes the 'wpseo_manage_options' capability from administrator users if it should - * only be granted to network administrators. - * - * @param array $allcaps An array of all the user's capabilities. - * @param array $caps Actual capabilities being checked. - * @param array $args Optional parameters passed to has_cap(), typically object ID. - * @param WP_User $user The user object. - * - * @return array Possibly modified array of the user's capabilities. - */ - public function filter_user_has_wpseo_manage_options_cap( $allcaps, $caps, $args, $user ) { - - // We only need to do something if 'wpseo_manage_options' is being checked. - if ( ! in_array( 'wpseo_manage_options', $caps, true ) ) { - return $allcaps; - } - - // If the user does not have 'wpseo_manage_options' anyway, we don't need to revoke access. - if ( empty( $allcaps['wpseo_manage_options'] ) ) { - return $allcaps; - } - - // If the user does not have 'delete_users', they are not an administrator. - if ( empty( $allcaps['delete_users'] ) ) { - return $allcaps; - } - - $options = WPSEO_Options::get_instance(); - - if ( $options->get( 'access' ) === 'superadmin' && ! is_super_admin( $user->ID ) ) { - unset( $allcaps['wpseo_manage_options'] ); - } - - return $allcaps; - } - - /** - * Maybe add manage_privacy_options capability for wpseo_manager user role. - * - * @param string[] $caps Primitive capabilities required of the user. - * @param string[] $cap Capability being checked. - * - * @return string[] Filtered primitive capabilities required of the user. - */ - public function map_meta_cap_for_seo_manager( $caps, $cap ) { - $user = wp_get_current_user(); - - // No multisite support. - if ( is_multisite() ) { - return $caps; - } - - // User must be of role wpseo_manager. - if ( ! in_array( 'wpseo_manager', $user->roles, true ) ) { - return $caps; - } - - // Remove manage_options cap requirement if requested cap is manage_privacy_options. - if ( $cap === 'manage_privacy_options' ) { - return array_diff( $caps, [ 'manage_options' ] ); - } - - return $caps; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-analysis-worker-location.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-analysis-worker-location.php deleted file mode 100644 index cb980ad1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-analysis-worker-location.php +++ /dev/null @@ -1,75 +0,0 @@ -flatten_version( WPSEO_VERSION ); - } - - $analysis_worker = $name . '-' . $flat_version . '.js'; - - $this->asset_location = WPSEO_Admin_Asset_Manager::create_default_location(); - $this->asset = new WPSEO_Admin_Asset( - [ - 'name' => $name, - 'src' => $analysis_worker, - ] - ); - } - - /** - * Retrieves the analysis worker asset. - * - * @return WPSEO_Admin_Asset The analysis worker asset. - */ - public function get_asset() { - return $this->asset; - } - - /** - * Determines the URL of the asset on the dev server. - * - * @param WPSEO_Admin_Asset $asset The asset to determine the URL for. - * @param string $type The type of asset. Usually JS or CSS. - * - * @return string The URL of the asset. - */ - public function get_url( WPSEO_Admin_Asset $asset, $type ) { - $scheme = wp_parse_url( $asset->get_src(), PHP_URL_SCHEME ); - if ( in_array( $scheme, [ 'http', 'https' ], true ) ) { - return $asset->get_src(); - } - - return $this->asset_location->get_url( $asset, $type ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-dev-server-location.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-dev-server-location.php deleted file mode 100644 index cf67ae74..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-dev-server-location.php +++ /dev/null @@ -1,71 +0,0 @@ -url = $url; - } - - /** - * Determines the URL of the asset on the dev server. - * - * @param WPSEO_Admin_Asset $asset The asset to determine the URL for. - * @param string $type The type of asset. Usually JS or CSS. - * - * @return string The URL of the asset. - */ - public function get_url( WPSEO_Admin_Asset $asset, $type ) { - if ( $type === WPSEO_Admin_Asset::TYPE_CSS ) { - return $this->get_default_url( $asset, $type ); - } - - $path = sprintf( 'js/dist/%s%s.js', $asset->get_src(), $asset->get_suffix() ); - - return trailingslashit( $this->url ) . $path; - } - - /** - * Determines the URL of the asset not using the dev server. - * - * @param WPSEO_Admin_Asset $asset The asset to determine the URL for. - * @param string $type The type of asset. - * - * @return string The URL of the asset file. - */ - public function get_default_url( WPSEO_Admin_Asset $asset, $type ) { - $default_location = new WPSEO_Admin_Asset_SEO_Location( WPSEO_FILE ); - - return $default_location->get_url( $asset, $type ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-location.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-location.php deleted file mode 100644 index 7d1c8c35..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-location.php +++ /dev/null @@ -1,22 +0,0 @@ -asset_location = $asset_location; - $this->prefix = $prefix; - } - - /** - * Enqueues scripts. - * - * @param string $script The name of the script to enqueue. - * - * @return void - */ - public function enqueue_script( $script ) { - wp_enqueue_script( $this->prefix . $script ); - } - - /** - * Enqueues styles. - * - * @param string $style The name of the style to enqueue. - * - * @return void - */ - public function enqueue_style( $style ) { - wp_enqueue_style( $this->prefix . $style ); - } - - /** - * Enqueues the appropriate language for the user. - * - * @return void - */ - public function enqueue_user_language_script() { - $this->enqueue_script( 'language-' . YoastSEO()->helpers->language->get_researcher_language() ); - } - - /** - * Registers scripts based on it's parameters. - * - * @param WPSEO_Admin_Asset $script The script to register. - * - * @return void - */ - public function register_script( WPSEO_Admin_Asset $script ) { - $url = $script->get_src() ? $this->get_url( $script, WPSEO_Admin_Asset::TYPE_JS ) : false; - - wp_register_script( - $this->prefix . $script->get_name(), - $url, - $script->get_deps(), - $script->get_version(), - $script->is_in_footer() - ); - - if ( in_array( 'wp-i18n', $script->get_deps(), true ) ) { - wp_set_script_translations( $this->prefix . $script->get_name(), 'wordpress-seo' ); - } - } - - /** - * Registers styles based on it's parameters. - * - * @param WPSEO_Admin_Asset $style The style to register. - * - * @return void - */ - public function register_style( WPSEO_Admin_Asset $style ) { - wp_register_style( - $this->prefix . $style->get_name(), - $this->get_url( $style, WPSEO_Admin_Asset::TYPE_CSS ), - $style->get_deps(), - $style->get_version(), - $style->get_media() - ); - } - - /** - * Calls the functions that register scripts and styles with the scripts and styles to be registered as arguments. - * - * @return void - */ - public function register_assets() { - $this->register_scripts( $this->scripts_to_be_registered() ); - $this->register_styles( $this->styles_to_be_registered() ); - } - - /** - * Registers all the scripts passed to it. - * - * @param array $scripts The scripts passed to it. - * - * @return void - */ - public function register_scripts( $scripts ) { - foreach ( $scripts as $script ) { - $script = new WPSEO_Admin_Asset( $script ); - $this->register_script( $script ); - } - } - - /** - * Registers all the styles it receives. - * - * @param array $styles Styles that need to be registered. - * - * @return void - */ - public function register_styles( $styles ) { - foreach ( $styles as $style ) { - $style = new WPSEO_Admin_Asset( $style ); - $this->register_style( $style ); - } - } - - /** - * Localizes the script. - * - * @param string $handle The script handle. - * @param string $object_name The object name. - * @param array $data The l10n data. - * - * @return void - */ - public function localize_script( $handle, $object_name, $data ) { - wp_localize_script( $this->prefix . $handle, $object_name, $data ); - } - - /** - * Adds an inline script. - * - * @param string $handle The script handle. - * @param string $data The l10n data. - * @param string $position Optional. Whether to add the inline script before the handle or after. - * - * @return void - */ - public function add_inline_script( $handle, $data, $position = 'after' ) { - wp_add_inline_script( $this->prefix . $handle, $data, $position ); - } - - /** - * A list of styles that shouldn't be registered but are needed in other locations in the plugin. - * - * @return array - */ - public function special_styles() { - $flat_version = $this->flatten_version( WPSEO_VERSION ); - $asset_args = [ - 'name' => 'inside-editor', - 'src' => 'inside-editor-' . $flat_version, - ]; - - return [ 'inside-editor' => new WPSEO_Admin_Asset( $asset_args ) ]; - } - - /** - * Flattens a version number for use in a filename. - * - * @param string $version The original version number. - * - * @return string The flattened version number. - */ - public function flatten_version( $version ) { - $parts = explode( '.', $version ); - - if ( count( $parts ) === 2 && preg_match( '/^\d+$/', $parts[1] ) === 1 ) { - $parts[] = '0'; - } - - return implode( '', $parts ); - } - - /** - * Creates a default location object for use in the admin asset manager. - * - * @return WPSEO_Admin_Asset_Location The location to use in the asset manager. - */ - public static function create_default_location() { - if ( defined( 'YOAST_SEO_DEV_SERVER' ) && YOAST_SEO_DEV_SERVER ) { - $url = defined( 'YOAST_SEO_DEV_SERVER_URL' ) ? YOAST_SEO_DEV_SERVER_URL : WPSEO_Admin_Asset_Dev_Server_Location::DEFAULT_URL; - - return new WPSEO_Admin_Asset_Dev_Server_Location( $url ); - } - - return new WPSEO_Admin_Asset_SEO_Location( WPSEO_FILE, false ); - } - - /** - * Checks if the given script is enqueued. - * - * @param string $script The script to check. - * - * @return bool True when the script is enqueued. - */ - public function is_script_enqueued( $script ) { - return wp_script_is( $this->prefix . $script ); - } - - /** - * Returns the scripts that need to be registered. - * - * @todo Data format is not self-documenting. Needs explanation inline. R. - * - * @return array The scripts that need to be registered. - */ - protected function scripts_to_be_registered() { - $header_scripts = [ - 'admin-global', - 'block-editor', - 'classic-editor', - 'post-edit', - 'help-scout-beacon', - 'redirect-old-features-tab', - ]; - $additional_dependencies = [ - 'analysis-worker' => [ self::PREFIX . 'analysis-package' ], - 'api-client' => [ 'wp-api' ], - 'crawl-settings' => [ 'jquery' ], - 'dashboard-widget' => [ self::PREFIX . 'api-client' ], - 'wincher-dashboard-widget' => [ self::PREFIX . 'api-client' ], - 'editor-modules' => [ 'jquery' ], - 'elementor' => [ - self::PREFIX . 'api-client', - self::PREFIX . 'externals-components', - self::PREFIX . 'externals-contexts', - self::PREFIX . 'externals-redux', - ], - 'indexation' => [ - 'jquery-ui-core', - 'jquery-ui-progressbar', - ], - 'first-time-configuration' => [ - self::PREFIX . 'api-client', - self::PREFIX . 'externals-components', - self::PREFIX . 'externals-contexts', - self::PREFIX . 'externals-redux', - ], - 'integrations-page' => [ - self::PREFIX . 'api-client', - self::PREFIX . 'externals-components', - self::PREFIX . 'externals-contexts', - self::PREFIX . 'externals-redux', - ], - 'post-edit' => [ - self::PREFIX . 'api-client', - self::PREFIX . 'block-editor', - self::PREFIX . 'externals-components', - self::PREFIX . 'externals-contexts', - self::PREFIX . 'externals-redux', - ], - 'reindex-links' => [ - 'jquery-ui-core', - 'jquery-ui-progressbar', - ], - 'settings' => [ - 'jquery-ui-core', - 'jquery-ui-progressbar', - self::PREFIX . 'api-client', - self::PREFIX . 'externals-components', - self::PREFIX . 'externals-contexts', - self::PREFIX . 'externals-redux', - ], - 'term-edit' => [ - self::PREFIX . 'api-client', - self::PREFIX . 'classic-editor', - self::PREFIX . 'externals-components', - self::PREFIX . 'externals-contexts', - self::PREFIX . 'externals-redux', - ], - ]; - - $plugin_scripts = $this->load_generated_asset_file( - [ - 'asset_file' => __DIR__ . '/../src/generated/assets/plugin.php', - 'ext_length' => 3, - 'additional_deps' => $additional_dependencies, - 'header_scripts' => $header_scripts, - ] - ); - $external_scripts = $this->load_generated_asset_file( - [ - 'asset_file' => __DIR__ . '/../src/generated/assets/externals.php', - 'ext_length' => 3, - 'suffix' => '-package', - 'base_dir' => 'externals/', - 'additional_deps' => $additional_dependencies, - 'header_scripts' => $header_scripts, - ] - ); - $language_scripts = $this->load_generated_asset_file( - [ - 'asset_file' => __DIR__ . '/../src/generated/assets/languages.php', - 'ext_length' => 3, - 'suffix' => '-language', - 'base_dir' => 'languages/', - 'additional_deps' => $additional_dependencies, - 'header_scripts' => $header_scripts, - ] - ); - $renamed_scripts = $this->load_renamed_scripts(); - - $scripts = array_merge( - $plugin_scripts, - $external_scripts, - $language_scripts, - $renamed_scripts - ); - - $scripts['installation-success'] = [ - 'name' => 'installation-success', - 'src' => 'installation-success.js', - 'deps' => [ - 'wp-a11y', - 'wp-dom-ready', - 'wp-components', - 'wp-element', - 'wp-i18n', - self::PREFIX . 'components-new-package', - self::PREFIX . 'externals-components', - ], - 'version' => $scripts['installation-success']['version'], - ]; - - $scripts['post-edit-classic'] = [ - 'name' => 'post-edit-classic', - 'src' => $scripts['post-edit']['src'], - 'deps' => array_map( - static function ( $dep ) { - if ( $dep === self::PREFIX . 'block-editor' ) { - return self::PREFIX . 'classic-editor'; - } - return $dep; - }, - $scripts['post-edit']['deps'] - ), - 'in_footer' => ! in_array( 'post-edit-classic', $header_scripts, true ), - 'version' => $scripts['post-edit']['version'], - ]; - - $scripts['workouts'] = [ - 'name' => 'workouts', - 'src' => 'workouts.js', - 'deps' => [ - 'clipboard', - 'lodash', - 'wp-api-fetch', - 'wp-a11y', - 'wp-components', - 'wp-compose', - 'wp-data', - 'wp-dom-ready', - 'wp-element', - 'wp-i18n', - self::PREFIX . 'externals-components', - self::PREFIX . 'externals-contexts', - self::PREFIX . 'externals-redux', - self::PREFIX . 'analysis', - self::PREFIX . 'react-select', - self::PREFIX . 'components-new-package', - ], - 'version' => $scripts['workouts']['version'], - ]; - - // Add the current language to every script that requires the analysis package. - foreach ( $scripts as $name => $script ) { - if ( substr( $name, -8 ) === 'language' ) { - continue; - } - if ( in_array( self::PREFIX . 'analysis-package', $script['deps'], true ) ) { - $scripts[ $name ]['deps'][] = self::PREFIX . YoastSEO()->helpers->language->get_researcher_language() . '-language'; - } - } - - return $scripts; - } - - /** - * Loads a generated asset file. - * - * @param array $args { - * The arguments. - * - * @type string $asset_file The asset file to load. - * @type int $ext_length The length of the extension, including suffix, of the filename. - * @type string $suffix Optional. The suffix of the asset name. - * @type array $additional_deps Optional. The additional dependencies assets may have. - * @type string $base_dir Optional. The base directory of the asset. - * @type string[] $header_scripts Optional. The script names that should be in the header. - * } - * - * @return array { - * The scripts to be registered. - * - * @type string $name The name of the asset. - * @type string $src The src of the asset. - * @type string[] $deps The dependenies of the asset. - * @type bool $in_footer Whether or not the asset should be in the footer. - * } - */ - protected function load_generated_asset_file( $args ) { - $args = wp_parse_args( - $args, - [ - 'suffix' => '', - 'additional_deps' => [], - 'base_dir' => '', - 'header_scripts' => [], - ] - ); - $scripts = []; - $assets = require $args['asset_file']; - foreach ( $assets as $file => $data ) { - $name = substr( $file, 0, -$args['ext_length'] ); - $name = strtolower( preg_replace( '/([A-Z])/', '-$1', $name ) ); - $name .= $args['suffix']; - - $deps = $data['dependencies']; - if ( isset( $args['additional_deps'][ $name ] ) ) { - $deps = array_merge( $deps, $args['additional_deps'][ $name ] ); - } - - $scripts[ $name ] = [ - 'name' => $name, - 'src' => $args['base_dir'] . $file, - 'deps' => $deps, - 'in_footer' => ! in_array( $name, $args['header_scripts'], true ), - 'version' => $data['version'], - ]; - } - - return $scripts; - } - - /** - * Loads the scripts that should be renamed for BC. - * - * @return array { - * The scripts to be registered. - * - * @type string $name The name of the asset. - * @type string $src The src of the asset. - * @type string[] $deps The dependenies of the asset. - * @type bool $in_footer Whether or not the asset should be in the footer. - * } - */ - protected function load_renamed_scripts() { - $scripts = []; - $renamed_scripts = [ - 'admin-global-script' => 'admin-global', - 'analysis' => 'analysis-package', - 'analysis-report' => 'analysis-report-package', - 'api' => 'api-client', - 'commons' => 'commons-package', - 'edit-page' => 'edit-page-script', - 'draft-js' => 'draft-js-package', - 'feature-flag' => 'feature-flag-package', - 'helpers' => 'helpers-package', - 'jed' => 'jed-package', - 'chart.js' => 'chart.js-package', - 'network-admin-script' => 'network-admin', - 'redux' => 'redux-package', - 'replacement-variable-editor' => 'replacement-variable-editor-package', - 'search-metadata-previews' => 'search-metadata-previews-package', - 'social-metadata-forms' => 'social-metadata-forms-package', - 'styled-components' => 'styled-components-package', - 'style-guide' => 'style-guide-package', - 'yoast-components' => 'components-new-package', - ]; - - foreach ( $renamed_scripts as $original => $replacement ) { - $scripts[] = [ - 'name' => $original, - 'src' => false, - 'deps' => [ self::PREFIX . $replacement ], - ]; - } - - return $scripts; - } - - /** - * Returns the styles that need to be registered. - * - * @todo Data format is not self-documenting. Needs explanation inline. R. - * - * @return array Styles that need to be registered. - */ - protected function styles_to_be_registered() { - $flat_version = $this->flatten_version( WPSEO_VERSION ); - - return [ - [ - 'name' => 'admin-css', - 'src' => 'yst_plugin_tools-' . $flat_version, - 'deps' => [ self::PREFIX . 'toggle-switch' ], - ], - [ - 'name' => 'toggle-switch', - 'src' => 'toggle-switch-' . $flat_version, - ], - [ - 'name' => 'dismissible', - 'src' => 'wpseo-dismissible-' . $flat_version, - ], - [ - 'name' => 'notifications', - 'src' => 'notifications-' . $flat_version, - ], - [ - 'name' => 'alert', - 'src' => 'alerts-' . $flat_version, - ], - [ - 'name' => 'edit-page', - 'src' => 'edit-page-' . $flat_version, - ], - [ - 'name' => 'featured-image', - 'src' => 'featured-image-' . $flat_version, - ], - [ - 'name' => 'metabox-css', - 'src' => 'metabox-' . $flat_version, - 'deps' => [ - self::PREFIX . 'admin-css', - self::PREFIX . 'tailwind', - 'wp-components', - ], - ], - [ - 'name' => 'ai-generator', - 'src' => 'ai-generator-' . $flat_version, - 'deps' => [ - self::PREFIX . 'tailwind', - self::PREFIX . 'introductions', - ], - ], - [ - 'name' => 'introductions', - 'src' => 'introductions-' . $flat_version, - 'deps' => [ self::PREFIX . 'tailwind' ], - ], - [ - 'name' => 'wp-dashboard', - 'src' => 'dashboard-' . $flat_version, - ], - [ - 'name' => 'scoring', - 'src' => 'yst_seo_score-' . $flat_version, - ], - [ - 'name' => 'adminbar', - 'src' => 'adminbar-' . $flat_version, - 'deps' => [ - 'admin-bar', - ], - ], - [ - 'name' => 'primary-category', - 'src' => 'metabox-primary-category-' . $flat_version, - ], - [ - 'name' => 'admin-global', - 'src' => 'admin-global-' . $flat_version, - ], - [ - 'name' => 'extensions', - 'src' => 'yoast-extensions-' . $flat_version, - 'deps' => [ - 'wp-components', - ], - ], - [ - 'name' => 'filter-explanation', - 'src' => 'filter-explanation-' . $flat_version, - ], - [ - 'name' => 'monorepo', - 'src' => 'monorepo-' . $flat_version, - ], - [ - 'name' => 'structured-data-blocks', - 'src' => 'structured-data-blocks-' . $flat_version, - 'deps' => [ - 'dashicons', - 'forms', - 'wp-edit-blocks', - ], - ], - [ - 'name' => 'elementor', - 'src' => 'elementor-' . $flat_version, - ], - [ - 'name' => 'tailwind', - 'src' => 'tailwind-' . $flat_version, - ], - [ - 'name' => 'new-settings', - 'src' => 'new-settings-' . $flat_version, - 'deps' => [ self::PREFIX . 'tailwind' ], - ], - [ - 'name' => 'black-friday-banner', - 'src' => 'black-friday-banner-' . $flat_version, - 'deps' => [ self::PREFIX . 'tailwind' ], - ], - [ - 'name' => 'academy', - 'src' => 'academy-' . $flat_version, - 'deps' => [ self::PREFIX . 'tailwind' ], - ], - [ - 'name' => 'support', - 'src' => 'support-' . $flat_version, - 'deps' => [ self::PREFIX . 'tailwind' ], - ], - [ - 'name' => 'workouts', - 'src' => 'workouts-' . $flat_version, - 'deps' => [ - self::PREFIX . 'monorepo', - ], - ], - [ - 'name' => 'first-time-configuration', - 'src' => 'first-time-configuration-' . $flat_version, - 'deps' => [ self::PREFIX . 'tailwind' ], - ], - [ - 'name' => 'inside-editor', - 'src' => 'inside-editor-' . $flat_version, - ], - ]; - } - - /** - * Determines the URL of the asset. - * - * @param WPSEO_Admin_Asset $asset The asset to determine the URL for. - * @param string $type The type of asset. Usually JS or CSS. - * - * @return string The URL of the asset. - */ - protected function get_url( WPSEO_Admin_Asset $asset, $type ) { - $scheme = wp_parse_url( $asset->get_src(), PHP_URL_SCHEME ); - if ( in_array( $scheme, [ 'http', 'https' ], true ) ) { - return $asset->get_src(); - } - - return $this->asset_location->get_url( $asset, $type ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-seo-location.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-seo-location.php deleted file mode 100644 index 6774ebd6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-seo-location.php +++ /dev/null @@ -1,86 +0,0 @@ -plugin_file = $plugin_file; - $this->add_suffix = $add_suffix; - } - - /** - * Determines the URL of the asset on the dev server. - * - * @param WPSEO_Admin_Asset $asset The asset to determine the URL for. - * @param string $type The type of asset. Usually JS or CSS. - * - * @return string The URL of the asset. - */ - public function get_url( WPSEO_Admin_Asset $asset, $type ) { - $path = $this->get_path( $asset, $type ); - if ( empty( $path ) ) { - return ''; - } - - return plugins_url( $path, $this->plugin_file ); - } - - /** - * Determines the path relative to the plugin folder of an asset. - * - * @param WPSEO_Admin_Asset $asset The asset to determine the path for. - * @param string $type The type of asset. - * - * @return string The path to the asset file. - */ - protected function get_path( WPSEO_Admin_Asset $asset, $type ) { - $relative_path = ''; - $rtl_suffix = ''; - - switch ( $type ) { - case WPSEO_Admin_Asset::TYPE_JS: - $relative_path = 'js/dist/' . $asset->get_src(); - if ( $this->add_suffix ) { - $relative_path .= $asset->get_suffix() . '.js'; - } - break; - - case WPSEO_Admin_Asset::TYPE_CSS: - // Path and suffix for RTL stylesheets. - if ( is_rtl() && $asset->has_rtl() ) { - $rtl_suffix = '-rtl'; - } - $relative_path = 'css/dist/' . $asset->get_src() . $rtl_suffix . $asset->get_suffix() . '.css'; - break; - } - - return $relative_path; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-editor-specific-replace-vars.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin-editor-specific-replace-vars.php deleted file mode 100644 index 781ce099..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-editor-specific-replace-vars.php +++ /dev/null @@ -1,227 +0,0 @@ - [ 'id', 'pt_single', 'pt_plural', 'parent_title' ], - 'post' => [ 'id', 'term404', 'pt_single', 'pt_plural' ], - // Custom post type. - 'custom_post_type' => [ 'id', 'term404', 'pt_single', 'pt_plural', 'parent_title' ], - // Settings - archive pages. - 'custom-post-type_archive' => [ 'pt_single', 'pt_plural' ], - - // Taxonomies. - 'category' => [ 'term_title', 'term_description', 'category_description', 'parent_title', 'term_hierarchy' ], - 'post_tag' => [ 'term_title', 'term_description', 'tag_description' ], - 'post_format' => [ 'term_title' ], - // Custom taxonomy. - 'term-in-custom-taxonomy' => [ 'term_title', 'term_description', 'category_description', 'parent_title', 'term_hierarchy' ], - - // Settings - special pages. - 'search' => [ 'searchphrase' ], - ]; - - /** - * WPSEO_Admin_Editor_Specific_Replace_Vars constructor. - */ - public function __construct() { - $this->add_for_page_types( - [ 'page', 'post', 'custom_post_type' ], - WPSEO_Custom_Fields::get_custom_fields() - ); - - $this->add_for_page_types( - [ 'post', 'term-in-custom-taxonomy' ], - WPSEO_Custom_Taxonomies::get_custom_taxonomies() - ); - } - - /** - * Retrieves the editor specific replacement variables. - * - * @return array The editor specific replacement variables. - */ - public function get() { - /** - * Filter: Adds the possibility to add extra editor specific replacement variables. - * - * @param array $replacement_variables Array of editor specific replace vars. - */ - $replacement_variables = apply_filters( - 'wpseo_editor_specific_replace_vars', - $this->replacement_variables - ); - - if ( ! is_array( $replacement_variables ) ) { - $replacement_variables = $this->replacement_variables; - } - - return array_filter( $replacement_variables, 'is_array' ); - } - - /** - * Retrieves the generic replacement variable names. - * - * Which are the replacement variables without the editor specific ones. - * - * @param array $replacement_variables Possibly generic replacement variables. - * - * @return array The generic replacement variable names. - */ - public function get_generic( $replacement_variables ) { - $shared_variables = array_diff( - $this->extract_names( $replacement_variables ), - $this->get_unique_replacement_variables() - ); - - return array_values( $shared_variables ); - } - - /** - * Determines the page type of the current term. - * - * @param string $taxonomy The taxonomy name. - * - * @return string The page type. - */ - public function determine_for_term( $taxonomy ) { - $replacement_variables = $this->get(); - if ( array_key_exists( $taxonomy, $replacement_variables ) ) { - return $taxonomy; - } - - return 'term-in-custom-taxonomy'; - } - - /** - * Determines the page type of the current post. - * - * @param WP_Post $post A WordPress post instance. - * - * @return string The page type. - */ - public function determine_for_post( $post ) { - if ( $post instanceof WP_Post === false ) { - return 'post'; - } - - $replacement_variables = $this->get(); - if ( array_key_exists( $post->post_type, $replacement_variables ) ) { - return $post->post_type; - } - - return 'custom_post_type'; - } - - /** - * Determines the page type for a post type. - * - * @param string $post_type The name of the post_type. - * @param string $fallback The page type to fall back to. - * - * @return string The page type. - */ - public function determine_for_post_type( $post_type, $fallback = 'custom_post_type' ) { - if ( ! $this->has_for_page_type( $post_type ) ) { - return $fallback; - } - - return $post_type; - } - - /** - * Determines the page type for an archive page. - * - * @param string $name The name of the archive. - * @param string $fallback The page type to fall back to. - * - * @return string The page type. - */ - public function determine_for_archive( $name, $fallback = 'custom-post-type_archive' ) { - $page_type = $name . '_archive'; - - if ( ! $this->has_for_page_type( $page_type ) ) { - return $fallback; - } - - return $page_type; - } - - /** - * Adds the replavement variables for the given page types. - * - * @param array $page_types Page types to add variables for. - * @param array $replacement_variables_to_add The variables to add. - * - * @return void - */ - protected function add_for_page_types( array $page_types, array $replacement_variables_to_add ) { - if ( empty( $replacement_variables_to_add ) ) { - return; - } - - $replacement_variables_to_add = array_fill_keys( $page_types, $replacement_variables_to_add ); - $replacement_variables = $this->replacement_variables; - - $this->replacement_variables = array_merge_recursive( $replacement_variables, $replacement_variables_to_add ); - } - - /** - * Extracts the names from the given replacements variables. - * - * @param array $replacement_variables Replacement variables to extract the name from. - * - * @return array Extracted names. - */ - protected function extract_names( $replacement_variables ) { - $extracted_names = []; - - foreach ( $replacement_variables as $replacement_variable ) { - if ( empty( $replacement_variable['name'] ) ) { - continue; - } - - $extracted_names[] = $replacement_variable['name']; - } - - return $extracted_names; - } - - /** - * Returns whether the given page type has editor specific replace vars. - * - * @param string $page_type The page type to check. - * - * @return bool True if there are associated editor specific replace vars. - */ - protected function has_for_page_type( $page_type ) { - $replacement_variables = $this->get(); - - return ( ! empty( $replacement_variables[ $page_type ] ) && is_array( $replacement_variables[ $page_type ] ) ); - } - - /** - * Merges all editor specific replacement variables into one array and removes duplicates. - * - * @return array The list of unique editor specific replacement variables. - */ - protected function get_unique_replacement_variables() { - $merged_replacement_variables = call_user_func_array( 'array_merge', array_values( $this->get() ) ); - - return array_unique( $merged_replacement_variables ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-gutenberg-compatibility-notification.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin-gutenberg-compatibility-notification.php deleted file mode 100644 index 8f521de3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-gutenberg-compatibility-notification.php +++ /dev/null @@ -1,105 +0,0 @@ -compatibility_checker = new WPSEO_Gutenberg_Compatibility(); - $this->notification_center = Yoast_Notification_Center::get(); - } - - /** - * Registers all hooks to WordPress. - * - * @return void - */ - public function register_hooks() { - add_action( 'admin_init', [ $this, 'manage_notification' ] ); - } - - /** - * Manages if the notification should be shown or removed. - * - * @return void - */ - public function manage_notification() { - /** - * Filter: 'yoast_display_gutenberg_compat_notification' - Allows developer to disable the Gutenberg compatibility - * notification. - * - * @param bool $display_notification - */ - $display_notification = apply_filters( 'yoast_display_gutenberg_compat_notification', true ); - - if ( - ! $this->compatibility_checker->is_installed() - || $this->compatibility_checker->is_fully_compatible() - || ! $display_notification - ) { - $this->notification_center->remove_notification_by_id( $this->notification_id ); - - return; - } - - $this->add_notification(); - } - - /** - * Adds the notification to the notificaton center. - * - * @return void - */ - protected function add_notification() { - $level = $this->compatibility_checker->is_below_minimum() ? Yoast_Notification::ERROR : Yoast_Notification::WARNING; - - $message = sprintf( - /* translators: %1$s expands to Yoast SEO, %2$s expands to the installed version, %3$s expands to Gutenberg */ - __( '%1$s detected you are using version %2$s of %3$s, please update to the latest version to prevent compatibility issues.', 'wordpress-seo' ), - 'Yoast SEO', - $this->compatibility_checker->get_installed_version(), - 'Gutenberg' - ); - - $notification = new Yoast_Notification( - $message, - [ - 'id' => $this->notification_id, - 'type' => $level, - 'priority' => 1, - ] - ); - - $this->notification_center->add_notification( $notification ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-help-panel.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin-help-panel.php deleted file mode 100644 index 6fdb6c2f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-help-panel.php +++ /dev/null @@ -1,104 +0,0 @@ -id = $id; - $this->help_button_text = $help_button_text; - $this->help_content = $help_content; - $this->wrapper = $wrapper; - } - - /** - * Returns the html for the Help Button. - * - * @return string - */ - public function get_button_html() { - - if ( ! $this->id || ! $this->help_button_text || ! $this->help_content ) { - return ''; - } - - return sprintf( - ' ', - esc_attr( $this->id ), - $this->help_button_text - ); - } - - /** - * Returns the html for the Help Panel. - * - * @return string - */ - public function get_panel_html() { - - if ( ! $this->id || ! $this->help_button_text || ! $this->help_content ) { - return ''; - } - - $wrapper_start = ''; - $wrapper_end = ''; - - if ( $this->wrapper === 'has-wrapper' ) { - $wrapper_start = '
              '; - $wrapper_end = '
              '; - } - - return sprintf( - '%1$s

              %3$s

              %4$s', - $wrapper_start, - esc_attr( $this->id ), - $this->help_content, - $wrapper_end - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-init.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin-init.php deleted file mode 100644 index 168e789a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-init.php +++ /dev/null @@ -1,379 +0,0 @@ -pagenow = $GLOBALS['pagenow']; - - $this->asset_manager = new WPSEO_Admin_Asset_Manager(); - - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_dismissible' ] ); - add_action( 'admin_init', [ $this, 'unsupported_php_notice' ], 15 ); - add_action( 'admin_init', [ $this, 'remove_translations_notification' ], 15 ); - add_action( 'admin_init', [ $this->asset_manager, 'register_assets' ] ); - add_action( 'admin_init', [ $this, 'show_hook_deprecation_warnings' ] ); - add_action( 'admin_init', [ 'WPSEO_Plugin_Conflict', 'hook_check_for_plugin_conflicts' ] ); - add_action( 'admin_notices', [ $this, 'permalink_settings_notice' ] ); - add_action( 'post_submitbox_misc_actions', [ $this, 'add_publish_box_section' ] ); - - $this->load_meta_boxes(); - $this->load_taxonomy_class(); - $this->load_admin_page_class(); - $this->load_admin_user_class(); - $this->load_xml_sitemaps_admin(); - $this->load_plugin_suggestions(); - } - - /** - * Enqueue our styling for dismissible yoast notifications. - * - * @return void - */ - public function enqueue_dismissible() { - $this->asset_manager->enqueue_style( 'dismissible' ); - } - - /** - * Removes any notification for incomplete translations. - * - * @return void - */ - public function remove_translations_notification() { - $notification_center = Yoast_Notification_Center::get(); - $notification_center->remove_notification_by_id( 'i18nModuleTranslationAssistance' ); - } - - /** - * Creates an unsupported PHP version notification in the notification center. - * - * @return void - */ - public function unsupported_php_notice() { - $notification_center = Yoast_Notification_Center::get(); - $notification_center->remove_notification_by_id( 'wpseo-dismiss-unsupported-php' ); - } - - /** - * Gets the latest released major WordPress version from the WordPress stable-check api. - * - * @return float|int The latest released major WordPress version. 0 when the stable-check API doesn't respond. - */ - private function get_latest_major_wordpress_version() { - $core_updates = get_core_updates( [ 'dismissed' => true ] ); - - if ( $core_updates === false ) { - return 0; - } - - $wp_version_latest = get_bloginfo( 'version' ); - foreach ( $core_updates as $update ) { - if ( $update->response === 'upgrade' && version_compare( $update->version, $wp_version_latest, '>' ) ) { - $wp_version_latest = $update->version; - } - } - - // Strip the patch version and convert to a float. - return (float) $wp_version_latest; - } - - /** - * Helper to verify if the user is currently visiting one of our admin pages. - * - * @return bool - */ - private function on_wpseo_admin_page() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( ! isset( $_GET['page'] ) || ! is_string( $_GET['page'] ) ) { - return false; - } - - if ( $this->pagenow !== 'admin.php' ) { - return false; - } - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - $current_page = sanitize_text_field( wp_unslash( $_GET['page'] ) ); - return strpos( $current_page, 'wpseo' ) === 0; - } - - /** - * Whether we should load the meta box classes. - * - * @return bool true if we should load the meta box classes, false otherwise. - */ - private function should_load_meta_boxes() { - /** - * Filter: 'wpseo_always_register_metaboxes_on_admin' - Allow developers to change whether - * the WPSEO metaboxes are only registered on the typical pages (lean loading) or always - * registered when in admin. - * - * @param bool $register_metaboxes Whether to always register the metaboxes or not. Defaults to false. - */ - if ( apply_filters( 'wpseo_always_register_metaboxes_on_admin', false ) ) { - return true; - } - - // If we are in a post editor. - if ( WPSEO_Metabox::is_post_overview( $this->pagenow ) || WPSEO_Metabox::is_post_edit( $this->pagenow ) ) { - return true; - } - - // If we are doing an inline save. - if ( check_ajax_referer( 'inlineeditnonce', '_inline_edit', false ) && isset( $_POST['action'] ) && sanitize_text_field( wp_unslash( $_POST['action'] ) ) === 'inline-save' ) { - return true; - } - - return false; - } - - /** - * Determine whether we should load the meta box class and if so, load it. - * - * @return void - */ - private function load_meta_boxes() { - if ( $this->should_load_meta_boxes() ) { - $GLOBALS['wpseo_metabox'] = new WPSEO_Metabox(); - $GLOBALS['wpseo_meta_columns'] = new WPSEO_Meta_Columns(); - } - } - - /** - * Determine if we should load our taxonomy edit class and if so, load it. - * - * @return void - */ - private function load_taxonomy_class() { - if ( - WPSEO_Taxonomy::is_term_edit( $this->pagenow ) - || WPSEO_Taxonomy::is_term_overview( $this->pagenow ) - ) { - new WPSEO_Taxonomy(); - } - } - - /** - * Determine if we should load our admin pages class and if so, load it. - * - * Loads admin page class for all admin pages starting with `wpseo_`. - * - * @return void - */ - private function load_admin_user_class() { - if ( in_array( $this->pagenow, [ 'user-edit.php', 'profile.php' ], true ) - && current_user_can( 'edit_users' ) - ) { - new WPSEO_Admin_User_Profile(); - } - } - - /** - * Determine if we should load our admin pages class and if so, load it. - * - * Loads admin page class for all admin pages starting with `wpseo_`. - * - * @return void - */ - private function load_admin_page_class() { - - if ( $this->on_wpseo_admin_page() ) { - // For backwards compatabilty, this still needs a global, for now... - $GLOBALS['wpseo_admin_pages'] = new WPSEO_Admin_Pages(); - - $page = null; - - // 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'] ) ); - } - - // Only renders Yoast SEO Premium upsells when the page is a Yoast SEO page. - if ( $page !== null && WPSEO_Utils::is_yoast_seo_free_page( $page ) ) { - $this->register_premium_upsell_admin_block(); - } - } - } - - /** - * Loads the plugin suggestions. - * - * @return void - */ - private function load_plugin_suggestions() { - $suggestions = new WPSEO_Suggested_Plugins( new WPSEO_Plugin_Availability(), Yoast_Notification_Center::get() ); - $suggestions->register_hooks(); - } - - /** - * Registers the Premium Upsell Admin Block. - * - * @return void - */ - private function register_premium_upsell_admin_block() { - if ( ! YoastSEO()->helpers->product->is_premium() ) { - $upsell_block = new WPSEO_Premium_Upsell_Admin_Block( 'wpseo_admin_promo_footer' ); - $upsell_block->register_hooks(); - } - } - - /** - * See if we should start our XML Sitemaps Admin class. - * - * @return void - */ - private function load_xml_sitemaps_admin() { - if ( WPSEO_Options::get( 'enable_xml_sitemap', false ) ) { - new WPSEO_Sitemaps_Admin(); - } - } - - /** - * Shows deprecation warnings to the user if a plugin has registered a filter we have deprecated. - * - * @return void - */ - public function show_hook_deprecation_warnings() { - global $wp_filter; - - if ( wp_doing_ajax() ) { - return; - } - - // WordPress hooks that have been deprecated since a Yoast SEO version. - $deprecated_filters = [ - 'wpseo_genesis_force_adjacent_rel_home' => [ - 'version' => '9.4', - 'alternative' => null, - ], - 'wpseo_opengraph' => [ - 'version' => '14.0', - 'alternative' => null, - ], - 'wpseo_twitter' => [ - 'version' => '14.0', - 'alternative' => null, - ], - 'wpseo_twitter_taxonomy_image' => [ - 'version' => '14.0', - 'alternative' => null, - ], - 'wpseo_twitter_metatag_key' => [ - 'version' => '14.0', - 'alternative' => null, - ], - 'wp_seo_get_bc_ancestors' => [ - 'version' => '14.0', - 'alternative' => 'wpseo_breadcrumb_links', - ], - 'validate_facebook_app_id_api_response_code' => [ - 'version' => '15.5', - 'alternative' => null, - ], - 'validate_facebook_app_id_api_response_body' => [ - 'version' => '15.5', - 'alternative' => null, - ], - ]; - - // Determine which filters have been registered. - $deprecated_notices = array_intersect( - array_keys( $deprecated_filters ), - array_keys( $wp_filter ) - ); - - // Show notice for each deprecated filter or action that has been registered. - foreach ( $deprecated_notices as $deprecated_filter ) { - $deprecation_info = $deprecated_filters[ $deprecated_filter ]; - // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped -- Only uses the hardcoded values from above. - _deprecated_hook( - $deprecated_filter, - 'WPSEO ' . $deprecation_info['version'], - $deprecation_info['alternative'] - ); - // phpcs:enable - } - } - - /** - * Check if the permalink uses %postname%. - * - * @return bool - */ - private function has_postname_in_permalink() { - return ( strpos( get_option( 'permalink_structure' ), '%postname%' ) !== false ); - } - - /** - * Shows a notice on the permalink settings page. - * - * @return void - */ - public function permalink_settings_notice() { - global $pagenow; - - if ( $pagenow === 'options-permalink.php' ) { - printf( - '

              %1$s
              %2$s
              %4$s

              ', - esc_html__( 'WARNING:', 'wordpress-seo' ), - sprintf( - /* translators: %1$s and %2$s expand to items to emphasize the word in the middle. */ - esc_html__( 'Changing your permalinks settings can seriously impact your search engine visibility. It should almost %1$s never %2$s be done on a live website.', 'wordpress-seo' ), - '', - '' - ), - esc_url( WPSEO_Shortlinker::get( 'https://yoa.st/why-permalinks/' ) ), - // The link's content. - esc_html__( 'Learn about why permalinks are important for SEO.', 'wordpress-seo' ) - ); - } - } - - /** - * Adds a custom Yoast section within the Classic Editor publish box. - * - * @param WP_Post $post The current post object. - * - * @return void - */ - public function add_publish_box_section( $post ) { - if ( in_array( $this->pagenow, [ 'post.php', 'post-new.php' ], true ) ) { - ?> -
              - [ 'sitename', 'title', 'sep', 'primary_category' ], - 'post' => [ 'sitename', 'title', 'sep', 'primary_category' ], - // Homepage. - 'homepage' => [ 'sitename', 'sitedesc', 'sep' ], - // Custom post type. - 'custom_post_type' => [ 'sitename', 'title', 'sep' ], - - // Taxonomies. - 'category' => [ 'sitename', 'term_title', 'sep', 'term_hierarchy' ], - 'post_tag' => [ 'sitename', 'term_title', 'sep' ], - 'post_format' => [ 'sitename', 'term_title', 'sep', 'page' ], - - // Custom taxonomy. - 'term-in-custom-taxonomy' => [ 'sitename', 'term_title', 'sep', 'term_hierarchy' ], - - // Settings - archive pages. - 'author_archive' => [ 'sitename', 'title', 'sep', 'page' ], - 'date_archive' => [ 'sitename', 'sep', 'date', 'page' ], - 'custom-post-type_archive' => [ 'sitename', 'title', 'sep', 'page' ], - - // Settings - special pages. - 'search' => [ 'sitename', 'searchphrase', 'sep', 'page' ], - '404' => [ 'sitename', 'sep' ], - ]; - - /** - * Determines the page type of the current term. - * - * @param string $taxonomy The taxonomy name. - * - * @return string The page type. - */ - public function determine_for_term( $taxonomy ) { - $recommended_replace_vars = $this->get_recommended_replacevars(); - if ( array_key_exists( $taxonomy, $recommended_replace_vars ) ) { - return $taxonomy; - } - - return 'term-in-custom-taxonomy'; - } - - /** - * Determines the page type of the current post. - * - * @param WP_Post $post A WordPress post instance. - * - * @return string The page type. - */ - public function determine_for_post( $post ) { - if ( $post instanceof WP_Post === false ) { - return 'post'; - } - - if ( $post->post_type === 'page' && $this->is_homepage( $post ) ) { - return 'homepage'; - } - - $recommended_replace_vars = $this->get_recommended_replacevars(); - if ( array_key_exists( $post->post_type, $recommended_replace_vars ) ) { - return $post->post_type; - } - - return 'custom_post_type'; - } - - /** - * Determines the page type for a post type. - * - * @param string $post_type The name of the post_type. - * @param string $fallback The page type to fall back to. - * - * @return string The page type. - */ - public function determine_for_post_type( $post_type, $fallback = 'custom_post_type' ) { - $page_type = $post_type; - $recommended_replace_vars = $this->get_recommended_replacevars(); - $has_recommended_replacevars = $this->has_recommended_replace_vars( $recommended_replace_vars, $page_type ); - - if ( ! $has_recommended_replacevars ) { - return $fallback; - } - - return $page_type; - } - - /** - * Determines the page type for an archive page. - * - * @param string $name The name of the archive. - * @param string $fallback The page type to fall back to. - * - * @return string The page type. - */ - public function determine_for_archive( $name, $fallback = 'custom-post-type_archive' ) { - $page_type = $name . '_archive'; - $recommended_replace_vars = $this->get_recommended_replacevars(); - $has_recommended_replacevars = $this->has_recommended_replace_vars( $recommended_replace_vars, $page_type ); - - if ( ! $has_recommended_replacevars ) { - return $fallback; - } - - return $page_type; - } - - /** - * Retrieves the recommended replacement variables for the given page type. - * - * @param string $page_type The page type. - * - * @return array The recommended replacement variables. - */ - public function get_recommended_replacevars_for( $page_type ) { - $recommended_replace_vars = $this->get_recommended_replacevars(); - $has_recommended_replace_vars = $this->has_recommended_replace_vars( $recommended_replace_vars, $page_type ); - - if ( ! $has_recommended_replace_vars ) { - return []; - } - - return $recommended_replace_vars[ $page_type ]; - } - - /** - * Retrieves the recommended replacement variables. - * - * @return array The recommended replacement variables. - */ - public function get_recommended_replacevars() { - /** - * Filter: Adds the possibility to add extra recommended replacement variables. - * - * @param array $additional_replace_vars Empty array to add the replacevars to. - */ - $recommended_replace_vars = apply_filters( 'wpseo_recommended_replace_vars', $this->recommended_replace_vars ); - - if ( ! is_array( $recommended_replace_vars ) ) { - return $this->recommended_replace_vars; - } - - return $recommended_replace_vars; - } - - /** - * Returns whether the given page type has recommended replace vars. - * - * @param array $recommended_replace_vars The recommended replace vars - * to check in. - * @param string $page_type The page type to check. - * - * @return bool True if there are associated recommended replace vars. - */ - private function has_recommended_replace_vars( $recommended_replace_vars, $page_type ) { - if ( ! isset( $recommended_replace_vars[ $page_type ] ) ) { - return false; - } - - if ( ! is_array( $recommended_replace_vars[ $page_type ] ) ) { - return false; - } - - return true; - } - - /** - * Determines whether or not a post is the homepage. - * - * @param WP_Post $post The WordPress global post object. - * - * @return bool True if the given post is the homepage. - */ - private function is_homepage( $post ) { - if ( $post instanceof WP_Post === false ) { - return false; - } - - /* - * The page on front returns a string with normal WordPress interaction, while the post ID is an int. - * This way we make sure we always compare strings. - */ - $post_id = (int) $post->ID; - $page_on_front = (int) get_option( 'page_on_front' ); - - return get_option( 'show_on_front' ) === 'page' && $page_on_front === $post_id; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-user-profile.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin-user-profile.php deleted file mode 100644 index ceb23520..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-user-profile.php +++ /dev/null @@ -1,87 +0,0 @@ -%s', - $install_url, - $plugin['title'] - ); - } - - /** - * Gets a visually hidden accessible message for links that open in a new browser tab. - * - * @return string The visually hidden accessible message. - */ - public static function get_new_tab_message() { - return sprintf( - '%s', - /* translators: Hidden accessibility text. */ - esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' ) - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin.php deleted file mode 100644 index a5d09b29..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin.php +++ /dev/null @@ -1,403 +0,0 @@ -register_hooks(); - - if ( is_multisite() ) { - WPSEO_Options::maybe_set_multisite_defaults( false ); - } - - if ( WPSEO_Options::get( 'stripcategorybase' ) === true ) { - add_action( 'created_category', [ $this, 'schedule_rewrite_flush' ] ); - add_action( 'edited_category', [ $this, 'schedule_rewrite_flush' ] ); - add_action( 'delete_category', [ $this, 'schedule_rewrite_flush' ] ); - } - - if ( WPSEO_Options::get( 'disable-attachment' ) === true ) { - add_filter( 'wpseo_accessible_post_types', [ 'WPSEO_Post_Type', 'filter_attachment_post_type' ] ); - } - - add_filter( 'plugin_action_links_' . WPSEO_BASENAME, [ $this, 'add_action_link' ], 10, 2 ); - add_filter( 'network_admin_plugin_action_links_' . WPSEO_BASENAME, [ $this, 'add_action_link' ], 10, 2 ); - - add_action( 'admin_enqueue_scripts', [ $this, 'config_page_scripts' ] ); - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_global_style' ] ); - - add_action( 'after_switch_theme', [ $this, 'switch_theme' ] ); - add_action( 'switch_theme', [ $this, 'switch_theme' ] ); - - add_filter( 'set-screen-option', [ $this, 'save_bulk_edit_options' ], 10, 3 ); - - add_action( 'admin_init', [ 'WPSEO_Plugin_Conflict', 'hook_check_for_plugin_conflicts' ], 10, 1 ); - - add_action( 'admin_init', [ $this, 'map_manage_options_cap' ] ); - - WPSEO_Sitemaps_Cache::register_clear_on_option_update( 'wpseo' ); - WPSEO_Sitemaps_Cache::register_clear_on_option_update( 'home' ); - - if ( YoastSEO()->helpers->current_page->is_yoast_seo_page() ) { - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - } - - $this->set_upsell_notice(); - - $this->initialize_cornerstone_content(); - - if ( WPSEO_Utils::is_plugin_network_active() ) { - $integrations[] = new Yoast_Network_Admin(); - } - - $this->admin_features = [ - 'dashboard_widget' => new Yoast_Dashboard_Widget(), - 'wincher_dashboard_widget' => new Wincher_Dashboard_Widget(), - ]; - - if ( WPSEO_Metabox::is_post_overview( $pagenow ) || WPSEO_Metabox::is_post_edit( $pagenow ) ) { - $this->admin_features['primary_category'] = new WPSEO_Primary_Term_Admin(); - } - - $integrations[] = new WPSEO_Yoast_Columns(); - $integrations[] = new WPSEO_Statistic_Integration(); - $integrations[] = new WPSEO_Capability_Manager_Integration( WPSEO_Capability_Manager_Factory::get() ); - $integrations[] = new WPSEO_Admin_Gutenberg_Compatibility_Notification(); - $integrations[] = new WPSEO_Expose_Shortlinks(); - $integrations[] = new WPSEO_MyYoast_Proxy(); - $integrations[] = new WPSEO_Schema_Person_Upgrade_Notification(); - $integrations[] = new WPSEO_Tracking( 'https://tracking.yoast.com/stats', ( WEEK_IN_SECONDS * 2 ) ); - $integrations[] = new WPSEO_Admin_Settings_Changed_Listener(); - - $integrations = array_merge( - $integrations, - $this->get_admin_features(), - $this->initialize_cornerstone_content() - ); - - foreach ( $integrations as $integration ) { - $integration->register_hooks(); - } - } - - /** - * Schedules a rewrite flush to happen at shutdown. - * - * @return void - */ - public function schedule_rewrite_flush() { - // Bail if this is a multisite installation and the site has been switched. - if ( is_multisite() && ms_is_switched() ) { - return; - } - - add_action( 'shutdown', 'flush_rewrite_rules' ); - } - - /** - * Returns all the classes for the admin features. - * - * @return array - */ - public function get_admin_features() { - return $this->admin_features; - } - - /** - * Register assets needed on admin pages. - * - * @return void - */ - public function enqueue_assets() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form data. - $page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; - if ( $page === 'wpseo_licenses' ) { - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_style( 'extensions' ); - } - } - - /** - * Returns the manage_options capability. - * - * @return string The capability to use. - */ - public function get_manage_options_cap() { - /** - * Filter: 'wpseo_manage_options_capability' - Allow changing the capability users need to view the settings pages. - * - * @param string $capability The capability. - */ - return apply_filters( 'wpseo_manage_options_capability', 'wpseo_manage_options' ); - } - - /** - * Maps the manage_options cap on saving an options page to wpseo_manage_options. - * - * @return void - */ - public function map_manage_options_cap() { - // phpcs:ignore WordPress.Security -- The variable is only used in strpos and thus safe to not unslash or sanitize. - $option_page = ! empty( $_POST['option_page'] ) ? $_POST['option_page'] : ''; - - if ( strpos( $option_page, 'yoast_wpseo' ) === 0 || strpos( $option_page, Settings_Integration::PAGE ) === 0 ) { - add_filter( 'option_page_capability_' . $option_page, [ $this, 'get_manage_options_cap' ] ); - } - } - - /** - * Adds the ability to choose how many posts are displayed per page - * on the bulk edit pages. - * - * @return void - */ - public function bulk_edit_options() { - $option = 'per_page'; - $args = [ - 'label' => __( 'Posts', 'wordpress-seo' ), - 'default' => 10, - 'option' => 'wpseo_posts_per_page', - ]; - add_screen_option( $option, $args ); - } - - /** - * Saves the posts per page limit for bulk edit pages. - * - * @param int $status Status value to pass through. - * @param string $option Option name. - * @param int $value Count value to check. - * - * @return int - */ - public function save_bulk_edit_options( $status, $option, $value ) { - if ( $option && ( $value > 0 && $value < 1000 ) === 'wpseo_posts_per_page' ) { - return $value; - } - - return $status; - } - - /** - * Adds links to Premium Support and FAQ under the plugin in the plugin overview page. - * - * @param array $links Array of links for the plugins, adapted when the current plugin is found. - * @param string $file The filename for the current plugin, which the filter loops through. - * - * @return array - */ - public function add_action_link( $links, $file ) { - $first_time_configuration_notice_helper = YoastSEO()->helpers->first_time_configuration_notice; - - if ( $file === WPSEO_BASENAME && WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ) { - if ( is_network_admin() ) { - $settings_url = network_admin_url( 'admin.php?page=' . self::PAGE_IDENTIFIER ); - } - else { - $settings_url = admin_url( 'admin.php?page=' . self::PAGE_IDENTIFIER ); - } - $settings_link = '' . __( 'Settings', 'wordpress-seo' ) . ''; - array_unshift( $links, $settings_link ); - } - - // Add link to docs. - $faq_link = '' . __( 'FAQ', 'wordpress-seo' ) . ''; - array_unshift( $links, $faq_link ); - - if ( $first_time_configuration_notice_helper->first_time_configuration_not_finished() && ! is_network_admin() ) { - $configuration_title = ( ! $first_time_configuration_notice_helper->should_show_alternate_message() ) ? 'first-time configuration' : 'SEO configuration'; - /* translators: CTA to finish the first time configuration. %s: Either first-time SEO configuration or SEO configuration. */ - $message = sprintf( __( 'Finish your %s', 'wordpress-seo' ), $configuration_title ); - $ftc_link = '' . $message . ''; - array_unshift( $links, $ftc_link ); - } - - $addon_manager = new WPSEO_Addon_Manager(); - if ( YoastSEO()->helpers->product->is_premium() ) { - - // Remove Free 'deactivate' link if Premium is active as well. We don't want users to deactivate Free when Premium is active. - unset( $links['deactivate'] ); - $no_deactivation_explanation = '' . sprintf( - /* translators: %s expands to Yoast SEO Premium. */ - __( 'Required by %s', 'wordpress-seo' ), - 'Yoast SEO Premium' - ) . ''; - - array_unshift( $links, $no_deactivation_explanation ); - - if ( $addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG ) ) { - return $links; - } - - // Add link to where premium can be activated. - $activation_link = '' . __( 'Activate your subscription', 'wordpress-seo' ) . ''; - array_unshift( $links, $activation_link ); - - return $links; - } - - // Add link to premium landing page. - $premium_link = '' . __( 'Get Premium', 'wordpress-seo' ) . ''; - array_unshift( $links, $premium_link ); - - return $links; - } - - /** - * Enqueues the (tiny) global JS needed for the plugin. - * - * @return void - */ - public function config_page_scripts() { - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_script( 'admin-global' ); - $asset_manager->localize_script( 'admin-global', 'wpseoAdminGlobalL10n', $this->localize_admin_global_script() ); - } - - /** - * Enqueues the (tiny) global stylesheet needed for the plugin. - * - * @return void - */ - public function enqueue_global_style() { - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_style( 'admin-global' ); - } - - /** - * Filter the $contactmethods array and add a set of social profiles. - * - * These are used with the Facebook author, rel="author" and Twitter cards implementation. - * - * @deprecated 22.6 - * @codeCoverageIgnore - * - * @param array $contactmethods Currently set contactmethods. - * - * @return array Contactmethods with added contactmethods. - */ - public function update_contactmethods( $contactmethods ) { - _deprecated_function( __METHOD__, 'Yoast SEO 22.6' ); - - $contactmethods['facebook'] = __( 'Facebook profile URL', 'wordpress-seo' ); - $contactmethods['instagram'] = __( 'Instagram profile URL', 'wordpress-seo' ); - $contactmethods['linkedin'] = __( 'LinkedIn profile URL', 'wordpress-seo' ); - $contactmethods['myspace'] = __( 'MySpace profile URL', 'wordpress-seo' ); - $contactmethods['pinterest'] = __( 'Pinterest profile URL', 'wordpress-seo' ); - $contactmethods['soundcloud'] = __( 'SoundCloud profile URL', 'wordpress-seo' ); - $contactmethods['tumblr'] = __( 'Tumblr profile URL', 'wordpress-seo' ); - $contactmethods['twitter'] = __( 'X username (without @)', 'wordpress-seo' ); - $contactmethods['youtube'] = __( 'YouTube profile URL', 'wordpress-seo' ); - $contactmethods['wikipedia'] = __( 'Wikipedia page about you', 'wordpress-seo' ) . '
              ' . __( '(if one exists)', 'wordpress-seo' ) . ''; - - return $contactmethods; - } - - /** - * Log the updated timestamp for user profiles when theme is changed. - * - * @return void - */ - public function switch_theme() { - - $users = get_users( [ 'capability' => [ 'edit_posts' ] ] ); - - if ( is_array( $users ) && $users !== [] ) { - foreach ( $users as $user ) { - update_user_meta( $user->ID, '_yoast_wpseo_profile_updated', time() ); - } - } - } - - /** - * Localization for the dismiss urls. - * - * @return array - */ - private function localize_admin_global_script() { - return array_merge( - [ - 'isRtl' => is_rtl(), - 'variable_warning' => sprintf( - /* translators: %1$s: '%%term_title%%' variable used in titles and meta's template that's not compatible with the given template, %2$s: expands to 'HelpScout beacon' */ - __( 'Warning: the variable %1$s cannot be used in this template. See the %2$s for more info.', 'wordpress-seo' ), - '%s', - 'HelpScout beacon' - ), - /* translators: %s: expends to Yoast SEO */ - 'help_video_iframe_title' => sprintf( __( '%s video tutorial', 'wordpress-seo' ), 'Yoast SEO' ), - 'scrollable_table_hint' => __( 'Scroll to see the table content.', 'wordpress-seo' ), - 'wincher_is_logged_in' => WPSEO_Options::get( 'wincher_integration_active', true ) ? YoastSEO()->helpers->wincher->login_status() : false, - ], - YoastSEO()->helpers->wincher->get_admin_global_links() - ); - } - - /** - * Sets the upsell notice. - * - * @return void - */ - protected function set_upsell_notice() { - $upsell = new WPSEO_Product_Upsell_Notice(); - $upsell->dismiss_notice_listener(); - $upsell->initialize(); - } - - /** - * Whether we are on the admin dashboard page. - * - * @return bool - */ - protected function on_dashboard_page() { - return $GLOBALS['pagenow'] === 'index.php'; - } - - /** - * Loads the cornerstone filter. - * - * @return WPSEO_WordPress_Integration[] The integrations to initialize. - */ - protected function initialize_cornerstone_content() { - if ( ! WPSEO_Options::get( 'enable_cornerstone_content' ) ) { - return []; - } - - return [ - 'cornerstone_filter' => new WPSEO_Cornerstone_Filter(), - ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-asset.php b/wp/wp-content/plugins/wordpress-seo/admin/class-asset.php deleted file mode 100644 index 8cbf0c1f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-asset.php +++ /dev/null @@ -1,255 +0,0 @@ - [], - 'in_footer' => true, - 'rtl' => true, - 'media' => 'all', - 'version' => '', - 'suffix' => '', - ]; - - /** - * Constructs an instance of the WPSEO_Admin_Asset class. - * - * @param array $args The arguments for this asset. - * - * @throws InvalidArgumentException Throws when no name or src has been provided. - */ - public function __construct( array $args ) { - if ( ! isset( $args['name'] ) ) { - throw new InvalidArgumentException( 'name is a required argument' ); - } - - if ( ! isset( $args['src'] ) ) { - throw new InvalidArgumentException( 'src is a required argument' ); - } - - $args = array_merge( $this->defaults, $args ); - - $this->name = $args['name']; - $this->src = $args['src']; - $this->deps = $args['deps']; - $this->version = $args['version']; - $this->media = $args['media']; - $this->in_footer = $args['in_footer']; - $this->rtl = $args['rtl']; - $this->suffix = $args['suffix']; - } - - /** - * Returns the asset identifier. - * - * @return string - */ - public function get_name() { - return $this->name; - } - - /** - * Returns the path to the asset. - * - * @return string - */ - public function get_src() { - return $this->src; - } - - /** - * Returns the asset dependencies. - * - * @return array|string - */ - public function get_deps() { - return $this->deps; - } - - /** - * Returns the asset version. - * - * @return string|null - */ - public function get_version() { - if ( ! empty( $this->version ) ) { - return $this->version; - } - - return null; - } - - /** - * Returns the media type for CSS assets. - * - * @return string - */ - public function get_media() { - return $this->media; - } - - /** - * Returns whether a script asset should be loaded in the footer of the page. - * - * @return bool - */ - public function is_in_footer() { - return $this->in_footer; - } - - /** - * Returns whether this CSS has a RTL counterpart. - * - * @return bool - */ - public function has_rtl() { - return $this->rtl; - } - - /** - * Returns the file suffix. - * - * @return string - */ - public function get_suffix() { - return $this->suffix; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-description-editor-list-table.php b/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-description-editor-list-table.php deleted file mode 100644 index 3b65304b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-description-editor-list-table.php +++ /dev/null @@ -1,80 +0,0 @@ - 'wpseo_bulk_description', - 'plural' => 'wpseo_bulk_descriptions', - 'ajax' => true, - ]; - - /** - * The field in the database where meta field is saved. - * - * @var string - */ - protected $target_db_field = 'metadesc'; - - /** - * The columns shown on the table. - * - * @return array - */ - public function get_columns() { - $columns = [ - 'col_existing_yoast_seo_metadesc' => __( 'Existing Yoast Meta Description', 'wordpress-seo' ), - 'col_new_yoast_seo_metadesc' => __( 'New Yoast Meta Description', 'wordpress-seo' ), - ]; - - return $this->merge_columns( $columns ); - } - - /** - * Parse the metadescription. - * - * @param string $column_name Column name. - * @param object $record Data object. - * @param string $attributes HTML attributes. - * - * @return string - */ - protected function parse_page_specific_column( $column_name, $record, $attributes ) { - switch ( $column_name ) { - case 'col_new_yoast_seo_metadesc': - return sprintf( - '', - esc_attr( 'wpseo-new-metadesc-' . $record->ID ), - esc_attr( $record->ID ) - ); - - case 'col_existing_yoast_seo_metadesc': - // @todo Inconsistent return/echo behavior R. - // I traced the escaping of the attributes to WPSEO_Bulk_List_Table::column_attributes. Alexander. - // The output of WPSEO_Bulk_List_Table::parse_meta_data_field is properly escaped. - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - echo $this->parse_meta_data_field( $record->ID, $attributes ); - break; - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-editor-list-table.php b/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-editor-list-table.php deleted file mode 100644 index 6c5b0798..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-editor-list-table.php +++ /dev/null @@ -1,1049 +0,0 @@ -page_type) there will be constructed an url part, for subpages and - * navigation. - * - * @var string - */ - protected $page_url; - - /** - * The settings which will be used in the __construct. - * - * @var array - */ - protected $settings; - - /** - * Holds the pagination config. - * - * @var array - */ - protected $pagination = []; - - /** - * Holds the sanitized data from the user input. - * - * @var array - */ - protected $input_fields = []; - - /** - * The field in the database where meta field is saved. - * - * Should be set in the child class. - * - * @var string - */ - protected $target_db_field = ''; - - /** - * Class constructor. - * - * @param array $args The arguments. - */ - public function __construct( $args = [] ) { - parent::__construct( $this->settings ); - - $args = wp_parse_args( - $args, - [ - 'nonce' => '', - 'input_fields' => [], - ] - ); - - $this->input_fields = $args['input_fields']; - if ( isset( $_SERVER['REQUEST_URI'] ) ) { - $this->request_url = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ); - } - - $this->current_page = ( ! empty( $this->input_fields['paged'] ) ) ? $this->input_fields['paged'] : 1; - $this->current_filter = ( ! empty( $this->input_fields['post_type_filter'] ) ) ? $this->input_fields['post_type_filter'] : 1; - $this->current_status = ( ! empty( $this->input_fields['post_status'] ) ) ? $this->input_fields['post_status'] : 1; - $this->current_order = [ - 'order' => ( ! empty( $this->input_fields['order'] ) ) ? $this->input_fields['order'] : 'asc', - 'orderby' => ( ! empty( $this->input_fields['orderby'] ) ) ? $this->input_fields['orderby'] : 'post_title', - ]; - - $this->nonce = $args['nonce']; - $this->page_url = "&nonce={$this->nonce}&type={$this->page_type}#top#{$this->page_type}"; - - $this->populate_editable_post_types(); - } - - /** - * Prepares the data and renders the page. - * - * @return void - */ - public function show_page() { - $this->prepare_page_navigation(); - $this->prepare_items(); - - $this->views(); - $this->display(); - } - - /** - * Used in the constructor to build a reference list of post types the current user can edit. - * - * @return void - */ - protected function populate_editable_post_types() { - $post_types = get_post_types( - [ - 'public' => true, - 'exclude_from_search' => false, - ], - 'object' - ); - - $this->all_posts = []; - $this->own_posts = []; - - if ( is_array( $post_types ) && $post_types !== [] ) { - foreach ( $post_types as $post_type ) { - if ( ! current_user_can( $post_type->cap->edit_posts ) ) { - continue; - } - - if ( current_user_can( $post_type->cap->edit_others_posts ) ) { - $this->all_posts[] = esc_sql( $post_type->name ); - } - else { - $this->own_posts[] = esc_sql( $post_type->name ); - } - } - } - } - - /** - * Will show the navigation for the table like page navigation and page filter. - * - * @param string $which Table nav location (such as top). - * - * @return void - */ - public function display_tablenav( $which ) { - // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - $post_status = isset( $_GET['post_status'] ) && is_string( $_GET['post_status'] ) ? sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) : ''; - $order_by = isset( $_GET['orderby'] ) && is_string( $_GET['orderby'] ) ? sanitize_text_field( wp_unslash( $_GET['orderby'] ) ) : ''; - $order = isset( $_GET['order'] ) && is_string( $_GET['order'] ) ? sanitize_text_field( wp_unslash( $_GET['order'] ) ) : ''; - $post_type_filter = isset( $_GET['post_type_filter'] ) && is_string( $_GET['post_type_filter'] ) ? sanitize_text_field( wp_unslash( $_GET['post_type_filter'] ) ) : ''; - // phpcs:enable WordPress.Security.NonceVerification.Recommended; - ?> -
              - - -
              - - - - - - - - - - - - - extra_tablenav( $which ); - $this->pagination( $which ); - ?> - -
              - -
              - -
              - - prepare(), - * passing the current user_id in as the first parameter. - */ - public function get_base_subquery() { - global $wpdb; - - $all_posts_string = "'" . implode( "', '", $this->all_posts ) . "'"; - $own_posts_string = "'" . implode( "', '", $this->own_posts ) . "'"; - - $post_author = esc_sql( (int) get_current_user_id() ); - - $subquery = "( - SELECT * - FROM {$wpdb->posts} - WHERE post_type IN ({$all_posts_string}) - UNION ALL - SELECT * - FROM {$wpdb->posts} - WHERE post_type IN ({$own_posts_string}) AND post_author = {$post_author} - ) sub_base"; - - return $subquery; - } - - /** - * Gets the views. - * - * @return array The views. - */ - public function get_views() { - global $wpdb; - - $status_links = []; - - $states = get_post_stati( [ 'show_in_admin_all_list' => true ] ); - $subquery = $this->get_base_subquery(); - - $total_posts = $wpdb->get_var( - $wpdb->prepare( - "SELECT COUNT(ID) FROM {$subquery} - WHERE post_status IN (" - . implode( ', ', array_fill( 0, count( $states ), '%s' ) ) - . ')', - $states - ) - ); - - $post_status = isset( $_GET['post_status'] ) && is_string( $_GET['post_status'] ) ? sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) : ''; - $current_link_attributes = empty( $post_status ) ? ' class="current" aria-current="page"' : ''; - $localized_text = sprintf( - /* translators: %s expands to the number of posts in localized format. */ - _nx( 'All (%s)', 'All (%s)', $total_posts, 'posts', 'wordpress-seo' ), - number_format_i18n( $total_posts ) - ); - - $status_links['all'] = '' . $localized_text . ''; - - $post_stati = get_post_stati( [ 'show_in_admin_all_list' => true ], 'objects' ); - if ( is_array( $post_stati ) && $post_stati !== [] ) { - foreach ( $post_stati as $status ) { - - $status_name = esc_sql( $status->name ); - - $total = (int) $wpdb->get_var( - $wpdb->prepare( - " - SELECT COUNT(ID) FROM {$subquery} - WHERE post_status = %s - ", - $status_name - ) - ); - - if ( $total === 0 ) { - continue; - } - - $current_link_attributes = ''; - if ( $status_name === $post_status ) { - $current_link_attributes = ' class="current" aria-current="page"'; - } - - $status_links[ $status_name ] = '' . sprintf( translate_nooped_plural( $status->label_count, $total ), number_format_i18n( $total ) ) . ''; - } - } - unset( $post_stati, $status, $status_name, $total, $current_link_attributes ); - - $trashed_posts = $wpdb->get_var( - "SELECT COUNT(ID) FROM {$subquery} - WHERE post_status IN ('trash') - " - ); - - $current_link_attributes = ''; - if ( $post_status === 'trash' ) { - $current_link_attributes = 'class="current" aria-current="page"'; - } - - $localized_text = sprintf( - /* translators: %s expands to the number of trashed posts in localized format. */ - _nx( 'Trash (%s)', 'Trash (%s)', $trashed_posts, 'posts', 'wordpress-seo' ), - number_format_i18n( $trashed_posts ) - ); - - $status_links['trash'] = '' . $localized_text . ''; - - return $status_links; - } - - /** - * Outputs extra table navigation. - * - * @param string $which Table nav location (such as top). - * - * @return void - */ - public function extra_tablenav( $which ) { - - if ( $which === 'top' ) { - $post_types = get_post_types( - [ - 'public' => true, - 'exclude_from_search' => false, - ] - ); - - $instance_type = esc_attr( $this->page_type ); - - if ( is_array( $post_types ) && $post_types !== [] ) { - global $wpdb; - - echo '
              '; - - $post_types = esc_sql( $post_types ); - $post_types = "'" . implode( "', '", $post_types ) . "'"; - - $states = get_post_stati( [ 'show_in_admin_all_list' => true ] ); - $states['trash'] = 'trash'; - - $subquery = $this->get_base_subquery(); - - $post_types = $wpdb->get_results( - $wpdb->prepare( - "SELECT DISTINCT post_type FROM {$subquery} - WHERE post_status IN (" - . implode( ', ', array_fill( 0, count( $states ), '%s' ) ) - . ') ORDER BY post_type ASC', - $states - ) - ); - - $post_type_filter = isset( $_GET['post_type_filter'] ) && is_string( $_GET['post_type_filter'] ) ? sanitize_text_field( wp_unslash( $_GET['post_type_filter'] ) ) : ''; - $selected = ( ! empty( $post_type_filter ) ) ? $post_type_filter : '-1'; - - $options = ''; - - if ( is_array( $post_types ) && $post_types !== [] ) { - foreach ( $post_types as $post_type ) { - $obj = get_post_type_object( $post_type->post_type ); - $options .= sprintf( - '', - esc_html( $obj->labels->name ), - esc_attr( $post_type->post_type ), - selected( $selected, $post_type->post_type, false ) - ); - } - } - - printf( - '', - esc_attr( 'post-type-filter-' . $instance_type ), - /* translators: Hidden accessibility text. */ - esc_html__( 'Filter by content type', 'wordpress-seo' ) - ); - printf( - '', - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $options is properly escaped above. - $options, - esc_attr( 'post-type-filter-' . $instance_type ) - ); - - submit_button( esc_html__( 'Filter', 'wordpress-seo' ), 'button', false, false, [ 'id' => 'post-query-submit' ] ); - echo '
              '; - } - } - } - - /** - * Gets a list of sortable columns. - * - * The format is: 'internal-name' => array( 'orderby', bool ). - * - * @return array - */ - public function get_sortable_columns() { - return [ - 'col_page_title' => [ 'post_title', true ], - 'col_post_type' => [ 'post_type', false ], - 'col_post_date' => [ 'post_date', false ], - ]; - } - - /** - * Sets the correct pagenumber and pageurl for the navigation. - * - * @return void - */ - public function prepare_page_navigation() { - - $request_url = $this->request_url . $this->page_url; - - $current_page = $this->current_page; - $current_filter = $this->current_filter; - $current_status = $this->current_status; - $current_order = $this->current_order; - - /* - * If current type doesn't compare with objects page_type, then we have to unset - * some vars in the requested url (which will be used for internal table urls). - */ - if ( isset( $this->input_fields['type'] ) && $this->input_fields['type'] !== $this->page_type ) { - $request_url = remove_query_arg( 'paged', $request_url ); // Page will be set with value 1 below. - $request_url = remove_query_arg( 'post_type_filter', $request_url ); - $request_url = remove_query_arg( 'post_status', $request_url ); - $request_url = remove_query_arg( 'orderby', $request_url ); - $request_url = remove_query_arg( 'order', $request_url ); - $request_url = add_query_arg( 'pages', 1, $request_url ); - - $current_page = 1; - $current_filter = '-1'; - $current_status = ''; - $current_order = [ - 'orderby' => 'post_title', - 'order' => 'asc', - ]; - } - - $_SERVER['REQUEST_URI'] = $request_url; - - $_GET['paged'] = $current_page; - $_REQUEST['paged'] = $current_page; - $_REQUEST['post_type_filter'] = $current_filter; - $_GET['post_type_filter'] = $current_filter; - $_GET['post_status'] = $current_status; - $_GET['orderby'] = $current_order['orderby']; - $_GET['order'] = $current_order['order']; - } - - /** - * Preparing the requested pagerows and setting the needed variables. - * - * @return void - */ - public function prepare_items() { - - $post_type_clause = $this->get_post_type_clause(); - $all_states = $this->get_all_states(); - $subquery = $this->get_base_subquery(); - - // Setting the column headers. - $this->set_column_headers(); - - // Count the total number of needed items and setting pagination given $total_items. - $total_items = $this->count_items( $subquery, $all_states, $post_type_clause ); - $this->set_pagination( $total_items ); - - // Getting items given $query. - $query = $this->parse_item_query( $subquery, $all_states, $post_type_clause ); - $this->get_items( $query ); - - // Get the metadata for the current items ($this->items). - $this->get_meta_data(); - } - - /** - * Getting the columns for first row. - * - * @return array - */ - public function get_columns() { - return $this->merge_columns(); - } - - /** - * Setting the column headers. - * - * @return void - */ - protected function set_column_headers() { - $columns = $this->get_columns(); - $hidden = []; - $sortable = $this->get_sortable_columns(); - $this->_column_headers = [ $columns, $hidden, $sortable ]; - } - - /** - * Counting total items. - * - * @param string $subquery SQL FROM part. - * @param string $all_states SQL IN part. - * @param string $post_type_clause SQL post type part. - * - * @return mixed - */ - protected function count_items( $subquery, $all_states, $post_type_clause ) { - global $wpdb; - - return (int) $wpdb->get_var( - "SELECT COUNT(ID) FROM {$subquery} - WHERE post_status IN ({$all_states}) - {$post_type_clause} - " - ); - } - - /** - * Getting the post_type_clause filter. - * - * @return string - */ - protected function get_post_type_clause() { - // Filter Block. - $post_type_clause = ''; - $post_type_filter = isset( $_GET['post_type_filter'] ) && is_string( $_GET['post_type_filter'] ) ? sanitize_text_field( wp_unslash( $_GET['post_type_filter'] ) ) : ''; - - if ( ! empty( $post_type_filter ) && get_post_type_object( $post_type_filter ) ) { - $post_types = esc_sql( $post_type_filter ); - $post_type_clause = "AND post_type IN ('{$post_types}')"; - } - - return $post_type_clause; - } - - /** - * Setting the pagination. - * - * Total items is the number of all visible items. - * - * @param int $total_items Total items counts. - * - * @return void - */ - protected function set_pagination( $total_items ) { - // Calculate items per page. - $per_page = $this->get_items_per_page( 'wpseo_posts_per_page', 10 ); - $paged = isset( $_GET['paged'] ) && is_string( $_GET['paged'] ) ? esc_sql( sanitize_text_field( wp_unslash( $_GET['paged'] ) ) ) : ''; - - if ( empty( $paged ) || ! is_numeric( $paged ) ) { - $paged = 1; - } - else { - $paged = (int) $paged; - } - - if ( $paged <= 0 ) { - $paged = 1; - } - - $this->set_pagination_args( - [ - 'total_items' => $total_items, - 'total_pages' => ceil( $total_items / $per_page ), - 'per_page' => $per_page, - ] - ); - - $this->pagination = [ - 'per_page' => $per_page, - 'offset' => ( ( $paged - 1 ) * $per_page ), - ]; - } - - /** - * Parse the query to get items from database. - * - * Based on given parameters there will be parse a query which will get all the pages/posts and other post_types - * from the database. - * - * @param string $subquery SQL FROM part. - * @param string $all_states SQL IN part. - * @param string $post_type_clause SQL post type part. - * - * @return string - */ - protected function parse_item_query( $subquery, $all_states, $post_type_clause ) { - // Order By block. - $orderby = isset( $_GET['orderby'] ) && is_string( $_GET['orderby'] ) ? sanitize_text_field( wp_unslash( $_GET['orderby'] ) ) : ''; - - $orderby = ! empty( $orderby ) ? esc_sql( $orderby ) : 'post_title'; - $orderby = $this->sanitize_orderby( $orderby ); - - // Order clause. - $order = isset( $_GET['order'] ) && is_string( $_GET['order'] ) ? sanitize_text_field( wp_unslash( $_GET['order'] ) ) : ''; - $order = ! empty( $order ) ? esc_sql( strtoupper( $order ) ) : 'ASC'; - $order = $this->sanitize_order( $order ); - - // Get all needed results. - $query = " - SELECT ID, post_title, post_type, post_status, post_modified, post_date - FROM {$subquery} - WHERE post_status IN ({$all_states}) $post_type_clause - ORDER BY {$orderby} {$order} - LIMIT %d,%d - "; - - return $query; - } - - /** - * Heavily restricts the possible columns by which a user can order the table - * in the bulk editor, thereby preventing a possible CSRF vulnerability. - * - * @param string $orderby The column by which we want to order. - * - * @return string - */ - protected function sanitize_orderby( $orderby ) { - $valid_column_names = [ - 'post_title', - 'post_type', - 'post_date', - ]; - - if ( in_array( $orderby, $valid_column_names, true ) ) { - return $orderby; - } - - return 'post_title'; - } - - /** - * Makes sure the order clause is always ASC or DESC for the bulk editor table, - * thereby preventing a possible CSRF vulnerability. - * - * @param string $order Whether we want to sort ascending or descending. - * - * @return string SQL order string (ASC, DESC). - */ - protected function sanitize_order( $order ) { - if ( in_array( strtoupper( $order ), [ 'ASC', 'DESC' ], true ) ) { - return $order; - } - - return 'ASC'; - } - - /** - * Getting all the items. - * - * @param string $query SQL query to use. - * - * @return void - */ - protected function get_items( $query ) { - global $wpdb; - - $this->items = $wpdb->get_results( - $wpdb->prepare( - $query, - $this->pagination['offset'], - $this->pagination['per_page'] - ) - ); - } - - /** - * Getting all the states. - * - * @return string - */ - protected function get_all_states() { - global $wpdb; - - $states = get_post_stati( [ 'show_in_admin_all_list' => true ] ); - $states['trash'] = 'trash'; - - if ( ! empty( $this->input_fields['post_status'] ) ) { - $requested_state = $this->input_fields['post_status']; - if ( in_array( $requested_state, $states, true ) ) { - $states = [ $requested_state ]; - } - - if ( $requested_state !== 'trash' ) { - unset( $states['trash'] ); - } - } - - return $wpdb->prepare( - implode( ', ', array_fill( 0, count( $states ), '%s' ) ), - $states - ); - } - - /** - * Based on $this->items and the defined columns, the table rows will be displayed. - * - * @return void - */ - public function display_rows() { - - $records = $this->items; - - list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info(); - - if ( ( is_array( $records ) && $records !== [] ) && ( is_array( $columns ) && $columns !== [] ) ) { - - foreach ( $records as $record ) { - - echo ''; - - foreach ( $columns as $column_name => $column_display_name ) { - - $classes = ''; - if ( $primary === $column_name ) { - $classes .= ' has-row-actions column-primary'; - } - - $attributes = $this->column_attributes( $column_name, $hidden, $classes, $column_display_name ); - - $column_value = $this->parse_column( $column_name, $record ); - - if ( method_exists( $this, 'parse_page_specific_column' ) && empty( $column_value ) ) { - $column_value = $this->parse_page_specific_column( $column_name, $record, $attributes ); - } - - if ( ! empty( $column_value ) ) { - printf( '%1$s', $column_value, $attributes ); - } - } - - echo ''; - } - } - } - - /** - * Getting the attributes for each table cell. - * - * @param string $column_name Column name string. - * @param array $hidden Set of hidden columns. - * @param string $classes Additional CSS classes. - * @param string $column_display_name Column display name string. - * - * @return string - */ - protected function column_attributes( $column_name, $hidden, $classes, $column_display_name ) { - - $attributes = ''; - $class = [ $column_name, "column-$column_name$classes" ]; - - if ( in_array( $column_name, $hidden, true ) ) { - $class[] = 'hidden'; - } - - if ( ! empty( $class ) ) { - $attributes = 'class="' . esc_attr( implode( ' ', $class ) ) . '"'; - } - - $attributes .= ' data-colname="' . esc_attr( $column_display_name ) . '"'; - - return $attributes; - } - - /** - * Parsing the title. - * - * @param WP_Post $rec Post object. - * - * @return string - */ - protected function parse_page_title_column( $rec ) { - - $title = empty( $rec->post_title ) ? __( '(no title)', 'wordpress-seo' ) : $rec->post_title; - - $return = sprintf( '%1$s', stripslashes( wp_strip_all_tags( $title ) ) ); - - $post_type_object = get_post_type_object( $rec->post_type ); - $can_edit_post = current_user_can( $post_type_object->cap->edit_post, $rec->ID ); - - $actions = []; - - if ( $can_edit_post && $rec->post_status !== 'trash' ) { - $actions['edit'] = sprintf( - '%s', - esc_url( get_edit_post_link( $rec->ID, true ) ), - /* translators: Hidden accessibility text; %s: post title. */ - esc_attr( sprintf( __( 'Edit “%s”', 'wordpress-seo' ), $title ) ), - __( 'Edit', 'wordpress-seo' ) - ); - } - - if ( $post_type_object->public ) { - if ( in_array( $rec->post_status, [ 'pending', 'draft', 'future' ], true ) ) { - if ( $can_edit_post ) { - $actions['view'] = sprintf( - '%s', - esc_url( add_query_arg( 'preview', 'true', get_permalink( $rec->ID ) ) ), - /* translators: Hidden accessibility text; %s: post title. */ - esc_attr( sprintf( __( 'Preview “%s”', 'wordpress-seo' ), $title ) ), - __( 'Preview', 'wordpress-seo' ) - ); - } - } - elseif ( $rec->post_status !== 'trash' ) { - $actions['view'] = sprintf( - '%s', - esc_url( get_permalink( $rec->ID ) ), - /* translators: Hidden accessibility text; %s: post title. */ - esc_attr( sprintf( __( 'View “%s”', 'wordpress-seo' ), $title ) ), - __( 'View', 'wordpress-seo' ) - ); - } - } - - $return .= $this->row_actions( $actions ); - - return $return; - } - - /** - * Parsing the column based on the $column_name. - * - * @param string $column_name Column name. - * @param WP_Post $rec Post object. - * - * @return string - */ - protected function parse_column( $column_name, $rec ) { - - static $date_format; - - if ( ! isset( $date_format ) ) { - $date_format = get_option( 'date_format' ); - } - - switch ( $column_name ) { - case 'col_page_title': - $column_value = $this->parse_page_title_column( $rec ); - break; - - case 'col_page_slug': - $permalink = get_permalink( $rec->ID ); - $display_slug = str_replace( get_bloginfo( 'url' ), '', $permalink ); - $column_value = sprintf( '%1$s', stripslashes( rawurldecode( $display_slug ) ), esc_url( $permalink ) ); - break; - - case 'col_post_type': - $post_type = get_post_type_object( $rec->post_type ); - $column_value = $post_type->labels->singular_name; - break; - - case 'col_post_status': - $post_status = get_post_status_object( $rec->post_status ); - $column_value = $post_status->label; - break; - - case 'col_post_date': - $column_value = date_i18n( $date_format, strtotime( $rec->post_date ) ); - break; - - case 'col_row_action': - $column_value = sprintf( - '%2$s %3$s', - $rec->ID, - esc_html__( 'Save', 'wordpress-seo' ), - esc_html__( 'Save all', 'wordpress-seo' ) - ); - break; - } - - if ( ! empty( $column_value ) ) { - return $column_value; - } - } - - /** - * Parse the field where the existing meta-data value is displayed. - * - * @param int $record_id Record ID. - * @param string $attributes HTML attributes. - * @param bool|array $values Optional values data array. - * - * @return string - */ - protected function parse_meta_data_field( $record_id, $attributes, $values = false ) { - - // Fill meta data if exists in $this->meta_data. - $meta_data = ( ! empty( $this->meta_data[ $record_id ] ) ) ? $this->meta_data[ $record_id ] : []; - $meta_key = WPSEO_Meta::$meta_prefix . $this->target_db_field; - $meta_value = ( ! empty( $meta_data[ $meta_key ] ) ) ? $meta_data[ $meta_key ] : ''; - - if ( ! empty( $values ) ) { - $meta_value = $values[ $meta_value ]; - } - - $id = "wpseo-existing-$this->target_db_field-$record_id"; - - // $attributes correctly escaped, verified by Alexander. See WPSEO_Bulk_Description_List_Table::parse_page_specific_column. - return sprintf( '%1$s', esc_html( $meta_value ), $attributes, esc_attr( $id ) ); - } - - /** - * Method for setting the meta data, which belongs to the records that will be shown on the current page. - * - * This method will loop through the current items ($this->items) for getting the post_id. With this data - * ($needed_ids) the method will query the meta-data table for getting the title. - * - * @return void - */ - protected function get_meta_data() { - - $post_ids = $this->get_post_ids(); - $meta_data = $this->get_meta_data_result( $post_ids ); - - $this->parse_meta_data( $meta_data ); - - // Little housekeeping. - unset( $post_ids, $meta_data ); - } - - /** - * Getting all post_ids from to $this->items. - * - * @return array - */ - protected function get_post_ids() { - $post_ids = []; - foreach ( $this->items as $item ) { - $post_ids[] = $item->ID; - } - - return $post_ids; - } - - /** - * Getting the meta_data from database. - * - * @param array $post_ids Post IDs for SQL IN part. - * - * @return mixed - */ - protected function get_meta_data_result( array $post_ids ) { - global $wpdb; - - $where = $wpdb->prepare( - 'post_id IN (' . implode( ', ', array_fill( 0, count( $post_ids ), '%d' ) ) . ')', - $post_ids - ); - - $where .= $wpdb->prepare( ' AND meta_key = %s', WPSEO_Meta::$meta_prefix . $this->target_db_field ); - - // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- They are prepared on the lines above. - return $wpdb->get_results( "SELECT * FROM {$wpdb->postmeta} WHERE {$where}" ); - } - - /** - * Setting $this->meta_data. - * - * @param array $meta_data Meta data set. - * - * @return void - */ - protected function parse_meta_data( $meta_data ) { - - foreach ( $meta_data as $row ) { - $this->meta_data[ $row->post_id ][ $row->meta_key ] = $row->meta_value; - } - } - - /** - * This method will merge general array with given parameter $columns. - * - * @param array $columns Optional columns set. - * - * @return array - */ - protected function merge_columns( $columns = [] ) { - $columns = array_merge( - [ - 'col_page_title' => __( 'WP Page Title', 'wordpress-seo' ), - 'col_post_type' => __( 'Content Type', 'wordpress-seo' ), - 'col_post_status' => __( 'Post Status', 'wordpress-seo' ), - 'col_post_date' => __( 'Publication date', 'wordpress-seo' ), - 'col_page_slug' => __( 'Page URL/Slug', 'wordpress-seo' ), - ], - $columns - ); - - $columns['col_row_action'] = __( 'Action', 'wordpress-seo' ); - - return $columns; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-title-editor-list-table.php b/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-title-editor-list-table.php deleted file mode 100644 index 5314fdb5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-title-editor-list-table.php +++ /dev/null @@ -1,89 +0,0 @@ - 'wpseo_bulk_title', - 'plural' => 'wpseo_bulk_titles', - 'ajax' => true, - ]; - - /** - * The field in the database where meta field is saved. - * - * @var string - */ - protected $target_db_field = 'title'; - - /** - * The columns shown on the table. - * - * @return array - */ - public function get_columns() { - - $columns = [ - /* translators: %1$s expands to Yoast SEO */ - 'col_existing_yoast_seo_title' => sprintf( __( 'Existing %1$s Title', 'wordpress-seo' ), 'Yoast SEO' ), - /* translators: %1$s expands to Yoast SEO */ - 'col_new_yoast_seo_title' => sprintf( __( 'New %1$s Title', 'wordpress-seo' ), 'Yoast SEO' ), - ]; - - return $this->merge_columns( $columns ); - } - - /** - * Parse the title columns. - * - * @param string $column_name Column name. - * @param object $record Data object. - * @param string $attributes HTML attributes. - * - * @return string - */ - protected function parse_page_specific_column( $column_name, $record, $attributes ) { - - // Fill meta data if exists in $this->meta_data. - $meta_data = ( ! empty( $this->meta_data[ $record->ID ] ) ) ? $this->meta_data[ $record->ID ] : []; - - switch ( $column_name ) { - case 'col_existing_yoast_seo_title': - // @todo Inconsistent return/echo behavior R. - // I traced the escaping of the attributes to WPSEO_Bulk_List_Table::column_attributes. - // The output of WPSEO_Bulk_List_Table::parse_meta_data_field is properly escaped. - // phpcs:ignore WordPress.Security.EscapeOutput - echo $this->parse_meta_data_field( $record->ID, $attributes ); - break; - - case 'col_new_yoast_seo_title': - return sprintf( - '', - 'wpseo-new-title-' . $record->ID, - $record->ID - ); - } - - unset( $meta_data ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-collector.php b/wp/wp-content/plugins/wordpress-seo/admin/class-collector.php deleted file mode 100644 index e49e872c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-collector.php +++ /dev/null @@ -1,54 +0,0 @@ -collections[] = $collection; - } - - /** - * Collects the data from the collection objects. - * - * @return array The collected data. - */ - public function collect() { - $data = []; - - foreach ( $this->collections as $collection ) { - $data = array_merge( $data, $collection->get() ); - } - - return $data; - } - - /** - * Returns the collected data as a JSON encoded string. - * - * @return false|string The encode string. - */ - public function get_as_json() { - return WPSEO_Utils::format_json_encode( $this->collect() ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-config.php b/wp/wp-content/plugins/wordpress-seo/admin/class-config.php deleted file mode 100644 index ca9b2b6a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-config.php +++ /dev/null @@ -1,160 +0,0 @@ -asset_manager = new WPSEO_Admin_Asset_Manager(); - } - - /** - * Make sure the needed scripts are loaded for admin pages. - * - * @return void - */ - public function init() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - $page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; - if ( in_array( $page, [ Settings_Integration::PAGE, Academy_Integration::PAGE, Support_Integration::PAGE ], true ) ) { - // Bail, this is managed in the applicable integration. - return; - } - - add_action( 'admin_enqueue_scripts', [ $this, 'config_page_scripts' ] ); - add_action( 'admin_enqueue_scripts', [ $this, 'config_page_styles' ] ); - } - - /** - * Loads the required styles for the config page. - * - * @return void - */ - public function config_page_styles() { - wp_enqueue_style( 'dashboard' ); - wp_enqueue_style( 'thickbox' ); - wp_enqueue_style( 'global' ); - wp_enqueue_style( 'wp-admin' ); - $this->asset_manager->enqueue_style( 'admin-css' ); - $this->asset_manager->enqueue_style( 'monorepo' ); - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - $page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; - if ( $page === 'wpseo_licenses' ) { - $this->asset_manager->enqueue_style( 'tailwind' ); - } - } - - /** - * Loads the required scripts for the config page. - * - * @return void - */ - public function config_page_scripts() { - $this->asset_manager->enqueue_script( 'settings' ); - wp_enqueue_script( 'dashboard' ); - wp_enqueue_script( 'thickbox' ); - - $alert_dismissal_action = YoastSEO()->classes->get( Alert_Dismissal_Action::class ); - $dismissed_alerts = $alert_dismissal_action->all_dismissed(); - $woocommerce_conditional = new WooCommerce_Conditional(); - - $script_data = [ - 'userLanguageCode' => WPSEO_Language_Utils::get_language( get_user_locale() ), - 'dismissedAlerts' => $dismissed_alerts, - 'isRtl' => is_rtl(), - 'isPremium' => YoastSEO()->helpers->product->is_premium(), - 'isWooCommerceActive' => $woocommerce_conditional->is_met(), - 'currentPromotions' => YoastSEO()->classes->get( Promotion_Manager::class )->get_current_promotions(), - 'webinarIntroSettingsUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/webinar-intro-settings' ), - 'webinarIntroFirstTimeConfigUrl' => $this->get_webinar_shortlink(), - 'linkParams' => WPSEO_Shortlinker::get_query_params(), - 'pluginUrl' => plugins_url( '', WPSEO_FILE ), - ]; - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - $page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; - - if ( in_array( $page, [ WPSEO_Admin::PAGE_IDENTIFIER, 'wpseo_workouts' ], true ) ) { - wp_enqueue_media(); - - $script_data['media'] = [ - 'choose_image' => __( 'Use Image', 'wordpress-seo' ), - ]; - - $script_data['userEditUrl'] = add_query_arg( 'user_id', '{user_id}', admin_url( 'user-edit.php' ) ); - } - - if ( $page === 'wpseo_tools' ) { - $this->enqueue_tools_scripts(); - } - - $this->asset_manager->localize_script( 'settings', 'wpseoScriptData', $script_data ); - $this->asset_manager->enqueue_user_language_script(); - } - - /** - * Enqueues and handles all the tool dependencies. - * - * @return void - */ - private function enqueue_tools_scripts() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - $tool = isset( $_GET['tool'] ) && is_string( $_GET['tool'] ) ? sanitize_text_field( wp_unslash( $_GET['tool'] ) ) : ''; - - if ( empty( $tool ) ) { - $this->asset_manager->enqueue_script( 'yoast-seo' ); - } - - if ( $tool === 'bulk-editor' ) { - $this->asset_manager->enqueue_script( 'bulk-editor' ); - } - } - - /** - * Returns the appropriate shortlink for the Webinar. - * - * @return string The shortlink for the Webinar. - */ - private function get_webinar_shortlink() { - if ( YoastSEO()->helpers->product->is_premium() ) { - return WPSEO_Shortlinker::get( 'https://yoa.st/webinar-intro-first-time-config-premium' ); - } - - return WPSEO_Shortlinker::get( 'https://yoa.st/webinar-intro-first-time-config' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-database-proxy.php b/wp/wp-content/plugins/wordpress-seo/admin/class-database-proxy.php deleted file mode 100644 index 89ec64d3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-database-proxy.php +++ /dev/null @@ -1,309 +0,0 @@ -table_name = $table_name; - $this->suppress_errors = (bool) $suppress_errors; - $this->is_multisite_table = (bool) $is_multisite_table; - $this->database = $database; - - // If the table prefix was provided, strip it as it's handled automatically. - $table_prefix = $this->get_table_prefix(); - if ( ! empty( $table_prefix ) && strpos( $this->table_name, $table_prefix ) === 0 ) { - $this->table_prefix = substr( $this->table_name, strlen( $table_prefix ) ); - } - - if ( ! $this->is_table_registered() ) { - $this->register_table(); - } - } - - /** - * Inserts data into the database. - * - * @param array $data Data to insert. - * @param array|string|null $format Formats for the data. - * - * @return false|int Total amount of inserted rows or false on error. - */ - public function insert( array $data, $format = null ) { - $this->pre_execution(); - - $result = $this->database->insert( $this->get_table_name(), $data, $format ); - - $this->post_execution(); - - return $result; - } - - /** - * Updates data in the database. - * - * @param array $data Data to update on the table. - * @param array $where Where condition as key => value array. - * @param array|string|null $format Optional. Data prepare format. - * @param array|string|null $where_format Optional. Where prepare format. - * - * @return false|int False when the update request is invalid, int on number of rows changed. - */ - public function update( array $data, array $where, $format = null, $where_format = null ) { - $this->pre_execution(); - - $result = $this->database->update( $this->get_table_name(), $data, $where, $format, $where_format ); - - $this->post_execution(); - - return $result; - } - - /** - * Upserts data in the database. - * - * Performs an insert into and if key is duplicate it will update the existing record. - * - * @param array $data Data to update on the table. - * @param array|null $where Unused. Where condition as key => value array. - * @param array|string|null $format Optional. Data prepare format. - * @param array|string|null $where_format Optional. Where prepare format. - * - * @return false|int False when the upsert request is invalid, int on number of rows changed. - */ - public function upsert( array $data, ?array $where = null, $format = null, $where_format = null ) { - if ( $where_format !== null ) { - _deprecated_argument( __METHOD__, '7.7.0', 'The where_format argument is deprecated' ); - } - - $this->pre_execution(); - - $update = []; - $keys = []; - $columns = array_keys( $data ); - foreach ( $columns as $column ) { - $keys[] = '`' . $column . '`'; - $update[] = sprintf( '`%1$s` = VALUES(`%1$s`)', $column ); - } - - $query = sprintf( - 'INSERT INTO `%1$s` (%2$s) VALUES ( %3$s ) ON DUPLICATE KEY UPDATE %4$s', - $this->get_table_name(), - implode( ', ', $keys ), - implode( ', ', array_fill( 0, count( $data ), '%s' ) ), - implode( ', ', $update ) - ); - - $result = $this->database->query( - $this->database->prepare( - $query, - array_values( $data ) - ) - ); - - $this->post_execution(); - - return $result; - } - - /** - * Deletes a record from the database. - * - * @param array $where Where clauses for the query. - * @param array|string|null $format Formats for the data. - * - * @return false|int - */ - public function delete( array $where, $format = null ) { - $this->pre_execution(); - - $result = $this->database->delete( $this->get_table_name(), $where, $format ); - - $this->post_execution(); - - return $result; - } - - /** - * Executes the given query and returns the results. - * - * @param string $query The query to execute. - * - * @return array|object|null The resultset - */ - public function get_results( $query ) { - $this->pre_execution(); - - $results = $this->database->get_results( $query ); - - $this->post_execution(); - - return $results; - } - - /** - * Creates a table to the database. - * - * @param array $columns The columns to create. - * @param array $indexes The indexes to use. - * - * @return bool True when creation is successful. - */ - public function create_table( array $columns, array $indexes = [] ) { - $create_table = sprintf( - 'CREATE TABLE IF NOT EXISTS %1$s ( %2$s ) %3$s', - $this->get_table_name(), - implode( ',', array_merge( $columns, $indexes ) ), - $this->database->get_charset_collate() - ); - - $this->pre_execution(); - - $is_created = (bool) $this->database->query( $create_table ); - - $this->post_execution(); - - return $is_created; - } - - /** - * Checks if there is an error. - * - * @return bool Returns true when there is an error. - */ - public function has_error() { - return ( $this->database->last_error !== '' ); - } - - /** - * Executed before a query will be ran. - * - * @return void - */ - protected function pre_execution() { - if ( $this->suppress_errors ) { - $this->last_suppressed_state = $this->database->suppress_errors(); - } - } - - /** - * Executed after a query has been ran. - * - * @return void - */ - protected function post_execution() { - if ( $this->suppress_errors ) { - $this->database->suppress_errors( $this->last_suppressed_state ); - } - } - - /** - * Returns the full table name. - * - * @return string Full table name including prefix. - */ - public function get_table_name() { - return $this->get_table_prefix() . $this->table_name; - } - - /** - * Returns the prefix to use for the table. - * - * @return string The table prefix depending on the database context. - */ - protected function get_table_prefix() { - if ( $this->is_multisite_table ) { - return $this->database->base_prefix; - } - - return $this->database->get_blog_prefix(); - } - - /** - * Registers the table with WordPress. - * - * @return void - */ - protected function register_table() { - $table_name = $this->table_name; - $full_table_name = $this->get_table_name(); - - $this->database->$table_name = $full_table_name; - - if ( $this->is_multisite_table ) { - $this->database->ms_global_tables[] = $table_name; - return; - } - - $this->database->tables[] = $table_name; - } - - /** - * Checks if the table has been registered with WordPress. - * - * @return bool True if the table is registered, false otherwise. - */ - protected function is_table_registered() { - if ( $this->is_multisite_table ) { - return in_array( $this->table_name, $this->database->ms_global_tables, true ); - } - - return in_array( $this->table_name, $this->database->tables, true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-export.php b/wp/wp-content/plugins/wordpress-seo/admin/class-export.php deleted file mode 100644 index 6e769b04..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-export.php +++ /dev/null @@ -1,164 +0,0 @@ -export_settings(); - $this->output(); - } - - /** - * Outputs the export. - * - * @return void - */ - public function output() { - if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ) { - esc_html_e( 'You do not have the required rights to export settings.', 'wordpress-seo' ); - return; - } - - echo '

              '; - printf( - /* translators: %1$s expands to Import settings */ - esc_html__( - 'Copy all these settings to another site\'s %1$s tab and click "%1$s" there.', - 'wordpress-seo' - ), - esc_html__( - 'Import settings', - 'wordpress-seo' - ) - ); - echo '

              '; - /* translators: %1$s expands to Yoast SEO */ - echo '
              '; - echo ''; - } - - /** - * Exports the current site's WP SEO settings. - * - * @return void - */ - private function export_settings() { - $this->export_header(); - - foreach ( WPSEO_Options::get_option_names() as $opt_group ) { - $this->write_opt_group( $opt_group ); - } - } - - /** - * Writes the header of the export. - * - * @return void - */ - private function export_header() { - $header = sprintf( - /* translators: %1$s expands to Yoast SEO, %2$s expands to Yoast.com */ - esc_html__( 'These are settings for the %1$s plugin by %2$s', 'wordpress-seo' ), - 'Yoast SEO', - 'Yoast.com' - ); - $this->write_line( '; ' . $header ); - } - - /** - * Writes a line to the export. - * - * @param string $line Line string. - * @param bool $newline_first Boolean flag whether to prepend with new line. - * - * @return void - */ - private function write_line( $line, $newline_first = false ) { - if ( $newline_first ) { - $this->export .= PHP_EOL; - } - $this->export .= $line . PHP_EOL; - } - - /** - * Writes an entire option group to the export. - * - * @param string $opt_group Option group name. - * - * @return void - */ - private function write_opt_group( $opt_group ) { - - $this->write_line( '[' . $opt_group . ']', true ); - - $options = get_option( $opt_group ); - - if ( ! is_array( $options ) ) { - return; - } - - foreach ( $options as $key => $elem ) { - if ( is_array( $elem ) ) { - $count = count( $elem ); - for ( $i = 0; $i < $count; $i++ ) { - $elem_check = ( $elem[ $i ] ?? null ); - $this->write_setting( $key . '[]', $elem_check ); - } - } - else { - $this->write_setting( $key, $elem ); - } - } - } - - /** - * Writes a settings line to the export. - * - * @param string $key Key string. - * @param string $val Value string. - * - * @return void - */ - private function write_setting( $key, $val ) { - if ( is_string( $val ) ) { - $val = '"' . $val . '"'; - } - $this->write_line( $key . ' = ' . $val ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-expose-shortlinks.php b/wp/wp-content/plugins/wordpress-seo/admin/class-expose-shortlinks.php deleted file mode 100644 index e6a589b6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-expose-shortlinks.php +++ /dev/null @@ -1,143 +0,0 @@ - 'https://yoa.st/allow-search-engines', - 'shortlinks.advanced.follow_links' => 'https://yoa.st/follow-links', - 'shortlinks.advanced.meta_robots' => 'https://yoa.st/meta-robots-advanced', - 'shortlinks.advanced.breadcrumbs_title' => 'https://yoa.st/breadcrumbs-title', - 'shortlinks.metabox.schema.explanation' => 'https://yoa.st/400', - 'shortlinks.metabox.schema.page_type' => 'https://yoa.st/402', - 'shortlinks.sidebar.schema.explanation' => 'https://yoa.st/401', - 'shortlinks.sidebar.schema.page_type' => 'https://yoa.st/403', - 'shortlinks.focus_keyword_info' => 'https://yoa.st/focus-keyword', - 'shortlinks.nofollow_sponsored' => 'https://yoa.st/nofollow-sponsored', - 'shortlinks.snippet_preview_info' => 'https://yoa.st/snippet-preview', - 'shortlinks.cornerstone_content_info' => 'https://yoa.st/1i9', - 'shortlinks.upsell.social_preview.social' => 'https://yoa.st/social-preview-facebook', - 'shortlinks.upsell.social_preview.x' => 'https://yoa.st/social-preview-twitter', - 'shortlinks.upsell.sidebar.news' => 'https://yoa.st/get-news-sidebar', - 'shortlinks.upsell.sidebar.focus_keyword_synonyms_button' => 'https://yoa.st/keyword-synonyms-popup-sidebar', - 'shortlinks.upsell.sidebar.premium_seo_analysis_button' => 'https://yoa.st/premium-seo-analysis-sidebar', - 'shortlinks.upsell.sidebar.focus_keyword_additional_button' => 'https://yoa.st/add-keywords-popup-sidebar', - 'shortlinks.upsell.sidebar.additional_link' => 'https://yoa.st/textlink-keywords-sidebar', - 'shortlinks.upsell.sidebar.additional_button' => 'https://yoa.st/add-keywords-sidebar', - 'shortlinks.upsell.sidebar.keyphrase_distribution' => 'https://yoa.st/keyphrase-distribution-sidebar', - 'shortlinks.upsell.sidebar.word_complexity' => 'https://yoa.st/word-complexity-sidebar', - 'shortlinks.upsell.sidebar.internal_linking_suggestions' => 'https://yoa.st/internal-linking-suggestions-sidebar', - 'shortlinks.upsell.sidebar.highlighting_seo_analysis' => 'https://yoa.st/highlighting-seo-analysis', - 'shortlinks.upsell.sidebar.highlighting_readability_analysis' => 'https://yoa.st/highlighting-readability-analysis', - 'shortlinks.upsell.sidebar.highlighting_inclusive_analysis' => 'https://yoa.st/highlighting-inclusive-analysis', - 'shortlinks.upsell.metabox.news' => 'https://yoa.st/get-news-metabox', - 'shortlinks.upsell.metabox.go_premium' => 'https://yoa.st/pe-premium-page', - 'shortlinks.upsell.metabox.focus_keyword_synonyms_button' => 'https://yoa.st/keyword-synonyms-popup', - 'shortlinks.upsell.metabox.premium_seo_analysis_button' => 'https://yoa.st/premium-seo-analysis-metabox', - 'shortlinks.upsell.metabox.focus_keyword_additional_button' => 'https://yoa.st/add-keywords-popup', - 'shortlinks.upsell.metabox.additional_link' => 'https://yoa.st/textlink-keywords-metabox', - 'shortlinks.upsell.metabox.additional_button' => 'https://yoa.st/add-keywords-metabox', - 'shortlinks.upsell.metabox.keyphrase_distribution' => 'https://yoa.st/keyphrase-distribution-metabox', - 'shortlinks.upsell.metabox.word_complexity' => 'https://yoa.st/word-complexity-metabox', - 'shortlinks.upsell.metabox.internal_linking_suggestions' => 'https://yoa.st/internal-linking-suggestions-metabox', - 'shortlinks.upsell.gsc.create_redirect_button' => 'https://yoa.st/redirects', - 'shortlinks.readability_analysis_info' => 'https://yoa.st/readability-analysis', - 'shortlinks.inclusive_language_analysis_info' => 'https://yoa.st/inclusive-language-analysis', - 'shortlinks.activate_premium_info' => 'https://yoa.st/activate-subscription', - 'shortlinks.upsell.sidebar.morphology_upsell_metabox' => 'https://yoa.st/morphology-upsell-metabox', - 'shortlinks.upsell.sidebar.morphology_upsell_sidebar' => 'https://yoa.st/morphology-upsell-sidebar', - 'shortlinks.semrush.volume_help' => 'https://yoa.st/3-v', - 'shortlinks.semrush.trend_help' => 'https://yoa.st/3-v', - 'shortlinks.semrush.prices' => 'https://yoa.st/semrush-prices', - 'shortlinks.semrush.premium_landing_page' => 'https://yoa.st/413', - 'shortlinks.wincher.seo_performance' => 'https://yoa.st/wincher-integration', - 'shortlinks-insights-estimated_reading_time' => 'https://yoa.st/4fd', - 'shortlinks-insights-flesch_reading_ease' => 'https://yoa.st/34r', - 'shortlinks-insights-flesch_reading_ease_sidebar' => 'https://yoa.st/4mf', - 'shortlinks-insights-flesch_reading_ease_metabox' => 'https://yoa.st/4mg', - 'shortlinks-insights-flesch_reading_ease_article' => 'https://yoa.st/34s', - 'shortlinks-insights-keyword_research_link' => 'https://yoa.st/keyword-research-metabox', - 'shortlinks-insights-upsell-sidebar-prominent_words' => 'https://yoa.st/prominent-words-upsell-sidebar', - 'shortlinks-insights-upsell-metabox-prominent_words' => 'https://yoa.st/prominent-words-upsell-metabox', - 'shortlinks-insights-upsell-elementor-prominent_words' => 'https://yoa.st/prominent-words-upsell-elementor', - 'shortlinks-insights-word_count' => 'https://yoa.st/word-count', - 'shortlinks-insights-upsell-sidebar-text_formality' => 'https://yoa.st/formality-upsell-sidebar', - 'shortlinks-insights-upsell-metabox-text_formality' => 'https://yoa.st/formality-upsell-metabox', - 'shortlinks-insights-upsell-elementor-text_formality' => 'https://yoa.st/formality-upsell-elementor', - 'shortlinks-insights-text_formality_info_free' => 'https://yoa.st/formality-free', - 'shortlinks-insights-text_formality_info_premium' => 'https://yoa.st/formality', - ]; - - /** - * Registers all hooks to WordPress. - * - * @return void - */ - public function register_hooks() { - add_filter( 'wpseo_admin_l10n', [ $this, 'expose_shortlinks' ] ); - } - - /** - * Adds shortlinks to the passed array. - * - * @param array $input The array to add shortlinks to. - * - * @return array The passed array with the additional shortlinks. - */ - public function expose_shortlinks( $input ) { - foreach ( $this->get_shortlinks() as $key => $shortlink ) { - $input[ $key ] = WPSEO_Shortlinker::get( $shortlink ); - } - - $input['default_query_params'] = WPSEO_Shortlinker::get_query_params(); - - return $input; - } - - /** - * Retrieves the shortlinks. - * - * @return array The shortlinks. - */ - private function get_shortlinks() { - if ( ! $this->is_term_edit() ) { - return $this->shortlinks; - } - - $shortlinks = $this->shortlinks; - - $shortlinks['shortlinks.upsell.metabox.focus_keyword_synonyms_button'] = 'https://yoa.st/keyword-synonyms-popup-term'; - $shortlinks['shortlinks.upsell.metabox.focus_keyword_additional_button'] = 'https://yoa.st/add-keywords-popup-term'; - $shortlinks['shortlinks.upsell.metabox.additional_link'] = 'https://yoa.st/textlink-keywords-metabox-term'; - $shortlinks['shortlinks.upsell.metabox.additional_button'] = 'https://yoa.st/add-keywords-metabox-term'; - $shortlinks['shortlinks.upsell.sidebar.morphology_upsell_metabox'] = 'https://yoa.st/morphology-upsell-metabox-term'; - $shortlinks['shortlinks.upsell.metabox.keyphrase_distribution'] = 'https://yoa.st/keyphrase-distribution-metabox-term'; - $shortlinks['shortlinks.upsell.metabox.word_complexity'] = 'https://yoa.st/word-complexity-metabox-term'; - $shortlinks['shortlinks.upsell.metabox.internal_linking_suggestions'] = 'https://yoa.st/internal-linking-suggestions-metabox-term'; - - return $shortlinks; - } - - /** - * Checks if the current page is a term edit page. - * - * @return bool True when page is term edit. - */ - private function is_term_edit() { - global $pagenow; - - return WPSEO_Taxonomy::is_term_edit( $pagenow ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-gutenberg-compatibility.php b/wp/wp-content/plugins/wordpress-seo/admin/class-gutenberg-compatibility.php deleted file mode 100644 index 18e1b384..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-gutenberg-compatibility.php +++ /dev/null @@ -1,107 +0,0 @@ -current_version = $this->detect_installed_gutenberg_version(); - } - - /** - * Determines whether or not Gutenberg is installed. - * - * @return bool Whether or not Gutenberg is installed. - */ - public function is_installed() { - return $this->current_version !== ''; - } - - /** - * Determines whether or not the currently installed version of Gutenberg is below the minimum supported version. - * - * @return bool True if the currently installed version is below the minimum supported version. False otherwise. - */ - public function is_below_minimum() { - return version_compare( $this->current_version, $this->get_minimum_supported_version(), '<' ); - } - - /** - * Gets the currently installed version. - * - * @return string The currently installed version. - */ - public function get_installed_version() { - return $this->current_version; - } - - /** - * Determines whether or not the currently installed version of Gutenberg is the latest, fully compatible version. - * - * @return bool Whether or not the currently installed version is fully compatible. - */ - public function is_fully_compatible() { - return version_compare( $this->current_version, $this->get_latest_release(), '>=' ); - } - - /** - * Gets the latest released version of Gutenberg. - * - * @return string The latest release. - */ - protected function get_latest_release() { - return self::CURRENT_RELEASE; - } - - /** - * Gets the minimum supported version of Gutenberg. - * - * @return string The minumum supported release. - */ - protected function get_minimum_supported_version() { - return self::MINIMUM_SUPPORTED; - } - - /** - * Detects the currently installed Gutenberg version. - * - * @return string The currently installed Gutenberg version. Empty if the version couldn't be detected. - */ - protected function detect_installed_gutenberg_version() { - if ( defined( 'GUTENBERG_VERSION' ) ) { - return GUTENBERG_VERSION; - } - - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-meta-columns.php b/wp/wp-content/plugins/wordpress-seo/admin/class-meta-columns.php deleted file mode 100644 index 7b2108fb..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-meta-columns.php +++ /dev/null @@ -1,839 +0,0 @@ -analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - $this->analysis_readability = new WPSEO_Metabox_Analysis_Readability(); - $this->admin_columns_cache = YoastSEO()->classes->get( Admin_Columns_Cache_Integration::class ); - $this->score_icon_helper = YoastSEO()->helpers->score_icon; - } - - /** - * Sets up up the hooks. - * - * @return void - */ - public function setup_hooks() { - $this->set_post_type_hooks(); - - if ( $this->analysis_seo->is_enabled() ) { - add_action( 'restrict_manage_posts', [ $this, 'posts_filter_dropdown' ] ); - } - - if ( $this->analysis_readability->is_enabled() ) { - add_action( 'restrict_manage_posts', [ $this, 'posts_filter_dropdown_readability' ] ); - } - - add_filter( 'request', [ $this, 'column_sort_orderby' ] ); - add_filter( 'default_hidden_columns', [ $this, 'column_hidden' ], 10, 1 ); - } - - /** - * Adds the column headings for the SEO plugin for edit posts / pages overview. - * - * @param array $columns Already existing columns. - * - * @return array Array containing the column headings. - */ - public function column_heading( $columns ) { - if ( $this->display_metabox() === false ) { - return $columns; - } - - $added_columns = []; - - if ( $this->analysis_seo->is_enabled() ) { - $added_columns['wpseo-score'] = '' - . __( 'SEO score', 'wordpress-seo' ) - . ''; - } - - if ( $this->analysis_readability->is_enabled() ) { - $added_columns['wpseo-score-readability'] = '' - . __( 'Readability score', 'wordpress-seo' ) - . ''; - } - - $added_columns['wpseo-title'] = __( 'SEO Title', 'wordpress-seo' ); - $added_columns['wpseo-metadesc'] = __( 'Meta Desc.', 'wordpress-seo' ); - - if ( $this->analysis_seo->is_enabled() ) { - $added_columns['wpseo-focuskw'] = __( 'Keyphrase', 'wordpress-seo' ); - } - - return array_merge( $columns, $added_columns ); - } - - /** - * Displays the column content for the given column. - * - * @param string $column_name Column to display the content for. - * @param int $post_id Post to display the column content for. - * - * @return void - */ - public function column_content( $column_name, $post_id ) { - if ( $this->display_metabox() === false ) { - return; - } - - switch ( $column_name ) { - case 'wpseo-score': - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Correctly escaped in render_score_indicator() method. - echo $this->parse_column_score( $post_id ); - - return; - - case 'wpseo-score-readability': - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Correctly escaped in render_score_indicator() method. - echo $this->parse_column_score_readability( $post_id ); - - return; - - case 'wpseo-title': - $meta = $this->get_meta( $post_id ); - if ( $meta ) { - echo esc_html( $meta->title ); - } - - return; - - case 'wpseo-metadesc': - $metadesc_val = ''; - $meta = $this->get_meta( $post_id ); - if ( $meta ) { - $metadesc_val = $meta->meta_description; - } - if ( $metadesc_val === '' ) { - echo '', - /* translators: Hidden accessibility text. */ - esc_html__( 'Meta description not set.', 'wordpress-seo' ), - ''; - - return; - } - - echo esc_html( $metadesc_val ); - - return; - - case 'wpseo-focuskw': - $focuskw_val = WPSEO_Meta::get_value( 'focuskw', $post_id ); - - if ( $focuskw_val === '' ) { - echo '', - /* translators: Hidden accessibility text. */ - esc_html__( 'Focus keyphrase not set.', 'wordpress-seo' ), - ''; - - return; - } - - echo esc_html( $focuskw_val ); - - return; - } - } - - /** - * Indicates which of the SEO columns are sortable. - * - * @param array $columns Appended with their orderby variable. - * - * @return array Array containing the sortable columns. - */ - public function column_sort( $columns ) { - if ( $this->display_metabox() === false ) { - return $columns; - } - - $columns['wpseo-metadesc'] = 'wpseo-metadesc'; - - if ( $this->analysis_seo->is_enabled() ) { - $columns['wpseo-focuskw'] = 'wpseo-focuskw'; - $columns['wpseo-score'] = 'wpseo-score'; - } - - if ( $this->analysis_readability->is_enabled() ) { - $columns['wpseo-score-readability'] = 'wpseo-score-readability'; - } - - return $columns; - } - - /** - * Hides the SEO title, meta description and focus keyword columns if the user hasn't chosen which columns to hide. - * - * @param array $hidden The hidden columns. - * - * @return array Array containing the columns to hide. - */ - public function column_hidden( $hidden ) { - if ( ! is_array( $hidden ) ) { - $hidden = []; - } - - array_push( $hidden, 'wpseo-title', 'wpseo-metadesc' ); - - if ( $this->analysis_seo->is_enabled() ) { - $hidden[] = 'wpseo-focuskw'; - } - - return $hidden; - } - - /** - * Adds a dropdown that allows filtering on the posts SEO Quality. - * - * @return void - */ - public function posts_filter_dropdown() { - if ( ! $this->can_display_filter() ) { - return; - } - - $ranks = WPSEO_Rank::get_all_ranks(); - - /* translators: Hidden accessibility text. */ - echo ''; - echo ''; - } - - /** - * Adds a dropdown that allows filtering on the posts Readability Quality. - * - * @return void - */ - public function posts_filter_dropdown_readability() { - if ( ! $this->can_display_filter() ) { - return; - } - - $ranks = WPSEO_Rank::get_all_readability_ranks(); - - /* translators: Hidden accessibility text. */ - echo ''; - echo ''; - } - - /** - * Generates an '; - } - - /** - * Returns the meta object for a given post ID. - * - * @param int $post_id The post ID. - * - * @return Meta The meta object. - */ - protected function get_meta( $post_id ) { - $indexable = $this->admin_columns_cache->get_indexable( $post_id ); - - return YoastSEO()->meta->for_indexable( $indexable, 'Post_Type' ); - } - - /** - * Determines the SEO score filter to be later used in the meta query, based on the passed SEO filter. - * - * @param string $seo_filter The SEO filter to use to determine what further filter to apply. - * - * @return array The SEO score filter. - */ - protected function determine_seo_filters( $seo_filter ) { - if ( $seo_filter === WPSEO_Rank::NO_FOCUS ) { - return $this->create_no_focus_keyword_filter(); - } - - if ( $seo_filter === WPSEO_Rank::NO_INDEX ) { - return $this->create_no_index_filter(); - } - - $rank = new WPSEO_Rank( $seo_filter ); - - return $this->create_seo_score_filter( $rank->get_starting_score(), $rank->get_end_score() ); - } - - /** - * Determines the Readability score filter to the meta query, based on the passed Readability filter. - * - * @param string $readability_filter The Readability filter to use to determine what further filter to apply. - * - * @return array The Readability score filter. - */ - protected function determine_readability_filters( $readability_filter ) { - $rank = new WPSEO_Rank( $readability_filter ); - - return $this->create_readability_score_filter( $rank->get_starting_score(), $rank->get_end_score() ); - } - - /** - * Creates a keyword filter for the meta query, based on the passed Keyword filter. - * - * @param string $keyword_filter The keyword filter to use. - * - * @return array The keyword filter. - */ - protected function get_keyword_filter( $keyword_filter ) { - return [ - 'post_type' => get_query_var( 'post_type', 'post' ), - 'key' => WPSEO_Meta::$meta_prefix . 'focuskw', - 'value' => sanitize_text_field( $keyword_filter ), - ]; - } - - /** - * Determines whether the passed filter is considered to be valid. - * - * @param mixed $filter The filter to check against. - * - * @return bool Whether the filter is considered valid. - */ - protected function is_valid_filter( $filter ) { - return ! empty( $filter ) && is_string( $filter ); - } - - /** - * Collects the filters and merges them into a single array. - * - * @return array Array containing all the applicable filters. - */ - protected function collect_filters() { - $active_filters = []; - - $seo_filter = $this->get_current_seo_filter(); - $readability_filter = $this->get_current_readability_filter(); - $current_keyword_filter = $this->get_current_keyword_filter(); - - if ( $this->is_valid_filter( $seo_filter ) ) { - $active_filters = array_merge( - $active_filters, - $this->determine_seo_filters( $seo_filter ) - ); - } - - if ( $this->is_valid_filter( $readability_filter ) ) { - $active_filters = array_merge( - $active_filters, - $this->determine_readability_filters( $readability_filter ) - ); - } - - if ( $this->is_valid_filter( $current_keyword_filter ) ) { - /** - * Adapt the meta query used to filter the post overview on keyphrase. - * - * @internal - * - * @param array $keyphrase The keyphrase used in the filter. - * @param array $keyword_filter The current keyword filter. - */ - $keyphrase_filter = apply_filters( - 'wpseo_change_keyphrase_filter_in_request', - $this->get_keyword_filter( $current_keyword_filter ), - $current_keyword_filter - ); - - if ( is_array( $keyphrase_filter ) ) { - $active_filters = array_merge( - $active_filters, - [ $keyphrase_filter ] - ); - } - } - - /** - * Adapt the active applicable filters on the posts overview. - * - * @internal - * - * @param array $active_filters The current applicable filters. - */ - return apply_filters( 'wpseo_change_applicable_filters', $active_filters ); - } - - /** - * Modify the query based on the filters that are being passed. - * - * @param array $vars Query variables that need to be modified based on the filters. - * - * @return array Array containing the meta query to use for filtering the posts overview. - */ - public function column_sort_orderby( $vars ) { - $collected_filters = $this->collect_filters(); - - $order_by_column = $vars['orderby']; - if ( isset( $order_by_column ) ) { - // Based on the selected column, create a meta query. - $order_by = $this->filter_order_by( $order_by_column ); - - /** - * Adapt the order by part of the query on the posts overview. - * - * @internal - * - * @param array $order_by The current order by. - * @param string $order_by_column The current order by column. - */ - $order_by = apply_filters( 'wpseo_change_order_by', $order_by, $order_by_column ); - - $vars = array_merge( $vars, $order_by ); - } - - return $this->build_filter_query( $vars, $collected_filters ); - } - - /** - * Retrieves the meta robots query values to be used within the meta query. - * - * @return array Array containing the query parameters regarding meta robots. - */ - protected function get_meta_robots_query_values() { - return [ - 'relation' => 'OR', - [ - 'key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', - 'compare' => 'NOT EXISTS', - ], - [ - 'key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', - 'value' => '1', - 'compare' => '!=', - ], - ]; - } - - /** - * Determines the score filters to be used. If more than one is passed, it created an AND statement for the query. - * - * @param array $score_filters Array containing the score filters. - * - * @return array Array containing the score filters that need to be applied to the meta query. - */ - protected function determine_score_filters( $score_filters ) { - if ( count( $score_filters ) > 1 ) { - return array_merge( [ 'relation' => 'AND' ], $score_filters ); - } - - return $score_filters; - } - - /** - * Retrieves the post type from the $_GET variable. - * - * @return string|null The sanitized current post type or null when the variable is not set in $_GET. - */ - public function get_current_post_type() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['post_type'] ) && is_string( $_GET['post_type'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - return sanitize_text_field( wp_unslash( $_GET['post_type'] ) ); - } - return null; - } - - /** - * Retrieves the SEO filter from the $_GET variable. - * - * @return string|null The sanitized seo filter or null when the variable is not set in $_GET. - */ - public function get_current_seo_filter() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['seo_filter'] ) && is_string( $_GET['seo_filter'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - return sanitize_text_field( wp_unslash( $_GET['seo_filter'] ) ); - } - return null; - } - - /** - * Retrieves the Readability filter from the $_GET variable. - * - * @return string|null The sanitized readability filter or null when the variable is not set in $_GET. - */ - public function get_current_readability_filter() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['readability_filter'] ) && is_string( $_GET['readability_filter'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - return sanitize_text_field( wp_unslash( $_GET['readability_filter'] ) ); - } - return null; - } - - /** - * Retrieves the keyword filter from the $_GET variable. - * - * @return string|null The sanitized seo keyword filter or null when the variable is not set in $_GET. - */ - public function get_current_keyword_filter() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['seo_kw_filter'] ) && is_string( $_GET['seo_kw_filter'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - return sanitize_text_field( wp_unslash( $_GET['seo_kw_filter'] ) ); - } - return null; - } - - /** - * Uses the vars to create a complete filter query that can later be executed to filter out posts. - * - * @param array $vars Array containing the variables that will be used in the meta query. - * @param array $filters Array containing the filters that we need to apply in the meta query. - * - * @return array Array containing the complete filter query. - */ - protected function build_filter_query( $vars, $filters ) { - // If no filters were applied, just return everything. - if ( count( $filters ) === 0 ) { - return $vars; - } - - $result = [ 'meta_query' => [] ]; - $result['meta_query'] = array_merge( $result['meta_query'], [ $this->determine_score_filters( $filters ) ] ); - - $current_seo_filter = $this->get_current_seo_filter(); - - // This only applies for the SEO score filter because it can because the SEO score can be altered by the no-index option. - if ( $this->is_valid_filter( $current_seo_filter ) && ! in_array( $current_seo_filter, [ WPSEO_Rank::NO_INDEX, WPSEO_Rank::NO_FOCUS ], true ) ) { - $result['meta_query'] = array_merge( $result['meta_query'], [ $this->get_meta_robots_query_values() ] ); - } - - return array_merge( $vars, $result ); - } - - /** - * Creates a Readability score filter. - * - * @param number $low The lower boundary of the score. - * @param number $high The higher boundary of the score. - * - * @return array The Readability Score filter. - */ - protected function create_readability_score_filter( $low, $high ) { - return [ - [ - 'key' => WPSEO_Meta::$meta_prefix . 'content_score', - 'value' => [ $low, $high ], - 'type' => 'numeric', - 'compare' => 'BETWEEN', - ], - ]; - } - - /** - * Creates an SEO score filter. - * - * @param number $low The lower boundary of the score. - * @param number $high The higher boundary of the score. - * - * @return array The SEO score filter. - */ - protected function create_seo_score_filter( $low, $high ) { - return [ - [ - 'key' => WPSEO_Meta::$meta_prefix . 'linkdex', - 'value' => [ $low, $high ], - 'type' => 'numeric', - 'compare' => 'BETWEEN', - ], - ]; - } - - /** - * Creates a filter to retrieve posts that were set to no-index. - * - * @return array Array containin the no-index filter. - */ - protected function create_no_index_filter() { - return [ - [ - 'key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', - 'value' => '1', - 'compare' => '=', - ], - ]; - } - - /** - * Creates a filter to retrieve posts that have no keyword set. - * - * @return array Array containing the no focus keyword filter. - */ - protected function create_no_focus_keyword_filter() { - return [ - [ - 'key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', - 'value' => 'needs-a-value-anyway', - 'compare' => 'NOT EXISTS', - ], - [ - 'key' => WPSEO_Meta::$meta_prefix . 'linkdex', - 'value' => 'needs-a-value-anyway', - 'compare' => 'NOT EXISTS', - ], - ]; - } - - /** - * Determines whether a particular post_id is of an indexable post type. - * - * @param string $post_id The post ID to check. - * - * @return bool Whether or not it is indexable. - */ - protected function is_indexable( $post_id ) { - if ( ! empty( $post_id ) && ! $this->uses_default_indexing( $post_id ) ) { - return WPSEO_Meta::get_value( 'meta-robots-noindex', $post_id ) === '2'; - } - - $post = get_post( $post_id ); - - if ( is_object( $post ) ) { - // If the option is false, this means we want to index it. - return WPSEO_Options::get( 'noindex-' . $post->post_type, false ) === false; - } - - return true; - } - - /** - * Determines whether the given post ID uses the default indexing settings. - * - * @param int $post_id The post ID to check. - * - * @return bool Whether or not the default indexing is being used for the post. - */ - protected function uses_default_indexing( $post_id ) { - return WPSEO_Meta::get_value( 'meta-robots-noindex', $post_id ) === '0'; - } - - /** - * Returns filters when $order_by is matched in the if-statement. - * - * @param string $order_by The ID of the column by which to order the posts. - * - * @return array Array containing the order filters. - */ - private function filter_order_by( $order_by ) { - switch ( $order_by ) { - case 'wpseo-metadesc': - return [ - // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: Only used when user requests sorting. - 'meta_key' => WPSEO_Meta::$meta_prefix . 'metadesc', - 'orderby' => 'meta_value', - ]; - - case 'wpseo-focuskw': - return [ - // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: Only used when user requests sorting. - 'meta_key' => WPSEO_Meta::$meta_prefix . 'focuskw', - 'orderby' => 'meta_value', - ]; - - case 'wpseo-score': - return [ - // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: Only used when user requests sorting. - 'meta_key' => WPSEO_Meta::$meta_prefix . 'linkdex', - 'orderby' => 'meta_value_num', - ]; - - case 'wpseo-score-readability': - return [ - // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: Only used when user requests sorting. - 'meta_key' => WPSEO_Meta::$meta_prefix . 'content_score', - 'orderby' => 'meta_value_num', - ]; - } - - return []; - } - - /** - * Parses the score column. - * - * @param int $post_id The ID of the post for which to show the score. - * - * @return string The HTML for the SEO score indicator. - */ - private function parse_column_score( $post_id ) { - $meta = $this->get_meta( $post_id ); - - if ( $meta ) { - return $this->score_icon_helper->for_seo( $meta->indexable, '', __( 'Post is set to noindex.', 'wordpress-seo' ) ); - } - } - - /** - * Parsing the readability score column. - * - * @param int $post_id The ID of the post for which to show the readability score. - * - * @return string The HTML for the readability score indicator. - */ - private function parse_column_score_readability( $post_id ) { - $meta = $this->get_meta( $post_id ); - if ( $meta ) { - return $this->score_icon_helper->for_readability( $meta->indexable->readability_score ); - } - } - - /** - * Sets up the hooks for the post_types. - * - * @return void - */ - private function set_post_type_hooks() { - $post_types = WPSEO_Post_Type::get_accessible_post_types(); - - if ( ! is_array( $post_types ) || $post_types === [] ) { - return; - } - - foreach ( $post_types as $post_type ) { - if ( $this->display_metabox( $post_type ) === false ) { - continue; - } - - add_filter( 'manage_' . $post_type . '_posts_columns', [ $this, 'column_heading' ], 10, 1 ); - add_action( 'manage_' . $post_type . '_posts_custom_column', [ $this, 'column_content' ], 10, 2 ); - add_action( 'manage_edit-' . $post_type . '_sortable_columns', [ $this, 'column_sort' ], 10, 2 ); - } - - unset( $post_type ); - } - - /** - * Wraps the WPSEO_Metabox check to determine whether the metabox should be displayed either by - * choice of the admin or because the post type is not a public post type. - * - * @since 7.0 - * - * @param string|null $post_type Optional. The post type to test, defaults to the current post post_type. - * - * @return bool Whether or not the meta box (and associated columns etc) should be hidden. - */ - private function display_metabox( $post_type = null ) { - $current_post_type = $this->get_current_post_type(); - - if ( ! isset( $post_type ) && ! empty( $current_post_type ) ) { - $post_type = $current_post_type; - } - - return WPSEO_Utils::is_metabox_active( $post_type, 'post_type' ); - } - - /** - * Determines whether or not filter dropdowns should be displayed. - * - * @return bool Whether or the current page can display the filter drop downs. - */ - public function can_display_filter() { - if ( $GLOBALS['pagenow'] === 'upload.php' ) { - return false; - } - - if ( $this->display_metabox() === false ) { - return false; - } - - $screen = get_current_screen(); - if ( $screen === null ) { - return false; - } - - return WPSEO_Post_Type::is_post_type_accessible( $screen->post_type ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-my-yoast-proxy.php b/wp/wp-content/plugins/wordpress-seo/admin/class-my-yoast-proxy.php deleted file mode 100644 index 53659c12..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-my-yoast-proxy.php +++ /dev/null @@ -1,219 +0,0 @@ -is_proxy_page() ) { - return; - } - - // Register the page for the proxy. - add_action( 'admin_menu', [ $this, 'add_proxy_page' ] ); - add_action( 'admin_init', [ $this, 'handle_proxy_page' ] ); - } - - /** - * Registers the proxy page. It does not actually add a link to the dashboard. - * - * @codeCoverageIgnore - * - * @return void - */ - public function add_proxy_page() { - add_dashboard_page( '', '', 'read', self::PAGE_IDENTIFIER, '' ); - } - - /** - * Renders the requested proxy page and exits to prevent the WordPress UI from loading. - * - * @codeCoverageIgnore - * - * @return void - */ - public function handle_proxy_page() { - $this->render_proxy_page(); - - // Prevent the WordPress UI from loading. - exit; - } - - /** - * Renders the requested proxy page. - * - * This is separated from the exits to be able to test it. - * - * @return void - */ - public function render_proxy_page() { - $proxy_options = $this->determine_proxy_options(); - if ( $proxy_options === [] ) { - // Do not accept any other file than implemented. - $this->set_header( 'HTTP/1.0 501 Requested file not implemented' ); - return; - } - - // Set the headers before serving the remote file. - $this->set_header( 'Content-Type: ' . $proxy_options['content_type'] ); - $this->set_header( 'Cache-Control: max-age=' . self::CACHE_CONTROL_MAX_AGE ); - - try { - echo $this->get_remote_url_body( $proxy_options['url'] ); - } - catch ( Exception $e ) { - /* - * Reset the file headers because the loading failed. - * - * Note: Due to supporting PHP 5.2 `header_remove` can not be used here. - * Overwrite the headers instead. - */ - $this->set_header( 'Content-Type: text/plain' ); - $this->set_header( 'Cache-Control: max-age=0' ); - - $this->set_header( 'HTTP/1.0 500 ' . $e->getMessage() ); - } - } - - /** - * Tries to load the given url via `wp_remote_get`. - * - * @codeCoverageIgnore - * - * @param string $url The url to load. - * - * @return string The body of the response. - * - * @throws Exception When `wp_remote_get` returned an error. - * @throws Exception When the response code is not 200. - */ - protected function get_remote_url_body( $url ) { - $response = wp_remote_get( $url ); - - if ( $response instanceof WP_Error ) { - throw new Exception( 'Unable to retrieve file from MyYoast' ); - } - - if ( wp_remote_retrieve_response_code( $response ) !== 200 ) { - throw new Exception( 'Received unexpected response from MyYoast' ); - } - - return wp_remote_retrieve_body( $response ); - } - - /** - * Determines the proxy options based on the file and plugin version arguments. - * - * When the file is known it returns an array like this: - * - * $array = array( - * 'content_type' => 'the content type' - * 'url' => 'the url, possibly with the plugin version' - * ) - * - * - * @return array Empty for an unknown file. See format above for known files. - */ - protected function determine_proxy_options() { - if ( $this->get_proxy_file() === 'research-webworker' ) { - return [ - 'content_type' => 'text/javascript; charset=UTF-8', - 'url' => 'https://my.yoast.com/api/downloads/file/analysis-worker?plugin_version=' . $this->get_plugin_version(), - ]; - } - - return []; - } - - /** - * Checks if the current page is the MyYoast proxy page. - * - * @codeCoverageIgnore - * - * @return bool True when the page request parameter equals the proxy page. - */ - protected function is_proxy_page() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - $page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; - return $page === self::PAGE_IDENTIFIER; - } - - /** - * Returns the proxy file from the HTTP request parameters. - * - * @codeCoverageIgnore - * - * @return string The sanitized file request parameter or an empty string if it does not exist. - */ - protected function get_proxy_file() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['file'] ) && is_string( $_GET['file'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - return sanitize_text_field( wp_unslash( $_GET['file'] ) ); - } - return ''; - } - - /** - * Returns the plugin version from the HTTP request parameters. - * - * @codeCoverageIgnore - * - * @return string The sanitized plugin_version request parameter or an empty string if it does not exist. - */ - protected function get_plugin_version() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['plugin_version'] ) && is_string( $_GET['plugin_version'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - $plugin_version = sanitize_text_field( wp_unslash( $_GET['plugin_version'] ) ); - // Replace slashes to secure against requiring a file from another path. - return str_replace( [ '/', '\\' ], '_', $plugin_version ); - } - return ''; - } - - /** - * Sets the HTTP header. - * - * This is a tiny helper function to enable better testing. - * - * @codeCoverageIgnore - * - * @param string $header The header to set. - * - * @return void - */ - protected function set_header( $header ) { - header( $header ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-option-tab.php b/wp/wp-content/plugins/wordpress-seo/admin/class-option-tab.php deleted file mode 100644 index 4a231258..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-option-tab.php +++ /dev/null @@ -1,112 +0,0 @@ -name = sanitize_title( $name ); - $this->label = $label; - $this->arguments = $arguments; - } - - /** - * Gets the name. - * - * @return string The name. - */ - public function get_name() { - return $this->name; - } - - /** - * Gets the label. - * - * @return string The label. - */ - public function get_label() { - return $this->label; - } - - /** - * Retrieves whether the tab needs a save button. - * - * @return bool True whether the tabs needs a save button. - */ - public function has_save_button() { - return (bool) $this->get_argument( 'save_button', true ); - } - - /** - * Retrieves whether the tab hosts beta functionalities. - * - * @return bool True whether the tab hosts beta functionalities. - */ - public function is_beta() { - return (bool) $this->get_argument( 'beta', false ); - } - - /** - * Retrieves whether the tab hosts premium functionalities. - * - * @return bool True whether the tab hosts premium functionalities. - */ - public function is_premium() { - return (bool) $this->get_argument( 'premium', false ); - } - - /** - * Gets the option group. - * - * @return string The option group. - */ - public function get_opt_group() { - return $this->get_argument( 'opt_group' ); - } - - /** - * Retrieves the variable from the supplied arguments. - * - * @param string $variable Variable to retrieve. - * @param string|mixed $default_value Default to use when variable not found. - * - * @return mixed|string The retrieved variable. - */ - protected function get_argument( $variable, $default_value = '' ) { - return array_key_exists( $variable, $this->arguments ) ? $this->arguments[ $variable ] : $default_value; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs-formatter.php b/wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs-formatter.php deleted file mode 100644 index 5a54266f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs-formatter.php +++ /dev/null @@ -1,93 +0,0 @@ -get_base() . '/' . $tab->get_name() . '.php'; - } - - /** - * Outputs the option tabs. - * - * @param WPSEO_Option_Tabs $option_tabs Option Tabs to get tabs from. - * - * @return void - */ - public function run( WPSEO_Option_Tabs $option_tabs ) { - - echo ''; - - foreach ( $option_tabs->get_tabs() as $tab ) { - $identifier = $tab->get_name(); - - $class = 'wpseotab ' . ( $tab->has_save_button() ? 'save' : 'nosave' ); - printf( '
              ', esc_attr( $identifier ), esc_attr( $class ) ); - - $tab_filter_name = sprintf( '%s_%s', $option_tabs->get_base(), $tab->get_name() ); - - /** - * Allows to override the content that is display on the specific option tab. - * - * @internal For internal Yoast SEO use only. - * - * @param string|null $tab_contents The content that should be displayed for this tab. Leave empty for default behaviour. - * @param WPSEO_Option_Tabs $option_tabs The registered option tabs. - * @param WPSEO_Option_Tab $tab The tab that is being displayed. - */ - $option_tab_content = apply_filters( 'wpseo_option_tab-' . $tab_filter_name, null, $option_tabs, $tab ); - if ( ! empty( $option_tab_content ) ) { - echo wp_kses_post( $option_tab_content ); - } - - if ( empty( $option_tab_content ) ) { - // Output the settings view for all tabs. - $tab_view = $this->get_tab_view( $option_tabs, $tab ); - - if ( is_file( $tab_view ) ) { - $yform = Yoast_Form::get_instance(); - require $tab_view; - } - } - - echo '
              '; - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs.php b/wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs.php deleted file mode 100644 index fb0c4512..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs.php +++ /dev/null @@ -1,124 +0,0 @@ -base = sanitize_title( $base ); - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - $tab = isset( $_GET['tab'] ) && is_string( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : ''; - $this->active_tab = empty( $tab ) ? $active_tab : $tab; - } - - /** - * Get the base. - * - * @return string - */ - public function get_base() { - return $this->base; - } - - /** - * Add a tab. - * - * @param WPSEO_Option_Tab $tab Tab to add. - * - * @return $this - */ - public function add_tab( WPSEO_Option_Tab $tab ) { - $this->tabs[] = $tab; - - return $this; - } - - /** - * Get active tab. - * - * @return WPSEO_Option_Tab|null Get the active tab. - */ - public function get_active_tab() { - if ( empty( $this->active_tab ) ) { - return null; - } - - $active_tabs = array_filter( $this->tabs, [ $this, 'is_active_tab' ] ); - if ( ! empty( $active_tabs ) ) { - $active_tabs = array_values( $active_tabs ); - if ( count( $active_tabs ) === 1 ) { - return $active_tabs[0]; - } - } - - return null; - } - - /** - * Is the tab the active tab. - * - * @param WPSEO_Option_Tab $tab Tab to check for active tab. - * - * @return bool - */ - public function is_active_tab( WPSEO_Option_Tab $tab ) { - return ( $tab->get_name() === $this->active_tab ); - } - - /** - * Get all tabs. - * - * @return WPSEO_Option_Tab[] - */ - public function get_tabs() { - return $this->tabs; - } - - /** - * Display the tabs. - * - * @param Yoast_Form $yform Yoast Form needed in the views. - * - * @return void - */ - public function display( Yoast_Form $yform ) { - $formatter = new WPSEO_Option_Tabs_Formatter(); - $formatter->run( $this, $yform ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-paper-presenter.php b/wp/wp-content/plugins/wordpress-seo/admin/class-paper-presenter.php deleted file mode 100644 index 99550e4a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-paper-presenter.php +++ /dev/null @@ -1,141 +0,0 @@ - null, - 'paper_id_prefix' => 'wpseo-', - 'collapsible' => false, - 'collapsible_header_class' => '', - 'expanded' => false, - 'help_text' => '', - 'title_after' => '', - 'class' => '', - 'content' => '', - 'view_data' => [], - ]; - - $this->settings = wp_parse_args( $settings, $defaults ); - $this->title = $title; - $this->view_file = $view_file; - } - - /** - * Renders the collapsible paper and returns it as a string. - * - * @return string The rendered paper. - */ - public function get_output() { - $view_variables = $this->get_view_variables(); - - extract( $view_variables, EXTR_SKIP ); - - $content = $this->settings['content']; - - if ( $this->view_file !== null ) { - ob_start(); - require $this->view_file; - $content = ob_get_clean(); - } - - ob_start(); - require WPSEO_PATH . 'admin/views/paper-collapsible.php'; - $rendered_output = ob_get_clean(); - - return $rendered_output; - } - - /** - * Retrieves the view variables. - * - * @return array The view variables. - */ - private function get_view_variables() { - if ( $this->settings['help_text'] instanceof WPSEO_Admin_Help_Panel === false ) { - $this->settings['help_text'] = new WPSEO_Admin_Help_Panel( '', '', '' ); - } - - $view_variables = [ - 'class' => $this->settings['class'], - 'collapsible' => $this->settings['collapsible'], - 'collapsible_config' => $this->collapsible_config(), - 'collapsible_header_class' => $this->settings['collapsible_header_class'], - 'title_after' => $this->settings['title_after'], - 'help_text' => $this->settings['help_text'], - 'view_file' => $this->view_file, - 'title' => $this->title, - 'paper_id' => $this->settings['paper_id'], - 'paper_id_prefix' => $this->settings['paper_id_prefix'], - 'yform' => Yoast_Form::get_instance(), - ]; - - return array_merge( $this->settings['view_data'], $view_variables ); - } - - /** - * Retrieves the collapsible config based on the settings. - * - * @return array The config. - */ - protected function collapsible_config() { - if ( empty( $this->settings['collapsible'] ) ) { - return [ - 'toggle_icon' => '', - 'class' => '', - 'expanded' => '', - ]; - } - - if ( ! empty( $this->settings['expanded'] ) ) { - return [ - 'toggle_icon' => 'dashicons-arrow-up-alt2', - 'class' => 'toggleable-container', - 'expanded' => 'true', - ]; - } - - return [ - 'toggle_icon' => 'dashicons-arrow-down-alt2', - 'class' => 'toggleable-container toggleable-container-hidden', - 'expanded' => 'false', - ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-availability.php b/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-availability.php deleted file mode 100644 index 4d321dd6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-availability.php +++ /dev/null @@ -1,336 +0,0 @@ -register_yoast_plugins(); - $this->register_yoast_plugins_status(); - } - - /** - * Registers all the available Yoast SEO plugins. - * - * @return void - */ - protected function register_yoast_plugins() { - $this->plugins = [ - 'yoast-seo-premium' => [ - 'url' => WPSEO_Shortlinker::get( 'https://yoa.st/1y7' ), - 'title' => 'Yoast SEO Premium', - 'description' => sprintf( - /* translators: %1$s expands to Yoast SEO */ - __( 'The premium version of %1$s with more features & support.', 'wordpress-seo' ), - 'Yoast SEO' - ), - 'installed' => false, - 'slug' => 'wordpress-seo-premium/wp-seo-premium.php', - 'version_sync' => true, - 'premium' => true, - ], - - 'video-seo-for-wordpress-seo-by-yoast' => [ - 'url' => WPSEO_Shortlinker::get( 'https://yoa.st/1y8' ), - 'title' => 'Video SEO', - 'description' => __( 'Optimize your videos to show them off in search results and get more clicks!', 'wordpress-seo' ), - 'installed' => false, - 'slug' => 'wpseo-video/video-seo.php', - 'version_sync' => true, - 'premium' => true, - ], - - 'yoast-news-seo' => [ - 'url' => WPSEO_Shortlinker::get( 'https://yoa.st/1y9' ), - 'title' => 'News SEO', - 'description' => __( 'Are you in Google News? Increase your traffic from Google News by optimizing for it!', 'wordpress-seo' ), - 'installed' => false, - 'slug' => 'wpseo-news/wpseo-news.php', - 'version_sync' => true, - 'premium' => true, - ], - - 'local-seo-for-yoast-seo' => [ - 'url' => WPSEO_Shortlinker::get( 'https://yoa.st/1ya' ), - 'title' => 'Local SEO', - 'description' => __( 'Rank better locally and in Google Maps, without breaking a sweat!', 'wordpress-seo' ), - 'installed' => false, - 'slug' => 'wordpress-seo-local/local-seo.php', - 'version_sync' => true, - 'premium' => true, - ], - - 'yoast-woocommerce-seo' => [ - 'url' => WPSEO_Shortlinker::get( 'https://yoa.st/1o0' ), - 'title' => 'Yoast WooCommerce SEO', - 'description' => sprintf( - /* translators: %1$s expands to Yoast SEO */ - __( 'Seamlessly integrate WooCommerce with %1$s and get extra features!', 'wordpress-seo' ), - 'Yoast SEO' - ), - '_dependencies' => [ - 'WooCommerce' => [ - 'slug' => 'woocommerce/woocommerce.php', // Kept for backwards compatibility, in case external code uses get_dependencies(). Deprecated in 22.4. - 'conditional' => new WooCommerce_Conditional(), - ], - ], - 'installed' => false, - 'slug' => 'wpseo-woocommerce/wpseo-woocommerce.php', - 'version_sync' => true, - 'premium' => true, - ], - ]; - } - - /** - * Sets certain plugin properties based on WordPress' status. - * - * @return void - */ - protected function register_yoast_plugins_status() { - - foreach ( $this->plugins as $name => $plugin ) { - - $plugin_slug = $plugin['slug']; - $plugin_path = WP_PLUGIN_DIR . '/' . $plugin_slug; - - if ( file_exists( $plugin_path ) ) { - $plugin_data = get_plugin_data( $plugin_path, false, false ); - $this->plugins[ $name ]['installed'] = true; - $this->plugins[ $name ]['version'] = $plugin_data['Version']; - $this->plugins[ $name ]['active'] = is_plugin_active( $plugin_slug ); - } - } - } - - /** - * Checks whether or not a plugin is known within the Yoast SEO collection. - * - * @param string $plugin The plugin to search for. - * - * @return bool Whether or not the plugin is exists. - */ - protected function plugin_exists( $plugin ) { - return isset( $this->plugins[ $plugin ] ); - } - - /** - * Gets all the possibly available plugins. - * - * @return array Array containing the information about the plugins. - */ - public function get_plugins() { - return $this->plugins; - } - - /** - * Gets a specific plugin. Returns an empty array if it cannot be found. - * - * @param string $plugin The plugin to search for. - * - * @return array The plugin properties. - */ - public function get_plugin( $plugin ) { - if ( ! $this->plugin_exists( $plugin ) ) { - return []; - } - - return $this->plugins[ $plugin ]; - } - - /** - * Gets the version of the plugin. - * - * @param array $plugin The information available about the plugin. - * - * @return string The version associated with the plugin. - */ - public function get_version( $plugin ) { - if ( ! isset( $plugin['version'] ) ) { - return ''; - } - - return $plugin['version']; - } - - /** - * Checks if there are dependencies available for the plugin. - * - * @param array $plugin The information available about the plugin. - * - * @return bool Whether or not there is a dependency present. - */ - public function has_dependencies( $plugin ) { - return ( isset( $plugin['_dependencies'] ) && ! empty( $plugin['_dependencies'] ) ); - } - - /** - * Gets the dependencies for the plugin. - * - * @param array $plugin The information available about the plugin. - * - * @return array Array containing all the dependencies associated with the plugin. - */ - public function get_dependencies( $plugin ) { - if ( ! $this->has_dependencies( $plugin ) ) { - return []; - } - - return $plugin['_dependencies']; - } - - /** - * Checks if all dependencies are satisfied. - * - * @param array $plugin The information available about the plugin. - * - * @return bool Whether or not the dependencies are satisfied. - */ - public function dependencies_are_satisfied( $plugin ) { - if ( ! $this->has_dependencies( $plugin ) ) { - return true; - } - - $dependencies = $this->get_dependencies( $plugin ); - $active_dependencies = array_filter( $dependencies, [ $this, 'is_dependency_active' ] ); - - return count( $active_dependencies ) === count( $dependencies ); - } - - /** - * Checks whether or not one of the plugins is properly installed and usable. - * - * @param array $plugin The information available about the plugin. - * - * @return bool Whether or not the plugin is properly installed. - */ - public function is_installed( $plugin ) { - if ( empty( $plugin ) ) { - return false; - } - - return $this->is_available( $plugin ); - } - - /** - * Gets all installed plugins. - * - * @return array The installed plugins. - */ - public function get_installed_plugins() { - $installed = []; - - foreach ( $this->plugins as $plugin_key => $plugin ) { - if ( $this->is_installed( $plugin ) ) { - $installed[ $plugin_key ] = $plugin; - } - } - - return $installed; - } - - /** - * Checks for the availability of the plugin. - * - * @param array $plugin The information available about the plugin. - * - * @return bool Whether or not the plugin is available. - */ - public function is_available( $plugin ) { - return isset( $plugin['installed'] ) && $plugin['installed'] === true; - } - - /** - * Checks whether a dependency is active. - * - * @param array $dependency The information about the dependency to look for. - * - * @return bool Whether or not the dependency is active. - */ - public function is_dependency_active( $dependency ) { - return $dependency['conditional']->is_met(); - } - - /** - * Checks whether a dependency is available. - * - * @deprecated 22.4 - * @codeCoverageIgnore - * - * @param array $dependency The information about the dependency to look for. - * - * @return bool Whether or not the dependency is available. - */ - public function is_dependency_available( $dependency ) { - _deprecated_function( __METHOD__, 'Yoast SEO 22.4' ); - - return isset( get_plugins()[ $dependency['slug'] ] ); - } - - /** - * Gets the names of the dependencies. - * - * @param array $plugin The plugin to get the dependency names from. - * - * @return array Array containing the names of the associated dependencies. - */ - public function get_dependency_names( $plugin ) { - if ( ! $this->has_dependencies( $plugin ) ) { - return []; - } - - return array_keys( $plugin['_dependencies'] ); - } - - /** - * Gets an array of plugins that have defined dependencies. - * - * @return array Array of the plugins that have dependencies. - */ - public function get_plugins_with_dependencies() { - return array_filter( $this->plugins, [ $this, 'has_dependencies' ] ); - } - - /** - * Determines whether or not a plugin is active. - * - * @param string $plugin The plugin slug to check. - * - * @return bool Whether or not the plugin is active. - */ - public function is_active( $plugin ) { - return is_plugin_active( $plugin ); - } - - /** - * Determines whether or not a plugin is a Premium product. - * - * @param array $plugin The plugin to check. - * - * @return bool Whether or not the plugin is a Premium product. - */ - public function is_premium( $plugin ) { - return isset( $plugin['premium'] ) && $plugin['premium'] === true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-conflict.php b/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-conflict.php deleted file mode 100644 index a90e8acd..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-conflict.php +++ /dev/null @@ -1,94 +0,0 @@ -> - */ - protected $plugins = [ - // The plugin which are writing OG metadata. - 'open_graph' => Conflicting_Plugins::OPEN_GRAPH_PLUGINS, - 'xml_sitemaps' => Conflicting_Plugins::XML_SITEMAPS_PLUGINS, - 'cloaking' => Conflicting_Plugins::CLOAKING_PLUGINS, - 'seo' => Conflicting_Plugins::SEO_PLUGINS, - ]; - - /** - * Overrides instance to set with this class as class. - * - * @param string $class_name Optional class name. - * - * @return Yoast_Plugin_Conflict - */ - public static function get_instance( $class_name = self::class ) { - return parent::get_instance( $class_name ); - } - - /** - * After activating any plugin, this method will be executed by a hook. - * - * If the activated plugin is conflicting with ours a notice will be shown. - * - * @param string|bool $plugin Optional plugin basename to check. - * - * @return void - */ - public static function hook_check_for_plugin_conflicts( $plugin = false ) { - // The instance of the plugin. - $instance = self::get_instance(); - - // Only add the plugin as an active plugin if $plugin isn't false. - if ( $plugin && is_string( $plugin ) ) { - $instance->add_active_plugin( $instance->find_plugin_category( $plugin ), $plugin ); - } - - $plugin_sections = []; - - // Only check for open graph problems when they are enabled. - if ( WPSEO_Options::get( 'opengraph' ) ) { - /* translators: %1$s expands to Yoast SEO, %2$s: 'Facebook' plugin name of possibly conflicting plugin with regard to creating OpenGraph output. */ - $plugin_sections['open_graph'] = __( 'Both %1$s and %2$s create Open Graph output, which might make Facebook, X, LinkedIn and other social networks use the wrong texts and images when your pages are being shared.', 'wordpress-seo' ) - . '

              ' - . '' - /* translators: %1$s expands to Yoast SEO. */ - . sprintf( __( 'Configure %1$s\'s Open Graph settings', 'wordpress-seo' ), 'Yoast SEO' ) - . ''; - } - - // Only check for XML conflicts if sitemaps are enabled. - if ( WPSEO_Options::get( 'enable_xml_sitemap' ) ) { - /* translators: %1$s expands to Yoast SEO, %2$s: 'Google XML Sitemaps' plugin name of possibly conflicting plugin with regard to the creation of sitemaps. */ - $plugin_sections['xml_sitemaps'] = __( 'Both %1$s and %2$s can create XML sitemaps. Having two XML sitemaps is not beneficial for search engines and might slow down your site.', 'wordpress-seo' ) - . '

              ' - . '' - /* translators: %1$s expands to Yoast SEO. */ - . sprintf( __( 'Toggle %1$s\'s XML Sitemap', 'wordpress-seo' ), 'Yoast SEO' ) - . ''; - } - - /* translators: %2$s expands to 'RS Head Cleaner' plugin name of possibly conflicting plugin with regard to differentiating output between search engines and normal users. */ - $plugin_sections['cloaking'] = __( 'The plugin %2$s changes your site\'s output and in doing that differentiates between search engines and normal users, a process that\'s called cloaking. We highly recommend that you disable it.', 'wordpress-seo' ); - - /* translators: %1$s expands to Yoast SEO, %2$s: 'SEO' plugin name of possibly conflicting plugin with regard to the creation of duplicate SEO meta. */ - $plugin_sections['seo'] = __( 'Both %1$s and %2$s manage the SEO of your site. Running two SEO plugins at the same time is detrimental.', 'wordpress-seo' ); - - $instance->check_plugin_conflicts( $plugin_sections ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-premium-popup.php b/wp/wp-content/plugins/wordpress-seo/admin/class-premium-popup.php deleted file mode 100644 index 00887694..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-premium-popup.php +++ /dev/null @@ -1,105 +0,0 @@ -identifier = $identifier; - $this->heading_level = $heading_level; - $this->title = $title; - $this->content = $content; - $this->url = $url; - } - - /** - * Returns the premium popup as an HTML string. - * - * @param bool $popup Show this message as a popup show it straight away. - * - * @return string - */ - public function get_premium_message( $popup = true ) { - // Don't show in Premium. - if ( defined( 'WPSEO_PREMIUM_FILE' ) ) { - return ''; - } - - $assets_uri = trailingslashit( plugin_dir_url( WPSEO_FILE ) ); - - /* translators: %s expands to Yoast SEO Premium */ - $cta_text = esc_html( sprintf( __( 'Get %s', 'wordpress-seo' ), 'Yoast SEO Premium' ) ); - /* translators: Hidden accessibility text. */ - $new_tab_message = '' . esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' ) . ''; - $caret_icon = ''; - $classes = ''; - if ( $popup ) { - $classes = ' hidden'; - } - $micro_copy = __( '1 year free support and updates included!', 'wordpress-seo' ); - - $popup = << - Yoast SEO - <{$this->heading_level} id="wpseo-contact-support-popup-title" class="wpseo-premium-popup-title">{$this->title}heading_level}> - {$this->content} - - {$cta_text} {$new_tab_message} {$caret_icon} -
              - {$micro_copy} - -EO_POPUP; - - return $popup; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-premium-upsell-admin-block.php b/wp/wp-content/plugins/wordpress-seo/admin/class-premium-upsell-admin-block.php deleted file mode 100644 index 143d08be..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-premium-upsell-admin-block.php +++ /dev/null @@ -1,165 +0,0 @@ -hook = $hook; - } - - /** - * Registers WordPress hooks. - * - * @return void - */ - public function register_hooks() { - add_action( $this->hook, [ $this, 'render' ] ); - } - - /** - * Renders the upsell block. - * - * @return void - */ - public function render() { - $url = WPSEO_Shortlinker::get( 'https://yoa.st/17h' ); - - $arguments = [ - sprintf( - /* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */ - esc_html__( '%1$sAI%2$s: Better SEO titles and meta descriptions, faster.', 'wordpress-seo' ), - '', - '' - ), - sprintf( - /* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */ - esc_html__( '%1$sMultiple keywords%2$s: Rank higher for more searches.', 'wordpress-seo' ), - '', - '' - ), - sprintf( - /* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */ - esc_html__( '%1$sSuper fast%2$s internal linking suggestions.', 'wordpress-seo' ), - '', - '' - ), - sprintf( - /* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */ - esc_html__( '%1$sNo more broken links%2$s: Automatic redirect manager.', 'wordpress-seo' ), - '', - '' - ), - sprintf( - /* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */ - esc_html__( '%1$sAppealing social previews%2$s people actually want to click on.', 'wordpress-seo' ), - '', - '' - ), - sprintf( - /* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */ - esc_html__( '%1$s24/7 support%2$s: Also on evenings and weekends.', 'wordpress-seo' ), - '', - '' - ), - '' . esc_html__( 'No ads!', 'wordpress-seo' ) . '', - ]; - - $arguments_html = implode( '', array_map( [ $this, 'get_argument_html' ], $arguments ) ); - - $class = $this->get_html_class(); - - /* translators: %s expands to Yoast SEO Premium */ - $button_text = YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-promotion' ) ? esc_html__( 'Claim your 30% off now!', 'wordpress-seo' ) : sprintf( esc_html__( 'Explore %s now!', 'wordpress-seo' ), 'Yoast SEO Premium' ); - /* translators: Hidden accessibility text. */ - $button_text .= '' . esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' ) . '' - . ''; - - $upgrade_button = sprintf( - '%3$s', - esc_attr( 'wpseo-' . $this->identifier . '-popup-button' ), - esc_url( $url ), - $button_text - ); - - echo '
              '; - - if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-promotion' ) ) { - $bf_label = esc_html__( 'BLACK FRIDAY', 'wordpress-seo' ); - $sale_label = esc_html__( '30% OFF', 'wordpress-seo' ); - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Already escaped above. - echo "
              $bf_label $sale_label
              "; - } - - echo '
              '; - echo '

              ' - . sprintf( - /* translators: %s expands to Yoast SEO Premium */ - esc_html__( 'Upgrade to %s', 'wordpress-seo' ), - 'Yoast SEO Premium' - ) - . '

              '; - - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Correctly escaped in $this->get_argument_html() method. - echo '
                ' . $arguments_html . '
              '; - - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Correctly escaped in $upgrade_button and $button_text above. - echo '

              ' . $upgrade_button . '

              '; - echo '
              '; - - echo '
              '; - } - - /** - * Formats the argument to a HTML list item. - * - * @param string $argument The argument to format. - * - * @return string Formatted argument in HTML. - */ - protected function get_argument_html( $argument ) { - $class = $this->get_html_class(); - - return sprintf( - '
            • %2$s
            • ', - esc_attr( $class . '--argument' ), - $argument - ); - } - - /** - * Returns the HTML base class to use. - * - * @return string The HTML base class. - */ - protected function get_html_class() { - return 'yoast_' . $this->identifier; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-primary-term-admin.php b/wp/wp-content/plugins/wordpress-seo/admin/class-primary-term-admin.php deleted file mode 100644 index 85c0c888..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-primary-term-admin.php +++ /dev/null @@ -1,274 +0,0 @@ -get_primary_term_taxonomies(); - - foreach ( $taxonomies as $taxonomy ) { - $content .= $this->primary_term_field( $taxonomy->name ); - $content .= wp_nonce_field( 'save-primary-term', WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy->name . '_nonce', false, false ); - } - return $content; - } - - /** - * Generates the HTML for a hidden field for a primary taxonomy. - * - * @param string $taxonomy_name The taxonomy's slug. - * - * @return string The HTML for a hidden primary taxonomy field. - */ - protected function primary_term_field( $taxonomy_name ) { - return sprintf( - '', - esc_attr( $this->generate_field_id( $taxonomy_name ) ), - esc_attr( $this->generate_field_name( $taxonomy_name ) ), - esc_attr( $this->get_primary_term( $taxonomy_name ) ) - ); - } - - /** - * Generates an id for a primary taxonomy's hidden field. - * - * @param string $taxonomy_name The taxonomy's slug. - * - * @return string The field id. - */ - protected function generate_field_id( $taxonomy_name ) { - return 'yoast-wpseo-primary-' . $taxonomy_name; - } - - /** - * Generates a name for a primary taxonomy's hidden field. - * - * @param string $taxonomy_name The taxonomy's slug. - * - * @return string The field id. - */ - protected function generate_field_name( $taxonomy_name ) { - return WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy_name . '_term'; - } - - /** - * Adds primary term templates. - * - * @return void - */ - public function wp_footer() { - $taxonomies = $this->get_primary_term_taxonomies(); - - if ( ! empty( $taxonomies ) ) { - $this->include_js_templates(); - } - } - - /** - * Enqueues all the assets needed for the primary term interface. - * - * @return void - */ - public function enqueue_assets() { - global $pagenow; - - if ( ! WPSEO_Metabox::is_post_edit( $pagenow ) ) { - return; - } - - $taxonomies = $this->get_primary_term_taxonomies(); - - // Only enqueue if there are taxonomies that need a primary term. - if ( empty( $taxonomies ) ) { - return; - } - - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_style( 'primary-category' ); - - $mapped_taxonomies = $this->get_mapped_taxonomies_for_js( $taxonomies ); - - $data = [ - 'taxonomies' => $mapped_taxonomies, - ]; - - $asset_manager->localize_script( 'post-edit', 'wpseoPrimaryCategoryL10n', $data ); - $asset_manager->localize_script( 'post-edit-classic', 'wpseoPrimaryCategoryL10n', $data ); - } - - /** - * Gets the id of the primary term. - * - * @param string $taxonomy_name Taxonomy name for the term. - * - * @return int primary term id - */ - protected function get_primary_term( $taxonomy_name ) { - $primary_term = new WPSEO_Primary_Term( $taxonomy_name, $this->get_current_id() ); - - return $primary_term->get_primary_term(); - } - - /** - * Returns all the taxonomies for which the primary term selection is enabled. - * - * @param int|null $post_id Default current post ID. - * @return array - */ - protected function get_primary_term_taxonomies( $post_id = null ) { - if ( $post_id === null ) { - $post_id = $this->get_current_id(); - } - - $taxonomies = wp_cache_get( 'primary_term_taxonomies_' . $post_id, 'wpseo' ); - if ( $taxonomies !== false ) { - return $taxonomies; - } - - $taxonomies = $this->generate_primary_term_taxonomies( $post_id ); - - wp_cache_set( 'primary_term_taxonomies_' . $post_id, $taxonomies, 'wpseo' ); - - return $taxonomies; - } - - /** - * Includes templates file. - * - * @return void - */ - protected function include_js_templates() { - include_once WPSEO_PATH . 'admin/views/js-templates-primary-term.php'; - } - - /** - * Generates the primary term taxonomies. - * - * @param int $post_id ID of the post. - * - * @return array - */ - protected function generate_primary_term_taxonomies( $post_id ) { - $post_type = get_post_type( $post_id ); - $all_taxonomies = get_object_taxonomies( $post_type, 'objects' ); - $all_taxonomies = array_filter( $all_taxonomies, [ $this, 'filter_hierarchical_taxonomies' ] ); - - /** - * Filters which taxonomies for which the user can choose the primary term. - * - * @param array $taxonomies An array of taxonomy objects that are primary_term enabled. - * @param string $post_type The post type for which to filter the taxonomies. - * @param array $all_taxonomies All taxonomies for this post types, even ones that don't have primary term - * enabled. - */ - $taxonomies = (array) apply_filters( 'wpseo_primary_term_taxonomies', $all_taxonomies, $post_type, $all_taxonomies ); - - return $taxonomies; - } - - /** - * Creates a map of taxonomies for localization. - * - * @param array $taxonomies The taxononmies that should be mapped. - * - * @return array The mapped taxonomies. - */ - protected function get_mapped_taxonomies_for_js( $taxonomies ) { - return array_map( [ $this, 'map_taxonomies_for_js' ], $taxonomies ); - } - - /** - * Returns an array suitable for use in the javascript. - * - * @param stdClass $taxonomy The taxonomy to map. - * - * @return array The mapped taxonomy. - */ - private function map_taxonomies_for_js( $taxonomy ) { - $primary_term = $this->get_primary_term( $taxonomy->name ); - - if ( empty( $primary_term ) ) { - $primary_term = ''; - } - - $terms = get_terms( - [ - 'taxonomy' => $taxonomy->name, - 'update_term_meta_cache' => false, - 'fields' => 'id=>name', - ] - ); - - $mapped_terms_for_js = []; - foreach ( $terms as $id => $name ) { - $mapped_terms_for_js[] = [ - 'id' => $id, - 'name' => $name, - ]; - } - - return [ - 'title' => $taxonomy->labels->singular_name, - 'name' => $taxonomy->name, - 'primary' => $primary_term, - 'singularLabel' => $taxonomy->labels->singular_name, - 'fieldId' => $this->generate_field_id( $taxonomy->name ), - 'restBase' => ( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name, - 'terms' => $mapped_terms_for_js, - ]; - } - - /** - * Returns whether or not a taxonomy is hierarchical. - * - * @param stdClass $taxonomy Taxonomy object. - * - * @return bool - */ - private function filter_hierarchical_taxonomies( $taxonomy ) { - return (bool) $taxonomy->hierarchical; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-product-upsell-notice.php b/wp/wp-content/plugins/wordpress-seo/admin/class-product-upsell-notice.php deleted file mode 100644 index e5149c17..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-product-upsell-notice.php +++ /dev/null @@ -1,231 +0,0 @@ -options = $this->get_options(); - } - - /** - * Checks if the notice should be added or removed. - * - * @return void - */ - public function initialize() { - $this->remove_notification(); - } - - /** - * Sets the upgrade notice. - * - * @return void - */ - public function set_upgrade_notice() { - - if ( $this->has_first_activated_on() ) { - return; - } - - $this->set_first_activated_on(); - $this->add_notification(); - } - - /** - * Listener for the upsell notice. - * - * @return void - */ - public function dismiss_notice_listener() { - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are validating a nonce here. - if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], 'dismiss-5star-upsell' ) ) { - return; - } - - $dismiss_upsell = isset( $_GET['yoast_dismiss'] ) && is_string( $_GET['yoast_dismiss'] ) ? sanitize_text_field( wp_unslash( $_GET['yoast_dismiss'] ) ) : ''; - - if ( $dismiss_upsell !== 'upsell' ) { - return; - } - - $this->dismiss_notice(); - - if ( wp_safe_redirect( admin_url( 'admin.php?page=wpseo_dashboard' ) ) ) { - exit; - } - } - - /** - * When the notice should be shown. - * - * @return bool - */ - protected function should_add_notification() { - return ( $this->options['first_activated_on'] < strtotime( '-2weeks' ) ); - } - - /** - * Checks if the options has a first activated on date value. - * - * @return bool - */ - protected function has_first_activated_on() { - return $this->options['first_activated_on'] !== false; - } - - /** - * Sets the first activated on. - * - * @return void - */ - protected function set_first_activated_on() { - $this->options['first_activated_on'] = strtotime( '-2weeks' ); - - $this->save_options(); - } - - /** - * Adds a notification to the notification center. - * - * @return void - */ - protected function add_notification() { - $notification_center = Yoast_Notification_Center::get(); - $notification_center->add_notification( $this->get_notification() ); - } - - /** - * Removes a notification to the notification center. - * - * @return void - */ - protected function remove_notification() { - $notification_center = Yoast_Notification_Center::get(); - $notification_center->remove_notification( $this->get_notification() ); - } - - /** - * Returns a premium upsell section if using the free plugin. - * - * @return string - */ - protected function get_premium_upsell_section() { - if ( ! YoastSEO()->helpers->product->is_premium() ) { - return sprintf( - /* translators: %1$s expands anchor to premium plugin page, %2$s expands to */ - __( 'By the way, did you know we also have a %1$sPremium plugin%2$s? It offers advanced features, like a redirect manager and support for multiple keyphrases. It also comes with 24/7 personal support.', 'wordpress-seo' ), - "", - '' - ); - } - - return ''; - } - - /** - * Gets the notification value. - * - * @return Yoast_Notification - */ - protected function get_notification() { - $message = sprintf( - /* translators: %1$s expands to Yoast SEO, %2$s is a link start tag to the plugin page on WordPress.org, %3$s is the link closing tag. */ - __( 'We\'ve noticed you\'ve been using %1$s for some time now; we hope you love it! We\'d be thrilled if you could %2$sgive us a 5 stars rating on WordPress.org%3$s!', 'wordpress-seo' ), - 'Yoast SEO', - '', - '' - ) . "\n\n"; - - $message .= sprintf( - /* translators: %1$s is a link start tag to the bugreport guidelines on the Yoast help center, %2$s is the link closing tag. */ - __( 'If you are experiencing issues, %1$splease file a bug report%2$s and we\'ll do our best to help you out.', 'wordpress-seo' ), - '', - '' - ) . "\n\n"; - - $message .= $this->get_premium_upsell_section() . "\n\n"; - - $message .= '' . __( 'Please don\'t show me this notification anymore', 'wordpress-seo' ) . ''; - - $notification = new Yoast_Notification( - $message, - [ - 'type' => Yoast_Notification::WARNING, - 'id' => 'wpseo-upsell-notice', - 'capabilities' => 'wpseo_manage_options', - 'priority' => 0.8, - ] - ); - - return $notification; - } - - /** - * Dismisses the notice. - * - * @return bool - */ - protected function is_notice_dismissed() { - return get_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true ) === '1'; - } - - /** - * Dismisses the notice. - * - * @return void - */ - protected function dismiss_notice() { - update_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true ); - } - - /** - * Returns the set options. - * - * @return mixed - */ - protected function get_options() { - return get_option( self::OPTION_NAME ); - } - - /** - * Saves the options to the database. - * - * @return void - */ - protected function save_options() { - update_option( self::OPTION_NAME, $this->options ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-remote-request.php b/wp/wp-content/plugins/wordpress-seo/admin/class-remote-request.php deleted file mode 100644 index e54757a7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-remote-request.php +++ /dev/null @@ -1,158 +0,0 @@ - false, - 'timeout' => 2, - ]; - - /** - * Holds the response error. - * - * @var WP_Error|null - */ - protected $response_error; - - /** - * Holds the response body. - * - * @var mixed - */ - protected $response_body; - - /** - * Sets the endpoint and arguments. - * - * @param string $endpoint The endpoint to send the request to. - * @param array $args The arguments to use in this request. - */ - public function __construct( $endpoint, array $args = [] ) { - $this->endpoint = $endpoint; - $this->args = wp_parse_args( $this->args, $args ); - } - - /** - * Sets the request body. - * - * @param mixed $body The body to set. - * - * @return void - */ - public function set_body( $body ) { - $this->args['body'] = $body; - } - - /** - * Sends the data to the given endpoint. - * - * @param string $method The type of request to send. - * - * @return bool True when sending data has been successful. - */ - public function send( $method = self::METHOD_POST ) { - switch ( $method ) { - case self::METHOD_POST: - $response = $this->post(); - break; - case self::METHOD_GET: - $response = $this->get(); - break; - default: - /* translators: %1$s expands to the request method */ - $response = new WP_Error( 1, sprintf( __( 'Request method %1$s is not valid.', 'wordpress-seo' ), $method ) ); - break; - } - - return $this->process_response( $response ); - } - - /** - * Returns the value of the response error. - * - * @return WP_Error|null The response error. - */ - public function get_response_error() { - return $this->response_error; - } - - /** - * Returns the response body. - * - * @return mixed The response body. - */ - public function get_response_body() { - return $this->response_body; - } - - /** - * Processes the given response. - * - * @param mixed $response The response to process. - * - * @return bool True when response is valid. - */ - protected function process_response( $response ) { - if ( $response instanceof WP_Error ) { - $this->response_error = $response; - - return false; - } - - $this->response_body = wp_remote_retrieve_body( $response ); - - return ( wp_remote_retrieve_response_code( $response ) === 200 ); - } - - /** - * Performs a post request to the specified endpoint with set arguments. - * - * @return WP_Error|array The response or WP_Error on failure. - */ - protected function post() { - return wp_remote_post( $this->endpoint, $this->args ); - } - - /** - * Performs a post request to the specified endpoint with set arguments. - * - * @return WP_Error|array The response or WP_Error on failure. - */ - protected function get() { - return wp_remote_get( $this->endpoint, $this->args ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-schema-person-upgrade-notification.php b/wp/wp-content/plugins/wordpress-seo/admin/class-schema-person-upgrade-notification.php deleted file mode 100644 index c2332c4e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-schema-person-upgrade-notification.php +++ /dev/null @@ -1,83 +0,0 @@ -add_notification(); - return; - } - - $this->remove_notification(); - } - - /** - * Adds a notification to the notification center. - * - * @return void - */ - protected function add_notification() { - $notification_center = Yoast_Notification_Center::get(); - $notification_center->add_notification( $this->get_notification() ); - } - - /** - * Removes a notification to the notification center. - * - * @return void - */ - protected function remove_notification() { - $notification_center = Yoast_Notification_Center::get(); - $notification_center->remove_notification( $this->get_notification() ); - } - - /** - * Gets the notification object. - * - * @return Yoast_Notification - */ - protected function get_notification() { - $message = sprintf( - /* translators: %1$s is a link start tag to the Search Appearance settings, %2$s is the link closing tag. */ - __( 'You have previously set your site to represent a person. We’ve improved our functionality around Schema and the Knowledge Graph, so you should go in and %1$scomplete those settings%2$s.', 'wordpress-seo' ), - '', - '' - ); - - $notification = new Yoast_Notification( - $message, - [ - 'type' => Yoast_Notification::WARNING, - 'id' => 'wpseo-schema-person-upgrade', - 'capabilities' => 'wpseo_manage_options', - 'priority' => 0.8, - ] - ); - - return $notification; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-suggested-plugins.php b/wp/wp-content/plugins/wordpress-seo/admin/class-suggested-plugins.php deleted file mode 100644 index 2d937be1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-suggested-plugins.php +++ /dev/null @@ -1,140 +0,0 @@ -availability_checker = $availability_checker; - $this->notification_center = $notification_center; - } - - /** - * Registers all hooks to WordPress. - * - * @return void - */ - public function register_hooks() { - add_action( 'admin_init', [ $this->availability_checker, 'register' ] ); - add_action( 'admin_init', [ $this, 'add_notifications' ] ); - } - - /** - * Adds notifications (when necessary). - * - * @return void - */ - public function add_notifications() { - $checker = $this->availability_checker; - - // Get all Yoast plugins that have dependencies. - $plugins = $checker->get_plugins_with_dependencies(); - - foreach ( $plugins as $plugin_name => $plugin ) { - $notification_id = 'wpseo-suggested-plugin-' . $plugin_name; - - if ( ! $checker->dependencies_are_satisfied( $plugin ) ) { - $this->notification_center->remove_notification_by_id( $notification_id ); - - continue; - } - - if ( ! $checker->is_installed( $plugin ) ) { - $notification = $this->get_yoast_seo_suggested_plugins_notification( $notification_id, $plugin ); - $this->notification_center->add_notification( $notification ); - - continue; - } - - $this->notification_center->remove_notification_by_id( $notification_id ); - } - } - - /** - * Build Yoast SEO suggested plugins notification. - * - * @param string $notification_id The id of the notification to be created. - * @param array> $plugin The plugin to retrieve the data from. - * - * @return Yoast_Notification The notification containing the suggested plugin. - */ - protected function get_yoast_seo_suggested_plugins_notification( $notification_id, $plugin ) { - $message = $this->create_install_suggested_plugin_message( $plugin ); - - return new Yoast_Notification( - $message, - [ - 'id' => $notification_id, - 'type' => Yoast_Notification::WARNING, - 'capabilities' => [ 'install_plugins' ], - ] - ); - } - - /** - * Creates a message to suggest the installation of a particular plugin. - * - * @param array $suggested_plugin The suggested plugin. - * - * @return string The install suggested plugin message. - */ - protected function create_install_suggested_plugin_message( $suggested_plugin ) { - /* translators: %1$s expands to an opening strong tag, %2$s expands to the dependency name, %3$s expands to a closing strong tag, %4$s expands to an opening anchor tag, %5$s expands to a closing anchor tag. */ - $message = __( 'It looks like you aren\'t using our %1$s%2$s addon%3$s. %4$sUpgrade today%5$s to unlock more tools and SEO features to make your products stand out in search results.', 'wordpress-seo' ); - $install_link = WPSEO_Admin_Utils::get_install_link( $suggested_plugin ); - - return sprintf( - $message, - '', - $install_link, - '', - $this->create_more_information_link( $suggested_plugin['url'], $suggested_plugin['title'] ), - '' - ); - } - - /** - * Creates a more information link that directs the user to WordPress.org Plugin repository. - * - * @param string $url The URL to the plugin's page. - * @param string $name The name of the plugin. - * - * @return string The more information link. - */ - protected function create_more_information_link( $url, $name ) { - return sprintf( - '', - $url, - /* translators: Hidden accessibility text; %1$s expands to the dependency name */ - sprintf( __( 'More information about %1$s', 'wordpress-seo' ), $name ) - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-wincher-dashboard-widget.php b/wp/wp-content/plugins/wordpress-seo/admin/class-wincher-dashboard-widget.php deleted file mode 100644 index 5f9c793b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-wincher-dashboard-widget.php +++ /dev/null @@ -1,136 +0,0 @@ -asset_manager = new WPSEO_Admin_Asset_Manager(); - } - - /** - * Register WordPress hooks. - * - * @return void - */ - public function register_hooks() { - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_wincher_dashboard_assets' ] ); - add_action( 'admin_init', [ $this, 'queue_wincher_dashboard_widget' ] ); - } - - /** - * Adds the Wincher dashboard widget if it should be shown. - * - * @return void - */ - public function queue_wincher_dashboard_widget() { - if ( $this->show_widget() ) { - add_action( 'wp_dashboard_setup', [ $this, 'add_wincher_dashboard_widget' ] ); - } - } - - /** - * Adds the Wincher dashboard widget to WordPress. - * - * @return void - */ - public function add_wincher_dashboard_widget() { - add_filter( 'postbox_classes_dashboard_wpseo-wincher-dashboard-overview', [ $this, 'wpseo_wincher_dashboard_overview_class' ] ); - wp_add_dashboard_widget( - 'wpseo-wincher-dashboard-overview', - /* translators: %1$s expands to Yoast SEO, %2$s to Wincher */ - sprintf( __( '%1$s / %2$s: Top Keyphrases', 'wordpress-seo' ), 'Yoast SEO', 'Wincher' ), - [ $this, 'display_wincher_dashboard_widget' ] - ); - } - - /** - * Adds CSS classes to the dashboard widget. - * - * @param array $classes An array of postbox CSS classes. - * - * @return array - */ - public function wpseo_wincher_dashboard_overview_class( $classes ) { - $classes[] = 'yoast wpseo-wincherdashboard-overview'; - return $classes; - } - - /** - * Displays the Wincher dashboard widget. - * - * @return void - */ - public function display_wincher_dashboard_widget() { - echo '
              '; - } - - /** - * Enqueues assets for the dashboard if the current page is the dashboard. - * - * @return void - */ - public function enqueue_wincher_dashboard_assets() { - if ( ! $this->is_dashboard_screen() ) { - return; - } - - $this->asset_manager->localize_script( 'wincher-dashboard-widget', 'wpseoWincherDashboardWidgetL10n', $this->localize_wincher_dashboard_script() ); - $this->asset_manager->enqueue_script( 'wincher-dashboard-widget' ); - $this->asset_manager->enqueue_style( 'wp-dashboard' ); - $this->asset_manager->enqueue_style( 'monorepo' ); - } - - /** - * Translates strings used in the Wincher dashboard widget. - * - * @return array The translated strings. - */ - public function localize_wincher_dashboard_script() { - - return [ - 'wincher_is_logged_in' => YoastSEO()->helpers->wincher->login_status(), - 'wincher_website_id' => WPSEO_Options::get( 'wincher_website_id', '' ), - ]; - } - - /** - * Checks if the current screen is the dashboard screen. - * - * @return bool Whether or not this is the dashboard screen. - */ - private function is_dashboard_screen() { - $current_screen = get_current_screen(); - - return ( $current_screen instanceof WP_Screen && $current_screen->id === 'dashboard' ); - } - - /** - * Returns true when the Wincher dashboard widget should be shown. - * - * @return bool - */ - private function show_widget() { - $analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - $user_can_edit = $analysis_seo->is_enabled() && current_user_can( 'edit_posts' ); - $is_wincher_active = YoastSEO()->helpers->wincher->is_active(); - - return $user_can_edit && $is_wincher_active; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-columns.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-columns.php deleted file mode 100644 index 989f87b8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-columns.php +++ /dev/null @@ -1,117 +0,0 @@ -display_links(); - $meta_columns_present = $this->display_meta_columns(); - if ( ! ( $link_columns_present || $meta_columns_present ) ) { - return; - } - - $help_tab_content = sprintf( - /* translators: %1$s: Yoast SEO */ - __( '%1$s adds several columns to this page.', 'wordpress-seo' ), - 'Yoast SEO' - ); - - if ( $meta_columns_present ) { - $help_tab_content .= ' ' . sprintf( - /* translators: %1$s: Link to article about content analysis, %2$s: Anchor closing */ - __( 'We\'ve written an article about %1$show to use the SEO score and Readability score%2$s.', 'wordpress-seo' ), - '
              ', - '' - ); - } - - if ( $link_columns_present ) { - $help_tab_content .= ' ' . sprintf( - /* translators: %1$s: Link to article about text links, %2$s: Anchor closing tag, %3$s: Emphasis open tag, %4$s: Emphasis close tag */ - __( 'The links columns show the number of articles on this site linking %3$sto%4$s this article and the number of URLs linked %3$sfrom%4$s this article. Learn more about %1$show to use these features to improve your internal linking%2$s, which greatly enhances your SEO.', 'wordpress-seo' ), - '', - '', - '', - '' - ); - } - - $screen = get_current_screen(); - $screen->add_help_tab( - [ - /* translators: %s expands to Yoast */ - 'title' => sprintf( __( '%s Columns', 'wordpress-seo' ), 'Yoast' ), - 'id' => 'yst-columns', - 'content' => '

              ' . $help_tab_content . '

              ', - 'priority' => 15, - ] - ); - } - - /** - * Retrieves the post type from the $_GET variable. - * - * @return string The current post type. - */ - private function get_current_post_type() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['post_type'] ) && is_string( $_GET['post_type'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - return sanitize_text_field( wp_unslash( $_GET['post_type'] ) ); - } - return ''; - } - - /** - * Whether we are showing link columns on this overview page. - * This depends on the post being accessible or not. - * - * @return bool Whether the linking columns are shown - */ - private function display_links() { - $current_post_type = $this->get_current_post_type(); - - if ( empty( $current_post_type ) ) { - return false; - } - - return WPSEO_Post_Type::is_post_type_accessible( $current_post_type ); - } - - /** - * Wraps the WPSEO_Metabox check to determine whether the metabox should be displayed either by - * choice of the admin or because the post type is not a public post type. - * - * @return bool Whether the meta box (and associated columns etc) should be hidden. - */ - private function display_meta_columns() { - $current_post_type = $this->get_current_post_type(); - - if ( empty( $current_post_type ) ) { - return false; - } - - return WPSEO_Utils::is_metabox_active( $current_post_type, 'post_type' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-dashboard-widget.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-dashboard-widget.php deleted file mode 100644 index 7b07fd99..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-dashboard-widget.php +++ /dev/null @@ -1,160 +0,0 @@ -statistics = $statistics; - $this->asset_manager = new WPSEO_Admin_Asset_Manager(); - } - - /** - * Register WordPress hooks. - * - * @return void - */ - public function register_hooks() { - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_dashboard_assets' ] ); - add_action( 'admin_init', [ $this, 'queue_dashboard_widget' ] ); - } - - /** - * Adds the dashboard widget if it should be shown. - * - * @return void - */ - public function queue_dashboard_widget() { - if ( $this->show_widget() ) { - add_action( 'wp_dashboard_setup', [ $this, 'add_dashboard_widget' ] ); - } - } - - /** - * Adds dashboard widget to WordPress. - * - * @return void - */ - public function add_dashboard_widget() { - add_filter( 'postbox_classes_dashboard_wpseo-dashboard-overview', [ $this, 'wpseo_dashboard_overview_class' ] ); - wp_add_dashboard_widget( - 'wpseo-dashboard-overview', - /* translators: %s is the plugin name */ - sprintf( __( '%s Posts Overview', 'wordpress-seo' ), 'Yoast SEO' ), - [ $this, 'display_dashboard_widget' ] - ); - } - - /** - * Adds CSS classes to the dashboard widget. - * - * @param array $classes An array of postbox CSS classes. - * - * @return array - */ - public function wpseo_dashboard_overview_class( $classes ) { - $classes[] = 'yoast wpseo-dashboard-overview'; - return $classes; - } - - /** - * Displays the dashboard widget. - * - * @return void - */ - public function display_dashboard_widget() { - echo '
              '; - } - - /** - * Enqueues assets for the dashboard if the current page is the dashboard. - * - * @return void - */ - public function enqueue_dashboard_assets() { - if ( ! $this->is_dashboard_screen() ) { - return; - } - - $this->asset_manager->localize_script( 'dashboard-widget', 'wpseoDashboardWidgetL10n', $this->localize_dashboard_script() ); - $this->asset_manager->enqueue_script( 'dashboard-widget' ); - $this->asset_manager->enqueue_style( 'wp-dashboard' ); - $this->asset_manager->enqueue_style( 'monorepo' ); - } - - /** - * Translates strings used in the dashboard widget. - * - * @return array The translated strings. - */ - public function localize_dashboard_script() { - return [ - 'feed_header' => sprintf( - /* translators: %1$s resolves to Yoast.com */ - __( 'Latest blog posts on %1$s', 'wordpress-seo' ), - 'Yoast.com' - ), - 'feed_footer' => __( 'Read more like this on our SEO blog', 'wordpress-seo' ), - 'wp_version' => substr( $GLOBALS['wp_version'], 0, 3 ) . '-' . ( is_plugin_active( 'classic-editor/classic-editor.php' ) ? '1' : '0' ), - 'php_version' => PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION, - ]; - } - - /** - * Checks if the current screen is the dashboard screen. - * - * @return bool Whether or not this is the dashboard screen. - */ - private function is_dashboard_screen() { - $current_screen = get_current_screen(); - - return ( $current_screen instanceof WP_Screen && $current_screen->id === 'dashboard' ); - } - - /** - * Returns true when the dashboard widget should be shown. - * - * @return bool - */ - private function show_widget() { - $analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - - return $analysis_seo->is_enabled() && current_user_can( 'edit_posts' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-form.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-form.php deleted file mode 100644 index a4ad63f8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-form.php +++ /dev/null @@ -1,1122 +0,0 @@ - -
              - -

              -
              -
              -
              - meets_requirements() ) { - $action_url = network_admin_url( 'settings.php' ); - $hidden_fields_cb = [ $network_admin, 'settings_fields' ]; - } - else { - $action_url = admin_url( 'options.php' ); - $hidden_fields_cb = 'settings_fields'; - } - - echo '
              '; - call_user_func( $hidden_fields_cb, $option_long_name ); - } - $this->set_option( $option ); - } - - /** - * Set the option used in output for form elements. - * - * @since 2.0 - * - * @param string $option_name Option key. - * - * @return void - */ - public function set_option( $option_name ) { - $this->option_name = $option_name; - - $this->option_instance = WPSEO_Options::get_option_instance( $option_name ); - if ( ! $this->option_instance ) { - $this->option_instance = null; - } - } - - /** - * Generates the footer for admin pages. - * - * @since 2.0 - * - * @param bool $submit Whether or not a submit button and form end tag should be shown. - * @param bool $show_sidebar Whether or not to show the banner sidebar - used by premium plugins to disable it. - * - * @return void - */ - public function admin_footer( $submit = true, $show_sidebar = true ) { - if ( $submit ) { - $settings_changed_listener = new WPSEO_Admin_Settings_Changed_Listener(); - echo '
              '; - - echo '
              '; - submit_button( __( 'Save changes', 'wordpress-seo' ) ); - $settings_changed_listener->show_success_message(); - echo '
              '; - - echo ''; - - echo '
              '; - - echo ' -
              '; - } - - /** - * Apply general admin_footer hooks. - */ - do_action( 'wpseo_admin_footer', $this ); - - /** - * Run possibly set actions to add for example an i18n box. - */ - do_action( 'wpseo_admin_promo_footer' ); - - echo ' -
              '; - - if ( $show_sidebar ) { - $this->admin_sidebar(); - } - - echo '
              '; - - do_action( 'wpseo_admin_below_content', $this ); - - echo ' -
              '; - } - - /** - * Generates the sidebar for admin pages. - * - * @since 2.0 - * - * @return void - */ - public function admin_sidebar() { - // No banners in Premium. - $addon_manager = new WPSEO_Addon_Manager(); - if ( YoastSEO()->helpers->product->is_premium() && $addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG ) ) { - return; - } - - $sidebar_presenter = new Sidebar_Presenter(); - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in presenter. - echo $sidebar_presenter->present(); - } - - /** - * Output a label element. - * - * @since 2.0 - * - * @param string $text Label text string, which can contain escaped html. - * @param array $attr HTML attributes set. - * - * @return void - */ - public function label( $text, $attr ) { - $defaults = [ - 'class' => 'checkbox', - 'close' => true, - 'for' => '', - 'aria_label' => '', - ]; - - $attr = wp_parse_args( $attr, $defaults ); - $aria_label = ''; - if ( $attr['aria_label'] !== '' ) { - $aria_label = ' aria-label="' . esc_attr( $attr['aria_label'] ) . '"'; - } - - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. Specifically, the $text variable can contain escaped html. - echo "'; - } - } - - /** - * Output a legend element. - * - * @since 3.4 - * - * @param string $text Legend text string. - * @param array $attr HTML attributes set. - * - * @return void - */ - public function legend( $text, $attr ) { - $defaults = [ - 'id' => '', - 'class' => '', - ]; - $attr = wp_parse_args( $attr, $defaults ); - - $id = ( $attr['id'] === '' ) ? '' : ' id="' . esc_attr( $attr['id'] ) . '"'; - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. - echo '' . $text . ''; - } - - /** - * Create a Checkbox input field. - * - * @since 2.0 - * - * @param string $variable The variable within the option to create the checkbox for. - * @param string $label The label to show for the variable. - * @param bool $label_left Whether the label should be left (true) or right (false). - * @param array $attr Extra attributes to add to the checkbox. - * - * @return void - */ - public function checkbox( $variable, $label, $label_left = false, $attr = [] ) { - $val = $this->get_field_value( $variable, false ); - - $defaults = [ - 'disabled' => false, - ]; - $attr = wp_parse_args( $attr, $defaults ); - - if ( $val === true ) { - $val = 'on'; - } - - $class = ''; - if ( $label_left !== false ) { - $this->label( $label_left, [ 'for' => $variable ] ); - } - else { - $class = 'double'; - } - - $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); - - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. - echo ''; - - if ( ! empty( $label ) ) { - $this->label( $label, [ 'for' => $variable ] ); - } - - echo '
              '; - } - - /** - * Creates a Checkbox input field list. - * - * @since 12.8 - * - * @param string $variable The variables within the option to create the checkbox list for. - * @param string $labels The labels to show for the variable. - * @param array $attr Extra attributes to add to the checkbox list. - * - * @return void - */ - public function checkbox_list( $variable, $labels, $attr = [] ) { - $defaults = [ - 'disabled' => false, - ]; - $attr = wp_parse_args( $attr, $defaults ); - - $values = $this->get_field_value( $variable, [] ); - - foreach ( $labels as $name => $label ) { - printf( - '', - esc_attr( $variable . '-' . $name ), - esc_attr( $this->option_name . '[' . $variable . '][' . $name . ']' ), - checked( ! empty( $values[ $name ] ), true, false ), - esc_attr( $name ), - disabled( ( isset( $attr['disabled'] ) && $attr['disabled'] ), true, false ) - ); - - printf( - '', - esc_attr( $variable . '-' . $name ), // #1 - esc_html( $label ) - ); - echo '
              '; - } - } - - /** - * Create a light switch input field using a single checkbox. - * - * @since 3.1 - * - * @param string $variable The variable within the option to create the checkbox for. - * @param string $label The visual label text for the toggle. - * @param array $buttons Array of two visual labels for the buttons (defaults Disabled/Enabled). - * @param bool $reverse Reverse order of buttons (default true). - * @param string $help Inline Help that will be printed out before the toggle. - * @param bool $strong Whether the visual label is displayed in strong text. Default is false. - * Starting from Yoast SEO 16.5, the visual label is forced to bold via CSS. - * @param array $attr Extra attributes to add to the light switch. - * - * @return void - */ - public function light_switch( $variable, $label, $buttons = [], $reverse = true, $help = '', $strong = false, $attr = [] ) { - $val = $this->get_field_value( $variable, false ); - - $defaults = [ - 'disabled' => false, - ]; - $attr = wp_parse_args( $attr, $defaults ); - - if ( $val === true ) { - $val = 'on'; - } - - $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); - - $output = new Light_Switch_Presenter( - $variable, - $label, - $buttons, - $this->option_name . '[' . $variable . ']', - $val, - $reverse, - $help, - $strong, - $disabled_attribute - ); - - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: All output is properly escaped or hardcoded in the presenter. - echo $output; - } - - /** - * Create a Text input field. - * - * @since 2.0 - * @since 2.1 Introduced the `$attr` parameter. - * - * @param string $variable The variable within the option to create the text input field for. - * @param string $label The label to show for the variable. - * @param array|string $attr Extra attributes to add to the input field. Can be class, disabled, autocomplete. - * - * @return void - */ - public function textinput( $variable, $label, $attr = [] ) { - $type = 'text'; - if ( ! is_array( $attr ) ) { - $attr = [ - 'class' => $attr, - 'disabled' => false, - ]; - } - - $defaults = [ - 'placeholder' => '', - 'class' => '', - ]; - $attr = wp_parse_args( $attr, $defaults ); - $val = $this->get_field_value( $variable, '' ); - if ( isset( $attr['type'] ) && $attr['type'] === 'url' ) { - $val = urldecode( $val ); - $type = 'url'; - } - $attributes = isset( $attr['autocomplete'] ) ? ' autocomplete="' . esc_attr( $attr['autocomplete'] ) . '"' : ''; - - $this->label( - $label, - [ - 'for' => $variable, - 'class' => 'textinput', - ] - ); - - $aria_attributes = Yoast_Input_Validation::get_the_aria_invalid_attribute( $variable ); - - Yoast_Input_Validation::set_error_descriptions(); - $aria_attributes .= Yoast_Input_Validation::get_the_aria_describedby_attribute( $variable ); - - $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); - - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. - echo '', '
              '; - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in getter. - echo Yoast_Input_Validation::get_the_error_description( $variable ); - } - - /** - * Create a Number input field. - * - * @param string $variable The variable within the option to create the text input field for. - * @param string $label The label to show for the variable. - * @param array|string $attr Extra attributes to add to the input field. Can be class, disabled, autocomplete. - * - * @return void - */ - public function number( $variable, $label, $attr = [] ) { - $type = 'number'; - $defaults = [ - 'placeholder' => '', - 'class' => 'number', - 'disabled' => false, - 'min' => 0, - 'max' => 100, - ]; - $attr = wp_parse_args( $attr, $defaults ); - $val = $this->get_field_value( $variable, 0 ); - - $this->label( - $label, - [ - 'for' => $variable, - 'class' => 'textinput ' . $attr['class'], - ] - ); - - $aria_attributes = Yoast_Input_Validation::get_the_aria_invalid_attribute( $variable ); - - Yoast_Input_Validation::set_error_descriptions(); - $aria_attributes .= Yoast_Input_Validation::get_the_aria_describedby_attribute( $variable ); - - $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); - - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. - echo '', '
              '; - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in getter. - echo Yoast_Input_Validation::get_the_error_description( $variable ); - } - - /** - * Creates a text input field with with the ability to add content after the label. - * - * @param string $variable The variable within the option to create the text input field for. - * @param string $label The label to show for the variable. - * @param array $attr Extra attributes to add to the input field. - * - * @return void - */ - public function textinput_extra_content( $variable, $label, $attr = [] ) { - $type = 'text'; - - $defaults = [ - 'class' => 'yoast-field-group__inputfield', - 'disabled' => false, - ]; - - $attr = wp_parse_args( $attr, $defaults ); - $val = $this->get_field_value( $variable, '' ); - - if ( isset( $attr['type'] ) && $attr['type'] === 'url' ) { - $val = urldecode( $val ); - $type = 'url'; - } - - echo '
              '; - $this->label( - $label, - [ - 'for' => $variable, - 'class' => $attr['class'] . '--label', - ] - ); - - if ( isset( $attr['extra_content'] ) ) { - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: may contain HTML that should not be escaped. - echo $attr['extra_content']; - } - echo '
              '; - - $has_input_error = Yoast_Input_Validation::yoast_form_control_has_error( $variable ); - $aria_attributes = Yoast_Input_Validation::get_the_aria_invalid_attribute( $variable ); - - Yoast_Input_Validation::set_error_descriptions(); - $aria_attributes .= Yoast_Input_Validation::get_the_aria_describedby_attribute( $variable ); - - // phpcs:disable WordPress.Security.EscapeOutput -- Reason: output is properly escaped or hardcoded. - printf( - '', - $type, - esc_attr( $this->option_name . '[' . $variable . ']' ), - esc_attr( $variable ), - esc_attr( $attr['class'] ), - isset( $attr['placeholder'] ) ? ' placeholder="' . esc_attr( $attr['placeholder'] ) . '"' : '', - isset( $attr['autocomplete'] ) ? ' autocomplete="' . esc_attr( $attr['autocomplete'] ) . '"' : '', - $aria_attributes, - esc_attr( $val ), - $this->get_disabled_attribute( $variable, $attr ) - ); - // phpcs:enable - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: output is properly escaped. - echo Yoast_Input_Validation::get_the_error_description( $variable ); - } - - /** - * Create a textarea. - * - * @since 2.0 - * - * @param string $variable The variable within the option to create the textarea for. - * @param string $label The label to show for the variable. - * @param string|array $attr The CSS class or an array of attributes to assign to the textarea. - * - * @return void - */ - public function textarea( $variable, $label, $attr = [] ) { - if ( ! is_array( $attr ) ) { - $attr = [ - 'class' => $attr, - ]; - } - - $defaults = [ - 'cols' => '', - 'rows' => '', - 'class' => '', - 'disabled' => false, - ]; - $attr = wp_parse_args( $attr, $defaults ); - $val = $this->get_field_value( $variable, '' ); - - $this->label( - $label, - [ - 'for' => $variable, - 'class' => 'textinput', - ] - ); - - $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); - - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. - echo '
              '; - } - - /** - * Create a hidden input field. - * - * @since 2.0 - * - * @param string $variable The variable within the option to create the hidden input for. - * @param string $id The ID of the element. - * @param mixed $val Optional. The value to set in the input field. Otherwise the value from the options will be used. - * - * @return void - */ - public function hidden( $variable, $id = '', $val = null ) { - if ( is_null( $val ) ) { - $val = $this->get_field_value( $variable, '' ); - } - - if ( is_bool( $val ) ) { - $val = ( $val === true ) ? 'true' : 'false'; - } - - if ( $id === '' ) { - $id = 'hidden_' . $variable; - } - - echo ''; - } - - /** - * Create a Select Box. - * - * @since 2.0 - * - * @param string $variable The variable within the option to create the select for. - * @param string $label The label to show for the variable. - * @param array $select_options The select options to choose from. - * @param string $styled The select style. Use 'styled' to get a styled select. Default 'unstyled'. - * @param bool $show_label Whether or not to show the label, if not, it will be applied as an aria-label. - * @param array $attr Extra attributes to add to the select. - * @param string $help Optional. Inline Help HTML that will be printed after the label. Default is empty. - * - * @return void - */ - public function select( $variable, $label, array $select_options, $styled = 'unstyled', $show_label = true, $attr = [], $help = '' ) { - if ( empty( $select_options ) ) { - return; - } - - $defaults = [ - 'disabled' => false, - ]; - $attr = wp_parse_args( $attr, $defaults ); - - if ( $show_label ) { - $this->label( - $label, - [ - 'for' => $variable, - 'class' => 'select', - ] - ); - echo $help; // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: The help contains HTML. - } - - $select_name = esc_attr( $this->option_name ) . '[' . esc_attr( $variable ) . ']'; - $active_option = $this->get_field_value( $variable, '' ); - $wrapper_start_tag = ''; - $wrapper_end_tag = ''; - - $select = new Yoast_Input_Select( $variable, $select_name, $select_options, $active_option ); - $select->add_attribute( 'class', 'select' ); - - if ( $this->is_control_disabled( $variable ) - || ( isset( $attr['disabled'] ) && $attr['disabled'] ) ) { - $select->add_attribute( 'disabled', 'disabled' ); - } - - if ( ! $show_label ) { - $select->add_attribute( 'aria-label', $label ); - } - - if ( $styled === 'styled' ) { - $wrapper_start_tag = ''; - $wrapper_end_tag = ''; - } - - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. - echo $wrapper_start_tag; - $select->output_html(); - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. - echo $wrapper_end_tag; - echo '
              '; - } - - /** - * Create a File upload field. - * - * @since 2.0 - * - * @param string $variable The variable within the option to create the file upload field for. - * @param string $label The label to show for the variable. - * @param array $attr Extra attributes to add to the file upload input. - * - * @return void - */ - public function file_upload( $variable, $label, $attr = [] ) { - $val = $this->get_field_value( $variable, '' ); - if ( is_array( $val ) ) { - $val = $val['url']; - } - - $defaults = [ - 'disabled' => false, - ]; - $attr = wp_parse_args( $attr, $defaults ); - - $var_esc = esc_attr( $variable ); - $this->label( - $label, - [ - 'for' => $variable, - 'class' => 'select', - ] - ); - - $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); - - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. - echo ''; - - // Need to save separate array items in hidden inputs, because empty file inputs type will be deleted by settings API. - if ( ! empty( $val ) ) { - $this->hidden( 'file', $this->option_name . '_file' ); - $this->hidden( 'url', $this->option_name . '_url' ); - $this->hidden( 'type', $this->option_name . '_type' ); - } - echo '
              '; - } - - /** - * Media input. - * - * @since 2.0 - * - * @param string $variable Option name. - * @param string $label Label message. - * @param array $attr Extra attributes to add to the media input and buttons. - * - * @return void - */ - public function media_input( $variable, $label, $attr = [] ) { - $val = $this->get_field_value( $variable, '' ); - $id_value = $this->get_field_value( $variable . '_id', '' ); - - $var_esc = esc_attr( $variable ); - - $defaults = [ - 'disabled' => false, - ]; - $attr = wp_parse_args( $attr, $defaults ); - - $this->label( - $label, - [ - 'for' => 'wpseo_' . $variable, - 'class' => 'select', - ] - ); - - $id_field_id = 'wpseo_' . $var_esc . '_id'; - - $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); - - echo ''; - echo ' '; - echo ' '; - echo ''; - echo ''; - echo ''; - echo '
              '; - } - - /** - * Create a Radio input field. - * - * @since 2.0 - * - * @param string $variable The variable within the option to create the radio button for. - * @param array $values The radio options to choose from. - * @param string $legend Optional. The legend to show for the field set, if any. - * @param array $legend_attr Optional. The attributes for the legend, if any. - * @param array $attr Extra attributes to add to the radio button. - * - * @return void - */ - public function radio( $variable, $values, $legend = '', $legend_attr = [], $attr = [] ) { - if ( ! is_array( $values ) || $values === [] ) { - return; - } - $val = $this->get_field_value( $variable, false ); - - $var_esc = esc_attr( $variable ); - - $defaults = [ - 'disabled' => false, - ]; - $attr = wp_parse_args( $attr, $defaults ); - - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. - echo '
              '; - - if ( is_string( $legend ) && $legend !== '' ) { - - $legend_defaults = [ - 'id' => '', - 'class' => 'radiogroup', - ]; - - $legend_attr = wp_parse_args( $legend_attr, $legend_defaults ); - - $this->legend( $legend, $legend_attr ); - } - - foreach ( $values as $key => $value ) { - $label = $value; - $aria_label = ''; - - if ( is_array( $value ) ) { - $label = ( $value['label'] ?? '' ); - $aria_label = ( $value['aria_label'] ?? '' ); - } - - $key_esc = esc_attr( $key ); - - $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); - - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. - echo ''; - $this->label( - $label, - [ - 'for' => $var_esc . '-' . $key_esc, - 'class' => 'radio', - 'aria_label' => $aria_label, - ] - ); - } - echo '
              '; - } - - /** - * Create a toggle switch input field using two radio buttons. - * - * @since 3.1 - * - * @param string $variable The variable within the option to create the radio buttons for. - * @param array $values Associative array of on/off keys and their values to be used as - * the label elements text for the radio buttons. Optionally, each - * value can be an array of visible label text and screen reader text. - * @param string $label The visual label for the radio buttons group, used as the fieldset legend. - * @param string $help Inline Help that will be printed out before the visible toggles text. - * @param array $attr Extra attributes to add to the toggle switch. - * - * @return void - */ - public function toggle_switch( $variable, $values, $label, $help = '', $attr = [] ) { - if ( ! is_array( $values ) || $values === [] ) { - return; - } - - $defaults = [ - 'disabled' => false, - ]; - $attr = wp_parse_args( $attr, $defaults ); - - if ( isset( $attr['preserve_disabled_value'] ) && $attr['preserve_disabled_value'] ) { - $this->hidden( $variable ); - $variable .= '_disabled'; - } - - $val = $this->get_field_value( $variable, false ); - if ( $val === true ) { - $val = 'on'; - } - if ( $val === false ) { - $val = 'off'; - } - - $help_class = ! empty( $help ) ? ' switch-container__has-help' : ''; - - $has_premium_upsell = ( isset( $attr['show_premium_upsell'] ) && $attr['show_premium_upsell'] && isset( $attr['premium_upsell_url'] ) && ! empty( $attr['premium_upsell_url'] ) ); - $upsell_class = ( $has_premium_upsell ) ? ' premium-upsell' : ''; - - $var_esc = esc_attr( $variable ); - - printf( '
              ', esc_attr( 'switch-container' . $help_class . $upsell_class ) ); - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. - echo '
              ', $label, '', $help; - - // Show disabled note if attribute does not exists or does exist and is set to true. - if ( ! isset( $attr['show_disabled_note'] ) || ( $attr['show_disabled_note'] === true ) ) { - if ( isset( $attr['note_when_disabled'] ) ) { - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. - echo $this->get_disabled_note( $variable, $attr['note_when_disabled'] ); - } - else { - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. - echo $this->get_disabled_note( $variable ); - } - } - - echo '
              '; - - foreach ( $values as $key => $value ) { - $screen_reader_text_html = ''; - - if ( is_array( $value ) ) { - $screen_reader_text = $value['screen_reader_text']; - $screen_reader_text_html = ' ' . esc_html( $screen_reader_text ) . ''; - $value = $value['text']; - } - - $key_esc = esc_attr( $key ); - $for = $var_esc . '-' . $key_esc; - $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); - - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. - echo '', - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. - ''; - } - - $upsell_button = ''; - if ( $has_premium_upsell ) { - $upsell_button = '' - . esc_html__( 'Unlock with Premium!', 'wordpress-seo' ) - /* translators: Hidden accessibility text. */ - . '' . esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' ) . '' - . ''; - } - - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- All variable output is escaped above. - echo '
              ' . $upsell_button . '
              ' . PHP_EOL . PHP_EOL; - } - - /** - * Creates a toggle switch to define whether an indexable should be indexed or not. - * - * @param string $variable The variable within the option to create the radio buttons for. - * @param string $label The visual label for the radio buttons group, used as the fieldset legend. - * @param string $help Inline Help that will be printed out before the visible toggles text. - * @param array $attr Extra attributes to add to the index switch. - * - * @return void - */ - public function index_switch( $variable, $label, $help = '', $attr = [] ) { - $defaults = [ - 'disabled' => false, - ]; - $attr = wp_parse_args( $attr, $defaults ); - - $index_switch_values = [ - 'off' => __( 'On', 'wordpress-seo' ), - 'on' => __( 'Off', 'wordpress-seo' ), - ]; - - $is_disabled = ( isset( $attr['disabled'] ) && $attr['disabled'] ); - - $this->toggle_switch( - $variable, - $index_switch_values, - sprintf( - /* translators: %s expands to an indexable object's name, like a post type or taxonomy */ - esc_html__( 'Show %s in search results?', 'wordpress-seo' ), - $label - ), - $help, - [ 'disabled' => $is_disabled ] - ); - } - - /** - * Creates a toggle switch to show hide certain options. - * - * @param string $variable The variable within the option to create the radio buttons for. - * @param string $label The visual label for the radio buttons group, used as the fieldset legend. - * @param bool $inverse_keys Whether or not the option keys need to be inverted to support older functions. - * @param string $help Inline Help that will be printed out before the visible toggles text. - * @param array $attr Extra attributes to add to the show-hide switch. - * - * @return void - */ - public function show_hide_switch( $variable, $label, $inverse_keys = false, $help = '', $attr = [] ) { - $defaults = [ - 'disabled' => false, - ]; - $attr = wp_parse_args( $attr, $defaults ); - - $on_key = ( $inverse_keys ) ? 'off' : 'on'; - $off_key = ( $inverse_keys ) ? 'on' : 'off'; - - $show_hide_switch = [ - $on_key => __( 'On', 'wordpress-seo' ), - $off_key => __( 'Off', 'wordpress-seo' ), - ]; - - $is_disabled = ( isset( $attr['disabled'] ) && $attr['disabled'] ); - - $this->toggle_switch( - $variable, - $show_hide_switch, - $label, - $help, - [ 'disabled' => $is_disabled ] - ); - } - - /** - * Retrieves the value for the form field. - * - * @param string $field_name The field name to retrieve the value for. - * @param string|null $default_value The default value, when field has no value. - * - * @return mixed|null The retrieved value. - */ - protected function get_field_value( $field_name, $default_value = null ) { - // On multisite subsites, the Usage tracking feature should always be set to Off. - if ( $this->is_tracking_on_subsite( $field_name ) ) { - return false; - } - - return WPSEO_Options::get( $field_name, $default_value ); - } - - /** - * Checks whether a given control should be disabled. - * - * @param string $variable The variable within the option to check whether its control should be disabled. - * - * @return bool True if control should be disabled, false otherwise. - */ - protected function is_control_disabled( $variable ) { - if ( $this->option_instance === null ) { - return false; - } - - // Disable the Usage tracking feature for multisite subsites. - if ( $this->is_tracking_on_subsite( $variable ) ) { - return true; - } - - return $this->option_instance->is_disabled( $variable ); - } - - /** - * Gets the explanation note to print if a given control is disabled. - * - * @param string $variable The variable within the option to print a disabled note for. - * @param string $custom_note An optional custom note to print instead. - * - * @return string Explanation note HTML string, or empty string if no note necessary. - */ - protected function get_disabled_note( $variable, $custom_note = '' ) { - if ( $custom_note === '' && ! $this->is_control_disabled( $variable ) ) { - return ''; - } - $disabled_message = esc_html__( 'This feature has been disabled by the network admin.', 'wordpress-seo' ); - - // The explanation to show when disabling the Usage tracking feature for multisite subsites. - if ( $this->is_tracking_on_subsite( $variable ) ) { - $disabled_message = esc_html__( 'This feature has been disabled since subsites never send tracking data.', 'wordpress-seo' ); - } - - if ( $custom_note ) { - $disabled_message = esc_html( $custom_note ); - } - - return '

              ' . $disabled_message . '

              '; - } - - /** - * Determines whether we are dealing with the Usage tracking feature on a multisite subsite. - * This feature requires specific behavior for the toggle switch. - * - * @param string $feature_setting The feature setting. - * - * @return bool True if we are dealing with the Usage tracking feature on a multisite subsite. - */ - protected function is_tracking_on_subsite( $feature_setting ) { - return ( $feature_setting === 'tracking' && ! is_network_admin() && ! is_main_site() ); - } - - /** - * Returns the disabled attribute HTML. - * - * @param string $variable The variable within the option of the related form element. - * @param array $attr Extra attributes added to the form element. - * - * @return string The disabled attribute HTML. - */ - protected function get_disabled_attribute( $variable, $attr ) { - if ( $this->is_control_disabled( $variable ) || ( isset( $attr['disabled'] ) && $attr['disabled'] ) ) { - return ' disabled'; - } - - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-input-validation.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-input-validation.php deleted file mode 100644 index 573840e6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-input-validation.php +++ /dev/null @@ -1,328 +0,0 @@ - 0 ) { - return sprintf( - /* translators: %1$s: amount of errors, %2$s: the admin page title */ - _n( 'The form contains %1$s error. %2$s', 'The form contains %1$s errors. %2$s', $error_count, 'wordpress-seo' ), - number_format_i18n( $error_count ), - $admin_title - ); - } - - return $admin_title; - } - - /** - * Checks whether a specific form input field was submitted with an invalid value. - * - * @since 12.1 - * - * @param string $error_code Must be the same slug-name used for the field variable and for `add_settings_error()`. - * - * @return bool Whether or not the submitted input field contained an invalid value. - */ - public static function yoast_form_control_has_error( $error_code ) { - $errors = get_settings_errors(); - - foreach ( $errors as $error ) { - if ( $error['code'] === $error_code ) { - return true; - } - } - - return false; - } - - /** - * Sets the error descriptions. - * - * @since 12.1 - * - * @param array $descriptions An associative array of error descriptions. - * For each entry, the key must be the setting variable. - * - * @return void - */ - public static function set_error_descriptions( $descriptions = [] ) { - $defaults = [ - 'baiduverify' => sprintf( - /* translators: %s: additional message with the submitted invalid value */ - esc_html__( 'Baidu verification codes can only contain letters, numbers, hyphens, and underscores. %s', 'wordpress-seo' ), - self::get_dirty_value_message( 'baiduverify' ) - ), - 'facebook_site' => sprintf( - /* translators: %s: additional message with the submitted invalid value */ - esc_html__( 'Please check the format of the Facebook Page URL you entered. %s', 'wordpress-seo' ), - self::get_dirty_value_message( 'facebook_site' ) - ), - 'googleverify' => sprintf( - /* translators: %s: additional message with the submitted invalid value */ - esc_html__( 'Google verification codes can only contain letters, numbers, hyphens, and underscores. %s', 'wordpress-seo' ), - self::get_dirty_value_message( 'googleverify' ) - ), - 'instagram_url' => sprintf( - /* translators: %s: additional message with the submitted invalid value */ - esc_html__( 'Please check the format of the Instagram URL you entered. %s', 'wordpress-seo' ), - self::get_dirty_value_message( 'instagram_url' ) - ), - 'linkedin_url' => sprintf( - /* translators: %s: additional message with the submitted invalid value */ - esc_html__( 'Please check the format of the LinkedIn URL you entered. %s', 'wordpress-seo' ), - self::get_dirty_value_message( 'linkedin_url' ) - ), - 'msverify' => sprintf( - /* translators: %s: additional message with the submitted invalid value */ - esc_html__( 'Bing confirmation codes can only contain letters from A to F, numbers, hyphens, and underscores. %s', 'wordpress-seo' ), - self::get_dirty_value_message( 'msverify' ) - ), - 'myspace_url' => sprintf( - /* translators: %s: additional message with the submitted invalid value */ - esc_html__( 'Please check the format of the MySpace URL you entered. %s', 'wordpress-seo' ), - self::get_dirty_value_message( 'myspace_url' ) - ), - 'pinterest_url' => sprintf( - /* translators: %s: additional message with the submitted invalid value */ - esc_html__( 'Please check the format of the Pinterest URL you entered. %s', 'wordpress-seo' ), - self::get_dirty_value_message( 'pinterest_url' ) - ), - 'pinterestverify' => sprintf( - /* translators: %s: additional message with the submitted invalid value */ - esc_html__( 'Pinterest confirmation codes can only contain letters from A to F, numbers, hyphens, and underscores. %s', 'wordpress-seo' ), - self::get_dirty_value_message( 'pinterestverify' ) - ), - 'twitter_site' => sprintf( - /* translators: %s: additional message with the submitted invalid value */ - esc_html__( 'Twitter usernames can only contain letters, numbers, and underscores. %s', 'wordpress-seo' ), - self::get_dirty_value_message( 'twitter_site' ) - ), - 'wikipedia_url' => sprintf( - /* translators: %s: additional message with the submitted invalid value */ - esc_html__( 'Please check the format of the Wikipedia URL you entered. %s', 'wordpress-seo' ), - self::get_dirty_value_message( 'wikipedia_url' ) - ), - 'yandexverify' => sprintf( - /* translators: %s: additional message with the submitted invalid value */ - esc_html__( 'Yandex confirmation codes can only contain letters from A to F, numbers, hyphens, and underscores. %s', 'wordpress-seo' ), - self::get_dirty_value_message( 'yandexverify' ) - ), - 'youtube_url' => sprintf( - /* translators: %s: additional message with the submitted invalid value */ - esc_html__( 'Please check the format of the YouTube URL you entered. %s', 'wordpress-seo' ), - self::get_dirty_value_message( 'youtube_url' ) - ), - ]; - - $descriptions = wp_parse_args( $descriptions, $defaults ); - - self::$error_descriptions = $descriptions; - } - - /** - * Gets all the error descriptions. - * - * @since 12.1 - * - * @return array An associative array of error descriptions. - */ - public static function get_error_descriptions() { - return self::$error_descriptions; - } - - /** - * Gets a specific error description. - * - * @since 12.1 - * - * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. - * - * @return string|null The error description. - */ - public static function get_error_description( $error_code ) { - if ( ! isset( self::$error_descriptions[ $error_code ] ) ) { - return null; - } - - return self::$error_descriptions[ $error_code ]; - } - - /** - * Gets the aria-invalid HTML attribute based on the submitted invalid value. - * - * @since 12.1 - * - * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. - * - * @return string The aria-invalid HTML attribute or empty string. - */ - public static function get_the_aria_invalid_attribute( $error_code ) { - if ( self::yoast_form_control_has_error( $error_code ) ) { - return ' aria-invalid="true"'; - } - - return ''; - } - - /** - * Gets the aria-describedby HTML attribute based on the submitted invalid value. - * - * @since 12.1 - * - * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. - * - * @return string The aria-describedby HTML attribute or empty string. - */ - public static function get_the_aria_describedby_attribute( $error_code ) { - if ( self::yoast_form_control_has_error( $error_code ) && self::get_error_description( $error_code ) ) { - return ' aria-describedby="' . esc_attr( $error_code ) . '-error-description"'; - } - - return ''; - } - - /** - * Gets the error description wrapped in a HTML paragraph. - * - * @since 12.1 - * - * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. - * - * @return string The error description HTML or empty string. - */ - public static function get_the_error_description( $error_code ) { - $error_description = self::get_error_description( $error_code ); - - if ( self::yoast_form_control_has_error( $error_code ) && $error_description ) { - return '

              ' . $error_description . '

              '; - } - - return ''; - } - - /** - * Adds the submitted invalid value to the WordPress `$wp_settings_errors` global. - * - * @since 12.1 - * - * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. - * @param string $dirty_value The submitted invalid value. - * - * @return void - */ - public static function add_dirty_value_to_settings_errors( $error_code, $dirty_value ) { - global $wp_settings_errors; - - if ( ! is_array( $wp_settings_errors ) ) { - return; - } - - foreach ( $wp_settings_errors as $index => $error ) { - if ( $error['code'] === $error_code ) { - // phpcs:ignore WordPress.WP.GlobalVariablesOverride -- This is a deliberate action. - $wp_settings_errors[ $index ]['yoast_dirty_value'] = $dirty_value; - } - } - } - - /** - * Gets an invalid submitted value. - * - * @since 12.1 - * - * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. - * - * @return string The submitted invalid input field value. - */ - public static function get_dirty_value( $error_code ) { - $errors = get_settings_errors(); - - foreach ( $errors as $error ) { - if ( $error['code'] === $error_code && isset( $error['yoast_dirty_value'] ) ) { - return $error['yoast_dirty_value']; - } - } - - return ''; - } - - /** - * Gets a specific invalid value message. - * - * @since 12.1 - * - * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. - * - * @return string The error invalid value message or empty string. - */ - public static function get_dirty_value_message( $error_code ) { - $dirty_value = self::get_dirty_value( $error_code ); - - if ( $dirty_value ) { - return sprintf( - /* translators: %s: form value as submitted. */ - esc_html__( 'The submitted value was: %s', 'wordpress-seo' ), - esc_html( $dirty_value ) - ); - } - - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-network-admin.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-network-admin.php deleted file mode 100644 index 01f8f2f3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-network-admin.php +++ /dev/null @@ -1,334 +0,0 @@ - $site_label pairs. - */ - public function get_site_choices( $include_empty = false, $show_title = false ) { - $choices = []; - - if ( $include_empty ) { - $choices['-'] = __( 'None', 'wordpress-seo' ); - } - - $criteria = [ - 'deleted' => 0, - 'network_id' => get_current_network_id(), - ]; - $sites = get_sites( $criteria ); - - foreach ( $sites as $site ) { - $site_name = $site->domain . $site->path; - if ( $show_title ) { - $site_name = $site->blogname . ' (' . $site->domain . $site->path . ')'; - } - $choices[ $site->blog_id ] = $site->blog_id . ': ' . $site_name; - - $site_states = $this->get_site_states( $site ); - if ( ! empty( $site_states ) ) { - $choices[ $site->blog_id ] .= ' [' . implode( ', ', $site_states ) . ']'; - } - } - - return $choices; - } - - /** - * Gets the states of a site. - * - * @param WP_Site $site Site object. - * - * @return array Array of $state_slug => $state_label pairs. - */ - public function get_site_states( $site ) { - $available_states = [ - 'public' => __( 'public', 'wordpress-seo' ), - 'archived' => __( 'archived', 'wordpress-seo' ), - 'mature' => __( 'mature', 'wordpress-seo' ), - 'spam' => __( 'spam', 'wordpress-seo' ), - 'deleted' => __( 'deleted', 'wordpress-seo' ), - ]; - - $site_states = []; - foreach ( $available_states as $state_slug => $state_label ) { - if ( $site->$state_slug === '1' ) { - $site_states[ $state_slug ] = $state_label; - } - } - - return $site_states; - } - - /** - * Handles a request to update plugin network options. - * - * This method works similar to how option updates are handled in `wp-admin/options.php` and - * `wp-admin/network/settings.php`. - * - * @return void - */ - public function handle_update_options_request() { - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: Nonce verification will happen in verify_request below. - if ( ! isset( $_POST['network_option_group'] ) || ! is_string( $_POST['network_option_group'] ) ) { - return; - } - - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: Nonce verification will happen in verify_request below. - $option_group = sanitize_text_field( wp_unslash( $_POST['network_option_group'] ) ); - - if ( empty( $option_group ) ) { - return; - } - - $this->verify_request( "{$option_group}-network-options" ); - - $whitelist_options = Yoast_Network_Settings_API::get()->get_whitelist_options( $option_group ); - - if ( empty( $whitelist_options ) ) { - add_settings_error( $option_group, 'settings_updated', __( 'You are not allowed to modify unregistered network settings.', 'wordpress-seo' ), 'error' ); - - $this->terminate_request(); - return; - } - - // phpcs:disable WordPress.Security.NonceVerification -- Nonce verified via `verify_request()` above. - foreach ( $whitelist_options as $option_name ) { - $value = null; - if ( isset( $_POST[ $option_name ] ) ) { - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: Adding sanitize_text_field around this will break the saving of settings because it expects a string: https://github.com/Yoast/wordpress-seo/issues/12440. - $value = wp_unslash( $_POST[ $option_name ] ); - } - - WPSEO_Options::update_site_option( $option_name, $value ); - } - // phpcs:enable WordPress.Security.NonceVerification - - $settings_errors = get_settings_errors(); - if ( empty( $settings_errors ) ) { - add_settings_error( $option_group, 'settings_updated', __( 'Settings Updated.', 'wordpress-seo' ), 'updated' ); - } - - $this->terminate_request(); - } - - /** - * Handles a request to restore a site's default settings. - * - * @return void - */ - public function handle_restore_site_request() { - $this->verify_request( 'wpseo-network-restore', 'restore_site_nonce' ); - - $option_group = 'wpseo_ms'; - - // phpcs:ignore WordPress.Security.NonceVerification -- Nonce verified via `verify_request()` above. - $site_id = ! empty( $_POST[ $option_group ]['site_id'] ) ? (int) $_POST[ $option_group ]['site_id'] : 0; - if ( ! $site_id ) { - add_settings_error( $option_group, 'settings_updated', __( 'No site has been selected to restore.', 'wordpress-seo' ), 'error' ); - - $this->terminate_request(); - return; - } - - $site = get_site( $site_id ); - if ( ! $site ) { - /* translators: %s expands to the ID of a site within a multisite network. */ - add_settings_error( $option_group, 'settings_updated', sprintf( __( 'Site with ID %d not found.', 'wordpress-seo' ), $site_id ), 'error' ); - } - else { - WPSEO_Options::reset_ms_blog( $site_id ); - - /* translators: %s expands to the name of a site within a multisite network. */ - add_settings_error( $option_group, 'settings_updated', sprintf( __( '%s restored to default SEO settings.', 'wordpress-seo' ), esc_html( $site->blogname ) ), 'updated' ); - } - - $this->terminate_request(); - } - - /** - * Outputs nonce, action and option group fields for a network settings page in the plugin. - * - * @param string $option_group Option group name for the current page. - * - * @return void - */ - public function settings_fields( $option_group ) { - ?> - - - enqueue_script( 'network-admin' ); - - $translations = [ - /* translators: %s: success message */ - 'success_prefix' => __( 'Success: %s', 'wordpress-seo' ), - /* translators: %s: error message */ - 'error_prefix' => __( 'Error: %s', 'wordpress-seo' ), - ]; - $asset_manager->localize_script( - 'network-admin', - 'wpseoNetworkAdminGlobalL10n', - $translations - ); - } - - /** - * Hooks in the necessary actions and filters. - * - * @return void - */ - public function register_hooks() { - - if ( ! $this->meets_requirements() ) { - return; - } - - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - - add_action( 'admin_action_' . self::UPDATE_OPTIONS_ACTION, [ $this, 'handle_update_options_request' ] ); - add_action( 'admin_action_' . self::RESTORE_SITE_ACTION, [ $this, 'handle_restore_site_request' ] ); - } - - /** - * Hooks in the necessary AJAX actions. - * - * @return void - */ - public function register_ajax_hooks() { - add_action( 'wp_ajax_' . self::UPDATE_OPTIONS_ACTION, [ $this, 'handle_update_options_request' ] ); - add_action( 'wp_ajax_' . self::RESTORE_SITE_ACTION, [ $this, 'handle_restore_site_request' ] ); - } - - /** - * Checks whether the requirements to use this class are met. - * - * @return bool True if requirements are met, false otherwise. - */ - public function meets_requirements() { - return is_multisite() && is_network_admin(); - } - - /** - * Verifies that the current request is valid. - * - * @param string $action Nonce action. - * @param string $query_arg Optional. Nonce query argument. Default '_wpnonce'. - * - * @return void - */ - public function verify_request( $action, $query_arg = '_wpnonce' ) { - $has_access = current_user_can( 'wpseo_manage_network_options' ); - - if ( wp_doing_ajax() ) { - check_ajax_referer( $action, $query_arg ); - - if ( ! $has_access ) { - wp_die( -1, 403 ); - } - return; - } - - check_admin_referer( $action, $query_arg ); - - if ( ! $has_access ) { - wp_die( esc_html__( 'You are not allowed to perform this action.', 'wordpress-seo' ) ); - } - } - - /** - * Terminates the current request by either redirecting back or sending an AJAX response. - * - * @return void - */ - public function terminate_request() { - if ( wp_doing_ajax() ) { - $settings_errors = get_settings_errors(); - - if ( ! empty( $settings_errors ) && $settings_errors[0]['type'] === 'updated' ) { - wp_send_json_success( $settings_errors, 200 ); - } - - wp_send_json_error( $settings_errors, 400 ); - } - - $this->persist_settings_errors(); - $this->redirect_back( [ 'settings-updated' => 'true' ] ); - } - - /** - * Persists settings errors. - * - * Settings errors are stored in a transient for 30 seconds so that this transient - * can be retrieved on the next page load. - * - * @return void - */ - protected function persist_settings_errors() { - /* - * A regular transient is used here, since it is automatically cleared right after the redirect. - * A network transient would be cleaner, but would require a lot of copied code from core for - * just a minor adjustment when displaying settings errors. - */ - set_transient( 'settings_errors', get_settings_errors(), 30 ); - } - - /** - * Redirects back to the referer URL, with optional query arguments. - * - * @param array $query_args Optional. Query arguments to add to the redirect URL. Default none. - * - * @return void - */ - protected function redirect_back( $query_args = [] ) { - $sendback = wp_get_referer(); - - if ( ! empty( $query_args ) ) { - $sendback = add_query_arg( $query_args, $sendback ); - } - - wp_safe_redirect( $sendback ); - exit; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-network-settings-api.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-network-settings-api.php deleted file mode 100644 index 990f78ad..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-network-settings-api.php +++ /dev/null @@ -1,164 +0,0 @@ - $option_group, - 'sanitize_callback' => null, - ]; - $args = wp_parse_args( $args, $defaults ); - - if ( ! isset( $this->whitelist_options[ $option_group ] ) ) { - $this->whitelist_options[ $option_group ] = []; - } - - $this->whitelist_options[ $option_group ][] = $option_name; - - if ( ! empty( $args['sanitize_callback'] ) ) { - add_filter( "sanitize_option_{$option_name}", [ $this, 'filter_sanitize_option' ], 10, 2 ); - } - - if ( array_key_exists( 'default', $args ) ) { - add_filter( "default_site_option_{$option_name}", [ $this, 'filter_default_option' ], 10, 2 ); - } - - $this->registered_settings[ $option_name ] = $args; - } - - /** - * Gets the registered settings and their data. - * - * @return array Array of $option_name => $data pairs. - */ - public function get_registered_settings() { - return $this->registered_settings; - } - - /** - * Gets the whitelisted options for a given option group. - * - * @param string $option_group Option group. - * - * @return array List of option names, or empty array if unknown option group. - */ - public function get_whitelist_options( $option_group ) { - if ( ! isset( $this->whitelist_options[ $option_group ] ) ) { - return []; - } - - return $this->whitelist_options[ $option_group ]; - } - - /** - * Filters sanitization for a network option value. - * - * This method is added as a filter to `sanitize_option_{$option}` for network options that are - * registered with a sanitize callback. - * - * @param string $value The sanitized option value. - * @param string $option The option name. - * - * @return string The filtered sanitized option value. - */ - public function filter_sanitize_option( $value, $option ) { - - if ( empty( $this->registered_settings[ $option ] ) ) { - return $value; - } - - return call_user_func( $this->registered_settings[ $option ]['sanitize_callback'], $value ); - } - - /** - * Filters the default value for a network option. - * - * This function is added as a filter to `default_site_option_{$option}` for network options that - * are registered with a default. - * - * @param mixed $default_value Existing default value to return. - * @param string $option The option name. - * - * @return mixed The filtered default value. - */ - public function filter_default_option( $default_value, $option ) { - - // If a default value was manually passed to the function, allow it to override. - if ( $default_value !== false ) { - return $default_value; - } - - if ( empty( $this->registered_settings[ $option ] ) ) { - return $default_value; - } - - return $this->registered_settings[ $option ]['default']; - } - - /** - * Checks whether the requirements to use this class are met. - * - * @return bool True if requirements are met, false otherwise. - */ - public function meets_requirements() { - return is_multisite(); - } - - /** - * Gets the singleton instance of this class. - * - * @return Yoast_Network_Settings_API The singleton instance. - */ - public static function get() { - - if ( self::$instance === null ) { - self::$instance = new self(); - } - - return self::$instance; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification-center.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification-center.php deleted file mode 100644 index fcbc734d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification-center.php +++ /dev/null @@ -1,954 +0,0 @@ -get_notification_by_id( $notification_id ); - if ( ( $notification instanceof Yoast_Notification ) === false ) { - - // Permit legacy. - $options = [ - 'id' => $notification_id, - 'dismissal_key' => $notification_id, - ]; - $notification = new Yoast_Notification( '', $options ); - } - - if ( self::maybe_dismiss_notification( $notification ) ) { - die( '1' ); - } - - die( '-1' ); - } - - /** - * Check if the user has dismissed a notification. - * - * @param Yoast_Notification $notification The notification to check for dismissal. - * @param int|null $user_id User ID to check on. - * - * @return bool - */ - public static function is_notification_dismissed( Yoast_Notification $notification, $user_id = null ) { - - $user_id = self::get_user_id( $user_id ); - $dismissal_key = $notification->get_dismissal_key(); - - // This checks both the site-specific user option and the meta value. - $current_value = get_user_option( $dismissal_key, $user_id ); - - // Migrate old user meta to user option on-the-fly. - if ( ! empty( $current_value ) - && metadata_exists( 'user', $user_id, $dismissal_key ) - && update_user_option( $user_id, $dismissal_key, $current_value ) ) { - delete_user_meta( $user_id, $dismissal_key ); - } - - return ! empty( $current_value ); - } - - /** - * Checks if the notification is being dismissed. - * - * @param Yoast_Notification $notification Notification to check dismissal of. - * @param string $meta_value Value to set the meta value to if dismissed. - * - * @return bool True if dismissed. - */ - public static function maybe_dismiss_notification( Yoast_Notification $notification, $meta_value = 'seen' ) { - - // Only persistent notifications are dismissible. - if ( ! $notification->is_persistent() ) { - return false; - } - - // If notification is already dismissed, we're done. - if ( self::is_notification_dismissed( $notification ) ) { - return true; - } - - $dismissal_key = $notification->get_dismissal_key(); - $notification_id = $notification->get_id(); - - $is_dismissing = ( $dismissal_key === self::get_user_input( 'notification' ) ); - if ( ! $is_dismissing ) { - $is_dismissing = ( $notification_id === self::get_user_input( 'notification' ) ); - } - - // Fallback to ?dismissal_key=1&nonce=bla when JavaScript fails. - if ( ! $is_dismissing ) { - $is_dismissing = ( self::get_user_input( $dismissal_key ) === '1' ); - } - - if ( ! $is_dismissing ) { - return false; - } - - $user_nonce = self::get_user_input( 'nonce' ); - if ( wp_verify_nonce( $user_nonce, $notification_id ) === false ) { - return false; - } - - return self::dismiss_notification( $notification, $meta_value ); - } - - /** - * Dismisses a notification. - * - * @param Yoast_Notification $notification Notification to dismiss. - * @param string $meta_value Value to save in the dismissal. - * - * @return bool True if dismissed, false otherwise. - */ - public static function dismiss_notification( Yoast_Notification $notification, $meta_value = 'seen' ) { - // Dismiss notification. - return update_user_option( get_current_user_id(), $notification->get_dismissal_key(), $meta_value ) !== false; - } - - /** - * Restores a notification. - * - * @param Yoast_Notification $notification Notification to restore. - * - * @return bool True if restored, false otherwise. - */ - public static function restore_notification( Yoast_Notification $notification ) { - - $user_id = get_current_user_id(); - $dismissal_key = $notification->get_dismissal_key(); - - // Restore notification. - $restored = delete_user_option( $user_id, $dismissal_key ); - - // Delete unprefixed user meta too for backward-compatibility. - if ( metadata_exists( 'user', $user_id, $dismissal_key ) ) { - $restored = delete_user_meta( $user_id, $dismissal_key ) && $restored; - } - - return $restored; - } - - /** - * Clear dismissal information for the specified Notification. - * - * When a cause is resolved, the next time it is present we want to show - * the message again. - * - * @param string|Yoast_Notification $notification Notification to clear the dismissal of. - * - * @return bool - */ - public function clear_dismissal( $notification ) { - - global $wpdb; - - if ( $notification instanceof Yoast_Notification ) { - $dismissal_key = $notification->get_dismissal_key(); - } - - if ( is_string( $notification ) ) { - $dismissal_key = $notification; - } - - if ( empty( $dismissal_key ) ) { - return false; - } - - // Remove notification dismissal for all users. - $deleted = delete_metadata( 'user', 0, $wpdb->get_blog_prefix() . $dismissal_key, '', true ); - - // Delete unprefixed user meta too for backward-compatibility. - $deleted = delete_metadata( 'user', 0, $dismissal_key, '', true ) || $deleted; - - return $deleted; - } - - /** - * Retrieves notifications from the storage and merges in previous notification changes. - * - * The current user in WordPress is not loaded shortly before the 'init' hook, but the plugin - * sometimes needs to add or remove notifications before that. In such cases, the transactions - * are not actually executed, but added to a queue. That queue is then handled in this method, - * after notifications for the current user have been set up. - * - * @return void - */ - public function setup_current_notifications() { - $this->retrieve_notifications_from_storage( get_current_user_id() ); - - foreach ( $this->queued_transactions as $transaction ) { - list( $callback, $args ) = $transaction; - - call_user_func_array( $callback, $args ); - } - - $this->queued_transactions = []; - } - - /** - * Add notification to the cookie. - * - * @param Yoast_Notification $notification Notification object instance. - * - * @return void - */ - public function add_notification( Yoast_Notification $notification ) { - - $callback = [ $this, __FUNCTION__ ]; - $args = func_get_args(); - if ( $this->queue_transaction( $callback, $args ) ) { - return; - } - - // Don't add if the user can't see it. - if ( ! $notification->display_for_current_user() ) { - return; - } - - $notification_id = $notification->get_id(); - $user_id = $notification->get_user_id(); - - // Empty notifications are always added. - if ( $notification_id !== '' ) { - - // If notification ID exists in notifications, don't add again. - $present_notification = $this->get_notification_by_id( $notification_id, $user_id ); - if ( ! is_null( $present_notification ) ) { - $this->remove_notification( $present_notification, false ); - } - - if ( is_null( $present_notification ) ) { - $this->new[] = $notification_id; - } - } - - // Add to list. - $this->notifications[ $user_id ][] = $notification; - - $this->notifications_need_storage = true; - } - - /** - * Get the notification by ID and user ID. - * - * @param string $notification_id The ID of the notification to search for. - * @param int|null $user_id The ID of the user. - * - * @return Yoast_Notification|null - */ - public function get_notification_by_id( $notification_id, $user_id = null ) { - $user_id = self::get_user_id( $user_id ); - - $notifications = $this->get_notifications_for_user( $user_id ); - - foreach ( $notifications as $notification ) { - if ( $notification_id === $notification->get_id() ) { - return $notification; - } - } - - return null; - } - - /** - * Display the notifications. - * - * @param bool $echo_as_json True when notifications should be printed directly. - * - * @return void - */ - public function display_notifications( $echo_as_json = false ) { - - // Never display notifications for network admin. - if ( is_network_admin() ) { - return; - } - - $sorted_notifications = $this->get_sorted_notifications(); - $notifications = array_filter( $sorted_notifications, [ $this, 'is_notification_persistent' ] ); - - if ( empty( $notifications ) ) { - return; - } - - array_walk( $notifications, [ $this, 'remove_notification' ] ); - - $notifications = array_unique( $notifications ); - if ( $echo_as_json ) { - $notification_json = []; - - foreach ( $notifications as $notification ) { - $notification_json[] = $notification->render(); - } - - // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe. - echo WPSEO_Utils::format_json_encode( $notification_json ); - - return; - } - - foreach ( $notifications as $notification ) { - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: Temporarily disabled, see: https://github.com/Yoast/wordpress-seo-premium/issues/2510 and https://github.com/Yoast/wordpress-seo-premium/issues/2511. - echo $notification; - } - } - - /** - * Remove notification after it has been displayed. - * - * @param Yoast_Notification $notification Notification to remove. - * @param bool $resolve Resolve as fixed. - * - * @return void - */ - public function remove_notification( Yoast_Notification $notification, $resolve = true ) { - - $callback = [ $this, __FUNCTION__ ]; - $args = func_get_args(); - if ( $this->queue_transaction( $callback, $args ) ) { - return; - } - - $index = false; - - // ID of the user to show the notification for, defaults to current user id. - $user_id = $notification->get_user_id(); - $notifications = $this->get_notifications_for_user( $user_id ); - - // Match persistent Notifications by ID, non persistent by item in the array. - if ( $notification->is_persistent() ) { - foreach ( $notifications as $current_index => $present_notification ) { - if ( $present_notification->get_id() === $notification->get_id() ) { - $index = $current_index; - break; - } - } - } - else { - $index = array_search( $notification, $notifications, true ); - } - - if ( $index === false ) { - return; - } - - if ( $notification->is_persistent() && $resolve ) { - ++$this->resolved; - $this->clear_dismissal( $notification ); - } - - unset( $notifications[ $index ] ); - $this->notifications[ $user_id ] = array_values( $notifications ); - - $this->notifications_need_storage = true; - } - - /** - * Removes a notification by its ID. - * - * @param string $notification_id The notification id. - * @param bool $resolve Resolve as fixed. - * - * @return void - */ - public function remove_notification_by_id( $notification_id, $resolve = true ) { - $notification = $this->get_notification_by_id( $notification_id ); - - if ( $notification === null ) { - return; - } - - $this->remove_notification( $notification, $resolve ); - $this->notifications_need_storage = true; - } - - /** - * Get the notification count. - * - * @param bool $dismissed Count dismissed notifications. - * - * @return int Number of notifications - */ - public function get_notification_count( $dismissed = false ) { - - $notifications = $this->get_notifications_for_user( get_current_user_id() ); - $notifications = array_filter( $notifications, [ $this, 'filter_persistent_notifications' ] ); - - if ( ! $dismissed ) { - $notifications = array_filter( $notifications, [ $this, 'filter_dismissed_notifications' ] ); - } - - return count( $notifications ); - } - - /** - * Get the number of notifications resolved this execution. - * - * These notifications have been resolved and should be counted when active again. - * - * @return int - */ - public function get_resolved_notification_count() { - - return $this->resolved; - } - - /** - * Return the notifications sorted on type and priority. - * - * @return array|Yoast_Notification[] Sorted Notifications - */ - public function get_sorted_notifications() { - $notifications = $this->get_notifications_for_user( get_current_user_id() ); - if ( empty( $notifications ) ) { - return []; - } - - // Sort by severity, error first. - usort( $notifications, [ $this, 'sort_notifications' ] ); - - return $notifications; - } - - /** - * AJAX display notifications. - * - * @return void - */ - public function ajax_get_notifications() { - $echo = false; - // phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form data. - if ( isset( $_POST['version'] ) && is_string( $_POST['version'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are only comparing the variable in a condition. - $echo = wp_unslash( $_POST['version'] ) === '2'; - } - - // Display the notices. - $this->display_notifications( $echo ); - - // AJAX die. - exit; - } - - /** - * Remove storage when the plugin is deactivated. - * - * @return void - */ - public function deactivate_hook() { - - $this->clear_notifications(); - } - - /** - * Returns the given user ID if it exists. - * Otherwise, this function returns the ID of the current user. - * - * @param int $user_id The user ID to check. - * - * @return int The user ID to use. - */ - private static function get_user_id( $user_id ) { - if ( $user_id ) { - return $user_id; - } - return get_current_user_id(); - } - - /** - * Splits the notifications on user ID. - * - * In other terms, it returns an associative array, - * mapping user ID to a list of notifications for this user. - * - * @param array|Yoast_Notification[] $notifications The notifications to split. - * - * @return array The notifications, split on user ID. - */ - private function split_on_user_id( $notifications ) { - $split_notifications = []; - foreach ( $notifications as $notification ) { - $split_notifications[ $notification->get_user_id() ][] = $notification; - } - return $split_notifications; - } - - /** - * Save persistent notifications to storage. - * - * We need to be able to retrieve these so they can be dismissed at any time during the execution. - * - * @since 3.2 - * - * @return void - */ - public function update_storage() { - - $notifications = $this->notifications; - - /** - * One array of Yoast_Notifications, merged from multiple arrays. - * - * @var Yoast_Notification[] $merged_notifications - */ - $merged_notifications = []; - if ( ! empty( $notifications ) ) { - $merged_notifications = array_merge( ...$notifications ); - } - - /** - * Filter: 'yoast_notifications_before_storage' - Allows developer to filter notifications before saving them. - * - * @param Yoast_Notification[] $notifications - */ - $filtered_merged_notifications = apply_filters( 'yoast_notifications_before_storage', $merged_notifications ); - - // The notifications were filtered and therefore need to be stored. - if ( $merged_notifications !== $filtered_merged_notifications ) { - $merged_notifications = $filtered_merged_notifications; - $this->notifications_need_storage = true; - } - - $notifications = $this->split_on_user_id( $merged_notifications ); - - // No notifications to store, clear storage if it was previously present. - if ( empty( $notifications ) ) { - $this->remove_storage(); - - return; - } - - // Only store notifications if changes are made. - if ( $this->notifications_need_storage ) { - array_walk( $notifications, [ $this, 'store_notifications_for_user' ] ); - } - } - - /** - * Stores the notifications to its respective user's storage. - * - * @param array|Yoast_Notification[] $notifications The notifications to store. - * @param int $user_id The ID of the user for which to store the notifications. - * - * @return void - */ - private function store_notifications_for_user( $notifications, $user_id ) { - $notifications_as_arrays = array_map( [ $this, 'notification_to_array' ], $notifications ); - update_user_option( $user_id, self::STORAGE_KEY, $notifications_as_arrays ); - } - - /** - * Provide a way to verify present notifications. - * - * @return array|Yoast_Notification[] Registered notifications. - */ - public function get_notifications() { - if ( ! $this->notifications ) { - return []; - } - return array_merge( ...$this->notifications ); - } - - /** - * Returns the notifications for the given user. - * - * @param int $user_id The id of the user to check. - * - * @return Yoast_Notification[] The notifications for the user with the given ID. - */ - public function get_notifications_for_user( $user_id ) { - if ( array_key_exists( $user_id, $this->notifications ) ) { - return $this->notifications[ $user_id ]; - } - return []; - } - - /** - * Get newly added notifications. - * - * @return array - */ - public function get_new_notifications() { - - return array_map( [ $this, 'get_notification_by_id' ], $this->new ); - } - - /** - * Get information from the User input. - * - * Note that this function does not handle nonce verification. - * - * @param string $key Key to retrieve. - * - * @return string non-sanitized value of key if set, an empty string otherwise. - */ - private static function get_user_input( $key ) { - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized,WordPress.Security.NonceVerification.Missing -- Reason: We are not processing form information and only using this variable in a comparison. - $request_method = isset( $_SERVER['REQUEST_METHOD'] ) && is_string( $_SERVER['REQUEST_METHOD'] ) ? strtoupper( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) : ''; - // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: This function does not sanitize variables. - // phpcs:disable WordPress.Security.NonceVerification.Recommended,WordPress.Security.NonceVerification.Missing -- Reason: This function does not verify a nonce. - if ( $request_method === 'POST' ) { - if ( isset( $_POST[ $key ] ) && is_string( $_POST[ $key ] ) ) { - return wp_unslash( $_POST[ $key ] ); - } - } - elseif ( isset( $_GET[ $key ] ) && is_string( $_GET[ $key ] ) ) { - return wp_unslash( $_GET[ $key ] ); - } - // phpcs:enable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized - return ''; - } - - /** - * Retrieve the notifications from storage and fill the relevant property. - * - * @param int $user_id The ID of the user to retrieve notifications for. - * - * @return void - */ - private function retrieve_notifications_from_storage( $user_id ) { - if ( $this->notifications_retrieved ) { - return; - } - - $this->notifications_retrieved = true; - - $stored_notifications = get_user_option( self::STORAGE_KEY, $user_id ); - - // Check if notifications are stored. - if ( empty( $stored_notifications ) ) { - return; - } - - if ( is_array( $stored_notifications ) ) { - $notifications = array_map( [ $this, 'array_to_notification' ], $stored_notifications ); - - // Apply array_values to ensure we get a 0-indexed array. - $notifications = array_values( array_filter( $notifications, [ $this, 'filter_notification_current_user' ] ) ); - - $this->notifications[ $user_id ] = $notifications; - } - } - - /** - * Sort on type then priority. - * - * @param Yoast_Notification $a Compare with B. - * @param Yoast_Notification $b Compare with A. - * - * @return int 1, 0 or -1 for sorting offset. - */ - private function sort_notifications( Yoast_Notification $a, Yoast_Notification $b ) { - - $a_type = $a->get_type(); - $b_type = $b->get_type(); - - if ( $a_type === $b_type ) { - return WPSEO_Utils::calc( $b->get_priority(), 'compare', $a->get_priority() ); - } - - if ( $a_type === 'error' ) { - return -1; - } - - if ( $b_type === 'error' ) { - return 1; - } - - return 0; - } - - /** - * Clear local stored notifications. - * - * @return void - */ - private function clear_notifications() { - - $this->notifications = []; - $this->notifications_retrieved = false; - } - - /** - * Filter out non-persistent notifications. - * - * @since 3.2 - * - * @param Yoast_Notification $notification Notification to test for persistent. - * - * @return bool - */ - private function filter_persistent_notifications( Yoast_Notification $notification ) { - - return $notification->is_persistent(); - } - - /** - * Filter out dismissed notifications. - * - * @param Yoast_Notification $notification Notification to check. - * - * @return bool - */ - private function filter_dismissed_notifications( Yoast_Notification $notification ) { - - return ! self::maybe_dismiss_notification( $notification ); - } - - /** - * Convert Notification to array representation. - * - * @since 3.2 - * - * @param Yoast_Notification $notification Notification to convert. - * - * @return array - */ - private function notification_to_array( Yoast_Notification $notification ) { - - $notification_data = $notification->to_array(); - - if ( isset( $notification_data['nonce'] ) ) { - unset( $notification_data['nonce'] ); - } - - return $notification_data; - } - - /** - * Convert stored array to Notification. - * - * @param array $notification_data Array to convert to Notification. - * - * @return Yoast_Notification - */ - private function array_to_notification( $notification_data ) { - - if ( isset( $notification_data['options']['nonce'] ) ) { - unset( $notification_data['options']['nonce'] ); - } - - if ( isset( $notification_data['message'] ) - && is_subclass_of( $notification_data['message'], Abstract_Presenter::class, false ) - ) { - $notification_data['message'] = $notification_data['message']->present(); - } - - if ( isset( $notification_data['options']['user'] ) ) { - $notification_data['options']['user_id'] = $notification_data['options']['user']->ID; - unset( $notification_data['options']['user'] ); - - $this->notifications_need_storage = true; - } - - return new Yoast_Notification( - $notification_data['message'], - $notification_data['options'] - ); - } - - /** - * Filter notifications that should not be displayed for the current user. - * - * @param Yoast_Notification $notification Notification to test. - * - * @return bool - */ - private function filter_notification_current_user( Yoast_Notification $notification ) { - return $notification->display_for_current_user(); - } - - /** - * Checks if given notification is persistent. - * - * @param Yoast_Notification $notification The notification to check. - * - * @return bool True when notification is not persistent. - */ - private function is_notification_persistent( Yoast_Notification $notification ) { - return ! $notification->is_persistent(); - } - - /** - * Queues a notification transaction for later execution if notifications are not yet set up. - * - * @param callable $callback Callback that performs the transaction. - * @param array $args Arguments to pass to the callback. - * - * @return bool True if transaction was queued, false if it can be performed immediately. - */ - private function queue_transaction( $callback, $args ) { - if ( $this->notifications_retrieved ) { - return false; - } - - $this->add_transaction_to_queue( $callback, $args ); - - return true; - } - - /** - * Adds a notification transaction to the queue for later execution. - * - * @param callable $callback Callback that performs the transaction. - * @param array $args Arguments to pass to the callback. - * - * @return void - */ - private function add_transaction_to_queue( $callback, $args ) { - $this->queued_transactions[] = [ $callback, $args ]; - } - - /** - * Removes all notifications from storage. - * - * @return bool True when notifications got removed. - */ - protected function remove_storage() { - if ( ! $this->has_stored_notifications() ) { - return false; - } - - delete_user_option( get_current_user_id(), self::STORAGE_KEY ); - return true; - } - - /** - * Checks if there are stored notifications. - * - * @return bool True when there are stored notifications. - */ - protected function has_stored_notifications() { - $stored_notifications = $this->get_stored_notifications(); - - return ! empty( $stored_notifications ); - } - - /** - * Retrieves the stored notifications. - * - * @codeCoverageIgnore - * - * @return array|false Array with notifications or false when not set. - */ - protected function get_stored_notifications() { - return get_user_option( self::STORAGE_KEY, get_current_user_id() ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification.php deleted file mode 100644 index 3191827b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification.php +++ /dev/null @@ -1,429 +0,0 @@ - self::UPDATED, - 'id' => '', - 'user_id' => null, - 'nonce' => null, - 'priority' => 0.5, - 'data_json' => [], - 'dismissal_key' => null, - 'capabilities' => [], - 'capability_check' => self::MATCH_ALL, - 'yoast_branding' => false, - ]; - - /** - * The message for the notification. - * - * @var string - */ - private $message; - - /** - * Notification class constructor. - * - * @param string $message Message string. - * @param array $options Set of options. - */ - public function __construct( $message, $options = [] ) { - $this->message = $message; - $this->options = $this->normalize_options( $options ); - } - - /** - * Retrieve notification ID string. - * - * @return string - */ - public function get_id() { - return $this->options['id']; - } - - /** - * Retrieve the user to show the notification for. - * - * @deprecated 21.6 - * @codeCoverageIgnore - * - * @return WP_User The user to show this notification for. - */ - public function get_user() { - _deprecated_function( __METHOD__, 'Yoast SEO 21.6' ); - return null; - } - - /** - * Retrieve the id of the user to show the notification for. - * - * Returns the id of the current user if not user has been sent. - * - * @return int The user id - */ - public function get_user_id() { - return ( $this->options['user_id'] ?? get_current_user_id() ); - } - - /** - * Retrieve nonce identifier. - * - * @return string|null Nonce for this Notification. - */ - public function get_nonce() { - if ( $this->options['id'] && empty( $this->options['nonce'] ) ) { - $this->options['nonce'] = wp_create_nonce( $this->options['id'] ); - } - - return $this->options['nonce']; - } - - /** - * Make sure the nonce is up to date. - * - * @return void - */ - public function refresh_nonce() { - if ( $this->options['id'] ) { - $this->options['nonce'] = wp_create_nonce( $this->options['id'] ); - } - } - - /** - * Get the type of the notification. - * - * @return string - */ - public function get_type() { - return $this->options['type']; - } - - /** - * Priority of the notification. - * - * Relative to the type. - * - * @return float Returns the priority between 0 and 1. - */ - public function get_priority() { - return $this->options['priority']; - } - - /** - * Get the User Meta key to check for dismissal of notification. - * - * @return string User Meta Option key that registers dismissal. - */ - public function get_dismissal_key() { - if ( empty( $this->options['dismissal_key'] ) ) { - return $this->options['id']; - } - - return $this->options['dismissal_key']; - } - - /** - * Is this Notification persistent. - * - * @return bool True if persistent, False if fire and forget. - */ - public function is_persistent() { - $id = $this->get_id(); - - return ! empty( $id ); - } - - /** - * Check if the notification is relevant for the current user. - * - * @return bool True if a user needs to see this notification, false if not. - */ - public function display_for_current_user() { - // If the notification is for the current page only, always show. - if ( ! $this->is_persistent() ) { - return true; - } - - // If the current user doesn't match capabilities. - return $this->match_capabilities(); - } - - /** - * Does the current user match required capabilities. - * - * @return bool - */ - public function match_capabilities() { - // Super Admin can do anything. - if ( is_multisite() && is_super_admin( $this->options['user_id'] ) ) { - return true; - } - - /** - * Filter capabilities that enable the displaying of this notification. - * - * @param array $capabilities The capabilities that must be present for this notification. - * @param Yoast_Notification $notification The notification object. - * - * @return array Array of capabilities or empty for no restrictions. - * - * @since 3.2 - */ - $capabilities = apply_filters( 'wpseo_notification_capabilities', $this->options['capabilities'], $this ); - - // Should be an array. - if ( ! is_array( $capabilities ) ) { - $capabilities = (array) $capabilities; - } - - /** - * Filter capability check to enable all or any capabilities. - * - * @param string $capability_check The type of check that will be used to determine if an capability is present. - * @param Yoast_Notification $notification The notification object. - * - * @return string self::MATCH_ALL or self::MATCH_ANY. - * - * @since 3.2 - */ - $capability_check = apply_filters( 'wpseo_notification_capability_check', $this->options['capability_check'], $this ); - - if ( ! in_array( $capability_check, [ self::MATCH_ALL, self::MATCH_ANY ], true ) ) { - $capability_check = self::MATCH_ALL; - } - - if ( ! empty( $capabilities ) ) { - - $has_capabilities = array_filter( $capabilities, [ $this, 'has_capability' ] ); - - switch ( $capability_check ) { - case self::MATCH_ALL: - return $has_capabilities === $capabilities; - case self::MATCH_ANY: - return ! empty( $has_capabilities ); - } - } - - return true; - } - - /** - * Array filter function to find matched capabilities. - * - * @param string $capability Capability to test. - * - * @return bool - */ - private function has_capability( $capability ) { - $user_id = $this->options['user_id']; - if ( ! is_numeric( $user_id ) ) { - return false; - } - $user = get_user_by( 'id', $user_id ); - if ( ! $user ) { - return false; - } - - return $user->has_cap( $capability ); - } - - /** - * Return the object properties as an array. - * - * @return array - */ - public function to_array() { - return [ - 'message' => $this->message, - 'options' => $this->options, - ]; - } - - /** - * Adds string (view) behaviour to the notification. - * - * @return string - */ - public function __toString() { - return $this->render(); - } - - /** - * Renders the notification as a string. - * - * @return string The rendered notification. - */ - public function render() { - $attributes = []; - - // Default notification classes. - $classes = [ - 'yoast-notification', - ]; - - // Maintain WordPress visualisation of notifications when they are not persistent. - if ( ! $this->is_persistent() ) { - $classes[] = 'notice'; - $classes[] = $this->get_type(); - } - - if ( ! empty( $classes ) ) { - $attributes['class'] = implode( ' ', $classes ); - } - - // Combined attribute key and value into a string. - array_walk( $attributes, [ $this, 'parse_attributes' ] ); - - $message = null; - if ( $this->options['yoast_branding'] ) { - $message = $this->wrap_yoast_seo_icon( $this->message ); - } - - if ( $message === null ) { - $message = wpautop( $this->message ); - } - - // Build the output DIV. - return '
              ' . $message . '
              ' . PHP_EOL; - } - - /** - * Wraps the message with a Yoast SEO icon. - * - * @param string $message The message to wrap. - * - * @return string The wrapped message. - */ - private function wrap_yoast_seo_icon( $message ) { - $out = sprintf( - '', - esc_url( plugin_dir_url( WPSEO_FILE ) . 'packages/js/images/Yoast_SEO_Icon.svg' ), - 60, - 60 - ); - $out .= '
              '; - $out .= $message; - $out .= '
              '; - - return $out; - } - - /** - * Get the JSON if provided. - * - * @return false|string - */ - public function get_json() { - if ( empty( $this->options['data_json'] ) ) { - return ''; - } - - return WPSEO_Utils::format_json_encode( $this->options['data_json'] ); - } - - /** - * Make sure we only have values that we can work with. - * - * @param array $options Options to normalize. - * - * @return array - */ - private function normalize_options( $options ) { - $options = wp_parse_args( $options, $this->defaults ); - - // Should not exceed 0 or 1. - $options['priority'] = min( 1, max( 0, $options['priority'] ) ); - - // Set default capabilities when not supplied. - if ( empty( $options['capabilities'] ) || $options['capabilities'] === [] ) { - $options['capabilities'] = [ 'wpseo_manage_options' ]; - } - - // Set to the id of the current user if not supplied. - if ( $options['user_id'] === null ) { - $options['user_id'] = get_current_user_id(); - } - - return $options; - } - - /** - * Format HTML element attributes. - * - * @param string $value Attribute value. - * @param string $key Attribute name. - * - * @return void - */ - private function parse_attributes( &$value, $key ) { - $value = sprintf( '%s="%s"', sanitize_key( $key ), esc_attr( $value ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notifications.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notifications.php deleted file mode 100644 index c3847e01..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notifications.php +++ /dev/null @@ -1,319 +0,0 @@ -add_hooks(); - } - - /** - * Add hooks - * - * @return void - */ - private function add_hooks() { - // 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'] ) ); - if ( $page === self::ADMIN_PAGE ) { - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - } - } - - // Needed for adminbar and Notifications page. - add_action( 'admin_init', [ self::class, 'collect_notifications' ], 99 ); - - // Add AJAX hooks. - add_action( 'wp_ajax_yoast_dismiss_notification', [ $this, 'ajax_dismiss_notification' ] ); - add_action( 'wp_ajax_yoast_restore_notification', [ $this, 'ajax_restore_notification' ] ); - } - - /** - * Enqueue assets. - * - * @return void - */ - public function enqueue_assets() { - $asset_manager = new WPSEO_Admin_Asset_Manager(); - - $asset_manager->enqueue_style( 'notifications' ); - } - - /** - * Handle ajax request to dismiss a notification. - * - * @return void - */ - public function ajax_dismiss_notification() { - - $notification = $this->get_notification_from_ajax_request(); - if ( $notification ) { - $notification_center = Yoast_Notification_Center::get(); - $notification_center->maybe_dismiss_notification( $notification ); - - $this->output_ajax_response( $notification->get_type() ); - } - - wp_die(); - } - - /** - * Handle ajax request to restore a notification. - * - * @return void - */ - public function ajax_restore_notification() { - - $notification = $this->get_notification_from_ajax_request(); - if ( $notification ) { - $notification_center = Yoast_Notification_Center::get(); - $notification_center->restore_notification( $notification ); - - $this->output_ajax_response( $notification->get_type() ); - } - - wp_die(); - } - - /** - * Create AJAX response data. - * - * @param string $type Notification type. - * - * @return void - */ - private function output_ajax_response( $type ) { - - $html = $this->get_view_html( $type ); - // phpcs:disable WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe. - echo WPSEO_Utils::format_json_encode( - [ - 'html' => $html, - 'total' => self::get_active_notification_count(), - ] - ); - // phpcs:enable -- Reason: WPSEO_Utils::format_json_encode is safe. - } - - /** - * Get the HTML to return in the AJAX request. - * - * @param string $type Notification type. - * - * @return bool|string - */ - private function get_view_html( $type ) { - - switch ( $type ) { - case 'error': - $view = 'errors'; - break; - - case 'warning': - default: - $view = 'warnings'; - break; - } - - // Re-collect notifications. - self::collect_notifications(); - - /** - * Stops PHPStorm from nagging about this variable being unused. The variable is used in the view. - * - * @noinspection PhpUnusedLocalVariableInspection - */ - $notifications_data = self::get_template_variables(); - - ob_start(); - include WPSEO_PATH . 'admin/views/partial-notifications-' . $view . '.php'; - $html = ob_get_clean(); - - return $html; - } - - /** - * Extract the Yoast Notification from the AJAX request. - * - * This function does not handle nonce verification. - * - * @return Yoast_Notification|null A Yoast_Notification on success, null on failure. - */ - private function get_notification_from_ajax_request() { - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: This function does not handle nonce verification. - if ( ! isset( $_POST['notification'] ) || ! is_string( $_POST['notification'] ) ) { - return null; - } - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: This function does not handle nonce verification. - $notification_id = sanitize_text_field( wp_unslash( $_POST['notification'] ) ); - - if ( empty( $notification_id ) ) { - return null; - } - $notification_center = Yoast_Notification_Center::get(); - return $notification_center->get_notification_by_id( $notification_id ); - } - - /** - * Collect the notifications and group them together. - * - * @return void - */ - public static function collect_notifications() { - - $notification_center = Yoast_Notification_Center::get(); - - $notifications = $notification_center->get_sorted_notifications(); - self::$notification_count = count( $notifications ); - - self::$errors = array_filter( $notifications, [ self::class, 'filter_error_notifications' ] ); - self::$dismissed_errors = array_filter( self::$errors, [ self::class, 'filter_dismissed_notifications' ] ); - self::$active_errors = array_diff( self::$errors, self::$dismissed_errors ); - - self::$warnings = array_filter( $notifications, [ self::class, 'filter_warning_notifications' ] ); - self::$dismissed_warnings = array_filter( self::$warnings, [ self::class, 'filter_dismissed_notifications' ] ); - self::$active_warnings = array_diff( self::$warnings, self::$dismissed_warnings ); - } - - /** - * Get the variables needed in the views. - * - * @return array - */ - public static function get_template_variables() { - - return [ - 'metrics' => [ - 'total' => self::$notification_count, - 'active' => self::get_active_notification_count(), - 'errors' => count( self::$errors ), - 'warnings' => count( self::$warnings ), - ], - 'errors' => [ - 'dismissed' => self::$dismissed_errors, - 'active' => self::$active_errors, - ], - 'warnings' => [ - 'dismissed' => self::$dismissed_warnings, - 'active' => self::$active_warnings, - ], - ]; - } - - /** - * Get the number of active notifications. - * - * @return int - */ - public static function get_active_notification_count() { - - return ( count( self::$active_errors ) + count( self::$active_warnings ) ); - } - - /** - * Filter out any non-errors. - * - * @param Yoast_Notification $notification Notification to test. - * - * @return bool - */ - private static function filter_error_notifications( Yoast_Notification $notification ) { - - return $notification->get_type() === 'error'; - } - - /** - * Filter out any non-warnings. - * - * @param Yoast_Notification $notification Notification to test. - * - * @return bool - */ - private static function filter_warning_notifications( Yoast_Notification $notification ) { - - return $notification->get_type() !== 'error'; - } - - /** - * Filter out any dismissed notifications. - * - * @param Yoast_Notification $notification Notification to test. - * - * @return bool - */ - private static function filter_dismissed_notifications( Yoast_Notification $notification ) { - - return Yoast_Notification_Center::is_notification_dismissed( $notification ); - } -} - -class_alias( Yoast_Notifications::class, 'Yoast_Alerts' ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-plugin-conflict.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-plugin-conflict.php deleted file mode 100644 index 302cd495..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-plugin-conflict.php +++ /dev/null @@ -1,342 +0,0 @@ -plugins the active plugins will be stored in this - * property. - * - * @var array - */ - protected $active_conflicting_plugins = []; - - /** - * Property for holding instance of itself. - * - * @var Yoast_Plugin_Conflict - */ - protected static $instance; - - /** - * For the use of singleton pattern. Create instance of itself and return this instance. - * - * @param string $class_name Give the classname to initialize. If classname is - * false (empty) it will use it's own __CLASS__. - * - * @return Yoast_Plugin_Conflict - */ - public static function get_instance( $class_name = '' ) { - - if ( is_null( self::$instance ) ) { - if ( ! is_string( $class_name ) || $class_name === '' ) { - $class_name = self::class; - } - - self::$instance = new $class_name(); - } - - return self::$instance; - } - - /** - * Setting instance, all active plugins and search for active plugins. - * - * Protected constructor to prevent creating a new instance of the - * *Singleton* via the `new` operator from outside this class. - */ - protected function __construct() { - // Set active plugins. - $this->all_active_plugins = get_option( 'active_plugins' ); - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['action'] ) && is_string( $_GET['action'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information and only comparing the variable in a condition. - $action = wp_unslash( $_GET['action'] ); - if ( $action === 'deactivate' ) { - $this->remove_deactivated_plugin(); - } - } - - // Search for active plugins. - $this->search_active_plugins(); - } - - /** - * Check if there are conflicting plugins for given $plugin_section. - * - * @param string $plugin_section Type of plugin conflict (such as Open Graph or sitemap). - * - * @return bool - */ - public function check_for_conflicts( $plugin_section ) { - - static $sections_checked; - - // Return early if there are no active conflicting plugins at all. - if ( empty( $this->active_conflicting_plugins ) ) { - return false; - } - - if ( $sections_checked === null ) { - $sections_checked = []; - } - - if ( ! in_array( $plugin_section, $sections_checked, true ) ) { - $sections_checked[] = $plugin_section; - return ( ! empty( $this->active_conflicting_plugins[ $plugin_section ] ) ); - } - - return false; - } - - /** - * Checks for given $plugin_sections for conflicts. - * - * @param array $plugin_sections Set of sections. - * - * @return void - */ - public function check_plugin_conflicts( $plugin_sections ) { - foreach ( $plugin_sections as $plugin_section => $readable_plugin_section ) { - // Check for conflicting plugins and show error if there are conflicts. - if ( $this->check_for_conflicts( $plugin_section ) ) { - $this->set_error( $plugin_section, $readable_plugin_section ); - } - } - - // List of all active sections. - $sections = array_keys( $plugin_sections ); - // List of all sections. - $all_plugin_sections = array_keys( $this->plugins ); - - /* - * Get all sections that are inactive. - * These plugins need to be cleared. - * - * This happens when Sitemaps or OpenGraph implementations toggle active/disabled. - */ - $inactive_sections = array_diff( $all_plugin_sections, $sections ); - if ( ! empty( $inactive_sections ) ) { - foreach ( $inactive_sections as $section ) { - array_walk( $this->plugins[ $section ], [ $this, 'clear_error' ] ); - } - } - - // For active sections clear errors for inactive plugins. - foreach ( $sections as $section ) { - // By default, clear errors for all plugins of the section. - $inactive_plugins = $this->plugins[ $section ]; - - // If there are active plugins, filter them from being cleared. - if ( isset( $this->active_conflicting_plugins[ $section ] ) ) { - $inactive_plugins = array_diff( $this->plugins[ $section ], $this->active_conflicting_plugins[ $section ] ); - } - - array_walk( $inactive_plugins, [ $this, 'clear_error' ] ); - } - } - - /** - * Setting an error on the screen. - * - * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap). - * @param string $readable_plugin_section This is the value for the translation. - * - * @return void - */ - protected function set_error( $plugin_section, $readable_plugin_section ) { - - $notification_center = Yoast_Notification_Center::get(); - - foreach ( $this->active_conflicting_plugins[ $plugin_section ] as $plugin_file ) { - - $plugin_name = $this->get_plugin_name( $plugin_file ); - - $error_message = ''; - /* translators: %1$s: 'Facebook & Open Graph' plugin name(s) of possibly conflicting plugin(s), %2$s to Yoast SEO */ - $error_message .= '

              ' . sprintf( __( 'The %1$s plugin might cause issues when used in conjunction with %2$s.', 'wordpress-seo' ), '' . $plugin_name . '', 'Yoast SEO' ) . '

              '; - $error_message .= '

              ' . sprintf( $readable_plugin_section, 'Yoast SEO', $plugin_name ) . '

              '; - - /* translators: %s: 'Facebook' plugin name of possibly conflicting plugin */ - $error_message .= '' . sprintf( __( 'Deactivate %s', 'wordpress-seo' ), $this->get_plugin_name( $plugin_file ) ) . ' '; - - $identifier = $this->get_notification_identifier( $plugin_file ); - - // Add the message to the notifications center. - $notification_center->add_notification( - new Yoast_Notification( - $error_message, - [ - 'type' => Yoast_Notification::ERROR, - 'id' => 'wpseo-conflict-' . $identifier, - ] - ) - ); - } - } - - /** - * Clear the notification for a plugin. - * - * @param string $plugin_file Clear the optional notification for this plugin. - * - * @return void - */ - public function clear_error( $plugin_file ) { - $identifier = $this->get_notification_identifier( $plugin_file ); - - $notification_center = Yoast_Notification_Center::get(); - $notification_center->remove_notification_by_id( 'wpseo-conflict-' . $identifier ); - } - - /** - * Loop through the $this->plugins to check if one of the plugins is active. - * - * This method will store the active plugins in $this->active_plugins. - * - * @return void - */ - protected function search_active_plugins() { - foreach ( $this->plugins as $plugin_section => $plugins ) { - $this->check_plugins_active( $plugins, $plugin_section ); - } - } - - /** - * Loop through plugins and check if each plugin is active. - * - * @param array $plugins Set of plugins. - * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap). - * - * @return void - */ - protected function check_plugins_active( $plugins, $plugin_section ) { - foreach ( $plugins as $plugin ) { - if ( $this->check_plugin_is_active( $plugin ) ) { - $this->add_active_plugin( $plugin_section, $plugin ); - } - } - } - - /** - * Check if given plugin exists in array with all_active_plugins. - * - * @param string $plugin Plugin basename string. - * - * @return bool - */ - protected function check_plugin_is_active( $plugin ) { - return in_array( $plugin, $this->all_active_plugins, true ); - } - - /** - * Add plugin to the list of active plugins. - * - * This method will check first if key $plugin_section exists, if not it will create an empty array - * If $plugin itself doesn't exist it will be added. - * - * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap). - * @param string $plugin Plugin basename string. - * - * @return void - */ - protected function add_active_plugin( $plugin_section, $plugin ) { - if ( ! array_key_exists( $plugin_section, $this->active_conflicting_plugins ) ) { - $this->active_conflicting_plugins[ $plugin_section ] = []; - } - - if ( ! in_array( $plugin, $this->active_conflicting_plugins[ $plugin_section ], true ) ) { - $this->active_conflicting_plugins[ $plugin_section ][] = $plugin; - } - } - - /** - * Search in $this->plugins for the given $plugin. - * - * If there is a result it will return the plugin category. - * - * @param string $plugin Plugin basename string. - * - * @return int|string - */ - protected function find_plugin_category( $plugin ) { - foreach ( $this->plugins as $plugin_section => $plugins ) { - if ( in_array( $plugin, $plugins, true ) ) { - return $plugin_section; - } - } - } - - /** - * Get plugin name from file. - * - * @param string $plugin Plugin path relative to plugins directory. - * - * @return string|bool Plugin name or false when no name is set. - */ - protected function get_plugin_name( $plugin ) { - $plugin_details = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); - - if ( $plugin_details['Name'] !== '' ) { - return $plugin_details['Name']; - } - - return false; - } - - /** - * When being in the deactivation process the currently deactivated plugin has to be removed. - * - * @return void - */ - private function remove_deactivated_plugin() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: On the deactivation screen the nonce is already checked by WordPress itself. - if ( ! isset( $_GET['plugin'] ) || ! is_string( $_GET['plugin'] ) ) { - return; - } - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: On the deactivation screen the nonce is already checked by WordPress itself. - $deactivated_plugin = sanitize_text_field( wp_unslash( $_GET['plugin'] ) ); - $key_to_remove = array_search( $deactivated_plugin, $this->all_active_plugins, true ); - - if ( $key_to_remove !== false ) { - unset( $this->all_active_plugins[ $key_to_remove ] ); - } - } - - /** - * Get the identifier from the plugin file. - * - * @param string $plugin_file Plugin file to get Identifier from. - * - * @return string - */ - private function get_notification_identifier( $plugin_file ) { - return md5( $plugin_file ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-file-size.php b/wp/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-file-size.php deleted file mode 100644 index 9f2bec07..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-file-size.php +++ /dev/null @@ -1,85 +0,0 @@ -service = $service; - } - - /** - * Registers the routes for the endpoints. - * - * @return void - */ - public function register() { - $route_args = [ - 'methods' => 'GET', - 'args' => [ - 'url' => [ - 'required' => true, - 'type' => 'string', - 'description' => 'The url to retrieve', - ], - ], - 'callback' => [ - $this->service, - 'get', - ], - 'permission_callback' => [ - $this, - 'can_retrieve_data', - ], - ]; - register_rest_route( self::REST_NAMESPACE, self::ENDPOINT_SINGULAR, $route_args ); - } - - /** - * Determines whether or not data can be retrieved for the registered endpoints. - * - * @return bool Whether or not data can be retrieved. - */ - public function can_retrieve_data() { - return current_user_can( self::CAPABILITY_RETRIEVE ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-statistics.php b/wp/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-statistics.php deleted file mode 100644 index 392d1c13..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-statistics.php +++ /dev/null @@ -1,73 +0,0 @@ -service = $service; - } - - /** - * Registers the REST routes that are available on the endpoint. - * - * @return void - */ - public function register() { - // Register fetch config. - $route_args = [ - 'methods' => 'GET', - 'callback' => [ $this->service, 'get_statistics' ], - 'permission_callback' => [ $this, 'can_retrieve_data' ], - ]; - register_rest_route( self::REST_NAMESPACE, self::ENDPOINT_RETRIEVE, $route_args ); - } - - /** - * Determines whether or not data can be retrieved for the registered endpoints. - * - * @return bool Whether or not data can be retrieved. - */ - public function can_retrieve_data() { - return current_user_can( self::CAPABILITY_RETRIEVE ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint.php b/wp/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint.php deleted file mode 100644 index abbc9d0e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint.php +++ /dev/null @@ -1,26 +0,0 @@ -is_filter_active() ) { - add_action( 'restrict_manage_posts', [ $this, 'render_hidden_input' ] ); - } - - if ( $this->is_filter_active() && $this->get_explanation() !== null ) { - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_explanation_assets' ] ); - } - } - - /** - * Adds the filter links to the view_edit screens to give the user a filter link. - * - * @return void - */ - public function add_filter_links() { - foreach ( $this->get_post_types() as $post_type ) { - add_filter( 'views_edit-' . $post_type, [ $this, 'add_filter_link' ] ); - } - } - - /** - * Enqueues the necessary assets to display a filter explanation. - * - * @return void - */ - public function enqueue_explanation_assets() { - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_script( 'filter-explanation' ); - $asset_manager->enqueue_style( 'filter-explanation' ); - $asset_manager->localize_script( - 'filter-explanation', - 'yoastFilterExplanation', - [ 'text' => $this->get_explanation() ] - ); - } - - /** - * Adds a filter link to the views. - * - * @param array $views Array with the views. - * - * @return array Array of views including the added view. - */ - public function add_filter_link( $views ) { - $views[ 'yoast_' . $this->get_query_val() ] = sprintf( - '%3$s (%4$s)', - esc_url( $this->get_filter_url() ), - ( $this->is_filter_active() ) ? ' class="current" aria-current="page"' : '', - $this->get_label(), - $this->get_post_total() - ); - - return $views; - } - - /** - * Returns a text explaining this filter. Null if no explanation is necessary. - * - * @return string|null The explanation or null. - */ - protected function get_explanation() { - return null; - } - - /** - * Renders a hidden input to preserve this filter's state when using sub-filters. - * - * @return void - */ - public function render_hidden_input() { - echo ''; - } - - /** - * Returns an url to edit.php with post_type and this filter as the query arguments. - * - * @return string The url to activate this filter. - */ - protected function get_filter_url() { - $query_args = [ - self::FILTER_QUERY_ARG => $this->get_query_val(), - 'post_type' => $this->get_current_post_type(), - ]; - - return add_query_arg( $query_args, 'edit.php' ); - } - - /** - * Returns true when the filter is active. - * - * @return bool Whether the filter is active. - */ - protected function is_filter_active() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET[ self::FILTER_QUERY_ARG ] ) && is_string( $_GET[ self::FILTER_QUERY_ARG ] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - return sanitize_text_field( wp_unslash( $_GET[ self::FILTER_QUERY_ARG ] ) ) === $this->get_query_val(); - } - return false; - } - - /** - * Returns the current post type. - * - * @return string The current post type. - */ - protected function get_current_post_type() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['post_type'] ) && is_string( $_GET['post_type'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - $post_type = sanitize_text_field( wp_unslash( $_GET['post_type'] ) ); - if ( ! empty( $post_type ) ) { - return $post_type; - } - } - return 'post'; - } - - /** - * Returns the post types to which this filter should be added. - * - * @return array The post types to which this filter should be added. - */ - protected function get_post_types() { - return WPSEO_Post_Type::get_accessible_post_types(); - } - - /** - * Checks if the post type is supported. - * - * @param string $post_type Post type to check against. - * - * @return bool True when it is supported. - */ - protected function is_supported_post_type( $post_type ) { - return in_array( $post_type, $this->get_post_types(), true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/filters/class-cornerstone-filter.php b/wp/wp-content/plugins/wordpress-seo/admin/filters/class-cornerstone-filter.php deleted file mode 100644 index 19831289..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/filters/class-cornerstone-filter.php +++ /dev/null @@ -1,150 +0,0 @@ -is_filter_active() ) { - global $wpdb; - - $where .= $wpdb->prepare( - " AND {$wpdb->posts}.ID IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = %s AND meta_value = '1' ) ", - WPSEO_Meta::$meta_prefix . self::META_NAME - ); - } - - return $where; - } - - /** - * Filters the post types that have the metabox disabled. - * - * @param array $post_types The post types to filter. - * - * @return array The filtered post types. - */ - public function filter_metabox_disabled( $post_types ) { - $filtered_post_types = []; - foreach ( $post_types as $post_type_key => $post_type ) { - if ( ! WPSEO_Post_Type::has_metabox_enabled( $post_type_key ) ) { - continue; - } - - $filtered_post_types[ $post_type_key ] = $post_type; - } - - return $filtered_post_types; - } - - /** - * Returns the label for this filter. - * - * @return string The label for this filter. - */ - protected function get_label() { - return __( 'Cornerstone content', 'wordpress-seo' ); - } - - /** - * Returns a text explaining this filter. - * - * @return string|null The explanation. - */ - protected function get_explanation() { - $post_type_object = get_post_type_object( $this->get_current_post_type() ); - - if ( $post_type_object === null ) { - return null; - } - - return sprintf( - /* translators: %1$s expands to the posttype label, %2$s expands anchor to blog post about cornerstone content, %3$s expands to */ - __( 'Mark the most important %1$s as \'cornerstone content\' to improve your site structure. %2$sLearn more about cornerstone content%3$s.', 'wordpress-seo' ), - strtolower( $post_type_object->labels->name ), - '', - '' - ); - } - - /** - * Returns the total amount of articles marked as cornerstone content. - * - * @return int - */ - protected function get_post_total() { - global $wpdb; - - return (int) $wpdb->get_var( - $wpdb->prepare( - "SELECT COUNT( 1 ) - FROM {$wpdb->postmeta} - WHERE post_id IN( SELECT ID FROM {$wpdb->posts} WHERE post_type = %s ) AND - meta_key = %s AND meta_value = '1' - ", - $this->get_current_post_type(), - WPSEO_Meta::$meta_prefix . self::META_NAME - ) - ); - } - - /** - * Returns the post types to which this filter should be added. - * - * @return array The post types to which this filter should be added. - */ - protected function get_post_types() { - /** - * Filter: 'wpseo_cornerstone_post_types' - Filters post types to exclude the cornerstone feature for. - * - * @param array $post_types The accessible post types to filter. - */ - $post_types = apply_filters( 'wpseo_cornerstone_post_types', parent::get_post_types() ); - if ( ! is_array( $post_types ) ) { - return []; - } - - return $post_types; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-metabox-formatter.php b/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-metabox-formatter.php deleted file mode 100644 index 3a248fd8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-metabox-formatter.php +++ /dev/null @@ -1,245 +0,0 @@ -formatter = $formatter; - } - - /** - * Returns the values. - * - * @return array|bool|int> - */ - public function get_values() { - $defaults = $this->get_defaults(); - $values = $this->formatter->get_values(); - - return ( $values + $defaults ); - } - - /** - * Returns array with all the values always needed by a scraper object. - * - * @return array|bool|int> Default settings for the metabox. - */ - private function get_defaults() { - $schema_types = new Schema_Types(); - $host = YoastSEO()->helpers->url->get_url_host( get_site_url() ); - - $defaults = [ - 'author_name' => get_the_author_meta( 'display_name' ), - 'site_name' => YoastSEO()->meta->for_current_page()->site_name, - 'sitewide_social_image' => WPSEO_Options::get( 'og_default_image' ), - 'search_url' => '', - 'post_edit_url' => '', - 'base_url' => '', - 'contentTab' => __( 'Readability', 'wordpress-seo' ), - 'keywordTab' => __( 'Keyphrase:', 'wordpress-seo' ), - 'removeKeyword' => __( 'Remove keyphrase', 'wordpress-seo' ), - 'contentLocale' => get_locale(), - 'userLocale' => get_user_locale(), - 'translations' => $this->get_translations(), - 'keyword_usage' => [], - 'title_template' => '', - 'metadesc_template' => '', - 'intl' => $this->get_content_analysis_component_translations(), - 'isRtl' => is_rtl(), - 'isPremium' => YoastSEO()->helpers->product->is_premium(), - 'siteIconUrl' => get_site_icon_url(), - 'showSocial' => [ - 'facebook' => WPSEO_Options::get( 'opengraph', false ), - 'twitter' => WPSEO_Options::get( 'twitter', false ), - ], - 'schema' => [ - 'displayFooter' => WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ), - 'pageTypeOptions' => $schema_types->get_page_type_options(), - 'articleTypeOptions' => $schema_types->get_article_type_options(), - ], - 'twitterCardType' => 'summary_large_image', - 'publish_box' => [ - 'labels' => [ - 'keyword' => [ - 'na' => sprintf( - /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the SEO score. */ - __( '%1$sSEO%2$s: %3$s', 'wordpress-seo' ), - '', - '', - '' . __( 'Not available', 'wordpress-seo' ) . '' - ), - 'bad' => sprintf( - /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the SEO score. */ - __( '%1$sSEO%2$s: %3$s', 'wordpress-seo' ), - '', - '', - '' . __( 'Needs improvement', 'wordpress-seo' ) . '' - ), - 'ok' => sprintf( - /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the SEO score. */ - __( '%1$sSEO%2$s: %3$s', 'wordpress-seo' ), - '', - '', - '' . __( 'OK', 'wordpress-seo' ) . '' - ), - 'good' => sprintf( - /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the SEO score. */ - __( '%1$sSEO%2$s: %3$s', 'wordpress-seo' ), - '', - '', - '' . __( 'Good', 'wordpress-seo' ) . '' - ), - ], - 'content' => [ - 'na' => sprintf( - /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the readability score. */ - __( '%1$sReadability%2$s: %3$s', 'wordpress-seo' ), - '', - '', - '' . __( 'Not available', 'wordpress-seo' ) . '' - ), - 'bad' => sprintf( - /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the readability score. */ - __( '%1$sReadability%2$s: %3$s', 'wordpress-seo' ), - '', - '', - '' . __( 'Needs improvement', 'wordpress-seo' ) . '' - ), - 'ok' => sprintf( - /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the readability score. */ - __( '%1$sReadability%2$s: %3$s', 'wordpress-seo' ), - '', - '', - '' . __( 'OK', 'wordpress-seo' ) . '' - ), - 'good' => sprintf( - /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the readability score. */ - __( '%1$sReadability%2$s: %3$s', 'wordpress-seo' ), - '', - '', - '' . __( 'Good', 'wordpress-seo' ) . '' - ), - ], - 'inclusive-language' => [ - 'na' => sprintf( - /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the inclusive language score. */ - __( '%1$sInclusive language%2$s: %3$s', 'wordpress-seo' ), - '', - '', - '' . __( 'Not available', 'wordpress-seo' ) . '' - ), - 'bad' => sprintf( - /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the inclusive language score. */ - __( '%1$sInclusive language%2$s: %3$s', 'wordpress-seo' ), - '', - '', - '' . __( 'Needs improvement', 'wordpress-seo' ) . '' - ), - 'ok' => sprintf( - /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the inclusive language score. */ - __( '%1$sInclusive language%2$s: %3$s', 'wordpress-seo' ), - '', - '', - '' . __( 'Potentially non-inclusive', 'wordpress-seo' ) . '' - ), - 'good' => sprintf( - /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the inclusive language score. */ - __( '%1$sInclusive language%2$s: %3$s', 'wordpress-seo' ), - '', - '', - '' . __( 'Good', 'wordpress-seo' ) . '' - ), - ], - ], - ], - /** - * Filter to determine if the markers should be enabled or not. - * - * @param bool $showMarkers Should the markers being enabled. Default = true. - */ - 'show_markers' => apply_filters( 'wpseo_enable_assessment_markers', true ), - 'analysisHeadingTitle' => __( 'Analysis', 'wordpress-seo' ), - 'zapierIntegrationActive' => WPSEO_Options::get( 'zapier_integration_active', false ) ? 1 : 0, - 'zapierConnectedStatus' => ! empty( WPSEO_Options::get( 'zapier_subscription', [] ) ) ? 1 : 0, - 'wordproofIntegrationActive' => YoastSEO()->helpers->wordproof->is_active() ? 1 : 0, - 'getJetpackBoostPrePublishLink' => WPSEO_Shortlinker::get( 'https://yoa.st/jetpack-boost-get-prepublish?domain=' . $host ), - 'upgradeJetpackBoostPrePublishLink' => WPSEO_Shortlinker::get( 'https://yoa.st/jetpack-boost-upgrade-prepublish?domain=' . $host ), - 'woocommerceUpsellSchemaLink' => WPSEO_Shortlinker::get( 'https://yoa.st/product-schema-metabox' ), - 'woocommerceUpsellGooglePreviewLink' => WPSEO_Shortlinker::get( 'https://yoa.st/product-google-preview-metabox' ), - ]; - - $integration_information_repo = YoastSEO()->classes->get( Integration_Information_Repository::class ); - - $enabled_integrations = $integration_information_repo->get_integration_information(); - $defaults = array_merge( $defaults, $enabled_integrations ); - $enabled_features_repo = YoastSEO()->classes->get( Enabled_Analysis_Features_Repository::class ); - - $enabled_features = $enabled_features_repo->get_enabled_features()->parse_to_legacy_array(); - return array_merge( $defaults, $enabled_features ); - } - - /** - * Returns required yoast-component translations. - * - * @return string[] - */ - private function get_content_analysis_component_translations() { - // Esc_html is not needed because React already handles HTML in the (translations of) these strings. - return [ - 'locale' => get_user_locale(), - 'content-analysis.errors' => __( 'Errors', 'wordpress-seo' ), - 'content-analysis.problems' => __( 'Problems', 'wordpress-seo' ), - 'content-analysis.improvements' => __( 'Improvements', 'wordpress-seo' ), - 'content-analysis.considerations' => __( 'Considerations', 'wordpress-seo' ), - 'content-analysis.good' => __( 'Good results', 'wordpress-seo' ), - 'content-analysis.highlight' => __( 'Highlight this result in the text', 'wordpress-seo' ), - 'content-analysis.nohighlight' => __( 'Remove highlight from the text', 'wordpress-seo' ), - 'content-analysis.disabledButton' => __( 'Marks are disabled in current view', 'wordpress-seo' ), - /* translators: Hidden accessibility text. */ - 'a11yNotice.opensInNewTab' => __( '(Opens in a new browser tab)', 'wordpress-seo' ), - ]; - } - - /** - * Returns Jed compatible YoastSEO.js translations. - * - * @return string[] - */ - private function get_translations() { - $locale = get_user_locale(); - - $file = WPSEO_PATH . 'languages/wordpress-seo-' . $locale . '.json'; - if ( file_exists( $file ) ) { - // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- Retrieving a local file. - $file = file_get_contents( $file ); - if ( is_string( $file ) && $file !== '' ) { - return json_decode( $file, true ); - } - } - - return []; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-post-metabox-formatter.php b/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-post-metabox-formatter.php deleted file mode 100644 index aa4eb2f2..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-post-metabox-formatter.php +++ /dev/null @@ -1,317 +0,0 @@ -post = $post; - $this->permalink = $structure; - - $this->use_social_templates = $this->use_social_templates(); - } - - /** - * Determines whether the social templates should be used. - * - * @return bool Whether the social templates should be used. - */ - public function use_social_templates() { - return WPSEO_Options::get( 'opengraph', false ) === true; - } - - /** - * Returns the translated values. - * - * @return array - */ - public function get_values() { - - $values = [ - 'search_url' => $this->search_url(), - 'post_edit_url' => $this->edit_url(), - 'base_url' => $this->base_url_for_js(), - 'metaDescriptionDate' => '', - ]; - - if ( $this->post instanceof WP_Post ) { - $keyword_usage = $this->get_focus_keyword_usage(); - - $values_to_set = [ - 'keyword_usage' => $keyword_usage, - 'keyword_usage_post_types' => $this->get_post_types_for_all_ids( $keyword_usage ), - 'title_template' => $this->get_title_template(), - 'title_template_no_fallback' => $this->get_title_template( false ), - 'metadesc_template' => $this->get_metadesc_template(), - 'metaDescriptionDate' => $this->get_metadesc_date(), - 'first_content_image' => $this->get_image_url(), - 'social_title_template' => $this->get_social_title_template(), - 'social_description_template' => $this->get_social_description_template(), - 'social_image_template' => $this->get_social_image_template(), - 'isInsightsEnabled' => $this->is_insights_enabled(), - ]; - - $values = ( $values_to_set + $values ); - } - - /** - * Filter: 'wpseo_post_edit_values' - Allows changing the values Yoast SEO uses inside the post editor. - * - * @param array $values The key-value map Yoast SEO uses inside the post editor. - * @param WP_Post $post The post opened in the editor. - */ - return apply_filters( 'wpseo_post_edit_values', $values, $this->post ); - } - - /** - * Gets the image URL for the post's social preview. - * - * @return string|null The image URL for the social preview. - */ - protected function get_image_url() { - return WPSEO_Image_Utils::get_first_usable_content_image_for_post( $this->post->ID ); - } - - /** - * Returns the url to search for keyword for the post. - * - * @return string - */ - private function search_url() { - return admin_url( 'edit.php?seo_kw_filter={keyword}' ); - } - - /** - * Returns the url to edit the taxonomy. - * - * @return string - */ - private function edit_url() { - return admin_url( 'post.php?post={id}&action=edit' ); - } - - /** - * Returns a base URL for use in the JS, takes permalink structure into account. - * - * @return string - */ - private function base_url_for_js() { - global $pagenow; - - // The default base is the home_url. - $base_url = home_url( '/', null ); - - if ( $pagenow === 'post-new.php' ) { - return $base_url; - } - - // If %postname% is the last tag, just strip it and use that as a base. - if ( preg_match( '#%postname%/?$#', $this->permalink ) === 1 ) { - $base_url = preg_replace( '#%postname%/?$#', '', $this->permalink ); - } - - // If %pagename% is the last tag, just strip it and use that as a base. - if ( preg_match( '#%pagename%/?$#', $this->permalink ) === 1 ) { - $base_url = preg_replace( '#%pagename%/?$#', '', $this->permalink ); - } - - return $base_url; - } - - /** - * Counts the number of given keywords used for other posts other than the given post_id. - * - * @return array The keyword and the associated posts that use it. - */ - private function get_focus_keyword_usage() { - $keyword = WPSEO_Meta::get_value( 'focuskw', $this->post->ID ); - $usage = [ $keyword => $this->get_keyword_usage_for_current_post( $keyword ) ]; - - /** - * Allows enhancing the array of posts' that share their focus keywords with the post's related keywords. - * - * @param array $usage The array of posts' ids that share their focus keywords with the post. - * @param int $post_id The id of the post we're finding the usage of related keywords for. - */ - return apply_filters( 'wpseo_posts_for_related_keywords', $usage, $this->post->ID ); - } - - /** - * Retrieves the post types for the given post IDs. - * - * @param array $post_ids_per_keyword An associative array with keywords as keys and an array of post ids where those keywords are used. - * @return array The post types for the given post IDs. - */ - private function get_post_types_for_all_ids( $post_ids_per_keyword ) { - - $post_type_per_keyword_result = []; - foreach ( $post_ids_per_keyword as $keyword => $post_ids ) { - $post_type_per_keyword_result[ $keyword ] = WPSEO_Meta::post_types_for_ids( $post_ids ); - } - - return $post_type_per_keyword_result; - } - - /** - * Gets the keyword usage for the current post and the specified keyword. - * - * @param string $keyword The keyword to check the usage of. - * - * @return array The post IDs which use the passed keyword. - */ - protected function get_keyword_usage_for_current_post( $keyword ) { - return WPSEO_Meta::keyword_usage( $keyword, $this->post->ID ); - } - - /** - * Retrieves the title template. - * - * @param bool $fallback Whether to return the hardcoded fallback if the template value is empty. - * - * @return string The title template. - */ - private function get_title_template( $fallback = true ) { - $title = $this->get_template( 'title' ); - - if ( $title === '' && $fallback === true ) { - return '%%title%% %%page%% %%sep%% %%sitename%%'; - } - - return $title; - } - - /** - * Retrieves the metadesc template. - * - * @return string The metadesc template. - */ - private function get_metadesc_template() { - return $this->get_template( 'metadesc' ); - } - - /** - * Retrieves the social title template. - * - * @return string The social title template. - */ - private function get_social_title_template() { - if ( $this->use_social_templates ) { - return $this->get_social_template( 'title' ); - } - - return ''; - } - - /** - * Retrieves the social description template. - * - * @return string The social description template. - */ - private function get_social_description_template() { - if ( $this->use_social_templates ) { - return $this->get_social_template( 'description' ); - } - - return ''; - } - - /** - * Retrieves the social image template. - * - * @return string The social description template. - */ - private function get_social_image_template() { - if ( $this->use_social_templates ) { - return $this->get_social_template( 'image-url' ); - } - - return ''; - } - - /** - * Retrieves a template. - * - * @param string $template_option_name The name of the option in which the template you want to get is saved. - * - * @return string - */ - private function get_template( $template_option_name ) { - $needed_option = $template_option_name . '-' . $this->post->post_type; - - if ( WPSEO_Options::get( $needed_option, '' ) !== '' ) { - return WPSEO_Options::get( $needed_option ); - } - - return ''; - } - - /** - * Retrieves a social template. - * - * @param string $template_option_name The name of the option in which the template you want to get is saved. - * - * @return string - */ - private function get_social_template( $template_option_name ) { - /** - * Filters the social template value for a given post type. - * - * @param string $template The social template value, defaults to empty string. - * @param string $template_option_name The subname of the option in which the template you want to get is saved. - * @param string $post_type The name of the post type. - */ - return apply_filters( 'wpseo_social_template_post_type', '', $template_option_name, $this->post->post_type ); - } - - /** - * Determines the date to be displayed in the snippet preview. - * - * @return string - */ - private function get_metadesc_date() { - return YoastSEO()->helpers->date->format_translated( $this->post->post_date, 'M j, Y' ); - } - - /** - * Determines whether the insights feature is enabled for this post. - * - * @return bool - */ - protected function is_insights_enabled() { - return WPSEO_Options::get( 'enable_metabox_insights', false ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-term-metabox-formatter.php b/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-term-metabox-formatter.php deleted file mode 100644 index aa596cdc..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-term-metabox-formatter.php +++ /dev/null @@ -1,255 +0,0 @@ -taxonomy = $taxonomy; - $this->term = $term; - - $this->use_social_templates = $this->use_social_templates(); - } - - /** - * Determines whether the social templates should be used. - * - * @return bool Whether the social templates should be used. - */ - public function use_social_templates() { - return WPSEO_Options::get( 'opengraph', false ) === true; - } - - /** - * Returns the translated values. - * - * @return array - */ - public function get_values() { - $values = []; - - // Todo: a column needs to be added on the termpages to add a filter for the keyword, so this can be used in the focus keyphrase doubles. - if ( is_object( $this->term ) && property_exists( $this->term, 'taxonomy' ) ) { - $values = [ - 'search_url' => $this->search_url(), - 'post_edit_url' => $this->edit_url(), - 'base_url' => $this->base_url_for_js(), - 'taxonomy' => $this->term->taxonomy, - 'keyword_usage' => $this->get_focus_keyword_usage(), - 'title_template' => $this->get_title_template(), - 'title_template_no_fallback' => $this->get_title_template( false ), - 'metadesc_template' => $this->get_metadesc_template(), - 'first_content_image' => $this->get_image_url(), - 'semrushIntegrationActive' => 0, - 'social_title_template' => $this->get_social_title_template(), - 'social_description_template' => $this->get_social_description_template(), - 'social_image_template' => $this->get_social_image_template(), - 'wincherIntegrationActive' => 0, - 'isInsightsEnabled' => $this->is_insights_enabled(), - ]; - } - - return $values; - } - - /** - * Gets the image URL for the term's social preview. - * - * @return string|null The image URL for the social preview. - */ - protected function get_image_url() { - return WPSEO_Image_Utils::get_first_content_image_for_term( $this->term->term_id ); - } - - /** - * Returns the url to search for keyword for the taxonomy. - * - * @return string - */ - private function search_url() { - return admin_url( 'edit-tags.php?taxonomy=' . $this->term->taxonomy . '&seo_kw_filter={keyword}' ); - } - - /** - * Returns the url to edit the taxonomy. - * - * @return string - */ - private function edit_url() { - return admin_url( 'term.php?action=edit&taxonomy=' . $this->term->taxonomy . '&tag_ID={id}' ); - } - - /** - * Returns a base URL for use in the JS, takes permalink structure into account. - * - * @return string - */ - private function base_url_for_js() { - - $base_url = home_url( '/', null ); - if ( ! WPSEO_Options::get( 'stripcategorybase', false ) ) { - if ( $this->taxonomy->rewrite ) { - $base_url = trailingslashit( $base_url . $this->taxonomy->rewrite['slug'] ); - } - } - - return $base_url; - } - - /** - * Counting the number of given keyword used for other term than given term_id. - * - * @return array - */ - private function get_focus_keyword_usage() { - $focuskw = WPSEO_Taxonomy_Meta::get_term_meta( $this->term, $this->term->taxonomy, 'focuskw' ); - - return WPSEO_Taxonomy_Meta::get_keyword_usage( $focuskw, $this->term->term_id, $this->term->taxonomy ); - } - - /** - * Retrieves the title template. - * - * @param bool $fallback Whether to return the hardcoded fallback if the template value is empty. - * - * @return string The title template. - */ - private function get_title_template( $fallback = true ) { - $title = $this->get_template( 'title' ); - - if ( $title === '' && $fallback === true ) { - /* translators: %s expands to the variable used for term title. */ - $archives = sprintf( __( '%s Archives', 'wordpress-seo' ), '%%term_title%%' ); - return $archives . ' %%page%% %%sep%% %%sitename%%'; - } - - return $title; - } - - /** - * Retrieves the metadesc template. - * - * @return string The metadesc template. - */ - private function get_metadesc_template() { - return $this->get_template( 'metadesc' ); - } - - /** - * Retrieves the social title template. - * - * @return string The social title template. - */ - private function get_social_title_template() { - if ( $this->use_social_templates ) { - return $this->get_social_template( 'title' ); - } - - return ''; - } - - /** - * Retrieves the social description template. - * - * @return string The social description template. - */ - private function get_social_description_template() { - if ( $this->use_social_templates ) { - return $this->get_social_template( 'description' ); - } - - return ''; - } - - /** - * Retrieves the social image template. - * - * @return string The social description template. - */ - private function get_social_image_template() { - if ( $this->use_social_templates ) { - return $this->get_social_template( 'image-url' ); - } - - return ''; - } - - /** - * Retrieves a template. - * - * @param string $template_option_name The name of the option in which the template you want to get is saved. - * - * @return string - */ - private function get_template( $template_option_name ) { - $needed_option = $template_option_name . '-tax-' . $this->term->taxonomy; - return WPSEO_Options::get( $needed_option, '' ); - } - - /** - * Retrieves a social template. - * - * @param string $template_option_name The name of the option in which the template you want to get is saved. - * - * @return string - */ - private function get_social_template( $template_option_name ) { - /** - * Filters the social template value for a given taxonomy. - * - * @param string $template The social template value, defaults to empty string. - * @param string $template_option_name The subname of the option in which the template you want to get is saved. - * @param string $taxonomy The name of the taxonomy. - */ - return apply_filters( 'wpseo_social_template_taxonomy', '', $template_option_name, $this->term->taxonomy ); - } - - /** - * Determines whether the insights feature is enabled for this taxonomy. - * - * @return bool - */ - protected function is_insights_enabled() { - return WPSEO_Options::get( 'enable_metabox_insights', false ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/formatter/interface-metabox-formatter.php b/wp/wp-content/plugins/wordpress-seo/admin/formatter/interface-metabox-formatter.php deleted file mode 100644 index 8c220480..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/formatter/interface-metabox-formatter.php +++ /dev/null @@ -1,19 +0,0 @@ -admin_header( false, 'wpseo-gsc', false, 'yoast_wpseo_gsc_options' ); - -// GSC Error notification. -$gsc_url = 'https://search.google.com/search-console/index'; -$gsc_post_url = 'https://yoa.st/google-search-console-deprecated'; -$gsc_style_alert = ' - display: flex; - align-items: baseline; - position: relative; - padding: 16px; - border: 1px solid rgba(0, 0, 0, 0.2); - font-size: 14px; - font-weight: 400; - line-height: 1.5; - margin: 16px 0; - color: #450c11; - background: #f8d7da; -'; -$gsc_style_alert_icon = 'display: block; margin-right: 8px;'; -$gsc_style_alert_content = 'max-width: 600px;'; -$gsc_style_alert_link = 'color: #004973;'; -$gsc_notification = sprintf( - /* Translators: %1$s: expands to opening anchor tag, %2$s expands to closing anchor tag. */ - __( 'Google has discontinued its Crawl Errors API. Therefore, any possible crawl errors you might have cannot be displayed here anymore. %1$sRead our statement on this for further information%2$s.', 'wordpress-seo' ), - '', - WPSEO_Admin_Utils::get_new_tab_message() . '' -); -$gsc_notification .= '

              '; -$gsc_notification .= sprintf( - /* Translators: %1$s: expands to opening anchor tag, %2$s expands to closing anchor tag. */ - __( 'To view your current crawl errors, %1$splease visit Google Search Console%2$s.', 'wordpress-seo' ), - '', - WPSEO_Admin_Utils::get_new_tab_message() . '' -); -?> -
              - - - - -
              -'; -printf( - /* Translators: %s: expands to Yoast SEO Premium */ - esc_html__( 'Creating redirects is a %s feature', 'wordpress-seo' ), - 'Yoast SEO Premium' -); -echo ''; -echo '

              '; -printf( - /* Translators: %1$s: expands to 'Yoast SEO Premium', %2$s: links to Yoast SEO Premium plugin page. */ - esc_html__( 'To be able to create a redirect and fix this issue, you need %1$s. You can buy the plugin, including one year of support and updates, on %2$s.', 'wordpress-seo' ), - 'Yoast SEO Premium', - 'yoast.com' -); -echo '

              '; -echo ''; diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-detector.php b/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-detector.php deleted file mode 100644 index 48d31cc1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-detector.php +++ /dev/null @@ -1,36 +0,0 @@ -status->status ) { - $this->needs_import[ $importer_class ] = $importer->get_plugin_name(); - } - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-plugin.php b/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-plugin.php deleted file mode 100644 index d71fff83..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-plugin.php +++ /dev/null @@ -1,63 +0,0 @@ -importer = $importer; - - switch ( $action ) { - case 'cleanup': - $this->status = $this->importer->run_cleanup(); - break; - case 'import': - $this->status = $this->importer->run_import(); - break; - case 'detect': - default: - $this->status = $this->importer->run_detect(); - } - - $this->status->set_msg( $this->complete_msg( $this->status->get_msg() ) ); - } - - /** - * Convenience function to replace %s with plugin name in import message. - * - * @param string $msg Message string. - * - * @return string Returns message with plugin name instead of replacement variables. - */ - protected function complete_msg( $msg ) { - return sprintf( $msg, $this->importer->get_plugin_name() ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-settings.php b/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-settings.php deleted file mode 100644 index 3bec4c8f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-settings.php +++ /dev/null @@ -1,127 +0,0 @@ -status = new WPSEO_Import_Status( 'import', false ); - } - - /** - * Imports the data submitted by the user. - * - * @return void - */ - public function import() { - check_admin_referer( self::NONCE_ACTION ); - - if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ) { - return; - } - - if ( ! isset( $_POST['settings_import'] ) || ! is_string( $_POST['settings_import'] ) ) { - return; - } - - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: The raw content will be parsed afterwards. - $content = wp_unslash( $_POST['settings_import'] ); - - if ( empty( $content ) ) { - return; - } - - $this->parse_options( $content ); - } - - /** - * Parse the options. - * - * @param string $raw_options The content to parse. - * - * @return void - */ - protected function parse_options( $raw_options ) { - $options = parse_ini_string( $raw_options, true, INI_SCANNER_RAW ); - - if ( is_array( $options ) && $options !== [] ) { - $this->import_options( $options ); - - return; - } - - $this->status->set_msg( __( 'Settings could not be imported:', 'wordpress-seo' ) . ' ' . __( 'No settings found.', 'wordpress-seo' ) ); - } - - /** - * Parse the option group and import it. - * - * @param string $name Name string. - * @param array $option_group Option group data. - * @param array $options Options data. - * - * @return void - */ - protected function parse_option_group( $name, $option_group, $options ) { - // Make sure that the imported options are cleaned/converted on import. - $option_instance = WPSEO_Options::get_option_instance( $name ); - if ( is_object( $option_instance ) && method_exists( $option_instance, 'import' ) ) { - $option_instance->import( $option_group, $this->old_wpseo_version, $options ); - } - } - - /** - * Imports the options if found. - * - * @param array $options The options parsed from the provided settings. - * - * @return void - */ - protected function import_options( $options ) { - if ( isset( $options['wpseo']['version'] ) && $options['wpseo']['version'] !== '' ) { - $this->old_wpseo_version = $options['wpseo']['version']; - } - - foreach ( $options as $name => $option_group ) { - $this->parse_option_group( $name, $option_group, $options ); - } - - $this->status->set_msg( __( 'Settings successfully imported.', 'wordpress-seo' ) ); - $this->status->set_status( true ); - - // Reset the cached option values. - WPSEO_Options::clear_cache(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-status.php b/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-status.php deleted file mode 100644 index c105d4a7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-status.php +++ /dev/null @@ -1,131 +0,0 @@ -action = $action; - $this->status = $status; - $this->msg = $msg; - } - - /** - * Get the import message. - * - * @return string Message about current status. - */ - public function get_msg() { - if ( $this->msg !== '' ) { - return $this->msg; - } - - if ( $this->status === false ) { - /* translators: %s is replaced with the name of the plugin we're trying to find data from. */ - return __( '%s data not found.', 'wordpress-seo' ); - } - - return $this->get_default_success_message(); - } - - /** - * Get the import action. - * - * @return string Import action type. - */ - public function get_action() { - return $this->action; - } - - /** - * Set the import action, set status to false. - * - * @param string $action The type of action to set as import action. - * - * @return void - */ - public function set_action( $action ) { - $this->action = $action; - $this->status = false; - } - - /** - * Sets the importer status message. - * - * @param string $msg The message to set. - * - * @return void - */ - public function set_msg( $msg ) { - $this->msg = $msg; - } - - /** - * Sets the importer status. - * - * @param bool $status The status to set. - * - * @return WPSEO_Import_Status The current object. - */ - public function set_status( $status ) { - $this->status = (bool) $status; - - return $this; - } - - /** - * Returns a success message depending on the action. - * - * @return string Returns a success message for the current action. - */ - private function get_default_success_message() { - switch ( $this->action ) { - case 'import': - /* translators: %s is replaced with the name of the plugin we're importing data from. */ - return __( '%s data successfully imported.', 'wordpress-seo' ); - case 'cleanup': - /* translators: %s is replaced with the name of the plugin we're removing data from. */ - return __( '%s data successfully removed.', 'wordpress-seo' ); - case 'detect': - default: - /* translators: %s is replaced with the name of the plugin we've found data from. */ - return __( '%s data found.', 'wordpress-seo' ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-abstract-plugin-importer.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-abstract-plugin-importer.php deleted file mode 100644 index 6f5674f2..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-abstract-plugin-importer.php +++ /dev/null @@ -1,329 +0,0 @@ -plugin_name; - } - - /** - * Imports the settings and post meta data from another SEO plugin. - * - * @return WPSEO_Import_Status Import status object. - */ - public function run_import() { - $this->status = new WPSEO_Import_Status( 'import', false ); - - if ( ! $this->detect() ) { - return $this->status; - } - - $this->status->set_status( $this->import() ); - - // Flush the entire cache, as we no longer know what's valid and what's not. - wp_cache_flush(); - - return $this->status; - } - - /** - * Handles post meta data to import. - * - * @return bool Import success status. - */ - protected function import() { - return $this->meta_keys_clone( $this->clone_keys ); - } - - /** - * Removes the plugin data from the database. - * - * @return WPSEO_Import_Status Import status object. - */ - public function run_cleanup() { - $this->status = new WPSEO_Import_Status( 'cleanup', false ); - - if ( ! $this->detect() ) { - return $this->status; - } - - return $this->status->set_status( $this->cleanup() ); - } - - /** - * Removes the plugin data from the database. - * - * @return bool Cleanup status. - */ - protected function cleanup() { - global $wpdb; - if ( empty( $this->meta_key ) ) { - return true; - } - $wpdb->query( - $wpdb->prepare( - "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE %s", - $this->meta_key - ) - ); - $result = $wpdb->__get( 'result' ); - if ( ! $result ) { - $this->cleanup_error_msg(); - } - - return $result; - } - - /** - * Sets the status message for when a cleanup has gone bad. - * - * @return void - */ - protected function cleanup_error_msg() { - /* translators: %s is replaced with the plugin's name. */ - $this->status->set_msg( sprintf( __( 'Cleanup of %s data failed.', 'wordpress-seo' ), $this->plugin_name ) ); - } - - /** - * Detects whether an import for this plugin is needed. - * - * @return WPSEO_Import_Status Import status object. - */ - public function run_detect() { - $this->status = new WPSEO_Import_Status( 'detect', false ); - - if ( ! $this->detect() ) { - return $this->status; - } - - return $this->status->set_status( true ); - } - - /** - * Detects whether there is post meta data to import. - * - * @return bool Boolean indicating whether there is something to import. - */ - protected function detect() { - global $wpdb; - - $meta_keys = wp_list_pluck( $this->clone_keys, 'old_key' ); - $result = $wpdb->get_var( - $wpdb->prepare( - "SELECT COUNT(*) AS `count` - FROM {$wpdb->postmeta} - WHERE meta_key IN ( " . implode( ', ', array_fill( 0, count( $meta_keys ), '%s' ) ) . ' )', - $meta_keys - ) - ); - - if ( $result === '0' ) { - return false; - } - - return true; - } - - /** - * Helper function to clone meta keys and (optionally) change their values in bulk. - * - * @param string $old_key The existing meta key. - * @param string $new_key The new meta key. - * @param array $replace_values An array, keys old value, values new values. - * - * @return bool Clone status. - */ - protected function meta_key_clone( $old_key, $new_key, $replace_values = [] ) { - global $wpdb; - - // First we create a temp table with all the values for meta_key. - $result = $wpdb->query( - $wpdb->prepare( - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange -- This is intentional + temporary. - "CREATE TEMPORARY TABLE tmp_meta_table SELECT * FROM {$wpdb->postmeta} WHERE meta_key = %s", - $old_key - ) - ); - if ( $result === false ) { - $this->set_missing_db_rights_status(); - return false; - } - - // Delete all the values in our temp table for posts that already have data for $new_key. - $wpdb->query( - $wpdb->prepare( - "DELETE FROM tmp_meta_table WHERE post_id IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = %s )", - WPSEO_Meta::$meta_prefix . $new_key - ) - ); - - /* - * We set meta_id to NULL so on re-insert into the postmeta table, MYSQL can set - * new meta_id's and we don't get duplicates. - */ - $wpdb->query( 'UPDATE tmp_meta_table SET meta_id = NULL' ); - - // Now we rename the meta_key. - $wpdb->query( - $wpdb->prepare( - 'UPDATE tmp_meta_table SET meta_key = %s', - WPSEO_Meta::$meta_prefix . $new_key - ) - ); - - $this->meta_key_clone_replace( $replace_values ); - - // With everything done, we insert all our newly cloned lines into the postmeta table. - $wpdb->query( "INSERT INTO {$wpdb->postmeta} SELECT * FROM tmp_meta_table" ); - - // Now we drop our temporary table. - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange -- This is intentional + a temporary table. - $wpdb->query( 'DROP TEMPORARY TABLE IF EXISTS tmp_meta_table' ); - - return true; - } - - /** - * Clones multiple meta keys. - * - * @param array $clone_keys The keys to clone. - * - * @return bool Success status. - */ - protected function meta_keys_clone( $clone_keys ) { - foreach ( $clone_keys as $clone_key ) { - $result = $this->meta_key_clone( $clone_key['old_key'], $clone_key['new_key'], ( $clone_key['convert'] ?? [] ) ); - if ( ! $result ) { - return false; - } - } - return true; - } - - /** - * Sets the import status to false and returns a message about why it failed. - * - * @return void - */ - protected function set_missing_db_rights_status() { - $this->status->set_status( false ); - /* translators: %s is replaced with Yoast SEO. */ - $this->status->set_msg( sprintf( __( 'The %s importer functionality uses temporary database tables. It seems your WordPress install does not have the capability to do this, please consult your hosting provider.', 'wordpress-seo' ), 'Yoast SEO' ) ); - } - - /** - * Helper function to search for a key in an array and maybe save it as a meta field. - * - * @param string $plugin_key The key in the $data array to check. - * @param string $yoast_key The identifier we use in our meta settings. - * @param array $data The array of data for this post to sift through. - * @param int $post_id The post ID. - * - * @return void - */ - protected function import_meta_helper( $plugin_key, $yoast_key, $data, $post_id ) { - if ( ! empty( $data[ $plugin_key ] ) ) { - $this->maybe_save_post_meta( $yoast_key, $data[ $plugin_key ], $post_id ); - } - } - - /** - * Saves a post meta value if it doesn't already exist. - * - * @param string $new_key The key to save. - * @param mixed $value The value to set the key to. - * @param int $post_id The Post to save the meta for. - * - * @return void - */ - protected function maybe_save_post_meta( $new_key, $value, $post_id ) { - // Big. Fat. Sigh. Mostly used for _yst_is_cornerstone, but might be useful for other hidden meta's. - $key = WPSEO_Meta::$meta_prefix . $new_key; - $wpseo_meta = true; - if ( substr( $new_key, 0, 1 ) === '_' ) { - $key = $new_key; - $wpseo_meta = false; - } - - $existing_value = get_post_meta( $post_id, $key, true ); - if ( empty( $existing_value ) ) { - if ( $wpseo_meta ) { - WPSEO_Meta::set_value( $new_key, $value, $post_id ); - return; - } - update_post_meta( $post_id, $new_key, $value ); - } - } - - /** - * Replaces values in our temporary table according to our settings. - * - * @param array $replace_values Key value pair of values to replace with other values. - * - * @return void - */ - protected function meta_key_clone_replace( $replace_values ) { - global $wpdb; - - // Now we replace values if needed. - if ( is_array( $replace_values ) && $replace_values !== [] ) { - foreach ( $replace_values as $old_value => $new_value ) { - $wpdb->query( - $wpdb->prepare( - 'UPDATE tmp_meta_table SET meta_value = %s WHERE meta_value = %s', - $new_value, - $old_value - ) - ); - } - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo-v4.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo-v4.php deleted file mode 100644 index 122ce46d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo-v4.php +++ /dev/null @@ -1,241 +0,0 @@ - '_aioseo_title', - 'new_key' => 'title', - ], - [ - 'old_key' => '_aioseo_description', - 'new_key' => 'metadesc', - ], - [ - 'old_key' => '_aioseo_og_title', - 'new_key' => 'opengraph-title', - ], - [ - 'old_key' => '_aioseo_og_description', - 'new_key' => 'opengraph-description', - ], - [ - 'old_key' => '_aioseo_twitter_title', - 'new_key' => 'twitter-title', - ], - [ - 'old_key' => '_aioseo_twitter_description', - 'new_key' => 'twitter-description', - ], - ]; - - /** - * Mapping between the AiOSEO replace vars and the Yoast replace vars. - * - * @var array - * - * @see https://yoast.com/help/list-available-snippet-variables-yoast-seo/ - */ - protected $replace_vars = [ - // They key is the AiOSEO replace var, the value is the Yoast replace var (see class-wpseo-replace-vars). - '#author_first_name' => '%%author_first_name%%', - '#author_last_name' => '%%author_last_name%%', - '#author_name' => '%%name%%', - '#categories' => '%%category%%', - '#current_date' => '%%currentdate%%', - '#current_day' => '%%currentday%%', - '#current_month' => '%%currentmonth%%', - '#current_year' => '%%currentyear%%', - '#permalink' => '%%permalink%%', - '#post_content' => '%%post_content%%', - '#post_date' => '%%date%%', - '#post_day' => '%%post_day%%', - '#post_month' => '%%post_month%%', - '#post_title' => '%%title%%', - '#post_year' => '%%post_year%%', - '#post_excerpt_only' => '%%excerpt_only%%', - '#post_excerpt' => '%%excerpt%%', - '#separator_sa' => '%%sep%%', - '#site_title' => '%%sitename%%', - '#tagline' => '%%sitedesc%%', - '#taxonomy_title' => '%%category_title%%', - ]; - - /** - * Replaces the AiOSEO variables in our temporary table with Yoast variables (replace vars). - * - * @param array $replace_values Key value pair of values to replace with other values. This is only used in the base class but not here. - * That is because this class doesn't have any `convert` keys in `$clone_keys`. - * For that reason, we're overwriting the base class' `meta_key_clone_replace()` function without executing that base functionality. - * - * @return void - */ - protected function meta_key_clone_replace( $replace_values ) { - global $wpdb; - - // At this point we're already looping through all the $clone_keys (this happens in meta_keys_clone() in the abstract class). - // Now, we'll also loop through the replace_vars array, which holds the mappings between the AiOSEO variables and the Yoast variables. - // We'll replace all the AiOSEO variables in the temporary table with their Yoast equivalents. - foreach ( $this->replace_vars as $aioseo_variable => $yoast_variable ) { - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: We need this query and this is done at many other places as well, for example class-import-rankmath. - $wpdb->query( - $wpdb->prepare( - 'UPDATE tmp_meta_table SET meta_value = REPLACE( meta_value, %s, %s )', - $aioseo_variable, - $yoast_variable - ) - ); - } - - // The AiOSEO custom fields take the form of `#custom_field-myfield`. - // These should be mapped to %%cf_myfield%%. - $meta_values_with_custom_fields = $this->get_meta_values_with_custom_field_or_taxonomy( $wpdb, 'custom_field' ); - $unique_custom_fields = $this->get_unique_custom_fields_or_taxonomies( $meta_values_with_custom_fields, 'custom_field' ); - $this->replace_custom_field_or_taxonomy_replace_vars( $unique_custom_fields, $wpdb, 'custom_field', 'cf' ); - - // Map `#tax_name-{tax-slug}` to `%%ct_{tax-slug}%%``. - $meta_values_with_custom_taxonomies = $this->get_meta_values_with_custom_field_or_taxonomy( $wpdb, 'tax_name' ); - $unique_custom_taxonomies = $this->get_unique_custom_fields_or_taxonomies( $meta_values_with_custom_taxonomies, 'tax_name' ); - $this->replace_custom_field_or_taxonomy_replace_vars( $unique_custom_taxonomies, $wpdb, 'tax_name', 'ct' ); - } - - /** - * Filters out all unique custom fields/taxonomies/etc. used in an AiOSEO replace var. - * - * @param string[] $meta_values An array of all the meta values that - * contain one or more AIOSEO custom field replace vars - * (in the form `#custom_field-xyz`). - * @param string $aioseo_prefix The AiOSEO prefix to use - * (e.g. `custom-field` for custom fields or `tax_name` for custom taxonomies). - * - * @return string[] An array of all the unique custom fields/taxonomies/etc. used in the replace vars. - * E.g. `xyz` in the above example. - */ - protected function get_unique_custom_fields_or_taxonomies( $meta_values, $aioseo_prefix ) { - $unique_custom_fields_or_taxonomies = []; - - foreach ( $meta_values as $meta_value ) { - // Find all custom field replace vars, store them in `$matches`. - preg_match_all( - "/#$aioseo_prefix-([\w-]+)/", - $meta_value, - $matches - ); - - /* - * `$matches[1]` contain the captured matches of the - * first capturing group (the `([\w-]+)` in the regex above). - */ - $custom_fields_or_taxonomies = $matches[1]; - - foreach ( $custom_fields_or_taxonomies as $custom_field_or_taxonomy ) { - $unique_custom_fields_or_taxonomies[ trim( $custom_field_or_taxonomy ) ] = 1; - } - } - - return array_keys( $unique_custom_fields_or_taxonomies ); - } - - /** - * Replaces every AIOSEO custom field/taxonomy/etc. replace var with the Yoast version. - * - * E.g. `#custom_field-xyz` becomes `%%cf_xyz%%`. - * - * @param string[] $unique_custom_fields_or_taxonomies An array of unique custom fields to replace the replace vars of. - * @param wpdb $wpdb The WordPress database object. - * @param string $aioseo_prefix The AiOSEO prefix to use - * (e.g. `custom-field` for custom fields or `tax_name` for custom taxonomies). - * @param string $yoast_prefix The Yoast prefix to use (e.g. `cf` for custom fields). - * - * @return void - */ - protected function replace_custom_field_or_taxonomy_replace_vars( $unique_custom_fields_or_taxonomies, $wpdb, $aioseo_prefix, $yoast_prefix ) { - foreach ( $unique_custom_fields_or_taxonomies as $unique_custom_field_or_taxonomy ) { - $aioseo_variable = "#{$aioseo_prefix}-{$unique_custom_field_or_taxonomy}"; - $yoast_variable = "%%{$yoast_prefix}_{$unique_custom_field_or_taxonomy}%%"; - - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching - $wpdb->query( - $wpdb->prepare( - 'UPDATE tmp_meta_table SET meta_value = REPLACE( meta_value, %s, %s )', - $aioseo_variable, - $yoast_variable - ) - ); - } - } - - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching - - /** - * Retrieve all the meta values from the temporary meta table that contain - * at least one AiOSEO custom field replace var. - * - * @param wpdb $wpdb The WordPress database object. - * @param string $aioseo_prefix The AiOSEO prefix to use - * (e.g. `custom-field` for custom fields or `tax_name` for custom taxonomies). - * - * @return string[] All meta values that contain at least one AioSEO custom field replace var. - */ - protected function get_meta_values_with_custom_field_or_taxonomy( $wpdb, $aioseo_prefix ) { - return $wpdb->get_col( - $wpdb->prepare( - 'SELECT meta_value FROM tmp_meta_table WHERE meta_value LIKE %s', - "%#$aioseo_prefix-%" - ) - ); - } - - // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching - - /** - * Detects whether there is AIOSEO data to import by looking whether the AIOSEO data have been cleaned up. - * - * @return bool Boolean indicating whether there is something to import. - */ - protected function detect() { - $aioseo_cleanup_action = YoastSEO()->classes->get( Aioseo_Cleanup_Action::class ); - return ( $aioseo_cleanup_action->get_total_unindexed() > 0 ); - } - - /** - * Import AIOSEO post data from their custom indexable table. Not currently used. - * - * @return void - */ - protected function import() { - // This is overriden from the import.js and never run. - $aioseo_posts_import_action = YoastSEO()->classes->get( Aioseo_Posts_Importing_Action::class ); - $aioseo_posts_import_action->index(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo.php deleted file mode 100644 index cf7ab491..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo.php +++ /dev/null @@ -1,110 +0,0 @@ - 'opengraph-title', - 'aioseop_opengraph_settings_desc' => 'opengraph-description', - 'aioseop_opengraph_settings_customimg' => 'opengraph-image', - 'aioseop_opengraph_settings_customimg_twitter' => 'twitter-image', - ]; - - /** - * Array of meta keys to detect and import. - * - * @var array - */ - protected $clone_keys = [ - [ - 'old_key' => '_aioseop_title', - 'new_key' => 'title', - ], - [ - 'old_key' => '_aioseop_description', - 'new_key' => 'metadesc', - ], - [ - 'old_key' => '_aioseop_noindex', - 'new_key' => 'meta-robots-noindex', - 'convert' => [ 'on' => 1 ], - ], - [ - 'old_key' => '_aioseop_nofollow', - 'new_key' => 'meta-robots-nofollow', - 'convert' => [ 'on' => 1 ], - ], - ]; - - /** - * Import All In One SEO meta values. - * - * @return bool Import success status. - */ - protected function import() { - $status = parent::import(); - if ( $status ) { - $this->import_opengraph(); - } - return $status; - } - - /** - * Imports the OpenGraph and Twitter settings for all posts. - * - * @return bool - */ - protected function import_opengraph() { - $query_posts = new WP_Query( 'post_type=any&meta_key=_aioseop_opengraph_settings&order=ASC&fields=ids&nopaging=true' ); - - if ( ! empty( $query_posts->posts ) ) { - foreach ( array_values( $query_posts->posts ) as $post_id ) { - $this->import_post_opengraph( $post_id ); - } - } - - return true; - } - - /** - * Imports the OpenGraph and Twitter settings for a single post. - * - * @param int $post_id Post ID. - * - * @return void - */ - private function import_post_opengraph( $post_id ) { - $meta = get_post_meta( $post_id, '_aioseop_opengraph_settings', true ); - $meta = maybe_unserialize( $meta ); - - foreach ( $this->import_keys as $old_key => $new_key ) { - $this->maybe_save_post_meta( $new_key, $meta[ $old_key ], $post_id ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-greg-high-performance-seo.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-greg-high-performance-seo.php deleted file mode 100644 index 8925421f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-greg-high-performance-seo.php +++ /dev/null @@ -1,42 +0,0 @@ - '_ghpseo_alternative_description', - 'new_key' => 'metadesc', - ], - [ - 'old_key' => '_ghpseo_secondary_title', - 'new_key' => 'title', - ], - ]; -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-headspace.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-headspace.php deleted file mode 100644 index 3a43d169..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-headspace.php +++ /dev/null @@ -1,54 +0,0 @@ - '_headspace_description', - 'new_key' => 'metadesc', - ], - [ - 'old_key' => '_headspace_page_title', - 'new_key' => 'title', - ], - [ - 'old_key' => '_headspace_noindex', - 'new_key' => 'meta-robots-noindex', - 'convert' => [ 'on' => 1 ], - ], - [ - 'old_key' => '_headspace_nofollow', - 'new_key' => 'meta-robots-nofollow', - 'convert' => [ 'on' => 1 ], - ], - ]; -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-jetpack.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-jetpack.php deleted file mode 100644 index 5f57d816..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-jetpack.php +++ /dev/null @@ -1,40 +0,0 @@ - 'advanced_seo_description', - 'new_key' => 'metadesc', - ], - ]; -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-platinum-seo-pack.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-platinum-seo-pack.php deleted file mode 100644 index 16a5ce9e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-platinum-seo-pack.php +++ /dev/null @@ -1,138 +0,0 @@ - 'description', - 'new_key' => 'metadesc', - ], - [ - 'old_key' => 'title', - 'new_key' => 'title', - ], - ]; - - /** - * Runs the import of post meta keys stored by Platinum SEO Pack. - * - * @return bool - */ - protected function import() { - $return = parent::import(); - if ( $return ) { - $this->import_robots_meta(); - } - - return $return; - } - - /** - * Cleans up all the meta values Platinum SEO pack creates. - * - * @return bool - */ - protected function cleanup() { - $this->meta_key = 'title'; - parent::cleanup(); - - $this->meta_key = 'description'; - parent::cleanup(); - - $this->meta_key = 'metarobots'; - parent::cleanup(); - - return true; - } - - /** - * Finds all the robotsmeta fields to import and deals with them. - * - * There are four potential values that Platinum SEO stores: - * - index,folllow - * - index,nofollow - * - noindex,follow - * - noindex,nofollow - * - * We only have to deal with the latter 3, the first is our default. - * - * @return void - */ - protected function import_robots_meta() { - $this->import_by_meta_robots( 'index,nofollow', [ 'nofollow' ] ); - $this->import_by_meta_robots( 'noindex,follow', [ 'noindex' ] ); - $this->import_by_meta_robots( 'noindex,nofollow', [ 'noindex', 'nofollow' ] ); - } - - /** - * Imports the values for all index, nofollow posts. - * - * @param string $value The meta robots value to find posts for. - * @param array $metas The meta field(s) to save. - * - * @return void - */ - protected function import_by_meta_robots( $value, $metas ) { - $posts = $this->find_posts_by_robots_meta( $value ); - if ( ! $posts ) { - return; - } - - foreach ( $posts as $post_id ) { - foreach ( $metas as $meta ) { - $this->maybe_save_post_meta( 'meta-robots-' . $meta, 1, $post_id ); - } - } - } - - /** - * Finds posts by a given meta robots value. - * - * @param string $meta_value Robots meta value. - * - * @return array|bool Array of Post IDs on success, false on failure. - */ - protected function find_posts_by_robots_meta( $meta_value ) { - $posts = get_posts( - [ - 'post_type' => 'any', - 'meta_key' => 'robotsmeta', - 'meta_value' => $meta_value, - 'order' => 'ASC', - 'fields' => 'ids', - 'nopaging' => true, - ] - ); - if ( empty( $posts ) ) { - return false; - } - return $posts; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-premium-seo-pack.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-premium-seo-pack.php deleted file mode 100644 index bd93b91e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-premium-seo-pack.php +++ /dev/null @@ -1,39 +0,0 @@ -table_name = $wpdb->prefix . 'psp'; - $this->meta_key = ''; - } - - /** - * Returns the query to return an identifier for the posts to import. - * - * @return string - */ - protected function retrieve_posts_query() { - return "SELECT URL AS identifier FROM {$this->table_name} WHERE blog_id = %d"; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-rankmath.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-rankmath.php deleted file mode 100644 index 68e7c0c1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-rankmath.php +++ /dev/null @@ -1,179 +0,0 @@ - 'rank_math_description', - 'new_key' => 'metadesc', - ], - [ - 'old_key' => 'rank_math_title', - 'new_key' => 'title', - ], - [ - 'old_key' => 'rank_math_canonical_url', - 'new_key' => 'canonical', - ], - [ - 'old_key' => 'rank_math_primary_category', - 'new_key' => 'primary_category', - ], - [ - 'old_key' => 'rank_math_facebook_title', - 'new_key' => 'opengraph-title', - ], - [ - 'old_key' => 'rank_math_facebook_description', - 'new_key' => 'opengraph-description', - ], - [ - 'old_key' => 'rank_math_facebook_image', - 'new_key' => 'opengraph-image', - ], - [ - 'old_key' => 'rank_math_facebook_image_id', - 'new_key' => 'opengraph-image-id', - ], - [ - 'old_key' => 'rank_math_twitter_title', - 'new_key' => 'twitter-title', - ], - [ - 'old_key' => 'rank_math_twitter_description', - 'new_key' => 'twitter-description', - ], - [ - 'old_key' => 'rank_math_twitter_image', - 'new_key' => 'twitter-image', - ], - [ - 'old_key' => 'rank_math_twitter_image_id', - 'new_key' => 'twitter-image-id', - ], - [ - 'old_key' => 'rank_math_focus_keyword', - 'new_key' => 'focuskw', - ], - ]; - - /** - * Handles post meta data to import. - * - * @return bool Import success status. - */ - protected function import() { - global $wpdb; - // Replace % with %% as their variables are the same except for that. - $wpdb->query( "UPDATE $wpdb->postmeta SET meta_value = REPLACE( meta_value, '%', '%%' ) WHERE meta_key IN ( 'rank_math_description', 'rank_math_title' )" ); - - $this->import_meta_robots(); - $return = $this->meta_keys_clone( $this->clone_keys ); - - // Return %% to % so our import is non-destructive. - $wpdb->query( "UPDATE $wpdb->postmeta SET meta_value = REPLACE( meta_value, '%%', '%' ) WHERE meta_key IN ( 'rank_math_description', 'rank_math_title' )" ); - - if ( $return ) { - $this->import_settings(); - } - - return $return; - } - - /** - * RankMath stores robots meta quite differently, so we have to parse it out. - * - * @return void - */ - private function import_meta_robots() { - global $wpdb; - $post_metas = $wpdb->get_results( "SELECT post_id, meta_value FROM $wpdb->postmeta WHERE meta_key = 'rank_math_robots'" ); - foreach ( $post_metas as $post_meta ) { - // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- Reason: We can't control the form in which Rankmath sends the data. - $robots_values = unserialize( $post_meta->meta_value ); - foreach ( [ 'noindex', 'nofollow' ] as $directive ) { - $directive_key = array_search( $directive, $robots_values, true ); - if ( $directive_key !== false ) { - update_post_meta( $post_meta->post_id, '_yoast_wpseo_meta-robots-' . $directive, 1 ); - unset( $robots_values[ $directive_key ] ); - } - } - if ( count( $robots_values ) > 0 ) { - $value = implode( ',', $robots_values ); - update_post_meta( $post_meta->post_id, '_yoast_wpseo_meta-robots-adv', $value ); - } - } - } - - /** - * Imports some of the RankMath settings. - * - * @return void - */ - private function import_settings() { - $settings = [ - 'title_separator' => 'separator', - 'homepage_title' => 'title-home-wpseo', - 'homepage_description' => 'metadesc-home-wpseo', - 'author_archive_title' => 'title-author-wpseo', - 'date_archive_title' => 'title-archive-wpseo', - 'search_title' => 'title-search-wpseo', - '404_title' => 'title-404-wpseo', - 'pt_post_title' => 'title-post', - 'pt_page_title' => 'title-page', - ]; - $options = get_option( 'rank-math-options-titles' ); - - foreach ( $settings as $import_setting_key => $setting_key ) { - if ( ! empty( $options[ $import_setting_key ] ) ) { - $value = $options[ $import_setting_key ]; - // Make sure replace vars work. - $value = str_replace( '%', '%%', $value ); - WPSEO_Options::set( $setting_key, $value ); - } - } - } - - /** - * Removes the plugin data from the database. - * - * @return bool Cleanup status. - */ - protected function cleanup() { - $return = parent::cleanup(); - if ( $return ) { - global $wpdb; - $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'rank-math-%'" ); - $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '%rank_math%'" ); - } - - return $return; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seo-framework.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seo-framework.php deleted file mode 100644 index 8a8ac9e1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seo-framework.php +++ /dev/null @@ -1,94 +0,0 @@ - '_genesis_description', - 'new_key' => 'metadesc', - ], - [ - 'old_key' => '_genesis_title', - 'new_key' => 'title', - ], - [ - 'old_key' => '_genesis_noindex', - 'new_key' => 'meta-robots-noindex', - ], - [ - 'old_key' => '_genesis_nofollow', - 'new_key' => 'meta-robots-nofollow', - ], - [ - 'old_key' => '_genesis_canonical_uri', - 'new_key' => 'canonical', - ], - [ - 'old_key' => '_open_graph_title', - 'new_key' => 'opengraph-title', - ], - [ - 'old_key' => '_open_graph_description', - 'new_key' => 'opengraph-description', - ], - [ - 'old_key' => '_social_image_url', - 'new_key' => 'opengraph-image', - ], - [ - 'old_key' => '_twitter_title', - 'new_key' => 'twitter-title', - ], - [ - 'old_key' => '_twitter_description', - 'new_key' => 'twitter-description', - ], - ]; - - /** - * Removes all the metadata set by the SEO Framework plugin. - * - * @return bool - */ - protected function cleanup() { - $set1 = parent::cleanup(); - - $this->meta_key = '_social_image_%'; - $set2 = parent::cleanup(); - - $this->meta_key = '_twitter_%'; - $set3 = parent::cleanup(); - - $this->meta_key = '_open_graph_%'; - $set4 = parent::cleanup(); - - return ( $set1 || $set2 || $set3 || $set4 ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seopressor.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seopressor.php deleted file mode 100644 index 4009c798..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seopressor.php +++ /dev/null @@ -1,175 +0,0 @@ - '_seop_settings', - ], - ]; - - /** - * Imports the post meta values to Yoast SEO. - * - * @return bool Import success status. - */ - protected function import() { - // Query for all the posts that have an _seop_settings meta set. - $query_posts = new WP_Query( 'post_type=any&meta_key=_seop_settings&order=ASC&fields=ids&nopaging=true' ); - foreach ( $query_posts->posts as $post_id ) { - $this->import_post_focus_keywords( $post_id ); - $this->import_seopressor_post_settings( $post_id ); - } - - return true; - } - - /** - * Removes all the post meta fields SEOpressor creates. - * - * @return bool Cleanup status. - */ - protected function cleanup() { - global $wpdb; - - // If we get to replace the data, let's do some proper cleanup. - return $wpdb->query( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE '_seop_%'" ); - } - - /** - * Imports the data. SEOpressor stores most of the data in one post array, this loops over it. - * - * @param int $post_id Post ID. - * - * @return void - */ - private function import_seopressor_post_settings( $post_id ) { - $settings = get_post_meta( $post_id, '_seop_settings', true ); - - foreach ( - [ - 'fb_description' => 'opengraph-description', - 'fb_title' => 'opengraph-title', - 'fb_type' => 'og_type', - 'fb_img' => 'opengraph-image', - 'meta_title' => 'title', - 'meta_description' => 'metadesc', - 'meta_canonical' => 'canonical', - 'tw_description' => 'twitter-description', - 'tw_title' => 'twitter-title', - 'tw_image' => 'twitter-image', - ] as $seopressor_key => $yoast_key ) { - $this->import_meta_helper( $seopressor_key, $yoast_key, $settings, $post_id ); - } - - if ( isset( $settings['meta_rules'] ) ) { - $this->import_post_robots( $settings['meta_rules'], $post_id ); - } - } - - /** - * Imports the focus keywords, and stores them for later use. - * - * @param int $post_id Post ID. - * - * @return void - */ - private function import_post_focus_keywords( $post_id ) { - // Import the focus keyword. - $focuskw = trim( get_post_meta( $post_id, '_seop_kw_1', true ) ); - $this->maybe_save_post_meta( 'focuskw', $focuskw, $post_id ); - - // Import additional focus keywords for use in premium. - $focuskw2 = trim( get_post_meta( $post_id, '_seop_kw_2', true ) ); - $focuskw3 = trim( get_post_meta( $post_id, '_seop_kw_3', true ) ); - - $focus_keywords = []; - if ( ! empty( $focuskw2 ) ) { - $focus_keywords[] = $focuskw2; - } - if ( ! empty( $focuskw3 ) ) { - $focus_keywords[] = $focuskw3; - } - - if ( $focus_keywords !== [] ) { - $this->maybe_save_post_meta( 'focuskeywords', WPSEO_Utils::format_json_encode( $focus_keywords ), $post_id ); - } - } - - /** - * Retrieves the SEOpressor robot value and map this to Yoast SEO values. - * - * @param string $meta_rules The meta rules taken from the SEOpressor settings array. - * @param int $post_id The post id of the current post. - * - * @return void - */ - private function import_post_robots( $meta_rules, $post_id ) { - $seopressor_robots = explode( '#|#|#', $meta_rules ); - $robot_value = $this->get_robot_value( $seopressor_robots ); - - // Saving the new meta values for Yoast SEO. - $this->maybe_save_post_meta( 'meta-robots-noindex', $robot_value['index'], $post_id ); - $this->maybe_save_post_meta( 'meta-robots-nofollow', $robot_value['follow'], $post_id ); - $this->maybe_save_post_meta( 'meta-robots-adv', $robot_value['advanced'], $post_id ); - } - - /** - * Gets the robot config by given SEOpressor robots value. - * - * @param array $seopressor_robots The value in SEOpressor that needs to be converted to the Yoast format. - * - * @return array The robots values in Yoast format. - */ - private function get_robot_value( $seopressor_robots ) { - $return = [ - 'index' => 2, - 'follow' => 0, - 'advanced' => '', - ]; - - if ( in_array( 'noindex', $seopressor_robots, true ) ) { - $return['index'] = 1; - } - if ( in_array( 'nofollow', $seopressor_robots, true ) ) { - $return['follow'] = 1; - } - foreach ( [ 'noarchive', 'nosnippet', 'noimageindex' ] as $needle ) { - if ( in_array( $needle, $seopressor_robots, true ) ) { - $return['advanced'] .= $needle . ','; - } - } - $return['advanced'] = rtrim( $return['advanced'], ',' ); - - return $return; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-smartcrawl.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-smartcrawl.php deleted file mode 100644 index 507120c6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-smartcrawl.php +++ /dev/null @@ -1,151 +0,0 @@ - '_wds_metadesc', - 'new_key' => 'metadesc', - ], - [ - 'old_key' => '_wds_title', - 'new_key' => 'title', - ], - [ - 'old_key' => '_wds_canonical', - 'new_key' => 'canonical', - ], - [ - 'old_key' => '_wds_focus-keywords', - 'new_key' => 'focuskw', - ], - [ - 'old_key' => '_wds_meta-robots-noindex', - 'new_key' => 'meta-robots-noindex', - ], - [ - 'old_key' => '_wds_meta-robots-nofollow', - 'new_key' => 'meta-robots-nofollow', - ], - ]; - - /** - * Used for importing Twitter and Facebook meta's. - * - * @var array - */ - protected $social_keys = []; - - /** - * Handles post meta data to import. - * - * @return bool Import success status. - */ - protected function import() { - $return = parent::import(); - if ( $return ) { - $this->import_opengraph(); - $this->import_twitter(); - } - - return $return; - } - - /** - * Imports the OpenGraph meta keys saved by Smartcrawl. - * - * @return bool Import status. - */ - protected function import_opengraph() { - $this->social_keys = [ - 'title' => 'opengraph-title', - 'description' => 'opengraph-description', - 'images' => 'opengraph-image', - ]; - return $this->post_find_import( '_wds_opengraph' ); - } - - /** - * Imports the Twitter meta keys saved by Smartcrawl. - * - * @return bool Import status. - */ - protected function import_twitter() { - $this->social_keys = [ - 'title' => 'twitter-title', - 'description' => 'twitter-description', - ]; - return $this->post_find_import( '_wds_twitter' ); - } - - /** - * Imports a post's serialized post meta values. - * - * @param int $post_id Post ID. - * @param string $key The meta key to import. - * - * @return void - */ - protected function import_serialized_post_meta( $post_id, $key ) { - $data = get_post_meta( $post_id, $key, true ); - $data = maybe_unserialize( $data ); - foreach ( $this->social_keys as $key => $meta_key ) { - if ( ! isset( $data[ $key ] ) ) { - return; - } - $value = $data[ $key ]; - if ( is_array( $value ) ) { - $value = $value[0]; - } - $this->maybe_save_post_meta( $meta_key, $value, $post_id ); - } - } - - /** - * Finds all the posts with a certain meta key and imports its values. - * - * @param string $key The meta key to search for. - * - * @return bool Import status. - */ - protected function post_find_import( $key ) { - $query_posts = new WP_Query( 'post_type=any&meta_key=' . $key . '&order=ASC&fields=ids&nopaging=true' ); - - if ( empty( $query_posts->posts ) ) { - return false; - } - - foreach ( array_values( $query_posts->posts ) as $post_id ) { - $this->import_serialized_post_meta( $post_id, $key ); - } - - return true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-squirrly.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-squirrly.php deleted file mode 100644 index 2c088e26..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-squirrly.php +++ /dev/null @@ -1,224 +0,0 @@ - 'meta-robots-noindex', - 'nofollow' => 'meta-robots-nofollow', - 'title' => 'title', - 'description' => 'metadesc', - 'canonical' => 'canonical', - 'cornerstone' => '_yst_is_cornerstone', - 'tw_media' => 'twitter-image', - 'tw_title' => 'twitter-title', - 'tw_description' => 'twitter-description', - 'og_title' => 'opengraph-title', - 'og_description' => 'opengraph-description', - 'og_media' => 'opengraph-image', - 'focuskw' => 'focuskw', - ]; - - /** - * WPSEO_Import_Squirrly constructor. - */ - public function __construct() { - parent::__construct(); - - global $wpdb; - $this->table_name = $wpdb->prefix . 'qss'; - } - - /** - * Imports the post meta values to Yoast SEO. - * - * @return bool Import success status. - */ - protected function import() { - $results = $this->retrieve_posts(); - foreach ( $results as $post ) { - $return = $this->import_post_values( $post->identifier ); - if ( ! $return ) { - return false; - } - } - - return true; - } - - /** - * Retrieve the posts from the Squirrly Database. - * - * @return array Array of post IDs from the DB. - */ - protected function retrieve_posts() { - global $wpdb; - return $wpdb->get_results( - $wpdb->prepare( - $this->retrieve_posts_query(), - get_current_blog_id() - ) - ); - } - - /** - * Returns the query to return an identifier for the posts to import. - * - * @return string Query to get post ID's from the DB. - */ - protected function retrieve_posts_query() { - return "SELECT post_id AS identifier FROM {$this->table_name} WHERE blog_id = %d"; - } - - /** - * Removes the DB table and the post meta field Squirrly creates. - * - * @return bool Cleanup status. - */ - protected function cleanup() { - global $wpdb; - - // If we can clean, let's clean. - $wpdb->query( "DROP TABLE {$this->table_name}" ); - - // This removes the post meta field for the focus keyword from the DB. - parent::cleanup(); - - // If we can still see the table, something went wrong. - if ( $this->detect() ) { - $this->cleanup_error_msg(); - return false; - } - - return true; - } - - /** - * Detects whether there is post meta data to import. - * - * @return bool Boolean indicating whether there is something to import. - */ - protected function detect() { - global $wpdb; - - $result = $wpdb->get_var( "SHOW TABLES LIKE '{$this->table_name}'" ); - if ( is_wp_error( $result ) || is_null( $result ) ) { - return false; - } - - return true; - } - - /** - * Imports the data of a post out of Squirrly's DB table. - * - * @param mixed $post_identifier Post identifier, can be ID or string. - * - * @return bool Import status. - */ - private function import_post_values( $post_identifier ) { - $data = $this->retrieve_post_data( $post_identifier ); - if ( ! $data ) { - return false; - } - - if ( ! is_numeric( $post_identifier ) ) { - $post_id = url_to_postid( $post_identifier ); - } - - if ( is_numeric( $post_identifier ) ) { - $post_id = (int) $post_identifier; - $data['focuskw'] = $this->maybe_add_focus_kw( $post_identifier ); - } - - foreach ( $this->seo_field_keys as $squirrly_key => $yoast_key ) { - $this->import_meta_helper( $squirrly_key, $yoast_key, $data, $post_id ); - } - return true; - } - - /** - * Retrieves the Squirrly SEO data for a post from the DB. - * - * @param int $post_identifier Post ID. - * - * @return array|bool Array of data or false. - */ - private function retrieve_post_data( $post_identifier ) { - global $wpdb; - - if ( is_numeric( $post_identifier ) ) { - $post_identifier = (int) $post_identifier; - $query_where = 'post_id = %d'; - } - if ( ! is_numeric( $post_identifier ) ) { - $query_where = 'URL = %s'; - } - - $replacements = [ - get_current_blog_id(), - $post_identifier, - ]; - - $data = $wpdb->get_var( - $wpdb->prepare( - "SELECT seo FROM {$this->table_name} WHERE blog_id = %d AND " . $query_where, - $replacements - ) - ); - if ( ! $data || is_wp_error( $data ) ) { - return false; - } - $data = maybe_unserialize( $data ); - return $data; - } - - /** - * Squirrly stores the focus keyword in post meta. - * - * @param int $post_id Post ID. - * - * @return string The focus keyword. - */ - private function maybe_add_focus_kw( $post_id ) { - $focuskw = get_post_meta( $post_id, '_sq_post_keyword', true ); - if ( $focuskw ) { - $focuskw = json_decode( $focuskw ); - return $focuskw->keyword; - } - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-ultimate-seo.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-ultimate-seo.php deleted file mode 100644 index a5113650..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-ultimate-seo.php +++ /dev/null @@ -1,64 +0,0 @@ - '_su_description', - 'new_key' => 'metadesc', - ], - [ - 'old_key' => '_su_title', - 'new_key' => 'title', - ], - [ - 'old_key' => '_su_og_title', - 'new_key' => 'opengraph-title', - ], - [ - 'old_key' => '_su_og_description', - 'new_key' => 'opengraph-description', - ], - [ - 'old_key' => '_su_og_image', - 'new_key' => 'opengraph-image', - ], - [ - 'old_key' => '_su_meta_robots_noindex', - 'new_key' => 'meta-robots-noindex', - 'convert' => [ 'on' => 1 ], - ], - [ - 'old_key' => '_su_meta_robots_nofollow', - 'new_key' => 'meta-robots-nofollow', - 'convert' => [ 'on' => 1 ], - ], - ]; -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-woothemes-seo.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-woothemes-seo.php deleted file mode 100644 index 5ee943c3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-woothemes-seo.php +++ /dev/null @@ -1,138 +0,0 @@ - 'seo_description', - 'new_key' => 'metadesc', - ], - [ - 'old_key' => 'seo_title', - 'new_key' => 'title', - ], - [ - 'old_key' => 'seo_noindex', - 'new_key' => 'meta-robots-noindex', - ], - [ - 'old_key' => 'seo_follow', - 'new_key' => 'meta-robots-nofollow', - ], - ]; - - /** - * Holds the meta fields we can delete after import. - * - * @var array - */ - protected $cleanup_metas = [ - 'seo_follow', - 'seo_noindex', - 'seo_title', - 'seo_description', - 'seo_keywords', - ]; - - /** - * Holds the options we can delete after import. - * - * @var array - */ - protected $cleanup_options = [ - 'seo_woo_archive_layout', - 'seo_woo_single_layout', - 'seo_woo_page_layout', - 'seo_woo_wp_title', - 'seo_woo_meta_single_desc', - 'seo_woo_meta_single_key', - 'seo_woo_home_layout', - ]; - - /** - * Cleans up the WooThemes SEO settings. - * - * @return bool Cleanup status. - */ - protected function cleanup() { - $result = $this->cleanup_meta(); - if ( $result ) { - $this->cleanup_options(); - } - return $result; - } - - /** - * Removes the Woo Options from the database. - * - * @return void - */ - private function cleanup_options() { - foreach ( $this->cleanup_options as $option ) { - delete_option( $option ); - } - } - - /** - * Removes the post meta fields from the database. - * - * @return bool Cleanup status. - */ - private function cleanup_meta() { - foreach ( $this->cleanup_metas as $key ) { - $result = $this->cleanup_meta_key( $key ); - if ( ! $result ) { - return false; - } - } - return true; - } - - /** - * Removes a single meta field from the postmeta table in the database. - * - * @param string $key The meta_key to delete. - * - * @return bool Cleanup status. - */ - private function cleanup_meta_key( $key ) { - global $wpdb; - - $wpdb->query( - $wpdb->prepare( - "DELETE FROM {$wpdb->postmeta} WHERE meta_key = %s", - $key - ) - ); - return $wpdb->__get( 'result' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wp-meta-seo.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wp-meta-seo.php deleted file mode 100644 index e6a55efb..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wp-meta-seo.php +++ /dev/null @@ -1,82 +0,0 @@ - '_metaseo_metadesc', - 'new_key' => 'metadesc', - ], - [ - 'old_key' => '_metaseo_metatitle', - 'new_key' => 'title', - ], - [ - 'old_key' => '_metaseo_metaopengraph-title', - 'new_key' => 'opengraph-title', - ], - [ - 'old_key' => '_metaseo_metaopengraph-desc', - 'new_key' => 'opengraph-description', - ], - [ - 'old_key' => '_metaseo_metaopengraph-image', - 'new_key' => 'opengraph-image', - ], - [ - 'old_key' => '_metaseo_metatwitter-title', - 'new_key' => 'twitter-title', - ], - [ - 'old_key' => '_metaseo_metatwitter-desc', - 'new_key' => 'twitter-description', - ], - [ - 'old_key' => '_metaseo_metatwitter-image', - 'new_key' => 'twitter-image', - ], - [ - 'old_key' => '_metaseo_metaindex', - 'new_key' => 'meta-robots-noindex', - 'convert' => [ - 'index' => 0, - 'noindex' => 1, - ], - ], - [ - 'old_key' => '_metaseo_metafollow', - 'new_key' => 'meta-robots-nofollow', - 'convert' => [ - 'follow' => 0, - 'nofollow' => 1, - ], - ], - ]; -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wpseo.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wpseo.php deleted file mode 100644 index 0d138f2b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wpseo.php +++ /dev/null @@ -1,310 +0,0 @@ - '_wpseo_edit_description', - 'new_key' => 'metadesc', - ], - [ - 'old_key' => '_wpseo_edit_title', - 'new_key' => 'title', - ], - [ - 'old_key' => '_wpseo_edit_canonical', - 'new_key' => 'canonical', - ], - [ - 'old_key' => '_wpseo_edit_og_title', - 'new_key' => 'opengraph-title', - ], - [ - 'old_key' => '_wpseo_edit_og_description', - 'new_key' => 'opengraph-description', - ], - [ - 'old_key' => '_wpseo_edit_og_image', - 'new_key' => 'opengraph-image', - ], - [ - 'old_key' => '_wpseo_edit_twittercard_title', - 'new_key' => 'twitter-title', - ], - [ - 'old_key' => '_wpseo_edit_twittercard_description', - 'new_key' => 'twitter-description', - ], - [ - 'old_key' => '_wpseo_edit_twittercard_image', - 'new_key' => 'twitter-image', - ], - ]; - - /** - * The values 1 - 6 are the configured values from wpSEO. This array will map the values of wpSEO to our values. - * - * There are some double array like 1-6 and 3-4. The reason is they only set the index value. The follow value is - * the default we use in the cases there isn't a follow value present. - * - * @var array - */ - private $robot_values = [ - // In wpSEO: index, follow. - 1 => [ - 'index' => 2, - 'follow' => 0, - ], - // In wpSEO: index, nofollow. - 2 => [ - 'index' => 2, - 'follow' => 1, - ], - // In wpSEO: noindex. - 3 => [ - 'index' => 1, - 'follow' => 0, - ], - // In wpSEO: noindex, follow. - 4 => [ - 'index' => 1, - 'follow' => 0, - ], - // In wpSEO: noindex, nofollow. - 5 => [ - 'index' => 1, - 'follow' => 1, - ], - // In wpSEO: index. - 6 => [ - 'index' => 2, - 'follow' => 0, - ], - ]; - - /** - * Imports wpSEO settings. - * - * @return bool Import success status. - */ - protected function import() { - $status = parent::import(); - if ( $status ) { - $this->import_post_robots(); - $this->import_taxonomy_metas(); - } - - return $status; - } - - /** - * Removes wpseo.de post meta's. - * - * @return bool Cleanup status. - */ - protected function cleanup() { - $this->cleanup_term_meta(); - $result = $this->cleanup_post_meta(); - return $result; - } - - /** - * Detects whether there is post meta data to import. - * - * @return bool Boolean indicating whether there is something to import. - */ - protected function detect() { - if ( parent::detect() ) { - return true; - } - - global $wpdb; - $count = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->options} WHERE option_name LIKE 'wpseo_category_%'" ); - if ( $count !== '0' ) { - return true; - } - - return false; - } - - /** - * Imports the robot values from WPSEO plugin. These have to be converted to the Yoast format. - * - * @return void - */ - private function import_post_robots() { - $query_posts = new WP_Query( 'post_type=any&meta_key=_wpseo_edit_robots&order=ASC&fields=ids&nopaging=true' ); - - if ( ! empty( $query_posts->posts ) ) { - foreach ( array_values( $query_posts->posts ) as $post_id ) { - $this->import_post_robot( $post_id ); - } - } - } - - /** - * Gets the wpSEO robot value and map this to Yoast SEO values. - * - * @param int $post_id The post id of the current post. - * - * @return void - */ - private function import_post_robot( $post_id ) { - $wpseo_robots = get_post_meta( $post_id, '_wpseo_edit_robots', true ); - $robot_value = $this->get_robot_value( $wpseo_robots ); - - // Saving the new meta values for Yoast SEO. - $this->maybe_save_post_meta( 'meta-robots-noindex', $robot_value['index'], $post_id ); - $this->maybe_save_post_meta( 'meta-robots-nofollow', $robot_value['follow'], $post_id ); - } - - /** - * Imports the taxonomy metas from wpSEO. - * - * @return void - */ - private function import_taxonomy_metas() { - $terms = get_terms( - [ - 'taxonomy' => get_taxonomies(), - 'hide_empty' => false, - ] - ); - $tax_meta = get_option( 'wpseo_taxonomy_meta' ); - - foreach ( $terms as $term ) { - $this->import_taxonomy_description( $tax_meta, $term->taxonomy, $term->term_id ); - $this->import_taxonomy_robots( $tax_meta, $term->taxonomy, $term->term_id ); - } - - update_option( 'wpseo_taxonomy_meta', $tax_meta ); - } - - /** - * Imports the meta description to Yoast SEO. - * - * @param array $tax_meta The array with the current metadata. - * @param string $taxonomy String with the name of the taxonomy. - * @param string $term_id The ID of the current term. - * - * @return void - */ - private function import_taxonomy_description( &$tax_meta, $taxonomy, $term_id ) { - $description = get_option( 'wpseo_' . $taxonomy . '_' . $term_id, false ); - if ( $description !== false ) { - // Import description. - $tax_meta[ $taxonomy ][ $term_id ]['wpseo_desc'] = $description; - } - } - - /** - * Imports the robot value to Yoast SEO. - * - * @param array $tax_meta The array with the current metadata. - * @param string $taxonomy String with the name of the taxonomy. - * @param string $term_id The ID of the current term. - * - * @return void - */ - private function import_taxonomy_robots( &$tax_meta, $taxonomy, $term_id ) { - $wpseo_robots = get_option( 'wpseo_' . $taxonomy . '_' . $term_id . '_robots', false ); - if ( $wpseo_robots === false ) { - return; - } - // The value 1, 2 and 6 are the index values in wpSEO. - $new_robot_value = 'noindex'; - - if ( in_array( (int) $wpseo_robots, [ 1, 2, 6 ], true ) ) { - $new_robot_value = 'index'; - } - - $tax_meta[ $taxonomy ][ $term_id ]['wpseo_noindex'] = $new_robot_value; - } - - /** - * Deletes the wpSEO taxonomy meta data. - * - * @param string $taxonomy String with the name of the taxonomy. - * @param string $term_id The ID of the current term. - * - * @return void - */ - private function delete_taxonomy_metas( $taxonomy, $term_id ) { - delete_option( 'wpseo_' . $taxonomy . '_' . $term_id ); - delete_option( 'wpseo_' . $taxonomy . '_' . $term_id . '_robots' ); - } - - /** - * Gets the robot config by given wpSEO robots value. - * - * @param string $wpseo_robots The value in wpSEO that needs to be converted to the Yoast format. - * - * @return string The correct robot value. - */ - private function get_robot_value( $wpseo_robots ) { - if ( array_key_exists( $wpseo_robots, $this->robot_values ) ) { - return $this->robot_values[ $wpseo_robots ]; - } - - return $this->robot_values[1]; - } - - /** - * Deletes wpSEO postmeta from the database. - * - * @return bool Cleanup status. - */ - private function cleanup_post_meta() { - global $wpdb; - - // If we get to replace the data, let's do some proper cleanup. - return $wpdb->query( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE '_wpseo_edit_%'" ); - } - - /** - * Cleans up the wpSEO term meta. - * - * @return void - */ - private function cleanup_term_meta() { - $terms = get_terms( - [ - 'taxonomy' => get_taxonomies(), - 'hide_empty' => false, - ] - ); - - foreach ( $terms as $term ) { - $this->delete_taxonomy_metas( $term->taxonomy, $term->term_id ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-importers.php b/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-importers.php deleted file mode 100644 index d2336ecd..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/plugins/class-importers.php +++ /dev/null @@ -1,47 +0,0 @@ -get_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( __( 'General', 'wordpress-seo' ), $this->get_page_identifier() ), - $this->get_submenu_page( - __( 'Search Console', 'wordpress-seo' ), - 'wpseo_search_console', - $search_console_callback - ), - $this->get_submenu_page( __( 'Tools', 'wordpress-seo' ), 'wpseo_tools' ), - $this->get_submenu_page( $this->get_license_page_title(), 'wpseo_licenses' ), - ]; - - /** - * 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'; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/menu/class-base-menu.php b/wp/wp-content/plugins/wordpress-seo/admin/menu/class-base-menu.php deleted file mode 100644 index a840987d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/menu/class-base-menu.php +++ /dev/null @@ -1,287 +0,0 @@ -menu = $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]; - - // We cannot use $submenu_page[1] because add-ons define that, so hard-code this value. - if ( $submenu_page[4] === 'wpseo_licenses' ) { - $page_title = $this->get_license_page_title(); - } - - /* - * 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. - * - * @return string The title for the license page. - */ - protected function get_license_page_title() { - static $title = null; - - if ( $title === null ) { - $title = __( 'Premium', 'wordpress-seo' ); - } - - if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-promotion' ) && ! YoastSEO()->helpers->product->is_premium() ) { - $title = __( 'Premium', '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; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/menu/class-menu.php b/wp/wp-content/plugins/wordpress-seo/admin/menu/class-menu.php deleted file mode 100644 index bc3ab3e0..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/menu/class-menu.php +++ /dev/null @@ -1,96 +0,0 @@ -register_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_licenses': - require_once WPSEO_PATH . 'admin/pages/licenses.php'; - break; - - case 'wpseo_files': - require_once WPSEO_PATH . 'admin/views/tool-file-editor.php'; - break; - - default: - require_once WPSEO_PATH . 'admin/pages/dashboard.php'; - break; - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/menu/class-network-admin-menu.php b/wp/wp-content/plugins/wordpress-seo/admin/menu/class-network-admin-menu.php deleted file mode 100644 index b440cc10..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/menu/class-network-admin-menu.php +++ /dev/null @@ -1,97 +0,0 @@ -check_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' ); - } - - $submenu_pages[] = $this->get_submenu_page( __( 'Extensions', 'wordpress-seo' ), 'wpseo_licenses' ); - - return $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'; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-editor.php b/wp/wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-editor.php deleted file mode 100644 index 7f3b8201..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-editor.php +++ /dev/null @@ -1,159 +0,0 @@ - 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. - * - * @throws InvalidArgumentException Thrown when not all required arguments are present. - * - * @return void - */ - 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 - ) - ); - } - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-field.php b/wp/wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-field.php deleted file mode 100644 index e94d2c73..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-field.php +++ /dev/null @@ -1,88 +0,0 @@ -yform = $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 ) - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/menu/class-submenu-capability-normalize.php b/wp/wp-content/plugins/wordpress-seo/admin/menu/class-submenu-capability-normalize.php deleted file mode 100644 index 6e35718f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/menu/class-submenu-capability-normalize.php +++ /dev/null @@ -1,41 +0,0 @@ - $submenu_page ) { - if ( $submenu_page[3] === 'manage_options' ) { - $submenu_pages[ $index ][3] = 'wpseo_manage_options'; - } - } - - return $submenu_pages; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-abstract-sectioned-metabox-tab.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-abstract-sectioned-metabox-tab.php deleted file mode 100644 index 29ec6e90..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-abstract-sectioned-metabox-tab.php +++ /dev/null @@ -1,97 +0,0 @@ - '', - 'link_class' => '', - 'link_aria_label' => '', - ]; - - $options = array_merge( $default_options, $options ); - - $this->name = $name; - - $this->link_content = $link_content; - $this->link_title = $options['link_title']; - $this->link_class = $options['link_class']; - $this->link_aria_label = $options['link_aria_label']; - } - - /** - * Outputs the section link if any section has been added. - * - * @return void - */ - public function display_link() { - if ( $this->has_sections() ) { - printf( - '
            • %5$s
            • ', - esc_attr( $this->name ), - esc_attr( $this->link_class ), - ( $this->link_title !== '' ) ? ' title="' . esc_attr( $this->link_title ) . '"' : '', - ( $this->link_aria_label !== '' ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '', - $this->link_content - ); - } - } - - /** - * Checks whether the tab has any sections. - * - * @return bool Whether the tab has any sections - */ - abstract protected function has_sections(); -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-inclusive-language.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-inclusive-language.php deleted file mode 100644 index 1fe2a1fd..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-inclusive-language.php +++ /dev/null @@ -1,58 +0,0 @@ -is_globally_enabled() && $this->is_user_enabled() && $this->is_current_version_supported() - && YoastSEO()->helpers->language->has_inclusive_language_support( WPSEO_Language_Utils::get_language( get_locale() ) ); - } - - /** - * Whether or not this analysis is enabled by the user. - * - * @return bool Whether or not this analysis is enabled by the user. - */ - public function is_user_enabled() { - return ! get_the_author_meta( 'wpseo_inclusive_language_analysis_disable', get_current_user_id() ); - } - - /** - * Whether or not this analysis is enabled globally. - * - * @return bool Whether or not this analysis is enabled globally. - */ - public function is_globally_enabled() { - return WPSEO_Options::get( 'inclusive_language_analysis_active', false ); - } - - /** - * Whether the inclusive language analysis should be loaded in Free. - * - * It should always be loaded when Premium is not active. If Premium is active, it depends on the version. Some Premium - * versions also have inclusive language code (when it was still a Premium only feature) which would result in rendering - * the analysis twice. In those cases, the analysis should be only loaded from the Premium side. - * - * @return bool Whether or not the inclusive language analysis should be loaded. - */ - private function is_current_version_supported() { - $is_premium = YoastSEO()->helpers->product->is_premium(); - $premium_version = YoastSEO()->helpers->product->get_premium_version(); - - return ! $is_premium - || version_compare( $premium_version, '19.6-RC0', '>=' ) - || version_compare( $premium_version, '19.2', '==' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-readability.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-readability.php deleted file mode 100644 index 65345c48..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-readability.php +++ /dev/null @@ -1,39 +0,0 @@ -is_globally_enabled() && $this->is_user_enabled(); - } - - /** - * Whether or not this analysis is enabled by the user. - * - * @return bool Whether or not this analysis is enabled by the user. - */ - public function is_user_enabled() { - return ! get_the_author_meta( 'wpseo_content_analysis_disable', get_current_user_id() ); - } - - /** - * Whether or not this analysis is enabled globally. - * - * @return bool Whether or not this analysis is enabled globally. - */ - public function is_globally_enabled() { - return WPSEO_Options::get( 'content_analysis_active', true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-seo.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-seo.php deleted file mode 100644 index 8225defb..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-seo.php +++ /dev/null @@ -1,39 +0,0 @@ -is_globally_enabled() && $this->is_user_enabled(); - } - - /** - * Whether or not this analysis is enabled by the user. - * - * @return bool Whether or not this analysis is enabled by the user. - */ - public function is_user_enabled() { - return ! get_the_author_meta( 'wpseo_keyword_analysis_disable', get_current_user_id() ); - } - - /** - * Whether or not this analysis is enabled globally. - * - * @return bool Whether or not this analysis is enabled globally. - */ - public function is_globally_enabled() { - return WPSEO_Options::get( 'keyword_analysis_active', true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsible.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsible.php deleted file mode 100644 index c5d378cd..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsible.php +++ /dev/null @@ -1,84 +0,0 @@ -name = $name; - $this->content = $content; - $this->link_content = $link_content; - } - - /** - * Returns the html for the tab link. - * - * @return string - */ - public function link() { - return $this->link_content; - } - - /** - * Returns the html for the tab content. - * - * @return string - */ - public function content() { - $collapsible_paper = new WPSEO_Paper_Presenter( - $this->link(), - null, - [ - 'content' => $this->content, - 'collapsible' => true, - 'class' => 'metabox wpseo-form wpseo-collapsible-container', - 'paper_id' => 'collapsible-' . $this->name, - ] - ); - - return $collapsible_paper->get_output(); - } - - /** - * Returns the collapsible's unique identifier. - * - * @return string - */ - public function get_name() { - return $this->name; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsibles-section.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsibles-section.php deleted file mode 100644 index 14e8638e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsibles-section.php +++ /dev/null @@ -1,65 +0,0 @@ -collapsibles = $collapsibles; - } - - /** - * Outputs the section content if any tab has been added. - * - * @return void - */ - public function display_content() { - if ( $this->has_sections() ) { - printf( '
              ', esc_attr( 'wpseo-meta-section-' . $this->name ) ); - echo '
              '; - - add_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_forms' ] ); - add_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_a11y' ] ); - foreach ( $this->collapsibles as $collapsible ) { - echo wp_kses_post( $collapsible->content() ); - } - remove_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_forms' ] ); - remove_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_a11y' ] ); - - echo '
              '; - } - } - - /** - * Checks whether the tab has any sections. - * - * @return bool Whether the tab has any sections - */ - protected function has_sections() { - return ! empty( $this->collapsibles ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-editor.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-editor.php deleted file mode 100644 index 4d689177..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-editor.php +++ /dev/null @@ -1,85 +0,0 @@ -special_styles(); - $inside_editor = $styles['inside-editor']; - - $asset_location = new WPSEO_Admin_Asset_SEO_Location( WPSEO_FILE ); - $url = $asset_location->get_url( $inside_editor, WPSEO_Admin_Asset::TYPE_CSS ); - - if ( $css_files === '' ) { - $css_files = $url; - } - else { - $css_files .= ',' . $url; - } - - return $css_files; - } - - /** - * Enqueues the CSS to use in the TinyMCE editor. - * - * @return void - */ - public function add_editor_styles() { - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_style( 'inside-editor' ); - } - - /** - * Adds a custom element to the tinyMCE editor that we need for marking the content. - * - * @param array $tinymce_config The tinyMCE config as configured by WordPress. - * - * @return array The new tinyMCE config with our added custom elements. - */ - public function add_custom_element( $tinymce_config ) { - if ( ! empty( $tinymce_config['custom_elements'] ) ) { - $custom_elements = $tinymce_config['custom_elements']; - - $custom_elements .= ',~yoastmark'; - } - else { - $custom_elements = '~yoastmark'; - } - - $tinymce_config['custom_elements'] = $custom_elements; - - return $tinymce_config; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-form-tab.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-form-tab.php deleted file mode 100644 index df39f8b0..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-form-tab.php +++ /dev/null @@ -1,135 +0,0 @@ - '', - 'link_class' => '', - 'link_title' => '', - 'link_aria_label' => '', - 'single' => false, - ]; - - $options = array_merge( $default_options, $options ); - - $this->name = $name; - $this->content = $content; - $this->link_content = $link_content; - $this->tab_class = $options['tab_class']; - $this->link_class = $options['link_class']; - $this->link_title = $options['link_title']; - $this->link_aria_label = $options['link_aria_label']; - $this->single = $options['single']; - } - - /** - * Returns the html for the tab link. - * - * @return string - */ - public function link() { - - $html = '
            • %6$s
            • '; - - if ( $this->single ) { - $html = '
            • %6$s
            • '; - } - - return sprintf( - $html, - esc_attr( $this->name ), - ( $this->tab_class !== '' ) ? ' ' . esc_attr( $this->tab_class ) : '', - ( $this->link_class !== '' ) ? ' ' . esc_attr( $this->link_class ) : '', - ( $this->link_title !== '' ) ? ' title="' . esc_attr( $this->link_title ) . '"' : '', - ( $this->link_aria_label !== '' ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '', - $this->link_content - ); - } - - /** - * Returns the html for the tab content. - * - * @return string - */ - public function content() { - return sprintf( - '
              %3$s
              ', - esc_attr( 'wpseo_' . $this->name ), - esc_attr( $this->name ), - $this->content - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-null-tab.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-null-tab.php deleted file mode 100644 index 1e31fd2b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-null-tab.php +++ /dev/null @@ -1,30 +0,0 @@ -name = $name; - $this->content = $content; - $default_options = [ - 'link_class' => '', - 'link_aria_label' => '', - 'content_class' => 'wpseo-form', - ]; - $options = wp_parse_args( $options, $default_options ); - $this->link_content = $link_content; - $this->link_class = $options['link_class']; - $this->link_aria_label = $options['link_aria_label']; - $this->content_class = $options['content_class']; - } - - /** - * Outputs the section link. - * - * @return void - */ - public function display_link() { - printf( - '
            • %4$s
            • ', - esc_attr( $this->name ), - esc_attr( $this->link_class ), - ( $this->link_aria_label !== '' ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '', - $this->link_content - ); - } - - /** - * Outputs the section content. - * - * @return void - */ - public function display_content() { - $html = sprintf( - '
              ', - esc_attr( $this->name ), - esc_attr( $this->content_class ) - ); - $html .= $this->content; - $html .= '
              '; - echo $html; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-inclusive-language.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-inclusive-language.php deleted file mode 100644 index 1fddff4a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-inclusive-language.php +++ /dev/null @@ -1,46 +0,0 @@ - -
              %2$s
              ', - esc_attr( $this->name ), - esc_html__( 'Inclusive language', 'wordpress-seo' ) - ); - } - - /** - * Outputs the section content. - * - * @return void - */ - public function display_content() { - printf( - '
              ', - esc_attr( $this->name ) - ); - echo '
              ', '
              '; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-react.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-react.php deleted file mode 100644 index 70906599..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-react.php +++ /dev/null @@ -1,118 +0,0 @@ -name = $name; - $this->content = $content; - - $default_options = [ - 'link_class' => '', - 'link_aria_label' => '', - 'html_after' => '', - ]; - - $options = wp_parse_args( $options, $default_options ); - - $this->link_content = $link_content; - $this->link_class = $options['link_class']; - $this->link_aria_label = $options['link_aria_label']; - $this->html_after = $options['html_after']; - } - - /** - * Outputs the section link. - * - * @return void - */ - public function display_link() { - printf( - '
            • %4$s
            • ', - esc_attr( $this->name ), - esc_attr( $this->link_class ), - ( $this->link_aria_label !== '' ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '', - wp_kses_post( $this->link_content ) - ); - } - - /** - * Outputs the section content. - * - * @return void - */ - public function display_content() { - add_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_forms' ] ); - add_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_a11y' ] ); - - printf( - '
              ', - esc_attr( $this->name ) - ); - echo wp_kses_post( $this->content ); - echo '
              '; - echo wp_kses_post( $this->html_after ); - echo '
              '; - - remove_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_forms' ] ); - remove_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_a11y' ] ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-readability.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-readability.php deleted file mode 100644 index cbfea907..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-readability.php +++ /dev/null @@ -1,46 +0,0 @@ - -
              %2$s
              ', - esc_attr( $this->name ), - esc_html__( 'Readability', 'wordpress-seo' ) - ); - } - - /** - * Outputs the section content. - * - * @return void - */ - public function display_content() { - printf( - '
              ', - esc_attr( $this->name ) - ); - echo '
              ', '
              '; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox.php deleted file mode 100644 index 7dc1329f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox.php +++ /dev/null @@ -1,1210 +0,0 @@ -is_internet_explorer() ) { - add_action( 'add_meta_boxes', [ $this, 'internet_explorer_metabox' ] ); - - return; - } - - add_action( 'add_meta_boxes', [ $this, 'add_meta_box' ] ); - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue' ] ); - add_action( 'wp_insert_post', [ $this, 'save_postdata' ] ); - add_action( 'edit_attachment', [ $this, 'save_postdata' ] ); - add_action( 'add_attachment', [ $this, 'save_postdata' ] ); - add_action( 'admin_init', [ $this, 'translate_meta_boxes' ] ); - - $this->editor = new WPSEO_Metabox_Editor(); - $this->editor->register_hooks(); - - $this->social_is_enabled = WPSEO_Options::get( 'opengraph', false ) || WPSEO_Options::get( 'twitter', false ); - $this->is_advanced_metadata_enabled = WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) || WPSEO_Options::get( 'disableadvanced_meta' ) === false; - - $this->seo_analysis = new WPSEO_Metabox_Analysis_SEO(); - $this->readability_analysis = new WPSEO_Metabox_Analysis_Readability(); - $this->inclusive_language_analysis = new WPSEO_Metabox_Analysis_Inclusive_Language(); - } - - /** - * Checks whether the request comes from an IE 11 browser. - * - * @return bool Whether the request comes from an IE 11 browser. - */ - public static function is_internet_explorer() { - if ( empty( $_SERVER['HTTP_USER_AGENT'] ) ) { - return false; - } - - $user_agent = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ); - - if ( stripos( $user_agent, 'Trident/7.0' ) === false ) { - return false; - } - - return true; - } - - /** - * Adds an alternative metabox for internet explorer users. - * - * @return void - */ - public function internet_explorer_metabox() { - $post_types = WPSEO_Post_Type::get_accessible_post_types(); - $post_types = array_filter( $post_types, [ $this, 'display_metabox' ] ); - - if ( ! is_array( $post_types ) || $post_types === [] ) { - return; - } - - $product_title = $this->get_product_title(); - - foreach ( $post_types as $post_type ) { - add_filter( "postbox_classes_{$post_type}_wpseo_meta", [ $this, 'wpseo_metabox_class' ] ); - - add_meta_box( - 'wpseo_meta', - $product_title, - [ $this, 'render_internet_explorer_notice' ], - $post_type, - 'normal', - apply_filters( 'wpseo_metabox_prio', 'high' ), - [ '__block_editor_compatible_meta_box' => true ] - ); - } - } - - /** - * Renders the content for the internet explorer metabox. - * - * @return void - */ - public function render_internet_explorer_notice() { - $content = sprintf( - /* translators: 1: Link start tag to the Firefox website, 2: Link start tag to the Chrome website, 3: Link start tag to the Edge website, 4: Link closing tag. */ - esc_html__( 'The browser you are currently using is unfortunately rather dated. Since we strive to give you the best experience possible, we no longer support this browser. Instead, please use %1$sFirefox%4$s, %2$sChrome%4$s or %3$sMicrosoft Edge%4$s.', 'wordpress-seo' ), - '', - '', - '', - '' - ); - - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped above. - echo new Alert_Presenter( $content ); - } - - /** - * Translates text strings for use in the meta box. - * - * IMPORTANT: if you want to add a new string (option) somewhere, make sure you add that array key to - * the main meta box definition array in the class WPSEO_Meta() as well!!!! - * - * @return void - */ - public static function translate_meta_boxes() { - WPSEO_Meta::$meta_fields['general']['title']['title'] = __( 'SEO title', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['general']['metadesc']['title'] = __( 'Meta description', 'wordpress-seo' ); - - /* translators: %s expands to the post type name. */ - WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['title'] = __( 'Allow search engines to show this %s in search results?', 'wordpress-seo' ); - if ( (string) get_option( 'blog_public' ) === '0' ) { - WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['description'] = '' . __( 'Warning: even though you can set the meta robots setting here, the entire site is set to noindex in the sitewide privacy settings, so these settings won\'t have an effect.', 'wordpress-seo' ) . ''; - } - /* translators: %1$s expands to Yes or No, %2$s expands to the post type name.*/ - WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['options']['0'] = __( 'Default for %2$s, currently: %1$s', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['options']['2'] = __( 'Yes', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['options']['1'] = __( 'No', 'wordpress-seo' ); - - /* translators: %1$s expands to the post type name.*/ - WPSEO_Meta::$meta_fields['advanced']['meta-robots-nofollow']['title'] = __( 'Should search engines follow links on this %1$s?', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['meta-robots-nofollow']['options']['0'] = __( 'Yes', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['meta-robots-nofollow']['options']['1'] = __( 'No', 'wordpress-seo' ); - - WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['title'] = __( 'Meta robots advanced', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['description'] = __( 'If you want to apply advanced meta robots settings for this page, please define them in the following field.', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['options']['noimageindex'] = __( 'No Image Index', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['options']['noarchive'] = __( 'No Archive', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['options']['nosnippet'] = __( 'No Snippet', 'wordpress-seo' ); - - WPSEO_Meta::$meta_fields['advanced']['bctitle']['title'] = __( 'Breadcrumbs Title', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['bctitle']['description'] = __( 'Title to use for this page in breadcrumb paths', 'wordpress-seo' ); - - WPSEO_Meta::$meta_fields['advanced']['canonical']['title'] = __( 'Canonical URL', 'wordpress-seo' ); - - WPSEO_Meta::$meta_fields['advanced']['canonical']['description'] = sprintf( - /* translators: 1: link open tag; 2: link close tag. */ - __( 'The canonical URL that this page should point to. Leave empty to default to permalink. %1$sCross domain canonical%2$s supported too.', 'wordpress-seo' ), - '', - WPSEO_Admin_Utils::get_new_tab_message() . '' - ); - /* translators: %s expands to the post type name. */ - WPSEO_Meta::$meta_fields['advanced']['wordproof_timestamp']['title'] = __( 'Timestamp this %s', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['wordproof_timestamp']['description'] = __( 'Use WordProof to timestamp this page to comply with legal regulations and join the fight for a more transparant and accountable internet.', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['wordproof_timestamp']['options']['0'] = __( 'Off', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['wordproof_timestamp']['options']['1'] = __( 'On', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['wordproof_timestamp']['type'] = 'hidden'; - - WPSEO_Meta::$meta_fields['advanced']['redirect']['title'] = __( '301 Redirect', 'wordpress-seo' ); - WPSEO_Meta::$meta_fields['advanced']['redirect']['description'] = __( 'The URL that this page should redirect to.', 'wordpress-seo' ); - - do_action( 'wpseo_tab_translate' ); - } - - /** - * Determines whether the metabox should be shown for the passed identifier. - * - * By default the check is done for post types, but can also be used for taxonomies. - * - * @param string|null $identifier The identifier to check. - * @param string $type The type of object to check. Defaults to post_type. - * - * @return bool Whether or not the metabox should be displayed. - */ - public function display_metabox( $identifier = null, $type = 'post_type' ) { - return WPSEO_Utils::is_metabox_active( $identifier, $type ); - } - - /** - * Adds the Yoast SEO meta box to the edit boxes in the edit post, page, - * attachment, and custom post types pages. - * - * @return void - */ - public function add_meta_box() { - $post_types = WPSEO_Post_Type::get_accessible_post_types(); - $post_types = array_filter( $post_types, [ $this, 'display_metabox' ] ); - - if ( ! is_array( $post_types ) || $post_types === [] ) { - return; - } - - $product_title = $this->get_product_title(); - - foreach ( $post_types as $post_type ) { - add_filter( "postbox_classes_{$post_type}_wpseo_meta", [ $this, 'wpseo_metabox_class' ] ); - - add_meta_box( - 'wpseo_meta', - $product_title, - [ $this, 'meta_box' ], - $post_type, - 'normal', - apply_filters( 'wpseo_metabox_prio', 'high' ), - [ '__block_editor_compatible_meta_box' => true ] - ); - } - } - - /** - * Adds CSS classes to the meta box. - * - * @param string[] $classes An array of postbox CSS classes. - * - * @return string[] List of classes that will be applied to the editbox container. - */ - public function wpseo_metabox_class( $classes ) { - $classes[] = 'yoast wpseo-metabox'; - - return $classes; - } - - /** - * Passes variables to js for use with the post-scraper. - * - * @return array|bool|int> - */ - public function get_metabox_script_data() { - $permalink = ''; - - if ( is_object( $this->get_metabox_post() ) ) { - $permalink = get_sample_permalink( $this->get_metabox_post()->ID ); - $permalink = $permalink[0]; - } - - $post_formatter = new WPSEO_Metabox_Formatter( - new WPSEO_Post_Metabox_Formatter( $this->get_metabox_post(), [], $permalink ) - ); - - $values = $post_formatter->get_values(); - /** This filter is documented in admin/filters/class-cornerstone-filter.php. */ - $post_types = apply_filters( 'wpseo_cornerstone_post_types', WPSEO_Post_Type::get_accessible_post_types() ); - if ( $values['cornerstoneActive'] && ! in_array( $this->get_metabox_post()->post_type, $post_types, true ) ) { - $values['cornerstoneActive'] = false; - } - - if ( $values['semrushIntegrationActive'] && $this->post->post_type === 'attachment' ) { - $values['semrushIntegrationActive'] = 0; - } - - if ( $values['wincherIntegrationActive'] && $this->post->post_type === 'attachment' ) { - $values['wincherIntegrationActive'] = 0; - } - - return $values; - } - - /** - * Determines whether or not the current post type has registered taxonomies. - * - * @return bool Whether the current post type has taxonomies. - */ - private function current_post_type_has_taxonomies() { - $post_taxonomies = get_object_taxonomies( get_post_type() ); - - return ! empty( $post_taxonomies ); - } - - /** - * Determines the scope based on the post type. - * This can be used by the replacevar plugin to determine if a replacement needs to be executed. - * - * @return string String describing the current scope. - */ - private function determine_scope() { - if ( $this->get_metabox_post()->post_type === 'page' ) { - return 'page'; - } - - return 'post'; - } - - /** - * Outputs the meta box. - * - * @return void - */ - public function meta_box() { - $this->render_hidden_fields(); - $this->render_tabs(); - } - - /** - * Renders the metabox hidden fields. - * - * @return void - */ - protected function render_hidden_fields() { - wp_nonce_field( 'yoast_free_metabox', 'yoast_free_metabox_nonce' ); - - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in class. - echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'general' ); - - if ( $this->is_advanced_metadata_enabled ) { - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in class. - echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'advanced' ); - } - - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in class. - echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'schema', $this->get_metabox_post()->post_type ); - - if ( $this->social_is_enabled ) { - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in class. - echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'social' ); - } - - /** - * Filter: 'wpseo_content_meta_section_content' - Allow filtering the metabox content before outputting. - * - * @param string $post_content The metabox content string. - */ - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output should be escaped in the filter. - echo apply_filters( 'wpseo_content_meta_section_content', '' ); - } - - /** - * Renders the metabox tabs. - * - * @return void - */ - protected function render_tabs() { - echo '
              '; - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $this->get_product_title() returns a hard-coded string. - printf( '
                ', $this->get_product_title() ); - - $tabs = $this->get_tabs(); - - foreach ( $tabs as $tab ) { - if ( $tab->name === 'premium' ) { - continue; - } - - $tab->display_link(); - } - - echo '
              '; - - foreach ( $tabs as $tab ) { - $tab->display_content(); - } - - echo '
              '; - } - - /** - * Returns the relevant metabox tabs for the current view. - * - * @return WPSEO_Metabox_Section[] - */ - private function get_tabs() { - $tabs = []; - - $label = __( 'SEO', 'wordpress-seo' ); - if ( $this->seo_analysis->is_enabled() ) { - $label = '' . $label; - } - $tabs[] = new WPSEO_Metabox_Section_React( 'content', $label ); - - if ( $this->readability_analysis->is_enabled() ) { - $tabs[] = new WPSEO_Metabox_Section_Readability(); - } - - if ( $this->inclusive_language_analysis->is_enabled() ) { - $tabs[] = new WPSEO_Metabox_Section_Inclusive_Language(); - } - - if ( $this->is_advanced_metadata_enabled ) { - $tabs[] = new WPSEO_Metabox_Section_React( - 'schema', - '' . __( 'Schema', 'wordpress-seo' ), - '' - ); - } - - if ( $this->social_is_enabled ) { - $tabs[] = new WPSEO_Metabox_Section_React( - 'social', - '' . __( 'Social', 'wordpress-seo' ), - '', - [ - 'html_after' => '
              ', - ] - ); - } - - $tabs = array_merge( $tabs, $this->get_additional_tabs() ); - - return $tabs; - } - - /** - * Returns the metabox tabs that have been added by other plugins. - * - * @return WPSEO_Metabox_Section_Additional[] - */ - protected function get_additional_tabs() { - $tabs = []; - - /** - * Private filter: 'yoast_free_additional_metabox_sections'. - * - * Meant for internal use only. Allows adding additional tabs to the Yoast SEO metabox. - * - * @since 11.9 - * - * @param array[] $tabs { - * An array of arrays with tab specifications. - * - * @type array $tab { - * A tab specification. - * - * @type string $name The name of the tab. Used in the HTML IDs, href and aria properties. - * @type string $link_content The content of the tab link. - * @type string $content The content of the tab. - * @type array $options { - * Optional. Extra options. - * - * @type string $link_class Optional. The class for the tab link. - * @type string $link_aria_label Optional. The aria label of the tab link. - * } - * } - * } - */ - $requested_tabs = apply_filters( 'yoast_free_additional_metabox_sections', [] ); - - foreach ( $requested_tabs as $tab ) { - if ( is_array( $tab ) && array_key_exists( 'name', $tab ) && array_key_exists( 'link_content', $tab ) && array_key_exists( 'content', $tab ) ) { - $options = array_key_exists( 'options', $tab ) ? $tab['options'] : []; - $tabs[] = new WPSEO_Metabox_Section_Additional( - $tab['name'], - $tab['link_content'], - $tab['content'], - $options - ); - } - } - - return $tabs; - } - - /** - * Adds a line in the meta box. - * - * @todo [JRF] Check if $class is added appropriately everywhere. - * - * @param string[] $meta_field_def Contains the vars based on which output is generated. - * @param string $key Internal key (without prefix). - * - * @return string - */ - public function do_meta_box( $meta_field_def, $key = '' ) { - $content = ''; - $esc_form_key = esc_attr( WPSEO_Meta::$form_prefix . $key ); - $meta_value = WPSEO_Meta::get_value( $key, $this->get_metabox_post()->ID ); - - $class = ''; - if ( isset( $meta_field_def['class'] ) && $meta_field_def['class'] !== '' ) { - $class = ' ' . $meta_field_def['class']; - } - - $placeholder = ''; - if ( isset( $meta_field_def['placeholder'] ) && $meta_field_def['placeholder'] !== '' ) { - $placeholder = $meta_field_def['placeholder']; - } - - $aria_describedby = ''; - $description = ''; - if ( isset( $meta_field_def['description'] ) ) { - $aria_describedby = ' aria-describedby="' . $esc_form_key . '-desc"'; - $description = '

              ' . $meta_field_def['description'] . '

              '; - } - - // Add a hide_on_pages option that returns nothing when the field is rendered on a page. - if ( isset( $meta_field_def['hide_on_pages'] ) && $meta_field_def['hide_on_pages'] && get_post_type() === 'page' ) { - return ''; - } - - switch ( $meta_field_def['type'] ) { - case 'text': - $ac = ''; - if ( isset( $meta_field_def['autocomplete'] ) && $meta_field_def['autocomplete'] === false ) { - $ac = 'autocomplete="off" '; - } - if ( $placeholder !== '' ) { - $placeholder = ' placeholder="' . esc_attr( $placeholder ) . '"'; - } - $content .= ''; - break; - - case 'url': - if ( $placeholder !== '' ) { - $placeholder = ' placeholder="' . esc_attr( $placeholder ) . '"'; - } - $content .= ''; - break; - - case 'textarea': - $rows = 3; - if ( isset( $meta_field_def['rows'] ) && $meta_field_def['rows'] > 0 ) { - $rows = $meta_field_def['rows']; - } - $content .= ''; - break; - - case 'hidden': - $default = ''; - if ( isset( $meta_field_def['default'] ) ) { - $default = sprintf( ' data-default="%s"', esc_attr( $meta_field_def['default'] ) ); - } - $content .= '' . "\n"; - break; - case 'select': - if ( isset( $meta_field_def['options'] ) && is_array( $meta_field_def['options'] ) && $meta_field_def['options'] !== [] ) { - $content .= ''; - } - break; - - case 'multiselect': - if ( isset( $meta_field_def['options'] ) && is_array( $meta_field_def['options'] ) && $meta_field_def['options'] !== [] ) { - - // Set $meta_value as $selected_arr. - $selected_arr = $meta_value; - - // If the multiselect field is 'meta-robots-adv' we should explode on ,. - if ( $key === 'meta-robots-adv' ) { - $selected_arr = explode( ',', $meta_value ); - } - - if ( ! is_array( $selected_arr ) ) { - $selected_arr = (array) $selected_arr; - } - - $options_count = count( $meta_field_def['options'] ); - - $content .= ''; - unset( $val, $option, $selected, $selected_arr, $options_count ); - } - break; - - case 'checkbox': - $checked = checked( $meta_value, 'on', false ); - $expl = ( isset( $meta_field_def['expl'] ) ) ? esc_html( $meta_field_def['expl'] ) : ''; - $content .= ' '; - unset( $checked, $expl ); - break; - - case 'radio': - if ( isset( $meta_field_def['options'] ) && is_array( $meta_field_def['options'] ) && $meta_field_def['options'] !== [] ) { - foreach ( $meta_field_def['options'] as $val => $option ) { - $checked = checked( $meta_value, $val, false ); - $content .= ' '; - } - unset( $val, $option, $checked ); - } - break; - - case 'upload': - $content .= ' '; - $content .= ' '; - $content .= ''; - break; - } - - $html = ''; - if ( $content === '' ) { - $content = apply_filters( 'wpseo_do_meta_box_field_' . $key, $content, $meta_value, $esc_form_key, $meta_field_def, $key ); - } - - if ( $content !== '' ) { - - $title = esc_html( $meta_field_def['title'] ); - - // By default, use the field title as a label element. - $label = ''; - - // Set the inline help and help panel, if any. - $help_button = ''; - $help_panel = ''; - if ( isset( $meta_field_def['help'] ) && $meta_field_def['help'] !== '' ) { - $help = new WPSEO_Admin_Help_Panel( $key, $meta_field_def['help-button'], $meta_field_def['help'] ); - $help_button = $help->get_button_html(); - $help_panel = $help->get_panel_html(); - } - - // If it's a set of radio buttons, output proper fieldset and legend. - if ( $meta_field_def['type'] === 'radio' ) { - return '
              ' . $title . '' . $help_button . $help_panel . $content . $description . '
              '; - } - - // If it's a single checkbox, ignore the title. - if ( $meta_field_def['type'] === 'checkbox' ) { - $label = ''; - } - - // Other meta box content or form fields. - if ( $meta_field_def['type'] === 'hidden' ) { - $html = $content; - } - else { - $html = $label . $description . $help_button . $help_panel . $content; - } - } - - return $html; - } - - /** - * Saves the WP SEO metadata for posts. - * - * {@internal $_POST parameters are validated via sanitize_post_meta().}} - * - * @param int $post_id Post ID. - * - * @return bool|void Boolean false if invalid save post request. - */ - public function save_postdata( $post_id ) { - // Bail if this is a multisite installation and the site has been switched. - if ( is_multisite() && ms_is_switched() ) { - return false; - } - - if ( $post_id === null ) { - return false; - } - - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized in wp_verify_none. - if ( ! isset( $_POST['yoast_free_metabox_nonce'] ) || ! wp_verify_nonce( wp_unslash( $_POST['yoast_free_metabox_nonce'] ), 'yoast_free_metabox' ) ) { - return false; - } - - if ( wp_is_post_revision( $post_id ) ) { - $post_id = wp_is_post_revision( $post_id ); - } - - /** - * Determine we're not accidentally updating a different post. - * We can't use filter_input here as the ID isn't available at this point, other than in the $_POST data. - */ - if ( ! isset( $_POST['ID'] ) || $post_id !== (int) $_POST['ID'] ) { - return false; - } - - clean_post_cache( $post_id ); - $post = get_post( $post_id ); - - if ( ! is_object( $post ) ) { - // Non-existent post. - return false; - } - - do_action( 'wpseo_save_compare_data', $post ); - - $social_fields = []; - if ( $this->social_is_enabled ) { - $social_fields = WPSEO_Meta::get_meta_field_defs( 'social' ); - } - - $meta_boxes = apply_filters( 'wpseo_save_metaboxes', [] ); - $meta_boxes = array_merge( - $meta_boxes, - WPSEO_Meta::get_meta_field_defs( 'general', $post->post_type ), - WPSEO_Meta::get_meta_field_defs( 'advanced' ), - $social_fields, - WPSEO_Meta::get_meta_field_defs( 'schema', $post->post_type ) - ); - - foreach ( $meta_boxes as $key => $meta_box ) { - - // If analysis is disabled remove that analysis score value from the DB. - if ( $this->is_meta_value_disabled( $key ) ) { - WPSEO_Meta::delete( $key, $post_id ); - continue; - } - - $data = null; - $field_name = WPSEO_Meta::$form_prefix . $key; - - if ( $meta_box['type'] === 'checkbox' ) { - $data = isset( $_POST[ $field_name ] ) ? 'on' : 'off'; - } - else { - if ( isset( $_POST[ $field_name ] ) ) { - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We're preparing to do just that. - $data = wp_unslash( $_POST[ $field_name ] ); - - // For multi-select. - if ( is_array( $data ) ) { - $data = array_map( [ 'WPSEO_Utils', 'sanitize_text_field' ], $data ); - } - - if ( is_string( $data ) ) { - $data = ( $key !== 'canonical' ) ? WPSEO_Utils::sanitize_text_field( $data ) : WPSEO_Utils::sanitize_url( $data ); - } - } - - // Reset options when no entry is present with multiselect - only applies to `meta-robots-adv` currently. - if ( ! isset( $_POST[ $field_name ] ) && ( $meta_box['type'] === 'multiselect' ) ) { - $data = []; - } - } - - if ( $data !== null ) { - WPSEO_Meta::set_value( $key, $data, $post_id ); - } - } - - do_action( 'wpseo_saved_postdata' ); - } - - /** - * Determines if the given meta value key is disabled. - * - * @param string $key The key of the meta value. - * - * @return bool Whether the given meta value key is disabled. - */ - public function is_meta_value_disabled( $key ) { - if ( $key === 'linkdex' && ! $this->seo_analysis->is_enabled() ) { - return true; - } - - if ( $key === 'content_score' && ! $this->readability_analysis->is_enabled() ) { - return true; - } - - if ( $key === 'inclusive_language_score' && ! $this->inclusive_language_analysis->is_enabled() ) { - return true; - } - - return false; - } - - /** - * Enqueues all the needed JS and CSS. - * - * @todo [JRF => whomever] Create css/metabox-mp6.css file and add it to the below allowed colors array when done. - * - * @return void - */ - public function enqueue() { - global $pagenow; - - $asset_manager = new WPSEO_Admin_Asset_Manager(); - - $is_editor = self::is_post_overview( $pagenow ) || self::is_post_edit( $pagenow ); - - if ( self::is_post_overview( $pagenow ) ) { - $asset_manager->enqueue_style( 'edit-page' ); - $asset_manager->enqueue_script( 'edit-page' ); - - return; - } - - /* Filter 'wpseo_always_register_metaboxes_on_admin' documented in wpseo-main.php */ - if ( ( $is_editor === false && apply_filters( 'wpseo_always_register_metaboxes_on_admin', false ) === false ) || $this->display_metabox() === false ) { - return; - } - - $post_id = get_queried_object_id(); - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( empty( $post_id ) && isset( $_GET['post'] ) && is_string( $_GET['post'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - $post_id = sanitize_text_field( wp_unslash( $_GET['post'] ) ); - } - - if ( $post_id !== 0 ) { - // Enqueue files needed for upload functionality. - wp_enqueue_media( [ 'post' => $post_id ] ); - } - - $asset_manager->enqueue_style( 'metabox-css' ); - $asset_manager->enqueue_style( 'scoring' ); - $asset_manager->enqueue_style( 'monorepo' ); - $asset_manager->enqueue_style( 'ai-generator' ); - - $is_block_editor = WP_Screen::get()->is_block_editor(); - $post_edit_handle = 'post-edit'; - if ( ! $is_block_editor ) { - $post_edit_handle = 'post-edit-classic'; - } - $asset_manager->enqueue_script( $post_edit_handle ); - $asset_manager->enqueue_style( 'admin-css' ); - - /** - * Removes the emoji script as it is incompatible with both React and any - * contenteditable fields. - */ - remove_action( 'admin_print_scripts', 'print_emoji_detection_script' ); - - $asset_manager->localize_script( $post_edit_handle, 'wpseoAdminL10n', WPSEO_Utils::get_admin_l10n() ); - - $plugins_script_data = [ - 'replaceVars' => [ - 'no_parent_text' => __( '(no parent)', 'wordpress-seo' ), - 'replace_vars' => $this->get_replace_vars(), - 'hidden_replace_vars' => $this->get_hidden_replace_vars(), - 'recommended_replace_vars' => $this->get_recommended_replace_vars(), - 'scope' => $this->determine_scope(), - 'has_taxonomies' => $this->current_post_type_has_taxonomies(), - ], - 'shortcodes' => [ - 'wpseo_shortcode_tags' => $this->get_valid_shortcode_tags(), - 'wpseo_filter_shortcodes_nonce' => wp_create_nonce( 'wpseo-filter-shortcodes' ), - ], - ]; - - $worker_script_data = [ - 'url' => YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-analysis-worker' ), - 'dependencies' => YoastSEO()->helpers->asset->get_dependency_urls_by_handle( 'yoast-seo-analysis-worker' ), - 'keywords_assessment_url' => YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-used-keywords-assessment' ), - 'log_level' => WPSEO_Utils::get_analysis_worker_log_level(), - ]; - - $alert_dismissal_action = YoastSEO()->classes->get( Alert_Dismissal_Action::class ); - $dismissed_alerts = $alert_dismissal_action->all_dismissed(); - $woocommerce_conditional = new WooCommerce_Conditional(); - $woocommerce_active = $woocommerce_conditional->is_met(); - $wpseo_plugin_availability_checker = new WPSEO_Plugin_Availability(); - $woocommerce_seo_file = 'wpseo-woocommerce/wpseo-woocommerce.php'; - $woocommerce_seo_active = $wpseo_plugin_availability_checker->is_active( $woocommerce_seo_file ); - - $script_data = [ - // @todo replace this translation with JavaScript translations. - 'media' => [ 'choose_image' => __( 'Use Image', 'wordpress-seo' ) ], - 'metabox' => $this->get_metabox_script_data(), - 'userLanguageCode' => WPSEO_Language_Utils::get_language( get_user_locale() ), - 'isPost' => true, - 'isBlockEditor' => $is_block_editor, - 'postId' => $post_id, - 'postStatus' => get_post_status( $post_id ), - 'postType' => get_post_type( $post_id ), - 'usedKeywordsNonce' => wp_create_nonce( 'wpseo-keyword-usage-and-post-types' ), - 'analysis' => [ - 'plugins' => $plugins_script_data, - 'worker' => $worker_script_data, - ], - 'dismissedAlerts' => $dismissed_alerts, - 'currentPromotions' => YoastSEO()->classes->get( Promotion_Manager::class )->get_current_promotions(), - 'webinarIntroBlockEditorUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/webinar-intro-block-editor' ), - 'blackFridayBlockEditorUrl' => ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-checklist' ) ) ? WPSEO_Shortlinker::get( 'https://yoa.st/black-friday-checklist' ) : '', - 'isJetpackBoostActive' => ( $is_block_editor ) ? YoastSEO()->classes->get( Jetpack_Boost_Active_Conditional::class )->is_met() : false, - 'isJetpackBoostNotPremium' => ( $is_block_editor ) ? YoastSEO()->classes->get( Jetpack_Boost_Not_Premium_Conditional::class )->is_met() : false, - 'isWooCommerceSeoActive' => $woocommerce_seo_active, - 'isWooCommerceActive' => $woocommerce_active, - 'woocommerceUpsell' => get_post_type( $post_id ) === 'product' && ! $woocommerce_seo_active && $woocommerce_active, - 'linkParams' => WPSEO_Shortlinker::get_query_params(), - 'pluginUrl' => plugins_url( '', WPSEO_FILE ), - 'wistiaEmbedPermission' => YoastSEO()->classes->get( Wistia_Embed_Permission_Repository::class )->get_value_for_user( get_current_user_id() ), - ]; - - if ( post_type_supports( get_post_type(), 'thumbnail' ) ) { - $asset_manager->enqueue_style( 'featured-image' ); - - // @todo replace this translation with JavaScript translations. - $script_data['featuredImage'] = [ - 'featured_image_notice' => __( 'SEO issue: The featured image should be at least 200 by 200 pixels to be picked up by Facebook and other social media sites.', 'wordpress-seo' ), - ]; - } - - $asset_manager->localize_script( $post_edit_handle, 'wpseoScriptData', $script_data ); - $asset_manager->enqueue_user_language_script(); - } - - /** - * Returns post in metabox context. - * - * @return WP_Post|array - */ - protected function get_metabox_post() { - if ( $this->post !== null ) { - return $this->post; - } - - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['post'] ) && is_string( $_GET['post'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, Sanitization happens in the validate_int function. - $post_id = (int) WPSEO_Utils::validate_int( wp_unslash( $_GET['post'] ) ); - - $this->post = get_post( $post_id ); - - return $this->post; - } - - if ( isset( $GLOBALS['post'] ) ) { - $this->post = $GLOBALS['post']; - - return $this->post; - } - - return []; - } - - /** - * Returns an array with shortcode tags for all registered shortcodes. - * - * @return string[] - */ - private function get_valid_shortcode_tags() { - $shortcode_tags = []; - - foreach ( $GLOBALS['shortcode_tags'] as $tag => $description ) { - $shortcode_tags[] = $tag; - } - - return $shortcode_tags; - } - - /** - * Prepares the replace vars for localization. - * - * @return string[] Replace vars. - */ - private function get_replace_vars() { - $cached_replacement_vars = []; - - $vars_to_cache = [ - 'date', - 'id', - 'sitename', - 'sitedesc', - 'sep', - 'page', - 'currentdate', - 'currentyear', - 'currentmonth', - 'currentday', - 'post_year', - 'post_month', - 'post_day', - 'name', - 'author_first_name', - 'author_last_name', - 'permalink', - 'post_content', - 'category_title', - 'tag', - 'category', - ]; - - foreach ( $vars_to_cache as $var ) { - $cached_replacement_vars[ $var ] = wpseo_replace_vars( '%%' . $var . '%%', $this->get_metabox_post() ); - } - - // Merge custom replace variables with the WordPress ones. - return array_merge( $cached_replacement_vars, $this->get_custom_replace_vars( $this->get_metabox_post() ) ); - } - - /** - * Returns the list of replace vars that should be hidden inside the editor. - * - * @return string[] The hidden replace vars. - */ - protected function get_hidden_replace_vars() { - return ( new WPSEO_Replace_Vars() )->get_hidden_replace_vars(); - } - - /** - * Prepares the recommended replace vars for localization. - * - * @return array Recommended replacement variables. - */ - private function get_recommended_replace_vars() { - $recommended_replace_vars = new WPSEO_Admin_Recommended_Replace_Vars(); - - // What is recommended depends on the current context. - $post_type = $recommended_replace_vars->determine_for_post( $this->get_metabox_post() ); - - return $recommended_replace_vars->get_recommended_replacevars_for( $post_type ); - } - - /** - * Gets the custom replace variables for custom taxonomies and fields. - * - * @param WP_Post $post The post to check for custom taxonomies and fields. - * - * @return array Array containing all the replacement variables. - */ - private function get_custom_replace_vars( $post ) { - return [ - 'custom_fields' => $this->get_custom_fields_replace_vars( $post ), - 'custom_taxonomies' => $this->get_custom_taxonomies_replace_vars( $post ), - ]; - } - - /** - * Gets the custom replace variables for custom taxonomies. - * - * @param WP_Post $post The post to check for custom taxonomies. - * - * @return array Array containing all the replacement variables. - */ - private function get_custom_taxonomies_replace_vars( $post ) { - $taxonomies = get_object_taxonomies( $post, 'objects' ); - $custom_replace_vars = []; - - foreach ( $taxonomies as $taxonomy_name => $taxonomy ) { - - if ( is_string( $taxonomy ) ) { // If attachment, see https://core.trac.wordpress.org/ticket/37368 . - $taxonomy_name = $taxonomy; - $taxonomy = get_taxonomy( $taxonomy_name ); - } - - if ( $taxonomy->_builtin && $taxonomy->public ) { - continue; - } - - $custom_replace_vars[ $taxonomy_name ] = [ - 'name' => $taxonomy->name, - 'description' => $taxonomy->description, - ]; - } - - return $custom_replace_vars; - } - - /** - * Gets the custom replace variables for custom fields. - * - * @param WP_Post $post The post to check for custom fields. - * - * @return array Array containing all the replacement variables. - */ - private function get_custom_fields_replace_vars( $post ) { - $custom_replace_vars = []; - - // If no post object is passed, return the empty custom_replace_vars array. - if ( ! is_object( $post ) ) { - return $custom_replace_vars; - } - - $custom_fields = get_post_custom( $post->ID ); - - // If $custom_fields is an empty string or generally not an array, return early. - if ( ! is_array( $custom_fields ) ) { - return $custom_replace_vars; - } - - $meta = YoastSEO()->meta->for_post( $post->ID ); - - if ( ! $meta ) { - return $custom_replace_vars; - } - - // Simply concatenate all fields containing replace vars so we can handle them all with a single regex find. - $replace_vars_fields = implode( - ' ', - [ - $meta->presentation->title, - $meta->presentation->meta_description, - ] - ); - - preg_match_all( '/%%cf_([A-Za-z0-9_]+)%%/', $replace_vars_fields, $matches ); - $fields_to_include = $matches[1]; - foreach ( $custom_fields as $custom_field_name => $custom_field ) { - // Skip private custom fields. - if ( substr( $custom_field_name, 0, 1 ) === '_' ) { - continue; - } - - // Skip custom fields that are not used, new ones will be fetched dynamically. - if ( ! in_array( $custom_field_name, $fields_to_include, true ) ) { - continue; - } - - // Skip custom field values that are serialized. - if ( is_serialized( $custom_field[0] ) ) { - continue; - } - - $custom_replace_vars[ $custom_field_name ] = $custom_field[0]; - } - - return $custom_replace_vars; - } - - /** - * Checks if the page is the post overview page. - * - * @param string $page The page to check for the post overview page. - * - * @return bool Whether or not the given page is the post overview page. - */ - public static function is_post_overview( $page ) { - return $page === 'edit.php'; - } - - /** - * Checks if the page is the post edit page. - * - * @param string $page The page to check for the post edit page. - * - * @return bool Whether or not the given page is the post edit page. - */ - public static function is_post_edit( $page ) { - return $page === 'post.php' - || $page === 'post-new.php'; - } - - /** - * Retrieves the product title. - * - * @return string The product title. - */ - protected function get_product_title() { - return YoastSEO()->helpers->product->get_product_name(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-analysis.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-analysis.php deleted file mode 100644 index 756ca97d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-analysis.php +++ /dev/null @@ -1,33 +0,0 @@ -get_listener_value() !== $this->notification_identifier ) { - return; - } - - $this->dismiss(); - } - - /** - * Adds the notification if applicable, otherwise removes it. - * - * @param Yoast_Notification_Center $notification_center The notification center object. - * - * @return void - */ - public function handle( Yoast_Notification_Center $notification_center ) { - if ( $this->is_applicable() ) { - $notification = $this->get_notification(); - $notification_center->add_notification( $notification ); - - return; - } - - $notification_center->remove_notification_by_id( 'wpseo-' . $this->notification_identifier ); - } - - /** - * Listens to an argument in the request URL and triggers an action. - * - * @return void - */ - protected function dismiss() { - $this->set_dismissal_state(); - $this->redirect_to_dashboard(); - } - - /** - * Checks if a notice is applicable. - * - * @return bool Whether a notice should be shown or not. - */ - protected function is_applicable() { - return $this->is_notice_dismissed() === false; - } - - /** - * Checks whether the notification has been dismissed. - * - * @codeCoverageIgnore - * - * @return bool True when notification is dismissed. - */ - protected function is_notice_dismissed() { - return get_user_meta( get_current_user_id(), 'wpseo-remove-' . $this->notification_identifier, true ) === '1'; - } - - /** - * Retrieves the value where listener is listening for. - * - * @codeCoverageIgnore - * - * @return string|null The listener value or null if not set. - */ - protected function get_listener_value() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: Normally we would need to check for a nonce here but this class is not used anymore. - if ( isset( $_GET['yoast_dismiss'] ) && is_string( $_GET['yoast_dismiss'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: Normally we would need to check for a nonce here but this class is not used anymore. - return sanitize_text_field( wp_unslash( $_GET['yoast_dismiss'] ) ); - } - return null; - } - - /** - * Dismisses the notification. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function set_dismissal_state() { - update_user_meta( get_current_user_id(), 'wpseo-remove-' . $this->notification_identifier, true ); - } - - /** - * Redirects the user back to the dashboard. - * - * @codeCoverageIgnore - * - * @return void - */ - protected function redirect_to_dashboard() { - wp_safe_redirect( admin_url( 'admin.php?page=wpseo_dashboard' ) ); - exit; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/notifiers/interface-notification-handler.php b/wp/wp-content/plugins/wordpress-seo/admin/notifiers/interface-notification-handler.php deleted file mode 100644 index f798a586..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/notifiers/interface-notification-handler.php +++ /dev/null @@ -1,21 +0,0 @@ -admin_header( true, 'wpseo' ); - -do_action( 'wpseo_all_admin_notices' ); - -$dashboard_tabs = new WPSEO_Option_Tabs( 'dashboard' ); -$dashboard_tabs->add_tab( - new WPSEO_Option_Tab( - 'dashboard', - __( 'Dashboard', 'wordpress-seo' ), - [ - 'save_button' => false, - ] - ) -); - -/** - * Allows the addition of tabs to the dashboard by calling $dashboard_tabs->add_tab(). - */ -do_action( 'wpseo_settings_tabs_dashboard', $dashboard_tabs ); - -$dashboard_tabs->display( $yform ); - -do_action( 'wpseo_dashboard' ); - -$yform->admin_footer(); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/pages/licenses.php b/wp/wp-content/plugins/wordpress-seo/admin/pages/licenses.php deleted file mode 100644 index fb713cdc..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/pages/licenses.php +++ /dev/null @@ -1,15 +0,0 @@ -admin_header( true, 'wpseo_ms' ); - -$network_tabs = new WPSEO_Option_Tabs( 'network' ); -$network_tabs->add_tab( new WPSEO_Option_Tab( 'general', __( 'General', 'wordpress-seo' ) ) ); -$network_tabs->add_tab( new WPSEO_Option_Tab( 'features', __( 'Features', 'wordpress-seo' ) ) ); -$network_tabs->add_tab( new WPSEO_Option_Tab( 'integrations', __( 'Integrations', 'wordpress-seo' ) ) ); - -$network_tabs->add_tab( - new WPSEO_Option_Tab( - 'crawl-settings', - __( 'Crawl settings', 'wordpress-seo' ), - [ - 'save_button' => true, - ] - ) -); -$network_tabs->add_tab( new WPSEO_Option_Tab( 'restore-site', __( 'Restore Site', 'wordpress-seo' ), [ 'save_button' => false ] ) ); -$network_tabs->display( $yform ); - -$yform->admin_footer(); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/pages/redirects.php b/wp/wp-content/plugins/wordpress-seo/admin/pages/redirects.php deleted file mode 100644 index 52acbc33..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/pages/redirects.php +++ /dev/null @@ -1,15 +0,0 @@ -admin_header( false ); - -if ( $tool_page === '' ) { - - $tools = []; - - $tools['import-export'] = [ - 'title' => __( 'Import and Export', 'wordpress-seo' ), - 'desc' => __( 'Import settings from other SEO plugins and export your settings for re-use on (another) site.', 'wordpress-seo' ), - ]; - - if ( WPSEO_Utils::allow_system_file_edit() === true && ! is_multisite() ) { - $tools['file-editor'] = [ - 'title' => __( 'File editor', 'wordpress-seo' ), - 'desc' => __( 'This tool allows you to quickly change important files for your SEO, like your robots.txt and, if you have one, your .htaccess file.', 'wordpress-seo' ), - ]; - } - - $tools['bulk-editor'] = [ - 'title' => __( 'Bulk editor', 'wordpress-seo' ), - 'desc' => __( 'This tool allows you to quickly change titles and descriptions of your posts and pages without having to go into the editor for each page.', 'wordpress-seo' ), - ]; - - echo '

              '; - printf( - /* translators: %1$s expands to Yoast SEO */ - esc_html__( '%1$s comes with some very powerful built-in tools:', 'wordpress-seo' ), - 'Yoast SEO' - ); - echo '

              '; - - echo '
                '; - - $admin_url = admin_url( 'admin.php?page=wpseo_tools' ); - - foreach ( $tools as $slug => $tool ) { - $href = ( ! empty( $tool['href'] ) ) ? $admin_url . $tool['href'] : add_query_arg( [ 'tool' => $slug ], $admin_url ); - $attr = ( ! empty( $tool['attr'] ) ) ? $tool['attr'] : ''; - - echo '
              • '; - echo '', esc_html( $tool['title'] ), '
                '; - echo esc_html( $tool['desc'] ); - echo '
              • '; - } - - /** - * WARNING: This hook is intended for internal use only. - * Don't use it in your code as it will be removed shortly. - */ - do_action( 'wpseo_tools_overview_list_items_internal' ); - - echo '
              '; -} -else { - echo '', esc_html__( '« Back to Tools page', 'wordpress-seo' ), ''; - - $tool_pages = [ 'bulk-editor', 'import-export' ]; - - if ( WPSEO_Utils::allow_system_file_edit() === true && ! is_multisite() ) { - $tool_pages[] = 'file-editor'; - } - - if ( in_array( $tool_page, $tool_pages, true ) ) { - require_once WPSEO_PATH . 'admin/views/tool-' . $tool_page . '.php'; - } -} - -$yform->admin_footer( false ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/roles/class-abstract-role-manager.php b/wp/wp-content/plugins/wordpress-seo/admin/roles/class-abstract-role-manager.php deleted file mode 100644 index 39edad49..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/roles/class-abstract-role-manager.php +++ /dev/null @@ -1,149 +0,0 @@ -roles[ $role ] = (object) [ - 'display_name' => $display_name, - 'template' => $template, - ]; - } - - /** - * Returns the list of registered roles. - * - * @return string[] List or registered roles. - */ - public function get_roles() { - return array_keys( $this->roles ); - } - - /** - * Adds the registered roles. - * - * @return void - */ - public function add() { - foreach ( $this->roles as $role => $data ) { - $capabilities = $this->get_capabilities( $data->template ); - $capabilities = $this->filter_existing_capabilties( $role, $capabilities ); - - $this->add_role( $role, $data->display_name, $capabilities ); - } - } - - /** - * Removes the registered roles. - * - * @return void - */ - public function remove() { - $roles = array_keys( $this->roles ); - array_map( [ $this, 'remove_role' ], $roles ); - } - - /** - * Returns the capabilities for the specified role. - * - * @param string $role Role to fetch capabilities from. - * - * @return array List of capabilities. - */ - protected function get_capabilities( $role ) { - if ( ! is_string( $role ) || empty( $role ) ) { - return []; - } - - $wp_role = get_role( $role ); - if ( ! $wp_role ) { - return []; - } - - return $wp_role->capabilities; - } - - /** - * Returns true if the capability exists on the role. - * - * @param WP_Role $role Role to check capability against. - * @param string $capability Capability to check. - * - * @return bool True if the capability is defined for the role. - */ - protected function capability_exists( WP_Role $role, $capability ) { - return ! array_key_exists( $capability, $role->capabilities ); - } - - /** - * Filters out capabilities that are already set for the role. - * - * This makes sure we don't override configurations that have been previously set. - * - * @param string $role The role to check against. - * @param array $capabilities The capabilities that should be set. - * - * @return array Capabilties that can be safely set. - */ - protected function filter_existing_capabilties( $role, array $capabilities ) { - if ( $capabilities === [] ) { - return $capabilities; - } - - $wp_role = get_role( $role ); - if ( ! $wp_role ) { - return $capabilities; - } - - foreach ( $capabilities as $capability => $grant ) { - if ( $this->capability_exists( $wp_role, $capability ) ) { - unset( $capabilities[ $capability ] ); - } - } - - return $capabilities; - } - - /** - * Adds a role to the system. - * - * @param string $role Role to add. - * @param string $display_name Name to display for the role. - * @param array $capabilities Capabilities to add to the role. - * - * @return void - */ - abstract protected function add_role( $role, $display_name, array $capabilities = [] ); - - /** - * Removes a role from the system. - * - * @param string $role Role to remove. - * - * @return void - */ - abstract protected function remove_role( $role ); -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/roles/class-register-roles.php b/wp/wp-content/plugins/wordpress-seo/admin/roles/class-register-roles.php deleted file mode 100644 index 9636237e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/roles/class-register-roles.php +++ /dev/null @@ -1,33 +0,0 @@ -register( 'wpseo_manager', 'SEO Manager', 'editor' ); - $role_manager->register( 'wpseo_editor', 'SEO Editor', 'editor' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/roles/class-role-manager-factory.php b/wp/wp-content/plugins/wordpress-seo/admin/roles/class-role-manager-factory.php deleted file mode 100644 index d22753a2..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/roles/class-role-manager-factory.php +++ /dev/null @@ -1,27 +0,0 @@ - $grant ) { - $wp_role->add_cap( $capability, $grant ); - } - - return; - } - - add_role( $role, $display_name, $capabilities ); - } - - /** - * Removes a role from the system. - * - * @param string $role Role to remove. - * - * @return void - */ - protected function remove_role( $role ) { - remove_role( $role ); - } - - /** - * Formats the capabilities to the required format. - * - * @param array $capabilities Capabilities to format. - * @param bool $enabled Whether these capabilities should be enabled or not. - * - * @return array Formatted capabilities. - */ - protected function format_capabilities( array $capabilities, $enabled = true ) { - // Flip keys and values. - $capabilities = array_flip( $capabilities ); - - // Set all values to $enabled. - return array_fill_keys( array_keys( $capabilities ), $enabled ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/roles/class-role-manager.php b/wp/wp-content/plugins/wordpress-seo/admin/roles/class-role-manager.php deleted file mode 100644 index 7f9d82bb..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/roles/class-role-manager.php +++ /dev/null @@ -1,44 +0,0 @@ -get_file_url( $request ); - - return new WP_REST_Response( - [ - 'type' => 'success', - 'size_in_bytes' => $this->get_file_size( $file_url ), - ], - 200 - ); - } - catch ( WPSEO_File_Size_Exception $exception ) { - return new WP_REST_Response( - [ - 'type' => 'failure', - 'response' => $exception->getMessage(), - ], - 404 - ); - } - } - - /** - * Retrieves the file url. - * - * @param WP_REST_Request $request The request to retrieve file url from. - * - * @return string The file url. - * @throws WPSEO_File_Size_Exception The file is hosted externally. - */ - protected function get_file_url( WP_REST_Request $request ) { - $file_url = rawurldecode( $request->get_param( 'url' ) ); - - if ( ! $this->is_externally_hosted( $file_url ) ) { - return $file_url; - } - - throw WPSEO_File_Size_Exception::externally_hosted( $file_url ); - } - - /** - * Checks if the file is hosted externally. - * - * @param string $file_url The file url. - * - * @return bool True if it is hosted externally. - */ - protected function is_externally_hosted( $file_url ) { - return wp_parse_url( home_url(), PHP_URL_HOST ) !== wp_parse_url( $file_url, PHP_URL_HOST ); - } - - /** - * Returns the file size. - * - * @param string $file_url The file url to get the size for. - * - * @return int The file size. - * @throws WPSEO_File_Size_Exception Retrieval of file size went wrong for unknown reasons. - */ - protected function get_file_size( $file_url ) { - $file_config = wp_upload_dir(); - $file_url = str_replace( $file_config['baseurl'], '', $file_url ); - $file_size = $this->calculate_file_size( $file_url ); - - if ( ! $file_size ) { - throw WPSEO_File_Size_Exception::unknown_error( $file_url ); - } - - return $file_size; - } - - /** - * Calculates the file size using the Utils class. - * - * @param string $file_url The file to retrieve the size for. - * - * @return int|bool The file size or False if it could not be retrieved. - */ - protected function calculate_file_size( $file_url ) { - return WPSEO_Image_Utils::get_file_size( - [ - 'path' => $file_url, - ] - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/statistics/class-statistics-integration.php b/wp/wp-content/plugins/wordpress-seo/admin/statistics/class-statistics-integration.php deleted file mode 100644 index 756f314c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/statistics/class-statistics-integration.php +++ /dev/null @@ -1,36 +0,0 @@ -statistics = $statistics; - } - - /** - * Fetches statistics by REST request. - * - * @return WP_REST_Response The response object. - */ - public function get_statistics() { - // Switch to the user locale with fallback to the site locale. - switch_to_locale( get_user_locale() ); - - $this->labels = $this->labels(); - $statistics = $this->statistic_items(); - - $data = [ - 'header' => $this->get_header_from_statistics( $statistics ), - 'seo_scores' => $statistics['scores'], - ]; - - return new WP_REST_Response( $data ); - } - - /** - * Gets a header summarizing the given statistics results. - * - * @param array $statistics The statistics results. - * - * @return string The header summing up the statistics results. - */ - private function get_header_from_statistics( array $statistics ) { - // Personal interpretation to allow release, should be looked at later. - if ( $statistics['division'] === false ) { - return __( 'You don\'t have any published posts, your SEO scores will appear here once you make your first post!', 'wordpress-seo' ); - } - - if ( $statistics['division']['good'] > 0.66 ) { - return __( 'Hey, your SEO is doing pretty well! Check out the stats:', 'wordpress-seo' ); - } - - return __( 'Below are your published posts\' SEO scores. Now is as good a time as any to start improving some of your posts!', 'wordpress-seo' ); - } - - /** - * An array representing items to be added to the At a Glance dashboard widget. - * - * @return array The statistics for the current user. - */ - private function statistic_items() { - $transient = $this->get_transient(); - $user_id = get_current_user_id(); - - if ( isset( $transient[ $user_id ] ) ) { - return $transient[ $user_id ]; - } - - return $this->set_statistic_items_for_user( $transient, $user_id ); - } - - /** - * Gets the statistics transient value. Returns array if transient wasn't set. - * - * @return array|mixed Returns the transient or an empty array if the transient doesn't exist. - */ - private function get_transient() { - $transient = get_transient( self::CACHE_TRANSIENT_KEY ); - - if ( $transient === false ) { - return []; - } - - return $transient; - } - - /** - * Set the statistics transient cache for a specific user. - * - * @param array $transient The current stored transient with the cached data. - * @param int $user The user's ID to assign the retrieved values to. - * - * @return array The statistics transient for the user. - */ - private function set_statistic_items_for_user( $transient, $user ) { - $scores = $this->get_seo_scores_with_post_count(); - $division = $this->get_seo_score_division( $scores ); - - $transient[ $user ] = [ - // Use array_values because array_filter may return non-zero indexed arrays. - 'scores' => array_values( array_filter( $scores, [ $this, 'filter_items' ] ) ), - 'division' => $division, - ]; - - set_transient( self::CACHE_TRANSIENT_KEY, $transient, DAY_IN_SECONDS ); - - return $transient[ $user ]; - } - - /** - * Gets the division of SEO scores. - * - * @param array $scores The SEO scores. - * - * @return array|bool The division of SEO scores, false if there are no posts. - */ - private function get_seo_score_division( array $scores ) { - $total = 0; - $division = []; - - foreach ( $scores as $score ) { - $total += $score['count']; - } - - if ( $total === 0 ) { - return false; - } - - foreach ( $scores as $score ) { - $division[ $score['seo_rank'] ] = ( $score['count'] / $total ); - } - - return $division; - } - - /** - * Get all SEO ranks and data associated with them. - * - * @return array An array of SEO scores and associated data. - */ - private function get_seo_scores_with_post_count() { - $ranks = WPSEO_Rank::get_all_ranks(); - - return array_map( [ $this, 'map_rank_to_widget' ], $ranks ); - } - - /** - * Converts a rank to data usable in the dashboard widget. - * - * @param WPSEO_Rank $rank The rank to map. - * - * @return array The mapped rank. - */ - private function map_rank_to_widget( WPSEO_Rank $rank ) { - return [ - 'seo_rank' => $rank->get_rank(), - 'label' => $this->get_label_for_rank( $rank ), - 'count' => $this->statistics->get_post_count( $rank ), - 'link' => $this->get_link_for_rank( $rank ), - ]; - } - - /** - * Returns a dashboard widget label to use for a certain rank. - * - * @param WPSEO_Rank $rank The rank to return a label for. - * - * @return string The label for the rank. - */ - private function get_label_for_rank( WPSEO_Rank $rank ) { - return $this->labels[ $rank->get_rank() ]; - } - - /** - * Determines the labels for the various scoring ranks that are known within Yoast SEO. - * - * @return array Array containing the translatable labels. - */ - private function labels() { - return [ - WPSEO_Rank::NO_FOCUS => sprintf( - /* translators: %1$s expands to an opening strong tag, %2$s expands to a closing strong tag */ - __( 'Posts %1$swithout%2$s a focus keyphrase', 'wordpress-seo' ), - '', - '' - ), - WPSEO_Rank::BAD => sprintf( - /* translators: %s expands to the score */ - __( 'Posts with the SEO score: %s', 'wordpress-seo' ), - '' . __( 'Needs improvement', 'wordpress-seo' ) . '' - ), - WPSEO_Rank::OK => sprintf( - /* translators: %s expands to the score */ - __( 'Posts with the SEO score: %s', 'wordpress-seo' ), - '' . __( 'OK', 'wordpress-seo' ) . '' - ), - WPSEO_Rank::GOOD => sprintf( - /* translators: %s expands to the score */ - __( 'Posts with the SEO score: %s', 'wordpress-seo' ), - '' . __( 'Good', 'wordpress-seo' ) . '' - ), - WPSEO_Rank::NO_INDEX => __( 'Posts that should not show up in search results', 'wordpress-seo' ), - ]; - } - - /** - * Filter items if they have a count of zero. - * - * @param array $item The item to potentially filter out. - * - * @return bool Whether or not the count is zero. - */ - private function filter_items( $item ) { - return $item['count'] !== 0; - } - - /** - * Returns a link for the overview of posts of a certain rank. - * - * @param WPSEO_Rank $rank The rank to return a link for. - * - * @return string The link that shows an overview of posts with that rank. - */ - private function get_link_for_rank( WPSEO_Rank $rank ) { - if ( current_user_can( 'edit_others_posts' ) === false ) { - return esc_url( admin_url( 'edit.php?post_status=publish&post_type=post&seo_filter=' . $rank->get_rank() . '&author=' . get_current_user_id() ) ); - } - - return esc_url( admin_url( 'edit.php?post_status=publish&post_type=post&seo_filter=' . $rank->get_rank() ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-columns.php b/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-columns.php deleted file mode 100644 index fda2f19c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-columns.php +++ /dev/null @@ -1,231 +0,0 @@ -taxonomy = $this->get_taxonomy(); - - if ( ! empty( $this->taxonomy ) ) { - add_filter( 'manage_edit-' . $this->taxonomy . '_columns', [ $this, 'add_columns' ] ); - add_filter( 'manage_' . $this->taxonomy . '_custom_column', [ $this, 'parse_column' ], 10, 3 ); - } - - $this->analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - $this->analysis_readability = new WPSEO_Metabox_Analysis_Readability(); - $this->indexable_repository = YoastSEO()->classes->get( Indexable_Repository::class ); - $this->score_icon_helper = YoastSEO()->helpers->score_icon; - } - - /** - * Adds an SEO score column to the terms table, right after the description column. - * - * @param array $columns Current set columns. - * - * @return array - */ - public function add_columns( array $columns ) { - if ( $this->display_metabox( $this->taxonomy ) === false ) { - return $columns; - } - - $new_columns = []; - - foreach ( $columns as $column_name => $column_value ) { - $new_columns[ $column_name ] = $column_value; - - if ( $column_name === 'description' && $this->analysis_seo->is_enabled() ) { - $new_columns['wpseo-score'] = '' - . __( 'SEO score', 'wordpress-seo' ) . ''; - } - - if ( $column_name === 'description' && $this->analysis_readability->is_enabled() ) { - $new_columns['wpseo-score-readability'] = '' - . __( 'Readability score', 'wordpress-seo' ) . ''; - } - } - - return $new_columns; - } - - /** - * Parses the column. - * - * @param string $content The current content of the column. - * @param string $column_name The name of the column. - * @param int $term_id ID of requested taxonomy. - * - * @return string - */ - public function parse_column( $content, $column_name, $term_id ) { - - switch ( $column_name ) { - case 'wpseo-score': - return $this->get_score_value( $term_id ); - - case 'wpseo-score-readability': - return $this->get_score_readability_value( $term_id ); - } - - return $content; - } - - /** - * Retrieves the taxonomy from the $_GET or $_POST variable. - * - * @return string|null The current taxonomy or null when it is not set. - */ - public function get_current_taxonomy() { - // phpcs:disable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( ! empty( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] === 'POST' ) { - if ( isset( $_POST['taxonomy'] ) && is_string( $_POST['taxonomy'] ) ) { - return sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) ); - } - } - elseif ( isset( $_GET['taxonomy'] ) && is_string( $_GET['taxonomy'] ) ) { - return sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ); - } - // phpcs:enable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended - return null; - } - - /** - * Returns the posted/get taxonomy value if it is set. - * - * @return string|null - */ - private function get_taxonomy() { - // phpcs:disable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( wp_doing_ajax() ) { - if ( isset( $_POST['taxonomy'] ) && is_string( $_POST['taxonomy'] ) ) { - return sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) ); - } - } - elseif ( isset( $_GET['taxonomy'] ) && is_string( $_GET['taxonomy'] ) ) { - return sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ); - } - // phpcs:enable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended - return null; - } - - /** - * Parses the value for the score column. - * - * @param int $term_id ID of requested term. - * - * @return string - */ - private function get_score_value( $term_id ) { - $indexable = $this->indexable_repository->find_by_id_and_type( (int) $term_id, 'term' ); - - return $this->score_icon_helper->for_seo( $indexable, '', __( 'Term is set to noindex.', 'wordpress-seo' ) ); - } - - /** - * Parses the value for the readability score column. - * - * @param int $term_id ID of the requested term. - * - * @return string The HTML for the readability score indicator. - */ - private function get_score_readability_value( $term_id ) { - $score = (int) WPSEO_Taxonomy_Meta::get_term_meta( $term_id, $this->taxonomy, 'content_score' ); - - return $this->score_icon_helper->for_readability( $score ); - } - - /** - * Check if the taxonomy is indexable. - * - * @param mixed $term The current term. - * - * @return bool Whether the term is indexable. - */ - private function is_indexable( $term ) { - // When the no_index value is not empty and not default, check if its value is index. - $no_index = WPSEO_Taxonomy_Meta::get_term_meta( $term->term_id, $this->taxonomy, 'noindex' ); - - // Check if the default for taxonomy is empty (this will be index). - if ( ! empty( $no_index ) && $no_index !== 'default' ) { - return ( $no_index === 'index' ); - } - - if ( is_object( $term ) ) { - $no_index_key = 'noindex-tax-' . $term->taxonomy; - - // If the option is false, this means we want to index it. - return WPSEO_Options::get( $no_index_key, false ) === false; - } - - return true; - } - - /** - * Wraps the WPSEO_Metabox check to determine whether the metabox should be displayed either by - * choice of the admin or because the taxonomy is not public. - * - * @since 7.0 - * - * @param string|null $taxonomy Optional. The taxonomy to test, defaults to the current taxonomy. - * - * @return bool Whether the meta box (and associated columns etc) should be hidden. - */ - private function display_metabox( $taxonomy = null ) { - $current_taxonomy = $this->get_current_taxonomy(); - - if ( ! isset( $taxonomy ) && ! empty( $current_taxonomy ) ) { - $taxonomy = $current_taxonomy; - } - - return WPSEO_Utils::is_metabox_active( $taxonomy, 'taxonomy' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields-presenter.php b/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields-presenter.php deleted file mode 100644 index 9ab28b0c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields-presenter.php +++ /dev/null @@ -1,221 +0,0 @@ -tax_meta = WPSEO_Taxonomy_Meta::get_term_meta( (int) $term->term_id, $term->taxonomy ); - } - - /** - * Displaying the form fields. - * - * @param array $fields Array with the fields that will be displayed. - * - * @return string - */ - public function html( array $fields ) { - $content = ''; - foreach ( $fields as $field_name => $field_configuration ) { - $content .= $this->form_row( 'wpseo_' . $field_name, $field_configuration ); - } - return $content; - } - - /** - * Create a row in the form table. - * - * @param string $field_name Variable the row controls. - * @param array $field_configuration Array with the field configuration. - * - * @return string - */ - private function form_row( $field_name, array $field_configuration ) { - $esc_field_name = esc_attr( $field_name ); - - $options = (array) $field_configuration['options']; - - if ( ! empty( $field_configuration['description'] ) ) { - $options['description'] = $field_configuration['description']; - } - - $label = $this->get_label( $field_configuration['label'], $esc_field_name ); - $field = $this->get_field( $field_configuration['type'], $esc_field_name, $this->get_field_value( $field_name ), $options ); - $help_content = ( $field_configuration['options']['help'] ?? '' ); - $help_button_text = ( $field_configuration['options']['help-button'] ?? '' ); - $help = new WPSEO_Admin_Help_Panel( $field_name, $help_button_text, $help_content ); - - return $this->parse_row( $label, $help, $field ); - } - - /** - * Generates the html for the given field config. - * - * @param string $field_type The fieldtype, e.g: text, checkbox, etc. - * @param string $field_name The name of the field. - * @param string $field_value The value of the field. - * @param array $options Array with additional options. - * - * @return string - */ - private function get_field( $field_type, $field_name, $field_value, array $options ) { - - $class = $this->get_class( $options ); - $field = ''; - $description = ''; - $aria_describedby = ''; - - if ( ! empty( $options['description'] ) ) { - $aria_describedby = ' aria-describedby="' . $field_name . '-desc"'; - $description = '

              ' . $options['description'] . '

              '; - } - - switch ( $field_type ) { - case 'div': - $field .= '
              '; - break; - case 'url': - $field .= ''; - break; - case 'text': - $field .= ''; - break; - case 'checkbox': - $field .= ''; - break; - case 'textarea': - $rows = 3; - if ( ! empty( $options['rows'] ) ) { - $rows = $options['rows']; - } - $field .= ''; - break; - case 'upload': - $field .= ' '; - $field .= ' '; - $field .= ''; - break; - case 'select': - if ( is_array( $options ) && $options !== [] ) { - $field .= ''; - } - break; - case 'hidden': - $field .= ''; - break; - } - - return $field . $description; - } - - /** - * Getting the value for given field_name. - * - * @param string $field_name The fieldname to get the value for. - * - * @return string - */ - private function get_field_value( $field_name ) { - if ( isset( $this->tax_meta[ $field_name ] ) && $this->tax_meta[ $field_name ] !== '' ) { - return $this->tax_meta[ $field_name ]; - } - - return ''; - } - - /** - * Getting the class attributes if $options contains a class key. - * - * @param array $options The array with field options. - * - * @return string - */ - private function get_class( array $options ) { - if ( ! empty( $options['class'] ) ) { - return ' class="' . esc_attr( $options['class'] ) . '"'; - } - - return ''; - } - - /** - * Getting the label HTML. - * - * @param string $label The label value. - * @param string $field_name The target field. - * - * @return string - */ - private function get_label( $label, $field_name ) { - if ( $label !== '' ) { - return ''; - } - - return ''; - } - - /** - * Returns the HTML for the row which contains label, help and the field. - * - * @param string $label The html for the label if there was a label set. - * @param WPSEO_Admin_Help_Panel $help The help panel to render in this row. - * @param string $field The html for the field. - * - * @return string - */ - private function parse_row( $label, WPSEO_Admin_Help_Panel $help, $field ) { - if ( $label !== '' || $help !== '' ) { - return $label . $help->get_button_html() . $help->get_panel_html() . $field; - } - - return $field; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields.php b/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields.php deleted file mode 100644 index 9da698ef..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields.php +++ /dev/null @@ -1,235 +0,0 @@ -get_content_fields(); - break; - case 'settings': - $fields = $this->get_settings_fields(); - break; - case 'social': - $fields = $this->get_social_fields(); - break; - } - - return $this->filter_hidden_fields( $fields ); - } - - /** - * Returns array with the fields for the general tab. - * - * @return array - */ - protected function get_content_fields() { - $fields = [ - 'title' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - 'desc' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - 'linkdex' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - 'content_score' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - 'inclusive_language_score' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - 'focuskw' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - 'is_cornerstone' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - ]; - - /** - * Filter: 'wpseo_taxonomy_content_fields' - Adds the possibility to register additional content fields. - * - * @param array $additional_fields The additional fields. - */ - $additional_fields = apply_filters( 'wpseo_taxonomy_content_fields', [] ); - - return array_merge( $fields, $additional_fields ); - } - - /** - * Returns array with the fields for the settings tab. - * - * @return array - */ - protected function get_settings_fields() { - return [ - 'noindex' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - 'bctitle' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => ( WPSEO_Options::get( 'breadcrumbs-enable' ) !== true ), - ], - 'canonical' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - ]; - } - - /** - * Returning the fields for the social media tab. - * - * @return array - */ - protected function get_social_fields() { - $fields = []; - - if ( WPSEO_Options::get( 'opengraph', false ) === true ) { - $fields = [ - 'opengraph-title' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - 'opengraph-description' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - 'opengraph-image' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - 'opengraph-image-id' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - ]; - } - - if ( WPSEO_Options::get( 'twitter', false ) === true ) { - $fields = array_merge( - $fields, - [ - 'twitter-title' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - 'twitter-description' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - 'twitter-image' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - 'twitter-image-id' => [ - 'label' => '', - 'description' => '', - 'type' => 'hidden', - 'options' => '', - 'hide' => false, - ], - ] - ); - } - - return $fields; - } - - /** - * Filter the hidden fields. - * - * @param array $fields Array with the form fields that has will be filtered. - * - * @return array - */ - protected function filter_hidden_fields( array $fields ) { - foreach ( $fields as $field_name => $field_options ) { - if ( ! empty( $field_options['hide'] ) ) { - unset( $fields[ $field_name ] ); - } - } - - return $fields; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-metabox.php b/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-metabox.php deleted file mode 100644 index d7b1fff6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-metabox.php +++ /dev/null @@ -1,229 +0,0 @@ -term = $term; - $this->taxonomy = $taxonomy; - $this->is_social_enabled = WPSEO_Options::get( 'opengraph', false ) || WPSEO_Options::get( 'twitter', false ); - - $this->seo_analysis = new WPSEO_Metabox_Analysis_SEO(); - $this->readability_analysis = new WPSEO_Metabox_Analysis_Readability(); - $this->inclusive_language_analysis = new WPSEO_Metabox_Analysis_Inclusive_Language(); - } - - /** - * Shows the Yoast SEO metabox for the term. - * - * @return void - */ - public function display() { - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $this->get_product_title() returns a hard-coded string. - printf( '

              %1$s

              ', $this->get_product_title() ); - - echo '
              '; - echo '
              '; - - $this->render_hidden_fields(); - $this->render_tabs(); - - echo '
              '; - echo '
              '; - } - - /** - * Renders the metabox hidden fields. - * - * @return void - */ - protected function render_hidden_fields() { - $fields_presenter = new WPSEO_Taxonomy_Fields_Presenter( $this->term ); - $field_definitions = new WPSEO_Taxonomy_Fields(); - - echo $fields_presenter->html( $field_definitions->get( 'content' ) ); - if ( WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) || WPSEO_Options::get( 'disableadvanced_meta' ) === false ) { - echo $fields_presenter->html( $field_definitions->get( 'settings' ) ); - } - - if ( $this->is_social_enabled ) { - echo $fields_presenter->html( $field_definitions->get( 'social' ) ); - } - } - - /** - * Renders the metabox tabs. - * - * @return void - */ - protected function render_tabs() { - echo '
              '; - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $this->get_product_title() returns a hard-coded string. - printf( '
                ', $this->get_product_title() ); - - $tabs = $this->get_tabs(); - - foreach ( $tabs as $tab ) { - $tab->display_link(); - } - - echo '
              '; - - foreach ( $tabs as $tab ) { - $tab->display_content(); - } - - echo '
              '; - } - - /** - * Returns the relevant metabox sections for the current view. - * - * @return WPSEO_Metabox_Section[] - */ - private function get_tabs() { - $tabs = []; - - $label = __( 'SEO', 'wordpress-seo' ); - if ( $this->seo_analysis->is_enabled() ) { - $label = '' . $label; - } - - $tabs[] = new WPSEO_Metabox_Section_React( 'content', $label ); - - if ( $this->readability_analysis->is_enabled() ) { - $tabs[] = new WPSEO_Metabox_Section_Readability(); - } - - if ( $this->inclusive_language_analysis->is_enabled() ) { - $tabs[] = new WPSEO_Metabox_Section_Inclusive_Language(); - } - - if ( $this->is_social_enabled ) { - $tabs[] = new WPSEO_Metabox_Section_React( - 'social', - '' . __( 'Social', 'wordpress-seo' ), - '', - [ - 'html_after' => '
              ', - ] - ); - } - - $tabs = array_merge( $tabs, $this->get_additional_tabs() ); - - return $tabs; - } - - /** - * Returns the metabox tabs that have been added by other plugins. - * - * @return WPSEO_Metabox_Section_Additional[] - */ - protected function get_additional_tabs() { - $tabs = []; - - /** - * Private filter: 'yoast_free_additional_taxonomy_metabox_sections'. - * - * Meant for internal use only. Allows adding additional tabs to the Yoast SEO metabox for taxonomies. - * - * @param array[] $tabs { - * An array of arrays with tab specifications. - * - * @type array $tab { - * A tab specification. - * - * @type string $name The name of the tab. Used in the HTML IDs, href and aria properties. - * @type string $link_content The content of the tab link. - * @type string $content The content of the tab. - * @type array $options { - * Optional. Extra options. - * - * @type string $link_class Optional. The class for the tab link. - * @type string $link_aria_label Optional. The aria label of the tab link. - * } - * } - * } - */ - $requested_tabs = apply_filters( 'yoast_free_additional_taxonomy_metabox_sections', [] ); - - foreach ( $requested_tabs as $tab ) { - if ( is_array( $tab ) && array_key_exists( 'name', $tab ) && array_key_exists( 'link_content', $tab ) && array_key_exists( 'content', $tab ) ) { - $options = array_key_exists( 'options', $tab ) ? $tab['options'] : []; - $tabs[] = new WPSEO_Metabox_Section_Additional( - $tab['name'], - $tab['link_content'], - $tab['content'], - $options - ); - } - } - - return $tabs; - } - - /** - * Retrieves the product title. - * - * @return string The product title. - */ - protected function get_product_title() { - return YoastSEO()->helpers->product->get_product_name(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy.php b/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy.php deleted file mode 100644 index 423b02d9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy.php +++ /dev/null @@ -1,484 +0,0 @@ -taxonomy = $this::get_taxonomy(); - - add_action( 'edit_term', [ $this, 'update_term' ], 99, 3 ); - add_action( 'init', [ $this, 'custom_category_descriptions_allow_html' ] ); - add_action( 'admin_init', [ $this, 'admin_init' ] ); - - if ( self::is_term_overview( $GLOBALS['pagenow'] ) ) { - new WPSEO_Taxonomy_Columns(); - } - $this->analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - $this->analysis_readability = new WPSEO_Metabox_Analysis_Readability(); - $this->analysis_inclusive_language = new WPSEO_Metabox_Analysis_Inclusive_Language(); - } - - /** - * Add hooks late enough for taxonomy object to be available for checks. - * - * @return void - */ - public function admin_init() { - - $taxonomy = get_taxonomy( $this->taxonomy ); - - if ( empty( $taxonomy ) || empty( $taxonomy->public ) || ! $this->show_metabox() ) { - return; - } - - // Adds custom category description editor. Needs a hook that runs before the description field. - add_action( "{$this->taxonomy}_term_edit_form_top", [ $this, 'custom_category_description_editor' ] ); - - add_action( sanitize_text_field( $this->taxonomy ) . '_edit_form', [ $this, 'term_metabox' ], 90, 1 ); - add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ] ); - } - - /** - * Show the SEO inputs for term. - * - * @param stdClass|WP_Term $term Term to show the edit boxes for. - * - * @return void - */ - public function term_metabox( $term ) { - if ( WPSEO_Metabox::is_internet_explorer() ) { - $this->show_internet_explorer_notice(); - return; - } - - $metabox = new WPSEO_Taxonomy_Metabox( $this->taxonomy, $term ); - $metabox->display(); - } - - /** - * Renders the content for the internet explorer metabox. - * - * @return void - */ - private function show_internet_explorer_notice() { - $product_title = YoastSEO()->helpers->product->get_product_name(); - - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $product_title is hardcoded. - printf( '

              %1$s

              ', $product_title ); - echo '
              '; - - $content = sprintf( - /* translators: 1: Link start tag to the Firefox website, 2: Link start tag to the Chrome website, 3: Link start tag to the Edge website, 4: Link closing tag. */ - esc_html__( 'The browser you are currently using is unfortunately rather dated. Since we strive to give you the best experience possible, we no longer support this browser. Instead, please use %1$sFirefox%4$s, %2$sChrome%4$s or %3$sMicrosoft Edge%4$s.', 'wordpress-seo' ), - '', - '', - '', - '' - ); - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped above. - echo new Alert_Presenter( $content ); - - echo '
              '; - } - - /** - * Queue assets for taxonomy screens. - * - * @since 1.5.0 - * - * @return void - */ - public function admin_enqueue_scripts() { - - $pagenow = $GLOBALS['pagenow']; - - if ( ! ( self::is_term_edit( $pagenow ) || self::is_term_overview( $pagenow ) ) ) { - return; - } - - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_style( 'scoring' ); - $asset_manager->enqueue_style( 'monorepo' ); - - $tag_id = $this::get_tag_id(); - - if ( - self::is_term_edit( $pagenow ) - && ! is_null( $tag_id ) - ) { - wp_enqueue_media(); // Enqueue files needed for upload functionality. - - $asset_manager->enqueue_style( 'metabox-css' ); - $asset_manager->enqueue_style( 'ai-generator' ); - $asset_manager->enqueue_script( 'term-edit' ); - - /** - * Remove the emoji script as it is incompatible with both React and any - * contenteditable fields. - */ - remove_action( 'admin_print_scripts', 'print_emoji_detection_script' ); - - $asset_manager->localize_script( 'term-edit', 'wpseoAdminL10n', WPSEO_Utils::get_admin_l10n() ); - - $script_data = [ - 'analysis' => [ - 'plugins' => [ - 'replaceVars' => [ - 'no_parent_text' => __( '(no parent)', 'wordpress-seo' ), - 'replace_vars' => $this->get_replace_vars(), - 'recommended_replace_vars' => $this->get_recommended_replace_vars(), - 'scope' => $this->determine_scope(), - ], - 'shortcodes' => [ - 'wpseo_shortcode_tags' => $this->get_valid_shortcode_tags(), - 'wpseo_filter_shortcodes_nonce' => wp_create_nonce( 'wpseo-filter-shortcodes' ), - ], - ], - 'worker' => [ - 'url' => YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-analysis-worker' ), - 'dependencies' => YoastSEO()->helpers->asset->get_dependency_urls_by_handle( 'yoast-seo-analysis-worker' ), - 'keywords_assessment_url' => YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-used-keywords-assessment' ), - 'log_level' => WPSEO_Utils::get_analysis_worker_log_level(), - ], - ], - 'media' => [ - // @todo replace this translation with JavaScript translations. - 'choose_image' => __( 'Use Image', 'wordpress-seo' ), - ], - 'metabox' => $this->localize_term_scraper_script( $tag_id ), - 'userLanguageCode' => WPSEO_Language_Utils::get_language( get_user_locale() ), - 'isTerm' => true, - 'postId' => $tag_id, - 'termType' => $this->get_taxonomy(), - 'usedKeywordsNonce' => wp_create_nonce( 'wpseo-keyword-usage' ), - 'linkParams' => WPSEO_Shortlinker::get_query_params(), - 'pluginUrl' => plugins_url( '', WPSEO_FILE ), - 'wistiaEmbedPermission' => YoastSEO()->classes->get( Wistia_Embed_Permission_Repository::class )->get_value_for_user( get_current_user_id() ), - ]; - $asset_manager->localize_script( 'term-edit', 'wpseoScriptData', $script_data ); - $asset_manager->enqueue_user_language_script(); - } - - if ( self::is_term_overview( $pagenow ) ) { - $asset_manager->enqueue_script( 'edit-page' ); - } - } - - /** - * Update the taxonomy meta data on save. - * - * @param int $term_id ID of the term to save data for. - * @param int $tt_id The taxonomy_term_id for the term. - * @param string $taxonomy The taxonomy the term belongs to. - * - * @return void - */ - public function update_term( $term_id, $tt_id, $taxonomy ) { - // Bail if this is a multisite installation and the site has been switched. - if ( is_multisite() && ms_is_switched() ) { - return; - } - - /* Create post array with only our values. */ - $new_meta_data = []; - foreach ( WPSEO_Taxonomy_Meta::$defaults_per_term as $key => $default ) { - // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: Nonce is already checked by WordPress before executing this action. - if ( isset( $_POST[ $key ] ) && is_string( $_POST[ $key ] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: $data is getting sanitized later. - $data = wp_unslash( $_POST[ $key ] ); - $new_meta_data[ $key ] = ( $key !== 'wpseo_canonical' ) ? WPSEO_Utils::sanitize_text_field( $data ) : WPSEO_Utils::sanitize_url( $data ); - } - - // If analysis is disabled remove that analysis score value from the DB. - if ( $this->is_meta_value_disabled( $key ) ) { - $new_meta_data[ $key ] = ''; - } - } - - // Saving the values. - WPSEO_Taxonomy_Meta::set_values( $term_id, $taxonomy, $new_meta_data ); - } - - /** - * Determines if the given meta value key is disabled. - * - * @param string $key The key of the meta value. - * @return bool Whether the given meta value key is disabled. - */ - public function is_meta_value_disabled( $key ) { - if ( $key === 'wpseo_linkdex' && ! $this->analysis_seo->is_enabled() ) { - return true; - } - - if ( $key === 'wpseo_content_score' && ! $this->analysis_readability->is_enabled() ) { - return true; - } - - if ( $key === 'wpseo_inclusive_language_score' && ! $this->analysis_inclusive_language->is_enabled() ) { - return true; - } - - return false; - } - - /** - * Allows post-kses-filtered HTML in term descriptions. - * - * @return void - */ - public function custom_category_descriptions_allow_html() { - remove_filter( 'term_description', 'wp_kses_data' ); - remove_filter( 'pre_term_description', 'wp_filter_kses' ); - add_filter( 'term_description', 'wp_kses_post' ); - add_filter( 'pre_term_description', 'wp_filter_post_kses' ); - } - - /** - * Output the WordPress editor. - * - * @return void - */ - public function custom_category_description_editor() { - wp_editor( '', 'description' ); - } - - /** - * Pass variables to js for use with the term-scraper. - * - * @param int $term_id The ID of the term to localize the script for. - * - * @return array - */ - public function localize_term_scraper_script( $term_id ) { - $term = get_term_by( 'id', $term_id, $this::get_taxonomy() ); - $taxonomy = get_taxonomy( $term->taxonomy ); - - $term_formatter = new WPSEO_Metabox_Formatter( - new WPSEO_Term_Metabox_Formatter( $taxonomy, $term ) - ); - - return $term_formatter->get_values(); - } - - /** - * Pass some variables to js for replacing variables. - * - * @return array - */ - public function localize_replace_vars_script() { - return [ - 'no_parent_text' => __( '(no parent)', 'wordpress-seo' ), - 'replace_vars' => $this->get_replace_vars(), - 'recommended_replace_vars' => $this->get_recommended_replace_vars(), - 'scope' => $this->determine_scope(), - ]; - } - - /** - * Determines the scope based on the current taxonomy. - * This can be used by the replacevar plugin to determine if a replacement needs to be executed. - * - * @return string String decribing the current scope. - */ - private function determine_scope() { - $taxonomy = $this::get_taxonomy(); - - if ( $taxonomy === 'category' ) { - return 'category'; - } - - if ( $taxonomy === 'post_tag' ) { - return 'tag'; - } - - return 'term'; - } - - /** - * Determines if a given page is the term overview page. - * - * @param string $page The string to check for the term overview page. - * - * @return bool - */ - public static function is_term_overview( $page ) { - return $page === 'edit-tags.php'; - } - - /** - * Determines if a given page is the term edit page. - * - * @param string $page The string to check for the term edit page. - * - * @return bool - */ - public static function is_term_edit( $page ) { - return $page === 'term.php'; - } - - /** - * Function to get the labels for the current taxonomy. - * - * @return object|null Labels for the current taxonomy or null if the taxonomy is not set. - */ - public static function get_labels() { - $term = self::get_taxonomy(); - if ( $term !== '' ) { - $taxonomy = get_taxonomy( $term ); - return $taxonomy->labels; - } - return null; - } - - /** - * Retrieves a template. - * Check if metabox for current taxonomy should be displayed. - * - * @return bool - */ - private function show_metabox() { - $option_key = 'display-metabox-tax-' . $this->taxonomy; - - return WPSEO_Options::get( $option_key ); - } - - /** - * Getting the taxonomy from the URL. - * - * @return string - */ - private static function get_taxonomy() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['taxonomy'] ) && is_string( $_GET['taxonomy'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - return sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ); - } - return ''; - } - - /** - * Get the current tag ID from the GET parameters. - * - * @return int|null the tag ID if it exists, null otherwise. - */ - private static function get_tag_id() { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. - if ( isset( $_GET['tag_ID'] ) && is_string( $_GET['tag_ID'] ) ) { - // phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, We are casting to an integer. - $tag_id = (int) wp_unslash( $_GET['tag_ID'] ); - if ( $tag_id > 0 ) { - return $tag_id; - } - } - return null; - } - - /** - * Prepares the replace vars for localization. - * - * @return array The replacement variables. - */ - private function get_replace_vars() { - $term_id = $this::get_tag_id(); - $term = get_term_by( 'id', $term_id, $this::get_taxonomy() ); - - $cached_replacement_vars = []; - - $vars_to_cache = [ - 'date', - 'id', - 'sitename', - 'sitedesc', - 'sep', - 'page', - 'term_title', - 'term_description', - 'term_hierarchy', - 'category_description', - 'tag_description', - 'searchphrase', - 'currentyear', - ]; - - foreach ( $vars_to_cache as $var ) { - $cached_replacement_vars[ $var ] = wpseo_replace_vars( '%%' . $var . '%%', $term ); - } - - return $cached_replacement_vars; - } - - /** - * Prepares the recommended replace vars for localization. - * - * @return array The recommended replacement variables. - */ - private function get_recommended_replace_vars() { - $recommended_replace_vars = new WPSEO_Admin_Recommended_Replace_Vars(); - $taxonomy = $this::get_taxonomy(); - - if ( $taxonomy === '' ) { - return []; - } - - // What is recommended depends on the current context. - $page_type = $recommended_replace_vars->determine_for_term( $taxonomy ); - - return $recommended_replace_vars->get_recommended_replacevars_for( $page_type ); - } - - /** - * Returns an array with shortcode tags for all registered shortcodes. - * - * @return array Array with shortcode tags. - */ - private function get_valid_shortcode_tags() { - $shortcode_tags = []; - - foreach ( $GLOBALS['shortcode_tags'] as $tag => $description ) { - $shortcode_tags[] = $tag; - } - - return $shortcode_tags; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-addon-data.php b/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-addon-data.php deleted file mode 100644 index 0cbc27c7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-addon-data.php +++ /dev/null @@ -1,126 +0,0 @@ -is_installed( WPSEO_Addon_Manager::LOCAL_SLUG ) ) { - $addon_settings = $this->get_local_addon_settings( $addon_settings, 'wpseo_local', WPSEO_Addon_Manager::LOCAL_SLUG, $this->local_include_list ); - } - - if ( $addon_manager->is_installed( WPSEO_Addon_Manager::WOOCOMMERCE_SLUG ) ) { - $addon_settings = $this->get_addon_settings( $addon_settings, 'wpseo_woo', WPSEO_Addon_Manager::WOOCOMMERCE_SLUG, $this->woo_include_list ); - } - - if ( $addon_manager->is_installed( WPSEO_Addon_Manager::NEWS_SLUG ) ) { - $addon_settings = $this->get_addon_settings( $addon_settings, 'wpseo_news', WPSEO_Addon_Manager::NEWS_SLUG, $this->news_include_list ); - } - - if ( $addon_manager->is_installed( WPSEO_Addon_Manager::VIDEO_SLUG ) ) { - $addon_settings = $this->get_addon_settings( $addon_settings, 'wpseo_video', WPSEO_Addon_Manager::VIDEO_SLUG, $this->video_include_list ); - } - - return $addon_settings; - } - - /** - * Gets the tracked options from the addon - * - * @param array $addon_settings The current list of addon settings. - * @param string $source_name The option key of the addon. - * @param string $slug The addon slug. - * @param array $option_include_list All the options to be included in tracking. - * - * @return array - */ - public function get_addon_settings( array $addon_settings, $source_name, $slug, $option_include_list ) { - $source_options = get_option( $source_name, [] ); - if ( ! is_array( $source_options ) || empty( $source_options ) ) { - return $addon_settings; - } - $addon_settings[ $slug ] = array_intersect_key( $source_options, array_flip( $option_include_list ) ); - - return $addon_settings; - } - - /** - * Filter business_type in local addon settings. - * - * Remove the business_type setting when 'multiple_locations_shared_business_info' setting is turned off. - * - * @param array $addon_settings The current list of addon settings. - * @param string $source_name The option key of the addon. - * @param string $slug The addon slug. - * @param array $option_include_list All the options to be included in tracking. - * - * @return array - */ - public function get_local_addon_settings( array $addon_settings, $source_name, $slug, $option_include_list ) { - $source_options = get_option( $source_name, [] ); - if ( ! is_array( $source_options ) || empty( $source_options ) ) { - return $addon_settings; - } - $addon_settings[ $slug ] = array_intersect_key( $source_options, array_flip( $option_include_list ) ); - - if ( array_key_exists( 'use_multiple_locations', $source_options ) && array_key_exists( 'business_type', $addon_settings[ $slug ] ) && $source_options['use_multiple_locations'] === 'on' && $source_options['multiple_locations_shared_business_info'] === 'off' ) { - $addon_settings[ $slug ]['business_type'] = 'multiple_locations'; - } - - if ( ! ( new WooCommerce_Conditional() )->is_met() ) { - unset( $addon_settings[ $slug ]['woocommerce_local_pickup_setting'] ); - } - - return $addon_settings; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-default-data.php b/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-default-data.php deleted file mode 100644 index 498e7d08..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-default-data.php +++ /dev/null @@ -1,60 +0,0 @@ - get_option( 'blogname' ), - '@timestamp' => (int) gmdate( 'Uv' ), - 'wpVersion' => $this->get_wordpress_version(), - 'homeURL' => home_url(), - 'adminURL' => admin_url(), - 'isMultisite' => is_multisite(), - 'siteLanguage' => get_bloginfo( 'language' ), - 'gmt_offset' => get_option( 'gmt_offset' ), - 'timezoneString' => get_option( 'timezone_string' ), - 'migrationStatus' => get_option( 'yoast_migrations_free' ), - 'countPosts' => $this->get_post_count( 'post' ), - 'countPages' => $this->get_post_count( 'page' ), - ]; - } - - /** - * Returns the number of posts of a certain type. - * - * @param string $post_type The post type return the count for. - * - * @return int The count for this post type. - */ - protected function get_post_count( $post_type ) { - $count = wp_count_posts( $post_type ); - if ( isset( $count->publish ) ) { - return $count->publish; - } - return 0; - } - - /** - * Returns the WordPress version. - * - * @return string The version. - */ - protected function get_wordpress_version() { - global $wp_version; - - return $wp_version; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-plugin-data.php b/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-plugin-data.php deleted file mode 100644 index 2c585e1d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-plugin-data.php +++ /dev/null @@ -1,90 +0,0 @@ - $this->get_plugin_data(), - ]; - } - - /** - * Returns all plugins. - * - * @return array The formatted plugins. - */ - protected function get_plugin_data() { - - if ( ! function_exists( 'get_plugin_data' ) ) { - require_once ABSPATH . 'wp-admin/includes/plugin.php'; - } - $plugins = wp_get_active_and_valid_plugins(); - - $plugins = array_map( 'get_plugin_data', $plugins ); - $this->set_auto_update_plugin_list(); - $plugins = array_map( [ $this, 'format_plugin' ], $plugins ); - - $plugin_data = []; - foreach ( $plugins as $plugin ) { - $plugin_key = sanitize_title( $plugin['name'] ); - $plugin_data[ $plugin_key ] = $plugin; - } - - return $plugin_data; - } - - /** - * Sets all auto updating plugin data so it can be used in the tracking list. - * - * @return void - */ - public function set_auto_update_plugin_list() { - - $auto_update_plugins = []; - $auto_update_plugin_files = get_option( 'auto_update_plugins' ); - if ( $auto_update_plugin_files ) { - foreach ( $auto_update_plugin_files as $auto_update_plugin ) { - $data = get_plugin_data( WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $auto_update_plugin ); - $auto_update_plugins[ $data['Name'] ] = $data; - } - } - - $this->auto_update_plugin_list = $auto_update_plugins; - } - - /** - * Formats the plugin array. - * - * @param array $plugin The plugin details. - * - * @return array The formatted array. - */ - protected function format_plugin( array $plugin ) { - - return [ - 'name' => $plugin['Name'], - 'version' => $plugin['Version'], - 'auto_updating' => array_key_exists( $plugin['Name'], $this->auto_update_plugin_list ), - ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-server-data.php b/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-server-data.php deleted file mode 100644 index 220753f1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-server-data.php +++ /dev/null @@ -1,85 +0,0 @@ - $this->get_server_data(), - ]; - } - - /** - * Returns the values with server details. - * - * @return array Array with the value. - */ - protected function get_server_data() { - $server_data = []; - - // Validate if the server address is a valid IP-address. - $ipaddress = isset( $_SERVER['SERVER_ADDR'] ) ? filter_var( wp_unslash( $_SERVER['SERVER_ADDR'] ), FILTER_VALIDATE_IP ) : ''; - if ( $ipaddress ) { - $server_data['ip'] = $ipaddress; - $server_data['Hostname'] = gethostbyaddr( $ipaddress ); - } - - $server_data['os'] = function_exists( 'php_uname' ) ? php_uname() : PHP_OS; - $server_data['PhpVersion'] = PHP_VERSION; - $server_data['CurlVersion'] = $this->get_curl_info(); - $server_data['PhpExtensions'] = $this->get_php_extensions(); - - return $server_data; - } - - /** - * Returns details about the curl version. - * - * @return array|null The curl info. Or null when curl isn't available.. - */ - protected function get_curl_info() { - if ( ! function_exists( 'curl_version' ) ) { - return null; - } - - $curl = curl_version(); - - $ssl_support = true; - if ( ! $curl['features'] && CURL_VERSION_SSL ) { - $ssl_support = false; - } - - return [ - 'version' => $curl['version'], - 'sslSupport' => $ssl_support, - ]; - } - - /** - * Returns a list with php extensions. - * - * @return array Returns the state of the php extensions. - */ - protected function get_php_extensions() { - return [ - 'imagick' => extension_loaded( 'imagick' ), - 'filter' => extension_loaded( 'filter' ), - 'bcmath' => extension_loaded( 'bcmath' ), - 'pcre' => extension_loaded( 'pcre' ), - 'xml' => extension_loaded( 'xml' ), - 'pdo_mysql' => extension_loaded( 'pdo_mysql' ), - ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-settings-data.php b/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-settings-data.php deleted file mode 100644 index bf3e7a78..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-settings-data.php +++ /dev/null @@ -1,278 +0,0 @@ -include_list = apply_filters( 'wpseo_tracking_settings_include_list', $this->include_list ); - - $options = WPSEO_Options::get_all(); - // Returns the settings of which the keys intersect with the values of the include list. - $options = array_intersect_key( $options, array_flip( $this->include_list ) ); - - return [ - 'settings' => $this->anonymize_settings( $options ), - ]; - } - - /** - * Anonimizes the WPSEO_Options array by replacing all $anonymous_settings values to 'used'. - * - * @param array $settings The settings. - * - * @return array The anonymized settings. - */ - private function anonymize_settings( $settings ) { - foreach ( $this->anonymous_settings as $setting ) { - if ( ! empty( $settings[ $setting ] ) ) { - $settings[ $setting ] = 'used'; - } - } - - return $settings; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-theme-data.php b/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-theme-data.php deleted file mode 100644 index e2225950..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-theme-data.php +++ /dev/null @@ -1,51 +0,0 @@ - [ - 'name' => $theme->get( 'Name' ), - 'url' => $theme->get( 'ThemeURI' ), - 'version' => $theme->get( 'Version' ), - 'author' => [ - 'name' => $theme->get( 'Author' ), - 'url' => $theme->get( 'AuthorURI' ), - ], - 'parentTheme' => $this->get_parent_theme( $theme ), - 'blockTemplateSupport' => current_theme_supports( 'block-templates' ), - 'isBlockTheme' => function_exists( 'wp_is_block_theme' ) && wp_is_block_theme(), - ], - ]; - } - - /** - * Returns the name of the parent theme. - * - * @param WP_Theme $theme The theme object. - * - * @return string|null The name of the parent theme or null. - */ - private function get_parent_theme( WP_Theme $theme ) { - if ( is_child_theme() ) { - return $theme->get( 'Template' ); - } - - return null; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking.php b/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking.php deleted file mode 100644 index 58bfdff3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking.php +++ /dev/null @@ -1,240 +0,0 @@ -tracking_enabled() ) { - return; - } - - $this->endpoint = $endpoint; - $this->threshold = $threshold; - $this->current_time = time(); - } - - /** - * Registers all hooks to WordPress. - * - * @return void - */ - public function register_hooks() { - if ( ! $this->tracking_enabled() ) { - return; - } - - // Send tracking data on `admin_init`. - add_action( 'admin_init', [ $this, 'send' ], 1 ); - - // Add an action hook that will be triggered at the specified time by `wp_schedule_single_event()`. - add_action( 'wpseo_send_tracking_data_after_core_update', [ $this, 'send' ] ); - // Call `wp_schedule_single_event()` after a WordPress core update. - add_action( 'upgrader_process_complete', [ $this, 'schedule_tracking_data_sending' ], 10, 2 ); - } - - /** - * Schedules a new sending of the tracking data after a WordPress core update. - * - * @param bool|WP_Upgrader $upgrader Optional. WP_Upgrader instance or false. - * Depending on context, it might be a Theme_Upgrader, - * Plugin_Upgrader, Core_Upgrade, or Language_Pack_Upgrader. - * instance. Default false. - * @param array $data Array of update data. - * - * @return void - */ - public function schedule_tracking_data_sending( $upgrader = false, $data = [] ) { - // Return if it's not a WordPress core update. - if ( ! $upgrader || ! isset( $data['type'] ) || $data['type'] !== 'core' ) { - return; - } - - /* - * To uniquely identify the scheduled cron event, `wp_next_scheduled()` - * needs to receive the same arguments as those used when originally - * scheduling the event otherwise it will always return false. - */ - if ( ! wp_next_scheduled( 'wpseo_send_tracking_data_after_core_update', [ true ] ) ) { - /* - * Schedule sending of data tracking 6 hours after a WordPress core - * update. Pass a `true` parameter for the callback `$force` argument. - */ - wp_schedule_single_event( ( time() + ( HOUR_IN_SECONDS * 6 ) ), 'wpseo_send_tracking_data_after_core_update', [ true ] ); - } - } - - /** - * Sends the tracking data. - * - * @param bool $force Whether to send the tracking data ignoring the two - * weeks time threshold. Default false. - * - * @return void - */ - public function send( $force = false ) { - if ( ! $this->should_send_tracking( $force ) ) { - return; - } - - // Set a 'content-type' header of 'application/json'. - $tracking_request_args = [ - 'headers' => [ - 'content-type:' => 'application/json', - ], - ]; - - $collector = $this->get_collector(); - - $request = new WPSEO_Remote_Request( $this->endpoint, $tracking_request_args ); - $request->set_body( $collector->get_as_json() ); - $request->send(); - - update_option( $this->option_name, $this->current_time, 'yes' ); - } - - /** - * Determines whether to send the tracking data. - * - * Returns false if tracking is disabled or the current page is one of the - * admin plugins pages. Returns true when there's no tracking data stored or - * the data was sent more than two weeks ago. The two weeks interval is set - * when instantiating the class. - * - * @param bool $ignore_time_treshhold Whether to send the tracking data ignoring - * the two weeks time treshhold. Default false. - * - * @return bool True when tracking data should be sent. - */ - protected function should_send_tracking( $ignore_time_treshhold = false ) { - global $pagenow; - - // Only send tracking on the main site of a multi-site instance. This returns true on non-multisite installs. - if ( is_network_admin() || ! is_main_site() ) { - return false; - } - - // Because we don't want to possibly block plugin actions with our routines. - if ( in_array( $pagenow, [ 'plugins.php', 'plugin-install.php', 'plugin-editor.php' ], true ) ) { - return false; - } - - $last_time = get_option( $this->option_name ); - - // When tracking data haven't been sent yet or when sending data is forced. - if ( ! $last_time || $ignore_time_treshhold ) { - return true; - } - - return $this->exceeds_treshhold( $this->current_time - $last_time ); - } - - /** - * Checks if the given amount of seconds exceeds the set threshold. - * - * @param int $seconds The amount of seconds to check. - * - * @return bool True when seconds is bigger than threshold. - */ - protected function exceeds_treshhold( $seconds ) { - return ( $seconds > $this->threshold ); - } - - /** - * Returns the collector for collecting the data. - * - * @return WPSEO_Collector The instance of the collector. - */ - public function get_collector() { - $collector = new WPSEO_Collector(); - $collector->add_collection( new WPSEO_Tracking_Default_Data() ); - $collector->add_collection( new WPSEO_Tracking_Server_Data() ); - $collector->add_collection( new WPSEO_Tracking_Theme_Data() ); - $collector->add_collection( new WPSEO_Tracking_Plugin_Data() ); - $collector->add_collection( new WPSEO_Tracking_Settings_Data() ); - $collector->add_collection( new WPSEO_Tracking_Addon_Data() ); - $collector->add_collection( YoastSEO()->classes->get( Missing_Indexables_Collector::class ) ); - $collector->add_collection( YoastSEO()->classes->get( To_Be_Cleaned_Indexables_Collector::class ) ); - - return $collector; - } - - /** - * See if we should run tracking at all. - * - * @return bool True when we can track, false when we can't. - */ - private function tracking_enabled() { - // Check if we're allowing tracking. - $tracking = WPSEO_Options::get( 'tracking' ); - - if ( $tracking === false ) { - return false; - } - - // Save this state. - if ( $tracking === null ) { - /** - * Filter: 'wpseo_enable_tracking' - Enables the data tracking of Yoast SEO Premium and add-ons. - * - * @param string $is_enabled The enabled state. Default is false. - */ - $tracking = apply_filters( 'wpseo_enable_tracking', false ); - - WPSEO_Options::set( 'tracking', $tracking ); - } - - if ( $tracking === false ) { - return false; - } - - if ( ! YoastSEO()->helpers->environment->is_production_mode() ) { - return false; - } - - return true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggle.php b/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggle.php deleted file mode 100644 index ea61a73b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggle.php +++ /dev/null @@ -1,206 +0,0 @@ - $value ) { - if ( property_exists( $this, $key ) ) { - $this->$key = $value; - } - } - } - - /** - * Magic isset-er. - * - * @param string $key Key to check whether a value for it is set. - * - * @return bool True if set, false otherwise. - */ - public function __isset( $key ) { - return isset( $this->$key ); - } - - /** - * Magic getter. - * - * @param string $key Key to get the value for. - * - * @return mixed Value for the key, or null if not set. - */ - public function __get( $key ) { - if ( isset( $this->$key ) ) { - return $this->$key; - } - - return null; - } - - /** - * Checks whether the feature for this toggle is enabled. - * - * @return bool True if the feature is enabled, false otherwise. - */ - public function is_enabled() { - return (bool) WPSEO_Options::get( $this->setting ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggles.php b/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggles.php deleted file mode 100644 index a4efc0d5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggles.php +++ /dev/null @@ -1,284 +0,0 @@ -toggles === null ) { - $this->toggles = $this->load_toggles(); - } - - return $this->toggles; - } - - /** - * Loads the available feature toggles. - * - * Also ensures that the toggles are all Yoast_Feature_Toggle instances and sorted by their order value. - * - * @return array List of sorted Yoast_Feature_Toggle instances. - */ - protected function load_toggles() { - $xml_sitemap_extra = false; - if ( WPSEO_Options::get( 'enable_xml_sitemap' ) ) { - $xml_sitemap_extra = '' . esc_html__( 'See the XML sitemap.', 'wordpress-seo' ) . ''; - } - - $feature_toggles = [ - (object) [ - 'name' => __( 'SEO analysis', 'wordpress-seo' ), - 'setting' => 'keyword_analysis_active', - 'label' => __( 'The SEO analysis offers suggestions to improve the SEO of your text.', 'wordpress-seo' ), - 'read_more_label' => __( 'Learn how the SEO analysis can help you rank.', 'wordpress-seo' ), - 'read_more_url' => 'https://yoa.st/2ak', - 'order' => 10, - ], - (object) [ - 'name' => __( 'Readability analysis', 'wordpress-seo' ), - 'setting' => 'content_analysis_active', - 'label' => __( 'The readability analysis offers suggestions to improve the structure and style of your text.', 'wordpress-seo' ), - 'read_more_label' => __( 'Discover why readability is important for SEO.', 'wordpress-seo' ), - 'read_more_url' => 'https://yoa.st/2ao', - 'order' => 20, - ], - (object) [ - 'name' => __( 'Inclusive language analysis', 'wordpress-seo' ), - 'supported_languages' => Language_Helper::$languages_with_inclusive_language_support, - 'setting' => 'inclusive_language_analysis_active', - 'label' => __( 'The inclusive language analysis offers suggestions to write more inclusive copy.', 'wordpress-seo' ), - 'read_more_label' => __( 'Discover why inclusive language is important for SEO.', 'wordpress-seo' ), - 'read_more_url' => 'https://yoa.st/inclusive-language-features-free', - 'order' => 25, - ], - (object) [ - 'name' => __( 'Cornerstone content', 'wordpress-seo' ), - 'setting' => 'enable_cornerstone_content', - 'label' => __( 'The cornerstone content feature lets you to mark and filter cornerstone content on your website.', 'wordpress-seo' ), - 'read_more_label' => __( 'Find out how cornerstone content can help you improve your site structure.', 'wordpress-seo' ), - 'read_more_url' => 'https://yoa.st/dashboard-help-cornerstone', - 'order' => 30, - ], - (object) [ - 'name' => __( 'Text link counter', 'wordpress-seo' ), - 'setting' => 'enable_text_link_counter', - 'label' => __( 'The text link counter helps you improve your site structure.', 'wordpress-seo' ), - 'read_more_label' => __( 'Find out how the text link counter can enhance your SEO.', 'wordpress-seo' ), - 'read_more_url' => 'https://yoa.st/2aj', - 'order' => 40, - ], - (object) [ - 'name' => __( 'Insights', 'wordpress-seo' ), - 'setting' => 'enable_metabox_insights', - 'label' => __( 'Find relevant data about your content right in the Insights section in the Yoast SEO metabox. You’ll see what words you use most often and if they’re a match with your keywords! ', 'wordpress-seo' ), - 'read_more_label' => __( 'Find out how Insights can help you improve your content.', 'wordpress-seo' ), - 'read_more_url' => 'https://yoa.st/4ew', - 'premium_url' => 'https://yoa.st/2ai', - 'order' => 41, - ], - (object) [ - 'name' => __( 'Link suggestions', 'wordpress-seo' ), - 'premium' => true, - 'setting' => 'enable_link_suggestions', - 'label' => __( 'Get relevant internal linking suggestions — while you’re writing! The link suggestions metabox shows a list of posts on your blog with similar content that might be interesting to link to. ', 'wordpress-seo' ), - 'read_more_label' => __( 'Read more about how internal linking can improve your site structure.', 'wordpress-seo' ), - 'read_more_url' => 'https://yoa.st/4ev', - 'premium_url' => 'https://yoa.st/17g', - 'premium_upsell_url' => 'https://yoa.st/get-link-suggestions', - 'order' => 42, - ], - (object) [ - 'name' => __( 'XML sitemaps', 'wordpress-seo' ), - 'setting' => 'enable_xml_sitemap', - /* translators: %s: Yoast SEO */ - 'label' => sprintf( __( 'Enable the XML sitemaps that %s generates.', 'wordpress-seo' ), 'Yoast SEO' ), - 'read_more_label' => __( 'Read why XML Sitemaps are important for your site.', 'wordpress-seo' ), - 'read_more_url' => 'https://yoa.st/2a-', - 'extra' => $xml_sitemap_extra, - 'after' => $this->sitemaps_toggle_after(), - 'order' => 60, - ], - (object) [ - 'name' => __( 'Admin bar menu', 'wordpress-seo' ), - 'setting' => 'enable_admin_bar_menu', - /* translators: 1: Yoast SEO */ - 'label' => sprintf( __( 'The %1$s admin bar menu contains useful links to third-party tools for analyzing pages and makes it easy to see if you have new notifications.', 'wordpress-seo' ), 'Yoast SEO' ), - 'order' => 80, - ], - (object) [ - 'name' => __( 'Security: no advanced or schema settings for authors', 'wordpress-seo' ), - 'setting' => 'disableadvanced_meta', - 'label' => sprintf( - /* translators: 1: Yoast SEO, 2: translated version of "Off" */ - __( 'The advanced section of the %1$s meta box allows a user to remove posts from the search results or change the canonical. The settings in the schema tab allows a user to change schema meta data for a post. These are things you might not want any author to do. That\'s why, by default, only editors and administrators can do this. Setting to "%2$s" allows all users to change these settings.', 'wordpress-seo' ), - 'Yoast SEO', - __( 'Off', 'wordpress-seo' ) - ), - 'order' => 90, - ], - (object) [ - 'name' => __( 'Usage tracking', 'wordpress-seo' ), - 'label' => __( 'Usage tracking', 'wordpress-seo' ), - 'setting' => 'tracking', - 'read_more_label' => sprintf( - /* translators: 1: Yoast SEO */ - __( 'Allow us to track some data about your site to improve our plugin.', 'wordpress-seo' ), - 'Yoast SEO' - ), - 'read_more_url' => 'https://yoa.st/usage-tracking-2', - 'order' => 95, - ], - (object) [ - 'name' => __( 'REST API: Head endpoint', 'wordpress-seo' ), - 'setting' => 'enable_headless_rest_endpoints', - 'label' => sprintf( - /* translators: 1: Yoast SEO */ - __( 'This %1$s REST API endpoint gives you all the metadata you need for a specific URL. This will make it very easy for headless WordPress sites to use %1$s for all their SEO meta output.', 'wordpress-seo' ), - 'Yoast SEO' - ), - 'order' => 100, - ], - (object) [ - 'name' => __( 'Enhanced Slack sharing', 'wordpress-seo' ), - 'setting' => 'enable_enhanced_slack_sharing', - 'label' => __( 'This adds an author byline and reading time estimate to the article’s snippet when shared on Slack.', 'wordpress-seo' ), - 'read_more_label' => __( 'Find out how a rich snippet can improve visibility and click-through-rate.', 'wordpress-seo' ), - 'read_more_url' => 'https://yoa.st/help-slack-share', - 'order' => 105, - ], - (object) [ - 'name' => __( 'IndexNow', 'wordpress-seo' ), - 'premium' => true, - 'setting' => 'enable_index_now', - 'label' => __( 'Automatically ping search engines like Bing and Yandex whenever you publish, update or delete a post.', 'wordpress-seo' ), - 'read_more_label' => __( 'Find out how IndexNow can help your site.', 'wordpress-seo' ), - 'read_more_url' => 'https://yoa.st/index-now-read-more', - 'premium_url' => 'https://yoa.st/index-now-feature', - 'premium_upsell_url' => 'https://yoa.st/get-indexnow', - 'order' => 110, - ], - (object) [ - 'name' => __( 'AI title & description generator', 'wordpress-seo' ), - 'premium' => true, - 'setting' => 'enable_ai_generator', - 'label' => __( 'Use the power of Yoast AI to automatically generate compelling titles and descriptions for your posts and pages.', 'wordpress-seo' ), - 'read_more_label' => __( 'Learn more', 'wordpress-seo' ), - 'read_more_url' => 'https://yoa.st/ai-generator-read-more', - 'premium_url' => 'https://yoa.st/ai-generator-feature', - 'premium_upsell_url' => 'https://yoa.st/get-ai-generator', - 'order' => 115, - ], - ]; - - /** - * Filter to add feature toggles from add-ons. - * - * @param array $feature_toggles Array with feature toggle objects where each object - * should have a `name`, `setting` and `label` property. - */ - $feature_toggles = apply_filters( 'wpseo_feature_toggles', $feature_toggles ); - - $feature_toggles = array_map( [ $this, 'ensure_toggle' ], $feature_toggles ); - usort( $feature_toggles, [ $this, 'sort_toggles_callback' ] ); - - return $feature_toggles; - } - - /** - * Returns html for a warning that core sitemaps are enabled when yoast seo sitemaps are disabled. - * - * @return string HTML string for the warning. - */ - protected function sitemaps_toggle_after() { - $out = ''; - - return $out; - } - - /** - * Ensures that the passed value is a Yoast_Feature_Toggle. - * - * @param Yoast_Feature_Toggle|object|array $toggle_data Feature toggle instance, or raw object or array - * containing feature toggle data. - * @return Yoast_Feature_Toggle Feature toggle instance based on $toggle_data. - */ - protected function ensure_toggle( $toggle_data ) { - if ( $toggle_data instanceof Yoast_Feature_Toggle ) { - return $toggle_data; - } - - if ( is_object( $toggle_data ) ) { - $toggle_data = get_object_vars( $toggle_data ); - } - - return new Yoast_Feature_Toggle( $toggle_data ); - } - - /** - * Callback for sorting feature toggles by their order. - * - * {@internal Once the minimum PHP version goes up to PHP 7.0, the logic in the function - * can be replaced with the spaceship operator `<=>`.} - * - * @param Yoast_Feature_Toggle $feature_a Feature A. - * @param Yoast_Feature_Toggle $feature_b Feature B. - * - * @return int An integer less than, equal to, or greater than zero indicating respectively - * that feature A is considered to be less than, equal to, or greater than feature B. - */ - protected function sort_toggles_callback( Yoast_Feature_Toggle $feature_a, Yoast_Feature_Toggle $feature_b ) { - return ( $feature_a->order - $feature_b->order ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-input-select.php b/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-input-select.php deleted file mode 100644 index 1f2a1735..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-input-select.php +++ /dev/null @@ -1,146 +0,0 @@ -select_id = $select_id; - $this->select_name = $select_name; - $this->select_options = $select_options; - $this->selected_option = $selected_option; - } - - /** - * Print the rendered view. - * - * @return void - */ - public function output_html() { - // Extract it, because we want each value accessible via a variable instead of accessing it as an array. - extract( $this->get_select_values() ); - - require WPSEO_PATH . 'admin/views/form/select.php'; - } - - /** - * Return the rendered view. - * - * @return string - */ - public function get_html() { - ob_start(); - - $this->output_html(); - - $rendered_output = ob_get_contents(); - ob_end_clean(); - - return $rendered_output; - } - - /** - * Add an attribute to the attributes property. - * - * @param string $attribute The name of the attribute to add. - * @param string $value The value of the attribute. - * - * @return void - */ - public function add_attribute( $attribute, $value ) { - $this->select_attributes[ $attribute ] = $value; - } - - /** - * Return the set fields for the select. - * - * @return array - */ - private function get_select_values() { - return [ - 'id' => $this->select_id, - 'name' => $this->select_name, - 'attributes' => $this->get_attributes(), - 'options' => $this->select_options, - 'selected' => $this->selected_option, - ]; - } - - /** - * Return the attribute string, when there are attributes set. - * - * @return string - */ - private function get_attributes() { - $attributes = $this->select_attributes; - - if ( ! empty( $attributes ) ) { - array_walk( $attributes, [ $this, 'parse_attribute' ] ); - - return implode( ' ', $attributes ) . ' '; - } - - return ''; - } - - /** - * Get an attribute from the attributes. - * - * @param string $value The value of the attribute. - * @param string $attribute The attribute to look for. - * - * @return void - */ - private function parse_attribute( &$value, $attribute ) { - $value = sprintf( '%s="%s"', sanitize_key( $attribute ), esc_attr( $value ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-integration-toggles.php b/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-integration-toggles.php deleted file mode 100644 index ac66ee0f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-integration-toggles.php +++ /dev/null @@ -1,139 +0,0 @@ -toggles === null ) { - $this->toggles = $this->load_toggles(); - } - - return $this->toggles; - } - - /** - * Loads the available integration toggles. - * - * Also ensures that the toggles are all Yoast_Feature_Toggle instances and sorted by their order value. - * - * @return array List of sorted Yoast_Feature_Toggle instances. - */ - protected function load_toggles() { - $integration_toggles = [ - (object) [ - /* translators: %s: 'Semrush' */ - 'name' => sprintf( __( '%s integration', 'wordpress-seo' ), 'Semrush' ), - 'setting' => 'semrush_integration_active', - 'label' => sprintf( - /* translators: %s: 'Semrush' */ - __( 'The %s integration offers suggestions and insights for keywords related to the entered focus keyphrase.', 'wordpress-seo' ), - 'Semrush' - ), - 'order' => 10, - ], - (object) [ - /* translators: %s: Algolia. */ - 'name' => sprintf( esc_html__( '%s integration', 'wordpress-seo' ), 'Algolia' ), - 'premium' => true, - 'setting' => 'algolia_integration_active', - 'label' => __( 'Improve the quality of your site search! Automatically helps your users find your cornerstone and most important content in your internal search results. It also removes noindexed posts & pages from your site’s search results.', 'wordpress-seo' ), - /* translators: %s: Algolia. */ - 'read_more_label' => sprintf( __( 'Find out more about our %s integration.', 'wordpress-seo' ), 'Algolia' ), - 'read_more_url' => 'https://yoa.st/4eu', - 'premium_url' => 'https://yoa.st/4ex', - 'premium_upsell_url' => 'https://yoa.st/get-algolia-integration', - 'order' => 25, - ], - ]; - - /** - * Filter to add integration toggles from add-ons. - * - * @param array $integration_toggles Array with integration toggle objects where each object - * should have a `name`, `setting` and `label` property. - */ - $integration_toggles = apply_filters( 'wpseo_integration_toggles', $integration_toggles ); - - $integration_toggles = array_map( [ $this, 'ensure_toggle' ], $integration_toggles ); - usort( $integration_toggles, [ $this, 'sort_toggles_callback' ] ); - - return $integration_toggles; - } - - /** - * Ensures that the passed value is a Yoast_Feature_Toggle. - * - * @param Yoast_Feature_Toggle|object|array $toggle_data Feature toggle instance, or raw object or array - * containing integration toggle data. - * @return Yoast_Feature_Toggle Feature toggle instance based on $toggle_data. - */ - protected function ensure_toggle( $toggle_data ) { - if ( $toggle_data instanceof Yoast_Feature_Toggle ) { - return $toggle_data; - } - - if ( is_object( $toggle_data ) ) { - $toggle_data = get_object_vars( $toggle_data ); - } - - return new Yoast_Feature_Toggle( $toggle_data ); - } - - /** - * Callback for sorting integration toggles by their order. - * - * {@internal Once the minimum PHP version goes up to PHP 7.0, the logic in the function - * can be replaced with the spaceship operator `<=>`.} - * - * @param Yoast_Feature_Toggle $feature_a Feature A. - * @param Yoast_Feature_Toggle $feature_b Feature B. - * - * @return int An integer less than, equal to, or greater than zero indicating respectively - * that feature A is considered to be less than, equal to, or greater than feature B. - */ - protected function sort_toggles_callback( Yoast_Feature_Toggle $feature_a, Yoast_Feature_Toggle $feature_b ) { - return ( $feature_a->order - $feature_b->order ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/form/select.php b/wp/wp-content/plugins/wordpress-seo/admin/views/form/select.php deleted file mode 100644 index 8f3a846c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/form/select.php +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/interface-yoast-form-element.php b/wp/wp-content/plugins/wordpress-seo/admin/views/interface-yoast-form-element.php deleted file mode 100644 index 24a8ccb3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/interface-yoast-form-element.php +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/licenses.php b/wp/wp-content/plugins/wordpress-seo/admin/views/licenses.php deleted file mode 100644 index 69618cbe..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/licenses.php +++ /dev/null @@ -1,395 +0,0 @@ - WPSEO_Shortlinker::get( 'https://yoa.st/zz' ), - 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zy' ), - 'title' => 'Yoast SEO Premium', - /* translators: %1$s expands to Yoast SEO */ - 'desc' => sprintf( __( 'The premium version of %1$s with more features & support.', 'wordpress-seo' ), 'Yoast SEO' ), - 'image' => plugin_dir_url( WPSEO_FILE ) . 'packages/js/images/Yoast_SEO_Icon.svg', - 'benefits' => [], -]; - -$extensions = [ - WPSEO_Addon_Manager::LOCAL_SLUG => [ - 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zt' ), - 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zs' ), - 'title' => 'Local SEO', - 'display_title' => __( 'Stand out for local searches', 'wordpress-seo' ), - 'desc' => __( 'Rank better locally and in Google Maps, without breaking a sweat!', 'wordpress-seo' ), - 'image' => plugins_url( 'images/local_plugin_assistant.svg?v=' . WPSEO_VERSION, WPSEO_FILE ), - 'benefits' => [ - __( 'Attract more customers to your site and physical store', 'wordpress-seo' ), - __( 'Automatically get technical SEO best practices for local businesses', 'wordpress-seo' ), - __( 'Easily add maps, address finders, and opening hours to your content', 'wordpress-seo' ), - __( 'Optimize your business for multiple locations', 'wordpress-seo' ), - ], - ], - WPSEO_Addon_Manager::VIDEO_SLUG => [ - 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zx/' ), - 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zw/' ), - 'title' => 'Video SEO', - 'display_title' => __( 'Drive more views to your videos', 'wordpress-seo' ), - 'desc' => __( 'Optimize your videos to show them off in search results and get more clicks!', 'wordpress-seo' ), - 'image' => plugins_url( 'images/video_plugin_assistant.svg?v=' . WPSEO_VERSION, WPSEO_FILE ), - 'benefits' => [ - __( 'Automatically get technical SEO best practices for video content', 'wordpress-seo' ), - __( 'Make sure your videos load quickly for users', 'wordpress-seo' ), - __( 'Make your videos responsive for all screen sizes', 'wordpress-seo' ), - __( 'Optimize your video previews & thumbnails', 'wordpress-seo' ), - ], - ], - WPSEO_Addon_Manager::NEWS_SLUG => [ - 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zv/' ), - 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zu/' ), - 'title' => 'News SEO', - 'display_title' => __( 'Rank higher in Google\'s news carousel', 'wordpress-seo' ), - 'desc' => __( 'Are you in Google News? Increase your traffic from Google News by optimizing for it!', 'wordpress-seo' ), - 'image' => plugins_url( 'images/news_plugin_assistant.svg?v=' . WPSEO_VERSION, WPSEO_FILE ), - 'benefits' => [ - __( 'Optimize your site for Google News', 'wordpress-seo' ), - __( 'Ping Google on the publication of a new post', 'wordpress-seo' ), - __( 'Add all necessary schema.org markup', 'wordpress-seo' ), - __( 'Get XML sitemaps', 'wordpress-seo' ), - ], - ], -]; - -// Add Yoast WooCommerce SEO when WooCommerce is active. -if ( YoastSEO()->helpers->woocommerce->is_active() ) { - $extensions[ WPSEO_Addon_Manager::WOOCOMMERCE_SLUG ] = [ - 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zr' ), - 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zq' ), - 'title' => 'Yoast WooCommerce SEO', - 'display_title' => __( 'Drive more traffic to your online store', 'wordpress-seo' ), - /* translators: %1$s expands to Yoast SEO */ - 'desc' => sprintf( __( 'Seamlessly integrate WooCommerce with %1$s and get extra features!', 'wordpress-seo' ), 'Yoast SEO' ), - 'image' => plugins_url( 'images/woo_plugin_assistant.svg?v=' . WPSEO_VERSION, WPSEO_FILE ), - 'benefits' => [ - __( 'Write product pages that rank using the SEO analysis', 'wordpress-seo' ), - __( 'Increase Google clicks with rich results', 'wordpress-seo' ), - __( 'Add global identifiers for variable products', 'wordpress-seo' ), - /* translators: %1$s expands to Yoast SEO, %2$s expands to WooCommerce */ - sprintf( __( 'Seamless integration between %1$s and %2$s', 'wordpress-seo' ), 'Yoast SEO', 'WooCommerce' ), - __( 'Turn more visitors into customers!', 'wordpress-seo' ), - ], - 'buy_button' => 'WooCommerce SEO', - ]; -} - -// The total number of plugins to consider is the length of the array + 1 for Premium. -// @phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound -$number_plugins_total = ( count( $extensions ) + 1 ); -// @phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound -$number_plugins_active = 0; - -$extensions['yoast-seo-plugin-subscription'] = [ - 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/premium-page-bundle-buy' ), - 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/premium-page-bundle-info' ), - /* translators: used in phrases such as "More information about all the Yoast plugins" */ - 'title' => __( 'all the Yoast plugins', 'wordpress-seo' ), - 'display_title' => __( 'Cover all your SEO bases', 'wordpress-seo' ), - 'desc' => '', - 'image' => plugins_url( 'images/plugin_subscription.svg?v=' . WPSEO_VERSION, WPSEO_FILE ), - 'benefits' => [ - __( 'Get all 5 Yoast plugins for WordPress at a big discount', 'wordpress-seo' ), - __( 'Reach new customers who live near your business', 'wordpress-seo' ), - __( 'Drive more views to your videos', 'wordpress-seo' ), - __( 'Rank higher in Google\'s news carousel', 'wordpress-seo' ), - __( 'Drive more traffic to your online store', 'wordpress-seo' ), - - ], - /* translators: used in phrases such as "Buy all the Yoast plugins" */ - 'buy_button' => __( 'all the Yoast plugins', 'wordpress-seo' ), -]; - -$addon_manager = new WPSEO_Addon_Manager(); -$has_valid_premium_subscription = YoastSEO()->helpers->product->is_premium() && $addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG ); - -/* translators: %1$s expands to Yoast SEO. */ -$wpseo_extensions_header = sprintf( __( '%1$s Extensions', 'wordpress-seo' ), 'Yoast SEO' ); -$new_tab_message = sprintf( - '%1$s', - /* translators: Hidden accessibility text. */ - esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' ) -); - -$sale_badge = ''; -$premium_sale_badge = ''; - -if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-promotion' ) ) { - /* translators: %1$s expands to opening span, %2$s expands to closing span */ - $sale_badge_span = sprintf( esc_html__( '%1$sSALE 30%% OFF!%2$s', 'wordpress-seo' ), '', '' ); - - $sale_badge = '
              ' . $sale_badge_span . '
              '; - - $premium_sale_badge = ( $has_valid_premium_subscription ) ? '' : $sale_badge; -} - -?> - -
              - -

              - -
              -
              - -

              - - -

              - -
                -
              • - ', - '' - ); - ?> -
              • -
              • - ', - '' - ); - ?> -
              • -
              • - ', - '' - ); - ?> -
              • -
              • - ', - '' - ); - ?> -
              • -
              • - ', - '' - ); - ?> -
              • -
              • - ', - '' - ); - ?> -
              • -
              - - is_installed( WPSEO_Addon_Manager::PREMIUM_SLUG ) ) : ?> -
              - - -
              - - - - -
              - - - - - - - - - '; - ?> - - - - - - - -

              - -

              - -
              - - - -
              -

              - ', - '', - 'Yoast SEO' - ); - ?> -

              - - $extension ) : - - // Skip the "All the plugins" card if the user has already all the plugins active. - if ( $slug === 'yoast-seo-plugin-subscription' && $number_plugins_active === $number_plugins_total ) { - continue; - } - ?> -
              - has_valid_subscription( $slug ) || ! $addon_manager->is_installed( $slug ) ) : ?> - - -

              - - -

              -
                - -
              • - -
              - -
              - is_installed( $slug ) ) : ?> -
              - - has_valid_subscription( $slug ) ) : - ++$number_plugins_active; - ?> -
              - - - - -
              - - - - - - - '; - ?> - - -

              - -

              - - - - - -
              -
              - -
              -
              - -
              diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/paper-collapsible.php b/wp/wp-content/plugins/wordpress-seo/admin/views/paper-collapsible.php deleted file mode 100644 index e8e3fea4..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/paper-collapsible.php +++ /dev/null @@ -1,79 +0,0 @@ - -
              > - - %4$s%5$s ', - esc_attr( 'collapsible-header ' . $collapsible_header_class ), - // phpcs:ignore WordPress.Security.EscapeOutput -- $button_id_attr is escaped above. - $button_id_attr, - esc_attr( $collapsible_config['expanded'] ), - // phpcs:ignore WordPress.Security.EscapeOutput -- $help_text is an instance of WPSEO_Admin_Help_Panel, which escapes it's own output. - $help_text->get_button_html(), - esc_html( $title ) . wp_kses_post( $title_after ), - wp_kses_post( $collapsible_config['toggle_icon'] ) - ); - } - else { - echo '

              ', - esc_html( $title ), - wp_kses_post( $title_after ), - // phpcs:ignore WordPress.Security.EscapeOutput -- $help_text is an instance of WPSEO_Admin_Help_Panel, which escapes it's own output. - $help_text->get_button_html(), - '

              '; - } - } - ?> - get_panel_html(); - - $container_id_attr = ''; - if ( ! empty( $paper_id ) ) { - $container_id_attr = sprintf( ' id="%s"', esc_attr( $paper_id_prefix . $paper_id . '-container' ) ); - } - - printf( - '%3$s
              ', - // phpcs:ignore WordPress.Security.EscapeOutput -- $container_id_attr is escaped above. - $container_id_attr, - esc_attr( 'paper-container ' . $collapsible_config['class'] ), - $content - ); - ?> - - diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/partial-notifications-errors.php b/wp/wp-content/plugins/wordpress-seo/admin/views/partial-notifications-errors.php deleted file mode 100644 index 3db05a04..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/partial-notifications-errors.php +++ /dev/null @@ -1,29 +0,0 @@ -%1$s', - /* translators: Hidden accessibility text. */ - esc_html__( 'Hide this item.', 'wordpress-seo' ) - ); - break; - - case 'dismissed': - $button = sprintf( - '', - /* translators: Hidden accessibility text. */ - esc_html__( 'Show this item.', 'wordpress-seo' ) - ); - break; - } - - $notifications .= sprintf( - '
              %4$s%5$s
              ', - esc_attr( $notification->get_id() ), - esc_attr( $notification->get_nonce() ), - esc_attr( $notification->get_json() ), - // This needs to be fixed in https://github.com/Yoast/wordpress-seo-premium/issues/2548. - $notification, - // Note: $button is properly escaped above. - $button - ); - } - - return $notifications; - } -} - -$wpseo_i18n_summary = $yoast_seo_i18n_issues; -if ( ! $yoast_seo_active ) { - $yoast_seo_dashicon = 'yes'; - $wpseo_i18n_summary = $yoast_seo_i18n_no_issues; -} - -?> -

              - - () -

              - -
              - - -

              - -
              - -
              - - esc_attr( $yoast_seo_type . '-dismissed' ), - 'paper_id_prefix' => 'yoast-', - 'class' => 'yoast-notifications-dismissed', - 'content' => _yoast_display_notifications( $yoast_seo_dismissed, 'dismissed' ), - 'collapsible' => true, - 'collapsible_header_class' => 'yoast-notification', - ] - ); - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: get_output() output is properly escaped. - echo $dismissed_paper->get_output(); - } - ?> - - - -

              - - -
              diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/partial-notifications-warnings.php b/wp/wp-content/plugins/wordpress-seo/admin/views/partial-notifications-warnings.php deleted file mode 100644 index e960d6ae..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/partial-notifications-warnings.php +++ /dev/null @@ -1,29 +0,0 @@ - -
              -

              -
              -
              - - - -
              -
              - - -
              -

              - -

              -
              -
              -
              - - - - - - - - -
              - -

              - ', - '' - ); - ?> -

              - - -
              -
              - -
              - - -
              -
              - - -
              -
              -

               

              -
              - - -
              - -
              - - -
              -
              -
              - - - - - - - - - - - - - - - - - - - - - - - - - -
              - - - - - - - - - - - - - - - - - - - - - - -
              - -
              - - - - - - - - - - - - - - - - - - - - -
              -
              -
              - -
              - -
              -
              diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/dashboard.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/dashboard.php deleted file mode 100644 index 262a37d3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/dashboard.php +++ /dev/null @@ -1,44 +0,0 @@ - - -
              -
              - -
              - -
              - -
              - -
              - -
              -
              - -
              -

              -

              - -

              -
              diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/first-time-configuration.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/first-time-configuration.php deleted file mode 100644 index f15c4bb5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/first-time-configuration.php +++ /dev/null @@ -1,14 +0,0 @@ -'; diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/site-analysis.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/site-analysis.php deleted file mode 100644 index b45c40ec..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/site-analysis.php +++ /dev/null @@ -1,20 +0,0 @@ -get_all(); - -?> -

              -
              - '; - printf( - /* translators: %1$s opens the link to the Yoast.com article about Crawl settings, %2$s closes the link, */ - esc_html__( '%1$sLearn more about crawl settings.%2$s', 'wordpress-seo' ), - '', - '' - ); - echo '

              '; - - /** - * Fires when displaying the crawl cleanup network tab. - * - * @param Yoast_Form $yform The yoast form object. - */ - do_action( 'wpseo_settings_tab_crawl_cleanup_network', $yform ); - ?> -
              -hidden( 'show_onboarding_notice', 'wpseo_show_onboarding_notice' ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/network/features.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/network/features.php deleted file mode 100644 index 05ac5bbf..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/network/features.php +++ /dev/null @@ -1,115 +0,0 @@ -get_all(); - -?> -

              -
              - helpers->product->is_premium(); - $premium_version = YoastSEO()->helpers->product->get_premium_version(); - - if ( $feature->premium && $feature->premium_version ) { - $not_supported_in_current_premium_version = $is_premium && version_compare( $premium_version, $feature->premium_version, '<' ); - - if ( $not_supported_in_current_premium_version ) { - continue; - } - } - - $help_text = esc_html( $feature->label ); - if ( ! empty( $feature->extra ) ) { - $help_text .= ' ' . $feature->extra; - } - if ( ! empty( $feature->read_more_label ) ) { - $url = $feature->read_more_url; - if ( ! empty( $feature->premium ) && $feature->premium === true ) { - $url = $feature->premium_url; - } - $help_text .= sprintf( - '%2$s', - esc_url( WPSEO_Shortlinker::get( $url ) ), - esc_html( $feature->read_more_label ) - ); - } - - $feature_help = new WPSEO_Admin_Help_Panel( - WPSEO_Option::ALLOW_KEY_PREFIX . $feature->setting, - /* translators: Hidden accessibility text; %s expands to a feature's name. */ - sprintf( esc_html__( 'Help on: %s', 'wordpress-seo' ), esc_html( $feature->name ) ), - $help_text - ); - - $name = $feature->name; - if ( ! empty( $feature->premium ) && $feature->premium === true ) { - $name .= ' ' . new Premium_Badge_Presenter( $feature->name ); - } - - if ( ! empty( $feature->in_beta ) && $feature->in_beta === true ) { - $name .= ' ' . new Beta_Badge_Presenter( $feature->name ); - } - - $disabled = false; - $show_premium_upsell = false; - $premium_upsell_url = ''; - $note_when_disabled = ''; - - if ( $feature->premium === true && YoastSEO()->helpers->product->is_premium() === false ) { - $disabled = true; - $show_premium_upsell = true; - $premium_upsell_url = WPSEO_Shortlinker::get( $feature->premium_upsell_url ); - } - - $preserve_disabled_value = false; - if ( $disabled ) { - $preserve_disabled_value = true; - } - - $yform->toggle_switch( - WPSEO_Option::ALLOW_KEY_PREFIX . $feature->setting, - [ - 'on' => __( 'Allow Control', 'wordpress-seo' ), - 'off' => __( 'Disable', 'wordpress-seo' ), - ], - $name, - $feature_help->get_button_html() . $feature_help->get_panel_html(), - [ - 'disabled' => $disabled, - 'preserve_disabled_value' => $preserve_disabled_value, - 'show_premium_upsell' => $show_premium_upsell, - 'premium_upsell_url' => $premium_upsell_url, - 'note_when_disabled' => $note_when_disabled, - ] - ); - } - ?> -
              -hidden( 'show_onboarding_notice', 'wpseo_show_onboarding_notice' ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/network/general.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/network/general.php deleted file mode 100644 index a73c722b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/network/general.php +++ /dev/null @@ -1,56 +0,0 @@ -'; - -/* - * {@internal Important: Make sure the options added to the array here are in line with the - * options set in the WPSEO_Option_MS::$allowed_access_options property.}} - */ -$yform->select( - 'access', - /* translators: %1$s expands to Yoast SEO */ - sprintf( __( 'Who should have access to the %1$s settings', 'wordpress-seo' ), 'Yoast SEO' ), - [ - 'admin' => __( 'Site Admins (default)', 'wordpress-seo' ), - 'superadmin' => __( 'Super Admins only', 'wordpress-seo' ), - ] -); - -if ( get_blog_count() <= 100 ) { - $network_admin = new Yoast_Network_Admin(); - - $yform->select( - 'defaultblog', - __( 'New sites in the network inherit their SEO settings from this site', 'wordpress-seo' ), - $network_admin->get_site_choices( true, true ) - ); - echo '

              ' . esc_html__( 'Choose the site whose settings you want to use as default for all sites that are added to your network. If you choose \'None\', the normal plugin defaults will be used.', 'wordpress-seo' ) . '

              '; -} -else { - $yform->textinput( 'defaultblog', __( 'New sites in the network inherit their SEO settings from this site', 'wordpress-seo' ) ); - echo '

              '; - printf( - /* translators: 1: link open tag; 2: link close tag. */ - esc_html__( 'Enter the %1$sSite ID%2$s for the site whose settings you want to use as default for all sites that are added to your network. Leave empty for none (i.e. the normal plugin defaults will be used).', 'wordpress-seo' ), - '', - '' - ); - echo '

              '; -} - -echo '

              ' . esc_html__( 'Take note:', 'wordpress-seo' ) . ' ' . esc_html__( 'Privacy sensitive (FB admins and such), theme specific (title rewrite) and a few very site specific settings will not be imported to new sites.', 'wordpress-seo' ) . '

              '; - -echo ''; diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/network/integrations.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/network/integrations.php deleted file mode 100644 index be635eec..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/network/integrations.php +++ /dev/null @@ -1,103 +0,0 @@ -get_all(); - -?> -

              -
              - label ); - - if ( ! empty( $integration->extra ) ) { - $help_text .= ' ' . $integration->extra; - } - - if ( ! empty( $integration->read_more_label ) ) { - $help_text .= ' '; - $help_text .= sprintf( - '%2$s', - esc_url( WPSEO_Shortlinker::get( $integration->read_more_url ) ), - esc_html( $integration->read_more_label ) - ); - } - - $feature_help = new WPSEO_Admin_Help_Panel( - WPSEO_Option::ALLOW_KEY_PREFIX . $integration->setting, - /* translators: Hidden accessibility text; %s expands to an integration's name. */ - sprintf( esc_html__( 'Help on: %s', 'wordpress-seo' ), esc_html( $integration->name ) ), - $help_text - ); - - $name = $integration->name; - if ( ! empty( $integration->premium ) && $integration->premium === true ) { - $name .= ' ' . new Premium_Badge_Presenter( $integration->name ); - } - - if ( ! empty( $integration->new ) && $integration->new === true ) { - $name .= ' ' . new Badge_Presenter( $integration->name ); - } - - $disabled = $integration->disabled; - $show_premium_upsell = false; - $premium_upsell_url = ''; - - if ( $integration->premium === true && YoastSEO()->helpers->product->is_premium() === false ) { - $disabled = true; - $show_premium_upsell = true; - $premium_upsell_url = WPSEO_Shortlinker::get( $integration->premium_upsell_url ); - } - - $preserve_disabled_value = false; - if ( $disabled ) { - $preserve_disabled_value = true; - } - - $yform->toggle_switch( - WPSEO_Option::ALLOW_KEY_PREFIX . $integration->setting, - [ - 'on' => __( 'Allow Control', 'wordpress-seo' ), - 'off' => __( 'Disable', 'wordpress-seo' ), - ], - $name, - $feature_help->get_button_html() . $feature_help->get_panel_html(), - [ - 'disabled' => $disabled, - 'preserve_disabled_value' => $preserve_disabled_value, - 'show_premium_upsell' => $show_premium_upsell, - 'premium_upsell_url' => $premium_upsell_url, - ] - ); - - do_action( 'Yoast\WP\SEO\admin_network_integration_after', $integration ); - } - ?> -
              -hidden( 'show_onboarding_notice', 'wpseo_show_onboarding_notice' ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/network/restore-site.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/network/restore-site.php deleted file mode 100644 index ce6701a9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/network/restore-site.php +++ /dev/null @@ -1,32 +0,0 @@ -' . esc_html__( 'Using this form you can reset a site to the default SEO settings.', 'wordpress-seo' ) . '

              '; - -if ( get_blog_count() <= 100 ) { - $network_admin = new Yoast_Network_Admin(); - - $yform->select( - 'site_id', - __( 'Site ID', 'wordpress-seo' ), - $network_admin->get_site_choices( false, true ) - ); -} -else { - $yform->textinput( 'site_id', __( 'Site ID', 'wordpress-seo' ) ); -} - -wp_nonce_field( 'wpseo-network-restore', 'restore_site_nonce', false ); -echo ''; diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/import-seo.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/import-seo.php deleted file mode 100644 index 9cac6366..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/import-seo.php +++ /dev/null @@ -1,127 +0,0 @@ -detect(); -if ( count( $import_check->needs_import ) === 0 ) { - echo '

              ', esc_html__( 'Import from other SEO plugins', 'wordpress-seo' ), '

              '; - echo '

              '; - printf( - /* translators: %s expands to Yoast SEO */ - esc_html__( '%s did not detect any plugin data from plugins it can import from.', 'wordpress-seo' ), - 'Yoast SEO' - ); - echo '

              '; - - return; -} - -/** - * Creates a select box given a name and plugins array. - * - * @param string $name Name field for the select field. - * @param array $plugins An array of plugins and classes. - * - * @return void - */ -function wpseo_import_external_select( $name, $plugins ) { - esc_html_e( 'Plugin: ', 'wordpress-seo' ); - echo ''; -} - -?> -

              -

              - -

              - -
              -

              -

              - -

              -
              - -
              -

              -

              - -

              -
              - needs_import ); - ?> - - -
              -
              - -
              -

              -

              - -

              -
              - -
              -

              -

              - ', - '' - ); - ?> -

              -
              - -
              -

              -

              - -

              -
              - needs_import ); - ?> - -
              -
              diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-export.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-export.php deleted file mode 100644 index d0a41961..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-export.php +++ /dev/null @@ -1,39 +0,0 @@ -export(); - return; -} - -$wpseo_export_phrase = sprintf( - /* translators: %1$s expands to Yoast SEO */ - __( 'Export your %1$s settings here, to copy them on another site.', 'wordpress-seo' ), - 'Yoast SEO' -); -?> - -

              -
              - - - -
              diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-import.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-import.php deleted file mode 100644 index 18a5bfe9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-import.php +++ /dev/null @@ -1,46 +0,0 @@ - -

              - -

              - -
              - -
              -
              - -
              diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tool-bulk-editor.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tool-bulk-editor.php deleted file mode 100644 index 354ba376..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tool-bulk-editor.php +++ /dev/null @@ -1,120 +0,0 @@ - $yoast_free_input_fields, - 'nonce' => wp_create_nonce( 'bulk-editor-table' ), -]; - -$wpseo_bulk_titles_table = new WPSEO_Bulk_Title_Editor_List_Table( $yoast_bulk_editor_arguments ); -$wpseo_bulk_description_table = new WPSEO_Bulk_Description_List_Table( $yoast_bulk_editor_arguments ); - -$yoast_free_screen_reader_content = [ - 'heading_views' => __( 'Filter posts list', 'wordpress-seo' ), - 'heading_pagination' => __( 'Posts list navigation', 'wordpress-seo' ), - 'heading_list' => __( 'Posts list', 'wordpress-seo' ), -]; -get_current_screen()->set_screen_reader_content( $yoast_free_screen_reader_content ); - -if ( ! empty( $_REQUEST['_wp_http_referer'] ) && isset( $_SERVER['REQUEST_URI'] ) ) { - $request_uri = sanitize_file_name( wp_unslash( $_SERVER['REQUEST_URI'] ) ); - - wp_redirect( - remove_query_arg( - [ '_wp_http_referer', '_wpnonce' ], - $request_uri - ) - ); - exit; -} - -/** - * Renders a bulk editor tab. - * - * @param WPSEO_Bulk_List_Table $table The table to render. - * @param string $id The id for the tab. - * - * @return void - */ -function wpseo_get_rendered_tab( $table, $id ) { - ?> -
              - show_page(); - ?> -
              - - - -

              - -
              - - - -
              - - -
              -
              diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tool-file-editor.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tool-file-editor.php deleted file mode 100644 index d28b5bf7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tool-file-editor.php +++ /dev/null @@ -1,244 +0,0 @@ -admin_header( false, 'wpseo_ms' ); -} -else { - $action_url = admin_url( 'admin.php?page=wpseo_tools&tool=file-editor' ); -} - -if ( isset( $msg ) && ! empty( $msg ) ) { - echo '

              ', esc_html( $msg ), '

              '; -} - -// N.B.: "robots.txt" is a fixed file name and should not be translatable. -echo '

              robots.txt

              '; - -if ( ! file_exists( $robots_file ) ) { - if ( is_writable( $home_path ) ) { - echo '
              '; - wp_nonce_field( 'wpseo_create_robots', '_wpnonce', true, true ); - echo '

              '; - printf( - /* translators: %s expands to robots.txt. */ - esc_html__( 'You don\'t have a %s file, create one here:', 'wordpress-seo' ), - 'robots.txt' - ); - echo '

              '; - - printf( - '', - sprintf( - /* translators: %s expands to robots.txt. */ - esc_attr__( 'Create %s file', 'wordpress-seo' ), - 'robots.txt' - ) - ); - echo '
              '; - } - else { - echo '

              '; - printf( - /* translators: %s expands to robots.txt. */ - esc_html__( 'If you had a %s file and it was editable, you could edit it from here.', 'wordpress-seo' ), - 'robots.txt' - ); - echo '

              '; - } -} -else { - $f = fopen( $robots_file, 'r' ); - - $content = ''; - if ( filesize( $robots_file ) > 0 ) { - $content = fread( $f, filesize( $robots_file ) ); - } - - if ( ! is_writable( $robots_file ) ) { - echo '

              '; - printf( - /* translators: %s expands to robots.txt. */ - esc_html__( 'If your %s were writable, you could edit it from here.', 'wordpress-seo' ), - 'robots.txt' - ); - echo '

              '; - echo '
              '; - } - else { - echo '
              '; - wp_nonce_field( 'wpseo-robotstxt', '_wpnonce', true, true ); - echo ''; - echo '
              '; - printf( - '
              ', - sprintf( - /* translators: %s expands to robots.txt. */ - esc_attr__( 'Save changes to %s', 'wordpress-seo' ), - 'robots.txt' - ) - ); - echo '
              '; - } -} -if ( ! WPSEO_Utils::is_nginx() ) { - - echo '

              '; - printf( - /* translators: %s expands to ".htaccess". */ - esc_html__( '%s file', 'wordpress-seo' ), - '.htaccess' - ); - echo '

              '; - - if ( file_exists( $ht_access_file ) ) { - $f = fopen( $ht_access_file, 'r' ); - - $contentht = ''; - if ( filesize( $ht_access_file ) > 0 ) { - $contentht = fread( $f, filesize( $ht_access_file ) ); - } - - if ( ! is_writable( $ht_access_file ) ) { - echo '

              '; - printf( - /* translators: %s expands to ".htaccess". */ - esc_html__( 'If your %s were writable, you could edit it from here.', 'wordpress-seo' ), - '.htaccess' - ); - echo '

              '; - echo '
              '; - } - else { - echo '
              '; - wp_nonce_field( 'wpseo-htaccess', '_wpnonce', true, true ); - echo ''; - echo '
              '; - printf( - '
              ', - sprintf( - /* translators: %s expands to ".htaccess". */ - esc_attr__( 'Save changes to %s', 'wordpress-seo' ), - '.htaccess' - ) - ); - echo '
              '; - } - } - else { - echo '

              '; - printf( - /* translators: %s expands to ".htaccess". */ - esc_html__( 'If you had a %s file and it was editable, you could edit it from here.', 'wordpress-seo' ), - '.htaccess' - ); - echo '

              '; - } -} - -if ( is_multisite() ) { - $yform->admin_footer( false ); -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tool-import-export.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tool-import-export.php deleted file mode 100644 index d2e0fd84..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tool-import-export.php +++ /dev/null @@ -1,123 +0,0 @@ -import(); -} - -/** - * Allow custom import actions. - * - * @param WPSEO_Import_Status $yoast_seo_import Contains info about the handled import. - */ -$yoast_seo_import = apply_filters( 'wpseo_handle_import', $yoast_seo_import ); - -if ( $yoast_seo_import ) { - - $yoast_seo_message = ''; - if ( $yoast_seo_import->status instanceof WPSEO_Import_Status ) { - $yoast_seo_message = $yoast_seo_import->status->get_msg(); - } - - /** - * Allow customization of import/export message. - * - * @param string $yoast_seo_msg The message. - */ - $yoast_seo_msg = apply_filters( 'wpseo_import_message', $yoast_seo_message ); - - if ( ! empty( $yoast_seo_msg ) ) { - $yoast_seo_status = 'error'; - if ( $yoast_seo_import->status->status ) { - $yoast_seo_status = 'updated'; - } - - $yoast_seo_class = 'message ' . $yoast_seo_status; - - echo '

              ', esc_html( $yoast_seo_msg ), '

              '; - } -} - -$yoast_seo_tabs = [ - 'wpseo-import' => [ - 'label' => __( 'Import settings', 'wordpress-seo' ), - ], - 'wpseo-export' => [ - 'label' => __( 'Export settings', 'wordpress-seo' ), - ], - 'import-seo' => [ - 'label' => __( 'Import from other SEO plugins', 'wordpress-seo' ), - ], -]; - -?> -

              - - - - $tab ) { - printf( '
              ', esc_attr( $identifier ) ); - require_once WPSEO_PATH . 'admin/views/tabs/tool/' . $identifier . '.php'; - echo '
              '; -} - -/** - * Allow adding a custom import tab. - */ -do_action( 'wpseo_import_tab_content' ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/user-profile.php b/wp/wp-content/plugins/wordpress-seo/admin/views/user-profile.php deleted file mode 100644 index a7b3e188..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/user-profile.php +++ /dev/null @@ -1,77 +0,0 @@ - - -
              - -

              - - - -
              - - -
              - - ID ) === 'on' ) ? 'checked' : ''; ?> /> -
              - - - - ID ) === 'on' ) ? 'checked' : ''; ?> /> - -
              -

              - -

              - - - - ID ) === 'on' ) ? 'checked' : ''; ?> /> - -
              -

              - -

              - - - - ID ) === 'on' ) ? 'checked' : ''; ?> /> - -
              -

              - -

              - - - -
              diff --git a/wp/wp-content/plugins/wordpress-seo/admin/watchers/class-slug-change-watcher.php b/wp/wp-content/plugins/wordpress-seo/admin/watchers/class-slug-change-watcher.php deleted file mode 100644 index 68d18616..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/watchers/class-slug-change-watcher.php +++ /dev/null @@ -1,256 +0,0 @@ -helpers->product->is_premium() ) { - return; - } - - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - - // Detect a post trash. - add_action( 'wp_trash_post', [ $this, 'detect_post_trash' ] ); - - // Detect a post delete. - add_action( 'before_delete_post', [ $this, 'detect_post_delete' ] ); - - // Detects deletion of a term. - add_action( 'delete_term_taxonomy', [ $this, 'detect_term_delete' ] ); - } - - /** - * Enqueues the quick edit handler. - * - * @return void - */ - public function enqueue_assets() { - global $pagenow; - - if ( ! in_array( $pagenow, [ 'edit.php', 'edit-tags.php' ], true ) ) { - return; - } - - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_script( 'quick-edit-handler' ); - } - - /** - * Shows a message when a post is about to get trashed. - * - * @param int $post_id The current post ID. - * - * @return void - */ - public function detect_post_trash( $post_id ) { - if ( ! $this->is_post_viewable( $post_id ) ) { - return; - } - - $post_label = $this->get_post_type_label( get_post_type( $post_id ) ); - - /* translators: %1$s expands to the translated name of the post type. */ - $first_sentence = sprintf( __( 'You just trashed a %1$s.', 'wordpress-seo' ), $post_label ); - $second_sentence = __( 'Search engines and other websites can still send traffic to your trashed content.', 'wordpress-seo' ); - $message = $this->get_message( $first_sentence, $second_sentence ); - - $this->add_notification( $message ); - } - - /** - * Shows a message when a post is about to get trashed. - * - * @param int $post_id The current post ID. - * - * @return void - */ - public function detect_post_delete( $post_id ) { - if ( ! $this->is_post_viewable( $post_id ) ) { - return; - } - - $post_label = $this->get_post_type_label( get_post_type( $post_id ) ); - - /* translators: %1$s expands to the translated name of the post type. */ - $first_sentence = sprintf( __( 'You just deleted a %1$s.', 'wordpress-seo' ), $post_label ); - $second_sentence = __( 'Search engines and other websites can still send traffic to your deleted content.', 'wordpress-seo' ); - $message = $this->get_message( $first_sentence, $second_sentence ); - - $this->add_notification( $message ); - } - - /** - * Shows a message when a term is about to get deleted. - * - * @param int $term_taxonomy_id The term taxonomy ID that will be deleted. - * - * @return void - */ - public function detect_term_delete( $term_taxonomy_id ) { - if ( ! $this->is_term_viewable( $term_taxonomy_id ) ) { - return; - } - - $term = get_term_by( 'term_taxonomy_id', (int) $term_taxonomy_id ); - $term_label = $this->get_taxonomy_label_for_term( $term->term_id ); - - /* translators: %1$s expands to the translated name of the term. */ - $first_sentence = sprintf( __( 'You just deleted a %1$s.', 'wordpress-seo' ), $term_label ); - $second_sentence = __( 'Search engines and other websites can still send traffic to your deleted content.', 'wordpress-seo' ); - $message = $this->get_message( $first_sentence, $second_sentence ); - - $this->add_notification( $message ); - } - - /** - * Checks if the post is viewable. - * - * @param string $post_id The post id to check. - * - * @return bool Whether the post is viewable or not. - */ - protected function is_post_viewable( $post_id ) { - $post_type = get_post_type( $post_id ); - if ( ! WPSEO_Post_Type::is_post_type_accessible( $post_type ) ) { - return false; - } - - $post_status = get_post_status( $post_id ); - if ( ! $this->check_visible_post_status( $post_status ) ) { - return false; - } - - return true; - } - - /** - * Checks if the term is viewable. - * - * @param int $term_taxonomy_id The term taxonomy ID to check. - * - * @return bool Whether the term is viewable or not. - */ - protected function is_term_viewable( $term_taxonomy_id ) { - $term = get_term_by( 'term_taxonomy_id', (int) $term_taxonomy_id ); - - if ( ! $term || is_wp_error( $term ) ) { - return false; - } - - $taxonomy = get_taxonomy( $term->taxonomy ); - if ( ! $taxonomy ) { - return false; - } - - return $taxonomy->publicly_queryable || $taxonomy->public; - } - - /** - * Gets the taxonomy label to use for a term. - * - * @param int $term_id The term ID. - * - * @return string The taxonomy's singular label. - */ - protected function get_taxonomy_label_for_term( $term_id ) { - $term = get_term( $term_id ); - $taxonomy = get_taxonomy( $term->taxonomy ); - - return $taxonomy->labels->singular_name; - } - - /** - * Retrieves the singular post type label. - * - * @param string $post_type Post type to retrieve label from. - * - * @return string The singular post type name. - */ - protected function get_post_type_label( $post_type ) { - $post_type_object = get_post_type_object( $post_type ); - - // If the post type of this post wasn't registered default back to post. - if ( $post_type_object === null ) { - $post_type_object = get_post_type_object( 'post' ); - } - - return $post_type_object->labels->singular_name; - } - - /** - * Checks whether the given post status is visible or not. - * - * @param string $post_status The post status to check. - * - * @return bool Whether or not the post is visible. - */ - protected function check_visible_post_status( $post_status ) { - $visible_post_statuses = [ - 'publish', - 'static', - 'private', - ]; - - return in_array( $post_status, $visible_post_statuses, true ); - } - - /** - * Returns the message around changed URLs. - * - * @param string $first_sentence The first sentence of the notification. - * @param string $second_sentence The second sentence of the notification. - * - * @return string The full notification. - */ - protected function get_message( $first_sentence, $second_sentence ) { - return '

              ' . __( 'Make sure you don\'t miss out on traffic!', 'wordpress-seo' ) . '

              ' - . '

              ' - . $first_sentence - . ' ' . $second_sentence - . ' ' . __( 'You should create a redirect to ensure your visitors do not get a 404 error when they click on the no longer working URL.', 'wordpress-seo' ) - /* translators: %s expands to Yoast SEO Premium */ - . ' ' . sprintf( __( 'With %s, you can easily create such redirects.', 'wordpress-seo' ), 'Yoast SEO Premium' ) - . '

              ' - . '

              ' - /* translators: %s expands to Yoast SEO Premium */ - . sprintf( __( 'Get %s', 'wordpress-seo' ), 'Yoast SEO Premium' ) - /* translators: Hidden accessibility text. */ - . '' . __( '(Opens in a new browser tab)', 'wordpress-seo' ) . '' - . '' - . '

              '; - } - - /** - * Adds a notification to be shown on the next page request since posts are updated in an ajax request. - * - * @param string $message The message to add to the notification. - * - * @return void - */ - protected function add_notification( $message ) { - $notification = new Yoast_Notification( - $message, - [ - 'type' => 'notice-warning is-dismissible', - 'yoast_branding' => true, - ] - ); - - $notification_center = Yoast_Notification_Center::get(); - $notification_center->add_notification( $notification ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/blocks/dynamic-blocks/breadcrumbs/block.json b/wp/wp-content/plugins/wordpress-seo/blocks/dynamic-blocks/breadcrumbs/block.json deleted file mode 100644 index 33ecb48c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/blocks/dynamic-blocks/breadcrumbs/block.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "https://schemas.wp.org/trunk/block.json", - "apiVersion": 3, - "version": "22.8", - "name": "yoast-seo/breadcrumbs", - "title": "Yoast Breadcrumbs", - "description": "Adds the Yoast SEO breadcrumbs to your template or content.", - "category": "yoast-internal-linking-blocks", - "icon": "admin-links", - "keywords": [ - "SEO", - "breadcrumbs", - "internal linking", - "site structure" - ], - "textdomain": "wordpress-seo", - "attributes": { - "className": { - "type": "string" - } - }, - "example": { - "attributes": {} - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/faq/block.json b/wp/wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/faq/block.json deleted file mode 100644 index 649f1226..00000000 --- a/wp/wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/faq/block.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "$schema": "https://schemas.wp.org/trunk/block.json", - "apiVersion": 3, - "version": "22.7", - "name": "yoast/faq-block", - "title": "Yoast FAQ", - "description": "List your Frequently Asked Questions in an SEO-friendly way.", - "category": "yoast-structured-data-blocks", - "icon": "editor-ul", - "keywords": [ - "FAQ", - "Frequently Asked Questions", - "Schema", - "SEO", - "Structured Data" - ], - "textdomain": "wordpress-seo", - "attributes": { - "questions": { - "type": "array" - }, - "additionalListCssClasses": { - "type": "string" - } - }, - "example": { - "attributes": { - "steps": [ - { - "id": "faq-question-1", - "question": [ ], - "answer": [ ] - }, - { - "id": "faq-question-2", - "question": [ ], - "answer": [ ] - } - ] - } - }, - "editorScript": "yoast-seo-faq-block", - "editorStyle": "yoast-seo-structured-data-blocks" -} diff --git a/wp/wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/how-to/block.json b/wp/wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/how-to/block.json deleted file mode 100644 index 7a1cfe5e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/how-to/block.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$schema": "https://schemas.wp.org/trunk/block.json", - "apiVersion": 3, - "version": "22.7", - "name": "yoast/how-to-block", - "title": "Yoast How-to", - "description": "Create a How-to guide in an SEO-friendly way. You can only use one How-to block per post.", - "category": "yoast-structured-data-blocks", - "icon": "editor-ol", - "keywords": [ - "How-to", - "How to", - "Schema", - "SEO", - "Structured Data" - ], - "supports": { - "multiple": false - }, - "textdomain": "wordpress-seo", - "attributes": { - "hasDuration": { - "type": "boolean" - }, - "days": { - "type": "string" - }, - "hours": { - "type": "string" - }, - "minutes": { - "type": "string" - }, - "description": { - "type": "string", - "source": "html", - "selector": ".schema-how-to-description" - }, - "jsonDescription": { - "type": "string" - }, - "steps": { - "type": "array" - }, - "additionalListCssClasses": { - "type": "string" - }, - "unorderedList": { - "type": "boolean" - }, - "durationText": { - "type": "string" - }, - "defaultDurationText": { - "type": "string" - } - }, - "example": { - "attributes": { - "steps": [ - { - "id": "how-to-step-example-1", - "name": [ ], - "text": [ ] - }, - { - "id": "how-to-step-example-2", - "name": [ ], - "text": [ ] - } - ] - } - }, - "editorScript": "yoast-seo-how-to-block", - "editorStyle": "yoast-seo-structured-data-blocks" -} diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/academy-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/academy-2280-rtl.css deleted file mode 100644 index 752312db..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/academy-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.seo_page_wpseo_page_academy{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}.seo_page_wpseo_page_academy #wpcontent{padding-right:0!important}.seo_page_wpseo_page_academy #wpfooter{padding-left:1rem}@media (min-width:768px){.seo_page_wpseo_page_academy #wpfooter{padding-right:17rem;padding-left:2rem}}@media screen and (max-width:782px){.seo_page_wpseo_page_academy .wp-responsive-open #wpbody{left:-190px}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/academy-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/academy-2280.css deleted file mode 100644 index 6d15e7ef..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/academy-2280.css +++ /dev/null @@ -1 +0,0 @@ -.seo_page_wpseo_page_academy{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}.seo_page_wpseo_page_academy #wpcontent{padding-left:0!important}.seo_page_wpseo_page_academy #wpfooter{padding-right:1rem}@media (min-width:768px){.seo_page_wpseo_page_academy #wpfooter{padding-left:17rem;padding-right:2rem}}@media screen and (max-width:782px){.seo_page_wpseo_page_academy .wp-responsive-open #wpbody{right:-190px}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/admin-global-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/admin-global-2280-rtl.css deleted file mode 100644 index 3857bfc8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/admin-global-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-tooltip{position:relative}button.yoast-tooltip{overflow:visible}.yoast-tooltip:after{word-wrap:break-word;-webkit-font-smoothing:subpixel-antialiased;background:#000c;border-radius:3px;color:#fff;content:attr(aria-label);display:none;font:normal normal 11px/1.45454545 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;letter-spacing:normal;opacity:0;padding:6px 8px 5px;pointer-events:none;position:absolute;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;white-space:pre;z-index:1000000}.yoast-tooltip-alt:after{content:attr(data-label)}.yoast-tooltip:before{border:5px solid #0000;color:#000c;content:"\00a0";display:none;height:0;opacity:0;pointer-events:none;position:absolute;width:0;z-index:1000001}@keyframes yoast-tooltip-appear{0%{opacity:0}to{opacity:1}}.yoast-tooltip:active:after,.yoast-tooltip:active:before,.yoast-tooltip:focus:after,.yoast-tooltip:focus:before,.yoast-tooltip:hover:after,.yoast-tooltip:hover:before{animation-delay:.4s;animation-duration:.1s;animation-fill-mode:forwards;animation-name:yoast-tooltip-appear;animation-timing-function:ease-in;display:inline-block;text-decoration:none}.yoast-tooltip-no-delay:active:after,.yoast-tooltip-no-delay:active:before,.yoast-tooltip-no-delay:focus:after,.yoast-tooltip-no-delay:focus:before,.yoast-tooltip-no-delay:hover:after,.yoast-tooltip-no-delay:hover:before{animation:none;opacity:1}.yoast-tooltip-multiline:active:after,.yoast-tooltip-multiline:focus:after,.yoast-tooltip-multiline:hover:after{display:table-cell}.yoast-tooltip-s:after,.yoast-tooltip-se:after,.yoast-tooltip-sw:after{margin-top:5px;left:50%;top:100%}.yoast-tooltip-s:before,.yoast-tooltip-se:before,.yoast-tooltip-sw:before{border-bottom-color:#000c;bottom:-5px;margin-left:-5px;left:50%;top:auto}.yoast-tooltip-se:after{right:50%;margin-right:-15px;left:auto}.yoast-tooltip-sw:after{margin-left:-15px}.yoast-tooltip-n:after,.yoast-tooltip-ne:after,.yoast-tooltip-nw:after{bottom:100%;margin-bottom:5px;left:50%}.yoast-tooltip-n:before,.yoast-tooltip-ne:before,.yoast-tooltip-nw:before{border-top-color:#000c;bottom:auto;margin-left:-5px;left:50%;top:-5px}.yoast-tooltip-ne:after{right:50%;margin-right:-15px;left:auto}.yoast-tooltip-nw:after{margin-left:-15px}.yoast-tooltip-n:after,.yoast-tooltip-s:after{transform:translateX(-50%)}.yoast-tooltip-w:after{bottom:50%;margin-left:5px;left:100%;transform:translateY(50%)}.yoast-tooltip-w:before{border-right-color:#000c;bottom:50%;right:-5px;margin-top:-5px;top:50%}.yoast-tooltip-e:after{bottom:50%;right:100%;margin-right:5px;transform:translateY(50%)}.yoast-tooltip-e:before{border-left-color:#000c;bottom:50%;margin-top:-5px;left:-5px;top:50%}.yoast-tooltip-multiline:after{word-wrap:normal;border-collapse:initial;max-width:250px;white-space:pre-line;width:250px;width:max-content;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n:after,.yoast-tooltip-multiline.yoast-tooltip-s:after{right:50%;left:auto;transform:translateX(50%)}.yoast-tooltip-multiline.yoast-tooltip-e:after,.yoast-tooltip-multiline.yoast-tooltip-w:after{left:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline:after{width:250px}}.yoast-tooltip-sticky:after,.yoast-tooltip-sticky:before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline:after{display:table-cell}@media only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w:after{margin-left:4.5px}}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}.rtl .yst-icon-rtl{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.wpseo-premium-indicator{display:inline-block;height:1px;width:1px}#adminmenu .wpseo-premium-indicator{color:inherit;margin:-2px 2px -3px 0}.wpseo-premium-indicator svg{display:none;height:100%;width:auto}.yoast-measure{max-width:600px}.yoast-measure.padded{max-width:632px}#TB_window .wpseo_content_wrapper p{font-size:14px;font-style:normal}#TB_window .wpseo_content_wrapper label{font-size:14px;font-weight:600;margin:0 0 0 10px}.wpseo-premium-popup-title{font-size:1.3em!important;font-weight:600!important;margin:1em 0!important;padding:0!important}.wpseo-premium-popup-icon{margin:10px}.edit-tags-php .column-description img{height:auto;max-width:100%}.yoast-label-strong{font-weight:600}.yoast-video-container-max-width{max-width:560px}.yoast-video-container{height:0;overflow:hidden;padding-bottom:56.25%;position:relative}.yoast-video-container iframe{height:100%;right:0;position:absolute;top:0;width:100%}.yoast-settings{margin-bottom:2em;padding-right:220px}.yoast-settings h2{margin-bottom:0;margin-right:-220px}.yoast-settings label{color:#23282d;display:inline-block;font-size:14px;font-weight:600;line-height:1.3;margin-right:-220px;margin-left:6px;padding-left:10px;padding-top:4px;vertical-align:top;width:200px}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio,.yoast-settings fieldset,.yoast-settings input[type=text],.yoast-settings label,.yoast-settings select,.yoast-settings textarea{margin-bottom:.5em;margin-top:2em}.yoast-settings__textarea--medium{max-width:600px;width:100%}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio{position:relative;top:1px;vertical-align:top}.yoast-settings__group--checkbox,.yoast-settings__group--radio{padding-top:1em}.yoast-settings__group--checkbox .yoast-settings__checkbox,.yoast-settings__group--radio .yoast-settings__radio{margin:0 0 10px 4px}.yoast-settings__checkbox+label,.yoast-settings__radio+label{margin-right:0;margin-left:0;max-width:calc(100% - 25px);padding:0;width:auto}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{font-weight:400;margin-bottom:10px;margin-top:0}.yoast-settings legend{color:#23282d;font-size:14px;font-weight:600}.yoast-settings .description{font-size:14px;margin-top:0}td .wpseo-score-icon{background:#888;border-radius:50%;display:inline-block;height:12px;line-height:16px;margin-right:5px;margin-top:3px;width:12px}.fixed th.column-wpseo-linked,.fixed th.column-wpseo-links,.fixed th.column-wpseo-score,.fixed th.column-wpseo-score-readability{padding:0;width:3em}.fixed th.column-wpseo-score-readability.sortable,.fixed th.column-wpseo-score-readability.sorted,.fixed th.column-wpseo-score.sortable,.fixed th.column-wpseo-score.sorted{width:3.5em}th.column-wpseo-linked a,th.column-wpseo-links a,th.column-wpseo-score .yoast-tooltip,th.column-wpseo-score-readability .yoast-tooltip{display:inline-block;overflow:visible;padding:8px 0;vertical-align:middle}th.column-wpseo-score .yoast-tooltip,th.column-wpseo-score-readability .yoast-tooltip{padding:8px 11px}th.column-wpseo-score-readability.sortable .yoast-tooltip,th.column-wpseo-score-readability.sorted .yoast-tooltip,th.column-wpseo-score.sortable .yoast-tooltip,th.column-wpseo-score.sorted .yoast-tooltip{padding-left:0}.column-wpseo-links .yoast-tooltip-multiline:after{max-width:160px}.column-wpseo-linked .yoast-tooltip-multiline:after{max-width:170px}.yoast-column-header-has-tooltip{position:relative}.manage-column .yoast-column-header-has-tooltip:before{color:#444;content:"";display:inline-block;height:20px;padding:0;text-decoration:none!important;vertical-align:top;width:20px}.manage-column .yoast-linked-to:before{background:#0000 url(../../images/link-out-icon.svg) no-repeat 100% 0;background-size:20px}.manage-column .yoast-linked-from:before{background:#0000 url(../../images/link-in-icon.svg) no-repeat 100% 0;background-size:20px}.manage-column .yoast-column-seo-score:before{background:#0000 url(../../images/Yoast_SEO_negative_icon.svg) no-repeat 100% 0;background-size:20px}.manage-column .yoast-column-readability:before{background:#0000 url(../../images/readability-icon.svg) no-repeat 100% 0;background-size:20px}td.column-wpseo-linked,td.column-wpseo-links{word-wrap:normal}@media screen and (max-width:782px){.yoast-settings{padding-right:0}.yoast-settings h2{margin-right:0}.yoast-settings label{margin-right:0;margin-left:0;padding:0;width:auto}.yoast .yoast-settings__radio,.yoast-settings__radio+label{margin-bottom:1em}.yoast-settings__checkbox+label,.yoast-settings__radio+label{max-width:calc(100% - 35px);padding-top:8px}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{padding-top:4px}.yoast-settings input[type=text],.yoast-settings select,.yoast-settings textarea{box-sizing:border-box;display:block;line-height:1.5;margin-bottom:0;margin-top:0;max-width:none;padding:7px 10px;width:100%}.screen-reader-text.wpseo-score-text{-webkit-clip-path:none;clip-path:none;height:auto;margin:0;position:static!important;width:auto}}.react-tabs__tab-panel{margin:0 auto;max-width:900px}.react-tabs__tab-panel li{max-width:none!important}.contact-premium-support{text-align:center}.contact-premium-support__content{font-size:.9375rem;line-height:1.4;margin:0 auto 1.5em}.contact-premium-support__content:nth-child(2){max-width:610px}.contact-premium-support__content:nth-child(3){max-width:560px}.contact-premium-support .contact-premium-support__button{margin-bottom:48px}.wpseo-premium-description{margin-top:.5em}.wpseo-premium-advantages-list{list-style:disc;padding-right:1.5em}.yoast_help.yoast-help-button,.yoast_help.yoast-help-link{background:#0000;border:0;box-shadow:none;color:#72777c;cursor:pointer;height:20px;margin:0;outline:none;padding:0;position:relative;vertical-align:top;width:20px}.yoast-section .yoast_help.yoast-help-button{float:left}.help-button-inline .yoast_help.yoast-help-button{margin-top:-4px}.yoast-section .yoast_help.yoast-help-button{margin-top:-44px}.wpseo-admin-page .yoast_help.yoast-help-button{margin-left:6px}.yoast_help .yoast-help-icon:before{content:"\f223";right:0;padding:4px;position:absolute;top:0}.yoast_help.yoast-help-button:focus,.yoast_help.yoast-help-button:hover,.yoast_help.yoast-help-link:hover{color:#0073aa}.assessment-results__mark:focus,.yoast_help.yoast-help-button:focus .yoast-help-icon:before,.yoast_help.yoast-help-link:focus .yoast-help-icon:before{border-radius:100%;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc}.yoast-help-panel{clear:both;display:none;font-weight:400;max-width:30em!important;padding:0 0 1em;white-space:normal}.wpseo-admin-page .yoast-help-panel{max-width:600px!important}.copy-home-meta-description{margin-top:1em}.copy-home-meta-description .yoast-help-panel{max-width:400px!important}.yoast-modal_is-open{overflow:hidden}.yoast-notification .yoast-seo-icon{float:right;margin:20px 10px}.yoast-notification .yoast-seo-icon-wrap{margin:0 85px 0 0}.yoast-button-upsell{align-items:center;background-color:#fec228;border-radius:4px;box-shadow:inset 0 -4px 0 #0003;box-sizing:border-box;color:#000;display:inline-flex;filter:drop-shadow(0 2px 4px rgba(0,0,0,.2));font-family:Arial,sans-serif;font-size:16px;justify-content:center;line-height:1.5;min-height:48px;padding:8px 1em;text-decoration:none}.yoast-button-upsell:active,.yoast-button-upsell:focus,.yoast-button-upsell:hover{background-color:#f2ae01;color:#000}.yoast-button-upsell:focus{box-shadow:inset 0 -4px 0 #0003,0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc}.yoast-button-upsell:active{box-shadow:none;filter:none;transform:translateY(1px)}.yoast-button-upsell#wpseo-premium-button{color:#000}.yoast-button-upsell__caret{background:#0000 var(--yoast-svg-icon-caret-right) center no-repeat;flex-shrink:0;height:16px;margin:0 6px 0 -2px;width:8px}.rtl .yoast-button-upsell__caret{background-image:var(--yoast-svg-icon-caret-left)}body.folded .wpseo-admin-submit-fixed{right:36px}@media screen and (max-width:782px){body.folded .wpseo-admin-submit-fixed{right:0}}.wpseo-admin-submit{align-items:baseline;display:flex;justify-content:flex-start;margin:0;padding:16px 0;z-index:5}.wpseo-admin-submit.wpseo-admin-submit-fixed{background-color:#fff;bottom:0;box-shadow:0 1px 8px 1px #00000080;padding:16px;position:fixed;width:600px}@media screen and (max-width:782px){.wpseo-admin-submit.wpseo-admin-submit-fixed{right:0;width:782px}}.wpseo-admin-submit p.submit{margin:0;padding:0}.wpseo-admin-submit p.wpseo-message{color:#008a00;margin:0 0 0 16px;padding:0}.yoast-site-health__signature{color:#707070;display:flex;font-size:12px;line-height:20px;margin-top:2em}.yoast-site-health__inline-button.fetch-status,.yoast-site-health__signature-icon{margin-left:8px}#wpadminbar .yoast-badge,.yoast-badge{border-radius:8px;display:inline-block;font-weight:600;line-height:1.6;padding:0 8px}.yoast-badge{font-size:10px;min-height:16px}.yoast-badge--sale{background-color:#a4286a;border-radius:999px!important;color:#fff;font-size:12px!important;margin-top:-24px;position:absolute;left:30px;transform:rotate(-14deg)}@media (max-width:1024px){.yoast-badge--sale{display:inline-block;position:unset;vertical-align:top}}.yoast-badge__is-link:focus,.yoast-badge__is-link:hover{background-color:#004973;box-shadow:none;color:#fff;outline:none}#wpadminbar .yoast-badge,.wp-submenu .yoast-badge{font-size:9px;min-height:14px}.yoast-new-badge{background-color:#cce5ff;color:#004973}.yoast-premium-badge{background-color:#fff3cd;color:#674e00}.yoast-beta-badge{background-color:#cce5ff;color:#004973}.yoast-badge__is-link{text-decoration:none}.switch-container .yoast-badge{vertical-align:-1em}.switch-container legend .yoast-badge{vertical-align:0}.yoast_help+.yoast-badge{vertical-align:bottom}.yoast #crawl-settings fieldset[id$=_disabled],.yoast #crawl-settings p.disabled,.yoast label[for=clean_permalinks_extra_variables_free],.yoast label[for=search_character_limit_free],.yoast p.yoast-extra-variables-label-free{opacity:.5}.yoast #crawl-settings fieldset[id$=_disabled] .switch-toggle.switch-yoast-seo input:disabled~a{background:#a4286a;border:1px solid #b5b5b5}.yoast label[for^=search_character_limit]{font-weight:600;margin-bottom:10px!important;padding-right:2px;width:320px!important}.yoast input[id^=search_character_limit]{width:70px!important}.yoast label[for^=clean_permalinks_extra_variables]{font-weight:600;padding-right:2px;width:240px!important}.yoast input[id^=clean_permalinks_extra_variables]{width:358px!important}.yoast .yoast-crawl-single-setting{margin-top:18px}.yoast p[class*=yoast-extra-variables-label]{padding-right:243px!important}@media screen and (max-width:782px){.yoast p[class*=yoast-extra-variables-label]{margin-top:-20px!important;padding-right:0!important}}.yoast .yoast-crawl-settings-help{font-style:italic}.notice-yoast{background:#fff;border:1px solid #c3c4c7;border-right:4px solid var(--yoast-color-primary);box-shadow:0 1px 1px #0000000a;margin:20px 0 15px;padding:1px 12px}#black-friday-2023-product-editor-checklist .notice-yoast__container{padding:0 5px}.notice-yoast.is-dismissible{padding-left:38px;position:relative}.notice-yoast__container{padding:10px 0 5px}.notice-yoast__container,.notice-yoast__header{align-items:center;display:flex;flex-direction:row}.notice-yoast__header{box-sizing:border-box;justify-content:left;margin-bottom:8px;padding:0;width:100%}.notice-yoast__header .notice-yoast__header-heading{line-height:1.2;margin:0;padding:0}.notice-yoast__header h2.notice-yoast__header-heading{color:var(--yoast-color-primary);font-size:14px;font-weight:600;line-height:1;margin:0}.notice-yoast__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:14px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:14px}.notice-yoast__content{display:flex;padding:0}.notice-yoast .notice-yoast__container>svg{height:60px;line-height:1;margin-right:10px;width:auto}.notice-yoast img{height:60px;line-height:1;margin-bottom:5px;margin-right:16px;width:auto}.notice-yoast p{font-size:13px;font-weight:400;line-height:19px;max-width:600px}.notice-yoast .yoast-button--small{min-height:unset}.notice-yoast .notice-dismiss{background:none;border:none;color:#787c82;cursor:pointer;margin:0;padding:9px;position:absolute;left:1px;top:0}.notice-yoast .notice-dismiss:before{speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:none;color:#787c82;content:"\f153";display:block;font:normal 16px/20px dashicons;height:20px;text-align:center;width:20px}.notice-yoast .notice-dismiss:hover:before{color:#d63638}.privacy-settings .notice-yoast{margin:0 20px}.yoast .yoast-crawl-settings-explanation-free,.yoast .yoast-crawl-settings-help-free{opacity:.5}.yoast h3.yoast-crawl-settings,.yoast h3.yoast-crawl-settings-free{margin:2em 0 .5em}.yoast .yoast-crawl-settings-disabled,.yoast h3.yoast-crawl-settings-free{opacity:.5}.yoast .indexables-indexing-error p{margin-bottom:13px}.yoast .indexables-indexing-error strong{font-weight:500}.yoast .indexables-indexing-error summary{font-weight:700}.yoast-dashicons-notice{color:#dba617}#black-friday-2023-promotion-sidebar.notice-yoast{background:#fff;border-color:#fcd34d;border-radius:8px;border-width:2px;margin:20px 0 15px;padding:1px 12px}#black-friday-2023-promotion-sidebar .notice-yoast__header{margin-bottom:2px}#black-friday-2023-promotion-metabox.notice-yoast{background:#fff;border-color:#fcd34d;border-radius:8px;border-width:2px;margin:20px}#black-friday-2023-promotion-metabox h2.notice-yoast__header-heading{padding:0}#black-friday-2023-promotion-metabox .notice-yoast__container{padding-bottom:0}#black-friday-2023-promotion-metabox .notice-yoast__container p{display:inline}#black-friday-2023-promotion-metabox .notice-yoast__header{margin-bottom:8px}#black-friday-2023-promotion-metabox .notice-yoast__header a{font-weight:400;margin-right:13px}.yoast-bf-sale-badge{display:block;right:12px;position:absolute;top:-10px}.yoast-bf-sale-badge,.yoast-menu-bf-sale-badge{background-color:#1f2937;border-radius:8px;color:#fcd34d;font-size:10px;font-weight:600;line-height:normal;padding:2px 8px}.yoast-menu-bf-sale-badge{border:1px solid #fcd34d;margin-right:5px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/admin-global-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/admin-global-2280.css deleted file mode 100644 index 18823abc..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/admin-global-2280.css +++ /dev/null @@ -1 +0,0 @@ -:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-tooltip{position:relative}button.yoast-tooltip{overflow:visible}.yoast-tooltip:after{word-wrap:break-word;-webkit-font-smoothing:subpixel-antialiased;background:#000c;border-radius:3px;color:#fff;content:attr(aria-label);display:none;font:normal normal 11px/1.45454545 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;letter-spacing:normal;opacity:0;padding:6px 8px 5px;pointer-events:none;position:absolute;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;white-space:pre;z-index:1000000}.yoast-tooltip-alt:after{content:attr(data-label)}.yoast-tooltip:before{border:5px solid #0000;color:#000c;content:"\00a0";display:none;height:0;opacity:0;pointer-events:none;position:absolute;width:0;z-index:1000001}@keyframes yoast-tooltip-appear{0%{opacity:0}to{opacity:1}}.yoast-tooltip:active:after,.yoast-tooltip:active:before,.yoast-tooltip:focus:after,.yoast-tooltip:focus:before,.yoast-tooltip:hover:after,.yoast-tooltip:hover:before{animation-delay:.4s;animation-duration:.1s;animation-fill-mode:forwards;animation-name:yoast-tooltip-appear;animation-timing-function:ease-in;display:inline-block;text-decoration:none}.yoast-tooltip-no-delay:active:after,.yoast-tooltip-no-delay:active:before,.yoast-tooltip-no-delay:focus:after,.yoast-tooltip-no-delay:focus:before,.yoast-tooltip-no-delay:hover:after,.yoast-tooltip-no-delay:hover:before{animation:none;opacity:1}.yoast-tooltip-multiline:active:after,.yoast-tooltip-multiline:focus:after,.yoast-tooltip-multiline:hover:after{display:table-cell}.yoast-tooltip-s:after,.yoast-tooltip-se:after,.yoast-tooltip-sw:after{margin-top:5px;right:50%;top:100%}.yoast-tooltip-s:before,.yoast-tooltip-se:before,.yoast-tooltip-sw:before{border-bottom-color:#000c;bottom:-5px;margin-right:-5px;right:50%;top:auto}.yoast-tooltip-se:after{left:50%;margin-left:-15px;right:auto}.yoast-tooltip-sw:after{margin-right:-15px}.yoast-tooltip-n:after,.yoast-tooltip-ne:after,.yoast-tooltip-nw:after{bottom:100%;margin-bottom:5px;right:50%}.yoast-tooltip-n:before,.yoast-tooltip-ne:before,.yoast-tooltip-nw:before{border-top-color:#000c;bottom:auto;margin-right:-5px;right:50%;top:-5px}.yoast-tooltip-ne:after{left:50%;margin-left:-15px;right:auto}.yoast-tooltip-nw:after{margin-right:-15px}.yoast-tooltip-n:after,.yoast-tooltip-s:after{transform:translateX(50%)}.yoast-tooltip-w:after{bottom:50%;margin-right:5px;right:100%;transform:translateY(50%)}.yoast-tooltip-w:before{border-left-color:#000c;bottom:50%;left:-5px;margin-top:-5px;top:50%}.yoast-tooltip-e:after{bottom:50%;left:100%;margin-left:5px;transform:translateY(50%)}.yoast-tooltip-e:before{border-right-color:#000c;bottom:50%;margin-top:-5px;right:-5px;top:50%}.yoast-tooltip-multiline:after{word-wrap:normal;border-collapse:initial;max-width:250px;white-space:pre-line;width:250px;width:max-content;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n:after,.yoast-tooltip-multiline.yoast-tooltip-s:after{left:50%;right:auto;transform:translateX(-50%)}.yoast-tooltip-multiline.yoast-tooltip-e:after,.yoast-tooltip-multiline.yoast-tooltip-w:after{right:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline:after{width:250px}}.yoast-tooltip-sticky:after,.yoast-tooltip-sticky:before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline:after{display:table-cell}@media only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w:after{margin-right:4.5px}}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}.rtl .yst-icon-rtl{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.wpseo-premium-indicator{display:inline-block;height:1px;width:1px}#adminmenu .wpseo-premium-indicator{color:inherit;margin:-2px 0 -3px 2px}.wpseo-premium-indicator svg{display:none;height:100%;width:auto}.yoast-measure{max-width:600px}.yoast-measure.padded{max-width:632px}#TB_window .wpseo_content_wrapper p{font-size:14px;font-style:normal}#TB_window .wpseo_content_wrapper label{font-size:14px;font-weight:600;margin:0 10px 0 0}.wpseo-premium-popup-title{font-size:1.3em!important;font-weight:600!important;margin:1em 0!important;padding:0!important}.wpseo-premium-popup-icon{margin:10px}.edit-tags-php .column-description img{height:auto;max-width:100%}.yoast-label-strong{font-weight:600}.yoast-video-container-max-width{max-width:560px}.yoast-video-container{height:0;overflow:hidden;padding-bottom:56.25%;position:relative}.yoast-video-container iframe{height:100%;left:0;position:absolute;top:0;width:100%}.yoast-settings{margin-bottom:2em;padding-left:220px}.yoast-settings h2{margin-bottom:0;margin-left:-220px}.yoast-settings label{color:#23282d;display:inline-block;font-size:14px;font-weight:600;line-height:1.3;margin-left:-220px;margin-right:6px;padding-right:10px;padding-top:4px;vertical-align:top;width:200px}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio,.yoast-settings fieldset,.yoast-settings input[type=text],.yoast-settings label,.yoast-settings select,.yoast-settings textarea{margin-bottom:.5em;margin-top:2em}.yoast-settings__textarea--medium{max-width:600px;width:100%}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio{position:relative;top:1px;vertical-align:top}.yoast-settings__group--checkbox,.yoast-settings__group--radio{padding-top:1em}.yoast-settings__group--checkbox .yoast-settings__checkbox,.yoast-settings__group--radio .yoast-settings__radio{margin:0 4px 10px 0}.yoast-settings__checkbox+label,.yoast-settings__radio+label{margin-left:0;margin-right:0;max-width:calc(100% - 25px);padding:0;width:auto}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{font-weight:400;margin-bottom:10px;margin-top:0}.yoast-settings legend{color:#23282d;font-size:14px;font-weight:600}.yoast-settings .description{font-size:14px;margin-top:0}td .wpseo-score-icon{background:#888;border-radius:50%;display:inline-block;height:12px;line-height:16px;margin-left:5px;margin-top:3px;width:12px}.fixed th.column-wpseo-linked,.fixed th.column-wpseo-links,.fixed th.column-wpseo-score,.fixed th.column-wpseo-score-readability{padding:0;width:3em}.fixed th.column-wpseo-score-readability.sortable,.fixed th.column-wpseo-score-readability.sorted,.fixed th.column-wpseo-score.sortable,.fixed th.column-wpseo-score.sorted{width:3.5em}th.column-wpseo-linked a,th.column-wpseo-links a,th.column-wpseo-score .yoast-tooltip,th.column-wpseo-score-readability .yoast-tooltip{display:inline-block;overflow:visible;padding:8px 0;vertical-align:middle}th.column-wpseo-score .yoast-tooltip,th.column-wpseo-score-readability .yoast-tooltip{padding:8px 11px}th.column-wpseo-score-readability.sortable .yoast-tooltip,th.column-wpseo-score-readability.sorted .yoast-tooltip,th.column-wpseo-score.sortable .yoast-tooltip,th.column-wpseo-score.sorted .yoast-tooltip{padding-right:0}.column-wpseo-links .yoast-tooltip-multiline:after{max-width:160px}.column-wpseo-linked .yoast-tooltip-multiline:after{max-width:170px}.yoast-column-header-has-tooltip{position:relative}.manage-column .yoast-column-header-has-tooltip:before{color:#444;content:"";display:inline-block;height:20px;padding:0;text-decoration:none!important;vertical-align:top;width:20px}.manage-column .yoast-linked-to:before{background:#0000 url(../../images/link-out-icon.svg) no-repeat 0 0;background-size:20px}.manage-column .yoast-linked-from:before{background:#0000 url(../../images/link-in-icon.svg) no-repeat 0 0;background-size:20px}.manage-column .yoast-column-seo-score:before{background:#0000 url(../../images/Yoast_SEO_negative_icon.svg) no-repeat 0 0;background-size:20px}.manage-column .yoast-column-readability:before{background:#0000 url(../../images/readability-icon.svg) no-repeat 0 0;background-size:20px}td.column-wpseo-linked,td.column-wpseo-links{word-wrap:normal}@media screen and (max-width:782px){.yoast-settings{padding-left:0}.yoast-settings h2{margin-left:0}.yoast-settings label{margin-left:0;margin-right:0;padding:0;width:auto}.yoast .yoast-settings__radio,.yoast-settings__radio+label{margin-bottom:1em}.yoast-settings__checkbox+label,.yoast-settings__radio+label{max-width:calc(100% - 35px);padding-top:8px}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{padding-top:4px}.yoast-settings input[type=text],.yoast-settings select,.yoast-settings textarea{box-sizing:border-box;display:block;line-height:1.5;margin-bottom:0;margin-top:0;max-width:none;padding:7px 10px;width:100%}.screen-reader-text.wpseo-score-text{-webkit-clip-path:none;clip-path:none;height:auto;margin:0;position:static!important;width:auto}}.react-tabs__tab-panel{margin:0 auto;max-width:900px}.react-tabs__tab-panel li{max-width:none!important}.contact-premium-support{text-align:center}.contact-premium-support__content{font-size:.9375rem;line-height:1.4;margin:0 auto 1.5em}.contact-premium-support__content:nth-child(2){max-width:610px}.contact-premium-support__content:nth-child(3){max-width:560px}.contact-premium-support .contact-premium-support__button{margin-bottom:48px}.wpseo-premium-description{margin-top:.5em}.wpseo-premium-advantages-list{list-style:disc;padding-left:1.5em}.yoast_help.yoast-help-button,.yoast_help.yoast-help-link{background:#0000;border:0;box-shadow:none;color:#72777c;cursor:pointer;height:20px;margin:0;outline:none;padding:0;position:relative;vertical-align:top;width:20px}.yoast-section .yoast_help.yoast-help-button{float:right}.help-button-inline .yoast_help.yoast-help-button{margin-top:-4px}.yoast-section .yoast_help.yoast-help-button{margin-top:-44px}.wpseo-admin-page .yoast_help.yoast-help-button{margin-right:6px}.yoast_help .yoast-help-icon:before{content:"\f223";left:0;padding:4px;position:absolute;top:0}.yoast_help.yoast-help-button:focus,.yoast_help.yoast-help-button:hover,.yoast_help.yoast-help-link:hover{color:#0073aa}.assessment-results__mark:focus,.yoast_help.yoast-help-button:focus .yoast-help-icon:before,.yoast_help.yoast-help-link:focus .yoast-help-icon:before{border-radius:100%;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc}.yoast-help-panel{clear:both;display:none;font-weight:400;max-width:30em!important;padding:0 0 1em;white-space:normal}.wpseo-admin-page .yoast-help-panel{max-width:600px!important}.copy-home-meta-description{margin-top:1em}.copy-home-meta-description .yoast-help-panel{max-width:400px!important}.yoast-modal_is-open{overflow:hidden}.yoast-notification .yoast-seo-icon{float:left;margin:20px 10px}.yoast-notification .yoast-seo-icon-wrap{margin:0 0 0 85px}.yoast-button-upsell{align-items:center;background-color:#fec228;border-radius:4px;box-shadow:inset 0 -4px 0 #0003;box-sizing:border-box;color:#000;display:inline-flex;filter:drop-shadow(0 2px 4px rgba(0,0,0,.2));font-family:Arial,sans-serif;font-size:16px;justify-content:center;line-height:1.5;min-height:48px;padding:8px 1em;text-decoration:none}.yoast-button-upsell:active,.yoast-button-upsell:focus,.yoast-button-upsell:hover{background-color:#f2ae01;color:#000}.yoast-button-upsell:focus{box-shadow:inset 0 -4px 0 #0003,0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc}.yoast-button-upsell:active{box-shadow:none;filter:none;transform:translateY(1px)}.yoast-button-upsell#wpseo-premium-button{color:#000}.yoast-button-upsell__caret{background:#0000 var(--yoast-svg-icon-caret-right) center no-repeat;flex-shrink:0;height:16px;margin:0 -2px 0 6px;width:8px}.rtl .yoast-button-upsell__caret{background-image:var(--yoast-svg-icon-caret-left)}body.folded .wpseo-admin-submit-fixed{left:36px}@media screen and (max-width:782px){body.folded .wpseo-admin-submit-fixed{left:0}}.wpseo-admin-submit{align-items:baseline;display:flex;justify-content:flex-start;margin:0;padding:16px 0;z-index:5}.wpseo-admin-submit.wpseo-admin-submit-fixed{background-color:#fff;bottom:0;box-shadow:0 1px 8px 1px #00000080;padding:16px;position:fixed;width:600px}@media screen and (max-width:782px){.wpseo-admin-submit.wpseo-admin-submit-fixed{left:0;width:782px}}.wpseo-admin-submit p.submit{margin:0;padding:0}.wpseo-admin-submit p.wpseo-message{color:#008a00;margin:0 16px 0 0;padding:0}.yoast-site-health__signature{color:#707070;display:flex;font-size:12px;line-height:20px;margin-top:2em}.yoast-site-health__inline-button.fetch-status,.yoast-site-health__signature-icon{margin-right:8px}#wpadminbar .yoast-badge,.yoast-badge{border-radius:8px;display:inline-block;font-weight:600;line-height:1.6;padding:0 8px}.yoast-badge{font-size:10px;min-height:16px}.yoast-badge--sale{background-color:#a4286a;border-radius:999px!important;color:#fff;font-size:12px!important;margin-top:-24px;position:absolute;right:30px;transform:rotate(14deg)}@media (max-width:1024px){.yoast-badge--sale{display:inline-block;position:unset;vertical-align:top}}.yoast-badge__is-link:focus,.yoast-badge__is-link:hover{background-color:#004973;box-shadow:none;color:#fff;outline:none}#wpadminbar .yoast-badge,.wp-submenu .yoast-badge{font-size:9px;min-height:14px}.yoast-new-badge{background-color:#cce5ff;color:#004973}.yoast-premium-badge{background-color:#fff3cd;color:#674e00}.yoast-beta-badge{background-color:#cce5ff;color:#004973}.yoast-badge__is-link{text-decoration:none}.switch-container .yoast-badge{vertical-align:-1em}.switch-container legend .yoast-badge{vertical-align:0}.yoast_help+.yoast-badge{vertical-align:bottom}.yoast #crawl-settings fieldset[id$=_disabled],.yoast #crawl-settings p.disabled,.yoast label[for=clean_permalinks_extra_variables_free],.yoast label[for=search_character_limit_free],.yoast p.yoast-extra-variables-label-free{opacity:.5}.yoast #crawl-settings fieldset[id$=_disabled] .switch-toggle.switch-yoast-seo input:disabled~a{background:#a4286a;border:1px solid #b5b5b5}.yoast label[for^=search_character_limit]{font-weight:600;margin-bottom:10px!important;padding-left:2px;width:320px!important}.yoast input[id^=search_character_limit]{width:70px!important}.yoast label[for^=clean_permalinks_extra_variables]{font-weight:600;padding-left:2px;width:240px!important}.yoast input[id^=clean_permalinks_extra_variables]{width:358px!important}.yoast .yoast-crawl-single-setting{margin-top:18px}.yoast p[class*=yoast-extra-variables-label]{padding-left:243px!important}@media screen and (max-width:782px){.yoast p[class*=yoast-extra-variables-label]{margin-top:-20px!important;padding-left:0!important}}.yoast .yoast-crawl-settings-help{font-style:italic}.notice-yoast{background:#fff;border:1px solid #c3c4c7;border-left:4px solid var(--yoast-color-primary);box-shadow:0 1px 1px #0000000a;margin:20px 0 15px;padding:1px 12px}#black-friday-2023-product-editor-checklist .notice-yoast__container{padding:0 5px}.notice-yoast.is-dismissible{padding-right:38px;position:relative}.notice-yoast__container{padding:10px 0 5px}.notice-yoast__container,.notice-yoast__header{align-items:center;display:flex;flex-direction:row}.notice-yoast__header{box-sizing:border-box;justify-content:left;margin-bottom:8px;padding:0;width:100%}.notice-yoast__header .notice-yoast__header-heading{line-height:1.2;margin:0;padding:0}.notice-yoast__header h2.notice-yoast__header-heading{color:var(--yoast-color-primary);font-size:14px;font-weight:600;line-height:1;margin:0}.notice-yoast__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:14px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:14px}.notice-yoast__content{display:flex;padding:0}.notice-yoast .notice-yoast__container>svg{height:60px;line-height:1;margin-left:10px;width:auto}.notice-yoast img{height:60px;line-height:1;margin-bottom:5px;margin-left:16px;width:auto}.notice-yoast p{font-size:13px;font-weight:400;line-height:19px;max-width:600px}.notice-yoast .yoast-button--small{min-height:unset}.notice-yoast .notice-dismiss{background:none;border:none;color:#787c82;cursor:pointer;margin:0;padding:9px;position:absolute;right:1px;top:0}.notice-yoast .notice-dismiss:before{speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:none;color:#787c82;content:"\f153";display:block;font:normal 16px/20px dashicons;height:20px;text-align:center;width:20px}.notice-yoast .notice-dismiss:hover:before{color:#d63638}.privacy-settings .notice-yoast{margin:0 20px}.yoast .yoast-crawl-settings-explanation-free,.yoast .yoast-crawl-settings-help-free{opacity:.5}.yoast h3.yoast-crawl-settings,.yoast h3.yoast-crawl-settings-free{margin:2em 0 .5em}.yoast .yoast-crawl-settings-disabled,.yoast h3.yoast-crawl-settings-free{opacity:.5}.yoast .indexables-indexing-error p{margin-bottom:13px}.yoast .indexables-indexing-error strong{font-weight:500}.yoast .indexables-indexing-error summary{font-weight:700}.yoast-dashicons-notice{color:#dba617}#black-friday-2023-promotion-sidebar.notice-yoast{background:#fff;border-color:#fcd34d;border-radius:8px;border-width:2px;margin:20px 0 15px;padding:1px 12px}#black-friday-2023-promotion-sidebar .notice-yoast__header{margin-bottom:2px}#black-friday-2023-promotion-metabox.notice-yoast{background:#fff;border-color:#fcd34d;border-radius:8px;border-width:2px;margin:20px}#black-friday-2023-promotion-metabox h2.notice-yoast__header-heading{padding:0}#black-friday-2023-promotion-metabox .notice-yoast__container{padding-bottom:0}#black-friday-2023-promotion-metabox .notice-yoast__container p{display:inline}#black-friday-2023-promotion-metabox .notice-yoast__header{margin-bottom:8px}#black-friday-2023-promotion-metabox .notice-yoast__header a{font-weight:400;margin-left:13px}.yoast-bf-sale-badge{display:block;left:12px;position:absolute;top:-10px}.yoast-bf-sale-badge,.yoast-menu-bf-sale-badge{background-color:#1f2937;border-radius:8px;color:#fcd34d;font-size:10px;font-weight:600;line-height:normal;padding:2px 8px}.yoast-menu-bf-sale-badge{border:1px solid #fcd34d;margin-left:5px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/adminbar-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/adminbar-2280-rtl.css deleted file mode 100644 index ebbe7da7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/adminbar-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 3px 0 10px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}#wp-admin-bar-wpseo-menu .wpseo-score-icon{margin:10px 4px 0 0!important}#wp-admin-bar-wpseo-menu .wpseo-score-icon.adminbar-sub-menu-score{margin:11px 4px 0 0!important}#wp-admin-bar-wpseo-menu-default .ab-item{line-height:2.46153846!important}#wp-admin-bar-wpseo-menu .ab-submenu{margin-bottom:5px}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu #wp-admin-bar-wpseo-menu-default li#wp-admin-bar-wpseo-get-premium a{color:#fff!important;font-weight:700!important}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu #wp-admin-bar-wpseo-menu-default li#wp-admin-bar-wpseo-get-premium span{background:#1f2937;border:1px solid #fcd34d;border-radius:14px;color:#fcd34d;font-size:13px;font-weight:600;padding:1px 4px}#wpadminbar .yoast-menu-bf-sale-badge{background-color:#1f2937;border:1px solid #fcd34d;border-radius:8px;color:#fcd34d;font-size:10px;font-weight:600;line-height:normal;margin-right:5px;padding:2px 8px}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu .wpseo-focus-keyword{display:inline-block!important;max-width:100px!important;overflow:hidden;text-overflow:ellipsis!important;vertical-align:bottom;white-space:nowrap}#wpadminbar .yoast-badge{border-radius:8px;display:inline-block;font-weight:600;line-height:1.6;margin-right:4px;padding:0 8px}#wpadminbar .yoast-beta-badge{background-color:#cce5ff;color:#004973}#wpadminbar .yoast-premium-badge{background-color:#fff3cd;color:#674e00}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{background-color:#a4286a;border-radius:10px 0 10px 10px;box-shadow:-1px 1px 1px 1px grey;color:#fff;right:0;padding:2px 12px;position:absolute;top:32px;white-space:nowrap}#wpadminbar .yoast-issue-added{display:none}#wpadminbar .yoast-issue-counter{background-color:#d63638;border-radius:9px;color:#fff;display:inline;padding:1px 6px 1px 7px!important}#wpadminbar .yoast-logo.svg{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHN0eWxlPSJmaWxsOiM4Mjg3OGMiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48cGF0aCBkPSJNMjAzLjYgMzk1YzYuOC0xNy40IDYuOC0zNi42IDAtNTRsLTc5LjQtMjA0aDcwLjlsNDcuNyAxNDkuNCA3NC44LTIwNy42SDExNi40Yy00MS44IDAtNzYgMzQuMi03NiA3NlYzNTdjMCA0MS44IDM0LjIgNzYgNzYgNzZIMTczYzE2LTguOSAyNC42LTIyLjcgMzAuNi0zOHpNNDcxLjYgMTU0LjhjMC00MS44LTM0LjItNzYtNzYtNzZoLTNMMjg1LjcgMzY1Yy05LjYgMjYuNy0xOS40IDQ5LjMtMzAuMyA2OGgyMTYuMlYxNTQuOHoiLz48cGF0aCBkPSJtMzM4IDEuMy05My4zIDI1OS4xLTQyLjEtMTMxLjloLTg5LjFsODMuOCAyMTUuMmM2IDE1LjUgNiAzMi41IDAgNDgtNy40IDE5LTE5IDM3LjMtNTMgNDEuOWwtNy4yIDF2NzZoOC4zYzgxLjcgMCAxMTguOS01Ny4yIDE0OS42LTE0Mi45TDQzMS42IDEuM0gzMzh6TTI3OS40IDM2MmMtMzIuOSA5Mi02Ny42IDEyOC43LTEyNS43IDEzMS44di00NWMzNy41LTcuNSA1MS4zLTMxIDU5LjEtNTEuMSA3LjUtMTkuMyA3LjUtNDAuNyAwLTYwbC03NS0xOTIuN2g1Mi44bDUzLjMgMTY2LjggMTA1LjktMjk0aDU4LjFMMjc5LjQgMzYyeiIvPjwvc3ZnPg==");background-position:100% 6px;background-repeat:no-repeat;background-size:20px;float:right;height:30px;width:26px}#wpadminbar #wp-admin-bar-wpseo-licenses .ab-item{color:#f18500}@media screen and (max-width:782px){#wp-admin-bar-wpseo-menu .wpseo-score-icon{margin:16px 2px 0 10px!important}#wpadminbar #wp-admin-bar-wpseo-menu{display:block;position:static}#wpadminbar .yoast-logo.svg{background-position:50% 8px;background-size:30px;height:46px;width:52px}#wpadminbar .yoast-logo+.yoast-issue-counter{margin-right:-5px;margin-left:10px}#wpadminbar .ab-sub-wrapper .yoast-issue-counter{position:relative;top:-5px;vertical-align:text-top}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{line-height:1.8;top:46px;white-space:normal}#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-kwresearch,#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-settings{display:none}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/adminbar-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/adminbar-2280.css deleted file mode 100644 index 5d8fc6f3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/adminbar-2280.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 10px 0 3px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}#wp-admin-bar-wpseo-menu .wpseo-score-icon{margin:10px 0 0 4px!important}#wp-admin-bar-wpseo-menu .wpseo-score-icon.adminbar-sub-menu-score{margin:11px 0 0 4px!important}#wp-admin-bar-wpseo-menu-default .ab-item{line-height:2.46153846!important}#wp-admin-bar-wpseo-menu .ab-submenu{margin-bottom:5px}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu #wp-admin-bar-wpseo-menu-default li#wp-admin-bar-wpseo-get-premium a{color:#fff!important;font-weight:700!important}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu #wp-admin-bar-wpseo-menu-default li#wp-admin-bar-wpseo-get-premium span{background:#1f2937;border:1px solid #fcd34d;border-radius:14px;color:#fcd34d;font-size:13px;font-weight:600;padding:1px 4px}#wpadminbar .yoast-menu-bf-sale-badge{background-color:#1f2937;border:1px solid #fcd34d;border-radius:8px;color:#fcd34d;font-size:10px;font-weight:600;line-height:normal;margin-left:5px;padding:2px 8px}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu .wpseo-focus-keyword{display:inline-block!important;max-width:100px!important;overflow:hidden;text-overflow:ellipsis!important;vertical-align:bottom;white-space:nowrap}#wpadminbar .yoast-badge{border-radius:8px;display:inline-block;font-weight:600;line-height:1.6;margin-left:4px;padding:0 8px}#wpadminbar .yoast-beta-badge{background-color:#cce5ff;color:#004973}#wpadminbar .yoast-premium-badge{background-color:#fff3cd;color:#674e00}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{background-color:#a4286a;border-radius:0 10px 10px 10px;box-shadow:1px 1px 1px 1px grey;color:#fff;left:0;padding:2px 12px;position:absolute;top:32px;white-space:nowrap}#wpadminbar .yoast-issue-added{display:none}#wpadminbar .yoast-issue-counter{background-color:#d63638;border-radius:9px;color:#fff;display:inline;padding:1px 7px 1px 6px!important}#wpadminbar .yoast-logo.svg{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHN0eWxlPSJmaWxsOiM4Mjg3OGMiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48cGF0aCBkPSJNMjAzLjYgMzk1YzYuOC0xNy40IDYuOC0zNi42IDAtNTRsLTc5LjQtMjA0aDcwLjlsNDcuNyAxNDkuNCA3NC44LTIwNy42SDExNi40Yy00MS44IDAtNzYgMzQuMi03NiA3NlYzNTdjMCA0MS44IDM0LjIgNzYgNzYgNzZIMTczYzE2LTguOSAyNC42LTIyLjcgMzAuNi0zOHpNNDcxLjYgMTU0LjhjMC00MS44LTM0LjItNzYtNzYtNzZoLTNMMjg1LjcgMzY1Yy05LjYgMjYuNy0xOS40IDQ5LjMtMzAuMyA2OGgyMTYuMlYxNTQuOHoiLz48cGF0aCBkPSJtMzM4IDEuMy05My4zIDI1OS4xLTQyLjEtMTMxLjloLTg5LjFsODMuOCAyMTUuMmM2IDE1LjUgNiAzMi41IDAgNDgtNy40IDE5LTE5IDM3LjMtNTMgNDEuOWwtNy4yIDF2NzZoOC4zYzgxLjcgMCAxMTguOS01Ny4yIDE0OS42LTE0Mi45TDQzMS42IDEuM0gzMzh6TTI3OS40IDM2MmMtMzIuOSA5Mi02Ny42IDEyOC43LTEyNS43IDEzMS44di00NWMzNy41LTcuNSA1MS4zLTMxIDU5LjEtNTEuMSA3LjUtMTkuMyA3LjUtNDAuNyAwLTYwbC03NS0xOTIuN2g1Mi44bDUzLjMgMTY2LjggMTA1LjktMjk0aDU4LjFMMjc5LjQgMzYyeiIvPjwvc3ZnPg==");background-position:0 6px;background-repeat:no-repeat;background-size:20px;float:left;height:30px;width:26px}#wpadminbar #wp-admin-bar-wpseo-licenses .ab-item{color:#f18500}@media screen and (max-width:782px){#wp-admin-bar-wpseo-menu .wpseo-score-icon{margin:16px 10px 0 2px!important}#wpadminbar #wp-admin-bar-wpseo-menu{display:block;position:static}#wpadminbar .yoast-logo.svg{background-position:50% 8px;background-size:30px;height:46px;width:52px}#wpadminbar .yoast-logo+.yoast-issue-counter{margin-left:-5px;margin-right:10px}#wpadminbar .ab-sub-wrapper .yoast-issue-counter{position:relative;top:-5px;vertical-align:text-top}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{line-height:1.8;top:46px;white-space:normal}#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-kwresearch,#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-settings{display:none}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/ai-generator-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/ai-generator-2280-rtl.css deleted file mode 100644 index e8f6cee9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/ai-generator-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.yst-replacevar__use-ai-button-upsell{align-items:center;background-color:#f7f7f7;border:1px solid #dbdbdb;border-radius:4px;box-shadow:inset 0 -2px 0 0 #0000001a;box-sizing:border-box;color:#303030;cursor:pointer;display:flex;min-height:32px;padding:0 .5em;transition:var(--yoast-transition-default)}.yst-replacevar__use-ai-button-upsell:hover{background-color:#fff;border-color:var(--yoast-color-border--default);color:#000} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/ai-generator-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/ai-generator-2280.css deleted file mode 100644 index e8f6cee9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/ai-generator-2280.css +++ /dev/null @@ -1 +0,0 @@ -.yst-replacevar__use-ai-button-upsell{align-items:center;background-color:#f7f7f7;border:1px solid #dbdbdb;border-radius:4px;box-shadow:inset 0 -2px 0 0 #0000001a;box-sizing:border-box;color:#303030;cursor:pointer;display:flex;min-height:32px;padding:0 .5em;transition:var(--yoast-transition-default)}.yst-replacevar__use-ai-button-upsell:hover{background-color:#fff;border-color:var(--yoast-color-border--default);color:#000} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/alerts-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/alerts-2280-rtl.css deleted file mode 100644 index 273a5d84..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/alerts-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-alert{align-items:flex-start;border:1px solid #0003;display:flex;font-size:13px;line-height:1.5;margin:16px 0;padding:16px}.yoast-alert--error{background:#f9dcdc;color:#8f1919}.yoast-alert--info{background:#cce5ff;color:#00468f}.yoast-alert--success{background:#e2f2cc;color:#395315}.yoast-alert--warning{background:#fff3cd;color:#674e00}.yoast-alert__icon.yoast-alert__icon{display:block;height:16px;margin-left:8px;margin-top:.1rem;max-width:none;width:16px}.yoast-alert a{color:#004973} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/alerts-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/alerts-2280.css deleted file mode 100644 index 275d7f75..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/alerts-2280.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-alert{align-items:flex-start;border:1px solid #0003;display:flex;font-size:13px;line-height:1.5;margin:16px 0;padding:16px}.yoast-alert--error{background:#f9dcdc;color:#8f1919}.yoast-alert--info{background:#cce5ff;color:#00468f}.yoast-alert--success{background:#e2f2cc;color:#395315}.yoast-alert--warning{background:#fff3cd;color:#674e00}.yoast-alert__icon.yoast-alert__icon{display:block;height:16px;margin-right:8px;margin-top:.1rem;max-width:none;width:16px}.yoast-alert a{color:#004973} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2280-rtl.css deleted file mode 100644 index 97ab5580..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.sidebar__sale_banner_container .sidebar__sale_banner{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity));box-shadow:0 -1px 4px 0 #fcd34d,0 1px 4px 0 #fcd34d,0 -1px 0 0 #fcd34d,0 1px 0 0 #fcd34d;color:#fcd34d;font-size:1.125rem;font-weight:700;letter-spacing:.5px;line-height:30px;margin-bottom:10px;margin-right:-30px;margin-top:1.25rem;padding:.25rem 0;text-align:center;transform:rotate(5deg);width:calc(100% + 60px)}.sidebar__sale_banner_container .sidebar__sale_banner .banner_text{display:inline-block;margin:0 35px}.sidebar__sale_banner_container{margin-bottom:-25px;margin-right:-24px;margin-top:-25px;overflow:hidden;padding-bottom:10px;width:calc(100% + 48px)} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2280.css deleted file mode 100644 index fc2c025b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2280.css +++ /dev/null @@ -1 +0,0 @@ -.sidebar__sale_banner_container .sidebar__sale_banner{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity));box-shadow:0 -1px 4px 0 #fcd34d,0 1px 4px 0 #fcd34d,0 -1px 0 0 #fcd34d,0 1px 0 0 #fcd34d;color:#fcd34d;font-size:1.125rem;font-weight:700;letter-spacing:.5px;line-height:30px;margin-bottom:10px;margin-left:-30px;margin-top:1.25rem;padding:.25rem 0;text-align:center;transform:rotate(-5deg);width:calc(100% + 60px)}.sidebar__sale_banner_container .sidebar__sale_banner .banner_text{display:inline-block;margin:0 35px}.sidebar__sale_banner_container{margin-bottom:-25px;margin-left:-24px;margin-top:-25px;overflow:hidden;padding-bottom:10px;width:calc(100% + 48px)} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/dashboard-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/dashboard-2280-rtl.css deleted file mode 100644 index 51f5b707..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/dashboard-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -#yoast-seo-dashboard-widget h3{font-weight:700}#yoast-seo-dashboard-widget .assessments,#yoast-seo-dashboard-widget .score-assessments{padding-right:0}#yoast-seo-dashboard-widget .wordpress-feed{border-top:1px solid #eee;margin:16px -12px 0;padding:12px 12px 0}#yoast-seo-dashboard-widget .wordpress-feed .wordpress-feed__post{margin-top:12px}#yoast-seo-dashboard-widget .wordpress-feed .wordpress-feed__footer{border-top:1px solid #eee;margin:0 -12px;padding:4px 12px 0}#yoast-seo-dashboard-widget:empty:before,#yoast-seo-wincher-dashboard-widget:empty:before{animation:rotate 2s linear infinite;background-image:url(../../packages/js/images/Yoast_SEO_Icon.svg);content:"";display:block;height:40px;margin:25px auto;width:40px}@keyframes rotate{0%{transform:perspective(120px) rotateX(0deg) rotateY(0deg);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg)}to{transform:perspective(120px) rotateX(0deg) rotateY(-1turn);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(-1turn)}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/dashboard-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/dashboard-2280.css deleted file mode 100644 index c9a82129..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/dashboard-2280.css +++ /dev/null @@ -1 +0,0 @@ -#yoast-seo-dashboard-widget h3{font-weight:700}#yoast-seo-dashboard-widget .assessments,#yoast-seo-dashboard-widget .score-assessments{padding-left:0}#yoast-seo-dashboard-widget .wordpress-feed{border-top:1px solid #eee;margin:16px -12px 0;padding:12px 12px 0}#yoast-seo-dashboard-widget .wordpress-feed .wordpress-feed__post{margin-top:12px}#yoast-seo-dashboard-widget .wordpress-feed .wordpress-feed__footer{border-top:1px solid #eee;margin:0 -12px;padding:4px 12px 0}#yoast-seo-dashboard-widget:empty:before,#yoast-seo-wincher-dashboard-widget:empty:before{animation:rotate 2s linear infinite;background-image:url(../../packages/js/images/Yoast_SEO_Icon.svg);content:"";display:block;height:40px;margin:25px auto;width:40px}@keyframes rotate{0%{transform:perspective(120px) rotateX(0deg) rotateY(0deg);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg)}to{transform:perspective(120px) rotateX(0deg) rotateY(1turn);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(1turn)}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/edit-page-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/edit-page-2280-rtl.css deleted file mode 100644 index 63cce966..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/edit-page-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 3px 0 10px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}@media screen and (max-width:782px){.column-wpseo-focuskw,.column-wpseo-metadesc,.column-wpseo-score,.column-wpseo-title{display:none}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/edit-page-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/edit-page-2280.css deleted file mode 100644 index eb516235..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/edit-page-2280.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 10px 0 3px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}@media screen and (max-width:782px){.column-wpseo-focuskw,.column-wpseo-metadesc,.column-wpseo-score,.column-wpseo-title{display:none}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/elementor-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/elementor-2280-rtl.css deleted file mode 100644 index 72eb1d99..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/elementor-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -:root{--yoast-elementor-color-paragraph:#555d66}.yoast,.yoast h2,.yoast h3{font-family:var(--yoast-font-family)!important}.yoast h2{color:var(--yoast-color-dark);font-size:1.3em;font-weight:var(--yoast-font-weight-bold);margin-bottom:1em}.yoast input,.yoast input:focus,.yoast label,.yoast select:focus,.yoast select:not(:focus){background-color:#0000;border-color:var(--yoast-color-secondary-darker);color:var(--yoast-color-font-default)}.yoast label{color:var(--yoast-color-label)}.yoast input[disabled]{background-color:var(--yoast-color-inactive-grey-light)}.yoast.components-panel__body .yoast-title{font-weight:500}.yoast-field-group__title b{font-weight:var(--yoast-font-weight-bold)}.yoast h3 span>span{font-weight:400}.elementor-panel .elementor-tab-control-yoast-tab a:before,.elementor-panel .elementor-tab-control-yoast-tab span:before,.yoast-element-menu-icon:before{background-color:#6d7882;color:#0000;content:".";height:16px;margin:0 auto;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:16px}.yoast-element-menu-icon{display:inline-flex}.yoast-element-menu-icon:before{background-color:#a4afb7;height:19px;width:19px}.yoast-elementor-panel__fills{-webkit-font-smoothing:subpixel-antialiased;background-color:var(--yoast-color-white);color:var(--yoast-color-dark);margin-top:10px;padding:5px 5px 0}.yoast li,.yoast p,.yoast small{line-height:1.5;margin-bottom:6px}.yoast p,.yoast small,.yoast ul[role=list] li{color:var(--yoast-elementor-color-paragraph)}.button-link,.yoast a,.yoast a p,.yoast-elementor-panel__fills p a{color:var(--yoast-color-link);text-decoration:underline}.yoast a.dashicons{color:var(--yoast-color-inactive-text);height:24px;vertical-align:text-bottom;width:24px}.button-link{background:none;border:none;cursor:pointer;font-size:1em;line-height:1.5}.yoast .yoast-button-upsell,.yoast-elementor-panel__fills .UpsellLinkButton{color:var(--yoast-color-label);line-height:1.4em;text-decoration:none}.yoast-elementor-panel__fills h3>button{background:none;border:none;box-shadow:none}.yoast-gutenberg-modal .yoast-notice-container>hr{border-top-color:#ddd;border-top-style:solid}.yoast-gutenberg-modal input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:50%;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:0 0 0 8px;overflow:hidden;padding:2px;position:relative;transition:all .15s ease-out 0s;vertical-align:text-bottom;width:18px}.yoast-gutenberg-modal input[type=radio]:checked{background-color:inherit;border-color:var(--yoast-color-primary)}.yoast-gutenberg-modal input[type=radio]:checked:after{background:var(--yoast-color-primary);border-radius:50%;content:"";display:block;height:10px;right:3px;position:absolute;top:3px;width:10px}.yoast-post-settings-modal .yoast-notice-container{bottom:auto}.yoast-gutenberg-modal .components-popover.components-tooltip{right:unset!important;position:relative;left:40px;top:15px!important}.yoast div:focus,div.yoast:focus{outline:0}.yoast .button-link:focus,.yoast a:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#124964;outline:1px solid #0000}.yoast a.dashicons:focus{color:#1e8cbe}.yoast input[type=radio]:checked:focus{border-color:#fff;box-shadow:var(--yoast-color-focus)}.yoast .yoast-button-upsell:focus{box-shadow:inset 0 -4px 0 #0003,0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#000}#yoast-introduction{background-color:#fff;border-radius:3px;box-shadow:var(--yoast-shadow-default);right:41px!important;padding:20px;position:absolute!important;text-align:right;top:5px!important;z-index:1}#yoast-introduction:before{border:solid;border-color:#0000 #0000 #fff;border-width:7px 5px;content:"";right:-12px;position:absolute;top:8px;transform:rotate(90deg)}#yoast-introduction>div{color:var(--yoast-color-default)}#yoast-introduction>.dialog-header{font-weight:var(--yoast-font-weight-bold);line-height:1.3}#yoast-introduction>.dialog-message{margin-top:.5em}#yoast-introduction>.dialog-buttons-wrapper{display:flex;justify-content:flex-end;margin-top:12px}#yoast-introduction .dialog-button{background-color:var(--yoast-color-primary);font-size:12px;padding:7px 17px;text-transform:capitalize}@media(hover:hover){.button-link:hover,.yoast a:hover,.yoast a:hover p,.yoast-elementor-panel__fills p a:hover{color:var(--yoast-color-primary-darker)}.yoast a.dashicons:hover{color:var(--yoast-color-link)}.yoast .yoast-button-upsell:hover,.yoast-elementor-panel__fills .UpsellLinkButton:hover{color:var(--yoast-color-label)}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/elementor-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/elementor-2280.css deleted file mode 100644 index f0b2e861..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/elementor-2280.css +++ /dev/null @@ -1 +0,0 @@ -:root{--yoast-elementor-color-paragraph:#555d66}.yoast,.yoast h2,.yoast h3{font-family:var(--yoast-font-family)!important}.yoast h2{color:var(--yoast-color-dark);font-size:1.3em;font-weight:var(--yoast-font-weight-bold);margin-bottom:1em}.yoast input,.yoast input:focus,.yoast label,.yoast select:focus,.yoast select:not(:focus){background-color:#0000;border-color:var(--yoast-color-secondary-darker);color:var(--yoast-color-font-default)}.yoast label{color:var(--yoast-color-label)}.yoast input[disabled]{background-color:var(--yoast-color-inactive-grey-light)}.yoast.components-panel__body .yoast-title{font-weight:500}.yoast-field-group__title b{font-weight:var(--yoast-font-weight-bold)}.yoast h3 span>span{font-weight:400}.elementor-panel .elementor-tab-control-yoast-tab a:before,.elementor-panel .elementor-tab-control-yoast-tab span:before,.yoast-element-menu-icon:before{background-color:#6d7882;color:#0000;content:".";height:16px;margin:0 auto;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:16px}.yoast-element-menu-icon{display:inline-flex}.yoast-element-menu-icon:before{background-color:#a4afb7;height:19px;width:19px}.yoast-elementor-panel__fills{-webkit-font-smoothing:subpixel-antialiased;background-color:var(--yoast-color-white);color:var(--yoast-color-dark);margin-top:10px;padding:5px 5px 0}.yoast li,.yoast p,.yoast small{line-height:1.5;margin-bottom:6px}.yoast p,.yoast small,.yoast ul[role=list] li{color:var(--yoast-elementor-color-paragraph)}.button-link,.yoast a,.yoast a p,.yoast-elementor-panel__fills p a{color:var(--yoast-color-link);text-decoration:underline}.yoast a.dashicons{color:var(--yoast-color-inactive-text);height:24px;vertical-align:text-bottom;width:24px}.button-link{background:none;border:none;cursor:pointer;font-size:1em;line-height:1.5}.yoast .yoast-button-upsell,.yoast-elementor-panel__fills .UpsellLinkButton{color:var(--yoast-color-label);line-height:1.4em;text-decoration:none}.yoast-elementor-panel__fills h3>button{background:none;border:none;box-shadow:none}.yoast-gutenberg-modal .yoast-notice-container>hr{border-top-color:#ddd;border-top-style:solid}.yoast-gutenberg-modal input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:50%;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:0 8px 0 0;overflow:hidden;padding:2px;position:relative;transition:all .15s ease-out 0s;vertical-align:text-bottom;width:18px}.yoast-gutenberg-modal input[type=radio]:checked{background-color:inherit;border-color:var(--yoast-color-primary)}.yoast-gutenberg-modal input[type=radio]:checked:after{background:var(--yoast-color-primary);border-radius:50%;content:"";display:block;height:10px;left:3px;position:absolute;top:3px;width:10px}.yoast-post-settings-modal .yoast-notice-container{bottom:auto}.yoast-gutenberg-modal .components-popover.components-tooltip{left:unset!important;position:relative;right:40px;top:15px!important}.yoast div:focus,div.yoast:focus{outline:0}.yoast .button-link:focus,.yoast a:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#124964;outline:1px solid #0000}.yoast a.dashicons:focus{color:#1e8cbe}.yoast input[type=radio]:checked:focus{border-color:#fff;box-shadow:var(--yoast-color-focus)}.yoast .yoast-button-upsell:focus{box-shadow:inset 0 -4px 0 #0003,0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#000}#yoast-introduction{background-color:#fff;border-radius:3px;box-shadow:var(--yoast-shadow-default);left:41px!important;padding:20px;position:absolute!important;text-align:left;top:5px!important;z-index:1}#yoast-introduction:before{border:solid;border-color:#0000 #0000 #fff;border-width:7px 5px;content:"";left:-12px;position:absolute;top:8px;transform:rotate(-90deg)}#yoast-introduction>div{color:var(--yoast-color-default)}#yoast-introduction>.dialog-header{font-weight:var(--yoast-font-weight-bold);line-height:1.3}#yoast-introduction>.dialog-message{margin-top:.5em}#yoast-introduction>.dialog-buttons-wrapper{display:flex;justify-content:flex-end;margin-top:12px}#yoast-introduction .dialog-button{background-color:var(--yoast-color-primary);font-size:12px;padding:7px 17px;text-transform:capitalize}@media(hover:hover){.button-link:hover,.yoast a:hover,.yoast a:hover p,.yoast-elementor-panel__fills p a:hover{color:var(--yoast-color-primary-darker)}.yoast a.dashicons:hover{color:var(--yoast-color-link)}.yoast .yoast-button-upsell:hover,.yoast-elementor-panel__fills .UpsellLinkButton:hover{color:var(--yoast-color-label)}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/featured-image-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/featured-image-2280-rtl.css deleted file mode 100644 index 336c6100..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/featured-image-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -#yst_opengraph_image_warning{margin-top:0}.yoast-opengraph-image-notice #set-post-thumbnail>img{box-shadow:0 0 0 2px #fff,0 0 0 5px #dc3232} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/featured-image-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/featured-image-2280.css deleted file mode 100644 index 336c6100..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/featured-image-2280.css +++ /dev/null @@ -1 +0,0 @@ -#yst_opengraph_image_warning{margin-top:0}.yoast-opengraph-image-notice #set-post-thumbnail>img{box-shadow:0 0 0 2px #fff,0 0 0 5px #dc3232} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2280-rtl.css deleted file mode 100644 index bd1b36eb..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -#posts-filter .wpseo-filter-explanation{clear:both;margin:10px 1px 5px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2280.css deleted file mode 100644 index bd1b36eb..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2280.css +++ /dev/null @@ -1 +0,0 @@ -#posts-filter .wpseo-filter-explanation{clear:both;margin:10px 1px 5px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2280-rtl.css deleted file mode 100644 index f6a2d2cc..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -#wpseo-first-time-configuration .yst-root .yst-input{--tw-bg-opacity:1!important;--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important;border-radius:.375rem!important;border-width:1px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;font-size:.8125rem!important;padding:.5rem .75rem!important}#wpseo-first-time-configuration .yst-root .yst-radio{align-items:center!important;display:flex!important}#wpseo-first-time-configuration .yst-root .yst-radio__input{--tw-border-opacity:1!important;--tw-text-opacity:1!important;--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;-webkit-appearance:none!important;appearance:none!important;border-color:rgb(209 213 219/var(--tw-border-opacity))!important;border-radius:9999px!important;border-width:1px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;color:rgb(166 30 105/var(--tw-text-opacity))!important;height:1rem!important;margin:0!important;transition-property:none!important;width:1rem!important}#wpseo-first-time-configuration .yst-root .yst-radio__input:before{content:var(--tw-content)!important;display:none!important}#wpseo-first-time-configuration .yst-root .yst-radio__input:checked{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important;border-width:5px!important}#wpseo-first-time-configuration .yst-root .yst-radio__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important;--tw-ring-offset-width:2px!important;--tw-ring-offset-color:#fff!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important;outline:2px solid #0000!important;outline-offset:2px!important}#wpseo-first-time-configuration .yst-root .yst-radio__label{--tw-text-opacity:1!important;color:rgb(55 65 81/var(--tw-text-opacity))!important;font-weight:500!important;margin-right:.75rem!important}#wpseo-first-time-configuration .yst-root .yst-radio-group__label{margin-bottom:.25rem!important}#wpseo-first-time-configuration .yst-root .yst-radio-group__options{display:flex!important;flex-direction:column!important;gap:.5rem!important}#wpseo-first-time-configuration .yst-root .yst-radio-group__description{margin-bottom:1rem!important}#wpseo-first-time-configuration .yst-root .yst-checkbox__input:before{--tw-content:none!important;content:var(--tw-content)!important} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2280.css deleted file mode 100644 index 04d8c25b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2280.css +++ /dev/null @@ -1 +0,0 @@ -#wpseo-first-time-configuration .yst-root .yst-input{--tw-bg-opacity:1!important;--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important;border-radius:.375rem!important;border-width:1px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;font-size:.8125rem!important;padding:.5rem .75rem!important}#wpseo-first-time-configuration .yst-root .yst-radio{align-items:center!important;display:flex!important}#wpseo-first-time-configuration .yst-root .yst-radio__input{--tw-border-opacity:1!important;--tw-text-opacity:1!important;--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;-webkit-appearance:none!important;appearance:none!important;border-color:rgb(209 213 219/var(--tw-border-opacity))!important;border-radius:9999px!important;border-width:1px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;color:rgb(166 30 105/var(--tw-text-opacity))!important;height:1rem!important;margin:0!important;transition-property:none!important;width:1rem!important}#wpseo-first-time-configuration .yst-root .yst-radio__input:before{content:var(--tw-content)!important;display:none!important}#wpseo-first-time-configuration .yst-root .yst-radio__input:checked{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important;border-width:5px!important}#wpseo-first-time-configuration .yst-root .yst-radio__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important;--tw-ring-offset-width:2px!important;--tw-ring-offset-color:#fff!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important;outline:2px solid #0000!important;outline-offset:2px!important}#wpseo-first-time-configuration .yst-root .yst-radio__label{--tw-text-opacity:1!important;color:rgb(55 65 81/var(--tw-text-opacity))!important;font-weight:500!important;margin-left:.75rem!important}#wpseo-first-time-configuration .yst-root .yst-radio-group__label{margin-bottom:.25rem!important}#wpseo-first-time-configuration .yst-root .yst-radio-group__options{display:flex!important;flex-direction:column!important;gap:.5rem!important}#wpseo-first-time-configuration .yst-root .yst-radio-group__description{margin-bottom:1rem!important}#wpseo-first-time-configuration .yst-root .yst-checkbox__input:before{--tw-content:none!important;content:var(--tw-content)!important} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/icons-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/icons-2280-rtl.css deleted file mode 100644 index e8929ee9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/icons-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/icons-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/icons-2280.css deleted file mode 100644 index e8929ee9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/icons-2280.css +++ /dev/null @@ -1 +0,0 @@ -:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/inside-editor-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/inside-editor-2280-rtl.css deleted file mode 100644 index c7e4aab5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/inside-editor-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-text-mark{background-color:#e1bee7}.yoast-text-mark__highlight{background-color:#4a148c;color:#fff} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/inside-editor-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/inside-editor-2280.css deleted file mode 100644 index c7e4aab5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/inside-editor-2280.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-text-mark{background-color:#e1bee7}.yoast-text-mark__highlight{background-color:#4a148c;color:#fff} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/introductions-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/introductions-2280-rtl.css deleted file mode 100644 index 06390851..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/introductions-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.yst-root .yst-introduction-modal .yst-modal__close-button{--tw-text-opacity:1;background-color:initial;color:rgb(107 114 128/var(--tw-text-opacity))}.yst-root .yst-introduction-modal .yst-modal__close-button:focus{--tw-ring-offset-width:0px;outline:2px solid #0000;outline-offset:2px}.yst-root .yst-introduction-modal-panel{background-image:linear-gradient(-180deg,#a61e6940 10%,#ffffff40 50%)}.yst-root .yst-introduction-modal-uppercase{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity));letter-spacing:.8px;text-transform:uppercase} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/introductions-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/introductions-2280.css deleted file mode 100644 index d5ffa197..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/introductions-2280.css +++ /dev/null @@ -1 +0,0 @@ -.yst-root .yst-introduction-modal .yst-modal__close-button{--tw-text-opacity:1;background-color:initial;color:rgb(107 114 128/var(--tw-text-opacity))}.yst-root .yst-introduction-modal .yst-modal__close-button:focus{--tw-ring-offset-width:0px;outline:2px solid #0000;outline-offset:2px}.yst-root .yst-introduction-modal-panel{background-image:linear-gradient(180deg,#a61e6940 10%,#ffffff40 50%)}.yst-root .yst-introduction-modal-uppercase{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity));letter-spacing:.8px;text-transform:uppercase} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-2280-rtl.css deleted file mode 100644 index a00ee7b2..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;right:0;position:fixed;left:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);right:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;left:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-left:16px;width:19px}.yoast-modal__menu{border-left:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-left:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-left:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;right:0;left:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-left:8px}.yoast .yoast-close{left:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-right:16px;margin-left:16px;padding-right:0;padding-left:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:right;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(-180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:left;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;right:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-left:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-left:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}#yoast-semrush-country-selector{border:none;position:relative}.yoast-related-keyphrases-modal__chart{display:block}.yoast-wordproof-modal{max-width:380px;text-align:center}.yoast-wordproof-modal-image{display:flex;justify-content:center;margin-block:40px}.yoast-wordproof-modal-svg__webhook-failed{width:100%}.yoast-wordproof-modal-svg__success{width:175px}.yoast-wordproof-modal-action{display:flex;justify-content:center;margin-bottom:10px;margin-top:40px}.yoast-wordproof-modal-action.yoast-wordproof-modal-action>button{padding-right:20px;padding-left:20px}.m6zwb4v,.m6zwb4v:visited{background:#e6f3ff;border-radius:2px;color:#575f67;cursor:pointer;display:inline-block;padding-right:2px;padding-left:2px;-webkit-text-decoration:none;text-decoration:none}.m6zwb4v:focus,.m6zwb4v:hover{background:#edf5fd;color:#677584;outline:0}.m6zwb4v:active{background:#455261;color:#222}.mnw6qvm{background:#fff;border:1px solid #eee;border-radius:2px;box-shadow:0 4px 30px 0 #dcdcdc;box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;max-width:440px;min-width:220px;padding-bottom:8px;padding-top:8px;position:absolute;transform:scale(0);z-index:2}.m1ymsnxd{opacity:0;transition:opacity .25s cubic-bezier(.3,1.2,.2,1)}.m126ak5t{opacity:1}.mtiwdxc{padding:7px 10px 3px;transition:background-color .4s cubic-bezier(.27,1.27,.48,.56)}.mtiwdxc:active{background-color:#cce7ff}.myz2dw1{background-color:#e6f3ff;padding:7px 10px 3px;transition:background-color .4s cubic-bezier(.27,1.27,.48,.56)}.myz2dw1:active{background-color:#cce7ff}.mpqdcgq{font-size:.9em;margin-bottom:.2em;margin-right:8px;max-width:368px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.m1mfvffo,.mpqdcgq{display:inline-block}.m1mfvffo{border-radius:12px;height:24px;width:24px}.DraftEditor-editorContainer,.DraftEditor-root,.public-DraftEditor-content{height:inherit;text-align:initial}.public-DraftEditor-content[contenteditable=true]{-webkit-user-modify:read-write-plaintext-only}.DraftEditor-root{position:relative}.DraftEditor-editorContainer{background-color:#fff0;border-left:.1px solid #0000;position:relative;z-index:1}.public-DraftEditor-block{position:relative}.DraftEditor-alignLeft .public-DraftStyleDefault-block{text-align:left}.DraftEditor-alignLeft .public-DraftEditorPlaceholder-root{left:0;text-align:left}.DraftEditor-alignCenter .public-DraftStyleDefault-block{text-align:center}.DraftEditor-alignCenter .public-DraftEditorPlaceholder-root{margin:0 auto;text-align:center;width:100%}.DraftEditor-alignRight .public-DraftStyleDefault-block{text-align:right}.DraftEditor-alignRight .public-DraftEditorPlaceholder-root{right:0;text-align:right}.public-DraftEditorPlaceholder-root{color:#9197a3;position:absolute;width:100%;z-index:1}.public-DraftEditorPlaceholder-hasFocus{color:#bdc1c9}.DraftEditorPlaceholder-hidden{display:none}.public-DraftStyleDefault-block{position:relative;white-space:pre-wrap}.public-DraftStyleDefault-ltr{direction:ltr;text-align:left}.public-DraftStyleDefault-rtl{direction:rtl;text-align:right}.public-DraftStyleDefault-listLTR{direction:ltr}.public-DraftStyleDefault-listRTL{direction:rtl}.public-DraftStyleDefault-ol,.public-DraftStyleDefault-ul{margin:16px 0;padding:0}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listLTR{margin-left:1.5em}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listRTL{margin-right:1.5em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listLTR{margin-left:3em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listRTL{margin-right:3em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listLTR{margin-left:4.5em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listRTL{margin-right:4.5em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listLTR{margin-left:6em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listRTL{margin-right:6em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listLTR{margin-left:7.5em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listRTL{margin-right:7.5em}.public-DraftStyleDefault-unorderedListItem{list-style-type:square;position:relative}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth0{list-style-type:disc}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth1{list-style-type:circle}.public-DraftStyleDefault-orderedListItem{list-style-type:none;position:relative}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listLTR:before{left:-36px;position:absolute;text-align:right;width:30px}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listRTL:before{position:absolute;right:-36px;text-align:left;width:30px}.public-DraftStyleDefault-orderedListItem:before{content:counter(ol0) ". ";counter-increment:ol0}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth1:before{content:counter(ol1,lower-alpha) ". ";counter-increment:ol1}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth2:before{content:counter(ol2,lower-roman) ". ";counter-increment:ol2}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth3:before{content:counter(ol3) ". ";counter-increment:ol3}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth4:before{content:counter(ol4,lower-alpha) ". ";counter-increment:ol4}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-reset{counter-reset:ol0}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-reset{counter-reset:ol1}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-reset{counter-reset:ol2}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-reset{counter-reset:ol3}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-reset{counter-reset:ol4}#wpseo_meta{box-sizing:border-box}#wpseo_meta *,#wpseo_meta :after,#wpseo_meta :before{box-sizing:inherit}.DraftEditor-root [data-block]{margin:0}#edittag>#wp-description-wrap{display:none}#wp-description-wrap .wp-editor-area{border:0}.term-description-wrap td>textarea#description{min-height:530px}.wpseo-meta-section,.wpseo-meta-section-react{border:1px solid #0003;display:none;height:auto;max-width:600px;min-height:100%;vertical-align:top;width:100%}.wpseo-meta-section-react.active,.wpseo-meta-section.active{background:#fff;position:relative;z-index:12}.wpseo-meta-section.active{display:inline-block}.wpseo-meta-section-react.active{display:block;margin-bottom:10px}.wpseo-meta-section-content{padding:16px}.wpseo-metabox-content{max-width:800px;padding-top:16px}.wpseo-metabox-menu{background-color:#fff;max-width:600px;padding:0}.wpseo-metabox-menu ul{align-items:flex-end;display:flex;flex-wrap:wrap;flex-flow:wrap-reverse;margin:0 0 0 1px;padding:0 16px 0 0}.wpseo-metabox-menu ul li:first-child{z-index:10}.wpseo-metabox-menu ul li:nth-child(2){z-index:9}.wpseo-metabox-menu ul li:nth-child(3){z-index:8}.wpseo-metabox-menu ul li:nth-child(4){z-index:7}.wpseo-metabox-menu ul li:nth-child(5){z-index:6}.wpseo-metabox-menu ul li:nth-child(6){z-index:5}.wpseo-metabox-menu ul li{background-color:#f8f8f8;box-shadow:0 0 4px 0 #0000001a;height:32px;margin-bottom:-1px;margin-right:-1px;position:relative;text-align:center}.wpseo-metabox-menu ul li a{align-items:center;border:1px solid #0003;border-bottom:2px #0000;color:#0073aa;display:flex}.wpseo-metabox-menu ul li a:focus{box-shadow:inherit}.wpseo-metabox-menu ul li .yst-traffic-light{height:20px;margin-right:4px;margin-left:10px;width:auto}.wpseo-metabox-menu ul li span.dashicons{margin-left:8px}.wpseo-metabox-menu ul li span.wpseo-buy-premium{color:#a4286a}.wpseo-metabox-menu ul li span.wpseo-buy-premium:hover{color:#832055}.wpseo-metabox-menu ul li.active{background-color:#fff;border-bottom:2px #0000;box-shadow:none;height:36px;margin-top:-4px;z-index:13}.wpseo-metabox-menu ul li.active a{color:#444;height:36px}.wpseo-metabox-menu ul li.active span.wpseo-buy-premium{border-color:#a4286a;color:#a4286a}.wpseo-metabox-menu ul li.active span.wpseo-buy-premium:hover{border-color:#832055;color:#832055}.wpseo-metabox-menu a{height:32px;padding:0 8px;text-decoration:none}.wpseotab{background-color:#fdfdfd;border:1px solid #ddd;display:none;padding:16px}.wpseotab .wpseo-cornerstone-checkbox{margin-left:.5em}.wpseotab.content{padding:20px 15px}.wpseotab.active{display:block}.wpseo-metabox-sidebar .dashicons{font-size:30px;height:30px;width:30px}#wpseo_meta .inside{margin:0}#wpseo_meta .inside:after{clear:both;content:"";display:table}#wpseo_meta .postbox .inside .wpseotab{font-size:13px!important}.wpseo-form input,.wpseo-form label,.wpseo-form p.error-message,.wpseo-form textarea{max-width:600px}.wpseo-form fieldset{padding-top:5px}.wpseo-form legend{font-weight:600}.wpseo-form label{display:block;font-weight:600}.wpseo-form input[type=checkbox]+label,.wpseo-form input[type=radio]+label{display:inline-block;font-weight:400}.wpseo-form fieldset,.wpseo-form label{margin-bottom:.5em;margin-top:2em}.wpseo-form input[type=checkbox],.wpseo-form input[type=checkbox]+label{font-size:1em;margin-bottom:0;margin-top:2em}.wpseo-form fieldset:first-child,.wpseo-form input[type=checkbox]:first-child,.wpseo-form input[type=checkbox]:first-child+label,.wpseo-form label:first-child{margin-top:10px}.wpseo-form input[type=radio]{margin-top:0}.wpseo-form input[type=radio]+label{margin:0 0 0 1em}.wpseo-form p.error-message{margin:.5em 0}.wpseo-form select[multiple]{margin-top:0}.yoast-metabox__description{margin:.5em 0;max-width:600px}.wpseo_image_upload_button{margin-right:3px}.good,.warn,.wrong{font-weight:600}.good{color:green}.warn{color:maroon}.wrong{color:#dc3232}#current_seo_title span{background-color:#ffffe0;padding:2px 5px}#focuskwresults ul{margin:0}#focuskwresults li,#focuskwresults p{font-size:13px}#focuskwresults li{list-style-type:disc;margin:0 20px 0 0}.wpseo_hidden{display:none}.wpseo_msg{background-color:#ffffe0;border:1px solid #e6db55;margin:5px 0 10px;padding:0 5px}.snippet-editor__button.snippet-editor__edit-button:focus{background-color:#fafafa;border-color:#5b9dd9;box-shadow:0 0 3px #0073aacc;color:#23282d;outline:none}.wpseo-admin-page .subsubsub li{display:inline;max-width:none}.yoast-seo-help-container{float:right;max-width:none;width:100%}.yoast-seo-help-container .yoast-help-panel{margin:.5em 0!important}.wpseo_content_wrapper p.search-box{margin:10px 0 5px}#wpseotab .ui-widget-content .ui-state-hover{background:#f1f1f1;border:1px solid #dfdfdf;color:#333}.yst-traffic-light{height:30px;margin:0 5px 0 0;width:19px}.yst-traffic-light .traffic-light-color{display:none}.yst-traffic-light.bad .traffic-light-red,.yst-traffic-light.good .traffic-light-green,.yst-traffic-light.init .traffic-light-init,.yst-traffic-light.na .traffic-light-empty,.yst-traffic-light.ok .traffic-light-orange{display:inline}.yoast-zapier-text{display:flex}.yoast-zapier-text .yoast-logo.svg{max-width:18px;width:100%!important}.yoast-seo-score .yoast-logo.svg{background:var(--yoast-svg-icon-yoast) no-repeat;background-size:18px;flex-shrink:0;float:right;height:18px;margin-left:7px;width:18px}.yoast-seo-score .yoast-logo.svg.good{background-image:var(--yoast-svg-icon-yoast-good)}.yoast-seo-score .yoast-logo.svg.ok{background-image:var(--yoast-svg-icon-yoast-ok)}.yoast-seo-score .yoast-logo.svg.bad{background-image:var(--yoast-svg-icon-yoast-bad)}.yoast-seo-score .yoast-logo.svg.na,.yoast-seo-score .yoast-logo.svg.noindex{background-image:var(--yoast-svg-icon-yoast)}.term-php .wpseo-taxonomy-metabox-postbox>h2{border-bottom:1px solid #eee;font-size:14px;line-height:1.4;margin:0;padding:8px 12px}#TB_window #TB_ajaxContent p{margin:5px 0 0;padding:5px 0 0}#TB_window #TB_ajaxContent ul{margin:5px 0 10px}#TB_window #TB_ajaxContent li{list-style:none;margin:5px 0 0}#TB_window #TB_ajaxContent li:before{content:"+";font-weight:700;margin:0 0 0 10px}.yoast-section__heading-icon-list{background-image:var(--yoast-svg-icon-list)}.yoast-section__heading-icon-key{background-image:var(--yoast-svg-icon-key)}.yoast-section__heading-icon-edit{background-image:var(--yoast-svg-icon-edit)}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}.screen-reader-text.wpseo-generic-tab-textual-score,.screen-reader-text.wpseo-keyword-tab-textual-score{display:block}.yoast-notice-go-premium{background:#f1f1f1;border-right-color:#a4286a;margin:0}.editor-styles-wrapper mark.annotation-text-yoast{background-color:#e1bee7}@media screen and (max-width:782px){.wpseo-metabox-buy-premium .wpseo-buy-premium{display:inline-block;height:20px;margin-left:5px;padding:0;width:20px}.yoast-help-panel{max-width:none!important}#wpseo-crawl-issues-table-form .subsubsub{float:none;max-width:calc(100vw - 20px)}#wpseo-crawl-issues-table-form .yoast-help-button{margin-top:3px}.wpseotab select[multiple]{height:auto!important}}@media screen and (max-width:600px){.wpseotab.content{padding:16px 0}}.wpseo-score-icon-container{align-items:center;display:flex;height:20px;justify-content:center;margin-left:8px;width:20px}.yoast-seo-sidebar-panel .yoast-analysis-check{display:flex}.yoast-seo-sidebar-panel .yoast-analysis-check svg{margin-left:5px;margin-top:6px}.yoast-seo-sidebar-panel .yoast-analysis-check span{line-height:1.5;margin-top:3px}.yoast-seo-sidebar-panel div{line-height:2}.yoast-seo-sidebar-panel div svg{vertical-align:middle}ul.yoast-seo-social-share-buttons li{display:inline-block;margin-left:24px}ul.yoast-seo-social-share-buttons li .x-share svg{fill:#000;height:30px;width:30px}ul.yoast-seo-social-share-buttons svg{height:32px;margin-bottom:8px;width:32px}ul.yoast-seo-social-share-buttons a{align-items:center;display:flex;flex-direction:column}.yoast.yoast-zapier{margin:8px 0 25px}.yoast-field-group.yoast-wincher-post-publish{margin-bottom:10px}.edit-post-pinned-plugins button.components-button:not(.is-compact)[aria-label="Yoast SEO Premium"]>svg,.edit-post-pinned-plugins button.components-button:not(.is-compact)[aria-label="Yoast SEO"]>svg,div.interface-pinned-items button.components-button:not(.is-compact)[aria-label="Yoast SEO Premium"]>svg,div.interface-pinned-items button.components-button:not(.is-compact)[aria-label="Yoast SEO"]>svg{height:28px;max-height:28px;max-width:28px;width:28px}div.interface-pinned-items button.components-button.is-pressed[aria-label="Yoast SEO Premium"]>svg path,div.interface-pinned-items button.components-button.is-pressed[aria-label="Yoast SEO"]>svg path{fill:#fff}.wpseo-schema-icon{align-items:center;background-image:var(--yoast-svg-icon-schema);background-size:cover;display:flex;height:16px;justify-content:center;margin-left:8px;width:16px}.wpseo-metabox-menu ul li.active a .wpseo-schema-icon{background-image:var(--yoast-svg-icon-schema-active)}.yoast-icon-span svg{fill:inherit;margin-left:8px}.yoast.components-panel__body{border-top:0}.components-button>.yoast-title-container{flex-grow:1;line-height:normal;overflow-x:hidden}.yoast-title-container>.yoast-subtitle,.yoast-title-container>.yoast-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yoast-title-container>.yoast-subtitle{font-size:.8125rem;font-weight:300;margin-top:2px}.yoast.components-panel__body .yoast-chevron{background-color:#1e1e1e;display:inline-block;height:24px;-webkit-mask-image:var(--yoast-svg-icon-chevron-down);mask-image:var(--yoast-svg-icon-chevron-down);-webkit-mask-size:100% 100%;mask-size:100% 100%;width:24px}.yoast.components-panel__body.is-opened .yoast-chevron{-webkit-mask-image:var(--yoast-svg-icon-chevron-up);mask-image:var(--yoast-svg-icon-chevron-up)}.yoast .components-panel__body-toggle{padding-left:16px}.yoast .components-form-token-field__remove-token.components-button,.yoast .components-form-token-field__token-text{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast-wordproof-metabox-alert.yoast-wordproof-metabox-alert{margin-bottom:0;margin-top:18px}.yoast .yoast-insights{color:#404040}.yoast .yoast-insights .yoast-field-group__title>b{color:var(--yoast-color-primary);font-size:16px;font-weight:var(--yoast-font-weight-default);line-height:1.2em}.yoast .yoast-insights-card__score{color:var(--yoast-color-primary);margin-block:0}.yoast .yoast-insights-card__description{line-height:1.4em}.yoast .yoast-prominent-words p,.yoast .yoast-prominent-words ul,.yoast .yoast-text-formality p{margin-block:1.2em}.yoast #wpseo-metabox-root .yoast-prominent-words{border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}.yoast .yoast-insights .yoast-data-model--upsell li{color:#bbb}.yoast .yoast-insights .yoast-data-model--upsell li:after{background:#fdf4f8} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-2280.css deleted file mode 100644 index 6c027bcb..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-2280.css +++ /dev/null @@ -1,3 +0,0 @@ -:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);left:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;right:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-right:16px;width:19px}.yoast-modal__menu{border-right:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-right:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-right:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;left:0;right:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-right:8px}.yoast .yoast-close{right:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-left:16px;margin-right:16px;padding-left:0;padding-right:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:left;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:right;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;left:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-right:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-right:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}#yoast-semrush-country-selector{border:none;position:relative}.yoast-related-keyphrases-modal__chart{display:block}.yoast-wordproof-modal{max-width:380px;text-align:center}.yoast-wordproof-modal-image{display:flex;justify-content:center;margin-block:40px}.yoast-wordproof-modal-svg__webhook-failed{width:100%}.yoast-wordproof-modal-svg__success{width:175px}.yoast-wordproof-modal-action{display:flex;justify-content:center;margin-bottom:10px;margin-top:40px}.yoast-wordproof-modal-action.yoast-wordproof-modal-action>button{padding-left:20px;padding-right:20px}.m6zwb4v,.m6zwb4v:visited{background:#e6f3ff;border-radius:2px;color:#575f67;cursor:pointer;display:inline-block;padding-left:2px;padding-right:2px;-webkit-text-decoration:none;text-decoration:none}.m6zwb4v:focus,.m6zwb4v:hover{background:#edf5fd;color:#677584;outline:0}.m6zwb4v:active{background:#455261;color:#222}.mnw6qvm{background:#fff;border:1px solid #eee;border-radius:2px;box-shadow:0 4px 30px 0 #dcdcdc;box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;max-width:440px;min-width:220px;padding-bottom:8px;padding-top:8px;position:absolute;transform:scale(0);z-index:2}.m1ymsnxd{opacity:0;transition:opacity .25s cubic-bezier(.3,1.2,.2,1)}.m126ak5t{opacity:1}.mtiwdxc{padding:7px 10px 3px;transition:background-color .4s cubic-bezier(.27,1.27,.48,.56)}.mtiwdxc:active{background-color:#cce7ff}.myz2dw1{background-color:#e6f3ff;padding:7px 10px 3px;transition:background-color .4s cubic-bezier(.27,1.27,.48,.56)}.myz2dw1:active{background-color:#cce7ff}.mpqdcgq{font-size:.9em;margin-bottom:.2em;margin-left:8px;max-width:368px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.m1mfvffo,.mpqdcgq{display:inline-block}.m1mfvffo{border-radius:12px;height:24px;width:24px} -/*!rtl:begin:ignore*/.DraftEditor-editorContainer,.DraftEditor-root,.public-DraftEditor-content{height:inherit;text-align:initial}.public-DraftEditor-content[contenteditable=true]{-webkit-user-modify:read-write-plaintext-only}.DraftEditor-root{position:relative}.DraftEditor-editorContainer{background-color:#fff0;border-left:.1px solid #0000;position:relative;z-index:1}.public-DraftEditor-block{position:relative}.DraftEditor-alignLeft .public-DraftStyleDefault-block{text-align:left}.DraftEditor-alignLeft .public-DraftEditorPlaceholder-root{left:0;text-align:left}.DraftEditor-alignCenter .public-DraftStyleDefault-block{text-align:center}.DraftEditor-alignCenter .public-DraftEditorPlaceholder-root{margin:0 auto;text-align:center;width:100%}.DraftEditor-alignRight .public-DraftStyleDefault-block{text-align:right}.DraftEditor-alignRight .public-DraftEditorPlaceholder-root{right:0;text-align:right}.public-DraftEditorPlaceholder-root{color:#9197a3;position:absolute;width:100%;z-index:1}.public-DraftEditorPlaceholder-hasFocus{color:#bdc1c9}.DraftEditorPlaceholder-hidden{display:none}.public-DraftStyleDefault-block{position:relative;white-space:pre-wrap}.public-DraftStyleDefault-ltr{direction:ltr;text-align:left}.public-DraftStyleDefault-rtl{direction:rtl;text-align:right}.public-DraftStyleDefault-listLTR{direction:ltr}.public-DraftStyleDefault-listRTL{direction:rtl}.public-DraftStyleDefault-ol,.public-DraftStyleDefault-ul{margin:16px 0;padding:0}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listLTR{margin-left:1.5em}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listRTL{margin-right:1.5em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listLTR{margin-left:3em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listRTL{margin-right:3em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listLTR{margin-left:4.5em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listRTL{margin-right:4.5em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listLTR{margin-left:6em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listRTL{margin-right:6em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listLTR{margin-left:7.5em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listRTL{margin-right:7.5em}.public-DraftStyleDefault-unorderedListItem{list-style-type:square;position:relative}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth0{list-style-type:disc}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth1{list-style-type:circle}.public-DraftStyleDefault-orderedListItem{list-style-type:none;position:relative}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listLTR:before{left:-36px;position:absolute;text-align:right;width:30px}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listRTL:before{position:absolute;right:-36px;text-align:left;width:30px}.public-DraftStyleDefault-orderedListItem:before{content:counter(ol0) ". ";counter-increment:ol0}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth1:before{content:counter(ol1,lower-alpha) ". ";counter-increment:ol1}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth2:before{content:counter(ol2,lower-roman) ". ";counter-increment:ol2}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth3:before{content:counter(ol3) ". ";counter-increment:ol3}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth4:before{content:counter(ol4,lower-alpha) ". ";counter-increment:ol4}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-reset{counter-reset:ol0}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-reset{counter-reset:ol1}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-reset{counter-reset:ol2}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-reset{counter-reset:ol3}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-reset{counter-reset:ol4} -/*!rtl:end:ignore*/#wpseo_meta{box-sizing:border-box}#wpseo_meta *,#wpseo_meta :after,#wpseo_meta :before{box-sizing:inherit}.DraftEditor-root [data-block]{margin:0}#edittag>#wp-description-wrap{display:none}#wp-description-wrap .wp-editor-area{border:0}.term-description-wrap td>textarea#description{min-height:530px}.wpseo-meta-section,.wpseo-meta-section-react{border:1px solid #0003;display:none;height:auto;max-width:600px;min-height:100%;vertical-align:top;width:100%}.wpseo-meta-section-react.active,.wpseo-meta-section.active{background:#fff;position:relative;z-index:12}.wpseo-meta-section.active{display:inline-block}.wpseo-meta-section-react.active{display:block;margin-bottom:10px}.wpseo-meta-section-content{padding:16px}.wpseo-metabox-content{max-width:800px;padding-top:16px}.wpseo-metabox-menu{background-color:#fff;max-width:600px;padding:0}.wpseo-metabox-menu ul{align-items:flex-end;display:flex;flex-wrap:wrap;flex-flow:wrap-reverse;margin:0 1px 0 0;padding:0 0 0 16px}.wpseo-metabox-menu ul li:first-child{z-index:10}.wpseo-metabox-menu ul li:nth-child(2){z-index:9}.wpseo-metabox-menu ul li:nth-child(3){z-index:8}.wpseo-metabox-menu ul li:nth-child(4){z-index:7}.wpseo-metabox-menu ul li:nth-child(5){z-index:6}.wpseo-metabox-menu ul li:nth-child(6){z-index:5}.wpseo-metabox-menu ul li{background-color:#f8f8f8;box-shadow:0 0 4px 0 #0000001a;height:32px;margin-bottom:-1px;margin-left:-1px;position:relative;text-align:center}.wpseo-metabox-menu ul li a{align-items:center;border:1px solid #0003;border-bottom:2px #0000;color:#0073aa;display:flex}.wpseo-metabox-menu ul li a:focus{box-shadow:inherit}.wpseo-metabox-menu ul li .yst-traffic-light{height:20px;margin-left:4px;margin-right:10px;width:auto}.wpseo-metabox-menu ul li span.dashicons{margin-right:8px}.wpseo-metabox-menu ul li span.wpseo-buy-premium{color:#a4286a}.wpseo-metabox-menu ul li span.wpseo-buy-premium:hover{color:#832055}.wpseo-metabox-menu ul li.active{background-color:#fff;border-bottom:2px #0000;box-shadow:none;height:36px;margin-top:-4px;z-index:13}.wpseo-metabox-menu ul li.active a{color:#444;height:36px}.wpseo-metabox-menu ul li.active span.wpseo-buy-premium{border-color:#a4286a;color:#a4286a}.wpseo-metabox-menu ul li.active span.wpseo-buy-premium:hover{border-color:#832055;color:#832055}.wpseo-metabox-menu a{height:32px;padding:0 8px;text-decoration:none}.wpseotab{background-color:#fdfdfd;border:1px solid #ddd;display:none;padding:16px}.wpseotab .wpseo-cornerstone-checkbox{margin-right:.5em}.wpseotab.content{padding:20px 15px}.wpseotab.active{display:block}.wpseo-metabox-sidebar .dashicons{font-size:30px;height:30px;width:30px}#wpseo_meta .inside{margin:0}#wpseo_meta .inside:after{clear:both;content:"";display:table}#wpseo_meta .postbox .inside .wpseotab{font-size:13px!important}.wpseo-form input,.wpseo-form label,.wpseo-form p.error-message,.wpseo-form textarea{max-width:600px}.wpseo-form fieldset{padding-top:5px}.wpseo-form legend{font-weight:600}.wpseo-form label{display:block;font-weight:600}.wpseo-form input[type=checkbox]+label,.wpseo-form input[type=radio]+label{display:inline-block;font-weight:400}.wpseo-form fieldset,.wpseo-form label{margin-bottom:.5em;margin-top:2em}.wpseo-form input[type=checkbox],.wpseo-form input[type=checkbox]+label{font-size:1em;margin-bottom:0;margin-top:2em}.wpseo-form fieldset:first-child,.wpseo-form input[type=checkbox]:first-child,.wpseo-form input[type=checkbox]:first-child+label,.wpseo-form label:first-child{margin-top:10px}.wpseo-form input[type=radio]{margin-top:0}.wpseo-form input[type=radio]+label{margin:0 1em 0 0}.wpseo-form p.error-message{margin:.5em 0}.wpseo-form select[multiple]{margin-top:0}.yoast-metabox__description{margin:.5em 0;max-width:600px}.wpseo_image_upload_button{margin-left:3px}.good,.warn,.wrong{font-weight:600}.good{color:green}.warn{color:maroon}.wrong{color:#dc3232}#current_seo_title span{background-color:#ffffe0;padding:2px 5px}#focuskwresults ul{margin:0}#focuskwresults li,#focuskwresults p{font-size:13px}#focuskwresults li{list-style-type:disc;margin:0 0 0 20px}.wpseo_hidden{display:none}.wpseo_msg{background-color:#ffffe0;border:1px solid #e6db55;margin:5px 0 10px;padding:0 5px}.snippet-editor__button.snippet-editor__edit-button:focus{background-color:#fafafa;border-color:#5b9dd9;box-shadow:0 0 3px #0073aacc;color:#23282d;outline:none}.wpseo-admin-page .subsubsub li{display:inline;max-width:none}.yoast-seo-help-container{float:left;max-width:none;width:100%}.yoast-seo-help-container .yoast-help-panel{margin:.5em 0!important}.wpseo_content_wrapper p.search-box{margin:10px 0 5px}#wpseotab .ui-widget-content .ui-state-hover{background:#f1f1f1;border:1px solid #dfdfdf;color:#333}.yst-traffic-light{height:30px;margin:0 0 0 5px;width:19px}.yst-traffic-light .traffic-light-color{display:none}.yst-traffic-light.bad .traffic-light-red,.yst-traffic-light.good .traffic-light-green,.yst-traffic-light.init .traffic-light-init,.yst-traffic-light.na .traffic-light-empty,.yst-traffic-light.ok .traffic-light-orange{display:inline}.yoast-zapier-text{display:flex}.yoast-zapier-text .yoast-logo.svg{max-width:18px;width:100%!important}.yoast-seo-score .yoast-logo.svg{background:var(--yoast-svg-icon-yoast) no-repeat;background-size:18px;flex-shrink:0;float:left;height:18px;margin-right:7px;width:18px}.yoast-seo-score .yoast-logo.svg.good{background-image:var(--yoast-svg-icon-yoast-good)}.yoast-seo-score .yoast-logo.svg.ok{background-image:var(--yoast-svg-icon-yoast-ok)}.yoast-seo-score .yoast-logo.svg.bad{background-image:var(--yoast-svg-icon-yoast-bad)}.yoast-seo-score .yoast-logo.svg.na,.yoast-seo-score .yoast-logo.svg.noindex{background-image:var(--yoast-svg-icon-yoast)}.term-php .wpseo-taxonomy-metabox-postbox>h2{border-bottom:1px solid #eee;font-size:14px;line-height:1.4;margin:0;padding:8px 12px}#TB_window #TB_ajaxContent p{margin:5px 0 0;padding:5px 0 0}#TB_window #TB_ajaxContent ul{margin:5px 0 10px}#TB_window #TB_ajaxContent li{list-style:none;margin:5px 0 0}#TB_window #TB_ajaxContent li:before{content:"+";font-weight:700;margin:0 10px 0 0}.yoast-section__heading-icon-list{background-image:var(--yoast-svg-icon-list)}.yoast-section__heading-icon-key{background-image:var(--yoast-svg-icon-key)}.yoast-section__heading-icon-edit{background-image:var(--yoast-svg-icon-edit)}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}.screen-reader-text.wpseo-generic-tab-textual-score,.screen-reader-text.wpseo-keyword-tab-textual-score{display:block}.yoast-notice-go-premium{background:#f1f1f1;border-left-color:#a4286a;margin:0}.editor-styles-wrapper mark.annotation-text-yoast{background-color:#e1bee7}@media screen and (max-width:782px){.wpseo-metabox-buy-premium .wpseo-buy-premium{display:inline-block;height:20px;margin-right:5px;padding:0;width:20px}.yoast-help-panel{max-width:none!important}#wpseo-crawl-issues-table-form .subsubsub{float:none;max-width:calc(100vw - 20px)}#wpseo-crawl-issues-table-form .yoast-help-button{margin-top:3px}.wpseotab select[multiple]{height:auto!important}}@media screen and (max-width:600px){.wpseotab.content{padding:16px 0}}.wpseo-score-icon-container{align-items:center;display:flex;height:20px;justify-content:center;margin-right:8px;width:20px}.yoast-seo-sidebar-panel .yoast-analysis-check{display:flex}.yoast-seo-sidebar-panel .yoast-analysis-check svg{margin-right:5px;margin-top:6px}.yoast-seo-sidebar-panel .yoast-analysis-check span{line-height:1.5;margin-top:3px}.yoast-seo-sidebar-panel div{line-height:2}.yoast-seo-sidebar-panel div svg{vertical-align:middle}ul.yoast-seo-social-share-buttons li{display:inline-block;margin-right:24px}ul.yoast-seo-social-share-buttons li .x-share svg{fill:#000;height:30px;width:30px}ul.yoast-seo-social-share-buttons svg{height:32px;margin-bottom:8px;width:32px}ul.yoast-seo-social-share-buttons a{align-items:center;display:flex;flex-direction:column}.yoast.yoast-zapier{margin:8px 0 25px}.yoast-field-group.yoast-wincher-post-publish{margin-bottom:10px}.edit-post-pinned-plugins button.components-button:not(.is-compact)[aria-label="Yoast SEO Premium"]>svg,.edit-post-pinned-plugins button.components-button:not(.is-compact)[aria-label="Yoast SEO"]>svg,div.interface-pinned-items button.components-button:not(.is-compact)[aria-label="Yoast SEO Premium"]>svg,div.interface-pinned-items button.components-button:not(.is-compact)[aria-label="Yoast SEO"]>svg{height:28px;max-height:28px;max-width:28px;width:28px}div.interface-pinned-items button.components-button.is-pressed[aria-label="Yoast SEO Premium"]>svg path,div.interface-pinned-items button.components-button.is-pressed[aria-label="Yoast SEO"]>svg path{fill:#fff}.wpseo-schema-icon{align-items:center;background-image:var(--yoast-svg-icon-schema);background-size:cover;display:flex;height:16px;justify-content:center;margin-right:8px;width:16px}.wpseo-metabox-menu ul li.active a .wpseo-schema-icon{background-image:var(--yoast-svg-icon-schema-active)}.yoast-icon-span svg{fill:inherit;margin-right:8px}.yoast.components-panel__body{border-top:0}.components-button>.yoast-title-container{flex-grow:1;line-height:normal;overflow-x:hidden}.yoast-title-container>.yoast-subtitle,.yoast-title-container>.yoast-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yoast-title-container>.yoast-subtitle{font-size:.8125rem;font-weight:300;margin-top:2px}.yoast.components-panel__body .yoast-chevron{background-color:#1e1e1e;display:inline-block;height:24px;-webkit-mask-image:var(--yoast-svg-icon-chevron-down);mask-image:var(--yoast-svg-icon-chevron-down);-webkit-mask-size:100% 100%;mask-size:100% 100%;width:24px}.yoast.components-panel__body.is-opened .yoast-chevron{-webkit-mask-image:var(--yoast-svg-icon-chevron-up);mask-image:var(--yoast-svg-icon-chevron-up)}.yoast .components-panel__body-toggle{padding-right:16px}.yoast .components-form-token-field__remove-token.components-button,.yoast .components-form-token-field__token-text{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast-wordproof-metabox-alert.yoast-wordproof-metabox-alert{margin-bottom:0;margin-top:18px}.yoast .yoast-insights{color:#404040}.yoast .yoast-insights .yoast-field-group__title>b{color:var(--yoast-color-primary);font-size:16px;font-weight:var(--yoast-font-weight-default);line-height:1.2em}.yoast .yoast-insights-card__score{color:var(--yoast-color-primary);margin-block:0}.yoast .yoast-insights-card__description{line-height:1.4em}.yoast .yoast-prominent-words p,.yoast .yoast-prominent-words ul,.yoast .yoast-text-formality p{margin-block:1.2em}.yoast #wpseo-metabox-root .yoast-prominent-words{border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}.yoast .yoast-insights .yoast-data-model--upsell li{color:#bbb}.yoast .yoast-insights .yoast-data-model--upsell li:after{background:#fdf4f8} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2280-rtl.css deleted file mode 100644 index 6070b13b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-is-primary-term,.wpseo-primary-term>label{font-weight:600}.wpseo-non-primary-term>.wpseo-is-primary-term,.wpseo-primary-term>.wpseo-make-primary-term,.wpseo-term-unchecked>.wpseo-is-primary-term,.wpseo-term-unchecked>.wpseo-make-primary-term{display:none}.wpseo-is-primary-term,.wpseo-make-primary-term{float:left}.wpseo-non-primary-term:after,.wpseo-non-primary-term:before,.wpseo-primary-term:after,.wpseo-primary-term:before{content:"";display:table}.wpseo-non-primary-term:after,.wpseo-primary-term:after{clear:both}.wpseo-make-primary-term{background:none;border:none;color:#0073aa;cursor:pointer;margin:4px 0 0;padding:0;text-decoration:underline}.wpseo-make-primary-term:hover{color:#00a0d2} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2280.css deleted file mode 100644 index 32b768ce..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2280.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-is-primary-term,.wpseo-primary-term>label{font-weight:600}.wpseo-non-primary-term>.wpseo-is-primary-term,.wpseo-primary-term>.wpseo-make-primary-term,.wpseo-term-unchecked>.wpseo-is-primary-term,.wpseo-term-unchecked>.wpseo-make-primary-term{display:none}.wpseo-is-primary-term,.wpseo-make-primary-term{float:right}.wpseo-non-primary-term:after,.wpseo-non-primary-term:before,.wpseo-primary-term:after,.wpseo-primary-term:before{content:"";display:table}.wpseo-non-primary-term:after,.wpseo-primary-term:after{clear:both}.wpseo-make-primary-term{background:none;border:none;color:#0073aa;cursor:pointer;margin:4px 0 0;padding:0;text-decoration:underline}.wpseo-make-primary-term:hover{color:#00a0d2} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/modal-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/modal-2280-rtl.css deleted file mode 100644 index 25557730..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/modal-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;right:0;position:fixed;left:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);right:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;left:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-left:16px;width:19px}.yoast-modal__menu{border-left:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-left:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-left:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;right:0;left:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-left:8px}.yoast .yoast-close{left:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-right:16px;margin-left:16px;padding-right:0;padding-left:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:right;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(-180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:left;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;right:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-left:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-left:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}#yoast-semrush-country-selector{border:none;position:relative}.yoast-related-keyphrases-modal__chart{display:block}.yoast-wordproof-modal{max-width:380px;text-align:center}.yoast-wordproof-modal-image{display:flex;justify-content:center;margin-block:40px}.yoast-wordproof-modal-svg__webhook-failed{width:100%}.yoast-wordproof-modal-svg__success{width:175px}.yoast-wordproof-modal-action{display:flex;justify-content:center;margin-bottom:10px;margin-top:40px}.yoast-wordproof-modal-action.yoast-wordproof-modal-action>button{padding-right:20px;padding-left:20px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/modal-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/modal-2280.css deleted file mode 100644 index c33165e9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/modal-2280.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);left:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;right:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-right:16px;width:19px}.yoast-modal__menu{border-right:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-right:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-right:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;left:0;right:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-right:8px}.yoast .yoast-close{right:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-left:16px;margin-right:16px;padding-left:0;padding-right:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:left;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:right;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;left:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-right:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-right:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}#yoast-semrush-country-selector{border:none;position:relative}.yoast-related-keyphrases-modal__chart{display:block}.yoast-wordproof-modal{max-width:380px;text-align:center}.yoast-wordproof-modal-image{display:flex;justify-content:center;margin-block:40px}.yoast-wordproof-modal-svg__webhook-failed{width:100%}.yoast-wordproof-modal-svg__success{width:175px}.yoast-wordproof-modal-action{display:flex;justify-content:center;margin-bottom:10px;margin-top:40px}.yoast-wordproof-modal-action.yoast-wordproof-modal-action>button{padding-left:20px;padding-right:20px} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/monorepo-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/monorepo-2280-rtl.css deleted file mode 100644 index 6ca7bccf..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/monorepo-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -:root{--yoast-border-default:1px solid #0003;--yoast-color-default:#404040;--yoast-color-default-darker:#303030;--yoast-color-primary:#a4286a;--yoast-color-secondary:#f7f7f7;--yoast-color-white:#fff;--yoast-color-green:#6ea029;--yoast-color-primary-darker:#7b1e50;--yoast-color-primary-lighter:#f5d6e6;--yoast-color-secondary-darker:#d9d9d9;--yoast-color-button-upsell:#fec228;--yoast-color-button-upsell-hover:#f2ae01;--yoast-color-dark:#303030;--yoast-color-sale:#fec228;--yoast-color-sale-darker:#feb601;--yoast-color-border:#0003;--yoast-color-label:#303030;--yoast-color-label-help:#707070;--yoast-color-active:#6ea029;--yoast-color-inactive:#dc3232;--yoast-color-inactive-text:#707070;--yoast-color-inactive-grey:#9e9e9e;--yoast-color-inactive-grey-light:#f1f1f1;--yoast-color-active-light:#b6cf94;--yoast-transition-default:all 150ms ease-out;--yoast-color-link:#006dac;--yoast-color-border--default:#0003;--yoast-color-focus:0 0 0 2px #007fff,0 0 0 5px #bfdfff;--yoast-svg-icon-chevron-down:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-chevron-up:url('data:image/svg+xml;charset=utf-8,');--yoast-checkmark--white:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFF' viewBox='0 0 512 512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E");--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23m-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23m640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-hidden='true' viewBox='0 0 1792 1792'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' aria-hidden='true' viewBox='0 0 192 512'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960M944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34m848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136m0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136m1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5M384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136m1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5m0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5'/%3E%3C/svg%3E");--yoast-svg-icon-key:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-edit:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url('data:image/svg+xml;charset=utf-8,');--yoast-checkmark--green:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%236EA029' viewBox='0 0 512 512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E");--yoast-exclamation-mark:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23DC3232' viewBox='0 0 512 512'%3E%3Cpath d='M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248m-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46m-43.673-165.346 7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654'/%3E%3C/svg%3E");--yoast-svg-icon-schema:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24m181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24m-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24M0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24m386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24m0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24M181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24'/%3E%3C/svg%3E");--yoast-svg-icon-schema-active:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' aria-hidden='true'%3E%3Cpath fill='D4444' d='M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24m181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24m-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24M0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24m386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24m0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24M181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24'/%3E%3C/svg%3E");--yoast-svg-icon-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23707070' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m4 16 4.586-4.586a2 2 0 0 1 2.828 0L16 16m-2-2 1.586-1.586a2 2 0 0 1 2.828 0L20 14m-6-6h.01M6 20h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2'/%3E%3C/svg%3E");--yoast-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;--yoast-font-size-default:14px;--yoast-font-weight-default:400;--yoast-font-weight-bold:600;--yoast-color-font-default:#404040;--yoast-shadow-default:0px 3px 6px #00000026}.yoast-h1,.yoast-h2,.yoast-h3{color:var(--yoast-color-primary);font-weight:400;line-height:1.2;margin:0}.yoast-h1 a,.yoast-h2 a,.yoast-h3 a{color:var(--yoast-color-primary);text-decoration:none}.yoast-h1{font-size:24px}.yoast-h2{font-size:20px}.yoast-h3{font-size:16px}.yoast-paragraph{font-size:var(--yoast-font-size-default);margin-top:0}.screen-reader-text{clip:rect(1px,1px,1px,1px);word-wrap:normal!important;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);margin:-1px;padding:0}.screen-reader-text,.visually-hidden{height:1px;overflow:hidden;position:absolute;width:1px}.visually-hidden{clip:rect(1px,1px,1px,1px);word-wrap:normal;white-space:nowrap}@media (max-width:782px){.yoast-show-on-mobile{display:initial!important}}@media (min-width:782px){.yoast-hide-on-desktop{display:none}}.yoast-field-group__title-separator{display:flex;flex-wrap:wrap}.yoast-field-group__title-separator label{align-items:center;border:var(--yoast-border-default);box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;height:42px;justify-content:center;margin:0 0 6px 6px;width:42px}.yoast-field-group__title-separator input[type=radio]:checked+label{border:3px solid var(--yoast-color-primary)}.yoast .yoast-button{align-items:center;border:1px solid #0003;border-radius:4px;box-shadow:inset 0 -2px 0 #0000001a;cursor:pointer;display:inline-flex;font-size:14px;justify-content:center;line-height:1.2;padding:10px 12px 12px;position:relative;text-decoration:none;transition:background-color .15s ease-out 0s}.yoast .yoast-button:focus,.yoast-close:focus,.yoast-hide:focus,.yoast-remove:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast .yoast-button::-moz-focus-inner,.yoast-close::-moz-focus-inner,.yoast-hide::-moz-focus-inner,.yoast-remove::-moz-focus-inner{border:0}.yoast .yoast-button:not(:disabled):active{box-shadow:none;top:2px}.yoast .yoast-button:disabled{cursor:default;opacity:.5}.yoast .yoast-button--primary{background-color:var(--yoast-color-primary)}.yoast .yoast-button--primary,.yoast .yoast-button--primary:visited{border:1px solid #0003;color:var(--yoast-color-white)}.yoast .yoast-button--primary:active,.yoast .yoast-button--primary:not(:disabled):hover{background-color:var(--yoast-color-primary-darker);border:1px solid #0003;color:var(--yoast-color-white)}.yoast .yoast-button--primary:focus{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast .yoast-button--secondary{background-color:var(--yoast-color-secondary);box-shadow:inset 0 -2px 0 #0000001a;color:var(--yoast-color-dark)}.yoast .yoast-button--secondary:visited{color:var(--yoast-color-dark)}.yoast .yoast-button--secondary:active,.yoast .yoast-button--secondary:not(:disabled):hover{background-color:var(--yoast-color-secondary-darker);border:1px solid #0003;color:var(--yoast-color-dark)}.yoast .yoast-button--buy{background-color:var(--yoast-color-sale)}.yoast .yoast-button--buy,.yoast .yoast-button--buy:visited{color:var(--yoast-color-dark)}.yoast .yoast-button--buy:active,.yoast .yoast-button--buy:not(:disabled):hover{background-color:var(--yoast-color-sale-darker);color:var(--yoast-color-dark)}.yoast .yoast-button--buy__caret{height:16px;margin:0 6px 0 -2px;-webkit-mask-image:var(--yoast-svg-icon-caret-right);mask-image:var(--yoast-svg-icon-caret-right);width:6px}.yoast .yoast-button--buy__caret,.yoast .yoast-button--edit{background-color:currentColor;display:inline-block;flex-shrink:0}.yoast .yoast-button--edit{height:18px;margin-left:8px;-webkit-mask-image:var(--yoast-svg-icon-edit);mask-image:var(--yoast-svg-icon-edit);width:20.25px}html[dir=rtl] .yoast .yoast-button--edit{margin-right:8px;margin-left:0}html[dir=rtl] .yoast .yoast-button--buy{flex-direction:row-reverse}.yoast .yoast-button--small{font-size:13px;padding:5px 8px 8px}.yoast .yoast-button--small .yoast-button--buy__caret{height:10px;width:4px}.yoast-hide,.yoast-remove{background-color:initial;border:none;color:#dc3232;cursor:pointer;font-size:14px;padding:0;text-decoration:underline}.yoast-hide{color:var(--yoast-color-link)}.yoast-field-group__upload .yoast-button{margin-left:24px}.yoast-close{align-items:center;background:none;border:none;box-shadow:none;cursor:pointer;display:flex;height:44px;justify-content:center;padding:0;width:44px}.yoast-close svg{fill:var(--yoast-color-default);width:14px}@media screen and (max-width:782px){.yoast-close svg{width:10px}}.yoast-field-group__checkbox{align-items:center;display:flex}.yoast-field-group__checkbox:not(.yoast-field-group__checkbox--horizontal)+.yoast-field-group__checkbox{margin-top:4px}.yoast-field-group__checkbox label{cursor:pointer}.yoast-field-group__checkbox input[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:2px;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:2px 0 0 8px;overflow:hidden;padding:2px;position:relative;transition:background-color .15s ease-out 0s;width:18px}.yoast-field-group__checkbox input[type=checkbox]:checked:focus,.yoast-field-group__checkbox input[type=checkbox]:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast label+input[type=checkbox]{margin-right:16px}.yoast-field-group__checkbox input[type=checkbox]:checked{background:var(--yoast-checkmark--white) var(--yoast-color-primary) no-repeat center /13px;border:1px solid var(--yoast-color-primary);box-shadow:none}.yoast-field-group__checkbox input[type=checkbox]:checked:before{content:""}.yoast-field-group{border:none;margin:0 0 24px;padding:0;position:relative}.yoast-field-group__title{align-items:center;color:var(--yoast-color-label);display:flex;font-size:var(--yoast-font-size-default);font-weight:var(--yoast-font-weight-bold);line-height:1.5;margin:0 0 8px;padding:0}.yoast-field-group__title.yoast-field-group__title--light{font-weight:var(--yoast-font-weight-default)}.yoast-field-group .field-group-description{margin:0 0 1em}.yoast-field-group__inline{align-items:center;display:flex}.yoast-field-group__inline .yoast-field-group__inputfield{margin-left:8px}.yoast-field-group__inline .yoast-button{flex-shrink:0}.yoast-field-group .components-form-token-field__label{display:none}@media screen and (max-width:782px){.yoast-field-group__inline{display:block}.yoast-field-group__inline .yoast-field-group__inputfield{margin-bottom:8px;margin-left:0}}.yoast-help{margin-right:4px}.yoast-help__icon svg{fill:var(--yoast-color-inactive-text);height:12px;transition:var(--yoast-transition-default);width:12px}.yoast-help:focus svg,.yoast-help:hover svg{fill:var(--yoast-color-link)}.yoast-data-model{list-style:none;padding:0}.yoast-data-model li{font-weight:var(--yoast-font-weight-bold);line-height:1.4;padding:0 8px;position:relative;z-index:2}.yoast-data-model span{float:left;font-weight:var(--yoast-font-weight-default)}.yoast-data-model li+li{margin-top:9px}.yoast-data-model li:after{background:#f5d6e6;content:"";height:20px;right:0;position:absolute;width:var(--yoast-width);z-index:-1}.yoast-image-select__preview{align-items:center;background-color:initial;border:1px solid #0003;display:flex;justify-content:center;max-height:200px;max-width:100%;min-height:165px;overflow:hidden;padding:0;width:300px}.yoast-image-select__preview--no-preview{background:var(--yoast-color-inactive-grey-light) var(--yoast-svg-icon-image) no-repeat center center /64px 64px}.yoast-image-select__preview.yoast-image-select__preview-has-warnings{margin-bottom:16px}.yoast-image-select__preview .yoast-image-select__preview--image{height:100%;max-width:100%;object-fit:contain}.yoast-image-select .yoast-field-group__inputfield{margin-bottom:1em}.yoast-image-select .yoast-button{margin-left:1.5em}.yoast-image-select{margin-bottom:1.7em;margin-top:1.7em}.yoast-image-select .yoast-image-select-buttons button{margin-top:1em}#organization-image-select .yoast-image-select{margin-top:0}:root{--yoast-color-placeholder:#707070}.yoast .yoast-field-group__inputfield,.yoast .yoast-field-group__textarea{background:var(--yoast-color-white);border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;box-sizing:border-box;font-size:var(--yoast-font-size-default);padding:8px;width:100%}.yoast .yoast-field-group__inputfield:focus,.yoast .yoast-field-group__textarea:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group__upload .yoast-field-group__inputfield{margin-bottom:8px}.yoast-field-group__inputfield{height:40px}.yoast-field-group__textarea{min-height:200px}.yoast input+.description,.yoast-field-group .description+.yoast-field-group__inputfield,.yoast-field-group .description+input,.yoast-field-group__inputfield+.description{margin-bottom:24px;margin-top:8px}.yoast .yoast-field-group__inputfield:disabled,.yoast .yoast-field-group__inputfield:read-only,.yoast .yoast-field-group__inputfield[aria-disabled=true]{background:var(--yoast-color-inactive-grey-light)}.yoast .duration-inputs__wrapper{display:flex;flex-direction:row}.yoast .duration-inputs__input-wrapper{display:flex;flex-direction:column}.yoast .duration-inputs__input{margin:0 0 0 8px;width:4em}::placeholder{color:var(--yoast-color-placeholder);opacity:1}.yoast-insights-row:not(:last-of-type){border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}.yoast-insights-row--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}@media(min-width:782px){.yoast-modal-content .yoast-insights-row{border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}}.yoast-insights-card__content{display:flex}.yoast-insights-card__score{flex-shrink:0;font-size:16px;margin-left:2em}.yoast-insights-card__amount{display:block;font-size:3.5em;line-height:1}.yoast-field-group__radiobutton{align-items:center;display:flex}.yoast-field-group__radiobutton--vertical:not(:last-of-type){margin-bottom:8px}.yoast-field-group__radiobutton label{cursor:pointer;margin-left:16px}.yoast-field-group__radiobutton input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:50%;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:0 0 0 8px;overflow:hidden;padding:2px;position:relative;transition:border-color .15s ease-out 0s;width:18px}.yoast-field-group__radiobutton input[type=radio]:checked:focus,.yoast-field-group__radiobutton input[type=radio]:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group__radiobutton input[type=radio]:checked{background-color:inherit;border-color:var(--yoast-color-primary)}.yoast-field-group__radiobutton input[type=radio]:checked:before{content:none}.yoast-field-group__radiobutton input[type=radio]:after{background-color:initial;border-radius:50%;content:"";display:block;height:10px;right:3px;position:absolute;top:3px;transition:background-color .15s ease-out 0s;width:10px}.yoast-field-group__radiobutton input[type=radio]:checked:after{background-color:var(--yoast-color-primary)}.yoast-field-group__select{align-items:center;cursor:pointer;display:flex}.yoast-select__indicator-separator{display:none}.yoast-select-container{background-color:#fff;border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;display:block;min-height:2.85em;padding:0;position:relative;width:100%}.yoast-select-container .yoast-select__control--is-focused{box-shadow:var(--yoast-color-focus);outline:none}.yoast-select-container .yoast-select__indicator>svg{color:#212121}.yoast-select-container .yoast-select__menu{margin:0;z-index:2}.yoast-select-container .yoast-select__multi-value__label{align-items:center;box-sizing:border-box;color:inherit;display:flex;font-size:14px;padding:0}.yoast-select-container .yoast-select__multi-value{background-color:var(--yoast-color-primary);border:0;border-radius:12px;color:var(--yoast-color-white);display:flex;flex-direction:row-reverse;font-weight:500;line-height:1.5;margin-bottom:3px;margin-left:8px;margin-top:3px;padding:1px 10px 2px}.yoast-select-container .yoast-select__menu-list{padding:0}.yoast-select-container .yoast-select__multi-value__remove{-webkit-box-align:center;align-items:center;border-radius:2px;box-sizing:border-box;display:flex;margin-left:6px;padding:2px 0 0}.yoast-select-container .yoast-select__multi-value__remove:hover{background-color:inherit;color:var(--yoast-color-white);cursor:pointer}.yoast-select-container .yoast-select__control{background-color:initial;border:none;border-radius:0}.yoast-select-container .yoast-select__option{box-sizing:border-box;color:inherit;cursor:default;display:block;padding:8px 12px;-webkit-user-select:none;user-select:none;width:100%}.yoast-select-container .yoast-select__option--is-focused{background-color:var(--yoast-color-primary-lighter);color:var(--yoast-color-font-default)}.yoast-select-container .yoast-select__option.yoast-select__option--is-selected{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast-select-container input[type=text]:focus{box-shadow:none}.yoast-field-group select,.yoast-field-group__select select{-webkit-appearance:none;-moz-appearance:none;background-color:#fff;background-image:url('data:image/svg+xml;charset=utf-8,');background-position:left 15px center;background-repeat:no-repeat;background-size:13px auto;border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;display:block;font-size:var(--yoast-font-size-default);max-width:300px;min-height:2.85em;padding:5px 8px;position:relative;width:100%}.yoast-field-group .yoast-select__value-container{padding:0 8px!important}.yoast-field-group select:focus,.yoast-field-group__select select:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group select,.yoast-field-group__select select{line-height:1.9;padding-left:40px}.yoast-field-group select.yoast-select--inline{display:inline-block}.yoast-field-group--inline{display:inline-block;margin-left:8px;max-width:300px;width:100%}.yoast-star-rating{display:inline-block;height:12px;width:65px}.yoast-star-rating span{background-repeat:repeat-x;background-size:13px 12px;height:100%;width:100%}.yoast-star-rating__placeholder{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAmCAQAAAAYCMGrAAAA+klEQVR4AcWV4cbtMBBFF0MIVUopoVSrhDDv/3gf/RFRpzdNOty1HiBO99mzeYWgCMZMKCPGrCgrxiSUhCkDeukxJKCXAUMiehkxw6FZhxEzmp0x4kCzByYISqlYdal0supS6WrVpdLEK0YSamJiJOPY0c/uOG4s6CcXfuKJaJcRzyNCQJsNiF1sRTR1hP11NNJ8RCrONOPRf+r7J+TZgQ5CNfMOYvW/2YxDqzqA/57+gVY9eiakrnyZEGXDsaE3p/4JScwPX3rtnZATDxnPWT7X16XAHaH8HWNrlxJD9TyGti5tCM84zpZe+RxNjeX9tZqLaGoMxN/P/wHP5Vw+8ZxnEQAAAABJRU5ErkJggg==);display:inline-block;overflow:hidden;position:relative}.yoast-star-rating__fill{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAmBAMAAABALxQTAAAAFVBMVEVMaXH4twP4twP4twP4twP4twP4twP7w8S/AAAAB3RSTlMAFv5uPpvQloUsTQAAAMFJREFUeAGE0TEOgzAMQFEXoDNiYC6/wFxxAsTADDkB5f6HqNRENXUi8TYiRfnY8lNXkjBOkuBWSeAhsYJOYiW9xO4MEqshkTbCSyIH7GLdgFasHHgmwkikZQD6OROZRG4Hxju8o/TNhbNhCqkOxaZDVKdxNnq/EjUS/A2o0PuXpyVeb9bjDWY9QSWXDQfBbtbjtWY9bM4sqfx+5yYt8wNcAFEzrGGkk5668KsFrKewPtQ3aFqh8WOnYZ+lIBQkgykAWk8rlAqcHfQAAAAASUVORK5CYII=);display:block}.yoast-table{border:var(--yoast-border-default);border-bottom:0;border-spacing:0;color:var(--yoast-color-default);font-size:var(--yoast-font-size-default);line-height:1.2;width:100%}.yoast-table tbody tr:nth-child(odd){background-color:#f9f9f9}.yoast-table th{color:var(--yoast-color-dark);font-weight:var(--yoast-font-weight-bold);text-align:right;white-space:nowrap}.yoast-table td,.yoast-table th{border-bottom:var(--yoast-border-default);padding:18px 12px}.yoast-table td:first-child,.yoast-table th:first-child{padding-right:16px}.yoast-table td:last-child,.yoast-table th:last-child{padding-left:16px}td.yoast-table__button,td.yoast-table__image{padding:10px 18px 9px}.yoast-table.yoast-table--nobreak td,td.yoast-table--nobreak,tr.yoast-table--nobreak td{white-space:nowrap}th.yoast-table--primary{width:100%}td.yoast-table--nopadding{padding:0 12px}.yoast-badge{border-radius:8px;display:inline-block;font-size:10px;font-weight:600;line-height:1.6;min-height:16px;padding:0 8px}.yoast-badge__in-label{margin-right:8px;vertical-align:text-top}.yoast-new-badge{background-color:#cce5ff;color:#004973}.yoast-premium-badge{background-color:#fff3cd;color:#674e00}.yoast-beta-badge{background-color:#cce5ff;color:#004973;margin:0 0 0 2px}.yoast-feature{margin-left:150px;max-width:600px}.yoast-toggle__item{border-bottom:1px solid var(--yoast-color-border);display:flex;justify-content:space-between;margin-bottom:16px;padding-bottom:16px}.yoast-toggle__item-disabled{position:relative}.yoast-toggle__item-disabled .yoast-button.yoast-button--buy{right:100%;margin-right:32px;position:absolute;white-space:nowrap}.yoast-toggle__item-disabled .yoast-toggle,.yoast-toggle__item-disabled .yoast-toggle__item-title{opacity:.5}.yoast-toggle__item-title{align-items:center;display:flex;font-weight:700}input[type=checkbox].yoast-toggle__checkbox{-webkit-appearance:none;-moz-appearance:none;background-color:initial;border:0;box-shadow:none;height:23px;margin-right:8px;overflow:hidden;position:absolute;width:34px;z-index:1}input[type=checkbox].yoast-toggle__checkbox:checked:before{content:none}.yoast-toggle__switch{background-color:var(--yoast-color-inactive-grey);border-radius:8px;display:inline-block;height:14px;margin-right:8px;margin-left:8px;position:relative;width:34px}.yoast-toggle__checkbox:focus~.yoast-toggle__switch:before{box-shadow:var(--yoast-color-focus)}.yoast-toggle__switch:before{background-color:var(--yoast-color-inactive-grey-light);border:.5px solid #0000001a;border-radius:50%;box-shadow:0 1px 2px 0 #0006;box-sizing:border-box;content:"";height:20px;right:0;position:absolute;top:-3px;width:20px}.yoast-toggle,.yoast-toggle--inverse{align-items:center;display:grid;grid-template:1fr/repeat(3,auto);position:relative}.yoast-toggle--inverse>*,.yoast-toggle>*{grid-row:1}.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle--active{grid-column:1}.yoast-toggle__checkbox,.yoast-toggle__switch{grid-column:2}.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle--inactive{grid-column:3}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle__switch,.yoast-toggle--inverse .yoast-toggle__checkbox:not(:checked)~.yoast-toggle__switch{background-color:var(--yoast-color-active-light)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle__switch:before,.yoast-toggle--inverse .yoast-toggle__checkbox:not(:checked)~.yoast-toggle__switch:before{background-color:var(--yoast-color-active);right:auto;left:0}.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle__switch:before{right:0;left:auto}.yoast-toggle .yoast-toggle__checkbox~.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle__checkbox~.yoast-toggle--inactive{color:var(--yoast-color-default-darker)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle--inactive,.yoast-toggle .yoast-toggle__checkbox~.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle__checkbox~.yoast-toggle--active{color:var(--yoast-color-inactive-text)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle--active{color:var(--yoast-color-default-darker)}@media(max-width:400px){.yoast-feature{margin-left:0}.yoast-toggle__item-disabled{flex-wrap:wrap}.yoast-toggle__item-disabled .yoast-button.yoast-button--buy{margin-right:0;margin-top:8px;position:static}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/monorepo-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/monorepo-2280.css deleted file mode 100644 index d03eebb3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/monorepo-2280.css +++ /dev/null @@ -1 +0,0 @@ -:root{--yoast-border-default:1px solid #0003;--yoast-color-default:#404040;--yoast-color-default-darker:#303030;--yoast-color-primary:#a4286a;--yoast-color-secondary:#f7f7f7;--yoast-color-white:#fff;--yoast-color-green:#6ea029;--yoast-color-primary-darker:#7b1e50;--yoast-color-primary-lighter:#f5d6e6;--yoast-color-secondary-darker:#d9d9d9;--yoast-color-button-upsell:#fec228;--yoast-color-button-upsell-hover:#f2ae01;--yoast-color-dark:#303030;--yoast-color-sale:#fec228;--yoast-color-sale-darker:#feb601;--yoast-color-border:#0003;--yoast-color-label:#303030;--yoast-color-label-help:#707070;--yoast-color-active:#6ea029;--yoast-color-inactive:#dc3232;--yoast-color-inactive-text:#707070;--yoast-color-inactive-grey:#9e9e9e;--yoast-color-inactive-grey-light:#f1f1f1;--yoast-color-active-light:#b6cf94;--yoast-transition-default:all 150ms ease-out;--yoast-color-link:#006dac;--yoast-color-border--default:#0003;--yoast-color-focus:0 0 0 2px #007fff,0 0 0 5px #bfdfff;--yoast-svg-icon-chevron-down:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-chevron-up:url('data:image/svg+xml;charset=utf-8,');--yoast-checkmark--white:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFF' viewBox='0 0 512 512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E");--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23m-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23m640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-hidden='true' viewBox='0 0 1792 1792'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' aria-hidden='true' viewBox='0 0 192 512'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960M944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34m848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136m0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136m1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5M384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136m1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5m0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5'/%3E%3C/svg%3E");--yoast-svg-icon-key:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-edit:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url('data:image/svg+xml;charset=utf-8,');--yoast-checkmark--green:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%236EA029' viewBox='0 0 512 512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E");--yoast-exclamation-mark:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23DC3232' viewBox='0 0 512 512'%3E%3Cpath d='M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248m-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46m-43.673-165.346 7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654'/%3E%3C/svg%3E");--yoast-svg-icon-schema:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24m181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24m-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24M0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24m386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24m0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24M181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24'/%3E%3C/svg%3E");--yoast-svg-icon-schema-active:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' aria-hidden='true'%3E%3Cpath fill='D4444' d='M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24m181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24m-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24M0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24m386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24m0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24M181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24'/%3E%3C/svg%3E");--yoast-svg-icon-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23707070' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m4 16 4.586-4.586a2 2 0 0 1 2.828 0L16 16m-2-2 1.586-1.586a2 2 0 0 1 2.828 0L20 14m-6-6h.01M6 20h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2'/%3E%3C/svg%3E");--yoast-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;--yoast-font-size-default:14px;--yoast-font-weight-default:400;--yoast-font-weight-bold:600;--yoast-color-font-default:#404040;--yoast-shadow-default:0px 3px 6px #00000026}.yoast-h1,.yoast-h2,.yoast-h3{color:var(--yoast-color-primary);font-weight:400;line-height:1.2;margin:0}.yoast-h1 a,.yoast-h2 a,.yoast-h3 a{color:var(--yoast-color-primary);text-decoration:none}.yoast-h1{font-size:24px}.yoast-h2{font-size:20px}.yoast-h3{font-size:16px}.yoast-paragraph{font-size:var(--yoast-font-size-default);margin-top:0}.screen-reader-text{clip:rect(1px,1px,1px,1px);word-wrap:normal!important;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);margin:-1px;padding:0}.screen-reader-text,.visually-hidden{height:1px;overflow:hidden;position:absolute;width:1px}.visually-hidden{clip:rect(1px,1px,1px,1px);word-wrap:normal;white-space:nowrap}@media (max-width:782px){.yoast-show-on-mobile{display:initial!important}}@media (min-width:782px){.yoast-hide-on-desktop{display:none}}.yoast-field-group__title-separator{display:flex;flex-wrap:wrap}.yoast-field-group__title-separator label{align-items:center;border:var(--yoast-border-default);box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;height:42px;justify-content:center;margin:0 6px 6px 0;width:42px}.yoast-field-group__title-separator input[type=radio]:checked+label{border:3px solid var(--yoast-color-primary)}.yoast .yoast-button{align-items:center;border:1px solid #0003;border-radius:4px;box-shadow:inset 0 -2px 0 #0000001a;cursor:pointer;display:inline-flex;font-size:14px;justify-content:center;line-height:1.2;padding:10px 12px 12px;position:relative;text-decoration:none;transition:background-color .15s ease-out 0s}.yoast .yoast-button:focus,.yoast-close:focus,.yoast-hide:focus,.yoast-remove:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast .yoast-button::-moz-focus-inner,.yoast-close::-moz-focus-inner,.yoast-hide::-moz-focus-inner,.yoast-remove::-moz-focus-inner{border:0}.yoast .yoast-button:not(:disabled):active{box-shadow:none;top:2px}.yoast .yoast-button:disabled{cursor:default;opacity:.5}.yoast .yoast-button--primary{background-color:var(--yoast-color-primary)}.yoast .yoast-button--primary,.yoast .yoast-button--primary:visited{border:1px solid #0003;color:var(--yoast-color-white)}.yoast .yoast-button--primary:active,.yoast .yoast-button--primary:not(:disabled):hover{background-color:var(--yoast-color-primary-darker);border:1px solid #0003;color:var(--yoast-color-white)}.yoast .yoast-button--primary:focus{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast .yoast-button--secondary{background-color:var(--yoast-color-secondary);box-shadow:inset 0 -2px 0 #0000001a;color:var(--yoast-color-dark)}.yoast .yoast-button--secondary:visited{color:var(--yoast-color-dark)}.yoast .yoast-button--secondary:active,.yoast .yoast-button--secondary:not(:disabled):hover{background-color:var(--yoast-color-secondary-darker);border:1px solid #0003;color:var(--yoast-color-dark)}.yoast .yoast-button--buy{background-color:var(--yoast-color-sale)}.yoast .yoast-button--buy,.yoast .yoast-button--buy:visited{color:var(--yoast-color-dark)}.yoast .yoast-button--buy:active,.yoast .yoast-button--buy:not(:disabled):hover{background-color:var(--yoast-color-sale-darker);color:var(--yoast-color-dark)}.yoast .yoast-button--buy__caret{height:16px;margin:0 -2px 0 6px;-webkit-mask-image:var(--yoast-svg-icon-caret-right);mask-image:var(--yoast-svg-icon-caret-right);width:6px}.yoast .yoast-button--buy__caret,.yoast .yoast-button--edit{background-color:currentColor;display:inline-block;flex-shrink:0}.yoast .yoast-button--edit{height:18px;margin-right:8px;-webkit-mask-image:var(--yoast-svg-icon-edit);mask-image:var(--yoast-svg-icon-edit);width:20.25px}html[dir=rtl] .yoast .yoast-button--edit{margin-left:8px;margin-right:0}html[dir=rtl] .yoast .yoast-button--buy{flex-direction:row-reverse}.yoast .yoast-button--small{font-size:13px;padding:5px 8px 8px}.yoast .yoast-button--small .yoast-button--buy__caret{height:10px;width:4px}.yoast-hide,.yoast-remove{background-color:initial;border:none;color:#dc3232;cursor:pointer;font-size:14px;padding:0;text-decoration:underline}.yoast-hide{color:var(--yoast-color-link)}.yoast-field-group__upload .yoast-button{margin-right:24px}.yoast-close{align-items:center;background:none;border:none;box-shadow:none;cursor:pointer;display:flex;height:44px;justify-content:center;padding:0;width:44px}.yoast-close svg{fill:var(--yoast-color-default);width:14px}@media screen and (max-width:782px){.yoast-close svg{width:10px}}.yoast-field-group__checkbox{align-items:center;display:flex}.yoast-field-group__checkbox:not(.yoast-field-group__checkbox--horizontal)+.yoast-field-group__checkbox{margin-top:4px}.yoast-field-group__checkbox label{cursor:pointer}.yoast-field-group__checkbox input[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:2px;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:2px 8px 0 0;overflow:hidden;padding:2px;position:relative;transition:background-color .15s ease-out 0s;width:18px}.yoast-field-group__checkbox input[type=checkbox]:checked:focus,.yoast-field-group__checkbox input[type=checkbox]:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast label+input[type=checkbox]{margin-left:16px}.yoast-field-group__checkbox input[type=checkbox]:checked{background:var(--yoast-checkmark--white) var(--yoast-color-primary) no-repeat center /13px;border:1px solid var(--yoast-color-primary);box-shadow:none}.yoast-field-group__checkbox input[type=checkbox]:checked:before{content:""}.yoast-field-group{border:none;margin:0 0 24px;padding:0;position:relative}.yoast-field-group__title{align-items:center;color:var(--yoast-color-label);display:flex;font-size:var(--yoast-font-size-default);font-weight:var(--yoast-font-weight-bold);line-height:1.5;margin:0 0 8px;padding:0}.yoast-field-group__title.yoast-field-group__title--light{font-weight:var(--yoast-font-weight-default)}.yoast-field-group .field-group-description{margin:0 0 1em}.yoast-field-group__inline{align-items:center;display:flex}.yoast-field-group__inline .yoast-field-group__inputfield{margin-right:8px}.yoast-field-group__inline .yoast-button{flex-shrink:0}.yoast-field-group .components-form-token-field__label{display:none}@media screen and (max-width:782px){.yoast-field-group__inline{display:block}.yoast-field-group__inline .yoast-field-group__inputfield{margin-bottom:8px;margin-right:0}}.yoast-help{margin-left:4px}.yoast-help__icon svg{fill:var(--yoast-color-inactive-text);height:12px;transition:var(--yoast-transition-default);width:12px}.yoast-help:focus svg,.yoast-help:hover svg{fill:var(--yoast-color-link)}.yoast-data-model{list-style:none;padding:0}.yoast-data-model li{font-weight:var(--yoast-font-weight-bold);line-height:1.4;padding:0 8px;position:relative;z-index:2}.yoast-data-model span{float:right;font-weight:var(--yoast-font-weight-default)}.yoast-data-model li+li{margin-top:9px}.yoast-data-model li:after{background:#f5d6e6;content:"";height:20px;left:0;position:absolute;width:var(--yoast-width);z-index:-1}.yoast-image-select__preview{align-items:center;background-color:initial;border:1px solid #0003;display:flex;justify-content:center;max-height:200px;max-width:100%;min-height:165px;overflow:hidden;padding:0;width:300px}.yoast-image-select__preview--no-preview{background:var(--yoast-color-inactive-grey-light) var(--yoast-svg-icon-image) no-repeat center center /64px 64px}.yoast-image-select__preview.yoast-image-select__preview-has-warnings{margin-bottom:16px}.yoast-image-select__preview .yoast-image-select__preview--image{height:100%;max-width:100%;object-fit:contain}.yoast-image-select .yoast-field-group__inputfield{margin-bottom:1em}.yoast-image-select .yoast-button{margin-right:1.5em}.yoast-image-select{margin-bottom:1.7em;margin-top:1.7em}.yoast-image-select .yoast-image-select-buttons button{margin-top:1em}#organization-image-select .yoast-image-select{margin-top:0}:root{--yoast-color-placeholder:#707070}.yoast .yoast-field-group__inputfield,.yoast .yoast-field-group__textarea{background:var(--yoast-color-white);border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;box-sizing:border-box;font-size:var(--yoast-font-size-default);padding:8px;width:100%}.yoast .yoast-field-group__inputfield:focus,.yoast .yoast-field-group__textarea:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group__upload .yoast-field-group__inputfield{margin-bottom:8px}.yoast-field-group__inputfield{height:40px}.yoast-field-group__textarea{min-height:200px}.yoast input+.description,.yoast-field-group .description+.yoast-field-group__inputfield,.yoast-field-group .description+input,.yoast-field-group__inputfield+.description{margin-bottom:24px;margin-top:8px}.yoast .yoast-field-group__inputfield:disabled,.yoast .yoast-field-group__inputfield:read-only,.yoast .yoast-field-group__inputfield[aria-disabled=true]{background:var(--yoast-color-inactive-grey-light)}.yoast .duration-inputs__wrapper{display:flex;flex-direction:row}.yoast .duration-inputs__input-wrapper{display:flex;flex-direction:column}.yoast .duration-inputs__input{margin:0 8px 0 0;width:4em}::placeholder{color:var(--yoast-color-placeholder);opacity:1}.yoast-insights-row:not(:last-of-type){border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}.yoast-insights-row--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}@media(min-width:782px){.yoast-modal-content .yoast-insights-row{border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}}.yoast-insights-card__content{display:flex}.yoast-insights-card__score{flex-shrink:0;font-size:16px;margin-right:2em}.yoast-insights-card__amount{display:block;font-size:3.5em;line-height:1}.yoast-field-group__radiobutton{align-items:center;display:flex}.yoast-field-group__radiobutton--vertical:not(:last-of-type){margin-bottom:8px}.yoast-field-group__radiobutton label{cursor:pointer;margin-right:16px}.yoast-field-group__radiobutton input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:50%;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:0 8px 0 0;overflow:hidden;padding:2px;position:relative;transition:border-color .15s ease-out 0s;width:18px}.yoast-field-group__radiobutton input[type=radio]:checked:focus,.yoast-field-group__radiobutton input[type=radio]:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group__radiobutton input[type=radio]:checked{background-color:inherit;border-color:var(--yoast-color-primary)}.yoast-field-group__radiobutton input[type=radio]:checked:before{content:none}.yoast-field-group__radiobutton input[type=radio]:after{background-color:initial;border-radius:50%;content:"";display:block;height:10px;left:3px;position:absolute;top:3px;transition:background-color .15s ease-out 0s;width:10px}.yoast-field-group__radiobutton input[type=radio]:checked:after{background-color:var(--yoast-color-primary)}.yoast-field-group__select{align-items:center;cursor:pointer;display:flex}.yoast-select__indicator-separator{display:none}.yoast-select-container{background-color:#fff;border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;display:block;min-height:2.85em;padding:0;position:relative;width:100%}.yoast-select-container .yoast-select__control--is-focused{box-shadow:var(--yoast-color-focus);outline:none}.yoast-select-container .yoast-select__indicator>svg{color:#212121}.yoast-select-container .yoast-select__menu{margin:0;z-index:2}.yoast-select-container .yoast-select__multi-value__label{align-items:center;box-sizing:border-box;color:inherit;display:flex;font-size:14px;padding:0}.yoast-select-container .yoast-select__multi-value{background-color:var(--yoast-color-primary);border:0;border-radius:12px;color:var(--yoast-color-white);display:flex;flex-direction:row-reverse;font-weight:500;line-height:1.5;margin-bottom:3px;margin-right:8px;margin-top:3px;padding:1px 10px 2px}.yoast-select-container .yoast-select__menu-list{padding:0}.yoast-select-container .yoast-select__multi-value__remove{-webkit-box-align:center;align-items:center;border-radius:2px;box-sizing:border-box;display:flex;margin-right:6px;padding:2px 0 0}.yoast-select-container .yoast-select__multi-value__remove:hover{background-color:inherit;color:var(--yoast-color-white);cursor:pointer}.yoast-select-container .yoast-select__control{background-color:initial;border:none;border-radius:0}.yoast-select-container .yoast-select__option{box-sizing:border-box;color:inherit;cursor:default;display:block;padding:8px 12px;-webkit-user-select:none;user-select:none;width:100%}.yoast-select-container .yoast-select__option--is-focused{background-color:var(--yoast-color-primary-lighter);color:var(--yoast-color-font-default)}.yoast-select-container .yoast-select__option.yoast-select__option--is-selected{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast-select-container input[type=text]:focus{box-shadow:none}.yoast-field-group select,.yoast-field-group__select select{-webkit-appearance:none;-moz-appearance:none;background-color:#fff;background-image:url('data:image/svg+xml;charset=utf-8,');background-position:right 15px center;background-repeat:no-repeat;background-size:13px auto;border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;display:block;font-size:var(--yoast-font-size-default);max-width:300px;min-height:2.85em;padding:5px 8px;position:relative;width:100%}.yoast-field-group .yoast-select__value-container{padding:0 8px!important}.yoast-field-group select:focus,.yoast-field-group__select select:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group select,.yoast-field-group__select select{line-height:1.9;padding-right:40px}.yoast-field-group select.yoast-select--inline{display:inline-block}.yoast-field-group--inline{display:inline-block;margin-right:8px;max-width:300px;width:100%}.yoast-star-rating{display:inline-block;height:12px;width:65px}.yoast-star-rating span{background-repeat:repeat-x;background-size:13px 12px;height:100%;width:100%}.yoast-star-rating__placeholder{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAmCAQAAAAYCMGrAAAA+klEQVR4AcWV4cbtMBBFF0MIVUopoVSrhDDv/3gf/RFRpzdNOty1HiBO99mzeYWgCMZMKCPGrCgrxiSUhCkDeukxJKCXAUMiehkxw6FZhxEzmp0x4kCzByYISqlYdal0supS6WrVpdLEK0YSamJiJOPY0c/uOG4s6CcXfuKJaJcRzyNCQJsNiF1sRTR1hP11NNJ8RCrONOPRf+r7J+TZgQ5CNfMOYvW/2YxDqzqA/57+gVY9eiakrnyZEGXDsaE3p/4JScwPX3rtnZATDxnPWT7X16XAHaH8HWNrlxJD9TyGti5tCM84zpZe+RxNjeX9tZqLaGoMxN/P/wHP5Vw+8ZxnEQAAAABJRU5ErkJggg==);display:inline-block;overflow:hidden;position:relative}.yoast-star-rating__fill{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAmBAMAAABALxQTAAAAFVBMVEVMaXH4twP4twP4twP4twP4twP4twP7w8S/AAAAB3RSTlMAFv5uPpvQloUsTQAAAMFJREFUeAGE0TEOgzAMQFEXoDNiYC6/wFxxAsTADDkB5f6HqNRENXUi8TYiRfnY8lNXkjBOkuBWSeAhsYJOYiW9xO4MEqshkTbCSyIH7GLdgFasHHgmwkikZQD6OROZRG4Hxju8o/TNhbNhCqkOxaZDVKdxNnq/EjUS/A2o0PuXpyVeb9bjDWY9QSWXDQfBbtbjtWY9bM4sqfx+5yYt8wNcAFEzrGGkk5668KsFrKewPtQ3aFqh8WOnYZ+lIBQkgykAWk8rlAqcHfQAAAAASUVORK5CYII=);display:block}.yoast-table{border:var(--yoast-border-default);border-bottom:0;border-spacing:0;color:var(--yoast-color-default);font-size:var(--yoast-font-size-default);line-height:1.2;width:100%}.yoast-table tbody tr:nth-child(odd){background-color:#f9f9f9}.yoast-table th{color:var(--yoast-color-dark);font-weight:var(--yoast-font-weight-bold);text-align:left;white-space:nowrap}.yoast-table td,.yoast-table th{border-bottom:var(--yoast-border-default);padding:18px 12px}.yoast-table td:first-child,.yoast-table th:first-child{padding-left:16px}.yoast-table td:last-child,.yoast-table th:last-child{padding-right:16px}td.yoast-table__button,td.yoast-table__image{padding:10px 18px 9px}.yoast-table.yoast-table--nobreak td,td.yoast-table--nobreak,tr.yoast-table--nobreak td{white-space:nowrap}th.yoast-table--primary{width:100%}td.yoast-table--nopadding{padding:0 12px}.yoast-badge{border-radius:8px;display:inline-block;font-size:10px;font-weight:600;line-height:1.6;min-height:16px;padding:0 8px}.yoast-badge__in-label{margin-left:8px;vertical-align:text-top}.yoast-new-badge{background-color:#cce5ff;color:#004973}.yoast-premium-badge{background-color:#fff3cd;color:#674e00}.yoast-beta-badge{background-color:#cce5ff;color:#004973;margin:0 2px 0 0}.yoast-feature{margin-right:150px;max-width:600px}.yoast-toggle__item{border-bottom:1px solid var(--yoast-color-border);display:flex;justify-content:space-between;margin-bottom:16px;padding-bottom:16px}.yoast-toggle__item-disabled{position:relative}.yoast-toggle__item-disabled .yoast-button.yoast-button--buy{left:100%;margin-left:32px;position:absolute;white-space:nowrap}.yoast-toggle__item-disabled .yoast-toggle,.yoast-toggle__item-disabled .yoast-toggle__item-title{opacity:.5}.yoast-toggle__item-title{align-items:center;display:flex;font-weight:700}input[type=checkbox].yoast-toggle__checkbox{-webkit-appearance:none;-moz-appearance:none;background-color:initial;border:0;box-shadow:none;height:23px;margin-left:8px;overflow:hidden;position:absolute;width:34px;z-index:1}input[type=checkbox].yoast-toggle__checkbox:checked:before{content:none}.yoast-toggle__switch{background-color:var(--yoast-color-inactive-grey);border-radius:8px;display:inline-block;height:14px;margin-left:8px;margin-right:8px;position:relative;width:34px}.yoast-toggle__checkbox:focus~.yoast-toggle__switch:before{box-shadow:var(--yoast-color-focus)}.yoast-toggle__switch:before{background-color:var(--yoast-color-inactive-grey-light);border:.5px solid #0000001a;border-radius:50%;box-shadow:0 1px 2px 0 #0006;box-sizing:border-box;content:"";height:20px;left:0;position:absolute;top:-3px;width:20px}.yoast-toggle,.yoast-toggle--inverse{align-items:center;display:grid;grid-template:1fr/repeat(3,auto);position:relative}.yoast-toggle--inverse>*,.yoast-toggle>*{grid-row:1}.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle--active{grid-column:1}.yoast-toggle__checkbox,.yoast-toggle__switch{grid-column:2}.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle--inactive{grid-column:3}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle__switch,.yoast-toggle--inverse .yoast-toggle__checkbox:not(:checked)~.yoast-toggle__switch{background-color:var(--yoast-color-active-light)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle__switch:before,.yoast-toggle--inverse .yoast-toggle__checkbox:not(:checked)~.yoast-toggle__switch:before{background-color:var(--yoast-color-active);left:auto;right:0}.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle__switch:before{left:0;right:auto}.yoast-toggle .yoast-toggle__checkbox~.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle__checkbox~.yoast-toggle--inactive{color:var(--yoast-color-default-darker)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle--inactive,.yoast-toggle .yoast-toggle__checkbox~.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle__checkbox~.yoast-toggle--active{color:var(--yoast-color-inactive-text)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle--active{color:var(--yoast-color-default-darker)}@media(max-width:400px){.yoast-feature{margin-right:0}.yoast-toggle__item-disabled{flex-wrap:wrap}.yoast-toggle__item-disabled .yoast-button.yoast-button--buy{margin-left:0;margin-top:8px;position:static}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/new-settings-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/new-settings-2280-rtl.css deleted file mode 100644 index 013822f3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/new-settings-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -body.seo_page_wpseo_page_settings{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}body.seo_page_wpseo_page_settings #wpcontent{padding-right:0!important}body.seo_page_wpseo_page_settings #wpfooter{padding-left:1rem}@media (min-width:768px){body.seo_page_wpseo_page_settings #wpfooter{padding-right:17rem;padding-left:2rem}}@media screen and (max-width:782px){body.seo_page_wpseo_page_settings .wp-responsive-open #wpbody{left:-190px}}body.seo_page_wpseo_page_settings #modal-search .yst-modal__close{margin-top:-.25rem}@media (min-width:783px) and (max-width:962px){body.seo_page_wpseo_page_settings.sticky-menu .yst-root .yst-notifications--bottom-left{right:calc(160px + 2rem)}}@media (min-width:783px) and (max-width:963px){body.seo_page_wpseo_page_settings.sticky-menu.auto-fold .yst-root .yst-notifications--bottom-left,body.seo_page_wpseo_page_settings.sticky-menu.folded .yst-root .yst-notifications--bottom-left{right:calc(32px + 2rem)}}@media (min-width:962px){body.seo_page_wpseo_page_settings.sticky-menu.folded .yst-root .yst-notifications--bottom-left{right:calc(32px + 2rem)}}@media (max-width:783px){body.seo_page_wpseo_page_settings:not(.sticky-menu) .wp-responsive-open .yst-root .yst-notifications--bottom-left{right:calc(190px + 2rem)}}body.seo_page_wpseo_page_settings .yst-root .yst-notifications{max-height:calc(100% - 4rem - 32px)}@media (max-width:782px){body.seo_page_wpseo_page_settings .yst-root .yst-notifications{max-height:calc(100% - 4rem - 48px)}}body.seo_page_wpseo_page_settings .yst-root .yst-notifications--bottom-left{z-index:9991}@media (min-width:783px){body.seo_page_wpseo_page_settings .yst-root .yst-notifications--bottom-left{right:calc(160px + 2rem)}}@media (min-width:601px) and (max-width:768px){body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__top{top:46px}}@media (min-width:783px){body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__top{display:none}}body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__dialog{z-index:99999}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar{position:relative}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar .emoji-select-popover{right:0;left:auto;z-index:20}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__editor,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__label{opacity:.5}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__button-insert,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__editor,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__label{cursor:not-allowed}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button{pointer-events:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;font-size:.8125rem;font-weight:500;margin-bottom:.5rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__buttons{display:inline-flex;gap:.375rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;line-height:1rem;margin-bottom:.5rem;padding:.5rem .75rem;-webkit-text-decoration-line:none;text-decoration-line:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:disabled{cursor:not-allowed;opacity:.5;pointer-events:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;line-height:1.5rem;padding:.5rem .75rem;width:100%}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor:focus-within{--tw-border-opacity:0;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden]{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);padding-bottom:.25rem;padding-top:.25rem;width:14rem;z-index:20}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden]:focus{outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));cursor:pointer;display:block;font-size:.8125rem;padding:.5rem 1rem;-webkit-text-decoration-line:none;text-decoration-line:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div:hover,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div[aria-selected]{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--description .yst-replacevar__editor{min-height:5rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__mention{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;font-weight:500;line-height:1.25;margin-right:.125rem;margin-left:.125rem;padding:.125rem .5rem}body.seo_page_wpseo_page_settings.rtl .yst-root .yst-replacevar .emoji-select-popover{right:0;left:auto} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/new-settings-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/new-settings-2280.css deleted file mode 100644 index 36009a8b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/new-settings-2280.css +++ /dev/null @@ -1 +0,0 @@ -body.seo_page_wpseo_page_settings{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}body.seo_page_wpseo_page_settings #wpcontent{padding-left:0!important}body.seo_page_wpseo_page_settings #wpfooter{padding-right:1rem}@media (min-width:768px){body.seo_page_wpseo_page_settings #wpfooter{padding-left:17rem;padding-right:2rem}}@media screen and (max-width:782px){body.seo_page_wpseo_page_settings .wp-responsive-open #wpbody{right:-190px}}body.seo_page_wpseo_page_settings #modal-search .yst-modal__close{margin-top:-.25rem}@media (min-width:783px) and (max-width:962px){body.seo_page_wpseo_page_settings.sticky-menu .yst-root .yst-notifications--bottom-left{left:calc(160px + 2rem)}}@media (min-width:783px) and (max-width:963px){body.seo_page_wpseo_page_settings.sticky-menu.auto-fold .yst-root .yst-notifications--bottom-left,body.seo_page_wpseo_page_settings.sticky-menu.folded .yst-root .yst-notifications--bottom-left{left:calc(32px + 2rem)}}@media (min-width:962px){body.seo_page_wpseo_page_settings.sticky-menu.folded .yst-root .yst-notifications--bottom-left{left:calc(32px + 2rem)}}@media (max-width:783px){body.seo_page_wpseo_page_settings:not(.sticky-menu) .wp-responsive-open .yst-root .yst-notifications--bottom-left{left:calc(190px + 2rem)}}body.seo_page_wpseo_page_settings .yst-root .yst-notifications{max-height:calc(100% - 4rem - 32px)}@media (max-width:782px){body.seo_page_wpseo_page_settings .yst-root .yst-notifications{max-height:calc(100% - 4rem - 48px)}}body.seo_page_wpseo_page_settings .yst-root .yst-notifications--bottom-left{z-index:9991}@media (min-width:783px){body.seo_page_wpseo_page_settings .yst-root .yst-notifications--bottom-left{left:calc(160px + 2rem)}}@media (min-width:601px) and (max-width:768px){body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__top{top:46px}}@media (min-width:783px){body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__top{display:none}}body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__dialog{z-index:99999}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar{position:relative}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar .emoji-select-popover{left:0;right:auto;z-index:20}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__editor,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__label{opacity:.5}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__button-insert,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__editor,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__label{cursor:not-allowed}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button{pointer-events:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;font-size:.8125rem;font-weight:500;margin-bottom:.5rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__buttons{display:inline-flex;gap:.375rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;line-height:1rem;margin-bottom:.5rem;padding:.5rem .75rem;-webkit-text-decoration-line:none;text-decoration-line:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:disabled{cursor:not-allowed;opacity:.5;pointer-events:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;line-height:1.5rem;padding:.5rem .75rem;width:100%}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor:focus-within{--tw-border-opacity:0;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden]{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);padding-bottom:.25rem;padding-top:.25rem;width:14rem;z-index:20}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden]:focus{outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));cursor:pointer;display:block;font-size:.8125rem;padding:.5rem 1rem;-webkit-text-decoration-line:none;text-decoration-line:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div:hover,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div[aria-selected]{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--description .yst-replacevar__editor{min-height:5rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__mention{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;font-weight:500;line-height:1.25;margin-left:.125rem;margin-right:.125rem;padding:.125rem .5rem}body.seo_page_wpseo_page_settings.rtl .yst-root .yst-replacevar .emoji-select-popover{left:0;right:auto} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/notifications-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/notifications-2280-rtl.css deleted file mode 100644 index 64fdf1dc..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/notifications-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.screen-reader-text{clip:rect(1px,1px,1px,1px);word-wrap:normal!important;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute!important;width:1px}.yoast-notification{background:#fff;border-right:4px solid #fff;box-shadow:0 1px 2px #0003;padding:0 12px}.yoast-container{background-color:#fdfdfd;border:1px solid #e5e5e5;box-shadow:0 1px 1px #0000000a;margin:20px 0 1px;max-width:1280px;padding:20px 20px 0;position:relative}.yoast-notifications>h2:first-child{font-size:23px;font-weight:400;line-height:29px;margin:0;padding:9px 0 4px}.yoast-notifications .yoast-container h3{background-color:#fdfdfd;border-bottom:1px solid #ccc;font-size:1.4em;margin:-20px -20px 0;padding:1em}.yoast-container .container{max-width:980px}.yoast-container .yoast-notification-holder{display:flex;position:relative}.dismiss .dashicons,.restore .dashicons{font-size:20px;height:20px;width:20px}.yoast-bottom-spacing{margin-bottom:20px}.yoast-notifications .button.dismiss,.yoast-notifications .button.restore{background:#0000;border:none;border-radius:0;box-shadow:none;cursor:pointer;height:100%;line-height:inherit;outline:none;padding:0;position:absolute;left:0;width:52px}.yoast-notifications .button.dismiss:focus,.yoast-notifications .button.dismiss:hover,.yoast-notifications .button.restore:focus,.yoast-notifications .button.restore:hover{background:#0000}.yoast-notifications .button.dismiss:focus:before,.yoast-notifications .button.restore:focus:before{border-radius:50%;box-shadow:0 0 0 1px #007cba;content:"";display:block;height:32px;right:50%;outline:2px solid #0000;position:absolute;top:50%;transform:translate(50%,-50%);width:32px}.yoast-container .separator{border-top:1px solid #ddd;margin-bottom:1em;margin-top:1em}.yoast-container .dashicons-yes{color:#77b227}.yoast-container-disabled{background-color:#e8e8e8b3;border-radius:4px;bottom:0;display:table-cell;right:0;position:absolute;left:0;top:0}.yoast-no-issues{color:#666;padding:1em 16px 1em 1em}.yoast-muted-title{font-style:italic;font-weight:600;overflow:hidden}.yoast-muted-title:after{border-top:1px solid #ddd;content:"";display:inline-block;height:.5em;margin-right:10px;margin-left:-100%;vertical-align:bottom;width:100%}.yoast-notifications-active .yoast-notification,.yoast-notifications-dismissed .yoast-notification{flex:1;padding-left:52px}.yoast-notifications-active .yoast-notification-holder{margin-bottom:20px}.yoast-notifications-dismissed.paper.tab-block{margin:20px 0}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container{padding:0}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container .yoast-notification-holder:nth-child(odd){background-color:#f7f7f7}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container .yoast-notification-holder:nth-child(odd) .yoast-notification{background-color:initial}.yoast-notifications-dismissed .yoast-svg-icon-eye{background:#0000 var(--yoast-svg-icon-eye) no-repeat 100% 0;background-size:20px}#yoast-errors-header .dashicons{color:#dc3232}#yoast-errors-active .yoast-notification{border-right-color:#dc3232}#yoast-errors-dismissed .yoast-notification{border-right-color:#d93f69}#yoast-warnings-header .dashicons{color:#5d237a}#yoast-warnings-active .yoast-notification{border-right-color:#5d237a}#yoast-warnings-dismissed .yoast-notification{border-right-color:#0075b3} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/notifications-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/notifications-2280.css deleted file mode 100644 index f95e57c4..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/notifications-2280.css +++ /dev/null @@ -1 +0,0 @@ -:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.screen-reader-text{clip:rect(1px,1px,1px,1px);word-wrap:normal!important;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute!important;width:1px}.yoast-notification{background:#fff;border-left:4px solid #fff;box-shadow:0 1px 2px #0003;padding:0 12px}.yoast-container{background-color:#fdfdfd;border:1px solid #e5e5e5;box-shadow:0 1px 1px #0000000a;margin:20px 0 1px;max-width:1280px;padding:20px 20px 0;position:relative}.yoast-notifications>h2:first-child{font-size:23px;font-weight:400;line-height:29px;margin:0;padding:9px 0 4px}.yoast-notifications .yoast-container h3{background-color:#fdfdfd;border-bottom:1px solid #ccc;font-size:1.4em;margin:-20px -20px 0;padding:1em}.yoast-container .container{max-width:980px}.yoast-container .yoast-notification-holder{display:flex;position:relative}.dismiss .dashicons,.restore .dashicons{font-size:20px;height:20px;width:20px}.yoast-bottom-spacing{margin-bottom:20px}.yoast-notifications .button.dismiss,.yoast-notifications .button.restore{background:#0000;border:none;border-radius:0;box-shadow:none;cursor:pointer;height:100%;line-height:inherit;outline:none;padding:0;position:absolute;right:0;width:52px}.yoast-notifications .button.dismiss:focus,.yoast-notifications .button.dismiss:hover,.yoast-notifications .button.restore:focus,.yoast-notifications .button.restore:hover{background:#0000}.yoast-notifications .button.dismiss:focus:before,.yoast-notifications .button.restore:focus:before{border-radius:50%;box-shadow:0 0 0 1px #007cba;content:"";display:block;height:32px;left:50%;outline:2px solid #0000;position:absolute;top:50%;transform:translate(-50%,-50%);width:32px}.yoast-container .separator{border-top:1px solid #ddd;margin-bottom:1em;margin-top:1em}.yoast-container .dashicons-yes{color:#77b227}.yoast-container-disabled{background-color:#e8e8e8b3;border-radius:4px;bottom:0;display:table-cell;left:0;position:absolute;right:0;top:0}.yoast-no-issues{color:#666;padding:1em 1em 1em 16px}.yoast-muted-title{font-style:italic;font-weight:600;overflow:hidden}.yoast-muted-title:after{border-top:1px solid #ddd;content:"";display:inline-block;height:.5em;margin-left:10px;margin-right:-100%;vertical-align:bottom;width:100%}.yoast-notifications-active .yoast-notification,.yoast-notifications-dismissed .yoast-notification{flex:1;padding-right:52px}.yoast-notifications-active .yoast-notification-holder{margin-bottom:20px}.yoast-notifications-dismissed.paper.tab-block{margin:20px 0}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container{padding:0}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container .yoast-notification-holder:nth-child(odd){background-color:#f7f7f7}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container .yoast-notification-holder:nth-child(odd) .yoast-notification{background-color:initial}.yoast-notifications-dismissed .yoast-svg-icon-eye{background:#0000 var(--yoast-svg-icon-eye) no-repeat 0 0;background-size:20px}#yoast-errors-header .dashicons{color:#dc3232}#yoast-errors-active .yoast-notification{border-left-color:#dc3232}#yoast-errors-dismissed .yoast-notification{border-left-color:#d93f69}#yoast-warnings-header .dashicons{color:#5d237a}#yoast-warnings-active .yoast-notification{border-left-color:#5d237a}#yoast-warnings-dismissed .yoast-notification{border-left-color:#0075b3} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/score_icon-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/score_icon-2280-rtl.css deleted file mode 100644 index 23fa8c61..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/score_icon-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 3px 0 10px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/score_icon-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/score_icon-2280.css deleted file mode 100644 index b6193eec..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/score_icon-2280.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 10px 0 3px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2280-rtl.css deleted file mode 100644 index a5c8cd08..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.schema-faq-section,.schema-how-to-step{border:1px solid #9197a240;list-style-type:none;margin:4px 0;padding:8px 32px 8px 4px;position:relative}.schema-faq-buttons,.schema-how-to-buttons{display:flex;justify-content:center}.schema-faq-buttons button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover,.schema-how-to-buttons button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-faq-section-mover,.schema-how-to-step-mover{display:inline-block}.schema-faq-section-mover .editor-block-mover__control,.schema-how-to-step-mover .editor-block-mover__control{display:inline-flex;height:36px;width:36px}.schema-faq-question,.schema-how-to-step-name{font-weight:600}.schema-faq .schema-faq-answer,.schema-faq .schema-faq-question,.schema-how-to .schema-how-to-description,.schema-how-to .schema-how-to-step-name,.schema-how-to .schema-how-to-step-text,.schema-how-to .schema-how-to-steps{line-height:inherit;margin:0}.schema-how-to .schema-how-to-steps{padding-top:0}.schema-faq-section-button-container,.schema-how-to-step-button-container{display:inline-flex;text-align:left}.schema-faq-section-button-container button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover,.schema-how-to-step-button-container button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-faq-section-controls-container,.schema-how-to-step-controls-container{margin-right:-28px;text-align:left}.schema-faq-section-controls-container .dashicons-arrow-up-alt2,.schema-how-to-step-controls-container .dashicons-arrow-up-alt2{position:relative;top:-1px}.faq-section-add-media .dashicon,.how-to-step-add-media .dashicon,.schema-faq-add-question .dashicon,.schema-how-to-add-step .dashicon,.schema-how-to-duration-button .dashicon{margin-left:4px}.schema-how-to{padding-top:4px}.schema-how-to-step-number{right:4px;position:absolute;text-align:left;width:24px}.schema-how-to-duration{border:0;margin:0;padding:0}.schema-how-to-duration-flex-container{align-items:center;display:flex}.schema-how-to-duration-time-input{align-items:center;display:inline-flex;flex-wrap:nowrap}legend.schema-how-to-duration-legend{margin-left:4px}#schema-how-to-duration-days{margin-left:8px}.schema-how-to-duration .schema-how-to-duration-input[type=number]{-moz-appearance:textfield;margin:0 2px;padding:6px 4px;text-align:center;width:40px}.schema-how-to-duration .schema-how-to-duration-input[type=number]::-webkit-inner-spin-button,.schema-how-to-duration .schema-how-to-duration-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.schema-how-to-duration-button.components-icon-button{margin-right:-8px;vertical-align:top}.schema-how-to-duration-button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-how-to-description{margin:8px 0}body.is-dark-theme .schema-faq-section-mover button.components-button,body.is-dark-theme .schema-how-to-step-mover button.components-button,body.is-dark-theme button.components-button.schema-faq-add-question,body.is-dark-theme button.components-button.schema-faq-section-button,body.is-dark-theme button.components-button.schema-how-to-add-step,body.is-dark-theme button.components-button.schema-how-to-duration-button,body.is-dark-theme button.components-button.schema-how-to-step-button{color:#e8eaed} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2280.css deleted file mode 100644 index 23f0f862..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2280.css +++ /dev/null @@ -1 +0,0 @@ -.schema-faq-section,.schema-how-to-step{border:1px solid #9197a240;list-style-type:none;margin:4px 0;padding:8px 4px 8px 32px;position:relative}.schema-faq-buttons,.schema-how-to-buttons{display:flex;justify-content:center}.schema-faq-buttons button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover,.schema-how-to-buttons button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-faq-section-mover,.schema-how-to-step-mover{display:inline-block}.schema-faq-section-mover .editor-block-mover__control,.schema-how-to-step-mover .editor-block-mover__control{display:inline-flex;height:36px;width:36px}.schema-faq-question,.schema-how-to-step-name{font-weight:600}.schema-faq .schema-faq-answer,.schema-faq .schema-faq-question,.schema-how-to .schema-how-to-description,.schema-how-to .schema-how-to-step-name,.schema-how-to .schema-how-to-step-text,.schema-how-to .schema-how-to-steps{line-height:inherit;margin:0}.schema-how-to .schema-how-to-steps{padding-top:0}.schema-faq-section-button-container,.schema-how-to-step-button-container{display:inline-flex;text-align:right}.schema-faq-section-button-container button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover,.schema-how-to-step-button-container button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-faq-section-controls-container,.schema-how-to-step-controls-container{margin-left:-28px;text-align:right}.schema-faq-section-controls-container .dashicons-arrow-up-alt2,.schema-how-to-step-controls-container .dashicons-arrow-up-alt2{position:relative;top:-1px}.faq-section-add-media .dashicon,.how-to-step-add-media .dashicon,.schema-faq-add-question .dashicon,.schema-how-to-add-step .dashicon,.schema-how-to-duration-button .dashicon{margin-right:4px}.schema-how-to{padding-top:4px}.schema-how-to-step-number{left:4px;position:absolute;text-align:right;width:24px}.schema-how-to-duration{border:0;margin:0;padding:0}.schema-how-to-duration-flex-container{align-items:center;display:flex}.schema-how-to-duration-time-input{align-items:center;display:inline-flex;flex-wrap:nowrap}legend.schema-how-to-duration-legend{margin-right:4px}#schema-how-to-duration-days{margin-right:8px}.schema-how-to-duration .schema-how-to-duration-input[type=number]{-moz-appearance:textfield;margin:0 2px;padding:6px 4px;text-align:center;width:40px}.schema-how-to-duration .schema-how-to-duration-input[type=number]::-webkit-inner-spin-button,.schema-how-to-duration .schema-how-to-duration-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.schema-how-to-duration-button.components-icon-button{margin-left:-8px;vertical-align:top}.schema-how-to-duration-button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-how-to-description{margin:8px 0}body.is-dark-theme .schema-faq-section-mover button.components-button,body.is-dark-theme .schema-how-to-step-mover button.components-button,body.is-dark-theme button.components-button.schema-faq-add-question,body.is-dark-theme button.components-button.schema-faq-section-button,body.is-dark-theme button.components-button.schema-how-to-add-step,body.is-dark-theme button.components-button.schema-how-to-duration-button,body.is-dark-theme button.components-button.schema-how-to-step-button{color:#e8eaed} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/support-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/support-2280-rtl.css deleted file mode 100644 index 44a1ca14..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/support-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.seo_page_wpseo_page_support{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}.seo_page_wpseo_page_support #wpcontent{padding-right:0!important}.seo_page_wpseo_page_support #wpfooter{padding-left:1rem}@media (min-width:768px){.seo_page_wpseo_page_support #wpfooter{padding-right:17rem;padding-left:2rem}}@media screen and (max-width:782px){.seo_page_wpseo_page_support .wp-responsive-open #wpbody{left:-190px}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/support-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/support-2280.css deleted file mode 100644 index fa1284bb..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/support-2280.css +++ /dev/null @@ -1 +0,0 @@ -.seo_page_wpseo_page_support{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}.seo_page_wpseo_page_support #wpcontent{padding-left:0!important}.seo_page_wpseo_page_support #wpfooter{padding-right:1rem}@media (min-width:768px){.seo_page_wpseo_page_support #wpfooter{padding-left:17rem;padding-right:2rem}}@media screen and (max-width:782px){.seo_page_wpseo_page_support .wp-responsive-open #wpbody{right:-190px}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/tailwind-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/tailwind-2280-rtl.css deleted file mode 100644 index 53e2f659..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/tailwind-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.yst-root *,.yst-root :after,.yst-root :before{border:0 solid #e5e7eb;box-sizing:border-box}.yst-root :after,.yst-root :before{--tw-content:""}.yst-root{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;margin:0;tab-size:4}.yst-root hr{border-top-width:1px;color:inherit;height:0}.yst-root abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6{font-size:inherit;font-weight:inherit}.yst-root a{color:inherit;text-decoration:inherit}.yst-root b,.yst-root strong{font-weight:bolder}.yst-root code,.yst-root kbd,.yst-root pre,.yst-root samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}.yst-root small{font-size:80%}.yst-root sub,.yst-root sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}.yst-root sub{bottom:-.25em}.yst-root sup{top:-.5em}.yst-root table{border-collapse:collapse;border-color:inherit;text-indent:0}.yst-root button,.yst-root input,.yst-root optgroup,.yst-root select,.yst-root textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}.yst-root button,.yst-root select{text-transform:none}.yst-root [type=button],.yst-root [type=reset],.yst-root [type=submit],.yst-root button{-webkit-appearance:button;background-color:initial;background-image:none}.yst-root :-moz-focusring{outline:auto}.yst-root :-moz-ui-invalid{box-shadow:none}.yst-root progress{vertical-align:initial}.yst-root ::-webkit-inner-spin-button,.yst-root ::-webkit-outer-spin-button{height:auto}.yst-root [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.yst-root ::-webkit-search-decoration{-webkit-appearance:none}.yst-root ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.yst-root summary{display:list-item}.yst-root blockquote,.yst-root dd,.yst-root dl,.yst-root figure,.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6,.yst-root hr,.yst-root p,.yst-root pre{margin:0}.yst-root fieldset{margin:0;padding:0}.yst-root legend{padding:0}.yst-root menu,.yst-root ol,.yst-root ul{list-style:none;margin:0;padding:0}.yst-root textarea{resize:vertical}.yst-root input::placeholder,.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root [role=button],.yst-root button{cursor:pointer}.yst-root :disabled{cursor:default}.yst-root audio,.yst-root canvas,.yst-root embed,.yst-root iframe,.yst-root img,.yst-root object,.yst-root svg,.yst-root video{display:block;vertical-align:middle}.yst-root img,.yst-root video{height:auto;max-width:100%}.yst-root [type=date],.yst-root [type=datetime-local],.yst-root [type=email],.yst-root [type=month],.yst-root [type=number],.yst-root [type=password],.yst-root [type=search],.yst-root [type=tel],.yst-root [type=text],.yst-root [type=time],.yst-root [type=url],.yst-root [type=week]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root [type=date]:focus,.yst-root [type=datetime-local]:focus,.yst-root [type=email]:focus,.yst-root [type=month]:focus,.yst-root [type=number]:focus,.yst-root [type=password]:focus,.yst-root [type=search]:focus,.yst-root [type=tel]:focus,.yst-root [type=text]:focus,.yst-root [type=time]:focus,.yst-root [type=url]:focus,.yst-root [type=week]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder{color:#6b7280;opacity:1}.yst-root [type=date]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=datetime-local]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=email]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=month]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=number]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=password]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=search]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=tel]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=text]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=time]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=url]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=week]::-webkit-datetime-edit-fields-wrapper{padding:0}.yst-root [type=date]::-webkit-date-and-time-value,.yst-root [type=datetime-local]::-webkit-date-and-time-value,.yst-root [type=email]::-webkit-date-and-time-value,.yst-root [type=month]::-webkit-date-and-time-value,.yst-root [type=number]::-webkit-date-and-time-value,.yst-root [type=password]::-webkit-date-and-time-value,.yst-root [type=search]::-webkit-date-and-time-value,.yst-root [type=tel]::-webkit-date-and-time-value,.yst-root [type=text]::-webkit-date-and-time-value,.yst-root [type=time]::-webkit-date-and-time-value,.yst-root [type=url]::-webkit-date-and-time-value,.yst-root [type=week]::-webkit-date-and-time-value{min-height:1.5em}.yst-root [type=date]::-webkit-datetime-edit,.yst-root [type=date]::-webkit-datetime-edit-day-field,.yst-root [type=date]::-webkit-datetime-edit-hour-field,.yst-root [type=date]::-webkit-datetime-edit-meridiem-field,.yst-root [type=date]::-webkit-datetime-edit-millisecond-field,.yst-root [type=date]::-webkit-datetime-edit-minute-field,.yst-root [type=date]::-webkit-datetime-edit-month-field,.yst-root [type=date]::-webkit-datetime-edit-second-field,.yst-root [type=date]::-webkit-datetime-edit-year-field,.yst-root [type=datetime-local]::-webkit-datetime-edit,.yst-root [type=datetime-local]::-webkit-datetime-edit-day-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-hour-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-meridiem-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-millisecond-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-minute-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-month-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-second-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-year-field,.yst-root [type=email]::-webkit-datetime-edit,.yst-root [type=email]::-webkit-datetime-edit-day-field,.yst-root [type=email]::-webkit-datetime-edit-hour-field,.yst-root [type=email]::-webkit-datetime-edit-meridiem-field,.yst-root [type=email]::-webkit-datetime-edit-millisecond-field,.yst-root [type=email]::-webkit-datetime-edit-minute-field,.yst-root [type=email]::-webkit-datetime-edit-month-field,.yst-root [type=email]::-webkit-datetime-edit-second-field,.yst-root [type=email]::-webkit-datetime-edit-year-field,.yst-root [type=month]::-webkit-datetime-edit,.yst-root [type=month]::-webkit-datetime-edit-day-field,.yst-root [type=month]::-webkit-datetime-edit-hour-field,.yst-root [type=month]::-webkit-datetime-edit-meridiem-field,.yst-root [type=month]::-webkit-datetime-edit-millisecond-field,.yst-root [type=month]::-webkit-datetime-edit-minute-field,.yst-root [type=month]::-webkit-datetime-edit-month-field,.yst-root [type=month]::-webkit-datetime-edit-second-field,.yst-root [type=month]::-webkit-datetime-edit-year-field,.yst-root [type=number]::-webkit-datetime-edit,.yst-root [type=number]::-webkit-datetime-edit-day-field,.yst-root [type=number]::-webkit-datetime-edit-hour-field,.yst-root [type=number]::-webkit-datetime-edit-meridiem-field,.yst-root [type=number]::-webkit-datetime-edit-millisecond-field,.yst-root [type=number]::-webkit-datetime-edit-minute-field,.yst-root [type=number]::-webkit-datetime-edit-month-field,.yst-root [type=number]::-webkit-datetime-edit-second-field,.yst-root [type=number]::-webkit-datetime-edit-year-field,.yst-root [type=password]::-webkit-datetime-edit,.yst-root [type=password]::-webkit-datetime-edit-day-field,.yst-root [type=password]::-webkit-datetime-edit-hour-field,.yst-root [type=password]::-webkit-datetime-edit-meridiem-field,.yst-root [type=password]::-webkit-datetime-edit-millisecond-field,.yst-root [type=password]::-webkit-datetime-edit-minute-field,.yst-root [type=password]::-webkit-datetime-edit-month-field,.yst-root [type=password]::-webkit-datetime-edit-second-field,.yst-root [type=password]::-webkit-datetime-edit-year-field,.yst-root [type=search]::-webkit-datetime-edit,.yst-root [type=search]::-webkit-datetime-edit-day-field,.yst-root [type=search]::-webkit-datetime-edit-hour-field,.yst-root [type=search]::-webkit-datetime-edit-meridiem-field,.yst-root [type=search]::-webkit-datetime-edit-millisecond-field,.yst-root [type=search]::-webkit-datetime-edit-minute-field,.yst-root [type=search]::-webkit-datetime-edit-month-field,.yst-root [type=search]::-webkit-datetime-edit-second-field,.yst-root [type=search]::-webkit-datetime-edit-year-field,.yst-root [type=tel]::-webkit-datetime-edit,.yst-root [type=tel]::-webkit-datetime-edit-day-field,.yst-root [type=tel]::-webkit-datetime-edit-hour-field,.yst-root [type=tel]::-webkit-datetime-edit-meridiem-field,.yst-root [type=tel]::-webkit-datetime-edit-millisecond-field,.yst-root [type=tel]::-webkit-datetime-edit-minute-field,.yst-root [type=tel]::-webkit-datetime-edit-month-field,.yst-root [type=tel]::-webkit-datetime-edit-second-field,.yst-root [type=tel]::-webkit-datetime-edit-year-field,.yst-root [type=text]::-webkit-datetime-edit,.yst-root [type=text]::-webkit-datetime-edit-day-field,.yst-root [type=text]::-webkit-datetime-edit-hour-field,.yst-root [type=text]::-webkit-datetime-edit-meridiem-field,.yst-root [type=text]::-webkit-datetime-edit-millisecond-field,.yst-root [type=text]::-webkit-datetime-edit-minute-field,.yst-root [type=text]::-webkit-datetime-edit-month-field,.yst-root [type=text]::-webkit-datetime-edit-second-field,.yst-root [type=text]::-webkit-datetime-edit-year-field,.yst-root [type=time]::-webkit-datetime-edit,.yst-root [type=time]::-webkit-datetime-edit-day-field,.yst-root [type=time]::-webkit-datetime-edit-hour-field,.yst-root [type=time]::-webkit-datetime-edit-meridiem-field,.yst-root [type=time]::-webkit-datetime-edit-millisecond-field,.yst-root [type=time]::-webkit-datetime-edit-minute-field,.yst-root [type=time]::-webkit-datetime-edit-month-field,.yst-root [type=time]::-webkit-datetime-edit-second-field,.yst-root [type=time]::-webkit-datetime-edit-year-field,.yst-root [type=url]::-webkit-datetime-edit,.yst-root [type=url]::-webkit-datetime-edit-day-field,.yst-root [type=url]::-webkit-datetime-edit-hour-field,.yst-root [type=url]::-webkit-datetime-edit-meridiem-field,.yst-root [type=url]::-webkit-datetime-edit-millisecond-field,.yst-root [type=url]::-webkit-datetime-edit-minute-field,.yst-root [type=url]::-webkit-datetime-edit-month-field,.yst-root [type=url]::-webkit-datetime-edit-second-field,.yst-root [type=url]::-webkit-datetime-edit-year-field,.yst-root [type=week]::-webkit-datetime-edit,.yst-root [type=week]::-webkit-datetime-edit-day-field,.yst-root [type=week]::-webkit-datetime-edit-hour-field,.yst-root [type=week]::-webkit-datetime-edit-meridiem-field,.yst-root [type=week]::-webkit-datetime-edit-millisecond-field,.yst-root [type=week]::-webkit-datetime-edit-minute-field,.yst-root [type=week]::-webkit-datetime-edit-month-field,.yst-root [type=week]::-webkit-datetime-edit-second-field,.yst-root [type=week]::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}.yst-root textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root select{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:left .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-left:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}.yst-root select[multiple]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select[multiple]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:0;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=checkbox]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:checked,.yst-root [type=checkbox]:checked:focus,.yst-root [type=checkbox]:checked:hover,.yst-root [type=checkbox]:indeterminate{background-color:currentColor;border-color:#0000}.yst-root [type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:indeterminate:focus,.yst-root [type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:#0000}.yst-root [type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:100%;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=radio]:checked,.yst-root [type=radio]:checked:focus,.yst-root [type=radio]:checked:hover{background-color:currentColor;border-color:#0000}.yst-root{--tw-text-opacity:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:rgb(71 85 105/var(--tw-text-opacity));font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.8125rem;font-weight:400;line-height:1.5}.yst-root a{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root a:visited{color:#a61e69}.yst-root a:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root a:hover:visited{color:#b94986}.yst-root a:focus{--tw-text-opacity:1;border-radius:.125rem;color:rgb(99 102 241/var(--tw-text-opacity));outline-color:#4f46e5;outline-offset:1px;outline-style:solid}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder,.yst-root textarea::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root svg path{stroke-width:inherit}.yst-root .yst-radio__input,.yst-root a:focus{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-radio__input{transition-property:none}.yst-root .yst-radio__input:checked:before{content:var(--tw-content);display:none}.yst-root .yst-modal{z-index:100000!important}.yst-root dd,.yst-root li{margin-bottom:0}.yst-root input[type=date],.yst-root input[type=datetime-local],.yst-root input[type=datetime],.yst-root input[type=email],.yst-root input[type=month],.yst-root input[type=number],.yst-root input[type=password],.yst-root input[type=search],.yst-root input[type=tel],.yst-root input[type=text],.yst-root input[type=time],.yst-root input[type=url],.yst-root input[type=week]{min-height:0}.yst-root input[type=checkbox]{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);min-height:0;min-width:0;transition-property:none}.yst-root input[type=checkbox]:before{--tw-content:none;content:var(--tw-content)}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.yst-root .yst-alert{border-radius:.375rem;display:flex;gap:.75rem;padding:1rem}.yst-root .yst-alert--info{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.yst-root .yst-alert--info .yst-alert__message{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.yst-root .yst-alert--warning{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.yst-root .yst-alert--warning .yst-alert__message{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.yst-root .yst-alert--success{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.yst-root .yst-alert--success .yst-alert__message{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.yst-root .yst-alert--error{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.yst-root .yst-alert--error .yst-alert__message{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.yst-root .yst-alert__icon{flex-grow:0;flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-autocomplete{position:relative}.yst-root .yst-autocomplete--error .yst-autocomplete__button{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.yst-root .yst-autocomplete--error .yst-autocomplete__button:focus{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity));border-color:rgb(239 68 68/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete--error .yst-autocomplete__input::placeholder{--tw-placeholder-opacity:1;color:rgb(252 165 165/var(--tw-placeholder-opacity))}.yst-root .yst-autocomplete--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-autocomplete--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete--disabled .yst-autocomplete__input{cursor:not-allowed}.yst-root .yst-autocomplete--disabled .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete--disabled .yst-autocomplete__button{cursor:not-allowed}.yst-root .yst-autocomplete--disabled .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;padding-right:.75rem;padding-left:.75rem;width:100%}.yst-root .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;left:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-autocomplete__input{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem 0 .5rem 2.5rem;width:100%}.yst-root .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:20}.yst-root .yst-autocomplete__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-autocomplete__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-autocomplete__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-autocomplete__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-badge{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(219 234 254/var(--tw-bg-opacity));border-radius:9999px;color:rgb(30 64 175/var(--tw-text-opacity));display:inline-flex;font-size:.75rem;font-weight:500;line-height:1.25;padding:.125rem .5rem;vertical-align:middle;white-space:nowrap}.yst-root .yst-badge--info{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity));color:rgb(30 58 138/var(--tw-text-opacity))}.yst-root .yst-badge--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-badge--plain{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}.yst-root .yst-badge--small{font-size:.675rem}.yst-root .yst-badge--large{font-size:1rem;padding-right:.75rem;padding-left:.75rem}.yst-root .yst-button{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-color:#0000;align-items:center;border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;justify-content:center;line-height:1.25rem;padding:.5rem .75rem;text-align:center;-webkit-text-decoration-line:none;text-decoration-line:none}.yst-root .yst-button:focus{outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root a.yst-button:focus{border-radius:.375rem}.yst-root .yst-button--primary{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-color:#0000;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:visited{color:#fff}.yst-root .yst-button--primary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(143 15 87/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:hover:visited{color:#fff}.yst-root .yst-button--primary:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--secondary{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:visited{color:#1e293b}.yst-root .yst-button--secondary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:hover:visited{color:#1e293b}.yst-root .yst-button--secondary:focus{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--tertiary{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:initial;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:visited{color:#83084e}.yst-root .yst-button--tertiary:hover{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:hover:visited{color:#83084e}.yst-root .yst-button--tertiary:focus{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--error{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity));border-color:#0000;color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:visited{color:#fff}.yst-root .yst-button--error:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:hover:visited{color:#fff}.yst-root .yst-button--error:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));outline-color:#dc2626}.yst-root .yst-button--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity));border-color:#0000;color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:visited{color:#78350f}.yst-root .yst-button--upsell:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:hover:visited{color:#78350f}.yst-root .yst-button--upsell:focus{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity));outline-color:#fbbf24}.yst-root .yst-button--large{font-size:.875rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-button--extra-large{font-size:1rem;line-height:1.5rem;padding:.625rem .875rem}.yst-root .yst-button--small{font-size:.75rem;line-height:1rem;padding:.375rem .625rem}.yst-root .yst-button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-button--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-checkbox{align-items:center;display:flex}.yst-root .yst-checkbox--disabled .yst-checkbox__input,.yst-root .yst-checkbox--disabled .yst-checkbox__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.25rem;color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-checkbox__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-checkbox__label{margin-right:.75rem}.yst-root .yst-code{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;line-height:1.25;margin:0;padding:.25rem}.yst-root .yst-code--block{display:block;margin-bottom:.5rem;margin-top:.5rem;max-width:100%;overflow-x:auto;padding:.25rem .5rem;white-space:nowrap}.yst-root .yst-file-input{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border:2px dashed rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;padding:1.25rem 1.5rem 1.5rem;text-align:center;transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:100%}.yst-root .yst-file-input.yst-is-drag-over{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(250 243 247/var(--tw-bg-opacity));border-color:rgb(205 130 171/var(--tw-border-opacity))}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__content{pointer-events:none}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__icon{--tw-translate-y:-0.5rem;--tw-text-opacity:1;color:rgb(185 73 134/var(--tw-text-opacity));transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-file-input.yst-is-disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-file-input.yst-is-disabled .yst-file-input__select-label{cursor:not-allowed}.yst-root .yst-file-input__content{align-items:center;display:inline-flex;flex-direction:column;max-width:20rem}.yst-root .yst-file-input__content>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-input__content{text-align:center}.yst-root .yst-file-input__icon{stroke-width:1;--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:3rem;margin-right:auto;margin-left:auto;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:3rem}.yst-root .yst-file-input__icon>path{stroke-width:1}.yst-root .yst-file-input__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-file-input__input:focus+.yst-file-input__select-label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-input__labels{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:inline-block;font-weight:400}.yst-root .yst-file-input__select-label{border-radius:.375rem;font-weight:500}[dir=rtl] .yst-root .yst-file-input__labels{flex-direction:row-reverse}.yst-root .yst-label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;font-weight:500}.yst-root .yst-link{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));cursor:pointer;-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root .yst-link:visited{color:#a61e69}.yst-root .yst-link:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root .yst-link:hover:visited{color:#b94986}.yst-root .yst-link:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(99 102 241/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-link--primary{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus,.yst-root .yst-link--primary:hover{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(154 22 96/var(--tw-ring-opacity))}.yst-root .yst-link--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-link--error:focus,.yst-root .yst-link--error:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-link--error:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity))}.yst-root .yst-paper{--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);display:flex;flex-direction:column}.yst-root .yst-paper__header{border-bottom-width:1px;padding:2rem}.yst-root .yst-paper__content{flex-grow:1;padding:2rem}.yst-root .yst-progress-bar{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;display:block;overflow:hidden;width:100%}.yst-root .yst-progress-bar__progress{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));border-radius:9999px;display:block;height:.375rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:linear}.yst-root .yst-radio{align-items:center;display:flex}.yst-root .yst-radio--disabled .yst-radio__check,.yst-root .yst-radio--disabled .yst-radio__input,.yst-root .yst-radio--disabled .yst-radio__label{cursor:not-allowed;opacity:.5}.yst-root .yst-radio--disabled .yst-radio__check:focus,.yst-root .yst-radio--disabled .yst-radio__input:focus,.yst-root .yst-radio--disabled .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block{display:inline-flex}.yst-root .yst-radio--inline-block .yst-radio__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:#0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__check{visibility:visible}.yst-root .yst-radio--inline-block .yst-radio__input:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-offset-width:1px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__content{position:relative}.yst-root .yst-radio--inline-block .yst-radio__label{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:flex;font-size:1rem;height:3.5rem;justify-content:center;margin-right:0;width:3.5rem}.yst-root .yst-radio--inline-block .yst-radio__label:hover{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.yst-root .yst-radio--inline-block .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio--inline-block .yst-radio__check{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity));height:1.25rem;position:absolute;left:.125rem;top:.125rem;visibility:hidden;width:1.25rem}.yst-root .yst-radio__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-radio__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-radio__label{margin-right:.75rem}.yst-root .yst-select{position:relative}.yst-root .yst-select--disabled .yst-select__button,.yst-root .yst-select--disabled .yst-select__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select__button{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;line-height:1.5rem;padding:.5rem .75rem;position:relative;text-align:right;width:100%}.yst-root .yst-select__button:focus{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;left:.625rem;top:.625rem;width:1.25rem}.yst-root .yst-select__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:10}.yst-root .yst-select__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-select__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-select__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(154 22 96/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__button-label,.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-select__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-skeleton-loader{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;display:block;height:auto;overflow:hidden;position:relative;width:-moz-fit-content;width:fit-content}.yst-root .yst-skeleton-loader:after{--tw-translate-x:-100%;animation:wave 2.5s linear .5s infinite;background:linear-gradient(-90deg,#0000,#00000012,#0000);bottom:0;content:"";right:0;position:absolute;left:0;top:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes wave{0%{transform:translateX(100%)}50%,to{transform:translateX(-100%)}}.yst-root .yst-tag-input{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;flex-wrap:wrap;font-size:.8125rem;gap:.375rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-tag-input::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root .yst-tag-input{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-tag-input,.yst-root .yst-tag-input:focus-within{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-tag-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-input--disabled:focus-within{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:rgb(203 213 225/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus,.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(148 163 184/var(--tw-text-opacity))}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__input{cursor:not-allowed}.yst-root .yst-tag-input__tag{cursor:pointer;gap:.125rem;min-height:20px;padding-inline-end:.125rem}.yst-root .yst-tag-input__tag:hover{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input__tag:focus,.yst-root .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__remove-tag{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1rem;justify-content:center;width:1rem}.yst-root .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__input{border-style:none;display:inline-flex;flex:1 1 0%;font-size:.8125rem;margin:0;padding:0}.yst-root .yst-tag-input__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-text-input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-text-input--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-text-input--read-only{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:rgb(248 250 252/var(--tw-bg-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(100 116 139/var(--tw-text-opacity));cursor:default}.yst-root .yst-textarea{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-textarea:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-textarea--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-textarea--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-title{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity));font-weight:500;line-height:1.25}.yst-root .yst-title--1{font-size:1.5rem}.yst-root .yst-title--2{font-size:1.125rem}.yst-root .yst-title--3{font-size:.875rem}.yst-root .yst-title--4{font-size:1rem}.yst-root .yst-title--5{font-size:.8125rem}.yst-root .yst-toggle{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));border-color:#0000;border-radius:9999px;border-width:2px;cursor:pointer;display:inline-flex;flex-shrink:0;height:1.5rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2.75rem}.yst-root .yst-toggle:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-toggle--checked{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-toggle--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-toggle--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-toggle__handle{--tw-translate-x:0px;--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:9999px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;height:1.25rem;justify-content:center;pointer-events:none;position:relative;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1.25rem}.yst-root .yst-toggle__icon{stroke:currentColor;stroke-width:2;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-grow:0;flex-shrink:0;height:.625rem;transition-duration:.1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:.625rem}.yst-root .yst-toggle__icon--check{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-toggle__icon--x{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}[dir=rtl] .yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:-1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity));border-radius:.5rem;color:rgb(255 255 255/var(--tw-text-opacity));display:inline-block;font-size:.75rem;max-width:24rem;padding:.5rem .625rem;position:absolute;white-space:normal;width:max-content;z-index:10}.yst-root .yst-tooltip--top{--tw-translate-x:-50%;--tw-translate-y:-100%;right:50%;margin-top:-.75rem;top:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--top:before{--tw-translate-x:-50%;--tw-translate-y:0px;--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-right-color:#0000;border-left-color:#0000;border-top-color:rgb(31 41 55/var(--tw-border-opacity));border-width:8px;content:var(--tw-content);position:absolute}.yst-root .yst-tooltip--bottom,.yst-root .yst-tooltip--top:before{right:50%;top:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--bottom{--tw-translate-x:-50%;--tw-translate-y:-0px;margin-top:.75rem}.yst-root .yst-tooltip--bottom:before{--tw-translate-x:-50%;--tw-border-opacity:1;--tw-content:"";border-bottom-color:rgb(31 41 55/var(--tw-border-opacity));border-right-color:#0000;border-left-color:#0000;border-top-color:#0000;border-width:8px;bottom:100%;content:var(--tw-content);right:50%;position:absolute;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--right{--tw-translate-x:-0px;right:100%;margin-right:.75rem}.yst-root .yst-tooltip--right,.yst-root .yst-tooltip--right:before{--tw-translate-y:-50%;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--right:before{--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-right-color:#0000;border-left-color:rgb(31 41 55/var(--tw-border-opacity));border-top-color:#0000;border-width:8px;content:var(--tw-content);position:absolute;left:100%}.yst-root .yst-tooltip--left{margin-left:.75rem;left:100%}.yst-root .yst-tooltip--left,.yst-root .yst-tooltip--left:before{--tw-translate-y:-50%;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--left:before{--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-right-color:rgb(31 41 55/var(--tw-border-opacity));border-left-color:#0000;border-top-color:#0000;border-width:8px;content:var(--tw-content);right:100%;position:absolute}.yst-root .yst-validation-icon{pointer-events:none}.yst-root .yst-validation-icon--success{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.yst-root .yst-validation-icon--info{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.yst-root .yst-validation-icon--warning{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.yst-root .yst-validation-icon--error{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-validation-input{position:relative}.yst-root .yst-validation-input--success .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(134 239 172/var(--tw-ring-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--success .yst-validation-input__input:focus,.yst-root .yst-validation-input--success .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.yst-root .yst-validation-input--info .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--info .yst-validation-input__input:focus,.yst-root .yst-validation-input--info .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.yst-root .yst-validation-input--warning .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(252 211 77/var(--tw-ring-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--warning .yst-validation-input__input:focus,.yst-root .yst-validation-input--warning .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity))}.yst-root .yst-validation-input--error .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--error .yst-validation-input__input:focus,.yst-root .yst-validation-input--error .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))}.yst-root .yst-validation-input__input:focus,.yst-root .yst-validation-input__input:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-validation-input__icon{height:1.25rem;position:absolute;left:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-validation-message a{color:inherit;font-weight:500}.yst-root .yst-validation-message a:visited:hover{color:inherit}.yst-root .yst-validation-message a:focus{--tw-ring-color:currentColor}.yst-root .yst-validation-message--success{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.yst-root .yst-validation-message--info{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.yst-root .yst-validation-message--warning{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.yst-root .yst-validation-message--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-autocomplete-field__description,.yst-root .yst-autocomplete-field__validation{margin-top:.5rem}.yst-root .yst-card{display:flex;flex-direction:column;position:relative}.yst-root .yst-card>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-card{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);overflow:hidden;padding:1.5rem;transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-card__header{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 244 246/var(--tw-bg-opacity));display:flex;height:6rem;justify-content:center;margin-right:-1.5rem;margin-left:-1.5rem;margin-top:-1.5rem;padding:1.5rem;position:relative}.yst-root .yst-card__content{flex-grow:1}.yst-root .yst-card__footer{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity));border-top-width:1px;padding-top:1.5rem}.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__description,.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox-group__label{margin-bottom:.5rem}.yst-root .yst-checkbox-group__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-checkbox-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-feature-upsell{position:relative}.yst-root .yst-feature-upsell--default{--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.yst-root .yst-feature-upsell--card{padding:1.5rem}.yst-root .yst-file-import>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-import__feedback{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);padding:1rem}.yst-root .yst-file-import__feedback-header{align-items:flex-start;display:flex}.yst-root .yst-file-import__feedback-header>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-left:calc(1rem*var(--tw-space-x-reverse))}.yst-root .yst-file-import__feedback-figure{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 229 237/var(--tw-bg-opacity));border-radius:9999px;display:flex;height:2rem;justify-content:center;width:2rem}.yst-root .yst-file-import__feedback-figure>svg{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity));height:1.25rem;width:1.25rem}.yst-root .yst-file-import__feedback-title{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:block;font-weight:500;margin-bottom:.125rem;overflow-wrap:break-word}.yst-root .yst-file-import__feedback-description{display:block;font-size:.75rem;font-weight:500}.yst-root .yst-file-import__abort-button{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(241 245 249/var(--tw-bg-opacity));border-radius:9999px;color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1.25rem;justify-content:center;width:1.25rem}.yst-root .yst-file-import__abort-button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(71 85 105/var(--tw-text-opacity))}.yst-root .yst-file-import__abort-button:focus{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-import__abort-button>svg{height:.75rem;width:.75rem}.yst-root .yst-file-import__abort-button>svg>path{stroke-width:3}.yst-root .yst-modal{bottom:0;right:0;padding:1rem;position:fixed;left:0;top:0;z-index:10}@media (min-width:640px){.yst-root .yst-modal{padding:2rem}}@media (min-width:768px){.yst-root .yst-modal{padding:5rem}}.yst-root .yst-modal__layout{display:flex;min-height:100%}.yst-root .yst-modal--center .yst-modal__layout{align-items:center;justify-content:center}.yst-root .yst-modal--top-center .yst-modal__layout{align-items:flex-start;justify-content:center}.yst-root .yst-modal__overlay{--tw-bg-opacity:0.75;background-color:rgb(100 116 139/var(--tw-bg-opacity));bottom:0;right:0;position:fixed;left:0;top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-modal__panel{--tw-bg-opacity:1;--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);max-width:36rem;overflow:hidden;padding:1.5rem;position:relative;width:100%}.yst-root .yst-modal__close{display:block;position:absolute;left:1rem;top:1rem}.yst-root .yst-modal__close-button{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(148 163 184/var(--tw-text-opacity));position:relative;z-index:10}.yst-root .yst-modal__close-button:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-modal__close-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-modal__container{display:flex;flex-direction:column;max-height:calc(100vh - 2rem)}@media (min-width:640px){.yst-root .yst-modal__container{max-height:calc(100vh - 4rem)}}@media (min-width:768px){.yst-root .yst-modal__container{max-height:calc(100vh - 10rem)}}.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 5rem)}@media (min-width:640px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 7rem)}}@media (min-width:768px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 13rem)}}.yst-root .yst-modal__container-footer,.yst-root .yst-modal__container-header{flex-shrink:0}.yst-root .yst-modal__container-content{overflow:auto}.yst-root .yst-modal__panel .yst-modal__container-content{margin-right:-1.5rem;margin-left:-1.5rem;padding-right:1.5rem;padding-left:1.5rem}.yst-root .yst-notifications{display:flex;flex-direction:column;max-height:calc(100vh - 4rem);max-width:calc(100vw - 4rem);pointer-events:none;position:fixed;width:100%;z-index:20}.yst-root .yst-notifications>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-notifications--bottom-center{align-items:center;bottom:2rem}.yst-root .yst-notifications--bottom-left{bottom:2rem;right:2rem}.yst-root .yst-notifications--top-center{align-items:center;top:2rem}.yst-root .yst-notification{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);max-width:100%;overflow-y:auto;padding:1rem;pointer-events:auto;width:20rem;z-index:20}.yst-root .yst-notification--large{width:24rem}.yst-root .yst-notification__icon{height:1.25rem;width:1.25rem}.yst-root .yst-pagination{display:inline-flex;isolation:isolate}.yst-root .yst-pagination>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*(1 - var(--tw-space-x-reverse)));margin-left:calc(-1px*var(--tw-space-x-reverse))}.yst-root .yst-pagination{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-pagination-display__text{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));font-weight:400;padding:.5rem .75rem}.yst-root .yst-pagination-display__current-text{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity));font-weight:600}.yst-root .yst-pagination-display__truncated{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));align-self:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;font-size:.8125rem;font-weight:600;padding:.5rem 1rem}.yst-root .yst-pagination__button{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;padding:.5rem;position:relative}.yst-root .yst-pagination__button:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.yst-root .yst-pagination__button:focus{outline-color:#a61e69;outline-offset:0;z-index:20}.yst-root .yst-pagination__button--active{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:rgb(166 30 105/var(--tw-bg-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(255 255 255/var(--tw-text-opacity));font-size:.8125rem;font-weight:600;z-index:10}.yst-root .yst-pagination__button--active:hover{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-pagination__button--active:focus{z-index:20}.yst-root .yst-pagination__button--active:focus-visible{border-radius:.125rem;outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root .yst-pagination__button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-pagination__button--disabled:hover{background-color:initial}.yst-root .yst-pagination__button--disabled:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio-group--inline-block .yst-radio-group__options{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}.yst-root .yst-radio-group--disabled .yst-radio-group__description,.yst-root .yst-radio-group--disabled .yst-radio-group__label{opacity:.5}.yst-root .yst-radio-group--disabled .yst-radio-group__label{cursor:not-allowed}.yst-root .yst-radio-group__label{margin-bottom:.5rem}.yst-root .yst-radio-group__options{display:flex;flex-direction:column;gap:.5rem}.yst-root .yst-radio-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-select-field--disabled .yst-select-field__description,.yst-root .yst-select-field--disabled .yst-select-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select-field__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-select-field__description,.yst-root .yst-select-field__validation{margin-top:.5rem}.yst-root .yst-mobile-navigation__top{position:sticky;top:0;width:100%;z-index:50}.yst-root .yst-mobile-navigation__dialog{bottom:0;display:flex;right:0;position:fixed;left:0;top:0;z-index:50}.yst-root .yst-tag-field--disabled .yst-tag-field__description,.yst-root .yst-tag-field--disabled .yst-tag-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-field__description,.yst-root .yst-tag-field__validation{margin-top:.5rem}.yst-root .yst-text-field--disabled .yst-text-field__description,.yst-root .yst-text-field--disabled .yst-text-field__label{opacity:.5}.yst-root .yst-text-field--disabled .yst-text-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-text-field__label{cursor:default}.yst-root .yst-text-field__description,.yst-root .yst-text-field__validation{margin-top:.5rem}.yst-root .yst-textarea-field--disabled .yst-textarea-field__description,.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{opacity:.5}.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-textarea-field__label{cursor:default}.yst-root .yst-textarea-field__description,.yst-root .yst-textarea-field__validation{margin-top:.5rem}.yst-root .yst-toggle-field{display:flex;flex-direction:column;gap:.25rem}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{opacity:.5}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{cursor:not-allowed}.yst-root .yst-toggle-field__header{align-items:center;display:flex;flex-direction:row;gap:1.5rem;justify-content:space-between}.yst-root .yst-toggle-field__label-wrapper{align-items:center;display:flex;gap:.25rem}.yst-root .yst-toggle-field__description{margin-left:4.25rem}.yst-sr-only{clip:rect(0,0,0,0)!important;border-width:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.yst-pointer-events-none{pointer-events:none!important}.yst-invisible{visibility:hidden!important}.yst-fixed{position:fixed!important}.yst-absolute{position:absolute!important}.yst-relative{position:relative!important}.yst-sticky{position:sticky!important}.yst-inset-0{bottom:0!important;top:0!important}.yst-inset-0,.yst-inset-x-0{right:0!important;left:0!important}.yst-inset-y-0{bottom:0!important;top:0!important}.yst--left-3{right:-.75rem!important}.yst-top-0{top:0!important}.yst-right-0{left:0!important}.yst-bottom-12{bottom:3rem!important}.yst-top-2{top:.5rem!important}.yst-right-2{left:.5rem!important}.yst-bottom-0{bottom:0!important}.yst-top-1\/2{top:50%!important}.yst--right-\[6\.5px\]{left:-6.5px!important}.yst--top-\[6\.5px\]{top:-6.5px!important}.yst-left-4{right:1rem!important}.yst--bottom-6{bottom:-1.5rem!important}.yst-top-8{top:2rem!important}.yst-top-3\.5{top:.875rem!important}.yst-top-3{top:.75rem!important}.yst-left-0{right:0!important}.yst-z-30{z-index:30!important}.yst-z-40{z-index:40!important}.yst-z-10{z-index:10!important}.yst-z-20{z-index:20!important}.yst-order-last{order:9999!important}.yst-col-span-1{grid-column:span 1/span 1!important}.yst-m-0{margin:0!important}.yst--m-\[16px\]{margin:-16px!important}.yst--m-6{margin:-1.5rem!important}.yst-my-auto{margin-bottom:auto!important;margin-top:auto!important}.yst-mx-auto{margin-right:auto!important;margin-left:auto!important}.yst-my-4{margin-bottom:1rem!important;margin-top:1rem!important}.yst-my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.yst-my-6{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.yst-my-12{margin-bottom:3rem!important;margin-top:3rem!important}.yst-my-3{margin-bottom:.75rem!important;margin-top:.75rem!important}.yst-my-8{margin-bottom:2rem!important;margin-top:2rem!important}.yst--mx-6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.yst-mx-1\.5{margin-right:.375rem!important;margin-left:.375rem!important}.yst-mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.yst-mx-0{margin-right:0!important;margin-left:0!important}.yst-mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.yst-my-0{margin-bottom:0!important;margin-top:0!important}.yst-my-16{margin-bottom:4rem!important;margin-top:4rem!important}.yst--ml-1{margin-right:-.25rem!important}.yst-mt-6{margin-top:1.5rem!important}.yst-mt-1\.5{margin-top:.375rem!important}.yst-mt-1{margin-top:.25rem!important}.yst-ml-4{margin-right:1rem!important}.yst-ml-8{margin-right:2rem!important}.yst--mr-14{margin-left:-3.5rem!important}.yst-mb-2{margin-bottom:.5rem!important}.yst-mr-4{margin-left:1rem!important}.yst-mr-2{margin-left:.5rem!important}.yst-mb-px{margin-bottom:1px!important}.yst-mb-16{margin-bottom:4rem!important}.yst-mt-auto{margin-top:auto!important}.yst-ml-3{margin-right:.75rem!important}.yst-mr-1{margin-left:.25rem!important}.yst-mr-5{margin-left:1.25rem!important}.yst-mb-8{margin-bottom:2rem!important}.yst-mt-3{margin-top:.75rem!important}.yst-ml-1{margin-right:.25rem!important}.yst--mr-1{margin-left:-.25rem!important}.yst--mb-\[1em\]{margin-bottom:-1em!important}.yst--ml-0\.5{margin-right:-.125rem!important}.yst--ml-0{margin-right:0!important}.yst-ml-auto{margin-right:auto!important}.yst-mt-2{margin-top:.5rem!important}.yst-mt-4{margin-top:1rem!important}.yst-mb-5{margin-bottom:1.25rem!important}.yst-mb-6{margin-bottom:1.5rem!important}.yst-mt-8{margin-top:2rem!important}.yst-mt-12{margin-top:3rem!important}.yst-mb-3{margin-bottom:.75rem!important}.yst-ml-1\.5{margin-right:.375rem!important}.yst-mr-6{margin-left:1.5rem!important}.yst--ml-px{margin-right:-1px!important}.yst-ml-12{margin-right:3rem!important}.yst-mb-0{margin-bottom:0!important}.yst--mt-6{margin-top:-1.5rem!important}.yst-mb-4{margin-bottom:1rem!important}.yst-ml-2{margin-right:.5rem!important}.yst-mr-3{margin-left:.75rem!important}.yst-mt-7{margin-top:1.75rem!important}.yst-mt-10{margin-top:2.5rem!important}.yst-mt-\[-2\.6rem\]{margin-top:-2.6rem!important}.yst-mt-\[18px\]{margin-top:18px!important}.yst-mb-1{margin-bottom:.25rem!important}.yst-mr-8{margin-left:2rem!important}.yst--mt-4{margin-top:-1rem!important}.yst-mb-24{margin-bottom:6rem!important}.yst-mt-\[27\.5px\]{margin-top:27.5px!important}.yst-mt-5{margin-top:1.25rem!important}.yst-mt-0{margin-top:0!important}.yst-block{display:block!important}.yst-inline-block{display:inline-block!important}.yst-inline{display:inline!important}.yst-flex{display:flex!important}.yst-inline-flex{display:inline-flex!important}.yst-grid{display:grid!important}.yst-hidden{display:none!important}.yst-h-5{height:1.25rem!important}.yst-h-6{height:1.5rem!important}.yst-h-4{height:1rem!important}.yst-h-12{height:3rem!important}.yst-h-0{height:0!important}.yst-h-full{height:100%!important}.yst-h-16{height:4rem!important}.yst-h-7{height:1.75rem!important}.yst-h-3{height:.75rem!important}.yst-h-8{height:2rem!important}.yst-h-\[90vh\]{height:90vh!important}.yst-h-4\/5{height:80%!important}.yst-h-20{height:5rem!important}.yst-h-\[120px\]{height:120px!important}.yst-h-auto{height:auto!important}.yst-h-9{height:2.25rem!important}.yst-h-2\.5{height:.625rem!important}.yst-h-2{height:.5rem!important}.yst-h-24{height:6rem!important}.yst-h-48{height:12rem!important}.yst-h-96{height:24rem!important}.yst-h-\[45px\]{height:45px!important}.yst-h-14{height:3.5rem!important}.yst-h-28{height:7rem!important}.yst-max-h-\[calc\(90vh-10rem\)\]{max-height:calc(90vh - 10rem)!important}.yst-max-h-60{max-height:15rem!important}.yst-min-h-full{min-height:100%!important}.yst-w-5{width:1.25rem!important}.yst-w-6{width:1.5rem!important}.yst-w-0{width:0!important}.yst-w-full{width:100%!important}.yst-w-4{width:1rem!important}.yst-w-12{width:3rem!important}.yst-w-2{width:.5rem!important}.yst-w-3{width:.75rem!important}.yst-w-8{width:2rem!important}.yst-w-\[350px\]{width:350px!important}.yst-w-20{width:5rem!important}.yst-w-\[150px\]{width:150px!important}.yst-w-\[3px\]{width:3px!important}.yst-w-40{width:10rem!important}.yst-w-56{width:14rem!important}.yst-w-2\.5{width:.625rem!important}.yst-w-0\.5{width:.125rem!important}.yst-w-48{width:12rem!important}.yst-w-96{width:24rem!important}.yst-w-3\/5{width:60%!important}.yst-w-16{width:4rem!important}.yst-w-14{width:3.5rem!important}.yst-w-\[463px\]{width:463px!important}.yst-w-24{width:6rem!important}.yst-min-w-full{min-width:100%!important}.yst-min-w-0{min-width:0!important}.yst-max-w-xs{max-width:20rem!important}.yst-max-w-sm{max-width:24rem!important}.yst-max-w-screen-sm{max-width:640px!important}.yst-max-w-6xl{max-width:72rem!important}.yst-max-w-lg{max-width:32rem!important}.yst-max-w-\[715px\]{max-width:715px!important}.yst-max-w-none{max-width:none!important}.yst-max-w-full{max-width:100%!important}.yst-max-w-5xl{max-width:64rem!important}.yst-max-w-2xl{max-width:42rem!important}.yst-max-w-\[500px\]{max-width:500px!important}.yst-flex-1{flex:1 1 0%!important}.yst-flex-none{flex:none!important}.yst-flex-shrink-0,.yst-shrink-0{flex-shrink:0!important}.yst-flex-grow,.yst-grow{flex-grow:1!important}.yst-origin-top{transform-origin:top!important}.yst-translate-y-4{--tw-translate-y:1rem!important}.yst-translate-y-0,.yst-translate-y-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-translate-y-0{--tw-translate-y:0px!important}.yst-translate-y-full{--tw-translate-y:100%!important}.yst--translate-y-full,.yst-translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst--translate-y-full{--tw-translate-y:-100%!important}.yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.yst-scale-100,.yst-scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important}.yst-scale-y-0{--tw-scale-y:0!important}.yst-scale-y-0,.yst-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@keyframes yst-spin{to{transform:rotate(-1turn)}}.yst-animate-spin{animation:yst-spin 1s linear infinite!important}.yst-cursor-wait{cursor:wait!important}.yst-cursor-not-allowed{cursor:not-allowed!important}.yst-cursor-default{cursor:default!important}.yst-select-none{-webkit-user-select:none!important;user-select:none!important}.yst-scroll-pt-11{scroll-padding-top:2.75rem!important}.yst-scroll-pb-2{scroll-padding-bottom:.5rem!important}.yst-list-outside{list-style-position:outside!important}.yst-list-disc{list-style-type:disc!important}.yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.yst-flex-row{flex-direction:row!important}.yst-flex-col{flex-direction:column!important}.yst-flex-wrap{flex-wrap:wrap!important}.yst-content-between{align-content:space-between!important}.yst-items-start{align-items:flex-start!important}.yst-items-center{align-items:center!important}.yst-justify-center{justify-content:center!important}.yst-justify-between{justify-content:space-between!important}.yst-gap-2{gap:.5rem!important}.yst-gap-3{gap:.75rem!important}.yst-gap-8{gap:2rem!important}.yst-gap-6{gap:1.5rem!important}.yst-gap-1\.5{gap:.375rem!important}.yst-gap-1{gap:.25rem!important}.yst-gap-4{gap:1rem!important}.yst-gap-x-6{column-gap:1.5rem!important}.yst-gap-y-2{row-gap:.5rem!important}.yst-gap-x-4{column-gap:1rem!important}.yst-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-right:calc(2rem*(1 - var(--tw-space-x-reverse)))!important;margin-left:calc(2rem*var(--tw-space-x-reverse))!important}.yst-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(2rem*var(--tw-space-y-reverse))!important;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.25rem*var(--tw-space-y-reverse))!important;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-right:calc(.5rem*(1 - var(--tw-space-x-reverse)))!important;margin-left:calc(.5rem*var(--tw-space-x-reverse))!important}.yst-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.75rem*var(--tw-space-y-reverse))!important;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-right:calc(.75rem*(1 - var(--tw-space-x-reverse)))!important;margin-left:calc(.75rem*var(--tw-space-x-reverse))!important}.yst-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1rem*var(--tw-space-y-reverse))!important;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))!important}.yst-divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0!important;border-bottom-width:calc(1px*var(--tw-divide-y-reverse))!important;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))!important}.yst-divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(229 231 235/var(--tw-divide-opacity))!important}.yst-divide-slate-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(203 213 225/var(--tw-divide-opacity))!important}.yst-self-start{align-self:flex-start!important}.yst-self-end{align-self:flex-end!important}.yst-self-center{align-self:center!important}.yst-overflow-auto{overflow:auto!important}.yst-overflow-hidden{overflow:hidden!important}.yst-overflow-y-auto{overflow-y:auto!important}.yst-overflow-x-scroll{overflow-x:scroll!important}.yst-truncate{overflow:hidden!important;white-space:nowrap!important}.yst-overflow-ellipsis,.yst-text-ellipsis,.yst-truncate{text-overflow:ellipsis!important}.yst-whitespace-nowrap{white-space:nowrap!important}.yst-whitespace-pre-line{white-space:pre-line!important}.yst-rounded-md{border-radius:.375rem!important}.yst-rounded-full{border-radius:9999px!important}.yst-rounded-lg{border-radius:.5rem!important}.yst-rounded-3xl{border-radius:1.5rem!important}.yst-rounded-none{border-radius:0!important}.yst-rounded-xl{border-radius:.75rem!important}.yst-rounded-l-md{border-bottom-right-radius:.375rem!important;border-top-right-radius:.375rem!important}.yst-rounded-r-md{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}.yst-rounded-t-lg{border-top-right-radius:.5rem!important;border-top-left-radius:.5rem!important}.yst-rounded-b-lg{border-bottom-right-radius:.5rem!important;border-bottom-left-radius:.5rem!important}.yst-rounded-br-none{border-bottom-left-radius:0!important}.yst-border{border-width:1px!important}.yst-border-2{border-width:2px!important}.yst-border-0{border-width:0!important}.yst-border-y{border-bottom-width:1px!important;border-top-width:1px!important}.yst-border-x-0{border-right-width:0!important;border-left-width:0!important}.yst-border-l{border-right-width:1px!important}.yst-border-b{border-bottom-width:1px!important}.yst-border-r{border-left-width:1px!important}.yst-border-t,.yst-border-t-\[1px\]{border-top-width:1px!important}.yst-border-solid{border-style:solid!important}.yst-border-dashed{border-style:dashed!important}.yst-border-none{border-style:none!important}.yst-border-slate-200{--tw-border-opacity:1!important;border-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-transparent{border-color:#0000!important}.yst-border-white{--tw-border-opacity:1!important;border-color:rgb(255 255 255/var(--tw-border-opacity))!important}.yst-border-amber-300{--tw-border-opacity:1!important;border-color:rgb(252 211 77/var(--tw-border-opacity))!important}.yst-border-slate-300{--tw-border-opacity:1!important;border-color:rgb(203 213 225/var(--tw-border-opacity))!important}.yst-border-primary-500{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.yst-border-slate-100{--tw-border-opacity:1!important;border-color:rgb(241 245 249/var(--tw-border-opacity))!important}.yst-border-primary-300{--tw-border-opacity:1!important;border-color:rgb(205 130 171/var(--tw-border-opacity))!important}.yst-border-red-300{--tw-border-opacity:1!important;border-color:rgb(252 165 165/var(--tw-border-opacity))!important}.yst-border-red-500{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity))!important}.yst-border-emerald-600{--tw-border-opacity:1!important;border-color:rgb(5 150 105/var(--tw-border-opacity))!important}.yst-border-r-slate-200{--tw-border-opacity:1!important;border-left-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-t-\[rgb\(0\,0\,0\,0\.2\)\]{border-top-color:#0003!important}.yst-bg-white{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.yst-bg-slate-600{--tw-bg-opacity:1!important;background-color:rgb(71 85 105/var(--tw-bg-opacity))!important}.yst-bg-slate-100{--tw-bg-opacity:1!important;background-color:rgb(241 245 249/var(--tw-bg-opacity))!important}.yst-bg-slate-200{--tw-bg-opacity:1!important;background-color:rgb(226 232 240/var(--tw-bg-opacity))!important}.yst-bg-slate-50{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.yst-bg-green-100{--tw-bg-opacity:1!important;background-color:rgb(220 252 231/var(--tw-bg-opacity))!important}.yst-bg-primary-500{--tw-bg-opacity:1!important;background-color:rgb(166 30 105/var(--tw-bg-opacity))!important}.yst-bg-black{--tw-bg-opacity:1!important;background-color:rgb(0 0 0/var(--tw-bg-opacity))!important}.yst-bg-transparent{background-color:initial!important}.yst-bg-slate-300{--tw-bg-opacity:1!important;background-color:rgb(203 213 225/var(--tw-bg-opacity))!important}.yst-bg-red-100{--tw-bg-opacity:1!important;background-color:rgb(254 226 226/var(--tw-bg-opacity))!important}.yst-bg-primary-600{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.yst-bg-blue-100{--tw-bg-opacity:1!important;background-color:rgb(219 234 254/var(--tw-bg-opacity))!important}.yst-bg-yellow-100{--tw-bg-opacity:1!important;background-color:rgb(254 249 195/var(--tw-bg-opacity))!important}.yst-bg-primary-200{--tw-bg-opacity:1!important;background-color:rgb(224 179 204/var(--tw-bg-opacity))!important}.yst-bg-opacity-75{--tw-bg-opacity:0.75!important}.yst-bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))!important}.yst-from-\[\#EDD2E1\]{--tw-gradient-from:#edd2e1!important;--tw-gradient-to:#edd2e100!important;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)!important}.yst-stroke-3{stroke-width:3px!important}.yst-stroke-1{stroke-width:1!important}.yst-object-contain{object-fit:contain!important}.yst-object-cover{object-fit:cover!important}.yst-object-center{object-position:center!important}.yst-p-1{padding:.25rem!important}.yst-p-6{padding:1.5rem!important}.yst-p-4{padding:1rem!important}.yst-p-8{padding:2rem!important}.yst-p-0{padding:0!important}.yst-p-2\.5{padding:.625rem!important}.yst-p-2{padding:.5rem!important}.yst-p-10{padding:2.5rem!important}.yst-p-3{padding:.75rem!important}.yst-px-4{padding-right:1rem!important;padding-left:1rem!important}.yst-px-3{padding-right:.75rem!important;padding-left:.75rem!important}.yst-py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.yst-py-6{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.yst-px-2{padding-right:.5rem!important;padding-left:.5rem!important}.yst-py-4{padding-bottom:1rem!important;padding-top:1rem!important}.yst-px-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.yst-py-3{padding-bottom:.75rem!important;padding-top:.75rem!important}.yst-px-2\.5{padding-right:.625rem!important;padding-left:.625rem!important}.yst-py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.yst-px-0\.5{padding-right:.125rem!important;padding-left:.125rem!important}.yst-px-0{padding-right:0!important;padding-left:0!important}.yst-px-\[3px\]{padding-right:3px!important;padding-left:3px!important}.yst-py-\[3px\]{padding-bottom:3px!important;padding-top:3px!important}.yst-px-8{padding-right:2rem!important;padding-left:2rem!important}.yst-py-12{padding-bottom:3rem!important;padding-top:3rem!important}.yst-py-1\.5{padding-bottom:.375rem!important;padding-top:.375rem!important}.yst-px-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.yst-pb-10{padding-bottom:2.5rem!important}.yst-pt-1{padding-top:.25rem!important}.yst-pb-1{padding-bottom:.25rem!important}.yst-pt-4{padding-top:1rem!important}.yst-pb-4{padding-bottom:1rem!important}.yst-pr-4{padding-left:1rem!important}.yst-pl-6{padding-right:1.5rem!important}.yst-pt-2{padding-top:.5rem!important}.yst-pl-\[1em\]{padding-right:1em!important}.yst-pb-6{padding-bottom:1.5rem!important}.yst-pb-8{padding-bottom:2rem!important}.yst-pt-6{padding-top:1.5rem!important}.yst-pl-2{padding-right:.5rem!important}.yst-pr-3{padding-left:.75rem!important}.yst-pb-2{padding-bottom:.5rem!important}.yst-pt-\[56\.25\%\]{padding-top:56.25%!important}.yst-pl-3{padding-right:.75rem!important}.yst-pr-2{padding-left:.5rem!important}.yst-pl-0{padding-right:0!important}.yst-pr-10{padding-left:2.5rem!important}.yst-pr-9{padding-left:2.25rem!important}.yst-text-left{text-align:right!important}.yst-text-center{text-align:center!important}.yst-align-middle{vertical-align:middle!important}.yst-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.yst-font-wp{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important}.yst-text-sm{font-size:.8125rem!important}.yst-text-4xl{font-size:2.25rem!important}.yst-text-2xl{font-size:1.5rem!important}.yst-text-base{font-size:1rem!important}.yst-text-tiny{font-size:.875rem!important}.yst-text-lg{font-size:1.125rem!important}.yst-text-xs{font-size:.75rem!important}.yst-text-xl{font-size:1.25rem!important}.yst-text-\[10px\]{font-size:10px!important}.yst-text-xxs{font-size:.675rem!important}.yst-font-medium{font-weight:500!important}.yst-font-semibold{font-weight:600!important}.yst-font-extrabold{font-weight:800!important}.yst-font-bold{font-weight:700!important}.yst-font-\[650\]{font-weight:650!important}.yst-font-light{font-weight:300!important}.yst-font-normal{font-weight:400!important}.yst-uppercase{text-transform:uppercase!important}.yst-italic{font-style:italic!important}.yst-leading-10{line-height:2.5rem!important}.yst-leading-6{line-height:1.5rem!important}.yst-leading-8{line-height:2rem!important}.yst-leading-5{line-height:1.25rem!important}.yst-leading-normal{line-height:1.5!important}.yst-leading-\[normal\]{line-height:normal!important}.yst-leading-tight{line-height:1.25!important}.yst-leading-4{line-height:1rem!important}.yst-tracking-tight{letter-spacing:-.025em!important}.yst-tracking-wide{letter-spacing:.025em!important}.yst-text-slate-800{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.yst-text-slate-400{--tw-text-opacity:1!important;color:rgb(148 163 184/var(--tw-text-opacity))!important}.yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-text-slate-900{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.yst-text-slate-600{--tw-text-opacity:1!important;color:rgb(71 85 105/var(--tw-text-opacity))!important}.yst-text-primary-500{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.yst-text-gray-900{--tw-text-opacity:1!important;color:rgb(17 24 39/var(--tw-text-opacity))!important}.yst-text-gray-500{--tw-text-opacity:1!important;color:rgb(107 114 128/var(--tw-text-opacity))!important}.yst-text-green-600{--tw-text-opacity:1!important;color:rgb(22 163 74/var(--tw-text-opacity))!important}.yst-text-gray-400{--tw-text-opacity:1!important;color:rgb(156 163 175/var(--tw-text-opacity))!important}.yst-text-indigo-600{--tw-text-opacity:1!important;color:rgb(79 70 229/var(--tw-text-opacity))!important}.yst-text-\[\#555\]{--tw-text-opacity:1!important;color:rgb(85 85 85/var(--tw-text-opacity))!important}.yst-text-amber-300{--tw-text-opacity:1!important;color:rgb(252 211 77/var(--tw-text-opacity))!important}.yst-text-slate-700{--tw-text-opacity:1!important;color:rgb(51 65 85/var(--tw-text-opacity))!important}.yst-text-red-500{--tw-text-opacity:1!important;color:rgb(239 68 68/var(--tw-text-opacity))!important}.yst-text-green-400{--tw-text-opacity:1!important;color:rgb(74 222 128/var(--tw-text-opacity))!important}.yst-text-\[\#111827\]{--tw-text-opacity:1!important;color:rgb(17 24 39/var(--tw-text-opacity))!important}.yst-text-yellow-900{--tw-text-opacity:1!important;color:rgb(113 63 18/var(--tw-text-opacity))!important}.yst-text-amber-500{--tw-text-opacity:1!important;color:rgb(245 158 11/var(--tw-text-opacity))!important}.yst-text-red-600{--tw-text-opacity:1!important;color:rgb(220 38 38/var(--tw-text-opacity))!important}.yst-text-blue-500{--tw-text-opacity:1!important;color:rgb(59 130 246/var(--tw-text-opacity))!important}.yst-text-blue-800{--tw-text-opacity:1!important;color:rgb(30 64 175/var(--tw-text-opacity))!important}.yst-text-yellow-500{--tw-text-opacity:1!important;color:rgb(234 179 8/var(--tw-text-opacity))!important}.yst-text-yellow-800{--tw-text-opacity:1!important;color:rgb(133 77 14/var(--tw-text-opacity))!important}.yst-text-red-800{--tw-text-opacity:1!important;color:rgb(153 27 27/var(--tw-text-opacity))!important}.yst-text-emerald-600{--tw-text-opacity:1!important;color:rgb(5 150 105/var(--tw-text-opacity))!important}.yst-text-green-800{--tw-text-opacity:1!important;color:rgb(22 101 52/var(--tw-text-opacity))!important}.yst-text-red-900{--tw-text-opacity:1!important;color:rgb(127 29 29/var(--tw-text-opacity))!important}.yst-underline{-webkit-text-decoration-line:underline!important;text-decoration-line:underline!important}.yst-line-through{-webkit-text-decoration-line:line-through!important;text-decoration-line:line-through!important}.yst-no-underline{-webkit-text-decoration-line:none!important;text-decoration-line:none!important}.yst-subpixel-antialiased{-webkit-font-smoothing:auto!important;-moz-osx-font-smoothing:auto!important}.yst-placeholder-slate-500::placeholder{--tw-placeholder-opacity:1!important;color:rgb(100 116 139/var(--tw-placeholder-opacity))!important}.yst-opacity-0{opacity:0!important}.yst-opacity-100{opacity:1!important}.yst-opacity-25{opacity:.25!important}.yst-opacity-75{opacity:.75!important}.yst-opacity-50{opacity:.5!important}.yst-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a!important;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)!important}.yst-shadow,.yst-shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a!important;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)!important}.yst-shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a!important;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)!important}.yst-shadow-md,.yst-shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a!important;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)!important}.yst-shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important}.yst-shadow-none,.yst-shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important}.yst-shadow-amber-700\/30{--tw-shadow-color:#b453094d!important;--tw-shadow:var(--tw-shadow-colored)!important}.yst-outline-none{outline:2px solid #0000!important;outline-offset:2px!important}.yst-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.yst-ring-gray-200{--tw-ring-opacity:1!important;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))!important}.yst-ring-black{--tw-ring-opacity:1!important;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))!important}.yst-ring-opacity-5{--tw-ring-opacity:0.05!important}.yst-ring-offset-2{--tw-ring-offset-width:2px!important}.yst-ring-offset-primary-500{--tw-ring-offset-color:#a61e69!important}.yst-drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px #00000012) drop-shadow(0 2px 2px #0000000f)!important}.yst-drop-shadow-md,.yst-grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-grayscale{--tw-grayscale:grayscale(100%)!important}.yst-filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-transition-opacity{transition-duration:.15s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-all{transition-duration:.15s!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-colors{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-transform{transition-duration:.15s!important;transition-property:transform!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-\[width\]{transition-duration:.15s!important;transition-property:width!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-delay-200{transition-delay:.2s!important}.yst-delay-\[900ms\]{transition-delay:.9s!important}.yst-delay-100{transition-delay:.1s!important}.yst-duration-1000{transition-duration:1s!important}.yst-duration-200{transition-duration:.2s!important}.yst-duration-300{transition-duration:.3s!important}.yst-duration-150{transition-duration:.15s!important}.yst-duration-100{transition-duration:.1s!important}.yst-duration-75{transition-duration:75ms!important}.yst-duration-500{transition-duration:.5s!important}.yst-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)!important}.yst-ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)!important}.yst-ease-linear{transition-timing-function:linear!important}.odd\:yst-bg-white:nth-child(odd){--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.even\:yst-bg-slate-50:nth-child(2n){--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.focus-within\:yst-border-primary-500:focus-within{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.focus-within\:yst-outline-none:focus-within{outline:2px solid #0000!important;outline-offset:2px!important}.focus-within\:yst-ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus-within\:yst-ring-primary-500:focus-within{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.hover\:yst-bg-slate-50:hover{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.hover\:yst-bg-gray-50:hover{--tw-bg-opacity:1!important;background-color:rgb(249 250 251/var(--tw-bg-opacity))!important}.hover\:yst-bg-\[\#f0f0f0\]:hover{--tw-bg-opacity:1!important;background-color:rgb(240 240 240/var(--tw-bg-opacity))!important}.hover\:yst-bg-white:hover{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.hover\:yst-bg-primary-600:hover{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.hover\:yst-text-slate-500:hover{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.hover\:yst-text-slate-900:hover{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.hover\:yst-text-slate-800:hover{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.hover\:yst-text-white:hover{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.hover\:yst-text-primary-500:hover{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.hover\:yst-underline:hover{-webkit-text-decoration-line:underline!important;text-decoration-line:underline!important}.focus\:yst-border-primary-500:focus{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.focus\:yst-border-red-500:focus{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity))!important}.focus\:yst-border-emerald-600:focus{--tw-border-opacity:1!important;border-color:rgb(5 150 105/var(--tw-border-opacity))!important}.focus\:yst-bg-primary-600:focus{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.focus\:yst-text-white:focus{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.focus\:yst-text-primary-500:focus{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.focus\:yst-shadow-\[0_0_3px_rgba\(8\2c 74\2c 103\2c 0\.8\)\]:focus{--tw-shadow:0 0 3px #084a67cc!important;--tw-shadow-colored:0 0 3px var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.focus\:yst-outline-none:focus{outline:2px solid #0000!important;outline-offset:2px!important}.focus\:yst-outline:focus{outline-style:solid!important}.focus\:yst-outline-\[1px\]:focus{outline-width:1px!important}.focus\:-yst-outline-offset-1:focus{outline-offset:-1px!important}.focus\:yst-outline-\[color\:\#0066cd\]:focus{outline-color:#0066cd!important}.focus\:yst-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-1:focus,.focus\:yst-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus\:yst-ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-inset:focus{--tw-ring-inset:inset!important}.focus\:yst-ring-primary-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-white:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))!important}.focus\:yst-ring-red-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))!important}.focus\:yst-ring-emerald-600:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(5 150 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-offset-2:focus{--tw-ring-offset-width:2px!important}.focus\:yst-ring-offset-1:focus{--tw-ring-offset-width:1px!important}.focus\:yst-ring-offset-transparent:focus{--tw-ring-offset-color:#0000!important}.focus\:yst-ring-offset-primary-500:focus{--tw-ring-offset-color:#a61e69!important}.yst-group:hover .group-hover\:yst-bg-primary-500{--tw-bg-opacity:1!important;background-color:rgb(166 30 105/var(--tw-bg-opacity))!important}.yst-group:hover .group-hover\:yst-bg-primary-200{--tw-bg-opacity:1!important;background-color:rgb(224 179 204/var(--tw-bg-opacity))!important}.yst-group:hover .group-hover\:yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-group:hover .group-hover\:yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-group:hover .group-hover\:yst-text-primary-800{--tw-text-opacity:1!important;color:rgb(131 8 78/var(--tw-text-opacity))!important}[dir=rtl] .rtl\:yst-rotate-180{--tw-rotate:180deg!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@media not all and (min-width:640px){.max-sm\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}}@media (min-width:640px){.sm\:yst-mx-0{margin-right:0!important;margin-left:0!important}.sm\:yst-mb-0{margin-bottom:0!important}.sm\:yst-ml-3{margin-right:.75rem!important}.sm\:yst-mt-0{margin-top:0!important}.sm\:yst-ml-4{margin-right:1rem!important}.sm\:yst-flex{display:flex!important}.sm\:yst-h-10{height:2.5rem!important}.sm\:yst-w-auto{width:auto!important}.sm\:yst-w-10{width:2.5rem!important}.sm\:yst-translate-y-0{--tw-translate-y:0px!important}.sm\:yst-scale-95,.sm\:yst-translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.sm\:yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.sm\:yst-flex-row-reverse{flex-direction:row-reverse!important}.sm\:yst-items-start{align-items:flex-start!important}.sm\:yst-text-left{text-align:right!important}.sm\:yst-text-sm{font-size:.8125rem!important}}@media (min-width:768px){.md\:yst-absolute{position:absolute!important}.md\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.md\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.md\:yst-flex-row{flex-direction:row!important}}@media (min-width:783px){.min-\[783px\]\:yst-block{display:block!important}.min-\[783px\]\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.min-\[783px\]\:yst-p-8{padding:2rem!important}}@media (min-width:1024px){.lg\:yst-col-span-2{grid-column:span 2/span 2!important}.lg\:yst-mt-0{margin-top:0!important}.lg\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.lg\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.lg\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.lg\:yst-gap-12{gap:3rem!important}}@media (min-width:1280px){.xl\:yst-fixed{position:fixed!important}.xl\:yst-right-8{left:2rem!important}.xl\:yst-col-span-2{grid-column:span 2/span 2!important}.xl\:yst-mb-0{margin-bottom:0!important}.xl\:yst-mt-0{margin-top:0!important}.xl\:yst-w-\[16rem\]{width:16rem!important}.xl\:yst-max-w-3xl{max-width:48rem!important}.xl\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.xl\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.xl\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.xl\:yst-gap-12{gap:3rem!important}.xl\:yst-pr-\[17\.5rem\]{padding-left:17.5rem!important}}@media (min-width:1536px){.\32xl\:yst-col-span-2{grid-column:span 2/span 2!important}.\32xl\:yst-mt-0{margin-top:0!important}.\32xl\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.\32xl\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.\32xl\:yst-gap-12{gap:3rem!important}}@media (min-width:1800px){.min-\[1800px\]\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/tailwind-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/tailwind-2280.css deleted file mode 100644 index 48f7425c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/tailwind-2280.css +++ /dev/null @@ -1 +0,0 @@ -.yst-root *,.yst-root :after,.yst-root :before{border:0 solid #e5e7eb;box-sizing:border-box}.yst-root :after,.yst-root :before{--tw-content:""}.yst-root{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;margin:0;tab-size:4}.yst-root hr{border-top-width:1px;color:inherit;height:0}.yst-root abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6{font-size:inherit;font-weight:inherit}.yst-root a{color:inherit;text-decoration:inherit}.yst-root b,.yst-root strong{font-weight:bolder}.yst-root code,.yst-root kbd,.yst-root pre,.yst-root samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}.yst-root small{font-size:80%}.yst-root sub,.yst-root sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}.yst-root sub{bottom:-.25em}.yst-root sup{top:-.5em}.yst-root table{border-collapse:collapse;border-color:inherit;text-indent:0}.yst-root button,.yst-root input,.yst-root optgroup,.yst-root select,.yst-root textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}.yst-root button,.yst-root select{text-transform:none}.yst-root [type=button],.yst-root [type=reset],.yst-root [type=submit],.yst-root button{-webkit-appearance:button;background-color:initial;background-image:none}.yst-root :-moz-focusring{outline:auto}.yst-root :-moz-ui-invalid{box-shadow:none}.yst-root progress{vertical-align:initial}.yst-root ::-webkit-inner-spin-button,.yst-root ::-webkit-outer-spin-button{height:auto}.yst-root [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.yst-root ::-webkit-search-decoration{-webkit-appearance:none}.yst-root ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.yst-root summary{display:list-item}.yst-root blockquote,.yst-root dd,.yst-root dl,.yst-root figure,.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6,.yst-root hr,.yst-root p,.yst-root pre{margin:0}.yst-root fieldset{margin:0;padding:0}.yst-root legend{padding:0}.yst-root menu,.yst-root ol,.yst-root ul{list-style:none;margin:0;padding:0}.yst-root textarea{resize:vertical}.yst-root input::placeholder,.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root [role=button],.yst-root button{cursor:pointer}.yst-root :disabled{cursor:default}.yst-root audio,.yst-root canvas,.yst-root embed,.yst-root iframe,.yst-root img,.yst-root object,.yst-root svg,.yst-root video{display:block;vertical-align:middle}.yst-root img,.yst-root video{height:auto;max-width:100%}.yst-root [type=date],.yst-root [type=datetime-local],.yst-root [type=email],.yst-root [type=month],.yst-root [type=number],.yst-root [type=password],.yst-root [type=search],.yst-root [type=tel],.yst-root [type=text],.yst-root [type=time],.yst-root [type=url],.yst-root [type=week]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root [type=date]:focus,.yst-root [type=datetime-local]:focus,.yst-root [type=email]:focus,.yst-root [type=month]:focus,.yst-root [type=number]:focus,.yst-root [type=password]:focus,.yst-root [type=search]:focus,.yst-root [type=tel]:focus,.yst-root [type=text]:focus,.yst-root [type=time]:focus,.yst-root [type=url]:focus,.yst-root [type=week]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder{color:#6b7280;opacity:1}.yst-root [type=date]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=datetime-local]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=email]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=month]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=number]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=password]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=search]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=tel]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=text]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=time]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=url]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=week]::-webkit-datetime-edit-fields-wrapper{padding:0}.yst-root [type=date]::-webkit-date-and-time-value,.yst-root [type=datetime-local]::-webkit-date-and-time-value,.yst-root [type=email]::-webkit-date-and-time-value,.yst-root [type=month]::-webkit-date-and-time-value,.yst-root [type=number]::-webkit-date-and-time-value,.yst-root [type=password]::-webkit-date-and-time-value,.yst-root [type=search]::-webkit-date-and-time-value,.yst-root [type=tel]::-webkit-date-and-time-value,.yst-root [type=text]::-webkit-date-and-time-value,.yst-root [type=time]::-webkit-date-and-time-value,.yst-root [type=url]::-webkit-date-and-time-value,.yst-root [type=week]::-webkit-date-and-time-value{min-height:1.5em}.yst-root [type=date]::-webkit-datetime-edit,.yst-root [type=date]::-webkit-datetime-edit-day-field,.yst-root [type=date]::-webkit-datetime-edit-hour-field,.yst-root [type=date]::-webkit-datetime-edit-meridiem-field,.yst-root [type=date]::-webkit-datetime-edit-millisecond-field,.yst-root [type=date]::-webkit-datetime-edit-minute-field,.yst-root [type=date]::-webkit-datetime-edit-month-field,.yst-root [type=date]::-webkit-datetime-edit-second-field,.yst-root [type=date]::-webkit-datetime-edit-year-field,.yst-root [type=datetime-local]::-webkit-datetime-edit,.yst-root [type=datetime-local]::-webkit-datetime-edit-day-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-hour-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-meridiem-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-millisecond-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-minute-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-month-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-second-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-year-field,.yst-root [type=email]::-webkit-datetime-edit,.yst-root [type=email]::-webkit-datetime-edit-day-field,.yst-root [type=email]::-webkit-datetime-edit-hour-field,.yst-root [type=email]::-webkit-datetime-edit-meridiem-field,.yst-root [type=email]::-webkit-datetime-edit-millisecond-field,.yst-root [type=email]::-webkit-datetime-edit-minute-field,.yst-root [type=email]::-webkit-datetime-edit-month-field,.yst-root [type=email]::-webkit-datetime-edit-second-field,.yst-root [type=email]::-webkit-datetime-edit-year-field,.yst-root [type=month]::-webkit-datetime-edit,.yst-root [type=month]::-webkit-datetime-edit-day-field,.yst-root [type=month]::-webkit-datetime-edit-hour-field,.yst-root [type=month]::-webkit-datetime-edit-meridiem-field,.yst-root [type=month]::-webkit-datetime-edit-millisecond-field,.yst-root [type=month]::-webkit-datetime-edit-minute-field,.yst-root [type=month]::-webkit-datetime-edit-month-field,.yst-root [type=month]::-webkit-datetime-edit-second-field,.yst-root [type=month]::-webkit-datetime-edit-year-field,.yst-root [type=number]::-webkit-datetime-edit,.yst-root [type=number]::-webkit-datetime-edit-day-field,.yst-root [type=number]::-webkit-datetime-edit-hour-field,.yst-root [type=number]::-webkit-datetime-edit-meridiem-field,.yst-root [type=number]::-webkit-datetime-edit-millisecond-field,.yst-root [type=number]::-webkit-datetime-edit-minute-field,.yst-root [type=number]::-webkit-datetime-edit-month-field,.yst-root [type=number]::-webkit-datetime-edit-second-field,.yst-root [type=number]::-webkit-datetime-edit-year-field,.yst-root [type=password]::-webkit-datetime-edit,.yst-root [type=password]::-webkit-datetime-edit-day-field,.yst-root [type=password]::-webkit-datetime-edit-hour-field,.yst-root [type=password]::-webkit-datetime-edit-meridiem-field,.yst-root [type=password]::-webkit-datetime-edit-millisecond-field,.yst-root [type=password]::-webkit-datetime-edit-minute-field,.yst-root [type=password]::-webkit-datetime-edit-month-field,.yst-root [type=password]::-webkit-datetime-edit-second-field,.yst-root [type=password]::-webkit-datetime-edit-year-field,.yst-root [type=search]::-webkit-datetime-edit,.yst-root [type=search]::-webkit-datetime-edit-day-field,.yst-root [type=search]::-webkit-datetime-edit-hour-field,.yst-root [type=search]::-webkit-datetime-edit-meridiem-field,.yst-root [type=search]::-webkit-datetime-edit-millisecond-field,.yst-root [type=search]::-webkit-datetime-edit-minute-field,.yst-root [type=search]::-webkit-datetime-edit-month-field,.yst-root [type=search]::-webkit-datetime-edit-second-field,.yst-root [type=search]::-webkit-datetime-edit-year-field,.yst-root [type=tel]::-webkit-datetime-edit,.yst-root [type=tel]::-webkit-datetime-edit-day-field,.yst-root [type=tel]::-webkit-datetime-edit-hour-field,.yst-root [type=tel]::-webkit-datetime-edit-meridiem-field,.yst-root [type=tel]::-webkit-datetime-edit-millisecond-field,.yst-root [type=tel]::-webkit-datetime-edit-minute-field,.yst-root [type=tel]::-webkit-datetime-edit-month-field,.yst-root [type=tel]::-webkit-datetime-edit-second-field,.yst-root [type=tel]::-webkit-datetime-edit-year-field,.yst-root [type=text]::-webkit-datetime-edit,.yst-root [type=text]::-webkit-datetime-edit-day-field,.yst-root [type=text]::-webkit-datetime-edit-hour-field,.yst-root [type=text]::-webkit-datetime-edit-meridiem-field,.yst-root [type=text]::-webkit-datetime-edit-millisecond-field,.yst-root [type=text]::-webkit-datetime-edit-minute-field,.yst-root [type=text]::-webkit-datetime-edit-month-field,.yst-root [type=text]::-webkit-datetime-edit-second-field,.yst-root [type=text]::-webkit-datetime-edit-year-field,.yst-root [type=time]::-webkit-datetime-edit,.yst-root [type=time]::-webkit-datetime-edit-day-field,.yst-root [type=time]::-webkit-datetime-edit-hour-field,.yst-root [type=time]::-webkit-datetime-edit-meridiem-field,.yst-root [type=time]::-webkit-datetime-edit-millisecond-field,.yst-root [type=time]::-webkit-datetime-edit-minute-field,.yst-root [type=time]::-webkit-datetime-edit-month-field,.yst-root [type=time]::-webkit-datetime-edit-second-field,.yst-root [type=time]::-webkit-datetime-edit-year-field,.yst-root [type=url]::-webkit-datetime-edit,.yst-root [type=url]::-webkit-datetime-edit-day-field,.yst-root [type=url]::-webkit-datetime-edit-hour-field,.yst-root [type=url]::-webkit-datetime-edit-meridiem-field,.yst-root [type=url]::-webkit-datetime-edit-millisecond-field,.yst-root [type=url]::-webkit-datetime-edit-minute-field,.yst-root [type=url]::-webkit-datetime-edit-month-field,.yst-root [type=url]::-webkit-datetime-edit-second-field,.yst-root [type=url]::-webkit-datetime-edit-year-field,.yst-root [type=week]::-webkit-datetime-edit,.yst-root [type=week]::-webkit-datetime-edit-day-field,.yst-root [type=week]::-webkit-datetime-edit-hour-field,.yst-root [type=week]::-webkit-datetime-edit-meridiem-field,.yst-root [type=week]::-webkit-datetime-edit-millisecond-field,.yst-root [type=week]::-webkit-datetime-edit-minute-field,.yst-root [type=week]::-webkit-datetime-edit-month-field,.yst-root [type=week]::-webkit-datetime-edit-second-field,.yst-root [type=week]::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}.yst-root textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root select{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}.yst-root select[multiple]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select[multiple]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:0;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=checkbox]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:checked,.yst-root [type=checkbox]:checked:focus,.yst-root [type=checkbox]:checked:hover,.yst-root [type=checkbox]:indeterminate{background-color:currentColor;border-color:#0000}.yst-root [type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:indeterminate:focus,.yst-root [type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:#0000}.yst-root [type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:100%;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=radio]:checked,.yst-root [type=radio]:checked:focus,.yst-root [type=radio]:checked:hover{background-color:currentColor;border-color:#0000}.yst-root{--tw-text-opacity:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:rgb(71 85 105/var(--tw-text-opacity));font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.8125rem;font-weight:400;line-height:1.5}.yst-root a{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root a:visited{color:#a61e69}.yst-root a:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root a:hover:visited{color:#b94986}.yst-root a:focus{--tw-text-opacity:1;border-radius:.125rem;color:rgb(99 102 241/var(--tw-text-opacity));outline-color:#4f46e5;outline-offset:1px;outline-style:solid}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder,.yst-root textarea::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root svg path{stroke-width:inherit}.yst-root .yst-radio__input,.yst-root a:focus{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-radio__input{transition-property:none}.yst-root .yst-radio__input:checked:before{content:var(--tw-content);display:none}.yst-root .yst-modal{z-index:100000!important}.yst-root dd,.yst-root li{margin-bottom:0}.yst-root input[type=date],.yst-root input[type=datetime-local],.yst-root input[type=datetime],.yst-root input[type=email],.yst-root input[type=month],.yst-root input[type=number],.yst-root input[type=password],.yst-root input[type=search],.yst-root input[type=tel],.yst-root input[type=text],.yst-root input[type=time],.yst-root input[type=url],.yst-root input[type=week]{min-height:0}.yst-root input[type=checkbox]{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);min-height:0;min-width:0;transition-property:none}.yst-root input[type=checkbox]:before{--tw-content:none;content:var(--tw-content)}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.yst-root .yst-alert{border-radius:.375rem;display:flex;gap:.75rem;padding:1rem}.yst-root .yst-alert--info{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.yst-root .yst-alert--info .yst-alert__message{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.yst-root .yst-alert--warning{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.yst-root .yst-alert--warning .yst-alert__message{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.yst-root .yst-alert--success{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.yst-root .yst-alert--success .yst-alert__message{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.yst-root .yst-alert--error{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.yst-root .yst-alert--error .yst-alert__message{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.yst-root .yst-alert__icon{flex-grow:0;flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-autocomplete{position:relative}.yst-root .yst-autocomplete--error .yst-autocomplete__button{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.yst-root .yst-autocomplete--error .yst-autocomplete__button:focus{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity));border-color:rgb(239 68 68/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete--error .yst-autocomplete__input::placeholder{--tw-placeholder-opacity:1;color:rgb(252 165 165/var(--tw-placeholder-opacity))}.yst-root .yst-autocomplete--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-autocomplete--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete--disabled .yst-autocomplete__input{cursor:not-allowed}.yst-root .yst-autocomplete--disabled .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete--disabled .yst-autocomplete__button{cursor:not-allowed}.yst-root .yst-autocomplete--disabled .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;padding-left:.75rem;padding-right:.75rem;width:100%}.yst-root .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;right:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-autocomplete__input{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem 2.5rem .5rem 0;width:100%}.yst-root .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:20}.yst-root .yst-autocomplete__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-autocomplete__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-autocomplete__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-autocomplete__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-badge{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(219 234 254/var(--tw-bg-opacity));border-radius:9999px;color:rgb(30 64 175/var(--tw-text-opacity));display:inline-flex;font-size:.75rem;font-weight:500;line-height:1.25;padding:.125rem .5rem;vertical-align:middle;white-space:nowrap}.yst-root .yst-badge--info{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity));color:rgb(30 58 138/var(--tw-text-opacity))}.yst-root .yst-badge--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-badge--plain{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}.yst-root .yst-badge--small{font-size:.675rem}.yst-root .yst-badge--large{font-size:1rem;padding-left:.75rem;padding-right:.75rem}.yst-root .yst-button{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-color:#0000;align-items:center;border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;justify-content:center;line-height:1.25rem;padding:.5rem .75rem;text-align:center;-webkit-text-decoration-line:none;text-decoration-line:none}.yst-root .yst-button:focus{outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root a.yst-button:focus{border-radius:.375rem}.yst-root .yst-button--primary{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-color:#0000;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:visited{color:#fff}.yst-root .yst-button--primary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(143 15 87/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:hover:visited{color:#fff}.yst-root .yst-button--primary:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--secondary{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:visited{color:#1e293b}.yst-root .yst-button--secondary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:hover:visited{color:#1e293b}.yst-root .yst-button--secondary:focus{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--tertiary{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:initial;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:visited{color:#83084e}.yst-root .yst-button--tertiary:hover{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:hover:visited{color:#83084e}.yst-root .yst-button--tertiary:focus{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--error{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity));border-color:#0000;color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:visited{color:#fff}.yst-root .yst-button--error:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:hover:visited{color:#fff}.yst-root .yst-button--error:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));outline-color:#dc2626}.yst-root .yst-button--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity));border-color:#0000;color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:visited{color:#78350f}.yst-root .yst-button--upsell:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:hover:visited{color:#78350f}.yst-root .yst-button--upsell:focus{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity));outline-color:#fbbf24}.yst-root .yst-button--large{font-size:.875rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-button--extra-large{font-size:1rem;line-height:1.5rem;padding:.625rem .875rem}.yst-root .yst-button--small{font-size:.75rem;line-height:1rem;padding:.375rem .625rem}.yst-root .yst-button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-button--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-checkbox{align-items:center;display:flex}.yst-root .yst-checkbox--disabled .yst-checkbox__input,.yst-root .yst-checkbox--disabled .yst-checkbox__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.25rem;color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-checkbox__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-checkbox__label{margin-left:.75rem}.yst-root .yst-code{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;line-height:1.25;margin:0;padding:.25rem}.yst-root .yst-code--block{display:block;margin-bottom:.5rem;margin-top:.5rem;max-width:100%;overflow-x:auto;padding:.25rem .5rem;white-space:nowrap}.yst-root .yst-file-input{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border:2px dashed rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;padding:1.25rem 1.5rem 1.5rem;text-align:center;transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:100%}.yst-root .yst-file-input.yst-is-drag-over{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(250 243 247/var(--tw-bg-opacity));border-color:rgb(205 130 171/var(--tw-border-opacity))}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__content{pointer-events:none}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__icon{--tw-translate-y:-0.5rem;--tw-text-opacity:1;color:rgb(185 73 134/var(--tw-text-opacity));transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-file-input.yst-is-disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-file-input.yst-is-disabled .yst-file-input__select-label{cursor:not-allowed}.yst-root .yst-file-input__content{align-items:center;display:inline-flex;flex-direction:column;max-width:20rem}.yst-root .yst-file-input__content>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-input__content{text-align:center}.yst-root .yst-file-input__icon{stroke-width:1;--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:3rem;margin-left:auto;margin-right:auto;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:3rem}.yst-root .yst-file-input__icon>path{stroke-width:1}.yst-root .yst-file-input__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-file-input__input:focus+.yst-file-input__select-label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-input__labels{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:inline-block;font-weight:400}.yst-root .yst-file-input__select-label{border-radius:.375rem;font-weight:500}[dir=rtl] .yst-root .yst-file-input__labels{flex-direction:row-reverse}.yst-root .yst-label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;font-weight:500}.yst-root .yst-link{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));cursor:pointer;-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root .yst-link:visited{color:#a61e69}.yst-root .yst-link:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root .yst-link:hover:visited{color:#b94986}.yst-root .yst-link:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(99 102 241/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-link--primary{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus,.yst-root .yst-link--primary:hover{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(154 22 96/var(--tw-ring-opacity))}.yst-root .yst-link--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-link--error:focus,.yst-root .yst-link--error:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-link--error:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity))}.yst-root .yst-paper{--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);display:flex;flex-direction:column}.yst-root .yst-paper__header{border-bottom-width:1px;padding:2rem}.yst-root .yst-paper__content{flex-grow:1;padding:2rem}.yst-root .yst-progress-bar{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;display:block;overflow:hidden;width:100%}.yst-root .yst-progress-bar__progress{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));border-radius:9999px;display:block;height:.375rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:linear}.yst-root .yst-radio{align-items:center;display:flex}.yst-root .yst-radio--disabled .yst-radio__check,.yst-root .yst-radio--disabled .yst-radio__input,.yst-root .yst-radio--disabled .yst-radio__label{cursor:not-allowed;opacity:.5}.yst-root .yst-radio--disabled .yst-radio__check:focus,.yst-root .yst-radio--disabled .yst-radio__input:focus,.yst-root .yst-radio--disabled .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block{display:inline-flex}.yst-root .yst-radio--inline-block .yst-radio__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:#0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__check{visibility:visible}.yst-root .yst-radio--inline-block .yst-radio__input:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-offset-width:1px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__content{position:relative}.yst-root .yst-radio--inline-block .yst-radio__label{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:flex;font-size:1rem;height:3.5rem;justify-content:center;margin-left:0;width:3.5rem}.yst-root .yst-radio--inline-block .yst-radio__label:hover{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.yst-root .yst-radio--inline-block .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio--inline-block .yst-radio__check{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity));height:1.25rem;position:absolute;right:.125rem;top:.125rem;visibility:hidden;width:1.25rem}.yst-root .yst-radio__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-radio__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-radio__label{margin-left:.75rem}.yst-root .yst-select{position:relative}.yst-root .yst-select--disabled .yst-select__button,.yst-root .yst-select--disabled .yst-select__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select__button{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;line-height:1.5rem;padding:.5rem .75rem;position:relative;text-align:left;width:100%}.yst-root .yst-select__button:focus{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;right:.625rem;top:.625rem;width:1.25rem}.yst-root .yst-select__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:10}.yst-root .yst-select__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-select__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-select__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(154 22 96/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__button-label,.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-select__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-skeleton-loader{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;display:block;height:auto;overflow:hidden;position:relative;width:-moz-fit-content;width:fit-content}.yst-root .yst-skeleton-loader:after{--tw-translate-x:-100%;animation:wave 2.5s linear .5s infinite;background:linear-gradient(90deg,#0000,#00000012,#0000);bottom:0;content:"";left:0;position:absolute;right:0;top:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes wave{0%{transform:translateX(-100%)}50%,to{transform:translateX(100%)}}.yst-root .yst-tag-input{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;flex-wrap:wrap;font-size:.8125rem;gap:.375rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-tag-input::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root .yst-tag-input{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-tag-input,.yst-root .yst-tag-input:focus-within{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-tag-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-input--disabled:focus-within{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:rgb(203 213 225/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus,.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(148 163 184/var(--tw-text-opacity))}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__input{cursor:not-allowed}.yst-root .yst-tag-input__tag{cursor:pointer;gap:.125rem;min-height:20px;padding-inline-end:.125rem}.yst-root .yst-tag-input__tag:hover{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input__tag:focus,.yst-root .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__remove-tag{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1rem;justify-content:center;width:1rem}.yst-root .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__input{border-style:none;display:inline-flex;flex:1 1 0%;font-size:.8125rem;margin:0;padding:0}.yst-root .yst-tag-input__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-text-input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-text-input--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-text-input--read-only{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:rgb(248 250 252/var(--tw-bg-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(100 116 139/var(--tw-text-opacity));cursor:default}.yst-root .yst-textarea{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-textarea:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-textarea--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-textarea--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-title{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity));font-weight:500;line-height:1.25}.yst-root .yst-title--1{font-size:1.5rem}.yst-root .yst-title--2{font-size:1.125rem}.yst-root .yst-title--3{font-size:.875rem}.yst-root .yst-title--4{font-size:1rem}.yst-root .yst-title--5{font-size:.8125rem}.yst-root .yst-toggle{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));border-color:#0000;border-radius:9999px;border-width:2px;cursor:pointer;display:inline-flex;flex-shrink:0;height:1.5rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2.75rem}.yst-root .yst-toggle:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-toggle--checked{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-toggle--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-toggle--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-toggle__handle{--tw-translate-x:0px;--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:9999px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;height:1.25rem;justify-content:center;pointer-events:none;position:relative;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1.25rem}.yst-root .yst-toggle__icon{stroke:currentColor;stroke-width:2;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-grow:0;flex-shrink:0;height:.625rem;transition-duration:.1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:.625rem}.yst-root .yst-toggle__icon--check{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-toggle__icon--x{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}[dir=rtl] .yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:-1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity));border-radius:.5rem;color:rgb(255 255 255/var(--tw-text-opacity));display:inline-block;font-size:.75rem;max-width:24rem;padding:.5rem .625rem;position:absolute;white-space:normal;width:max-content;z-index:10}.yst-root .yst-tooltip--top{--tw-translate-x:-50%;--tw-translate-y:-100%;left:50%;margin-top:-.75rem;top:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--top:before{--tw-translate-x:-50%;--tw-translate-y:0px;--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-left-color:#0000;border-right-color:#0000;border-top-color:rgb(31 41 55/var(--tw-border-opacity));border-width:8px;content:var(--tw-content);position:absolute}.yst-root .yst-tooltip--bottom,.yst-root .yst-tooltip--top:before{left:50%;top:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--bottom{--tw-translate-x:-50%;--tw-translate-y:-0px;margin-top:.75rem}.yst-root .yst-tooltip--bottom:before{--tw-translate-x:-50%;--tw-border-opacity:1;--tw-content:"";border-bottom-color:rgb(31 41 55/var(--tw-border-opacity));border-left-color:#0000;border-right-color:#0000;border-top-color:#0000;border-width:8px;bottom:100%;content:var(--tw-content);left:50%;position:absolute;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--right{--tw-translate-x:-0px;left:100%;margin-left:.75rem}.yst-root .yst-tooltip--right,.yst-root .yst-tooltip--right:before{--tw-translate-y:-50%;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--right:before{--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-left-color:#0000;border-right-color:rgb(31 41 55/var(--tw-border-opacity));border-top-color:#0000;border-width:8px;content:var(--tw-content);position:absolute;right:100%}.yst-root .yst-tooltip--left{margin-right:.75rem;right:100%}.yst-root .yst-tooltip--left,.yst-root .yst-tooltip--left:before{--tw-translate-y:-50%;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--left:before{--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-left-color:rgb(31 41 55/var(--tw-border-opacity));border-right-color:#0000;border-top-color:#0000;border-width:8px;content:var(--tw-content);left:100%;position:absolute}.yst-root .yst-validation-icon{pointer-events:none}.yst-root .yst-validation-icon--success{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.yst-root .yst-validation-icon--info{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.yst-root .yst-validation-icon--warning{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.yst-root .yst-validation-icon--error{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-validation-input{position:relative}.yst-root .yst-validation-input--success .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(134 239 172/var(--tw-ring-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--success .yst-validation-input__input:focus,.yst-root .yst-validation-input--success .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.yst-root .yst-validation-input--info .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--info .yst-validation-input__input:focus,.yst-root .yst-validation-input--info .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.yst-root .yst-validation-input--warning .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(252 211 77/var(--tw-ring-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--warning .yst-validation-input__input:focus,.yst-root .yst-validation-input--warning .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity))}.yst-root .yst-validation-input--error .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--error .yst-validation-input__input:focus,.yst-root .yst-validation-input--error .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))}.yst-root .yst-validation-input__input:focus,.yst-root .yst-validation-input__input:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-validation-input__icon{height:1.25rem;position:absolute;right:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-validation-message a{color:inherit;font-weight:500}.yst-root .yst-validation-message a:visited:hover{color:inherit}.yst-root .yst-validation-message a:focus{--tw-ring-color:currentColor}.yst-root .yst-validation-message--success{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.yst-root .yst-validation-message--info{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.yst-root .yst-validation-message--warning{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.yst-root .yst-validation-message--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-autocomplete-field__description,.yst-root .yst-autocomplete-field__validation{margin-top:.5rem}.yst-root .yst-card{display:flex;flex-direction:column;position:relative}.yst-root .yst-card>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-card{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);overflow:hidden;padding:1.5rem;transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-card__header{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 244 246/var(--tw-bg-opacity));display:flex;height:6rem;justify-content:center;margin-left:-1.5rem;margin-right:-1.5rem;margin-top:-1.5rem;padding:1.5rem;position:relative}.yst-root .yst-card__content{flex-grow:1}.yst-root .yst-card__footer{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity));border-top-width:1px;padding-top:1.5rem}.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__description,.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox-group__label{margin-bottom:.5rem}.yst-root .yst-checkbox-group__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-checkbox-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-feature-upsell{position:relative}.yst-root .yst-feature-upsell--default{--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.yst-root .yst-feature-upsell--card{padding:1.5rem}.yst-root .yst-file-import>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-import__feedback{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);padding:1rem}.yst-root .yst-file-import__feedback-header{align-items:flex-start;display:flex}.yst-root .yst-file-import__feedback-header>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.yst-root .yst-file-import__feedback-figure{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 229 237/var(--tw-bg-opacity));border-radius:9999px;display:flex;height:2rem;justify-content:center;width:2rem}.yst-root .yst-file-import__feedback-figure>svg{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity));height:1.25rem;width:1.25rem}.yst-root .yst-file-import__feedback-title{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:block;font-weight:500;margin-bottom:.125rem;overflow-wrap:break-word}.yst-root .yst-file-import__feedback-description{display:block;font-size:.75rem;font-weight:500}.yst-root .yst-file-import__abort-button{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(241 245 249/var(--tw-bg-opacity));border-radius:9999px;color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1.25rem;justify-content:center;width:1.25rem}.yst-root .yst-file-import__abort-button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(71 85 105/var(--tw-text-opacity))}.yst-root .yst-file-import__abort-button:focus{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-import__abort-button>svg{height:.75rem;width:.75rem}.yst-root .yst-file-import__abort-button>svg>path{stroke-width:3}.yst-root .yst-modal{bottom:0;left:0;padding:1rem;position:fixed;right:0;top:0;z-index:10}@media (min-width:640px){.yst-root .yst-modal{padding:2rem}}@media (min-width:768px){.yst-root .yst-modal{padding:5rem}}.yst-root .yst-modal__layout{display:flex;min-height:100%}.yst-root .yst-modal--center .yst-modal__layout{align-items:center;justify-content:center}.yst-root .yst-modal--top-center .yst-modal__layout{align-items:flex-start;justify-content:center}.yst-root .yst-modal__overlay{--tw-bg-opacity:0.75;background-color:rgb(100 116 139/var(--tw-bg-opacity));bottom:0;left:0;position:fixed;right:0;top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-modal__panel{--tw-bg-opacity:1;--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);max-width:36rem;overflow:hidden;padding:1.5rem;position:relative;width:100%}.yst-root .yst-modal__close{display:block;position:absolute;right:1rem;top:1rem}.yst-root .yst-modal__close-button{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(148 163 184/var(--tw-text-opacity));position:relative;z-index:10}.yst-root .yst-modal__close-button:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-modal__close-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-modal__container{display:flex;flex-direction:column;max-height:calc(100vh - 2rem)}@media (min-width:640px){.yst-root .yst-modal__container{max-height:calc(100vh - 4rem)}}@media (min-width:768px){.yst-root .yst-modal__container{max-height:calc(100vh - 10rem)}}.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 5rem)}@media (min-width:640px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 7rem)}}@media (min-width:768px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 13rem)}}.yst-root .yst-modal__container-footer,.yst-root .yst-modal__container-header{flex-shrink:0}.yst-root .yst-modal__container-content{overflow:auto}.yst-root .yst-modal__panel .yst-modal__container-content{margin-left:-1.5rem;margin-right:-1.5rem;padding-left:1.5rem;padding-right:1.5rem}.yst-root .yst-notifications{display:flex;flex-direction:column;max-height:calc(100vh - 4rem);max-width:calc(100vw - 4rem);pointer-events:none;position:fixed;width:100%;z-index:20}.yst-root .yst-notifications>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-notifications--bottom-center{align-items:center;bottom:2rem}.yst-root .yst-notifications--bottom-left{bottom:2rem;left:2rem}.yst-root .yst-notifications--top-center{align-items:center;top:2rem}.yst-root .yst-notification{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);max-width:100%;overflow-y:auto;padding:1rem;pointer-events:auto;width:20rem;z-index:20}.yst-root .yst-notification--large{width:24rem}.yst-root .yst-notification__icon{height:1.25rem;width:1.25rem}.yst-root .yst-pagination{display:inline-flex;isolation:isolate}.yst-root .yst-pagination>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1px*var(--tw-space-x-reverse))}.yst-root .yst-pagination{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-pagination-display__text{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));font-weight:400;padding:.5rem .75rem}.yst-root .yst-pagination-display__current-text{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity));font-weight:600}.yst-root .yst-pagination-display__truncated{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));align-self:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;font-size:.8125rem;font-weight:600;padding:.5rem 1rem}.yst-root .yst-pagination__button{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;padding:.5rem;position:relative}.yst-root .yst-pagination__button:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.yst-root .yst-pagination__button:focus{outline-color:#a61e69;outline-offset:0;z-index:20}.yst-root .yst-pagination__button--active{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:rgb(166 30 105/var(--tw-bg-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(255 255 255/var(--tw-text-opacity));font-size:.8125rem;font-weight:600;z-index:10}.yst-root .yst-pagination__button--active:hover{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-pagination__button--active:focus{z-index:20}.yst-root .yst-pagination__button--active:focus-visible{border-radius:.125rem;outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root .yst-pagination__button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-pagination__button--disabled:hover{background-color:initial}.yst-root .yst-pagination__button--disabled:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio-group--inline-block .yst-radio-group__options{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}.yst-root .yst-radio-group--disabled .yst-radio-group__description,.yst-root .yst-radio-group--disabled .yst-radio-group__label{opacity:.5}.yst-root .yst-radio-group--disabled .yst-radio-group__label{cursor:not-allowed}.yst-root .yst-radio-group__label{margin-bottom:.5rem}.yst-root .yst-radio-group__options{display:flex;flex-direction:column;gap:.5rem}.yst-root .yst-radio-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-select-field--disabled .yst-select-field__description,.yst-root .yst-select-field--disabled .yst-select-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select-field__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-select-field__description,.yst-root .yst-select-field__validation{margin-top:.5rem}.yst-root .yst-mobile-navigation__top{position:sticky;top:0;width:100%;z-index:50}.yst-root .yst-mobile-navigation__dialog{bottom:0;display:flex;left:0;position:fixed;right:0;top:0;z-index:50}.yst-root .yst-tag-field--disabled .yst-tag-field__description,.yst-root .yst-tag-field--disabled .yst-tag-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-field__description,.yst-root .yst-tag-field__validation{margin-top:.5rem}.yst-root .yst-text-field--disabled .yst-text-field__description,.yst-root .yst-text-field--disabled .yst-text-field__label{opacity:.5}.yst-root .yst-text-field--disabled .yst-text-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-text-field__label{cursor:default}.yst-root .yst-text-field__description,.yst-root .yst-text-field__validation{margin-top:.5rem}.yst-root .yst-textarea-field--disabled .yst-textarea-field__description,.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{opacity:.5}.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-textarea-field__label{cursor:default}.yst-root .yst-textarea-field__description,.yst-root .yst-textarea-field__validation{margin-top:.5rem}.yst-root .yst-toggle-field{display:flex;flex-direction:column;gap:.25rem}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{opacity:.5}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{cursor:not-allowed}.yst-root .yst-toggle-field__header{align-items:center;display:flex;flex-direction:row;gap:1.5rem;justify-content:space-between}.yst-root .yst-toggle-field__label-wrapper{align-items:center;display:flex;gap:.25rem}.yst-root .yst-toggle-field__description{margin-right:4.25rem}.yst-sr-only{clip:rect(0,0,0,0)!important;border-width:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.yst-pointer-events-none{pointer-events:none!important}.yst-invisible{visibility:hidden!important}.yst-fixed{position:fixed!important}.yst-absolute{position:absolute!important}.yst-relative{position:relative!important}.yst-sticky{position:sticky!important}.yst-inset-0{bottom:0!important;top:0!important}.yst-inset-0,.yst-inset-x-0{left:0!important;right:0!important}.yst-inset-y-0{bottom:0!important;top:0!important}.yst--left-3{left:-.75rem!important}.yst-top-0{top:0!important}.yst-right-0{right:0!important}.yst-bottom-12{bottom:3rem!important}.yst-top-2{top:.5rem!important}.yst-right-2{right:.5rem!important}.yst-bottom-0{bottom:0!important}.yst-top-1\/2{top:50%!important}.yst--right-\[6\.5px\]{right:-6.5px!important}.yst--top-\[6\.5px\]{top:-6.5px!important}.yst-left-4{left:1rem!important}.yst--bottom-6{bottom:-1.5rem!important}.yst-top-8{top:2rem!important}.yst-top-3\.5{top:.875rem!important}.yst-top-3{top:.75rem!important}.yst-left-0{left:0!important}.yst-z-30{z-index:30!important}.yst-z-40{z-index:40!important}.yst-z-10{z-index:10!important}.yst-z-20{z-index:20!important}.yst-order-last{order:9999!important}.yst-col-span-1{grid-column:span 1/span 1!important}.yst-m-0{margin:0!important}.yst--m-\[16px\]{margin:-16px!important}.yst--m-6{margin:-1.5rem!important}.yst-my-auto{margin-bottom:auto!important;margin-top:auto!important}.yst-mx-auto{margin-left:auto!important;margin-right:auto!important}.yst-my-4{margin-bottom:1rem!important;margin-top:1rem!important}.yst-my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.yst-my-6{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.yst-my-12{margin-bottom:3rem!important;margin-top:3rem!important}.yst-my-3{margin-bottom:.75rem!important;margin-top:.75rem!important}.yst-my-8{margin-bottom:2rem!important;margin-top:2rem!important}.yst--mx-6{margin-left:-1.5rem!important;margin-right:-1.5rem!important}.yst-mx-1\.5{margin-left:.375rem!important;margin-right:.375rem!important}.yst-mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.yst-mx-0{margin-left:0!important;margin-right:0!important}.yst-mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.yst-my-0{margin-bottom:0!important;margin-top:0!important}.yst-my-16{margin-bottom:4rem!important;margin-top:4rem!important}.yst--ml-1{margin-left:-.25rem!important}.yst-mt-6{margin-top:1.5rem!important}.yst-mt-1\.5{margin-top:.375rem!important}.yst-mt-1{margin-top:.25rem!important}.yst-ml-4{margin-left:1rem!important}.yst-ml-8{margin-left:2rem!important}.yst--mr-14{margin-right:-3.5rem!important}.yst-mb-2{margin-bottom:.5rem!important}.yst-mr-4{margin-right:1rem!important}.yst-mr-2{margin-right:.5rem!important}.yst-mb-px{margin-bottom:1px!important}.yst-mb-16{margin-bottom:4rem!important}.yst-mt-auto{margin-top:auto!important}.yst-ml-3{margin-left:.75rem!important}.yst-mr-1{margin-right:.25rem!important}.yst-mr-5{margin-right:1.25rem!important}.yst-mb-8{margin-bottom:2rem!important}.yst-mt-3{margin-top:.75rem!important}.yst-ml-1{margin-left:.25rem!important}.yst--mr-1{margin-right:-.25rem!important}.yst--mb-\[1em\]{margin-bottom:-1em!important}.yst--ml-0\.5{margin-left:-.125rem!important}.yst--ml-0{margin-left:0!important}.yst-ml-auto{margin-left:auto!important}.yst-mt-2{margin-top:.5rem!important}.yst-mt-4{margin-top:1rem!important}.yst-mb-5{margin-bottom:1.25rem!important}.yst-mb-6{margin-bottom:1.5rem!important}.yst-mt-8{margin-top:2rem!important}.yst-mt-12{margin-top:3rem!important}.yst-mb-3{margin-bottom:.75rem!important}.yst-ml-1\.5{margin-left:.375rem!important}.yst-mr-6{margin-right:1.5rem!important}.yst--ml-px{margin-left:-1px!important}.yst-ml-12{margin-left:3rem!important}.yst-mb-0{margin-bottom:0!important}.yst--mt-6{margin-top:-1.5rem!important}.yst-mb-4{margin-bottom:1rem!important}.yst-ml-2{margin-left:.5rem!important}.yst-mr-3{margin-right:.75rem!important}.yst-mt-7{margin-top:1.75rem!important}.yst-mt-10{margin-top:2.5rem!important}.yst-mt-\[-2\.6rem\]{margin-top:-2.6rem!important}.yst-mt-\[18px\]{margin-top:18px!important}.yst-mb-1{margin-bottom:.25rem!important}.yst-mr-8{margin-right:2rem!important}.yst--mt-4{margin-top:-1rem!important}.yst-mb-24{margin-bottom:6rem!important}.yst-mt-\[27\.5px\]{margin-top:27.5px!important}.yst-mt-5{margin-top:1.25rem!important}.yst-mt-0{margin-top:0!important}.yst-block{display:block!important}.yst-inline-block{display:inline-block!important}.yst-inline{display:inline!important}.yst-flex{display:flex!important}.yst-inline-flex{display:inline-flex!important}.yst-grid{display:grid!important}.yst-hidden{display:none!important}.yst-h-5{height:1.25rem!important}.yst-h-6{height:1.5rem!important}.yst-h-4{height:1rem!important}.yst-h-12{height:3rem!important}.yst-h-0{height:0!important}.yst-h-full{height:100%!important}.yst-h-16{height:4rem!important}.yst-h-7{height:1.75rem!important}.yst-h-3{height:.75rem!important}.yst-h-8{height:2rem!important}.yst-h-\[90vh\]{height:90vh!important}.yst-h-4\/5{height:80%!important}.yst-h-20{height:5rem!important}.yst-h-\[120px\]{height:120px!important}.yst-h-auto{height:auto!important}.yst-h-9{height:2.25rem!important}.yst-h-2\.5{height:.625rem!important}.yst-h-2{height:.5rem!important}.yst-h-24{height:6rem!important}.yst-h-48{height:12rem!important}.yst-h-96{height:24rem!important}.yst-h-\[45px\]{height:45px!important}.yst-h-14{height:3.5rem!important}.yst-h-28{height:7rem!important}.yst-max-h-\[calc\(90vh-10rem\)\]{max-height:calc(90vh - 10rem)!important}.yst-max-h-60{max-height:15rem!important}.yst-min-h-full{min-height:100%!important}.yst-w-5{width:1.25rem!important}.yst-w-6{width:1.5rem!important}.yst-w-0{width:0!important}.yst-w-full{width:100%!important}.yst-w-4{width:1rem!important}.yst-w-12{width:3rem!important}.yst-w-2{width:.5rem!important}.yst-w-3{width:.75rem!important}.yst-w-8{width:2rem!important}.yst-w-\[350px\]{width:350px!important}.yst-w-20{width:5rem!important}.yst-w-\[150px\]{width:150px!important}.yst-w-\[3px\]{width:3px!important}.yst-w-40{width:10rem!important}.yst-w-56{width:14rem!important}.yst-w-2\.5{width:.625rem!important}.yst-w-0\.5{width:.125rem!important}.yst-w-48{width:12rem!important}.yst-w-96{width:24rem!important}.yst-w-3\/5{width:60%!important}.yst-w-16{width:4rem!important}.yst-w-14{width:3.5rem!important}.yst-w-\[463px\]{width:463px!important}.yst-w-24{width:6rem!important}.yst-min-w-full{min-width:100%!important}.yst-min-w-0{min-width:0!important}.yst-max-w-xs{max-width:20rem!important}.yst-max-w-sm{max-width:24rem!important}.yst-max-w-screen-sm{max-width:640px!important}.yst-max-w-6xl{max-width:72rem!important}.yst-max-w-lg{max-width:32rem!important}.yst-max-w-\[715px\]{max-width:715px!important}.yst-max-w-none{max-width:none!important}.yst-max-w-full{max-width:100%!important}.yst-max-w-5xl{max-width:64rem!important}.yst-max-w-2xl{max-width:42rem!important}.yst-max-w-\[500px\]{max-width:500px!important}.yst-flex-1{flex:1 1 0%!important}.yst-flex-none{flex:none!important}.yst-flex-shrink-0,.yst-shrink-0{flex-shrink:0!important}.yst-flex-grow,.yst-grow{flex-grow:1!important}.yst-origin-top{transform-origin:top!important}.yst-translate-y-4{--tw-translate-y:1rem!important}.yst-translate-y-0,.yst-translate-y-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-translate-y-0{--tw-translate-y:0px!important}.yst-translate-y-full{--tw-translate-y:100%!important}.yst--translate-y-full,.yst-translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst--translate-y-full{--tw-translate-y:-100%!important}.yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.yst-scale-100,.yst-scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important}.yst-scale-y-0{--tw-scale-y:0!important}.yst-scale-y-0,.yst-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@keyframes yst-spin{to{transform:rotate(1turn)}}.yst-animate-spin{animation:yst-spin 1s linear infinite!important}.yst-cursor-wait{cursor:wait!important}.yst-cursor-not-allowed{cursor:not-allowed!important}.yst-cursor-default{cursor:default!important}.yst-select-none{-webkit-user-select:none!important;user-select:none!important}.yst-scroll-pt-11{scroll-padding-top:2.75rem!important}.yst-scroll-pb-2{scroll-padding-bottom:.5rem!important}.yst-list-outside{list-style-position:outside!important}.yst-list-disc{list-style-type:disc!important}.yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.yst-flex-row{flex-direction:row!important}.yst-flex-col{flex-direction:column!important}.yst-flex-wrap{flex-wrap:wrap!important}.yst-content-between{align-content:space-between!important}.yst-items-start{align-items:flex-start!important}.yst-items-center{align-items:center!important}.yst-justify-center{justify-content:center!important}.yst-justify-between{justify-content:space-between!important}.yst-gap-2{gap:.5rem!important}.yst-gap-3{gap:.75rem!important}.yst-gap-8{gap:2rem!important}.yst-gap-6{gap:1.5rem!important}.yst-gap-1\.5{gap:.375rem!important}.yst-gap-1{gap:.25rem!important}.yst-gap-4{gap:1rem!important}.yst-gap-x-6{column-gap:1.5rem!important}.yst-gap-y-2{row-gap:.5rem!important}.yst-gap-x-4{column-gap:1rem!important}.yst-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(2rem*var(--tw-space-x-reverse))!important}.yst-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(2rem*var(--tw-space-y-reverse))!important;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.25rem*var(--tw-space-y-reverse))!important;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.5rem*var(--tw-space-x-reverse))!important}.yst-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.75rem*var(--tw-space-y-reverse))!important;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.75rem*var(--tw-space-x-reverse))!important}.yst-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1rem*var(--tw-space-y-reverse))!important;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))!important}.yst-divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0!important;border-bottom-width:calc(1px*var(--tw-divide-y-reverse))!important;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))!important}.yst-divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(229 231 235/var(--tw-divide-opacity))!important}.yst-divide-slate-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(203 213 225/var(--tw-divide-opacity))!important}.yst-self-start{align-self:flex-start!important}.yst-self-end{align-self:flex-end!important}.yst-self-center{align-self:center!important}.yst-overflow-auto{overflow:auto!important}.yst-overflow-hidden{overflow:hidden!important}.yst-overflow-y-auto{overflow-y:auto!important}.yst-overflow-x-scroll{overflow-x:scroll!important}.yst-truncate{overflow:hidden!important;white-space:nowrap!important}.yst-overflow-ellipsis,.yst-text-ellipsis,.yst-truncate{text-overflow:ellipsis!important}.yst-whitespace-nowrap{white-space:nowrap!important}.yst-whitespace-pre-line{white-space:pre-line!important}.yst-rounded-md{border-radius:.375rem!important}.yst-rounded-full{border-radius:9999px!important}.yst-rounded-lg{border-radius:.5rem!important}.yst-rounded-3xl{border-radius:1.5rem!important}.yst-rounded-none{border-radius:0!important}.yst-rounded-xl{border-radius:.75rem!important}.yst-rounded-l-md{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}.yst-rounded-r-md{border-bottom-right-radius:.375rem!important;border-top-right-radius:.375rem!important}.yst-rounded-t-lg{border-top-left-radius:.5rem!important;border-top-right-radius:.5rem!important}.yst-rounded-b-lg{border-bottom-left-radius:.5rem!important;border-bottom-right-radius:.5rem!important}.yst-rounded-br-none{border-bottom-right-radius:0!important}.yst-border{border-width:1px!important}.yst-border-2{border-width:2px!important}.yst-border-0{border-width:0!important}.yst-border-y{border-bottom-width:1px!important;border-top-width:1px!important}.yst-border-x-0{border-left-width:0!important;border-right-width:0!important}.yst-border-l{border-left-width:1px!important}.yst-border-b{border-bottom-width:1px!important}.yst-border-r{border-right-width:1px!important}.yst-border-t,.yst-border-t-\[1px\]{border-top-width:1px!important}.yst-border-solid{border-style:solid!important}.yst-border-dashed{border-style:dashed!important}.yst-border-none{border-style:none!important}.yst-border-slate-200{--tw-border-opacity:1!important;border-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-transparent{border-color:#0000!important}.yst-border-white{--tw-border-opacity:1!important;border-color:rgb(255 255 255/var(--tw-border-opacity))!important}.yst-border-amber-300{--tw-border-opacity:1!important;border-color:rgb(252 211 77/var(--tw-border-opacity))!important}.yst-border-slate-300{--tw-border-opacity:1!important;border-color:rgb(203 213 225/var(--tw-border-opacity))!important}.yst-border-primary-500{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.yst-border-slate-100{--tw-border-opacity:1!important;border-color:rgb(241 245 249/var(--tw-border-opacity))!important}.yst-border-primary-300{--tw-border-opacity:1!important;border-color:rgb(205 130 171/var(--tw-border-opacity))!important}.yst-border-red-300{--tw-border-opacity:1!important;border-color:rgb(252 165 165/var(--tw-border-opacity))!important}.yst-border-red-500{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity))!important}.yst-border-emerald-600{--tw-border-opacity:1!important;border-color:rgb(5 150 105/var(--tw-border-opacity))!important}.yst-border-r-slate-200{--tw-border-opacity:1!important;border-right-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-t-\[rgb\(0\,0\,0\,0\.2\)\]{border-top-color:#0003!important}.yst-bg-white{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.yst-bg-slate-600{--tw-bg-opacity:1!important;background-color:rgb(71 85 105/var(--tw-bg-opacity))!important}.yst-bg-slate-100{--tw-bg-opacity:1!important;background-color:rgb(241 245 249/var(--tw-bg-opacity))!important}.yst-bg-slate-200{--tw-bg-opacity:1!important;background-color:rgb(226 232 240/var(--tw-bg-opacity))!important}.yst-bg-slate-50{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.yst-bg-green-100{--tw-bg-opacity:1!important;background-color:rgb(220 252 231/var(--tw-bg-opacity))!important}.yst-bg-primary-500{--tw-bg-opacity:1!important;background-color:rgb(166 30 105/var(--tw-bg-opacity))!important}.yst-bg-black{--tw-bg-opacity:1!important;background-color:rgb(0 0 0/var(--tw-bg-opacity))!important}.yst-bg-transparent{background-color:initial!important}.yst-bg-slate-300{--tw-bg-opacity:1!important;background-color:rgb(203 213 225/var(--tw-bg-opacity))!important}.yst-bg-red-100{--tw-bg-opacity:1!important;background-color:rgb(254 226 226/var(--tw-bg-opacity))!important}.yst-bg-primary-600{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.yst-bg-blue-100{--tw-bg-opacity:1!important;background-color:rgb(219 234 254/var(--tw-bg-opacity))!important}.yst-bg-yellow-100{--tw-bg-opacity:1!important;background-color:rgb(254 249 195/var(--tw-bg-opacity))!important}.yst-bg-primary-200{--tw-bg-opacity:1!important;background-color:rgb(224 179 204/var(--tw-bg-opacity))!important}.yst-bg-opacity-75{--tw-bg-opacity:0.75!important}.yst-bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))!important}.yst-from-\[\#EDD2E1\]{--tw-gradient-from:#edd2e1!important;--tw-gradient-to:#edd2e100!important;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)!important}.yst-stroke-3{stroke-width:3px!important}.yst-stroke-1{stroke-width:1!important}.yst-object-contain{object-fit:contain!important}.yst-object-cover{object-fit:cover!important}.yst-object-center{object-position:center!important}.yst-p-1{padding:.25rem!important}.yst-p-6{padding:1.5rem!important}.yst-p-4{padding:1rem!important}.yst-p-8{padding:2rem!important}.yst-p-0{padding:0!important}.yst-p-2\.5{padding:.625rem!important}.yst-p-2{padding:.5rem!important}.yst-p-10{padding:2.5rem!important}.yst-p-3{padding:.75rem!important}.yst-px-4{padding-left:1rem!important;padding-right:1rem!important}.yst-px-3{padding-left:.75rem!important;padding-right:.75rem!important}.yst-py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.yst-py-6{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.yst-px-2{padding-left:.5rem!important;padding-right:.5rem!important}.yst-py-4{padding-bottom:1rem!important;padding-top:1rem!important}.yst-px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.yst-py-3{padding-bottom:.75rem!important;padding-top:.75rem!important}.yst-px-2\.5{padding-left:.625rem!important;padding-right:.625rem!important}.yst-py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.yst-px-0\.5{padding-left:.125rem!important;padding-right:.125rem!important}.yst-px-0{padding-left:0!important;padding-right:0!important}.yst-px-\[3px\]{padding-left:3px!important;padding-right:3px!important}.yst-py-\[3px\]{padding-bottom:3px!important;padding-top:3px!important}.yst-px-8{padding-left:2rem!important;padding-right:2rem!important}.yst-py-12{padding-bottom:3rem!important;padding-top:3rem!important}.yst-py-1\.5{padding-bottom:.375rem!important;padding-top:.375rem!important}.yst-px-11{padding-left:2.75rem!important;padding-right:2.75rem!important}.yst-pb-10{padding-bottom:2.5rem!important}.yst-pt-1{padding-top:.25rem!important}.yst-pb-1{padding-bottom:.25rem!important}.yst-pt-4{padding-top:1rem!important}.yst-pb-4{padding-bottom:1rem!important}.yst-pr-4{padding-right:1rem!important}.yst-pl-6{padding-left:1.5rem!important}.yst-pt-2{padding-top:.5rem!important}.yst-pl-\[1em\]{padding-left:1em!important}.yst-pb-6{padding-bottom:1.5rem!important}.yst-pb-8{padding-bottom:2rem!important}.yst-pt-6{padding-top:1.5rem!important}.yst-pl-2{padding-left:.5rem!important}.yst-pr-3{padding-right:.75rem!important}.yst-pb-2{padding-bottom:.5rem!important}.yst-pt-\[56\.25\%\]{padding-top:56.25%!important}.yst-pl-3{padding-left:.75rem!important}.yst-pr-2{padding-right:.5rem!important}.yst-pl-0{padding-left:0!important}.yst-pr-10{padding-right:2.5rem!important}.yst-pr-9{padding-right:2.25rem!important}.yst-text-left{text-align:left!important}.yst-text-center{text-align:center!important}.yst-align-middle{vertical-align:middle!important}.yst-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.yst-font-wp{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important}.yst-text-sm{font-size:.8125rem!important}.yst-text-4xl{font-size:2.25rem!important}.yst-text-2xl{font-size:1.5rem!important}.yst-text-base{font-size:1rem!important}.yst-text-tiny{font-size:.875rem!important}.yst-text-lg{font-size:1.125rem!important}.yst-text-xs{font-size:.75rem!important}.yst-text-xl{font-size:1.25rem!important}.yst-text-\[10px\]{font-size:10px!important}.yst-text-xxs{font-size:.675rem!important}.yst-font-medium{font-weight:500!important}.yst-font-semibold{font-weight:600!important}.yst-font-extrabold{font-weight:800!important}.yst-font-bold{font-weight:700!important}.yst-font-\[650\]{font-weight:650!important}.yst-font-light{font-weight:300!important}.yst-font-normal{font-weight:400!important}.yst-uppercase{text-transform:uppercase!important}.yst-italic{font-style:italic!important}.yst-leading-10{line-height:2.5rem!important}.yst-leading-6{line-height:1.5rem!important}.yst-leading-8{line-height:2rem!important}.yst-leading-5{line-height:1.25rem!important}.yst-leading-normal{line-height:1.5!important}.yst-leading-\[normal\]{line-height:normal!important}.yst-leading-tight{line-height:1.25!important}.yst-leading-4{line-height:1rem!important}.yst-tracking-tight{letter-spacing:-.025em!important}.yst-tracking-wide{letter-spacing:.025em!important}.yst-text-slate-800{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.yst-text-slate-400{--tw-text-opacity:1!important;color:rgb(148 163 184/var(--tw-text-opacity))!important}.yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-text-slate-900{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.yst-text-slate-600{--tw-text-opacity:1!important;color:rgb(71 85 105/var(--tw-text-opacity))!important}.yst-text-primary-500{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.yst-text-gray-900{--tw-text-opacity:1!important;color:rgb(17 24 39/var(--tw-text-opacity))!important}.yst-text-gray-500{--tw-text-opacity:1!important;color:rgb(107 114 128/var(--tw-text-opacity))!important}.yst-text-green-600{--tw-text-opacity:1!important;color:rgb(22 163 74/var(--tw-text-opacity))!important}.yst-text-gray-400{--tw-text-opacity:1!important;color:rgb(156 163 175/var(--tw-text-opacity))!important}.yst-text-indigo-600{--tw-text-opacity:1!important;color:rgb(79 70 229/var(--tw-text-opacity))!important}.yst-text-\[\#555\]{--tw-text-opacity:1!important;color:rgb(85 85 85/var(--tw-text-opacity))!important}.yst-text-amber-300{--tw-text-opacity:1!important;color:rgb(252 211 77/var(--tw-text-opacity))!important}.yst-text-slate-700{--tw-text-opacity:1!important;color:rgb(51 65 85/var(--tw-text-opacity))!important}.yst-text-red-500{--tw-text-opacity:1!important;color:rgb(239 68 68/var(--tw-text-opacity))!important}.yst-text-green-400{--tw-text-opacity:1!important;color:rgb(74 222 128/var(--tw-text-opacity))!important}.yst-text-\[\#111827\]{--tw-text-opacity:1!important;color:rgb(17 24 39/var(--tw-text-opacity))!important}.yst-text-yellow-900{--tw-text-opacity:1!important;color:rgb(113 63 18/var(--tw-text-opacity))!important}.yst-text-amber-500{--tw-text-opacity:1!important;color:rgb(245 158 11/var(--tw-text-opacity))!important}.yst-text-red-600{--tw-text-opacity:1!important;color:rgb(220 38 38/var(--tw-text-opacity))!important}.yst-text-blue-500{--tw-text-opacity:1!important;color:rgb(59 130 246/var(--tw-text-opacity))!important}.yst-text-blue-800{--tw-text-opacity:1!important;color:rgb(30 64 175/var(--tw-text-opacity))!important}.yst-text-yellow-500{--tw-text-opacity:1!important;color:rgb(234 179 8/var(--tw-text-opacity))!important}.yst-text-yellow-800{--tw-text-opacity:1!important;color:rgb(133 77 14/var(--tw-text-opacity))!important}.yst-text-red-800{--tw-text-opacity:1!important;color:rgb(153 27 27/var(--tw-text-opacity))!important}.yst-text-emerald-600{--tw-text-opacity:1!important;color:rgb(5 150 105/var(--tw-text-opacity))!important}.yst-text-green-800{--tw-text-opacity:1!important;color:rgb(22 101 52/var(--tw-text-opacity))!important}.yst-text-red-900{--tw-text-opacity:1!important;color:rgb(127 29 29/var(--tw-text-opacity))!important}.yst-underline{-webkit-text-decoration-line:underline!important;text-decoration-line:underline!important}.yst-line-through{-webkit-text-decoration-line:line-through!important;text-decoration-line:line-through!important}.yst-no-underline{-webkit-text-decoration-line:none!important;text-decoration-line:none!important}.yst-subpixel-antialiased{-webkit-font-smoothing:auto!important;-moz-osx-font-smoothing:auto!important}.yst-placeholder-slate-500::placeholder{--tw-placeholder-opacity:1!important;color:rgb(100 116 139/var(--tw-placeholder-opacity))!important}.yst-opacity-0{opacity:0!important}.yst-opacity-100{opacity:1!important}.yst-opacity-25{opacity:.25!important}.yst-opacity-75{opacity:.75!important}.yst-opacity-50{opacity:.5!important}.yst-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a!important;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)!important}.yst-shadow,.yst-shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a!important;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)!important}.yst-shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a!important;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)!important}.yst-shadow-md,.yst-shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a!important;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)!important}.yst-shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important}.yst-shadow-none,.yst-shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important}.yst-shadow-amber-700\/30{--tw-shadow-color:#b453094d!important;--tw-shadow:var(--tw-shadow-colored)!important}.yst-outline-none{outline:2px solid #0000!important;outline-offset:2px!important}.yst-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.yst-ring-gray-200{--tw-ring-opacity:1!important;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))!important}.yst-ring-black{--tw-ring-opacity:1!important;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))!important}.yst-ring-opacity-5{--tw-ring-opacity:0.05!important}.yst-ring-offset-2{--tw-ring-offset-width:2px!important}.yst-ring-offset-primary-500{--tw-ring-offset-color:#a61e69!important}.yst-drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px #00000012) drop-shadow(0 2px 2px #0000000f)!important}.yst-drop-shadow-md,.yst-grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-grayscale{--tw-grayscale:grayscale(100%)!important}.yst-filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-transition-opacity{transition-duration:.15s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-all{transition-duration:.15s!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-colors{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-transform{transition-duration:.15s!important;transition-property:transform!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-\[width\]{transition-duration:.15s!important;transition-property:width!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-delay-200{transition-delay:.2s!important}.yst-delay-\[900ms\]{transition-delay:.9s!important}.yst-delay-100{transition-delay:.1s!important}.yst-duration-1000{transition-duration:1s!important}.yst-duration-200{transition-duration:.2s!important}.yst-duration-300{transition-duration:.3s!important}.yst-duration-150{transition-duration:.15s!important}.yst-duration-100{transition-duration:.1s!important}.yst-duration-75{transition-duration:75ms!important}.yst-duration-500{transition-duration:.5s!important}.yst-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)!important}.yst-ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)!important}.yst-ease-linear{transition-timing-function:linear!important}.odd\:yst-bg-white:nth-child(odd){--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.even\:yst-bg-slate-50:nth-child(2n){--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.focus-within\:yst-border-primary-500:focus-within{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.focus-within\:yst-outline-none:focus-within{outline:2px solid #0000!important;outline-offset:2px!important}.focus-within\:yst-ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus-within\:yst-ring-primary-500:focus-within{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.hover\:yst-bg-slate-50:hover{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.hover\:yst-bg-gray-50:hover{--tw-bg-opacity:1!important;background-color:rgb(249 250 251/var(--tw-bg-opacity))!important}.hover\:yst-bg-\[\#f0f0f0\]:hover{--tw-bg-opacity:1!important;background-color:rgb(240 240 240/var(--tw-bg-opacity))!important}.hover\:yst-bg-white:hover{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.hover\:yst-bg-primary-600:hover{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.hover\:yst-text-slate-500:hover{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.hover\:yst-text-slate-900:hover{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.hover\:yst-text-slate-800:hover{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.hover\:yst-text-white:hover{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.hover\:yst-text-primary-500:hover{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.hover\:yst-underline:hover{-webkit-text-decoration-line:underline!important;text-decoration-line:underline!important}.focus\:yst-border-primary-500:focus{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.focus\:yst-border-red-500:focus{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity))!important}.focus\:yst-border-emerald-600:focus{--tw-border-opacity:1!important;border-color:rgb(5 150 105/var(--tw-border-opacity))!important}.focus\:yst-bg-primary-600:focus{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.focus\:yst-text-white:focus{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.focus\:yst-text-primary-500:focus{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.focus\:yst-shadow-\[0_0_3px_rgba\(8\2c 74\2c 103\2c 0\.8\)\]:focus{--tw-shadow:0 0 3px #084a67cc!important;--tw-shadow-colored:0 0 3px var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.focus\:yst-outline-none:focus{outline:2px solid #0000!important;outline-offset:2px!important}.focus\:yst-outline:focus{outline-style:solid!important}.focus\:yst-outline-\[1px\]:focus{outline-width:1px!important}.focus\:-yst-outline-offset-1:focus{outline-offset:-1px!important}.focus\:yst-outline-\[color\:\#0066cd\]:focus{outline-color:#0066cd!important}.focus\:yst-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-1:focus,.focus\:yst-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus\:yst-ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-inset:focus{--tw-ring-inset:inset!important}.focus\:yst-ring-primary-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-white:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))!important}.focus\:yst-ring-red-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))!important}.focus\:yst-ring-emerald-600:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(5 150 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-offset-2:focus{--tw-ring-offset-width:2px!important}.focus\:yst-ring-offset-1:focus{--tw-ring-offset-width:1px!important}.focus\:yst-ring-offset-transparent:focus{--tw-ring-offset-color:#0000!important}.focus\:yst-ring-offset-primary-500:focus{--tw-ring-offset-color:#a61e69!important}.yst-group:hover .group-hover\:yst-bg-primary-500{--tw-bg-opacity:1!important;background-color:rgb(166 30 105/var(--tw-bg-opacity))!important}.yst-group:hover .group-hover\:yst-bg-primary-200{--tw-bg-opacity:1!important;background-color:rgb(224 179 204/var(--tw-bg-opacity))!important}.yst-group:hover .group-hover\:yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-group:hover .group-hover\:yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-group:hover .group-hover\:yst-text-primary-800{--tw-text-opacity:1!important;color:rgb(131 8 78/var(--tw-text-opacity))!important}[dir=rtl] .rtl\:yst-rotate-180{--tw-rotate:180deg!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@media not all and (min-width:640px){.max-sm\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}}@media (min-width:640px){.sm\:yst-mx-0{margin-left:0!important;margin-right:0!important}.sm\:yst-mb-0{margin-bottom:0!important}.sm\:yst-ml-3{margin-left:.75rem!important}.sm\:yst-mt-0{margin-top:0!important}.sm\:yst-ml-4{margin-left:1rem!important}.sm\:yst-flex{display:flex!important}.sm\:yst-h-10{height:2.5rem!important}.sm\:yst-w-auto{width:auto!important}.sm\:yst-w-10{width:2.5rem!important}.sm\:yst-translate-y-0{--tw-translate-y:0px!important}.sm\:yst-scale-95,.sm\:yst-translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.sm\:yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.sm\:yst-flex-row-reverse{flex-direction:row-reverse!important}.sm\:yst-items-start{align-items:flex-start!important}.sm\:yst-text-left{text-align:left!important}.sm\:yst-text-sm{font-size:.8125rem!important}}@media (min-width:768px){.md\:yst-absolute{position:absolute!important}.md\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.md\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.md\:yst-flex-row{flex-direction:row!important}}@media (min-width:783px){.min-\[783px\]\:yst-block{display:block!important}.min-\[783px\]\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.min-\[783px\]\:yst-p-8{padding:2rem!important}}@media (min-width:1024px){.lg\:yst-col-span-2{grid-column:span 2/span 2!important}.lg\:yst-mt-0{margin-top:0!important}.lg\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.lg\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.lg\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.lg\:yst-gap-12{gap:3rem!important}}@media (min-width:1280px){.xl\:yst-fixed{position:fixed!important}.xl\:yst-right-8{right:2rem!important}.xl\:yst-col-span-2{grid-column:span 2/span 2!important}.xl\:yst-mb-0{margin-bottom:0!important}.xl\:yst-mt-0{margin-top:0!important}.xl\:yst-w-\[16rem\]{width:16rem!important}.xl\:yst-max-w-3xl{max-width:48rem!important}.xl\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.xl\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.xl\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.xl\:yst-gap-12{gap:3rem!important}.xl\:yst-pr-\[17\.5rem\]{padding-right:17.5rem!important}}@media (min-width:1536px){.\32xl\:yst-col-span-2{grid-column:span 2/span 2!important}.\32xl\:yst-mt-0{margin-top:0!important}.\32xl\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.\32xl\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.\32xl\:yst-gap-12{gap:3rem!important}}@media (min-width:1800px){.min-\[1800px\]\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2280-rtl.css deleted file mode 100644 index 24fb5bb5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.switch-light span span,.switch-toggle a{display:none}@media only screen{.switch-light,.switch-toggle{display:block;padding:0!important;position:relative}.switch-light:after,.switch-toggle:after{clear:both;content:"";display:table}.switch-light *,.switch-light :after,.switch-light :before,.switch-toggle *,.switch-toggle :after,.switch-toggle :before{box-sizing:border-box}.switch-light a,.switch-toggle a{display:block;transition:all .2s ease-out}.switch-light label,.switch-light-visual-label,.switch-light>span,.switch-toggle label,.switch-toggle>span{line-height:2;vertical-align:middle}.switch-light input{opacity:0;position:absolute;z-index:3}.switch-light input[type=checkbox].disabled,.switch-light input[type=checkbox].disabled:checked:before,.switch-light input[type=checkbox]:disabled,.switch-light input[type=checkbox]:disabled:checked:before{opacity:0}.switch-light input:checked~span a{left:0}.switch-light strong{font-weight:inherit}.switch-light>span{min-height:2em;padding:0;position:relative;text-align:right}.switch-light span span{display:block;float:right;position:relative;text-align:center;-webkit-user-select:none;user-select:none;width:50%;z-index:2}.switch-light a{display:block;height:100%;padding:0;position:absolute;left:50%;top:0;width:50%;z-index:1}.switch-toggle input{right:0;opacity:0;position:absolute}.switch-toggle input[type=radio].disabled,.switch-toggle input[type=radio].disabled:checked:before,.switch-toggle input[type=radio]:disabled,.switch-toggle input[type=radio]:disabled:checked:before{opacity:0}.switch-toggle input+label{float:right;margin:0;padding:0 .5em;text-align:center}.switch-toggle input:checked+label{position:relative;z-index:2}.switch-toggle a{height:100%;right:0;padding:0;position:absolute;top:0;width:10px;z-index:1}.switch-toggle .yoast-button-upsell{right:20px;position:relative}.switch-toggle label:nth-child(2):nth-last-child(4),.switch-toggle label:nth-child(2):nth-last-child(4)~a,.switch-toggle label:nth-child(2):nth-last-child(4)~label{width:50%}.switch-toggle label:nth-child(2):nth-last-child(4)~input:checked:nth-child(3)+label~a{right:50%}.switch-toggle label:nth-child(2):nth-last-child(6),.switch-toggle label:nth-child(2):nth-last-child(6)~a,.switch-toggle label:nth-child(2):nth-last-child(6)~label{width:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(3)+label~a{right:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(5)+label~a{right:66.66%}.switch-toggle label:nth-child(2):nth-last-child(8),.switch-toggle label:nth-child(2):nth-last-child(8)~a,.switch-toggle label:nth-child(2):nth-last-child(8)~label{width:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(3)+label~a{right:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(5)+label~a{right:50%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(7)+label~a{right:75%}.switch-toggle label:nth-child(2):nth-last-child(10),.switch-toggle label:nth-child(2):nth-last-child(10)~a,.switch-toggle label:nth-child(2):nth-last-child(10)~label{width:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(3)+label~a{right:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(5)+label~a{right:40%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(7)+label~a{right:60%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(9)+label~a{right:80%}.switch-toggle label:nth-child(2):nth-last-child(12),.switch-toggle label:nth-child(2):nth-last-child(12)~a,.switch-toggle label:nth-child(2):nth-last-child(12)~label{width:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(3)+label~a{right:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(5)+label~a{right:33.2%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(7)+label~a{right:49.8%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(9)+label~a{right:66.4%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(11)+label~a{right:83%}.switch-candy a{box-shadow:0 1px 1px #0003,inset 0 1px 1px #ffffff73}}@media only screen and (-webkit-max-device-pixel-ratio:2) and (max-device-width:80em){.switch-light,.switch-toggle{-webkit-animation:webkitSiblingBugfix 1s infinite}}.fieldset-switch-toggle{width:400px}.fieldset-switch-toggle label{float:none}.fieldset-switch-toggle .yoast-button-upsell{background-color:green;height:16px;overflow:hidden;width:20px}@media only screen{.fieldset-switch-toggle legend{box-sizing:border-box;float:right;font-weight:600;line-height:2;margin:8px 0;min-width:200px;padding-left:16px;vertical-align:middle}.fieldset-switch-toggle .disabled-note{clear:both}.switch-container__has-help .switch-light-visual-label,.switch-container__has-help legend{float:right;min-width:0;padding-left:0}.switch-container__has-help .yoast_help.yoast-help-button{margin:8px 2px 0 0}.switch-light.switch-yoast-seo>span,.switch-toggle.switch-yoast-seo{background-color:#dcdcdc;border:1px solid #ccc;border-radius:.5em;box-shadow:inset 0 2px 4px #00000026;width:250px}.switch-light.switch-yoast-seo,.switch-toggle.switch-yoast-seo{clear:both;float:right}.switch-light.switch-yoast-seo>span{display:inline-block;overflow:visible}.switch-light.switch-yoast-seo a,.switch-toggle.switch-yoast-seo a{background:#a4286a;border:1px solid #b5b5b5;border-radius:.5em}.switch-light.switch-yoast-seo input.disabled+span a,.switch-light.switch-yoast-seo input.disabled:checked+span a,.switch-light.switch-yoast-seo input:disabled+span a,.switch-light.switch-yoast-seo input:disabled:checked+span a,.switch-toggle.switch-yoast-seo input.disabled+a,.switch-toggle.switch-yoast-seo input.disabled~a,.switch-toggle.switch-yoast-seo input:disabled+a,.switch-toggle.switch-yoast-seo input:disabled~a{background:#9b9b9b;border:0}.switch-light.switch-yoast-seo input:focus+label,.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus+label,.switch-toggle.switch-yoast-seo input:focus~span a{outline:none}.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus~a{border-color:#5b9dd9!important;box-shadow:0 0 2px #0073aacc!important}.switch-light.switch-yoast-seo input:checked~span a,.switch-toggle.switch-yoast-seo input:checked~span a{background:#a4286a;border:1px solid #b5b5b5}.switch-light.switch-yoast-seo input:checked~span span:first-child,.switch-light.switch-yoast-seo span span,.switch-toggle.switch-yoast-seo label{color:#333;font-weight:inherit;text-shadow:none}.switch-candy.switch-yoast-seo input:checked+label,.switch-candy.switch-yoast-seo input:checked~span span:nth-child(2),.switch-candy.switch-yoast-seo input~span span:first-child{color:#fff;text-shadow:none}.switch-candy.switch-yoast-seo input+label:after{content:"";display:block;height:100%;right:0;position:absolute;top:0;width:100%;z-index:3}.switch-candy.switch-yoast-seo input:checked+label:after{content:none}.switch-light.switch-yoast-seo-reverse input:checked~span a{right:0}.switch-light.switch-yoast-seo-reverse a{right:50%}.switch-light.switch-yoast-seo-reverse span span{float:left}.switch-toggle.switch-yoast-seo label,label.switch-light.switch-yoast-seo{cursor:pointer;margin-right:0}.switch-light.switch-yoast-seo input.disabled+span,.switch-light.switch-yoast-seo input:disabled+span,.switch-toggle.switch-yoast-seo input.disabled+label,.switch-toggle.switch-yoast-seo input:disabled+label{cursor:not-allowed}.switch-yoast-seo .switch-yoast-seo-jaws-a11y{display:block;height:1px;margin-bottom:-1px;overflow:hidden}.switch-light.switch-yoast-seo label code,.switch-toggle.switch-yoast-seo label code{background-color:inherit;vertical-align:top}.switch-light-visual-label{display:block;font-weight:600;line-height:2;margin:8px 0}.switch-light-visual-label__strong{font-weight:600}.switch-container{clear:both;margin:0 0 .8em}.switch-container.premium-upsell .clear{display:none}.switch-container.premium-upsell{align-items:end;clear:both;display:grid;grid-template-columns:280px 1fr;margin:0 0 .8em}.switch-container.premium-upsell .yoast-help-panel{width:520px}@media screen and (max-width:600px){.switch-container.premium-upsell{clear:both;display:grid;grid-template-columns:1fr;margin:0 0 .8em}.switch-container.premium-upsell .yoast-help-panel{width:unset}}.switch-container.premium-upsell .yoast-button{clear:both;margin-top:8px;width:-moz-fit-content;width:fit-content}.switch-container+.switch-container{margin-top:8px}.switch-container+p{margin:0 0 16px}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2280.css deleted file mode 100644 index c2154611..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2280.css +++ /dev/null @@ -1 +0,0 @@ -.switch-light span span,.switch-toggle a{display:none}@media only screen{.switch-light,.switch-toggle{display:block;padding:0!important;position:relative}.switch-light:after,.switch-toggle:after{clear:both;content:"";display:table}.switch-light *,.switch-light :after,.switch-light :before,.switch-toggle *,.switch-toggle :after,.switch-toggle :before{box-sizing:border-box}.switch-light a,.switch-toggle a{display:block;transition:all .2s ease-out}.switch-light label,.switch-light-visual-label,.switch-light>span,.switch-toggle label,.switch-toggle>span{line-height:2;vertical-align:middle}.switch-light input{opacity:0;position:absolute;z-index:3}.switch-light input[type=checkbox].disabled,.switch-light input[type=checkbox].disabled:checked:before,.switch-light input[type=checkbox]:disabled,.switch-light input[type=checkbox]:disabled:checked:before{opacity:0}.switch-light input:checked~span a{right:0}.switch-light strong{font-weight:inherit}.switch-light>span{min-height:2em;padding:0;position:relative;text-align:left}.switch-light span span{display:block;float:left;position:relative;text-align:center;-webkit-user-select:none;user-select:none;width:50%;z-index:2}.switch-light a{display:block;height:100%;padding:0;position:absolute;right:50%;top:0;width:50%;z-index:1}.switch-toggle input{left:0;opacity:0;position:absolute}.switch-toggle input[type=radio].disabled,.switch-toggle input[type=radio].disabled:checked:before,.switch-toggle input[type=radio]:disabled,.switch-toggle input[type=radio]:disabled:checked:before{opacity:0}.switch-toggle input+label{float:left;margin:0;padding:0 .5em;text-align:center}.switch-toggle input:checked+label{position:relative;z-index:2}.switch-toggle a{height:100%;left:0;padding:0;position:absolute;top:0;width:10px;z-index:1}.switch-toggle .yoast-button-upsell{left:20px;position:relative}.switch-toggle label:nth-child(2):nth-last-child(4),.switch-toggle label:nth-child(2):nth-last-child(4)~a,.switch-toggle label:nth-child(2):nth-last-child(4)~label{width:50%}.switch-toggle label:nth-child(2):nth-last-child(4)~input:checked:nth-child(3)+label~a{left:50%}.switch-toggle label:nth-child(2):nth-last-child(6),.switch-toggle label:nth-child(2):nth-last-child(6)~a,.switch-toggle label:nth-child(2):nth-last-child(6)~label{width:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(3)+label~a{left:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(5)+label~a{left:66.66%}.switch-toggle label:nth-child(2):nth-last-child(8),.switch-toggle label:nth-child(2):nth-last-child(8)~a,.switch-toggle label:nth-child(2):nth-last-child(8)~label{width:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(3)+label~a{left:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(5)+label~a{left:50%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(7)+label~a{left:75%}.switch-toggle label:nth-child(2):nth-last-child(10),.switch-toggle label:nth-child(2):nth-last-child(10)~a,.switch-toggle label:nth-child(2):nth-last-child(10)~label{width:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(3)+label~a{left:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(5)+label~a{left:40%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(7)+label~a{left:60%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(9)+label~a{left:80%}.switch-toggle label:nth-child(2):nth-last-child(12),.switch-toggle label:nth-child(2):nth-last-child(12)~a,.switch-toggle label:nth-child(2):nth-last-child(12)~label{width:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(3)+label~a{left:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(5)+label~a{left:33.2%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(7)+label~a{left:49.8%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(9)+label~a{left:66.4%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(11)+label~a{left:83%}.switch-candy a{box-shadow:0 1px 1px #0003,inset 0 1px 1px #ffffff73}}@media only screen and (-webkit-max-device-pixel-ratio:2) and (max-device-width:80em){.switch-light,.switch-toggle{-webkit-animation:webkitSiblingBugfix 1s infinite}}.fieldset-switch-toggle{width:400px}.fieldset-switch-toggle label{float:none}.fieldset-switch-toggle .yoast-button-upsell{background-color:green;height:16px;overflow:hidden;width:20px}@media only screen{.fieldset-switch-toggle legend{box-sizing:border-box;float:left;font-weight:600;line-height:2;margin:8px 0;min-width:200px;padding-right:16px;vertical-align:middle}.fieldset-switch-toggle .disabled-note{clear:both}.switch-container__has-help .switch-light-visual-label,.switch-container__has-help legend{float:left;min-width:0;padding-right:0}.switch-container__has-help .yoast_help.yoast-help-button{margin:8px 0 0 2px}.switch-light.switch-yoast-seo>span,.switch-toggle.switch-yoast-seo{background-color:#dcdcdc;border:1px solid #ccc;border-radius:.5em;box-shadow:inset 0 2px 4px #00000026;width:250px}.switch-light.switch-yoast-seo,.switch-toggle.switch-yoast-seo{clear:both;float:left}.switch-light.switch-yoast-seo>span{display:inline-block;overflow:visible}.switch-light.switch-yoast-seo a,.switch-toggle.switch-yoast-seo a{background:#a4286a;border:1px solid #b5b5b5;border-radius:.5em}.switch-light.switch-yoast-seo input.disabled+span a,.switch-light.switch-yoast-seo input.disabled:checked+span a,.switch-light.switch-yoast-seo input:disabled+span a,.switch-light.switch-yoast-seo input:disabled:checked+span a,.switch-toggle.switch-yoast-seo input.disabled+a,.switch-toggle.switch-yoast-seo input.disabled~a,.switch-toggle.switch-yoast-seo input:disabled+a,.switch-toggle.switch-yoast-seo input:disabled~a{background:#9b9b9b;border:0}.switch-light.switch-yoast-seo input:focus+label,.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus+label,.switch-toggle.switch-yoast-seo input:focus~span a{outline:none}.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus~a{border-color:#5b9dd9!important;box-shadow:0 0 2px #0073aacc!important}.switch-light.switch-yoast-seo input:checked~span a,.switch-toggle.switch-yoast-seo input:checked~span a{background:#a4286a;border:1px solid #b5b5b5}.switch-light.switch-yoast-seo input:checked~span span:first-child,.switch-light.switch-yoast-seo span span,.switch-toggle.switch-yoast-seo label{color:#333;font-weight:inherit;text-shadow:none}.switch-candy.switch-yoast-seo input:checked+label,.switch-candy.switch-yoast-seo input:checked~span span:nth-child(2),.switch-candy.switch-yoast-seo input~span span:first-child{color:#fff;text-shadow:none}.switch-candy.switch-yoast-seo input+label:after{content:"";display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:3}.switch-candy.switch-yoast-seo input:checked+label:after{content:none}.switch-light.switch-yoast-seo-reverse input:checked~span a{left:0}.switch-light.switch-yoast-seo-reverse a{left:50%}.switch-light.switch-yoast-seo-reverse span span{float:right}.switch-toggle.switch-yoast-seo label,label.switch-light.switch-yoast-seo{cursor:pointer;margin-left:0}.switch-light.switch-yoast-seo input.disabled+span,.switch-light.switch-yoast-seo input:disabled+span,.switch-toggle.switch-yoast-seo input.disabled+label,.switch-toggle.switch-yoast-seo input:disabled+label{cursor:not-allowed}.switch-yoast-seo .switch-yoast-seo-jaws-a11y{display:block;height:1px;margin-bottom:-1px;overflow:hidden}.switch-light.switch-yoast-seo label code,.switch-toggle.switch-yoast-seo label code{background-color:inherit;vertical-align:top}.switch-light-visual-label{display:block;font-weight:600;line-height:2;margin:8px 0}.switch-light-visual-label__strong{font-weight:600}.switch-container{clear:both;margin:0 0 .8em}.switch-container.premium-upsell .clear{display:none}.switch-container.premium-upsell{align-items:end;clear:both;display:grid;grid-template-columns:280px 1fr;margin:0 0 .8em}.switch-container.premium-upsell .yoast-help-panel{width:520px}@media screen and (max-width:600px){.switch-container.premium-upsell{clear:both;display:grid;grid-template-columns:1fr;margin:0 0 .8em}.switch-container.premium-upsell .yoast-help-panel{width:unset}}.switch-container.premium-upsell .yoast-button{clear:both;margin-top:8px;width:-moz-fit-content;width:fit-content}.switch-container+.switch-container{margin-top:8px}.switch-container+p{margin:0 0 16px}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/tooltips-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/tooltips-2280-rtl.css deleted file mode 100644 index 579a58cc..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/tooltips-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-tooltip{position:relative}button.yoast-tooltip{overflow:visible}.yoast-tooltip:after{word-wrap:break-word;-webkit-font-smoothing:subpixel-antialiased;background:#000c;border-radius:3px;color:#fff;content:attr(aria-label);display:none;font:normal normal 11px/1.45454545 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;letter-spacing:normal;opacity:0;padding:6px 8px 5px;pointer-events:none;position:absolute;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;white-space:pre;z-index:1000000}.yoast-tooltip-alt:after{content:attr(data-label)}.yoast-tooltip:before{border:5px solid #0000;color:#000c;content:"\00a0";display:none;height:0;opacity:0;pointer-events:none;position:absolute;width:0;z-index:1000001}@keyframes yoast-tooltip-appear{0%{opacity:0}to{opacity:1}}.yoast-tooltip:active:after,.yoast-tooltip:active:before,.yoast-tooltip:focus:after,.yoast-tooltip:focus:before,.yoast-tooltip:hover:after,.yoast-tooltip:hover:before{animation-delay:.4s;animation-duration:.1s;animation-fill-mode:forwards;animation-name:yoast-tooltip-appear;animation-timing-function:ease-in;display:inline-block;text-decoration:none}.yoast-tooltip-no-delay:active:after,.yoast-tooltip-no-delay:active:before,.yoast-tooltip-no-delay:focus:after,.yoast-tooltip-no-delay:focus:before,.yoast-tooltip-no-delay:hover:after,.yoast-tooltip-no-delay:hover:before{animation:none;opacity:1}.yoast-tooltip-multiline:active:after,.yoast-tooltip-multiline:focus:after,.yoast-tooltip-multiline:hover:after{display:table-cell}.yoast-tooltip-s:after,.yoast-tooltip-se:after,.yoast-tooltip-sw:after{margin-top:5px;left:50%;top:100%}.yoast-tooltip-s:before,.yoast-tooltip-se:before,.yoast-tooltip-sw:before{border-bottom-color:#000c;bottom:-5px;margin-left:-5px;left:50%;top:auto}.yoast-tooltip-se:after{right:50%;margin-right:-15px;left:auto}.yoast-tooltip-sw:after{margin-left:-15px}.yoast-tooltip-n:after,.yoast-tooltip-ne:after,.yoast-tooltip-nw:after{bottom:100%;margin-bottom:5px;left:50%}.yoast-tooltip-n:before,.yoast-tooltip-ne:before,.yoast-tooltip-nw:before{border-top-color:#000c;bottom:auto;margin-left:-5px;left:50%;top:-5px}.yoast-tooltip-ne:after{right:50%;margin-right:-15px;left:auto}.yoast-tooltip-nw:after{margin-left:-15px}.yoast-tooltip-n:after,.yoast-tooltip-s:after{transform:translateX(-50%)}.yoast-tooltip-w:after{bottom:50%;margin-left:5px;left:100%;transform:translateY(50%)}.yoast-tooltip-w:before{border-right-color:#000c;bottom:50%;right:-5px;margin-top:-5px;top:50%}.yoast-tooltip-e:after{bottom:50%;right:100%;margin-right:5px;transform:translateY(50%)}.yoast-tooltip-e:before{border-left-color:#000c;bottom:50%;margin-top:-5px;left:-5px;top:50%}.yoast-tooltip-multiline:after{word-wrap:normal;border-collapse:initial;max-width:250px;white-space:pre-line;width:250px;width:max-content;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n:after,.yoast-tooltip-multiline.yoast-tooltip-s:after{right:50%;left:auto;transform:translateX(50%)}.yoast-tooltip-multiline.yoast-tooltip-e:after,.yoast-tooltip-multiline.yoast-tooltip-w:after{left:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline:after{width:250px}}.yoast-tooltip-sticky:after,.yoast-tooltip-sticky:before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline:after{display:table-cell}@media only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w:after{margin-left:4.5px}}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/tooltips-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/tooltips-2280.css deleted file mode 100644 index 91a8a1e1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/tooltips-2280.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-tooltip{position:relative}button.yoast-tooltip{overflow:visible}.yoast-tooltip:after{word-wrap:break-word;-webkit-font-smoothing:subpixel-antialiased;background:#000c;border-radius:3px;color:#fff;content:attr(aria-label);display:none;font:normal normal 11px/1.45454545 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;letter-spacing:normal;opacity:0;padding:6px 8px 5px;pointer-events:none;position:absolute;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;white-space:pre;z-index:1000000}.yoast-tooltip-alt:after{content:attr(data-label)}.yoast-tooltip:before{border:5px solid #0000;color:#000c;content:"\00a0";display:none;height:0;opacity:0;pointer-events:none;position:absolute;width:0;z-index:1000001}@keyframes yoast-tooltip-appear{0%{opacity:0}to{opacity:1}}.yoast-tooltip:active:after,.yoast-tooltip:active:before,.yoast-tooltip:focus:after,.yoast-tooltip:focus:before,.yoast-tooltip:hover:after,.yoast-tooltip:hover:before{animation-delay:.4s;animation-duration:.1s;animation-fill-mode:forwards;animation-name:yoast-tooltip-appear;animation-timing-function:ease-in;display:inline-block;text-decoration:none}.yoast-tooltip-no-delay:active:after,.yoast-tooltip-no-delay:active:before,.yoast-tooltip-no-delay:focus:after,.yoast-tooltip-no-delay:focus:before,.yoast-tooltip-no-delay:hover:after,.yoast-tooltip-no-delay:hover:before{animation:none;opacity:1}.yoast-tooltip-multiline:active:after,.yoast-tooltip-multiline:focus:after,.yoast-tooltip-multiline:hover:after{display:table-cell}.yoast-tooltip-s:after,.yoast-tooltip-se:after,.yoast-tooltip-sw:after{margin-top:5px;right:50%;top:100%}.yoast-tooltip-s:before,.yoast-tooltip-se:before,.yoast-tooltip-sw:before{border-bottom-color:#000c;bottom:-5px;margin-right:-5px;right:50%;top:auto}.yoast-tooltip-se:after{left:50%;margin-left:-15px;right:auto}.yoast-tooltip-sw:after{margin-right:-15px}.yoast-tooltip-n:after,.yoast-tooltip-ne:after,.yoast-tooltip-nw:after{bottom:100%;margin-bottom:5px;right:50%}.yoast-tooltip-n:before,.yoast-tooltip-ne:before,.yoast-tooltip-nw:before{border-top-color:#000c;bottom:auto;margin-right:-5px;right:50%;top:-5px}.yoast-tooltip-ne:after{left:50%;margin-left:-15px;right:auto}.yoast-tooltip-nw:after{margin-right:-15px}.yoast-tooltip-n:after,.yoast-tooltip-s:after{transform:translateX(50%)}.yoast-tooltip-w:after{bottom:50%;margin-right:5px;right:100%;transform:translateY(50%)}.yoast-tooltip-w:before{border-left-color:#000c;bottom:50%;left:-5px;margin-top:-5px;top:50%}.yoast-tooltip-e:after{bottom:50%;left:100%;margin-left:5px;transform:translateY(50%)}.yoast-tooltip-e:before{border-right-color:#000c;bottom:50%;margin-top:-5px;right:-5px;top:50%}.yoast-tooltip-multiline:after{word-wrap:normal;border-collapse:initial;max-width:250px;white-space:pre-line;width:250px;width:max-content;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n:after,.yoast-tooltip-multiline.yoast-tooltip-s:after{left:50%;right:auto;transform:translateX(-50%)}.yoast-tooltip-multiline.yoast-tooltip-e:after,.yoast-tooltip-multiline.yoast-tooltip-w:after{right:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline:after{width:250px}}.yoast-tooltip-sticky:after,.yoast-tooltip-sticky:before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline:after{display:table-cell}@media only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w:after{margin-right:4.5px}}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/workouts-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/workouts-2280-rtl.css deleted file mode 100644 index 7b0376b4..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/workouts-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -#wpseo-workouts-container-free h1,#wpseo-workouts-container-free h3{color:#a4286a;font-weight:500}#wpseo-workouts-container-free h3{font-size:18px;line-height:24px}.card.card-small h3{min-height:48px}#wpseo-workouts-container-free h2{font-size:12px;text-transform:uppercase}#wpseo-workouts-container-free #workouts-page-description{font-size:16px;max-width:600px}.workflow tr.cornerstone{font-weight:700}#wpseo-workouts-container-free hr{margin-bottom:24px;margin-top:8px}#wpseo-workouts-container-free progress{margin:16px 0 8px}#wpseo-workouts-container-free div.card{border-color:#0003;border-radius:8px;border-width:1px;box-shadow:0 1px 3px 0 #0000001a,0 1px 2px 0 #0000000f;max-width:720px;padding:24px;width:100%}#wpseo-workouts-container-free div.card>h2{margin:0}#wpseo-workouts-container-free div.card.card-small{display:flex;flex-direction:column;max-width:320px}#wpseo-workouts-container-free div.card.card-small svg{height:146px;width:204px}#wpseo-workouts-container-free div.card.card-small svg *{height:100%;width:100%}#wpseo-workouts-container-free div.card.card-small>span{margin-top:auto}#wpseo-workouts-container-free table button{margin:2px}.workflow{counter-reset:line-number;list-style:none;margin-right:48px}.workflow li li{counter-increment:none;line-height:19px;margin-bottom:8px}.workflow li.step{counter-increment:line-number;padding-bottom:16px;position:relative}.workflow .yoast-button.yoast-button--finished{opacity:.5}.workflow .finish-button-section .finish-button-saved{color:#6ea029;grid-column-end:3;grid-column-start:3;margin-right:10px;position:relative}.workflow .finish-button-section .finish-button-saved:before{background:var(--yoast-svg-icon-check);background-size:18px 13px;content:"";height:13px;right:-18px;position:absolute;top:2px;width:18px}.workflow li.step>.yoast-button.orphaned-summary{display:initial;margin:0}.yoast .yoast-button--arrow-down{display:inline-block;flex-shrink:0;height:16px;margin:0 6px 0 -2px;width:16px}.workflow>li.step:before{background:#a4286a;bottom:-20px;content:"";right:-33px;position:absolute;top:0;width:2px}.workflow .extra-list-content{position:relative}.workflow>li.step:last-of-type:before{display:none}.workflow>li.step:after{background:#fff;border:2px solid #a4286a;border-radius:100%;color:#a4286a;content:counter(line-number);display:block;height:28px;right:-48px;line-height:28px;position:absolute;text-align:center;top:-8px;width:28px}.workflow li.step.finished:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' fill='none' stroke='%23FFF' height='24' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m5 13 4 4L19 7'/%3E%3C/svg%3E") #a4286a;background-position:50%;background-repeat:no-repeat;background-size:20px 20px;content:""}.workflow li.step.finished.faded p,.workflow li.step.finished.faded table{opacity:.5}.workflow li.step img{max-width:100%}.workflow li.step img.workflow__image{max-height:100px;max-width:100px}.workflow li.step.yoast-fadeout:before{background:linear-gradient(-180deg,#a4286a,#fff 75%);display:block}.workflow li.step #react-select-2-input{box-shadow:none!important}.workflows__index{display:flex;flex-wrap:wrap;gap:16px}.workflows__index .yoast-button{width:100%}table.yoast_help.yoast_link_suggestions thead td{padding:16px 8px}table.yoast_help.yoast_link_suggestions td{vertical-align:middle}table.yoast_help th.divider{text-align:center}.workflow table.yoast_help td{vertical-align:middle}.workflow table.yoast_help.yoast_link_suggestions td div{display:inline-block}.workflow table.yoast_help.yoast_link_suggestions td strong{display:inline-block;margin-left:8px}.components-modal__header{height:72px;padding:0 24px}.components-modal__header .components-modal__header-heading{color:#a4286a;font-size:20px;font-weight:400;line-height:1.2;margin:0}.components-modal__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.components-modal__content{padding:0 24px 24px}.components-modal__content input[type=text]{max-width:400px;width:100%}.components-modal__frame.yoast__workout{max-width:720px}.yoast__redirect-suggestions{line-height:2}.components-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#00000059;bottom:0;right:0;position:fixed;left:0;top:0;z-index:100000}@media (prefers-reduced-motion:reduce){.components-modal__screen-overlay{animation-delay:0s;animation-duration:1ms}}.components-modal__frame{background:#fff;border-radius:2px;bottom:0;box-shadow:0 10px 10px #00000040;box-sizing:border-box;right:0;margin:0;overflow:auto;position:absolute;left:0;top:0}@media (min-width:600px){.components-modal__frame{animation:components-modal__appear-animation .1s ease-out;animation-fill-mode:forwards;bottom:auto;right:50%;max-height:90%;max-width:calc(100% - 32px);min-width:360px;left:auto;top:50%;transform:translate(50%,-50%)}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.components-modal__frame{animation-delay:0s;animation-duration:1ms}}@keyframes components-modal__appear-animation{0%{margin-top:32px}to{margin-top:0}}.components-modal__header{align-items:center;background:#fff;border-bottom:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;height:60px;justify-content:space-between;margin:0 -32px 24px;padding:0 32px;position:relative;position:sticky;top:0;z-index:10}@supports (-ms-ime-align:auto){.components-modal__header{position:fixed;width:100%}}.components-modal__header .components-modal__header-heading{font-size:1rem;font-weight:600}.components-modal__header h1{line-height:1;margin:0}.components-modal__header .components-button{right:8px;position:relative}.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{box-sizing:border-box;height:100%;padding:0 32px 24px}@supports (-ms-ime-align:auto){.components-modal__content{padding-top:60px}}.workflow li.step h4{font-size:14px;font-weight:600;margin:24px 0 0}.workflow .yoast-social-profiles-input-fields{margin:10px 0 20px}.workflow .tracking-radiobuttons{line-height:19px;margin:0 0 20px}.workflow .yoast-tracking{list-style-position:inside;list-style-type:disc;padding:inherit}.yoast-list--usp{margin-bottom:16px;padding-right:24px}.yoast-list--usp li{margin-bottom:16px;position:relative}.yoast-list--usp li:before{background:var(--yoast-svg-icon-check);background-size:18px 13px;content:"";height:13px;right:-24px;position:absolute;top:3px;width:18px}.workout-card-content-flex{display:flex}.card.card-small .yoast-button-upsell{box-shadow:inset 0 -2px 0 #0003;filter:none;font-family:inherit;min-height:40px}.card.card-small button{box-shadow:inset 0 -2px 0 #0000004d;filter:none;min-height:40px}.card.card-small button.yoast-button--secondary{box-shadow:inset 0 -2px 0 #0000001a}.workout-card-content-flex ul{margin-left:8px}.workout-card-content-flex img{max-width:120px}.workout-card-upsell-button{opacity:1}#wpseo-workouts-container-free div.card.card-small.card-disabled{background-color:#ffffff80}#wpseo-workouts-container-free div.card.card-small.card-disabled .workout-card-content-flex,#wpseo-workouts-container-free div.card.card-small.card-disabled .workout-card-progress,#wpseo-workouts-container-free div.card.card-small.card-disabled h2,#wpseo-workouts-container-free div.card.card-small.card-disabled h3{opacity:.5}.workflow__grid{display:grid;gap:8px;grid-template-columns:auto 100px}.workflow__grid>div:last-of-type{display:flex;flex-wrap:wrap;justify-content:flex-end}@media screen and (max-width:768px){#wpseo-workouts-container-free #workouts-page-description{max-width:320px}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/workouts-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/workouts-2280.css deleted file mode 100644 index 8047eede..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/workouts-2280.css +++ /dev/null @@ -1 +0,0 @@ -#wpseo-workouts-container-free h1,#wpseo-workouts-container-free h3{color:#a4286a;font-weight:500}#wpseo-workouts-container-free h3{font-size:18px;line-height:24px}.card.card-small h3{min-height:48px}#wpseo-workouts-container-free h2{font-size:12px;text-transform:uppercase}#wpseo-workouts-container-free #workouts-page-description{font-size:16px;max-width:600px}.workflow tr.cornerstone{font-weight:700}#wpseo-workouts-container-free hr{margin-bottom:24px;margin-top:8px}#wpseo-workouts-container-free progress{margin:16px 0 8px}#wpseo-workouts-container-free div.card{border-color:#0003;border-radius:8px;border-width:1px;box-shadow:0 1px 3px 0 #0000001a,0 1px 2px 0 #0000000f;max-width:720px;padding:24px;width:100%}#wpseo-workouts-container-free div.card>h2{margin:0}#wpseo-workouts-container-free div.card.card-small{display:flex;flex-direction:column;max-width:320px}#wpseo-workouts-container-free div.card.card-small svg{height:146px;width:204px}#wpseo-workouts-container-free div.card.card-small svg *{height:100%;width:100%}#wpseo-workouts-container-free div.card.card-small>span{margin-top:auto}#wpseo-workouts-container-free table button{margin:2px}.workflow{counter-reset:line-number;list-style:none;margin-left:48px}.workflow li li{counter-increment:none;line-height:19px;margin-bottom:8px}.workflow li.step{counter-increment:line-number;padding-bottom:16px;position:relative}.workflow .yoast-button.yoast-button--finished{opacity:.5}.workflow .finish-button-section .finish-button-saved{color:#6ea029;grid-column-end:3;grid-column-start:3;margin-left:10px;position:relative}.workflow .finish-button-section .finish-button-saved:before{background:var(--yoast-svg-icon-check);background-size:18px 13px;content:"";height:13px;left:-18px;position:absolute;top:2px;width:18px}.workflow li.step>.yoast-button.orphaned-summary{display:initial;margin:0}.yoast .yoast-button--arrow-down{display:inline-block;flex-shrink:0;height:16px;margin:0 -2px 0 6px;width:16px}.workflow>li.step:before{background:#a4286a;bottom:-20px;content:"";left:-33px;position:absolute;top:0;width:2px}.workflow .extra-list-content{position:relative}.workflow>li.step:last-of-type:before{display:none}.workflow>li.step:after{background:#fff;border:2px solid #a4286a;border-radius:100%;color:#a4286a;content:counter(line-number);display:block;height:28px;left:-48px;line-height:28px;position:absolute;text-align:center;top:-8px;width:28px}.workflow li.step.finished:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' fill='none' stroke='%23FFF' height='24' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m5 13 4 4L19 7'/%3E%3C/svg%3E") #a4286a;background-position:50%;background-repeat:no-repeat;background-size:20px 20px;content:""}.workflow li.step.finished.faded p,.workflow li.step.finished.faded table{opacity:.5}.workflow li.step img{max-width:100%}.workflow li.step img.workflow__image{max-height:100px;max-width:100px}.workflow li.step.yoast-fadeout:before{background:linear-gradient(180deg,#a4286a,#fff 75%);display:block}.workflow li.step #react-select-2-input{box-shadow:none!important}.workflows__index{display:flex;flex-wrap:wrap;gap:16px}.workflows__index .yoast-button{width:100%}table.yoast_help.yoast_link_suggestions thead td{padding:16px 8px}table.yoast_help.yoast_link_suggestions td{vertical-align:middle}table.yoast_help th.divider{text-align:center}.workflow table.yoast_help td{vertical-align:middle}.workflow table.yoast_help.yoast_link_suggestions td div{display:inline-block}.workflow table.yoast_help.yoast_link_suggestions td strong{display:inline-block;margin-right:8px}.components-modal__header{height:72px;padding:0 24px}.components-modal__header .components-modal__header-heading{color:#a4286a;font-size:20px;font-weight:400;line-height:1.2;margin:0}.components-modal__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.components-modal__content{padding:0 24px 24px}.components-modal__content input[type=text]{max-width:400px;width:100%}.components-modal__frame.yoast__workout{max-width:720px}.yoast__redirect-suggestions{line-height:2}.components-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#00000059;bottom:0;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{background:#fff;border-radius:2px;bottom:0;box-shadow:0 10px 10px #00000040;box-sizing:border-box;left:0;margin:0;overflow:auto;position:absolute;right:0;top:0}@media (min-width:600px){.components-modal__frame{animation:components-modal__appear-animation .1s ease-out;animation-fill-mode:forwards;bottom:auto;left:50%;max-height:90%;max-width:calc(100% - 32px);min-width:360px;right:auto;top:50%;transform:translate(-50%,-50%)}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.components-modal__frame{animation-delay:0s;animation-duration:1ms}}@keyframes components-modal__appear-animation{0%{margin-top:32px}to{margin-top:0}}.components-modal__header{align-items:center;background:#fff;border-bottom:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;height:60px;justify-content:space-between;margin:0 -32px 24px;padding:0 32px;position:relative;position:sticky;top:0;z-index:10}@supports (-ms-ime-align:auto){.components-modal__header{position:fixed;width:100%}}.components-modal__header .components-modal__header-heading{font-size:1rem;font-weight:600}.components-modal__header h1{line-height:1;margin:0}.components-modal__header .components-button{left:8px;position:relative}.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{box-sizing:border-box;height:100%;padding:0 32px 24px}@supports (-ms-ime-align:auto){.components-modal__content{padding-top:60px}}.workflow li.step h4{font-size:14px;font-weight:600;margin:24px 0 0}.workflow .yoast-social-profiles-input-fields{margin:10px 0 20px}.workflow .tracking-radiobuttons{line-height:19px;margin:0 0 20px}.workflow .yoast-tracking{list-style-position:inside;list-style-type:disc;padding:inherit}.yoast-list--usp{margin-bottom:16px;padding-left:24px}.yoast-list--usp li{margin-bottom:16px;position:relative}.yoast-list--usp li:before{background:var(--yoast-svg-icon-check);background-size:18px 13px;content:"";height:13px;left:-24px;position:absolute;top:3px;width:18px}.workout-card-content-flex{display:flex}.card.card-small .yoast-button-upsell{box-shadow:inset 0 -2px 0 #0003;filter:none;font-family:inherit;min-height:40px}.card.card-small button{box-shadow:inset 0 -2px 0 #0000004d;filter:none;min-height:40px}.card.card-small button.yoast-button--secondary{box-shadow:inset 0 -2px 0 #0000001a}.workout-card-content-flex ul{margin-right:8px}.workout-card-content-flex img{max-width:120px}.workout-card-upsell-button{opacity:1}#wpseo-workouts-container-free div.card.card-small.card-disabled{background-color:#ffffff80}#wpseo-workouts-container-free div.card.card-small.card-disabled .workout-card-content-flex,#wpseo-workouts-container-free div.card.card-small.card-disabled .workout-card-progress,#wpseo-workouts-container-free div.card.card-small.card-disabled h2,#wpseo-workouts-container-free div.card.card-small.card-disabled h3{opacity:.5}.workflow__grid{display:grid;gap:8px;grid-template-columns:auto 100px}.workflow__grid>div:last-of-type{display:flex;flex-wrap:wrap;justify-content:flex-end}@media screen and (max-width:768px){#wpseo-workouts-container-free #workouts-page-description{max-width:320px}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2280-rtl.css deleted file mode 100644 index 09bca881..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-notice-dismiss:before{-webkit-font-smoothing:antialiased!important;speak:none;background:none;color:#b4b9be;content:"\f153";display:block!important;font:normal 16px/1 dashicons;height:20px;text-align:center;width:20px}.yoast-notice-dismiss{background:none;border:none;color:#b4b9be;cursor:pointer;margin:0;padding:9px;position:absolute;left:1px;top:0}.yoast-notice-dismiss:before{right:0;line-height:20px;position:relative;top:0}.yoast-notice-dismiss:active:before,.yoast-notice-dismiss:focus:before,.yoast-notice-dismiss:hover:before{color:#c00}.yoast-notice-dismiss:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#c00;outline:none}.yoast-notice.is-dismissible{position:relative}.yoast-notice-dismiss{text-decoration:none} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2280.css deleted file mode 100644 index 78506d9f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2280.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-notice-dismiss:before{-webkit-font-smoothing:antialiased!important;speak:none;background:none;color:#b4b9be;content:"\f153";display:block!important;font:normal 16px/1 dashicons;height:20px;text-align:center;width:20px}.yoast-notice-dismiss{background:none;border:none;color:#b4b9be;cursor:pointer;margin:0;padding:9px;position:absolute;right:1px;top:0}.yoast-notice-dismiss:before{left:0;line-height:20px;position:relative;top:0}.yoast-notice-dismiss:active:before,.yoast-notice-dismiss:focus:before,.yoast-notice-dismiss:hover:before{color:#c00}.yoast-notice-dismiss:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#c00;outline:none}.yoast-notice.is-dismissible{position:relative}.yoast-notice-dismiss{text-decoration:none} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2280-rtl.css deleted file mode 100644 index a1f0ea0b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;right:0;position:fixed;left:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);right:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;left:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-left:16px;width:19px}.yoast-modal__menu{border-left:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-left:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-left:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;right:0;left:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-left:8px}.yoast .yoast-close{left:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-right:16px;margin-left:16px;padding-right:0;padding-left:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:right;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(-180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:left;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;right:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-left:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-left:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}#yoast-semrush-country-selector{border:none;position:relative}.yoast-related-keyphrases-modal__chart{display:block}.yoast-wordproof-modal{max-width:380px;text-align:center}.yoast-wordproof-modal-image{display:flex;justify-content:center;margin-block:40px}.yoast-wordproof-modal-svg__webhook-failed{width:100%}.yoast-wordproof-modal-svg__success{width:175px}.yoast-wordproof-modal-action{display:flex;justify-content:center;margin-bottom:10px;margin-top:40px}.yoast-wordproof-modal-action.yoast-wordproof-modal-action>button{padding-right:20px;padding-left:20px}:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-list--usp{font-family:Arial,sans-serif;margin-bottom:2rem;padding:0}.yoast-list--usp li{list-style:none!important;padding-right:1.2533333333rem;position:relative}.yoast-list--usp li:before{color:#77b227;content:"\f00c\0020";font-family:FontAwesome,Open Sans,Arial,sans-serif;right:0;position:absolute;top:0}.yoast .h1,.yoast .h2,.yoast .h3,.yoast .h4,.yoast .h5,.yoast .h6,.yoast h1,.yoast h2,.yoast h3,.yoast h4,.yoast h5,.yoast h6{display:block;font-family:Arial,sans-serif;font-weight:300;margin-top:0}.yoast .h1,.yoast h1{font-size:2.5em;letter-spacing:normal;line-height:3.68rem;margin-bottom:1.35rem}@media only screen and (min-width:30rem){.yoast .h1,.yoast h1{font-size:2.75em}}.yoast .h2,.yoast h2{font-size:1.88em;line-height:2.5rem;margin-bottom:1.2rem}.yoast .h2.tight,.yoast h2.tight{margin-bottom:.6rem}.yoast .h3,.yoast h3{font-size:1.25em;line-height:1.88rem;margin-bottom:.8rem}.yoast .h3.tight,.yoast h3.tight{margin-bottom:.4rem}@media only screen and (min-width:30rem){.yoast .h3,.yoast h3{font-size:1.375em}}@media only screen and (min-width:50rem){.yoast .h3,.yoast h3{font-size:1.5em}}.yoast .h4,.yoast .h5,.yoast .h6,.yoast h4,.yoast h5,.yoast h6{font-size:1.13em;font-weight:400;line-height:1.88rem;margin-bottom:.2rem}.yoast-button{background-color:initial;background-color:#dc5c04;border:0;color:#dc5c04;cursor:pointer;display:inline-block;font-family:Arial,sans-serif;font-size:1.1em;padding:.345em 1em .345em 1.5em;position:relative;text-decoration:none;width:100%}@media only screen and (min-width:30rem){.yoast-button{margin-left:1.36rem;max-height:2.86rem;width:auto}.yoast-button:after{border-bottom:1.44rem solid #0000;border-right:1.43rem solid #dc5c04;border-left:0;border-top:1.43rem solid #0000;content:"";height:0;position:absolute;left:-1.36rem;top:0;width:0}.yoast-button.left{margin-right:1.36rem;margin-left:0}.yoast-button.left:after{content:none}.yoast-button.left:before{border-bottom:1.44rem solid #0000;border-right:0;border-left:1.43rem solid #dc5c04;border-top:1.43rem solid #0000;content:"";height:0;right:-1.36rem;position:absolute;top:0;width:0}}.yoast-button.alignleft{margin:1rem 0 0 2.5rem!important}.yoast-button .arrow{display:none}.yoast-button+.yoast-button{margin-right:1.88rem;margin-top:1em}.yoast-button--full{width:100%}.yoast-button--full:after{content:none}.yoast-button.default{background-color:#dc5c04;color:#fff}.yoast-button.default:after{border-right-color:#dc5c04}.yoast-button.default:before{border-left-color:#dc5c04}.yoast-button a:focus,.yoast-button:hover{background-color:#f58223;color:#fff;text-decoration:underline}.yoast-button a:focus:after,.yoast-button:hover:after{border-right-color:#f58223}.yoast-button a:focus:before,.yoast-button:hover:before{border-left-color:#f58223}.yoast-button.academy{background-color:#5d237a;color:#fff}.yoast-button.academy:after{border-right-color:#5d237a}.yoast-button.academy:before{border-left-color:#5d237a}@media only screen and (max-width:20rem){.yoast-button.academy{background-color:#5d237a}}.yoast-button.academy--secondary{background-color:#a4286a;color:#fff}.yoast-button.academy--secondary:after{border-right-color:#a4286a}.yoast-button.academy--secondary:before{border-left-color:#a4286a}@media only screen and (max-width:20rem){.yoast-button.academy--secondary{background-color:#a4286a}}.yoast-button.software{background-color:#0075b3;color:#fff}.yoast-button.software:after{border-right-color:#0075b3}.yoast-button.software:before{border-left-color:#0075b3}.yoast-button.review{background-color:#009288;color:#fff}.yoast-button.review:after{border-right-color:#009288}.yoast-button.review:before{border-left-color:#009288}.yoast-button.about{background-color:#d93f69;color:#fff}.yoast-button.about:after{border-right-color:#d93f69}.yoast-button.about:before{border-left-color:#d93f69}.yoast_academy .yoast-button{background-color:#d93f69;color:#fff}.yoast_academy .yoast-button:after{border-right-color:#d93f69}.yoast_academy .yoast-button:before{border-left-color:#d93f69}.yoast_academy .yoast-button a:focus,.yoast_academy .yoast-button:hover{background-color:#d42a59;color:#fff;text-decoration:underline}.yoast_academy .yoast-button a:focus:after,.yoast_academy .yoast-button:hover:after{border-right-color:#d42a59}.yoast_academy .yoast-button a:focus:before,.yoast_academy .yoast-button:hover:before{border-left-color:#d42a59}.yoast_academy .yoast-button.dimmed,body .yoast-button.dimmed{background-color:#dcdcdc;color:#646464}.yoast_academy .yoast-button.dimmed:after,body .yoast-button.dimmed:after{border-right-color:#dcdcdc}.yoast_academy .yoast-button.dimmed:before,body .yoast-button.dimmed:before{border-left-color:#dcdcdc}.yoast_academy .yoast-button.dimmed a:focus,.yoast_academy .yoast-button.dimmed:hover,body .yoast-button.dimmed a:focus,body .yoast-button.dimmed:hover{background-color:#cdcdcd;color:#646464;text-decoration:underline}.yoast_academy .yoast-button.dimmed a:focus:after,.yoast_academy .yoast-button.dimmed:hover:after,body .yoast-button.dimmed a:focus:after,body .yoast-button.dimmed:hover:after{border-right-color:#cdcdcd}.yoast_academy .yoast-button.dimmed a:focus:before,.yoast_academy .yoast-button.dimmed:hover:before,body .yoast-button.dimmed a:focus:before,body .yoast-button.dimmed:hover:before{border-left-color:#cdcdcd}.yoast-button--noarrow:after{content:none}.yoast-button--naked{background-color:initial;border:none;padding:0}.yoast-button--naked:after{content:none}.yoast-button i.fa{font-size:140%;margin:4px 0 0 10px}.yoast-promoblock{border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin-bottom:1.88rem;padding:16px}.yoast-promoblock p{color:#000}.yoast-promoblock p:last-of-type{margin-bottom:0}.yoast-promoblock i.blockicon{bottom:10px;font-size:2.25em;padding:0 .5em 0 0;position:absolute;left:10px}.yoast-promoblock a img{border:1px solid #dcdcdc}.yoast-promoblock p a{font-weight:600!important;text-decoration:underline}.yoast-promoblock form a{font-weight:400!important;text-decoration:none}.yoast-promoblock .h4,.yoast-promoblock h4{margin-bottom:.7rem}.yoast-promoblock.link{border-color:#dc5c04}.yoast-promoblock.link a,.yoast-promoblock.link a:hover{color:#dc5c04}.yoast-promoblock--white{border-color:#fff!important}.product .yoast-promoblock{overflow:hidden}.yoast-promoblock--hometitle{background-color:#d93f6940;border-color:#fff!important;display:flex;font-size:16px;font-size:1rem;height:11em;line-height:1;margin:1rem auto 2rem;max-width:16em}@media only screen and (max-width:30rem){.yoast-promoblock--hometitle:after{content:none!important}}.yoast-promoblock--imageholder{margin-bottom:0;padding:0}.yoast-promoblock--imageholdersmall{position:absolute}.yoast-promoblock--imageholdersmall:first-child{right:4rem}.yoast-promoblock--imageholdersmall:last-child{top:4rem}@media only screen and (max-width:50rem){.yoast-promoblock h2{margin-bottom:0}}a.promoblock{color:#000}a.promoblock,a.promoblock:hover{text-decoration:none}.promoblockimage__holder{height:295px;position:relative;width:240px}.yoast{color:#000;font-family:Open Sans,Arial,sans-serif;font-size:1rem;letter-spacing:.01em;line-height:1.88}.yoast *,.yoast :after,.yoast :before{box-sizing:border-box}.yoast-hr{border:0;margin:0;padding-bottom:1.88rem;position:relative}.yoast-list--usp li:before{background:var(--yoast-svg-icon-check) no-repeat;background-position:right .3em;background-size:contain;content:"";height:100%;width:1em}.yoast-button--purple{background-color:#5d237a}.yoast-button-go-to:after{border:none;content:" \00BB";height:auto;position:static;left:auto;top:auto;width:auto}.yoast-button--extension{color:#fff;padding-right:.8em;padding-left:.8em;text-transform:uppercase}.yoast-button--extension+.yoast-button--extension-activated,.yoast-button--extension+.yoast-button--extension-not-activated{margin-right:0}.yoast-button--extension-activated:hover,.yoast-button--extension-installed:hover,.yoast-button--extension-not-activated:hover{text-decoration:none}.yoast-button--extension-installed{margin-left:.2rem}.yoast-button--extension-installed,.yoast-button--extension-installed:hover{background-color:#008a00}.yoast-button--extension-not-activated,.yoast-button--extension-not-activated:hover{background-color:#dc3232}.yoast-button--extension-activated,.yoast-button--extension-activated:hover{background-color:#008a00}.yoast-button-upsell{margin-bottom:1em;width:100%}@media only screen and (min-width:30rem){.yoast-button-upsell{margin-left:1.36rem;width:auto}}.yoast-promo-extensions{display:flex;flex-wrap:wrap;margin-right:-24px}.yoast-promo-extensions>h2{margin-bottom:32px;margin-right:32px;width:100%}.yoast-promo-extension{background-color:#fff;display:flex;flex-direction:column;margin-right:32px;max-width:340px}.yoast-promo-extension:first-child{margin-right:0}.yoast-promo-extension img{float:left;height:100px;margin-bottom:.8rem;width:100px}@media screen and (max-width:900px){.yoast-promo-extension img{display:none}}.yoast-promo-extension .yoast-button-container{margin-top:auto}.yoast-promo-extension .yoast-button-container div.yoast-button--extension{cursor:default}.yoast-promo-extension .yoast-button{font-size:.9rem;max-height:none;width:100%}.yoast-promo-extension .yoast-button--installed{color:#fff}.yoast-promo-extension .yoast-button--extension{font-size:.9rem;margin-top:0;text-align:center}.yoast-promo-extension .yoast-button--extension-installed{margin:0 0 0 2%;width:48%}.yoast-promo-extension .yoast-button--extension-activated,.yoast-promo-extension .yoast-button--extension-not-activated{margin-right:0;margin-left:0;width:48%}.yoast-promo-extension .yoast-button-upsell{width:100%}.yoast-promo-extension h3{color:#a4286a}@media screen and (max-width:900px){.yoast-promo-extension{max-width:none;width:100%}}.yoast-seo-premium-extension-sale-badge{margin-top:-30px}.yoast-seo-premium-extension-sale-badge span{background:#1f2937;border-radius:14px;color:#fcd34d;font-size:14px;font-weight:600;padding:6px 12px}.yoast-seo-premium-extension{background:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin:2em .5em 1.5em;max-width:712px;padding:16px}.yoast-seo-premium-extension h2{color:#a61e69;display:flex;font-size:1.5rem;justify-content:space-between;margin-top:16px}.yoast-seo-premium-extension img{margin-right:1rem}@media screen and (max-width:900px){.yoast-seo-premium-extension{max-width:none;width:calc(100% - 8px)}.yoast-seo-premium-extension img{display:none}}.yoast-seo-premium-extension:after,.yoast-seo-premium-extension:before{content:"";display:table}.yoast-seo-premium-extension:after{clear:both}.yoast-seo-premium-benefits__item{font-size:.9rem;font-weight:400;line-height:24px;margin-bottom:8px}.yoast-seo-premium-benefits__item span{color:#404040}.yoast-seo-premium-benefits__title{font-size:.9rem;font-weight:700;line-height:24px}.yoast-seo-premium-benefits__description{font-size:.9rem;font-weight:400;line-height:24px}.yoast-link--license,.yoast-link--more-info{color:#a4286a;font-weight:600}.yoast-link--license{margin:1em 0 0}.yoast-promo-extension .yoast-link--license{display:block;margin:1em 0 0}.yoast-link--license:after{content:" \00BB"}.yoast-link--more-info{background:var(--yoast-svg-icon-info);background-position:100%;background-repeat:no-repeat;background-size:1em;padding-right:calc(1em + 5px)}.yoast-link--more-info:after{content:" \00BB"}.yoast-promo-extension .yoast-link--more-info{background-position:100%;display:block;margin:0}.yoast-heading-highlight{color:#a4286a;font-weight:600}.yoast-money-back-guarantee{font-size:1.1em;font-style:italic}.yoast-license-status-active{background:#008a00;color:#fff;padding:3px 6px}.yoast-license-status-inactive{background:#dc3232;color:#fff;padding:3px 6px}.yoast-promoblock.secondary.yoast-promo-extension .yoast-button-container .yoast-subscription-discount{color:#64748b;font-size:12px;margin-bottom:8px;margin-top:-8px;text-align:center} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2280.css deleted file mode 100644 index 72482c56..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2280.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);left:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;right:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-right:16px;width:19px}.yoast-modal__menu{border-right:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-right:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-right:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;left:0;right:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-right:8px}.yoast .yoast-close{right:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-left:16px;margin-right:16px;padding-left:0;padding-right:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:left;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:right;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;left:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-right:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-right:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}#yoast-semrush-country-selector{border:none;position:relative}.yoast-related-keyphrases-modal__chart{display:block}.yoast-wordproof-modal{max-width:380px;text-align:center}.yoast-wordproof-modal-image{display:flex;justify-content:center;margin-block:40px}.yoast-wordproof-modal-svg__webhook-failed{width:100%}.yoast-wordproof-modal-svg__success{width:175px}.yoast-wordproof-modal-action{display:flex;justify-content:center;margin-bottom:10px;margin-top:40px}.yoast-wordproof-modal-action.yoast-wordproof-modal-action>button{padding-left:20px;padding-right:20px}:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-list--usp{font-family:Arial,sans-serif;margin-bottom:2rem;padding:0}.yoast-list--usp li{list-style:none!important;padding-left:1.2533333333rem;position:relative}.yoast-list--usp li:before{color:#77b227;content:"\f00c\0020";font-family:FontAwesome,Open Sans,Arial,sans-serif;left:0;position:absolute;top:0}.yoast .h1,.yoast .h2,.yoast .h3,.yoast .h4,.yoast .h5,.yoast .h6,.yoast h1,.yoast h2,.yoast h3,.yoast h4,.yoast h5,.yoast h6{display:block;font-family:Arial,sans-serif;font-weight:300;margin-top:0}.yoast .h1,.yoast h1{font-size:2.5em;letter-spacing:normal;line-height:3.68rem;margin-bottom:1.35rem}@media only screen and (min-width:30rem){.yoast .h1,.yoast h1{font-size:2.75em}}.yoast .h2,.yoast h2{font-size:1.88em;line-height:2.5rem;margin-bottom:1.2rem}.yoast .h2.tight,.yoast h2.tight{margin-bottom:.6rem}.yoast .h3,.yoast h3{font-size:1.25em;line-height:1.88rem;margin-bottom:.8rem}.yoast .h3.tight,.yoast h3.tight{margin-bottom:.4rem}@media only screen and (min-width:30rem){.yoast .h3,.yoast h3{font-size:1.375em}}@media only screen and (min-width:50rem){.yoast .h3,.yoast h3{font-size:1.5em}}.yoast .h4,.yoast .h5,.yoast .h6,.yoast h4,.yoast h5,.yoast h6{font-size:1.13em;font-weight:400;line-height:1.88rem;margin-bottom:.2rem}.yoast-button{background-color:initial;background-color:#dc5c04;border:0;color:#dc5c04;cursor:pointer;display:inline-block;font-family:Arial,sans-serif;font-size:1.1em;padding:.345em 1.5em .345em 1em;position:relative;text-decoration:none;width:100%}@media only screen and (min-width:30rem){.yoast-button{margin-right:1.36rem;max-height:2.86rem;width:auto}.yoast-button:after{border-bottom:1.44rem solid #0000;border-left:1.43rem solid #dc5c04;border-right:0;border-top:1.43rem solid #0000;content:"";height:0;position:absolute;right:-1.36rem;top:0;width:0}.yoast-button.left{margin-left:1.36rem;margin-right:0}.yoast-button.left:after{content:none}.yoast-button.left:before{border-bottom:1.44rem solid #0000;border-left:0;border-right:1.43rem solid #dc5c04;border-top:1.43rem solid #0000;content:"";height:0;left:-1.36rem;position:absolute;top:0;width:0}}.yoast-button.alignleft{margin:1rem 2.5rem 0 0!important}.yoast-button .arrow{display:none}.yoast-button+.yoast-button{margin-left:1.88rem;margin-top:1em}.yoast-button--full{width:100%}.yoast-button--full:after{content:none}.yoast-button.default{background-color:#dc5c04;color:#fff}.yoast-button.default:after{border-left-color:#dc5c04}.yoast-button.default:before{border-right-color:#dc5c04}.yoast-button a:focus,.yoast-button:hover{background-color:#f58223;color:#fff;text-decoration:underline}.yoast-button a:focus:after,.yoast-button:hover:after{border-left-color:#f58223}.yoast-button a:focus:before,.yoast-button:hover:before{border-right-color:#f58223}.yoast-button.academy{background-color:#5d237a;color:#fff}.yoast-button.academy:after{border-left-color:#5d237a}.yoast-button.academy:before{border-right-color:#5d237a}@media only screen and (max-width:20rem){.yoast-button.academy{background-color:#5d237a}}.yoast-button.academy--secondary{background-color:#a4286a;color:#fff}.yoast-button.academy--secondary:after{border-left-color:#a4286a}.yoast-button.academy--secondary:before{border-right-color:#a4286a}@media only screen and (max-width:20rem){.yoast-button.academy--secondary{background-color:#a4286a}}.yoast-button.software{background-color:#0075b3;color:#fff}.yoast-button.software:after{border-left-color:#0075b3}.yoast-button.software:before{border-right-color:#0075b3}.yoast-button.review{background-color:#009288;color:#fff}.yoast-button.review:after{border-left-color:#009288}.yoast-button.review:before{border-right-color:#009288}.yoast-button.about{background-color:#d93f69;color:#fff}.yoast-button.about:after{border-left-color:#d93f69}.yoast-button.about:before{border-right-color:#d93f69}.yoast_academy .yoast-button{background-color:#d93f69;color:#fff}.yoast_academy .yoast-button:after{border-left-color:#d93f69}.yoast_academy .yoast-button:before{border-right-color:#d93f69}.yoast_academy .yoast-button a:focus,.yoast_academy .yoast-button:hover{background-color:#d42a59;color:#fff;text-decoration:underline}.yoast_academy .yoast-button a:focus:after,.yoast_academy .yoast-button:hover:after{border-left-color:#d42a59}.yoast_academy .yoast-button a:focus:before,.yoast_academy .yoast-button:hover:before{border-right-color:#d42a59}.yoast_academy .yoast-button.dimmed,body .yoast-button.dimmed{background-color:#dcdcdc;color:#646464}.yoast_academy .yoast-button.dimmed:after,body .yoast-button.dimmed:after{border-left-color:#dcdcdc}.yoast_academy .yoast-button.dimmed:before,body .yoast-button.dimmed:before{border-right-color:#dcdcdc}.yoast_academy .yoast-button.dimmed a:focus,.yoast_academy .yoast-button.dimmed:hover,body .yoast-button.dimmed a:focus,body .yoast-button.dimmed:hover{background-color:#cdcdcd;color:#646464;text-decoration:underline}.yoast_academy .yoast-button.dimmed a:focus:after,.yoast_academy .yoast-button.dimmed:hover:after,body .yoast-button.dimmed a:focus:after,body .yoast-button.dimmed:hover:after{border-left-color:#cdcdcd}.yoast_academy .yoast-button.dimmed a:focus:before,.yoast_academy .yoast-button.dimmed:hover:before,body .yoast-button.dimmed a:focus:before,body .yoast-button.dimmed:hover:before{border-right-color:#cdcdcd}.yoast-button--noarrow:after{content:none}.yoast-button--naked{background-color:initial;border:none;padding:0}.yoast-button--naked:after{content:none}.yoast-button i.fa{font-size:140%;margin:4px 10px 0 0}.yoast-promoblock{border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin-bottom:1.88rem;padding:16px}.yoast-promoblock p{color:#000}.yoast-promoblock p:last-of-type{margin-bottom:0}.yoast-promoblock i.blockicon{bottom:10px;font-size:2.25em;padding:0 0 0 .5em;position:absolute;right:10px}.yoast-promoblock a img{border:1px solid #dcdcdc}.yoast-promoblock p a{font-weight:600!important;text-decoration:underline}.yoast-promoblock form a{font-weight:400!important;text-decoration:none}.yoast-promoblock .h4,.yoast-promoblock h4{margin-bottom:.7rem}.yoast-promoblock.link{border-color:#dc5c04}.yoast-promoblock.link a,.yoast-promoblock.link a:hover{color:#dc5c04}.yoast-promoblock--white{border-color:#fff!important}.product .yoast-promoblock{overflow:hidden}.yoast-promoblock--hometitle{background-color:#d93f6940;border-color:#fff!important;display:flex;font-size:16px;font-size:1rem;height:11em;line-height:1;margin:1rem auto 2rem;max-width:16em}@media only screen and (max-width:30rem){.yoast-promoblock--hometitle:after{content:none!important}}.yoast-promoblock--imageholder{margin-bottom:0;padding:0}.yoast-promoblock--imageholdersmall{position:absolute}.yoast-promoblock--imageholdersmall:first-child{left:4rem}.yoast-promoblock--imageholdersmall:last-child{top:4rem}@media only screen and (max-width:50rem){.yoast-promoblock h2{margin-bottom:0}}a.promoblock{color:#000}a.promoblock,a.promoblock:hover{text-decoration:none}.promoblockimage__holder{height:295px;position:relative;width:240px}.yoast{color:#000;font-family:Open Sans,Arial,sans-serif;font-size:1rem;letter-spacing:.01em;line-height:1.88}.yoast *,.yoast :after,.yoast :before{box-sizing:border-box}.yoast-hr{border:0;margin:0;padding-bottom:1.88rem;position:relative}.yoast-list--usp li:before{background:var(--yoast-svg-icon-check) no-repeat;background-position:left .3em;background-size:contain;content:"";height:100%;width:1em}.yoast-button--purple{background-color:#5d237a}.yoast-button-go-to:after{border:none;content:" \00BB";height:auto;position:static;right:auto;top:auto;width:auto}.yoast-button--extension{color:#fff;padding-left:.8em;padding-right:.8em;text-transform:uppercase}.yoast-button--extension+.yoast-button--extension-activated,.yoast-button--extension+.yoast-button--extension-not-activated{margin-left:0}.yoast-button--extension-activated:hover,.yoast-button--extension-installed:hover,.yoast-button--extension-not-activated:hover{text-decoration:none}.yoast-button--extension-installed{margin-right:.2rem}.yoast-button--extension-installed,.yoast-button--extension-installed:hover{background-color:#008a00}.yoast-button--extension-not-activated,.yoast-button--extension-not-activated:hover{background-color:#dc3232}.yoast-button--extension-activated,.yoast-button--extension-activated:hover{background-color:#008a00}.yoast-button-upsell{margin-bottom:1em;width:100%}@media only screen and (min-width:30rem){.yoast-button-upsell{margin-right:1.36rem;width:auto}}.yoast-promo-extensions{display:flex;flex-wrap:wrap;margin-left:-24px}.yoast-promo-extensions>h2{margin-bottom:32px;margin-left:32px;width:100%}.yoast-promo-extension{background-color:#fff;display:flex;flex-direction:column;margin-left:32px;max-width:340px}.yoast-promo-extension:first-child{margin-left:0}.yoast-promo-extension img{float:right;height:100px;margin-bottom:.8rem;width:100px}@media screen and (max-width:900px){.yoast-promo-extension img{display:none}}.yoast-promo-extension .yoast-button-container{margin-top:auto}.yoast-promo-extension .yoast-button-container div.yoast-button--extension{cursor:default}.yoast-promo-extension .yoast-button{font-size:.9rem;max-height:none;width:100%}.yoast-promo-extension .yoast-button--installed{color:#fff}.yoast-promo-extension .yoast-button--extension{font-size:.9rem;margin-top:0;text-align:center}.yoast-promo-extension .yoast-button--extension-installed{margin:0 2% 0 0;width:48%}.yoast-promo-extension .yoast-button--extension-activated,.yoast-promo-extension .yoast-button--extension-not-activated{margin-left:0;margin-right:0;width:48%}.yoast-promo-extension .yoast-button-upsell{width:100%}.yoast-promo-extension h3{color:#a4286a}@media screen and (max-width:900px){.yoast-promo-extension{max-width:none;width:100%}}.yoast-seo-premium-extension-sale-badge{margin-top:-30px}.yoast-seo-premium-extension-sale-badge span{background:#1f2937;border-radius:14px;color:#fcd34d;font-size:14px;font-weight:600;padding:6px 12px}.yoast-seo-premium-extension{background:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin:2em .5em 1.5em;max-width:712px;padding:16px}.yoast-seo-premium-extension h2{color:#a61e69;display:flex;font-size:1.5rem;justify-content:space-between;margin-top:16px}.yoast-seo-premium-extension img{margin-left:1rem}@media screen and (max-width:900px){.yoast-seo-premium-extension{max-width:none;width:calc(100% - 8px)}.yoast-seo-premium-extension img{display:none}}.yoast-seo-premium-extension:after,.yoast-seo-premium-extension:before{content:"";display:table}.yoast-seo-premium-extension:after{clear:both}.yoast-seo-premium-benefits__item{font-size:.9rem;font-weight:400;line-height:24px;margin-bottom:8px}.yoast-seo-premium-benefits__item span{color:#404040}.yoast-seo-premium-benefits__title{font-size:.9rem;font-weight:700;line-height:24px}.yoast-seo-premium-benefits__description{font-size:.9rem;font-weight:400;line-height:24px}.yoast-link--license,.yoast-link--more-info{color:#a4286a;font-weight:600}.yoast-link--license{margin:1em 0 0}.yoast-promo-extension .yoast-link--license{display:block;margin:1em 0 0}.yoast-link--license:after{content:" \00BB"}.yoast-link--more-info{background:var(--yoast-svg-icon-info);background-position:0;background-repeat:no-repeat;background-size:1em;padding-left:calc(1em + 5px)}.yoast-link--more-info:after{content:" \00BB"}.yoast-promo-extension .yoast-link--more-info{background-position:0;display:block;margin:0}.yoast-heading-highlight{color:#a4286a;font-weight:600}.yoast-money-back-guarantee{font-size:1.1em;font-style:italic}.yoast-license-status-active{background:#008a00;color:#fff;padding:3px 6px}.yoast-license-status-inactive{background:#dc3232;color:#fff;padding:3px 6px}.yoast-promoblock.secondary.yoast-promo-extension .yoast-button-container .yoast-subscription-discount{color:#64748b;font-size:12px;margin-bottom:8px;margin-top:-8px;text-align:center} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2280-rtl.css deleted file mode 100644 index 743427bd..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.wpseo_content_wrapper{display:table;table-layout:fixed;width:100%}.wpseo_content_cell{display:table-cell;height:500px;margin:0;padding:0;vertical-align:top}#wpseo_content_top{width:100%}tr.yst_row{margin:5px 0 0;padding:5px 0 0}#sidebar-container{padding-right:20px;width:300px}tr.yst_row.even{background-color:#f6f6f6}.wpseo_content_wrapper label.select,.wpseo_content_wrapper label.textinput{word-wrap:break-word;float:right;margin:5px 0;width:200px}.wpseo_content_wrapper label.select.error,.wpseo_content_wrapper label.textinput.error{color:#dc3232;font-weight:700}.wpseo_content_wrapper .yoast-inline-label{display:inline-block;float:none;margin:0 0 8px}.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper select,.wpseo_content_wrapper textarea{width:400px}.wpseo_content_wrapper input.number{width:100px}.wpseo_content_wrapper input.large-text,.wpseo_content_wrapper textarea.large-text{width:99%}.wpseo_content_wrapper .select2-container,.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper select.select,.wpseo_content_wrapper textarea.textinput{margin:0 0 15px}.wpseo_content_wrapper input.textinput[aria-invalid=true]{background:#f9dcdc url(../../images/error-icon.svg) no-repeat calc(100% - (100% - 6px));background-size:12px;border:1px solid #dc3232;color:#000;padding-left:24px}.wpseo_content_wrapper input.textinput[aria-invalid=true][aria-describedby]{margin-bottom:.5rem}.wpseo_content_wrapper .yoast-input-validation__error-description{color:#8f1919;margin:0 0 1rem;padding-right:200px;width:400px}.wpseo_content_wrapper input.checkbox,.wpseo_content_wrapper input.checkbox.double,.wpseo_content_wrapper input.radio{margin:6px 0 6px 10px}.wpseo_content_wrapper .textinput.metadesc{height:50px}.wpseo_content_wrapper textarea.import{height:100px;width:500px}.wpseo_content_wrapper p.desc{margin:6px 0 10px;padding:0 25px 8px 0}.wpseo_content_wrapper div.desc.label,.wpseo_content_wrapper p.desc.label{margin:0 0 20px;padding:0 200px 10px 0}.wpseo_content_wrapper h4{clear:both;margin:1.2em 0 .5em}.wpseo_content_wrapper .postbox{margin:10px 0 0 10px}.wpseo_content_wrapper .postbox form{line-height:150%}.wpseo_content_wrapper .text{width:250px}.wpseo_content_wrapper .correct{background-color:green;color:#fff;padding:5px}.wpseo_content_wrapper .wrong{background-color:#dc3232;color:#fff;padding:5px}.wpseo_content_wrapper .wrong code{color:#000;padding:3px 8px}.wpseo_content_wrapper .button.fixit{float:left;margin:0 5px}.wpseo_content_wrapper .button.checkit{float:left;margin:0 5px;padding:5px 8px}.wpseo_content_wrapper .disabled-note{color:#888;margin:0 0 8px}.wpseo_content_wrapper #separator{margin:1em 0 0}.wpseo_content_wrapper #separator input.radio{height:1px;right:-9999em;position:absolute;width:1px}.wpseo_content_wrapper #separator input.radio+label{border:1px solid #ccc;cursor:pointer;float:right;font-family:Arial,Helvetica,sans-serif!important;font-size:18px!important;line-height:24px;margin:.5em 0 0 5px!important;padding:9px 6px;text-align:center;width:30px!important}.wpseo_content_wrapper #separator input.radio:checked+label{background-color:#fff;border:3px solid #a4286a;padding:7px 4px}.wpseo_content_wrapper #separator input.radio:focus+label{outline:2px solid #5b9dd9}.wpseo_content_wrapper .svg-container{text-align:center}.wpseo_content_wrapper .svg-container .dashicons{font-size:100px;height:100px;width:200px}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger{font-size:1.0625rem;padding:16px;width:100%}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger:focus{box-shadow:0 0 3px #084a67cc;outline:1px solid #0066cd;outline-offset:-1px}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger:active{box-shadow:none}.wpseo_content_wrapper .paper.tab-block h2.collapsible-header{margin:0!important;padding:0!important}.wpseo_content_wrapper .paper.tab-block.metabox button.toggleable-container-trigger{color:#555}.wpseo_content_wrapper .paper.tab-block.metabox.wpseotab{border:0;padding:0}.wpseo_content_wrapper .paper.tab-block .paper-container{padding:16px}.wpseo_content_wrapper .paper.tab-block.has-paper-container-no-top-padding .paper-container{padding-top:0}.wpseo_content_wrapper .paper.tab-block .paper-container:first-child{margin-top:0}.wpseo_content_wrapper .paper.tab-block .paper-title{padding:16px}.wpseo_content_wrapper .paper.tab-block .paper-title h2{margin:0}.wpseo_content_wrapper .paper.tab-block .tab-block:first-child{margin-top:0}.wpseo_content_wrapper .wpseo-collapsible-container{background-color:#fff;border-bottom:1px solid #e2e4e7;border-top:1px solid #e2e4e7;margin-top:-1px}.wpseo_content_wrapper .toggleable-container-trigger{background:none;border:0;cursor:pointer;padding:0;text-align:right;width:100%}.wpseo_content_wrapper .toggleable-container-icon{float:left;height:20px;position:relative;width:20px}.wpseo_content_wrapper .toggleable-container-trigger .toggleable-container-icon:after{content:"";display:block;right:-4px;padding:14px;position:absolute;top:-4px}.wpseo_content_wrapper .toggleable-container-hidden{display:none}.wpseo_content_wrapper h3{font-size:1.15em;margin:1em 0 .5em}.wpseo_content_wrapper h3.h2{font-size:1.3em}.wpseo_content_wrapper li,.wpseo_content_wrapper p{max-width:600px}.wpseo_content_wrapper .notice p,.yoast .search-box,.yoast-container .container,.yoast-notification p{max-width:none}table.wpseo th{text-align:right}#wpseo-tabs+.notice{margin-top:1.5em}.wpseo-variable-warning-element{border:1px solid #c62d2d!important}.wpseo-variable-warning{clear:both;color:#c62d2d;margin:5px 0 0;padding:5px}.wpseo-variable-warning code{color:#b02828}.wpseo-variable-warning a{color:#c62d2d}.wpseo_content_wrapper h1.wpseo-redirect-url-title{font-size:1.3em;margin:1em 0 .5em}table.yoast_help{border-collapse:collapse;width:100%}table.yoast_help,table.yoast_help td,table.yoast_help th{border:1px solid #ddd;color:#444}table.yoast_help td,table.yoast_help th{padding:5px 10px;text-align:right;vertical-align:top}table.yoast_help tr{background-color:#f1f1f1}table.yoast_help tr:nth-child(2n){background-color:#fbfbfe}table.yoast_help tr:hover{background-color:#ddd}table.yoast_help thead tr,table.yoast_help thead tr:hover{background-color:#fff}table.yoast_help .yoast-variable-name{font-weight:600;white-space:nowrap}table.yoast_help .yoast-variable-desc{min-width:300px}.yoast-notice-blocking-files code{color:#000;line-height:2}.yoast-notice-blocking-files .button{margin:.5em 0}.wpseo_content_wrapper .yoast-blocking-files-error p{max-width:none}.wpseotab{display:none}.wpseotab.active{display:block}.wpseotab p.expl{margin-right:6px}.wpseotab .tab-block{display:block;margin:30px 0}.wpseotab p.expl strong{font-size:115%}#wpseo-debug-info{background-color:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px #0000000a;clear:both;margin:20px 0 0;padding:20px 20px 0}#wpseo-debug-info h2{cursor:auto;margin:0}#wpseo-debug-info .wpseo-debug-heading{font-size:1em}#wpseo-debug-info .wpseo-debug{color:#c00;display:inline-block;padding-right:20px}input.wpseo-new-title,textarea.wpseo-new-metadesc{max-width:100%;width:100%}body.toplevel_page_wpseo_dashboard .wp-badge{background:#0000 url(../../packages/js/images/Yoast_SEO_Icon.svg) no-repeat 50% 10px;background-size:140px 140px;box-shadow:none}#wpseo_progressbar{border:1px solid #006691;height:25px}#wpseo_progressbar .ui-progressbar-value{background:#006691;height:25px}.wpseo-progressbar-wrapper{display:inline;width:100%}.wpseo-progressbar{border:1px solid #006691;display:block;height:25px;width:100%}.wpseo-progressbar .ui-progressbar-value{background:#006691;height:25px}.yoast-sidebar__title{border-bottom:1px solid #a4286a;box-sizing:border-box;color:#a4286a;line-height:19px;margin:5px 0;padding:10px 0;text-align:right;width:100%}.yoast-sidebar__product{background:#a61e69;border-radius:8px;color:#fff;margin-top:34px;padding:24px}.yoast-sidebar__product h2{color:#fff;font-size:22px;font-weight:700}.yoast-get-premium-title{line-height:27px;margin-bottom:12px;margin-top:0}.yoast-get-premium-title span{white-space:nowrap}.yoast-sidebar__product .product-image{margin:-50px auto 16px;max-height:75px;max-width:75px;position:relative;z-index:2}.yoast-sidebar__product .product-image img{border:1px solid #fff;border-radius:12px 12px 12px 0;overflow:hidden}.yoast-sidebar__product p{font-size:1rem;margin-bottom:12px;margin-top:0}.yoast-sidebar__product .yoast-price-micro-copy{font-size:12px;font-weight:300;line-height:20px;margin-bottom:16px;text-align:center}.yoast-sidebar__product .yoast-upsell-hr{border-color:#cd82ab;border-top:1px;margin-bottom:16px}.yoast-sidebar__product .plugin-buy-button .yoast-button-upsell{width:100%}.yoast-sidebar__product .review-container{margin-top:16px}.yoast-sidebar__product .review-container a{color:#fff;text-decoration:none}.yoast-sidebar__product .review-container a .claim{color:#fff;display:block;margin-bottom:12px}.yoast-sidebar__product .review-container .title{color:#fff;font-weight:500;margin-bottom:8px}.yoast-sidebar__product .review-container .title:hover{text-decoration:underline}.yoast-sidebar__product .review-container .rating{display:flex;gap:5px}.yoast-sidebar__product .review-container .rating img{max-height:22px;max-width:22px}.yoast-sidebar__product .review-container .rating .rating-text{font-size:16px;font-weight:600}.yoast-sidebar__product .sidebar__sale_banner_container{margin-right:-24px;margin-top:-40px;overflow-x:hidden;overflow-y:initial;width:calc(100% + 48px)}.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner{background:#000;box-shadow:0 -1px 4px 0 #fcd34d,0 1px 4px 0 #fcd34d,0 -1px 0 0 #fcd34d,0 1px 0 0 #fcd34d;color:#fcd34d;font-size:20px;font-weight:500;letter-spacing:.5px;line-height:30px;margin-bottom:20px;margin-right:-30px;margin-top:20px;padding:7px 0;text-align:center;transform:rotate(5deg);width:calc(100% + 60px);z-index:1}.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner .banner_text{display:inline-block;margin:0 40px}.yoast-sidebar__product .sidebar__sale_text{border-top:1px solid #fff;font-style:italic;text-align:center}.yoast-sidebar__product .sidebar__sale_text p{font-size:12.5px;margin:12.5px 0}.yoast-sidebar__section{background-color:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin:10px 0 20px;padding:16px}.yoast-sidebar__section h2{color:#a4286a;margin-top:0}.yoast-sidebar__section a{color:#0085ba}.yoast-sidebar__section ul{position:relative}.yoast-sidebar__section li{list-style:none;margin-right:20px}.yoast-sidebar__section li:before{content:"+";font-weight:700;right:0;position:absolute}.yoast-sidebar__section div{margin:10px 0 20px;position:relative}.yoast-sidebar__section div img{float:left;height:70px;margin:0 10px 0 0;width:70px}.yoast-sidebar__section div img.alignleft{float:right;margin:0 0 0 10px}.yoast-sidebar__section div p{float:right;margin:0;width:100%}.yoast_premium_upsell{background-color:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin-top:2em;max-width:715px;overflow:hidden}.yoast_premium_upsell--container{padding:16px}.black-friday-container{background-color:#1f2937;border-bottom:2px solid #fcd34d;display:flex;padding:8px 16px}.black-friday-container span{color:#fcd34d;font-size:1.2rem;font-weight:600}.yoast_premium_upsell--header{color:#a4286a;font-size:1.7em;font-weight:700;margin-top:.3em}.yoast_premium_upsell--motivation{display:flex;flex-wrap:wrap}.yoast_premium_upsell--motivation li{flex:0 0 50%;list-style:none}.yoast_premium_upsell--argument{padding:0 20px 0 8px}.yoast_premium_upsell--argument:before{content:"+";font-weight:700;right:-16px;margin-left:-10px;position:relative;top:-1px}@media screen and (max-width:480px){.yoast_premium_upsell--motivation{display:block}}.yoast-variable-desc{min-width:300px}.yoast-table-scrollable,.yoast-table-scrollable td,.yoast-table-scrollable th{box-sizing:border-box}.yoast-table-scrollable__container.yoast-has-scroll{overflow:hidden;position:relative}.yoast-table-scrollable__container.yoast-has-scroll:after{border-radius:0 10px 10px 0/0 50% 50% 0;box-shadow:5px 0 10px #00000040;content:"";height:calc(100% - 16px);right:100%;position:absolute;top:0;width:50px}.yoast-table-scrollable__container.yoast-has-scroll .yoast-table-scrollable__inner{overflow-x:scroll;padding-bottom:16px}.yoast-table-scrollable__hintwrapper{display:none}.yoast-table-scrollable__hintwrapper.yoast-has-scroll{display:block;margin:1em 0;text-align:center}.yoast-has-scroll .yoast-table-scrollable__hint{display:inline-block}.yoast-has-scroll .yoast-table-scrollable__hint:before{content:"\21c4";display:inline-block;font-size:20px;line-height:inherit;margin-left:10px;vertical-align:text-top}.yoast-styled-select{align-items:center;display:inline-flex;margin-bottom:1em;position:relative}.yoast-styled-select:after,.yoast-styled-select:before{bottom:0;content:"";pointer-events:none;position:absolute;top:0}.yoast-styled-select:before{left:0;width:28px}.yoast-styled-select:after{border-top:4px solid #0000;border-color:#555 #0000 #0000;border-style:solid;border-width:5px 4px 0;height:0;margin:auto;left:6px;width:0;z-index:1}.yoast-styled-select select{-webkit-appearance:none;appearance:none;background:#0000;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;color:#32373c;height:28px;line-height:1;margin:0;max-width:100%;padding:4px 8px 4px 32px}.yoast-styled-select select.error{border-color:#dc3232;border-width:2px}.wpseo_content_wrapper .yoast-styled-select select.select{margin:0}.yoast-styled-select select:focus{border-color:#5b9dd9}.yoast-styled-select select:-moz-focusring{color:#0000;text-shadow:0 0 0 #32373c}.yoast-styled-select select[disabled]{opacity:.75}.yoast-styled-select select::-ms-expand{display:none}@media screen and (max-width:1024px){.wpseo_content_cell,.wpseo_content_wrapper{display:block;height:auto}#wpseo_content_top{width:auto}#sidebar-container{display:flex;gap:.7rem;padding:0;width:auto}.yoast-sidebar__product .sidebar__sale_banner_container{overflow-y:hidden}#sidebar-container .yoast-sidebar__section{margin-top:5rem}.yoast-sidebar__product-list{border-bottom:1px solid #ddd;display:flex}.yoast-sidebar__product-list div p{word-wrap:break-word;width:calc(100% - 50px)}.yoast-sidebar__product-list .yoast-sidebar__section{border-bottom:none}.yoast-sidebar__product-list .yoast-sidebar__section:first-child{margin-left:40px}}@media screen and (max-width:782px){.wpseo_content_wrapper label.select,.wpseo_content_wrapper label.textinput{display:inline-block;float:none;width:auto}.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper textarea,.wpseo_content_wrapper textarea.textinput{display:block;width:100%}.wpseo_content_wrapper .select2-container,.wpseo_content_wrapper select,.wpseo_content_wrapper select.select{display:block;margin:0 0 5px;max-width:100%}.wpseo_content_wrapper div.desc.label,.wpseo_content_wrapper p.desc.label{padding-right:0}.wpseo_content_wrapper .textinput[aria-invalid=true][aria-describedby]+br{display:none}.wpseo_content_wrapper .yoast-input-validation__error-description{padding-right:0;width:auto}}@media screen and (max-width:600px){.yoast-sidebar__product-list{border-bottom:none;display:block}.yoast-sidebar__product-list .yoast-sidebar__section{border-bottom:1px solid #ddd}.yoast-sidebar__product-list .yoast-sidebar__section p{word-wrap:break-word;padding-right:50px;width:calc(100% - 50px)}}@media screen and (max-width:500px){.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner{transform:rotate(4deg)}#sidebar-container{display:block}#sidebar-container .yoast-sidebar__section{margin-top:20px}body.toplevel_page_wpseo_dashboard .wp-badge{background-color:#a4286a;background-size:100px 100px;box-shadow:0 1px 3px #0003;padding-top:80px}}.wpseo-checkmark-ok-icon{background:var(--yoast-svg-icon-check-ok) no-repeat;background-size:18px;float:right;height:18px;margin-left:5px;vertical-align:top;width:18px}.yoast-settings-section:not(:last-child){margin-bottom:40px}.yoast-settings-section .yoast-field-group__title .yoast_help.yoast-help-link{margin:-6px 2px 0 0}#yoast-og-default-image-select .yoast-field-group__title{display:none}.yoast-settings-section.yoast-settings-section-disabled{border:1px solid #ccc;padding:16px;position:relative}.yoast-settings-section.yoast-settings-section-disabled>*{opacity:.5}.yoast-settings-section.yoast-settings-section-disabled .yoast-settings-section-upsell{align-items:center;bottom:0;display:flex;justify-content:center;right:0;opacity:1;position:absolute;left:0;top:0}@keyframes yoast-spin{0%{transform:rotate(0deg)}to{transform:rotate(-1turn)}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2280.css deleted file mode 100644 index 75d3bd5d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2280.css +++ /dev/null @@ -1 +0,0 @@ -:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.wpseo_content_wrapper{display:table;table-layout:fixed;width:100%}.wpseo_content_cell{display:table-cell;height:500px;margin:0;padding:0;vertical-align:top}#wpseo_content_top{width:100%}tr.yst_row{margin:5px 0 0;padding:5px 0 0}#sidebar-container{padding-left:20px;width:300px}tr.yst_row.even{background-color:#f6f6f6}.wpseo_content_wrapper label.select,.wpseo_content_wrapper label.textinput{word-wrap:break-word;float:left;margin:5px 0;width:200px}.wpseo_content_wrapper label.select.error,.wpseo_content_wrapper label.textinput.error{color:#dc3232;font-weight:700}.wpseo_content_wrapper .yoast-inline-label{display:inline-block;float:none;margin:0 0 8px}.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper select,.wpseo_content_wrapper textarea{width:400px}.wpseo_content_wrapper input.number{width:100px}.wpseo_content_wrapper input.large-text,.wpseo_content_wrapper textarea.large-text{width:99%}.wpseo_content_wrapper .select2-container,.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper select.select,.wpseo_content_wrapper textarea.textinput{margin:0 0 15px}.wpseo_content_wrapper input.textinput[aria-invalid=true]{background:#f9dcdc url(../../images/error-icon.svg) no-repeat calc(100% - 6px);background-size:12px;border:1px solid #dc3232;color:#000;padding-right:24px}.wpseo_content_wrapper input.textinput[aria-invalid=true][aria-describedby]{margin-bottom:.5rem}.wpseo_content_wrapper .yoast-input-validation__error-description{color:#8f1919;margin:0 0 1rem;padding-left:200px;width:400px}.wpseo_content_wrapper input.checkbox,.wpseo_content_wrapper input.checkbox.double,.wpseo_content_wrapper input.radio{margin:6px 10px 6px 0}.wpseo_content_wrapper .textinput.metadesc{height:50px}.wpseo_content_wrapper textarea.import{height:100px;width:500px}.wpseo_content_wrapper p.desc{margin:6px 0 10px;padding:0 0 8px 25px}.wpseo_content_wrapper div.desc.label,.wpseo_content_wrapper p.desc.label{margin:0 0 20px;padding:0 0 10px 200px}.wpseo_content_wrapper h4{clear:both;margin:1.2em 0 .5em}.wpseo_content_wrapper .postbox{margin:10px 10px 0 0}.wpseo_content_wrapper .postbox form{line-height:150%}.wpseo_content_wrapper .text{width:250px}.wpseo_content_wrapper .correct{background-color:green;color:#fff;padding:5px}.wpseo_content_wrapper .wrong{background-color:#dc3232;color:#fff;padding:5px}.wpseo_content_wrapper .wrong code{color:#000;padding:3px 8px}.wpseo_content_wrapper .button.fixit{float:right;margin:0 5px}.wpseo_content_wrapper .button.checkit{float:right;margin:0 5px;padding:5px 8px}.wpseo_content_wrapper .disabled-note{color:#888;margin:0 0 8px}.wpseo_content_wrapper #separator{margin:1em 0 0}.wpseo_content_wrapper #separator input.radio{height:1px;left:-9999em;position:absolute;width:1px}.wpseo_content_wrapper #separator input.radio+label{border:1px solid #ccc;cursor:pointer;float:left;font-family:Arial,Helvetica,sans-serif!important;font-size:18px!important;line-height:24px;margin:.5em 5px 0 0!important;padding:9px 6px;text-align:center;width:30px!important}.wpseo_content_wrapper #separator input.radio:checked+label{background-color:#fff;border:3px solid #a4286a;padding:7px 4px}.wpseo_content_wrapper #separator input.radio:focus+label{outline:2px solid #5b9dd9}.wpseo_content_wrapper .svg-container{text-align:center}.wpseo_content_wrapper .svg-container .dashicons{font-size:100px;height:100px;width:200px}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger{font-size:1.0625rem;padding:16px;width:100%}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger:focus{box-shadow:0 0 3px #084a67cc;outline:1px solid #0066cd;outline-offset:-1px}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger:active{box-shadow:none}.wpseo_content_wrapper .paper.tab-block h2.collapsible-header{margin:0!important;padding:0!important}.wpseo_content_wrapper .paper.tab-block.metabox button.toggleable-container-trigger{color:#555}.wpseo_content_wrapper .paper.tab-block.metabox.wpseotab{border:0;padding:0}.wpseo_content_wrapper .paper.tab-block .paper-container{padding:16px}.wpseo_content_wrapper .paper.tab-block.has-paper-container-no-top-padding .paper-container{padding-top:0}.wpseo_content_wrapper .paper.tab-block .paper-container:first-child{margin-top:0}.wpseo_content_wrapper .paper.tab-block .paper-title{padding:16px}.wpseo_content_wrapper .paper.tab-block .paper-title h2{margin:0}.wpseo_content_wrapper .paper.tab-block .tab-block:first-child{margin-top:0}.wpseo_content_wrapper .wpseo-collapsible-container{background-color:#fff;border-bottom:1px solid #e2e4e7;border-top:1px solid #e2e4e7;margin-top:-1px}.wpseo_content_wrapper .toggleable-container-trigger{background:none;border:0;cursor:pointer;padding:0;text-align:left;width:100%}.wpseo_content_wrapper .toggleable-container-icon{float:right;height:20px;position:relative;width:20px}.wpseo_content_wrapper .toggleable-container-trigger .toggleable-container-icon:after{content:"";display:block;left:-4px;padding:14px;position:absolute;top:-4px}.wpseo_content_wrapper .toggleable-container-hidden{display:none}.wpseo_content_wrapper h3{font-size:1.15em;margin:1em 0 .5em}.wpseo_content_wrapper h3.h2{font-size:1.3em}.wpseo_content_wrapper li,.wpseo_content_wrapper p{max-width:600px}.wpseo_content_wrapper .notice p,.yoast .search-box,.yoast-container .container,.yoast-notification p{max-width:none}table.wpseo th{text-align:left}#wpseo-tabs+.notice{margin-top:1.5em}.wpseo-variable-warning-element{border:1px solid #c62d2d!important}.wpseo-variable-warning{clear:both;color:#c62d2d;margin:5px 0 0;padding:5px}.wpseo-variable-warning code{color:#b02828}.wpseo-variable-warning a{color:#c62d2d}.wpseo_content_wrapper h1.wpseo-redirect-url-title{font-size:1.3em;margin:1em 0 .5em}table.yoast_help{border-collapse:collapse;width:100%}table.yoast_help,table.yoast_help td,table.yoast_help th{border:1px solid #ddd;color:#444}table.yoast_help td,table.yoast_help th{padding:5px 10px;text-align:left;vertical-align:top}table.yoast_help tr{background-color:#f1f1f1}table.yoast_help tr:nth-child(2n){background-color:#fbfbfe}table.yoast_help tr:hover{background-color:#ddd}table.yoast_help thead tr,table.yoast_help thead tr:hover{background-color:#fff}table.yoast_help .yoast-variable-name{font-weight:600;white-space:nowrap}table.yoast_help .yoast-variable-desc{min-width:300px}.yoast-notice-blocking-files code{color:#000;line-height:2}.yoast-notice-blocking-files .button{margin:.5em 0}.wpseo_content_wrapper .yoast-blocking-files-error p{max-width:none}.wpseotab{display:none}.wpseotab.active{display:block}.wpseotab p.expl{margin-left:6px}.wpseotab .tab-block{display:block;margin:30px 0}.wpseotab p.expl strong{font-size:115%}#wpseo-debug-info{background-color:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px #0000000a;clear:both;margin:20px 0 0;padding:20px 20px 0}#wpseo-debug-info h2{cursor:auto;margin:0}#wpseo-debug-info .wpseo-debug-heading{font-size:1em}#wpseo-debug-info .wpseo-debug{color:#c00;display:inline-block;padding-left:20px}input.wpseo-new-title,textarea.wpseo-new-metadesc{max-width:100%;width:100%}body.toplevel_page_wpseo_dashboard .wp-badge{background:#0000 url(../../packages/js/images/Yoast_SEO_Icon.svg) no-repeat 50% 10px;background-size:140px 140px;box-shadow:none}#wpseo_progressbar{border:1px solid #006691;height:25px}#wpseo_progressbar .ui-progressbar-value{background:#006691;height:25px}.wpseo-progressbar-wrapper{display:inline;width:100%}.wpseo-progressbar{border:1px solid #006691;display:block;height:25px;width:100%}.wpseo-progressbar .ui-progressbar-value{background:#006691;height:25px}.yoast-sidebar__title{border-bottom:1px solid #a4286a;box-sizing:border-box;color:#a4286a;line-height:19px;margin:5px 0;padding:10px 0;text-align:left;width:100%}.yoast-sidebar__product{background:#a61e69;border-radius:8px;color:#fff;margin-top:34px;padding:24px}.yoast-sidebar__product h2{color:#fff;font-size:22px;font-weight:700}.yoast-get-premium-title{line-height:27px;margin-bottom:12px;margin-top:0}.yoast-get-premium-title span{white-space:nowrap}.yoast-sidebar__product .product-image{margin:-50px auto 16px;max-height:75px;max-width:75px;position:relative;z-index:2}.yoast-sidebar__product .product-image img{border:1px solid #fff;border-radius:12px 12px 0 12px;overflow:hidden}.yoast-sidebar__product p{font-size:1rem;margin-bottom:12px;margin-top:0}.yoast-sidebar__product .yoast-price-micro-copy{font-size:12px;font-weight:300;line-height:20px;margin-bottom:16px;text-align:center}.yoast-sidebar__product .yoast-upsell-hr{border-color:#cd82ab;border-top:1px;margin-bottom:16px}.yoast-sidebar__product .plugin-buy-button .yoast-button-upsell{width:100%}.yoast-sidebar__product .review-container{margin-top:16px}.yoast-sidebar__product .review-container a{color:#fff;text-decoration:none}.yoast-sidebar__product .review-container a .claim{color:#fff;display:block;margin-bottom:12px}.yoast-sidebar__product .review-container .title{color:#fff;font-weight:500;margin-bottom:8px}.yoast-sidebar__product .review-container .title:hover{text-decoration:underline}.yoast-sidebar__product .review-container .rating{display:flex;gap:5px}.yoast-sidebar__product .review-container .rating img{max-height:22px;max-width:22px}.yoast-sidebar__product .review-container .rating .rating-text{font-size:16px;font-weight:600}.yoast-sidebar__product .sidebar__sale_banner_container{margin-left:-24px;margin-top:-40px;overflow-x:hidden;overflow-y:initial;width:calc(100% + 48px)}.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner{background:#000;box-shadow:0 -1px 4px 0 #fcd34d,0 1px 4px 0 #fcd34d,0 -1px 0 0 #fcd34d,0 1px 0 0 #fcd34d;color:#fcd34d;font-size:20px;font-weight:500;letter-spacing:.5px;line-height:30px;margin-bottom:20px;margin-left:-30px;margin-top:20px;padding:7px 0;text-align:center;transform:rotate(-5deg);width:calc(100% + 60px);z-index:1}.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner .banner_text{display:inline-block;margin:0 40px}.yoast-sidebar__product .sidebar__sale_text{border-top:1px solid #fff;font-style:italic;text-align:center}.yoast-sidebar__product .sidebar__sale_text p{font-size:12.5px;margin:12.5px 0}.yoast-sidebar__section{background-color:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin:10px 0 20px;padding:16px}.yoast-sidebar__section h2{color:#a4286a;margin-top:0}.yoast-sidebar__section a{color:#0085ba}.yoast-sidebar__section ul{position:relative}.yoast-sidebar__section li{list-style:none;margin-left:20px}.yoast-sidebar__section li:before{content:"+";font-weight:700;left:0;position:absolute}.yoast-sidebar__section div{margin:10px 0 20px;position:relative}.yoast-sidebar__section div img{float:right;height:70px;margin:0 0 0 10px;width:70px}.yoast-sidebar__section div img.alignleft{float:left;margin:0 10px 0 0}.yoast-sidebar__section div p{float:left;margin:0;width:100%}.yoast_premium_upsell{background-color:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin-top:2em;max-width:715px;overflow:hidden}.yoast_premium_upsell--container{padding:16px}.black-friday-container{background-color:#1f2937;border-bottom:2px solid #fcd34d;display:flex;padding:8px 16px}.black-friday-container span{color:#fcd34d;font-size:1.2rem;font-weight:600}.yoast_premium_upsell--header{color:#a4286a;font-size:1.7em;font-weight:700;margin-top:.3em}.yoast_premium_upsell--motivation{display:flex;flex-wrap:wrap}.yoast_premium_upsell--motivation li{flex:0 0 50%;list-style:none}.yoast_premium_upsell--argument{padding:0 8px 0 20px}.yoast_premium_upsell--argument:before{content:"+";font-weight:700;left:-16px;margin-right:-10px;position:relative;top:-1px}@media screen and (max-width:480px){.yoast_premium_upsell--motivation{display:block}}.yoast-variable-desc{min-width:300px}.yoast-table-scrollable,.yoast-table-scrollable td,.yoast-table-scrollable th{box-sizing:border-box}.yoast-table-scrollable__container.yoast-has-scroll{overflow:hidden;position:relative}.yoast-table-scrollable__container.yoast-has-scroll:after{border-radius:10px 0 0 10px/50% 0 0 50%;box-shadow:-5px 0 10px #00000040;content:"";height:calc(100% - 16px);left:100%;position:absolute;top:0;width:50px}.yoast-table-scrollable__container.yoast-has-scroll .yoast-table-scrollable__inner{overflow-x:scroll;padding-bottom:16px}.yoast-table-scrollable__hintwrapper{display:none}.yoast-table-scrollable__hintwrapper.yoast-has-scroll{display:block;margin:1em 0;text-align:center}.yoast-has-scroll .yoast-table-scrollable__hint{display:inline-block}.yoast-has-scroll .yoast-table-scrollable__hint:before{content:"\21c4";display:inline-block;font-size:20px;line-height:inherit;margin-right:10px;vertical-align:text-top}.yoast-styled-select{align-items:center;display:inline-flex;margin-bottom:1em;position:relative}.yoast-styled-select:after,.yoast-styled-select:before{bottom:0;content:"";pointer-events:none;position:absolute;top:0}.yoast-styled-select:before{right:0;width:28px}.yoast-styled-select:after{border-top:4px solid #0000;border-color:#555 #0000 #0000;border-style:solid;border-width:5px 4px 0;height:0;margin:auto;right:6px;width:0;z-index:1}.yoast-styled-select select{-webkit-appearance:none;appearance:none;background:#0000;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;color:#32373c;height:28px;line-height:1;margin:0;max-width:100%;padding:4px 32px 4px 8px}.yoast-styled-select select.error{border-color:#dc3232;border-width:2px}.wpseo_content_wrapper .yoast-styled-select select.select{margin:0}.yoast-styled-select select:focus{border-color:#5b9dd9}.yoast-styled-select select:-moz-focusring{color:#0000;text-shadow:0 0 0 #32373c}.yoast-styled-select select[disabled]{opacity:.75}.yoast-styled-select select::-ms-expand{display:none}@media screen and (max-width:1024px){.wpseo_content_cell,.wpseo_content_wrapper{display:block;height:auto}#wpseo_content_top{width:auto}#sidebar-container{display:flex;gap:.7rem;padding:0;width:auto}.yoast-sidebar__product .sidebar__sale_banner_container{overflow-y:hidden}#sidebar-container .yoast-sidebar__section{margin-top:5rem}.yoast-sidebar__product-list{border-bottom:1px solid #ddd;display:flex}.yoast-sidebar__product-list div p{word-wrap:break-word;width:calc(100% - 50px)}.yoast-sidebar__product-list .yoast-sidebar__section{border-bottom:none}.yoast-sidebar__product-list .yoast-sidebar__section:first-child{margin-right:40px}}@media screen and (max-width:782px){.wpseo_content_wrapper label.select,.wpseo_content_wrapper label.textinput{display:inline-block;float:none;width:auto}.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper textarea,.wpseo_content_wrapper textarea.textinput{display:block;width:100%}.wpseo_content_wrapper .select2-container,.wpseo_content_wrapper select,.wpseo_content_wrapper select.select{display:block;margin:0 0 5px;max-width:100%}.wpseo_content_wrapper div.desc.label,.wpseo_content_wrapper p.desc.label{padding-left:0}.wpseo_content_wrapper .textinput[aria-invalid=true][aria-describedby]+br{display:none}.wpseo_content_wrapper .yoast-input-validation__error-description{padding-left:0;width:auto}}@media screen and (max-width:600px){.yoast-sidebar__product-list{border-bottom:none;display:block}.yoast-sidebar__product-list .yoast-sidebar__section{border-bottom:1px solid #ddd}.yoast-sidebar__product-list .yoast-sidebar__section p{word-wrap:break-word;padding-left:50px;width:calc(100% - 50px)}}@media screen and (max-width:500px){.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner{transform:rotate(-4deg)}#sidebar-container{display:block}#sidebar-container .yoast-sidebar__section{margin-top:20px}body.toplevel_page_wpseo_dashboard .wp-badge{background-color:#a4286a;background-size:100px 100px;box-shadow:0 1px 3px #0003;padding-top:80px}}.wpseo-checkmark-ok-icon{background:var(--yoast-svg-icon-check-ok) no-repeat;background-size:18px;float:left;height:18px;margin-right:5px;vertical-align:top;width:18px}.yoast-settings-section:not(:last-child){margin-bottom:40px}.yoast-settings-section .yoast-field-group__title .yoast_help.yoast-help-link{margin:-6px 0 0 2px}#yoast-og-default-image-select .yoast-field-group__title{display:none}.yoast-settings-section.yoast-settings-section-disabled{border:1px solid #ccc;padding:16px;position:relative}.yoast-settings-section.yoast-settings-section-disabled>*{opacity:.5}.yoast-settings-section.yoast-settings-section-disabled .yoast-settings-section-upsell{align-items:center;bottom:0;display:flex;justify-content:center;left:0;opacity:1;position:absolute;right:0;top:0}@keyframes yoast-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2280-rtl.css b/wp/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2280-rtl.css deleted file mode 100644 index 5b462a4c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2280-rtl.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 3px 0 10px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}.wpseo-score-title{font-weight:600}#taxonomy_overall{margin-right:87.5%;position:absolute;top:0} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2280.css b/wp/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2280.css deleted file mode 100644 index 53b23fd2..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2280.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 10px 0 3px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}.wpseo-score-title{font-weight:600}#taxonomy_overall{margin-left:87.5%;position:absolute;top:0} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/main-sitemap.xsl b/wp/wp-content/plugins/wordpress-seo/css/main-sitemap.xsl deleted file mode 100644 index b6e0ad17..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/main-sitemap.xsl +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - XML Sitemap - - - - -
              -

              XML Sitemap

              -

              - Generated by Yoast SEO, this is an XML Sitemap, meant for consumption by search engines.
              - You can find more information about XML sitemaps on sitemaps.org. -

              - -

              - This XML Sitemap Index file contains sitemaps. -

              - - - - - - - - - - - - - - - - - - -
              SitemapLast Modified
              - - - -
              -
              - -

              - This XML Sitemap contains URLs. -

              - - - - - - - - - - - - - - - - - - - -
              URLImagesLast Mod.
              - - - - - - - - - - -
              -
              -
              - - -
              -
              diff --git a/wp/wp-content/plugins/wordpress-seo/images/Yoast_SEO_negative_icon.svg b/wp/wp-content/plugins/wordpress-seo/images/Yoast_SEO_negative_icon.svg deleted file mode 100644 index ad6a6b3e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/Yoast_SEO_negative_icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/ai_for_seo_icon_my_yoast.png b/wp/wp-content/plugins/wordpress-seo/images/academy/ai_for_seo_icon_my_yoast.png deleted file mode 100644 index 4e27c6e2..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/ai_for_seo_icon_my_yoast.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/all_around_seo.png b/wp/wp-content/plugins/wordpress-seo/images/academy/all_around_seo.png deleted file mode 100644 index c63aa729..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/all_around_seo.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/block_editor.png b/wp/wp-content/plugins/wordpress-seo/images/academy/block_editor.png deleted file mode 100644 index bb47a94a..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/block_editor.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/copywriting.png b/wp/wp-content/plugins/wordpress-seo/images/academy/copywriting.png deleted file mode 100644 index 50812e74..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/copywriting.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/crawlability.png b/wp/wp-content/plugins/wordpress-seo/images/academy/crawlability.png deleted file mode 100644 index ab7c573f..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/crawlability.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/ecommerce.png b/wp/wp-content/plugins/wordpress-seo/images/academy/ecommerce.png deleted file mode 100644 index 26af3317..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/ecommerce.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/hosting_and_server.png b/wp/wp-content/plugins/wordpress-seo/images/academy/hosting_and_server.png deleted file mode 100644 index 4aabc12f..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/hosting_and_server.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/keyword_research.png b/wp/wp-content/plugins/wordpress-seo/images/academy/keyword_research.png deleted file mode 100644 index 75d5d451..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/keyword_research.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/local.png b/wp/wp-content/plugins/wordpress-seo/images/academy/local.png deleted file mode 100644 index 6916755f..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/local.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/multilingual.png b/wp/wp-content/plugins/wordpress-seo/images/academy/multilingual.png deleted file mode 100644 index cc30e09e..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/multilingual.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/seo_for_beginners.png b/wp/wp-content/plugins/wordpress-seo/images/academy/seo_for_beginners.png deleted file mode 100644 index 4c932b2f..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/seo_for_beginners.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/seo_for_wp.png b/wp/wp-content/plugins/wordpress-seo/images/academy/seo_for_wp.png deleted file mode 100644 index 363417ee..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/seo_for_wp.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/site_structure.png b/wp/wp-content/plugins/wordpress-seo/images/academy/site_structure.png deleted file mode 100644 index ff0b7477..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/site_structure.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/structured_data_for_beginners.png b/wp/wp-content/plugins/wordpress-seo/images/academy/structured_data_for_beginners.png deleted file mode 100644 index 100db7fb..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/structured_data_for_beginners.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/understanding_structured_data.png b/wp/wp-content/plugins/wordpress-seo/images/academy/understanding_structured_data.png deleted file mode 100644 index efad745d..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/understanding_structured_data.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/academy/wp_for_beginners.png b/wp/wp-content/plugins/wordpress-seo/images/academy/wp_for_beginners.png deleted file mode 100644 index d677b4dd..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/academy/wp_for_beginners.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/acf-logo.png b/wp/wp-content/plugins/wordpress-seo/images/acf-logo.png deleted file mode 100644 index 829a7023..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/acf-logo.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/admin_bar.png b/wp/wp-content/plugins/wordpress-seo/images/admin_bar.png deleted file mode 100644 index 54b086ff..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/admin_bar.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/ai-generator-preview.png b/wp/wp-content/plugins/wordpress-seo/images/ai-generator-preview.png deleted file mode 100644 index 73ba3411..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/ai-generator-preview.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/ai-generator.png b/wp/wp-content/plugins/wordpress-seo/images/ai-generator.png deleted file mode 100644 index 5578cd37..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/ai-generator.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/alert-error-icon.svg b/wp/wp-content/plugins/wordpress-seo/images/alert-error-icon.svg deleted file mode 100644 index 80fa0626..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/alert-error-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/alert-info-icon.svg b/wp/wp-content/plugins/wordpress-seo/images/alert-info-icon.svg deleted file mode 100644 index 332d7af5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/alert-info-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/alert-success-icon.svg b/wp/wp-content/plugins/wordpress-seo/images/alert-success-icon.svg deleted file mode 100644 index 30519e54..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/alert-success-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/alert-warning-icon.svg b/wp/wp-content/plugins/wordpress-seo/images/alert-warning-icon.svg deleted file mode 100644 index f52df867..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/alert-warning-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/cornerstone_content.png b/wp/wp-content/plugins/wordpress-seo/images/cornerstone_content.png deleted file mode 100644 index 8e007575..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/cornerstone_content.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/error-icon.svg b/wp/wp-content/plugins/wordpress-seo/images/error-icon.svg deleted file mode 100644 index 43e859de..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/error-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/inclusive_language_analysis.png b/wp/wp-content/plugins/wordpress-seo/images/inclusive_language_analysis.png deleted file mode 100644 index 21fc79eb..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/inclusive_language_analysis.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/index.php b/wp/wp-content/plugins/wordpress-seo/images/index.php deleted file mode 100644 index e94d9a42..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/index.php +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/indexnow.png b/wp/wp-content/plugins/wordpress-seo/images/indexnow.png deleted file mode 100644 index e86fb022..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/indexnow.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/insights.png b/wp/wp-content/plugins/wordpress-seo/images/insights.png deleted file mode 100644 index 9af1fbf5..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/insights.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/link-in-icon.svg b/wp/wp-content/plugins/wordpress-seo/images/link-in-icon.svg deleted file mode 100644 index c3748559..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/link-in-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/link-out-icon.svg b/wp/wp-content/plugins/wordpress-seo/images/link-out-icon.svg deleted file mode 100644 index 202082bc..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/link-out-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/link_suggestions.png b/wp/wp-content/plugins/wordpress-seo/images/link_suggestions.png deleted file mode 100644 index 0ec692be..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/link_suggestions.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/local_plugin_assistant.svg b/wp/wp-content/plugins/wordpress-seo/images/local_plugin_assistant.svg deleted file mode 100644 index 44e32643..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/local_plugin_assistant.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_man_1_optim.svg b/wp/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_man_1_optim.svg deleted file mode 100644 index 187e6c45..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_man_1_optim.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_1_optim.svg b/wp/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_1_optim.svg deleted file mode 100644 index 4d5a2480..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_1_optim.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_2_optim.svg b/wp/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_2_optim.svg deleted file mode 100644 index 801c69a0..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_2_optim.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/new-to-configuration-notice.svg b/wp/wp-content/plugins/wordpress-seo/images/new-to-configuration-notice.svg deleted file mode 100644 index 2343c570..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/new-to-configuration-notice.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/news_plugin_assistant.svg b/wp/wp-content/plugins/wordpress-seo/images/news_plugin_assistant.svg deleted file mode 100644 index f178f9c2..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/news_plugin_assistant.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/open_graph.png b/wp/wp-content/plugins/wordpress-seo/images/open_graph.png deleted file mode 100644 index cb53dc2b..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/open_graph.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/plugin_subscription.svg b/wp/wp-content/plugins/wordpress-seo/images/plugin_subscription.svg deleted file mode 100644 index a3c077b6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/plugin_subscription.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/question-mark.png b/wp/wp-content/plugins/wordpress-seo/images/question-mark.png deleted file mode 100644 index f8472201..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/question-mark.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/readability-icon.svg b/wp/wp-content/plugins/wordpress-seo/images/readability-icon.svg deleted file mode 100644 index 439f52f8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/readability-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/readability_analysis.png b/wp/wp-content/plugins/wordpress-seo/images/readability_analysis.png deleted file mode 100644 index d1f4626b..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/readability_analysis.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/rest_api.png b/wp/wp-content/plugins/wordpress-seo/images/rest_api.png deleted file mode 100644 index 6138a8e7..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/rest_api.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/seo_analysis.png b/wp/wp-content/plugins/wordpress-seo/images/seo_analysis.png deleted file mode 100644 index dc7c9e70..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/seo_analysis.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/slack_sharing.png b/wp/wp-content/plugins/wordpress-seo/images/slack_sharing.png deleted file mode 100644 index 44dceebe..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/slack_sharing.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/stale-cornerstone-content-in-yoast-seo.png b/wp/wp-content/plugins/wordpress-seo/images/stale-cornerstone-content-in-yoast-seo.png deleted file mode 100644 index 581509a3..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/stale-cornerstone-content-in-yoast-seo.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/succes_marieke_bubble_optm.svg b/wp/wp-content/plugins/wordpress-seo/images/succes_marieke_bubble_optm.svg deleted file mode 100644 index cfb36829..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/succes_marieke_bubble_optm.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/support-team.svg b/wp/wp-content/plugins/wordpress-seo/images/support-team.svg deleted file mode 100644 index 27e2678d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/support-team.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/support/github.png b/wp/wp-content/plugins/wordpress-seo/images/support/github.png deleted file mode 100644 index fc38adf8..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/support/github.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/support/help_center.png b/wp/wp-content/plugins/wordpress-seo/images/support/help_center.png deleted file mode 100644 index 43429ade..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/support/help_center.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/support/support_forums.png b/wp/wp-content/plugins/wordpress-seo/images/support/support_forums.png deleted file mode 100644 index b4fd6afa..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/support/support_forums.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/text_link_counter.png b/wp/wp-content/plugins/wordpress-seo/images/text_link_counter.png deleted file mode 100644 index 29fd788c..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/text_link_counter.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/twitter_card.png b/wp/wp-content/plugins/wordpress-seo/images/twitter_card.png deleted file mode 100644 index fbd617f3..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/twitter_card.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/images/video_plugin_assistant.svg b/wp/wp-content/plugins/wordpress-seo/images/video_plugin_assistant.svg deleted file mode 100644 index 403d0fd9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/video_plugin_assistant.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/woo_plugin_assistant.svg b/wp/wp-content/plugins/wordpress-seo/images/woo_plugin_assistant.svg deleted file mode 100644 index 7d00c056..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/woo_plugin_assistant.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/xml_sitemaps.png b/wp/wp-content/plugins/wordpress-seo/images/xml_sitemaps.png deleted file mode 100644 index 73ad8e02..00000000 Binary files a/wp/wp-content/plugins/wordpress-seo/images/xml_sitemaps.png and /dev/null differ diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-addon-manager.php b/wp/wp-content/plugins/wordpress-seo/inc/class-addon-manager.php deleted file mode 100644 index aa73685a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-addon-manager.php +++ /dev/null @@ -1,878 +0,0 @@ - self::PREMIUM_SLUG, - 'wpseo-news.php' => self::NEWS_SLUG, - 'video-seo.php' => self::VIDEO_SLUG, - 'wpseo-woocommerce.php' => self::WOOCOMMERCE_SLUG, - 'local-seo.php' => self::LOCAL_SLUG, - ]; - - /** - * The addon data for the shortlinks. - * - * @var array - */ - private $addon_details = [ - self::PREMIUM_SLUG => [ - 'name' => 'Yoast SEO Premium', - 'short_link_activation' => 'https://yoa.st/13j', - 'short_link_renewal' => 'https://yoa.st/4ey', - ], - self::NEWS_SLUG => [ - 'name' => 'Yoast News SEO', - 'short_link_activation' => 'https://yoa.st/4xq', - 'short_link_renewal' => 'https://yoa.st/4xv', - ], - self::WOOCOMMERCE_SLUG => [ - 'name' => 'Yoast WooCommerce SEO', - 'short_link_activation' => 'https://yoa.st/4xs', - 'short_link_renewal' => 'https://yoa.st/4xx', - ], - self::VIDEO_SLUG => [ - 'name' => 'Yoast Video SEO', - 'short_link_activation' => 'https://yoa.st/4xr', - 'short_link_renewal' => 'https://yoa.st/4xw', - ], - self::LOCAL_SLUG => [ - 'name' => 'Yoast Local SEO', - 'short_link_activation' => 'https://yoa.st/4xp', - 'short_link_renewal' => 'https://yoa.st/4xu', - ], - ]; - - /** - * Holds the site information data. - * - * @var stdClass - */ - private $site_information; - - /** - * Hooks into WordPress. - * - * @codeCoverageIgnore - * - * @return void - */ - public function register_hooks() { - add_action( 'admin_init', [ $this, 'validate_addons' ], 15 ); - add_filter( 'pre_set_site_transient_update_plugins', [ $this, 'check_for_updates' ] ); - add_filter( 'plugins_api', [ $this, 'get_plugin_information' ], 10, 3 ); - add_action( 'plugins_loaded', [ $this, 'register_expired_messages' ], 10 ); - } - - /** - * Registers "expired subscription" warnings to the update messages of our addons. - * - * @return void - */ - public function register_expired_messages() { - foreach ( array_keys( $this->get_installed_addons() ) as $plugin_file ) { - add_action( 'in_plugin_update_message-' . $plugin_file, [ $this, 'expired_subscription_warning' ], 10, 2 ); - } - } - - /** - * Gets the subscriptions for current site. - * - * @return stdClass The subscriptions. - */ - public function get_subscriptions() { - return $this->get_site_information()->subscriptions; - } - - /** - * Provides a list of addon filenames. - * - * @return string[] List of addon filenames with their slugs. - */ - public function get_addon_filenames() { - return self::$addons; - } - - /** - * Finds the plugin file. - * - * @param string $plugin_slug The plugin slug to search. - * - * @return bool|string Plugin file when installed, False when plugin isn't installed. - */ - public function get_plugin_file( $plugin_slug ) { - $plugins = $this->get_plugins(); - $plugin_files = array_keys( $plugins ); - $target_plugin_file = array_search( $plugin_slug, $this->get_addon_filenames(), true ); - - if ( ! $target_plugin_file ) { - return false; - } - - foreach ( $plugin_files as $plugin_file ) { - if ( strpos( $plugin_file, $target_plugin_file ) !== false ) { - return $plugin_file; - } - } - - return false; - } - - /** - * Retrieves the subscription for the given slug. - * - * @param string $slug The plugin slug to retrieve. - * - * @return stdClass|false Subscription data when found, false when not found. - */ - public function get_subscription( $slug ) { - foreach ( $this->get_subscriptions() as $subscription ) { - if ( $subscription->product->slug === $slug ) { - return $subscription; - } - } - - return false; - } - - /** - * Retrieves a list of (subscription) slugs by the active addons. - * - * @return array The slugs. - */ - public function get_subscriptions_for_active_addons() { - $active_addons = array_keys( $this->get_active_addons() ); - $subscription_slugs = array_map( [ $this, 'get_slug_by_plugin_file' ], $active_addons ); - $subscriptions = []; - foreach ( $subscription_slugs as $subscription_slug ) { - $subscriptions[ $subscription_slug ] = $this->get_subscription( $subscription_slug ); - } - - return $subscriptions; - } - - /** - * Retrieves a list of versions for each addon. - * - * @return array The addon versions. - */ - public function get_installed_addons_versions() { - $addon_versions = []; - foreach ( $this->get_installed_addons() as $plugin_file => $installed_addon ) { - $addon_versions[ $this->get_slug_by_plugin_file( $plugin_file ) ] = $installed_addon['Version']; - } - - return $addon_versions; - } - - /** - * Retrieves the plugin information from the subscriptions. - * - * @param stdClass|false $data The result object. Default false. - * @param string $action The type of information being requested from the Plugin Installation API. - * @param stdClass $args Plugin API arguments. - * - * @return object Extended plugin data. - */ - public function get_plugin_information( $data, $action, $args ) { - if ( $action !== 'plugin_information' ) { - return $data; - } - - if ( ! isset( $args->slug ) ) { - return $data; - } - - $subscription = $this->get_subscription( $args->slug ); - if ( ! $subscription ) { - return $data; - } - - $data = $this->convert_subscription_to_plugin( $subscription, null, true ); - - if ( $this->has_subscription_expired( $subscription ) ) { - unset( $data->package, $data->download_link ); - } - - return $data; - } - - /** - * Retrieves information from MyYoast about which addons are connected to the current site. - * - * @return stdClass The list of addons activated for this site. - */ - public function get_myyoast_site_information() { - if ( $this->site_information === null ) { - $this->site_information = $this->get_site_information_transient(); - } - - if ( $this->site_information ) { - return $this->site_information; - } - - $this->site_information = $this->request_current_sites(); - if ( $this->site_information ) { - $this->site_information = $this->map_site_information( $this->site_information ); - - $this->set_site_information_transient( $this->site_information ); - - return $this->site_information; - } - - return $this->get_site_information_default(); - } - - /** - * Checks if the subscription for the given slug is valid. - * - * @param string $slug The plugin slug to retrieve. - * - * @return bool True when the subscription is valid. - */ - public function has_valid_subscription( $slug ) { - $subscription = $this->get_subscription( $slug ); - - // An non-existing subscription is never valid. - if ( ! $subscription ) { - return false; - } - - return ! $this->has_subscription_expired( $subscription ); - } - - /** - * Checks if there are addon updates. - * - * @param stdClass|mixed $data The current data for update_plugins. - * - * @return stdClass Extended data for update_plugins. - */ - public function check_for_updates( $data ) { - global $wp_version; - - if ( empty( $data ) ) { - return $data; - } - - // We have to figure out if we're safe to upgrade the add-ons, based on what the latest Yoast Free requirements for the WP version is. - $yoast_free_data = $this->extract_yoast_data( $data ); - - foreach ( $this->get_installed_addons() as $plugin_file => $installed_plugin ) { - $subscription_slug = $this->get_slug_by_plugin_file( $plugin_file ); - $subscription = $this->get_subscription( $subscription_slug ); - - if ( ! $subscription ) { - continue; - } - - $plugin_data = $this->convert_subscription_to_plugin( $subscription, $yoast_free_data, false, $plugin_file ); - - // Let's assume for now that it will get added in the 'no_update' key that we'll return to the WP API. - $is_no_update = true; - - // If the add-on's version is the latest, we have to do no further checks. - if ( version_compare( $installed_plugin['Version'], $plugin_data->new_version, '<' ) ) { - // If we haven't retrieved the Yoast Free requirements for the WP version yet, do nothing. The next run will probably get us that information. - if ( is_null( $plugin_data->requires ) ) { - continue; - } - - if ( version_compare( $plugin_data->requires, $wp_version, '<=' ) ) { - // The add-on has an available update *and* the Yoast Free requirements for the WP version are also met, so go ahead and show the upgrade info to the user. - $is_no_update = false; - $data->response[ $plugin_file ] = $plugin_data; - - if ( $this->has_subscription_expired( $subscription ) ) { - unset( $data->response[ $plugin_file ]->package, $data->response[ $plugin_file ]->download_link ); - } - } - } - - if ( $is_no_update ) { - // Still convert subscription when no updates is available. - $data->no_update[ $plugin_file ] = $plugin_data; - - if ( $this->has_subscription_expired( $subscription ) ) { - unset( $data->no_update[ $plugin_file ]->package, $data->no_update[ $plugin_file ]->download_link ); - } - } - } - - return $data; - } - - /** - * Extracts Yoast SEO Free's data from the wp.org API response. - * - * @param object $data The wp.org API response. - * - * @return object Yoast Free's data from wp.org. - */ - protected function extract_yoast_data( $data ) { - if ( isset( $data->response[ WPSEO_BASENAME ] ) ) { - return $data->response[ WPSEO_BASENAME ]; - } - - if ( isset( $data->no_update[ WPSEO_BASENAME ] ) ) { - return $data->no_update[ WPSEO_BASENAME ]; - } - - return (object) []; - } - - /** - * If the plugin is lacking an active subscription, throw a warning. - * - * @param array $plugin_data The data for the plugin in this row. - * - * @return void - */ - public function expired_subscription_warning( $plugin_data ) { - $subscription = $this->get_subscription( $plugin_data['slug'] ); - if ( $subscription && $this->has_subscription_expired( $subscription ) ) { - $addon_link = ( isset( $this->addon_details[ $plugin_data['slug'] ] ) ) ? $this->addon_details[ $plugin_data['slug'] ]['short_link_renewal'] : $this->addon_details[ self::PREMIUM_SLUG ]['short_link_renewal']; - - $sale_copy = ''; - if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-promotion' ) ) { - $sale_copy = sprintf( - /* translators: %1$s is a
              tag. */ - esc_html__( '%1$s Now with 30%% Black Friday Discount!', 'wordpress-seo' ), - '
              ' - ); - } - echo '

              '; - echo ' ' - . sprintf( - /* translators: %1$s is the plugin name, %2$s and %3$s are a link. */ - esc_html__( '%1$s can\'t be updated because your product subscription is expired. %2$sRenew your product subscription%3$s to get updates again and use all the features of %1$s.', 'wordpress-seo' ), - esc_html( $plugin_data['name'] ), - '', - '' - ) - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output is escaped above. - . $sale_copy - . ''; - } - } - - /** - * Checks if there are any installed addons. - * - * @return bool True when there are installed Yoast addons. - */ - public function has_installed_addons() { - $installed_addons = $this->get_installed_addons(); - - return ! empty( $installed_addons ); - } - - /** - * Checks if the plugin is installed and activated in WordPress. - * - * @param string $slug The class' slug. - * - * @return bool True when installed and activated. - */ - public function is_installed( $slug ) { - $slug_to_class_map = [ - static::PREMIUM_SLUG => 'WPSEO_Premium', - static::NEWS_SLUG => 'WPSEO_News', - static::WOOCOMMERCE_SLUG => 'Yoast_WooCommerce_SEO', - static::VIDEO_SLUG => 'WPSEO_Video_Sitemap', - static::LOCAL_SLUG => 'WPSEO_Local_Core', - ]; - - if ( ! isset( $slug_to_class_map[ $slug ] ) ) { - return false; - } - - return class_exists( $slug_to_class_map[ $slug ] ); - } - - /** - * Validates the addons and show a notice for the ones that are invalid. - * - * @return void - */ - public function validate_addons() { - $notification_center = Yoast_Notification_Center::get(); - - if ( $notification_center === null ) { - return; - } - - foreach ( $this->addon_details as $slug => $addon_info ) { - $notification = $this->create_notification( $addon_info['name'], $addon_info['short_link_activation'] ); - - // Add a notification when the installed plugin isn't activated in My Yoast. - if ( $this->is_installed( $slug ) && ! $this->has_valid_subscription( $slug ) ) { - $notification_center->add_notification( $notification ); - - continue; - } - - $notification_center->remove_notification( $notification ); - } - } - - /** - * Removes the site information transients. - * - * @codeCoverageIgnore - * - * @return void - */ - public function remove_site_information_transients() { - delete_transient( self::SITE_INFORMATION_TRANSIENT ); - delete_transient( self::SITE_INFORMATION_TRANSIENT_QUICK ); - } - - /** - * Creates an instance of Yoast_Notification. - * - * @param string $product_name The product to create the notification for. - * @param string $short_link The short link for the addon notification. - * - * @return Yoast_Notification The created notification. - */ - protected function create_notification( $product_name, $short_link ) { - $notification_options = [ - 'type' => Yoast_Notification::ERROR, - 'id' => 'wpseo-dismiss-' . sanitize_title_with_dashes( $product_name, null, 'save' ), - 'capabilities' => 'wpseo_manage_options', - ]; - - return new Yoast_Notification( - sprintf( - /* translators: %1$s expands to a strong tag, %2$s expands to the product name, %3$s expands to a closing strong tag, %4$s expands to an a tag. %5$s expands to MyYoast, %6$s expands to a closing a tag, %7$s expands to the product name */ - __( '%1$s %2$s isn\'t working as expected %3$s and you are not receiving updates or support! Make sure to %4$s activate your product subscription in %5$s%6$s to unlock all the features of %7$s.', 'wordpress-seo' ), - '', - $product_name, - '', - '', - 'MyYoast', - '', - $product_name - ), - $notification_options - ); - } - - /** - * Checks whether a plugin expiry date has been passed. - * - * @param stdClass $subscription Plugin subscription. - * - * @return bool Has the plugin expired. - */ - protected function has_subscription_expired( $subscription ) { - return ( strtotime( $subscription->expiry_date ) - time() ) < 0; - } - - /** - * Converts a subscription to plugin based format. - * - * @param stdClass $subscription The subscription to convert. - * @param stdClass|null $yoast_free_data The Yoast Free's data. - * @param bool $plugin_info Whether we're in the plugin information modal. - * @param string $plugin_file The plugin filename. - * - * @return stdClass The converted subscription. - */ - protected function convert_subscription_to_plugin( $subscription, $yoast_free_data = null, $plugin_info = false, $plugin_file = '' ) { - $changelog = ''; - if ( isset( $subscription->product->changelog ) ) { - // We need to replace h2's and h3's with h4's because the styling expects that. - $changelog = str_replace( 'product->changelog ) ); - $changelog = str_replace( ' ( $plugin_info ) ? YOAST_SEO_WP_REQUIRED : null, - ]; - - return (object) [ - 'new_version' => ( $subscription->product->version ?? '' ), - 'name' => $subscription->product->name, - 'slug' => $subscription->product->slug, - 'plugin' => $plugin_file, - 'url' => $subscription->product->store_url, - 'last_update' => $subscription->product->last_updated, - 'homepage' => $subscription->product->store_url, - 'download_link' => $subscription->product->download, - 'package' => $subscription->product->download, - 'sections' => [ - 'changelog' => $changelog, - 'support' => $this->get_support_section(), - ], - 'icons' => [ - '2x' => $this->get_icon( $subscription->product->slug ), - ], - 'update_supported' => true, - 'banners' => $this->get_banners( $subscription->product->slug ), - // If we have extracted Yoast Free's data before, use that. If not, resort to the defaults. - 'tested' => YOAST_SEO_WP_TESTED, - 'requires' => ( $yoast_free_data->requires ?? $defaults['requires'] ), - 'requires_php' => YOAST_SEO_PHP_REQUIRED, - ]; - } - - /** - * Returns the plugin's icon URL. - * - * @param string $slug The plugin slug. - * - * @return string The icon URL for this plugin. - */ - protected function get_icon( $slug ) { - switch ( $slug ) { - case self::LOCAL_SLUG: - return 'https://yoa.st/local-seo-icon'; - case self::NEWS_SLUG: - return 'https://yoa.st/news-seo-icon'; - case self::PREMIUM_SLUG: - return 'https://yoa.st/yoast-seo-icon'; - case self::VIDEO_SLUG: - return 'https://yoa.st/video-seo-icon'; - case self::WOOCOMMERCE_SLUG: - return 'https://yoa.st/woo-seo-icon'; - } - } - - /** - * Return an array of plugin banner URLs. - * - * @param string $slug The plugin slug. - * - * @return string[] - */ - protected function get_banners( $slug ) { - switch ( $slug ) { - case self::LOCAL_SLUG: - return [ - 'high' => 'https://yoa.st/yoast-seo-banner-local', - 'low' => 'https://yoa.st/yoast-seo-banner-low-local', - ]; - case self::NEWS_SLUG: - return [ - 'high' => 'https://yoa.st/yoast-seo-banner-news', - 'low' => 'https://yoa.st/yoast-seo-banner-low-news', - ]; - case self::PREMIUM_SLUG: - return [ - 'high' => 'https://yoa.st/yoast-seo-banner-premium', - 'low' => 'https://yoa.st/yoast-seo-banner-low-premium', - ]; - case self::VIDEO_SLUG: - return [ - 'high' => 'https://yoa.st/yoast-seo-banner-video', - 'low' => 'https://yoa.st/yoast-seo-banner-low-video', - ]; - case self::WOOCOMMERCE_SLUG: - return [ - 'high' => 'https://yoa.st/yoast-seo-banner-woo', - 'low' => 'https://yoa.st/yoast-seo-banner-low-woo', - ]; - } - } - - /** - * Checks if the given plugin_file belongs to a Yoast addon. - * - * @param string $plugin_file Path to the plugin. - * - * @return bool True when plugin file is for a Yoast addon. - */ - protected function is_yoast_addon( $plugin_file ) { - return $this->get_slug_by_plugin_file( $plugin_file ) !== ''; - } - - /** - * Retrieves the addon slug by given plugin file path. - * - * @param string $plugin_file The file path to the plugin. - * - * @return string The slug when found or empty string when not. - */ - protected function get_slug_by_plugin_file( $plugin_file ) { - $addons = self::$addons; - - // Yoast SEO Free isn't an addon, but we needed it in Premium to fetch translations. - if ( YoastSEO()->helpers->product->is_premium() ) { - $addons['wp-seo.php'] = self::FREE_SLUG; - } - - foreach ( $addons as $addon => $addon_slug ) { - if ( strpos( $plugin_file, $addon ) !== false ) { - return $addon_slug; - } - } - - return ''; - } - - /** - * Retrieves the installed Yoast addons. - * - * @return array The installed plugins. - */ - protected function get_installed_addons() { - return array_filter( $this->get_plugins(), [ $this, 'is_yoast_addon' ], ARRAY_FILTER_USE_KEY ); - } - - /** - * Retrieves a list of active addons. - * - * @return array The active addons. - */ - protected function get_active_addons() { - return array_filter( $this->get_installed_addons(), [ $this, 'is_plugin_active' ], ARRAY_FILTER_USE_KEY ); - } - - /** - * Retrieves the current sites from the API. - * - * @codeCoverageIgnore - * - * @return bool|stdClass Object when request is successful. False if not. - */ - protected function request_current_sites() { - $api_request = new WPSEO_MyYoast_Api_Request( 'sites/current' ); - if ( $api_request->fire() ) { - return $api_request->get_response(); - } - - return $this->get_site_information_default(); - } - - /** - * Retrieves the transient value with the site information. - * - * @codeCoverageIgnore - * - * @return stdClass|false The transient value. - */ - protected function get_site_information_transient() { - global $pagenow; - - // Force re-check on license & dashboard pages. - $current_page = null; - // 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,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, We are only strictly comparing and thus no need to sanitize. - $current_page = wp_unslash( $_GET['page'] ); - } - - // Check whether the licenses are valid or whether we need to show notifications. - $quick = ( $current_page === 'wpseo_licenses' || $current_page === 'wpseo_dashboard' ); - - // Also do a fresh request on Plugins & Core Update pages. - $quick = $quick || $pagenow === 'plugins.php'; - $quick = $quick || $pagenow === 'update-core.php'; - - if ( $quick ) { - return get_transient( self::SITE_INFORMATION_TRANSIENT_QUICK ); - } - - return get_transient( self::SITE_INFORMATION_TRANSIENT ); - } - - /** - * Sets the site information transient. - * - * @codeCoverageIgnore - * - * @param stdClass $site_information The site information to save. - * - * @return void - */ - protected function set_site_information_transient( $site_information ) { - set_transient( self::SITE_INFORMATION_TRANSIENT, $site_information, DAY_IN_SECONDS ); - set_transient( self::SITE_INFORMATION_TRANSIENT_QUICK, $site_information, 60 ); - } - - /** - * Retrieves all installed WordPress plugins. - * - * @codeCoverageIgnore - * - * @return array The plugins. - */ - protected function get_plugins() { - if ( ! function_exists( 'get_plugins' ) ) { - require_once ABSPATH . 'wp-admin/includes/plugin.php'; - } - - return get_plugins(); - } - - /** - * Checks if the given plugin file belongs to an active plugin. - * - * @codeCoverageIgnore - * - * @param string $plugin_file The file path to the plugin. - * - * @return bool True when plugin is active. - */ - protected function is_plugin_active( $plugin_file ) { - return is_plugin_active( $plugin_file ); - } - - /** - * Returns an object with no subscriptions. - * - * @codeCoverageIgnore - * - * @return stdClass Site information. - */ - protected function get_site_information_default() { - return (object) [ - 'url' => WPSEO_Utils::get_home_url(), - 'subscriptions' => [], - ]; - } - - /** - * Maps the plugin API response. - * - * @param object $site_information Site information as received from the API. - * - * @return stdClass Mapped site information. - */ - protected function map_site_information( $site_information ) { - return (object) [ - 'url' => $site_information->url, - 'subscriptions' => array_map( [ $this, 'map_subscription' ], $site_information->subscriptions ), - ]; - } - - /** - * Maps a plugin subscription. - * - * @param object $subscription Subscription information as received from the API. - * - * @return stdClass Mapped subscription. - */ - protected function map_subscription( $subscription ) { - // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Not our properties. - return (object) [ - 'renewal_url' => $subscription->renewalUrl, - 'expiry_date' => $subscription->expiryDate, - 'product' => (object) [ - 'version' => $subscription->product->version, - 'name' => $subscription->product->name, - 'slug' => $subscription->product->slug, - 'last_updated' => $subscription->product->lastUpdated, - 'store_url' => $subscription->product->storeUrl, - // Ternary operator is necessary because download can be undefined. - 'download' => ( $subscription->product->download ?? null ), - 'changelog' => $subscription->product->changelog, - ], - ]; - // phpcs:enable - } - - /** - * Retrieves the site information. - * - * @return stdClass The site information. - */ - private function get_site_information() { - if ( ! $this->has_installed_addons() ) { - return $this->get_site_information_default(); - } - - return $this->get_myyoast_site_information(); - } - - /** - * Retrieves the contents for the support section. - * - * @return string The support section content. - */ - protected function get_support_section() { - return '

              ' . __( 'Need support?', 'wordpress-seo' ) . '

              ' - . '

              ' - /* translators: 1: expands to that refers to the help page, 2: closing tag. */ - . sprintf( __( 'You can probably find an answer to your question in our %1$shelp center%2$s.', 'wordpress-seo' ), '', '' ) - . ' ' - /* translators: %s expands to a mailto support link. */ - . sprintf( __( 'If you still need support and have an active subscription for this product, please email %s.', 'wordpress-seo' ), 'support@yoast.com' ) - . '

              '; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-my-yoast-api-request.php b/wp/wp-content/plugins/wordpress-seo/inc/class-my-yoast-api-request.php deleted file mode 100644 index 48d365c7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-my-yoast-api-request.php +++ /dev/null @@ -1,207 +0,0 @@ - 'GET', - 'timeout' => 5, - 'headers' => [ - 'Accept-Encoding' => '*', - 'Expect' => '', - ], - ]; - - /** - * Contains the fetched response. - * - * @var stdClass - */ - protected $response; - - /** - * Contains the error message when request went wrong. - * - * @var string - */ - protected $error_message = ''; - - /** - * Constructor. - * - * @codeCoverageIgnore - * - * @param string $url The request url. - * @param array $args The request arguments. - */ - public function __construct( $url, array $args = [] ) { - $this->url = 'https://my.yoast.com/api/' . $url; - $this->args = wp_parse_args( $args, $this->args ); - } - - /** - * Fires the request. - * - * @return bool True when request is successful. - */ - public function fire() { - try { - $response = $this->do_request( $this->url, $this->args ); - $this->response = $this->decode_response( $response ); - - return true; - } - catch ( WPSEO_MyYoast_Bad_Request_Exception $bad_request_exception ) { - $this->error_message = $bad_request_exception->getMessage(); - - return false; - } - } - - /** - * Retrieves the error message. - * - * @return string The set error message. - */ - public function get_error_message() { - return $this->error_message; - } - - /** - * Retrieves the response. - * - * @return stdClass The response object. - */ - public function get_response() { - return $this->response; - } - - /** - * Performs the request using WordPress internals. - * - * @codeCoverageIgnore - * - * @param string $url The request URL. - * @param array $request_arguments The request arguments. - * - * @return string The retrieved body. - * @throws WPSEO_MyYoast_Bad_Request_Exception When request is invalid. - */ - protected function do_request( $url, $request_arguments ) { - $request_arguments = $this->enrich_request_arguments( $request_arguments ); - $response = wp_remote_request( $url, $request_arguments ); - - if ( is_wp_error( $response ) ) { - throw new WPSEO_MyYoast_Bad_Request_Exception( $response->get_error_message() ); - } - - $response_code = wp_remote_retrieve_response_code( $response ); - $response_message = wp_remote_retrieve_response_message( $response ); - - // Do nothing, response code is okay. - if ( $response_code === 200 || strpos( $response_code, '200' ) !== false ) { - return wp_remote_retrieve_body( $response ); - } - - throw new WPSEO_MyYoast_Bad_Request_Exception( esc_html( $response_message ), (int) $response_code ); - } - - /** - * Decodes the JSON encoded response. - * - * @param string $response The response to decode. - * - * @return stdClass The json decoded response. - * @throws WPSEO_MyYoast_Invalid_JSON_Exception When decoded string is not a JSON object. - */ - protected function decode_response( $response ) { - $response = json_decode( $response ); - - if ( ! is_object( $response ) ) { - throw new WPSEO_MyYoast_Invalid_JSON_Exception( - esc_html__( 'No JSON object was returned.', 'wordpress-seo' ) - ); - } - - return $response; - } - - /** - * Checks if MyYoast tokens are allowed and adds the token to the request body. - * - * When tokens are disallowed it will add the url to the request body. - * - * @param array $request_arguments The arguments to enrich. - * - * @return array The enriched arguments. - */ - protected function enrich_request_arguments( array $request_arguments ) { - $request_arguments = wp_parse_args( $request_arguments, [ 'headers' => [] ] ); - $addon_version_headers = $this->get_installed_addon_versions(); - - foreach ( $addon_version_headers as $addon => $version ) { - $request_arguments['headers'][ $addon . '-version' ] = $version; - } - - $request_body = $this->get_request_body(); - if ( $request_body !== [] ) { - $request_arguments['body'] = $request_body; - } - - return $request_arguments; - } - - /** - * Retrieves the request body based on URL or access token support. - * - * @codeCoverageIgnore - * - * @return array The request body. - */ - public function get_request_body() { - return [ 'url' => WPSEO_Utils::get_home_url() ]; - } - - /** - * Wraps the get current user id function. - * - * @codeCoverageIgnore - * - * @return int The user id. - */ - protected function get_current_user_id() { - return get_current_user_id(); - } - - /** - * Retrieves the installed addons as http headers. - * - * @codeCoverageIgnore - * - * @return array The installed addon versions. - */ - protected function get_installed_addon_versions() { - $addon_manager = new WPSEO_Addon_Manager(); - - return $addon_manager->get_installed_addons_versions(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-post-type.php b/wp/wp-content/plugins/wordpress-seo/inc/class-post-type.php deleted file mode 100644 index 54085d58..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-post-type.php +++ /dev/null @@ -1,131 +0,0 @@ -helpers->post_type->get_accessible_post_types(); - } - - /** - * Returns whether the passed post type is considered accessible. - * - * @param string $post_type The post type to check. - * - * @return bool Whether or not the post type is considered accessible. - */ - public static function is_post_type_accessible( $post_type ) { - return in_array( $post_type, self::get_accessible_post_types(), true ); - } - - /** - * Checks if the request post type is public and indexable. - * - * @param string $post_type_name The name of the post type to lookup. - * - * @return bool True when post type is set to index. - */ - public static function is_post_type_indexable( $post_type_name ) { - return YoastSEO()->helpers->post_type->is_indexable( $post_type_name ); - } - - /** - * Filters the attachment post type from an array with post_types. - * - * @param array $post_types The array to filter the attachment post type from. - * - * @return array The filtered array. - */ - public static function filter_attachment_post_type( array $post_types ) { - unset( $post_types['attachment'] ); - - return $post_types; - } - - /** - * Checks if the post type is enabled in the REST API. - * - * @param string $post_type The post type to check. - * - * @return bool Whether or not the post type is available in the REST API. - */ - public static function is_rest_enabled( $post_type ) { - $post_type_object = get_post_type_object( $post_type ); - - if ( $post_type_object === null ) { - return false; - } - - return $post_type_object->show_in_rest === true; - } - - /** - * Checks if the current post type has an archive. - * - * Context: The has_archive value can be a string or a boolean. In most case it will be a boolean, - * but it can be defined as a string. When it is a string the archive_slug will be overwritten to - * define another endpoint. - * - * @param WP_Post_Type $post_type The post type object. - * - * @return bool True whether the post type has an archive. - */ - public static function has_archive( $post_type ) { - return YoastSEO()->helpers->post_type->has_archive( $post_type ); - } - - /** - * Checks if the Yoast Metabox has been enabled for the post type. - * - * @param string $post_type The post type name. - * - * @return bool True whether the metabox is enabled. - */ - public static function has_metabox_enabled( $post_type ) { - return WPSEO_Options::get( 'display-metabox-pt-' . $post_type, false ); - } - - /* ********************* DEPRECATED METHODS ********************* */ - - /** - * Removes the notification related to the post types which have been made public. - * - * @deprecated 20.10 - * @codeCoverageIgnore - * - * @return void - */ - public static function remove_post_types_made_public_notification() { - _deprecated_function( __METHOD__, 'Yoast SEO 20.10', 'Content_Type_Visibility_Dismiss_Notifications::dismiss_notifications' ); - $notification_center = Yoast_Notification_Center::get(); - $notification_center->remove_notification_by_id( 'post-types-made-public' ); - } - - /** - * Removes the notification related to the taxonomies which have been made public. - * - * @deprecated 20.10 - * @codeCoverageIgnore - * - * @return void - */ - public static function remove_taxonomies_made_public_notification() { - _deprecated_function( __METHOD__, 'Yoast SEO 20.10', 'Content_Type_Visibility_Dismiss_Notifications::dismiss_notifications' ); - $notification_center = Yoast_Notification_Center::get(); - $notification_center->remove_notification_by_id( 'taxonomies-made-public' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-rewrite.php b/wp/wp-content/plugins/wordpress-seo/inc/class-rewrite.php deleted file mode 100644 index a99eb309..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-rewrite.php +++ /dev/null @@ -1,228 +0,0 @@ - $query_vars Main query vars to filter. - * - * @return array The query vars. - */ - public function query_vars( $query_vars ) { - if ( WPSEO_Options::get( 'stripcategorybase' ) === true ) { - $query_vars[] = 'wpseo_category_redirect'; - } - - return $query_vars; - } - - /** - * Checks whether the redirect needs to be created. - * - * @param array $query_vars Query vars to check for existence of redirect var. - * - * @return array The query vars. - */ - public function request( $query_vars ) { - if ( ! isset( $query_vars['wpseo_category_redirect'] ) ) { - return $query_vars; - } - - $this->redirect( $query_vars['wpseo_category_redirect'] ); - return []; - } - - /** - * This function taken and only slightly adapted from WP No Category Base plugin by Saurabh Gupta. - * - * @return array The category rewrite rules. - */ - public function category_rewrite_rules() { - global $wp_rewrite; - - $category_rewrite = []; - - $taxonomy = get_taxonomy( 'category' ); - $permalink_structure = get_option( 'permalink_structure' ); - - $blog_prefix = ''; - if ( strpos( $permalink_structure, '/blog/' ) === 0 ) { - if ( ( is_multisite() && ! is_subdomain_install() ) || is_main_site() || is_main_network() ) { - $blog_prefix = 'blog/'; - } - } - - $categories = get_categories( [ 'hide_empty' => false ] ); - if ( is_array( $categories ) && $categories !== [] ) { - foreach ( $categories as $category ) { - $category_nicename = $category->slug; - if ( $category->parent === $category->cat_ID ) { - // Recursive recursion. - $category->parent = 0; - } - elseif ( $taxonomy->rewrite['hierarchical'] !== false && $category->parent !== 0 ) { - $parents = get_category_parents( $category->parent, false, '/', true ); - if ( ! is_wp_error( $parents ) ) { - $category_nicename = $parents . $category_nicename; - } - unset( $parents ); - } - - $category_rewrite = $this->add_category_rewrites( $category_rewrite, $category_nicename, $blog_prefix, $wp_rewrite->pagination_base ); - - // Adds rules for the uppercase encoded URIs. - $category_nicename_filtered = $this->convert_encoded_to_upper( $category_nicename ); - - if ( $category_nicename_filtered !== $category_nicename ) { - $category_rewrite = $this->add_category_rewrites( $category_rewrite, $category_nicename_filtered, $blog_prefix, $wp_rewrite->pagination_base ); - } - } - unset( $categories, $category, $category_nicename, $category_nicename_filtered ); - } - - // Redirect support from Old Category Base. - $old_base = $wp_rewrite->get_category_permastruct(); - $old_base = str_replace( '%category%', '(.+)', $old_base ); - $old_base = trim( $old_base, '/' ); - $category_rewrite[ $old_base . '$' ] = 'index.php?wpseo_category_redirect=$matches[1]'; - - return $category_rewrite; - } - - /** - * Adds required category rewrites rules. - * - * @param array $rewrites The current set of rules. - * @param string $category_name Category nicename. - * @param string $blog_prefix Multisite blog prefix. - * @param string $pagination_base WP_Query pagination base. - * - * @return array The added set of rules. - */ - protected function add_category_rewrites( $rewrites, $category_name, $blog_prefix, $pagination_base ) { - $rewrite_name = $blog_prefix . '(' . $category_name . ')'; - - $rewrites[ $rewrite_name . '/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$' ] = 'index.php?category_name=$matches[1]&feed=$matches[2]'; - $rewrites[ $rewrite_name . '/' . $pagination_base . '/?([0-9]{1,})/?$' ] = 'index.php?category_name=$matches[1]&paged=$matches[2]'; - $rewrites[ $rewrite_name . '/?$' ] = 'index.php?category_name=$matches[1]'; - - return $rewrites; - } - - /** - * Walks through category nicename and convert encoded parts - * into uppercase using $this->encode_to_upper(). - * - * @param string $name The encoded category URI string. - * - * @return string The convered URI string. - */ - protected function convert_encoded_to_upper( $name ) { - // Checks if name has any encoding in it. - if ( strpos( $name, '%' ) === false ) { - return $name; - } - - $names = explode( '/', $name ); - $names = array_map( [ $this, 'encode_to_upper' ], $names ); - - return implode( '/', $names ); - } - - /** - * Converts the encoded URI string to uppercase. - * - * @param string $encoded The encoded string. - * - * @return string The uppercased string. - */ - public function encode_to_upper( $encoded ) { - if ( strpos( $encoded, '%' ) === false ) { - return $encoded; - } - - return strtoupper( $encoded ); - } - - /** - * Redirect the "old" category URL to the new one. - * - * @codeCoverageIgnore - * - * @param string $category_redirect The category page to redirect to. - * @return void - */ - protected function redirect( $category_redirect ) { - $catlink = trailingslashit( get_option( 'home' ) ) . user_trailingslashit( $category_redirect, 'category' ); - - wp_safe_redirect( $catlink, 301, 'Yoast SEO' ); - exit; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-upgrade-history.php b/wp/wp-content/plugins/wordpress-seo/inc/class-upgrade-history.php deleted file mode 100644 index a72db83d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-upgrade-history.php +++ /dev/null @@ -1,136 +0,0 @@ -option_name = $option_name; - } - } - - /** - * Retrieves the content of the history items currently stored. - * - * @return array> The contents of the history option. - */ - public function get() { - $data = get_option( $this->get_option_name(), [] ); - if ( ! is_array( $data ) ) { - return []; - } - - return $data; - } - - /** - * Adds a new history entry in the storage. - * - * @param string $old_version The version we are upgrading from. - * @param string $new_version The version we are upgrading to. - * @param array $option_names The options that need to be stored. - * - * @return void - */ - public function add( $old_version, $new_version, array $option_names ) { - $option_data = []; - if ( $option_names !== [] ) { - $option_data = $this->get_options_data( $option_names ); - } - - // Retrieve current history. - $data = $this->get(); - - // Add new entry. - $data[ time() ] = [ - 'options' => $option_data, - 'old_version' => $old_version, - 'new_version' => $new_version, - ]; - - // Store the data. - $this->set( $data ); - } - - /** - * Retrieves the data for the specified option names from the database. - * - * @param array $option_names The option names to retrieve. - * - * @return array> The retrieved data. - */ - protected function get_options_data( array $option_names ) { - $wpdb = $this->get_wpdb(); - - $results = $wpdb->get_results( - $wpdb->prepare( - ' - SELECT %i, %i FROM ' . $wpdb->options . ' WHERE - %i IN ( ' . implode( ',', array_fill( 0, count( $option_names ), '%s' ) ) . ' ) - ', - array_merge( [ 'option_value', 'option_name', 'option_name' ], $option_names ) - ), - ARRAY_A - ); - - $data = []; - foreach ( $results as $result ) { - $data[ $result['option_name'] ] = maybe_unserialize( $result['option_value'] ); - } - - return $data; - } - - /** - * Stores the new history state. - * - * @param array> $data The data to store. - * - * @return void - */ - protected function set( array $data ) { - // This should not be autoloaded! - update_option( $this->get_option_name(), $data, false ); - } - - /** - * Retrieves the WPDB object. - * - * @return wpdb The WPDB object to use. - */ - protected function get_wpdb() { - global $wpdb; - - return $wpdb; - } - - /** - * Retrieves the option name to store the history in. - * - * @return string The option name to store the history in. - */ - protected function get_option_name() { - return $this->option_name; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-upgrade.php b/wp/wp-content/plugins/wordpress-seo/inc/class-upgrade.php deleted file mode 100644 index 25936b54..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-upgrade.php +++ /dev/null @@ -1,1831 +0,0 @@ -taxonomy_helper = YoastSEO()->helpers->taxonomy; - - $version = WPSEO_Options::get( 'version' ); - - WPSEO_Options::maybe_set_multisite_defaults( false ); - - $routines = [ - '1.5.0' => 'upgrade_15', - '2.0' => 'upgrade_20', - '2.1' => 'upgrade_21', - '2.2' => 'upgrade_22', - '2.3' => 'upgrade_23', - '3.0' => 'upgrade_30', - '3.3' => 'upgrade_33', - '3.6' => 'upgrade_36', - '4.0' => 'upgrade_40', - '4.4' => 'upgrade_44', - '4.7' => 'upgrade_47', - '4.9' => 'upgrade_49', - '5.0' => 'upgrade_50', - '5.5' => 'upgrade_55', - '6.3' => 'upgrade_63', - '7.0-RC0' => 'upgrade_70', - '7.1-RC0' => 'upgrade_71', - '7.3-RC0' => 'upgrade_73', - '7.4-RC0' => 'upgrade_74', - '7.5.3' => 'upgrade_753', - '7.7-RC0' => 'upgrade_77', - '7.7.2-RC0' => 'upgrade_772', - '9.0-RC0' => 'upgrade_90', - '10.0-RC0' => 'upgrade_100', - '11.1-RC0' => 'upgrade_111', - // Reset notifications because we removed the AMP Glue plugin notification. - '12.1-RC0' => 'clean_all_notifications', - '12.3-RC0' => 'upgrade_123', - '12.4-RC0' => 'upgrade_124', - '12.8-RC0' => 'upgrade_128', - '13.2-RC0' => 'upgrade_132', - '14.0.3-RC0' => 'upgrade_1403', - '14.1-RC0' => 'upgrade_141', - '14.2-RC0' => 'upgrade_142', - '14.5-RC0' => 'upgrade_145', - '14.9-RC0' => 'upgrade_149', - '15.1-RC0' => 'upgrade_151', - '15.3-RC0' => 'upgrade_153', - '15.5-RC0' => 'upgrade_155', - '15.7-RC0' => 'upgrade_157', - '15.9.1-RC0' => 'upgrade_1591', - '16.2-RC0' => 'upgrade_162', - '16.5-RC0' => 'upgrade_165', - '17.2-RC0' => 'upgrade_172', - '17.7.1-RC0' => 'upgrade_1771', - '17.9-RC0' => 'upgrade_179', - '18.3-RC3' => 'upgrade_183', - '18.6-RC0' => 'upgrade_186', - '18.9-RC0' => 'upgrade_189', - '19.1-RC0' => 'upgrade_191', - '19.3-RC0' => 'upgrade_193', - '19.6-RC0' => 'upgrade_196', - '19.11-RC0' => 'upgrade_1911', - '20.2-RC0' => 'upgrade_202', - '20.5-RC0' => 'upgrade_205', - '20.7-RC0' => 'upgrade_207', - '20.8-RC0' => 'upgrade_208', - '22.6-RC0' => 'upgrade_226', - ]; - - array_walk( $routines, [ $this, 'run_upgrade_routine' ], $version ); - if ( version_compare( $version, '12.5-RC0', '<' ) ) { - /* - * We have to run this by hook, because otherwise: - * - the theme support check isn't available. - * - the notification center notifications are not filled yet. - */ - add_action( 'init', [ $this, 'upgrade_125' ] ); - } - - // Since 3.7. - $upsell_notice = new WPSEO_Product_Upsell_Notice(); - $upsell_notice->set_upgrade_notice(); - - /** - * Filter: 'wpseo_run_upgrade' - Runs the upgrade hook which are dependent on Yoast SEO. - * - * @param string $version The current version of Yoast SEO - */ - do_action( 'wpseo_run_upgrade', $version ); - - $this->finish_up( $version ); - } - - /** - * Runs the upgrade routine. - * - * @param string $routine The method to call. - * @param string $version The new version. - * @param string $current_version The current set version. - * - * @return void - */ - protected function run_upgrade_routine( $routine, $version, $current_version ) { - if ( version_compare( $current_version, $version, '<' ) ) { - $this->$routine( $current_version ); - } - } - - /** - * Adds a new upgrade history entry. - * - * @param string $current_version The old version from which we are upgrading. - * @param string $new_version The version we are upgrading to. - * - * @return void - */ - protected function add_upgrade_history( $current_version, $new_version ) { - $upgrade_history = new WPSEO_Upgrade_History(); - $upgrade_history->add( $current_version, $new_version, array_keys( WPSEO_Options::$options ) ); - } - - /** - * Runs the needed cleanup after an update, setting the DB version to latest version, flushing caches etc. - * - * @param string|null $previous_version The previous version. - * - * @return void - */ - protected function finish_up( $previous_version = null ) { - if ( $previous_version ) { - WPSEO_Options::set( 'previous_version', $previous_version ); - } - WPSEO_Options::set( 'version', WPSEO_VERSION ); - - // Just flush rewrites, always, to at least make them work after an upgrade. - add_action( 'shutdown', 'flush_rewrite_rules' ); - - // Flush the sitemap cache. - WPSEO_Sitemaps_Cache::clear(); - - // Make sure all our options always exist - issue #1245. - WPSEO_Options::ensure_options_exist(); - } - - /** - * Run the Yoast SEO 1.5 upgrade routine. - * - * @param string $version Current plugin version. - * - * @return void - */ - private function upgrade_15( $version ) { - // Clean up options and meta. - WPSEO_Options::clean_up( null, $version ); - WPSEO_Meta::clean_up(); - } - - /** - * Moves options that moved position in WPSEO 2.0. - * - * @return void - */ - private function upgrade_20() { - /** - * Clean up stray wpseo_ms options from the options table, option should only exist in the sitemeta table. - * This could have been caused in many version of Yoast SEO, so deleting it for everything below 2.0. - */ - delete_option( 'wpseo_ms' ); - - $wpseo = $this->get_option_from_database( 'wpseo' ); - $this->save_option_setting( $wpseo, 'pinterestverify' ); - - // Re-save option to trigger sanitization. - $this->cleanup_option_data( 'wpseo' ); - } - - /** - * Detects if taxonomy terms were split and updates the corresponding taxonomy meta's accordingly. - * - * @return void - */ - private function upgrade_21() { - $taxonomies = get_option( 'wpseo_taxonomy_meta', [] ); - - if ( ! empty( $taxonomies ) ) { - foreach ( $taxonomies as $taxonomy => $tax_metas ) { - foreach ( $tax_metas as $term_id => $tax_meta ) { - if ( function_exists( 'wp_get_split_term' ) ) { - $new_term_id = wp_get_split_term( $term_id, $taxonomy ); - if ( $new_term_id !== false ) { - $taxonomies[ $taxonomy ][ $new_term_id ] = $taxonomies[ $taxonomy ][ $term_id ]; - unset( $taxonomies[ $taxonomy ][ $term_id ] ); - } - } - } - } - - update_option( 'wpseo_taxonomy_meta', $taxonomies ); - } - } - - /** - * Performs upgrade functions to Yoast SEO 2.2. - * - * @return void - */ - private function upgrade_22() { - // Unschedule our tracking. - wp_clear_scheduled_hook( 'yoast_tracking' ); - - $this->cleanup_option_data( 'wpseo' ); - } - - /** - * Schedules upgrade function to Yoast SEO 2.3. - * - * @return void - */ - private function upgrade_23() { - add_action( 'wp', [ $this, 'upgrade_23_query' ], 90 ); - add_action( 'admin_head', [ $this, 'upgrade_23_query' ], 90 ); - } - - /** - * Performs upgrade query to Yoast SEO 2.3. - * - * @return void - */ - public function upgrade_23_query() { - // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: executed only during the upgrade routine. - // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value -- Reason: executed only during the upgrade routine. - $wp_query = new WP_Query( 'post_type=any&meta_key=_yoast_wpseo_sitemap-include&meta_value=never&order=ASC' ); - - if ( ! empty( $wp_query->posts ) ) { - $options = get_option( 'wpseo_xml' ); - - $excluded_posts = []; - if ( $options['excluded-posts'] !== '' ) { - $excluded_posts = explode( ',', $options['excluded-posts'] ); - } - - foreach ( $wp_query->posts as $post ) { - if ( ! in_array( (string) $post->ID, $excluded_posts, true ) ) { - $excluded_posts[] = $post->ID; - } - } - - // Updates the meta value. - $options['excluded-posts'] = implode( ',', $excluded_posts ); - - // Update the option. - update_option( 'wpseo_xml', $options ); - } - - // Remove the meta fields. - delete_post_meta_by_key( '_yoast_wpseo_sitemap-include' ); - } - - /** - * Performs upgrade functions to Yoast SEO 3.0. - * - * @return void - */ - private function upgrade_30() { - // Remove the meta fields for sitemap prio. - delete_post_meta_by_key( '_yoast_wpseo_sitemap-prio' ); - } - - /** - * Performs upgrade functions to Yoast SEO 3.3. - * - * @return void - */ - private function upgrade_33() { - // Notification dismissals have been moved to User Meta instead of global option. - delete_option( Yoast_Notification_Center::STORAGE_KEY ); - } - - /** - * Performs upgrade functions to Yoast SEO 3.6. - * - * @return void - */ - protected function upgrade_36() { - global $wpdb; - - // Between 3.2 and 3.4 the sitemap options were saved with autoloading enabled. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - 'DELETE FROM %i WHERE %i LIKE %s AND autoload IN ("on", "yes")', - [ $wpdb->options, 'option_name', 'wpseo_sitemap_%' ] - ) - ); - } - - /** - * Removes the about notice when its still in the database. - * - * @return void - */ - private function upgrade_40() { - $center = Yoast_Notification_Center::get(); - $center->remove_notification_by_id( 'wpseo-dismiss-about' ); - } - - /** - * Moves the content-analysis-active and keyword-analysis-acive options from wpseo-titles to wpseo. - * - * @return void - */ - private function upgrade_44() { - $wpseo_titles = $this->get_option_from_database( 'wpseo_titles' ); - - $this->save_option_setting( $wpseo_titles, 'content-analysis-active', 'content_analysis_active' ); - $this->save_option_setting( $wpseo_titles, 'keyword-analysis-active', 'keyword_analysis_active' ); - - // Remove irrelevant content from the option. - $this->cleanup_option_data( 'wpseo_titles' ); - } - - /** - * Renames the meta name for the cornerstone content. It was a public meta field and it has to be private. - * - * @return void - */ - private function upgrade_47() { - global $wpdb; - - // The meta key has to be private, so prefix it. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - 'UPDATE ' . $wpdb->postmeta . ' SET meta_key = %s WHERE meta_key = "yst_is_cornerstone"', - WPSEO_Cornerstone_Filter::META_NAME - ) - ); - } - - /** - * Removes the 'wpseo-dismiss-about' notice for every user that still has it. - * - * @return void - */ - protected function upgrade_49() { - global $wpdb; - - /* - * Using a filter to remove the notification for the current logged in user. The notification center is - * initializing the notifications before the upgrade routine has been executedd and is saving the stored - * notifications on shutdown. This causes the returning notification. By adding this filter the shutdown - * routine on the notification center will remove the notification. - */ - add_filter( 'yoast_notifications_before_storage', [ $this, 'remove_about_notice' ] ); - - $meta_key = $wpdb->get_blog_prefix() . Yoast_Notification_Center::STORAGE_KEY; - - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $usermetas = $wpdb->get_results( - $wpdb->prepare( - ' - SELECT %i, %i - FROM %i - WHERE %i = %s AND %i LIKE %s - ', - [ 'user_id', 'meta_value', $wpdb->usermeta, 'meta_key', $meta_key, 'meta_value', '%wpseo-dismiss-about%' ] - ), - ARRAY_A - ); - - if ( empty( $usermetas ) ) { - return; - } - - foreach ( $usermetas as $usermeta ) { - $notifications = maybe_unserialize( $usermeta['meta_value'] ); - - foreach ( $notifications as $notification_key => $notification ) { - if ( ! empty( $notification['options']['id'] ) && $notification['options']['id'] === 'wpseo-dismiss-about' ) { - unset( $notifications[ $notification_key ] ); - } - } - - update_user_option( $usermeta['user_id'], Yoast_Notification_Center::STORAGE_KEY, array_values( $notifications ) ); - } - } - - /** - * Removes the wpseo-dismiss-about notice from a list of notifications. - * - * @param Yoast_Notification[] $notifications The notifications to filter. - * - * @return Yoast_Notification[] The filtered list of notifications. Excluding the wpseo-dismiss-about notification. - */ - public function remove_about_notice( $notifications ) { - foreach ( $notifications as $notification_key => $notification ) { - if ( $notification->get_id() === 'wpseo-dismiss-about' ) { - unset( $notifications[ $notification_key ] ); - } - } - - return $notifications; - } - - /** - * Adds the yoast_seo_links table to the database. - * - * @return void - */ - protected function upgrade_50() { - global $wpdb; - - // Deletes the post meta value, which might created in the RC. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - "DELETE FROM %i - WHERE %i = '_yst_content_links_processed'", - [ $wpdb->postmeta, 'meta_key' ] - ) - ); - } - - /** - * Register new capabilities and roles. - * - * @return void - */ - private function upgrade_55() { - // Register roles. - do_action( 'wpseo_register_roles' ); - WPSEO_Role_Manager_Factory::get()->add(); - - // Register capabilities. - do_action( 'wpseo_register_capabilities' ); - WPSEO_Capability_Manager_Factory::get()->add(); - } - - /** - * Removes some no longer used options for noindexing subpages and for meta keywords and its associated templates. - * - * @return void - */ - private function upgrade_63() { - $this->cleanup_option_data( 'wpseo_titles' ); - } - - /** - * Perform the 7.0 upgrade, moves settings around, deletes several options. - * - * @return void - */ - private function upgrade_70() { - - $wpseo_permalinks = $this->get_option_from_database( 'wpseo_permalinks' ); - $wpseo_xml = $this->get_option_from_database( 'wpseo_xml' ); - $wpseo_rss = $this->get_option_from_database( 'wpseo_rss' ); - $wpseo = $this->get_option_from_database( 'wpseo' ); - $wpseo_internallinks = $this->get_option_from_database( 'wpseo_internallinks' ); - - // Move some permalink settings, then delete the option. - $this->save_option_setting( $wpseo_permalinks, 'redirectattachment', 'disable-attachment' ); - $this->save_option_setting( $wpseo_permalinks, 'stripcategorybase' ); - - // Move one XML sitemap setting, then delete the option. - $this->save_option_setting( $wpseo_xml, 'enablexmlsitemap', 'enable_xml_sitemap' ); - - // Move the RSS settings to the search appearance settings, then delete the RSS option. - $this->save_option_setting( $wpseo_rss, 'rssbefore' ); - $this->save_option_setting( $wpseo_rss, 'rssafter' ); - - $this->save_option_setting( $wpseo, 'company_logo' ); - $this->save_option_setting( $wpseo, 'company_name' ); - $this->save_option_setting( $wpseo, 'company_or_person' ); - $this->save_option_setting( $wpseo, 'person_name' ); - - // Remove the website name and altername name as we no longer need them. - $this->cleanup_option_data( 'wpseo' ); - - // All the breadcrumbs settings have moved to the search appearance settings. - foreach ( array_keys( $wpseo_internallinks ) as $key ) { - $this->save_option_setting( $wpseo_internallinks, $key ); - } - - // Convert hidden metabox options to display metabox options. - $title_options = get_option( 'wpseo_titles' ); - - foreach ( $title_options as $key => $value ) { - if ( strpos( $key, 'hideeditbox-tax-' ) === 0 ) { - $taxonomy = substr( $key, strlen( 'hideeditbox-tax-' ) ); - WPSEO_Options::set( 'display-metabox-tax-' . $taxonomy, ! $value ); - continue; - } - - if ( strpos( $key, 'hideeditbox-' ) === 0 ) { - $post_type = substr( $key, strlen( 'hideeditbox-' ) ); - WPSEO_Options::set( 'display-metabox-pt-' . $post_type, ! $value ); - continue; - } - } - - // Cleanup removed options. - delete_option( 'wpseo_xml' ); - delete_option( 'wpseo_permalinks' ); - delete_option( 'wpseo_rss' ); - delete_option( 'wpseo_internallinks' ); - - // Remove possibly present plugin conflict notice for plugin that was removed from the list of conflicting plugins. - $yoast_plugin_conflict = WPSEO_Plugin_Conflict::get_instance(); - $yoast_plugin_conflict->clear_error( 'header-footer/plugin.php' ); - - // Moves the user meta for excluding from the XML sitemap to a noindex. - global $wpdb; - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( "UPDATE $wpdb->usermeta SET meta_key = 'wpseo_noindex_author' WHERE meta_key = 'wpseo_excludeauthorsitemap'" ); - } - - /** - * Perform the 7.1 upgrade. - * - * @return void - */ - private function upgrade_71() { - $this->cleanup_option_data( 'wpseo_social' ); - - // Move the breadcrumbs setting and invert it. - $title_options = $this->get_option_from_database( 'wpseo_titles' ); - - if ( array_key_exists( 'breadcrumbs-blog-remove', $title_options ) ) { - WPSEO_Options::set( 'breadcrumbs-display-blog-page', ! $title_options['breadcrumbs-blog-remove'] ); - - $this->cleanup_option_data( 'wpseo_titles' ); - } - } - - /** - * Perform the 7.3 upgrade. - * - * @return void - */ - private function upgrade_73() { - global $wpdb; - // We've moved the cornerstone checkbox to our proper namespace. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( "UPDATE $wpdb->postmeta SET meta_key = '_yoast_wpseo_is_cornerstone' WHERE meta_key = '_yst_is_cornerstone'" ); - - // Remove the previous Whip dismissed message, as this is a new one regarding PHP 5.2. - delete_option( 'whip_dismiss_timestamp' ); - } - - /** - * Performs the 7.4 upgrade. - * - * @return void - */ - protected function upgrade_74() { - $this->remove_sitemap_validators(); - } - - /** - * Performs the 7.5.3 upgrade. - * - * When upgrading purging media is potentially relevant. - * - * @return void - */ - private function upgrade_753() { - // Only when attachments are not disabled. - if ( WPSEO_Options::get( 'disable-attachment' ) === true ) { - return; - } - - // Only when attachments are not no-indexed. - if ( WPSEO_Options::get( 'noindex-attachment' ) === true ) { - return; - } - - // Set purging relevancy. - WPSEO_Options::set( 'is-media-purge-relevant', true ); - } - - /** - * Performs the 7.7 upgrade. - * - * @return void - */ - private function upgrade_77() { - // Remove all OpenGraph content image cache. - $this->delete_post_meta( '_yoast_wpseo_post_image_cache' ); - } - - /** - * Performs the 7.7.2 upgrade. - * - * @return void - */ - private function upgrade_772() { - if ( YoastSEO()->helpers->woocommerce->is_active() ) { - $this->migrate_woocommerce_archive_setting_to_shop_page(); - } - } - - /** - * Performs the 9.0 upgrade. - * - * @return void - */ - protected function upgrade_90() { - global $wpdb; - - // Invalidate all sitemap cache transients. - WPSEO_Sitemaps_Cache_Validator::cleanup_database(); - - // Removes all scheduled tasks for hitting the sitemap index. - wp_clear_scheduled_hook( 'wpseo_hit_sitemap_index' ); - - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - 'DELETE FROM %i - WHERE %i LIKE %s', - [ $wpdb->options, 'option_name', 'wpseo_sitemap_%' ] - ) - ); - } - - /** - * Performs the 10.0 upgrade. - * - * @return void - */ - private function upgrade_100() { - // Removes recalibration notifications. - $this->clean_all_notifications(); - - // Removes recalibration options. - WPSEO_Options::clean_up( 'wpseo' ); - delete_option( 'wpseo_recalibration_beta_mailinglist_subscription' ); - } - - /** - * Performs the 11.1 upgrade. - * - * @return void - */ - private function upgrade_111() { - // Set company_or_person to company when it's an invalid value. - $company_or_person = WPSEO_Options::get( 'company_or_person', '' ); - - if ( ! in_array( $company_or_person, [ 'company', 'person' ], true ) ) { - WPSEO_Options::set( 'company_or_person', 'company' ); - } - } - - /** - * Performs the 12.3 upgrade. - * - * Removes the about notice when its still in the database. - * - * @return void - */ - private function upgrade_123() { - $plugins = [ - 'yoast-seo-premium', - 'video-seo-for-wordpress-seo-by-yoast', - 'yoast-news-seo', - 'local-seo-for-yoast-seo', - 'yoast-woocommerce-seo', - 'yoast-acf-analysis', - ]; - - $center = Yoast_Notification_Center::get(); - foreach ( $plugins as $plugin ) { - $center->remove_notification_by_id( 'wpseo-outdated-yoast-seo-plugin-' . $plugin ); - } - } - - /** - * Performs the 12.4 upgrade. - * - * Removes the Google plus defaults from the database. - * - * @return void - */ - private function upgrade_124() { - $this->cleanup_option_data( 'wpseo_social' ); - } - - /** - * Performs the 12.5 upgrade. - * - * @return void - */ - public function upgrade_125() { - // Disables the force rewrite title when the theme supports it through WordPress. - if ( WPSEO_Options::get( 'forcerewritetitle', false ) && current_theme_supports( 'title-tag' ) ) { - WPSEO_Options::set( 'forcerewritetitle', false ); - } - - global $wpdb; - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - 'DELETE FROM %i - WHERE %i = %s', - [ $wpdb->usermeta, 'meta_key', 'wp_yoast_promo_hide_premium_upsell_admin_block' ] - ) - ); - - // Removes the WordPress update notification, because it is no longer necessary when WordPress 5.3 is released. - $center = Yoast_Notification_Center::get(); - $center->remove_notification_by_id( 'wpseo-dismiss-wordpress-upgrade' ); - } - - /** - * Performs the 12.8 upgrade. - * - * @return void - */ - private function upgrade_128() { - // Re-save wpseo to make sure bf_banner_2019_dismissed key is gone. - $this->cleanup_option_data( 'wpseo' ); - - Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-page_comments-notice' ); - Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-wordpress-upgrade' ); - } - - /** - * Performs the 13.2 upgrade. - * - * @return void - */ - private function upgrade_132() { - Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-tagline-notice' ); - Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-permalink-notice' ); - Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-onpageorg' ); - - // Transfers the onpage option value to the ryte option. - $ryte_option = get_option( 'wpseo_ryte' ); - $onpage_option = get_option( 'wpseo_onpage' ); - if ( ! $ryte_option && $onpage_option ) { - update_option( 'wpseo_ryte', $onpage_option ); - delete_option( 'wpseo_onpage' ); - } - - // Changes onpage_indexability to ryte_indexability. - $wpseo_option = get_option( 'wpseo' ); - if ( isset( $wpseo_option['onpage_indexability'] ) && ! isset( $wpseo_option['ryte_indexability'] ) ) { - $wpseo_option['ryte_indexability'] = $wpseo_option['onpage_indexability']; - unset( $wpseo_option['onpage_indexability'] ); - update_option( 'wpseo', $wpseo_option ); - } - - if ( wp_next_scheduled( 'wpseo_ryte_fetch' ) ) { - wp_clear_scheduled_hook( 'wpseo_ryte_fetch' ); - } - - /* - * Re-register capabilities to add the new `view_site_health_checks` - * capability to the SEO Manager role. - */ - do_action( 'wpseo_register_capabilities' ); - WPSEO_Capability_Manager_Factory::get()->add(); - } - - /** - * Perform the 14.0.3 upgrade. - * - * @return void - */ - private function upgrade_1403() { - WPSEO_Options::set( 'ignore_indexation_warning', false ); - } - - /** - * Performs the 14.1 upgrade. - * - * @return void - */ - private function upgrade_141() { - /* - * These notifications are retrieved from storage on the `init` hook with - * priority 1. We need to remove them after they're retrieved. - */ - add_action( 'init', [ $this, 'remove_notifications_for_141' ] ); - add_action( 'init', [ $this, 'clean_up_private_taxonomies_for_141' ] ); - - $this->reset_permalinks_of_attachments_for_141(); - } - - /** - * Performs the 14.2 upgrade. - * - * Removes the yoast-acf-analysis notice when it's still in the database. - * - * @return void - */ - private function upgrade_142() { - add_action( 'init', [ $this, 'remove_acf_notification_for_142' ] ); - } - - /** - * Performs the 14.5 upgrade. - * - * @return void - */ - private function upgrade_145() { - add_action( 'init', [ $this, 'set_indexation_completed_option_for_145' ] ); - } - - /** - * Performs the 14.9 upgrade. - * - * @return void - */ - private function upgrade_149() { - $version = get_option( 'wpseo_license_server_version', 2 ); - WPSEO_Options::set( 'license_server_version', $version ); - delete_option( 'wpseo_license_server_version' ); - } - - /** - * Performs the 15.1 upgrade. - * - * @return void - */ - private function upgrade_151() { - $this->set_home_url_for_151(); - $this->move_indexables_indexation_reason_for_151(); - - add_action( 'init', [ $this, 'set_permalink_structure_option_for_151' ] ); - add_action( 'init', [ $this, 'store_custom_taxonomy_slugs_for_151' ] ); - } - - /** - * Performs the 15.3 upgrade. - * - * @return void - */ - private function upgrade_153() { - WPSEO_Options::set( 'category_base_url', get_option( 'category_base' ) ); - WPSEO_Options::set( 'tag_base_url', get_option( 'tag_base' ) ); - - // Rename a couple of options. - $indexation_started_value = WPSEO_Options::get( 'indexation_started' ); - WPSEO_Options::set( 'indexing_started', $indexation_started_value ); - - $indexables_indexing_completed_value = WPSEO_Options::get( 'indexables_indexation_completed' ); - WPSEO_Options::set( 'indexables_indexing_completed', $indexables_indexing_completed_value ); - } - - /** - * Performs the 15.5 upgrade. - * - * @return void - */ - private function upgrade_155() { - // Unset the fbadminapp value in the wpseo_social option. - $wpseo_social_option = get_option( 'wpseo_social' ); - - if ( isset( $wpseo_social_option['fbadminapp'] ) ) { - unset( $wpseo_social_option['fbadminapp'] ); - update_option( 'wpseo_social', $wpseo_social_option ); - } - } - - /** - * Performs the 15.7 upgrade. - * - * @return void - */ - private function upgrade_157() { - add_action( 'init', [ $this, 'remove_plugin_updated_notification_for_157' ] ); - } - - /** - * Performs the 15.9.1 upgrade routine. - * - * @return void - */ - private function upgrade_1591() { - $enabled_auto_updates = get_option( 'auto_update_plugins' ); - $addon_update_watcher = YoastSEO()->classes->get( Addon_Update_Watcher::class ); - $addon_update_watcher->toggle_auto_updates_for_add_ons( 'auto_update_plugins', [], $enabled_auto_updates ); - } - - /** - * Performs the 16.2 upgrade routine. - * - * @return void - */ - private function upgrade_162() { - $enabled_auto_updates = get_site_option( 'auto_update_plugins' ); - $addon_update_watcher = YoastSEO()->classes->get( Addon_Update_Watcher::class ); - $addon_update_watcher->toggle_auto_updates_for_add_ons( 'auto_update_plugins', $enabled_auto_updates, [] ); - } - - /** - * Performs the 16.5 upgrade. - * - * @return void - */ - private function upgrade_165() { - add_action( 'init', [ $this, 'copy_og_settings_from_social_to_titles' ], 99 ); - - // Run after the WPSEO_Options::enrich_defaults method which has priority 99. - add_action( 'init', [ $this, 'reset_og_settings_to_default_values' ], 100 ); - } - - /** - * Performs the 17.2 upgrade. Cleans out any unnecessary indexables. See $cleanup_integration->get_cleanup_tasks() to see what will be cleaned out. - * - * @return void - */ - private function upgrade_172() { - wp_unschedule_hook( 'wpseo_cleanup_orphaned_indexables' ); - wp_unschedule_hook( 'wpseo_cleanup_indexables' ); - - if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) { - wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK ); - } - } - - /** - * Performs the 17.7.1 upgrade routine. - * - * @return void - */ - private function upgrade_1771() { - $enabled_auto_updates = get_site_option( 'auto_update_plugins' ); - $addon_update_watcher = YoastSEO()->classes->get( Addon_Update_Watcher::class ); - $addon_update_watcher->toggle_auto_updates_for_add_ons( 'auto_update_plugins', $enabled_auto_updates, [] ); - } - - /** - * Performs the 17.9 upgrade routine. - * - * @return void - */ - private function upgrade_179() { - WPSEO_Options::set( 'wincher_integration_active', true ); - } - - /** - * Performs the 18.3 upgrade routine. - * - * @return void - */ - private function upgrade_183() { - $this->delete_post_meta( 'yoast-structured-data-blocks-images-cache' ); - } - - /** - * Performs the 18.6 upgrade routine. - * - * @return void - */ - private function upgrade_186() { - if ( is_multisite() ) { - WPSEO_Options::set( 'allow_wincher_integration_active', false ); - } - } - - /** - * Performs the 18.9 upgrade routine. - * - * @return void - */ - private function upgrade_189() { - // Make old users not get the Installation Success page after upgrading. - WPSEO_Options::set( 'should_redirect_after_install_free', false ); - // We're adding a hardcoded time here, so that in the future we can be able to identify whether the user did see the Installation Success page or not. - // If they did, they wouldn't have this hardcoded value in that option, but rather (roughly) the timestamp of the moment they saw it. - WPSEO_Options::set( 'activation_redirect_timestamp_free', 1652258756 ); - - // Transfer the Social URLs. - $other = []; - $other[] = WPSEO_Options::get( 'instagram_url' ); - $other[] = WPSEO_Options::get( 'linkedin_url' ); - $other[] = WPSEO_Options::get( 'myspace_url' ); - $other[] = WPSEO_Options::get( 'pinterest_url' ); - $other[] = WPSEO_Options::get( 'youtube_url' ); - $other[] = WPSEO_Options::get( 'wikipedia_url' ); - - WPSEO_Options::set( 'other_social_urls', array_values( array_unique( array_filter( $other ) ) ) ); - - // Transfer the progress of the old Configuration Workout. - $workout_data = WPSEO_Options::get( 'workouts_data' ); - $old_conf_progress = ( $workout_data['configuration']['finishedSteps'] ?? [] ); - - if ( in_array( 'optimizeSeoData', $old_conf_progress, true ) && in_array( 'siteRepresentation', $old_conf_progress, true ) ) { - // If completed â€SEO optimization’ and â€Site representation’ step, we assume the workout was completed. - $configuration_finished_steps = [ - 'siteRepresentation', - 'socialProfiles', - 'personalPreferences', - ]; - WPSEO_Options::set( 'configuration_finished_steps', $configuration_finished_steps ); - } - } - - /** - * Performs the 19.1 upgrade routine. - * - * @return void - */ - private function upgrade_191() { - if ( is_multisite() ) { - WPSEO_Options::set( 'allow_remove_feed_post_comments', true ); - } - } - - /** - * Performs the 19.3 upgrade routine. - * - * @return void - */ - private function upgrade_193() { - if ( empty( get_option( 'wpseo_premium', [] ) ) ) { - WPSEO_Options::set( 'enable_index_now', true ); - WPSEO_Options::set( 'enable_link_suggestions', true ); - } - } - - /** - * Performs the 19.6 upgrade routine. - * - * @return void - */ - private function upgrade_196() { - WPSEO_Options::set( 'ryte_indexability', false ); - WPSEO_Options::set( 'allow_ryte_indexability', false ); - wp_clear_scheduled_hook( 'wpseo_ryte_fetch' ); - } - - /** - * Performs the 19.11 upgrade routine. - * - * @return void - */ - private function upgrade_1911() { - add_action( 'shutdown', [ $this, 'remove_indexable_rows_for_non_public_post_types' ] ); - add_action( 'shutdown', [ $this, 'remove_indexable_rows_for_non_public_taxonomies' ] ); - $this->deduplicate_unindexed_indexable_rows(); - $this->remove_indexable_rows_for_disabled_authors_archive(); - if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) { - wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK ); - } - } - - /** - * Performs the 20.2 upgrade routine. - * - * @return void - */ - private function upgrade_202() { - if ( WPSEO_Options::get( 'disable-attachment', true ) ) { - $attachment_cleanup_helper = YoastSEO()->helpers->attachment_cleanup; - - $attachment_cleanup_helper->remove_attachment_indexables( true ); - $attachment_cleanup_helper->clean_attachment_links_from_target_indexable_ids( true ); - } - - $this->clean_unindexed_indexable_rows_with_no_object_id(); - - if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) { - // This schedules the cleanup routine cron again, since in combination of premium cleans up the prominent words table. We also want to cleanup possible orphaned hierarchies from the above cleanups. - wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK ); - } - } - - /** - * Performs the 20.5 upgrade routine. - * - * @return void - */ - private function upgrade_205() { - if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) { - wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK ); - } - } - - /** - * Performs the 20.7 upgrade routine. - * Removes the metadata related to the settings page introduction modal for all the users. - * Also, schedules another cleanup scheduled action. - * - * @return void - */ - private function upgrade_207() { - add_action( 'shutdown', [ $this, 'delete_user_introduction_meta' ] ); - } - - /** - * Performs the 20.8 upgrade routine. - * Schedules another cleanup scheduled action. - * - * @return void - */ - private function upgrade_208() { - if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) { - wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK ); - } - } - - /** - * Performs the 22.6 upgrade routine. - * Schedules another cleanup scheduled action, but starting from the last cleanup action we just added (if there aren't any running cleanups already). - * - * @return void - */ - private function upgrade_226() { - if ( get_option( Cleanup_Integration::CURRENT_TASK_OPTION ) === false ) { - $cleanup_integration = YoastSEO()->classes->get( Cleanup_Integration::class ); - $cleanup_integration->start_cron_job( 'clean_selected_empty_usermeta', DAY_IN_SECONDS ); - } - } - - /** - * Sets the home_url option for the 15.1 upgrade routine. - * - * @return void - */ - protected function set_home_url_for_151() { - $home_url = WPSEO_Options::get( 'home_url' ); - - if ( empty( $home_url ) ) { - WPSEO_Options::set( 'home_url', get_home_url() ); - } - } - - /** - * Moves the `indexables_indexation_reason` option to the - * renamed `indexing_reason` option. - * - * @return void - */ - protected function move_indexables_indexation_reason_for_151() { - $reason = WPSEO_Options::get( 'indexables_indexation_reason', '' ); - WPSEO_Options::set( 'indexing_reason', $reason ); - } - - /** - * Checks if the indexable indexation is completed. - * If so, sets the `indexables_indexation_completed` option to `true`, - * else to `false`. - * - * @return void - */ - public function set_indexation_completed_option_for_145() { - WPSEO_Options::set( 'indexables_indexation_completed', YoastSEO()->helpers->indexing->get_limited_filtered_unindexed_count( 1 ) === 0 ); - } - - /** - * Cleans up the private taxonomies from the indexables table for the upgrade routine to 14.1. - * - * @return void - */ - public function clean_up_private_taxonomies_for_141() { - global $wpdb; - - // If migrations haven't been completed successfully the following may give false errors. So suppress them. - $show_errors = $wpdb->show_errors; - $wpdb->show_errors = false; - - // Clean up indexables of private taxonomies. - $private_taxonomies = get_taxonomies( [ 'public' => false ], 'names' ); - - if ( empty( $private_taxonomies ) ) { - return; - } - - $replacements = array_merge( [ Model::get_table_name( 'Indexable' ), 'object_type', 'object_sub_type' ], $private_taxonomies ); - - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - "DELETE FROM %i - WHERE %i = 'term' - AND %i IN (" - . implode( ', ', array_fill( 0, count( $private_taxonomies ), '%s' ) ) - . ')', - $replacements - ) - ); - - $wpdb->show_errors = $show_errors; - } - - /** - * Resets the permalinks of attachments to `null` in the indexable table for the upgrade routine to 14.1. - * - * @return void - */ - private function reset_permalinks_of_attachments_for_141() { - global $wpdb; - - // If migrations haven't been completed succesfully the following may give false errors. So suppress them. - $show_errors = $wpdb->show_errors; - $wpdb->show_errors = false; - - // Reset the permalinks of the attachments in the indexable table. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - "UPDATE %i SET %i = NULL WHERE %i = 'post' AND %i = 'attachment'", - [ Model::get_table_name( 'Indexable' ), 'permalink', 'object_type', 'object_sub_type' ] - ) - ); - - $wpdb->show_errors = $show_errors; - } - - /** - * Removes notifications from the Notification center for the 14.1 upgrade. - * - * @return void - */ - public function remove_notifications_for_141() { - Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-recalculate' ); - Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-blog-public-notice' ); - Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-links-table-not-accessible' ); - Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-post-type-archive-notification' ); - } - - /** - * Removes the wpseo-suggested-plugin-yoast-acf-analysis notification from the Notification center for the 14.2 upgrade. - * - * @return void - */ - public function remove_acf_notification_for_142() { - Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-suggested-plugin-yoast-acf-analysis' ); - } - - /** - * Removes the wpseo-plugin-updated notification from the Notification center for the 15.7 upgrade. - * - * @return void - */ - public function remove_plugin_updated_notification_for_157() { - Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-plugin-updated' ); - } - - /** - * Removes all notifications saved in the database under 'wp_yoast_notifications'. - * - * @return void - */ - private function clean_all_notifications() { - global $wpdb; - delete_metadata( 'user', 0, $wpdb->get_blog_prefix() . Yoast_Notification_Center::STORAGE_KEY, '', true ); - } - - /** - * Removes the post meta fields for a given meta key. - * - * @param string $meta_key The meta key. - * - * @return void - */ - private function delete_post_meta( $meta_key ) { - global $wpdb; - $deleted = $wpdb->delete( $wpdb->postmeta, [ 'meta_key' => $meta_key ], [ '%s' ] ); - - if ( $deleted ) { - wp_cache_set( 'last_changed', microtime(), 'posts' ); - } - } - - /** - * Removes all sitemap validators. - * - * This should be executed on every upgrade routine until we have removed the sitemap caching in the database. - * - * @return void - */ - private function remove_sitemap_validators() { - global $wpdb; - - // Remove all sitemap validators. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - 'DELETE FROM %i WHERE %i LIKE %s', - [ $wpdb->options, 'option_name', 'wpseo_sitemap%validator%' ] - ) - ); - } - - /** - * Retrieves the option value directly from the database. - * - * @param string $option_name Option to retrieve. - * - * @return int|string|bool|float|array The content of the option if exists, otherwise an empty array. - */ - protected function get_option_from_database( $option_name ) { - global $wpdb; - - // Load option directly from the database, to avoid filtering and sanitization. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $results = $wpdb->get_results( - $wpdb->prepare( - 'SELECT %i FROM %i WHERE %i = %s', - [ 'option_value', $wpdb->options, 'option_name', $option_name ] - ), - ARRAY_A - ); - - if ( ! empty( $results ) ) { - return maybe_unserialize( $results[0]['option_value'] ); - } - - return []; - } - - /** - * Cleans the option to make sure only relevant settings are there. - * - * @param string $option_name Option name save. - * - * @return void - */ - protected function cleanup_option_data( $option_name ) { - $data = get_option( $option_name, [] ); - if ( ! is_array( $data ) || $data === [] ) { - return; - } - - /* - * Clean up the option by re-saving it. - * - * The option framework will remove any settings that are not configured - * for this option, removing any migrated settings. - */ - update_option( $option_name, $data ); - } - - /** - * Saves an option setting to where it should be stored. - * - * @param int|string|bool|float|array $source_data The option containing the value to be migrated. - * @param string $source_setting Name of the key in the "from" option. - * @param string|null $target_setting Name of the key in the "to" option. - * - * @return void - */ - protected function save_option_setting( $source_data, $source_setting, $target_setting = null ) { - if ( $target_setting === null ) { - $target_setting = $source_setting; - } - - if ( isset( $source_data[ $source_setting ] ) ) { - WPSEO_Options::set( $target_setting, $source_data[ $source_setting ] ); - } - } - - /** - * Migrates WooCommerce archive settings to the WooCommerce Shop page meta-data settings. - * - * If no Shop page is defined, nothing will be migrated. - * - * @return void - */ - private function migrate_woocommerce_archive_setting_to_shop_page() { - $shop_page_id = wc_get_page_id( 'shop' ); - - if ( $shop_page_id === -1 ) { - return; - } - - $title = WPSEO_Meta::get_value( 'title', $shop_page_id ); - - if ( empty( $title ) ) { - $option_title = WPSEO_Options::get( 'title-ptarchive-product' ); - - WPSEO_Meta::set_value( - 'title', - $option_title, - $shop_page_id - ); - - WPSEO_Options::set( 'title-ptarchive-product', '' ); - } - - $meta_description = WPSEO_Meta::get_value( 'metadesc', $shop_page_id ); - - if ( empty( $meta_description ) ) { - $option_metadesc = WPSEO_Options::get( 'metadesc-ptarchive-product' ); - - WPSEO_Meta::set_value( - 'metadesc', - $option_metadesc, - $shop_page_id - ); - - WPSEO_Options::set( 'metadesc-ptarchive-product', '' ); - } - - $bc_title = WPSEO_Meta::get_value( 'bctitle', $shop_page_id ); - - if ( empty( $bc_title ) ) { - $option_bctitle = WPSEO_Options::get( 'bctitle-ptarchive-product' ); - - WPSEO_Meta::set_value( - 'bctitle', - $option_bctitle, - $shop_page_id - ); - - WPSEO_Options::set( 'bctitle-ptarchive-product', '' ); - } - - $noindex = WPSEO_Meta::get_value( 'meta-robots-noindex', $shop_page_id ); - - if ( $noindex === '0' ) { - $option_noindex = WPSEO_Options::get( 'noindex-ptarchive-product' ); - - WPSEO_Meta::set_value( - 'meta-robots-noindex', - $option_noindex, - $shop_page_id - ); - - WPSEO_Options::set( 'noindex-ptarchive-product', false ); - } - } - - /** - * Stores the initial `permalink_structure` option. - * - * @return void - */ - public function set_permalink_structure_option_for_151() { - WPSEO_Options::set( 'permalink_structure', get_option( 'permalink_structure' ) ); - } - - /** - * Stores the initial slugs of custom taxonomies. - * - * @return void - */ - public function store_custom_taxonomy_slugs_for_151() { - $taxonomies = $this->taxonomy_helper->get_custom_taxonomies(); - - $custom_taxonomies = []; - - foreach ( $taxonomies as $taxonomy ) { - $slug = $this->taxonomy_helper->get_taxonomy_slug( $taxonomy ); - - $custom_taxonomies[ $taxonomy ] = $slug; - } - - WPSEO_Options::set( 'custom_taxonomy_slugs', $custom_taxonomies ); - } - - /** - * Copies the frontpage social settings to the titles options. - * - * @return void - */ - public function copy_og_settings_from_social_to_titles() { - $wpseo_social = get_option( 'wpseo_social' ); - $wpseo_titles = get_option( 'wpseo_titles' ); - - $copied_options = []; - // Reset to the correct default value. - $copied_options['open_graph_frontpage_title'] = '%%sitename%%'; - - $options = [ - 'og_frontpage_title' => 'open_graph_frontpage_title', - 'og_frontpage_desc' => 'open_graph_frontpage_desc', - 'og_frontpage_image' => 'open_graph_frontpage_image', - 'og_frontpage_image_id' => 'open_graph_frontpage_image_id', - ]; - - foreach ( $options as $social_option => $titles_option ) { - if ( ! empty( $wpseo_social[ $social_option ] ) ) { - $copied_options[ $titles_option ] = $wpseo_social[ $social_option ]; - } - } - - $wpseo_titles = array_merge( $wpseo_titles, $copied_options ); - - update_option( 'wpseo_titles', $wpseo_titles ); - } - - /** - * Reset the social options with the correct default values. - * - * @return void - */ - public function reset_og_settings_to_default_values() { - $wpseo_titles = get_option( 'wpseo_titles' ); - $updated_options = []; - - $updated_options['social-title-author-wpseo'] = '%%name%%'; - $updated_options['social-title-archive-wpseo'] = '%%date%%'; - - /* translators: %s expands to the name of a post type (plural). */ - $post_type_archive_default = sprintf( __( '%s Archive', 'wordpress-seo' ), '%%pt_plural%%' ); - - /* translators: %s expands to the variable used for term title. */ - $term_archive_default = sprintf( __( '%s Archives', 'wordpress-seo' ), '%%term_title%%' ); - - $post_type_objects = get_post_types( [ 'public' => true ], 'objects' ); - - if ( $post_type_objects ) { - foreach ( $post_type_objects as $pt ) { - // Post types. - if ( isset( $wpseo_titles[ 'social-title-' . $pt->name ] ) ) { - $updated_options[ 'social-title-' . $pt->name ] = '%%title%%'; - } - // Post type archives. - if ( isset( $wpseo_titles[ 'social-title-ptarchive-' . $pt->name ] ) ) { - $updated_options[ 'social-title-ptarchive-' . $pt->name ] = $post_type_archive_default; - } - } - } - - $taxonomy_objects = get_taxonomies( [ 'public' => true ], 'object' ); - - if ( $taxonomy_objects ) { - foreach ( $taxonomy_objects as $tax ) { - if ( isset( $wpseo_titles[ 'social-title-tax-' . $tax->name ] ) ) { - $updated_options[ 'social-title-tax-' . $tax->name ] = $term_archive_default; - } - } - } - - $wpseo_titles = array_merge( $wpseo_titles, $updated_options ); - - update_option( 'wpseo_titles', $wpseo_titles ); - } - - /** - * Removes all indexables for posts that are not publicly viewable. - * This method should be called after init, because post_types can still be registered. - * - * @return void - */ - public function remove_indexable_rows_for_non_public_post_types() { - global $wpdb; - - // If migrations haven't been completed successfully the following may give false errors. So suppress them. - $show_errors = $wpdb->show_errors; - $wpdb->show_errors = false; - - $indexable_table = Model::get_table_name( 'Indexable' ); - - $included_post_types = YoastSEO()->helpers->post_type->get_indexable_post_types(); - - if ( empty( $included_post_types ) ) { - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - "DELETE FROM %i - WHERE %i = 'post' - AND %i IS NOT NULL", - [ $indexable_table, 'object_type', 'object_sub_type' ] - ) - ); - } - else { - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - "DELETE FROM %i - WHERE %i = 'post' - AND %i IS NOT NULL - AND %i NOT IN ( " . implode( ', ', array_fill( 0, count( $included_post_types ), '%s' ) ) . ' )', - array_merge( [ $indexable_table, 'object_type', 'object_sub_type', 'object_sub_type' ], $included_post_types ) - ) - ); - } - - $wpdb->show_errors = $show_errors; - } - - /** - * Removes all indexables for terms that are not publicly viewable. - * This method should be called after init, because taxonomies can still be registered. - * - * @return void - */ - public function remove_indexable_rows_for_non_public_taxonomies() { - global $wpdb; - - // If migrations haven't been completed successfully the following may give false errors. So suppress them. - $show_errors = $wpdb->show_errors; - $wpdb->show_errors = false; - - $indexable_table = Model::get_table_name( 'Indexable' ); - - $included_taxonomies = YoastSEO()->helpers->taxonomy->get_indexable_taxonomies(); - - if ( empty( $included_taxonomies ) ) { - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - "DELETE FROM %i - WHERE %i = 'term' - AND %i IS NOT NULL", - [ $indexable_table, 'object_type', 'object_sub_type' ] - ) - ); - } - else { - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - "DELETE FROM %i - WHERE %i = 'term' - AND %i IS NOT NULL - AND %i NOT IN ( " . implode( ', ', array_fill( 0, count( $included_taxonomies ), '%s' ) ) . ' )', - array_merge( [ $indexable_table, 'object_type', 'object_sub_type', 'object_sub_type' ], $included_taxonomies ) - ) - ); - } - - $wpdb->show_errors = $show_errors; - } - - /** - * De-duplicates indexables that have more than one "unindexed" rows for the same object. Keeps the newest indexable. - * - * @return void - */ - protected function deduplicate_unindexed_indexable_rows() { - global $wpdb; - - // If migrations haven't been completed successfully the following may give false errors. So suppress them. - $show_errors = $wpdb->show_errors; - $wpdb->show_errors = false; - - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $duplicates = $wpdb->get_results( - $wpdb->prepare( - " - SELECT - MAX(id) as newest_id, - object_id, - object_type - FROM - %i - WHERE - post_status = 'unindexed' - AND object_type IN ( 'term', 'post', 'user' ) - GROUP BY - object_id, - object_type - HAVING - count(*) > 1", - [ Model::get_table_name( 'Indexable' ) ] - ), - ARRAY_A - ); - - if ( empty( $duplicates ) ) { - $wpdb->show_errors = $show_errors; - - return; - } - - // Users, terms and posts may share the same object_id. So delete them in separate, more performant, queries. - $delete_queries = [ - $this->get_indexable_deduplication_query_for_type( 'post', $duplicates, $wpdb ), - $this->get_indexable_deduplication_query_for_type( 'term', $duplicates, $wpdb ), - $this->get_indexable_deduplication_query_for_type( 'user', $duplicates, $wpdb ), - ]; - - foreach ( $delete_queries as $delete_query ) { - if ( ! empty( $delete_query ) ) { - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already. - $wpdb->query( $delete_query ); - // phpcs:enable - } - } - - $wpdb->show_errors = $show_errors; - } - - /** - * Cleans up "unindexed" indexable rows when appropriate, aka when there's no object ID even though it should. - * - * @return void - */ - protected function clean_unindexed_indexable_rows_with_no_object_id() { - global $wpdb; - - // If migrations haven't been completed successfully the following may give false errors. So suppress them. - $show_errors = $wpdb->show_errors; - $wpdb->show_errors = false; - - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - "DELETE FROM %i - WHERE %i = 'unindexed' - AND %i NOT IN ( 'home-page', 'date-archive', 'post-type-archive', 'system-page' ) - AND %i IS NULL", - [ Model::get_table_name( 'Indexable' ), 'post_status', 'object_type', 'object_id' ] - ) - ); - - $wpdb->show_errors = $show_errors; - } - - /** - * Removes all user indexable rows when the author archive is disabled. - * - * @return void - */ - protected function remove_indexable_rows_for_disabled_authors_archive() { - global $wpdb; - - if ( ! YoastSEO()->helpers->author_archive->are_disabled() ) { - return; - } - - // If migrations haven't been completed successfully the following may give false errors. So suppress them. - $show_errors = $wpdb->show_errors; - $wpdb->show_errors = false; - - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - $wpdb->query( - $wpdb->prepare( - "DELETE FROM %i WHERE %i = 'user'", - [ Model::get_table_name( 'Indexable' ), 'object_type' ] - ) - ); - - $wpdb->show_errors = $show_errors; - } - - /** - * Creates a query for de-duplicating indexables for a particular type. - * - * @param string $object_type The object type to deduplicate. - * @param string|array> $duplicates The result of the duplicate query. - * @param wpdb $wpdb The wpdb object. - * - * @return string The query that removes all but one duplicate for each object of the object type. - */ - protected function get_indexable_deduplication_query_for_type( $object_type, $duplicates, $wpdb ) { - $filtered_duplicates = array_filter( - $duplicates, - static function ( $duplicate ) use ( $object_type ) { - return $duplicate['object_type'] === $object_type; - } - ); - - if ( empty( $filtered_duplicates ) ) { - return ''; - } - - $object_ids = wp_list_pluck( $filtered_duplicates, 'object_id' ); - $newest_indexable_ids = wp_list_pluck( $filtered_duplicates, 'newest_id' ); - - $replacements = array_merge( [ Model::get_table_name( 'Indexable' ), 'object_id' ], array_values( $object_ids ), array_values( $newest_indexable_ids ) ); - $replacements[] = $object_type; - - // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. - return $wpdb->prepare( - 'DELETE FROM - %i - WHERE - %i IN ( ' . implode( ', ', array_fill( 0, count( $filtered_duplicates ), '%d' ) ) . ' ) - AND id NOT IN ( ' . implode( ', ', array_fill( 0, count( $filtered_duplicates ), '%d' ) ) . ' ) - AND object_type = %s', - $replacements - ); - } - - /** - * Removes the settings' introduction modal data for users. - * - * @return void - */ - public function delete_user_introduction_meta() { - delete_metadata( 'user', 0, '_yoast_settings_introduction', '', true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-admin-bar-menu.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-admin-bar-menu.php deleted file mode 100644 index e8c6f455..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-admin-bar-menu.php +++ /dev/null @@ -1,926 +0,0 @@ -classes->get( Indexable_Repository::class ); - } - if ( ! $score_icon_helper ) { - $score_icon_helper = YoastSEO()->helpers->score_icon; - } - if ( ! $product_helper ) { - $product_helper = YoastSEO()->helpers->product; - } - if ( ! $shortlinker ) { - $shortlinker = new WPSEO_Shortlinker(); - } - - $this->product_helper = $product_helper; - $this->asset_manager = $asset_manager; - $this->indexable_repository = $indexable_repository; - $this->score_icon_helper = $score_icon_helper; - $this->shortlinker = $shortlinker; - } - - /** - * Gets whether SEO score is enabled, with cache applied. - * - * @return bool True if SEO score is enabled, false otherwise. - */ - protected function get_is_seo_enabled() { - if ( is_null( $this->is_seo_enabled ) ) { - $this->is_seo_enabled = ( new WPSEO_Metabox_Analysis_SEO() )->is_enabled(); - } - - return $this->is_seo_enabled; - } - - /** - * Gets whether readability is enabled, with cache applied. - * - * @return bool True if readability is enabled, false otherwise. - */ - protected function get_is_readability_enabled() { - if ( is_null( $this->is_readability_enabled ) ) { - $this->is_readability_enabled = ( new WPSEO_Metabox_Analysis_Readability() )->is_enabled(); - } - - return $this->is_readability_enabled; - } - - /** - * Returns the indexable for the current WordPress page, with cache applied. - * - * @return bool|Indexable The indexable, false if none could be found. - */ - protected function get_current_indexable() { - if ( is_null( $this->current_indexable ) ) { - $this->current_indexable = $this->indexable_repository->for_current_page(); - } - - return $this->current_indexable; - } - - /** - * Adds the admin bar menu. - * - * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. - * - * @return void - */ - public function add_menu( WP_Admin_Bar $wp_admin_bar ) { - // On block editor pages, the admin bar only shows on mobile, where having this menu icon is not very helpful. - if ( is_admin() ) { - $screen = get_current_screen(); - if ( isset( $screen ) && $screen->is_block_editor() ) { - return; - } - } - - // If the current user can't write posts, this is all of no use, so let's not output an admin menu. - if ( ! current_user_can( 'edit_posts' ) ) { - return; - } - - $this->add_root_menu( $wp_admin_bar ); - - /** - * Adds a submenu item in the top of the adminbar. - * - * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. - * @param string $menu_identifier The menu identifier. - */ - do_action( 'wpseo_add_adminbar_submenu', $wp_admin_bar, self::MENU_IDENTIFIER ); - - if ( ! is_admin() ) { - - if ( is_singular() || is_tag() || is_tax() || is_category() ) { - $is_seo_enabled = $this->get_is_seo_enabled(); - $is_readability_enabled = $this->get_is_readability_enabled(); - - $indexable = $this->get_current_indexable(); - - if ( $is_seo_enabled ) { - $focus_keyword = ( ! is_a( $indexable, 'Yoast\WP\SEO\Models\Indexable' ) || is_null( $indexable->primary_focus_keyword ) ) ? __( 'not set', 'wordpress-seo' ) : $indexable->primary_focus_keyword; - - $wp_admin_bar->add_menu( - [ - 'parent' => self::MENU_IDENTIFIER, - 'id' => 'wpseo-seo-focus-keyword', - 'title' => __( 'Focus keyphrase: ', 'wordpress-seo' ) . '' . $focus_keyword . '', - 'meta' => [ 'tabindex' => '0' ], - ] - ); - $wp_admin_bar->add_menu( - [ - 'parent' => self::MENU_IDENTIFIER, - 'id' => 'wpseo-seo-score', - 'title' => __( 'SEO score', 'wordpress-seo' ) . ': ' . $this->score_icon_helper->for_seo( $indexable, 'adminbar-sub-menu-score' ) - ->present(), - 'meta' => [ 'tabindex' => '0' ], - ] - ); - } - - if ( $is_readability_enabled ) { - $wp_admin_bar->add_menu( - [ - 'parent' => self::MENU_IDENTIFIER, - 'id' => 'wpseo-readability-score', - 'title' => __( 'Readability', 'wordpress-seo' ) . ': ' . $this->score_icon_helper->for_readability( $indexable->readability_score, 'adminbar-sub-menu-score' ) - ->present(), - 'meta' => [ 'tabindex' => '0' ], - ] - ); - } - - if ( ! $this->product_helper->is_premium() ) { - $wp_admin_bar->add_menu( - [ - 'parent' => self::MENU_IDENTIFIER, - 'id' => 'wpseo-frontend-inspector', - 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-frontend-inspector' ), - 'title' => __( 'Front-end SEO inspector', 'wordpress-seo' ) . new Premium_Badge_Presenter( 'wpseo-frontend-inspector-badge' ), - 'meta' => [ - 'tabindex' => '0', - 'target' => '_blank', - ], - ] - ); - } - } - $this->add_analysis_submenu( $wp_admin_bar ); - $this->add_seo_tools_submenu( $wp_admin_bar ); - $this->add_how_to_submenu( $wp_admin_bar ); - $this->add_get_help_submenu( $wp_admin_bar ); - } - - if ( ! is_admin() || is_blog_admin() ) { - $this->add_settings_submenu( $wp_admin_bar ); - } - elseif ( is_network_admin() ) { - $this->add_network_settings_submenu( $wp_admin_bar ); - } - - if ( ! $this->product_helper->is_premium() ) { - $this->add_premium_link( $wp_admin_bar ); - } - } - - /** - * Enqueues admin bar assets. - * - * @return void - */ - public function enqueue_assets() { - if ( ! is_admin_bar_showing() ) { - return; - } - - // If the current user can't write posts, this is all of no use, so let's not output an admin menu. - if ( ! current_user_can( 'edit_posts' ) ) { - return; - } - - $this->asset_manager->register_assets(); - $this->asset_manager->enqueue_style( 'adminbar' ); - } - - /** - * Registers the hooks. - * - * @return void - */ - public function register_hooks() { - if ( ! $this->meets_requirements() ) { - return; - } - - add_action( 'admin_bar_menu', [ $this, 'add_menu' ], 95 ); - - add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); - } - - /** - * Checks whether the requirements to use this class are met. - * - * @return bool True if requirements are met, false otherwise. - */ - public function meets_requirements() { - if ( is_network_admin() ) { - return WPSEO_Utils::is_plugin_network_active(); - } - - if ( WPSEO_Options::get( 'enable_admin_bar_menu' ) !== true ) { - return false; - } - - return ! is_admin() || is_blog_admin(); - } - - /** - * Adds the admin bar root menu. - * - * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. - * - * @return void - */ - protected function add_root_menu( WP_Admin_Bar $wp_admin_bar ) { - $title = $this->get_title(); - - $score = ''; - $settings_url = ''; - $counter = ''; - $notification_popup = ''; - - $post = $this->get_singular_post(); - if ( $post ) { - $score = $this->get_post_score( $post ); - } - - $term = $this->get_singular_term(); - if ( $term ) { - $score = $this->get_term_score( $term ); - } - - $can_manage_options = $this->can_manage_options(); - - if ( $can_manage_options ) { - $settings_url = $this->get_settings_page_url(); - } - - if ( empty( $score ) && ! is_network_admin() && $can_manage_options ) { - $counter = $this->get_notification_counter(); - $notification_popup = $this->get_notification_popup(); - } - - $admin_bar_menu_args = [ - 'id' => self::MENU_IDENTIFIER, - 'title' => $title . $score . $counter . $notification_popup, - 'href' => $settings_url, - 'meta' => [ 'tabindex' => ! empty( $settings_url ) ? false : '0' ], - ]; - $wp_admin_bar->add_menu( $admin_bar_menu_args ); - - if ( ! empty( $counter ) ) { - $admin_bar_menu_args = [ - 'parent' => self::MENU_IDENTIFIER, - 'id' => 'wpseo-notifications', - 'title' => __( 'Notifications', 'wordpress-seo' ) . $counter, - 'href' => $settings_url, - 'meta' => [ 'tabindex' => ! empty( $settings_url ) ? false : '0' ], - ]; - $wp_admin_bar->add_menu( $admin_bar_menu_args ); - } - } - - /** - * Adds the admin bar analysis submenu. - * - * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. - * - * @return void - */ - protected function add_analysis_submenu( WP_Admin_Bar $wp_admin_bar ) { - try { - $url = YoastSEO()->meta->for_current_page()->canonical; - } catch ( Exception $e ) { - // This is not the type of error we can handle here. - return; - } - - if ( ! $url ) { - return; - } - - $menu_args = [ - 'parent' => self::MENU_IDENTIFIER, - 'id' => self::ANALYSIS_SUBMENU_IDENTIFIER, - 'title' => __( 'Analyze this page', 'wordpress-seo' ), - 'meta' => [ 'tabindex' => '0' ], - ]; - $wp_admin_bar->add_menu( $menu_args ); - - $encoded_url = rawurlencode( $url ); - $submenu_items = [ - [ - 'id' => 'wpseo-inlinks', - 'title' => __( 'Check links to this URL', 'wordpress-seo' ), - 'href' => 'https://search.google.com/search-console/links/drilldown?resource_id=' . rawurlencode( get_option( 'siteurl' ) ) . '&type=EXTERNAL&target=' . $encoded_url . '&domain=', - ], - [ - 'id' => 'wpseo-structureddata', - 'title' => __( 'Google Rich Results Test', 'wordpress-seo' ), - 'href' => 'https://search.google.com/test/rich-results?url=' . $encoded_url, - ], - [ - 'id' => 'wpseo-facebookdebug', - 'title' => __( 'Facebook Debugger', 'wordpress-seo' ), - 'href' => '//developers.facebook.com/tools/debug/?q=' . $encoded_url, - ], - [ - 'id' => 'wpseo-pagespeed', - 'title' => __( 'Google Page Speed Test', 'wordpress-seo' ), - 'href' => '//developers.google.com/speed/pagespeed/insights/?url=' . $encoded_url, - ], - ]; - - $this->add_submenu_items( $submenu_items, $wp_admin_bar, self::ANALYSIS_SUBMENU_IDENTIFIER ); - } - - /** - * Adds the admin bar tools submenu. - * - * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. - * - * @return void - */ - protected function add_seo_tools_submenu( WP_Admin_Bar $wp_admin_bar ) { - $menu_args = [ - 'parent' => self::MENU_IDENTIFIER, - 'id' => 'wpseo-sub-tools', - 'title' => __( 'SEO Tools', 'wordpress-seo' ), - 'meta' => [ 'tabindex' => '0' ], - ]; - $wp_admin_bar->add_menu( $menu_args ); - - $submenu_items = [ - [ - 'id' => 'wpseo-semrush', - 'title' => 'Semrush', - 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-semrush' ), - ], - [ - 'id' => 'wpseo-wincher', - 'title' => 'Wincher', - 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-wincher' ), - ], - [ - 'id' => 'wpseo-google-trends', - 'title' => 'Google trends', - 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-gtrends' ), - ], - ]; - - $this->add_submenu_items( $submenu_items, $wp_admin_bar, 'wpseo-sub-tools' ); - } - - /** - * Adds the admin bar How To submenu. - * - * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. - * - * @return void - */ - protected function add_how_to_submenu( WP_Admin_Bar $wp_admin_bar ) { - $menu_args = [ - 'parent' => self::MENU_IDENTIFIER, - 'id' => 'wpseo-sub-howto', - 'title' => __( 'How to', 'wordpress-seo' ), - 'meta' => [ 'tabindex' => '0' ], - ]; - $wp_admin_bar->add_menu( $menu_args ); - - $submenu_items = [ - [ - 'id' => 'wpseo-learn-seo', - 'title' => __( 'Learn more SEO', 'wordpress-seo' ), - 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-learn-more-seo' ), - ], - [ - 'id' => 'wpseo-improve-blogpost', - 'title' => __( 'Improve your blog post', 'wordpress-seo' ), - 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-improve-blog-post' ), - ], - [ - 'id' => 'wpseo-write-better-content', - 'title' => __( 'Write better content', 'wordpress-seo' ), - 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-write-better' ), - ], - ]; - - $this->add_submenu_items( $submenu_items, $wp_admin_bar, 'wpseo-sub-howto' ); - } - - /** - * Adds the admin bar How To submenu. - * - * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. - * - * @return void - */ - protected function add_get_help_submenu( WP_Admin_Bar $wp_admin_bar ) { - $menu_args = [ - 'parent' => self::MENU_IDENTIFIER, - 'id' => 'wpseo-sub-get-help', - 'title' => __( 'Help', 'wordpress-seo' ), - 'meta' => [ 'tabindex' => '0' ], - ]; - - if ( current_user_can( Support_Integration::CAPABILITY ) ) { - $menu_args['href'] = admin_url( 'admin.php?page=' . Support_Integration::PAGE ); - $wp_admin_bar->add_menu( $menu_args ); - - return; - } - $wp_admin_bar->add_menu( $menu_args ); - - $submenu_items = [ - [ - 'id' => 'wpseo-yoast-help', - 'title' => __( 'Yoast.com help section', 'wordpress-seo' ), - 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-yoast-help' ), - ], - [ - 'id' => 'wpseo-premium-support', - 'title' => __( 'Yoast Premium support', 'wordpress-seo' ), - 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-premium-support' ), - ], - [ - 'id' => 'wpseo-wp-support-forums', - 'title' => __( 'WordPress.org support forums', 'wordpress-seo' ), - 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-wp-support-forums' ), - ], - [ - 'id' => 'wpseo-learn-seo-2', - 'title' => __( 'Learn more SEO', 'wordpress-seo' ), - 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-learn-more-seo-help' ), - ], - ]; - - $this->add_submenu_items( $submenu_items, $wp_admin_bar, 'wpseo-sub-get-help' ); - } - - /** - * Adds the admin bar How To submenu. - * - * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. - * - * @return void - */ - protected function add_premium_link( WP_Admin_Bar $wp_admin_bar ) { - $sale_percentage = ''; - if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-promotion' ) ) { - $sale_percentage = sprintf( - '%1$s', - esc_html__( '-30%', 'wordpress-seo' ) - ); - } - $wp_admin_bar->add_menu( - [ - 'parent' => self::MENU_IDENTIFIER, - 'id' => 'wpseo-get-premium', - // Circumvent an issue in the WP admin bar API in order to pass `data` attributes. See https://core.trac.wordpress.org/ticket/38636. - 'title' => sprintf( - '%2$s » %3$s', - esc_url( $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-get-premium' ) ), - esc_html__( 'Get Yoast SEO Premium', 'wordpress-seo' ), - $sale_percentage - ), - 'meta' => [ - 'tabindex' => '0', - ], - ] - ); - } - - /** - * Adds the admin bar settings submenu. - * - * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. - * - * @return void - */ - protected function add_settings_submenu( WP_Admin_Bar $wp_admin_bar ) { - if ( ! $this->can_manage_options() ) { - return; - } - - $admin_menu = new WPSEO_Admin_Menu( new WPSEO_Menu() ); - $submenu_pages = $admin_menu->get_submenu_pages(); - - $menu_args = [ - 'parent' => self::MENU_IDENTIFIER, - 'id' => self::SETTINGS_SUBMENU_IDENTIFIER, - 'title' => __( 'SEO Settings', 'wordpress-seo' ), - 'meta' => [ 'tabindex' => '0' ], - ]; - $wp_admin_bar->add_menu( $menu_args ); - - foreach ( $submenu_pages as $submenu_page ) { - if ( ! current_user_can( $submenu_page[3] ) ) { - continue; - } - - // Don't add the Google Search Console menu item. - if ( $submenu_page[4] === 'wpseo_search_console' ) { - continue; - } - - $id = 'wpseo-' . str_replace( '_', '-', str_replace( 'wpseo_', '', $submenu_page[4] ) ); - if ( $id === 'wpseo-dashboard' ) { - $id = 'wpseo-general'; - } - - $menu_args = [ - 'parent' => self::SETTINGS_SUBMENU_IDENTIFIER, - 'id' => $id, - 'title' => $submenu_page[2], - 'href' => admin_url( 'admin.php?page=' . rawurlencode( $submenu_page[4] ) ), - ]; - $wp_admin_bar->add_menu( $menu_args ); - } - } - - /** - * Adds the admin bar network settings submenu. - * - * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. - * - * @return void - */ - protected function add_network_settings_submenu( WP_Admin_Bar $wp_admin_bar ) { - if ( ! $this->can_manage_options() ) { - return; - } - - $network_admin_menu = new WPSEO_Network_Admin_Menu( new WPSEO_Menu() ); - $submenu_pages = $network_admin_menu->get_submenu_pages(); - - $menu_args = [ - 'parent' => self::MENU_IDENTIFIER, - 'id' => self::NETWORK_SETTINGS_SUBMENU_IDENTIFIER, - 'title' => __( 'SEO Settings', 'wordpress-seo' ), - 'meta' => [ 'tabindex' => '0' ], - ]; - $wp_admin_bar->add_menu( $menu_args ); - - foreach ( $submenu_pages as $submenu_page ) { - if ( ! current_user_can( $submenu_page[3] ) ) { - continue; - } - - $id = 'wpseo-' . str_replace( '_', '-', str_replace( 'wpseo_', '', $submenu_page[4] ) ); - if ( $id === 'wpseo-dashboard' ) { - $id = 'wpseo-general'; - } - - $menu_args = [ - 'parent' => self::NETWORK_SETTINGS_SUBMENU_IDENTIFIER, - 'id' => $id, - 'title' => $submenu_page[2], - 'href' => network_admin_url( 'admin.php?page=' . rawurlencode( $submenu_page[4] ) ), - ]; - $wp_admin_bar->add_menu( $menu_args ); - } - } - - /** - * Gets the menu title markup. - * - * @return string Admin bar title markup. - */ - protected function get_title() { - return ''; - } - - /** - * Gets the current post if in a singular post context. - * - * @global string $pagenow Current page identifier. - * @global WP_Post|null $post Current post object, or null if none available. - * - * @return WP_Post|null Post object, or null if not in singular context. - */ - protected function get_singular_post() { - global $pagenow, $post; - - if ( ! is_singular() && ( ! is_blog_admin() || ! WPSEO_Metabox::is_post_edit( $pagenow ) ) ) { - return null; - } - - if ( ! isset( $post ) || ! is_object( $post ) || ! $post instanceof WP_Post ) { - return null; - } - - return $post; - } - - /** - * Gets the focus keyword for a given post. - * - * @param WP_Post $post Post object to get its focus keyword. - * - * @return string Focus keyword, or empty string if none available. - */ - protected function get_post_focus_keyword( $post ) { - if ( ! is_object( $post ) || ! property_exists( $post, 'ID' ) ) { - return ''; - } - - /** - * Filter: 'wpseo_use_page_analysis' Determines if the analysis should be enabled. - * - * @param bool $enabled Determines if the analysis should be enabled. - */ - if ( apply_filters( 'wpseo_use_page_analysis', true ) !== true ) { - return ''; - } - - return WPSEO_Meta::get_value( 'focuskw', $post->ID ); - } - - /** - * Gets the score for a given post. - * - * @param WP_Post $post Post object to get its score. - * - * @return string Score markup, or empty string if none available. - */ - protected function get_post_score( $post ) { - if ( ! is_object( $post ) || ! property_exists( $post, 'ID' ) ) { - return ''; - } - - if ( apply_filters( 'wpseo_use_page_analysis', true ) !== true ) { - return ''; - } - - return $this->get_score_icon(); - } - - /** - * Gets the current term if in a singular term context. - * - * @global string $pagenow Current page identifier. - * @global WP_Query $wp_query Current query object. - * @global WP_Term|null $tag Current term object, or null if none available. - * - * @return WP_Term|null Term object, or null if not in singular context. - */ - protected function get_singular_term() { - global $pagenow, $wp_query, $tag; - - if ( is_category() || is_tag() || is_tax() ) { - return $wp_query->get_queried_object(); - } - - if ( WPSEO_Taxonomy::is_term_edit( $pagenow ) && ! WPSEO_Taxonomy::is_term_overview( $pagenow ) && isset( $tag ) && is_object( $tag ) && ! is_wp_error( $tag ) ) { - return get_term( $tag->term_id ); - } - - return null; - } - - /** - * Gets the score for a given term. - * - * @param WP_Term $term Term object to get its score. - * - * @return string Score markup, or empty string if none available. - */ - protected function get_term_score( $term ) { - if ( ! is_object( $term ) || ! property_exists( $term, 'term_id' ) || ! property_exists( $term, 'taxonomy' ) ) { - return ''; - } - - return $this->get_score_icon(); - } - - /** - * Create the score icon. - * - * @return string The score icon, or empty string. - */ - protected function get_score_icon() { - $is_seo_enabled = $this->get_is_seo_enabled(); - $is_readability_enabled = $this->get_is_readability_enabled(); - - $indexable = $this->get_current_indexable(); - - if ( $is_seo_enabled ) { - return $this->score_icon_helper->for_seo( $indexable, 'adminbar-seo-score' )->present(); - } - - if ( $is_readability_enabled ) { - return $this->score_icon_helper->for_readability( $indexable->readability_score, 'adminbar-seo-score' ) - ->present(); - } - - return ''; - } - - /** - * Gets the URL to the main admin settings page. - * - * @return string Admin settings page URL. - */ - protected function get_settings_page_url() { - return self_admin_url( 'admin.php?page=' . WPSEO_Admin::PAGE_IDENTIFIER ); - } - - /** - * Gets the notification counter if in a valid context. - * - * @return string Notification counter markup, or empty string if not available. - */ - protected function get_notification_counter() { - $notification_center = Yoast_Notification_Center::get(); - $notification_count = $notification_center->get_notification_count(); - - if ( ! $notification_count ) { - return ''; - } - - /* translators: Hidden accessibility text; %s: number of notifications. */ - $counter_screen_reader_text = sprintf( _n( '%s notification', '%s notifications', $notification_count, 'wordpress-seo' ), number_format_i18n( $notification_count ) ); - - return sprintf( '
              %s
              ', $notification_count, $counter_screen_reader_text ); - } - - /** - * Gets the notification popup if in a valid context. - * - * @return string Notification popup markup, or empty string if not available. - */ - protected function get_notification_popup() { - $notification_center = Yoast_Notification_Center::get(); - $new_notifications = $notification_center->get_new_notifications(); - $new_notifications_count = count( $new_notifications ); - - if ( ! $new_notifications_count ) { - return ''; - } - - $notification = sprintf( - _n( - 'There is a new notification.', - 'There are new notifications.', - $new_notifications_count, - 'wordpress-seo' - ), - $new_notifications_count - ); - - return '
              ' . $notification . '
              '; - } - - /** - * Checks whether the current user can manage options in the current context. - * - * @return bool True if capabilities are sufficient, false otherwise. - */ - protected function can_manage_options() { - return ( is_network_admin() && current_user_can( 'wpseo_manage_network_options' ) ) - || ( ! is_network_admin() && WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ); - } - - /** - * Add submenu items to a menu item. - * - * @param array $submenu_items Submenu items array. - * @param WP_Admin_Bar $wp_admin_bar Admin bar object. - * @param string $parent_id Parent menu item ID. - * - * @return void - */ - protected function add_submenu_items( array $submenu_items, WP_Admin_Bar $wp_admin_bar, $parent_id ) { - foreach ( $submenu_items as $menu_item ) { - $menu_args = [ - 'parent' => $parent_id, - 'id' => $menu_item['id'], - 'title' => $menu_item['title'], - 'href' => $menu_item['href'], - 'meta' => [ 'target' => '_blank' ], - ]; - $wp_admin_bar->add_menu( $menu_args ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-content-images.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-content-images.php deleted file mode 100644 index 6218c004..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-content-images.php +++ /dev/null @@ -1,112 +0,0 @@ -get_images_from_content( $this->get_post_content( $post_id, $post ) ); - } - - /** - * Grabs the images from the content. - * - * @param string $content The post content string. - * - * @return array An array of image URLs. - */ - public function get_images_from_content( $content ) { - if ( ! is_string( $content ) ) { - return []; - } - - $content_images = $this->get_img_tags_from_content( $content ); - $images = array_map( [ $this, 'get_img_tag_source' ], $content_images ); - $images = array_filter( $images ); - $images = array_unique( $images ); - $images = array_values( $images ); // Reset the array keys. - - return $images; - } - - /** - * Gets the image tags from a given content string. - * - * @param string $content The content to search for image tags. - * - * @return array An array of `` tags. - */ - private function get_img_tags_from_content( $content ) { - if ( strpos( $content, ']+>`', $content, $matches ); - if ( isset( $matches[0] ) ) { - return $matches[0]; - } - - return []; - } - - /** - * Retrieves the image URL from an image tag. - * - * @param string $image Image HTML element. - * - * @return string|bool The image URL on success, false on failure. - */ - private function get_img_tag_source( $image ) { - preg_match( '`src=(["\'])(.*?)\1`', $image, $matches ); - if ( isset( $matches[2] ) && filter_var( $matches[2], FILTER_VALIDATE_URL ) ) { - return $matches[2]; - } - return false; - } - - /** - * Retrieves the post content we want to work with. - * - * @param int $post_id The post ID. - * @param WP_Post|array|null $post The post. - * - * @return string The content of the supplied post. - */ - private function get_post_content( $post_id, $post ) { - if ( $post === null ) { - $post = get_post( $post_id ); - } - - if ( $post === null ) { - return ''; - } - - /** - * Filter: 'wpseo_pre_analysis_post_content' - Allow filtering the content before analysis. - * - * @param string $post_content The Post content string. - * @param WP_Post $post The current post. - */ - $content = apply_filters( 'wpseo_pre_analysis_post_content', $post->post_content, $post ); - - if ( ! is_string( $content ) ) { - $content = ''; - } - - return $content; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-fields.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-fields.php deleted file mode 100644 index 07771ccb..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-fields.php +++ /dev/null @@ -1,75 +0,0 @@ -postmeta - WHERE meta_key NOT BETWEEN '_' AND '_z' AND SUBSTRING(meta_key, 1, 1) != '_' - LIMIT %d"; - $fields = $wpdb->get_col( $wpdb->prepare( $sql, $limit ) ); - - /** - * Filters the custom fields that are auto-completed and replaced as replacement variables - * in the meta box and sidebar. - * - * @param string[] $fields The custom field names. - */ - $fields = apply_filters( 'wpseo_replacement_variables_custom_fields', $fields ); - - if ( is_array( $fields ) ) { - self::$custom_fields = array_map( [ 'WPSEO_Custom_Fields', 'add_custom_field_prefix' ], $fields ); - } - - return self::$custom_fields; - } - - /** - * Adds the cf_ prefix to a field. - * - * @param string $field The field to prefix. - * - * @return string The prefixed field. - */ - private static function add_custom_field_prefix( $field ) { - return 'cf_' . $field; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-taxonomies.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-taxonomies.php deleted file mode 100644 index 40b8ba23..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-taxonomies.php +++ /dev/null @@ -1,72 +0,0 @@ - true, - '_builtin' => false, - ]; - $custom_taxonomies = get_taxonomies( $args, 'names', 'and' ); - - if ( is_array( $custom_taxonomies ) ) { - foreach ( $custom_taxonomies as $custom_taxonomy ) { - array_push( - self::$custom_taxonomies, - self::add_custom_taxonomies_prefix( $custom_taxonomy ), - self::add_custom_taxonomies_description_prefix( $custom_taxonomy ) - ); - } - } - - return self::$custom_taxonomies; - } - - /** - * Adds the ct_ prefix to a taxonomy. - * - * @param string $taxonomy The taxonomy to prefix. - * - * @return string The prefixed taxonomy. - */ - private static function add_custom_taxonomies_prefix( $taxonomy ) { - return 'ct_' . $taxonomy; - } - - /** - * Adds the ct_desc_ prefix to a taxonomy. - * - * @param string $taxonomy The taxonomy to prefix. - * - * @return string The prefixed taxonomy. - */ - private static function add_custom_taxonomies_description_prefix( $taxonomy ) { - return 'ct_desc_' . $taxonomy; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-image-utils.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-image-utils.php deleted file mode 100644 index 4b606130..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-image-utils.php +++ /dev/null @@ -1,537 +0,0 @@ - $sizes The array of image sizes to loop through. - */ - return apply_filters( 'wpseo_image_sizes', [ 'full', 'large', 'medium_large' ] ); - } - - /** - * Grabs an image alt text. - * - * @param int $attachment_id The attachment ID. - * - * @return string The image alt text. - */ - public static function get_alt_tag( $attachment_id ) { - return (string) get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ); - } - - /** - * Checks whether an img sizes up to the parameters. - * - * @param array $dimensions The image values. - * @param array $usable_dimensions The parameters to check against. - * - * @return bool True if the image has usable measurements, false if not. - */ - private static function has_usable_dimensions( $dimensions, $usable_dimensions ) { - foreach ( [ 'width', 'height' ] as $param ) { - $minimum = $usable_dimensions[ 'min_' . $param ]; - $maximum = $usable_dimensions[ 'max_' . $param ]; - - $current = $dimensions[ $param ]; - if ( ( $current < $minimum ) || ( $current > $maximum ) ) { - return false; - } - } - - return true; - } - - /** - * Gets the post's first usable content image. Null if none is available. - * - * @param int|null $post_id The post id. - * - * @return string|null The image URL. - */ - public static function get_first_usable_content_image_for_post( $post_id = null ) { - $post = get_post( $post_id ); - - // We know get_post() returns the post or null. - if ( ! $post ) { - return null; - } - - $image_finder = new WPSEO_Content_Images(); - $images = $image_finder->get_images( $post->ID, $post ); - - return self::get_first_image( $images ); - } - - /** - * Gets the term's first usable content image. Null if none is available. - * - * @param int $term_id The term id. - * - * @return string|null The image URL. - */ - public static function get_first_content_image_for_term( $term_id ) { - $term_description = term_description( $term_id ); - - // We know term_description() returns a string which may be empty. - if ( $term_description === '' ) { - return null; - } - - $image_finder = new WPSEO_Content_Images(); - $images = $image_finder->get_images_from_content( $term_description ); - - return self::get_first_image( $images ); - } - - /** - * Retrieves an attachment ID for an image uploaded in the settings. - * - * Due to self::get_attachment_by_url returning 0 instead of false. - * 0 is also a possibility when no ID is available. - * - * @param string $setting The setting the image is stored in. - * - * @return int|bool The attachment id, or false or 0 if no ID is available. - */ - public static function get_attachment_id_from_settings( $setting ) { - $image_id = WPSEO_Options::get( $setting . '_id', false ); - if ( $image_id ) { - return $image_id; - } - - $image = WPSEO_Options::get( $setting, false ); - if ( $image ) { - // There is not an option to put a URL in an image field in the settings anymore, only to upload it through the media manager. - // This means an attachment always exists, so doing this is only needed once. - $image_id = self::get_attachment_by_url( $image ); - } - - // Only store a new ID if it is not 0, to prevent an update loop. - if ( $image_id ) { - WPSEO_Options::set( $setting . '_id', $image_id ); - } - - return $image_id; - } - - /** - * Retrieves the first possible image url from an array of images. - * - * @param array $images The array to extract image url from. - * - * @return string|null The extracted image url when found, null when not found. - */ - protected static function get_first_image( $images ) { - if ( ! is_array( $images ) ) { - return null; - } - - $images = array_filter( $images ); - if ( empty( $images ) ) { - return null; - } - - return reset( $images ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-installation.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-installation.php deleted file mode 100644 index 71f6a1a9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-installation.php +++ /dev/null @@ -1,48 +0,0 @@ -is_first_install(); - - if ( $is_first_install && WPSEO_Utils::is_api_available() ) { - add_action( 'wpseo_activate', [ $this, 'set_first_install_options' ] ); - } - } - - /** - * When the option doesn't exist, it should be a new install. - * - * @return bool - */ - private function is_first_install() { - return ( get_option( 'wpseo' ) === false ); - } - - /** - * Sets the options on first install for showing the installation notice and disabling of the settings pages. - * - * @return void - */ - public function set_first_install_options() { - $options = get_option( 'wpseo' ); - - $options['show_onboarding_notice'] = true; - $options['first_activated_on'] = time(); - - update_option( 'wpseo', $options ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-meta.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-meta.php deleted file mode 100644 index 65e2cd9b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-meta.php +++ /dev/null @@ -1,1090 +0,0 @@ - (string) field type. i.e. text / textarea / checkbox / - * radio / select / multiselect / upload etc. - * (required) 'title' => (string) table row title. - * (recommended) 'default_value' => (string|array) default value for the field. - * IMPORTANT: - * - if the field has options, the default has to be the - * key of one of the options. - * - if the field is a text field, the default **has** to be - * an empty string as otherwise the user can't save - * an empty value/delete the meta value. - * - if the field is a checkbox, the only valid values - * are 'on' or 'off'. - * (semi-required) 'options' => (array) options for used with (multi-)select and radio - * fields, required if that's the field type. - * key = (string) value which will be saved to db. - * value = (string) text label for the option. - * (optional) 'autocomplete' => (bool) whether autocomplete is on for text fields, - * defaults to true. - * (optional) 'class' => (string) classname(s) to add to the actual tag. - * (optional) 'description' => (string) description to show underneath the field. - * (optional) 'expl' => (string) label for a checkbox. - * (optional) 'help' => (string) help text to show on mouse over ? image. - * (optional) 'rows' => (int) number of rows for a textarea, defaults to 3. - * (optional) 'placeholder' => (string) Currently only used by add-on plugins. - * (optional) 'serialized' => (bool) whether the value is expected to be serialized, - * i.e. an array or object, defaults to false. - * Currently only used by add-on plugins. - */ - public static $meta_fields = [ - 'general' => [ - 'focuskw' => [ - 'type' => 'hidden', - 'title' => '', - ], - 'title' => [ - 'type' => 'hidden', - 'title' => '', // Translation added later. - 'default_value' => '', - 'description' => '', // Translation added later. - 'help' => '', // Translation added later. - ], - 'metadesc' => [ - 'type' => 'hidden', - 'title' => '', // Translation added later. - 'default_value' => '', - 'class' => 'metadesc', - 'rows' => 2, - 'description' => '', // Translation added later. - 'help' => '', // Translation added later. - ], - 'linkdex' => [ - 'type' => 'hidden', - 'title' => 'linkdex', - 'default_value' => '0', - 'description' => '', - ], - 'content_score' => [ - 'type' => 'hidden', - 'title' => 'content_score', - 'default_value' => '0', - 'description' => '', - ], - 'inclusive_language_score' => [ - 'type' => 'hidden', - 'title' => 'inclusive_language_score', - 'default_value' => '0', - 'description' => '', - ], - 'is_cornerstone' => [ - 'type' => 'hidden', - 'title' => 'is_cornerstone', - 'default_value' => 'false', - 'description' => '', - ], - ], - 'advanced' => [ - 'meta-robots-noindex' => [ - 'type' => 'hidden', - 'title' => '', // Translation added later. - 'default_value' => '0', // = post-type default. - 'options' => [ - '0' => '', // Post type default - translation added later. - '2' => '', // Index - translation added later. - '1' => '', // No-index - translation added later. - ], - ], - 'meta-robots-nofollow' => [ - 'type' => 'hidden', - 'title' => '', // Translation added later. - 'default_value' => '0', // = follow. - 'options' => [ - '0' => '', // Follow - translation added later. - '1' => '', // No-follow - translation added later. - ], - ], - 'meta-robots-adv' => [ - 'type' => 'hidden', - 'title' => '', // Translation added later. - 'default_value' => '', - 'description' => '', // Translation added later. - 'options' => [ - 'noimageindex' => '', // Translation added later. - 'noarchive' => '', // Translation added later. - 'nosnippet' => '', // Translation added later. - ], - ], - 'bctitle' => [ - 'type' => 'hidden', - 'title' => '', // Translation added later. - 'default_value' => '', - 'description' => '', // Translation added later. - ], - 'canonical' => [ - 'type' => 'hidden', - 'title' => '', // Translation added later. - 'default_value' => '', - 'description' => '', // Translation added later. - ], - 'redirect' => [ - 'type' => 'url', - 'title' => '', // Translation added later. - 'default_value' => '', - 'description' => '', // Translation added later. - ], - ], - 'social' => [], - 'schema' => [ - 'schema_page_type' => [ - 'type' => 'hidden', - 'title' => '', - 'options' => Schema_Types::PAGE_TYPES, - ], - 'schema_article_type' => [ - 'type' => 'hidden', - 'title' => '', - 'hide_on_pages' => true, - 'options' => Schema_Types::ARTICLE_TYPES, - ], - ], - /* Fields we should validate & save, but not show on any form. */ - 'non_form' => [ - 'linkdex' => [ - 'type' => null, - 'default_value' => '0', - ], - 'zapier_trigger_sent' => [ - 'type' => null, - 'default_value' => '0', - ], - ], - ]; - - /** - * Helper property - reverse index of the definition array. - * - * Format: [full meta key including prefix] => array - * ['subset'] => (string) primary index - * ['key'] => (string) internal key - * - * @var array - */ - public static $fields_index = []; - - /** - * Helper property - array containing only the defaults in the format: - * [full meta key including prefix] => (string) default value - * - * @var array - */ - public static $defaults = []; - - /** - * Helper property to define the social network meta field definitions - networks. - * - * @var array - */ - private static $social_networks = [ - 'opengraph' => 'opengraph', - 'twitter' => 'twitter', - ]; - - /** - * Helper property to define the social network meta field definitions - fields and their type. - * - * @var array - */ - private static $social_fields = [ - 'title' => 'hidden', - 'description' => 'hidden', - 'image' => 'hidden', - 'image-id' => 'hidden', - ]; - - /** - * Register our actions and filters. - * - * @return void - */ - public static function init() { - foreach ( self::$social_networks as $option => $network ) { - if ( WPSEO_Options::get( $option, false ) === true ) { - foreach ( self::$social_fields as $box => $type ) { - self::$meta_fields['social'][ $network . '-' . $box ] = [ - 'type' => $type, - 'title' => '', // Translation added later. - 'default_value' => '', - 'description' => '', // Translation added later. - ]; - } - } - } - unset( $option, $network, $box, $type ); - - /** - * Allow add-on plugins to register their meta fields for management by this class. - * Calls to add_filter() must be made before plugins_loaded prio 14. - */ - $extra_fields = apply_filters( 'add_extra_wpseo_meta_fields', [] ); - if ( is_array( $extra_fields ) ) { - self::$meta_fields = self::array_merge_recursive_distinct( $extra_fields, self::$meta_fields ); - } - unset( $extra_fields ); - - foreach ( self::$meta_fields as $subset => $field_group ) { - foreach ( $field_group as $key => $field_def ) { - - register_meta( - 'post', - self::$meta_prefix . $key, - [ 'sanitize_callback' => [ self::class, 'sanitize_post_meta' ] ] - ); - - // Set the $fields_index property for efficiency. - self::$fields_index[ self::$meta_prefix . $key ] = [ - 'subset' => $subset, - 'key' => $key, - ]; - - // Set the $defaults property for efficiency. - if ( isset( $field_def['default_value'] ) ) { - self::$defaults[ self::$meta_prefix . $key ] = $field_def['default_value']; - } - else { - // Meta will always be a string, so let's make the meta meta default also a string. - self::$defaults[ self::$meta_prefix . $key ] = ''; - } - } - } - unset( $subset, $field_group, $key, $field_def ); - - self::filter_schema_article_types(); - - add_filter( 'update_post_metadata', [ self::class, 'remove_meta_if_default' ], 10, 5 ); - add_filter( 'add_post_metadata', [ self::class, 'dont_save_meta_if_default' ], 10, 4 ); - } - - /** - * Retrieve the meta box form field definitions for the given tab and post type. - * - * @param string $tab Tab for which to retrieve the field definitions. - * @param string $post_type Post type of the current post. - * - * @return array Array containing the meta box field definitions. - */ - public static function get_meta_field_defs( $tab, $post_type = 'post' ) { - if ( ! isset( self::$meta_fields[ $tab ] ) ) { - return []; - } - - $field_defs = self::$meta_fields[ $tab ]; - - switch ( $tab ) { - case 'non-form': - // Prevent non-form fields from being passed to forms. - $field_defs = []; - break; - - case 'advanced': - global $post; - - if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) && WPSEO_Options::get( 'disableadvanced_meta' ) ) { - return []; - } - - $post_type = ''; - if ( isset( $post->post_type ) ) { - $post_type = $post->post_type; - } - elseif ( ! isset( $post->post_type ) && isset( $_GET['post_type'] ) ) { - $post_type = sanitize_text_field( $_GET['post_type'] ); - } - - if ( $post_type === '' ) { - return []; - } - - /* Adjust the no-index text strings based on the post type. */ - $post_type_object = get_post_type_object( $post_type ); - - $field_defs['meta-robots-noindex']['title'] = sprintf( $field_defs['meta-robots-noindex']['title'], $post_type_object->labels->singular_name ); - $field_defs['meta-robots-noindex']['options']['0'] = sprintf( $field_defs['meta-robots-noindex']['options']['0'], ( ( WPSEO_Options::get( 'noindex-' . $post_type, false ) === true ) ? $field_defs['meta-robots-noindex']['options']['1'] : $field_defs['meta-robots-noindex']['options']['2'] ), $post_type_object->label ); - $field_defs['meta-robots-nofollow']['title'] = sprintf( $field_defs['meta-robots-nofollow']['title'], $post_type_object->labels->singular_name ); - - /* Don't show the breadcrumb title field if breadcrumbs aren't enabled. */ - if ( WPSEO_Options::get( 'breadcrumbs-enable', false ) !== true && ! current_theme_supports( 'yoast-seo-breadcrumbs' ) ) { - unset( $field_defs['bctitle'] ); - } - - if ( empty( $post->ID ) || ( ! empty( $post->ID ) && self::get_value( 'redirect', $post->ID ) === '' ) ) { - unset( $field_defs['redirect'] ); - } - break; - - case 'schema': - if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) && WPSEO_Options::get( 'disableadvanced_meta' ) ) { - return []; - } - - $field_defs['schema_page_type']['default'] = WPSEO_Options::get( 'schema-page-type-' . $post_type ); - - $article_helper = new Article_Helper(); - if ( $article_helper->is_article_post_type( $post_type ) ) { - $default_schema_article_type = WPSEO_Options::get( 'schema-article-type-' . $post_type ); - - /** This filter is documented in inc/options/class-wpseo-option-titles.php */ - $allowed_article_types = apply_filters( 'wpseo_schema_article_types', Schema_Types::ARTICLE_TYPES ); - - if ( ! array_key_exists( $default_schema_article_type, $allowed_article_types ) ) { - $default_schema_article_type = WPSEO_Options::get_default( 'wpseo_titles', 'schema-article-type-' . $post_type ); - } - $field_defs['schema_article_type']['default'] = $default_schema_article_type; - } - else { - unset( $field_defs['schema_article_type'] ); - } - - break; - } - - /** - * Filter the WPSEO metabox form field definitions for a tab. - * {tab} can be 'general', 'advanced' or 'social'. - * - * @param array $field_defs Metabox form field definitions. - * @param string $post_type Post type of the post the metabox is for, defaults to 'post'. - * - * @return array - */ - return apply_filters( 'wpseo_metabox_entries_' . $tab, $field_defs, $post_type ); - } - - /** - * Validate the post meta values. - * - * @param mixed $meta_value The new value. - * @param string $meta_key The full meta key (including prefix). - * - * @return string Validated meta value. - */ - public static function sanitize_post_meta( $meta_value, $meta_key ) { - $field_def = self::$meta_fields[ self::$fields_index[ $meta_key ]['subset'] ][ self::$fields_index[ $meta_key ]['key'] ]; - $clean = self::$defaults[ $meta_key ]; - - switch ( true ) { - case ( $meta_key === self::$meta_prefix . 'linkdex' ): - $int = WPSEO_Utils::validate_int( $meta_value ); - if ( $int !== false && $int >= 0 ) { - $clean = strval( $int ); // Convert to string to make sure default check works. - } - break; - - case ( $field_def['type'] === 'checkbox' ): - // Only allow value if it's one of the predefined options. - if ( in_array( $meta_value, [ 'on', 'off' ], true ) ) { - $clean = $meta_value; - } - break; - - case ( $field_def['type'] === 'select' || $field_def['type'] === 'radio' ): - // Only allow value if it's one of the predefined options. - if ( isset( $field_def['options'][ $meta_value ] ) ) { - $clean = $meta_value; - } - break; - - case ( $field_def['type'] === 'hidden' && $meta_key === self::$meta_prefix . 'meta-robots-adv' ): - $clean = self::validate_meta_robots_adv( $meta_value ); - break; - - case ( $field_def['type'] === 'url' || $meta_key === self::$meta_prefix . 'canonical' ): - // Validate as url(-part). - $url = WPSEO_Utils::sanitize_url( $meta_value ); - if ( $url !== '' ) { - $clean = $url; - } - break; - - case ( $field_def['type'] === 'upload' && in_array( $meta_key, [ self::$meta_prefix . 'opengraph-image', self::$meta_prefix . 'twitter-image' ], true ) ): - // Validate as url. - $url = WPSEO_Utils::sanitize_url( $meta_value, [ 'http', 'https', 'ftp', 'ftps' ] ); - if ( $url !== '' ) { - $clean = $url; - } - break; - - case ( $field_def['type'] === 'hidden' && $meta_key === self::$meta_prefix . 'is_cornerstone' ): - $clean = $meta_value; - - /* - * This used to be a checkbox, then became a hidden input. - * To make sure the value remains consistent, we cast 'true' to '1'. - */ - if ( $meta_value === 'true' ) { - $clean = '1'; - } - break; - - case ( $field_def['type'] === 'hidden' && isset( $field_def['options'] ) ): - // Only allow value if it's one of the predefined options. - if ( isset( $field_def['options'][ $meta_value ] ) ) { - $clean = $meta_value; - } - break; - - case ( $field_def['type'] === 'textarea' ): - if ( is_string( $meta_value ) ) { - // Remove line breaks and tabs. - // @todo [JRF => Yoast] Verify that line breaks and the likes aren't allowed/recommended in meta header fields. - $meta_value = str_replace( [ "\n", "\r", "\t", ' ' ], ' ', $meta_value ); - $clean = WPSEO_Utils::sanitize_text_field( trim( $meta_value ) ); - } - break; - - case ( $field_def['type'] === 'multiselect' ): - $clean = $meta_value; - break; - - case ( $field_def['type'] === 'text' ): - default: - if ( is_string( $meta_value ) ) { - $clean = WPSEO_Utils::sanitize_text_field( trim( $meta_value ) ); - } - - break; - } - - $clean = apply_filters( 'wpseo_sanitize_post_meta_' . $meta_key, $clean, $meta_value, $field_def, $meta_key ); - - return $clean; - } - - /** - * Validate a meta-robots-adv meta value. - * - * @todo [JRF => Yoast] Verify that this logic for the prioritisation is correct. - * - * @param array|string $meta_value The value to validate. - * - * @return string Clean value. - */ - public static function validate_meta_robots_adv( $meta_value ) { - $clean = self::$meta_fields['advanced']['meta-robots-adv']['default_value']; - $options = self::$meta_fields['advanced']['meta-robots-adv']['options']; - - if ( is_string( $meta_value ) ) { - $meta_value = explode( ',', $meta_value ); - } - - if ( is_array( $meta_value ) && $meta_value !== [] ) { - $meta_value = array_map( 'trim', $meta_value ); - - // Individual selected entries. - $cleaning = []; - foreach ( $meta_value as $value ) { - if ( isset( $options[ $value ] ) ) { - $cleaning[] = $value; - } - } - - if ( $cleaning !== [] ) { - $clean = implode( ',', $cleaning ); - } - unset( $cleaning, $value ); - } - - return $clean; - } - - /** - * Prevent saving of default values and remove potential old value from the database if replaced by a default. - * - * @param bool $check The current status to allow updating metadata for the given type. - * @param int $object_id ID of the current object for which the meta is being updated. - * @param string $meta_key The full meta key (including prefix). - * @param string $meta_value New meta value. - * @param string $prev_value The old meta value. - * - * @return bool|null True = stop saving, null = continue saving. - */ - public static function remove_meta_if_default( $check, $object_id, $meta_key, $meta_value, $prev_value = '' ) { - /* If it's one of our meta fields, check against default. */ - if ( isset( self::$fields_index[ $meta_key ] ) && self::meta_value_is_default( $meta_key, $meta_value ) === true ) { - if ( $prev_value !== '' ) { - delete_post_meta( $object_id, $meta_key, $prev_value ); - } - else { - delete_post_meta( $object_id, $meta_key ); - } - - return true; // Stop saving the value. - } - - return $check; // Go on with the normal execution (update) in meta.php. - } - - /** - * Prevent adding of default values to the database. - * - * @param bool $check The current status to allow adding metadata for the given type. - * @param int $object_id ID of the current object for which the meta is being added. - * @param string $meta_key The full meta key (including prefix). - * @param string $meta_value New meta value. - * - * @return bool|null True = stop saving, null = continue saving. - */ - public static function dont_save_meta_if_default( $check, $object_id, $meta_key, $meta_value ) { - /* If it's one of our meta fields, check against default. */ - if ( isset( self::$fields_index[ $meta_key ] ) && self::meta_value_is_default( $meta_key, $meta_value ) === true ) { - return true; // Stop saving the value. - } - - return $check; // Go on with the normal execution (add) in meta.php. - } - - /** - * Is the given meta value the same as the default value ? - * - * @param string $meta_key The full meta key (including prefix). - * @param mixed $meta_value The value to check. - * - * @return bool - */ - public static function meta_value_is_default( $meta_key, $meta_value ) { - return ( isset( self::$defaults[ $meta_key ] ) && $meta_value === self::$defaults[ $meta_key ] ); - } - - /** - * Get a custom post meta value. - * - * Returns the default value if the meta value has not been set. - * - * {@internal Unfortunately there isn't a filter available to hook into before returning - * the results for get_post_meta(), get_post_custom() and the likes. That - * would have been the preferred solution.}} - * - * @param string $key Internal key of the value to get (without prefix). - * @param int $postid Post ID of the post to get the value for. - * - * @return string All 'normal' values returned from get_post_meta() are strings. - * Objects and arrays are possible, but not used by this plugin - * and therefore discarted (except when the special 'serialized' field def - * value is set to true - only used by add-on plugins for now). - * Will return the default value if no value was found. - * Will return empty string if no default was found (not one of our keys) or - * if the post does not exist. - */ - public static function get_value( $key, $postid = 0 ) { - global $post; - - $postid = absint( $postid ); - if ( $postid === 0 ) { - if ( ( isset( $post ) && is_object( $post ) ) && ( isset( $post->post_status ) && $post->post_status !== 'auto-draft' ) ) { - $postid = $post->ID; - } - else { - return ''; - } - } - - $custom = get_post_custom( $postid ); // Array of strings or empty array. - $table_key = self::$meta_prefix . $key; - - // Populate the field_def using the field_index lookup array. - $field_def = []; - if ( isset( self::$fields_index[ $table_key ] ) ) { - $field_def = self::$meta_fields[ self::$fields_index[ $table_key ]['subset'] ][ self::$fields_index[ $table_key ]['key'] ]; - } - - // Check if we have a custom post meta entry. - if ( isset( $custom[ $table_key ][0] ) ) { - $unserialized = maybe_unserialize( $custom[ $table_key ][0] ); - - // Check if it is already unserialized. - if ( $custom[ $table_key ][0] === $unserialized ) { - return $custom[ $table_key ][0]; - } - - // Check whether we need to unserialize it. - if ( isset( $field_def['serialized'] ) && $field_def['serialized'] === true ) { - // Ok, serialize value expected/allowed. - return $unserialized; - } - } - - // Meta was either not found or found, but object/array while not allowed to be. - if ( isset( self::$defaults[ self::$meta_prefix . $key ] ) ) { - // Update the default value to the current post type. - switch ( $key ) { - case 'schema_page_type': - case 'schema_article_type': - return ''; - } - - return self::$defaults[ self::$meta_prefix . $key ]; - } - - /* - * Shouldn't ever happen, means not one of our keys as there will always be a default available - * for all our keys. - */ - return ''; - } - - /** - * Update a meta value for a post. - * - * @param string $key The internal key of the meta value to change (without prefix). - * @param mixed $meta_value The value to set the meta to. - * @param int $post_id The ID of the post to change the meta for. - * - * @return bool Whether the value was changed. - */ - public static function set_value( $key, $meta_value, $post_id ) { - /* - * Slash the data, because `update_metadata` will unslash it and we have already unslashed it. - * Related issue: https://github.com/Yoast/YoastSEO.js/issues/2158 - */ - $meta_value = wp_slash( $meta_value ); - - return update_post_meta( $post_id, self::$meta_prefix . $key, $meta_value ); - } - - /** - * Deletes a meta value for a post. - * - * @param string $key The internal key of the meta value to change (without prefix). - * @param int $post_id The ID of the post to delete the meta for. - * - * @return bool Whether the delete was successful or not. - */ - public static function delete( $key, $post_id ) { - return delete_post_meta( $post_id, self::$meta_prefix . $key ); - } - - /** - * Used for imports, this functions imports the value of $old_metakey into $new_metakey for those post - * where no WPSEO meta data has been set. - * Optionally deletes the $old_metakey values. - * - * @param string $old_metakey The old key of the meta value. - * @param string $new_metakey The new key, usually the WPSEO meta key (including prefix). - * @param bool $delete_old Whether to delete the old meta key/value-sets. - * - * @return void - */ - public static function replace_meta( $old_metakey, $new_metakey, $delete_old = false ) { - global $wpdb; - - /* - * Get only those rows where no wpseo meta values exist for the same post - * (with the exception of linkdex as that will be set independently of whether the post has been edited). - * - * {@internal Query is pretty well optimized this way.}} - */ - $query = $wpdb->prepare( - " - SELECT `a`.* - FROM {$wpdb->postmeta} AS a - WHERE `a`.`meta_key` = %s - AND NOT EXISTS ( - SELECT DISTINCT `post_id` , count( `meta_id` ) AS count - FROM {$wpdb->postmeta} AS b - WHERE `a`.`post_id` = `b`.`post_id` - AND `meta_key` LIKE %s - AND `meta_key` <> %s - GROUP BY `post_id` - ) - ;", - $old_metakey, - $wpdb->esc_like( self::$meta_prefix . '%' ), - self::$meta_prefix . 'linkdex' - ); - $oldies = $wpdb->get_results( $query ); - - if ( is_array( $oldies ) && $oldies !== [] ) { - foreach ( $oldies as $old ) { - update_post_meta( $old->post_id, $new_metakey, $old->meta_value ); - } - } - - // Delete old keys. - if ( $delete_old === true ) { - delete_post_meta_by_key( $old_metakey ); - } - } - - /** - * General clean-up of the saved meta values. - * - Remove potentially lingering old meta keys; - * - Remove all default and invalid values. - * - * @return void - */ - public static function clean_up() { - global $wpdb; - - /* - * Clean up '_yoast_wpseo_meta-robots'. - * - * Retrieve all '_yoast_wpseo_meta-robots' meta values and convert if no new values found. - * - * {@internal Query is pretty well optimized this way.}} - * - * @todo [JRF => Yoast] Find out all possible values which the old '_yoast_wpseo_meta-robots' could contain - * to convert the data correctly. - */ - $query = $wpdb->prepare( - " - SELECT `a`.* - FROM {$wpdb->postmeta} AS a - WHERE `a`.`meta_key` = %s - AND NOT EXISTS ( - SELECT DISTINCT `post_id` , count( `meta_id` ) AS count - FROM {$wpdb->postmeta} AS b - WHERE `a`.`post_id` = `b`.`post_id` - AND ( `meta_key` = %s - OR `meta_key` = %s ) - GROUP BY `post_id` - ) - ;", - self::$meta_prefix . 'meta-robots', - self::$meta_prefix . 'meta-robots-noindex', - self::$meta_prefix . 'meta-robots-nofollow' - ); - $oldies = $wpdb->get_results( $query ); - - if ( is_array( $oldies ) && $oldies !== [] ) { - foreach ( $oldies as $old ) { - $old_values = explode( ',', $old->meta_value ); - foreach ( $old_values as $value ) { - if ( $value === 'noindex' ) { - update_post_meta( $old->post_id, self::$meta_prefix . 'meta-robots-noindex', 1 ); - } - elseif ( $value === 'nofollow' ) { - update_post_meta( $old->post_id, self::$meta_prefix . 'meta-robots-nofollow', 1 ); - } - } - } - } - unset( $query, $oldies, $old, $old_values, $value ); - - // Delete old keys. - delete_post_meta_by_key( self::$meta_prefix . 'meta-robots' ); - - /* - * Remove all default values and (most) invalid option values. - * Invalid option values for the multiselect (meta-robots-adv) field will be dealt with seperately. - * - * {@internal Some of the defaults have changed in v1.5, but as the defaults will - * be removed and new defaults will now automatically be passed when no - * data found, this update is automatic (as long as we remove the old - * values which we do in the below routine).}} - * - * {@internal Unfortunately we can't use the normal delete_meta() with key/value combination - * as '' (empty string) values will be ignored and would result in all metas - * with that key being deleted, not just the empty fields. - * Still, the below implementation is largely based on the delete_meta() function.}} - */ - $query = []; - - foreach ( self::$meta_fields as $subset => $field_group ) { - foreach ( $field_group as $key => $field_def ) { - if ( ! isset( $field_def['default_value'] ) ) { - continue; - } - - if ( isset( $field_def['options'] ) && is_array( $field_def['options'] ) && $field_def['options'] !== [] ) { - $valid = $field_def['options']; - // Remove the default value from the valid options. - unset( $valid[ $field_def['default_value'] ] ); - $valid = array_keys( $valid ); - - $query[] = $wpdb->prepare( - "( meta_key = %s AND meta_value NOT IN ( '" . implode( "','", esc_sql( $valid ) ) . "' ) )", - self::$meta_prefix . $key - ); - unset( $valid ); - } - elseif ( is_string( $field_def['default_value'] ) && $field_def['default_value'] !== '' ) { - $query[] = $wpdb->prepare( - '( meta_key = %s AND meta_value = %s )', - self::$meta_prefix . $key, - $field_def['default_value'] - ); - } - else { - $query[] = $wpdb->prepare( - "( meta_key = %s AND meta_value = '' )", - self::$meta_prefix . $key - ); - } - } - } - unset( $subset, $field_group, $key, $field_def ); - - $query = "SELECT meta_id FROM {$wpdb->postmeta} WHERE " . implode( ' OR ', $query ) . ';'; - $meta_ids = $wpdb->get_col( $query ); - - if ( is_array( $meta_ids ) && $meta_ids !== [] ) { - // WP native action. - do_action( 'delete_post_meta', $meta_ids, null, null, null ); - - $query = "DELETE FROM {$wpdb->postmeta} WHERE meta_id IN( " . implode( ',', $meta_ids ) . ' )'; - $count = $wpdb->query( $query ); - - if ( $count ) { - foreach ( $meta_ids as $object_id ) { - wp_cache_delete( $object_id, 'post_meta' ); - } - - // WP native action. - do_action( 'deleted_post_meta', $meta_ids, null, null, null ); - } - } - unset( $query, $meta_ids, $count, $object_id ); - - /* - * Deal with the multiselect (meta-robots-adv) field. - * - * Removes invalid option combinations, such as 'none,noarchive'. - * - * Default values have already been removed, so we should have a small result set and - * (hopefully) even smaller set of invalid results. - */ - $query = $wpdb->prepare( - "SELECT meta_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = %s", - self::$meta_prefix . 'meta-robots-adv' - ); - $oldies = $wpdb->get_results( $query ); - - if ( is_array( $oldies ) && $oldies !== [] ) { - foreach ( $oldies as $old ) { - $clean = self::validate_meta_robots_adv( $old->meta_value ); - - if ( $clean !== $old->meta_value ) { - if ( $clean !== self::$meta_fields['advanced']['meta-robots-adv']['default_value'] ) { - update_metadata_by_mid( 'post', $old->meta_id, $clean ); - } - else { - delete_metadata_by_mid( 'post', $old->meta_id ); - } - } - } - } - unset( $query, $oldies, $old, $clean ); - - do_action( 'wpseo_meta_clean_up' ); - } - - /** - * Recursively merge a variable number of arrays, using the left array as base, - * giving priority to the right array. - * - * Difference with native array_merge_recursive(): - * array_merge_recursive converts values with duplicate keys to arrays rather than - * overwriting the value in the first array with the duplicate value in the second array. - * - * array_merge_recursive_distinct does not change the data types of the values in the arrays. - * Matching keys' values in the second array overwrite those in the first array, as is the - * case with array_merge. - * - * Freely based on information found on http://www.php.net/manual/en/function.array-merge-recursive.php - * - * {@internal Should be moved to a general utility class.}} - * - * @return array - */ - public static function array_merge_recursive_distinct() { - - $arrays = func_get_args(); - if ( count( $arrays ) < 2 ) { - if ( $arrays === [] ) { - return []; - } - else { - return $arrays[0]; - } - } - - $merged = array_shift( $arrays ); - - foreach ( $arrays as $array ) { - foreach ( $array as $key => $value ) { - if ( is_array( $value ) && ( isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) ) { - $merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value ); - } - else { - $merged[ $key ] = $value; - } - } - unset( $key, $value ); - } - - return $merged; - } - - /** - * Counts the total of all the keywords being used for posts except the given one. - * - * @param string $keyword The keyword to be counted. - * @param int $post_id The id of the post to which the keyword belongs. - * - * @return array - */ - public static function keyword_usage( $keyword, $post_id ) { - - if ( empty( $keyword ) ) { - return []; - } - - /** - * The indexable repository. - * - * @var Indexable_Repository - */ - $repository = YoastSEO()->classes->get( Indexable_Repository::class ); - - $post_ids = $repository->query() - ->select( 'object_id' ) - ->where( 'primary_focus_keyword', $keyword ) - ->where( 'object_type', 'post' ) - ->where_not_equal( 'object_id', $post_id ) - ->where_not_equal( 'post_status', 'trash' ) - ->limit( 2 ) // Limit to 2 results to save time and resources. - ->find_array(); - - // Get object_id from each subarray in $post_ids. - $post_ids = ( is_array( $post_ids ) ) ? array_column( $post_ids, 'object_id' ) : []; - - /* - * If Premium is installed, get the additional keywords as well. - * We only check for the additional keywords if we've not already found two. - * In that case there's no use for an additional query as we already know - * that the keyword has been used multiple times before. - */ - if ( count( $post_ids ) < 2 ) { - /** - * Allows enhancing the array of posts' that share their focus keywords with the post's focus keywords. - * - * @param array $post_ids The array of posts' ids that share their related keywords with the post. - * @param string $keyword The keyword to search for. - * @param int $post_id The id of the post the keyword is associated to. - */ - $post_ids = apply_filters( 'wpseo_posts_for_focus_keyword', $post_ids, $keyword, $post_id ); - } - - return $post_ids; - } - - /** - * Returns the post types for the given post ids. - * - * @param array $post_ids The post ids to get the post types for. - * - * @return array The post types. - */ - public static function post_types_for_ids( $post_ids ) { - - /** - * The indexable repository. - * - * @var Indexable_Repository - */ - $repository = YoastSEO()->classes->get( Indexable_Repository::class ); - - // Check if post ids is not empty. - if ( ! empty( $post_ids ) ) { - // Get the post subtypes for the posts that share the keyword. - $post_types = $repository->query() - ->select( 'object_sub_type' ) - ->where_in( 'object_id', $post_ids ) - ->find_array(); - - // Get object_sub_type from each subarray in $post_ids. - $post_types = array_column( $post_types, 'object_sub_type' ); - } - else { - $post_types = []; - } - - return $post_types; - } - - /** - * Filter the schema article types. - * - * @return void - */ - public static function filter_schema_article_types() { - /** This filter is documented in inc/options/class-wpseo-option-titles.php */ - self::$meta_fields['schema']['schema_article_type']['options'] = apply_filters( 'wpseo_schema_article_types', self::$meta_fields['schema']['schema_article_type']['options'] ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-primary-term.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-primary-term.php deleted file mode 100644 index f5a5ccc2..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-primary-term.php +++ /dev/null @@ -1,86 +0,0 @@ -taxonomy_name = $taxonomy_name; - $this->post_ID = $post_id; - } - - /** - * Returns the primary term ID. - * - * @return int|bool - */ - public function get_primary_term() { - $primary_term = get_post_meta( $this->post_ID, WPSEO_Meta::$meta_prefix . 'primary_' . $this->taxonomy_name, true ); - - if ( ! $primary_term ) { - return false; - } - - $terms = $this->get_terms(); - - if ( ! in_array( (int) $primary_term, wp_list_pluck( $terms, 'term_id' ), true ) ) { - $primary_term = false; - } - - $primary_term = (int) $primary_term; - return ( $primary_term ) ? ( $primary_term ) : false; - } - - /** - * Sets the new primary term ID. - * - * @param int $new_primary_term New primary term ID. - * - * @return void - */ - public function set_primary_term( $new_primary_term ) { - update_post_meta( $this->post_ID, WPSEO_Meta::$meta_prefix . 'primary_' . $this->taxonomy_name, $new_primary_term ); - } - - /** - * Get the terms for the current post ID. - * When $terms is not an array, set $terms to an array. - * - * @return array - */ - protected function get_terms() { - $terms = get_the_terms( $this->post_ID, $this->taxonomy_name ); - - if ( ! is_array( $terms ) ) { - $terms = []; - } - - return $terms; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-rank.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-rank.php deleted file mode 100644 index e44c1e3c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-rank.php +++ /dev/null @@ -1,338 +0,0 @@ - [ - 'start' => 0, - 'end' => 0, - ], - self::BAD => [ - 'start' => 1, - 'end' => 40, - ], - self::OK => [ - 'start' => 41, - 'end' => 70, - ], - self::GOOD => [ - 'start' => 71, - 'end' => 100, - ], - ]; - - /** - * The current rank. - * - * @var int - */ - protected $rank; - - /** - * WPSEO_Rank constructor. - * - * @param int $rank The actual rank. - */ - public function __construct( $rank ) { - if ( ! in_array( $rank, self::$ranks, true ) ) { - $rank = self::BAD; - } - - $this->rank = $rank; - } - - /** - * Returns the saved rank for this rank. - * - * @return string - */ - public function get_rank() { - return $this->rank; - } - - /** - * Returns a CSS class for this rank. - * - * @return string - */ - public function get_css_class() { - $labels = [ - self::NO_FOCUS => 'na', - self::NO_INDEX => 'noindex', - self::BAD => 'bad', - self::OK => 'ok', - self::GOOD => 'good', - ]; - - return $labels[ $this->rank ]; - } - - /** - * Returns a label for this rank. - * - * @return string - */ - public function get_label() { - $labels = [ - self::NO_FOCUS => __( 'Not available', 'wordpress-seo' ), - self::NO_INDEX => __( 'No index', 'wordpress-seo' ), - self::BAD => __( 'Needs improvement', 'wordpress-seo' ), - self::OK => __( 'OK', 'wordpress-seo' ), - self::GOOD => __( 'Good', 'wordpress-seo' ), - ]; - - return $labels[ $this->rank ]; - } - - /** - * Returns an inclusive language label for this rank. - * The only difference with get_label above is that we return "Potentially non-inclusive" for an OK rank. - * - * @return string - */ - public function get_inclusive_language_label() { - if ( $this->rank === self::OK ) { - return __( 'Potentially non-inclusive', 'wordpress-seo' ); - } - return $this->get_label(); - } - - /** - * Returns a label for use in a drop down. - * - * @return mixed - */ - public function get_drop_down_label() { - $labels = [ - self::NO_FOCUS => sprintf( - /* translators: %s expands to the SEO score */ - __( 'SEO: %s', 'wordpress-seo' ), - __( 'No Focus Keyphrase', 'wordpress-seo' ) - ), - self::BAD => sprintf( - /* translators: %s expands to the SEO score */ - __( 'SEO: %s', 'wordpress-seo' ), - __( 'Needs improvement', 'wordpress-seo' ) - ), - self::OK => sprintf( - /* translators: %s expands to the SEO score */ - __( 'SEO: %s', 'wordpress-seo' ), - __( 'OK', 'wordpress-seo' ) - ), - self::GOOD => sprintf( - /* translators: %s expands to the SEO score */ - __( 'SEO: %s', 'wordpress-seo' ), - __( 'Good', 'wordpress-seo' ) - ), - self::NO_INDEX => sprintf( - /* translators: %s expands to the SEO score */ - __( 'SEO: %s', 'wordpress-seo' ), - __( 'Post Noindexed', 'wordpress-seo' ) - ), - ]; - - return $labels[ $this->rank ]; - } - - /** - * Gets the drop down labels for the readability score. - * - * @return string The readability rank label. - */ - public function get_drop_down_readability_labels() { - $labels = [ - self::BAD => sprintf( - /* translators: %s expands to the readability score */ - __( 'Readability: %s', 'wordpress-seo' ), - __( 'Needs improvement', 'wordpress-seo' ) - ), - self::OK => sprintf( - /* translators: %s expands to the readability score */ - __( 'Readability: %s', 'wordpress-seo' ), - __( 'OK', 'wordpress-seo' ) - ), - self::GOOD => sprintf( - /* translators: %s expands to the readability score */ - __( 'Readability: %s', 'wordpress-seo' ), - __( 'Good', 'wordpress-seo' ) - ), - ]; - - return $labels[ $this->rank ]; - } - - /** - * Gets the drop down labels for the inclusive language score. - * - * @return string The inclusive language rank label. - */ - public function get_drop_down_inclusive_language_labels() { - $labels = [ - self::BAD => sprintf( - /* translators: %s expands to the inclusive language score */ - __( 'Inclusive language: %s', 'wordpress-seo' ), - __( 'Needs improvement', 'wordpress-seo' ) - ), - self::OK => sprintf( - /* translators: %s expands to the inclusive language score */ - __( 'Inclusive language: %s', 'wordpress-seo' ), - __( 'Potentially non-inclusive', 'wordpress-seo' ) - ), - self::GOOD => sprintf( - /* translators: %s expands to the inclusive language score */ - __( 'Inclusive language: %s', 'wordpress-seo' ), - __( 'Good', 'wordpress-seo' ) - ), - ]; - - return $labels[ $this->rank ]; - } - - /** - * Get the starting score for this rank. - * - * @return int The start score. - */ - public function get_starting_score() { - // No index does not have a starting score. - if ( $this->rank === self::NO_INDEX ) { - return -1; - } - - return self::$ranges[ $this->rank ]['start']; - } - - /** - * Get the ending score for this rank. - * - * @return int The end score. - */ - public function get_end_score() { - // No index does not have an end score. - if ( $this->rank === self::NO_INDEX ) { - return -1; - } - - return self::$ranges[ $this->rank ]['end']; - } - - /** - * Returns a rank for a specific numeric score. - * - * @param int $score The score to determine a rank for. - * - * @return self - */ - public static function from_numeric_score( $score ) { - // Set up the default value. - $rank = new self( self::BAD ); - - foreach ( self::$ranges as $rank_index => $range ) { - if ( $range['start'] <= $score && $score <= $range['end'] ) { - $rank = new self( $rank_index ); - break; - } - } - - return $rank; - } - - /** - * Returns a list of all possible SEO Ranks. - * - * @return WPSEO_Rank[] - */ - public static function get_all_ranks() { - return array_map( [ 'WPSEO_Rank', 'create_rank' ], self::$ranks ); - } - - /** - * Returns a list of all possible Readability Ranks. - * - * @return WPSEO_Rank[] - */ - public static function get_all_readability_ranks() { - return array_map( [ 'WPSEO_Rank', 'create_rank' ], [ self::BAD, self::OK, self::GOOD ] ); - } - - /** - * Returns a list of all possible Inclusive Language Ranks. - * - * @return WPSEO_Rank[] - */ - public static function get_all_inclusive_language_ranks() { - return array_map( [ 'WPSEO_Rank', 'create_rank' ], [ self::BAD, self::OK, self::GOOD ] ); - } - - /** - * Converts a numeric rank into a WPSEO_Rank object, for use in functional array_* functions. - * - * @param string $rank SEO Rank. - * - * @return WPSEO_Rank - */ - private static function create_rank( $rank ) { - return new self( $rank ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-replace-vars.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-replace-vars.php deleted file mode 100644 index 5dd81d78..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-replace-vars.php +++ /dev/null @@ -1,1646 +0,0 @@ - '', - 'name' => '', - 'post_author' => '', - 'post_content' => '', - 'post_date' => '', - 'post_excerpt' => '', - 'post_modified' => '', - 'post_title' => '', - 'taxonomy' => '', - 'term_id' => '', - 'term404' => '', - ]; - - /** - * Current post/page/cpt information. - * - * @var stdClass - */ - protected $args; - - /** - * Help texts for use in WPSEO -> Search appearance tabs. - * - * @var array - */ - protected static $help_texts = []; - - /** - * Register of additional variable replacements registered by other plugins/themes. - * - * @var array - */ - protected static $external_replacements = []; - - /** - * Setup the help texts and external replacements as statics so they will be available to all instances. - * - * @return void - */ - public static function setup_statics_once() { - if ( self::$help_texts === [] ) { - self::set_basic_help_texts(); - self::set_advanced_help_texts(); - } - - if ( self::$external_replacements === [] ) { - /** - * Action: 'wpseo_register_extra_replacements' - Allows for registration of additional - * variables to replace. - */ - do_action( 'wpseo_register_extra_replacements' ); - } - } - - /** - * Register new replacement %%variables%%. - * For use by other plugins/themes to register extra variables. - * - * @see wpseo_register_var_replacement() for a usage example. - * - * @param string $var_to_replace The name of the variable to replace, i.e. '%%var%%'. - * Note: the surrounding %% are optional. - * @param mixed $replace_function Function or method to call to retrieve the replacement value for the variable. - * Uses the same format as add_filter/add_action function parameter and - * should *return* the replacement value. DON'T echo it. - * @param string $type Type of variable: 'basic' or 'advanced', defaults to 'advanced'. - * @param string $help_text Help text to be added to the help tab for this variable. - * - * @return bool Whether the replacement function was succesfully registered. - */ - public static function register_replacement( $var_to_replace, $replace_function, $type = 'advanced', $help_text = '' ) { - $success = false; - - if ( is_string( $var_to_replace ) && $var_to_replace !== '' ) { - $var_to_replace = self::remove_var_delimiter( $var_to_replace ); - - if ( preg_match( '`^[A-Z0-9_-]+$`i', $var_to_replace ) === false ) { - trigger_error( esc_html__( 'A replacement variable can only contain alphanumeric characters, an underscore or a dash. Try renaming your variable.', 'wordpress-seo' ), E_USER_WARNING ); - } - elseif ( strpos( $var_to_replace, 'cf_' ) === 0 || strpos( $var_to_replace, 'ct_' ) === 0 ) { - trigger_error( esc_html__( 'A replacement variable can not start with "%%cf_" or "%%ct_" as these are reserved for the WPSEO standard variable variables for custom fields and custom taxonomies. Try making your variable name unique.', 'wordpress-seo' ), E_USER_WARNING ); - } - elseif ( ! method_exists( self::class, 'retrieve_' . $var_to_replace ) ) { - if ( $var_to_replace !== '' && ! isset( self::$external_replacements[ $var_to_replace ] ) ) { - self::$external_replacements[ $var_to_replace ] = $replace_function; - $replacement_variable = new WPSEO_Replacement_Variable( $var_to_replace, $var_to_replace, $help_text ); - self::register_help_text( $type, $replacement_variable ); - $success = true; - } - else { - trigger_error( esc_html__( 'A replacement variable with the same name has already been registered. Try making your variable name unique.', 'wordpress-seo' ), E_USER_WARNING ); - } - } - else { - trigger_error( esc_html__( 'You cannot overrule a WPSEO standard variable replacement by registering a variable with the same name. Use the "wpseo_replacements" filter instead to adjust the replacement value.', 'wordpress-seo' ), E_USER_WARNING ); - } - } - - return $success; - } - - /** - * Replace `%%variable_placeholders%%` with their real value based on the current requested page/post/cpt/etc. - * - * @param string $text The string to replace the variables in. - * @param array $args The object some of the replacement values might come from, - * could be a post, taxonomy or term. - * @param array $omit Variables that should not be replaced by this function. - * - * @return string - */ - public function replace( $text, $args, $omit = [] ) { - - $text = wp_strip_all_tags( $text ); - - // Let's see if we can bail super early. - if ( strpos( $text, '%%' ) === false ) { - return YoastSEO()->helpers->string->standardize_whitespace( $text ); - } - - $args = (array) $args; - if ( isset( $args['post_content'] ) && ! empty( $args['post_content'] ) ) { - $args['post_content'] = YoastSEO()->helpers->string->strip_shortcode( $args['post_content'] ); - } - if ( isset( $args['post_excerpt'] ) && ! empty( $args['post_excerpt'] ) ) { - $args['post_excerpt'] = YoastSEO()->helpers->string->strip_shortcode( $args['post_excerpt'] ); - } - $this->args = (object) wp_parse_args( $args, $this->defaults ); - - // Clean $omit array. - if ( is_array( $omit ) && $omit !== [] ) { - $omit = array_map( [ self::class, 'remove_var_delimiter' ], $omit ); - } - - $replacements = []; - if ( preg_match_all( '`%%([^%]+(%%single)?)%%?`iu', $text, $matches ) ) { - $replacements = $this->set_up_replacements( $matches, $omit ); - } - - /** - * Filter: 'wpseo_replacements' - Allow customization of the replacements before they are applied. - * - * @param array $replacements The replacements. - * @param array $args The object some of the replacement values might come from, - * could be a post, taxonomy or term. - */ - $replacements = apply_filters( 'wpseo_replacements', $replacements, $this->args ); - - // Do the actual replacements. - if ( is_array( $replacements ) && $replacements !== [] ) { - $text = str_replace( - array_keys( $replacements ), - // Make sure to exclude replacement values that are arrays e.g. coming from a custom field serialized value. - array_filter( array_values( $replacements ), 'is_scalar' ), - $text - ); - } - - /** - * Filter: 'wpseo_replacements_final' - Allow overruling of whether or not to remove placeholders - * which didn't yield a replacement. - * - * @example add_filter( 'wpseo_replacements_final', '__return_false' ); - * - * @param bool $final - */ - if ( apply_filters( 'wpseo_replacements_final', true ) === true && ( isset( $matches[1] ) && is_array( $matches[1] ) ) ) { - // Remove non-replaced variables. - $remove = array_diff( $matches[1], $omit ); // Make sure the $omit variables do not get removed. - $remove = array_map( [ self::class, 'add_var_delimiter' ], $remove ); - $text = str_replace( $remove, '', $text ); - } - - // Undouble separators which have nothing between them, i.e. where a non-replaced variable was removed. - if ( isset( $replacements['%%sep%%'] ) && ( is_string( $replacements['%%sep%%'] ) && $replacements['%%sep%%'] !== '' ) ) { - $q_sep = preg_quote( $replacements['%%sep%%'], '`' ); - $text = preg_replace( '`' . $q_sep . '(?:\s*' . $q_sep . ')*`u', $replacements['%%sep%%'], $text ); - } - - // Remove superfluous whitespace. - $text = YoastSEO()->helpers->string->standardize_whitespace( $text ); - - return $text; - } - - /** - * Register a new replacement variable if it has not been registered already. - * - * @param string $var_to_replace The name of the variable to replace, i.e. '%%var%%'. - * Note: the surrounding %% are optional. - * @param mixed $replace_function Function or method to call to retrieve the replacement value for the variable. - * Uses the same format as add_filter/add_action function parameter and - * should *return* the replacement value. DON'T echo it. - * @param string $type Type of variable: 'basic' or 'advanced', defaults to 'advanced'. - * @param string $help_text Help text to be added to the help tab for this variable. - * - * @return bool `true` if the replace var has been registered, `false` if not. - */ - public function safe_register_replacement( $var_to_replace, $replace_function, $type = 'advanced', $help_text = '' ) { - if ( ! $this->has_been_registered( $var_to_replace ) ) { - return self::register_replacement( $var_to_replace, $replace_function, $type, $help_text ); - } - return false; - } - - /** - * Checks whether the given replacement variable has already been registered or not. - * - * @param string $replacement_variable The replacement variable to check, including the variable delimiter (e.g. `%%var%%`). - * - * @return bool `true` if the replacement variable has already been registered. - */ - public function has_been_registered( $replacement_variable ) { - $replacement_variable = self::remove_var_delimiter( $replacement_variable ); - - return isset( self::$external_replacements[ $replacement_variable ] ); - } - - /** - * Returns the list of hidden replace vars. - * - * E.g. the replace vars that should work, but are not advertised. - * - * @return string[] The list of hidden replace vars. - */ - public function get_hidden_replace_vars() { - return [ - 'currentdate', - 'currentyear', - 'currentmonth', - 'currentday', - 'post_year', - 'post_month', - 'post_day', - 'author_first_name', - 'author_last_name', - 'permalink', - 'post_content', - 'category_title', - ]; - } - - /** - * Retrieve the replacements for the variables found. - * - * @param array $matches Variables found in the original string - regex result. - * @param array $omit Variables that should not be replaced by this function. - * - * @return array Retrieved replacements - this might be a smaller array as some variables - * may not yield a replacement in certain contexts. - */ - private function set_up_replacements( $matches, $omit ) { - - $replacements = []; - - // @todo Figure out a way to deal with external functions starting with cf_/ct_. - foreach ( $matches[1] as $k => $var ) { - - // Don't set up replacements which should be omitted. - if ( in_array( $var, $omit, true ) ) { - continue; - } - - // Deal with variable variable names first. - if ( strpos( $var, 'cf_' ) === 0 ) { - $replacement = $this->retrieve_cf_custom_field_name( $var ); - } - elseif ( strpos( $var, 'ct_desc_' ) === 0 ) { - $replacement = $this->retrieve_ct_desc_custom_tax_name( $var ); - } - elseif ( strpos( $var, 'ct_' ) === 0 ) { - $single = ( isset( $matches[2][ $k ] ) && $matches[2][ $k ] !== '' ); - $replacement = $this->retrieve_ct_custom_tax_name( $var, $single ); - } - // Deal with non-variable variable names. - elseif ( method_exists( $this, 'retrieve_' . $var ) ) { - $method_name = 'retrieve_' . $var; - $replacement = $this->$method_name(); - } - // Deal with externally defined variable names. - elseif ( isset( self::$external_replacements[ $var ] ) && ! is_null( self::$external_replacements[ $var ] ) ) { - $replacement = call_user_func( self::$external_replacements[ $var ], $var, $this->args ); - } - - // Replacement retrievals can return null if no replacement can be determined, root those outs. - if ( isset( $replacement ) ) { - $var = self::add_var_delimiter( $var ); - $replacements[ $var ] = $replacement; - } - unset( $replacement, $single, $method_name ); - } - - return $replacements; - } - - /* *********************** BASIC VARIABLES ************************** */ - - /** - * Retrieve the post/cpt categories (comma separated) for use as replacement string. - * - * @return string|null - */ - private function retrieve_category() { - $replacement = null; - - if ( ! empty( $this->args->ID ) ) { - $cat = $this->get_terms( $this->args->ID, 'category' ); - if ( $cat !== '' ) { - return $cat; - } - } - - if ( isset( $this->args->cat_name ) && ! empty( $this->args->cat_name ) ) { - $replacement = $this->args->cat_name; - } - - return $replacement; - } - - /** - * Retrieve the category description for use as replacement string. - * - * @return string|null - */ - private function retrieve_category_description() { - return $this->retrieve_term_description(); - } - - /** - * Retrieve the date of the post/page/cpt for use as replacement string. - * - * @return string|null - */ - private function retrieve_date() { - $replacement = null; - - if ( $this->args->post_date !== '' ) { - // Returns a string. - $replacement = YoastSEO()->helpers->date->format_translated( $this->args->post_date, get_option( 'date_format' ) ); - } - elseif ( get_query_var( 'day' ) && get_query_var( 'day' ) !== '' ) { - // Returns a string. - $replacement = get_the_date(); - } - elseif ( single_month_title( ' ', false ) && single_month_title( ' ', false ) !== '' ) { - // Returns a string. - $replacement = single_month_title( ' ', false ); - } - elseif ( get_query_var( 'year' ) !== '' ) { - // Returns an integer, let's cast to string. - $replacement = (string) get_query_var( 'year' ); - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt excerpt for use as replacement string. - * The excerpt will be auto-generated if it does not exist. - * - * @return string|null - */ - private function retrieve_excerpt() { - $replacement = null; - $locale = get_locale(); - - // Japanese doesn't have a jp_JP variant in WP. - $limit = ( $locale === 'ja' ) ? 80 : 156; - - // The check `post_password_required` is because excerpt must be hidden for a post with a password. - if ( ! empty( $this->args->ID ) && ! post_password_required( $this->args->ID ) ) { - if ( $this->args->post_excerpt !== '' ) { - $replacement = wp_strip_all_tags( $this->args->post_excerpt ); - } - elseif ( $this->args->post_content !== '' ) { - $content = strip_shortcodes( $this->args->post_content ); - $content = wp_strip_all_tags( $content ); - - if ( mb_strlen( $content ) <= $limit ) { - return $content; - } - - $replacement = wp_html_excerpt( $content, $limit ); - - // Check if the description has space and trim the auto-generated string to a word boundary. - if ( strrpos( $replacement, ' ' ) ) { - $replacement = substr( $replacement, 0, strrpos( $replacement, ' ' ) ); - } - } - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt excerpt for use as replacement string (without auto-generation). - * - * @return string|null - */ - private function retrieve_excerpt_only() { - $replacement = null; - - // The check `post_password_required` is because excerpt must be hidden for a post with a password. - if ( ! empty( $this->args->ID ) && $this->args->post_excerpt !== '' && ! post_password_required( $this->args->ID ) ) { - $replacement = wp_strip_all_tags( $this->args->post_excerpt ); - } - - return $replacement; - } - - /** - * Retrieve the title of the parent page of the current page/cpt for use as replacement string. - * Only applicable for hierarchical post types. - * - * @todo Check: shouldn't this use $this->args as well ? - * - * @return string|null - */ - private function retrieve_parent_title() { - $replacement = null; - - if ( ! empty( $this->args->ID ) ) { - $parent_id = wp_get_post_parent_id( $this->args->ID ); - if ( $parent_id ) { - $replacement = get_the_title( $parent_id ); - } - } - - return $replacement; - } - - /** - * Retrieve the current search phrase for use as replacement string. - * - * @return string|null - */ - private function retrieve_searchphrase() { - $replacement = null; - - $search = get_query_var( 's' ); - if ( $search !== '' ) { - $replacement = esc_html( $search ); - } - - return $replacement; - } - - /** - * Retrieve the separator for use as replacement string. - * - * @return string Retrieves the title separator. - */ - private function retrieve_sep() { - return YoastSEO()->helpers->options->get_title_separator(); - } - - /** - * Retrieve the site's tag line / description for use as replacement string. - * - * The `$replacement` variable is static because it doesn't change depending - * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. - * - * @return string|null - */ - private function retrieve_sitedesc() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $description = wp_strip_all_tags( get_bloginfo( 'description' ) ); - if ( $description !== '' ) { - $replacement = $description; - } - } - - return $replacement; - } - - /** - * Retrieve the site's name for use as replacement string. - * - * The `$replacement` variable is static because it doesn't change depending - * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. - * - * @return string|null - */ - private function retrieve_sitename() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $sitename = YoastSEO()->helpers->site->get_site_name(); - if ( $sitename !== '' ) { - $replacement = $sitename; - } - } - - return $replacement; - } - - /** - * Retrieve the current tag/tags for use as replacement string. - * - * @return string|null - */ - private function retrieve_tag() { - $replacement = null; - - if ( ! empty( $this->args->ID ) ) { - $tags = $this->get_terms( $this->args->ID, 'post_tag' ); - if ( $tags !== '' ) { - $replacement = $tags; - } - } - - return $replacement; - } - - /** - * Retrieve the tag description for use as replacement string. - * - * @return string|null - */ - private function retrieve_tag_description() { - return $this->retrieve_term_description(); - } - - /** - * Retrieve the term description for use as replacement string. - * - * @return string|null - */ - private function retrieve_term_description() { - $replacement = null; - - if ( ! empty( $this->args->term_id ) && ! empty( $this->args->taxonomy ) ) { - $term_desc = get_term_field( 'description', $this->args->term_id, $this->args->taxonomy ); - if ( $term_desc !== '' ) { - $replacement = wp_strip_all_tags( $term_desc ); - } - } - - return $replacement; - } - - /** - * Retrieve the term name for use as replacement string. - * - * @return string|null - */ - private function retrieve_term_title() { - $replacement = null; - - if ( ! empty( $this->args->taxonomy ) && ! empty( $this->args->name ) ) { - $replacement = $this->args->name; - } - - return $replacement; - } - - /** - * Retrieve the title of the post/page/cpt for use as replacement string. - * - * @return string|null - */ - private function retrieve_title() { - $replacement = null; - - if ( is_string( $this->args->post_title ) && $this->args->post_title !== '' ) { - $replacement = $this->args->post_title; - } - - return $replacement; - } - - /** - * Retrieve primary category for use as replacement string. - * - * @return bool|int|null - */ - private function retrieve_primary_category() { - $primary_category = null; - - if ( ! empty( $this->args->ID ) ) { - $wpseo_primary_category = new WPSEO_Primary_Term( 'category', $this->args->ID ); - - $term_id = $wpseo_primary_category->get_primary_term(); - $term = get_term( $term_id ); - - if ( ! is_wp_error( $term ) && ! empty( $term ) ) { - $primary_category = $term->name; - } - } - - return $primary_category; - } - - /** - * Retrieve the string generated by get_the_archive_title(). - * - * @return string|null - */ - private function retrieve_archive_title() { - return get_the_archive_title(); - } - - /* *********************** ADVANCED VARIABLES ************************** */ - - /** - * Determine the page numbering of the current post/page/cpt. - * - * @param string $request Either 'nr'|'max' - whether to return the page number or the max number of pages. - * - * @return int|null - */ - private function determine_pagenumbering( $request = 'nr' ) { - global $wp_query, $post; - $max_num_pages = null; - $page_number = null; - - $max_num_pages = 1; - - if ( ! is_singular() ) { - $page_number = get_query_var( 'paged' ); - if ( $page_number === 0 || $page_number === '' ) { - $page_number = 1; - } - - if ( ! empty( $wp_query->max_num_pages ) ) { - $max_num_pages = $wp_query->max_num_pages; - } - } - else { - $page_number = get_query_var( 'page' ); - if ( $page_number === 0 || $page_number === '' ) { - $page_number = 1; - } - - if ( isset( $post->post_content ) ) { - $max_num_pages = ( substr_count( $post->post_content, '' ) + 1 ); - } - } - - $return = null; - - switch ( $request ) { - case 'nr': - $return = $page_number; - break; - case 'max': - $return = $max_num_pages; - break; - } - - return $return; - } - - /** - * Determine the post type names for the current post/page/cpt. - * - * @param string $request Either 'single'|'plural' - whether to return the single or plural form. - * - * @return string|null - */ - private function determine_pt_names( $request = 'single' ) { - global $wp_query; - $pt_single = null; - $pt_plural = null; - $post_type = ''; - - if ( isset( $wp_query->query_vars['post_type'] ) && ( ( is_string( $wp_query->query_vars['post_type'] ) && $wp_query->query_vars['post_type'] !== '' ) || ( is_array( $wp_query->query_vars['post_type'] ) && $wp_query->query_vars['post_type'] !== [] ) ) ) { - $post_type = $wp_query->query_vars['post_type']; - } - elseif ( isset( $this->args->post_type ) && ( is_string( $this->args->post_type ) && $this->args->post_type !== '' ) ) { - $post_type = $this->args->post_type; - } - else { - // Make it work in preview mode. - $post = $wp_query->get_queried_object(); - if ( $post instanceof WP_Post ) { - $post_type = $post->post_type; - } - } - - if ( is_array( $post_type ) ) { - $post_type = reset( $post_type ); - } - - if ( $post_type !== '' ) { - $pt = get_post_type_object( $post_type ); - $pt_single = $pt->name; - $pt_plural = $pt->name; - if ( isset( $pt->labels->singular_name ) ) { - $pt_single = $pt->labels->singular_name; - } - if ( isset( $pt->labels->name ) ) { - $pt_plural = $pt->labels->name; - } - } - - $return = null; - - switch ( $request ) { - case 'single': - $return = $pt_single; - break; - case 'plural': - $return = $pt_plural; - break; - } - - return $return; - } - - /** - * Retrieve the attachment caption for use as replacement string. - * - * @return string|null - */ - private function retrieve_caption() { - return $this->retrieve_excerpt_only(); - } - - /** - * Retrieve a post/page/cpt's custom field value for use as replacement string. - * - * @param string $var_to_replace The complete variable to replace which includes the name of - * the custom field which value is to be retrieved. - * - * @return string|null - */ - private function retrieve_cf_custom_field_name( $var_to_replace ) { - $replacement = null; - - if ( is_string( $var_to_replace ) && $var_to_replace !== '' ) { - $field = substr( $var_to_replace, 3 ); - if ( ! empty( $this->args->ID ) ) { - // Post meta can be arrays and in this case we need to exclude them. - $name = get_post_meta( $this->args->ID, $field, true ); - if ( $name !== '' && ! is_array( $name ) ) { - $replacement = $name; - } - } - elseif ( ! empty( $this->args->term_id ) ) { - $name = get_term_meta( $this->args->term_id, $field, true ); - if ( $name !== '' ) { - $replacement = $name; - } - } - } - - return $replacement; - } - - /** - * Retrieve a post/page/cpt's custom taxonomies for use as replacement string. - * - * @param string $var_to_replace The complete variable to replace which includes the name of - * the custom taxonomy which value(s) is to be retrieved. - * @param bool $single Whether to retrieve only the first or all values for the taxonomy. - * - * @return string|null - */ - private function retrieve_ct_custom_tax_name( $var_to_replace, $single = false ) { - $replacement = null; - - if ( ( is_string( $var_to_replace ) && $var_to_replace !== '' ) && ! empty( $this->args->ID ) ) { - $tax = substr( $var_to_replace, 3 ); - $name = $this->get_terms( $this->args->ID, $tax, $single ); - if ( $name !== '' ) { - $replacement = $name; - } - } - - return $replacement; - } - - /** - * Retrieve a post/page/cpt's custom taxonomies description for use as replacement string. - * - * @param string $var_to_replace The complete variable to replace which includes the name of - * the custom taxonomy which description is to be retrieved. - * - * @return string|null - */ - private function retrieve_ct_desc_custom_tax_name( $var_to_replace ) { - $replacement = null; - - if ( is_string( $var_to_replace ) && $var_to_replace !== '' ) { - $tax = substr( $var_to_replace, 8 ); - if ( ! empty( $this->args->ID ) ) { - $terms = get_the_terms( $this->args->ID, $tax ); - if ( is_array( $terms ) && $terms !== [] ) { - $term = current( $terms ); - $term_desc = get_term_field( 'description', $term->term_id, $tax ); - if ( $term_desc !== '' ) { - $replacement = wp_strip_all_tags( $term_desc ); - } - } - } - } - - return $replacement; - } - - /** - * Retrieve the current date for use as replacement string. - * - * The `$replacement` variable is static because it doesn't change depending - * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. - * - * @return string The formatted current date. - */ - private function retrieve_currentdate() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $replacement = date_i18n( get_option( 'date_format' ) ); - } - - return $replacement; - } - - /** - * Retrieve the current day for use as replacement string. - * - * The `$replacement` variable is static because it doesn't change depending - * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. - * - * @return string The current day. - */ - private function retrieve_currentday() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $replacement = date_i18n( 'j' ); - } - - return $replacement; - } - - /** - * Retrieve the current month for use as replacement string. - * - * The `$replacement` variable is static because it doesn't change depending - * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. - * - * @return string The current month. - */ - private function retrieve_currentmonth() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $replacement = date_i18n( 'F' ); - } - - return $replacement; - } - - /** - * Retrieve the current time for use as replacement string. - * - * The `$replacement` variable is static because it doesn't change depending - * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. - * - * @return string The formatted current time. - */ - private function retrieve_currenttime() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $replacement = date_i18n( get_option( 'time_format' ) ); - } - - return $replacement; - } - - /** - * Retrieve the current year for use as replacement string. - * - * The `$replacement` variable is static because it doesn't change depending - * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. - * - * @return string The current year. - */ - private function retrieve_currentyear() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $replacement = date_i18n( 'Y' ); - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt's focus keyword for use as replacement string. - * - * @return string|null - */ - private function retrieve_focuskw() { - // Retrieve focuskw from a Post. - if ( ! empty( $this->args->ID ) ) { - $focus_kw = WPSEO_Meta::get_value( 'focuskw', $this->args->ID ); - if ( $focus_kw !== '' ) { - return $focus_kw; - } - - return null; - } - - // Retrieve focuskw from a Term. - if ( ! empty( $this->args->term_id ) ) { - $focus_kw = WPSEO_Taxonomy_Meta::get_term_meta( $this->args->term_id, $this->args->taxonomy, 'focuskw' ); - if ( $focus_kw !== '' ) { - return $focus_kw; - } - } - - return null; - } - - /** - * Retrieve the post/page/cpt ID for use as replacement string. - * - * @return string|null - */ - private function retrieve_id() { - $replacement = null; - - if ( ! empty( $this->args->ID ) ) { - // The post/page/cpt ID is an integer, let's cast to string. - $replacement = (string) $this->args->ID; - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt modified time for use as replacement string. - * - * @return string|null - */ - private function retrieve_modified() { - $replacement = null; - - if ( ! empty( $this->args->post_modified ) ) { - $replacement = YoastSEO()->helpers->date->format_translated( $this->args->post_modified, get_option( 'date_format' ) ); - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt author's "nice name" for use as replacement string. - * - * @return string|null - */ - private function retrieve_name() { - $replacement = null; - - $user_id = (int) $this->retrieve_userid(); - $name = get_the_author_meta( 'display_name', $user_id ); - if ( $name !== '' ) { - $replacement = $name; - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt author's users description for use as a replacement string. - * - * @return string|null - */ - private function retrieve_user_description() { - $replacement = null; - - $user_id = (int) $this->retrieve_userid(); - $description = get_the_author_meta( 'description', $user_id ); - if ( $description !== '' ) { - $replacement = $description; - } - - return $replacement; - } - - /** - * Retrieve the current page number with context (i.e. 'page 2 of 4') for use as replacement string. - * - * @return string - */ - private function retrieve_page() { - $replacement = null; - - $max = $this->determine_pagenumbering( 'max' ); - $nr = $this->determine_pagenumbering( 'nr' ); - $sep = $this->retrieve_sep(); - - if ( $max > 1 && $nr > 1 ) { - /* translators: 1: current page number, 2: total number of pages. */ - $replacement = sprintf( $sep . ' ' . __( 'Page %1$d of %2$d', 'wordpress-seo' ), $nr, $max ); - } - - return $replacement; - } - - /** - * Retrieve the current page number for use as replacement string. - * - * @return string|null - */ - private function retrieve_pagenumber() { - $replacement = null; - - $nr = $this->determine_pagenumbering( 'nr' ); - if ( isset( $nr ) && $nr > 0 ) { - $replacement = (string) $nr; - } - - return $replacement; - } - - /** - * Retrieve the current page total for use as replacement string. - * - * @return string|null - */ - private function retrieve_pagetotal() { - $replacement = null; - - $max = $this->determine_pagenumbering( 'max' ); - if ( isset( $max ) && $max > 0 ) { - $replacement = (string) $max; - } - - return $replacement; - } - - /** - * Retrieve the post type plural label for use as replacement string. - * - * @return string|null - */ - private function retrieve_pt_plural() { - $replacement = null; - - $name = $this->determine_pt_names( 'plural' ); - if ( isset( $name ) && $name !== '' ) { - $replacement = $name; - } - - return $replacement; - } - - /** - * Retrieve the post type single label for use as replacement string. - * - * @return string|null - */ - private function retrieve_pt_single() { - $replacement = null; - - $name = $this->determine_pt_names( 'single' ); - if ( isset( $name ) && $name !== '' ) { - $replacement = $name; - } - - return $replacement; - } - - /** - * Retrieve the slug which caused the 404 for use as replacement string. - * - * @return string|null - */ - private function retrieve_term404() { - $replacement = null; - - if ( $this->args->term404 !== '' ) { - $replacement = sanitize_text_field( str_replace( '-', ' ', $this->args->term404 ) ); - } - else { - $error_request = get_query_var( 'pagename' ); - if ( $error_request !== '' ) { - $replacement = sanitize_text_field( str_replace( '-', ' ', $error_request ) ); - } - else { - $error_request = get_query_var( 'name' ); - if ( $error_request !== '' ) { - $replacement = sanitize_text_field( str_replace( '-', ' ', $error_request ) ); - } - } - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt author's user id for use as replacement string. - * - * @return string - */ - private function retrieve_userid() { - // The user ID is an integer, let's cast to string. - $replacement = ! empty( $this->args->post_author ) ? (string) $this->args->post_author : (string) get_query_var( 'author' ); - - return $replacement; - } - - /** - * Retrieve the post/page/cpt's published year for use as replacement string. - * - * @return string|null - */ - private function retrieve_post_year() { - if ( empty( $this->args->ID ) ) { - return null; - } - - return get_the_date( 'Y', $this->args->ID ); - } - - /** - * Retrieve the post/page/cpt's published month for use as replacement string. - * - * @return string|null - */ - private function retrieve_post_month() { - if ( empty( $this->args->ID ) ) { - return null; - } - - return get_the_date( 'F', $this->args->ID ); - } - - /** - * Retrieve the post/page/cpt's published day for use as replacement string. - * - * @return string|null - */ - private function retrieve_post_day() { - if ( empty( $this->args->ID ) ) { - return null; - } - - return get_the_date( 'd', $this->args->ID ); - } - - /** - * Retrieve the post/page/cpt author's first name for use as replacement string. - * - * @return string|null - */ - private function retrieve_author_first_name() { - $replacement = null; - - $user_id = (int) $this->retrieve_userid(); - $name = get_the_author_meta( 'first_name', $user_id ); - if ( $name !== '' ) { - $replacement = $name; - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt author's last name for use as replacement string. - * - * @return string|null - */ - private function retrieve_author_last_name() { - $replacement = null; - - $user_id = (int) $this->retrieve_userid(); - $name = get_the_author_meta( 'last_name', $user_id ); - if ( $name !== '' ) { - $replacement = $name; - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt permalink for use as replacement string. - * - * @return string|null - */ - private function retrieve_permalink() { - if ( empty( $this->args->ID ) ) { - return null; - } - - return get_permalink( $this->args->ID ); - } - - /** - * Retrieve the post/page/cpt content for use as replacement string. - * - * @return string|null - */ - private function retrieve_post_content() { - $replacement = null; - - // The check `post_password_required` is because content must be hidden for a post with a password. - if ( ! empty( $this->args->ID ) && $this->args->post_content !== '' && ! post_password_required( $this->args->ID ) ) { - $content = strip_shortcodes( $this->args->post_content ); - $replacement = wp_strip_all_tags( $content ); - } - - return $replacement; - } - - /** - * Retrieve the current or first category title. To be used for import data from AIOSEO. - * The code derives from AIOSEO's way of dealing with that var, so we can ensure 100% seamless transition. - * - * @return string|null - */ - private function retrieve_category_title() { - if ( empty( $this->args ) || empty( $this->args->ID ) ) { - return null; - } - $post_id = $this->args->ID; - - $post = get_post( $post_id ); - $taxonomies = get_object_taxonomies( $post, 'objects' ); - - foreach ( $taxonomies as $taxonomy_slug => $taxonomy ) { - if ( ! $taxonomy->hierarchical ) { - continue; - } - $post_terms = get_the_terms( $post_id, $taxonomy_slug ); - if ( is_array( $post_terms ) && count( $post_terms ) > 0 ) { - // AiOSEO takes the name of whatever the first hierarchical taxonomy is. - $term = $post_terms[0]; - if ( $term ) { - return $term->name; - } - } - } - - return null; - } - - /* *********************** HELP TEXT RELATED ************************** */ - - /** - * Set the help text for a user/plugin/theme defined extra variable. - * - * @param string $type Type of variable: 'basic' or 'advanced'. - * @param WPSEO_Replacement_Variable $replacement_variable The replacement variable to register. - * - * @return void - */ - private static function register_help_text( $type, WPSEO_Replacement_Variable $replacement_variable ) { - $identifier = $replacement_variable->get_variable(); - - if ( ( is_string( $type ) && in_array( $type, [ 'basic', 'advanced' ], true ) ) - && ( $identifier !== '' && ! isset( self::$help_texts[ $type ][ $identifier ] ) ) - ) { - self::$help_texts[ $type ][ $identifier ] = $replacement_variable; - } - } - - /** - * Generates a list of replacement variables based on the help texts. - * - * @return array List of replace vars. - */ - public function get_replacement_variables_with_labels() { - self::setup_statics_once(); - - $custom_variables = []; - foreach ( array_merge( WPSEO_Custom_Fields::get_custom_fields(), WPSEO_Custom_Taxonomies::get_custom_taxonomies() ) as $custom_variable ) { - $custom_variables[ $custom_variable ] = new WPSEO_Replacement_Variable( $custom_variable, $this->get_label( $custom_variable ), '' ); - } - - $replacement_variables = array_filter( - array_merge( self::$help_texts['basic'], self::$help_texts['advanced'] ), - [ $this, 'is_not_prefixed' ], - ARRAY_FILTER_USE_KEY - ); - - $hidden = $this->get_hidden_replace_vars(); - - return array_values( - array_map( - static function ( WPSEO_Replacement_Variable $replacement_variable ) use ( $hidden ) { - $name = $replacement_variable->get_variable(); - - return [ - 'name' => $name, - 'value' => '', - 'label' => $replacement_variable->get_label(), - 'hidden' => in_array( $name, $hidden, true ), - ]; - }, - array_merge( $replacement_variables, $custom_variables ) - ) - ); - } - - /** - * Generates a list of replacement variables based on the help texts. - * - * @return array List of replace vars. - */ - public function get_replacement_variables_list() { - self::setup_statics_once(); - - $replacement_variables = array_merge( - $this->get_replacement_variables(), - WPSEO_Custom_Fields::get_custom_fields(), - WPSEO_Custom_Taxonomies::get_custom_taxonomies() - ); - - return array_map( [ $this, 'format_replacement_variable' ], $replacement_variables ); - } - - /** - * Creates a merged associative array of both the basic and advanced help texts. - * - * @return array Array with the replacement variables. - */ - private function get_replacement_variables() { - $help_texts = array_merge( self::$help_texts['basic'], self::$help_texts['advanced'] ); - - return array_filter( array_keys( $help_texts ), [ $this, 'is_not_prefixed' ] ); - } - - /** - * Checks whether the replacement variable contains a `ct_` or `cf_` prefix, because they follow different logic. - * - * @param string $replacement_variable The replacement variable. - * - * @return bool True when the replacement variable is not prefixed. - */ - private function is_not_prefixed( $replacement_variable ) { - $prefixes = [ 'cf_', 'ct_' ]; - $prefix = $this->get_prefix( $replacement_variable ); - - return ! in_array( $prefix, $prefixes, true ); - } - - /** - * Strip the prefix from a replacement variable name. - * - * @param string $replacement_variable The replacement variable. - * - * @return string The replacement variable name without the prefix. - */ - private function strip_prefix( $replacement_variable ) { - return substr( $replacement_variable, 3 ); - } - - /** - * Gets the prefix from a replacement variable name. - * - * @param string $replacement_variable The replacement variable. - * - * @return string The prefix of the replacement variable. - */ - private function get_prefix( $replacement_variable ) { - return substr( $replacement_variable, 0, 3 ); - } - - /** - * Strips 'desc_' if present, and appends ' description' at the end. - * - * @param string $label The replacement variable. - * - * @return string The altered replacement variable name. - */ - private function handle_description( $label ) { - if ( strpos( $label, 'desc_' ) === 0 ) { - return substr( $label, 5 ) . ' description'; - } - - return $label; - } - - /** - * Creates a label for prefixed replacement variables that matches the format in the editors. - * - * @param string $replacement_variable The replacement variable. - * - * @return string The replacement variable label. - */ - private function get_label( $replacement_variable ) { - $prefix = $this->get_prefix( $replacement_variable ); - if ( $prefix === 'cf_' ) { - return $this->strip_prefix( $replacement_variable ) . ' (custom field)'; - } - - if ( $prefix === 'ct_' ) { - $label = $this->strip_prefix( $replacement_variable ); - $label = $this->handle_description( $label ); - return ucfirst( $label . ' (custom taxonomy)' ); - } - - if ( $prefix === 'pt_' ) { - if ( $replacement_variable === 'pt_single' ) { - return 'Post type (singular)'; - } - - return 'Post type (plural)'; - } - - return ''; - } - - /** - * Formats the replacement variables. - * - * @param string $replacement_variable The replacement variable to format. - * - * @return array The formatted replacement variable. - */ - private function format_replacement_variable( $replacement_variable ) { - return [ - 'name' => $replacement_variable, - 'value' => '', - 'label' => $this->get_label( $replacement_variable ), - ]; - } - - /** - * Set/translate the help texts for the WPSEO standard basic variables. - * - * @return void - */ - private static function set_basic_help_texts() { - /* translators: %s: wp_title() function. */ - $separator_description = __( 'The separator defined in your theme\'s %s tag.', 'wordpress-seo' ); - $separator_description = sprintf( - $separator_description, - // 'wp_title()' - 'wp_title()' - ); - - $replacement_variables = [ - new WPSEO_Replacement_Variable( 'date', __( 'Date', 'wordpress-seo' ), __( 'Replaced with the date of the post/page', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'title', __( 'Title', 'wordpress-seo' ), __( 'Replaced with the title of the post/page', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'parent_title', __( 'Parent title', 'wordpress-seo' ), __( 'Replaced with the title of the parent page of the current page', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'archive_title', __( 'Archive title', 'wordpress-seo' ), __( 'Replaced with the normal title for an archive generated by WordPress', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'sitename', __( 'Site title', 'wordpress-seo' ), __( 'The site\'s name', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'sitedesc', __( 'Tagline', 'wordpress-seo' ), __( 'The site\'s tagline', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'excerpt', __( 'Excerpt', 'wordpress-seo' ), __( 'Replaced with the post/page excerpt (or auto-generated if it does not exist)', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'excerpt_only', __( 'Excerpt only', 'wordpress-seo' ), __( 'Replaced with the post/page excerpt (without auto-generation)', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'tag', __( 'Tag', 'wordpress-seo' ), __( 'Replaced with the current tag/tags', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'category', __( 'Category', 'wordpress-seo' ), __( 'Replaced with the post categories (comma separated)', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'primary_category', __( 'Primary category', 'wordpress-seo' ), __( 'Replaced with the primary category of the post/page', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'category_description', __( 'Category description', 'wordpress-seo' ), __( 'Replaced with the category description', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'tag_description', __( 'Tag description', 'wordpress-seo' ), __( 'Replaced with the tag description', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'term_description', __( 'Term description', 'wordpress-seo' ), __( 'Replaced with the term description', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'term_title', __( 'Term title', 'wordpress-seo' ), __( 'Replaced with the term name', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'searchphrase', __( 'Search phrase', 'wordpress-seo' ), __( 'Replaced with the current search phrase', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'term_hierarchy', __( 'Term hierarchy', 'wordpress-seo' ), __( 'Replaced with the term ancestors hierarchy', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'sep', __( 'Separator', 'wordpress-seo' ), $separator_description ), - new WPSEO_Replacement_Variable( 'currentdate', __( 'Current date', 'wordpress-seo' ), __( 'Replaced with the current date', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'currentyear', __( 'Current year', 'wordpress-seo' ), __( 'Replaced with the current year', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'currentmonth', __( 'Current month', 'wordpress-seo' ), __( 'Replaced with the current month', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'currentday', __( 'Current day', 'wordpress-seo' ), __( 'Replaced with the current day', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'post_year', __( 'Post year', 'wordpress-seo' ), __( 'Replaced with the year the post was published', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'post_month', __( 'Post month', 'wordpress-seo' ), __( 'Replaced with the month the post was published', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'post_day', __( 'Post day', 'wordpress-seo' ), __( 'Replaced with the day the post was published', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'author_first_name', __( 'Author first name', 'wordpress-seo' ), __( 'Replaced with the first name of the author', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'author_last_name', __( 'Author last name', 'wordpress-seo' ), __( 'Replaced with the last name of the author', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'permalink', __( 'Permalink', 'wordpress-seo' ), __( 'Replaced with the permalink', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'post_content', __( 'Post Content', 'wordpress-seo' ), __( 'Replaced with the post content', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'category_title', __( 'Category Title', 'wordpress-seo' ), __( 'Current or first category title', 'wordpress-seo' ) ), - ]; - - foreach ( $replacement_variables as $replacement_variable ) { - self::register_help_text( 'basic', $replacement_variable ); - } - } - - /** - * Set/translate the help texts for the WPSEO standard advanced variables. - * - * @return void - */ - private static function set_advanced_help_texts() { - $replacement_variables = [ - new WPSEO_Replacement_Variable( 'pt_single', __( 'Post type (singular)', 'wordpress-seo' ), __( 'Replaced with the content type single label', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'pt_plural', __( 'Post type (plural)', 'wordpress-seo' ), __( 'Replaced with the content type plural label', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'modified', __( 'Modified', 'wordpress-seo' ), __( 'Replaced with the post/page modified time', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'id', __( 'ID', 'wordpress-seo' ), __( 'Replaced with the post/page ID', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'name', __( 'Name', 'wordpress-seo' ), __( 'Replaced with the post/page author\'s \'nicename\'', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'user_description', __( 'User description', 'wordpress-seo' ), __( 'Replaced with the post/page author\'s \'Biographical Info\'', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'page', __( 'Page', 'wordpress-seo' ), __( 'Replaced with the current page number with context (i.e. page 2 of 4)', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'pagetotal', __( 'Pagetotal', 'wordpress-seo' ), __( 'Replaced with the current page total', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'pagenumber', __( 'Pagenumber', 'wordpress-seo' ), __( 'Replaced with the current page number', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'caption', __( 'Caption', 'wordpress-seo' ), __( 'Attachment caption', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'focuskw', __( 'Focus keyword', 'wordpress-seo' ), __( 'Replaced with the posts focus keyphrase', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'term404', __( 'Term404', 'wordpress-seo' ), __( 'Replaced with the slug which caused the 404', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'cf_', ' ' . __( '(custom field)', 'wordpress-seo' ), __( 'Replaced with a posts custom field value', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'ct_', ' ' . __( '(custom taxonomy)', 'wordpress-seo' ), __( 'Replaced with a posts custom taxonomies, comma separated.', 'wordpress-seo' ) ), - new WPSEO_Replacement_Variable( 'ct_desc_', ' ' . __( 'description (custom taxonomy)', 'wordpress-seo' ), __( 'Replaced with a custom taxonomies description', 'wordpress-seo' ) ), - ]; - - foreach ( $replacement_variables as $replacement_variable ) { - self::register_help_text( 'advanced', $replacement_variable ); - } - } - - /* *********************** GENERAL HELPER METHODS ************************** */ - - /** - * Remove the '%%' delimiters from a variable string. - * - * @param string $text Variable string to be cleaned. - * - * @return string - */ - private static function remove_var_delimiter( $text ) { - return trim( $text, '%' ); - } - - /** - * Add the '%%' delimiters to a variable string. - * - * @param string $text Variable string to be delimited. - * - * @return string - */ - private static function add_var_delimiter( $text ) { - return '%%' . $text . '%%'; - } - - /** - * Retrieve a post's terms, comma delimited. - * - * @param int $id ID of the post to get the terms for. - * @param string $taxonomy The taxonomy to get the terms for this post from. - * @param bool $return_single If true, return the first term. - * - * @return string Either a single term or a comma delimited string of terms. - */ - public function get_terms( $id, $taxonomy, $return_single = false ) { - $output = ''; - - // If we're on a specific tag, category or taxonomy page, use that. - if ( ! empty( $this->args->term_id ) ) { - $output = $this->args->name; - } - elseif ( ! empty( $id ) && ! empty( $taxonomy ) ) { - $terms = get_the_terms( $id, $taxonomy ); - if ( is_array( $terms ) && $terms !== [] ) { - foreach ( $terms as $term ) { - if ( $return_single ) { - $output = $term->name; - break; - } - else { - $output .= $term->name . ', '; - } - } - $output = rtrim( trim( $output ), ',' ); - } - } - unset( $terms, $term ); - - /** - * Allows filtering of the terms list used to replace %%category%%, %%tag%% - * and %%ct_%% variables. - * - * @param string $output Comma-delimited string containing the terms. - * @param string $taxonomy The taxonomy of the terms. - */ - return apply_filters( 'wpseo_terms', $output, $taxonomy ); - } - - /** - * Gets a taxonomy term hierarchy including the term to get the parents for. - * - * @return string - */ - private function get_term_hierarchy() { - if ( ! is_taxonomy_hierarchical( $this->args->taxonomy ) ) { - return ''; - } - - $separator = ' ' . $this->retrieve_sep() . ' '; - - $args = [ - 'format' => 'name', - 'separator' => $separator, - 'link' => false, - 'inclusive' => true, - ]; - - return rtrim( - get_term_parents_list( $this->args->term_id, $this->args->taxonomy, $args ), - $separator - ); - } - - /** - * Retrieves the term ancestors hierarchy. - * - * @return string|null The term ancestors hierarchy. - */ - private function retrieve_term_hierarchy() { - $replacement = null; - - if ( ! empty( $this->args->term_id ) && ! empty( $this->args->taxonomy ) ) { - $hierarchy = $this->get_term_hierarchy(); - - if ( $hierarchy !== '' ) { - $replacement = esc_html( $hierarchy ); - } - } - - return $replacement; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-replacement-variable.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-replacement-variable.php deleted file mode 100644 index 83dfc8c5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-replacement-variable.php +++ /dev/null @@ -1,76 +0,0 @@ -variable = $variable; - $this->label = $label; - $this->description = $description; - } - - /** - * Returns the variable to use. - * - * @return string - */ - public function get_variable() { - return $this->variable; - } - - /** - * Returns the label of the replacement variable. - * - * @return string - */ - public function get_label() { - return $this->label; - } - - /** - * Returns the description of the replacement variable. - * - * @return string - */ - public function get_description() { - return $this->description; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-shortlinker.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-shortlinker.php deleted file mode 100644 index 8c2fd0d9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-shortlinker.php +++ /dev/null @@ -1,54 +0,0 @@ -helpers->short_link->build( $url ); - } - - /** - * Returns a version of the URL with a utm_content with the current version. - * - * @param string $url The URL to build upon. - * - * @return string The final URL. - */ - public static function get( $url ) { - return YoastSEO()->helpers->short_link->get( $url ); - } - - /** - * Echoes a version of the URL with a utm_content with the current version. - * - * @param string $url The URL to build upon. - * - * @return void - */ - public static function show( $url ) { - YoastSEO()->helpers->short_link->show( $url ); - } - - /** - * Gets the shortlink's query params. - * - * @return array The shortlink's query params. - */ - public static function get_query_params() { - return YoastSEO()->helpers->short_link->get_query_params(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-statistics.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-statistics.php deleted file mode 100644 index 687b8fab..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-statistics.php +++ /dev/null @@ -1,62 +0,0 @@ -get_rank() === WPSEO_Rank::NO_FOCUS ) { - $posts = [ - 'meta_query' => [ - 'relation' => 'OR', - [ - 'key' => WPSEO_Meta::$meta_prefix . 'focuskw', - 'value' => 'needs-a-value-anyway', - 'compare' => 'NOT EXISTS', - ], - ], - ]; - } - elseif ( $rank->get_rank() === WPSEO_Rank::NO_INDEX ) { - $posts = [ - 'meta_key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', - 'meta_value' => '1', - 'compare' => '=', - ]; - } - else { - $posts = [ - 'meta_key' => WPSEO_Meta::$meta_prefix . 'linkdex', - 'meta_value' => [ $rank->get_starting_score(), $rank->get_end_score() ], - 'meta_compare' => 'BETWEEN', - 'meta_type' => 'NUMERIC', - ]; - } - - $posts['fields'] = 'ids'; - $posts['post_status'] = 'publish'; - - if ( current_user_can( 'edit_others_posts' ) === false ) { - $posts['author'] = get_current_user_id(); - } - - $posts = new WP_Query( $posts ); - - return (int) $posts->found_posts; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-utils.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-utils.php deleted file mode 100644 index 663d2779..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-utils.php +++ /dev/null @@ -1,1102 +0,0 @@ -helpers->url->is_relative( $url ); - } - - /** - * Recursively trim whitespace round a string value or of string values within an array. - * Only trims strings to avoid typecasting a variable (to string). - * - * @since 1.8.0 - * - * @param mixed $value Value to trim or array of values to trim. - * - * @return mixed Trimmed value or array of trimmed values. - */ - public static function trim_recursive( $value ) { - if ( is_string( $value ) ) { - $value = trim( $value ); - } - elseif ( is_array( $value ) ) { - $value = array_map( [ self::class, 'trim_recursive' ], $value ); - } - - return $value; - } - - /** - * Emulate the WP native sanitize_text_field function in a %%variable%% safe way. - * - * Sanitize a string from user input or from the db. - * - * - Check for invalid UTF-8; - * - Convert single < characters to entity; - * - Strip all tags; - * - Remove line breaks, tabs and extra white space; - * - Strip octets - BUT DO NOT REMOVE (part of) VARIABLES WHICH WILL BE REPLACED. - * - * @link https://core.trac.wordpress.org/browser/trunk/src/wp-includes/formatting.php for the original. - * - * @since 1.8.0 - * - * @param string $value String value to sanitize. - * - * @return string - */ - public static function sanitize_text_field( $value ) { - $filtered = wp_check_invalid_utf8( $value ); - - if ( strpos( $filtered, '<' ) !== false ) { - $filtered = wp_pre_kses_less_than( $filtered ); - // This will strip extra whitespace for us. - $filtered = wp_strip_all_tags( $filtered, true ); - } - else { - $filtered = trim( preg_replace( '`[\r\n\t ]+`', ' ', $filtered ) ); - } - - $found = false; - while ( preg_match( '`[^%](%[a-f0-9]{2})`i', $filtered, $match ) ) { - $filtered = str_replace( $match[1], '', $filtered ); - $found = true; - } - unset( $match ); - - if ( $found ) { - // Strip out the whitespace that may now exist after removing the octets. - $filtered = trim( preg_replace( '` +`', ' ', $filtered ) ); - } - - /** - * Filter a sanitized text field string. - * - * @since WP 2.9.0 - * - * @param string $filtered The sanitized string. - * @param string $str The string prior to being sanitized. - */ - return apply_filters( 'sanitize_text_field', $filtered, $value ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Using WP native filter. - } - - /** - * Sanitize a url for saving to the database. - * Not to be confused with the old native WP function. - * - * @since 1.8.0 - * - * @param string $value String URL value to sanitize. - * @param array $allowed_protocols Optional set of allowed protocols. - * - * @return string - */ - public static function sanitize_url( $value, $allowed_protocols = [ 'http', 'https' ] ) { - - $url = ''; - $parts = wp_parse_url( $value ); - - if ( isset( $parts['scheme'], $parts['host'] ) ) { - $url = $parts['scheme'] . '://'; - - if ( isset( $parts['user'] ) ) { - $url .= rawurlencode( $parts['user'] ); - $url .= isset( $parts['pass'] ) ? ':' . rawurlencode( $parts['pass'] ) : ''; - $url .= '@'; - } - - $parts['host'] = preg_replace( - '`[^a-z0-9-.:\[\]\\x80-\\xff]`', - '', - strtolower( $parts['host'] ) - ); - - $url .= $parts['host'] . ( isset( $parts['port'] ) ? ':' . intval( $parts['port'] ) : '' ); - } - - if ( isset( $parts['path'] ) && strpos( $parts['path'], '/' ) === 0 ) { - $path = explode( '/', wp_strip_all_tags( $parts['path'] ) ); - $path = self::sanitize_encoded_text_field( $path ); - $url .= str_replace( '%40', '@', implode( '/', $path ) ); - } - - if ( ! $url ) { - return ''; - } - - if ( isset( $parts['query'] ) ) { - wp_parse_str( $parts['query'], $parsed_query ); - - $parsed_query = array_combine( - self::sanitize_encoded_text_field( array_keys( $parsed_query ) ), - self::sanitize_encoded_text_field( array_values( $parsed_query ) ) - ); - - $url = add_query_arg( $parsed_query, $url ); - } - - if ( isset( $parts['fragment'] ) ) { - $url .= '#' . self::sanitize_encoded_text_field( $parts['fragment'] ); - } - - if ( strpos( $url, '%' ) !== false ) { - $url = preg_replace_callback( - '`%[a-fA-F0-9]{2}`', - static function ( $octects ) { - return strtolower( $octects[0] ); - }, - $url - ); - } - - return esc_url_raw( $url, $allowed_protocols ); - } - - /** - * Decode, sanitize and encode the array of strings or the string. - * - * @since 13.3 - * - * @param array|string $value The value to sanitize and encode. - * - * @return array|string The sanitized value. - */ - public static function sanitize_encoded_text_field( $value ) { - if ( is_array( $value ) ) { - return array_map( [ self::class, 'sanitize_encoded_text_field' ], $value ); - } - - return rawurlencode( sanitize_text_field( rawurldecode( $value ) ) ); - } - - /** - * Validate a value as boolean. - * - * @since 1.8.0 - * - * @param mixed $value Value to validate. - * - * @return bool - */ - public static function validate_bool( $value ) { - if ( ! isset( self::$has_filters ) ) { - self::$has_filters = extension_loaded( 'filter' ); - } - - if ( self::$has_filters ) { - return filter_var( $value, FILTER_VALIDATE_BOOLEAN ); - } - else { - return self::emulate_filter_bool( $value ); - } - } - - /** - * Cast a value to bool. - * - * @since 1.8.0 - * - * @param mixed $value Value to cast. - * - * @return bool - */ - public static function emulate_filter_bool( $value ) { - $true = [ - '1', - 'true', - 'True', - 'TRUE', - 'y', - 'Y', - 'yes', - 'Yes', - 'YES', - 'on', - 'On', - 'ON', - ]; - $false = [ - '0', - 'false', - 'False', - 'FALSE', - 'n', - 'N', - 'no', - 'No', - 'NO', - 'off', - 'Off', - 'OFF', - ]; - - if ( is_bool( $value ) ) { - return $value; - } - elseif ( is_int( $value ) && ( $value === 0 || $value === 1 ) ) { - return (bool) $value; - } - elseif ( ( is_float( $value ) && ! is_nan( $value ) ) && ( $value === (float) 0 || $value === (float) 1 ) ) { - return (bool) $value; - } - elseif ( is_string( $value ) ) { - $value = trim( $value ); - if ( in_array( $value, $true, true ) ) { - return true; - } - elseif ( in_array( $value, $false, true ) ) { - return false; - } - else { - return false; - } - } - - return false; - } - - /** - * Validate a value as integer. - * - * @since 1.8.0 - * - * @param mixed $value Value to validate. - * - * @return int|bool Int or false in case of failure to convert to int. - */ - public static function validate_int( $value ) { - if ( ! isset( self::$has_filters ) ) { - self::$has_filters = extension_loaded( 'filter' ); - } - - if ( self::$has_filters ) { - return filter_var( $value, FILTER_VALIDATE_INT ); - } - else { - return self::emulate_filter_int( $value ); - } - } - - /** - * Cast a value to integer. - * - * @since 1.8.0 - * - * @param mixed $value Value to cast. - * - * @return int|bool - */ - public static function emulate_filter_int( $value ) { - if ( is_int( $value ) ) { - return $value; - } - elseif ( is_float( $value ) ) { - // phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison. - if ( (int) $value == $value && ! is_nan( $value ) ) { - return (int) $value; - } - else { - return false; - } - } - elseif ( is_string( $value ) ) { - $value = trim( $value ); - if ( $value === '' ) { - return false; - } - elseif ( ctype_digit( $value ) ) { - return (int) $value; - } - elseif ( strpos( $value, '-' ) === 0 && ctype_digit( substr( $value, 1 ) ) ) { - return (int) $value; - } - else { - return false; - } - } - - return false; - } - - /** - * Clears the WP or W3TC cache depending on which is used. - * - * @since 1.8.0 - * - * @return void - */ - public static function clear_cache() { - if ( function_exists( 'w3tc_pgcache_flush' ) ) { - w3tc_pgcache_flush(); - } - elseif ( function_exists( 'wp_cache_clear_cache' ) ) { - wp_cache_clear_cache(); - } - } - - /** - * Clear rewrite rules. - * - * @since 1.8.0 - * - * @return void - */ - public static function clear_rewrites() { - update_option( 'rewrite_rules', '' ); - } - - /** - * Do simple reliable math calculations without the risk of wrong results. - * - * In the rare case that the bcmath extension would not be loaded, it will return the normal calculation results. - * - * @link http://floating-point-gui.de/ - * @link http://php.net/language.types.float.php See the big red warning. - * - * @since 1.5.0 - * @since 1.8.0 Moved from stand-alone function to this class. - * - * @param mixed $number1 Scalar (string/int/float/bool). - * @param string $action Calculation action to execute. Valid input: - * '+' or 'add' or 'addition', - * '-' or 'sub' or 'subtract', - * '*' or 'mul' or 'multiply', - * '/' or 'div' or 'divide', - * '%' or 'mod' or 'modulus' - * '=' or 'comp' or 'compare'. - * @param mixed $number2 Scalar (string/int/float/bool). - * @param bool $round Whether or not to round the result. Defaults to false. - * Will be disregarded for a compare operation. - * @param int $decimals Decimals for rounding operation. Defaults to 0. - * @param int $precision Calculation precision. Defaults to 10. - * - * @return mixed Calculation Result or false if either or the numbers isn't scalar or - * an invalid operation was passed. - * - For compare the result will always be an integer. - * - For all other operations, the result will either be an integer (preferred) - * or a float. - */ - public static function calc( $number1, $action, $number2, $round = false, $decimals = 0, $precision = 10 ) { - static $bc; - - if ( ! is_scalar( $number1 ) || ! is_scalar( $number2 ) ) { - return false; - } - - if ( ! isset( $bc ) ) { - $bc = extension_loaded( 'bcmath' ); - } - - if ( $bc ) { - $number1 = number_format( $number1, 10, '.', '' ); - $number2 = number_format( $number2, 10, '.', '' ); - } - - $result = null; - $compare = false; - - switch ( $action ) { - case '+': - case 'add': - case 'addition': - $result = ( $bc ) ? bcadd( $number1, $number2, $precision ) /* string */ : ( $number1 + $number2 ); - break; - - case '-': - case 'sub': - case 'subtract': - $result = ( $bc ) ? bcsub( $number1, $number2, $precision ) /* string */ : ( $number1 - $number2 ); - break; - - case '*': - case 'mul': - case 'multiply': - $result = ( $bc ) ? bcmul( $number1, $number2, $precision ) /* string */ : ( $number1 * $number2 ); - break; - - case '/': - case 'div': - case 'divide': - if ( $bc ) { - $result = bcdiv( $number1, $number2, $precision ); // String, or NULL if right_operand is 0. - } - elseif ( $number2 != 0 ) { // phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison. - $result = ( $number1 / $number2 ); - } - - if ( ! isset( $result ) ) { - $result = 0; - } - break; - - case '%': - case 'mod': - case 'modulus': - if ( $bc ) { - $result = bcmod( $number1, $number2 ); // String, or NULL if modulus is 0. - } - elseif ( $number2 != 0 ) { // phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison. - $result = ( $number1 % $number2 ); - } - - if ( ! isset( $result ) ) { - $result = 0; - } - break; - - case '=': - case 'comp': - case 'compare': - $compare = true; - if ( $bc ) { - $result = bccomp( $number1, $number2, $precision ); // Returns int 0, 1 or -1. - } - else { - // phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison. - $result = ( $number1 == $number2 ) ? 0 : ( ( $number1 > $number2 ) ? 1 : -1 ); - } - break; - } - - if ( isset( $result ) ) { - if ( $compare === false ) { - if ( $round === true ) { - $result = round( floatval( $result ), $decimals ); - if ( $decimals === 0 ) { - $result = (int) $result; - } - } - else { - // phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison. - $result = ( intval( $result ) == $result ) ? intval( $result ) : floatval( $result ); - } - } - - return $result; - } - - return false; - } - - /** - * Trim whitespace and NBSP (Non-breaking space) from string. - * - * @since 2.0.0 - * - * @param string $text String input to trim. - * - * @return string - */ - public static function trim_nbsp_from_string( $text ) { - $find = [ ' ', chr( 0xC2 ) . chr( 0xA0 ) ]; - $text = str_replace( $find, ' ', $text ); - $text = trim( $text ); - - return $text; - } - - /** - * Check if a string is a valid datetime. - * - * @since 2.0.0 - * - * @param string $datetime String input to check as valid input for DateTime class. - * - * @return bool - */ - public static function is_valid_datetime( $datetime ) { - return YoastSEO()->helpers->date->is_valid_datetime( $datetime ); - } - - /** - * Format the URL to be sure it is okay for using as a redirect url. - * - * This method will parse the URL and combine them in one string. - * - * @since 2.3.0 - * - * @param string $url URL string. - * - * @return mixed - */ - public static function format_url( $url ) { - $parsed_url = wp_parse_url( $url ); - - $formatted_url = ''; - if ( ! empty( $parsed_url['path'] ) ) { - $formatted_url = $parsed_url['path']; - } - - // Prepend a slash if first char != slash. - if ( stripos( $formatted_url, '/' ) !== 0 ) { - $formatted_url = '/' . $formatted_url; - } - - // Append 'query' string if it exists. - if ( ! empty( $parsed_url['query'] ) ) { - $formatted_url .= '?' . $parsed_url['query']; - } - - return apply_filters( 'wpseo_format_admin_url', $formatted_url ); - } - - /** - * Retrieves the sitename. - * - * @since 3.0.0 - * - * @return string - */ - public static function get_site_name() { - return YoastSEO()->helpers->site->get_site_name(); - } - - /** - * Check if the current opened page is a Yoast SEO page. - * - * @since 3.0.0 - * - * @return bool - */ - public static function is_yoast_seo_page() { - return YoastSEO()->helpers->current_page->is_yoast_seo_page(); - } - - /** - * Check if the current opened page belongs to Yoast SEO Free. - * - * @since 3.3.0 - * - * @param string $current_page The current page the user is on. - * - * @return bool - */ - public static function is_yoast_seo_free_page( $current_page ) { - $yoast_seo_free_pages = [ - 'wpseo_dashboard', - 'wpseo_tools', - 'wpseo_search_console', - 'wpseo_licenses', - ]; - - return in_array( $current_page, $yoast_seo_free_pages, true ); - } - - /** - * Determine if Yoast SEO is in development mode? - * - * Inspired by JetPack (https://github.com/Automattic/jetpack/blob/master/class.jetpack.php#L1383-L1406). - * - * @since 3.0.0 - * - * @return bool - */ - public static function is_development_mode() { - $development_mode = false; - - if ( defined( 'YOAST_ENVIRONMENT' ) && YOAST_ENVIRONMENT === 'development' ) { - $development_mode = true; - } - elseif ( defined( 'WPSEO_DEBUG' ) ) { - $development_mode = WPSEO_DEBUG; - } - elseif ( site_url() && strpos( site_url(), '.' ) === false ) { - $development_mode = true; - } - - /** - * Filter the Yoast SEO development mode. - * - * @since 3.0 - * - * @param bool $development_mode Is Yoast SEOs development mode active. - */ - return apply_filters( 'yoast_seo_development_mode', $development_mode ); - } - - /** - * Retrieve home URL with proper trailing slash. - * - * @since 3.3.0 - * - * @param string $path Path relative to home URL. - * @param string|null $scheme Scheme to apply. - * - * @return string Home URL with optional path, appropriately slashed if not. - */ - public static function home_url( $path = '', $scheme = null ) { - return YoastSEO()->helpers->url->home( $path, $scheme ); - } - - /** - * Checks if the WP-REST-API is available. - * - * @since 3.6 - * @since 3.7 Introduced the $minimum_version parameter. - * - * @param string $minimum_version The minimum version the API should be. - * - * @return bool Returns true if the API is available. - */ - public static function is_api_available( $minimum_version = '2.0' ) { - return ( defined( 'REST_API_VERSION' ) - && version_compare( REST_API_VERSION, $minimum_version, '>=' ) ); - } - - /** - * Determine whether or not the metabox should be displayed for a post type. - * - * @param string|null $post_type Optional. The post type to check the visibility of the metabox for. - * - * @return bool Whether or not the metabox should be displayed. - */ - protected static function display_post_type_metabox( $post_type = null ) { - if ( ! isset( $post_type ) ) { - $post_type = get_post_type(); - } - - if ( ! isset( $post_type ) || ! WPSEO_Post_Type::is_post_type_accessible( $post_type ) ) { - return false; - } - - if ( $post_type === 'attachment' && WPSEO_Options::get( 'disable-attachment' ) ) { - return false; - } - - return apply_filters( 'wpseo_enable_editor_features_' . $post_type, WPSEO_Options::get( 'display-metabox-pt-' . $post_type ) ); - } - - /** - * Determine whether or not the metabox should be displayed for a taxonomy. - * - * @param string|null $taxonomy Optional. The post type to check the visibility of the metabox for. - * - * @return bool Whether or not the metabox should be displayed. - */ - protected static function display_taxonomy_metabox( $taxonomy = null ) { - if ( ! isset( $taxonomy ) || ! in_array( $taxonomy, get_taxonomies( [ 'public' => true ], 'names' ), true ) ) { - return false; - } - - return WPSEO_Options::get( 'display-metabox-tax-' . $taxonomy ); - } - - /** - * Determines whether the metabox is active for the given identifier and type. - * - * @param string $identifier The identifier to check for. - * @param string $type The type to check for. - * - * @return bool Whether or not the metabox is active. - */ - public static function is_metabox_active( $identifier, $type ) { - if ( $type === 'post_type' ) { - return self::display_post_type_metabox( $identifier ); - } - - if ( $type === 'taxonomy' ) { - return self::display_taxonomy_metabox( $identifier ); - } - - return false; - } - - /** - * Determines whether the plugin is active for the entire network. - * - * @return bool Whether the plugin is network-active. - */ - public static function is_plugin_network_active() { - return YoastSEO()->helpers->url->is_plugin_network_active(); - } - - /** - * Gets the type of the current post. - * - * @return string The post type, or an empty string. - */ - public static function get_post_type() { - $wp_screen = get_current_screen(); - - if ( $wp_screen !== null && ! empty( $wp_screen->post_type ) ) { - return $wp_screen->post_type; - } - return ''; - } - - /** - * Gets the type of the current page. - * - * @return string Returns 'post' if the current page is a post edit page. Taxonomy in other cases. - */ - public static function get_page_type() { - global $pagenow; - if ( WPSEO_Metabox::is_post_edit( $pagenow ) ) { - return 'post'; - } - - return 'taxonomy'; - } - - /** - * Getter for the Adminl10n array. Applies the wpseo_admin_l10n filter. - * - * @return array The Adminl10n array. - */ - public static function get_admin_l10n() { - $post_type = self::get_post_type(); - $page_type = self::get_page_type(); - - $label_object = false; - $no_index = false; - - if ( $page_type === 'post' ) { - $label_object = get_post_type_object( $post_type ); - $no_index = WPSEO_Options::get( 'noindex-' . $post_type, false ); - } - else { - $label_object = WPSEO_Taxonomy::get_labels(); - - $wp_screen = get_current_screen(); - - if ( $wp_screen !== null && ! empty( $wp_screen->taxonomy ) ) { - $taxonomy_slug = $wp_screen->taxonomy; - $no_index = WPSEO_Options::get( 'noindex-tax-' . $taxonomy_slug, false ); - } - } - - $wpseo_admin_l10n = [ - 'displayAdvancedTab' => WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) || ! WPSEO_Options::get( 'disableadvanced_meta' ), - 'noIndex' => (bool) $no_index, - 'isPostType' => (bool) get_post_type(), - 'postType' => get_post_type(), - 'postTypeNamePlural' => ( $page_type === 'post' ) ? $label_object->label : $label_object->name, - 'postTypeNameSingular' => ( $page_type === 'post' ) ? $label_object->labels->singular_name : $label_object->singular_name, - 'isBreadcrumbsDisabled' => WPSEO_Options::get( 'breadcrumbs-enable', false ) !== true && ! current_theme_supports( 'yoast-seo-breadcrumbs' ), - // phpcs:ignore Generic.ControlStructures.DisallowYodaConditions -- Bug: squizlabs/PHP_CodeSniffer#2962. - 'isPrivateBlog' => ( (string) get_option( 'blog_public' ) ) === '0', - 'news_seo_is_active' => ( defined( 'WPSEO_NEWS_FILE' ) ), - ]; - - $additional_entries = apply_filters( 'wpseo_admin_l10n', [] ); - if ( is_array( $additional_entries ) ) { - $wpseo_admin_l10n = array_merge( $wpseo_admin_l10n, $additional_entries ); - } - - return $wpseo_admin_l10n; - } - - /** - * Retrieves the analysis worker log level. Defaults to errors only. - * - * Uses bool YOAST_SEO_DEBUG as flag to enable logging. Off equals ERROR. - * Uses string YOAST_SEO_DEBUG_ANALYSIS_WORKER as log level for the Analysis - * Worker. Defaults to INFO. - * Can be: TRACE, DEBUG, INFO, WARN or ERROR. - * - * @return string The log level to use. - */ - public static function get_analysis_worker_log_level() { - if ( defined( 'YOAST_SEO_DEBUG' ) && YOAST_SEO_DEBUG ) { - return defined( 'YOAST_SEO_DEBUG_ANALYSIS_WORKER' ) ? YOAST_SEO_DEBUG_ANALYSIS_WORKER : 'INFO'; - } - - return 'ERROR'; - } - - /** - * Returns the unfiltered home URL. - * - * In case WPML is installed, returns the original home_url and not the WPML version. - * In case of a multisite setup we return the network_home_url. - * - * @codeCoverageIgnore - * - * @return string The home url. - */ - public static function get_home_url() { - return YoastSEO()->helpers->url->network_safe_home_url(); - } - - /** - * Prepares data for outputting as JSON. - * - * @param array $data The data to format. - * - * @return false|string The prepared JSON string. - */ - public static function format_json_encode( $data ) { - $flags = ( JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); - - if ( self::is_development_mode() ) { - $flags = ( $flags | JSON_PRETTY_PRINT ); - - /** - * Filter the Yoast SEO development mode. - * - * @param array $data Allows filtering of the JSON data for debug purposes. - */ - $data = apply_filters( 'wpseo_debug_json_data', $data ); - } - - // phpcs:ignore Yoast.Yoast.JsonEncodeAlternative.FoundWithAdditionalParams -- This is the definition of format_json_encode. - return wp_json_encode( $data, $flags ); - } - - /** - * Extends the allowed post tags with accessibility-related attributes. - * - * @codeCoverageIgnore - * - * @param array $allowed_post_tags The allowed post tags. - * - * @return array The allowed tags including post tags, input tags and select tags. - */ - public static function extend_kses_post_with_a11y( $allowed_post_tags ) { - static $a11y_tags; - - if ( isset( $a11y_tags ) === false ) { - $a11y_tags = [ - 'button' => [ - 'aria-expanded' => true, - 'aria-controls' => true, - ], - 'div' => [ - 'tabindex' => true, - ], - // Below are attributes that are needed for backwards compatibility (WP < 5.1). - 'span' => [ - 'aria-hidden' => true, - ], - 'input' => [ - 'aria-describedby' => true, - ], - 'select' => [ - 'aria-describedby' => true, - ], - 'textarea' => [ - 'aria-describedby' => true, - ], - ]; - - // Add the global allowed attributes to each html element. - $a11y_tags = array_map( '_wp_add_global_attributes', $a11y_tags ); - } - - return array_merge_recursive( $allowed_post_tags, $a11y_tags ); - } - - /** - * Extends the allowed post tags with input, select and option tags. - * - * @codeCoverageIgnore - * - * @param array $allowed_post_tags The allowed post tags. - * - * @return array The allowed tags including post tags, input tags, select tags and option tags. - */ - public static function extend_kses_post_with_forms( $allowed_post_tags ) { - static $input_tags; - - if ( isset( $input_tags ) === false ) { - $input_tags = [ - 'input' => [ - 'accept' => true, - 'accesskey' => true, - 'align' => true, - 'alt' => true, - 'autocomplete' => true, - 'autofocus' => true, - 'checked' => true, - 'contenteditable' => true, - 'dirname' => true, - 'disabled' => true, - 'draggable' => true, - 'dropzone' => true, - 'form' => true, - 'formaction' => true, - 'formenctype' => true, - 'formmethod' => true, - 'formnovalidate' => true, - 'formtarget' => true, - 'height' => true, - 'hidden' => true, - 'lang' => true, - 'list' => true, - 'max' => true, - 'maxlength' => true, - 'min' => true, - 'multiple' => true, - 'name' => true, - 'pattern' => true, - 'placeholder' => true, - 'readonly' => true, - 'required' => true, - 'size' => true, - 'spellcheck' => true, - 'src' => true, - 'step' => true, - 'tabindex' => true, - 'translate' => true, - 'type' => true, - 'value' => true, - 'width' => true, - - /* - * Below are attributes that are needed for backwards compatibility (WP < 5.1). - * They are used for the social media image in the metabox. - * These can be removed once we move to the React versions of the social previews. - */ - 'data-target' => true, - 'data-target-id' => true, - ], - 'select' => [ - 'accesskey' => true, - 'autofocus' => true, - 'contenteditable' => true, - 'disabled' => true, - 'draggable' => true, - 'dropzone' => true, - 'form' => true, - 'hidden' => true, - 'lang' => true, - 'multiple' => true, - 'name' => true, - 'onblur' => true, - 'onchange' => true, - 'oncontextmenu' => true, - 'onfocus' => true, - 'oninput' => true, - 'oninvalid' => true, - 'onreset' => true, - 'onsearch' => true, - 'onselect' => true, - 'onsubmit' => true, - 'required' => true, - 'size' => true, - 'spellcheck' => true, - 'tabindex' => true, - 'translate' => true, - ], - 'option' => [ - 'class' => true, - 'disabled' => true, - 'id' => true, - 'label' => true, - 'selected' => true, - 'value' => true, - ], - ]; - - // Add the global allowed attributes to each html element. - $input_tags = array_map( '_wp_add_global_attributes', $input_tags ); - } - - return array_merge_recursive( $allowed_post_tags, $input_tags ); - } - - /** - * Gets an array of enabled features. - * - * @return string[] The array of enabled features. - */ - public static function retrieve_enabled_features() { - /** - * The feature flag integration. - * - * @var Feature_Flag_Integration $feature_flag_integration; - */ - $feature_flag_integration = YoastSEO()->classes->get( Feature_Flag_Integration::class ); - return $feature_flag_integration->get_enabled_features(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-yoast-dynamic-rewrites.php b/wp/wp-content/plugins/wordpress-seo/inc/class-yoast-dynamic-rewrites.php deleted file mode 100644 index eb029464..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-yoast-dynamic-rewrites.php +++ /dev/null @@ -1,178 +0,0 @@ -register_hooks(); - } - - return self::$instance; - } - - /** - * Constructor. - * - * Sets the WP_Rewrite instance to use. - * - * @param WP_Rewrite|null $rewrite Optional. WP_Rewrite instance to use. Default is the $wp_rewrite global. - * @throws RuntimeException Throws an exception if the $wp_rewrite global is not set. - */ - public function __construct( $rewrite = null ) { - if ( ! $rewrite ) { - if ( empty( $GLOBALS['wp_rewrite'] ) ) { - /* translators: 1: PHP class name, 2: PHP variable name */ - throw new RuntimeException( sprintf( __( 'The %1$s class must not be instantiated before the %2$s global is set.', 'wordpress-seo' ), self::class, '$wp_rewrite' ) ); - } - - $rewrite = $GLOBALS['wp_rewrite']; - } - - $this->wp_rewrite = $rewrite; - } - - /** - * Registers all necessary hooks with WordPress. - * - * @return void - */ - public function register_hooks() { - add_action( 'init', [ $this, 'trigger_dynamic_rewrite_rules_hook' ], 1 ); - add_filter( 'option_rewrite_rules', [ $this, 'filter_rewrite_rules_option' ] ); - add_filter( 'sanitize_option_rewrite_rules', [ $this, 'sanitize_rewrite_rules_option' ] ); - } - - /** - * Adds a dynamic rewrite rule that transforms a URL structure to a set of query vars. - * - * Rules registered with this method are applied dynamically and do not require the rewrite rules - * to be flushed in order to become active, which is a benefit over the regular WordPress core API. - * Note however that the dynamic application only works for rules that correspond to index.php. - * Non-WordPress rewrite rules still require flushing. - * - * Any value in the $after parameter that isn't 'bottom' will result in the rule - * being placed at the top of the rewrite rules. - * - * @param string $regex Regular expression to match request against. - * @param string|array $query The corresponding query vars for this rewrite rule. - * @param string $priority Optional. Priority of the new rule. Accepts 'top' - * or 'bottom'. Default 'bottom'. - * - * @return void - */ - public function add_rule( $regex, $query, $priority = 'bottom' ) { - if ( is_array( $query ) ) { - $query = add_query_arg( $query, 'index.php' ); - } - - $this->wp_rewrite->add_rule( $regex, $query, $priority ); - - // Do not further handle external rules. - if ( substr( $query, 0, strlen( $this->wp_rewrite->index . '?' ) ) !== $this->wp_rewrite->index . '?' ) { - return; - } - - if ( $priority === 'bottom' ) { - $this->extra_rules_bottom[ $regex ] = $query; - return; - } - - $this->extra_rules_top[ $regex ] = $query; - } - - /** - * Triggers the hook on which rewrite rules should be added. - * - * This allows for a more specific point in time from the generic `init` hook where this is - * otherwise handled. - * - * @return void - */ - public function trigger_dynamic_rewrite_rules_hook() { - - /** - * Fires when the plugin's dynamic rewrite rules should be added. - * - * @param self $dynamic_rewrites Dynamic rewrites handler instance. Use its `add_rule()` method - * to add dynamic rewrite rules. - */ - do_action( 'yoast_add_dynamic_rewrite_rules', $this ); - } - - /** - * Filters the rewrite rules option to dynamically add additional rewrite rules. - * - * @param array|string $rewrite_rules Array of rewrite rule $regex => $query pairs, or empty string - * if currently not set. - * - * @return array|string Filtered value of $rewrite_rules. - */ - public function filter_rewrite_rules_option( $rewrite_rules ) { - // Do not add extra rewrite rules if the rules need to be flushed. - if ( empty( $rewrite_rules ) ) { - return $rewrite_rules; - } - - return array_merge( $this->extra_rules_top, $rewrite_rules, $this->extra_rules_bottom ); - } - - /** - * Sanitizes the rewrite rules option prior to writing it to the database. - * - * This method ensures that the dynamic rewrite rules do not become part of the actual option. - * - * @param array|string $rewrite_rules Array pf rewrite rule $regex => $query pairs, or empty string - * in order to unset. - * - * @return array|string Filtered value of $rewrite_rules before writing the option. - */ - public function sanitize_rewrite_rules_option( $rewrite_rules ) { - if ( empty( $rewrite_rules ) ) { - return $rewrite_rules; - } - - return array_diff_key( $rewrite_rules, $this->extra_rules_top, $this->extra_rules_bottom ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/date-helper.php b/wp/wp-content/plugins/wordpress-seo/inc/date-helper.php deleted file mode 100644 index f6489a47..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/date-helper.php +++ /dev/null @@ -1,61 +0,0 @@ -helpers->date->format( $date, $format ); - } - - /** - * Formats the given timestamp to the needed format. - * - * @param int $timestamp The timestamp to use for the formatting. - * @param string $format The format that the passed date should be in. - * - * @return string The formatted date. - */ - public function format_timestamp( $timestamp, $format = DATE_W3C ) { - return YoastSEO()->helpers->date->format_timestamp( $timestamp, $format ); - } - - /** - * Formats a given date in UTC TimeZone format and translate it to the set language. - * - * @param string $date String representing the date / time. - * @param string $format The format that the passed date should be in. - * - * @return string The formatted and translated date. - */ - public function format_translated( $date, $format = DATE_W3C ) { - return YoastSEO()->helpers->date->format_translated( $date, $format ); - } - - /** - * Check if a string is a valid datetime. - * - * @param string $datetime String input to check as valid input for DateTime class. - * - * @return bool True when datatime is valid. - */ - public function is_valid_datetime( $datetime ) { - return YoastSEO()->helpers->date->is_valid_datetime( $datetime ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/exceptions/class-myyoast-bad-request-exception.php b/wp/wp-content/plugins/wordpress-seo/inc/exceptions/class-myyoast-bad-request-exception.php deleted file mode 100644 index d9d9f9a8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/exceptions/class-myyoast-bad-request-exception.php +++ /dev/null @@ -1,13 +0,0 @@ -get_defaults(); - * - * @var array - */ - protected $defaults = []; - - /** - * Available options for the 'access' setting. Used for input validation. - * - * {@internal Important: Make sure the options added to the array here are in line - * with the keys for the options set for the select box in the - * admin/pages/network.php file.}} - * - * @var array - */ - public static $allowed_access_options = [ - 'admin', - 'superadmin', - ]; - - /** - * Get the singleton instance of this class. - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Only run parent constructor in multisite context. - */ - public function __construct() { - $allow_prefix = self::ALLOW_KEY_PREFIX; - $this->defaults = [ - 'access' => 'admin', - 'defaultblog' => '', // Numeric blog ID or empty. - "{$allow_prefix}disableadvanced_meta" => true, - "{$allow_prefix}ryte_indexability" => false, - "{$allow_prefix}content_analysis_active" => true, - "{$allow_prefix}keyword_analysis_active" => true, - "{$allow_prefix}inclusive_language_analysis_active" => true, - "{$allow_prefix}enable_admin_bar_menu" => true, - "{$allow_prefix}enable_cornerstone_content" => true, - "{$allow_prefix}enable_xml_sitemap" => true, - "{$allow_prefix}enable_text_link_counter" => true, - "{$allow_prefix}enable_headless_rest_endpoints" => true, - "{$allow_prefix}enable_metabox_insights" => true, - "{$allow_prefix}enable_link_suggestions" => true, - "{$allow_prefix}tracking" => true, - "{$allow_prefix}enable_enhanced_slack_sharing" => true, - "{$allow_prefix}semrush_integration_active" => true, - "{$allow_prefix}zapier_integration_active" => true, - "{$allow_prefix}wincher_integration_active" => false, - "{$allow_prefix}remove_feed_global" => true, - "{$allow_prefix}remove_feed_global_comments" => true, - "{$allow_prefix}remove_feed_post_comments" => true, - "{$allow_prefix}enable_index_now" => true, - "{$allow_prefix}enable_ai_generator" => true, - "{$allow_prefix}remove_feed_authors" => true, - "{$allow_prefix}remove_feed_categories" => true, - "{$allow_prefix}remove_feed_tags" => true, - "{$allow_prefix}remove_feed_custom_taxonomies" => true, - "{$allow_prefix}remove_feed_post_types" => true, - "{$allow_prefix}remove_feed_search" => true, - "{$allow_prefix}remove_atom_rdf_feeds" => true, - "{$allow_prefix}remove_shortlinks" => true, - "{$allow_prefix}remove_rest_api_links" => true, - "{$allow_prefix}remove_rsd_wlw_links" => true, - "{$allow_prefix}remove_oembed_links" => true, - "{$allow_prefix}remove_generator" => true, - "{$allow_prefix}remove_emoji_scripts" => true, - "{$allow_prefix}remove_powered_by_header" => true, - "{$allow_prefix}remove_pingback_header" => true, - "{$allow_prefix}clean_campaign_tracking_urls" => true, - "{$allow_prefix}clean_permalinks" => true, - "{$allow_prefix}search_cleanup" => true, - "{$allow_prefix}search_cleanup_emoji" => true, - "{$allow_prefix}search_cleanup_patterns" => true, - "{$allow_prefix}redirect_search_pretty_urls" => true, - "{$allow_prefix}wordproof_integration_active" => false, - "{$allow_prefix}algolia_integration_active" => true, - ]; - - if ( is_multisite() ) { - parent::__construct(); - - add_filter( 'admin_title', [ 'Yoast_Input_Validation', 'add_yoast_admin_document_title_errors' ] ); - } - } - - /** - * Add filters to make sure that the option default is returned if the option is not set - * - * @return void - */ - public function add_default_filters() { - // Don't change, needs to check for false as could return prio 0 which would evaluate to false. - if ( has_filter( 'default_site_option_' . $this->option_name, [ $this, 'get_defaults' ] ) === false ) { - add_filter( 'default_site_option_' . $this->option_name, [ $this, 'get_defaults' ] ); - } - } - - /** - * Remove the default filters. - * Called from the validate() method to prevent failure to add new options. - * - * @return void - */ - public function remove_default_filters() { - remove_filter( 'default_site_option_' . $this->option_name, [ $this, 'get_defaults' ] ); - } - - /** - * Add filters to make sure that the option is merged with its defaults before being returned. - * - * @return void - */ - public function add_option_filters() { - // Don't change, needs to check for false as could return prio 0 which would evaluate to false. - if ( has_filter( 'site_option_' . $this->option_name, [ $this, 'get_option' ] ) === false ) { - add_filter( 'site_option_' . $this->option_name, [ $this, 'get_option' ] ); - } - } - - /** - * Remove the option filters. - * Called from the clean_up methods to make sure we retrieve the original old option. - * - * @return void - */ - public function remove_option_filters() { - remove_filter( 'site_option_' . $this->option_name, [ $this, 'get_option' ] ); - } - - /* *********** METHODS influencing add_uption(), update_option() and saving from admin pages *********** */ - - /** - * Validate the option. - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array Validated clean value for the option to be saved to the database. - */ - protected function validate_option( $dirty, $clean, $old ) { - - foreach ( $clean as $key => $value ) { - switch ( $key ) { - case 'access': - if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], self::$allowed_access_options, true ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - elseif ( function_exists( 'add_settings_error' ) ) { - add_settings_error( - $this->group_name, // Slug title of the setting. - $key, // Suffix-ID for the error message box. - /* translators: %1$s expands to the option name and %2$sexpands to Yoast SEO */ - sprintf( __( '%1$s is not a valid choice for who should be allowed access to the %2$s settings. Value reset to the default.', 'wordpress-seo' ), esc_html( sanitize_text_field( $dirty[ $key ] ) ), 'Yoast SEO' ), // The error message. - 'error' // Message type. - ); - } - break; - - case 'defaultblog': - if ( isset( $dirty[ $key ] ) && ( $dirty[ $key ] !== '' && $dirty[ $key ] !== '-' ) ) { - $int = WPSEO_Utils::validate_int( $dirty[ $key ] ); - if ( $int !== false && $int > 0 ) { - // Check if a valid blog number has been received. - $exists = get_blog_details( $int, false ); - if ( $exists && $exists->deleted === '0' ) { - $clean[ $key ] = $int; - } - elseif ( function_exists( 'add_settings_error' ) ) { - add_settings_error( - $this->group_name, // Slug title of the setting. - $key, // Suffix-ID for the error message box. - esc_html__( 'The default blog setting must be the numeric blog id of the blog you want to use as default.', 'wordpress-seo' ) - . '
              ' - . sprintf( - /* translators: %s is the ID number of a blog. */ - esc_html__( 'This must be an existing blog. Blog %s does not exist or has been marked as deleted.', 'wordpress-seo' ), - '' . esc_html( sanitize_text_field( $dirty[ $key ] ) ) . '' - ), // The error message. - 'error' // Message type. - ); - } - unset( $exists ); - } - elseif ( function_exists( 'add_settings_error' ) ) { - add_settings_error( - $this->group_name, // Slug title of the setting. - $key, // Suffix-ID for the error message box. - esc_html__( 'The default blog setting must be the numeric blog id of the blog you want to use as default.', 'wordpress-seo' ) . '
              ' . esc_html__( 'No numeric value was received.', 'wordpress-seo' ), // The error message. - 'error' // Message type. - ); - } - unset( $int ); - } - break; - - default: - $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); - break; - } - } - - return $clean; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-social.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-social.php deleted file mode 100644 index 6eef17ab..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-social.php +++ /dev/null @@ -1,336 +0,0 @@ -get_defaults(); - * - * @var array - */ - protected $defaults = [ - // Form fields. - 'facebook_site' => '', // Text field. - 'instagram_url' => '', - 'linkedin_url' => '', - 'myspace_url' => '', - 'og_default_image' => '', // Text field. - 'og_default_image_id' => '', - 'og_frontpage_title' => '', // Text field. - 'og_frontpage_desc' => '', // Text field. - 'og_frontpage_image' => '', // Text field. - 'og_frontpage_image_id' => '', - 'opengraph' => true, - 'pinterest_url' => '', - 'pinterestverify' => '', - 'twitter' => true, - 'twitter_site' => '', // Text field. - 'twitter_card_type' => 'summary_large_image', - 'youtube_url' => '', - 'wikipedia_url' => '', - 'other_social_urls' => [], - 'mastodon_url' => '', - ]; - - /** - * Array of sub-options which should not be overloaded with multi-site defaults. - * - * @var array - */ - public $ms_exclude = [ - /* Privacy. */ - 'pinterestverify', - ]; - - /** - * Array of allowed twitter card types. - * - * While we only have the options summary and summary_large_image in the - * interface now, we might change that at some point. - * - * {@internal Uncomment any of these to allow them in validation *and* automatically - * add them as a choice in the options page.}} - * - * @var array - */ - public static $twitter_card_types = [ - 'summary_large_image' => '', - // 'summary' => '', - // 'photo' => '', - // 'gallery' => '', - // 'app' => '', - // 'player' => '', - // 'product' => '', - ]; - - /** - * Add the actions and filters for the option. - */ - protected function __construct() { - parent::__construct(); - - add_filter( 'admin_title', [ 'Yoast_Input_Validation', 'add_yoast_admin_document_title_errors' ] ); - } - - /** - * Get the singleton instance of this class. - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Translate/set strings used in the option defaults. - * - * @return void - */ - public function translate_defaults() { - self::$twitter_card_types['summary_large_image'] = __( 'Summary with large image', 'wordpress-seo' ); - } - - /** - * Validate the option. - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array Validated clean value for the option to be saved to the database. - */ - protected function validate_option( $dirty, $clean, $old ) { - - foreach ( $clean as $key => $value ) { - switch ( $key ) { - /* Text fields. */ - case 'og_frontpage_desc': - case 'og_frontpage_title': - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - $clean[ $key ] = WPSEO_Utils::sanitize_text_field( $dirty[ $key ] ); - } - break; - - case 'og_default_image_id': - case 'og_frontpage_image_id': - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = (int) $dirty[ $key ]; - - if ( $dirty[ $key ] === '' ) { - $clean[ $key ] = $dirty[ $key ]; - } - } - break; - - /* URL text fields - no ftp allowed. */ - case 'facebook_site': - case 'instagram_url': - case 'linkedin_url': - case 'myspace_url': - case 'pinterest_url': - case 'og_default_image': - case 'og_frontpage_image': - case 'youtube_url': - case 'wikipedia_url': - case 'mastodon_url': - $this->validate_url( $key, $dirty, $old, $clean ); - break; - - case 'pinterestverify': - $this->validate_verification_string( $key, $dirty, $old, $clean ); - break; - - /* Twitter user name. */ - case 'twitter_site': - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - $twitter_id = $this->validate_twitter_id( $dirty[ $key ] ); - - if ( $twitter_id ) { - $clean[ $key ] = $twitter_id; - } - else { - if ( isset( $old[ $key ] ) && $old[ $key ] !== '' ) { - $twitter_id = sanitize_text_field( ltrim( $old[ $key ], '@' ) ); - if ( preg_match( '`^[A-Za-z0-9_]{1,25}$`', $twitter_id ) ) { - $clean[ $key ] = $twitter_id; - } - } - if ( function_exists( 'add_settings_error' ) ) { - add_settings_error( - $this->group_name, // Slug title of the setting. - $key, // Suffix-ID for the error message box. - sprintf( - /* translators: %s expands to a twitter user name. */ - __( '%s does not seem to be a valid Twitter Username. Please correct.', 'wordpress-seo' ), - '' . esc_html( sanitize_text_field( $dirty[ $key ] ) ) . '' - ), // The error message. - 'error' // Message type. - ); - } - } - unset( $twitter_id ); - - Yoast_Input_Validation::add_dirty_value_to_settings_errors( $key, $dirty[ $key ] ); - } - break; - - case 'twitter_card_type': - if ( isset( $dirty[ $key ], self::$twitter_card_types[ $dirty[ $key ] ] ) && $dirty[ $key ] !== '' ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - - /* Boolean fields. */ - case 'opengraph': - case 'twitter': - $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); - break; - - /* Array fields. */ - case 'other_social_urls': - if ( isset( $dirty[ $key ] ) ) { - $items = $dirty[ $key ]; - if ( ! is_array( $items ) ) { - $items = json_decode( $dirty[ $key ], true ); - } - - if ( is_array( $items ) ) { - foreach ( $items as $item_key => $item ) { - $validated_url = $this->validate_social_url( $item ); - - if ( $validated_url === false ) { - // Restore the previous URL values, if any. - $old_urls = ( isset( $old[ $key ] ) ) ? $old[ $key ] : []; - foreach ( $old_urls as $old_item_key => $old_url ) { - if ( $old_url !== '' ) { - $url = WPSEO_Utils::sanitize_url( $old_url ); - if ( $url !== '' ) { - $clean[ $key ][ $old_item_key ] = $url; - } - } - } - break; - } - - // The URL format is valid, let's sanitize it. - $url = WPSEO_Utils::sanitize_url( $validated_url ); - if ( $url !== '' ) { - $clean[ $key ][ $item_key ] = $url; - } - } - } - } - - break; - } - } - - return $clean; - } - - /** - * Validates a social URL. - * - * @param string $url The url to be validated. - * - * @return string|false The validated URL or false if the URL is not valid. - */ - public function validate_social_url( $url ) { - $validated_url = filter_var( WPSEO_Utils::sanitize_url( trim( $url ) ), FILTER_VALIDATE_URL ); - - return $validated_url; - } - - /** - * Validates a twitter id. - * - * @param string $twitter_id The twitter id to be validated. - * @param bool $strip_at_sign Whether or not to strip the `@` sign. - * - * @return string|false The validated twitter id or false if it is not valid. - */ - public function validate_twitter_id( $twitter_id, $strip_at_sign = true ) { - $twitter_id = ( $strip_at_sign ) ? sanitize_text_field( ltrim( $twitter_id, '@' ) ) : sanitize_text_field( $twitter_id ); - - /* - * From the Twitter documentation about twitter screen names: - * Typically a maximum of 15 characters long, but some historical accounts - * may exist with longer names. - * A username can only contain alphanumeric characters (letters A-Z, numbers 0-9) - * with the exception of underscores. - * - * @link https://support.twitter.com/articles/101299-why-can-t-i-register-certain-usernames - */ - if ( preg_match( '`^[A-Za-z0-9_]{1,25}$`', $twitter_id ) ) { - return $twitter_id; - } - - if ( preg_match( '`^http(?:s)?://(?:www\.)?(?:twitter|x)\.com/(?P[A-Za-z0-9_]{1,25})/?$`', $twitter_id, $matches ) ) { - return $matches['handle']; - } - - return false; - } - - /** - * Clean a given option value. - * - * @param array $option_value Old (not merged with defaults or filtered) option value to - * clean according to the rules for this option. - * @param string|null $current_version Optional. Version from which to upgrade, if not set, - * version specific upgrades will be disregarded. - * @param array|null $all_old_option_values Optional. Only used when importing old options to have - * access to the real old values, in contrast to the saved ones. - * - * @return array Cleaned option. - */ - protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { - - /* Move options from very old option to this one. */ - $old_option = null; - if ( isset( $all_old_option_values ) ) { - // Ok, we have an import. - if ( isset( $all_old_option_values['wpseo_indexation'] ) && is_array( $all_old_option_values['wpseo_indexation'] ) && $all_old_option_values['wpseo_indexation'] !== [] ) { - $old_option = $all_old_option_values['wpseo_indexation']; - } - } - else { - $old_option = get_option( 'wpseo_indexation' ); - } - - if ( is_array( $old_option ) && $old_option !== [] ) { - $move = [ - 'opengraph', - ]; - foreach ( $move as $key ) { - if ( isset( $old_option[ $key ] ) && ! isset( $option_value[ $key ] ) ) { - $option_value[ $key ] = $old_option[ $key ]; - } - } - unset( $move, $key ); - } - unset( $old_option ); - - return $option_value; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-titles.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-titles.php deleted file mode 100644 index ff613e48..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-titles.php +++ /dev/null @@ -1,1006 +0,0 @@ -get_defaults(); - * - * {@internal Note: Some of the default values are added via the translate_defaults() method.}} - * - * @var string[] - */ - protected $defaults = [ - // Form fields. - 'forcerewritetitle' => false, - 'separator' => 'sc-dash', - 'title-home-wpseo' => '%%sitename%% %%page%% %%sep%% %%sitedesc%%', // Text field. - 'title-author-wpseo' => '', // Text field. - 'title-archive-wpseo' => '%%date%% %%page%% %%sep%% %%sitename%%', // Text field. - 'title-search-wpseo' => '', // Text field. - 'title-404-wpseo' => '', // Text field. - - 'social-title-author-wpseo' => '%%name%%', // Text field. - 'social-title-archive-wpseo' => '%%date%%', // Text field. - 'social-description-author-wpseo' => '', // Text area. - 'social-description-archive-wpseo' => '', // Text area. - 'social-image-url-author-wpseo' => '', // Hidden input field. - 'social-image-url-archive-wpseo' => '', // Hidden input field. - 'social-image-id-author-wpseo' => 0, // Hidden input field. - 'social-image-id-archive-wpseo' => 0, // Hidden input field. - - 'metadesc-home-wpseo' => '', // Text area. - 'metadesc-author-wpseo' => '', // Text area. - 'metadesc-archive-wpseo' => '', // Text area. - 'rssbefore' => '', // Text area. - 'rssafter' => '', // Text area. - - 'noindex-author-wpseo' => false, - 'noindex-author-noposts-wpseo' => true, - 'noindex-archive-wpseo' => true, - - 'disable-author' => false, - 'disable-date' => false, - 'disable-post_format' => false, - 'disable-attachment' => true, - - 'breadcrumbs-404crumb' => '', // Text field. - 'breadcrumbs-display-blog-page' => true, - 'breadcrumbs-boldlast' => false, - 'breadcrumbs-archiveprefix' => '', // Text field. - 'breadcrumbs-enable' => true, - 'breadcrumbs-home' => '', // Text field. - 'breadcrumbs-prefix' => '', // Text field. - 'breadcrumbs-searchprefix' => '', // Text field. - 'breadcrumbs-sep' => '»', // Text field. - - 'website_name' => '', - 'person_name' => '', - 'person_logo' => '', - 'person_logo_id' => 0, - 'alternate_website_name' => '', - 'company_logo' => '', - 'company_logo_id' => 0, - 'company_logo_meta' => false, - 'person_logo_meta' => false, - 'company_name' => '', - 'company_alternate_name' => '', - 'company_or_person' => 'company', - 'company_or_person_user_id' => false, - - 'stripcategorybase' => false, - - 'open_graph_frontpage_title' => '%%sitename%%', // Text field. - 'open_graph_frontpage_desc' => '', // Text field. - 'open_graph_frontpage_image' => '', // Text field. - 'open_graph_frontpage_image_id' => 0, - - 'publishing_principles_id' => 0, - 'ownership_funding_info_id' => 0, - 'actionable_feedback_policy_id' => 0, - 'corrections_policy_id' => 0, - 'ethics_policy_id' => 0, - 'diversity_policy_id' => 0, - 'diversity_staffing_report_id' => 0, - - 'org-description' => '', - 'org-email' => '', - 'org-phone' => '', - 'org-legal-name' => '', - 'org-founding-date' => '', - 'org-number-employees' => '', - - 'org-vat-id' => '', - 'org-tax-id' => '', - 'org-iso' => '', - 'org-duns' => '', - 'org-leicode' => '', - 'org-naics' => '', - - /* - * Uses enrich_defaults to add more along the lines of: - * - 'title-' . $pt->name => ''; // Text field. - * - 'metadesc-' . $pt->name => ''; // Text field. - * - 'noindex-' . $pt->name => false; - * - 'display-metabox-pt-' . $pt->name => false; - * - * - 'title-ptarchive-' . $pt->name => ''; // Text field. - * - 'metadesc-ptarchive-' . $pt->name => ''; // Text field. - * - 'bctitle-ptarchive-' . $pt->name => ''; // Text field. - * - 'noindex-ptarchive-' . $pt->name => false; - * - * - 'title-tax-' . $tax->name => '''; // Text field. - * - 'metadesc-tax-' . $tax->name => ''; // Text field. - * - 'noindex-tax-' . $tax->name => false; - * - 'display-metabox-tax-' . $tax->name => false; - * - * - 'schema-page-type-' . $pt->name => 'WebPage'; - * - 'schema-article-type-' . $pt->name => 'Article'; - */ - ]; - - /** - * Used for "caching" during pageload. - * - * @var string[] - */ - protected $enriched_defaults = null; - - /** - * Array of variable option name patterns for the option. - * - * @var string[] - */ - protected $variable_array_key_patterns = [ - 'title-', - 'metadesc-', - 'noindex-', - 'display-metabox-pt-', - 'bctitle-ptarchive-', - 'post_types-', - 'taxonomy-', - 'schema-page-type-', - 'schema-article-type-', - 'social-title-', - 'social-description-', - 'social-image-url-', - 'social-image-id-', - 'org-', - ]; - - /** - * Array of sub-options which should not be overloaded with multi-site defaults. - * - * @var string[] - */ - public $ms_exclude = [ - 'forcerewritetitle', - ]; - - /** - * Add the actions and filters for the option. - * - * @todo [JRF => testers] Check if the extra actions below would run into problems if an option - * is updated early on and if so, change the call to schedule these for a later action on add/update - * instead of running them straight away. - */ - protected function __construct() { - parent::__construct(); - add_action( 'update_option_' . $this->option_name, [ 'WPSEO_Utils', 'clear_cache' ] ); - add_action( 'init', [ $this, 'end_of_init' ], 999 ); - - add_action( 'registered_post_type', [ $this, 'invalidate_enrich_defaults_cache' ] ); - add_action( 'unregistered_post_type', [ $this, 'invalidate_enrich_defaults_cache' ] ); - add_action( 'registered_taxonomy', [ $this, 'invalidate_enrich_defaults_cache' ] ); - add_action( 'unregistered_taxonomy', [ $this, 'invalidate_enrich_defaults_cache' ] ); - - add_filter( 'admin_title', [ 'Yoast_Input_Validation', 'add_yoast_admin_document_title_errors' ] ); - } - - /** - * Make sure we can recognize the right action for the double cleaning. - * - * @return void - */ - public function end_of_init() { - do_action( 'wpseo_double_clean_titles' ); - } - - /** - * Get the singleton instance of this class. - * - * @return self - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Get the available separator options. - * - * @return string[] - */ - public function get_separator_options() { - $separators = wp_list_pluck( self::get_separator_option_list(), 'option' ); - - /** - * Allow altering the array with separator options. - * - * @param array $separator_options Array with the separator options. - */ - $filtered_separators = apply_filters( 'wpseo_separator_options', $separators ); - - if ( is_array( $filtered_separators ) && $filtered_separators !== [] ) { - $separators = array_merge( $separators, $filtered_separators ); - } - - return $separators; - } - - /** - * Get the available separator options aria-labels. - * - * @return string[] Array with the separator options aria-labels. - */ - public function get_separator_options_for_display() { - $separators = $this->get_separator_options(); - $separator_list = self::get_separator_option_list(); - - $separator_options = []; - - foreach ( $separators as $key => $label ) { - $aria_label = ( $separator_list[ $key ]['label'] ?? '' ); - - $separator_options[ $key ] = [ - 'label' => $label, - 'aria_label' => $aria_label, - ]; - } - - return $separator_options; - } - - /** - * Translate strings used in the option defaults. - * - * @return void - */ - public function translate_defaults() { - /* translators: 1: Author name; 2: Site name. */ - $this->defaults['title-author-wpseo'] = sprintf( __( '%1$s, Author at %2$s', 'wordpress-seo' ), '%%name%%', '%%sitename%%' ) . ' %%page%% '; - /* translators: %s expands to the search phrase. */ - $this->defaults['title-search-wpseo'] = sprintf( __( 'You searched for %s', 'wordpress-seo' ), '%%searchphrase%%' ) . ' %%page%% %%sep%% %%sitename%%'; - $this->defaults['title-404-wpseo'] = __( 'Page not found', 'wordpress-seo' ) . ' %%sep%% %%sitename%%'; - /* translators: 1: link to post; 2: link to blog. */ - $this->defaults['rssafter'] = sprintf( __( 'The post %1$s appeared first on %2$s.', 'wordpress-seo' ), '%%POSTLINK%%', '%%BLOGLINK%%' ); - - $this->defaults['breadcrumbs-404crumb'] = __( 'Error 404: Page not found', 'wordpress-seo' ); - $this->defaults['breadcrumbs-archiveprefix'] = __( 'Archives for', 'wordpress-seo' ); - $this->defaults['breadcrumbs-home'] = __( 'Home', 'wordpress-seo' ); - $this->defaults['breadcrumbs-searchprefix'] = __( 'You searched for', 'wordpress-seo' ); - } - - /** - * Add dynamically created default options based on available post types and taxonomies. - * - * @return void - */ - public function enrich_defaults() { - $enriched_defaults = $this->enriched_defaults; - if ( $enriched_defaults !== null ) { - $this->defaults += $enriched_defaults; - return; - } - - $enriched_defaults = []; - - /* - * Retrieve all the relevant post type and taxonomy arrays. - * - * WPSEO_Post_Type::get_accessible_post_types() should *not* be used here. - * These are the defaults and can be prepared for any public post type. - */ - $post_type_objects = get_post_types( [ 'public' => true ], 'objects' ); - - if ( $post_type_objects ) { - /* translators: %s expands to the name of a post type (plural). */ - $archive = sprintf( __( '%s Archive', 'wordpress-seo' ), '%%pt_plural%%' ); - - foreach ( $post_type_objects as $pt ) { - $enriched_defaults[ 'title-' . $pt->name ] = '%%title%% %%page%% %%sep%% %%sitename%%'; // Text field. - $enriched_defaults[ 'metadesc-' . $pt->name ] = ''; // Text area. - $enriched_defaults[ 'noindex-' . $pt->name ] = false; - $enriched_defaults[ 'display-metabox-pt-' . $pt->name ] = true; - $enriched_defaults[ 'post_types-' . $pt->name . '-maintax' ] = 0; // Select box. - $enriched_defaults[ 'schema-page-type-' . $pt->name ] = 'WebPage'; - $enriched_defaults[ 'schema-article-type-' . $pt->name ] = ( $pt->name === 'post' ) ? 'Article' : 'None'; - - if ( $pt->name !== 'attachment' ) { - $enriched_defaults[ 'social-title-' . $pt->name ] = '%%title%%'; // Text field. - $enriched_defaults[ 'social-description-' . $pt->name ] = ''; // Text area. - $enriched_defaults[ 'social-image-url-' . $pt->name ] = ''; // Hidden input field. - $enriched_defaults[ 'social-image-id-' . $pt->name ] = 0; // Hidden input field. - } - - // Custom post types that have archives. - if ( ! $pt->_builtin && WPSEO_Post_Type::has_archive( $pt ) ) { - $enriched_defaults[ 'title-ptarchive-' . $pt->name ] = $archive . ' %%page%% %%sep%% %%sitename%%'; // Text field. - $enriched_defaults[ 'metadesc-ptarchive-' . $pt->name ] = ''; // Text area. - $enriched_defaults[ 'bctitle-ptarchive-' . $pt->name ] = ''; // Text field. - $enriched_defaults[ 'noindex-ptarchive-' . $pt->name ] = false; - $enriched_defaults[ 'social-title-ptarchive-' . $pt->name ] = $archive; // Text field. - $enriched_defaults[ 'social-description-ptarchive-' . $pt->name ] = ''; // Text area. - $enriched_defaults[ 'social-image-url-ptarchive-' . $pt->name ] = ''; // Hidden input field. - $enriched_defaults[ 'social-image-id-ptarchive-' . $pt->name ] = 0; // Hidden input field. - } - } - } - - $taxonomy_objects = get_taxonomies( [ 'public' => true ], 'object' ); - - if ( $taxonomy_objects ) { - /* translators: %s expands to the variable used for term title. */ - $archives = sprintf( __( '%s Archives', 'wordpress-seo' ), '%%term_title%%' ); - - foreach ( $taxonomy_objects as $tax ) { - $enriched_defaults[ 'title-tax-' . $tax->name ] = $archives . ' %%page%% %%sep%% %%sitename%%'; // Text field. - $enriched_defaults[ 'metadesc-tax-' . $tax->name ] = ''; // Text area. - $enriched_defaults[ 'display-metabox-tax-' . $tax->name ] = true; - - $enriched_defaults[ 'noindex-tax-' . $tax->name ] = ( $tax->name === 'post_format' ); - - $enriched_defaults[ 'social-title-tax-' . $tax->name ] = $archives; // Text field. - $enriched_defaults[ 'social-description-tax-' . $tax->name ] = ''; // Text area. - $enriched_defaults[ 'social-image-url-tax-' . $tax->name ] = ''; // Hidden input field. - $enriched_defaults[ 'social-image-id-tax-' . $tax->name ] = 0; // Hidden input field. - - $enriched_defaults[ 'taxonomy-' . $tax->name . '-ptparent' ] = 0; // Select box;. - } - } - - $this->enriched_defaults = $enriched_defaults; - $this->defaults += $enriched_defaults; - } - - /** - * Invalidates enrich_defaults() cache. - * - * Called from actions: - * - (un)registered_post_type - * - (un)registered_taxonomy - * - * @return void - */ - public function invalidate_enrich_defaults_cache() { - $this->enriched_defaults = null; - } - - /** - * Validate the option. - * - * @param string[] $dirty New value for the option. - * @param string[] $clean Clean value for the option, normally the defaults. - * @param string[] $old Old value of the option. - * - * @return string[] Validated clean value for the option to be saved to the database. - */ - protected function validate_option( $dirty, $clean, $old ) { - $allowed_post_types = $this->get_allowed_post_types(); - - foreach ( $clean as $key => $value ) { - $switch_key = $this->get_switch_key( $key ); - - switch ( $switch_key ) { - // Only ever set programmatically, so no reason for intense validation. - case 'company_logo_meta': - case 'person_logo_meta': - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - - /* Breadcrumbs text fields. */ - case 'breadcrumbs-404crumb': - case 'breadcrumbs-archiveprefix': - case 'breadcrumbs-home': - case 'breadcrumbs-prefix': - case 'breadcrumbs-searchprefix': - case 'breadcrumbs-sep': - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = wp_kses_post( $dirty[ $key ] ); - } - break; - - /* - * Text fields. - */ - - /* - * Covers: - * 'title-home-wpseo', 'title-author-wpseo', 'title-archive-wpseo', // phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- This isn't commented out code. - * 'title-search-wpseo', 'title-404-wpseo' - * 'title-' . $pt->name - * 'title-ptarchive-' . $pt->name - * 'title-tax-' . $tax->name - * 'social-title-' . $pt->name - * 'social-title-ptarchive-' . $pt->name - * 'social-title-tax-' . $tax->name - * 'social-title-author-wpseo', 'social-title-archive-wpseo' - * 'open_graph_frontpage_title' - */ - case 'org-': - case 'website_name': - case 'alternate_website_name': - case 'title-': - case 'social-title-': - case 'open_graph_frontpage_title': - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = WPSEO_Utils::sanitize_text_field( $dirty[ $key ] ); - } - break; - - case 'company_or_person': - if ( isset( $dirty[ $key ] ) ) { - if ( in_array( $dirty[ $key ], [ 'company', 'person' ], true ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - else { - $defaults = $this->get_defaults(); - $clean[ $key ] = $defaults['company_or_person']; - } - } - break; - - /* - * Covers: - * 'company_logo', 'person_logo' // phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- This isn't commented out code. - */ - case 'company_logo': - case 'person_logo': - case 'open_graph_frontpage_image': - // When a logo changes, we need to ditch the caches we have for it. - unset( $clean[ $switch_key . '_id' ] ); - unset( $clean[ $switch_key . '_meta' ] ); - $this->validate_url( $key, $dirty, $old, $clean ); - break; - - /* - * Covers: - * 'social-image-url-' . $pt->name - * 'social-image-url-ptarchive-' . $pt->name - * 'social-image-url-tax-' . $tax->name - * 'social-image-url-author-wpseo', 'social-image-url-archive-wpseo' - */ - case 'social-image-url-': - $this->validate_url( $key, $dirty, $old, $clean ); - break; - - /* - * Covers: - * 'metadesc-home-wpseo', 'metadesc-author-wpseo', 'metadesc-archive-wpseo' - * 'metadesc-' . $pt->name - * 'metadesc-ptarchive-' . $pt->name - * 'metadesc-tax-' . $tax->name - * and also: - * 'bctitle-ptarchive-' . $pt->name - * 'social-description-' . $pt->name - * 'social-description-ptarchive-' . $pt->name - * 'social-description-tax-' . $tax->name - * 'social-description-author-wpseo', 'social-description-archive-wpseo' - * 'open_graph_frontpage_desc' - */ - case 'metadesc-': - case 'bctitle-ptarchive-': - case 'company_name': - case 'company_alternate_name': - case 'person_name': - case 'social-description-': - case 'open_graph_frontpage_desc': - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - $clean[ $key ] = WPSEO_Utils::sanitize_text_field( $dirty[ $key ] ); - } - break; - - /* - * Covers: 'rssbefore', 'rssafter' // phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- This isn't commented out code. - */ - case 'rssbefore': - case 'rssafter': - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = wp_kses_post( $dirty[ $key ] ); - } - break; - - /* 'post_types-' . $pt->name . '-maintax' fields. */ - case 'post_types-': - $post_type = str_replace( [ 'post_types-', '-maintax' ], '', $key ); - $taxonomies = get_object_taxonomies( $post_type, 'names' ); - - if ( isset( $dirty[ $key ] ) ) { - if ( $taxonomies !== [] && in_array( $dirty[ $key ], $taxonomies, true ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - elseif ( (string) $dirty[ $key ] === '0' || (string) $dirty[ $key ] === '' ) { - $clean[ $key ] = 0; - } - elseif ( sanitize_title_with_dashes( $dirty[ $key ] ) === $dirty[ $key ] ) { - // Allow taxonomies which may not be registered yet. - $clean[ $key ] = $dirty[ $key ]; - } - else { - if ( isset( $old[ $key ] ) ) { - $clean[ $key ] = sanitize_title_with_dashes( $old[ $key ] ); - } - - /* - * @todo [JRF => whomever] Maybe change the untranslated $pt name in the - * error message to the nicely translated label ? - */ - add_settings_error( - $this->group_name, // Slug title of the setting. - $key, // Suffix-id for the error message box. - /* translators: %s expands to a post type. */ - sprintf( __( 'Please select a valid taxonomy for post type "%s"', 'wordpress-seo' ), $post_type ), // The error message. - 'error' // Message type. - ); - } - } - elseif ( isset( $old[ $key ] ) ) { - $clean[ $key ] = sanitize_title_with_dashes( $old[ $key ] ); - } - unset( $taxonomies, $post_type ); - break; - - /* 'taxonomy-' . $tax->name . '-ptparent' fields. */ - case 'taxonomy-': - if ( isset( $dirty[ $key ] ) ) { - if ( $allowed_post_types !== [] && in_array( $dirty[ $key ], $allowed_post_types, true ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - elseif ( (string) $dirty[ $key ] === '0' || (string) $dirty[ $key ] === '' ) { - $clean[ $key ] = 0; - } - elseif ( sanitize_key( $dirty[ $key ] ) === $dirty[ $key ] ) { - // Allow taxonomies which may not be registered yet. - $clean[ $key ] = $dirty[ $key ]; - } - else { - if ( isset( $old[ $key ] ) ) { - $clean[ $key ] = sanitize_key( $old[ $key ] ); - } - - /* - * @todo [JRF =? whomever] Maybe change the untranslated $tax name in the - * error message to the nicely translated label ? - */ - $tax = str_replace( [ 'taxonomy-', '-ptparent' ], '', $key ); - add_settings_error( - $this->group_name, // Slug title of the setting. - '_' . $tax, // Suffix-ID for the error message box. - /* translators: %s expands to a taxonomy slug. */ - sprintf( __( 'Please select a valid post type for taxonomy "%s"', 'wordpress-seo' ), $tax ), // The error message. - 'error' // Message type. - ); - unset( $tax ); - } - } - elseif ( isset( $old[ $key ] ) ) { - $clean[ $key ] = sanitize_key( $old[ $key ] ); - } - break; - - /* - * Covers: - * 'company_or_person_user_id' - * 'company_logo_id', 'person_logo_id', 'open_graph_frontpage_image_id' - * 'social-image-id-' . $pt->name - * 'social-image-id-ptarchive-' . $pt->name - * 'social-image-id-tax-' . $tax->name - * 'social-image-id-author-wpseo', 'social-image-id-archive-wpseo' - */ - case 'company_or_person_user_id': - case 'company_logo_id': - case 'person_logo_id': - case 'social-image-id-': - case 'open_graph_frontpage_image_id': - case 'publishing_principles_id': - case 'ownership_funding_info_id': - case 'actionable_feedback_policy_id': - case 'corrections_policy_id': - case 'ethics_policy_id': - case 'diversity_policy_id': - case 'diversity_staffing_report_id': - if ( isset( $dirty[ $key ] ) ) { - $int = WPSEO_Utils::validate_int( $dirty[ $key ] ); - if ( $int !== false && $int >= 0 ) { - $clean[ $key ] = $int; - } - } - elseif ( isset( $old[ $key ] ) ) { - $int = WPSEO_Utils::validate_int( $old[ $key ] ); - if ( $int !== false && $int >= 0 ) { - $clean[ $key ] = $int; - } - } - break; - /* Separator field - Radio. */ - case 'separator': - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - - // Get separator fields. - $separator_fields = $this->get_separator_options(); - - // Check if the given separator exists. - if ( isset( $separator_fields[ $dirty[ $key ] ] ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - } - break; - - case 'schema-page-type-': - if ( isset( $dirty[ $key ] ) && is_string( $dirty[ $key ] ) ) { - if ( array_key_exists( $dirty[ $key ], Schema_Types::PAGE_TYPES ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - else { - $defaults = $this->get_defaults(); - $post_type = str_replace( $switch_key, '', $key ); - $clean[ $key ] = $defaults[ $switch_key . $post_type ]; - } - } - break; - case 'schema-article-type-': - if ( isset( $dirty[ $key ] ) && is_string( $dirty[ $key ] ) ) { - /** - * Filter: 'wpseo_schema_article_types' - Allow developers to filter the available article types. - * - * Make sure when you filter this to also filter `wpseo_schema_article_types_labels`. - * - * @param array $schema_article_types The available schema article types. - */ - if ( array_key_exists( $dirty[ $key ], apply_filters( 'wpseo_schema_article_types', Schema_Types::ARTICLE_TYPES ) ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - else { - $defaults = $this->get_defaults(); - $post_type = str_replace( $switch_key, '', $key ); - $clean[ $key ] = $defaults[ $switch_key . $post_type ]; - } - } - break; - - /* - * Boolean fields. - */ - - /* - * Covers: - * 'noindex-author-wpseo', 'noindex-author-noposts-wpseo', 'noindex-archive-wpseo' - * 'noindex-' . $pt->name - * 'noindex-ptarchive-' . $pt->name - * 'noindex-tax-' . $tax->name - * 'forcerewritetitle': - * 'noodp': - * 'noydir': - * 'disable-author': - * 'disable-date': - * 'disable-post_format'; - * 'noindex-' - * 'display-metabox-pt-' - * 'display-metabox-pt-'. $pt->name - * 'display-metabox-tax-' - * 'display-metabox-tax-' . $tax->name - * 'breadcrumbs-display-blog-page' - * 'breadcrumbs-boldlast' - * 'breadcrumbs-enable' - * 'stripcategorybase' - */ - default: - $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); - break; - } - } - - return $clean; - } - - /** - * Retrieve a list of the allowed post types as breadcrumb parent for a taxonomy. - * Helper method for validation. - * - * {@internal Don't make static as new types may still be registered.}} - * - * @return string[] - */ - protected function get_allowed_post_types() { - $allowed_post_types = []; - - /* - * WPSEO_Post_Type::get_accessible_post_types() should *not* be used here. - */ - $post_types = get_post_types( [ 'public' => true ], 'objects' ); - - if ( get_option( 'show_on_front' ) === 'page' && get_option( 'page_for_posts' ) > 0 ) { - $allowed_post_types[] = 'post'; - } - - if ( is_array( $post_types ) && $post_types !== [] ) { - foreach ( $post_types as $type ) { - if ( WPSEO_Post_Type::has_archive( $type ) ) { - $allowed_post_types[] = $type->name; - } - } - } - - return $allowed_post_types; - } - - /** - * Clean a given option value. - * - * @param string[] $option_value Old (not merged with defaults or filtered) option value to clean according to the rules for this option. - * @param string[]|null $current_version Optional. Version from which to upgrade, if not set, version specific upgrades will be disregarded. - * @param string[]|null $all_old_option_values Optional. Only used when importing old options to have access to the real old values, in contrast to the saved ones. - * - * @return string[] Cleaned option. - */ - protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { - static $original = null; - - // Double-run this function to ensure renaming of the taxonomy options will work. - if ( ! isset( $original ) - && has_action( 'wpseo_double_clean_titles', [ $this, 'clean' ] ) === false - ) { - add_action( 'wpseo_double_clean_titles', [ $this, 'clean' ] ); - $original = $option_value; - } - - /* - * Move options from very old option to this one. - * - * {@internal Don't rename to the 'current' names straight away as that would prevent - * the rename/unset combi below from working.}} - * - * @todo [JRF] Maybe figure out a smarter way to deal with this. - */ - $old_option = null; - if ( isset( $all_old_option_values ) ) { - // Ok, we have an import. - if ( isset( $all_old_option_values['wpseo_indexation'] ) && is_array( $all_old_option_values['wpseo_indexation'] ) && $all_old_option_values['wpseo_indexation'] !== [] ) { - $old_option = $all_old_option_values['wpseo_indexation']; - } - } - else { - $old_option = get_option( 'wpseo_indexation' ); - } - if ( is_array( $old_option ) && $old_option !== [] ) { - $move = [ - 'noindexauthor' => 'noindex-author', - 'disableauthor' => 'disable-author', - 'noindexdate' => 'noindex-archive', - 'noindexcat' => 'noindex-category', - 'noindextag' => 'noindex-post_tag', - 'noindexpostformat' => 'noindex-post_format', - ]; - foreach ( $move as $old => $new ) { - if ( isset( $old_option[ $old ] ) && ! isset( $option_value[ $new ] ) ) { - $option_value[ $new ] = $old_option[ $old ]; - } - } - unset( $move, $old, $new ); - } - unset( $old_option ); - - // Fix wrongness created by buggy version 1.2.2. - if ( isset( $option_value['title-home'] ) && $option_value['title-home'] === '%%sitename%% - %%sitedesc%% - 12345' ) { - $option_value['title-home-wpseo'] = '%%sitename%% - %%sitedesc%%'; - } - - /* - * Renaming these options to avoid ever overwritting these if a (bloody stupid) user / - * programmer would use any of the following as a custom post type or custom taxonomy: - * 'home', 'author', 'archive', 'search', '404', 'subpages'. - * - * Similarly, renaming the tax options to avoid a custom post type and a taxonomy - * with the same name occupying the same option. - */ - $rename = [ - 'title-home' => 'title-home-wpseo', - 'title-author' => 'title-author-wpseo', - 'title-archive' => 'title-archive-wpseo', - 'title-search' => 'title-search-wpseo', - 'title-404' => 'title-404-wpseo', - 'metadesc-home' => 'metadesc-home-wpseo', - 'metadesc-author' => 'metadesc-author-wpseo', - 'metadesc-archive' => 'metadesc-archive-wpseo', - 'noindex-author' => 'noindex-author-wpseo', - 'noindex-archive' => 'noindex-archive-wpseo', - ]; - foreach ( $rename as $old => $new ) { - if ( isset( $option_value[ $old ] ) && ! isset( $option_value[ $new ] ) ) { - $option_value[ $new ] = $option_value[ $old ]; - unset( $option_value[ $old ] ); - } - } - unset( $rename, $old, $new ); - - /* - * {@internal This clean-up action can only be done effectively once the taxonomies - * and post_types have been registered, i.e. at the end of the init action.}} - */ - if ( ( isset( $original ) && current_filter() === 'wpseo_double_clean_titles' ) || did_action( 'wpseo_double_clean_titles' ) > 0 ) { - $rename = [ - 'title-' => 'title-tax-', - 'metadesc-' => 'metadesc-tax-', - 'noindex-' => 'noindex-tax-', - 'tax-hideeditbox-' => 'hideeditbox-tax-', - - ]; - - $taxonomy_names = get_taxonomies( [ 'public' => true ], 'names' ); - $post_type_names = get_post_types( [ 'public' => true ], 'names' ); - $defaults = $this->get_defaults(); - if ( $taxonomy_names !== [] ) { - foreach ( $taxonomy_names as $tax ) { - foreach ( $rename as $old_prefix => $new_prefix ) { - if ( - ( isset( $original[ $old_prefix . $tax ] ) && ! isset( $original[ $new_prefix . $tax ] ) ) - && ( ! isset( $option_value[ $new_prefix . $tax ] ) - || ( isset( $option_value[ $new_prefix . $tax ] ) - && $option_value[ $new_prefix . $tax ] === $defaults[ $new_prefix . $tax ] ) ) - ) { - $option_value[ $new_prefix . $tax ] = $original[ $old_prefix . $tax ]; - - /* - * Check if there is a cpt with the same name as the tax, - * if so, we should make sure that the old setting hasn't been removed. - */ - if ( ! isset( $post_type_names[ $tax ] ) && isset( $option_value[ $old_prefix . $tax ] ) ) { - unset( $option_value[ $old_prefix . $tax ] ); - } - elseif ( isset( $post_type_names[ $tax ] ) && ! isset( $option_value[ $old_prefix . $tax ] ) ) { - $option_value[ $old_prefix . $tax ] = $original[ $old_prefix . $tax ]; - } - - if ( $old_prefix === 'tax-hideeditbox-' ) { - unset( $option_value[ $old_prefix . $tax ] ); - } - } - } - } - } - unset( $rename, $taxonomy_names, $post_type_names, $defaults, $tax, $old_prefix, $new_prefix ); - } - - return $option_value; - } - - /** - * Make sure that any set option values relating to post_types and/or taxonomies are retained, - * even when that post_type or taxonomy may not yet have been registered. - * - * {@internal Overrule the abstract class version of this to make sure one extra renamed - * variable key does not get removed. IMPORTANT: keep this method in line with - * the parent on which it is based!}} - * - * @param string[] $dirty Original option as retrieved from the database. - * @param string[] $clean Filtered option where any options which shouldn't be in our option - * have already been removed and any options which weren't set - * have been set to their defaults. - * - * @return string[] - */ - protected function retain_variable_keys( $dirty, $clean ) { - if ( ( is_array( $this->variable_array_key_patterns ) && $this->variable_array_key_patterns !== [] ) && ( is_array( $dirty ) && $dirty !== [] ) ) { - - // Add the extra pattern. - $patterns = $this->variable_array_key_patterns; - $patterns[] = 'tax-hideeditbox-'; - - /** - * Allow altering the array with variable array key patterns. - * - * @param array $patterns Array with the variable array key patterns. - */ - $patterns = apply_filters( 'wpseo_option_titles_variable_array_key_patterns', $patterns ); - - foreach ( $dirty as $key => $value ) { - - // Do nothing if already in filtered option array. - if ( isset( $clean[ $key ] ) ) { - continue; - } - - foreach ( $patterns as $pattern ) { - if ( strpos( $key, $pattern ) === 0 ) { - $clean[ $key ] = $value; - break; - } - } - } - } - - return $clean; - } - - /** - * Retrieves a list of separator options. - * - * @return string[] An array of the separator options. - */ - protected static function get_separator_option_list() { - $separators = [ - 'sc-dash' => [ - 'option' => '-', - 'label' => __( 'Dash', 'wordpress-seo' ), - ], - 'sc-ndash' => [ - 'option' => '–', - 'label' => __( 'En dash', 'wordpress-seo' ), - ], - 'sc-mdash' => [ - 'option' => '—', - 'label' => __( 'Em dash', 'wordpress-seo' ), - ], - 'sc-colon' => [ - 'option' => ':', - 'label' => __( 'Colon', 'wordpress-seo' ), - ], - 'sc-middot' => [ - 'option' => '·', - 'label' => __( 'Middle dot', 'wordpress-seo' ), - ], - 'sc-bull' => [ - 'option' => '•', - 'label' => __( 'Bullet', 'wordpress-seo' ), - ], - 'sc-star' => [ - 'option' => '*', - 'label' => __( 'Asterisk', 'wordpress-seo' ), - ], - 'sc-smstar' => [ - 'option' => '⋆', - 'label' => __( 'Low asterisk', 'wordpress-seo' ), - ], - 'sc-pipe' => [ - 'option' => '|', - 'label' => __( 'Vertical bar', 'wordpress-seo' ), - ], - 'sc-tilde' => [ - 'option' => '~', - 'label' => __( 'Small tilde', 'wordpress-seo' ), - ], - 'sc-laquo' => [ - 'option' => '«', - 'label' => __( 'Left angle quotation mark', 'wordpress-seo' ), - ], - 'sc-raquo' => [ - 'option' => '»', - 'label' => __( 'Right angle quotation mark', 'wordpress-seo' ), - ], - 'sc-lt' => [ - 'option' => '>', - 'label' => __( 'Less than sign', 'wordpress-seo' ), - ], - 'sc-gt' => [ - 'option' => '<', - 'label' => __( 'Greater than sign', 'wordpress-seo' ), - ], - ]; - - /** - * Allows altering the separator options array. - * - * @param array $separators Array with the separator options. - */ - $separator_list = apply_filters( 'wpseo_separator_option_list', $separators ); - - if ( ! is_array( $separator_list ) ) { - return $separators; - } - - return $separator_list; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-wpseo.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-wpseo.php deleted file mode 100644 index aa89d266..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-wpseo.php +++ /dev/null @@ -1,663 +0,0 @@ -get_defaults();}} - * - * @var array - */ - protected $defaults = [ - // Non-form fields, set via (ajax) function. - 'tracking' => null, - 'toggled_tracking' => false, - 'license_server_version' => false, - 'ms_defaults_set' => false, - 'ignore_search_engines_discouraged_notice' => false, - 'indexing_first_time' => true, - 'indexing_started' => null, - 'indexing_reason' => '', - 'indexables_indexing_completed' => false, - 'index_now_key' => '', - // Non-form field, should only be set via validation routine. - 'version' => '', // Leave default as empty to ensure activation/upgrade works. - 'previous_version' => '', - // Form fields. - 'disableadvanced_meta' => true, - 'enable_headless_rest_endpoints' => true, - 'ryte_indexability' => false, - 'baiduverify' => '', // Text field. - 'googleverify' => '', // Text field. - 'msverify' => '', // Text field. - 'yandexverify' => '', - 'site_type' => '', // List of options. - 'has_multiple_authors' => '', - 'environment_type' => '', - 'content_analysis_active' => true, - 'keyword_analysis_active' => true, - 'inclusive_language_analysis_active' => false, - 'enable_admin_bar_menu' => true, - 'enable_cornerstone_content' => true, - 'enable_xml_sitemap' => true, - 'enable_text_link_counter' => true, - 'enable_index_now' => true, - 'enable_ai_generator' => true, - 'ai_enabled_pre_default' => false, - 'show_onboarding_notice' => false, - 'first_activated_on' => false, - 'myyoast-oauth' => [ - 'config' => [ - 'clientId' => null, - 'secret' => null, - ], - 'access_tokens' => [], - ], - 'semrush_integration_active' => true, - 'semrush_tokens' => [], - 'semrush_country_code' => 'us', - 'permalink_structure' => '', - 'home_url' => '', - 'dynamic_permalinks' => false, - 'category_base_url' => '', - 'tag_base_url' => '', - 'custom_taxonomy_slugs' => [], - 'enable_enhanced_slack_sharing' => true, - 'zapier_integration_active' => false, - 'zapier_subscription' => [], - 'zapier_api_key' => '', - 'enable_metabox_insights' => true, - 'enable_link_suggestions' => true, - 'algolia_integration_active' => false, - 'import_cursors' => [], - 'workouts_data' => [ 'configuration' => [ 'finishedSteps' => [] ] ], - 'configuration_finished_steps' => [], - 'dismiss_configuration_workout_notice' => false, - 'dismiss_premium_deactivated_notice' => false, - 'importing_completed' => [], - 'wincher_integration_active' => true, - 'wincher_tokens' => [], - 'wincher_automatically_add_keyphrases' => false, - 'wincher_website_id' => '', - 'wordproof_integration_active' => false, - 'wordproof_integration_changed' => false, - 'first_time_install' => false, - 'should_redirect_after_install_free' => false, - 'activation_redirect_timestamp_free' => 0, - 'remove_feed_global' => false, - 'remove_feed_global_comments' => false, - 'remove_feed_post_comments' => false, - 'remove_feed_authors' => false, - 'remove_feed_categories' => false, - 'remove_feed_tags' => false, - 'remove_feed_custom_taxonomies' => false, - 'remove_feed_post_types' => false, - 'remove_feed_search' => false, - 'remove_atom_rdf_feeds' => false, - 'remove_shortlinks' => false, - 'remove_rest_api_links' => false, - 'remove_rsd_wlw_links' => false, - 'remove_oembed_links' => false, - 'remove_generator' => false, - 'remove_emoji_scripts' => false, - 'remove_powered_by_header' => false, - 'remove_pingback_header' => false, - 'clean_campaign_tracking_urls' => false, - 'clean_permalinks' => false, - 'clean_permalinks_extra_variables' => '', - 'search_cleanup' => false, - 'search_cleanup_emoji' => false, - 'search_cleanup_patterns' => false, - 'search_character_limit' => 50, - 'deny_search_crawling' => false, - 'deny_wp_json_crawling' => false, - 'deny_adsbot_crawling' => false, - 'deny_ccbot_crawling' => false, - 'deny_google_extended_crawling' => false, - 'deny_gptbot_crawling' => false, - 'redirect_search_pretty_urls' => false, - 'least_readability_ignore_list' => [], - 'least_seo_score_ignore_list' => [], - 'most_linked_ignore_list' => [], - 'least_linked_ignore_list' => [], - 'indexables_page_reading_list' => [ false, false, false, false, false ], - 'indexables_overview_state' => 'dashboard-not-visited', - 'last_known_public_post_types' => [], - 'last_known_public_taxonomies' => [], - 'last_known_no_unindexed' => [], - 'new_post_types' => [], - 'new_taxonomies' => [], - 'show_new_content_type_notification' => false, - ]; - - /** - * Sub-options which should not be overloaded with multi-site defaults. - * - * @var array - */ - public $ms_exclude = [ - 'ignore_search_engines_discouraged_notice', - /* Privacy. */ - 'baiduverify', - 'googleverify', - 'msverify', - 'yandexverify', - ]; - - /** - * Possible values for the site_type option. - * - * @var array - */ - protected $site_types = [ - '', - 'blog', - 'shop', - 'news', - 'smallBusiness', - 'corporateOther', - 'personalOther', - ]; - - /** - * Possible environment types. - * - * @var array - */ - protected $environment_types = [ - '', - 'local', - 'production', - 'staging', - 'development', - ]; - - /** - * Possible has_multiple_authors options. - * - * @var array - */ - protected $has_multiple_authors_options = [ - '', - true, - false, - ]; - - /** - * Name for an option higher in the hierarchy to override setting access. - * - * @var string - */ - protected $override_option_name = 'wpseo_ms'; - - /** - * Add the actions and filters for the option. - * - * @todo [JRF => testers] Check if the extra actions below would run into problems if an option - * is updated early on and if so, change the call to schedule these for a later action on add/update - * instead of running them straight away. - */ - protected function __construct() { - parent::__construct(); - - /** - * Filter: 'wpseo_enable_tracking' - Enables the data tracking of Yoast SEO Premium. - * - * @param string $is_enabled The enabled state. Default is false. - */ - $this->defaults['tracking'] = apply_filters( 'wpseo_enable_tracking', false ); - - /* Clear the cache on update/add. */ - add_action( 'add_option_' . $this->option_name, [ 'WPSEO_Utils', 'clear_cache' ] ); - add_action( 'update_option_' . $this->option_name, [ 'WPSEO_Utils', 'clear_cache' ] ); - - add_filter( 'admin_title', [ 'Yoast_Input_Validation', 'add_yoast_admin_document_title_errors' ] ); - - /** - * Filter the `wpseo` option defaults. - * - * @param array $defaults Array the defaults for the `wpseo` option attributes. - */ - $this->defaults = apply_filters( 'wpseo_option_wpseo_defaults', $this->defaults ); - } - - /** - * Get the singleton instance of this class. - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Add filters to make sure that the option is merged with its defaults before being returned. - * - * @return void - */ - public function add_option_filters() { - parent::add_option_filters(); - - list( $hookname, $callback, $priority ) = $this->get_verify_features_option_filter_hook(); - - if ( has_filter( $hookname, $callback ) === false ) { - add_filter( $hookname, $callback, $priority ); - } - } - - /** - * Remove the option filters. - * Called from the clean_up methods to make sure we retrieve the original old option. - * - * @return void - */ - public function remove_option_filters() { - parent::remove_option_filters(); - - list( $hookname, $callback, $priority ) = $this->get_verify_features_option_filter_hook(); - - remove_filter( $hookname, $callback, $priority ); - } - - /** - * Add filters to make sure that the option default is returned if the option is not set. - * - * @return void - */ - public function add_default_filters() { - parent::add_default_filters(); - - list( $hookname, $callback, $priority ) = $this->get_verify_features_default_option_filter_hook(); - - if ( has_filter( $hookname, $callback ) === false ) { - add_filter( $hookname, $callback, $priority ); - } - } - - /** - * Remove the default filters. - * Called from the validate() method to prevent failure to add new options. - * - * @return void - */ - public function remove_default_filters() { - parent::remove_default_filters(); - - list( $hookname, $callback, $priority ) = $this->get_verify_features_default_option_filter_hook(); - - remove_filter( $hookname, $callback, $priority ); - } - - /** - * Validate the option. - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array Validated clean value for the option to be saved to the database. - */ - protected function validate_option( $dirty, $clean, $old ) { - - foreach ( $clean as $key => $value ) { - switch ( $key ) { - case 'version': - $clean[ $key ] = WPSEO_VERSION; - break; - case 'previous_version': - case 'semrush_country_code': - case 'license_server_version': - case 'home_url': - case 'zapier_api_key': - case 'index_now_key': - case 'wincher_website_id': - case 'clean_permalinks_extra_variables': - case 'indexables_overview_state': - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - case 'indexing_reason': - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = sanitize_text_field( $dirty[ $key ] ); - } - break; - - /* Verification strings. */ - case 'baiduverify': - case 'googleverify': - case 'msverify': - case 'yandexverify': - $this->validate_verification_string( $key, $dirty, $old, $clean ); - break; - - /* - * Boolean dismiss warnings - not fields - may not be in form - * (and don't need to be either as long as the default is false). - */ - case 'ignore_search_engines_discouraged_notice': - case 'ms_defaults_set': - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = WPSEO_Utils::validate_bool( $dirty[ $key ] ); - } - elseif ( isset( $old[ $key ] ) ) { - $clean[ $key ] = WPSEO_Utils::validate_bool( $old[ $key ] ); - } - break; - - case 'site_type': - $clean[ $key ] = $old[ $key ]; - if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], $this->site_types, true ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - - case 'environment_type': - $clean[ $key ] = $old[ $key ]; - if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], $this->environment_types, true ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - - case 'has_multiple_authors': - $clean[ $key ] = $old[ $key ]; - if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], $this->has_multiple_authors_options, true ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - - break; - - case 'first_activated_on': - case 'indexing_started': - case 'activation_redirect_timestamp_free': - $clean[ $key ] = false; - if ( isset( $dirty[ $key ] ) ) { - if ( $dirty[ $key ] === false || WPSEO_Utils::validate_int( $dirty[ $key ] ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - } - break; - - case 'tracking': - $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : null ); - break; - - case 'myyoast_oauth': - case 'semrush_tokens': - case 'custom_taxonomy_slugs': - case 'zapier_subscription': - case 'wincher_tokens': - case 'workouts_data': - case 'configuration_finished_steps': - case 'least_readability_ignore_list': - case 'least_seo_score_ignore_list': - case 'most_linked_ignore_list': - case 'least_linked_ignore_list': - case 'indexables_page_reading_list': - case 'last_known_public_post_types': - case 'last_known_public_taxonomies': - case 'new_post_types': - case 'new_taxonomies': - $clean[ $key ] = $old[ $key ]; - - if ( isset( $dirty[ $key ] ) ) { - $items = $dirty[ $key ]; - if ( ! is_array( $items ) ) { - $items = json_decode( $dirty[ $key ], true ); - } - - if ( is_array( $items ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - } - - break; - - case 'permalink_structure': - case 'category_base_url': - case 'tag_base_url': - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = sanitize_option( $key, $dirty[ $key ] ); - } - break; - - case 'search_character_limit': - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = (int) $dirty[ $key ]; - } - break; - - case 'import_cursors': - case 'importing_completed': - if ( isset( $dirty[ $key ] ) && is_array( $dirty[ $key ] ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - - case 'wordproof_integration_active': - $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); - // If the setting has changed, record it. - if ( $old[ $key ] !== $clean[ $key ] ) { - $clean['wordproof_integration_changed'] = true; - } - break; - case 'last_known_no_unindexed': - $clean[ $key ] = $old[ $key ]; - - if ( isset( $dirty[ $key ] ) ) { - $items = $dirty[ $key ]; - - if ( is_array( $items ) ) { - foreach ( $items as $item_key => $item ) { - if ( ! is_string( $item_key ) || ! is_numeric( $item ) ) { - unset( $items[ $item_key ] ); - } - } - $clean[ $key ] = $items; - } - } - - break; - - /* - * Boolean (checkbox) fields. - * - * Covers: - * 'disableadvanced_meta' - * 'enable_headless_rest_endpoints' - * 'yoast_tracking' - * 'dynamic_permalinks' - * 'indexing_first_time' - * 'first_time_install' - * 'remove_feed_global' - * 'remove_feed_global_comments' - * 'remove_feed_post_comments' - * 'remove_feed_authors' - * 'remove_feed_categories' - * 'remove_feed_tags' - * 'remove_feed_custom_taxonomies' - * 'remove_feed_post_types' - * 'remove_feed_search' - * 'remove_atom_rdf_feeds' - * 'remove_shortlinks' - * 'remove_rest_api_links' - * 'remove_rsd_wlw_links' - * 'remove_oembed_links' - * 'remove_generator' - * 'remove_emoji_scripts' - * 'remove_powered_by_header' - * 'remove_pingback_header' - * 'clean_campaign_tracking_urls' - * 'clean_permalinks' - * 'clean_permalinks_extra_variables' - * 'search_cleanup' - * 'search_cleanup_emoji' - * 'search_cleanup_patterns' - * 'deny_wp_json_crawling' - * 'deny_adsbot_crawling' - * 'deny_ccbot_crawling' - * 'deny_google_extended_crawling' - * 'deny_gptbot_crawling' - * 'redirect_search_pretty_urls' - * 'should_redirect_after_install_free' - * 'show_new_content_type_notification' - * and most of the feature variables. - */ - default: - $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); - break; - } - } - - return $clean; - } - - /** - * Verifies that the feature variables are turned off if the network is configured so. - * - * @param mixed $options Value of the option to be returned. Typically an array. - * - * @return mixed Filtered $options value. - */ - public function verify_features_against_network( $options = [] ) { - if ( ! is_array( $options ) || empty( $options ) ) { - return $options; - } - - // For the feature variables, set their values to off in case they are disabled. - $feature_vars = [ - 'disableadvanced_meta' => false, - 'ryte_indexability' => false, - 'content_analysis_active' => false, - 'keyword_analysis_active' => false, - 'inclusive_language_analysis_active' => false, - 'enable_admin_bar_menu' => false, - 'enable_cornerstone_content' => false, - 'enable_xml_sitemap' => false, - 'enable_text_link_counter' => false, - 'enable_metabox_insights' => false, - 'enable_link_suggestions' => false, - 'enable_headless_rest_endpoints' => false, - 'tracking' => false, - 'enable_enhanced_slack_sharing' => false, - 'semrush_integration_active' => false, - 'zapier_integration_active' => false, - 'wincher_integration_active' => false, - 'remove_feed_global' => false, - 'remove_feed_global_comments' => false, - 'remove_feed_post_comments' => false, - 'enable_index_now' => false, - 'enable_ai_generator' => false, - 'remove_feed_authors' => false, - 'remove_feed_categories' => false, - 'remove_feed_tags' => false, - 'remove_feed_custom_taxonomies' => false, - 'remove_feed_post_types' => false, - 'remove_feed_search' => false, - 'remove_atom_rdf_feeds' => false, - 'remove_shortlinks' => false, - 'remove_rest_api_links' => false, - 'remove_rsd_wlw_links' => false, - 'remove_oembed_links' => false, - 'remove_generator' => false, - 'remove_emoji_scripts' => false, - 'remove_powered_by_header' => false, - 'remove_pingback_header' => false, - 'clean_campaign_tracking_urls' => false, - 'clean_permalinks' => false, - 'search_cleanup' => false, - 'search_cleanup_emoji' => false, - 'search_cleanup_patterns' => false, - 'redirect_search_pretty_urls' => false, - 'algolia_integration_active' => false, - ]; - - // We can reuse this logic from the base class with the above defaults to parse with the correct feature values. - $options = $this->prevent_disabled_options_update( $options, $feature_vars ); - - return $options; - } - - /** - * Gets the filter hook name and callback for adjusting the retrieved option value - * against the network-allowed features. - * - * @return array Array where the first item is the hook name, the second is the hook callback, - * and the third is the hook priority. - */ - protected function get_verify_features_option_filter_hook() { - return [ - "option_{$this->option_name}", - [ $this, 'verify_features_against_network' ], - 11, - ]; - } - - /** - * Gets the filter hook name and callback for adjusting the default option value against the network-allowed features. - * - * @return array Array where the first item is the hook name, the second is the hook callback, - * and the third is the hook priority. - */ - protected function get_verify_features_default_option_filter_hook() { - return [ - "default_option_{$this->option_name}", - [ $this, 'verify_features_against_network' ], - 11, - ]; - } - - /** - * Clean a given option value. - * - * @param array $option_value Old (not merged with defaults or filtered) option value to - * clean according to the rules for this option. - * @param string|null $current_version Optional. Version from which to upgrade, if not set, - * version specific upgrades will be disregarded. - * @param array|null $all_old_option_values Optional. Only used when importing old options to have - * access to the real old values, in contrast to the saved ones. - * - * @return array Cleaned option. - */ - protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { - // Deal with value change from text string to boolean. - $value_change = [ - 'ignore_search_engines_discouraged_notice', - ]; - - $target_values = [ - 'ignore', - 'done', - ]; - - foreach ( $value_change as $key ) { - if ( isset( $option_value[ $key ] ) - && in_array( $option_value[ $key ], $target_values, true ) - ) { - $option_value[ $key ] = true; - } - } - - return $option_value; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option.php deleted file mode 100644 index 1a4b2ea0..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option.php +++ /dev/null @@ -1,894 +0,0 @@ - testers] Double check that validation will not cause errors when called - * from upgrade routine (some of the WP functions may not yet be available). - */ -abstract class WPSEO_Option { - - /** - * Prefix for override option keys that allow or disallow the option key of the same name. - * - * @var string - */ - public const ALLOW_KEY_PREFIX = 'allow_'; - - /** - * Option name - MUST be set in concrete class and set to public. - * - * @var string - */ - protected $option_name; - - /** - * Option group name for use in settings forms. - * - * Will be set automagically if not set in concrete class (i.e. - * if it conforms to the normal pattern 'yoast' . $option_name . 'options', - * only set in concrete class if it doesn't). - * - * @var string - */ - public $group_name; - - /** - * Whether to include the option in the return for WPSEO_Options::get_all(). - * - * Also determines which options are copied over for ms_(re)set_blog(). - * - * @var bool - */ - public $include_in_all = true; - - /** - * Whether this option is only for when the install is multisite. - * - * @var bool - */ - public $multisite_only = false; - - /** - * Array of defaults for the option - MUST be set in concrete class. - * - * Shouldn't be requested directly, use $this->get_defaults(); - * - * @var array - */ - protected $defaults; - - /** - * Array of variable option name patterns for the option - if any. - * - * Set this when the option contains array keys which vary based on post_type - * or taxonomy. - * - * @var array - */ - protected $variable_array_key_patterns; - - /** - * Array of sub-options which should not be overloaded with multi-site defaults. - * - * @var array - */ - public $ms_exclude = []; - - /** - * Name for an option higher in the hierarchy to override setting access. - * - * @var string - */ - protected $override_option_name; - - /** - * Instance of this class. - * - * @var WPSEO_Option - */ - protected static $instance; - - - /* *********** INSTANTIATION METHODS *********** */ - - /** - * Add all the actions and filters for the option. - */ - protected function __construct() { - - /* Add filters which get applied to the get_options() results. */ - $this->add_default_filters(); // Return defaults if option not set. - $this->add_option_filters(); // Merge with defaults if option *is* set. - - if ( $this->multisite_only !== true ) { - /** - * The option validation routines remove the default filters to prevent failing - * to insert an option if it's new. Let's add them back afterwards. - */ - add_action( 'add_option', [ $this, 'add_default_filters_if_same_option' ] ); // Adding back after INSERT. - - add_action( 'update_option', [ $this, 'add_default_filters_if_same_option' ] ); - - add_filter( 'pre_update_option', [ $this, 'add_default_filters_if_not_changed' ], PHP_INT_MAX, 3 ); - - // Refills the cache when the option has been updated. - add_action( 'update_option_' . $this->option_name, [ 'WPSEO_Options', 'clear_cache' ], 10 ); - } - elseif ( is_multisite() ) { - /* - * The option validation routines remove the default filters to prevent failing - * to insert an option if it's new. Let's add them back afterwards. - * - * For site_options, this method is not foolproof as these actions are not fired - * on an insert/update failure. Please use the WPSEO_Options::update_site_option() method - * for updating site options to make sure the filters are in place. - */ - add_action( 'add_site_option_' . $this->option_name, [ $this, 'add_default_filters' ] ); - add_action( 'update_site_option_' . $this->option_name, [ $this, 'add_default_filters' ] ); - add_filter( 'pre_update_site_option_' . $this->option_name, [ $this, 'add_default_filters_if_not_changed' ], PHP_INT_MAX, 3 ); - - // Refills the cache when the option has been updated. - add_action( 'update_site_option_' . $this->option_name, [ 'WPSEO_Options', 'clear_cache' ], 1, 0 ); - } - - /* - * Make sure the option will always get validated, independently of register_setting() - * (only available on back-end). - */ - add_filter( 'sanitize_option_' . $this->option_name, [ $this, 'validate' ] ); - - /* Register our option for the admin pages */ - add_action( 'admin_init', [ $this, 'register_setting' ] ); - - /* Set option group name if not given */ - if ( ! isset( $this->group_name ) || $this->group_name === '' ) { - $this->group_name = 'yoast_' . $this->option_name . '_options'; - } - - /* Translate some defaults as early as possible - textdomain is loaded in init on priority 1. */ - if ( method_exists( $this, 'translate_defaults' ) ) { - add_action( 'init', [ $this, 'translate_defaults' ], 2 ); - } - - /** - * Enrich defaults once custom post types and taxonomies have been registered - * which is normally done on the init action. - * - * @todo [JRF/testers] Verify that none of the options which are only available after - * enrichment are used before the enriching. - */ - if ( method_exists( $this, 'enrich_defaults' ) ) { - add_action( 'init', [ $this, 'enrich_defaults' ], 99 ); - } - } - - /* - * All concrete classes *must* contain the get_instance method. - * - * {@internal Unfortunately I can't define it as an abstract as it also *has* to be static...}} - * - * ``` - * abstract protected static function get_instance(); - * ``` - * --------------- - * - * Concrete classes *may* contain a translate_defaults method. - * ``` - * abstract public function translate_defaults(); - * ``` - * --------------- - * - * Concrete classes *may* contain an enrich_defaults method to add additional defaults once - * all post_types and taxonomies have been registered. - * - * ``` - * abstract public function enrich_defaults(); - * ``` - */ - - /* *********** METHODS INFLUENCING get_option() *********** */ - - /** - * Add filters to make sure that the option default is returned if the option is not set. - * - * @return void - */ - public function add_default_filters() { - // Don't change, needs to check for false as could return prio 0 which would evaluate to false. - if ( has_filter( 'default_option_' . $this->option_name, [ $this, 'get_defaults' ] ) === false ) { - add_filter( 'default_option_' . $this->option_name, [ $this, 'get_defaults' ] ); - } - } - - /** - * Adds back the default filters that were removed during validation if the option was changed. - * Checks if this option was changed to prevent constantly checking if filters are present. - * - * @param string $option_name The option name. - * - * @return void - */ - public function add_default_filters_if_same_option( $option_name ) { - if ( $option_name === $this->option_name ) { - $this->add_default_filters(); - } - } - - /** - * Adds back the default filters that were removed during validation if the option was not changed. - * This is because in that case the latter actions are not called and thus the filters are never - * added back. - * - * @param mixed $value The current value. - * @param string $option_name The option name. - * @param mixed $old_value The old value. - * - * @return string The current value. - */ - public function add_default_filters_if_not_changed( $value, $option_name, $old_value ) { - if ( $option_name !== $this->option_name ) { - return $value; - } - - if ( $value === $old_value || maybe_serialize( $value ) === maybe_serialize( $old_value ) ) { - $this->add_default_filters(); - } - - return $value; - } - - /** - * Validate webmaster tools & Pinterest verification strings. - * - * @param string $key Key to check, by type of service. - * @param array $dirty Dirty data with the new values. - * @param array $old Old data. - * @param array $clean Clean data by reference, normally the default values. - * - * @return void - */ - public function validate_verification_string( $key, $dirty, $old, &$clean ) { - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - $meta = $dirty[ $key ]; - if ( strpos( $meta, 'content=' ) ) { - // Make sure we only have the real key, not a complete meta tag. - preg_match( '`content=([\'"])?([^\'"> ]+)(?:\1|[ />])`', $meta, $match ); - if ( isset( $match[2] ) ) { - $meta = $match[2]; - } - unset( $match ); - } - - $meta = sanitize_text_field( $meta ); - if ( $meta !== '' ) { - $regex = '`^[A-Fa-f0-9_-]+$`'; - $service = ''; - - switch ( $key ) { - case 'baiduverify': - $regex = '`^[A-Za-z0-9_-]+$`'; - $service = 'Baidu Webmaster tools'; - break; - - case 'googleverify': - $regex = '`^[A-Za-z0-9_-]+$`'; - $service = 'Google Webmaster tools'; - break; - - case 'msverify': - $service = 'Bing Webmaster tools'; - break; - - case 'pinterestverify': - $service = 'Pinterest'; - break; - - case 'yandexverify': - $service = 'Yandex Webmaster tools'; - break; - } - - if ( preg_match( $regex, $meta ) ) { - $clean[ $key ] = $meta; - } - else { - // Restore the previous value, if any. - if ( isset( $old[ $key ] ) && preg_match( $regex, $old[ $key ] ) ) { - $clean[ $key ] = $old[ $key ]; - } - - if ( function_exists( 'add_settings_error' ) ) { - add_settings_error( - $this->group_name, // Slug title of the setting. - $key, // Suffix-ID for the error message box. WordPress prepends `setting-error-`. - /* translators: 1: Verification string from user input; 2: Service name. */ - sprintf( __( '%1$s does not seem to be a valid %2$s verification string. Please correct.', 'wordpress-seo' ), '' . esc_html( $meta ) . '', $service ), // The error message. - 'error' // CSS class for the WP notice, either the legacy 'error' / 'updated' or the new `notice-*` ones. - ); - } - - Yoast_Input_Validation::add_dirty_value_to_settings_errors( $key, $meta ); - } - } - } - } - - /** - * Validates an option as a valid URL. Prints out a WordPress settings error - * notice if the URL is invalid. - * - * @param string $key Key to check, by type of URL setting. - * @param array $dirty Dirty data with the new values. - * @param array $old Old data. - * @param array $clean Clean data by reference, normally the default values. - * - * @return void - */ - public function validate_url( $key, $dirty, $old, &$clean ) { - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - - $submitted_url = trim( $dirty[ $key ] ); - $validated_url = filter_var( WPSEO_Utils::sanitize_url( $submitted_url ), FILTER_VALIDATE_URL ); - - if ( $validated_url === false ) { - if ( function_exists( 'add_settings_error' ) ) { - add_settings_error( - // Slug title of the setting. - $this->group_name, - // Suffix-ID for the error message box. WordPress prepends `setting-error-`. - $key, - // The error message. - sprintf( - /* translators: %s expands to an invalid URL. */ - __( '%s does not seem to be a valid url. Please correct.', 'wordpress-seo' ), - '' . esc_url( $submitted_url ) . '' - ), - // Message type. - 'error' - ); - } - - // Restore the previous URL value, if any. - if ( isset( $old[ $key ] ) && $old[ $key ] !== '' ) { - $url = WPSEO_Utils::sanitize_url( $old[ $key ] ); - if ( $url !== '' ) { - $clean[ $key ] = $url; - } - } - - Yoast_Input_Validation::add_dirty_value_to_settings_errors( $key, $submitted_url ); - - return; - } - - // The URL format is valid, let's sanitize it. - $url = WPSEO_Utils::sanitize_url( $validated_url ); - - if ( $url !== '' ) { - $clean[ $key ] = $url; - } - } - } - - /** - * Remove the default filters. - * Called from the validate() method to prevent failure to add new options. - * - * @return void - */ - public function remove_default_filters() { - remove_filter( 'default_option_' . $this->option_name, [ $this, 'get_defaults' ] ); - } - - /** - * Get the enriched default value for an option. - * - * Checks if the concrete class contains an enrich_defaults() method and if so, runs it. - * - * {@internal The enrich_defaults method is used to set defaults for variable array keys - * in an option, such as array keys depending on post_types and/or taxonomies.}} - * - * @return array - */ - public function get_defaults() { - if ( method_exists( $this, 'translate_defaults' ) ) { - $this->translate_defaults(); - } - - if ( method_exists( $this, 'enrich_defaults' ) ) { - $this->enrich_defaults(); - } - - return apply_filters( 'wpseo_defaults', $this->defaults, $this->option_name ); - } - - /** - * Add filters to make sure that the option is merged with its defaults before being returned. - * - * @return void - */ - public function add_option_filters() { - // Don't change, needs to check for false as could return prio 0 which would evaluate to false. - if ( has_filter( 'option_' . $this->option_name, [ $this, 'get_option' ] ) === false ) { - add_filter( 'option_' . $this->option_name, [ $this, 'get_option' ] ); - } - } - - /** - * Remove the option filters. - * Called from the clean_up methods to make sure we retrieve the original old option. - * - * @return void - */ - public function remove_option_filters() { - remove_filter( 'option_' . $this->option_name, [ $this, 'get_option' ] ); - } - - /** - * Merge an option with its default values. - * - * This method should *not* be called directly!!! It is only meant to filter the get_option() results. - * - * @param mixed $options Option value. - * - * @return mixed Option merged with the defaults for that option. - */ - public function get_option( $options = null ) { - $filtered = $this->array_filter_merge( $options ); - - /* - * If the option contains variable option keys, make sure we don't remove those settings - * - even if the defaults are not complete yet. - * Unfortunately this means we also won't be removing the settings for post types or taxonomies - * which are no longer in the WP install, but rather that than the other way around. - */ - if ( isset( $this->variable_array_key_patterns ) ) { - $filtered = $this->retain_variable_keys( $options, $filtered ); - } - - return $filtered; - } - - /* *********** METHODS influencing add_option(), update_option() and saving from admin pages. *********** */ - - /** - * Register (whitelist) the option for the configuration pages. - * The validation callback is already registered separately on the sanitize_option hook, - * so no need to double register. - * - * @return void - */ - public function register_setting() { - if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ) { - return; - } - - if ( $this->multisite_only === true ) { - $network_settings_api = Yoast_Network_Settings_API::get(); - if ( $network_settings_api->meets_requirements() ) { - $network_settings_api->register_setting( $this->group_name, $this->option_name ); - } - return; - } - - register_setting( $this->group_name, $this->option_name ); - } - - /** - * Validate the option. - * - * @param mixed $option_value The unvalidated new value for the option. - * - * @return array Validated new value for the option. - */ - public function validate( $option_value ) { - $clean = $this->get_defaults(); - - /* Return the defaults if the new value is empty. */ - if ( ! is_array( $option_value ) || $option_value === [] ) { - return $clean; - } - - $option_value = array_map( [ 'WPSEO_Utils', 'trim_recursive' ], $option_value ); - - $old = $this->get_original_option(); - if ( ! is_array( $old ) ) { - $old = []; - } - $old = array_merge( $clean, $old ); - - $clean = $this->validate_option( $option_value, $clean, $old ); - - // Prevent updates to variables that are disabled via the override option. - $clean = $this->prevent_disabled_options_update( $clean, $old ); - - /* Retain the values for variable array keys even when the post type/taxonomy is not yet registered. */ - if ( isset( $this->variable_array_key_patterns ) ) { - $clean = $this->retain_variable_keys( $option_value, $clean ); - } - - $this->remove_default_filters(); - - return $clean; - } - - /** - * Checks whether a specific option key is disabled. - * - * This is determined by whether an override option is available with a key that equals the given key prefixed - * with 'allow_'. - * - * @param string $key Option key. - * - * @return bool True if option key is disabled, false otherwise. - */ - public function is_disabled( $key ) { - $override_option = $this->get_override_option(); - if ( empty( $override_option ) ) { - return false; - } - - return isset( $override_option[ self::ALLOW_KEY_PREFIX . $key ] ) && ! $override_option[ self::ALLOW_KEY_PREFIX . $key ]; - } - - /** - * All concrete classes must contain a validate_option() method which validates all - * values within the option. - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - */ - abstract protected function validate_option( $dirty, $clean, $old ); - - /* *********** METHODS for ADDING/UPDATING/UPGRADING the option. *********** */ - - /** - * Retrieve the real old value (unmerged with defaults). - * - * @return array|bool The original option value (which can be false if the option doesn't exist). - */ - protected function get_original_option() { - $this->remove_default_filters(); - $this->remove_option_filters(); - - // Get (unvalidated) array, NOT merged with defaults. - if ( $this->multisite_only !== true ) { - $option_value = get_option( $this->option_name ); - } - else { - $option_value = get_site_option( $this->option_name ); - } - - $this->add_option_filters(); - $this->add_default_filters(); - - return $option_value; - } - - /** - * Add the option if it doesn't exist for some strange reason. - * - * @uses WPSEO_Option::get_original_option() - * - * @return void - */ - public function maybe_add_option() { - if ( $this->get_original_option() === false ) { - if ( $this->multisite_only !== true ) { - update_option( $this->option_name, $this->get_defaults() ); - } - else { - $this->update_site_option( $this->get_defaults() ); - } - } - } - - /** - * Update a site_option. - * - * {@internal This special method is only needed for multisite options, but very needed indeed there. - * The order in which certain functions and hooks are run is different between - * get_option() and get_site_option() which means in practice that the removing - * of the default filters would be done too late and the re-adding of the default - * filters might not be done at all. - * Aka: use the WPSEO_Options::update_site_option() method (which calls this method) - * for safely adding/updating multisite options.}} - * - * @param mixed $value The new value for the option. - * - * @return bool Whether the update was successful. - */ - public function update_site_option( $value ) { - if ( $this->multisite_only === true && is_multisite() ) { - $this->remove_default_filters(); - $result = update_site_option( $this->option_name, $value ); - $this->add_default_filters(); - - return $result; - } - else { - return false; - } - } - - /** - * Retrieve the real old value (unmerged with defaults), clean and re-save the option. - * - * @uses WPSEO_Option::get_original_option() - * @uses WPSEO_Option::import() - * - * @param string|null $current_version Optional. Version from which to upgrade, if not set, - * version-specific upgrades will be disregarded. - * - * @return void - */ - public function clean( $current_version = null ) { - $option_value = $this->get_original_option(); - $this->import( $option_value, $current_version ); - } - - /** - * Clean and re-save the option. - * - * @uses clean_option() method from concrete class if it exists. - * - * @todo [JRF/whomever] Figure out a way to show settings error during/after the upgrade - maybe - * something along the lines of: - * -> add them to a property in this class - * -> if that property isset at the end of the routine and add_settings_error function does not exist, - * save as transient (or update the transient if one already exists) - * -> next time an admin is in the WP back-end, show the errors and delete the transient or only delete it - * once the admin has dismissed the message (add ajax function) - * Important: all validation routines which add_settings_errors would need to be changed for this to work - * - * @param array $option_value Option value to be imported. - * @param string|null $current_version Optional. Version from which to upgrade, if not set, - * version-specific upgrades will be disregarded. - * @param array|null $all_old_option_values Optional. Only used when importing old options to - * have access to the real old values, in contrast to - * the saved ones. - * - * @return void - */ - public function import( $option_value, $current_version = null, $all_old_option_values = null ) { - if ( $option_value === false ) { - $option_value = $this->get_defaults(); - } - elseif ( is_array( $option_value ) && method_exists( $this, 'clean_option' ) ) { - $option_value = $this->clean_option( $option_value, $current_version, $all_old_option_values ); - } - - /* - * Save the cleaned value - validation will take care of cleaning out array keys which - * should no longer be there. - */ - if ( $this->multisite_only !== true ) { - update_option( $this->option_name, $option_value ); - } - else { - $this->update_site_option( $this->option_name, $option_value ); - } - } - - /** - * Returns the variable array key patterns for an options class. - * - * @return array - */ - public function get_patterns() { - return (array) $this->variable_array_key_patterns; - } - - /** - * Retrieves the option name. - * - * @return string The set option name. - */ - public function get_option_name() { - return $this->option_name; - } - - /* - * Concrete classes *may* contain a clean_option method which will clean out old/renamed - * values within the option. - * - * ``` - * abstract public function clean_option( $option_value, $current_version = null, $all_old_option_values = null ); - * ``` - */ - - /* *********** HELPER METHODS for internal use. *********** */ - - /** - * Helper method - Combines a fixed array of default values with an options array - * while filtering out any keys which are not in the defaults array. - * - * @todo [JRF] - shouldn't this be a straight array merge ? at the end of the day, the validation - * removes any invalid keys on save. - * - * @param array|null $options Optional. Current options. If not set, the option defaults - * for the $option_key will be returned. - * - * @return array Combined and filtered options array. - */ - protected function array_filter_merge( $options = null ) { - - $defaults = $this->get_defaults(); - - if ( ! isset( $options ) || $options === false || $options === [] ) { - return $defaults; - } - - $options = (array) $options; - - /* - $filtered = array(); - - if ( $defaults !== array() ) { - foreach ( $defaults as $key => $default_value ) { - // @todo should this walk through array subkeys ? - $filtered[ $key ] = ( isset( $options[ $key ] ) ? $options[ $key ] : $default_value ); - } - } - */ - $filtered = array_merge( $defaults, $options ); - - return $filtered; - } - - /** - * Sets updated values for variables that are disabled via the override option back to their previous values. - * - * @param array $updated Updated option value. - * @param array $old Old option value. - * - * @return array Updated option value, with all disabled variables set to their old values. - */ - protected function prevent_disabled_options_update( $updated, $old ) { - $override_option = $this->get_override_option(); - if ( empty( $override_option ) ) { - return $updated; - } - - /* - * This loop could as well call `is_disabled( $key )` for each iteration, - * however this would be worse performance-wise. - */ - foreach ( $old as $key => $value ) { - if ( isset( $override_option[ self::ALLOW_KEY_PREFIX . $key ] ) && ! $override_option[ self::ALLOW_KEY_PREFIX . $key ] ) { - $updated[ $key ] = $old[ $key ]; - } - } - - return $updated; - } - - /** - * Retrieves the value of the override option, if available. - * - * An override option contains values that may determine access to certain sub-variables - * of this option. - * - * Only regular options in multisite can have override options, which in that case - * would be network options. - * - * @return array Override option value, or empty array if unavailable. - */ - protected function get_override_option() { - if ( empty( $this->override_option_name ) || $this->multisite_only === true || ! is_multisite() ) { - return []; - } - - return get_site_option( $this->override_option_name, [] ); - } - - /** - * Make sure that any set option values relating to post_types and/or taxonomies are retained, - * even when that post_type or taxonomy may not yet have been registered. - * - * {@internal The wpseo_titles concrete class overrules this method. Make sure that any - * changes applied here, also get ported to that version.}} - * - * @param array $dirty Original option as retrieved from the database. - * @param array $clean Filtered option where any options which shouldn't be in our option - * have already been removed and any options which weren't set - * have been set to their defaults. - * - * @return array - */ - protected function retain_variable_keys( $dirty, $clean ) { - if ( ( is_array( $this->variable_array_key_patterns ) && $this->variable_array_key_patterns !== [] ) && ( is_array( $dirty ) && $dirty !== [] ) ) { - foreach ( $dirty as $key => $value ) { - - // Do nothing if already in filtered options. - if ( isset( $clean[ $key ] ) ) { - continue; - } - - foreach ( $this->variable_array_key_patterns as $pattern ) { - - if ( strpos( $key, $pattern ) === 0 ) { - $clean[ $key ] = $value; - break; - } - } - } - } - - return $clean; - } - - /** - * Check whether a given array key conforms to one of the variable array key patterns for this option. - * - * @used-by validate_option() methods for options with variable array keys. - * - * @param string $key Array key to check. - * - * @return string Pattern if it conforms, original array key if it doesn't or if the option - * does not have variable array keys. - */ - protected function get_switch_key( $key ) { - if ( ! isset( $this->variable_array_key_patterns ) || ( ! is_array( $this->variable_array_key_patterns ) || $this->variable_array_key_patterns === [] ) ) { - return $key; - } - - foreach ( $this->variable_array_key_patterns as $pattern ) { - if ( strpos( $key, $pattern ) === 0 ) { - return $pattern; - } - } - - return $key; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-options.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-options.php deleted file mode 100644 index eaae3340..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-options.php +++ /dev/null @@ -1,596 +0,0 @@ - (string) name of concrete class for the option. - */ - public static $options = [ - 'wpseo' => 'WPSEO_Option_Wpseo', - 'wpseo_titles' => 'WPSEO_Option_Titles', - 'wpseo_social' => 'WPSEO_Option_Social', - 'wpseo_ms' => 'WPSEO_Option_MS', - 'wpseo_taxonomy_meta' => 'WPSEO_Taxonomy_Meta', - ]; - - /** - * Array of instantiated option objects. - * - * @var array - */ - protected static $option_instances = []; - - /** - * Array with the option names. - * - * @var array - */ - protected static $option_names = []; - - /** - * Instance of this class. - * - * @var WPSEO_Options - */ - protected static $instance; - - /** - * Instantiate all the WPSEO option management classes. - */ - protected function __construct() { - $this->register_hooks(); - - foreach ( static::$options as $option_class ) { - static::register_option( call_user_func( [ $option_class, 'get_instance' ] ) ); - } - } - - /** - * Register our hooks. - * - * @return void - */ - public function register_hooks() { - add_action( 'registered_taxonomy', [ $this, 'clear_cache' ] ); - add_action( 'unregistered_taxonomy', [ $this, 'clear_cache' ] ); - add_action( 'registered_post_type', [ $this, 'clear_cache' ] ); - add_action( 'unregistered_post_type', [ $this, 'clear_cache' ] ); - } - - /** - * Get the singleton instance of this class. - * - * @return object - */ - public static function get_instance() { - if ( ! ( static::$instance instanceof self ) ) { - static::$instance = new self(); - } - - return static::$instance; - } - - /** - * Registers an option to the options list. - * - * @param WPSEO_Option $option_instance Instance of the option. - * - * @return void - */ - public static function register_option( WPSEO_Option $option_instance ) { - $option_name = $option_instance->get_option_name(); - - if ( $option_instance->multisite_only && ! static::is_multisite() ) { - unset( static::$options[ $option_name ], static::$option_names[ $option_name ] ); - - return; - } - - $is_already_registered = array_key_exists( $option_name, static::$options ); - if ( ! $is_already_registered ) { - static::$options[ $option_name ] = get_class( $option_instance ); - } - - if ( $option_instance->include_in_all === true ) { - static::$option_names[ $option_name ] = $option_name; - } - - static::$option_instances[ $option_name ] = $option_instance; - - if ( ! $is_already_registered ) { - static::clear_cache(); - } - } - - /** - * Get the group name of an option for use in the settings form. - * - * @param string $option_name The option for which you want to retrieve the option group name. - * - * @return string|bool - */ - public static function get_group_name( $option_name ) { - if ( isset( static::$option_instances[ $option_name ] ) ) { - return static::$option_instances[ $option_name ]->group_name; - } - - return false; - } - - /** - * Get a specific default value for an option. - * - * @param string $option_name The option for which you want to retrieve a default. - * @param string $key The key within the option who's default you want. - * - * @return mixed - */ - public static function get_default( $option_name, $key ) { - if ( isset( static::$option_instances[ $option_name ] ) ) { - $defaults = static::$option_instances[ $option_name ]->get_defaults(); - if ( isset( $defaults[ $key ] ) ) { - return $defaults[ $key ]; - } - } - - return null; - } - - /** - * Update a site_option. - * - * @param string $option_name The option name of the option to save. - * @param mixed $value The new value for the option. - * - * @return bool - */ - public static function update_site_option( $option_name, $value ) { - if ( is_multisite() && isset( static::$option_instances[ $option_name ] ) ) { - return static::$option_instances[ $option_name ]->update_site_option( $value ); - } - - return false; - } - - /** - * Get the instantiated option instance. - * - * @param string $option_name The option for which you want to retrieve the instance. - * - * @return object|bool - */ - public static function get_option_instance( $option_name ) { - if ( isset( static::$option_instances[ $option_name ] ) ) { - return static::$option_instances[ $option_name ]; - } - - return false; - } - - /** - * Retrieve an array of the options which should be included in get_all() and reset(). - * - * @return array Array of option names. - */ - public static function get_option_names() { - $option_names = array_values( static::$option_names ); - if ( $option_names === [] ) { - foreach ( static::$option_instances as $option_name => $option_object ) { - if ( $option_object->include_in_all === true ) { - $option_names[] = $option_name; - } - } - } - - /** - * Filter: wpseo_options - Allow developers to change the option name to include. - * - * @param array $option_names The option names to include in get_all and reset(). - */ - return apply_filters( 'wpseo_options', $option_names ); - } - - /** - * Retrieve all the options for the SEO plugin in one go. - * - * @return array Array combining the values of all the options. - */ - public static function get_all() { - static::$option_values = static::get_options( static::get_option_names() ); - - return static::$option_values; - } - - /** - * Retrieve one or more options for the SEO plugin. - * - * @param array $option_names An array of option names of the options you want to get. - * - * @return array Array combining the values of the requested options. - */ - public static function get_options( array $option_names ) { - $options = []; - $option_names = array_filter( $option_names, 'is_string' ); - foreach ( $option_names as $option_name ) { - if ( isset( static::$option_instances[ $option_name ] ) ) { - $option = static::get_option( $option_name ); - - if ( $option !== null ) { - $options = array_merge( $options, $option ); - } - } - } - - return $options; - } - - /** - * Retrieve a single option for the SEO plugin. - * - * @param string $option_name The name of the option you want to get. - * - * @return array Array containing the requested option. - */ - public static function get_option( $option_name ) { - $option = null; - if ( is_string( $option_name ) && ! empty( $option_name ) ) { - if ( isset( static::$option_instances[ $option_name ] ) ) { - if ( static::$option_instances[ $option_name ]->multisite_only !== true ) { - $option = get_option( $option_name ); - } - else { - $option = get_site_option( $option_name ); - } - } - } - - return $option; - } - - /** - * Retrieve a single field from any option for the SEO plugin. Keys are always unique. - * - * @param string $key The key it should return. - * @param mixed $default_value The default value that should be returned if the key isn't set. - * - * @return mixed Returns value if found, $default_value if not. - */ - public static function get( $key, $default_value = null ) { - if ( static::$option_values === null ) { - static::prime_cache(); - } - if ( isset( static::$option_values[ $key ] ) ) { - return static::$option_values[ $key ]; - } - - return $default_value; - } - - /** - * Resets the cache to null. - * - * @return void - */ - public static function clear_cache() { - static::$option_values = null; - } - - /** - * Primes our cache. - * - * @return void - */ - private static function prime_cache() { - static::$option_values = static::get_all(); - static::$option_values = static::add_ms_option( static::$option_values ); - } - - /** - * Retrieve a single field from an option for the SEO plugin. - * - * @param string $key The key to set. - * @param mixed $value The value to set. - * - * @return mixed|null Returns value if found, $default if not. - */ - public static function set( $key, $value ) { - $lookup_table = static::get_lookup_table(); - - if ( isset( $lookup_table[ $key ] ) ) { - return static::save_option( $lookup_table[ $key ], $key, $value ); - } - - $patterns = static::get_pattern_table(); - foreach ( $patterns as $pattern => $option ) { - if ( strpos( $key, $pattern ) === 0 ) { - return static::save_option( $option, $key, $value ); - } - } - - static::$option_values[ $key ] = $value; - } - - /** - * Get an option only if it's been auto-loaded. - * - * @param string $option The option to retrieve. - * @param mixed $default_value A default value to return. - * - * @return mixed - */ - public static function get_autoloaded_option( $option, $default_value = false ) { - $value = wp_cache_get( $option, 'options' ); - if ( $value === false ) { - $passed_default = func_num_args() > 1; - - // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Using WP native filter. - return apply_filters( "default_option_{$option}", $default_value, $option, $passed_default ); - } - - // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Using WP native filter. - return apply_filters( "option_{$option}", maybe_unserialize( $value ), $option ); - } - - /** - * Run the clean up routine for one or all options. - * - * @param array|string|null $option_name Optional. the option you want to clean or an array of - * option names for the options you want to clean. - * If not set, all options will be cleaned. - * @param string|null $current_version Optional. Version from which to upgrade, if not set, - * version specific upgrades will be disregarded. - * - * @return void - */ - public static function clean_up( $option_name = null, $current_version = null ) { - if ( isset( $option_name ) && is_string( $option_name ) && $option_name !== '' ) { - if ( isset( static::$option_instances[ $option_name ] ) ) { - static::$option_instances[ $option_name ]->clean( $current_version ); - } - } - elseif ( isset( $option_name ) && is_array( $option_name ) && $option_name !== [] ) { - foreach ( $option_name as $option ) { - if ( isset( static::$option_instances[ $option ] ) ) { - static::$option_instances[ $option ]->clean( $current_version ); - } - } - unset( $option ); - } - else { - foreach ( static::$option_instances as $instance ) { - $instance->clean( $current_version ); - } - unset( $instance ); - - // If we've done a full clean-up, we can safely remove this really old option. - delete_option( 'wpseo_indexation' ); - } - } - - /** - * Check that all options exist in the database and add any which don't. - * - * @return void - */ - public static function ensure_options_exist() { - foreach ( static::$option_instances as $instance ) { - $instance->maybe_add_option(); - } - } - - /** - * Initialize some options on first install/activate/reset. - * - * @return void - */ - public static function initialize() { - /* Force WooThemes to use Yoast SEO data. */ - if ( function_exists( 'woo_version_init' ) ) { - update_option( 'seo_woo_use_third_party_data', 'true' ); - } - } - - /** - * Reset all options to their default values and rerun some tests. - * - * @return void - */ - public static function reset() { - if ( ! is_multisite() ) { - $option_names = static::get_option_names(); - if ( is_array( $option_names ) && $option_names !== [] ) { - foreach ( $option_names as $option_name ) { - delete_option( $option_name ); - update_option( $option_name, get_option( $option_name ) ); - } - } - unset( $option_names ); - } - else { - // Reset MS blog based on network default blog setting. - static::reset_ms_blog( get_current_blog_id() ); - } - - static::initialize(); - } - - /** - * Initialize default values for a new multisite blog. - * - * @param bool $force_init Whether to always do the initialization routine (title/desc test). - * - * @return void - */ - public static function maybe_set_multisite_defaults( $force_init = false ) { - $option = get_option( 'wpseo' ); - - if ( is_multisite() ) { - if ( $option['ms_defaults_set'] === false ) { - static::reset_ms_blog( get_current_blog_id() ); - static::initialize(); - } - elseif ( $force_init === true ) { - static::initialize(); - } - } - } - - /** - * Reset all options for a specific multisite blog to their default values based upon a - * specified default blog if one was chosen on the network page or the plugin defaults if it was not. - * - * @param int|string $blog_id Blog id of the blog for which to reset the options. - * - * @return void - */ - public static function reset_ms_blog( $blog_id ) { - if ( is_multisite() ) { - $options = get_site_option( 'wpseo_ms' ); - $option_names = static::get_option_names(); - - if ( is_array( $option_names ) && $option_names !== [] ) { - $base_blog_id = $blog_id; - if ( $options['defaultblog'] !== '' && $options['defaultblog'] !== 0 ) { - $base_blog_id = $options['defaultblog']; - } - - foreach ( $option_names as $option_name ) { - delete_blog_option( $blog_id, $option_name ); - - $new_option = get_blog_option( $base_blog_id, $option_name ); - - /* Remove sensitive, theme dependent and site dependent info. */ - if ( isset( static::$option_instances[ $option_name ] ) && static::$option_instances[ $option_name ]->ms_exclude !== [] ) { - foreach ( static::$option_instances[ $option_name ]->ms_exclude as $key ) { - unset( $new_option[ $key ] ); - } - } - - if ( $option_name === 'wpseo' ) { - $new_option['ms_defaults_set'] = true; - } - - update_blog_option( $blog_id, $option_name, $new_option ); - } - } - } - } - - /** - * Saves the option to the database. - * - * @param string $wpseo_options_group_name The name for the wpseo option group in the database. - * @param string $option_name The name for the option to set. - * @param mixed $option_value The value for the option. - * - * @return bool Returns true if the option is successfully saved in the database. - */ - public static function save_option( $wpseo_options_group_name, $option_name, $option_value ) { - $options = static::get_option( $wpseo_options_group_name ); - $options[ $option_name ] = $option_value; - - if ( isset( static::$option_instances[ $wpseo_options_group_name ] ) && static::$option_instances[ $wpseo_options_group_name ]->multisite_only === true ) { - static::update_site_option( $wpseo_options_group_name, $options ); - } - else { - update_option( $wpseo_options_group_name, $options ); - } - - // Check if everything got saved properly. - $saved_option = static::get_option( $wpseo_options_group_name ); - - // Clear our cache. - static::clear_cache(); - - return $saved_option[ $option_name ] === $options[ $option_name ]; - } - - /** - * Adds the multisite options to the option stack if relevant. - * - * @param array $option The currently present options settings. - * - * @return array Options possibly including multisite. - */ - protected static function add_ms_option( $option ) { - if ( ! is_multisite() ) { - return $option; - } - - $ms_option = static::get_option( 'wpseo_ms' ); - if ( $ms_option === null ) { - return $option; - } - - return array_merge( $option, $ms_option ); - } - - /** - * Checks if installation is multisite. - * - * @return bool True when is multisite. - */ - protected static function is_multisite() { - static $is_multisite; - - if ( $is_multisite === null ) { - $is_multisite = is_multisite(); - } - - return $is_multisite; - } - - /** - * Retrieves a lookup table to find in which option_group a key is stored. - * - * @return array The lookup table. - */ - private static function get_lookup_table() { - $lookup_table = []; - - foreach ( array_keys( static::$options ) as $option_name ) { - $full_option = static::get_option( $option_name ); - foreach ( $full_option as $key => $value ) { - $lookup_table[ $key ] = $option_name; - } - } - - return $lookup_table; - } - - /** - * Retrieves a lookup table to find in which option_group a key is stored. - * - * @return array The lookup table. - */ - private static function get_pattern_table() { - $pattern_table = []; - foreach ( static::$options as $option_name => $option_class ) { - $instance = call_user_func( [ $option_class, 'get_instance' ] ); - foreach ( $instance->get_patterns() as $key ) { - $pattern_table[ $key ] = $option_name; - } - } - - return $pattern_table; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-taxonomy-meta.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-taxonomy-meta.php deleted file mode 100644 index b2c591bf..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-taxonomy-meta.php +++ /dev/null @@ -1,566 +0,0 @@ -get_defaults(); - * - * {@internal Important: in contrast to most defaults, the below array format is - * very bare. The real option is in the format [taxonomy_name][term_id][...] - * where [...] is any of the $defaults_per_term options shown below. - * This is of course taken into account in the below methods.}} - * - * @var array - */ - protected $defaults = []; - - /** - * Option name - same as $option_name property, but now also available to static methods. - * - * @var string - */ - public static $name; - - /** - * Array of defaults for individual taxonomy meta entries. - * - * @var array - */ - public static $defaults_per_term = [ - 'wpseo_title' => '', - 'wpseo_desc' => '', - 'wpseo_canonical' => '', - 'wpseo_bctitle' => '', - 'wpseo_noindex' => 'default', - 'wpseo_focuskw' => '', - 'wpseo_linkdex' => '', - 'wpseo_content_score' => '', - 'wpseo_inclusive_language_score' => '', - 'wpseo_focuskeywords' => '[]', - 'wpseo_keywordsynonyms' => '[]', - 'wpseo_is_cornerstone' => '0', - - // Social fields. - 'wpseo_opengraph-title' => '', - 'wpseo_opengraph-description' => '', - 'wpseo_opengraph-image' => '', - 'wpseo_opengraph-image-id' => '', - 'wpseo_twitter-title' => '', - 'wpseo_twitter-description' => '', - 'wpseo_twitter-image' => '', - 'wpseo_twitter-image-id' => '', - ]; - - /** - * Available index options. - * - * Used for form generation and input validation. - * - * {@internal Labels (translation) added on admin_init via WPSEO_Taxonomy::translate_meta_options().}} - * - * @var array - */ - public static $no_index_options = [ - 'default' => '', - 'index' => '', - 'noindex' => '', - ]; - - /** - * Add the actions and filters for the option. - * - * @todo [JRF => testers] Check if the extra actions below would run into problems if an option - * is updated early on and if so, change the call to schedule these for a later action on add/update - * instead of running them straight away. - */ - protected function __construct() { - parent::__construct(); - - self::$name = $this->option_name; - } - - /** - * Get the singleton instance of this class. - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - self::$name = self::$instance->option_name; - } - - return self::$instance; - } - - /** - * Add extra default options received from a filter. - * - * @return void - */ - public function enrich_defaults() { - $extra_defaults_per_term = apply_filters( 'wpseo_add_extra_taxmeta_term_defaults', [] ); - if ( is_array( $extra_defaults_per_term ) ) { - self::$defaults_per_term = array_merge( $extra_defaults_per_term, self::$defaults_per_term ); - } - } - - /** - * Validate the option. - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array Validated clean value for the option to be saved to the database. - */ - protected function validate_option( $dirty, $clean, $old ) { - /* - * Prevent complete validation (which can be expensive when there are lots of terms) - * if only one item has changed and has already been validated. - */ - if ( isset( $dirty['wpseo_already_validated'] ) && $dirty['wpseo_already_validated'] === true ) { - unset( $dirty['wpseo_already_validated'] ); - - return $dirty; - } - - foreach ( $dirty as $taxonomy => $terms ) { - /* Don't validate taxonomy - may not be registered yet and we don't want to remove valid ones. */ - if ( is_array( $terms ) && $terms !== [] ) { - foreach ( $terms as $term_id => $meta_data ) { - /* Only validate term if the taxonomy exists. */ - if ( taxonomy_exists( $taxonomy ) && get_term_by( 'id', $term_id, $taxonomy ) === false ) { - /* Is this term id a special case ? */ - if ( has_filter( 'wpseo_tax_meta_special_term_id_validation_' . $term_id ) !== false ) { - $clean[ $taxonomy ][ $term_id ] = apply_filters( 'wpseo_tax_meta_special_term_id_validation_' . $term_id, $meta_data, $taxonomy, $term_id ); - } - continue; - } - - if ( is_array( $meta_data ) && $meta_data !== [] ) { - /* Validate meta data. */ - $old_meta = self::get_term_meta( $term_id, $taxonomy ); - $meta_data = self::validate_term_meta_data( $meta_data, $old_meta ); - if ( $meta_data !== [] ) { - $clean[ $taxonomy ][ $term_id ] = $meta_data; - } - } - - // Deal with special cases (for when taxonomy doesn't exist yet). - if ( ! isset( $clean[ $taxonomy ][ $term_id ] ) && has_filter( 'wpseo_tax_meta_special_term_id_validation_' . $term_id ) !== false ) { - $clean[ $taxonomy ][ $term_id ] = apply_filters( 'wpseo_tax_meta_special_term_id_validation_' . $term_id, $meta_data, $taxonomy, $term_id ); - } - } - } - } - - return $clean; - } - - /** - * Validate the meta data for one individual term and removes default values (no need to save those). - * - * @param array $meta_data New values. - * @param array $old_meta The original values. - * - * @return array Validated and filtered value. - */ - public static function validate_term_meta_data( $meta_data, $old_meta ) { - - $clean = self::$defaults_per_term; - $meta_data = array_map( [ 'WPSEO_Utils', 'trim_recursive' ], $meta_data ); - - if ( ! is_array( $meta_data ) || $meta_data === [] ) { - return $clean; - } - - foreach ( $clean as $key => $value ) { - switch ( $key ) { - - case 'wpseo_noindex': - if ( isset( $meta_data[ $key ] ) ) { - if ( isset( self::$no_index_options[ $meta_data[ $key ] ] ) ) { - $clean[ $key ] = $meta_data[ $key ]; - } - } - elseif ( isset( $old_meta[ $key ] ) ) { - // Retain old value if field currently not in use. - $clean[ $key ] = $old_meta[ $key ]; - } - break; - - case 'wpseo_canonical': - if ( isset( $meta_data[ $key ] ) && $meta_data[ $key ] !== '' ) { - $url = WPSEO_Utils::sanitize_url( $meta_data[ $key ] ); - if ( $url !== '' ) { - $clean[ $key ] = $url; - } - unset( $url ); - } - break; - - case 'wpseo_bctitle': - if ( isset( $meta_data[ $key ] ) ) { - $clean[ $key ] = WPSEO_Utils::sanitize_text_field( $meta_data[ $key ] ); - } - elseif ( isset( $old_meta[ $key ] ) ) { - // Retain old value if field currently not in use. - $clean[ $key ] = $old_meta[ $key ]; - } - break; - - case 'wpseo_keywordsynonyms': - if ( isset( $meta_data[ $key ] ) && is_string( $meta_data[ $key ] ) ) { - // The data is stringified JSON. Use `json_decode` and `json_encode` around the sanitation. - $input = json_decode( $meta_data[ $key ], true ); - $sanitized = array_map( [ 'WPSEO_Utils', 'sanitize_text_field' ], $input ); - $clean[ $key ] = WPSEO_Utils::format_json_encode( $sanitized ); - } - elseif ( isset( $old_meta[ $key ] ) ) { - // Retain old value if field currently not in use. - $clean[ $key ] = $old_meta[ $key ]; - } - break; - - case 'wpseo_focuskeywords': - if ( isset( $meta_data[ $key ] ) && is_string( $meta_data[ $key ] ) ) { - // The data is stringified JSON. Use `json_decode` and `json_encode` around the sanitation. - $input = json_decode( $meta_data[ $key ], true ); - - // This data has two known keys: `keyword` and `score`. - $sanitized = []; - foreach ( $input as $entry ) { - $sanitized[] = [ - 'keyword' => WPSEO_Utils::sanitize_text_field( $entry['keyword'] ), - 'score' => WPSEO_Utils::sanitize_text_field( $entry['score'] ), - ]; - } - - $clean[ $key ] = WPSEO_Utils::format_json_encode( $sanitized ); - } - elseif ( isset( $old_meta[ $key ] ) ) { - // Retain old value if field currently not in use. - $clean[ $key ] = $old_meta[ $key ]; - } - break; - - case 'wpseo_focuskw': - case 'wpseo_title': - case 'wpseo_desc': - case 'wpseo_linkdex': - default: - if ( isset( $meta_data[ $key ] ) && is_string( $meta_data[ $key ] ) ) { - $clean[ $key ] = WPSEO_Utils::sanitize_text_field( $meta_data[ $key ] ); - } - - if ( $key === 'wpseo_focuskw' ) { - $search = [ - '<', - '>', - '`', - '<', - '>', - '`', - ]; - - $clean[ $key ] = str_replace( $search, '', $clean[ $key ] ); - } - break; - } - - $clean[ $key ] = apply_filters( 'wpseo_sanitize_tax_meta_' . $key, $clean[ $key ], ( $meta_data[ $key ] ?? null ), ( $old_meta[ $key ] ?? null ) ); - } - - // Only save the non-default values. - return array_diff_assoc( $clean, self::$defaults_per_term ); - } - - /** - * Clean a given option value. - * - Convert old option values to new - * - Fixes strings which were escaped (should have been sanitized - escaping is for output) - * - * @param array $option_value Old (not merged with defaults or filtered) option value to - * clean according to the rules for this option. - * @param string|null $current_version Optional. Version from which to upgrade, if not set, - * version specific upgrades will be disregarded. - * @param array|null $all_old_option_values Optional. Only used when importing old options to have - * access to the real old values, in contrast to the saved ones. - * - * @return array Cleaned option. - */ - protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { - - /* Clean up old values and remove empty arrays. */ - if ( is_array( $option_value ) && $option_value !== [] ) { - - foreach ( $option_value as $taxonomy => $terms ) { - - if ( is_array( $terms ) && $terms !== [] ) { - - foreach ( $terms as $term_id => $meta_data ) { - if ( ! is_array( $meta_data ) || $meta_data === [] ) { - // Remove empty term arrays. - unset( $option_value[ $taxonomy ][ $term_id ] ); - } - else { - foreach ( $meta_data as $key => $value ) { - - switch ( $key ) { - case 'noindex': - if ( $value === 'on' ) { - // Convert 'on' to 'noindex'. - $option_value[ $taxonomy ][ $term_id ][ $key ] = 'noindex'; - } - break; - - case 'canonical': - case 'wpseo_bctitle': - case 'wpseo_title': - case 'wpseo_desc': - case 'wpseo_linkdex': - // @todo [JRF => whomever] Needs checking, I don't have example data [JRF]. - if ( $value !== '' ) { - // Fix incorrectly saved (encoded) canonical urls and texts. - $option_value[ $taxonomy ][ $term_id ][ $key ] = wp_specialchars_decode( stripslashes( $value ), ENT_QUOTES ); - } - break; - - default: - // @todo [JRF => whomever] Needs checking, I don't have example data [JRF]. - if ( $value !== '' ) { - // Fix incorrectly saved (escaped) text strings. - $option_value[ $taxonomy ][ $term_id ][ $key ] = wp_specialchars_decode( $value, ENT_QUOTES ); - } - break; - } - } - } - } - } - else { - // Remove empty taxonomy arrays. - unset( $option_value[ $taxonomy ] ); - } - } - } - - return $option_value; - } - - /** - * Retrieve a taxonomy term's meta value(s). - * - * @param mixed $term Term to get the meta value for - * either (string) term name, (int) term id or (object) term. - * @param string $taxonomy Name of the taxonomy to which the term is attached. - * @param string|null $meta Optional. Meta value to get (without prefix). - * - * @return mixed Value for the $meta if one is given, might be the default. - * If no meta is given, an array of all the meta data for the term. - * False if the term does not exist or the $meta provided is invalid. - */ - public static function get_term_meta( $term, $taxonomy, $meta = null ) { - /* Figure out the term id. */ - if ( is_int( $term ) ) { - $term = get_term_by( 'id', $term, $taxonomy ); - } - elseif ( is_string( $term ) ) { - $term = get_term_by( 'slug', $term, $taxonomy ); - } - - if ( is_object( $term ) && isset( $term->term_id ) ) { - $term_id = $term->term_id; - } - else { - return false; - } - - $tax_meta = self::get_term_tax_meta( $term_id, $taxonomy ); - - /* - * Either return the complete array or a single value from it or false if the value does not exist - * (shouldn't happen after merge with defaults, indicates typo in request). - */ - if ( ! isset( $meta ) ) { - return $tax_meta; - } - - if ( isset( $tax_meta[ 'wpseo_' . $meta ] ) ) { - return $tax_meta[ 'wpseo_' . $meta ]; - } - - return false; - } - - /** - * Get the current queried object and return the meta value. - * - * @param string $meta The meta field that is needed. - * - * @return mixed - */ - public static function get_meta_without_term( $meta ) { - $term = $GLOBALS['wp_query']->get_queried_object(); - if ( ! $term || empty( $term->taxonomy ) ) { - return false; - } - - return self::get_term_meta( $term, $term->taxonomy, $meta ); - } - - /** - * Saving the values for the given term_id. - * - * @param int $term_id ID of the term to save data for. - * @param string $taxonomy The taxonomy the term belongs to. - * @param array $meta_values The values that will be saved. - * - * @return void - */ - public static function set_values( $term_id, $taxonomy, array $meta_values ) { - /* Validate the post values */ - $old = self::get_term_meta( $term_id, $taxonomy ); - $clean = self::validate_term_meta_data( $meta_values, $old ); - - self::save_clean_values( $term_id, $taxonomy, $clean ); - } - - /** - * Setting a single value to the term meta. - * - * @param int $term_id ID of the term to save data for. - * @param string $taxonomy The taxonomy the term belongs to. - * @param string $meta_key The target meta key to store the value in. - * @param string $meta_value The value of the target meta key. - * - * @return void - */ - public static function set_value( $term_id, $taxonomy, $meta_key, $meta_value ) { - - if ( substr( strtolower( $meta_key ), 0, 6 ) !== 'wpseo_' ) { - $meta_key = 'wpseo_' . $meta_key; - } - - self::set_values( $term_id, $taxonomy, [ $meta_key => $meta_value ] ); - } - - /** - * Find the keyword usages in the metas for the taxonomies/terms. - * - * @param string $keyword The keyword to look for. - * @param string $current_term_id The current term id. - * @param string $current_taxonomy The current taxonomy name. - * - * @return array - */ - public static function get_keyword_usage( $keyword, $current_term_id, $current_taxonomy ) { - $tax_meta = self::get_tax_meta(); - - $found = []; - // @todo Check for terms of all taxonomies, not only the current taxonomy. - foreach ( $tax_meta as $taxonomy_name => $terms ) { - foreach ( $terms as $term_id => $meta_values ) { - $is_current = ( $current_taxonomy === $taxonomy_name && (string) $current_term_id === (string) $term_id ); - if ( ! $is_current && ! empty( $meta_values['wpseo_focuskw'] ) && $meta_values['wpseo_focuskw'] === $keyword ) { - $found[] = $term_id; - } - } - } - - return [ $keyword => $found ]; - } - - /** - * Saving the values for the given term_id. - * - * @param int $term_id ID of the term to save data for. - * @param string $taxonomy The taxonomy the term belongs to. - * @param array $clean Array with clean values. - * - * @return void - */ - private static function save_clean_values( $term_id, $taxonomy, array $clean ) { - $tax_meta = self::get_tax_meta(); - - /* Add/remove the result to/from the original option value. */ - if ( $clean !== [] ) { - $tax_meta[ $taxonomy ][ $term_id ] = $clean; - } - else { - unset( $tax_meta[ $taxonomy ][ $term_id ] ); - if ( isset( $tax_meta[ $taxonomy ] ) && $tax_meta[ $taxonomy ] === [] ) { - unset( $tax_meta[ $taxonomy ] ); - } - } - - // Prevent complete array validation. - $tax_meta['wpseo_already_validated'] = true; - - self::save_tax_meta( $tax_meta ); - } - - /** - * Getting the meta from the options. - * - * @return void|array - */ - private static function get_tax_meta() { - return get_option( self::$name ); - } - - /** - * Saving the tax meta values to the database. - * - * @param array $tax_meta Array with the meta values for taxonomy. - * - * @return void - */ - private static function save_tax_meta( $tax_meta ) { - update_option( self::$name, $tax_meta ); - } - - /** - * Getting the taxonomy meta for the given term_id and taxonomy. - * - * @param int $term_id The id of the term. - * @param string $taxonomy Name of the taxonomy to which the term is attached. - * - * @return array - */ - private static function get_term_tax_meta( $term_id, $taxonomy ) { - $tax_meta = self::get_tax_meta(); - - /* If we have data for the term, merge with defaults for complete array, otherwise set defaults. */ - if ( isset( $tax_meta[ $taxonomy ][ $term_id ] ) ) { - return array_merge( self::$defaults_per_term, $tax_meta[ $taxonomy ][ $term_id ] ); - } - - return self::$defaults_per_term; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-author-sitemap-provider.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-author-sitemap-provider.php deleted file mode 100644 index 343f97bc..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-author-sitemap-provider.php +++ /dev/null @@ -1,244 +0,0 @@ -handles_type( 'author' ) ) { - return []; - } - - // @todo Consider doing this less often / when necessary. R. - $this->update_user_meta(); - - $has_exclude_filter = has_filter( 'wpseo_sitemap_exclude_author' ); - - $query_arguments = []; - - if ( ! $has_exclude_filter ) { // We only need full users if legacy filter(s) hooked to exclusion logic. R. - $query_arguments['fields'] = 'ID'; - } - - $users = $this->get_users( $query_arguments ); - - if ( $has_exclude_filter ) { - $users = $this->exclude_users( $users ); - $users = wp_list_pluck( $users, 'ID' ); - } - - if ( empty( $users ) ) { - return []; - } - - $index = []; - $user_pages = array_chunk( $users, $max_entries ); - - foreach ( $user_pages as $page_counter => $users_page ) { - - $current_page = ( $page_counter === 0 ) ? '' : ( $page_counter + 1 ); - - $user_id = array_shift( $users_page ); // Time descending, first user on page is most recently updated. - $user = get_user_by( 'id', $user_id ); - $index[] = [ - 'loc' => WPSEO_Sitemaps_Router::get_base_url( 'author-sitemap' . $current_page . '.xml' ), - 'lastmod' => ( $user->_yoast_wpseo_profile_updated ) ? YoastSEO()->helpers->date->format_timestamp( $user->_yoast_wpseo_profile_updated ) : null, - ]; - } - - return $index; - } - - /** - * Retrieve users, taking account of all necessary exclusions. - * - * @param array $arguments Arguments to add. - * - * @return array - */ - protected function get_users( $arguments = [] ) { - - global $wpdb; - - $defaults = [ - 'capability' => [ 'edit_posts' ], - 'meta_key' => '_yoast_wpseo_profile_updated', - 'orderby' => 'meta_value_num', - 'order' => 'DESC', - 'meta_query' => [ - 'relation' => 'AND', - [ - 'key' => $wpdb->get_blog_prefix() . 'user_level', - 'value' => '0', - 'compare' => '!=', - ], - [ - 'relation' => 'OR', - [ - 'key' => 'wpseo_noindex_author', - 'value' => 'on', - 'compare' => '!=', - ], - [ - 'key' => 'wpseo_noindex_author', - 'compare' => 'NOT EXISTS', - ], - ], - ], - ]; - - if ( WPSEO_Options::get( 'noindex-author-noposts-wpseo', true ) ) { - unset( $defaults['capability'] ); // Otherwise it cancels out next argument. - $defaults['has_published_posts'] = YoastSEO()->helpers->author_archive->get_author_archive_post_types(); - } - - return get_users( array_merge( $defaults, $arguments ) ); - } - - /** - * Get set of sitemap link data. - * - * @param string $type Sitemap type. - * @param int $max_entries Entries per sitemap. - * @param int $current_page Current page of the sitemap. - * - * @return array - * - * @throws OutOfBoundsException When an invalid page is requested. - */ - public function get_sitemap_links( $type, $max_entries, $current_page ) { - - $links = []; - - if ( ! $this->handles_type( 'author' ) ) { - return $links; - } - - $user_criteria = [ - 'offset' => ( ( $current_page - 1 ) * $max_entries ), - 'number' => $max_entries, - ]; - - $users = $this->get_users( $user_criteria ); - - // Throw an exception when there are no users in the sitemap. - if ( count( $users ) === 0 ) { - throw new OutOfBoundsException( 'Invalid sitemap page requested' ); - } - - $users = $this->exclude_users( $users ); - if ( empty( $users ) ) { - $users = []; - } - - $time = time(); - - foreach ( $users as $user ) { - - $author_link = get_author_posts_url( $user->ID ); - - if ( empty( $author_link ) ) { - continue; - } - - $mod = $time; - - if ( isset( $user->_yoast_wpseo_profile_updated ) ) { - $mod = $user->_yoast_wpseo_profile_updated; - } - - $url = [ - 'loc' => $author_link, - 'mod' => date( DATE_W3C, $mod ), - - // Deprecated, kept for backwards data compat. R. - 'chf' => 'daily', - 'pri' => 1, - ]; - - /** This filter is documented at inc/sitemaps/class-post-type-sitemap-provider.php */ - $url = apply_filters( 'wpseo_sitemap_entry', $url, 'user', $user ); - - if ( ! empty( $url ) ) { - $links[] = $url; - } - } - - return $links; - } - - /** - * Update any users that don't have last profile update timestamp. - * - * @return int Count of users updated. - */ - protected function update_user_meta() { - - $user_criteria = [ - 'capability' => [ 'edit_posts' ], - 'meta_query' => [ - [ - 'key' => '_yoast_wpseo_profile_updated', - 'compare' => 'NOT EXISTS', - ], - ], - ]; - - $users = get_users( $user_criteria ); - - $time = time(); - - foreach ( $users as $user ) { - update_user_meta( $user->ID, '_yoast_wpseo_profile_updated', $time ); - } - - return count( $users ); - } - - /** - * Wrap legacy filter to deduplicate calls. - * - * @param array $users Array of user objects to filter. - * - * @return array - */ - protected function exclude_users( $users ) { - - /** - * Filter the authors, included in XML sitemap. - * - * @param array $users Array of user objects to filter. - */ - return apply_filters( 'wpseo_sitemap_exclude_author', $users ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-post-type-sitemap-provider.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-post-type-sitemap-provider.php deleted file mode 100644 index d018ad0b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-post-type-sitemap-provider.php +++ /dev/null @@ -1,766 +0,0 @@ -include_images = apply_filters( 'wpseo_xml_sitemap_include_images', true ); - } - - /** - * Get the Image Parser. - * - * @return WPSEO_Sitemap_Image_Parser - */ - protected function get_image_parser() { - if ( ! isset( self::$image_parser ) ) { - self::$image_parser = new WPSEO_Sitemap_Image_Parser(); - } - - return self::$image_parser; - } - - /** - * Gets the parsed home url. - * - * @return array The home url, as parsed by wp_parse_url. - */ - protected function get_parsed_home_url() { - if ( ! isset( self::$parsed_home_url ) ) { - self::$parsed_home_url = wp_parse_url( home_url() ); - } - - return self::$parsed_home_url; - } - - /** - * Check if provider supports given item type. - * - * @param string $type Type string to check for. - * - * @return bool - */ - public function handles_type( $type ) { - - return post_type_exists( $type ); - } - - /** - * Retrieves the sitemap links. - * - * @param int $max_entries Entries per sitemap. - * - * @return array - */ - public function get_index_links( $max_entries ) { - global $wpdb; - $post_types = WPSEO_Post_Type::get_accessible_post_types(); - $post_types = array_filter( $post_types, [ $this, 'is_valid_post_type' ] ); - $last_modified_times = WPSEO_Sitemaps::get_last_modified_gmt( $post_types, true ); - $index = []; - - foreach ( $post_types as $post_type ) { - - $total_count = $this->get_post_type_count( $post_type ); - - if ( $total_count === 0 ) { - continue; - } - - $max_pages = 1; - if ( $total_count > $max_entries ) { - $max_pages = (int) ceil( $total_count / $max_entries ); - } - - $all_dates = []; - - if ( $max_pages > 1 ) { - $all_dates = version_compare( $wpdb->db_version(), '8.0', '>=' ) ? $this->get_all_dates_using_with_clause( $post_type, $max_entries ) : $this->get_all_dates( $post_type, $max_entries ); - } - - for ( $page_counter = 0; $page_counter < $max_pages; $page_counter++ ) { - - $current_page = ( $page_counter === 0 ) ? '' : ( $page_counter + 1 ); - $date = false; - - if ( empty( $current_page ) || $current_page === $max_pages ) { - - if ( ! empty( $last_modified_times[ $post_type ] ) ) { - $date = $last_modified_times[ $post_type ]; - } - } - else { - $date = $all_dates[ $page_counter ]; - } - - $index[] = [ - 'loc' => WPSEO_Sitemaps_Router::get_base_url( $post_type . '-sitemap' . $current_page . '.xml' ), - 'lastmod' => $date, - ]; - } - } - - return $index; - } - - /** - * Get set of sitemap link data. - * - * @param string $type Sitemap type. - * @param int $max_entries Entries per sitemap. - * @param int $current_page Current page of the sitemap. - * - * @return array - * - * @throws OutOfBoundsException When an invalid page is requested. - */ - public function get_sitemap_links( $type, $max_entries, $current_page ) { - - $links = []; - $post_type = $type; - - if ( ! $this->is_valid_post_type( $post_type ) ) { - throw new OutOfBoundsException( 'Invalid sitemap page requested' ); - } - - $steps = min( 100, $max_entries ); - $offset = ( $current_page > 1 ) ? ( ( $current_page - 1 ) * $max_entries ) : 0; - $total = ( $offset + $max_entries ); - - $post_type_entries = $this->get_post_type_count( $post_type ); - - if ( $total > $post_type_entries ) { - $total = $post_type_entries; - } - - if ( $current_page === 1 ) { - $links = array_merge( $links, $this->get_first_links( $post_type ) ); - } - - // If total post type count is lower than the offset, an invalid page is requested. - if ( $post_type_entries < $offset ) { - throw new OutOfBoundsException( 'Invalid sitemap page requested' ); - } - - if ( $post_type_entries === 0 ) { - return $links; - } - - $posts_to_exclude = $this->get_excluded_posts( $type ); - - while ( $total > $offset ) { - - $posts = $this->get_posts( $post_type, $steps, $offset ); - - $offset += $steps; - - if ( empty( $posts ) ) { - continue; - } - - foreach ( $posts as $post ) { - - if ( in_array( $post->ID, $posts_to_exclude, true ) ) { - continue; - } - - if ( WPSEO_Meta::get_value( 'meta-robots-noindex', $post->ID ) === '1' ) { - continue; - } - - $url = $this->get_url( $post ); - - if ( ! isset( $url['loc'] ) ) { - continue; - } - - /** - * Filter URL entry before it gets added to the sitemap. - * - * @param array $url Array of URL parts. - * @param string $type URL type. - * @param object $post Data object for the URL. - */ - $url = apply_filters( 'wpseo_sitemap_entry', $url, 'post', $post ); - - if ( ! empty( $url ) ) { - $links[] = $url; - } - } - - unset( $post, $url ); - } - - return $links; - } - - /** - * Check for relevant post type before invalidation. - * - * @param int $post_id Post ID to possibly invalidate for. - * - * @return void - */ - public function save_post( $post_id ) { - - if ( $this->is_valid_post_type( get_post_type( $post_id ) ) ) { - WPSEO_Sitemaps_Cache::invalidate_post( $post_id ); - } - } - - /** - * Check if post type should be present in sitemaps. - * - * @param string $post_type Post type string to check for. - * - * @return bool - */ - public function is_valid_post_type( $post_type ) { - if ( ! WPSEO_Post_Type::is_post_type_accessible( $post_type ) || ! WPSEO_Post_Type::is_post_type_indexable( $post_type ) ) { - return false; - } - - /** - * Filter decision if post type is excluded from the XML sitemap. - * - * @param bool $exclude Default false. - * @param string $post_type Post type name. - */ - if ( apply_filters( 'wpseo_sitemap_exclude_post_type', false, $post_type ) ) { - return false; - } - - return true; - } - - /** - * Retrieves a list with the excluded post ids. - * - * @param string $post_type Post type. - * - * @return array Array with post ids to exclude. - */ - protected function get_excluded_posts( $post_type ) { - $excluded_posts_ids = []; - - $page_on_front_id = ( $post_type === 'page' ) ? (int) get_option( 'page_on_front' ) : 0; - if ( $page_on_front_id > 0 ) { - $excluded_posts_ids[] = $page_on_front_id; - } - - /** - * Filter: 'wpseo_exclude_from_sitemap_by_post_ids' - Allow extending and modifying the posts to exclude. - * - * @param array $posts_to_exclude The posts to exclude. - */ - $excluded_posts_ids = apply_filters( 'wpseo_exclude_from_sitemap_by_post_ids', $excluded_posts_ids ); - if ( ! is_array( $excluded_posts_ids ) ) { - $excluded_posts_ids = []; - } - - $excluded_posts_ids = array_map( 'intval', $excluded_posts_ids ); - - $page_for_posts_id = ( $post_type === 'page' ) ? (int) get_option( 'page_for_posts' ) : 0; - if ( $page_for_posts_id > 0 ) { - $excluded_posts_ids[] = $page_for_posts_id; - } - - return array_unique( $excluded_posts_ids ); - } - - /** - * Get count of posts for post type. - * - * @param string $post_type Post type to retrieve count for. - * - * @return int - */ - protected function get_post_type_count( $post_type ) { - - global $wpdb; - - /** - * Filter JOIN query part for type count of post type. - * - * @param string $join SQL part, defaults to empty string. - * @param string $post_type Post type name. - */ - $join_filter = apply_filters( 'wpseo_typecount_join', '', $post_type ); - - /** - * Filter WHERE query part for type count of post type. - * - * @param string $where SQL part, defaults to empty string. - * @param string $post_type Post type name. - */ - $where_filter = apply_filters( 'wpseo_typecount_where', '', $post_type ); - - $where = $this->get_sql_where_clause( $post_type ); - - $sql = " - SELECT COUNT({$wpdb->posts}.ID) - FROM {$wpdb->posts} - {$join_filter} - {$where} - {$where_filter} - "; - - return (int) $wpdb->get_var( $sql ); - } - - /** - * Produces set of links to prepend at start of first sitemap page. - * - * @param string $post_type Post type to produce links for. - * - * @return array - */ - protected function get_first_links( $post_type ) { - - $links = []; - $archive_url = false; - - if ( $post_type === 'page' ) { - - $page_on_front_id = (int) get_option( 'page_on_front' ); - if ( $page_on_front_id > 0 ) { - $front_page = $this->get_url( - get_post( $page_on_front_id ) - ); - } - - if ( empty( $front_page ) ) { - $front_page = [ - 'loc' => YoastSEO()->helpers->url->home(), - ]; - } - - // Deprecated, kept for backwards data compat. R. - $front_page['chf'] = 'daily'; - $front_page['pri'] = 1; - - $images = ( $front_page['images'] ?? [] ); - - /** - * Filter images to be included for the term in XML sitemap. - * - * @param array $images Array of image items. - * @return array $image_list Array of image items. - */ - $image_list = apply_filters( 'wpseo_sitemap_urlimages_front_page', $images ); - if ( is_array( $image_list ) ) { - $front_page['images'] = $image_list; - } - - $links[] = $front_page; - } - elseif ( $post_type !== 'page' ) { - /** - * Filter the URL Yoast SEO uses in the XML sitemap for this post type archive. - * - * @param string $archive_url The URL of this archive - * @param string $post_type The post type this archive is for. - */ - $archive_url = apply_filters( - 'wpseo_sitemap_post_type_archive_link', - $this->get_post_type_archive_link( $post_type ), - $post_type - ); - } - - if ( $archive_url ) { - - $links[] = [ - 'loc' => $archive_url, - 'mod' => WPSEO_Sitemaps::get_last_modified_gmt( $post_type ), - - // Deprecated, kept for backwards data compat. R. - 'chf' => 'daily', - 'pri' => 1, - ]; - } - - /** - * Filters the first post type links. - * - * @param array $links The first post type links. - * @param string $post_type The post type this archive is for. - */ - return apply_filters( 'wpseo_sitemap_post_type_first_links', $links, $post_type ); - } - - /** - * Get URL for a post type archive. - * - * @since 5.3 - * - * @param string $post_type Post type. - * - * @return string|bool URL or false if it should be excluded. - */ - protected function get_post_type_archive_link( $post_type ) { - - $pt_archive_page_id = -1; - - if ( $post_type === 'post' ) { - - if ( get_option( 'show_on_front' ) === 'posts' ) { - return YoastSEO()->helpers->url->home(); - } - - $pt_archive_page_id = (int) get_option( 'page_for_posts' ); - - // Post archive should be excluded if posts page isn't set. - if ( $pt_archive_page_id <= 0 ) { - return false; - } - } - - if ( ! $this->is_post_type_archive_indexable( $post_type, $pt_archive_page_id ) ) { - return false; - } - - return get_post_type_archive_link( $post_type ); - } - - /** - * Determines whether a post type archive is indexable. - * - * @since 11.5 - * - * @param string $post_type Post type. - * @param int $archive_page_id The page id. - * - * @return bool True when post type archive is indexable. - */ - protected function is_post_type_archive_indexable( $post_type, $archive_page_id = -1 ) { - - if ( WPSEO_Options::get( 'noindex-ptarchive-' . $post_type, false ) ) { - return false; - } - - /** - * Filter the page which is dedicated to this post type archive. - * - * @since 9.3 - * - * @param string $archive_page_id The post_id of the page. - * @param string $post_type The post type this archive is for. - */ - $archive_page_id = (int) apply_filters( 'wpseo_sitemap_page_for_post_type_archive', $archive_page_id, $post_type ); - - if ( $archive_page_id > 0 && WPSEO_Meta::get_value( 'meta-robots-noindex', $archive_page_id ) === '1' ) { - return false; - } - - return true; - } - - /** - * Retrieve set of posts with optimized query routine. - * - * @param string $post_type Post type to retrieve. - * @param int $count Count of posts to retrieve. - * @param int $offset Starting offset. - * - * @return object[] - */ - protected function get_posts( $post_type, $count, $offset ) { - - global $wpdb; - - static $filters = []; - - if ( ! isset( $filters[ $post_type ] ) ) { - // Make sure you're wpdb->preparing everything you throw into this!! - $filters[ $post_type ] = [ - /** - * Filter JOIN query part for the post type. - * - * @param string $join SQL part, defaults to false. - * @param string $post_type Post type name. - */ - 'join' => apply_filters( 'wpseo_posts_join', false, $post_type ), - - /** - * Filter WHERE query part for the post type. - * - * @param string $where SQL part, defaults to false. - * @param string $post_type Post type name. - */ - 'where' => apply_filters( 'wpseo_posts_where', false, $post_type ), - ]; - } - - $join_filter = $filters[ $post_type ]['join']; - $where_filter = $filters[ $post_type ]['where']; - $where = $this->get_sql_where_clause( $post_type ); - - /* - * Optimized query per this thread: - * {@link http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-performance-suggestion}. - * Also see {@link http://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/}. - */ - $sql = " - SELECT l.ID, post_title, post_content, post_name, post_parent, post_author, post_status, post_modified_gmt, post_date, post_date_gmt - FROM ( - SELECT {$wpdb->posts}.ID - FROM {$wpdb->posts} - {$join_filter} - {$where} - {$where_filter} - ORDER BY {$wpdb->posts}.post_modified ASC LIMIT %d OFFSET %d - ) - o JOIN {$wpdb->posts} l ON l.ID = o.ID - "; - - $posts = $wpdb->get_results( $wpdb->prepare( $sql, $count, $offset ) ); - - $post_ids = []; - - foreach ( $posts as $post_index => $post ) { - $post->post_type = $post_type; - $sanitized_post = sanitize_post( $post, 'raw' ); - $posts[ $post_index ] = new WP_Post( $sanitized_post ); - - $post_ids[] = $sanitized_post->ID; - } - - update_meta_cache( 'post', $post_ids ); - - return $posts; - } - - /** - * Constructs an SQL where clause for a given post type. - * - * @param string $post_type Post type slug. - * - * @return string - */ - protected function get_sql_where_clause( $post_type ) { - - global $wpdb; - - $join = ''; - $post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses( $post_type ) ); - $status_where = "{$wpdb->posts}.post_status IN ('" . implode( "','", $post_statuses ) . "')"; - - // Based on WP_Query->get_posts(). R. - if ( $post_type === 'attachment' ) { - $join = " LEFT JOIN {$wpdb->posts} AS p2 ON ({$wpdb->posts}.post_parent = p2.ID) "; - $parent_statuses = array_diff( $post_statuses, [ 'inherit' ] ); - $status_where = "p2.post_status IN ('" . implode( "','", $parent_statuses ) . "') AND p2.post_password = ''"; - } - - $where_clause = " - {$join} - WHERE {$status_where} - AND {$wpdb->posts}.post_type = %s - AND {$wpdb->posts}.post_password = '' - AND {$wpdb->posts}.post_date != '0000-00-00 00:00:00' - "; - - return $wpdb->prepare( $where_clause, $post_type ); - } - - /** - * Produce array of URL parts for given post object. - * - * @param object $post Post object to get URL parts for. - * - * @return array|bool - */ - protected function get_url( $post ) { - - $url = []; - - /** - * Filter the URL Yoast SEO uses in the XML sitemap. - * - * Note that only absolute local URLs are allowed as the check after this removes external URLs. - * - * @param string $url URL to use in the XML sitemap - * @param object $post Post object for the URL. - */ - $url['loc'] = apply_filters( 'wpseo_xml_sitemap_post_url', get_permalink( $post ), $post ); - $link_type = YoastSEO()->helpers->url->get_link_type( - wp_parse_url( $url['loc'] ), - $this->get_parsed_home_url() - ); - - /* - * Do not include external URLs. - * - * {@link https://wordpress.org/plugins/page-links-to/} can rewrite permalinks to external URLs. - */ - if ( $link_type === SEO_Links::TYPE_EXTERNAL ) { - return false; - } - - $modified = max( $post->post_modified_gmt, $post->post_date_gmt ); - - if ( $modified !== '0000-00-00 00:00:00' ) { - $url['mod'] = $modified; - } - - $url['chf'] = 'daily'; // Deprecated, kept for backwards data compat. R. - - $canonical = WPSEO_Meta::get_value( 'canonical', $post->ID ); - - if ( $canonical !== '' && $canonical !== $url['loc'] ) { - /* - * Let's assume that if a canonical is set for this page and it's different from - * the URL of this post, that page is either already in the XML sitemap OR is on - * an external site, either way, we shouldn't include it here. - */ - return false; - } - unset( $canonical ); - - $url['pri'] = 1; // Deprecated, kept for backwards data compat. R. - - if ( $this->include_images ) { - $url['images'] = $this->get_image_parser()->get_images( $post ); - } - - return $url; - } - - /** - * Get all dates for a post type by using the WITH clause for performance. - * - * @param string $post_type Post type to retrieve dates for. - * @param int $max_entries Maximum number of entries to retrieve. - * - * @return array Array of dates. - */ - private function get_all_dates_using_with_clause( $post_type, $max_entries ) { - global $wpdb; - - $post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses( $post_type ) ); - - $replacements = array_merge( - [ - 'ordering', - 'post_modified_gmt', - $wpdb->posts, - 'type_status_date', - 'post_status', - ], - $post_statuses, - [ - 'post_type', - $post_type, - 'post_modified_gmt', - 'post_modified_gmt', - 'ordering', - $max_entries, - ] - ); - - //phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here. - //phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - return $wpdb->get_col( - //phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized. - $wpdb->prepare( - ' - WITH %i AS (SELECT ROW_NUMBER() OVER (ORDER BY %i) AS n, post_modified_gmt - FROM %i USE INDEX ( %i ) - WHERE %i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ') - AND %i = %s - ORDER BY %i) - SELECT %i - FROM %i - WHERE MOD(n, %d) = 0; - ', - $replacements - ) - ); - } - - /** - * Get all dates for a post type. - * - * @param string $post_type Post type to retrieve dates for. - * @param int $max_entries Maximum number of entries to retrieve. - * - * @return array Array of dates. - */ - private function get_all_dates( $post_type, $max_entries ) { - global $wpdb; - - $post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses( $post_type ) ); - $replacements = array_merge( - [ - 'post_modified_gmt', - $wpdb->posts, - 'type_status_date', - 'post_status', - ], - $post_statuses, - [ - 'post_type', - $post_type, - $max_entries, - 'post_modified_gmt', - ] - ); - - return $wpdb->get_col( - //phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized. - $wpdb->prepare( - ' - SELECT %i - FROM ( SELECT @rownum:=0 ) init - JOIN %i USE INDEX( %i ) - WHERE %i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ') - AND %i = %s - AND ( @rownum:=@rownum+1 ) %% %d = 0 - ORDER BY %i ASC - ', - $replacements - ) - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-cache-data.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-cache-data.php deleted file mode 100644 index 495afa12..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-cache-data.php +++ /dev/null @@ -1,200 +0,0 @@ -sitemap = $sitemap; - - /* - * Empty sitemap is not usable. - */ - if ( ! empty( $sitemap ) ) { - $this->set_status( self::OK ); - } - else { - $this->set_status( self::ERROR ); - } - } - - /** - * Set the status of the sitemap, is it usable. - * - * @param bool|string $usable Is the sitemap usable or not. - * - * @return void - */ - public function set_status( $usable ) { - - if ( $usable === self::OK ) { - $this->status = self::OK; - - return; - } - - if ( $usable === self::ERROR ) { - $this->status = self::ERROR; - $this->sitemap = ''; - - return; - } - - $this->status = self::UNKNOWN; - } - - /** - * Is the sitemap usable. - * - * @return bool True if usable, False if bad or unknown. - */ - public function is_usable() { - - return $this->status === self::OK; - } - - /** - * Get the XML content of the sitemap. - * - * @return string The content of the sitemap. - */ - public function get_sitemap() { - - return $this->sitemap; - } - - /** - * Get the status of the sitemap. - * - * @return string Status of the sitemap, 'ok'/'error'/'unknown'. - */ - public function get_status() { - - return $this->status; - } - - /** - * String representation of object. - * - * {@internal This magic method is only "magic" as of PHP 7.4 in which the magic method was introduced.} - * - * @link https://www.php.net/language.oop5.magic#object.serialize - * @link https://wiki.php.net/rfc/custom_object_serialization - * - * @since 17.8.0 - * - * @return array The data to be serialized. - */ - public function __serialize() { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__serializeFound - - $data = [ - 'status' => $this->status, - 'xml' => $this->sitemap, - ]; - - return $data; - } - - /** - * Constructs the object. - * - * {@internal This magic method is only "magic" as of PHP 7.4 in which the magic method was introduced.} - * - * @link https://www.php.net/language.oop5.magic#object.serialize - * @link https://wiki.php.net/rfc/custom_object_serialization - * - * @since 17.8.0 - * - * @param array $data The unserialized data to use to (re)construct the object. - * - * @return void - */ - public function __unserialize( $data ) { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__unserializeFound - - $this->set_sitemap( $data['xml'] ); - $this->set_status( $data['status'] ); - } - - /** - * String representation of object. - * - * {@internal The magic methods take precedence over the Serializable interface. - * This means that in practice, this method will now only be called on PHP < 7.4. - * For PHP 7.4 and higher, the magic methods will be used instead.} - * - * {@internal The Serializable interface is being phased out, in favour of the magic methods. - * This method should be deprecated and removed and the class should no longer - * implement the `Serializable` interface. - * This change, however, can't be made until the minimum PHP version goes up to PHP 7.4 or higher.} - * - * @link http://php.net/manual/en/serializable.serialize.php - * @link https://wiki.php.net/rfc/phase_out_serializable - * - * @since 5.1.0 - * - * @return string The string representation of the object or null in C-format. - */ - public function serialize() { - - return serialize( $this->__serialize() ); - } - - /** - * Constructs the object. - * - * {@internal The magic methods take precedence over the Serializable interface. - * This means that in practice, this method will now only be called on PHP < 7.4. - * For PHP 7.4 and higher, the magic methods will be used instead.} - * - * {@internal The Serializable interface is being phased out, in favour of the magic methods. - * This method should be deprecated and removed and the class should no longer - * implement the `Serializable` interface. - * This change, however, can't be made until the minimum PHP version goes up to PHP 7.4 or higher.} - * - * @link http://php.net/manual/en/serializable.unserialize.php - * @link https://wiki.php.net/rfc/phase_out_serializable - * - * @since 5.1.0 - * - * @param string $data The string representation of the object in C or O-format. - * - * @return void - */ - public function unserialize( $data ) { - - $data = unserialize( $data ); - $this->__unserialize( $data ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-image-parser.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-image-parser.php deleted file mode 100644 index 58d8ec5a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-image-parser.php +++ /dev/null @@ -1,509 +0,0 @@ -home_url = home_url(); - $parsed_home = wp_parse_url( $this->home_url ); - - if ( ! empty( $parsed_home['host'] ) ) { - $this->host = str_replace( 'www.', '', $parsed_home['host'] ); - } - - if ( ! empty( $parsed_home['scheme'] ) ) { - $this->scheme = $parsed_home['scheme']; - } - - $this->charset = esc_attr( get_bloginfo( 'charset' ) ); - } - - /** - * Get set of image data sets for the given post. - * - * @param object $post Post object to get images for. - * - * @return array - */ - public function get_images( $post ) { - - $images = []; - - if ( ! is_object( $post ) ) { - return $images; - } - - $thumbnail_id = get_post_thumbnail_id( $post->ID ); - - if ( $thumbnail_id ) { - - $src = $this->get_absolute_url( $this->image_url( $thumbnail_id ) ); - $images[] = $this->get_image_item( $post, $src ); - } - - /** - * Filter: 'wpseo_sitemap_content_before_parse_html_images' - Filters the post content - * before it is parsed for images. - * - * @param string $content The raw/unprocessed post content. - */ - $content = apply_filters( 'wpseo_sitemap_content_before_parse_html_images', $post->post_content ); - - $unfiltered_images = $this->parse_html_images( $content ); - - foreach ( $unfiltered_images as $image ) { - $images[] = $this->get_image_item( $post, $image['src'] ); - } - - foreach ( $this->parse_galleries( $content, $post->ID ) as $attachment ) { - $src = $this->get_absolute_url( $this->image_url( $attachment->ID ) ); - $images[] = $this->get_image_item( $post, $src ); - } - - if ( $post->post_type === 'attachment' && wp_attachment_is_image( $post ) ) { - $src = $this->get_absolute_url( $this->image_url( $post->ID ) ); - $images[] = $this->get_image_item( $post, $src ); - } - - foreach ( $images as $key => $image ) { - - if ( empty( $image['src'] ) ) { - unset( $images[ $key ] ); - } - } - - /** - * Filter images to be included for the post in XML sitemap. - * - * @param array $images Array of image items. - * @param int $post_id ID of the post. - */ - $image_list = apply_filters( 'wpseo_sitemap_urlimages', $images, $post->ID ); - if ( isset( $image_list ) && is_array( $image_list ) ) { - $images = $image_list; - } - - return $images; - } - - /** - * Get the images in the term description. - * - * @param object $term Term to get images from description for. - * - * @return array - */ - public function get_term_images( $term ) { - - $images = $this->parse_html_images( $term->description ); - - foreach ( $this->parse_galleries( $term->description ) as $attachment ) { - - $images[] = [ - 'src' => $this->get_absolute_url( $this->image_url( $attachment->ID ) ), - ]; - } - - /** - * Filter images to be included for the term in XML sitemap. - * - * @param array $image_list Array of image items. - * @param int $term_id ID of the post. - */ - $image_list = apply_filters( 'wpseo_sitemap_urlimages_term', $images, $term->term_id ); - if ( isset( $image_list ) && is_array( $image_list ) ) { - $images = $image_list; - } - - return $images; - } - - /** - * Parse `` tags in content. - * - * @param string $content Content string to parse. - * - * @return array - */ - private function parse_html_images( $content ) { - - $images = []; - - if ( ! class_exists( 'DOMDocument' ) ) { - return $images; - } - - if ( empty( $content ) ) { - return $images; - } - - // Prevent DOMDocument from bubbling warnings about invalid HTML. - libxml_use_internal_errors( true ); - - $post_dom = new DOMDocument(); - $post_dom->loadHTML( 'charset . '">' . $content ); - - // Clear the errors, so they don't get kept in memory. - libxml_clear_errors(); - - /** - * Image attribute. - * - * @var DOMElement $img - */ - foreach ( $post_dom->getElementsByTagName( 'img' ) as $img ) { - - $src = $img->getAttribute( 'src' ); - - if ( empty( $src ) ) { - continue; - } - - $class = $img->getAttribute( 'class' ); - - if ( // This detects WP-inserted images, which we need to upsize. R. - ! empty( $class ) - && ( strpos( $class, 'size-full' ) === false ) - && preg_match( '|wp-image-(?P\d+)|', $class, $matches ) - && get_post_status( $matches['id'] ) - ) { - $query_params = wp_parse_url( $src, PHP_URL_QUERY ); - $src = $this->image_url( $matches['id'] ); - - if ( $query_params ) { - $src .= '?' . $query_params; - } - } - - $src = $this->get_absolute_url( $src ); - - if ( strpos( $src, $this->host ) === false ) { - continue; - } - - if ( $src !== esc_url( $src, null, 'attribute' ) ) { - continue; - } - - $images[] = [ - 'src' => $src, - ]; - } - - return $images; - } - - /** - * Parse gallery shortcodes in a given content. - * - * @param string $content Content string. - * @param int $post_id Optional. ID of post being parsed. - * - * @return array Set of attachment objects. - */ - protected function parse_galleries( $content, $post_id = 0 ) { - - $attachments = []; - $galleries = $this->get_content_galleries( $content ); - - foreach ( $galleries as $gallery ) { - - $id = $post_id; - - if ( ! empty( $gallery['id'] ) ) { - $id = intval( $gallery['id'] ); - } - - // Forked from core gallery_shortcode() to have exact same logic. R. - if ( ! empty( $gallery['ids'] ) ) { - $gallery['include'] = $gallery['ids']; - } - - $gallery_attachments = $this->get_gallery_attachments( $id, $gallery ); - - $attachments = array_merge( $attachments, $gallery_attachments ); - } - - return array_unique( $attachments, SORT_REGULAR ); - } - - /** - * Retrieves galleries from the passed content. - * - * Forked from core to skip executing shortcodes for performance. - * - * @param string $content Content to parse for shortcodes. - * - * @return array A list of arrays, each containing gallery data. - */ - protected function get_content_galleries( $content ) { - - $galleries = []; - - if ( ! preg_match_all( '/' . get_shortcode_regex( [ 'gallery' ] ) . '/s', $content, $matches, PREG_SET_ORDER ) ) { - return $galleries; - } - - foreach ( $matches as $shortcode ) { - - $attributes = shortcode_parse_atts( $shortcode[3] ); - - if ( $attributes === '' ) { // Valid shortcode without any attributes. R. - $attributes = []; - } - - $galleries[] = $attributes; - } - - return $galleries; - } - - /** - * Get image item array with filters applied. - * - * @param WP_Post $post Post object for the context. - * @param string $src Image URL. - * - * @return array - */ - protected function get_image_item( $post, $src ) { - - $image = []; - - /** - * Filter image URL to be included in XML sitemap for the post. - * - * @param string $src Image URL. - * @param object $post Post object. - */ - $image['src'] = apply_filters( 'wpseo_xml_sitemap_img_src', $src, $post ); - - /** - * Filter image data to be included in XML sitemap for the post. - * - * @param array $image { - * Array of image data. - * - * @type string $src Image URL. - * } - * - * @param object $post Post object. - */ - return apply_filters( 'wpseo_xml_sitemap_img', $image, $post ); - } - - /** - * Get attached image URL with filters applied. Adapted from core for speed. - * - * @param int $post_id ID of the post. - * - * @return string - */ - private function image_url( $post_id ) { - - static $uploads; - - if ( empty( $uploads ) ) { - $uploads = wp_upload_dir(); - } - - if ( $uploads['error'] !== false ) { - return ''; - } - - $file = get_post_meta( $post_id, '_wp_attached_file', true ); - - if ( empty( $file ) ) { - return ''; - } - - // Check that the upload base exists in the file location. - if ( strpos( $file, $uploads['basedir'] ) === 0 ) { - $src = str_replace( $uploads['basedir'], $uploads['baseurl'], $file ); - } - elseif ( strpos( $file, 'wp-content/uploads' ) !== false ) { - $src = $uploads['baseurl'] . substr( $file, ( strpos( $file, 'wp-content/uploads' ) + 18 ) ); - } - else { - // It's a newly uploaded file, therefore $file is relative to the baseurl. - $src = $uploads['baseurl'] . '/' . $file; - } - - return apply_filters( 'wp_get_attachment_url', $src, $post_id ); - } - - /** - * Make absolute URL for domain or protocol-relative one. - * - * @param string $src URL to process. - * - * @return string - */ - protected function get_absolute_url( $src ) { - - if ( empty( $src ) || ! is_string( $src ) ) { - return $src; - } - - if ( YoastSEO()->helpers->url->is_relative( $src ) === true ) { - - if ( $src[0] !== '/' ) { - return $src; - } - - // The URL is relative, we'll have to make it absolute. - return $this->home_url . $src; - } - - if ( strpos( $src, 'http' ) !== 0 ) { - // Protocol relative URL, we add the scheme as the standard requires a protocol. - return $this->scheme . ':' . $src; - } - - return $src; - } - - /** - * Returns the attachments for a gallery. - * - * @param int $id The post ID. - * @param array $gallery The gallery config. - * - * @return array The selected attachments. - */ - protected function get_gallery_attachments( $id, $gallery ) { - - // When there are attachments to include. - if ( ! empty( $gallery['include'] ) ) { - return $this->get_gallery_attachments_for_included( $gallery['include'] ); - } - - // When $id is empty, just return empty array. - if ( empty( $id ) ) { - return []; - } - - return $this->get_gallery_attachments_for_parent( $id, $gallery ); - } - - /** - * Returns the attachments for the given ID. - * - * @param int $id The post ID. - * @param array $gallery The gallery config. - * - * @return array The selected attachments. - */ - protected function get_gallery_attachments_for_parent( $id, $gallery ) { - $query = [ - 'posts_per_page' => -1, - 'post_parent' => $id, - ]; - - // When there are posts that should be excluded from result set. - if ( ! empty( $gallery['exclude'] ) ) { - $query['post__not_in'] = wp_parse_id_list( $gallery['exclude'] ); - } - - return $this->get_attachments( $query ); - } - - /** - * Returns an array with attachments for the post IDs that will be included. - * - * @param array $included_ids Array with IDs to include. - * - * @return array The found attachments. - */ - protected function get_gallery_attachments_for_included( $included_ids ) { - $ids_to_include = wp_parse_id_list( $included_ids ); - $attachments = $this->get_attachments( - [ - 'posts_per_page' => count( $ids_to_include ), - 'post__in' => $ids_to_include, - ] - ); - - $gallery_attachments = []; - foreach ( $attachments as $val ) { - $gallery_attachments[ $val->ID ] = $val; - } - - return $gallery_attachments; - } - - /** - * Returns the attachments. - * - * @param array $args Array with query args. - * - * @return array The found attachments. - */ - protected function get_attachments( $args ) { - $default_args = [ - 'post_status' => 'inherit', - 'post_type' => 'attachment', - 'post_mime_type' => 'image', - - // Defaults taken from function get_posts. - 'orderby' => 'date', - 'order' => 'DESC', - 'meta_key' => '', - 'meta_value' => '', - 'suppress_filters' => true, - 'ignore_sticky_posts' => true, - 'no_found_rows' => true, - ]; - - $args = wp_parse_args( $args, $default_args ); - - $get_attachments = new WP_Query(); - return $get_attachments->query( $args ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-admin.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-admin.php deleted file mode 100644 index 10b8fcd6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-admin.php +++ /dev/null @@ -1,125 +0,0 @@ -status_transition_bulk( $new_status, $old_status, $post ); - - return; - } - - $post_type = get_post_type( $post ); - - wp_cache_delete( 'lastpostmodified:gmt:' . $post_type, 'timeinfo' ); // #17455. - } - - /** - * Notify Google of the updated sitemap. - * - * @deprecated 22.0 - * @codeCoverageIgnore - * - * @return void - */ - public function ping_search_engines() { - _deprecated_function( __METHOD__, 'Yoast SEO 22.0' ); - } - - /** - * While bulk importing, just save unique post_types. - * - * When importing is done, if we have a post_type that is saved in the sitemap - * try to ping the search engines. - * - * @param string $new_status New post status. - * @param string $old_status Old post status. - * @param WP_Post $post Post object. - * - * @return void - */ - private function status_transition_bulk( $new_status, $old_status, $post ) { - $this->importing_post_types[] = get_post_type( $post ); - $this->importing_post_types = array_unique( $this->importing_post_types ); - } - - /** - * After import finished, walk through imported post_types and update info. - * - * @return void - */ - public function status_transition_bulk_finished() { - if ( ! defined( 'WP_IMPORTING' ) ) { - return; - } - - if ( empty( $this->importing_post_types ) ) { - return; - } - - $ping_search_engines = false; - - foreach ( $this->importing_post_types as $post_type ) { - wp_cache_delete( 'lastpostmodified:gmt:' . $post_type, 'timeinfo' ); // #17455. - - // Just have the cache deleted for nav_menu_item. - if ( $post_type === 'nav_menu_item' ) { - continue; - } - - if ( WPSEO_Options::get( 'noindex-' . $post_type, false ) === false ) { - $ping_search_engines = true; - } - } - - // Nothing to do. - if ( $ping_search_engines === false ) { - return; - } - - if ( WP_CACHE ) { - do_action( 'wpseo_hit_sitemap_index' ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache-validator.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache-validator.php deleted file mode 100644 index 7d478743..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache-validator.php +++ /dev/null @@ -1,326 +0,0 @@ - $max_length ) { - - if ( $max_length < 15 ) { - /* - * If this happens the most likely cause is a page number that is too high. - * - * So this would not happen unintentionally. - * Either by trying to cause a high server load, finding backdoors or misconfiguration. - */ - throw new OutOfRangeException( - __( - 'Trying to build the sitemap cache key, but the postfix and prefix combination leaves too little room to do this. You are probably requesting a page that is way out of the expected range.', - 'wordpress-seo' - ) - ); - } - - $half = ( $max_length / 2 ); - - $first_part = substr( $type, 0, ( ceil( $half ) - 1 ) ); - $last_part = substr( $type, ( 1 - floor( $half ) ) ); - - $type = $first_part . '..' . $last_part; - } - - return $type; - } - - /** - * Invalidate sitemap cache. - * - * @since 3.2 - * - * @param string|null $type The type to get the key for. Null for all caches. - * - * @return void - */ - public static function invalidate_storage( $type = null ) { - - // Global validator gets cleared when no type is provided. - $old_validator = null; - - // Get the current type validator. - if ( ! is_null( $type ) ) { - $old_validator = self::get_validator( $type ); - } - - // Refresh validator. - self::create_validator( $type ); - - if ( ! wp_using_ext_object_cache() ) { - // Clean up current cache from the database. - self::cleanup_database( $type, $old_validator ); - } - - // External object cache pushes old and unretrieved items out by itself so we don't have to do anything for that. - } - - /** - * Cleanup invalidated database cache. - * - * @since 3.2 - * - * @param string|null $type The type of sitemap to clear cache for. - * @param string|null $validator The validator to clear cache of. - * - * @return void - */ - public static function cleanup_database( $type = null, $validator = null ) { - - global $wpdb; - - if ( is_null( $type ) ) { - // Clear all cache if no type is provided. - $like = sprintf( '%s%%', self::STORAGE_KEY_PREFIX ); - } - else { - // Clear type cache for all type keys. - $like = sprintf( '%1$s%2$s_%%', self::STORAGE_KEY_PREFIX, $type ); - } - - /* - * Add slashes to the LIKE "_" single character wildcard. - * - * We can't use `esc_like` here because we need the % in the query. - */ - $where = []; - $where[] = sprintf( "option_name LIKE '%s'", addcslashes( '_transient_' . $like, '_' ) ); - $where[] = sprintf( "option_name LIKE '%s'", addcslashes( '_transient_timeout_' . $like, '_' ) ); - - // Delete transients. - //phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here. - //phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - $wpdb->query( - $wpdb->prepare( - //phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized. - 'DELETE FROM %i WHERE ' . implode( ' OR ', array_fill( 0, count( $where ), '%s' ) ), - array_merge( [ $wpdb->options ], $where ) - ) - ); - - wp_cache_delete( 'alloptions', 'options' ); - } - - /** - * Get the current cache validator. - * - * Without the type the global validator is returned. - * This can invalidate -all- keys in cache at once. - * - * With the type parameter the validator for that specific type can be invalidated. - * - * @since 3.2 - * - * @param string $type Provide a type for a specific type validator, empty for global validator. - * - * @return string|null The validator for the supplied type. - */ - public static function get_validator( $type = '' ) { - - $key = self::get_validator_key( $type ); - - $current = get_option( $key, null ); - if ( ! is_null( $current ) ) { - return $current; - } - - if ( self::create_validator( $type ) ) { - return self::get_validator( $type ); - } - - return null; - } - - /** - * Get the cache validator option key for the specified type. - * - * @since 3.2 - * - * @param string $type Provide a type for a specific type validator, empty for global validator. - * - * @return string Validator to be used to generate the cache key. - */ - public static function get_validator_key( $type = '' ) { - - if ( empty( $type ) ) { - return self::VALIDATION_GLOBAL_KEY; - } - - return sprintf( self::VALIDATION_TYPE_KEY_FORMAT, $type ); - } - - /** - * Refresh the cache validator value. - * - * @since 3.2 - * - * @param string $type Provide a type for a specific type validator, empty for global validator. - * - * @return bool True if validator key has been saved as option. - */ - public static function create_validator( $type = '' ) { - - $key = self::get_validator_key( $type ); - - // Generate new validator. - $microtime = microtime(); - - // Remove space. - list( $milliseconds, $seconds ) = explode( ' ', $microtime ); - - // Transients are purged every 24h. - $seconds = ( $seconds % DAY_IN_SECONDS ); - $milliseconds = intval( substr( $milliseconds, 2, 3 ), 10 ); - - // Combine seconds and milliseconds and convert to integer. - $validator = intval( $seconds . '' . $milliseconds, 10 ); - - // Apply base 61 encoding. - $compressed = self::convert_base10_to_base61( $validator ); - - return update_option( $key, $compressed, false ); - } - - /** - * Encode to base61 format. - * - * This is base64 (numeric + alpha + alpha upper case) without the 0. - * - * @since 3.2 - * - * @param int $base10 The number that has to be converted to base 61. - * - * @return string Base 61 converted string. - * - * @throws InvalidArgumentException When the input is not an integer. - */ - public static function convert_base10_to_base61( $base10 ) { - - if ( ! is_int( $base10 ) ) { - throw new InvalidArgumentException( __( 'Expected an integer as input.', 'wordpress-seo' ) ); - } - - // Characters that will be used in the conversion. - $characters = '123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - $length = strlen( $characters ); - - $remainder = $base10; - $output = ''; - - do { - // Building from right to left in the result. - $index = ( $remainder % $length ); - - // Prepend the character to the output. - $output = $characters[ $index ] . $output; - - // Determine the remainder after removing the applied number. - $remainder = floor( $remainder / $length ); - - // Keep doing it until we have no remainder left. - } while ( $remainder ); - - return $output; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache.php deleted file mode 100644 index a74e569c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache.php +++ /dev/null @@ -1,359 +0,0 @@ -is_enabled(); - } - - /** - * If cache is enabled. - * - * @since 3.2 - * - * @return bool - */ - public function is_enabled() { - - /** - * Filter if XML sitemap transient cache is enabled. - * - * @param bool $unsigned Enable cache or not, defaults to true. - */ - return apply_filters( 'wpseo_enable_xml_sitemap_transient_caching', false ); - } - - /** - * Retrieve the sitemap page from cache. - * - * @since 3.2 - * - * @param string $type Sitemap type. - * @param int $page Page number to retrieve. - * - * @return string|bool - */ - public function get_sitemap( $type, $page ) { - - $transient_key = WPSEO_Sitemaps_Cache_Validator::get_storage_key( $type, $page ); - if ( $transient_key === false ) { - return false; - } - - return get_transient( $transient_key ); - } - - /** - * Get the sitemap that is cached. - * - * @param string $type Sitemap type. - * @param int $page Page number to retrieve. - * - * @return WPSEO_Sitemap_Cache_Data|null Null on no cache found otherwise object containing sitemap and meta data. - */ - public function get_sitemap_data( $type, $page ) { - - $sitemap = $this->get_sitemap( $type, $page ); - - if ( empty( $sitemap ) ) { - return null; - } - - /* - * Unserialize Cache Data object as is_serialized() doesn't recognize classes in C format. - * This work-around should no longer be needed once the minimum PHP version has gone up to PHP 7.4, - * as the `WPSEO_Sitemap_Cache_Data` class uses O format serialization in PHP 7.4 and higher. - * - * @link https://wiki.php.net/rfc/custom_object_serialization - */ - if ( is_string( $sitemap ) && strpos( $sitemap, 'C:24:"WPSEO_Sitemap_Cache_Data"' ) === 0 ) { - // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_unserialize -- Can't be avoided due to how WP stores options. - $sitemap = unserialize( $sitemap ); - } - - // What we expect it to be if it is set. - if ( $sitemap instanceof WPSEO_Sitemap_Cache_Data_Interface ) { - return $sitemap; - } - - return null; - } - - /** - * Store the sitemap page from cache. - * - * @since 3.2 - * - * @param string $type Sitemap type. - * @param int $page Page number to store. - * @param string $sitemap Sitemap body to store. - * @param bool $usable Is this a valid sitemap or a cache of an invalid sitemap. - * - * @return bool - */ - public function store_sitemap( $type, $page, $sitemap, $usable = true ) { - - $transient_key = WPSEO_Sitemaps_Cache_Validator::get_storage_key( $type, $page ); - - if ( $transient_key === false ) { - return false; - } - - $status = ( $usable ) ? WPSEO_Sitemap_Cache_Data::OK : WPSEO_Sitemap_Cache_Data::ERROR; - - $sitemap_data = new WPSEO_Sitemap_Cache_Data(); - $sitemap_data->set_sitemap( $sitemap ); - $sitemap_data->set_status( $status ); - - return set_transient( $transient_key, $sitemap_data, DAY_IN_SECONDS ); - } - - /** - * Delete cache transients for index and specific type. - * - * Always deletes the main index sitemaps cache, as that's always invalidated by any other change. - * - * @since 1.5.4 - * @since 3.2 Changed from function wpseo_invalidate_sitemap_cache() to method in this class. - * - * @param string $type Sitemap type to invalidate. - * - * @return void - */ - public static function invalidate( $type ) { - - self::clear( [ $type ] ); - } - - /** - * Helper to invalidate in hooks where type is passed as second argument. - * - * @since 3.2 - * - * @param int $unused Unused term ID value. - * @param string $type Taxonomy to invalidate. - * - * @return void - */ - public static function invalidate_helper( $unused, $type ) { - - if ( - WPSEO_Options::get( 'noindex-' . $type ) === false - || WPSEO_Options::get( 'noindex-tax-' . $type ) === false - ) { - self::invalidate( $type ); - } - } - - /** - * Invalidate sitemap cache for authors. - * - * @param int $user_id User ID. - * - * @return bool True if the sitemap was properly invalidated. False otherwise. - */ - public static function invalidate_author( $user_id ) { - - $user = get_user_by( 'id', $user_id ); - - if ( $user === false ) { - return false; - } - - if ( current_action() === 'user_register' ) { - update_user_meta( $user_id, '_yoast_wpseo_profile_updated', time() ); - } - - if ( empty( $user->roles ) || in_array( 'subscriber', $user->roles, true ) ) { - return false; - } - - self::invalidate( 'author' ); - - return true; - } - - /** - * Invalidate sitemap cache for the post type of a post. - * - * Don't invalidate for revisions. - * - * @since 1.5.4 - * @since 3.2 Changed from function wpseo_invalidate_sitemap_cache_on_save_post() to method in this class. - * - * @param int $post_id Post ID to invalidate type for. - * - * @return void - */ - public static function invalidate_post( $post_id ) { - - if ( wp_is_post_revision( $post_id ) ) { - return; - } - - self::invalidate( get_post_type( $post_id ) ); - } - - /** - * Delete cache transients for given sitemaps types or all by default. - * - * @since 1.8.0 - * @since 3.2 Moved from WPSEO_Utils to this class. - * - * @param array $types Set of sitemap types to delete cache transients for. - * - * @return void - */ - public static function clear( $types = [] ) { - - if ( ! self::$is_enabled ) { - return; - } - - // No types provided, clear all. - if ( empty( $types ) ) { - self::$clear_all = true; - - return; - } - - // Always invalidate the index sitemap as well. - if ( ! in_array( WPSEO_Sitemaps::SITEMAP_INDEX_TYPE, $types, true ) ) { - array_unshift( $types, WPSEO_Sitemaps::SITEMAP_INDEX_TYPE ); - } - - foreach ( $types as $type ) { - if ( ! in_array( $type, self::$clear_types, true ) ) { - self::$clear_types[] = $type; - } - } - } - - /** - * Invalidate storage for cache types queued to clear. - * - * @return void - */ - public static function clear_queued() { - - if ( self::$clear_all ) { - - WPSEO_Sitemaps_Cache_Validator::invalidate_storage(); - self::$clear_all = false; - self::$clear_types = []; - - return; - } - - foreach ( self::$clear_types as $type ) { - WPSEO_Sitemaps_Cache_Validator::invalidate_storage( $type ); - } - - self::$clear_types = []; - } - - /** - * Adds a hook that when given option is updated, the cache is cleared. - * - * @since 3.2 - * - * @param string $option Option name. - * @param string $type Sitemap type. - * - * @return void - */ - public static function register_clear_on_option_update( $option, $type = '' ) { - - self::$cache_clear[ $option ] = $type; - } - - /** - * Clears the transient cache when a given option is updated, if that option has been registered before. - * - * @since 3.2 - * - * @param string $option The option name that's being updated. - * - * @return void - */ - public static function clear_on_option_update( $option ) { - - if ( array_key_exists( $option, self::$cache_clear ) ) { - - if ( empty( self::$cache_clear[ $option ] ) ) { - // Clear all caches. - self::clear(); - } - else { - // Clear specific provided type(s). - $types = (array) self::$cache_clear[ $option ]; - self::clear( $types ); - } - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-renderer.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-renderer.php deleted file mode 100644 index 255d4490..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-renderer.php +++ /dev/null @@ -1,355 +0,0 @@ -get_xsl_url() ); - $this->stylesheet = ''; - $this->charset = get_bloginfo( 'charset' ); - $this->output_charset = $this->charset; - - if ( - $this->charset !== 'UTF-8' - && function_exists( 'mb_list_encodings' ) - && in_array( $this->charset, mb_list_encodings(), true ) - ) { - $this->output_charset = 'UTF-8'; - } - - $this->needs_conversion = $this->output_charset !== $this->charset; - } - - /** - * Builds the sitemap index. - * - * @param array $links Set of sitemaps index links. - * - * @return string - */ - public function get_index( $links ) { - - $xml = '' . "\n"; - - foreach ( $links as $link ) { - $xml .= $this->sitemap_index_url( $link ); - } - - /** - * Filter to append sitemaps to the index. - * - * @param string $index String to append to sitemaps index, defaults to empty. - */ - $xml .= apply_filters( 'wpseo_sitemap_index', '' ); - $xml .= ''; - - return $xml; - } - - /** - * Builds the sitemap. - * - * @param array $links Set of sitemap links. - * @param string $type Sitemap type. - * @param int $current_page Current sitemap page number. - * - * @return string - */ - public function get_sitemap( $links, $type, $current_page ) { - - $urlset = '' . "\n"; - - /** - * Filters the `urlset` for all sitemaps. - * - * @param string $urlset The output for the sitemap's `urlset`. - */ - $urlset = apply_filters( 'wpseo_sitemap_urlset', $urlset ); - - /** - * Filters the `urlset` for a sitemap by type. - * - * @param string $urlset The output for the sitemap's `urlset`. - */ - $xml = apply_filters( "wpseo_sitemap_{$type}_urlset", $urlset ); - - foreach ( $links as $url ) { - $xml .= $this->sitemap_url( $url ); - } - - /** - * Filter to add extra URLs to the XML sitemap by type. - * - * Only runs for the first page, not on all. - * - * @param string $content String content to add, defaults to empty. - */ - if ( $current_page === 1 ) { - $xml .= apply_filters( "wpseo_sitemap_{$type}_content", '' ); - } - - $xml .= ''; - - return $xml; - } - - /** - * Produce final XML output with debug information. - * - * @param string $sitemap Sitemap XML. - * - * @return string - */ - public function get_output( $sitemap ) { - - $output = 'output_charset ) . '"?>'; - - if ( $this->stylesheet ) { - /** - * Filter the stylesheet URL for the XML sitemap. - * - * @param string $stylesheet Stylesheet URL. - */ - $output .= apply_filters( 'wpseo_stylesheet_url', $this->stylesheet ) . "\n"; - } - - $output .= $sitemap; - $output .= "\n"; - - return $output; - } - - /** - * Get charset for the output. - * - * @return string - */ - public function get_output_charset() { - return $this->output_charset; - } - - /** - * Set a custom stylesheet for this sitemap. Set to empty to just remove the default stylesheet. - * - * @param string $stylesheet Full XML-stylesheet declaration. - * - * @return void - */ - public function set_stylesheet( $stylesheet ) { - $this->stylesheet = $stylesheet; - } - - /** - * Build the `` tag for a given URL. - * - * @param array $url Array of parts that make up this entry. - * - * @return string - */ - protected function sitemap_index_url( $url ) { - - $date = null; - - if ( ! empty( $url['lastmod'] ) ) { - $date = YoastSEO()->helpers->date->format( $url['lastmod'] ); - } - - $url['loc'] = htmlspecialchars( $url['loc'], ENT_COMPAT, $this->output_charset, false ); - - $output = "\t\n"; - $output .= "\t\t" . $url['loc'] . "\n"; - $output .= empty( $date ) ? '' : "\t\t" . htmlspecialchars( $date, ENT_COMPAT, $this->output_charset, false ) . "\n"; - $output .= "\t\n"; - - return $output; - } - - /** - * Build the `` tag for a given URL. - * - * Public access for backwards compatibility reasons. - * - * @param array $url Array of parts that make up this entry. - * - * @return string - */ - public function sitemap_url( $url ) { - - $date = null; - - if ( ! empty( $url['mod'] ) ) { - // Create a DateTime object date in the correct timezone. - $date = YoastSEO()->helpers->date->format( $url['mod'] ); - } - - $output = "\t\n"; - $output .= "\t\t" . $this->encode_and_escape( $url['loc'] ) . "\n"; - $output .= empty( $date ) ? '' : "\t\t" . htmlspecialchars( $date, ENT_COMPAT, $this->output_charset, false ) . "\n"; - - if ( empty( $url['images'] ) ) { - $url['images'] = []; - } - - foreach ( $url['images'] as $img ) { - - if ( empty( $img['src'] ) ) { - continue; - } - - $output .= "\t\t\n"; - $output .= "\t\t\t" . $this->encode_and_escape( $img['src'] ) . "\n"; - $output .= "\t\t\n"; - } - unset( $img ); - - $output .= "\t\n"; - - /** - * Filters the output for the sitemap URL tag. - * - * @param string $output The output for the sitemap url tag. - * @param array $url The sitemap URL array on which the output is based. - */ - return apply_filters( 'wpseo_sitemap_url', $output, $url ); - } - - /** - * Ensure the URL is encoded per RFC3986 and correctly escaped for use in an XML sitemap. - * - * This method works around a two quirks in esc_url(): - * 1. `esc_url()` leaves schema-relative URLs alone, while according to the sitemap specs, - * the URL must always begin with a protocol. - * 2. `esc_url()` escapes ampersands as `&` instead of the more common `&`. - * According to the specs, `&` should be used, and even though this shouldn't - * really make a difference in practice, to quote Jono: "I'd be nervous about & - * given how many weird and wonderful things eat sitemaps", so better safe than sorry. - * - * @link https://www.sitemaps.org/protocol.html#xmlTagDefinitions - * @link https://www.sitemaps.org/protocol.html#escaping - * @link https://developer.wordpress.org/reference/functions/esc_url/ - * - * @param string $url URL to encode and escape. - * - * @return string - */ - protected function encode_and_escape( $url ) { - $url = $this->encode_url_rfc3986( $url ); - $url = esc_url( $url ); - $url = str_replace( '&', '&', $url ); - $url = str_replace( ''', ''', $url ); - - if ( strpos( $url, '//' ) === 0 ) { - // Schema-relative URL for which esc_url() does not add a scheme. - $url = 'http:' . $url; - } - - return $url; - } - - /** - * Apply some best effort conversion to comply with RFC3986. - * - * @param string $url URL to encode. - * - * @return string - */ - protected function encode_url_rfc3986( $url ) { - - if ( filter_var( $url, FILTER_VALIDATE_URL ) ) { - return $url; - } - - $path = wp_parse_url( $url, PHP_URL_PATH ); - - if ( ! empty( $path ) && $path !== '/' ) { - $encoded_path = explode( '/', $path ); - - // First decode the path, to prevent double encoding. - $encoded_path = array_map( 'rawurldecode', $encoded_path ); - - $encoded_path = array_map( 'rawurlencode', $encoded_path ); - $encoded_path = implode( '/', $encoded_path ); - - $url = str_replace( $path, $encoded_path, $url ); - } - - $query = wp_parse_url( $url, PHP_URL_QUERY ); - - if ( ! empty( $query ) ) { - - parse_str( $query, $parsed_query ); - - $parsed_query = http_build_query( $parsed_query, '', '&', PHP_QUERY_RFC3986 ); - - $url = str_replace( $query, $parsed_query, $url ); - } - - return $url; - } - - /** - * Retrieves the XSL URL that should be used in the current environment - * - * When home_url and site_url are not the same, the home_url should be used. - * This is because the XSL needs to be served from the same domain, protocol and port - * as the XML file that is loading it. - * - * @return string The XSL URL that needs to be used. - */ - protected function get_xsl_url() { - if ( home_url() !== site_url() ) { - return home_url( 'main-sitemap.xsl' ); - } - - /* - * Fallback to circumvent a cross-domain security problem when the XLS file is - * loaded from a different (sub)domain. - */ - if ( strpos( plugins_url(), home_url() ) !== 0 ) { - return home_url( 'main-sitemap.xsl' ); - } - - return plugin_dir_url( WPSEO_FILE ) . 'css/main-sitemap.xsl'; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-router.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-router.php deleted file mode 100644 index 8b923146..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-router.php +++ /dev/null @@ -1,161 +0,0 @@ -classes->get( Deactivating_Yoast_Seo_Conditional::class )->is_met() ) { - return; - } - - add_action( 'yoast_add_dynamic_rewrite_rules', [ $this, 'add_rewrite_rules' ] ); - add_filter( 'query_vars', [ $this, 'add_query_vars' ] ); - - add_filter( 'redirect_canonical', [ $this, 'redirect_canonical' ] ); - add_action( 'template_redirect', [ $this, 'template_redirect' ], 0 ); - } - - /** - * Adds rewrite routes for sitemaps. - * - * @param Yoast_Dynamic_Rewrites $dynamic_rewrites Dynamic rewrites handler instance. - * - * @return void - */ - public function add_rewrite_rules( $dynamic_rewrites ) { - $dynamic_rewrites->add_rule( 'sitemap_index\.xml$', 'index.php?sitemap=1', 'top' ); - $dynamic_rewrites->add_rule( '([^/]+?)-sitemap([0-9]+)?\.xml$', 'index.php?sitemap=$matches[1]&sitemap_n=$matches[2]', 'top' ); - $dynamic_rewrites->add_rule( '([a-z]+)?-?sitemap\.xsl$', 'index.php?yoast-sitemap-xsl=$matches[1]', 'top' ); - } - - /** - * Adds query variables for sitemaps. - * - * @param array $query_vars List of query variables to filter. - * - * @return array Filtered query variables. - */ - public function add_query_vars( $query_vars ) { - $query_vars[] = 'sitemap'; - $query_vars[] = 'sitemap_n'; - $query_vars[] = 'yoast-sitemap-xsl'; - - return $query_vars; - } - - /** - * Sets up rewrite rules. - * - * @deprecated 21.8 - * @codeCoverageIgnore - * - * @return void - */ - public function init() { - _deprecated_function( __METHOD__, 'Yoast SEO 21.8' ); - } - - /** - * Stop trailing slashes on sitemap.xml URLs. - * - * @param string $redirect The redirect URL currently determined. - * - * @return bool|string - */ - public function redirect_canonical( $redirect ) { - - if ( get_query_var( 'sitemap' ) || get_query_var( 'yoast-sitemap-xsl' ) ) { - return false; - } - - return $redirect; - } - - /** - * Redirects sitemap.xml to sitemap_index.xml. - * - * @return void - */ - public function template_redirect() { - if ( ! $this->needs_sitemap_index_redirect() ) { - return; - } - - YoastSEO()->helpers->redirect->do_safe_redirect( home_url( '/sitemap_index.xml' ), 301, 'Yoast SEO' ); - } - - /** - * Checks whether the current request needs to be redirected to sitemap_index.xml. - * - * @global WP_Query $wp_query Current query. - * - * @return bool True if redirect is needed, false otherwise. - */ - public function needs_sitemap_index_redirect() { - global $wp_query; - - $protocol = 'http://'; - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized - if ( ! empty( $_SERVER['HTTPS'] ) && strtolower( $_SERVER['HTTPS'] ) === 'on' ) { - $protocol = 'https://'; - } - - $domain = ''; - if ( isset( $_SERVER['SERVER_NAME'] ) ) { - $domain = sanitize_text_field( wp_unslash( $_SERVER['SERVER_NAME'] ) ); - } - - $path = ''; - if ( isset( $_SERVER['REQUEST_URI'] ) ) { - $path = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ); - } - - // Due to different environment configurations, we need to check both SERVER_NAME and HTTP_HOST. - $check_urls = [ $protocol . $domain . $path ]; - if ( ! empty( $_SERVER['HTTP_HOST'] ) ) { - $check_urls[] = $protocol . sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ) ) . $path; - } - - return $wp_query->is_404 && in_array( home_url( '/sitemap.xml' ), $check_urls, true ); - } - - /** - * Create base URL for the sitemap. - * - * @param string $page Page to append to the base URL. - * - * @return string base URL (incl page) - */ - public static function get_base_url( $page ) { - - global $wp_rewrite; - - $base = $wp_rewrite->using_index_permalinks() ? 'index.php/' : '/'; - - /** - * Filter the base URL of the sitemaps. - * - * @param string $base The string that should be added to home_url() to make the full base URL. - */ - $base = apply_filters( 'wpseo_sitemaps_base_url', $base ); - - /* - * Get the scheme from the configured home URL instead of letting WordPress - * determine the scheme based on the requested URI. - */ - return home_url( $base . $page, wp_parse_url( get_option( 'home' ), PHP_URL_SCHEME ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps.php deleted file mode 100644 index 2fbb567c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps.php +++ /dev/null @@ -1,674 +0,0 @@ -router = new WPSEO_Sitemaps_Router(); - $this->renderer = new WPSEO_Sitemaps_Renderer(); - $this->cache = new WPSEO_Sitemaps_Cache(); - - if ( ! empty( $_SERVER['SERVER_PROTOCOL'] ) ) { - $this->http_protocol = sanitize_text_field( wp_unslash( $_SERVER['SERVER_PROTOCOL'] ) ); - } - } - - /** - * Initialize sitemap providers classes. - * - * @since 5.3 - * - * @return void - */ - public function init_sitemaps_providers() { - - $this->providers = [ - new WPSEO_Post_Type_Sitemap_Provider(), - new WPSEO_Taxonomy_Sitemap_Provider(), - new WPSEO_Author_Sitemap_Provider(), - ]; - - $external_providers = apply_filters( 'wpseo_sitemaps_providers', [] ); - - foreach ( $external_providers as $provider ) { - if ( is_object( $provider ) && $provider instanceof WPSEO_Sitemap_Provider ) { - $this->providers[] = $provider; - } - } - } - - /** - * Check the current request URI, if we can determine it's probably an XML sitemap, kill loading the widgets. - * - * @return void - */ - public function reduce_query_load() { - if ( ! isset( $_SERVER['REQUEST_URI'] ) ) { - return; - } - $request_uri = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ); - $extension = substr( $request_uri, -4 ); - if ( stripos( $request_uri, 'sitemap' ) !== false && in_array( $extension, [ '.xml', '.xsl' ], true ) ) { - remove_all_actions( 'widgets_init' ); - } - } - - /** - * Register your own sitemap. Call this during 'init'. - * - * @param string $name The name of the sitemap. - * @param callback $building_function Function to build your sitemap. - * @param string $rewrite Optional. Regular expression to match your sitemap with. - * - * @return void - */ - public function register_sitemap( $name, $building_function, $rewrite = '' ) { - add_action( 'wpseo_do_sitemap_' . $name, $building_function ); - if ( $rewrite ) { - Yoast_Dynamic_Rewrites::instance()->add_rule( $rewrite, 'index.php?sitemap=' . $name, 'top' ); - } - } - - /** - * Register your own XSL file. Call this during 'init'. - * - * @since 1.4.23 - * - * @param string $name The name of the XSL file. - * @param callback $building_function Function to build your XSL file. - * @param string $rewrite Optional. Regular expression to match your sitemap with. - * - * @return void - */ - public function register_xsl( $name, $building_function, $rewrite = '' ) { - add_action( 'wpseo_xsl_' . $name, $building_function ); - if ( $rewrite ) { - Yoast_Dynamic_Rewrites::instance()->add_rule( $rewrite, 'index.php?yoast-sitemap-xsl=' . $name, 'top' ); - } - } - - /** - * Set the sitemap current page to allow creating partial sitemaps with WP-CLI - * in a one-off process. - * - * @param int $current_page The part that should be generated. - * - * @return void - */ - public function set_n( $current_page ) { - if ( is_scalar( $current_page ) && intval( $current_page ) > 0 ) { - $this->current_page = intval( $current_page ); - } - } - - /** - * Set the sitemap content to display after you have generated it. - * - * @param string $sitemap The generated sitemap to output. - * - * @return void - */ - public function set_sitemap( $sitemap ) { - $this->sitemap = $sitemap; - } - - /** - * Set as true to make the request 404. Used stop the display of empty sitemaps or invalid requests. - * - * @param bool $is_bad Is this a bad request. True or false. - * - * @return void - */ - public function set_bad_sitemap( $is_bad ) { - $this->bad_sitemap = (bool) $is_bad; - } - - /** - * Prevent stupid plugins from running shutdown scripts when we're obviously not outputting HTML. - * - * @since 1.4.16 - * - * @return void - */ - public function sitemap_close() { - remove_all_actions( 'wp_footer' ); - die(); - } - - /** - * Hijack requests for potential sitemaps and XSL files. - * - * @param WP_Query $query Main query instance. - * - * @return void - */ - public function redirect( $query ) { - - if ( ! $query->is_main_query() ) { - return; - } - - $yoast_sitemap_xsl = get_query_var( 'yoast-sitemap-xsl' ); - - if ( ! empty( $yoast_sitemap_xsl ) ) { - /* - * This is a method to provide the XSL via the home_url. - * Needed when the site_url and home_url are not the same. - * Loading the XSL needs to come from the same domain, protocol and port as the XML. - * - * Whenever home_url and site_url are the same, the file can be loaded directly. - */ - $this->xsl_output( $yoast_sitemap_xsl ); - $this->sitemap_close(); - - return; - } - - $type = get_query_var( 'sitemap' ); - - if ( empty( $type ) ) { - return; - } - - if ( get_query_var( 'sitemap_n' ) === '1' || get_query_var( 'sitemap_n' ) === '0' ) { - wp_safe_redirect( home_url( "/$type-sitemap.xml" ), 301, 'Yoast SEO' ); - exit; - } - - $this->set_n( get_query_var( 'sitemap_n' ) ); - - if ( ! $this->get_sitemap_from_cache( $type, $this->current_page ) ) { - $this->build_sitemap( $type ); - } - - if ( $this->bad_sitemap ) { - $query->set_404(); - status_header( 404 ); - - return; - } - - $this->output(); - $this->sitemap_close(); - } - - /** - * Try to get the sitemap from cache. - * - * @param string $type Sitemap type. - * @param int $page_number The page number to retrieve. - * - * @return bool If the sitemap has been retrieved from cache. - */ - private function get_sitemap_from_cache( $type, $page_number ) { - - $this->transient = false; - - if ( $this->cache->is_enabled() !== true ) { - return false; - } - - /** - * Fires before the attempt to retrieve XML sitemap from the transient cache. - * - * @param WPSEO_Sitemaps $sitemaps Sitemaps object. - */ - do_action( 'wpseo_sitemap_stylesheet_cache_' . $type, $this ); - - $sitemap_cache_data = $this->cache->get_sitemap_data( $type, $page_number ); - - // No cache was found, refresh it because cache is enabled. - if ( empty( $sitemap_cache_data ) ) { - return $this->refresh_sitemap_cache( $type, $page_number ); - } - - // Cache object was found, parse information. - $this->transient = true; - - $this->sitemap = $sitemap_cache_data->get_sitemap(); - $this->bad_sitemap = ! $sitemap_cache_data->is_usable(); - - return true; - } - - /** - * Build and save sitemap to cache. - * - * @param string $type Sitemap type. - * @param int $page_number The page number to save to. - * - * @return bool - */ - private function refresh_sitemap_cache( $type, $page_number ) { - $this->set_n( $page_number ); - $this->build_sitemap( $type ); - - return $this->cache->store_sitemap( $type, $page_number, $this->sitemap, ! $this->bad_sitemap ); - } - - /** - * Attempts to build the requested sitemap. - * - * Sets $bad_sitemap if this isn't for the root sitemap, a post type or taxonomy. - * - * @param string $type The requested sitemap's identifier. - * - * @return void - */ - public function build_sitemap( $type ) { - - /** - * Filter the type of sitemap to build. - * - * @param string $type Sitemap type, determined by the request. - */ - $type = apply_filters( 'wpseo_build_sitemap_post_type', $type ); - - if ( $type === '1' ) { - $this->build_root_map(); - - return; - } - - $entries_per_page = $this->get_entries_per_page(); - - foreach ( $this->providers as $provider ) { - if ( ! $provider->handles_type( $type ) ) { - continue; - } - - try { - $links = $provider->get_sitemap_links( $type, $entries_per_page, $this->current_page ); - } catch ( OutOfBoundsException $exception ) { - $this->bad_sitemap = true; - - return; - } - - $this->sitemap = $this->renderer->get_sitemap( $links, $type, $this->current_page ); - - return; - } - - if ( has_action( 'wpseo_do_sitemap_' . $type ) ) { - /** - * Fires custom handler, if hooked to generate sitemap for the type. - */ - do_action( 'wpseo_do_sitemap_' . $type ); - - return; - } - - $this->bad_sitemap = true; - } - - /** - * Build the root sitemap (example.com/sitemap_index.xml) which lists sub-sitemaps for other content types. - * - * @return void - */ - public function build_root_map() { - - $links = []; - $entries_per_page = $this->get_entries_per_page(); - - foreach ( $this->providers as $provider ) { - $links = array_merge( $links, $provider->get_index_links( $entries_per_page ) ); - } - - /** - * Filter the sitemap links array before the index sitemap is built. - * - * @param array $links Array of sitemap links - */ - $links = apply_filters( 'wpseo_sitemap_index_links', $links ); - - if ( empty( $links ) ) { - $this->bad_sitemap = true; - $this->sitemap = ''; - - return; - } - - $this->sitemap = $this->renderer->get_index( $links ); - } - - /** - * Spits out the XSL for the XML sitemap. - * - * @since 1.4.13 - * - * @param string $type Type to output. - * - * @return void - */ - public function xsl_output( $type ) { - - if ( $type !== 'main' ) { - - /** - * Fires for the output of XSL for XML sitemaps, other than type "main". - */ - do_action( 'wpseo_xsl_' . $type ); - - return; - } - - header( $this->http_protocol . ' 200 OK', true, 200 ); - // Prevent the search engines from indexing the XML Sitemap. - header( 'X-Robots-Tag: noindex, follow', true ); - header( 'Content-Type: text/xml' ); - - // Make the browser cache this file properly. - $expires = YEAR_IN_SECONDS; - header( 'Pragma: public' ); - header( 'Cache-Control: max-age=' . $expires ); - header( 'Expires: ' . YoastSEO()->helpers->date->format_timestamp( ( time() + $expires ), 'D, d M Y H:i:s' ) . ' GMT' ); - - // Don't use WP_Filesystem() here because that's not initialized yet. See https://yoast.atlassian.net/browse/QAK-2043. - readfile( WPSEO_PATH . 'css/main-sitemap.xsl' ); - } - - /** - * Spit out the generated sitemap. - * - * @return void - */ - public function output() { - $this->send_headers(); - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaping sitemap as either xml or html results in empty document. - echo $this->renderer->get_output( $this->sitemap ); - } - - /** - * Makes a request to the sitemap index to cache it before the arrival of the search engines. - * - * @return void - */ - public function hit_sitemap_index() { - if ( ! $this->cache->is_enabled() ) { - return; - } - - wp_remote_get( WPSEO_Sitemaps_Router::get_base_url( 'sitemap_index.xml' ) ); - } - - /** - * Get the GMT modification date for the last modified post in the post type. - * - * @since 3.2 - * - * @param string|array $post_types Post type or array of types. - * @param bool $return_all Flag to return array of values. - * - * @return string|array|false - */ - public static function get_last_modified_gmt( $post_types, $return_all = false ) { - - global $wpdb; - - static $post_type_dates = null; - - if ( ! is_array( $post_types ) ) { - $post_types = [ $post_types ]; - } - - foreach ( $post_types as $post_type ) { - if ( ! isset( $post_type_dates[ $post_type ] ) ) { // If we hadn't seen post type before. R. - $post_type_dates = null; - break; - } - } - - if ( is_null( $post_type_dates ) ) { - - $post_type_dates = []; - $post_type_names = WPSEO_Post_Type::get_accessible_post_types(); - - if ( ! empty( $post_type_names ) ) { - $post_statuses = array_map( 'esc_sql', self::get_post_statuses() ); - $replacements = array_merge( - [ - 'post_type', - 'post_modified_gmt', - 'date', - $wpdb->posts, - 'post_status', - ], - $post_statuses, - [ 'post_type' ], - array_keys( $post_type_names ), - [ - 'post_type', - 'date', - ] - ); - - //phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here. - //phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - $dates = $wpdb->get_results( - //phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized. - $wpdb->prepare( - ' - SELECT %i, MAX(%i) AS %i - FROM %i - WHERE %i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ') - AND %i IN (' . implode( ', ', array_fill( 0, count( $post_type_names ), '%s' ) ) . ') - GROUP BY %i - ORDER BY %i DESC - ', - $replacements - ) - ); - - foreach ( $dates as $obj ) { - $post_type_dates[ $obj->post_type ] = $obj->date; - } - } - } - - $dates = array_intersect_key( $post_type_dates, array_flip( $post_types ) ); - - if ( count( $dates ) > 0 ) { - if ( $return_all ) { - return $dates; - } - - return max( $dates ); - } - - return false; - } - - /** - * Get the modification date for the last modified post in the post type. - * - * @param array $post_types Post types to get the last modification date for. - * - * @return string - */ - public function get_last_modified( $post_types ) { - return YoastSEO()->helpers->date->format( self::get_last_modified_gmt( $post_types ) ); - } - - /** - * Get the maximum number of entries per XML sitemap. - * - * @return int The maximum number of entries. - */ - protected function get_entries_per_page() { - /** - * Filter the maximum number of entries per XML sitemap. - * - * After changing the output of the filter, make sure that you disable and enable the - * sitemaps to make sure the value is picked up for the sitemap cache. - * - * @param int $entries The maximum number of entries per XML sitemap. - */ - $entries = (int) apply_filters( 'wpseo_sitemap_entries_per_page', 1000 ); - - return $entries; - } - - /** - * Get post statuses for post_type or the root sitemap. - * - * @since 10.2 - * - * @param string $type Provide a type for a post_type sitemap, SITEMAP_INDEX_TYPE for the root sitemap. - * - * @return array List of post statuses. - */ - public static function get_post_statuses( $type = self::SITEMAP_INDEX_TYPE ) { - /** - * Filter post status list for sitemap query for the post type. - * - * @param array $post_statuses Post status list, defaults to array( 'publish' ). - * @param string $type Post type or SITEMAP_INDEX_TYPE. - */ - $post_statuses = apply_filters( 'wpseo_sitemap_post_statuses', [ 'publish' ], $type ); - - if ( ! is_array( $post_statuses ) || empty( $post_statuses ) ) { - $post_statuses = [ 'publish' ]; - } - - if ( ( $type === self::SITEMAP_INDEX_TYPE || $type === 'attachment' ) - && ! in_array( 'inherit', $post_statuses, true ) - ) { - $post_statuses[] = 'inherit'; - } - - return $post_statuses; - } - - /** - * Sends all the required HTTP Headers. - * - * @return void - */ - private function send_headers() { - if ( headers_sent() ) { - return; - } - - $headers = [ - $this->http_protocol . ' 200 OK' => 200, - // Prevent the search engines from indexing the XML Sitemap. - 'X-Robots-Tag: noindex, follow' => '', - 'Content-Type: text/xml; charset=' . esc_attr( $this->renderer->get_output_charset() ) => '', - ]; - - /** - * Filter the HTTP headers we send before an XML sitemap. - * - * @param array $headers The HTTP headers we're going to send out. - */ - $headers = apply_filters( 'wpseo_sitemap_http_headers', $headers ); - - foreach ( $headers as $header => $status ) { - if ( is_numeric( $status ) ) { - header( $header, true, $status ); - continue; - } - header( $header, true ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-taxonomy-sitemap-provider.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-taxonomy-sitemap-provider.php deleted file mode 100644 index e69f0e79..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-taxonomy-sitemap-provider.php +++ /dev/null @@ -1,351 +0,0 @@ -include_images = apply_filters( 'wpseo_xml_sitemap_include_images', true ); - } - - /** - * Check if provider supports given item type. - * - * @param string $type Type string to check for. - * - * @return bool - */ - public function handles_type( $type ) { - - $taxonomy = get_taxonomy( $type ); - - if ( $taxonomy === false || ! $this->is_valid_taxonomy( $taxonomy->name ) || ! $taxonomy->public ) { - return false; - } - - return true; - } - - /** - * Retrieves the links for the sitemap. - * - * @param int $max_entries Entries per sitemap. - * - * @return array - */ - public function get_index_links( $max_entries ) { - - $taxonomies = get_taxonomies( [ 'public' => true ], 'objects' ); - - if ( empty( $taxonomies ) ) { - return []; - } - - $taxonomy_names = array_filter( array_keys( $taxonomies ), [ $this, 'is_valid_taxonomy' ] ); - $taxonomies = array_intersect_key( $taxonomies, array_flip( $taxonomy_names ) ); - - // Retrieve all the taxonomies and their terms so we can do a proper count on them. - - /** - * Filter the setting of excluding empty terms from the XML sitemap. - * - * @param bool $exclude Defaults to true. - * @param array $taxonomy_names Array of names for the taxonomies being processed. - */ - $hide_empty = apply_filters( 'wpseo_sitemap_exclude_empty_terms', true, $taxonomy_names ); - - $all_taxonomies = []; - - foreach ( $taxonomy_names as $taxonomy_name ) { - /** - * Filter the setting of excluding empty terms from the XML sitemap for a specific taxonomy. - * - * @param bool $exclude Defaults to the sitewide setting. - * @param string $taxonomy_name The name of the taxonomy being processed. - */ - $hide_empty_tax = apply_filters( 'wpseo_sitemap_exclude_empty_terms_taxonomy', $hide_empty, $taxonomy_name ); - - $term_args = [ - 'taxonomy' => $taxonomy_name, - 'hide_empty' => $hide_empty_tax, - 'fields' => 'ids', - ]; - $taxonomy_terms = get_terms( $term_args ); - - if ( count( $taxonomy_terms ) > 0 ) { - $all_taxonomies[ $taxonomy_name ] = $taxonomy_terms; - } - } - - $index = []; - - foreach ( $taxonomies as $tax_name => $tax ) { - - if ( ! isset( $all_taxonomies[ $tax_name ] ) ) { // No eligible terms found. - continue; - } - - $total_count = ( isset( $all_taxonomies[ $tax_name ] ) ) ? count( $all_taxonomies[ $tax_name ] ) : 1; - $max_pages = 1; - - if ( $total_count > $max_entries ) { - $max_pages = (int) ceil( $total_count / $max_entries ); - } - - $last_modified_gmt = WPSEO_Sitemaps::get_last_modified_gmt( $tax->object_type ); - - for ( $page_counter = 0; $page_counter < $max_pages; $page_counter++ ) { - - $current_page = ( $page_counter === 0 ) ? '' : ( $page_counter + 1 ); - - if ( ! is_array( $tax->object_type ) || count( $tax->object_type ) === 0 ) { - continue; - } - - $terms = array_splice( $all_taxonomies[ $tax_name ], 0, $max_entries ); - - if ( ! $terms ) { - continue; - } - - $args = [ - 'post_type' => $tax->object_type, - 'tax_query' => [ - [ - 'taxonomy' => $tax_name, - 'terms' => $terms, - ], - ], - 'orderby' => 'modified', - 'order' => 'DESC', - 'posts_per_page' => 1, - ]; - $query = new WP_Query( $args ); - - if ( $query->have_posts() ) { - $date = $query->posts[0]->post_modified_gmt; - } - else { - $date = $last_modified_gmt; - } - - $index[] = [ - 'loc' => WPSEO_Sitemaps_Router::get_base_url( $tax_name . '-sitemap' . $current_page . '.xml' ), - 'lastmod' => $date, - ]; - } - } - - return $index; - } - - /** - * Get set of sitemap link data. - * - * @param string $type Sitemap type. - * @param int $max_entries Entries per sitemap. - * @param int $current_page Current page of the sitemap. - * - * @return array - * - * @throws OutOfBoundsException When an invalid page is requested. - */ - public function get_sitemap_links( $type, $max_entries, $current_page ) { - global $wpdb; - - $links = []; - if ( ! $this->handles_type( $type ) ) { - return $links; - } - - $taxonomy = get_taxonomy( $type ); - - $steps = $max_entries; - $offset = ( $current_page > 1 ) ? ( ( $current_page - 1 ) * $max_entries ) : 0; - - /** This filter is documented in inc/sitemaps/class-taxonomy-sitemap-provider.php */ - $hide_empty = apply_filters( 'wpseo_sitemap_exclude_empty_terms', true, [ $taxonomy->name ] ); - /** This filter is documented in inc/sitemaps/class-taxonomy-sitemap-provider.php */ - $hide_empty_tax = apply_filters( 'wpseo_sitemap_exclude_empty_terms_taxonomy', $hide_empty, $taxonomy->name ); - $terms = get_terms( - [ - 'taxonomy' => $taxonomy->name, - 'hide_empty' => $hide_empty_tax, - 'update_term_meta_cache' => false, - 'offset' => $offset, - 'number' => $steps, - ] - ); - - // If there are no terms fetched for this range, we are on an invalid page. - if ( empty( $terms ) ) { - throw new OutOfBoundsException( 'Invalid sitemap page requested' ); - } - - $post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses() ); - - $replacements = array_merge( - [ - 'post_modified_gmt', - $wpdb->posts, - $wpdb->term_relationships, - 'object_id', - 'ID', - $wpdb->term_taxonomy, - 'term_taxonomy_id', - 'term_taxonomy_id', - 'taxonomy', - 'term_id', - 'post_status', - ], - $post_statuses, - [ 'post_password' ] - ); - - /** - * Filter: 'wpseo_exclude_from_sitemap_by_term_ids' - Allow excluding terms by ID. - * - * @param array $terms_to_exclude The terms to exclude. - */ - $terms_to_exclude = apply_filters( 'wpseo_exclude_from_sitemap_by_term_ids', [] ); - - foreach ( $terms as $term ) { - - if ( in_array( $term->term_id, $terms_to_exclude, true ) ) { - continue; - } - - $url = []; - - $tax_noindex = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'noindex' ); - - if ( $tax_noindex === 'noindex' ) { - continue; - } - - $canonical = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'canonical' ); - $url['loc'] = get_term_link( $term, $term->taxonomy ); - - if ( is_string( $canonical ) && $canonical !== '' && $canonical !== $url['loc'] ) { - continue; - } - - $current_replacements = $replacements; - array_splice( $current_replacements, 9, 0, $term->taxonomy ); - array_splice( $current_replacements, 11, 0, $term->term_id ); - - //phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here. - //phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. - $url['mod'] = $wpdb->get_var( - //phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized. - $wpdb->prepare( - ' - SELECT MAX(p.%i) AS lastmod - FROM %i AS p - INNER JOIN %i AS term_rel - ON term_rel.%i = p.%i - INNER JOIN %i AS term_tax - ON term_tax.%i = term_rel.%i - AND term_tax.%i = %s - AND term_tax.%i = %d - WHERE p.%i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ") - AND p.%i = '' - ", - $current_replacements - ) - ); - - if ( $this->include_images ) { - $url['images'] = $this->get_image_parser()->get_term_images( $term ); - } - - // Deprecated, kept for backwards data compat. R. - $url['chf'] = 'daily'; - $url['pri'] = 1; - - /** This filter is documented at inc/sitemaps/class-post-type-sitemap-provider.php */ - $url = apply_filters( 'wpseo_sitemap_entry', $url, 'term', $term ); - - if ( ! empty( $url ) ) { - $links[] = $url; - } - } - - return $links; - } - - /** - * Check if taxonomy by name is valid to appear in sitemaps. - * - * @param string $taxonomy_name Taxonomy name to check. - * - * @return bool - */ - public function is_valid_taxonomy( $taxonomy_name ) { - - if ( WPSEO_Options::get( "noindex-tax-{$taxonomy_name}" ) === true ) { - return false; - } - - if ( in_array( $taxonomy_name, [ 'link_category', 'nav_menu', 'wp_pattern_category' ], true ) ) { - return false; - } - - if ( $taxonomy_name === 'post_format' && WPSEO_Options::get( 'disable-post_format', false ) ) { - return false; - } - - /** - * Filter to exclude the taxonomy from the XML sitemap. - * - * @param bool $exclude Defaults to false. - * @param string $taxonomy_name Name of the taxonomy to exclude.. - */ - if ( apply_filters( 'wpseo_sitemap_exclude_taxonomy', false, $taxonomy_name ) ) { - return false; - } - - return true; - } - - /** - * Get the Image Parser. - * - * @return WPSEO_Sitemap_Image_Parser - */ - protected function get_image_parser() { - if ( ! isset( self::$image_parser ) ) { - self::$image_parser = new WPSEO_Sitemap_Image_Parser(); - } - - return self::$image_parser; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/interface-sitemap-cache-data.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/interface-sitemap-cache-data.php deleted file mode 100644 index 9cfdf0aa..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/interface-sitemap-cache-data.php +++ /dev/null @@ -1,72 +0,0 @@ -ID ); - return $primary_term->get_primary_term(); - } -} - -if ( ! function_exists( 'yoast_get_primary_term' ) ) { - /** - * Get the primary term name. - * - * @param string $taxonomy Optional. The taxonomy to get the primary term for. Defaults to category. - * @param int|WP_Post|null $post Optional. Post to get the primary term for. - * - * @return string Name of the primary term. - */ - function yoast_get_primary_term( $taxonomy = 'category', $post = null ) { - $primary_term_id = yoast_get_primary_term_id( $taxonomy, $post ); - - $term = get_term( $primary_term_id ); - if ( ! is_wp_error( $term ) && ! empty( $term ) ) { - return $term->name; - } - - return ''; - } -} - -/** - * Replace `%%variable_placeholders%%` with their real value based on the current requested page/post/cpt. - * - * @param string $text The string to replace the variables in. - * @param object $args The object some of the replacement values might come from, - * could be a post, taxonomy or term. - * @param array $omit Variables that should not be replaced by this function. - * - * @return string - */ -function wpseo_replace_vars( $text, $args, $omit = [] ) { - $replacer = new WPSEO_Replace_Vars(); - - return $replacer->replace( $text, $args, $omit ); -} - -/** - * Register a new variable replacement. - * - * This function is for use by other plugins/themes to easily add their own additional variables to replace. - * This function should be called from a function on the 'wpseo_register_extra_replacements' action hook. - * The use of this function is preferred over the older 'wpseo_replacements' filter as a way to add new replacements. - * The 'wpseo_replacements' filter should still be used to adjust standard WPSEO replacement values. - * The function can not be used to replace standard WPSEO replacement value functions and will thrown a warning - * if you accidently try. - * To avoid conflicts with variables registered by WPSEO and other themes/plugins, try and make the - * name of your variable unique. Variable names also can not start with "%%cf_" or "%%ct_" as these are reserved - * for the standard WPSEO variable variables 'cf_', 'ct_' and - * 'ct_desc_'. - * The replacement function will be passed the undelimited name (i.e. stripped of the %%) of the variable - * to replace in case you need it. - * - * Example code: - * - * - * - * - * @since 1.5.4 - * - * @param string $replacevar_name The name of the variable to replace, i.e. '%%var%%'. - * Note: the surrounding %% are optional, name can only contain [A-Za-z0-9_-]. - * @param mixed $replace_function Function or method to call to retrieve the replacement value for the variable. - * Uses the same format as add_filter/add_action function parameter and - * should *return* the replacement value. DON'T echo it. - * @param string $type Type of variable: 'basic' or 'advanced', defaults to 'advanced'. - * @param string $help_text Help text to be added to the help tab for this variable. - * - * @return bool Whether the replacement function was successfully registered. - */ -function wpseo_register_var_replacement( $replacevar_name, $replace_function, $type = 'advanced', $help_text = '' ) { - return WPSEO_Replace_Vars::register_replacement( $replacevar_name, $replace_function, $type, $help_text ); -} - -/** - * WPML plugin support: Set titles for custom types / taxonomies as translatable. - * - * It adds new keys to a wpml-config.xml file for a custom post type title, metadesc, - * title-ptarchive and metadesc-ptarchive fields translation. - * Documentation: http://wpml.org/documentation/support/language-configuration-files/ - * - * @global $sitepress - * - * @param array $config WPML configuration data to filter. - * - * @return array - */ -function wpseo_wpml_config( $config ) { - global $sitepress; - - if ( ( is_array( $config ) && isset( $config['wpml-config']['admin-texts']['key'] ) ) && ( is_array( $config['wpml-config']['admin-texts']['key'] ) && $config['wpml-config']['admin-texts']['key'] !== [] ) ) { - $admin_texts = $config['wpml-config']['admin-texts']['key']; - foreach ( $admin_texts as $k => $val ) { - if ( $val['attr']['name'] === 'wpseo_titles' ) { - $translate_cp = array_keys( $sitepress->get_translatable_documents() ); - if ( is_array( $translate_cp ) && $translate_cp !== [] ) { - foreach ( $translate_cp as $post_type ) { - $admin_texts[ $k ]['key'][]['attr']['name'] = 'title-' . $post_type; - $admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-' . $post_type; - $admin_texts[ $k ]['key'][]['attr']['name'] = 'title-ptarchive-' . $post_type; - $admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-ptarchive-' . $post_type; - - $translate_tax = $sitepress->get_translatable_taxonomies( false, $post_type ); - if ( is_array( $translate_tax ) && $translate_tax !== [] ) { - foreach ( $translate_tax as $taxonomy ) { - $admin_texts[ $k ]['key'][]['attr']['name'] = 'title-tax-' . $taxonomy; - $admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-tax-' . $taxonomy; - } - } - } - } - break; - } - } - $config['wpml-config']['admin-texts']['key'] = $admin_texts; - } - - return $config; -} - -add_filter( 'icl_wpml_config_array', 'wpseo_wpml_config' ); - -if ( ! function_exists( 'ctype_digit' ) ) { - /** - * Emulate PHP native ctype_digit() function for when the ctype extension would be disabled *sigh*. - * Only emulates the behaviour for when the input is a string, does not handle integer input as ascii value. - * - * @param string $text String input to validate. - * - * @return bool - */ - function ctype_digit( $text ) { - $return = false; - if ( ( is_string( $text ) && $text !== '' ) && preg_match( '`^\d+$`', $text ) === 1 ) { - $return = true; - } - - return $return; - } -} - -/** - * Makes sure the taxonomy meta is updated when a taxonomy term is split. - * - * @link https://make.wordpress.org/core/2015/02/16/taxonomy-term-splitting-in-4-2-a-developer-guide/ Article explaining the taxonomy term splitting in WP 4.2. - * - * @param string $old_term_id Old term id of the taxonomy term that was splitted. - * @param string $new_term_id New term id of the taxonomy term that was splitted. - * @param string $term_taxonomy_id Term taxonomy id for the taxonomy that was affected. - * @param string $taxonomy The taxonomy that the taxonomy term was splitted for. - * - * @return void - */ -function wpseo_split_shared_term( $old_term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) { - $tax_meta = get_option( 'wpseo_taxonomy_meta', [] ); - - if ( ! empty( $tax_meta[ $taxonomy ][ $old_term_id ] ) ) { - $tax_meta[ $taxonomy ][ $new_term_id ] = $tax_meta[ $taxonomy ][ $old_term_id ]; - unset( $tax_meta[ $taxonomy ][ $old_term_id ] ); - update_option( 'wpseo_taxonomy_meta', $tax_meta ); - } -} - -add_action( 'split_shared_term', 'wpseo_split_shared_term', 10, 4 ); - -/** - * Get all WPSEO related capabilities. - * - * @since 8.3 - * @return array - */ -function wpseo_get_capabilities() { - if ( ! did_action( 'wpseo_register_capabilities' ) ) { - do_action( 'wpseo_register_capabilities' ); - } - return WPSEO_Capability_Manager_Factory::get()->get_capabilities(); -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/wpseo-non-ajax-functions.php b/wp/wp-content/plugins/wordpress-seo/inc/wpseo-non-ajax-functions.php deleted file mode 100644 index 3563be68..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/wpseo-non-ajax-functions.php +++ /dev/null @@ -1,57 +0,0 @@ -register_hooks(); -} -add_action( 'wp_loaded', 'wpseo_initialize_admin_bar' ); - -/** - * Allows editing of the meta fields through weblog editors like Marsedit. - * - * @param array $required_capabilities Capabilities that must all be true to allow action. - * @param array $capabilities Array of capabilities to be checked, unused here. - * @param array $args List of arguments for the specific capabilities to be checked. - * - * @return array Filtered capabilities. - */ -function allow_custom_field_edits( $required_capabilities, $capabilities, $args ) { - if ( ! in_array( $args[0], [ 'edit_post_meta', 'add_post_meta' ], true ) ) { - return $required_capabilities; - } - - // If this is provided, it is the post ID. - if ( empty( $args[2] ) ) { - return $required_capabilities; - } - - // If this is provided, it is the custom field. - if ( empty( $args[3] ) ) { - return $required_capabilities; - } - - // If the meta key is part of the plugin, grant capabilities accordingly. - if ( strpos( $args[3], WPSEO_Meta::$meta_prefix ) === 0 && current_user_can( 'edit_post', $args[2] ) ) { - $required_capabilities[ $args[0] ] = true; - } - - return $required_capabilities; -} - -add_filter( 'user_has_cap', 'allow_custom_field_edits', 0, 3 ); diff --git a/wp/wp-content/plugins/wordpress-seo/index.php b/wp/wp-content/plugins/wordpress-seo/index.php deleted file mode 100644 index e94d9a42..00000000 --- a/wp/wp-content/plugins/wordpress-seo/index.php +++ /dev/null @@ -1,4 +0,0 @@ -{s.r(t),s.d(t,{scopeCss:()=>R});const r="-shadowcsshost",c="-shadowcssslotted",o="-shadowcsscontext",n=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",l=new RegExp("("+r+n,"gim"),i=new RegExp("("+o+n,"gim"),a=new RegExp("("+c+n,"gim"),p=r+"-no-combinator",h=/-shadowcsshost-no-combinator([^\s]*)/,u=[/::shadow/g,/::content/g],g=/-shadowcsshost/gim,d=/:host/gim,m=/::slotted/gim,f=/:host-context/gim,x=/\/\*\s*[\s\S]*?\*\//g,$=/\/\*\s*#\s*source(Mapping)?URL=[\s\S]+?\*\//g,_=/(\s*)([^;\{\}]+?)(\s*)((?:{%BLOCK%}?\s*;?)|(?:\s*;))/g,w=/([{}])/g,b="%BLOCK%",S=(e,t)=>{const s=W(e);let r=0;return s.escapedString.replace(_,((...e)=>{const c=e[2];let o="",n=e[4],l="";n&&n.startsWith("{"+b)&&(o=s.blocks[r++],n=n.substring(8),l="{");const i=t({selector:c,content:o});return`${e[1]}${i.selector}${e[3]}${l}${i.content}${n}`}))},W=e=>{const t=e.split(w),s=[],r=[];let c=0,o=[];for(let e=0;e0?o.push(n):(o.length>0&&(r.push(o.join("")),s.push(b),o=[]),s.push(n)),"{"===n&&c++}return o.length>0&&(r.push(o.join("")),s.push(b)),{escapedString:s.join(""),blocks:r}},k=(e,t,s)=>e.replace(t,((...e)=>{if(e[2]){const t=e[2].split(","),r=[];for(let c=0;ce+t.replace(r,"")+s,j=(e,t,s)=>t.indexOf(r)>-1?O(e,t,s):e+t+s+", "+t+" "+e+s,E=(e,t,s,r,c)=>S(e,(e=>{let c=e.selector,o=e.content;return"@"!==e.selector[0]?c=((e,t,s,r)=>e.split(",").map((e=>r&&e.indexOf("."+r)>-1?e.trim():((e,t)=>!(e=>(e=e.replace(/\[/g,"\\[").replace(/\]/g,"\\]"),new RegExp("^("+e+")([>\\s~+[.,{:][\\s\\S]*)?$","m")))(t).test(e))(e,t)?((e,t,s)=>{const r="."+(t=t.replace(/\[is=([^\]]*)\]/g,((e,...t)=>t[0]))),c=e=>{let c=e.trim();if(!c)return"";if(e.indexOf(p)>-1)c=((e,t,s)=>{if(g.lastIndex=0,g.test(e)){const t=`.${s}`;return e.replace(h,((e,s)=>s.replace(/([^:]*)(:*)(.*)/,((e,s,r,c)=>s+t+r+c)))).replace(g,t+" ")}return t+" "+e})(e,t,s);else{const t=e.replace(g,"");if(t.length>0){const e=t.match(/([^:]*)(:*)(.*)/);e&&(c=e[1]+r+e[2]+e[3])}}return c},o=(e=>{const t=[];let s,r=0;return s=(e=e.replace(/(\[[^\]]*\])/g,((e,s)=>{const c=`__ph-${r}__`;return t.push(s),r++,c}))).replace(/(:nth-[-\w]+)(\([^)]+\))/g,((e,s,c)=>{const o=`__ph-${r}__`;return t.push(c),r++,s+o})),{content:s,placeholders:t}})(e);let n,l="",i=0;const a=/( |>|\+|~(?!=))\s*/g;let u=!((e=o.content).indexOf(p)>-1);for(;null!==(n=a.exec(e));){const t=n[1],s=e.slice(i,n.index).trim();u=u||s.indexOf(p)>-1,l+=`${u?c(s):s} ${t} `,i=a.lastIndex}const d=e.substring(i);return u=u||d.indexOf(p)>-1,l+=u?c(d):d,m=o.placeholders,l.replace(/__ph-(\d+)__/g,((e,t)=>m[+t]));var m})(e,t,s).trim():e.trim())).join(", "))(e.selector,t,s,r):(e.selector.startsWith("@media")||e.selector.startsWith("@supports")||e.selector.startsWith("@page")||e.selector.startsWith("@document"))&&(o=E(e.content,t,s,r)),{selector:c.replace(/\s{2,}/g," ").trim(),content:o}})),R=(e,t,s)=>{const n=t+"-h",h=t+"-s",g=e.match($)||[];e=e.replace(x,"");const _=[];if(s){const t=e=>{const t=`/*!@___${_.length}___*/`,s=`/*!@${e.selector}*/`;return _.push({placeholder:t,comment:s}),e.selector=t+e.selector,e};e=S(e,(e=>"@"!==e.selector[0]?t(e):e.selector.startsWith("@media")||e.selector.startsWith("@supports")||e.selector.startsWith("@page")||e.selector.startsWith("@document")?(e.content=S(e.content,t),e):e))}const w=((e,t,s,n,h)=>{const g=((e,t)=>{const s="."+t+" > ",r=[];return e=e.replace(a,((...e)=>{if(e[2]){const t=e[2].trim(),c=e[3],o=s+t+c;let n="";for(let t=e[4]-1;t>=0;t--){const s=e[5][t];if("}"===s||","===s)break;n=s+n}const l=n+o,i=`${n.trimRight()}${o.trim()}`;if(l.trim()!==i.trim()){const e=`${i}, ${l}`;r.push({orgSelector:l,updatedSelector:e})}return o}return p+e[3]})),{selectors:r,cssText:e}})(e=(e=>k(e,i,j))(e=(e=>k(e,l,O))(e=e.replace(f,o).replace(d,r).replace(m,c))),n);return e=(e=>u.reduce(((e,t)=>e.replace(t," ")),e))(e=g.cssText),t&&(e=E(e,t,s,n)),{cssText:(e=(e=e.replace(/-shadowcsshost-no-combinator/g,`.${s}`)).replace(/>\s*\*\s+([^{, ]+)/gm," $1 ")).trim(),slottedSelectors:g.selectors}})(e,t,n,h);return e=[w.cssText,...g].join("\n"),s&&_.forEach((({placeholder:t,comment:s})=>{e=e.replace(t,s)})),w.slottedSelectors.forEach((t=>{e=e.replace(t.orgSelector,t.updatedSelector)})),e}}}]); \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/js/dist/academy.js b/wp/wp-content/plugins/wordpress-seo/js/dist/academy.js deleted file mode 100644 index ac0343f3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/js/dist/academy.js +++ /dev/null @@ -1,10 +0,0 @@ -(()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var a in s)e.o(s,a)&&!e.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:s[a]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,s=window.wp.components,a=window.wp.data,r=window.wp.domReady;var i=e.n(r);const o=window.wp.element,n=window.yoast.uiLibrary,l=window.lodash,d=window.yoast.reduxJsToolkit,c=window.wp.url,u="linkParams",y=(0,d.createSlice)({name:u,initialState:{},reducers:{setLinkParams:(e,{payload:t})=>t}}),p=y.getInitialState,m={selectLinkParam:(e,t,s={})=>(0,l.get)(e,`${u}.${t}`,s),selectLinkParams:e=>(0,l.get)(e,u,{})};m.selectLink=(0,d.createSelector)([m.selectLinkParams,(e,t)=>t,(e,t,s={})=>s],((e,t,s)=>(0,c.addQueryArgs)(t,{...e,...s})));const g=y.actions,h=y.reducer,w=(0,d.createSlice)({name:"notifications",initialState:{},reducers:{addNotification:{reducer:(e,{payload:t})=>{e[t.id]={id:t.id,variant:t.variant,size:t.size,title:t.title,description:t.description}},prepare:({id:e,variant:t="info",size:s="default",title:a,description:r})=>({payload:{id:e||(0,d.nanoid)(),variant:t,size:s,title:a||"",description:r}})},removeNotification:(e,{payload:t})=>(0,l.omit)(e,t)}}),f=(w.getInitialState,w.actions,w.reducer,"pluginUrl"),k=(0,d.createSlice)({name:f,initialState:"",reducers:{setPluginUrl:(e,{payload:t})=>t}}),_=(k.getInitialState,{selectPluginUrl:e=>(0,l.get)(e,f,"")});_.selectImageLink=(0,d.createSelector)([_.selectPluginUrl,(e,t,s="images")=>s,(e,t)=>t],((e,t,s)=>[(0,l.trimEnd)(e,"/"),(0,l.trim)(t,"/"),(0,l.trimStart)(s,"/")].join("/"))),k.actions,k.reducer,window.wp.apiFetch;const E="wistiaEmbedPermission",b=(0,d.createSlice)({name:E,initialState:{value:!1,status:"idle",error:{}},reducers:{setWistiaEmbedPermissionValue:(e,{payload:t})=>{e.value=Boolean(t)}},extraReducers:e=>{e.addCase(`${E}/request`,(e=>{e.status="loading"})),e.addCase(`${E}/success`,((e,{payload:t})=>{e.status="success",e.value=Boolean(t&&t.value)})),e.addCase(`${E}/error`,((e,{payload:t})=>{e.status="error",e.value=Boolean(t&&t.value),e.error={code:(0,l.get)(t,"error.code",500),message:(0,l.get)(t,"error.message","Unknown")}}))}});b.getInitialState,b.actions,b.reducer;const v=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),S=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"}))})),L=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{fillRule:"evenodd",d:"M10.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L12.586 11H5a1 1 0 110-2h7.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),P=window.wp.i18n,A="@yoast/academy",O=(e,t=[],...s)=>(0,a.useSelect)((t=>{var a,r;return null===(a=(r=t(A))[e])||void 0===a?void 0:a.call(r,...s)}),t),x=(e,t)=>!(!(0,l.isEmpty)(e)&&!t)||Object.values(e).every((e=>!0===e)),I=()=>{const e=O("selectLinkParams"),s=O("selectPreference",[],"pluginUrl",""),a=O("selectPreference",[],"isPremium",""),r=O("selectPreference",[],"isWooActive",""),i=O("selectPreference",[],"isLocalActive",""),d=O("selectUpsellSettingsAsProps"),u=(0,n.useSvgAria)(),y=(0,o.useMemo)((()=>[{id:"ai_for_seo",title:"AI for SEO",description:(0,P.__)("Join the Yoast team to learn how to harness the power of AI to revolutionize your SEO approach. Gain a competitive edge, future-proof your keyword strategies, and soar to the top of search rankings – all designed to empower busy small business owners.","wordpress-seo"),image:`${s}/images/academy/ai_for_seo_icon_my_yoast.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/ai-for-seo-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/ai-for-seo-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"seo_for_beginners",title:"SEO for beginners",description:(0,P.__)("In this free course, you'll get quick wins to make your site rank higher in Google, Bing, and Yahoo.","wordpress-seo"),image:`${s}/images/academy/seo_for_beginners.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-seo-beginners-start",e),dependencies:{},hasTrial:!0},{id:"seo_for_wp",title:"Yoast SEO for WordPress (block editor)",description:(0,P.sprintf)(/* translators: %1$s expands to Yoast SEO. */ -(0,P.__)("In this course, you'll learn about how to set up and use the %1$s for WordPress plugin so it makes SEO even easier. This course is meant for users of the block editor.","wordpress-seo"),"Yoast SEO"),image:`${s}/images/academy/seo_for_wp.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-seo-wordpress-block-editor-start",e),dependencies:{},hasTrial:!0},{id:"all_around_seo",title:"All-around SEO",description:(0,P.__)("In this course, you'll learn practical SEO skills on every key aspect of SEO, to make your site stand out.","wordpress-seo"),image:`${s}/images/academy/all_around_seo.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-all-around-seo-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-all-around-seo-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"wp_for_beginners",title:"WordPress for beginners",description:(0,P.__)("Do you want to set up your own WordPress site? This course will teach you the ins and outs of creating and maintaining a WordPress website!","wordpress-seo"),image:`${s}/images/academy/wp_for_beginners.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-wordpress-beginners-start",e),dependencies:{},hasTrial:!0},{id:"copywriting",title:"SEO copywriting",description:(0,P.__)("In this course, you'll learn how to write awesome copy that is optimized for ranking in search engines.","wordpress-seo"),image:`${s}/images/academy/copywriting.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-seo-copywriting-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-seo-copywriting-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"structured_data_for_beginners",title:"Structured data for beginners",description:(0,P.__)("Learn how to make your site stand out from the crowd by adding structured data!","wordpress-seo"),image:`${s}/images/academy/structured_data_for_beginners.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-structured-data-beginners-start",e),dependencies:{},hasTrial:!0},{id:"keyword_research",title:"Keyword research",description:(0,P.__)("Do you know the essential first step of good SEO? It's keyword research. In this training, you'll learn how to research and select the keywords that will guide searchers to your pages.","wordpress-seo"),image:`${s}/images/academy/keyword_research.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-keyword-research-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-keyword-research-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"block_editor",title:"Block editor training",description:(0,P.__)("Start creating block-tastic content with the new WordPress block editor! Learn all about the block editor and what you can do with it.","wordpress-seo"),image:`${s}/images/academy/block_editor.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-block-editor-start",e),dependencies:{},hasTrial:!0},{id:"site_structure",title:"Site structure",description:(0,P.__)("A clear site structure benefits your users and is of great importance for SEO. Still, most people seem to forget about this. Get ahead of your competition and learn how to improve your site structure!","wordpress-seo"),image:`${s}/images/academy/site_structure.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-site-structure-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-site-structure-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"local",title:"Local SEO",description:(0,P.__)("Do you own a local business? This course will teach you how to make sure your local audience can find you in the search results and on Google Maps!","wordpress-seo"),image:`${s}/images/academy/local.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-local-seo-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-local-seo-unlock",e),dependencies:{LOCAL:i},hasTrial:!0},{id:"ecommerce",title:"Ecommerce SEO",description:(0,P.__)("Learn how to optimize your online shop for your customers and for search engines!","wordpress-seo"),image:`${s}/images/academy/ecommerce.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-ecommerce-seo-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-ecommerce-seo-unlock",e),dependencies:{WOO:r},hasTrial:!0},{id:"understanding_structured_data",title:"Understanding structured data",description:(0,P.__)("Do you want to take a deep dive into structured data? In this course, you'll learn the theory related to structured data in detail.","wordpress-seo"),image:`${s}/images/academy/understanding_structured_data.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-understanding-structured-data-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-understanding-structured-data-unlock",e),dependencies:{PREMIUM:a},hasTrial:!1},{id:"multilingual",title:"International SEO",description:(0,P.__)("Are you selling in countries all over the world? In this course, you’ll learn all about setting up and managing a site that targets people in different languages and locales.","wordpress-seo"),image:`${s}/images/academy/multilingual.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-international-seo-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-international-seo-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"crawlability",title:"Technical SEO: Crawlability and indexability",description:(0,P.__)("You have to make it possible for search engines to find your site, so they can display it in the search results. We'll tell you all about how that works in this course!","wordpress-seo"),image:`${s}/images/academy/crawlability.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-technical-seo-crawlability-indexability-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-technical-seo-crawlability-indexability-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"hosting_and_server",title:"Technical SEO: Hosting and server configuration",description:(0,P.__)("Choosing the right type of hosting for your site is the basis of a solid Technical SEO strategy. Learn all about it in this course!","wordpress-seo"),image:`${s}/images/academy/hosting_and_server.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-technical-seo-hosting-server-configuration-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-technical-seo-hosting-server-configuration-unlock",e),dependencies:{PREMIUM:a},hasTrial:!1}]),[e]);return(0,t.createElement)("div",{className:"yst-p-4 min-[783px]:yst-p-8 yst-mb-8 xl:yst-mb-0"},(0,t.createElement)(n.Paper,{as:"main"},(0,t.createElement)("header",{className:"yst-p-8 yst-border-b yst-border-slate-200"},(0,t.createElement)("div",{className:"yst-max-w-screen-sm"},(0,t.createElement)(n.Title,null,(0,P.__)("Academy","wordpress-seo")),(0,t.createElement)("p",{className:"yst-text-tiny yst-mt-3"},a&&(0,P.sprintf)( -// translators: %s for Yoast SEO Premium. -(0,P.__)("Learn vital SEO skills that you can apply at once! Let us take you by the hand and give you practical SEO tips to help you outrank your competitors. Maximize your SEO game! Because your %s subscription gives you unlimited access to all courses.","wordpress-seo"),"Yoast SEO Premium"),!a&&(0,t.createElement)(t.Fragment,null,(0,P.sprintf)( -// translators: %s for Yoast SEO. -(0,P.__)("Learn vital SEO skills that you can apply at once! Let us take you by the hand and give you practical SEO tips to help you outrank your competitors. %s comes with five free courses.","wordpress-seo"),"Yoast SEO")," ",(0,t.createElement)(n.Link,{href:(0,c.addQueryArgs)("https://yoa.st/academy-page-upsell/",e),target:"_blank",...d},(0,P.sprintf)( -// translators: %s for Yoast SEO Premium. -(0,P.__)("Maximize your SEO game by purchasing %s, which grants you unlimited access to all courses.","wordpress-seo"),"Yoast SEO Premium")))))),(0,t.createElement)("div",{className:"yst-h-full yst-p-8"},(0,t.createElement)("div",{className:"yst-max-w-6xl yst-grid yst-gap-6 yst-grid-cols-1 sm:yst-grid-cols-2 min-[783px]:yst-grid-cols-1 lg:yst-grid-cols-2 xl:yst-grid-cols-4"},y.map((e=>(0,t.createElement)(n.Card,{key:`card-course-${e.id}`},(0,t.createElement)(n.Card.Header,{className:"yst-h-auto yst-p-0"},(0,t.createElement)("img",{className:"yst-w-full yst-transition yst-duration-200",src:e.image,alt:"",width:500,height:250,loading:"lazy",decoding:"async"}),((e,t)=>!(0,l.isEmpty)(e)&&(t||e.WOO||e.LOCAL))(e.dependencies,a)&&(0,t.createElement)("div",{className:"yst-absolute yst-top-2 yst-right-2 yst-flex yst-gap-1.5"},(0,t.createElement)(n.Badge,{size:"small",variant:"upsell"},(0,P.__)("Premium","wordpress-seo")))),(0,t.createElement)(n.Card.Content,{className:"yst-flex yst-flex-col yst-gap-3"},(0,t.createElement)(n.Title,{as:"h3"},e.title),e.description,!x(e.dependencies,a)&&(0,t.createElement)(n.Link,{href:e.startLink,className:"yst-flex yst-items-center yst-mt-3 yst-no-underline yst-font-medium yst-text-primary-500",target:"_blank"},(0,P.__)("Start free trial lesson","wordpress-seo"),(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */ -(0,P.__)("(Opens in a new browser tab)","wordpress-seo")),(0,t.createElement)(L,{className:"yst-h-4 yst-w-4 yst-ml-1 yst-icon-rtl"}))),(0,t.createElement)(n.Card.Footer,null,(0,t.createElement)(t.Fragment,null,!x(e.dependencies,a)&&(0,t.createElement)(n.Button,{as:"a",id:`button-get-course-${e.id}`,className:"yst-gap-2 yst-w-full yst-px-2",variant:"upsell",href:null==e?void 0:e.upsellLink,target:"_blank",rel:"noopener",...d},(0,t.createElement)(v,{className:"yst-w-5 yst-h-5 yst--ml-1 yst-shrink-0",...u}),(0,P.sprintf)(/* translators: %1$s expands to Premium. */ -(0,P.__)("Unlock with %1$s","wordpress-seo"),"Premium")),x(e.dependencies,a)&&(0,t.createElement)(n.Button,{as:"a",id:`button-start-course-${e.id}`,className:"yst-gap-2 yst-w-full yst-px-2 yst-leading-5",variant:"primary",href:e.startLink,target:"_blank",rel:"noopener"},(0,P.__)("Start the course","wordpress-seo"),(0,t.createElement)(S,{className:"yst--mr-1 yst-ml-1 yst-h-5 yst-w-5 yst-text-white"})))))))))))},Q=()=>({...(0,l.get)(window,"wpseoScriptData.preferences",{})}),$=(0,d.createSlice)({name:"preferences",initialState:Q(),reducers:{}}),M={selectPreference:(e,t,s={})=>(0,l.get)(e,`preferences.${t}`,s),selectPreferences:e=>(0,l.get)(e,"preferences",{})};M.selectUpsellSettingsAsProps=(0,d.createSelector)([e=>M.selectPreference(e,"upsellSettings",{}),(e,t="premiumCtbId")=>t],((e,t)=>({"data-action":null==e?void 0:e.actionId,"data-ctb-id":null==e?void 0:e[t]})));const T=$.actions,R=$.reducer;i()((()=>{const e=document.getElementById("yoast-seo-academy");if(!e)return;(({initialState:e={}}={})=>{(0,a.register)((({initialState:e})=>(0,a.createReduxStore)(A,{actions:{...g,...T},selectors:{...m,...M},initialState:(0,l.merge)({},{[u]:p(),preferences:Q()},e),reducer:(0,a.combineReducers)({[u]:h,preferences:R})}))({initialState:e}))})({initialState:{[u]:(0,l.get)(window,"wpseoScriptData.linkParams",{})}}),(()=>{const e=document.getElementById("wpcontent"),t=document.getElementById("adminmenuwrap");e&&t&&(e.style.minHeight=`${t.offsetHeight}px`)})();const r=(0,a.select)(A).selectPreference("isRtl",!1);(0,o.render)((0,t.createElement)(n.Root,{context:{isRtl:r}},(0,t.createElement)(s.SlotFillProvider,null,(0,t.createElement)(I,null))),e)}))})(); \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/js/dist/addon-installation.js b/wp/wp-content/plugins/wordpress-seo/js/dist/addon-installation.js deleted file mode 100644 index 2503cf3a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/js/dist/addon-installation.js +++ /dev/null @@ -1,7 +0,0 @@ -(()=>{"use strict";var e={n:n=>{var t=n&&n.__esModule?()=>n.default:()=>n;return e.d(t,{a:t}),t},d:(n,t)=>{for(var o in t)e.o(t,o)&&!e.o(n,o)&&Object.defineProperty(n,o,{enumerable:!0,get:t[o]})},o:(e,n)=>Object.prototype.hasOwnProperty.call(e,n)};const n=window.React,t=window.wp.element,o=window.yoast.propTypes;var a=e.n(o);const s=window.yoast.componentsNew,l=window.wp.i18n,i=window.yoast.styledComponents;var r=e.n(i);const d=window.wp.components,c=e=>{const{title:t,className:o,showYoastIcon:a,additionalClassName:s,...l}=e,i=a?(0,n.createElement)("span",{className:"yoast-icon"}):null;return(0,n.createElement)(d.Modal,{title:t,className:`${o} ${s}`,icon:i,...l},e.children)};c.propTypes={title:a().string,className:a().string,showYoastIcon:a().bool,children:a().oneOfType([a().node,a().arrayOf(a().node)]),additionalClassName:a().string},c.defaultProps={title:"Yoast SEO",className:"yoast yoast-gutenberg-modal",showYoastIcon:!0,children:null,additionalClassName:""};const p=c;var m,w;function u(){return u=Object.assign?Object.assign.bind():function(e){for(var n=1;nn.createElement("svg",u({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 425 456.27"},e),m||(m=n.createElement("path",{d:"M73 405.26a66.79 66.79 0 0 1-6.54-1.7 64.75 64.75 0 0 1-6.28-2.31c-1-.42-2-.89-3-1.37-1.49-.72-3-1.56-4.77-2.56-1.5-.88-2.71-1.64-3.83-2.39-.9-.61-1.8-1.26-2.68-1.92a70.154 70.154 0 0 1-5.08-4.19 69.21 69.21 0 0 1-8.4-9.17c-.92-1.2-1.68-2.25-2.35-3.24a70.747 70.747 0 0 1-3.44-5.64 68.29 68.29 0 0 1-8.29-32.55V142.13a68.26 68.26 0 0 1 8.29-32.55c1-1.92 2.21-3.82 3.44-5.64s2.55-3.58 4-5.27a69.26 69.26 0 0 1 14.49-13.25C50.37 84.19 52.27 83 54.2 82A67.59 67.59 0 0 1 73 75.09a68.75 68.75 0 0 1 13.75-1.39h169.66L263 55.39H86.75A86.84 86.84 0 0 0 0 142.13v196.09A86.84 86.84 0 0 0 86.75 425h11.32v-18.35H86.75A68.75 68.75 0 0 1 73 405.26zM368.55 60.85l-1.41-.53-6.41 17.18 1.41.53a68.06 68.06 0 0 1 8.66 4c1.93 1 3.82 2.2 5.65 3.43A69.19 69.19 0 0 1 391 98.67c1.4 1.68 2.72 3.46 3.95 5.27s2.39 3.72 3.44 5.64a68.29 68.29 0 0 1 8.29 32.55v264.52H233.55l-.44.76c-3.07 5.37-6.26 10.48-9.49 15.19L222 425h203V142.13a87.2 87.2 0 0 0-56.45-81.28z"})),w||(w=n.createElement("path",{stroke:"#000",strokeMiterlimit:10,strokeWidth:3.81,d:"M119.8 408.28v46c28.49-1.12 50.73-10.6 69.61-29.58 19.45-19.55 36.17-50 52.61-96L363.94 1.9H305l-98.25 272.89-48.86-153h-54l71.7 184.18a75.67 75.67 0 0 1 0 55.12c-7.3 18.68-20.25 40.66-55.79 47.19z"}))),y=r().div` - display: flex; - justify-content: flex-end; - gap: 8px; -`,f=e=>{const[o,a]=(0,t.useState)(!0);function i(){a(!1)}const r=(0,l.sprintf)(/* translators: %s expands to Yoast */ -(0,l.__)("%s SEO installation","wordpress-seo"),"Yoast");let d,c=(0,l.__)("the following addons","wordpress-seo");return 1===e.addons.length&&(c=e.addons[0]),1!==e.addons.length&&(d=(0,n.createElement)("ul",{className:"ul-disc"},e.addons.map(((e,t)=>(0,n.createElement)("li",{key:"addon-"+t},e))))),o?(0,n.createElement)(p,{title:r,onRequestClose:i,icon:(0,n.createElement)(h,null),isDismissible:!1},(0,n.createElement)("p",null,(0,l.sprintf)(/* translators: %s expands to Yoast SEO Premium */ -(0,l.__)("Please confirm below that you would like to install %s on this site.","wordpress-seo"),c)),d,(0,n.createElement)(y,null,(0,n.createElement)(s.Button,{onClick:i,id:"close-addon-installation-dialog"},(0,l.__)("Cancel","wordpress-seo")),(0,n.createElement)(s.Button,{onClick:function(){window.location.href="admin.php?page=wpseo_licenses&action=install&nonce="+e.nonce},id:"continue-addon-installation-dialog",className:"yoast-button--primary"},(0,l.__)("Install and activate","wordpress-seo")))):null};f.propTypes={nonce:a().string.isRequired,addons:a().array},f.defaultProps={addons:[]};const g=f,v=document.createElement("div");v.setAttribute("id","wpseo-app-element"),document.getElementById("extensions").append(v),(0,t.render)((0,n.createElement)(g,{nonce:wpseoAddonInstallationL10n.nonce,addons:wpseoAddonInstallationL10n.addons}),v)})(); \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/js/dist/admin-global.js b/wp/wp-content/plugins/wordpress-seo/js/dist/admin-global.js deleted file mode 100644 index cd015e9a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/js/dist/admin-global.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var t={n:o=>{var a=o&&o.__esModule?()=>o.default:()=>o;return t.d(a,{a}),a},d:(o,a)=>{for(var e in a)t.o(a,e)&&!t.o(o,e)&&Object.defineProperty(o,e,{enumerable:!0,get:a[e]})},o:(t,o)=>Object.prototype.hasOwnProperty.call(t,o)};const o=window.jQuery;var a=t.n(o);!function(t){function o(t,o,e){const s=new FormData,n={action:"wpseo_set_ignore",option:t,_wpnonce:e};for(const[t,o]of Object.entries(n))s.append(t,o);return fetch(ajaxurl,{method:"POST",body:s}).then((e=>(e&&(a()("#"+o).hide(),a()("#hidden_ignore_"+t).val("ignore")),e)))}function e(){t("#wp-admin-bar-root-default > li").off("mouseenter.yoastalertpopup mouseleave.yoastalertpopup"),t(".yoast-issue-added").fadeOut(200)}function s(o,a){if(t(".yoast-notification-holder").off("click",".restore").off("click",".dismiss"),void 0!==a.html){a.html&&(o.closest(".yoast-container").html(a.html),n());var e=t("#wp-admin-bar-wpseo-menu"),s=e.find(".yoast-issue-counter");s.length||(e.find("> a:first-child").append('
              '),s=e.find(".yoast-issue-counter")),s.html(a.total),0===a.total?s.hide():s.show(),t("#toplevel_page_wpseo_dashboard .update-plugins").removeClass().addClass("update-plugins count-"+a.total),t("#toplevel_page_wpseo_dashboard .plugin-count").html(a.total)}}function n(){var o=t(".yoast-notification-holder");o.on("click",".dismiss",(function(){var o=t(this),a=o.closest(".yoast-notification-holder");o.closest(".yoast-container").append('
              '),t.post(ajaxurl,{action:"yoast_dismiss_notification",notification:a.attr("id"),nonce:a.data("nonce"),data:o.data("json")||a.data("json")},s.bind(this,a),"json")})),o.on("click",".restore",(function(){var o=t(this),a=o.closest(".yoast-notification-holder");o.closest(".yoast-container").append('
              '),t.post(ajaxurl,{action:"yoast_restore_notification",notification:a.attr("id"),nonce:a.data("nonce"),data:a.data("json")},s.bind(this,a),"json")}))}function i(t){t.is(":hidden")||(t.outerWidth()>t.parent().outerWidth()?(t.data("scrollHint").addClass("yoast-has-scroll"),t.data("scrollContainer").addClass("yoast-has-scroll")):(t.data("scrollHint").removeClass("yoast-has-scroll"),t.data("scrollContainer").removeClass("yoast-has-scroll")))}function l(){window.wpseoScrollableTables=t(".yoast-table-scrollable"),window.wpseoScrollableTables.length&&window.wpseoScrollableTables.each((function(){var o=t(this);if(!o.data("scrollContainer")){var a=t("
              ",{class:"yoast-table-scrollable__hintwrapper",html:"